Aktualizr
C++ SOTA Client
All Classes Namespaces Files Functions Variables Enumerations Enumerator Pages
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 "config/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_->storeMisconfiguredEcus(
170  {{secondary_ecu_serial_not_reg, secondary_hw_id_not_reg, EcuState::kNotRegistered},
171  {secondary_ecu_serial_old, secondary_hw_id_old, EcuState::kOld}});
172 
173  aktualizr_info_process_.run();
174  ASSERT_FALSE(aktualizr_info_output.empty());
175 
176  EXPECT_NE(aktualizr_info_output.find("\'18b018a1-fdda-4461-a281-42237256cc2f\' with hardware_id "
177  "\'secondary-hdwr-cbce3a7a-7cbb-4da4-9fff-8e10e5c3de98\'"
178  " not registered yet"),
179  std::string::npos);
180 
181  EXPECT_NE(aktualizr_info_output.find("\'c2191c12-7298-4be3-b781-d223dac7f75e\' with hardware_id "
182  "\'secondary-hdwr-0ded1c51-d280-49c3-a92b-7ff2c2e91d8c\'"
183  " has been removed from config"),
184  std::string::npos);
185 }
186 
187 /**
188  * Verifies aktualizr-info output of a Root metadata from the Image repository
189  *
190  * Checks actions:
191  *
192  * - [x] Print Root metadata from Image repository
193  */
194 TEST_F(AktualizrInfoTest, PrintImageRootMetadata) {
195  db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}});
196  db_storage_->storeEcuRegistered();
197 
198  Json::Value image_root_json;
199  image_root_json["key-001"] = "value-002";
200 
201  std::string image_root = Utils::jsonToStr(image_root_json);
202  db_storage_->storeRoot(image_root, Uptane::RepositoryType::Image(), Uptane::Version(1));
203  db_storage_->storeRoot(image_root, Uptane::RepositoryType::Director(), Uptane::Version(1));
204 
205  aktualizr_info_process_.run(std::vector<std::string>{"--images-root"});
206  ASSERT_FALSE(aktualizr_info_output.empty());
207 
208  EXPECT_NE(aktualizr_info_output.find(image_root), std::string::npos);
209 }
210 
211 /**
212  * Verifies aktualizr-info output of Targets metadata from the Image repository
213  *
214  * Checks actions:
215  *
216  * - [x] Print Targets metadata from Image repository
217  */
218 TEST_F(AktualizrInfoTest, PrintImageTargetsMetadata) {
219  db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}});
220  db_storage_->storeEcuRegistered();
221 
222  Json::Value image_root_json;
223  image_root_json["key-001"] = "value-002";
224 
225  std::string image_root = Utils::jsonToStr(image_root_json);
226  db_storage_->storeRoot(image_root, Uptane::RepositoryType::Image(), Uptane::Version(1));
227  db_storage_->storeRoot(image_root, Uptane::RepositoryType::Director(), Uptane::Version(1));
228 
229  Json::Value image_targets_json;
230  image_targets_json["key-004"] = "value-005";
231  std::string image_targets_str = Utils::jsonToStr(image_targets_json);
232  db_storage_->storeNonRoot(image_targets_str, Uptane::RepositoryType::Image(), Uptane::Role::Targets());
233 
234  aktualizr_info_process_.run({"--images-target"});
235  ASSERT_FALSE(aktualizr_info_output.empty());
236 
237  EXPECT_NE(aktualizr_info_output.find(image_targets_str), std::string::npos);
238 }
239 
240 /**
241  * Verifies aktualizr-info output of a Root metadata from the Director repository
242  *
243  * Checks actions:
244  *
245  * - [x] Print Root metadata from Director repository
246  */
247 TEST_F(AktualizrInfoTest, PrintDirectorRootMetadata) {
248  db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}});
249  db_storage_->storeEcuRegistered();
250 
251  Json::Value director_root_json;
252  director_root_json["key-002"] = "value-003";
253 
254  std::string director_root = Utils::jsonToStr(director_root_json);
255  db_storage_->storeRoot(director_root, Uptane::RepositoryType::Director(), Uptane::Version(1));
256 
257  aktualizr_info_process_.run({"--director-root"});
258  ASSERT_FALSE(aktualizr_info_output.empty());
259 
260  EXPECT_NE(aktualizr_info_output.find(director_root), std::string::npos);
261 }
262 
263 /**
264  * Verifies aktualizr-info output of Targets metadata from the Director repository
265  *
266  * Checks actions:
267  *
268  * - [x] Print Targets metadata from Director repository
269  */
270 TEST_F(AktualizrInfoTest, PrintDirectorTargetsMetadata) {
271  db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}});
272  db_storage_->storeEcuRegistered();
273 
274  Json::Value director_root_json;
275  director_root_json["key-002"] = "value-003";
276 
277  std::string director_root = Utils::jsonToStr(director_root_json);
278  db_storage_->storeRoot(director_root, Uptane::RepositoryType::Director(), Uptane::Version(1));
279 
280  Json::Value director_targets_json;
281  director_targets_json["key-004"] = "value-005";
282  std::string director_targets_str = Utils::jsonToStr(director_targets_json);
283  db_storage_->storeNonRoot(director_targets_str, Uptane::RepositoryType::Director(), Uptane::Role::Targets());
284 
285  aktualizr_info_process_.run({"--director-target"});
286  ASSERT_FALSE(aktualizr_info_output.empty());
287 
288  EXPECT_NE(aktualizr_info_output.find(director_targets_str), std::string::npos);
289 }
290 
291 /**
292  * Verifies aktualizr-info output of the Primary ECU keys
293  *
294  * Checks actions:
295  *
296  * - [x] Print Primary ECU keys
297  * - [x] Print ECU public key
298  * - [x] Print ECU private key
299  */
300 TEST_F(AktualizrInfoTest, PrintPrimaryEcuKeys) {
301  db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}});
302  db_storage_->storeEcuRegistered();
303 
304  const std::string public_key = "public-key-1dc766fe-136d-4c6c-bdf4-daa79c49b3c8";
305  const std::string private_key = "private-key-5cb805f1-859f-48b1-b787-8055d39b6c5f";
306  db_storage_->storePrimaryKeys(public_key, private_key);
307 
308  aktualizr_info_process_.run({"--ecu-keys"});
309  ASSERT_FALSE(aktualizr_info_output.empty());
310 
311  EXPECT_NE(aktualizr_info_output.find("Public key:"), std::string::npos);
312  EXPECT_NE(aktualizr_info_output.find(public_key), std::string::npos);
313 
314  EXPECT_NE(aktualizr_info_output.find("Private key:"), std::string::npos);
315  EXPECT_NE(aktualizr_info_output.find(private_key), std::string::npos);
316 
317  aktualizr_info_process_.run({"--ecu-pub-key"});
318  ASSERT_FALSE(aktualizr_info_output.empty());
319  EXPECT_NE(aktualizr_info_output.find(public_key), std::string::npos);
320 
321  aktualizr_info_process_.run({"--ecu-prv-key"});
322  ASSERT_FALSE(aktualizr_info_output.empty());
323  EXPECT_NE(aktualizr_info_output.find(private_key), std::string::npos);
324 }
325 
326 /**
327  * Verifies aktualizr-info output of TLS credentials
328  *
329  * Checks actions:
330  *
331  * - [x] Print TLS credentials
332  * - [x] Print TLS Root CA
333  * - [x] Print TLS client certificate
334  * - [x] Print TLS client private key
335  */
336 TEST_F(AktualizrInfoTest, PrintTlsCredentials) {
337  db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}});
338  db_storage_->storeEcuRegistered();
339 
340  const std::string ca = "ca-ee532748-8837-44f5-9afb-08ba9f534fec";
341  const std::string cert = "cert-74de9408-aab8-40b1-8301-682fd39db7b9";
342  const std::string private_key = "private-key-39ba4622-db16-4c72-99ed-9e4abfece68b";
343 
344  db_storage_->storeTlsCreds(ca, cert, private_key);
345 
346  aktualizr_info_process_.run({"--tls-creds"});
347  ASSERT_FALSE(aktualizr_info_output.empty());
348 
349  EXPECT_NE(aktualizr_info_output.find("Root CA certificate:"), std::string::npos);
350  EXPECT_NE(aktualizr_info_output.find(ca), std::string::npos);
351 
352  EXPECT_NE(aktualizr_info_output.find("Client certificate:"), std::string::npos);
353  EXPECT_NE(aktualizr_info_output.find(cert), std::string::npos);
354 
355  EXPECT_NE(aktualizr_info_output.find("Client private key:"), std::string::npos);
356  EXPECT_NE(aktualizr_info_output.find(private_key), std::string::npos);
357 
358  aktualizr_info_process_.run({"--tls-root-ca"});
359  ASSERT_FALSE(aktualizr_info_output.empty());
360  EXPECT_NE(aktualizr_info_output.find(ca), std::string::npos);
361 
362  aktualizr_info_process_.run({"--tls-cert"});
363  ASSERT_FALSE(aktualizr_info_output.empty());
364  EXPECT_NE(aktualizr_info_output.find(cert), std::string::npos);
365 
366  aktualizr_info_process_.run({"--tls-prv-key"});
367  ASSERT_FALSE(aktualizr_info_output.empty());
368  EXPECT_NE(aktualizr_info_output.find(private_key), std::string::npos);
369 }
370 
371 /**
372  * Verifies aktualizr-info output of the Primary ECU's current and pending versions
373  *
374  * Checks actions:
375  *
376  * - [x] Print Primary ECU's current and pending versions
377  */
378 TEST_F(AktualizrInfoTest, PrintPrimaryEcuCurrentAndPendingVersions) {
379  db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}});
380  db_storage_->storeEcuRegistered();
381 
382  const std::string current_ecu_version = "639a4e39-e6ba-4832-ace4-8b12cf20d562";
383  const std::string pending_ecu_version = "9636753d-2a09-4c80-8b25-64b2c2d0c4df";
384 
385  Uptane::EcuMap ecu_map{{primary_ecu_serial, primary_hw_id}};
386  db_storage_->savePrimaryInstalledVersion(
387  {"update.bin", ecu_map, {{Hash::Type::kSha256, current_ecu_version}}, 1, "corrid"},
388  InstalledVersionUpdateMode::kCurrent);
389  db_storage_->savePrimaryInstalledVersion(
390  {"update-01.bin", ecu_map, {{Hash::Type::kSha256, pending_ecu_version}}, 1, "corrid-01"},
391  InstalledVersionUpdateMode::kPending);
392 
393  aktualizr_info_process_.run();
394  ASSERT_FALSE(aktualizr_info_output.empty());
395 
396  EXPECT_NE(aktualizr_info_output.find("Current Primary ECU running version: " + current_ecu_version),
397  std::string::npos);
398  EXPECT_NE(aktualizr_info_output.find("Pending Primary ECU version: " + pending_ecu_version), std::string::npos);
399 }
400 
401 /**
402  * Verifies aktualizr-info output of the Primary ECU's current and pending versions negative test
403  *
404  * Checks actions:
405  *
406  * - [x] Print Primary ECU's current and pending versions
407  */
408 TEST_F(AktualizrInfoTest, PrintPrimaryEcuCurrentAndPendingVersionsNegative) {
409  db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}});
410  db_storage_->storeEcuRegistered();
411 
412  const std::string pending_ecu_version = "9636753d-2a09-4c80-8b25-64b2c2d0c4df";
413 
414  aktualizr_info_process_.run();
415  ASSERT_FALSE(aktualizr_info_output.empty());
416 
417  EXPECT_NE(aktualizr_info_output.find(device_id), std::string::npos);
418  EXPECT_NE(aktualizr_info_output.find(primary_ecu_serial.ToString()), std::string::npos);
419  EXPECT_NE(aktualizr_info_output.find(primary_hw_id.ToString()), std::string::npos);
420 
421  EXPECT_NE(aktualizr_info_output.find("No currently running version on Primary ECU"), std::string::npos);
422  EXPECT_EQ(aktualizr_info_output.find("Pending Primary ECU version:"), std::string::npos);
423 
424  Uptane::EcuMap ecu_map{{primary_ecu_serial, primary_hw_id}};
425  db_storage_->savePrimaryInstalledVersion(
426  {"update-01.bin", ecu_map, {{Hash::Type::kSha256, pending_ecu_version}}, 1, "corrid-01"},
427  InstalledVersionUpdateMode::kPending);
428 
429  aktualizr_info_process_.run();
430  ASSERT_FALSE(aktualizr_info_output.empty());
431 
432  EXPECT_NE(aktualizr_info_output.find("No currently running version on Primary ECU"), std::string::npos);
433  EXPECT_NE(aktualizr_info_output.find("Pending Primary ECU version: " + pending_ecu_version), std::string::npos);
434 
435  db_storage_->savePrimaryInstalledVersion(
436  {"update-01.bin", ecu_map, {{Hash::Type::kSha256, pending_ecu_version}}, 1, "corrid-01"},
437  InstalledVersionUpdateMode::kCurrent);
438 
439  aktualizr_info_process_.run();
440  ASSERT_FALSE(aktualizr_info_output.empty());
441 
442  // pending ECU version became the current now
443  EXPECT_NE(aktualizr_info_output.find("Current Primary ECU running version: " + pending_ecu_version),
444  std::string::npos);
445  EXPECT_EQ(aktualizr_info_output.find("Pending Primary ECU version:"), std::string::npos);
446 }
447 
448 /**
449  * Verifies aktualizr-info output of Secondary ECU's current and pending versions
450  *
451  * Checks actions:
452  *
453  * - [x] Print Secondary ECU current and pending versions
454  */
455 TEST_F(AktualizrInfoTest, PrintSecondaryEcuCurrentAndPendingVersions) {
456  const Uptane::EcuSerial secondary_ecu_serial{"c6998d3e-2a68-4ac2-817e-4ea6ef87d21f"};
457  const Uptane::HardwareIdentifier secondary_hw_id{"secondary-hdwr-af250269-bd6f-4148-9426-4101df7f613a"};
458  const std::string secondary_ecu_filename = "secondary.file";
459  const std::string secondary_ecu_filename_update = "secondary.file.update";
460  const std::string current_ecu_version = "639a4e39-e6ba-4832-ace4-8b12cf20d562";
461  const std::string pending_ecu_version = "9636753d-2a09-4c80-8b25-64b2c2d0c4df";
462 
463  db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}, {secondary_ecu_serial, secondary_hw_id}});
464  db_storage_->storeEcuRegistered();
465 
466  Uptane::EcuMap ecu_map{{secondary_ecu_serial, secondary_hw_id}};
467  db_storage_->saveInstalledVersion(secondary_ecu_serial.ToString(),
468  {secondary_ecu_filename, ecu_map, {{Hash::Type::kSha256, current_ecu_version}}, 1},
469  InstalledVersionUpdateMode::kCurrent);
470 
471  db_storage_->saveInstalledVersion(
472  secondary_ecu_serial.ToString(),
473  {secondary_ecu_filename_update, ecu_map, {{Hash::Type::kSha256, pending_ecu_version}}, 1},
474  InstalledVersionUpdateMode::kPending);
475 
476  aktualizr_info_process_.run();
477  ASSERT_FALSE(aktualizr_info_output.empty());
478 
479  EXPECT_NE(aktualizr_info_output.find("installed image hash: " + current_ecu_version), std::string::npos);
480  EXPECT_NE(aktualizr_info_output.find("installed image filename: " + secondary_ecu_filename), std::string::npos);
481  EXPECT_NE(aktualizr_info_output.find("pending image hash: " + pending_ecu_version), std::string::npos);
482  EXPECT_NE(aktualizr_info_output.find("pending image filename: " + secondary_ecu_filename_update), std::string::npos);
483 
484  // negative test, no any installed images
485  db_storage_->clearInstalledVersions();
486  db_storage_->clearEcuSerials();
487  db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}, {secondary_ecu_serial, secondary_hw_id}});
488 
489  aktualizr_info_process_.run();
490  ASSERT_FALSE(aktualizr_info_output.empty());
491  EXPECT_NE(aktualizr_info_output.find("no details about installed nor pending images"), std::string::npos);
492 }
493 
494 /**
495  * Print device name only for scripting purposes.
496  */
497 TEST_F(AktualizrInfoTest, PrintDeviceNameOnly) {
498  Json::Value meta_root;
499  std::string director_root = Utils::jsonToStr(meta_root);
500 
501  db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}});
502  db_storage_->storeEcuRegistered();
503  db_storage_->storeRoot(director_root, Uptane::RepositoryType::Director(), Uptane::Version(1));
504 
505  aktualizr_info_process_.run({"--name-only"});
506  ASSERT_FALSE(aktualizr_info_output.empty());
507 
508  EXPECT_EQ(aktualizr_info_output, device_id + "\n");
509 }
510 
511 /**
512  * Verifies delegations metadata fetching and output
513  *
514  * * Checks actions:
515  *
516  * - [x] Print delegations
517  */
518 TEST_F(AktualizrInfoTest, PrintDelegations) {
519  auto gen_and_store_delegations = [](std::shared_ptr<INvStorage>& db_storage,
520  std::vector<std::pair<Uptane::Role, std::string> >& delegation_records) {
521  unsigned indx = 0;
522  for (auto& delegation_rec : delegation_records) {
523  const std::string indx_str = std::to_string(indx);
524  const std::string delegation_role_val = "delegation_role_" + indx_str;
525 
526  Json::Value delegation;
527  std::string delegation_val_str =
528  Utils::jsonToStr((delegation["delegation_value_key_" + indx_str] = "delegation_value_" + indx_str));
529 
530  delegation_rec.first = Uptane::Role::Delegation(delegation_role_val);
531  delegation_rec.second = delegation_val_str;
532  db_storage->storeDelegation(delegation_val_str, Uptane::Role::Delegation(delegation_role_val));
533 
534  ++indx;
535  }
536  };
537 
538  auto verify_delegations = [](const std::string& output_str,
539  std::vector<std::pair<Uptane::Role, std::string> >& delegation_records) {
540  for (auto& delegation_rec : delegation_records) {
541  ASSERT_NE(output_str.find(delegation_rec.first.ToString()), std::string::npos);
542  ASSERT_NE(output_str.find(delegation_rec.second), std::string::npos);
543  }
544  };
545 
546  // aktualizr-info won't print anything if Director Root metadata are not stored in the DB
547  db_storage_->storeRoot(Utils::jsonToStr(Json::Value()), Uptane::RepositoryType::Director(), Uptane::Version(1));
548 
549  // case 0: no delegations in the DB
550  {
551  aktualizr_info_process_.run({"--delegation"});
552  ASSERT_FALSE(aktualizr_info_output.empty());
553  EXPECT_NE(aktualizr_info_output.find("Delegations are not present"), std::string::npos);
554  }
555 
556  // case 1: there is one delegation metadata record in the DB
557  {
558  std::vector<std::pair<Uptane::Role, std::string> > delegation_records{1, {Uptane::Role::Delegation(""), ""}};
559  gen_and_store_delegations(db_storage_, delegation_records);
560 
561  aktualizr_info_process_.run({"--delegation"});
562  ASSERT_FALSE(aktualizr_info_output.empty());
563 
564  verify_delegations(aktualizr_info_output, delegation_records);
565  }
566 
567  db_storage_->clearDelegations();
568 
569  // case 2: there are more than one delegation metadata records in the DB
570  {
571  std::vector<std::pair<Uptane::Role, std::string> > delegation_records{3, {Uptane::Role::Delegation(""), ""}};
572  gen_and_store_delegations(db_storage_, delegation_records);
573 
574  aktualizr_info_process_.run({"--delegation"});
575  ASSERT_FALSE(aktualizr_info_output.empty());
576 
577  verify_delegations(aktualizr_info_output, delegation_records);
578  }
579 }
580 
581 /**
582  * Verifies aktualizr-info output of Snapshot metadata from Image repository
583  *
584  * Checks actions:
585  *
586  * - [x] Print Snapshot metadata from Image repository
587  */
588 TEST_F(AktualizrInfoTest, PrintImageSnapshotMetadata) {
589  Json::Value director_root_json;
590  director_root_json["key-002"] = "value-003";
591  std::string director_root = Utils::jsonToStr(director_root_json);
592  db_storage_->storeRoot(director_root, Uptane::RepositoryType::Director(), Uptane::Version(1));
593 
594  Json::Value meta_snapshot;
595  meta_snapshot["signed"]["_type"] = "Snapshot";
596  meta_snapshot["signed"]["expires"] = "2038-01-19T03:14:06Z";
597  meta_snapshot["signed"]["version"] = "2";
598  std::string image_snapshot = Utils::jsonToStr(meta_snapshot);
599  db_storage_->storeNonRoot(image_snapshot, Uptane::RepositoryType::Image(), Uptane::Role::Snapshot());
600 
601  aktualizr_info_process_.run({"--images-snapshot"});
602  ASSERT_FALSE(aktualizr_info_output.empty());
603 
604  EXPECT_NE(aktualizr_info_output.find(image_snapshot), std::string::npos);
605 }
606 
607 /**
608  * Verifies aktualizr-info output of Timestamp metadata from the Image repository
609  *
610  * Checks actions:
611  *
612  * - [x] Print Timestamp metadata from Image repository
613  */
614 TEST_F(AktualizrInfoTest, PrintImageTimestampMetadata) {
615  Json::Value director_root_json;
616  director_root_json["key-002"] = "value-003";
617  std::string director_root = Utils::jsonToStr(director_root_json);
618  db_storage_->storeRoot(director_root, Uptane::RepositoryType::Director(), Uptane::Version(1));
619 
620  Json::Value meta_timestamp;
621  meta_timestamp["signed"]["_type"] = "Timestamp";
622  meta_timestamp["signed"]["expires"] = "2038-01-19T03:14:06Z";
623  std::string image_timestamp = Utils::jsonToStr(meta_timestamp);
624  db_storage_->storeNonRoot(image_timestamp, Uptane::RepositoryType::Image(), Uptane::Role::Timestamp());
625 
626  aktualizr_info_process_.run({"--images-timestamp"});
627  ASSERT_FALSE(aktualizr_info_output.empty());
628 
629  EXPECT_NE(aktualizr_info_output.find(image_timestamp), std::string::npos);
630 }
631 
632 /**
633  * Verifies aktualizr-info output when metadata is not present
634  *
635  * Check actions:
636  * - [x] Print appropriate message if the metadata does not exist in storage..
637  */
638 TEST_F(AktualizrInfoTest, PrintMetadataWarnibg) {
639  db_storage_->clearMetadata();
640 
641  const std::vector<std::string> args = {"--images-root", "--images-target", "--delegation",
642  "--director-root", "--director-target", "--images-snapshot",
643  "--images-timestamp"};
644 
645  for (auto arg : args) {
646  aktualizr_info_process_.run({arg});
647  ASSERT_FALSE(aktualizr_info_output.empty());
648  EXPECT_NE(aktualizr_info_output.find(std::string(warning_no_meta_data)), std::string::npos);
649  }
650 }
651 
652 #ifndef __NO_MAIN__
653 int main(int argc, char** argv) {
654  ::testing::InitGoogleTest(&argc, argv);
655 
656  return RUN_ALL_TESTS();
657 }
658 #endif
Uptane::Version
Metadata version numbers.
Definition: tuf.h:119
Uptane::HardwareIdentifier
Definition: tuf.h:146
Config
Configuration object for an aktualizr instance running on a Primary ECU.
Definition: config.h:74
Uptane::EcuSerial
Definition: tuf.h:177
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