Aktualizr
C++ SOTA Client
uptane_network_test.cc
Go to the documentation of this file.
1 /**
2  * \file
3  */
4 
5 /**
6  * \verify{\tst{158}} Check that aktualizr can complete provisioning after
7  * encountering various network issues.
8  */
9 #include <gtest/gtest.h>
10 
11 #include <fstream>
12 #include <iostream>
13 #include <string>
14 #include <utility>
15 #include <vector>
16 
17 #include "http/httpclient.h"
18 #include "logging/logging.h"
19 #include "primary/initializer.h"
20 #include "storage/invstorage.h"
21 #include "test_utils.h"
22 #include "uptane/uptanerepository.h"
23 #include "utilities/utils.h"
24 
25 Config conf("tests/config/basic.toml");
26 std::string port;
27 
28 bool doTestInit(StorageType storage_type, const std::string &device_register_state,
29  const std::string &ecu_register_state) {
30  TemporaryDirectory temp_dir;
31  conf.storage.type = storage_type;
32  conf.storage.path = temp_dir.Path();
33  conf.provision.expiry_days = device_register_state;
34  conf.provision.primary_ecu_serial = ecu_register_state;
35  std::string good_url = conf.provision.server;
36  if (device_register_state == "noconnection") {
37  conf.provision.server = conf.provision.server.substr(conf.provision.server.size() - 2) + "11";
38  }
39 
40  bool result;
41  auto http = std::make_shared<HttpClient>();
42  auto store = INvStorage::newStorage(conf.storage);
43  {
44  KeyManager keys(store, conf.keymanagerConfig());
45 
46  Initializer initializer(conf.provision, store, http, keys, {});
47  result = initializer.isSuccessful();
48  }
49  if (device_register_state != "noerrors" || conf.provision.primary_ecu_serial != "noerrors") {
50  EXPECT_FALSE(result);
51  LOG_INFO << "Reinit without error";
52  conf.provision.server = good_url;
53  conf.provision.expiry_days = "noerrors";
54  conf.provision.primary_ecu_serial = "noerrors";
55 
56  if (device_register_state == "noerrors" && ecu_register_state != "noerrors") {
57  // restore a "good" ecu serial in the ecu register fault injection case
58  // (the bad value has been cached in storage)
59  EcuSerials serials;
60  store->loadEcuSerials(&serials);
61  serials[0].first = Uptane::EcuSerial(conf.provision.primary_ecu_serial);
62  store->storeEcuSerials(serials);
63  }
64 
65  KeyManager keys(store, conf.keymanagerConfig());
66 
67  Initializer initializer(conf.provision, store, http, keys, {});
68  result = initializer.isSuccessful();
69  }
70 
71  return result;
72 }
73 
74 // Clang tries to cram these all on single lines, which is ugly.
75 // clang-format off
76 
77 // Run tests with sqlite backend
78 TEST(UptaneNetwork, device_drop_request_sqlite) {
79  EXPECT_TRUE(doTestInit(StorageType::kSqlite, "drop_request", "noerrors"));
80 }
81 
82 TEST(UptaneNetwork, device_drop_body_sqlite) {
83  EXPECT_TRUE(doTestInit(StorageType::kSqlite, "drop_body", "noerrors"));
84 }
85 
86 TEST(UptaneNetwork, device_503_sqlite) {
87  EXPECT_TRUE(doTestInit(StorageType::kSqlite, "status_503", "noerrors"));
88 }
89 
90 TEST(UptaneNetwork, device_408_sqlite) {
91  EXPECT_TRUE(doTestInit(StorageType::kSqlite, "status_408", "noerrors"));
92 }
93 
94 TEST(UptaneNetwork, ecu_drop_request_sqlite) {
95  EXPECT_TRUE(doTestInit(StorageType::kSqlite, "noerrors", "drop_request"));
96 }
97 
98 TEST(UptaneNetwork, ecu_503_sqlite) {
99  EXPECT_TRUE(doTestInit(StorageType::kSqlite, "noerrors", "status_503"));
100 }
101 
102 TEST(UptaneNetwork, ecu_408_sqlite) {
103  EXPECT_TRUE(doTestInit(StorageType::kSqlite, "noerrors", "status_408"));
104 }
105 
106 TEST(UptaneNetwork, no_connection_sqlite) {
107  EXPECT_TRUE(doTestInit(StorageType::kSqlite, "noconnection", "noerrors"));
108 }
109 
110 TEST(UptaneNetwork, no_errors_sqlite) {
111  EXPECT_TRUE(doTestInit(StorageType::kSqlite, "noerrors", "noerrors"));
112 }
113 // clang-format on
114 
115 #ifndef __NO_MAIN__
116 int main(int argc, char **argv) {
117  ::testing::InitGoogleTest(&argc, argv);
118  logger_set_threshold(boost::log::trivial::trace);
119 
120  port = TestUtils::getFreePort();
121  TestHelperProcess server_process("tests/fake_http_server/fake_uptane_server.py", port);
122 
123  sleep(3);
124 
125  conf.provision.server = "http://127.0.0.1:" + port;
126  conf.tls.server = "http://127.0.0.1:" + port;
127  conf.provision.ecu_registration_endpoint = conf.tls.server + "/director/ecus";
128  conf.uptane.repo_server = conf.tls.server + "/repo";
129  conf.uptane.director_server = conf.tls.server + "/director";
130  conf.pacman.ostree_server = conf.tls.server + "/treehub";
131 
132  return RUN_ALL_TESTS();
133 }
134 #endif
Config conf("tests/config/basic.toml")
Configuration object for an aktualizr instance running on a primary ECU.
Definition: config.h:100