Aktualizr
C++ SOTA Client
reregistration_test.cc
1 #include <gtest/gtest.h>
2 
3 #include <string>
4 #include <vector>
5 
6 #include "httpfake.h"
7 #include "libaktualizr/aktualizr.h"
8 #include "libaktualizr/config.h"
9 #include "uptane_test_common.h"
10 #include "virtualsecondary.h"
11 
12 boost::filesystem::path fake_meta_dir;
13 
15  public:
16  HttpFakeRegistration(const boost::filesystem::path& test_dir_in, const boost::filesystem::path& meta_dir_in)
17  : HttpFake(test_dir_in, "noupdates", meta_dir_in) {}
18 
19  HttpResponse post(const std::string& url, const Json::Value& data) override {
20  if (url.find("/director/ecus") != std::string::npos) {
21  registration_count += 1;
22  EXPECT_EQ(data["primary_ecu_serial"].asString(), "CA:FE:A6:D2:84:9D");
23  EXPECT_EQ(data["ecus"][0]["ecu_serial"].asString(), "CA:FE:A6:D2:84:9D");
24  EXPECT_EQ(data["ecus"][0]["hardware_identifier"].asString(), "primary_hw");
25  }
26  return HttpFake::post(url, data);
27  }
28 
29  unsigned int registration_count{0};
30 };
31 
32 /*
33  * Add a Secondary via API, register the ECUs, then add another, and re-register.
34  */
35 TEST(Aktualizr, AddSecondary) {
36  TemporaryDirectory temp_dir;
37  auto http = std::make_shared<HttpFakeRegistration>(temp_dir.Path(), fake_meta_dir);
38  Config conf = UptaneTestCommon::makeTestConfig(temp_dir, http->tls_server);
39  auto storage = INvStorage::newStorage(conf.storage);
40 
41  UptaneTestCommon::TestAktualizr aktualizr(conf, storage, http);
42  Primary::VirtualSecondaryConfig ecu_config = UptaneTestCommon::altVirtualConfiguration(temp_dir.Path());
43  aktualizr.AddSecondary(std::make_shared<Primary::VirtualSecondary>(ecu_config));
44  aktualizr.Initialize();
45 
46  std::vector<std::string> expected_ecus = {"CA:FE:A6:D2:84:9D", "ecuserial3", "secondary_ecu_serial"};
47  UptaneTestCommon::verifyEcus(temp_dir, expected_ecus);
48  EXPECT_EQ(http->registration_count, 1);
49 
50  ecu_config.ecu_serial = "ecuserial4";
51  aktualizr.AddSecondary(std::make_shared<Primary::VirtualSecondary>(ecu_config));
52  aktualizr.Initialize();
53  expected_ecus.push_back(ecu_config.ecu_serial);
54  UptaneTestCommon::verifyEcus(temp_dir, expected_ecus);
55  EXPECT_EQ(http->registration_count, 2);
56 }
57 
58 /*
59  * Add a Secondary via API, register the ECUs, remove one, and re-register.
60  */
61 TEST(Aktualizr, RemoveSecondary) {
62  TemporaryDirectory temp_dir;
63  auto http = std::make_shared<HttpFakeRegistration>(temp_dir.Path(), fake_meta_dir);
64  Config conf = UptaneTestCommon::makeTestConfig(temp_dir, http->tls_server);
65  auto storage = INvStorage::newStorage(conf.storage);
66 
67  {
68  UptaneTestCommon::TestAktualizr aktualizr(conf, storage, http);
69  Primary::VirtualSecondaryConfig ecu_config = UptaneTestCommon::altVirtualConfiguration(temp_dir.Path());
70  aktualizr.AddSecondary(std::make_shared<Primary::VirtualSecondary>(ecu_config));
71  aktualizr.Initialize();
72 
73  std::vector<std::string> expected_ecus = {"CA:FE:A6:D2:84:9D", "ecuserial3", "secondary_ecu_serial"};
74  UptaneTestCommon::verifyEcus(temp_dir, expected_ecus);
75  EXPECT_EQ(http->registration_count, 1);
76  }
77 
78  {
79  UptaneTestCommon::TestAktualizr aktualizr(conf, storage, http);
80  aktualizr.Initialize();
81 
82  std::vector<std::string> expected_ecus = {"CA:FE:A6:D2:84:9D", "secondary_ecu_serial"};
83  UptaneTestCommon::verifyEcus(temp_dir, expected_ecus);
84  EXPECT_EQ(http->registration_count, 2);
85  }
86 }
87 
88 /*
89  * Add a Secondary via API, register the ECUs, replace one, and re-register.
90  */
91 TEST(Aktualizr, ReplaceSecondary) {
92  TemporaryDirectory temp_dir;
93  auto http = std::make_shared<HttpFakeRegistration>(temp_dir.Path(), fake_meta_dir);
94  Config conf = UptaneTestCommon::makeTestConfig(temp_dir, http->tls_server);
95  auto storage = INvStorage::newStorage(conf.storage);
96 
97  {
98  UptaneTestCommon::TestAktualizr aktualizr(conf, storage, http);
99  Primary::VirtualSecondaryConfig ecu_config = UptaneTestCommon::altVirtualConfiguration(temp_dir.Path());
100  aktualizr.AddSecondary(std::make_shared<Primary::VirtualSecondary>(ecu_config));
101  aktualizr.Initialize();
102 
103  std::vector<std::string> expected_ecus = {"CA:FE:A6:D2:84:9D", "ecuserial3", "secondary_ecu_serial"};
104  UptaneTestCommon::verifyEcus(temp_dir, expected_ecus);
105  EXPECT_EQ(http->registration_count, 1);
106  }
107 
108  {
109  UptaneTestCommon::TestAktualizr aktualizr(conf, storage, http);
110  Primary::VirtualSecondaryConfig ecu_config = UptaneTestCommon::altVirtualConfiguration(temp_dir.Path());
111  ecu_config.ecu_serial = "ecuserial4";
112  aktualizr.AddSecondary(std::make_shared<Primary::VirtualSecondary>(ecu_config));
113  aktualizr.Initialize();
114 
115  std::vector<std::string> expected_ecus = {"CA:FE:A6:D2:84:9D", "ecuserial4", "secondary_ecu_serial"};
116  UptaneTestCommon::verifyEcus(temp_dir, expected_ecus);
117  EXPECT_EQ(http->registration_count, 2);
118  }
119 }
120 
121 #ifndef __NO_MAIN__
122 int main(int argc, char** argv) {
123  ::testing::InitGoogleTest(&argc, argv);
124 
125  logger_init();
126  logger_set_threshold(boost::log::trivial::trace);
127 
128  TemporaryDirectory tmp_dir;
129  fake_meta_dir = tmp_dir.Path();
130  MetaFake meta_fake(fake_meta_dir);
131 
132  return RUN_ALL_TESTS();
133 }
134 #endif
135 
136 // vim: set tabstop=2 shiftwidth=2 expandtab:
HttpFake
Definition: httpfake.h:20
UptaneTestCommon::TestAktualizr
Definition: uptane_test_common.h:21
data
General data structures.
Definition: types.h:217
HttpResponse
Definition: httpinterface.h:17
Config
Configuration object for an aktualizr instance running on a Primary ECU.
Definition: config.h:208
Aktualizr
This class provides the main APIs necessary for launching and controlling libaktualizr.
Definition: aktualizr.h:24
Primary::VirtualSecondaryConfig
Definition: virtualsecondary.h:11
TemporaryDirectory
Definition: utils.h:82
HttpFakeRegistration
Definition: reregistration_test.cc:14
MetaFake
Definition: metafake.h:14