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 = PackageManager::kNone;
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 images_root_json;
199 images_root_json[
"key-001"] =
"value-002";
201 std::string images_root = Utils::jsonToStr(images_root_json);
202 db_storage_->storeRoot(images_root, Uptane::RepositoryType::Image(),
Uptane::Version(1));
203 db_storage_->storeRoot(images_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(images_root), std::string::npos);
219 db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}});
220 db_storage_->storeEcuRegistered();
222 Json::Value images_root_json;
223 images_root_json[
"key-001"] =
"value-002";
225 std::string images_root = Utils::jsonToStr(images_root_json);
226 db_storage_->storeRoot(images_root, Uptane::RepositoryType::Image(),
Uptane::Version(1));
227 db_storage_->storeRoot(images_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, {{Uptane::Hash::Type::kSha256, current_ecu_version}}, 1,
"corrid"},
388 InstalledVersionUpdateMode::kCurrent);
389 db_storage_->savePrimaryInstalledVersion(
390 {
"update-01.bin", ecu_map, {{Uptane::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, {{Uptane::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, {{Uptane::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(
468 secondary_ecu_serial.ToString(),
469 {secondary_ecu_filename, ecu_map, {{Uptane::Hash::Type::kSha256, current_ecu_version}}, 1},
470 InstalledVersionUpdateMode::kCurrent);
472 db_storage_->saveInstalledVersion(
473 secondary_ecu_serial.ToString(),
474 {secondary_ecu_filename_update, ecu_map, {{Uptane::Hash::Type::kSha256, pending_ecu_version}}, 1},
475 InstalledVersionUpdateMode::kPending);
477 aktualizr_info_process_.run();
478 ASSERT_FALSE(aktualizr_info_output.empty());
480 EXPECT_NE(aktualizr_info_output.find(
"installed image hash: " + current_ecu_version), std::string::npos);
481 EXPECT_NE(aktualizr_info_output.find(
"installed image filename: " + secondary_ecu_filename), std::string::npos);
482 EXPECT_NE(aktualizr_info_output.find(
"pending image hash: " + pending_ecu_version), std::string::npos);
483 EXPECT_NE(aktualizr_info_output.find(
"pending image filename: " + secondary_ecu_filename_update), std::string::npos);
486 db_storage_->clearInstalledVersions();
487 db_storage_->clearEcuSerials();
488 db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}, {secondary_ecu_serial, secondary_hw_id}});
490 aktualizr_info_process_.run();
491 ASSERT_FALSE(aktualizr_info_output.empty());
492 EXPECT_NE(aktualizr_info_output.find(
"no details about installed nor pending images"), std::string::npos);
499 Json::Value meta_root;
500 std::string director_root = Utils::jsonToStr(meta_root);
502 db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}});
503 db_storage_->storeEcuRegistered();
504 db_storage_->storeRoot(director_root, Uptane::RepositoryType::Director(),
Uptane::Version(1));
506 aktualizr_info_process_.run({
"--name-only"});
507 ASSERT_FALSE(aktualizr_info_output.empty());
509 EXPECT_EQ(aktualizr_info_output, device_id +
"\n");
520 auto gen_and_store_delegations = [](std::shared_ptr<INvStorage>& db_storage,
521 std::vector<std::pair<Uptane::Role, std::string> >& delegation_records) {
523 for (
auto& delegation_rec : delegation_records) {
524 const std::string indx_str = std::to_string(indx);
525 const std::string delegation_role_val =
"delegation_role_" + indx_str;
527 Json::Value delegation;
528 std::string delegation_val_str =
529 Utils::jsonToStr((delegation[
"delegation_value_key_" + indx_str] =
"delegation_value_" + indx_str));
531 delegation_rec.first = Uptane::Role::Delegation(delegation_role_val);
532 delegation_rec.second = delegation_val_str;
533 db_storage->storeDelegation(delegation_val_str, Uptane::Role::Delegation(delegation_role_val));
539 auto verify_delegations = [](
const std::string& output_str,
540 std::vector<std::pair<Uptane::Role, std::string> >& delegation_records) {
541 for (
auto& delegation_rec : delegation_records) {
542 ASSERT_NE(output_str.find(delegation_rec.first.ToString()), std::string::npos);
543 ASSERT_NE(output_str.find(delegation_rec.second), std::string::npos);
548 db_storage_->storeRoot(Utils::jsonToStr(Json::Value()), Uptane::RepositoryType::Director(),
Uptane::Version(1));
552 aktualizr_info_process_.run({
"--delegation"});
553 ASSERT_FALSE(aktualizr_info_output.empty());
554 EXPECT_NE(aktualizr_info_output.find(
"Delegations are not present"), std::string::npos);
559 std::vector<std::pair<Uptane::Role, std::string> > delegation_records{1, {Uptane::Role::Delegation(
""),
""}};
560 gen_and_store_delegations(db_storage_, delegation_records);
562 aktualizr_info_process_.run({
"--delegation"});
563 ASSERT_FALSE(aktualizr_info_output.empty());
565 verify_delegations(aktualizr_info_output, delegation_records);
568 db_storage_->clearDelegations();
572 std::vector<std::pair<Uptane::Role, std::string> > delegation_records{3, {Uptane::Role::Delegation(
""),
""}};
573 gen_and_store_delegations(db_storage_, delegation_records);
575 aktualizr_info_process_.run({
"--delegation"});
576 ASSERT_FALSE(aktualizr_info_output.empty());
578 verify_delegations(aktualizr_info_output, delegation_records);
590 Json::Value director_root_json;
591 director_root_json[
"key-002"] =
"value-003";
592 std::string director_root = Utils::jsonToStr(director_root_json);
593 db_storage_->storeRoot(director_root, Uptane::RepositoryType::Director(),
Uptane::Version(1));
595 Json::Value meta_snapshot;
596 meta_snapshot[
"signed"][
"_type"] =
"Snapshot";
597 meta_snapshot[
"signed"][
"expires"] =
"2038-01-19T03:14:06Z";
598 meta_snapshot[
"signed"][
"version"] =
"2";
599 std::string images_snapshot = Utils::jsonToStr(meta_snapshot);
600 db_storage_->storeNonRoot(images_snapshot, Uptane::RepositoryType::Image(), Uptane::Role::Snapshot());
602 aktualizr_info_process_.run({
"--images-snapshot"});
603 ASSERT_FALSE(aktualizr_info_output.empty());
605 EXPECT_NE(aktualizr_info_output.find(images_snapshot), std::string::npos);
616 Json::Value director_root_json;
617 director_root_json[
"key-002"] =
"value-003";
618 std::string director_root = Utils::jsonToStr(director_root_json);
619 db_storage_->storeRoot(director_root, Uptane::RepositoryType::Director(),
Uptane::Version(1));
621 Json::Value meta_timestamp;
622 meta_timestamp[
"signed"][
"_type"] =
"Timestamp";
623 meta_timestamp[
"signed"][
"expires"] =
"2038-01-19T03:14:06Z";
624 std::string images_timestamp = Utils::jsonToStr(meta_timestamp);
625 db_storage_->storeNonRoot(images_timestamp, Uptane::RepositoryType::Image(), Uptane::Role::Timestamp());
627 aktualizr_info_process_.run({
"--images-timestamp"});
628 ASSERT_FALSE(aktualizr_info_output.empty());
630 EXPECT_NE(aktualizr_info_output.find(images_timestamp), std::string::npos);
640 db_storage_->clearMetadata();
642 const std::vector<std::string> args = {
"--images-root",
"--images-target",
"--delegation",
643 "--director-root",
"--director-target",
"--images-snapshot",
644 "--images-timestamp"};
646 for (
auto arg : args) {
647 aktualizr_info_process_.run({arg});
648 ASSERT_FALSE(aktualizr_info_output.empty());
649 EXPECT_NE(aktualizr_info_output.find(std::string(warning_no_meta_data)), std::string::npos);
654 int main(
int argc,
char** argv) {
655 ::testing::InitGoogleTest(&argc, argv);
657 return RUN_ALL_TESTS();