Aktualizr
C++ SOTA Client
aktualizr_info_test.cc
1 #include <gtest/gtest.h>
2 
3 #include <boost/asio/io_service.hpp>
4 #include <boost/process.hpp>
5 
6 #include "libaktualizr/config.h"
7 #include "storage/sqlstorage.h"
8 #include "test_utils.h"
9 #include "utilities/utils.h"
10 
11 constexpr char warning_no_meta_data[] = "Metadata is not available\n";
12 
13 class AktualizrInfoTest : public ::testing::Test {
14  protected:
15  AktualizrInfoTest() : test_conf_file_{test_dir_ / "conf.toml"}, test_db_file_{test_dir_ / "sql.db"} {
16  config_.pacman.type = PACKAGE_MANAGER_NONE;
17  config_.storage.path = test_dir_.PathString();
18  config_.storage.sqldb_path = test_db_file_;
19  // set it into 'trace' to see the aktualizr-info output
20  config_.logger.loglevel = boost::log::trivial::error;
21  // Config ctor sets the log threshold to a default value (info) so we need to reset it to the desired one
22  logger_set_threshold(config_.logger);
23 
24  // dump a config into a toml file so the executable can use it as an input configuration
25  boost::filesystem::ofstream conf_file(test_conf_file_);
26  config_.writeToStream(conf_file);
27  conf_file.close();
28 
29  // create a storage and a storage file
30  db_storage_ = INvStorage::newStorage(config_.storage);
31  }
32 
33  virtual void SetUp() {
34  device_id = "aktualizr-info-test-device_ID-fd1fc55c-3abc-4de8-a2ca-32d455ae9c11";
35  primary_ecu_serial = Uptane::EcuSerial("82697cac-f54c-40ea-a8f2-76c203b7bf2f");
36  primary_hw_id = Uptane::HardwareIdentifier("primary-hdwr-e96c08e0-38a0-4903-a021-143cf5427bc9");
37 
38  db_storage_->storeDeviceId(device_id);
39  }
40 
41  virtual void TearDown() {}
42 
43  class AktualizrInfoProcess : public Process {
44  public:
45  AktualizrInfoProcess(AktualizrInfoTest& test_ctx, const boost::filesystem::path& conf_file)
46  : Process("./aktualizr-info"), test_ctx_{test_ctx}, conf_file_{conf_file} {}
47  virtual ~AktualizrInfoProcess() {}
48 
49  void run(const std::vector<std::string> args = {}) {
50  std::vector<std::string> all_args = {"-c", conf_file_.string()};
51 
52  if (args.size() > 0) {
53  all_args.insert(all_args.end(), args.begin(), args.end());
54  }
55 
56  test_ctx_.aktualizr_info_output.clear();
57  Process::run(all_args);
58  ASSERT_EQ(lastExitCode(), EXIT_SUCCESS);
59  test_ctx_.aktualizr_info_output = lastStdOut();
60  }
61 
62  private:
63  AktualizrInfoTest& test_ctx_;
64  const boost::filesystem::path conf_file_;
65  };
66 
67  protected:
68  TemporaryDirectory test_dir_;
69  boost::filesystem::path test_conf_file_;
70  boost::filesystem::path test_db_file_;
71 
72  Config config_;
73  std::shared_ptr<INvStorage> db_storage_;
74 
75  std::string aktualizr_info_output;
76  AktualizrInfoProcess aktualizr_info_process_{*this, test_conf_file_};
77 
78  std::string device_id;
79  Uptane::EcuSerial primary_ecu_serial = Uptane::EcuSerial::Unknown();
80  Uptane::HardwareIdentifier primary_hw_id = Uptane::HardwareIdentifier::Unknown();
81 };
82 
83 /**
84  * Verifies an output of the aktualizr-info in a positive case when
85  * there are both Primary and Secondary present and a device is provisioned
86  * and metadata are fetched from a server
87  *
88  * Checks actions:
89  *
90  * - [x] Print device ID
91  * - [x] Print Primary ECU serial
92  * - [x] Print Primary ECU hardware ID
93  * - [x] Print Secondary ECU serials
94  * - [x] Print Secondary ECU hardware IDs
95  * - [x] Print provisioning status, if provisioned
96  * - [x] Print whether metadata has been fetched from the server, if they were fetched
97  */
98 TEST_F(AktualizrInfoTest, PrintPrimaryAndSecondaryInfo) {
99  const Uptane::EcuSerial secondary_ecu_serial{"c6998d3e-2a68-4ac2-817e-4ea6ef87d21f"};
100  const Uptane::HardwareIdentifier secondary_hw_id{"secondary-hdwr-af250269-bd6f-4148-9426-4101df7f613a"};
101  const std::string provisioning_status = "Provisioned on server: yes";
102  const std::string fetched_metadata = "Fetched metadata: yes";
103 
104  Json::Value meta_root;
105  std::string director_root = Utils::jsonToStr(meta_root);
106 
107  db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}, {secondary_ecu_serial, secondary_hw_id}});
108  db_storage_->storeEcuRegistered();
109  db_storage_->storeRoot(director_root, Uptane::RepositoryType::Director(), Uptane::Version(1));
110 
111  aktualizr_info_process_.run();
112  ASSERT_FALSE(aktualizr_info_output.empty());
113 
114  EXPECT_NE(aktualizr_info_output.find(device_id), std::string::npos);
115  EXPECT_NE(aktualizr_info_output.find(primary_ecu_serial.ToString()), std::string::npos);
116  EXPECT_NE(aktualizr_info_output.find(primary_hw_id.ToString()), std::string::npos);
117 
118  EXPECT_NE(aktualizr_info_output.find(secondary_ecu_serial.ToString()), std::string::npos);
119  EXPECT_NE(aktualizr_info_output.find(secondary_hw_id.ToString()), std::string::npos);
120 
121  EXPECT_NE(aktualizr_info_output.find(provisioning_status), std::string::npos);
122  EXPECT_NE(aktualizr_info_output.find(fetched_metadata), std::string::npos);
123 }
124 
125 /**
126  * Verifies an output of aktualizr-info if a device is not provisioned and metadata are not fetched
127  *
128  * Checks actions:
129  *
130  * - [x] Print provisioning status, if not provisioned
131  * - [x] Print whether metadata has been fetched from the server, if they were not fetched
132  */
133 TEST_F(AktualizrInfoTest, PrintProvisioningAndMetadataNegative) {
134  const std::string provisioning_status = "Provisioned on server: no";
135  const std::string fetched_metadata = "Fetched metadata: no";
136 
137  db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}});
138 
139  aktualizr_info_process_.run();
140  ASSERT_FALSE(aktualizr_info_output.empty());
141 
142  EXPECT_NE(aktualizr_info_output.find(provisioning_status), std::string::npos);
143  EXPECT_NE(aktualizr_info_output.find(fetched_metadata), std::string::npos);
144 }
145 
146 /**
147  * Verifies an output of miscofigured Secondary ECUs
148  *
149  * Checks actions:
150  *
151  * - [x] Print Secondary ECUs no longer accessible (miscofigured: old)
152  * - [x] Print Secondary ECUs registered after provisioning (not registered)
153  */
154 TEST_F(AktualizrInfoTest, PrintSecondaryNotRegisteredOrRemoved) {
155  const std::string provisioning_status = "Provisioned on server: yes";
156 
157  const Uptane::EcuSerial secondary_ecu_serial{"c6998d3e-2a68-4ac2-817e-4ea6ef87d21f"};
158  const Uptane::HardwareIdentifier secondary_hw_id{"secondary-hdwr-af250269-bd6f-4148-9426-4101df7f613a"};
159 
160  const Uptane::EcuSerial secondary_ecu_serial_not_reg{"18b018a1-fdda-4461-a281-42237256cc2f"};
161  const Uptane::HardwareIdentifier secondary_hw_id_not_reg{"secondary-hdwr-cbce3a7a-7cbb-4da4-9fff-8e10e5c3de98"};
162 
163  const Uptane::EcuSerial secondary_ecu_serial_old{"c2191c12-7298-4be3-b781-d223dac7f75e"};
164  const Uptane::HardwareIdentifier secondary_hw_id_old{"secondary-hdwr-0ded1c51-d280-49c3-a92b-7ff2c2e91d8c"};
165 
166  db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}, {secondary_ecu_serial, secondary_hw_id}});
167  db_storage_->storeEcuRegistered();
168 
169  db_storage_->saveMisconfiguredEcu({secondary_ecu_serial_not_reg, secondary_hw_id_not_reg, EcuState::kUnused});
170  db_storage_->saveMisconfiguredEcu({secondary_ecu_serial_old, secondary_hw_id_old, EcuState::kOld});
171 
172  aktualizr_info_process_.run();
173  ASSERT_FALSE(aktualizr_info_output.empty());
174 
175  EXPECT_NE(aktualizr_info_output.find("\'18b018a1-fdda-4461-a281-42237256cc2f\' with hardware_id "
176  "\'secondary-hdwr-cbce3a7a-7cbb-4da4-9fff-8e10e5c3de98\'"
177  " not registered yet"),
178  std::string::npos);
179 
180  EXPECT_NE(aktualizr_info_output.find("\'c2191c12-7298-4be3-b781-d223dac7f75e\' with hardware_id "
181  "\'secondary-hdwr-0ded1c51-d280-49c3-a92b-7ff2c2e91d8c\'"
182  " has been removed from config"),
183  std::string::npos);
184 }
185 
186 /**
187  * Verifies aktualizr-info output of a Root metadata from the Image repository
188  *
189  * Checks actions:
190  *
191  * - [x] Print Root metadata from Image repository
192  */
193 TEST_F(AktualizrInfoTest, PrintImageRootMetadata) {
194  db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}});
195  db_storage_->storeEcuRegistered();
196 
197  Json::Value image_root_json;
198  image_root_json["key-001"] = "value-002";
199 
200  std::string image_root = Utils::jsonToStr(image_root_json);
201  db_storage_->storeRoot(image_root, Uptane::RepositoryType::Image(), Uptane::Version(1));
202  db_storage_->storeRoot(image_root, Uptane::RepositoryType::Director(), Uptane::Version(1));
203 
204  aktualizr_info_process_.run(std::vector<std::string>{"--images-root"});
205  ASSERT_FALSE(aktualizr_info_output.empty());
206 
207  EXPECT_NE(aktualizr_info_output.find(image_root), std::string::npos);
208 }
209 
210 /**
211  * Verifies aktualizr-info output of Targets metadata from the Image repository
212  *
213  * Checks actions:
214  *
215  * - [x] Print Targets metadata from Image repository
216  */
217 TEST_F(AktualizrInfoTest, PrintImageTargetsMetadata) {
218  db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}});
219  db_storage_->storeEcuRegistered();
220 
221  Json::Value image_root_json;
222  image_root_json["key-001"] = "value-002";
223 
224  std::string image_root = Utils::jsonToStr(image_root_json);
225  db_storage_->storeRoot(image_root, Uptane::RepositoryType::Image(), Uptane::Version(1));
226  db_storage_->storeRoot(image_root, Uptane::RepositoryType::Director(), Uptane::Version(1));
227 
228  Json::Value image_targets_json;
229  image_targets_json["key-004"] = "value-005";
230  std::string image_targets_str = Utils::jsonToStr(image_targets_json);
231  db_storage_->storeNonRoot(image_targets_str, Uptane::RepositoryType::Image(), Uptane::Role::Targets());
232 
233  aktualizr_info_process_.run({"--images-target"});
234  ASSERT_FALSE(aktualizr_info_output.empty());
235 
236  EXPECT_NE(aktualizr_info_output.find(image_targets_str), std::string::npos);
237 }
238 
239 /**
240  * Verifies aktualizr-info output of a Root metadata from the Director repository
241  *
242  * Checks actions:
243  *
244  * - [x] Print Root metadata from Director repository
245  */
246 TEST_F(AktualizrInfoTest, PrintDirectorRootMetadata) {
247  db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}});
248  db_storage_->storeEcuRegistered();
249 
250  Json::Value director_root_json;
251  director_root_json["key-002"] = "value-003";
252 
253  std::string director_root = Utils::jsonToStr(director_root_json);
254  db_storage_->storeRoot(director_root, Uptane::RepositoryType::Director(), Uptane::Version(1));
255 
256  aktualizr_info_process_.run({"--director-root"});
257  ASSERT_FALSE(aktualizr_info_output.empty());
258 
259  EXPECT_NE(aktualizr_info_output.find(director_root), std::string::npos);
260 }
261 
262 /**
263  * Verifies aktualizr-info output of Targets metadata from the Director repository
264  *
265  * Checks actions:
266  *
267  * - [x] Print Targets metadata from Director repository
268  */
269 TEST_F(AktualizrInfoTest, PrintDirectorTargetsMetadata) {
270  db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}});
271  db_storage_->storeEcuRegistered();
272 
273  Json::Value director_root_json;
274  director_root_json["key-002"] = "value-003";
275 
276  std::string director_root = Utils::jsonToStr(director_root_json);
277  db_storage_->storeRoot(director_root, Uptane::RepositoryType::Director(), Uptane::Version(1));
278 
279  Json::Value director_targets_json;
280  director_targets_json["key-004"] = "value-005";
281  std::string director_targets_str = Utils::jsonToStr(director_targets_json);
282  db_storage_->storeNonRoot(director_targets_str, Uptane::RepositoryType::Director(), Uptane::Role::Targets());
283 
284  aktualizr_info_process_.run({"--director-target"});
285  ASSERT_FALSE(aktualizr_info_output.empty());
286 
287  EXPECT_NE(aktualizr_info_output.find(director_targets_str), std::string::npos);
288 }
289 
290 /**
291  * Verifies aktualizr-info output of the Primary ECU keys
292  *
293  * Checks actions:
294  *
295  * - [x] Print Primary ECU keys
296  * - [x] Print ECU public key
297  * - [x] Print ECU private key
298  */
299 TEST_F(AktualizrInfoTest, PrintPrimaryEcuKeys) {
300  db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}});
301  db_storage_->storeEcuRegistered();
302 
303  const std::string public_key = "public-key-1dc766fe-136d-4c6c-bdf4-daa79c49b3c8";
304  const std::string private_key = "private-key-5cb805f1-859f-48b1-b787-8055d39b6c5f";
305  db_storage_->storePrimaryKeys(public_key, private_key);
306 
307  aktualizr_info_process_.run({"--ecu-keys"});
308  ASSERT_FALSE(aktualizr_info_output.empty());
309 
310  EXPECT_NE(aktualizr_info_output.find("Public key:"), std::string::npos);
311  EXPECT_NE(aktualizr_info_output.find(public_key), std::string::npos);
312 
313  EXPECT_NE(aktualizr_info_output.find("Private key:"), std::string::npos);
314  EXPECT_NE(aktualizr_info_output.find(private_key), std::string::npos);
315 
316  aktualizr_info_process_.run({"--ecu-pub-key"});
317  ASSERT_FALSE(aktualizr_info_output.empty());
318  EXPECT_NE(aktualizr_info_output.find(public_key), std::string::npos);
319 
320  aktualizr_info_process_.run({"--ecu-prv-key"});
321  ASSERT_FALSE(aktualizr_info_output.empty());
322  EXPECT_NE(aktualizr_info_output.find(private_key), std::string::npos);
323 }
324 
325 /**
326  * Verifies aktualizr-info output of TLS credentials
327  *
328  * Checks actions:
329  *
330  * - [x] Print TLS credentials
331  * - [x] Print TLS Root CA
332  * - [x] Print TLS client certificate
333  * - [x] Print TLS client private key
334  */
335 TEST_F(AktualizrInfoTest, PrintTlsCredentials) {
336  db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}});
337  db_storage_->storeEcuRegistered();
338 
339  const std::string ca = "ca-ee532748-8837-44f5-9afb-08ba9f534fec";
340  const std::string cert = "cert-74de9408-aab8-40b1-8301-682fd39db7b9";
341  const std::string private_key = "private-key-39ba4622-db16-4c72-99ed-9e4abfece68b";
342 
343  db_storage_->storeTlsCreds(ca, cert, private_key);
344 
345  aktualizr_info_process_.run({"--tls-creds"});
346  ASSERT_FALSE(aktualizr_info_output.empty());
347 
348  EXPECT_NE(aktualizr_info_output.find("Root CA certificate:"), std::string::npos);
349  EXPECT_NE(aktualizr_info_output.find(ca), std::string::npos);
350 
351  EXPECT_NE(aktualizr_info_output.find("Client certificate:"), std::string::npos);
352  EXPECT_NE(aktualizr_info_output.find(cert), std::string::npos);
353 
354  EXPECT_NE(aktualizr_info_output.find("Client private key:"), std::string::npos);
355  EXPECT_NE(aktualizr_info_output.find(private_key), std::string::npos);
356 
357  aktualizr_info_process_.run({"--tls-root-ca"});
358  ASSERT_FALSE(aktualizr_info_output.empty());
359  EXPECT_NE(aktualizr_info_output.find(ca), std::string::npos);
360 
361  aktualizr_info_process_.run({"--tls-cert"});
362  ASSERT_FALSE(aktualizr_info_output.empty());
363  EXPECT_NE(aktualizr_info_output.find(cert), std::string::npos);
364 
365  aktualizr_info_process_.run({"--tls-prv-key"});
366  ASSERT_FALSE(aktualizr_info_output.empty());
367  EXPECT_NE(aktualizr_info_output.find(private_key), std::string::npos);
368 }
369 
370 /**
371  * Verifies aktualizr-info output of the Primary ECU's current and pending versions
372  *
373  * Checks actions:
374  *
375  * - [x] Print Primary ECU's current and pending versions
376  */
377 TEST_F(AktualizrInfoTest, PrintPrimaryEcuCurrentAndPendingVersions) {
378  db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}});
379  db_storage_->storeEcuRegistered();
380 
381  const std::string current_ecu_version = "639a4e39-e6ba-4832-ace4-8b12cf20d562";
382  const std::string pending_ecu_version = "9636753d-2a09-4c80-8b25-64b2c2d0c4df";
383 
384  Uptane::EcuMap ecu_map{{primary_ecu_serial, primary_hw_id}};
385  db_storage_->savePrimaryInstalledVersion(
386  {"update.bin", ecu_map, {{Hash::Type::kSha256, current_ecu_version}}, 1, "corrid"},
387  InstalledVersionUpdateMode::kCurrent);
388  db_storage_->savePrimaryInstalledVersion(
389  {"update-01.bin", ecu_map, {{Hash::Type::kSha256, pending_ecu_version}}, 1, "corrid-01"},
390  InstalledVersionUpdateMode::kPending);
391 
392  aktualizr_info_process_.run();
393  ASSERT_FALSE(aktualizr_info_output.empty());
394 
395  EXPECT_NE(aktualizr_info_output.find("Current Primary ECU running version: " + current_ecu_version),
396  std::string::npos);
397  EXPECT_NE(aktualizr_info_output.find("Pending Primary ECU version: " + pending_ecu_version), std::string::npos);
398 }
399 
400 /**
401  * Verifies aktualizr-info output of the Primary ECU's current and pending versions negative test
402  *
403  * Checks actions:
404  *
405  * - [x] Print Primary ECU's current and pending versions
406  */
407 TEST_F(AktualizrInfoTest, PrintPrimaryEcuCurrentAndPendingVersionsNegative) {
408  db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}});
409  db_storage_->storeEcuRegistered();
410 
411  const std::string pending_ecu_version = "9636753d-2a09-4c80-8b25-64b2c2d0c4df";
412 
413  aktualizr_info_process_.run();
414  ASSERT_FALSE(aktualizr_info_output.empty());
415 
416  EXPECT_NE(aktualizr_info_output.find(device_id), std::string::npos);
417  EXPECT_NE(aktualizr_info_output.find(primary_ecu_serial.ToString()), std::string::npos);
418  EXPECT_NE(aktualizr_info_output.find(primary_hw_id.ToString()), std::string::npos);
419 
420  EXPECT_NE(aktualizr_info_output.find("No currently running version on Primary ECU"), std::string::npos);
421  EXPECT_EQ(aktualizr_info_output.find("Pending Primary ECU version:"), std::string::npos);
422 
423  Uptane::EcuMap ecu_map{{primary_ecu_serial, primary_hw_id}};
424  db_storage_->savePrimaryInstalledVersion(
425  {"update-01.bin", ecu_map, {{Hash::Type::kSha256, pending_ecu_version}}, 1, "corrid-01"},
426  InstalledVersionUpdateMode::kPending);
427 
428  aktualizr_info_process_.run();
429  ASSERT_FALSE(aktualizr_info_output.empty());
430 
431  EXPECT_NE(aktualizr_info_output.find("No currently running version on Primary ECU"), std::string::npos);
432  EXPECT_NE(aktualizr_info_output.find("Pending Primary ECU version: " + pending_ecu_version), std::string::npos);
433 
434  db_storage_->savePrimaryInstalledVersion(
435  {"update-01.bin", ecu_map, {{Hash::Type::kSha256, pending_ecu_version}}, 1, "corrid-01"},
436  InstalledVersionUpdateMode::kCurrent);
437 
438  aktualizr_info_process_.run();
439  ASSERT_FALSE(aktualizr_info_output.empty());
440 
441  // pending ECU version became the current now
442  EXPECT_NE(aktualizr_info_output.find("Current Primary ECU running version: " + pending_ecu_version),
443  std::string::npos);
444  EXPECT_EQ(aktualizr_info_output.find("Pending Primary ECU version:"), std::string::npos);
445 }
446 
447 /**
448  * Verifies aktualizr-info output of Secondary ECU's current and pending versions
449  *
450  * Checks actions:
451  *
452  * - [x] Print Secondary ECU current and pending versions
453  */
454 TEST_F(AktualizrInfoTest, PrintSecondaryEcuCurrentAndPendingVersions) {
455  const Uptane::EcuSerial secondary_ecu_serial{"c6998d3e-2a68-4ac2-817e-4ea6ef87d21f"};
456  const Uptane::HardwareIdentifier secondary_hw_id{"secondary-hdwr-af250269-bd6f-4148-9426-4101df7f613a"};
457  const std::string secondary_ecu_filename = "secondary.file";
458  const std::string secondary_ecu_filename_update = "secondary.file.update";
459  const std::string current_ecu_version = "639a4e39-e6ba-4832-ace4-8b12cf20d562";
460  const std::string pending_ecu_version = "9636753d-2a09-4c80-8b25-64b2c2d0c4df";
461 
462  db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}, {secondary_ecu_serial, secondary_hw_id}});
463  db_storage_->storeEcuRegistered();
464 
465  Uptane::EcuMap ecu_map{{secondary_ecu_serial, secondary_hw_id}};
466  db_storage_->saveInstalledVersion(secondary_ecu_serial.ToString(),
467  {secondary_ecu_filename, ecu_map, {{Hash::Type::kSha256, current_ecu_version}}, 1},
468  InstalledVersionUpdateMode::kCurrent);
469 
470  db_storage_->saveInstalledVersion(
471  secondary_ecu_serial.ToString(),
472  {secondary_ecu_filename_update, ecu_map, {{Hash::Type::kSha256, pending_ecu_version}}, 1},
473  InstalledVersionUpdateMode::kPending);
474 
475  aktualizr_info_process_.run();
476  ASSERT_FALSE(aktualizr_info_output.empty());
477 
478  EXPECT_NE(aktualizr_info_output.find("installed image hash: " + current_ecu_version), std::string::npos);
479  EXPECT_NE(aktualizr_info_output.find("installed image filename: " + secondary_ecu_filename), std::string::npos);
480  EXPECT_NE(aktualizr_info_output.find("pending image hash: " + pending_ecu_version), std::string::npos);
481  EXPECT_NE(aktualizr_info_output.find("pending image filename: " + secondary_ecu_filename_update), std::string::npos);
482 
483  // negative test, no any installed images
484  db_storage_->clearInstalledVersions();
485  db_storage_->clearEcuSerials();
486  db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}, {secondary_ecu_serial, secondary_hw_id}});
487 
488  aktualizr_info_process_.run();
489  ASSERT_FALSE(aktualizr_info_output.empty());
490  EXPECT_NE(aktualizr_info_output.find("no details about installed nor pending images"), std::string::npos);
491 }
492 
493 /**
494  * Print device name only for scripting purposes.
495  */
496 TEST_F(AktualizrInfoTest, PrintDeviceNameOnly) {
497  Json::Value meta_root;
498  std::string director_root = Utils::jsonToStr(meta_root);
499 
500  db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}});
501  db_storage_->storeEcuRegistered();
502  db_storage_->storeRoot(director_root, Uptane::RepositoryType::Director(), Uptane::Version(1));
503 
504  aktualizr_info_process_.run({"--name-only"});
505  ASSERT_FALSE(aktualizr_info_output.empty());
506 
507  EXPECT_EQ(aktualizr_info_output, device_id + "\n");
508 }
509 
510 /**
511  * Verifies delegations metadata fetching and output
512  *
513  * * Checks actions:
514  *
515  * - [x] Print delegations
516  */
517 TEST_F(AktualizrInfoTest, PrintDelegations) {
518  auto gen_and_store_delegations = [](std::shared_ptr<INvStorage>& db_storage,
519  std::vector<std::pair<Uptane::Role, std::string> >& delegation_records) {
520  unsigned indx = 0;
521  for (auto& delegation_rec : delegation_records) {
522  const std::string indx_str = std::to_string(indx);
523  const std::string delegation_role_val = "delegation_role_" + indx_str;
524 
525  Json::Value delegation;
526  std::string delegation_val_str =
527  Utils::jsonToStr((delegation["delegation_value_key_" + indx_str] = "delegation_value_" + indx_str));
528 
529  delegation_rec.first = Uptane::Role::Delegation(delegation_role_val);
530  delegation_rec.second = delegation_val_str;
531  db_storage->storeDelegation(delegation_val_str, Uptane::Role::Delegation(delegation_role_val));
532 
533  ++indx;
534  }
535  };
536 
537  auto verify_delegations = [](const std::string& output_str,
538  std::vector<std::pair<Uptane::Role, std::string> >& delegation_records) {
539  for (auto& delegation_rec : delegation_records) {
540  ASSERT_NE(output_str.find(delegation_rec.first.ToString()), std::string::npos);
541  ASSERT_NE(output_str.find(delegation_rec.second), std::string::npos);
542  }
543  };
544 
545  // aktualizr-info won't print anything if Director Root metadata are not stored in the DB
546  db_storage_->storeRoot(Utils::jsonToStr(Json::Value()), Uptane::RepositoryType::Director(), Uptane::Version(1));
547 
548  // case 0: no delegations in the DB
549  {
550  aktualizr_info_process_.run({"--delegation"});
551  ASSERT_FALSE(aktualizr_info_output.empty());
552  EXPECT_NE(aktualizr_info_output.find("Delegations are not present"), std::string::npos);
553  }
554 
555  // case 1: there is one delegation metadata record in the DB
556  {
557  std::vector<std::pair<Uptane::Role, std::string> > delegation_records{1, {Uptane::Role::Delegation(""), ""}};
558  gen_and_store_delegations(db_storage_, delegation_records);
559 
560  aktualizr_info_process_.run({"--delegation"});
561  ASSERT_FALSE(aktualizr_info_output.empty());
562 
563  verify_delegations(aktualizr_info_output, delegation_records);
564  }
565 
566  db_storage_->clearDelegations();
567 
568  // case 2: there are more than one delegation metadata records in the DB
569  {
570  std::vector<std::pair<Uptane::Role, std::string> > delegation_records{3, {Uptane::Role::Delegation(""), ""}};
571  gen_and_store_delegations(db_storage_, delegation_records);
572 
573  aktualizr_info_process_.run({"--delegation"});
574  ASSERT_FALSE(aktualizr_info_output.empty());
575 
576  verify_delegations(aktualizr_info_output, delegation_records);
577  }
578 }
579 
580 /**
581  * Verifies aktualizr-info output of Snapshot metadata from Image repository
582  *
583  * Checks actions:
584  *
585  * - [x] Print Snapshot metadata from Image repository
586  */
587 TEST_F(AktualizrInfoTest, PrintImageSnapshotMetadata) {
588  Json::Value director_root_json;
589  director_root_json["key-002"] = "value-003";
590  std::string director_root = Utils::jsonToStr(director_root_json);
591  db_storage_->storeRoot(director_root, Uptane::RepositoryType::Director(), Uptane::Version(1));
592 
593  Json::Value meta_snapshot;
594  meta_snapshot["signed"]["_type"] = "Snapshot";
595  meta_snapshot["signed"]["expires"] = "2038-01-19T03:14:06Z";
596  meta_snapshot["signed"]["version"] = "2";
597  std::string image_snapshot = Utils::jsonToStr(meta_snapshot);
598  db_storage_->storeNonRoot(image_snapshot, Uptane::RepositoryType::Image(), Uptane::Role::Snapshot());
599 
600  aktualizr_info_process_.run({"--images-snapshot"});
601  ASSERT_FALSE(aktualizr_info_output.empty());
602 
603  EXPECT_NE(aktualizr_info_output.find(image_snapshot), std::string::npos);
604 }
605 
606 /**
607  * Verifies aktualizr-info output of Timestamp metadata from the Image repository
608  *
609  * Checks actions:
610  *
611  * - [x] Print Timestamp metadata from Image repository
612  */
613 TEST_F(AktualizrInfoTest, PrintImageTimestampMetadata) {
614  Json::Value director_root_json;
615  director_root_json["key-002"] = "value-003";
616  std::string director_root = Utils::jsonToStr(director_root_json);
617  db_storage_->storeRoot(director_root, Uptane::RepositoryType::Director(), Uptane::Version(1));
618 
619  Json::Value meta_timestamp;
620  meta_timestamp["signed"]["_type"] = "Timestamp";
621  meta_timestamp["signed"]["expires"] = "2038-01-19T03:14:06Z";
622  std::string image_timestamp = Utils::jsonToStr(meta_timestamp);
623  db_storage_->storeNonRoot(image_timestamp, Uptane::RepositoryType::Image(), Uptane::Role::Timestamp());
624 
625  aktualizr_info_process_.run({"--images-timestamp"});
626  ASSERT_FALSE(aktualizr_info_output.empty());
627 
628  EXPECT_NE(aktualizr_info_output.find(image_timestamp), std::string::npos);
629 }
630 
631 /**
632  * Verifies aktualizr-info output when metadata is not present
633  *
634  * Check actions:
635  * - [x] Print appropriate message if the metadata does not exist in storage..
636  */
637 TEST_F(AktualizrInfoTest, PrintMetadataWarnibg) {
638  db_storage_->clearMetadata();
639 
640  const std::vector<std::string> args = {"--images-root", "--images-target", "--delegation",
641  "--director-root", "--director-target", "--images-snapshot",
642  "--images-timestamp"};
643 
644  for (auto arg : args) {
645  aktualizr_info_process_.run({arg});
646  ASSERT_FALSE(aktualizr_info_output.empty());
647  EXPECT_NE(aktualizr_info_output.find(std::string(warning_no_meta_data)), std::string::npos);
648  }
649 }
650 
651 #ifndef __NO_MAIN__
652 int main(int argc, char** argv) {
653  ::testing::InitGoogleTest(&argc, argv);
654 
655  return RUN_ALL_TESTS();
656 }
657 #endif
Uptane::Version
Metadata version numbers.
Definition: tuf.h:120
Uptane::HardwareIdentifier
Definition: types.h:315
Config
Configuration object for an aktualizr instance running on a Primary ECU.
Definition: config.h:208
Uptane::EcuSerial
Definition: types.h:346
Process
Definition: test_utils.h:19
AktualizrInfoTest::AktualizrInfoProcess
Definition: aktualizr_info_test.cc:43
TemporaryDirectory
Definition: utils.h:82
AktualizrInfoTest
Definition: aktualizr_info_test.cc:13