diff --git a/src/test/alert_tests.cpp b/src/test/alert_tests.cpp index ccfb6132b..c9afafa95 100644 --- a/src/test/alert_tests.cpp +++ b/src/test/alert_tests.cpp @@ -13,6 +13,8 @@ #include "data/alertTests.raw.h" #include "main.h" +#include "rpcprotocol.h" +#include "rpcserver.h" #include "serialize.h" #include "streams.h" #include "util.h" @@ -25,6 +27,7 @@ #include #include #include +#include "json/json_spirit_reader_template.h" #include "key.h" #include "alertkeys.h" @@ -182,9 +185,22 @@ void GenerateAlertTests() ++alert.nID; SignAndSerialize(alert, sBuffer); + ++alert.nID; + alert.nPriority = 5000; + alert.strStatusBar = "Alert 3, disables RPC"; + alert.strRPCError = "RPC disabled"; + SignAndSerialize(alert, sBuffer); + + ++alert.nID; + alert.nPriority = 5000; + alert.strStatusBar = "Alert 4, re-enables RPC"; + alert.strRPCError = ""; + SignAndSerialize(alert, sBuffer); + ++alert.nID; alert.nMinVer = 11; alert.nMaxVer = 22; + alert.nPriority = 100; SignAndSerialize(alert, sBuffer); ++alert.nID; @@ -320,7 +336,7 @@ BOOST_AUTO_TEST_CASE(AlertNotify) alert.ProcessAlert(alertKey, false); std::vector r = read_lines(temp); - BOOST_CHECK_EQUAL(r.size(), 4u); + BOOST_CHECK_EQUAL(r.size(), 6u); // Windows built-in echo semantics are different than posixy shells. Quotes and // whitespace are printed literally. @@ -329,16 +345,43 @@ BOOST_AUTO_TEST_CASE(AlertNotify) BOOST_CHECK_EQUAL(r[0], "Alert 1"); BOOST_CHECK_EQUAL(r[1], "Alert 2, cancels 1"); BOOST_CHECK_EQUAL(r[2], "Alert 2, cancels 1"); - BOOST_CHECK_EQUAL(r[3], "Evil Alert; /bin/ls; echo "); // single-quotes should be removed + BOOST_CHECK_EQUAL(r[3], "Alert 3, disables RPC"); + BOOST_CHECK_EQUAL(r[4], "Alert 4, reenables RPC"); // dashes should be removed + BOOST_CHECK_EQUAL(r[5], "Evil Alert; /bin/ls; echo "); // single-quotes should be removed #else BOOST_CHECK_EQUAL(r[0], "'Alert 1' "); BOOST_CHECK_EQUAL(r[1], "'Alert 2, cancels 1' "); BOOST_CHECK_EQUAL(r[2], "'Alert 2, cancels 1' "); - BOOST_CHECK_EQUAL(r[3], "'Evil Alert; /bin/ls; echo ' "); + BOOST_CHECK_EQUAL(r[3], "'Alert 3, disables RPC' "); + BOOST_CHECK_EQUAL(r[4], "'Alert 4, reenables RPC' "); // dashes should be removed + BOOST_CHECK_EQUAL(r[5], "'Evil Alert; /bin/ls; echo ' "); #endif boost::filesystem::remove(temp); SetMockTime(0); + mapAlerts.clear(); +} + +BOOST_AUTO_TEST_CASE(AlertDisablesRPC) +{ + SetMockTime(11); + const std::vector& alertKey = Params(CBaseChainParams::MAIN).AlertKey(); + + // Command should work before alerts + BOOST_CHECK_EQUAL(GetWarnings("rpc"), ""); + + // First alert should disable RPC + alerts[5].ProcessAlert(alertKey, false); + BOOST_CHECK_EQUAL(alerts[5].strRPCError, "RPC disabled"); + BOOST_CHECK_EQUAL(GetWarnings("rpc"), "RPC disabled"); + + // Second alert should re-enable RPC + alerts[6].ProcessAlert(alertKey, false); + BOOST_CHECK_EQUAL(alerts[6].strRPCError, ""); + BOOST_CHECK_EQUAL(GetWarnings("rpc"), ""); + + SetMockTime(0); + mapAlerts.clear(); } static bool falseFunc() { return false; } diff --git a/src/test/data/alertTests.raw b/src/test/data/alertTests.raw index 019f2b0df..23fbfa98f 100644 Binary files a/src/test/data/alertTests.raw and b/src/test/data/alertTests.raw differ