Inside Bitcoin
Opening the selected file…
Inside Bitcoin
Opening the selected file…
The code behind the network, with room to understand it.
Release published 2026-10-28 · Snapshot fetched 2026-11-01. Latest stable release at fetch time; development branches and Git history are excluded. Only the selected code window and visible folders load here.
1// Copyright (c) 2017 The Zcash developers2// Distributed under the MIT software license, see the accompanying3// file COPYING or http://www.opensource.org/licenses/mit-license.php.4//6#include <boost/test/unit_test.hpp>8#include <map>9#include <string>10#include <utility>13std::pair<std::string, std::string> SplitTorReplyLine(const std::string& s);14std::map<std::string, std::string> ParseTorReplyMapping(const std::string& s);17BOOST_AUTO_TEST_SUITE(torcontrol_tests)19static void CheckSplitTorReplyLine(std::string input, std::string command, std::string args)20{21auto ret = SplitTorReplyLine(input);22BOOST_CHECK_EQUAL(ret.first, command);23BOOST_CHECK_EQUAL(ret.second, args);24}26BOOST_AUTO_TEST_CASE(util_SplitTorReplyLine)27{28// Data we should receive during normal usage29CheckSplitTorReplyLine(30"PROTOCOLINFO PIVERSION",31"PROTOCOLINFO", "PIVERSION");32CheckSplitTorReplyLine(33"AUTH METHODS=COOKIE,SAFECOOKIE COOKIEFILE=\"/home/x/.tor/control_auth_cookie\"",34"AUTH", "METHODS=COOKIE,SAFECOOKIE COOKIEFILE=\"/home/x/.tor/control_auth_cookie\"");35CheckSplitTorReplyLine(36"AUTH METHODS=NULL",37"AUTH", "METHODS=NULL");38CheckSplitTorReplyLine(39"AUTH METHODS=HASHEDPASSWORD",40"AUTH", "METHODS=HASHEDPASSWORD");41CheckSplitTorReplyLine(42"VERSION Tor=\"0.2.9.8 (git-a0df013ea241b026)\"",43"VERSION", "Tor=\"0.2.9.8 (git-a0df013ea241b026)\"");44CheckSplitTorReplyLine(45"AUTHCHALLENGE SERVERHASH=aaaa SERVERNONCE=bbbb",46"AUTHCHALLENGE", "SERVERHASH=aaaa SERVERNONCE=bbbb");48// Other valid inputs49CheckSplitTorReplyLine("COMMAND", "COMMAND", "");50CheckSplitTorReplyLine("COMMAND SOME ARGS", "COMMAND", "SOME ARGS");52// These inputs are valid because PROTOCOLINFO accepts an OtherLine that is53// just an OptArguments, which enables multiple spaces to be present54// between the command and arguments.55CheckSplitTorReplyLine("COMMAND ARGS", "COMMAND", " ARGS");56CheckSplitTorReplyLine("COMMAND EVEN+more ARGS", "COMMAND", " EVEN+more ARGS");57}59static void CheckParseTorReplyMapping(std::string input, std::map<std::string,std::string> expected)60{61auto ret = ParseTorReplyMapping(input);62BOOST_CHECK_EQUAL(ret.size(), expected.size());63auto r_it = ret.begin();64auto e_it = expected.begin();65while (r_it != ret.end() && e_it != expected.end()) {66BOOST_CHECK_EQUAL(r_it->first, e_it->first);67BOOST_CHECK_EQUAL(r_it->second, e_it->second);68r_it++;69e_it++;70}71}73BOOST_AUTO_TEST_CASE(util_ParseTorReplyMapping)74{75// Data we should receive during normal usage76CheckParseTorReplyMapping(77"METHODS=COOKIE,SAFECOOKIE COOKIEFILE=\"/home/x/.tor/control_auth_cookie\"", {78{"METHODS", "COOKIE,SAFECOOKIE"},79{"COOKIEFILE", "/home/x/.tor/control_auth_cookie"},80});81CheckParseTorReplyMapping(82"METHODS=NULL", {83{"METHODS", "NULL"},84});85CheckParseTorReplyMapping(86"METHODS=HASHEDPASSWORD", {87{"METHODS", "HASHEDPASSWORD"},88});89CheckParseTorReplyMapping(90"Tor=\"0.2.9.8 (git-a0df013ea241b026)\"", {91{"Tor", "0.2.9.8 (git-a0df013ea241b026)"},92});93CheckParseTorReplyMapping(94"SERVERHASH=aaaa SERVERNONCE=bbbb", {95{"SERVERHASH", "aaaa"},96{"SERVERNONCE", "bbbb"},97});98CheckParseTorReplyMapping(99"ServiceID=exampleonion1234", {100{"ServiceID", "exampleonion1234"},101});102CheckParseTorReplyMapping(103"PrivateKey=RSA1024:BLOB", {104{"PrivateKey", "RSA1024:BLOB"},105});106CheckParseTorReplyMapping(107"ClientAuth=bob:BLOB", {108{"ClientAuth", "bob:BLOB"},109});111// Other valid inputs112CheckParseTorReplyMapping(113"Foo=Bar=Baz Spam=Eggs", {114{"Foo", "Bar=Baz"},115{"Spam", "Eggs"},116});117CheckParseTorReplyMapping(118"Foo=\"Bar=Baz\"", {119{"Foo", "Bar=Baz"},120});121CheckParseTorReplyMapping(122"Foo=\"Bar Baz\"", {123{"Foo", "Bar Baz"},124});126// Escapes127CheckParseTorReplyMapping(128"Foo=\"Bar\\ Baz\"", {129{"Foo", "Bar Baz"},130});131CheckParseTorReplyMapping(132"Foo=\"Bar\\Baz\"", {133{"Foo", "BarBaz"},134});135CheckParseTorReplyMapping(136"Foo=\"Bar\\@Baz\"", {137{"Foo", "Bar@Baz"},138});139CheckParseTorReplyMapping(140"Foo=\"Bar\\\"Baz\" Spam=\"\\\"Eggs\\\"\"", {141{"Foo", "Bar\"Baz"},142{"Spam", "\"Eggs\""},143});144CheckParseTorReplyMapping(145"Foo=\"Bar\\\\Baz\"", {146{"Foo", "Bar\\Baz"},147});149// C escapes150CheckParseTorReplyMapping(151"Foo=\"Bar\\nBaz\\t\" Spam=\"\\rEggs\" Octals=\"\\1a\\11\\17\\18\\81\\377\\378\\400\\2222\" Final=Check", {152{"Foo", "Bar\nBaz\t"},153{"Spam", "\rEggs"},154{"Octals", "\1a\11\17\1" "881\377\37" "8\40" "0\222" "2"},155{"Final", "Check"},156});157CheckParseTorReplyMapping(158"Valid=Mapping Escaped=\"Escape\\\\\"", {159{"Valid", "Mapping"},160{"Escaped", "Escape\\"},161});162CheckParseTorReplyMapping(163"Valid=Mapping Bare=\"Escape\\\"", {});164CheckParseTorReplyMapping(165"OneOctal=\"OneEnd\\1\" TwoOctal=\"TwoEnd\\11\"", {166{"OneOctal", "OneEnd\1"},167{"TwoOctal", "TwoEnd\11"},168});170// Special handling for null case171// (needed because string comparison reads the null as end-of-string)172auto ret = ParseTorReplyMapping("Null=\"\\0\"");173BOOST_CHECK_EQUAL(ret.size(), 1U);174auto r_it = ret.begin();175BOOST_CHECK_EQUAL(r_it->first, "Null");176BOOST_CHECK_EQUAL(r_it->second.size(), 1U);177BOOST_CHECK_EQUAL(r_it->second[0], '\0');179// A more complex valid grammar. PROTOCOLINFO accepts a VersionLine that180// takes a key=value pair followed by an OptArguments, making this valid.181// Because an OptArguments contains no semantic data, there is no point in182// parsing it.183CheckParseTorReplyMapping(184"SOME=args,here MORE optional=arguments here", {185{"SOME", "args,here"},186});188// Inputs that are effectively invalid under the target grammar.189// PROTOCOLINFO accepts an OtherLine that is just an OptArguments, which190// would make these inputs valid. However,191// - This parser is never used in that situation, because the192// SplitTorReplyLine parser enables OtherLine to be skipped.193// - Even if these were valid, an OptArguments contains no semantic data,194// so there is no point in parsing it.195CheckParseTorReplyMapping("ARGS", {});196CheckParseTorReplyMapping("MORE ARGS", {});197CheckParseTorReplyMapping("MORE ARGS", {});198CheckParseTorReplyMapping("EVEN more=ARGS", {});199CheckParseTorReplyMapping("EVEN+more ARGS", {});200}202BOOST_AUTO_TEST_SUITE_END()
Independent explanations by MyBitcoinExplorer. Not affiliated with or endorsed by Bitcoin Core. Guides are educational and do not replace the source or its tests.
Bitcoin Core source © its contributors, distributed under the MIT license. Original notices and bundled third-party licenses are retained in the source tree.