1 #include <gtest/gtest.h> 3 #include <boost/asio/io_service.hpp> 4 #include <boost/process.hpp> 6 #include "libaktualizr/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_->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});
172 aktualizr_info_process_.run();
173 ASSERT_FALSE(aktualizr_info_output.empty());
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"),
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"),
194 db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}});
195 db_storage_->storeEcuRegistered();
197 Json::Value image_root_json;
198 image_root_json[
"key-001"] =
"value-002";
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));
204 aktualizr_info_process_.run(std::vector<std::string>{
"--images-root"});
205 ASSERT_FALSE(aktualizr_info_output.empty());
207 EXPECT_NE(aktualizr_info_output.find(image_root), std::string::npos);
218 db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}});
219 db_storage_->storeEcuRegistered();
221 Json::Value image_root_json;
222 image_root_json[
"key-001"] =
"value-002";
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));
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());
233 aktualizr_info_process_.run({
"--images-target"});
234 ASSERT_FALSE(aktualizr_info_output.empty());
236 EXPECT_NE(aktualizr_info_output.find(image_targets_str), std::string::npos);
247 db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}});
248 db_storage_->storeEcuRegistered();
250 Json::Value director_root_json;
251 director_root_json[
"key-002"] =
"value-003";
253 std::string director_root = Utils::jsonToStr(director_root_json);
254 db_storage_->storeRoot(director_root, Uptane::RepositoryType::Director(),
Uptane::Version(1));
256 aktualizr_info_process_.run({
"--director-root"});
257 ASSERT_FALSE(aktualizr_info_output.empty());
259 EXPECT_NE(aktualizr_info_output.find(director_root), std::string::npos);
270 db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}});
271 db_storage_->storeEcuRegistered();
273 Json::Value director_root_json;
274 director_root_json[
"key-002"] =
"value-003";
276 std::string director_root = Utils::jsonToStr(director_root_json);
277 db_storage_->storeRoot(director_root, Uptane::RepositoryType::Director(),
Uptane::Version(1));
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());
284 aktualizr_info_process_.run({
"--director-target"});
285 ASSERT_FALSE(aktualizr_info_output.empty());
287 EXPECT_NE(aktualizr_info_output.find(director_targets_str), std::string::npos);
300 db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}});
301 db_storage_->storeEcuRegistered();
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);
307 aktualizr_info_process_.run({
"--ecu-keys"});
308 ASSERT_FALSE(aktualizr_info_output.empty());
310 EXPECT_NE(aktualizr_info_output.find(
"Public key:"), std::string::npos);
311 EXPECT_NE(aktualizr_info_output.find(public_key), std::string::npos);
313 EXPECT_NE(aktualizr_info_output.find(
"Private key:"), std::string::npos);
314 EXPECT_NE(aktualizr_info_output.find(private_key), std::string::npos);
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);
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);
336 db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}});
337 db_storage_->storeEcuRegistered();
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";
343 db_storage_->storeTlsCreds(ca, cert, private_key);
345 aktualizr_info_process_.run({
"--tls-creds"});
346 ASSERT_FALSE(aktualizr_info_output.empty());
348 EXPECT_NE(aktualizr_info_output.find(
"Root CA certificate:"), std::string::npos);
349 EXPECT_NE(aktualizr_info_output.find(ca), std::string::npos);
351 EXPECT_NE(aktualizr_info_output.find(
"Client certificate:"), std::string::npos);
352 EXPECT_NE(aktualizr_info_output.find(cert), std::string::npos);
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);
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);
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);
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);
378 db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}});
379 db_storage_->storeEcuRegistered();
381 const std::string current_ecu_version =
"639a4e39-e6ba-4832-ace4-8b12cf20d562";
382 const std::string pending_ecu_version =
"9636753d-2a09-4c80-8b25-64b2c2d0c4df";
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);
392 aktualizr_info_process_.run();
393 ASSERT_FALSE(aktualizr_info_output.empty());
395 EXPECT_NE(aktualizr_info_output.find(
"Current Primary ECU running version: " + current_ecu_version),
397 EXPECT_NE(aktualizr_info_output.find(
"Pending Primary ECU version: " + pending_ecu_version), std::string::npos);
408 db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}});
409 db_storage_->storeEcuRegistered();
411 const std::string pending_ecu_version =
"9636753d-2a09-4c80-8b25-64b2c2d0c4df";
413 aktualizr_info_process_.run();
414 ASSERT_FALSE(aktualizr_info_output.empty());
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);
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);
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);
428 aktualizr_info_process_.run();
429 ASSERT_FALSE(aktualizr_info_output.empty());
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);
434 db_storage_->savePrimaryInstalledVersion(
435 {
"update-01.bin", ecu_map, {{Hash::Type::kSha256, pending_ecu_version}}, 1,
"corrid-01"},
436 InstalledVersionUpdateMode::kCurrent);
438 aktualizr_info_process_.run();
439 ASSERT_FALSE(aktualizr_info_output.empty());
442 EXPECT_NE(aktualizr_info_output.find(
"Current Primary ECU running version: " + pending_ecu_version),
444 EXPECT_EQ(aktualizr_info_output.find(
"Pending Primary ECU version:"), std::string::npos);
455 const Uptane::EcuSerial secondary_ecu_serial{
"c6998d3e-2a68-4ac2-817e-4ea6ef87d21f"};
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";
462 db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}, {secondary_ecu_serial, secondary_hw_id}});
463 db_storage_->storeEcuRegistered();
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);
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);
475 aktualizr_info_process_.run();
476 ASSERT_FALSE(aktualizr_info_output.empty());
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);
484 db_storage_->clearInstalledVersions();
485 db_storage_->clearEcuSerials();
486 db_storage_->storeEcuSerials({{primary_ecu_serial, primary_hw_id}, {secondary_ecu_serial, secondary_hw_id}});
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);
497 Json::Value meta_root;
498 std::string director_root = Utils::jsonToStr(meta_root);
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));
504 aktualizr_info_process_.run({
"--name-only"});
505 ASSERT_FALSE(aktualizr_info_output.empty());
507 EXPECT_EQ(aktualizr_info_output, device_id +
"\n");
518 auto gen_and_store_delegations = [](std::shared_ptr<INvStorage>& db_storage,
519 std::vector<std::pair<Uptane::Role, std::string> >& delegation_records) {
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;
525 Json::Value delegation;
526 std::string delegation_val_str =
527 Utils::jsonToStr((delegation[
"delegation_value_key_" + indx_str] =
"delegation_value_" + indx_str));
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));
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);
546 db_storage_->storeRoot(Utils::jsonToStr(Json::Value()), Uptane::RepositoryType::Director(),
Uptane::Version(1));
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);
557 std::vector<std::pair<Uptane::Role, std::string> > delegation_records{1, {Uptane::Role::Delegation(
""),
""}};
558 gen_and_store_delegations(db_storage_, delegation_records);
560 aktualizr_info_process_.run({
"--delegation"});
561 ASSERT_FALSE(aktualizr_info_output.empty());
563 verify_delegations(aktualizr_info_output, delegation_records);
566 db_storage_->clearDelegations();
570 std::vector<std::pair<Uptane::Role, std::string> > delegation_records{3, {Uptane::Role::Delegation(
""),
""}};
571 gen_and_store_delegations(db_storage_, delegation_records);
573 aktualizr_info_process_.run({
"--delegation"});
574 ASSERT_FALSE(aktualizr_info_output.empty());
576 verify_delegations(aktualizr_info_output, delegation_records);
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));
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());
600 aktualizr_info_process_.run({
"--images-snapshot"});
601 ASSERT_FALSE(aktualizr_info_output.empty());
603 EXPECT_NE(aktualizr_info_output.find(image_snapshot), std::string::npos);
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));
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());
625 aktualizr_info_process_.run({
"--images-timestamp"});
626 ASSERT_FALSE(aktualizr_info_output.empty());
628 EXPECT_NE(aktualizr_info_output.find(image_timestamp), std::string::npos);
638 db_storage_->clearMetadata();
640 const std::vector<std::string> args = {
"--images-root",
"--images-target",
"--delegation",
641 "--director-root",
"--director-target",
"--images-snapshot",
642 "--images-timestamp"};
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);
652 int main(
int argc,
char** argv) {
653 ::testing::InitGoogleTest(&argc, argv);
655 return RUN_ALL_TESTS();
Metadata version numbers.
Configuration object for an aktualizr instance running on a Primary ECU.