I cloned the Bitcoin Core and did the build. But, I am experiencing a Unit Test Failure in system_tests.cpp, Line 48 BOOST_AUTO_TEST(run_command).
First, my environment:
- Hardware: Intel i7-8550U @1.80GHz 2001 Mhz, 4 Cores, 8 Logical Processors, x64.
- OS: Windows 10 Home
- Toolchain: Visual Studios 2019 v142, Configuration: Release, Platform x64.
The build completes without errors, but I do get the following message:
C:\Users\name\source\repos\bitcoin-first\build_msvc\test_bitcoin\test_bitcoin.vcxproj : warning : Wildcards in project items are not supported in VC projects and can cause unexpected behavior, instability and performance degradation in the Visual Studio IDE. Please refer to https://aka.ms/cpp/projectwildcards for supported options.
Running test_bitcoin, all tests pass except run_command from source system_tests.cpp line 48. I get the following error:
struct boost::process::process_error: CreateProcess failed: The system cannot find the file specified.
VS Test Explorer gives additionally:
unknown location(0): exception in "run_command": struct boost::process::process_error: CreateProcess failed: The system cannot find the file specified. system_tests.cpp(52): last checkpoint:
The relevant code from system_tests.cpp (Please disregard any spacing syntax issues after the line numbers. I manually added them in and they are not at issue):
48 BOOST_AUTO_TEST_CASE(run_command)
49 {
50 {
51 const UniValue result = RunCommandParseJSON("");
52 BOOST_CHECK(result.isNull());
53 }
54 {
55 #ifdef WIN32
56 // Windows requires single quotes to prevent escaping double quotes from the JSON...
57 // const UniValue result = RunCommandParseJSON("cmd.exe /c echo '{\"success\": true}'");
58 const UniValue result = RunCommandParseJSON("echo '{\"success\": true}'");
59
60 #else
61 // ... but Linux and macOS echo a single quote if it's used
62 const UniValue result = RunCommandParseJSON("echo \"{\"success\": true}\"");
63 #endif
64 BOOST_CHECK(result.isObject());
65 const UniValue& success = find_value(result, "success");
66 BOOST_CHECK(!success.isNull());
67 BOOST_CHECK_EQUAL(success.getBool(), true);
68 }
69 {
70 // An invalid command is handled by Boost
71 BOOST_CHECK_EXCEPTION(RunCommandParseJSON("invalid_command"), boost::process::process_error, checkMessage); // Command failed
72 }
73 {
74 // Return non-zero exit code, no output to stderr
75 BOOST_CHECK_EXCEPTION(RunCommandParseJSON("false"), std::runtime_error, checkMessageFalse);
76 }
77 {
78 // Return non-zero exit code, with error message for stderr
79 BOOST_CHECK_EXCEPTION(RunCommandParseJSON("ls nosuchfile"), std::runtime_error, checkMessageStdErr);
80 }
81 {
82 BOOST_REQUIRE_THROW(RunCommandParseJSON("echo \"{\""), std::runtime_error); // Unable to parse JSON
83 }
84 // Test std::in, except for Windows
85 #ifndef WIN32
86 {
87 const UniValue result = RunCommandParseJSON("cat", "{\"success\": true}");
88 BOOST_CHECK(result.isObject());
89 const UniValue& success = find_value(result, "success");
90 BOOST_CHECK(!success.isNull());
91 BOOST_CHECK_EQUAL(success.getBool(), true);
92 }
93 #endif
94 }
95 #endif // HAVE_BOOST_PROCESS
Line 58 is failing. Based on this https://stackoverflow.com/questions/47028660/boost-createprocess-failed, I commented out line 58 and added the following Line 57:
57 const UniValue result = RunCommandParseJSON("cmd.exe /c echo '{\"success\": true}'");
Running again the system_tests.cpp gets me past the CreateProcess failure, but produces the following failure in system_tests.cpp line 48, run_command():
class std::runtime_error: Unable to parse JSON: '{"success": true}'.
VS Test Explorer additionally states:
unknown location(0): exception in "run_command": class std::runtime_error: Unable to parse JSON: '{"success": true}' system_tests.cpp(52): last checkpoint:
I'm having a hard time believing the test is incorrect--I've found nothing about this failure. Instead, I suspect I didn’t correctly set some switch or option or configuration somewhere.
Any comments or help would be greatly appreciated.