分类
Uncategorized

比特币核心:单元测试失败:system\u tests.cpp:第48行BOOST\u AUTO\u Test(run\u命令)

我克隆了比特币的核心并进行了构建。但是,我在system\u tests.cpp的第48行BOOST\u AUTO\u Test(run\u命令)中遇到单元测试失败。
首先,我的环境:
硬件:Intel i7-8550U@1.80GHz 2001 Mhz,4核,8个逻辑处理器,x64。
操作系统:Windows 10主页
工具链:visualstudio2019v142,配置:Release,平台x64。
生成完成时没有出现错误,但我确实收到以下消息:
C:\Users\name\source\repos\bitcoin first\build\u msvc\test\u bitcoin\test\u bitcoin.vcxproj:警告:VC项目不支持项目项中的通配符,可能会导致Visual Studio IDE中的意外行为、不稳定和性能下降。请参阅https://aka.ms/cpp/projectwildcards 支持的选项。
运行test\u bitcoin时,除了源系统的run\u command\u tests.cpp第48行之外,所有测试都通过。我得到以下错误:
struct boost::process::process\错误:CreateProcess失败:系统找不到指定的文件。
VS测试资源管理器还提供:
未知位置(0):“run\u command”中出现异常:struct boost::process::process\u错误:CreateProcess失败:系统找不到指定的文件。系统测试.cpp(52):最后一个检查点:
system_tests.cpp中的相关代码(请忽略行号后的任何空格语法问题)。我手动添加了它们,它们没有问题):
48 BOOST\u AUTO\u TEST\u CASE(运行命令)
49 {
50    {
51 const UniValue result=RunCommandParseJSON(“”);
52 BOOST_CHECK(result.isNull());
53    }
54    {
55#ifdef WIN32
56//Windows需要单引号以防止从JSON中转义双引号。。。
57//const UniValue result=RunCommandParseJSON(“cmd.exe/c echo'{\“success\”:true}’);
58 const UniValue result=RunCommandParseJSON(“echo'{\“success\”:true}’”);
59
60#其他
61        // … 但是,如果使用Linux和macOS,它们只会引用一句话
62 const UniValue result=RunCommandParseJSON(“echo\”{\“success\”:true}\“”);
63#结束
64 BOOST_CHECK(result.isObject());
65 const UniValue&success=查找值(结果,“success”);
66增压检查(!success.isNull());
67 BOOST\u CHECK\u EQUAL(success.getBool(),true);
68    }
69    {
70//Boost处理无效命令
71 BOOST_CHECK_异常(RunCommandParseJSON(“无效的_命令”),BOOST::process::process_error,checkMessage);//命令失败
72    }
73    {
74//返回非零退出码,没有输出到stderr
75 BOOST\u CHECK\u异常(RunCommandParseJSON(“false”),std::runtime\u error,checkMessageFalse);
76    }
77    {
78//返回非零退出代码,并显示stderr的错误消息
79 BOOST\u CHECK\u异常(RunCommandParseJSON(“ls nosuchfile”),std::runtime\u error,checkMessageStdErr);
80    }
81    {
82 BOOST_REQUIRE_THROW(RunCommandParseJSON(“echo\”{\”),std::runtime_error);//无法分析JSON
83    }
84//Test std::in,Windows除外
85#如果NDEF WIN32
86    {
87 const UniValue result=RunCommandParseJSON(“cat”,“{\”success\“:true}”);
88 BOOST_CHECK(result.isObject());
89 const UniValue&success=查找值(结果,“success”);
90Ω检查(!success.isNull());
91 BOOST\u CHECK\u EQUAL(success.getBool(),true);
92    }
93#结束
94 }
95#endif//有ŠBOOSTŠ进程
58号线坏了。基于此https://stackoverflow.com/questions/47028660/boost-createprocess-failed,我删除了第58行并添加了以下第57行:
57 const UniValue result=RunCommandParseJSON(“cmd.exe/c echo'{\“success\”:true}’);
再次运行system_tests.cpp可以让我通过CreateProcess失败,但是在system_tests.cpp第48行run_command()中会产生以下失败:
类std::运行时错误:无法解析JSON:“{”success“:true}”。
VS测试资源管理器还声明:
未知位置(0):“run\u command”中出现异常:class std::runtime\u错误:无法分析JSON:“{”success“:true}”system\u tests.cpp(52):最后一个检查点:
我很难相信这个测试是错误的——我没有发现这个失败的原因。相反,我怀疑我没有正确设置某些开关、选项或配置。
任何意见或帮助将不胜感激。
比特币核心

但以下几点会起作用。
RunCommandParseJSON(“cmd.exe”,“/c echo'{\”success\“:true}’”);
分享
改进这个答案
跟随
4月4日20:42回答
潘昆
65133银牌1515铜牌
谢谢你的建议。我运行了它,得到了一个类似的运行时错误:class std::runtime\u错误:无法解析JSON:microsoftwindows[Version 10.0.19041.867]。在这里,它看起来像是ehco命令生成了“microsoftwindows[Version 10.0.19041.867]”。而在上一个运行时错误中,它生成了desire字符串{“success”:true}TKChattoraj 4月4日21:29
添加评论
0
这是我的工作。我仍然很难相信测试代码需要修改,但这就是我所做的,现在测试通过了。
在上面,我修改了RunCommandParseJSON()的调用,以提供命令窗口的显式调用。显然,这是Windows所需要的。线路变成:
57 const UniValue result=RunCommandParseJSON(“cmd.exe/c echo'{\“success\”:true}’);
RunCommandParseJSON()是从/src/util/system.cpp调用的。它接受一个表示要启动的子进程的字符串输入。在这种情况下,启动命令窗口并回显字符串{“success”:true}。
这产生了运行时错误:
class std::runtime\错误:无法解析JSON:“{”success“:true}”
注意:echo命令的字符串输出以单引号开始和结束。正如在代码的原始注释中所指出的,需要单引号来避免Windows从JSON中转义双引号。
RunCommandParseJSON()从/src/UniValue/lib/UniValue\u read.cpp调用UniValue::read()。UniValue::read(),似乎不适合字符串输入以单引号开头和结尾的情况。
因此,我将第59行从:
while(raw<end&amp;&amp;(json\u isspace(*raw))//跳过空白
收件人:
while(raw<end&amp;&amp;(json|isspace(*raw)| |(*raw==’\”)//跳过空格和单引号以开始和结束json字符串
这使得
const UniValue result=RunCommandParseJSON(“cmd.exe/c echo'{\“success\”:true}’);
运行命令测试成功的方面。
尽管如此,在进一步测试抛出正确错误时,run\ u命令仍出现错误:
没有输出到stderr
发送给stderr的错误消息
无法分析JSON错误
无输出到stderr case测试何时可以启动命令窗口进程,但给定的命令无效。此测试已修改为允许正确调用窗口的命令窗口,更改为:
BOOST\u CHECK\u异常(RunCommandParseJSON(“false”),std::runtime\u error,checkMessageFalse);
收件人:
BOOST\u CHECK\u异常(RunCommandParseJSON(“cmd.exe/c false”),std::runtime\u error,checkMessageFalse);
这产生了所需的错误,但不是测试所要求的确切错误消息。我把支票改成:
const std::字符串what(例如what());增强检查(what.find(“returned 1”)!=std::string::npos);
发送给Stderr的错误消息测试是否能够启动命令窗口进程,接收有效的命令,但输入无效。更改为:
BOOST\u CHECK\u异常(RunCommandParseJSON(“ls nosuchfile”),std::runtime\u error,checkMessageStdErr);
收件人:
BOOST\u CHECK\u异常(RunCommandParseJSON(“cmd.exe/c dir nosuchfile”),std::runtime\u error,checkMessageStdErr);
复制我所看到的窗口版本的测试。
“无法解析JSON”错误测试启动命令窗口进程、发送包含有效输入的有效命令的能力,但无法解析字符串(此错误实际上是在早期遇到的。)更改为:
BOOST_REQUIRE_THROW(RunCommandParseJSON(“cmd.exe/c echo'{‘”),std::runtime_error);//无法分析JSON
通过这些更改,所有单元测试现在都通过了。
我看不出这些变化改变了测试的性质。如果有人注意到了,我肯定会很感激别人告诉我。
分享

时光素材-香车美女  (738)blockchainBTC比特币区块链www.qkl91.com

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注