1 #include <gtest/gtest.h> 5 #include <netinet/tcp.h> 7 #include "ipuptanesecondary.h" 8 #include "logging/logging.h" 9 #include "msg_handler.h" 10 #include "package_manager/packagemanagerfactory.h" 11 #include "package_manager/packagemanagerinterface.h" 12 #include "secondary_tcp_server.h" 13 #include "storage/invstorage.h" 14 #include "test_utils.h" 16 enum class HandlerVersion { kV1, kV2, kV2Failure };
28 const Uptane::Manifest& manifest, HandlerVersion handler_version = HandlerVersion::kV2)
33 image_filepath_{image_dir_ /
"image.bin"},
34 hasher_{MultiPartHasher::create(Hash::Type::kSha256)},
35 handler_version_(handler_version) {
40 const std::string verification_failure =
"Expected verification test failure";
41 const std::string upload_data_failure =
"Expected data upload test failure";
42 const std::string ostree_failure =
"Expected OSTree download test failure";
43 const std::string installation_failure =
"Expected installation test failure";
47 const PublicKey& publicKey()
const {
return pub_key_; }
49 const Uptane::MetaBundle& metadata()
const {
return meta_bundle_; }
50 HandlerVersion handlerVersion()
const {
return handler_version_; }
51 void setHandlerVersion(HandlerVersion handler_version_in) { handler_version_ = handler_version_in; }
52 void registerHandlers() {
53 registerBaseHandlers();
54 if (handler_version_ == HandlerVersion::kV1) {
56 }
else if (handler_version_ == HandlerVersion::kV2) {
59 registerV2FailureHandlers();
63 void resetImageHash()
const { hasher_->reset(); }
64 Hash getReceivedImageHash()
const {
return hasher_->getHash(); }
65 size_t getReceivedImageSize()
const {
return boost::filesystem::file_size(image_filepath_); }
67 const std::string& getReceivedTlsCreds()
const {
return tls_creds_; }
70 void registerBaseHandlers() {
71 registerHandler(AKIpUptaneMes_PR_getInfoReq,
72 std::bind(&SecondaryMock::getInfoHdlr,
this, std::placeholders::_1, std::placeholders::_2));
74 registerHandler(AKIpUptaneMes_PR_versionReq,
75 std::bind(&SecondaryMock::versionHdlr,
this, std::placeholders::_1, std::placeholders::_2));
77 registerHandler(AKIpUptaneMes_PR_manifestReq,
78 std::bind(&SecondaryMock::getManifestHdlr,
this, std::placeholders::_1, std::placeholders::_2));
82 void registerV1Handlers() {
83 registerHandler(AKIpUptaneMes_PR_putMetaReq,
84 std::bind(&SecondaryMock::putMetaHdlr,
this, std::placeholders::_1, std::placeholders::_2));
86 registerHandler(AKIpUptaneMes_PR_sendFirmwareReq,
87 std::bind(&SecondaryMock::sendFirmwareHdlr,
this, std::placeholders::_1, std::placeholders::_2));
89 registerHandler(AKIpUptaneMes_PR_installReq,
90 std::bind(&SecondaryMock::installHdlr,
this, std::placeholders::_1, std::placeholders::_2));
94 void registerV2Handlers() {
95 registerHandler(AKIpUptaneMes_PR_putMetaReq2,
96 std::bind(&SecondaryMock::putMeta2Hdlr,
this, std::placeholders::_1, std::placeholders::_2));
98 registerHandler(AKIpUptaneMes_PR_uploadDataReq,
99 std::bind(&SecondaryMock::uploadDataHdlr,
this, std::placeholders::_1, std::placeholders::_2));
101 registerHandler(AKIpUptaneMes_PR_downloadOstreeRevReq,
102 std::bind(&SecondaryMock::downloadOstreeRev,
this, std::placeholders::_1, std::placeholders::_2));
104 registerHandler(AKIpUptaneMes_PR_installReq,
105 std::bind(&SecondaryMock::install2Hdlr,
this, std::placeholders::_1, std::placeholders::_2));
109 void registerV2FailureHandlers() {
110 registerHandler(AKIpUptaneMes_PR_putMetaReq2,
111 std::bind(&SecondaryMock::putMeta2FailureHdlr,
this, std::placeholders::_1, std::placeholders::_2));
113 registerHandler(AKIpUptaneMes_PR_uploadDataReq, std::bind(&SecondaryMock::uploadDataFailureHdlr,
this,
114 std::placeholders::_1, std::placeholders::_2));
116 registerHandler(AKIpUptaneMes_PR_downloadOstreeRevReq, std::bind(&SecondaryMock::downloadOstreeRevFailure,
this,
117 std::placeholders::_1, std::placeholders::_2));
119 registerHandler(AKIpUptaneMes_PR_installReq,
120 std::bind(&SecondaryMock::install2FailureHdlr,
this, std::placeholders::_1, std::placeholders::_2));
127 out_msg.present(AKIpUptaneMes_PR_getInfoResp);
128 auto info_resp = out_msg.getInfoResp();
130 SetString(&info_resp->ecuSerial, serial_.ToString());
131 SetString(&info_resp->hwId, hdw_id_.ToString());
132 info_resp->keyType =
static_cast<AKIpUptaneKeyType_t
>(pub_key_.Type());
133 SetString(&info_resp->key, pub_key_.Value());
135 return ReturnCode::kOk;
141 out_msg.present(AKIpUptaneMes_PR_versionResp);
142 auto version_resp = out_msg.versionResp();
144 if (handler_version_ == HandlerVersion::kV1) {
145 version_resp->version = 1;
147 version_resp->version = 2;
150 return ReturnCode::kOk;
156 out_msg.present(AKIpUptaneMes_PR_manifestResp);
157 auto manifest_resp = out_msg.manifestResp();
158 manifest_resp->manifest.present = manifest_PR_json;
159 SetString(&manifest_resp->manifest.choice.json, Utils::jsonToStr(manifest()));
161 return ReturnCode::kOk;
166 auto md = in_msg.putMetaReq();
168 meta_bundle_.emplace(std::make_pair(Uptane::RepositoryType::Director(), Uptane::Role::Root()),
169 ToString(md->director.choice.json.root));
170 meta_bundle_.emplace(std::make_pair(Uptane::RepositoryType::Director(), Uptane::Role::Targets()),
171 ToString(md->director.choice.json.targets));
173 meta_bundle_.emplace(std::make_pair(Uptane::RepositoryType::Image(), Uptane::Role::Root()),
174 ToString(md->image.choice.json.root));
175 meta_bundle_.emplace(std::make_pair(Uptane::RepositoryType::Image(), Uptane::Role::Timestamp()),
176 ToString(md->image.choice.json.timestamp));
177 meta_bundle_.emplace(std::make_pair(Uptane::RepositoryType::Image(), Uptane::Role::Snapshot()),
178 ToString(md->image.choice.json.snapshot));
179 meta_bundle_.emplace(std::make_pair(Uptane::RepositoryType::Image(), Uptane::Role::Targets()),
180 ToString(md->image.choice.json.targets));
182 out_msg.present(AKIpUptaneMes_PR_putMetaResp).putMetaResp()->result = AKInstallationResult_success;
184 return ReturnCode::kOk;
189 auto md = in_msg.putMetaReq2();
190 Uptane::MetaBundle meta_bundle;
192 EXPECT_EQ(md->directorRepo.present, directorRepo_PR_collection);
194 const int director_meta_count = md->directorRepo.choice.collection.list.count;
195 EXPECT_EQ(director_meta_count, 2);
196 for (
int i = 0; i < director_meta_count; i++) {
198 const AKMetaJson_t
object = *md->directorRepo.choice.collection.list.array[i];
199 const std::string role = ToString(
object.role);
200 std::string json = ToString(
object.json);
201 if (role == Uptane::Role::ROOT) {
202 meta_bundle.emplace(std::make_pair(Uptane::RepositoryType::Director(), Uptane::Role::Root()), std::move(json));
203 }
else if (role == Uptane::Role::TARGETS) {
204 meta_bundle.emplace(std::make_pair(Uptane::RepositoryType::Director(), Uptane::Role::Targets()),
209 EXPECT_EQ(md->imageRepo.present, imageRepo_PR_collection);
211 const int image_meta_count = md->imageRepo.choice.collection.list.count;
212 EXPECT_EQ(image_meta_count, 4);
213 for (
int i = 0; i < image_meta_count; i++) {
215 const AKMetaJson_t
object = *md->imageRepo.choice.collection.list.array[i];
216 const std::string role = ToString(
object.role);
217 std::string json = ToString(
object.json);
218 if (role == Uptane::Role::ROOT) {
219 meta_bundle.emplace(std::make_pair(Uptane::RepositoryType::Image(), Uptane::Role::Root()), std::move(json));
220 }
else if (role == Uptane::Role::TIMESTAMP) {
221 meta_bundle.emplace(std::make_pair(Uptane::RepositoryType::Image(), Uptane::Role::Timestamp()),
223 }
else if (role == Uptane::Role::SNAPSHOT) {
224 meta_bundle.emplace(std::make_pair(Uptane::RepositoryType::Image(), Uptane::Role::Snapshot()), std::move(json));
225 }
else if (role == Uptane::Role::TARGETS) {
226 meta_bundle.emplace(std::make_pair(Uptane::RepositoryType::Image(), Uptane::Role::Targets()), std::move(json));
232 auto m = out_msg.present(AKIpUptaneMes_PR_putMetaResp2).putMetaResp2();
233 m->result =
static_cast<AKInstallationResultCode_t
>(result.result_code.num_code);
234 SetString(&m->description, result.description);
236 return ReturnCode::kOk;
242 auto m = out_msg.present(AKIpUptaneMes_PR_putMetaResp2).putMetaResp2();
244 SetString(&m->description, verification_failure);
246 return ReturnCode::kOk;
250 auto result = install(ToString(in_msg.installReq()->hash)).result_code.num_code;
252 out_msg.present(AKIpUptaneMes_PR_installResp).installResp()->result =
253 static_cast<AKInstallationResultCode_t
>(
result);
255 if (data::ResultCode::Numeric::kNeedCompletion ==
result) {
256 return ReturnCode::kRebootRequired;
259 return ReturnCode::kOk;
263 auto result = install(ToString(in_msg.installReq()->hash));
265 auto m = out_msg.present(AKIpUptaneMes_PR_installResp2).installResp2();
266 m->result =
static_cast<AKInstallationResultCode_t
>(
result.result_code.num_code);
267 SetString(&m->description,
result.description);
269 if (data::ResultCode::Numeric::kNeedCompletion ==
result.result_code.num_code) {
270 return ReturnCode::kRebootRequired;
273 return ReturnCode::kOk;
279 auto m = out_msg.present(AKIpUptaneMes_PR_installResp2).installResp2();
281 SetString(&m->description, installation_failure);
283 return ReturnCode::kOk;
287 if (in_msg.uploadDataReq()->data.size < 0) {
288 out_msg.present(AKIpUptaneMes_PR_uploadDataResp).uploadDataResp()->result = AKInstallationResult_failure;
289 return ReturnCode::kOk;
292 size_t data_size =
static_cast<size_t>(in_msg.uploadDataReq()->data.size);
293 auto result = receiveImageData(in_msg.uploadDataReq()->data.buf, data_size);
295 auto m = out_msg.present(AKIpUptaneMes_PR_uploadDataResp).uploadDataResp();
296 m->result =
static_cast<AKInstallationResultCode_t
>(
result.result_code.num_code);
297 SetString(&m->description,
result.description);
299 return ReturnCode::kOk;
305 auto m = out_msg.present(AKIpUptaneMes_PR_uploadDataResp).uploadDataResp();
307 SetString(&m->description, upload_data_failure);
309 return ReturnCode::kOk;
313 received_firmware_data_ = ToString(in_msg.sendFirmwareReq()->firmware);
314 out_msg.present(AKIpUptaneMes_PR_sendFirmwareResp).sendFirmwareResp()->result = AKInstallationResult_success;
316 return ReturnCode::kOk;
320 tls_creds_ = ToString(in_msg.downloadOstreeRevReq()->tlsCred);
321 auto m = out_msg.present(AKIpUptaneMes_PR_downloadOstreeRevResp).downloadOstreeRevResp();
322 m->result =
static_cast<AKInstallationResultCode_t
>(data::ResultCode::Numeric::kOk);
323 SetString(&m->description,
"");
325 return ReturnCode::kOk;
331 auto m = out_msg.present(AKIpUptaneMes_PR_downloadOstreeRevResp).downloadOstreeRevResp();
333 SetString(&m->description, ostree_failure);
335 return ReturnCode::kOk;
339 meta_bundle_ = meta_bundle;
344 std::ofstream target_file(image_filepath_.c_str(), std::ofstream::out | std::ofstream::binary | std::ofstream::app);
346 target_file.write(reinterpret_cast<const char*>(data), static_cast<std::streamsize>(size));
347 hasher_->update(data, size);
354 if (!received_firmware_data_.empty()) {
356 if (target_name ==
"OSTREE") {
357 tls_creds_ = received_firmware_data_;
358 }
else if (handler_version_ == HandlerVersion::kV1) {
360 receiveImageData(reinterpret_cast<const uint8_t*>(received_firmware_data_.c_str()),
361 received_firmware_data_.size());
373 Uptane::MetaBundle meta_bundle_;
376 boost::filesystem::path image_filepath_;
377 std::shared_ptr<MultiPartHasher> hasher_;
378 std::unordered_map<unsigned int, Handler> handler_map_;
379 std::string tls_creds_;
380 std::string received_firmware_data_;
381 HandlerVersion handler_version_;
386 TargetFile(
const std::string filename,
size_t size = 1024, Hash::Type hash_type = Hash::Type::kSha256)
388 image_filepath_{target_dir_ / filename},
389 image_hash_{generateRandomFile(image_filepath_, size, hash_type)} {}
391 std::string path()
const {
return image_filepath_.string(); }
392 const Hash& hash()
const {
return image_hash_; }
393 const size_t& size()
const {
return image_size_; }
395 static Hash generateRandomFile(
const boost::filesystem::path& filepath,
size_t size, Hash::Type hash_type) {
396 auto hasher = MultiPartHasher::create(hash_type);
397 std::ofstream file{filepath.string(), std::ofstream::binary};
399 if (!file.is_open() || !file.good()) {
400 throw std::runtime_error(
"Failed to create a file: " + filepath.string());
403 const unsigned char symbols[] =
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv";
404 unsigned char cur_symbol;
406 for (
unsigned int ii = 0; ii < size; ++ii) {
407 cur_symbol = symbols[
static_cast<unsigned int>(rand()) %
sizeof(symbols)];
408 file.put(static_cast<char>(cur_symbol));
409 hasher->update(&cur_symbol,
sizeof(cur_symbol));
413 return hasher->getHash();
416 Uptane::Target createTarget(std::shared_ptr<PackageManagerInterface>& package_manager_) {
417 Json::Value target_json;
418 target_json[
"custom"][
"targetFormat"] =
"BINARY";
419 target_json[
"hashes"][
"sha256"] = hash().HashString();
420 target_json[
"length"] = size();
423 auto fhandle = package_manager_->createTargetFile(target);
424 const std::string content = Utils::readFile(path());
425 fhandle.write(const_cast<char*>(content.c_str()), static_cast<std::streamsize>(size()));
433 const size_t image_size_;
434 boost::filesystem::path image_filepath_;
440 const std::string ca_ =
"ca";
441 const std::string cert_ =
"cert";
442 const std::string pkey_ =
"pkey";
443 const std::string server_ =
"ostree-server";
444 const std::string director_root_ =
"director-root";
445 const std::string director_targets_ =
"director-targets";
446 const std::string image_root_ =
"image-root";
447 const std::string image_timestamp_ =
"image-timestamp";
448 const std::string image_snapshot_ =
"image-snapshot";
449 const std::string image_targets_ =
"image-targets";
455 secondary_server_{secondary_,
"", 0},
456 secondary_server_thread_{std::bind(&SecondaryRpcCommon::runSecondaryServer,
this)},
457 image_file_{
"mytarget_image.img", image_size} {
458 secondary_server_.wait_until_running();
459 ip_secondary_ = Uptane::IpUptaneSecondary::connectAndCreate(
"localhost", secondary_server_.port());
461 config_.pacman.ostree_server = server_;
462 config_.pacman.type = PACKAGE_MANAGER_NONE;
463 config_.pacman.images_path = temp_dir_.Path() /
"images";
464 config_.storage.path = temp_dir_.Path();
466 storage_ = INvStorage::newStorage(config_.storage);
467 storage_->storeTlsCreds(ca_, cert_, pkey_);
468 storage_->storeRoot(director_root_, Uptane::RepositoryType::Director(),
Uptane::Version(1));
469 storage_->storeNonRoot(director_targets_, Uptane::RepositoryType::Director(), Uptane::Role::Targets());
470 storage_->storeRoot(image_root_, Uptane::RepositoryType::Image(),
Uptane::Version(1));
471 storage_->storeNonRoot(image_timestamp_, Uptane::RepositoryType::Image(), Uptane::Role::Timestamp());
472 storage_->storeNonRoot(image_snapshot_, Uptane::RepositoryType::Image(), Uptane::Role::Snapshot());
473 storage_->storeNonRoot(image_targets_, Uptane::RepositoryType::Image(), Uptane::Role::Targets());
475 package_manager_ = PackageManagerFactory::makePackageManager(config_.pacman, config_.bootloader, storage_,
nullptr);
476 secondary_provider_ = std::make_shared<SecondaryProvider>(config_, storage_, package_manager_);
477 ip_secondary_->init(secondary_provider_);
481 secondary_server_.stop();
482 secondary_server_thread_.join();
485 void runSecondaryServer() { secondary_server_.run(); }
487 void resetHandlers(HandlerVersion handler_version) {
488 secondary_.setHandlerVersion(handler_version);
489 secondary_.registerHandlers();
492 void verifyMetadata(
const Uptane::MetaBundle& meta_bundle) {
493 EXPECT_EQ(Uptane::getMetaFromBundle(meta_bundle, Uptane::RepositoryType::Director(), Uptane::Role::Root()),
495 EXPECT_EQ(Uptane::getMetaFromBundle(meta_bundle, Uptane::RepositoryType::Director(), Uptane::Role::Targets()),
497 EXPECT_EQ(Uptane::getMetaFromBundle(meta_bundle, Uptane::RepositoryType::Image(), Uptane::Role::Root()),
499 EXPECT_EQ(Uptane::getMetaFromBundle(meta_bundle, Uptane::RepositoryType::Image(), Uptane::Role::Timestamp()),
501 EXPECT_EQ(Uptane::getMetaFromBundle(meta_bundle, Uptane::RepositoryType::Image(), Uptane::Role::Snapshot()),
503 EXPECT_EQ(Uptane::getMetaFromBundle(meta_bundle, Uptane::RepositoryType::Image(), Uptane::Role::Targets()),
507 void sendAndInstallBinaryImage() {
508 Uptane::Target target = image_file_.createTarget(package_manager_);
509 const HandlerVersion handler_version = secondary_.handlerVersion();
512 if (handler_version == HandlerVersion::kV2Failure) {
514 EXPECT_EQ(result.description, secondary_.verification_failure);
516 EXPECT_TRUE(result.isSuccess());
517 verifyMetadata(secondary_.metadata());
520 result = ip_secondary_->sendFirmware(target);
521 if (handler_version == HandlerVersion::kV2Failure) {
523 EXPECT_EQ(result.description, secondary_.upload_data_failure);
525 EXPECT_TRUE(result.isSuccess());
528 result = ip_secondary_->install(target);
529 if (handler_version == HandlerVersion::kV2Failure) {
531 EXPECT_EQ(result.description, secondary_.installation_failure);
533 EXPECT_TRUE(result.isSuccess());
534 EXPECT_EQ(image_file_.hash(), secondary_.getReceivedImageHash());
538 void installOstreeRev() {
539 Json::Value target_json;
540 target_json[
"custom"][
"targetFormat"] =
"OSTREE";
543 const HandlerVersion handler_version = secondary_.handlerVersion();
546 if (handler_version == HandlerVersion::kV2Failure) {
548 EXPECT_EQ(result.description, secondary_.verification_failure);
550 EXPECT_TRUE(result.isSuccess());
551 verifyMetadata(secondary_.metadata());
554 result = ip_secondary_->sendFirmware(target);
555 if (handler_version == HandlerVersion::kV2Failure) {
557 EXPECT_EQ(result.description, secondary_.ostree_failure);
559 EXPECT_TRUE(result.isSuccess());
562 result = ip_secondary_->install(target);
563 if (handler_version == HandlerVersion::kV2Failure) {
565 EXPECT_EQ(result.description, secondary_.installation_failure);
567 EXPECT_TRUE(result.isSuccess());
568 std::string archive = secondary_.getReceivedTlsCreds();
570 std::stringstream as(archive);
571 EXPECT_EQ(ca_, Utils::readFileFromArchive(as,
"ca.pem"));
574 std::stringstream as(archive);
575 EXPECT_EQ(cert_, Utils::readFileFromArchive(as,
"client.pem"));
578 std::stringstream as(archive);
579 EXPECT_EQ(pkey_, Utils::readFileFromArchive(as,
"pkey.pem"));
582 std::stringstream as(archive);
583 EXPECT_EQ(server_, Utils::readFileFromArchive(as,
"server.url",
true));
589 std::shared_ptr<SecondaryProvider> secondary_provider_;
591 std::thread secondary_server_thread_;
593 SecondaryInterface::Ptr ip_secondary_;
595 std::shared_ptr<INvStorage> storage_;
597 std::shared_ptr<PackageManagerInterface> package_manager_;
601 public ::testing::WithParamInterface<std::pair<size_t, HandlerVersion>> {
609 ASSERT_TRUE(ip_secondary_ !=
nullptr) <<
"Failed to create IP Secondary";
610 EXPECT_EQ(ip_secondary_->getSerial(), secondary_.serial());
611 EXPECT_EQ(ip_secondary_->getHwId(), secondary_.hwID());
612 EXPECT_EQ(ip_secondary_->getPublicKey(), secondary_.publicKey());
613 EXPECT_EQ(ip_secondary_->getManifest(), secondary_.manifest());
615 sendAndInstallBinaryImage();
623 INSTANTIATE_TEST_SUITE_P(
625 ::testing::Values(std::make_pair(1, HandlerVersion::kV2), std::make_pair(1024, HandlerVersion::kV2),
626 std::make_pair(1024 - 1, HandlerVersion::kV2), std::make_pair(1024 + 1, HandlerVersion::kV2),
627 std::make_pair(1024 * 10 + 1, HandlerVersion::kV2), std::make_pair(1, HandlerVersion::kV1),
628 std::make_pair(1024, HandlerVersion::kV1), std::make_pair(1024 - 1, HandlerVersion::kV1),
629 std::make_pair(1024 + 1, HandlerVersion::kV1), std::make_pair(1024 * 10 + 1, HandlerVersion::kV1),
630 std::make_pair(1024, HandlerVersion::kV2Failure)));
640 ASSERT_TRUE(ip_secondary_ !=
nullptr) <<
"Failed to create IP Secondary";
642 sendAndInstallBinaryImage();
643 resetHandlers(HandlerVersion::kV2);
644 secondary_.resetImageHash();
645 sendAndInstallBinaryImage();
646 resetHandlers(HandlerVersion::kV1);
647 secondary_.resetImageHash();
648 sendAndInstallBinaryImage();
650 resetHandlers(HandlerVersion::kV1);
652 resetHandlers(HandlerVersion::kV2);
654 resetHandlers(HandlerVersion::kV1);
659 in_port_t secondary_port = TestUtils::getFreePortAsInt();
660 SecondaryInterface::Ptr ip_secondary;
663 ip_secondary = Uptane::IpUptaneSecondary::connectAndCreate(
"localhost", secondary_port);
664 EXPECT_EQ(ip_secondary,
nullptr);
667 ip_secondary = std::make_shared<Uptane::IpUptaneSecondary>(
"localhost", secondary_port,
Uptane::EcuSerial(
"serial"),
673 config.storage.path = temp_dir.Path();
674 config.pacman.type = PACKAGE_MANAGER_NONE;
675 config.pacman.images_path = temp_dir.Path() /
"images";
676 std::shared_ptr<INvStorage> storage = INvStorage::newStorage(config.storage);
677 std::shared_ptr<PackageManagerInterface> package_manager =
678 PackageManagerFactory::makePackageManager(config.pacman, config.bootloader, storage,
nullptr);
679 std::shared_ptr<SecondaryProvider> secondary_provider =
680 std::make_shared<SecondaryProvider>(config, storage, package_manager);
681 ip_secondary->init(secondary_provider);
684 EXPECT_EQ(ip_secondary->getManifest(), Json::Value());
687 Uptane::Target target = target_file.createTarget(package_manager);
690 EXPECT_FALSE(ip_secondary->putMetadata(target).isSuccess());
691 EXPECT_FALSE(ip_secondary->sendFirmware(target).isSuccess());
692 EXPECT_FALSE(ip_secondary->install(target).isSuccess());
700 : secondary_server_{*
this,
"", 0}, secondary_server_thread_{[&]() { secondary_server_.run(); }} {
701 secondary_server_.wait_until_running();
705 secondary_server_.stop();
706 secondary_server_thread_.join();
710 ReturnCode handleMsg(
const Asn1Message::Ptr& in_msg, Asn1Message::Ptr& out_msg)
override {
712 out_msg->present(AKIpUptaneMes_PR_installResp).installResp()->result = AKInstallationResultCode_ok;
713 return ReturnCode::kOk;
716 AKIpUptaneMes_PR sendInstallMsg() {
719 req->present(AKIpUptaneMes_PR_installReq);
722 auto req_mes = req->installReq();
723 SetString(&req_mes->hash,
"target_name");
725 std::pair<std::string, uint16_t> secondary_server_addr{
"127.0.0.1", secondary_server_.port()};
726 auto resp = Asn1Rpc(req, secondary_server_addr);
728 return resp->present();
733 std::thread secondary_server_thread_;
751 ASSERT_EQ(sendInstallMsg(), AKIpUptaneMes_PR_installResp);
758 uint8_t garbage[] = {0x30, 0x13, 0x02, 0x01, 0x05, 0x16, 0x0e, 0x41, 0x6e, 0x79, 0x62,
759 0x6f, 0x64, 0x79, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x3f};
760 send(*con_sock, garbage,
sizeof(garbage), 0);
764 ASSERT_EQ(sendInstallMsg(), AKIpUptaneMes_PR_installResp);
771 uint8_t garbage[] = {0x30, 0x99, 0x02, 0x01, 0x05, 0x16, 0x0e, 0x41, 0x6e, 0x79,
772 0x62, 0x6f, 0x64, 0x79, 0x20, 0x74, 0x68, 0x72, 0x65, 0x3f};
773 send(*con_sock, garbage,
sizeof(garbage), 0);
777 ASSERT_EQ(sendInstallMsg(), AKIpUptaneMes_PR_installResp);
784 uint8_t garbage[] =
"some garbage message";
785 send(*con_sock, garbage,
sizeof(garbage), 0);
789 ASSERT_EQ(sendInstallMsg(), AKIpUptaneMes_PR_installResp);
792 int main(
int argc,
char** argv) {
793 ::testing::InitGoogleTest(&argc, argv);
796 logger_set_threshold(boost::log::trivial::debug);
798 return RUN_ALL_TESTS();
Metadata version numbers.
static Asn1Message::Ptr Empty()
Create a new Asn1Message, in order to fill it with data and send it.
Configuration object for an aktualizr instance running on a Primary ECU.
Listens on a socket, decodes calls (ASN.1) and forwards them to an Uptane Secondary implementation...
Package installation failed.
Reference counted holder for the top-level ASN1 message structure.
Metadata verification failed.
The Hash class The hash of a file or Uptane metadata.
Results of libaktualizr API calls.