MockGettingOutputs added

pull/85/head
moneroexamples 6 years ago
parent 427adfbb9a
commit 15f2801650

@ -213,6 +213,8 @@ OutputInputIdentification::identify_inputs(
it->second, // amount
output_data.pubkey});
//cout << "\n\n" << it->second << endl;
found_a_match = true;
}

@ -1442,9 +1442,13 @@ addr_and_viewkey_from_string(string const& addres_str,
bool
output_data_from_hex(
string const& out_data_hex,
vector<cryptonote::output_data_t>& outputs_data_v)
std::map<vector<uint64_t>,
vector<cryptonote::output_data_t>>&
outputs_data_map)
{
vector<string> outputs_data_v_str;
// key: vector of absolute_offsets,
// value: vector of output_info_of_mixins as string
std::map<vector<uint64_t>, vector<string>> outputs_data_map_str;
try
{
@ -1457,19 +1461,24 @@ output_data_from_hex(
std::stringstream iss;
iss << out_data_blob;
boost::archive::portable_binary_iarchive archive(iss);
archive >> outputs_data_v_str;
archive >> outputs_data_map_str;
for (string const& s: outputs_data_v_str)
for (auto const& kv: outputs_data_map_str)
{
cryptonote::output_data_t out_data;
auto const& absolute_offsets = kv.first;
if (!hex_to_pod(s, out_data))
for (string const& s: kv.second)
{
cerr << "hex_to_pod faild in output_data_from_hex\n";
return false;
}
cryptonote::output_data_t out_data;
if (!hex_to_pod(s, out_data))
{
cerr << "hex_to_pod faild in output_data_from_hex\n";
return false;
}
outputs_data_v.push_back(out_data);
outputs_data_map[absolute_offsets].push_back(out_data);
}
}
}
catch (...)
@ -1481,5 +1490,67 @@ output_data_from_hex(
return true;
}
bool
populate_known_outputs_from_csv(
string const& csv_file,
std::unordered_map<public_key, uint64_t>& known_outputs,
bool skip_first_line)
{
std::ifstream input(csv_file);
string line;
while(getline(input, line))
{
if (skip_first_line)
{
skip_first_line = false;
continue;
}
vector<string> vec;
boost::algorithm::split(vec, line, boost::is_any_of(","));
uint64_t amount;
string out_public_key;
try
{
amount = boost::lexical_cast<uint64_t>(vec.at(7));
out_public_key = vec.at(8);
}
catch (std::exception const& e)
{
cerr << e.what() << endl;
return false;
}
public_key out_pk;
if (!hex_to_pod(out_public_key, out_pk))
{
cerr << "hex_to_pod failed in output_data_from_hex\n";
return false;
}
auto it = known_outputs.find(out_pk);
if (it != known_outputs.end())
{
cerr << "csv has duplicate out_public_key\n";
return false;
}
known_outputs.insert({out_pk, amount});
}
return true;
}
}

@ -289,11 +289,21 @@ addr_and_viewkey_from_string(string const& addres_str,
address_parse_info& address_info,
crypto::secret_key& viewkey);
// this function only useful in google test for mocking
// ring member output info
bool
output_data_from_hex(
string const& out_data_hex,
vector<cryptonote::output_data_t>& outputs_data_v);
std::map<vector<uint64_t>,
vector<cryptonote::output_data_t>>& outputs_data_map);
// this function only useful in google test for mocking
// known outputs and their amounts
bool
populate_known_outputs_from_csv(
string const& csv_file,
std::unordered_map<public_key, uint64_t>& known_outputs,
bool skip_first_line = true);
}
#endif //XMREG01_TOOLS_H

@ -31,6 +31,8 @@ using ::testing::SetArgReferee;
using ::testing::SetArgPointee;
using ::testing::_;
using ::testing::internal::FilePath;
using ::testing::Invoke;
@ -177,6 +179,50 @@ public:
bool(const uint64_t& amount,
const vector<uint64_t>& absolute_offsets,
vector<cryptonote::output_data_t>& outputs));
};
// Mocking CurrentBlockchainStatus::get_output_keys
// is a bit more complicated than other methods as
// its vector<cryptonote::output_data_t>& outputs
// should be dependant on a absolute_offsets vector.
// This means that we should mock vector of output_data_t for
// for a given absolute_offsets vector
struct MockGettingOutputs
{
// key: vector of absolute_offsets,
// value: vector of output_info_of_mixins
using ring_members_mock_map_t
= std::map<vector<uint64_t>,
vector<cryptonote::output_data_t>>;
ring_members_mock_map_t ring_member_data;
MockGettingOutputs(ring_members_mock_map_t const& mock_data)
: ring_member_data {mock_data}
{}
// this is the mock version of CurrentBlockchainStatus::get_output_keys
// which is going to return correct outputs
// based on absolute_offsets
bool
get_output_keys(
const uint64_t& amount,
const vector<uint64_t>& absolute_offsets,
vector<cryptonote::output_data_t>& outputs)
{
(void) amount;
outputs = ring_member_data[absolute_offsets];
return true;
}
};
}

@ -114,25 +114,46 @@ TEST_F(OUTPUTIDENT_TEST, IncomingPreRingctTransaction)
}
// private testnet wallet 9wq792k9sxVZiLn66S3Qzv8QfmtcwkdXgM5cWGsXAPxoQeMQ79md51PLPCijvzk1iHbuHi91pws5B7iajTX9KTtJ4bh2tCh
// viewkey f747f4a4838027c9af80e6364a941b60c538e67e9ea198b6ec452b74c276de06
// spendkey 509a9761fde8856fc38e79ca705d85f979143524f178f8e2e0eb539fc050e905
// seed: deftly large tirade gumball android leech sidekick opened iguana voice gels focus poaching itches network espionage much jailed vaults winter oatmeal eleven science siren winter
string addr_9wq792k {"9wq792k9sxVZiLn66S3Qzv8QfmtcwkdXgM5cWGsXAPxoQeMQ79md51PLPCijvzk1iHbuHi91pws5B7iajTX9KTtJ4bh2tCh"};
string viewkey_9wq792k {"f747f4a4838027c9af80e6364a941b60c538e67e9ea198b6ec452b74c276de06"};
// ./xmr2csv --testnet -b /home/mwo/testnet/node_01/testnet/lmdb/ -a 9wq792k9sxVZiLn66S3Qzv8QfmtcwkdXgM5cWGsXAPxoQeMQ79md51PLPCijvzk1iHbuHi91pws5B7iajTX9KTtJ4bh2tCh -v f747f4a4838027c9af80e6364a941b60c538e67e9ea198b6ec452b74c276de06
string known_outputs_csv_9wq792k {"./res/outputs_testnet_9wq792k9.csv"};
TEST_F(OUTPUTIDENT_TEST, OutgingPreRingctTransaction)
{
// private testnet tx_hash 01e3d29a5b6b6e1999b9e7e48b9abe101bb93055b701b23d98513fb0646e7570
string tx_hex {"0100020280e08d84ddcb0107041e6508060e1df9733757fb1563579b3a0ecefb4063dc66a75ad6bae3d0916ab862789c31f6aa0280e08d84ddcb01075f030f17031713f43315e59fbd6bacb3aa1a868edc33a0232f5031f6c573d6d7b23e752b6beee10580d0b8e1981a02e04e4d7d674381d16bf50bdc1581f75f7b2df591b7a40d73efd8f5b3c4be2a828088aca3cf02025c3fb06591f216cab833bb6deb2e173e0a9a138addf527eaff80912b8f4ff47280f882ad1602779945c0e6cbbc7def201e170a38bb9822109ddc01f330a5b00d12eb26b6fd4880e0bcefa757024f05eb53b5ebd60e502abd5a2fcb74b057b523acccd191df8076e27083ef619180c0caf384a302022dffb5574d937c1add2cf88bd374af40d577c7cc1a22c3c8805afd49840a60962101945fd9057dd42ef52164368eab1a5f430268e029f83815897d4f1e08b0e00873dbf5b4127be86ba01f23f021a40f29e29110f780fa0be36041ecf00b6c7b480edb090ba58dea640ca19aa4921a56c4b6dcbf11897c53db427dfdbc2f3072480b6c02f409b45c5d2401a19d8cfb13d9124d858d2774d9945f448f19e1e243e004588368813689c1c1be4e1242c633b7a2eb4936546fda57c99dac7fab81e40d0512e39d04ce285f96ac80f6d91ee39157189d73e198fa6b397bd34d8685dbf20e3f869043b686c291f8d4401f673978c683841ec39c45ce06564ccf87c68a080ad17bcce3d7240cd8d57ecbb190fef27578679cdd39ea3c868ab65d6d1d2c20062e921ceea054f755ceef8cd24e54078f9a5bedea2ca59d90ad277bd250c90605b3dd832aa15a4eb01080210ade74638f1558e203c644aa608147c9f596ce3c03023e99f9ca5b3cae41cbd230bc20f2b87f1e06967c852115abc7e56566ddaf09b5774568375fa0f27b45d946cfb2859f1c7a3ad6b7a8e097e955a6ee77c6db0b083dbda85b317dcd77e4be29079420bf683a91ac94feb0f788d5e3dfe72bef028768d76f9ebffd4cb2fd4a314e293df51cb43f12091632e93f4f97fdab7ab60dd50611233fbb1048dccd6478184b914710c894d8116620fcfd09d73ef304c90af210a4724c9e8adb2c47396a67944d6fe827a9b06f7a3c3b6cd2946f328cc306e0a0d194443734cc90fb94ccdb74f8fa7a19690793ddc2b0b06e52d0d4d8530ac227d58a2936fbbf18bbbc2af03443a44ff2a844be527371fedc03c50cce200e8e2b4fdb501e2fba103aafc2487be7faaa83f3894bdcfad873a6697ad930500bc56e28139ef4c6d9b8ee06390b4bcb1b6bfcc6e3136be89e3bdccff50d104906d354569aedfd8b2a5cb62b8738218760a9ebbc5dff3de038ab2e0369f28e3d0d921d28b388acdf69988b5c77120de5317be614da7c774f1f815a7137625da90f0342ca5df7bbc8515066c3d8fa37f1d69727f69e540ff66578bd0e6adf73fa074ce25809e47f06edc9d8ac9f49b4f02b8fd48ef8b03d7a6e823c6e2fc105ee0384a5a3a4bfefc41cf7240847e50121233de0083bbd904903b9879ecdd5a3b701a2196e13e438cf3980ab0b85c5e4e3595c46f034cb393b1e291e3e288678c90e9aac0abe0723520d47e94584ff65dfec8d4d1b1d2c378f87347f429a2178b10ad530bfe406441d7b21c1f0ea04920c9715434b16e6f5c561eab4e8b31040a30b280fc0e3ebc71d1d85a6711591487a50e4ca1362aae564c6e332b97da65c0c07"};
// private testnet tx_hash 0889658a54ddfaa61f62fdc0393adc498e1227195d413de45c5f0e0da3f5068d
string tx_hex {"0100020280e08d84ddcb0107b902e401081b2c10418ba25b21dc2e9fd3d6d8dd69c14888ab0ed429f8cc86a7edba20bdd2bde61bab0280c0caf384a30207d10194012438201e78879c4ee5f780a4fcabc5ce20716080392fc4715db6334f956e210283beed920f0580c0caf384a302020ffede2e6e4a3d613f6ebcca9d3337d54c5b65f7095cc04faf6c9408206b463c80f882ad16021b48cdc46b84e348596f35a0fb4f0107da3a7e5f8b486be6a36fc90ff052117e80d0b8e1981a02e6de1aa8176921a8d5f8ef02a12004f5183f77a601c347f84e7be18c400572e18088aca3cf02022f061ade6afb847d57d29609255089b477d2c33c34d06e13ec5982d18eb785c580c0f9decfae010211c7792d1a8d8c23bbd0e2c4c79b28a711fa4d6ff64906013ddd2b8bca42a6d444022100000000000000000000000000000000000000000000006f70656e6d6f6e65726f0189bb4ab10d9ae0b84096fe0f4b95da56e3949b71c6eca5f284a4a02c83ed174675d6b1d2e529f5e4199bb738a47e7f50fc7acbf86a3908eb0c3023013ea9e808974dd6e0c0fe2c9853d316d63a35206628790b60997a22cefb9383762ba05a0fb11987072d29d76b172700ea6b9cb61ddbdea60372b35de748f9a7fc0d18f30a02b76e272c76446d828b6cef9a2df96f867792da27f08ca116dca121f73bcf09fe4fff1a1b8a099fffafefac87f10ecdaf02f48e0b903ced2d737bcb803f0c0525588ed99e71b21c35878ce0697990bf768bc35e0e6841bf1cf91c1fc116ee0a01343ec7e52ded6bdb89571b40590834d4c04715b4eb28102dad54b455dd6d03380e9eac3c058159e7fa4f5d3da30b3eda24c7e49a87e1523e5b478efdb8020fa03a4788d214a7ec64454366525ebf66ef8692a0db97a2ff96e1ad926e315105104c7ef19f59aff25265f54489f7e0fdde6205e6f62b4beb6b0d5a2a233a4807e5460bd83dfa3929b56bd84705cee12ce7bcaca09539bd128fc9e7513a3e63022297c65ef1ac04bb1807b85fa3ef38342aa8342ec33dfe4979a1590d372218034649bbb7975d6790e04105cef27a6337996896758f4fa6a962425fc802dd790114020c4f14efe604f00b8f829d6c82bd2c9719a60c39565944998d43f299070ab78325c8a20557e03dd2e50e516503d16bd436b5af949a978097e0ce347a700c13c5ce0d039ea7bfc7cc8e975c0710e74b6b0930ffd597eaf80c0fdc18711e0e6c8e1aed3c2bd4ff035df0745e69d30ec0dff351c0d780cda8873c010419d209c19d6fc4c366911170892c6e696709069e6469018ff2c61f5f42b283bd4c590a3e5f71f7934635c1e7cca1cbf0ec91517ce65673c1b6c6c961625537b2e93208db342fb9c2f246c6d636adf66bece8bae648be290140452d63c6d87fb3ff990c86725d7bc4968cac48f10d7b6a4d35b63e3040c42f6e76e7224fa308a042b10807cd36ffe28daca3e2a755645be3f588565f9ee79b19b7f8c572a872bb61fd08c9d6473dfe2a5ae4f100744ed91e2e8817ef417309c4d0f4a5023272b87b8b00c08ee85c037417b5241e6715db7b0e932ef7e08cba00914bf485a46690f0370016d3e2ca265accec86c295cd02c13d67fa6bcc1f51803d537eaef804bdeaef05316c79554916dc5afb6ac1581436a26ac5cd687d83b4ccbbfae8e230eac2aa0c2b87f2db0b70cea9ad4cf9cb3218c4aa37da05245bc401a1ea4afcdcd833d40fadc38c6d38bd75fe63a364a0bed1c9b6656b4f803b944e5947d1c398a9eed200"};
TX_FROM_HEX(tx_hex);
ADDR_VIEWKEY_FROM_STRING(addr_9wq79, viewkey_9wq79, net_type);
ADDR_VIEWKEY_FROM_STRING(addr_9wq792k, viewkey_9wq792k, net_type);
// the ring members data from the above tx
string out_data_hex {"011673657269616c697a6174696f6e3a3a6172636869766500000000010e0001a03038356132323031303531636636353163373536353938323866326135306130323433383761353436663362646136663738666231653239343265323837343034313030303030303030303030303030303530303030303030303030303030303539613033613331353361393934643732333237653464393234323164336533323931623166613162323430646534346239326437663632656330313238663101a06336663964386232366536326533386162336131643537383138393639306537396466623434356361623531343139326364303137313864663735616437356135663030303030303030303030303030323330303030303030303030303030303539613033613331353361393934643732333237653464393234323164336533323931623166613162323430646534346239326437663632656330313238663101a03063383837666437343335346337363866323535346637313235626439393861356137333836303730663065653633353233346465313833373732636330383563343030303030303030303030303030383830303030303030303030303030303539613033613331353361393934643732333237653464393234323164336533323931623166613162323430646534346239326437663632656330313238663101a06232313662316464623833306334376132366163383537633636643036323034306632376334653539356539303434663464323535393034636333613966646663633030303030303030303030303030393030303030303030303030303030303539613033613331353361393934643732333237653464393234323164336533323931623166613162323430646534346239326437663632656330313238663101a06538333833643433343233303637343563616661356438356366363237316631323937653337643931646337373733303733356631643062623661303764366164323030303030303030303030303030393630303030303030303030303030303539613033613331353361393934643732333237653464393234323164336533323931623166613162323430646534346239326437663632656330313238663101a03931626630353836386333393830386435666263346136326537366266376330626362333361363166353635313165353432336136613661333135383136663565303030303030303030303030303030613430303030303030303030303030303539613033613331353361393934643732333237653464393234323164336533323931623166613162323430646534346239326437663632656330313238663101a06165633361303065323532633635366434396462383138343636643931383863613139363566663761623736343833633239336637363931313030643561373766643030303030303030303030303030633130303030303030303030303030303539613033613331353361393934643732333237653464393234323164336533323931623166613162323430646534346239326437663632656330313238663101a03235613131323238373636633764653765386163623266303565646166613430333637616436653730386535383962653332323634376339616632313233323239633030303030303030303030303030363030303030303030303030303030303539613033613331353361393934643732333237653464393234323164336533323931623166613162323430646534346239326437663632656330313238663101a03764336366376135333634613934303037663661626536666166343063666135376434663862373264643434633337623137356664396330623565393831363439663030303030303030303030303030363330303030303030303030303030303539613033613331353361393934643732333237653464393234323164336533323931623166613162323430646534346239326437663632656330313238663101a03662626531323431373435663066383737643662643463656236366136613934313963666637636264653934666630333666366266366661386237333433303861653030303030303030303030303030373230303030303030303030303030303539613033613331353361393934643732333237653464393234323164336533323931623166613162323430646534346239326437663632656330313238663101a03766633936643634636634623765663730363137333863356534343137343037383564616365323630643862336661396439353735333731316237303033353963353030303030303030303030303030383930303030303030303030303030303539613033613331353361393934643732333237653464393234323164336533323931623166613162323430646534346239326437663632656330313238663101a03835353961343830633565356434643530383265323936666234303032303561373266623337333232653462306364323434303933306165653337616333366263383030303030303030303030303030386330303030303030303030303030303539613033613331353361393934643732333237653464393234323164336533323931623166613162323430646534346239326437663632656330313238663101a03130353664323139613639306432363531613135393735353433343837613565313063373866643037326566363038343237336265373833313861653865373164663030303030303030303030303030613330303030303030303030303030303539613033613331353361393934643732333237653464393234323164336533323931623166613162323430646534346239326437663632656330313238663101a039336363636261613333656338616532383130346539363938646465316561653838323261363262393364313532323739373864393131313133313935656534663230303030303030303030303030306236303030303030303030303030303035396130336133313533613939346437323332376534643932343231643365333239316231666131623234306465343462393264376636326563303132386631"};
vector<cryptonote::output_data_t> outputs_to_return;
//
// this hex is obtained using onion explorer runnign with --enbale-as-hex flag
// it is hex, serializied representation of of map of key_images
// with corresponding ring members output_data_t info structure
// we do this so that we just mack all the calls, instead of
// accessing real blockchain for this data.
string ring_member_data_hex {"011673657269616c697a6174696f6e3a3a6172636869766500000000010200000001070001d102650102890102c10102e10102ff01027702000001070001a03730613039333763663136313063306466363332333864373363323235346163363039623031343565663335333436653034373331656534633166343336643830653031303030303030303030303030643230303030303030303030303030303136336464363832656339373763646461353935333164613366666137323939386136663838333761626164633633366161656463386265313962326437633701a03262306634636561663332353534613665386637306433383662613630343166613664316635346134326430363937663832663436393936396531346336303161313031303030303030303030303030363530313030303030303030303030303136336464363832656339373763646461353935333164613366666137323939386136663838333761626164633633366161656463386265313962326437633701a06137623538633963396133333837653637336464646232306433336632626566336131393239636261653434353338346336656361346361313934646237653263353031303030303030303030303030383930313030303030303030303030303136336464363832656339373763646461353935333164613366666137323939386136663838333761626164633633366161656463386265313962326437633701a03538336531303131363633313133326666383361633364636135393831656335393634626634386434663439366331333537343137653361366539646333333866643031303030303030303030303030633130313030303030303030303030303136336464363832656339373763646461353935333164613366666137323939386136663838333761626164633633366161656463386265313962326437633701a03866363363633930346637643033626131343565366638323039333334353064633332313661306365393537666135613234373139336463323434653063623630303030303030303030303030303030646630313030303030303030303030303136336464363832656339373763646461353935333164613366666137323939386136663838333761626164633633366161656463386265313962326437633701a03832653363626164653363333963323636386534666439303861383662663237376533366637316563326631663465386432636363306666646236363236393133393032303030303030303030303030666430313030303030303030303030303136336464363832656339373763646461353935333164613366666137323939386136663838333761626164633633366161656463386265313962326437633701a035366261663166393130653861316366326264396235313464386333313030633531393731303565383033643462306230636137616664383863643462353764623130323030303030303030303030303735303230303030303030303030303031363364643638326563393737636464613539353331646133666661373239393861366638383337616261646336333661616564633862653139623264376337010700023901021d02022502024002026c02027c0202bd0201070001a06236616662313139646231396538616266656636303062326431383135653332636238626236366130663566363532396434303931313534653163313330623037363031303030303030303030303030336130313030303030303030303030303539613033613331353361393934643732333237653464393234323164336533323931623166613162323430646534346239326437663632656330313238663101a03439346533303462643861376261626131343331633065633563383431623162346236333137626232353131663561636531393461343066653534323366646635613032303030303030303030303030316530323030303030303030303030303539613033613331353361393934643732333237653464393234323164336533323931623166613162323430646534346239326437663632656330313238663101a03732353739376634623939636163373736396362343264646532313434303731346138363362303036363739306431343937386634336138643261653431353436323032303030303030303030303030323630323030303030303030303030303539613033613331353361393934643732333237653464393234323164336533323931623166613162323430646534346239326437663632656330313238663101a03439383766656363333237663463646266323461343564386162366334323535623930303535623263633730323364386161656538626461633133303466343637643032303030303030303030303030343130323030303030303030303030303539613033613331353361393934643732333237653464393234323164336533323931623166613162323430646534346239326437663632656330313238663101a03565663938366461323138346133353333636531396163653365613735333138353363393631323765336534663336613638613139393562333162663037363561393032303030303030303030303030366430323030303030303030303030303539613033613331353361393934643732333237653464393234323164336533323931623166613162323430646534346239326437663632656330313238663101a06462343733353534326330626539376161653635613464646534353162613761396164653666613438393133303765313336393261633361336632373163356462393032303030303030303030303030376430323030303030303030303030303539613033613331353361393934643732333237653464393234323164336533323931623166613162323430646534346239326437663632656330313238663101a034313366633266643236663931333732333233323137366233393031376638643537636234396331643733666530616163303934666139633662343238613930666130323030303030303030303030306265303230303030303030303030303035396130336133313533613939346437323332376534643932343231643365333239316231666131623234306465343462393264376636326563303132386631"};
MockGettingOutputs::ring_members_mock_map_t mock_ring_members_data;
ASSERT_TRUE(xmreg::output_data_from_hex(out_data_hex,
outputs_to_return));
ASSERT_TRUE(xmreg::output_data_from_hex(ring_member_data_hex,
mock_ring_members_data));
MockGettingOutputs get_outputs(mock_ring_members_data);
EXPECT_CALL(*cbs_mock, get_output_keys(_,_,_))
.WillRepeatedly(DoAll(SetArgReferee<2>(outputs_to_return),
Return(true)));
.WillRepeatedly(Invoke(&get_outputs,
&MockGettingOutputs::get_output_keys));
xmreg::OutputInputIdentification oi {&address, &viewkey, &tx,
tx_hash, is_tx_coinbase,
@ -140,7 +161,20 @@ TEST_F(OUTPUTIDENT_TEST, OutgingPreRingctTransaction)
xmreg::TxSearch::known_outputs_t known_outputs;
xmreg::populate_known_outputs_from_csv(
known_outputs_csv_9wq792k, known_outputs);
oi.identify_outputs();
oi.identify_inputs(known_outputs);
EXPECT_EQ(oi.identified_inputs.size(), 2);
uint64_t found_input_amounts {0};
for (auto& in_info: oi.identified_inputs)
found_input_amounts += in_info.amount;
EXPECT_EQ(found_input_amounts, 17000000000000ull);
}
TEST_F(OUTPUTIDENT_TEST, IncomingPreRingctCoinbaseTransaction)

Loading…
Cancel
Save