1 #include <gtest/gtest.h>
11 #include "libaktualizr/config.h"
12 #include "reportqueue.h"
13 #include "storage/invstorage.h"
14 #include "storage/sqlstorage.h"
15 #include "utilities/utils.h"
19 HttpFakeRq(
const boost::filesystem::path &test_dir_in,
size_t expected_events)
20 :
HttpFake(test_dir_in,
""), expected_events_(expected_events) {}
22 HttpResponse handle_event(
const std::string &url,
const Json::Value &
data)
override {
24 if (url ==
"reportqueue/SingleEvent/events") {
25 EXPECT_EQ(
data[0][
"eventType"][
"id"],
"EcuDownloadCompleted");
26 EXPECT_EQ(
data[0][
"event"][
"ecu"],
"SingleEvent");
28 if (events_seen == expected_events_) {
29 expected_events_received.set_value(
true);
32 }
else if (url.find(
"reportqueue/MultipleEvents") == 0) {
33 for (
int i = 0; i < static_cast<int>(
data.size()); ++i) {
34 EXPECT_EQ(
data[i][
"eventType"][
"id"],
"EcuDownloadCompleted");
35 EXPECT_EQ(
data[i][
"event"][
"ecu"],
"MultipleEvents" + std::to_string(events_seen++));
37 if (events_seen == expected_events_) {
38 expected_events_received.set_value(
true);
41 }
else if (url.find(
"reportqueue/FailureRecovery") == 0) {
42 if (
data.size() < 10) {
45 for (
int i = 0; i < static_cast<int>(
data.size()); ++i) {
46 EXPECT_EQ(
data[i][
"eventType"][
"id"],
"EcuDownloadCompleted");
47 EXPECT_EQ(
data[i][
"event"][
"ecu"],
"FailureRecovery" + std::to_string(i));
49 events_seen =
data.size();
50 if (events_seen == expected_events_) {
51 expected_events_received.set_value(
true);
55 }
else if (url.find(
"reportqueue/StoreEvents") == 0) {
56 for (
int i = 0; i < static_cast<int>(
data.size()); ++i) {
57 EXPECT_EQ(
data[i][
"eventType"][
"id"],
"EcuDownloadCompleted");
58 EXPECT_EQ(
data[i][
"event"][
"ecu"],
"StoreEvents" + std::to_string(events_seen++));
60 if (events_seen == expected_events_) {
61 expected_events_received.set_value(
true);
65 LOG_ERROR <<
"Unexpected event: " <<
data;
69 size_t events_seen{0};
70 size_t expected_events_;
71 std::promise<bool> expected_events_received{};
78 config.storage.path = temp_dir.Path();
79 config.tls.server =
"reportqueue/SingleEvent";
81 size_t num_events = 1;
82 auto http = std::make_shared<HttpFakeRq>(temp_dir.Path(), num_events);
83 auto sql_storage = std::make_shared<SQLStorage>(config.storage,
false);
84 ReportQueue report_queue(config, http, sql_storage);
86 report_queue.enqueue(std_::make_unique<EcuDownloadCompletedReport>(
Uptane::EcuSerial(
"SingleEvent"),
"",
true));
89 http->expected_events_received.get_future().wait_for(std::chrono::seconds(20));
90 EXPECT_EQ(http->events_seen, num_events);
97 config.storage.path = temp_dir.Path();
98 config.tls.server =
"reportqueue/MultipleEvents";
100 size_t num_events = 10;
101 auto http = std::make_shared<HttpFakeRq>(temp_dir.Path(), num_events);
102 auto sql_storage = std::make_shared<SQLStorage>(config.storage,
false);
103 ReportQueue report_queue(config, http, sql_storage);
105 for (
int i = 0; i < 10; ++i) {
106 report_queue.enqueue(std_::make_unique<EcuDownloadCompletedReport>(
111 http->expected_events_received.get_future().wait_for(std::chrono::seconds(20));
112 EXPECT_EQ(http->events_seen, num_events);
120 config.storage.path = temp_dir.Path();
121 config.tls.server =
"reportqueue/FailureRecovery";
123 size_t num_events = 10;
124 auto http = std::make_shared<HttpFakeRq>(temp_dir.Path(), num_events);
125 auto sql_storage = std::make_shared<SQLStorage>(config.storage,
false);
126 ReportQueue report_queue(config, http, sql_storage);
128 for (
size_t i = 0; i < num_events; ++i) {
129 report_queue.enqueue(std_::make_unique<EcuDownloadCompletedReport>(
134 http->expected_events_received.get_future().wait_for(std::chrono::seconds(20));
135 EXPECT_EQ(http->events_seen, num_events);
143 config.storage.path = temp_dir.Path();
144 config.tls.server =
"";
146 auto sql_storage = std::make_shared<SQLStorage>(config.storage,
false);
147 size_t num_events = 10;
148 auto check_sql = [sql_storage](
size_t count) {
150 Json::Value report_array{Json::arrayValue};
151 sql_storage->loadReportEvents(&report_array, &max_id);
152 EXPECT_EQ(max_id, count);
156 auto http = std::make_shared<HttpFakeRq>(temp_dir.Path(), num_events);
157 ReportQueue report_queue(config, http, sql_storage);
158 for (
size_t i = 0; i < num_events; ++i) {
159 report_queue.enqueue(std_::make_unique<EcuDownloadCompletedReport>(
162 check_sql(num_events);
165 config.tls.server =
"reportqueue/StoreEvents";
166 auto http = std::make_shared<HttpFakeRq>(temp_dir.Path(), num_events);
167 ReportQueue report_queue(config, http, sql_storage);
169 http->expected_events_received.get_future().wait_for(std::chrono::seconds(20));
170 EXPECT_EQ(http->events_seen, num_events);
176 int main(
int argc,
char **argv) {
177 ::testing::InitGoogleTest(&argc, argv);
178 logger_set_threshold(boost::log::trivial::trace);
179 return RUN_ALL_TESTS();