From a9cfadc500dd2c4547bf54818f998b9b88b482f5 Mon Sep 17 00:00:00 2001 From: gladcow Date: Sun, 23 Feb 2020 19:31:51 +0300 Subject: [PATCH] [SON-242] fix list_active_sons call after deleting an active son (#292) * test to reproduce error in list_active_sons after delete_son * prevent exception in list_active_list --- libraries/wallet/wallet.cpp | 21 ++++++++++++--------- tests/cli/son.cpp | 3 +++ 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/libraries/wallet/wallet.cpp b/libraries/wallet/wallet.cpp index 194254be..943b6f1c 100644 --- a/libraries/wallet/wallet.cpp +++ b/libraries/wallet/wallet.cpp @@ -1988,19 +1988,22 @@ public: }); std::vector> son_objects = _remote_db->get_sons(son_ids); vector owners; - owners.resize(son_objects.size()); - std::transform(son_objects.begin(), son_objects.end(), owners.begin(), - [](const fc::optional& obj) { - FC_ASSERT(obj, "Invalid active SONs list in global properties."); - return obj->son_account; - }); + for(auto obj: son_objects) + { + if (obj) + owners.push_back(obj->son_account); + } vector> accs = _remote_db->get_accounts(owners); + std::remove_if(son_objects.begin(), son_objects.end(), + [](const fc::optional& obj) -> bool { return obj.valid(); }); map result; - std::transform(accs.begin(), accs.end(), son_ids.begin(), + std::transform(accs.begin(), accs.end(), son_objects.begin(), std::inserter(result, result.end()), - [](fc::optional& acct, son_id_type& sid) { + [](fc::optional& acct, fc::optional son) { FC_ASSERT(acct, "Invalid active SONs list in global properties."); - return std::make_pair(string(acct->name), std::move(sid)); + if (son.valid()) + return std::make_pair(string(acct->name), std::move(son->id)); + return std::make_pair(string(acct->name), std::move(son_id_type())); }); return result; } FC_CAPTURE_AND_RETHROW() } diff --git a/tests/cli/son.cpp b/tests/cli/son.cpp index d71ac4c8..7915c71e 100644 --- a/tests/cli/son.cpp +++ b/tests/cli/son.cpp @@ -650,6 +650,9 @@ BOOST_FIXTURE_TEST_CASE( cli_list_active_sons, cli_fixture ) BOOST_CHECK(active_sons.find(name) != active_sons.end()); } + // check list_active_son after SON deletion + con.wallet_api_ptr->delete_son("sonaccount1", true); + BOOST_CHECK_NO_THROW(con.wallet_api_ptr->list_active_sons()); } catch( fc::exception& e ) { BOOST_TEST_MESSAGE("SON cli wallet tests exception"); edump((e.to_detail_string()));