2 // Unit tests for alert system
5 #include <boost/foreach.hpp>
6 #include <boost/test/unit_test.hpp>
10 #include "serialize.h"
12 #include "data/alertTests.raw.h"
16 // alertTests contains 7 alerts, generated with this code:
17 // (SignAndSave code not shown, alert signing key is secret)
21 alert.nRelayUntil = 60;
22 alert.nExpiration = 24 * 60 * 60;
24 alert.nCancel = 0; // cancels previous messages up to this ID number
25 alert.nMinVer = 0; // These versions are protocol versions
26 alert.nMaxVer = 70001;
28 alert.strComment = "Alert comment";
29 alert.strStatusBar = "Alert 1";
31 SignAndSave(alert, "test/alertTests");
33 alert.setSubVer.insert(std::string("/Satoshi:0.1.0/"));
34 alert.strStatusBar = "Alert 1 for Satoshi 0.1.0";
35 SignAndSave(alert, "test/alertTests");
37 alert.setSubVer.insert(std::string("/Satoshi:0.2.0/"));
38 alert.strStatusBar = "Alert 1 for Satoshi 0.1.0, 0.2.0";
39 SignAndSave(alert, "test/alertTests");
41 alert.setSubVer.clear();
44 alert.nPriority = 100;
45 alert.strStatusBar = "Alert 2, cancels 1";
46 SignAndSave(alert, "test/alertTests");
48 alert.nExpiration += 60;
50 SignAndSave(alert, "test/alertTests");
55 SignAndSave(alert, "test/alertTests");
58 alert.strStatusBar = "Alert 2 for Satoshi 0.1.0";
59 alert.setSubVer.insert(std::string("/Satoshi:0.1.0/"));
60 SignAndSave(alert, "test/alertTests");
64 alert.nMaxVer = 999999;
65 alert.strStatusBar = "Evil Alert'; /bin/ls; echo '";
66 alert.setSubVer.clear();
67 SignAndSave(alert, "test/alertTests");
75 std::vector<unsigned char> vch(alert_tests::alertTests, alert_tests::alertTests + sizeof(alert_tests::alertTests));
76 CDataStream stream(vch, SER_DISK, CLIENT_VERSION);
82 alerts.push_back(alert);
85 catch (std::exception) { }
89 static std::vector<std::string> read_lines(boost::filesystem::path filepath)
91 std::vector<std::string> result;
93 std::ifstream f(filepath.string().c_str());
95 while (std::getline(f,line))
96 result.push_back(line);
101 std::vector<CAlert> alerts;
104 BOOST_FIXTURE_TEST_SUITE(Alert_tests, ReadAlerts)
107 BOOST_AUTO_TEST_CASE(AlertApplies)
111 BOOST_FOREACH(const CAlert& alert, alerts)
113 BOOST_CHECK(alert.CheckSignature());
116 BOOST_CHECK(alerts.size() >= 3);
119 BOOST_CHECK(alerts[0].AppliesTo(1, ""));
120 BOOST_CHECK(alerts[0].AppliesTo(70001, ""));
121 BOOST_CHECK(alerts[0].AppliesTo(1, "/Satoshi:11.11.11/"));
123 BOOST_CHECK(alerts[1].AppliesTo(1, "/Satoshi:0.1.0/"));
124 BOOST_CHECK(alerts[1].AppliesTo(70001, "/Satoshi:0.1.0/"));
126 BOOST_CHECK(alerts[2].AppliesTo(1, "/Satoshi:0.1.0/"));
127 BOOST_CHECK(alerts[2].AppliesTo(1, "/Satoshi:0.2.0/"));
130 BOOST_CHECK(!alerts[0].AppliesTo(-1, ""));
131 BOOST_CHECK(!alerts[0].AppliesTo(70002, ""));
133 BOOST_CHECK(!alerts[1].AppliesTo(1, ""));
134 BOOST_CHECK(!alerts[1].AppliesTo(1, "Satoshi:0.1.0"));
135 BOOST_CHECK(!alerts[1].AppliesTo(1, "/Satoshi:0.1.0"));
136 BOOST_CHECK(!alerts[1].AppliesTo(1, "Satoshi:0.1.0/"));
137 BOOST_CHECK(!alerts[1].AppliesTo(-1, "/Satoshi:0.1.0/"));
138 BOOST_CHECK(!alerts[1].AppliesTo(70002, "/Satoshi:0.1.0/"));
139 BOOST_CHECK(!alerts[1].AppliesTo(1, "/Satoshi:0.2.0/"));
141 BOOST_CHECK(!alerts[2].AppliesTo(1, "/Satoshi:0.3.0/"));
147 // This uses sh 'echo' to test the -alertnotify function, writing to a
148 // /tmp file. So skip it on Windows:
150 BOOST_AUTO_TEST_CASE(AlertNotify)
154 boost::filesystem::path temp = GetTempPath() / "alertnotify.txt";
155 boost::filesystem::remove(temp);
157 mapArgs["-alertnotify"] = std::string("echo %s >> ") + temp.string();
159 BOOST_FOREACH(CAlert alert, alerts)
160 alert.ProcessAlert(false);
162 std::vector<std::string> r = read_lines(temp);
163 BOOST_CHECK_EQUAL(r.size(), 4u);
164 BOOST_CHECK_EQUAL(r[0], "Alert 1");
165 BOOST_CHECK_EQUAL(r[1], "Alert 2, cancels 1");
166 BOOST_CHECK_EQUAL(r[2], "Alert 2, cancels 1");
167 BOOST_CHECK_EQUAL(r[3], "Evil Alert; /bin/ls; echo "); // single-quotes should be removed
169 boost::filesystem::remove(temp);
175 BOOST_AUTO_TEST_SUITE_END()