1 #include <gtest/gtest.h> 3 #include <boost/asio/io_service.hpp> 4 #include <boost/process.hpp> 6 #include "config/config.h" 7 #include "storage/sqlstorage.h" 8 #include "test_utils.h" 9 #include "utilities/utils.h" 11 constexpr
char warning_no_meta_data[] =
"Metadata is not available\n";
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_;
20 config_.logger.loglevel = boost::log::trivial::error;
22 logger_set_threshold(config_.logger);
25 boost::filesystem::ofstream conf_file(test_conf_file_);
26 config_.writeToStream(conf_file);
30 db_storage_ = INvStorage::newStorage(config_.storage);
33 virtual void SetUp() {
34 device_id =
"aktualizr-info-test-device_ID-fd1fc55c-3abc-4de8-a2ca-32d455ae9c11";
38 db_storage_->storeDeviceId(device_id);
41 virtual void TearDown() {}
46 :
Process(
"./aktualizr-info"), test_ctx_{test_ctx}, conf_file_{conf_file} {}
49 void run(
const std::vector<std::string> args = {}) {
50 std::vector<std::string> all_args = {
"-c", conf_file_.string()};
52 if (args.size() > 0) {
53 all_args.insert(all_args.end(), args.begin(), args.end());
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();
64 const boost::filesystem::path conf_file_;
69 boost::filesystem::path test_conf_file_;
70 boost::filesystem::path test_db_file_;
73 std::shared_ptr<INvStorage> db_storage_;
75 std::string aktualizr_info_output;
78 std::string device_id;
99 const Uptane::EcuSerial secondary_ecu_serial{
"c6998d3e-2a68-4ac2-817e-4ea6ef87d21f"};
101 const std::string provisioning_status =
"Provisioned on server: yes";
102 const std::string fetched_metadata =
"Fetched metadata: yes";
104 Json::Value meta_root;
105 std::string director_root = Utils::jsonToStr(meta_root);
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));
111 aktualizr_info_process_.run();
112 ASSERT_FALSE(aktualizr_info_output.empty());
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);
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);
121 EXPECT_NE(aktualizr_info_output.find(provisioning_status), std::string::npos);
122 EXPECT_NE(aktualizr_info_output.find(fetched_metadata), std::string::npos);
134 const std::string provisioning_status =
"Provisioned on server: no";
135 const std::string fetched_metadata =
"Fetched metadata: no";
137 db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}});
139 aktualizr_info_process_.run();
140 ASSERT_FALSE(aktualizr_info_output.empty());
142 EXPECT_NE(aktualizr_info_output.find(provisioning_status), std::string::npos);
143 EXPECT_NE(aktualizr_info_output.find(fetched_metadata), std::string::npos);
155 const std::string provisioning_status =
"Provisioned on server: yes";
157 const Uptane::EcuSerial secondary_ecu_serial{
"c6998d3e-2a68-4ac2-817e-4ea6ef87d21f"};
160 const Uptane::EcuSerial secondary_ecu_serial_not_reg{
"18b018a1-fdda-4461-a281-42237256cc2f"};
163 const Uptane::EcuSerial secondary_ecu_serial_old{
"c2191c12-7298-4be3-b781-d223dac7f75e"};
166 db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}, {secondary_ecu_serial, secondary_hw_id}});
167 db_storage_->storeEcuRegistered();
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}});
173 aktualizr_info_process_.run();
174 ASSERT_FALSE(aktualizr_info_output.empty());
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"),
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"),
195 db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}});
196 db_storage_->storeEcuRegistered();
198 Json::Value image_root_json;
199 image_root_json[
"key-001"] =
"value-002";
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));
205 aktualizr_info_process_.run(std::vector<std::string>{
"--images-root"});
206 ASSERT_FALSE(aktualizr_info_output.empty());
208 EXPECT_NE(aktualizr_info_output.find(image_root), std::string::npos);
219 db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}});
220 db_storage_->storeEcuRegistered();
222 Json::Value image_root_json;
223 image_root_json[
"key-001"] =
"value-002";
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));
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());
234 aktualizr_info_process_.run({
"--images-target"});
235 ASSERT_FALSE(aktualizr_info_output.empty());
237 EXPECT_NE(aktualizr_info_output.find(image_targets_str), std::string::npos);
248 db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}});
249 db_storage_->storeEcuRegistered();
251 Json::Value director_root_json;
252 director_root_json[
"key-002"] =
"value-003";
254 std::string director_root = Utils::jsonToStr(director_root_json);
255 db_storage_->storeRoot(director_root, Uptane::RepositoryType::Director(),
Uptane::Version(1));
257 aktualizr_info_process_.run({
"--director-root"});
258 ASSERT_FALSE(aktualizr_info_output.empty());
260 EXPECT_NE(aktualizr_info_output.find(director_root), std::string::npos);
271 db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}});
272 db_storage_->storeEcuRegistered();
274 Json::Value director_root_json;
275 director_root_json[
"key-002"] =
"value-003";
277 std::string director_root = Utils::jsonToStr(director_root_json);
278 db_storage_->storeRoot(director_root, Uptane::RepositoryType::Director(),
Uptane::Version(1));
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());
285 aktualizr_info_process_.run({
"--director-target"});
286 ASSERT_FALSE(aktualizr_info_output.empty());
288 EXPECT_NE(aktualizr_info_output.find(director_targets_str), std::string::npos);
301 db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}});
302 db_storage_->storeEcuRegistered();
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);
308 aktualizr_info_process_.run({
"--ecu-keys"});
309 ASSERT_FALSE(aktualizr_info_output.empty());
311 EXPECT_NE(aktualizr_info_output.find(
"Public key:"), std::string::npos);
312 EXPECT_NE(aktualizr_info_output.find(public_key), std::string::npos);
314 EXPECT_NE(aktualizr_info_output.find(
"Private key:"), std::string::npos);
315 EXPECT_NE(aktualizr_info_output.find(private_key), std::string::npos);
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);
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);
337 db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}});
338 db_storage_->storeEcuRegistered();
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";
344 db_storage_->storeTlsCreds(ca, cert, private_key);
346 aktualizr_info_process_.run({
"--tls-creds"});
347 ASSERT_FALSE(aktualizr_info_output.empty());
349 EXPECT_NE(aktualizr_info_output.find(
"Root CA certificate:"), std::string::npos);
350 EXPECT_NE(aktualizr_info_output.find(ca), std::string::npos);
352 EXPECT_NE(aktualizr_info_output.find(
"Client certificate:"), std::string::npos);
353 EXPECT_NE(aktualizr_info_output.find(cert), std::string::npos);
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);
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);
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);
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);
379 db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}});
380 db_storage_->storeEcuRegistered();
382 const std::string current_ecu_version =
"639a4e39-e6ba-4832-ace4-8b12cf20d562";
383 const std::string pending_ecu_version =
"9636753d-2a09-4c80-8b25-64b2c2d0c4df";
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);
393 aktualizr_info_process_.run();
394 ASSERT_FALSE(aktualizr_info_output.empty());
396 EXPECT_NE(aktualizr_info_output.find(
"Current Primary ECU running version: " + current_ecu_version),
398 EXPECT_NE(aktualizr_info_output.find(
"Pending Primary ECU version: " + pending_ecu_version), std::string::npos);
409 db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}});
410 db_storage_->storeEcuRegistered();
412 const std::string pending_ecu_version =
"9636753d-2a09-4c80-8b25-64b2c2d0c4df";
414 aktualizr_info_process_.run();
415 ASSERT_FALSE(aktualizr_info_output.empty());
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);
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);
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);
429 aktualizr_info_process_.run();
430 ASSERT_FALSE(aktualizr_info_output.empty());
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);
435 db_storage_->savePrimaryInstalledVersion(
436 {
"update-01.bin", ecu_map, {{Hash::Type::kSha256, pending_ecu_version}}, 1,
"corrid-01"},
437 InstalledVersionUpdateMode::kCurrent);
439 aktualizr_info_process_.run();
440 ASSERT_FALSE(aktualizr_info_output.empty());
443 EXPECT_NE(aktualizr_info_output.find(
"Current Primary ECU running version: " + pending_ecu_version),
445 EXPECT_EQ(aktualizr_info_output.find(
"Pending Primary ECU version:"), std::string::npos);
456 const Uptane::EcuSerial secondary_ecu_serial{
"c6998d3e-2a68-4ac2-817e-4ea6ef87d21f"};
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";
463 db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}, {secondary_ecu_serial, secondary_hw_id}});
464 db_storage_->storeEcuRegistered();
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);
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);
476 aktualizr_info_process_.run();
477 ASSERT_FALSE(aktualizr_info_output.empty());
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);
485 db_storage_->clearInstalledVersions();
486 db_storage_->clearEcuSerials();
487 db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}, {secondary_ecu_serial, secondary_hw_id}});
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);
498 Json::Value meta_root;
499 std::string director_root = Utils::jsonToStr(meta_root);
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));
505 aktualizr_info_process_.run({
"--name-only"});
506 ASSERT_FALSE(aktualizr_info_output.empty());
508 EXPECT_EQ(aktualizr_info_output, device_id +
"\n");
519 auto gen_and_store_delegations = [](std::shared_ptr<INvStorage>& db_storage,
520 std::vector<std::pair<Uptane::Role, std::string> >& delegation_records) {
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;
526 Json::Value delegation;
527 std::string delegation_val_str =
528 Utils::jsonToStr((delegation[
"delegation_value_key_" + indx_str] =
"delegation_value_" + indx_str));
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));
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);
547 db_storage_->storeRoot(Utils::jsonToStr(Json::Value()), Uptane::RepositoryType::Director(),
Uptane::Version(1));
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);
558 std::vector<std::pair<Uptane::Role, std::string> > delegation_records{1, {Uptane::Role::Delegation(
""),
""}};
559 gen_and_store_delegations(db_storage_, delegation_records);
561 aktualizr_info_process_.run({
"--delegation"});
562 ASSERT_FALSE(aktualizr_info_output.empty());
564 verify_delegations(aktualizr_info_output, delegation_records);
567 db_storage_->clearDelegations();
571 std::vector<std::pair<Uptane::Role, std::string> > delegation_records{3, {Uptane::Role::Delegation(
""),
""}};
572 gen_and_store_delegations(db_storage_, delegation_records);
574 aktualizr_info_process_.run({
"--delegation"});
575 ASSERT_FALSE(aktualizr_info_output.empty());
577 verify_delegations(aktualizr_info_output, delegation_records);
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));
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());
601 aktualizr_info_process_.run({
"--images-snapshot"});
602 ASSERT_FALSE(aktualizr_info_output.empty());
604 EXPECT_NE(aktualizr_info_output.find(image_snapshot), std::string::npos);
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));
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());
626 aktualizr_info_process_.run({
"--images-timestamp"});
627 ASSERT_FALSE(aktualizr_info_output.empty());
629 EXPECT_NE(aktualizr_info_output.find(image_timestamp), std::string::npos);
639 db_storage_->clearMetadata();
641 const std::vector<std::string> args = {
"--images-root",
"--images-target",
"--delegation",
642 "--director-root",
"--director-target",
"--images-snapshot",
643 "--images-timestamp"};
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);
653 int main(
int argc,
char** argv) {
654 ::testing::InitGoogleTest(&argc, argv);
656 return RUN_ALL_TESTS();
Metadata version numbers.
Configuration object for an aktualizr instance running on a Primary ECU.