3 #include <gtest/gtest.h>
4 #include <netinet/tcp.h>
6 #include "libaktualizr/packagemanagerfactory.h"
7 #include "libaktualizr/packagemanagerinterface.h"
9 #include "ipuptanesecondary.h"
10 #include "logging/logging.h"
11 #include "msg_handler.h"
12 #include "primary/secondary_provider_builder.h"
13 #include "secondary_tcp_server.h"
14 #include "storage/invstorage.h"
15 #include "test_utils.h"
17 enum class HandlerVersion { kV1, kV2, kV2Failure };
29 const Uptane::Manifest& manifest, HandlerVersion handler_version = HandlerVersion::kV2)
34 image_filepath_{image_dir_ /
"image.bin"},
35 hasher_{MultiPartHasher::create(Hash::Type::kSha256)},
36 handler_version_(handler_version) {
41 const std::string verification_failure =
"Expected verification test failure";
42 const std::string upload_data_failure =
"Expected data upload test failure";
43 const std::string ostree_failure =
"Expected OSTree download test failure";
44 const std::string installation_failure =
"Expected installation test failure";
48 const PublicKey& publicKey()
const {
return pub_key_; }
50 const Uptane::MetaBundle& metadata()
const {
return meta_bundle_; }
51 HandlerVersion handlerVersion()
const {
return handler_version_; }
52 void setHandlerVersion(HandlerVersion handler_version_in) { handler_version_ = handler_version_in; }
53 void registerHandlers() {
54 registerBaseHandlers();
55 if (handler_version_ == HandlerVersion::kV1) {
57 }
else if (handler_version_ == HandlerVersion::kV2) {
60 registerV2FailureHandlers();
64 void resetImageHash()
const { hasher_->reset(); }
65 Hash getReceivedImageHash()
const {
return hasher_->getHash(); }
66 size_t getReceivedImageSize()
const {
return boost::filesystem::file_size(image_filepath_); }
68 const std::string& getReceivedTlsCreds()
const {
return tls_creds_; }
71 void registerBaseHandlers() {
72 registerHandler(AKIpUptaneMes_PR_getInfoReq,
73 std::bind(&SecondaryMock::getInfoHdlr,
this, std::placeholders::_1, std::placeholders::_2));
75 registerHandler(AKIpUptaneMes_PR_versionReq,
76 std::bind(&SecondaryMock::versionHdlr,
this, std::placeholders::_1, std::placeholders::_2));
78 registerHandler(AKIpUptaneMes_PR_manifestReq,
79 std::bind(&SecondaryMock::getManifestHdlr,
this, std::placeholders::_1, std::placeholders::_2));
83 void registerV1Handlers() {
84 registerHandler(AKIpUptaneMes_PR_putMetaReq,
85 std::bind(&SecondaryMock::putMetaHdlr,
this, std::placeholders::_1, std::placeholders::_2));
87 registerHandler(AKIpUptaneMes_PR_sendFirmwareReq,
88 std::bind(&SecondaryMock::sendFirmwareHdlr,
this, std::placeholders::_1, std::placeholders::_2));
90 registerHandler(AKIpUptaneMes_PR_installReq,
91 std::bind(&SecondaryMock::installHdlr,
this, std::placeholders::_1, std::placeholders::_2));
95 void registerV2Handlers() {
96 registerHandler(AKIpUptaneMes_PR_putMetaReq2,
97 std::bind(&SecondaryMock::putMeta2Hdlr,
this, std::placeholders::_1, std::placeholders::_2));
99 registerHandler(AKIpUptaneMes_PR_uploadDataReq,
100 std::bind(&SecondaryMock::uploadDataHdlr,
this, std::placeholders::_1, std::placeholders::_2));
102 registerHandler(AKIpUptaneMes_PR_downloadOstreeRevReq,
103 std::bind(&SecondaryMock::downloadOstreeRev,
this, std::placeholders::_1, std::placeholders::_2));
105 registerHandler(AKIpUptaneMes_PR_installReq,
106 std::bind(&SecondaryMock::install2Hdlr,
this, std::placeholders::_1, std::placeholders::_2));
110 void registerV2FailureHandlers() {
111 registerHandler(AKIpUptaneMes_PR_putMetaReq2,
112 std::bind(&SecondaryMock::putMeta2FailureHdlr,
this, std::placeholders::_1, std::placeholders::_2));
114 registerHandler(AKIpUptaneMes_PR_uploadDataReq, std::bind(&SecondaryMock::uploadDataFailureHdlr,
this,
115 std::placeholders::_1, std::placeholders::_2));
117 registerHandler(AKIpUptaneMes_PR_downloadOstreeRevReq, std::bind(&SecondaryMock::downloadOstreeRevFailure,
this,
118 std::placeholders::_1, std::placeholders::_2));
120 registerHandler(AKIpUptaneMes_PR_installReq,
121 std::bind(&SecondaryMock::install2FailureHdlr,
this, std::placeholders::_1, std::placeholders::_2));
128 out_msg.present(AKIpUptaneMes_PR_getInfoResp);
129 auto info_resp = out_msg.getInfoResp();
131 SetString(&info_resp->ecuSerial, serial_.ToString());
132 SetString(&info_resp->hwId, hdw_id_.ToString());
133 info_resp->keyType =
static_cast<AKIpUptaneKeyType_t
>(pub_key_.Type());
134 SetString(&info_resp->key, pub_key_.Value());
136 return ReturnCode::kOk;
142 out_msg.present(AKIpUptaneMes_PR_versionResp);
143 auto version_resp = out_msg.versionResp();
145 if (handler_version_ == HandlerVersion::kV1) {
146 version_resp->version = 1;
148 version_resp->version = 2;
151 return ReturnCode::kOk;
157 out_msg.present(AKIpUptaneMes_PR_manifestResp);
158 auto manifest_resp = out_msg.manifestResp();
159 manifest_resp->manifest.present = manifest_PR_json;
160 SetString(&manifest_resp->manifest.choice.json, Utils::jsonToStr(manifest()));
162 return ReturnCode::kOk;
167 auto md = in_msg.putMetaReq();
169 meta_bundle_.emplace(std::make_pair(Uptane::RepositoryType::Director(), Uptane::Role::Root()),
170 ToString(md->director.choice.json.root));
171 meta_bundle_.emplace(std::make_pair(Uptane::RepositoryType::Director(), Uptane::Role::Targets()),
172 ToString(md->director.choice.json.targets));
174 meta_bundle_.emplace(std::make_pair(Uptane::RepositoryType::Image(), Uptane::Role::Root()),
175 ToString(md->image.choice.json.root));
176 meta_bundle_.emplace(std::make_pair(Uptane::RepositoryType::Image(), Uptane::Role::Timestamp()),
177 ToString(md->image.choice.json.timestamp));
178 meta_bundle_.emplace(std::make_pair(Uptane::RepositoryType::Image(), Uptane::Role::Snapshot()),
179 ToString(md->image.choice.json.snapshot));
180 meta_bundle_.emplace(std::make_pair(Uptane::RepositoryType::Image(), Uptane::Role::Targets()),
181 ToString(md->image.choice.json.targets));
183 out_msg.present(AKIpUptaneMes_PR_putMetaResp).putMetaResp()->result = AKInstallationResult_success;
185 return ReturnCode::kOk;
190 auto md = in_msg.putMetaReq2();
191 Uptane::MetaBundle meta_bundle;
193 EXPECT_EQ(md->directorRepo.present, directorRepo_PR_collection);
195 const int director_meta_count = md->directorRepo.choice.collection.list.count;
196 EXPECT_EQ(director_meta_count, 2);
197 for (
int i = 0; i < director_meta_count; i++) {
199 const AKMetaJson_t
object = *md->directorRepo.choice.collection.list.array[i];
200 const std::string role = ToString(
object.role);
201 std::string json = ToString(
object.json);
202 if (role == Uptane::Role::ROOT) {
203 meta_bundle.emplace(std::make_pair(Uptane::RepositoryType::Director(), Uptane::Role::Root()), std::move(json));
204 }
else if (role == Uptane::Role::TARGETS) {
205 meta_bundle.emplace(std::make_pair(Uptane::RepositoryType::Director(), Uptane::Role::Targets()),
210 EXPECT_EQ(md->imageRepo.present, imageRepo_PR_collection);
212 const int image_meta_count = md->imageRepo.choice.collection.list.count;
213 EXPECT_EQ(image_meta_count, 4);
214 for (
int i = 0; i < image_meta_count; i++) {
216 const AKMetaJson_t
object = *md->imageRepo.choice.collection.list.array[i];
217 const std::string role = ToString(
object.role);
218 std::string json = ToString(
object.json);
219 if (role == Uptane::Role::ROOT) {
220 meta_bundle.emplace(std::make_pair(Uptane::RepositoryType::Image(), Uptane::Role::Root()), std::move(json));
221 }
else if (role == Uptane::Role::TIMESTAMP) {
222 meta_bundle.emplace(std::make_pair(Uptane::RepositoryType::Image(), Uptane::Role::Timestamp()),
224 }
else if (role == Uptane::Role::SNAPSHOT) {
225 meta_bundle.emplace(std::make_pair(Uptane::RepositoryType::Image(), Uptane::Role::Snapshot()), std::move(json));
226 }
else if (role == Uptane::Role::TARGETS) {
227 meta_bundle.emplace(std::make_pair(Uptane::RepositoryType::Image(), Uptane::Role::Targets()), std::move(json));
233 auto m = out_msg.present(AKIpUptaneMes_PR_putMetaResp2).putMetaResp2();
234 m->result =
static_cast<AKInstallationResultCode_t
>(
result.result_code.num_code);
235 SetString(&m->description,
result.description);
237 return ReturnCode::kOk;
243 auto m = out_msg.present(AKIpUptaneMes_PR_putMetaResp2).putMetaResp2();
245 SetString(&m->description, verification_failure);
247 return ReturnCode::kOk;
251 auto result = install(ToString(in_msg.installReq()->hash)).result_code.num_code;
253 out_msg.present(AKIpUptaneMes_PR_installResp).installResp()->result =
254 static_cast<AKInstallationResultCode_t
>(
result);
256 if (data::ResultCode::Numeric::kNeedCompletion ==
result) {
257 return ReturnCode::kRebootRequired;
260 return ReturnCode::kOk;
264 auto result = install(ToString(in_msg.installReq()->hash));
266 auto m = out_msg.present(AKIpUptaneMes_PR_installResp2).installResp2();
267 m->result =
static_cast<AKInstallationResultCode_t
>(
result.result_code.num_code);
268 SetString(&m->description,
result.description);
270 if (data::ResultCode::Numeric::kNeedCompletion ==
result.result_code.num_code) {
271 return ReturnCode::kRebootRequired;
274 return ReturnCode::kOk;
280 auto m = out_msg.present(AKIpUptaneMes_PR_installResp2).installResp2();
282 SetString(&m->description, installation_failure);
284 return ReturnCode::kOk;
288 if (in_msg.uploadDataReq()->data.size < 0) {
289 out_msg.present(AKIpUptaneMes_PR_uploadDataResp).uploadDataResp()->result = AKInstallationResult_failure;
290 return ReturnCode::kOk;
293 size_t data_size =
static_cast<size_t>(in_msg.uploadDataReq()->data.size);
294 auto result = receiveImageData(in_msg.uploadDataReq()->data.buf, data_size);
296 auto m = out_msg.present(AKIpUptaneMes_PR_uploadDataResp).uploadDataResp();
297 m->result =
static_cast<AKInstallationResultCode_t
>(
result.result_code.num_code);
298 SetString(&m->description,
result.description);
300 return ReturnCode::kOk;
306 auto m = out_msg.present(AKIpUptaneMes_PR_uploadDataResp).uploadDataResp();
308 SetString(&m->description, upload_data_failure);
310 return ReturnCode::kOk;
314 received_firmware_data_ = ToString(in_msg.sendFirmwareReq()->firmware);
315 out_msg.present(AKIpUptaneMes_PR_sendFirmwareResp).sendFirmwareResp()->result = AKInstallationResult_success;
317 return ReturnCode::kOk;
321 tls_creds_ = ToString(in_msg.downloadOstreeRevReq()->tlsCred);
322 auto m = out_msg.present(AKIpUptaneMes_PR_downloadOstreeRevResp).downloadOstreeRevResp();
323 m->result =
static_cast<AKInstallationResultCode_t
>(data::ResultCode::Numeric::kOk);
324 SetString(&m->description,
"");
326 return ReturnCode::kOk;
332 auto m = out_msg.present(AKIpUptaneMes_PR_downloadOstreeRevResp).downloadOstreeRevResp();
334 SetString(&m->description, ostree_failure);
336 return ReturnCode::kOk;
340 meta_bundle_ = meta_bundle;
345 std::ofstream target_file(image_filepath_.c_str(), std::ofstream::out | std::ofstream::binary | std::ofstream::app);
347 target_file.write(
reinterpret_cast<const char*
>(
data),
static_cast<std::streamsize
>(size));
348 hasher_->update(
data, size);
355 if (!received_firmware_data_.empty()) {
357 if (target_name ==
"OSTREE") {
358 tls_creds_ = received_firmware_data_;
359 }
else if (handler_version_ == HandlerVersion::kV1) {
361 receiveImageData(
reinterpret_cast<const uint8_t*
>(received_firmware_data_.c_str()),
362 received_firmware_data_.size());
374 Uptane::MetaBundle meta_bundle_;
377 boost::filesystem::path image_filepath_;
378 std::shared_ptr<MultiPartHasher> hasher_;
379 std::unordered_map<unsigned int, Handler> handler_map_;
380 std::string tls_creds_;
381 std::string received_firmware_data_;
382 HandlerVersion handler_version_;
387 TargetFile(
const std::string filename,
size_t size = 1024, Hash::Type hash_type = Hash::Type::kSha256)
389 image_filepath_{target_dir_ / filename},
390 image_hash_{generateRandomFile(image_filepath_, size, hash_type)} {}
392 std::string path()
const {
return image_filepath_.string(); }
393 const Hash& hash()
const {
return image_hash_; }
394 const size_t& size()
const {
return image_size_; }
396 static Hash generateRandomFile(
const boost::filesystem::path& filepath,
size_t size, Hash::Type hash_type) {
397 auto hasher = MultiPartHasher::create(hash_type);
398 std::ofstream file{filepath.string(), std::ofstream::binary};
400 if (!file.is_open() || !file.good()) {
401 throw std::runtime_error(
"Failed to create a file: " + filepath.string());
404 const unsigned char symbols[] =
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv";
405 unsigned char cur_symbol;
407 for (
unsigned int ii = 0; ii < size; ++ii) {
408 cur_symbol = symbols[
static_cast<unsigned int>(rand()) %
sizeof(symbols)];
409 file.put(
static_cast<char>(cur_symbol));
410 hasher->update(&cur_symbol,
sizeof(cur_symbol));
414 return hasher->getHash();
417 Uptane::Target createTarget(std::shared_ptr<PackageManagerInterface>& package_manager_) {
418 Json::Value target_json;
419 target_json[
"custom"][
"targetFormat"] =
"BINARY";
420 target_json[
"hashes"][
"sha256"] = hash().HashString();
421 target_json[
"length"] = size();
424 auto fhandle = package_manager_->createTargetFile(target);
425 const std::string content = Utils::readFile(path());
426 fhandle.write(
const_cast<char*
>(content.c_str()),
static_cast<std::streamsize
>(size()));
434 const size_t image_size_;
435 boost::filesystem::path image_filepath_;
441 const std::string ca_ =
"ca";
442 const std::string cert_ =
"cert";
443 const std::string pkey_ =
"pkey";
444 const std::string server_ =
"ostree-server";
445 const std::string director_root_ =
"director-root";
446 const std::string director_targets_ =
"director-targets";
447 const std::string image_root_ =
"image-root";
448 const std::string image_timestamp_ =
"image-timestamp";
449 const std::string image_snapshot_ =
"image-snapshot";
450 const std::string image_targets_ =
"image-targets";
456 secondary_server_{secondary_,
"", 0},
457 secondary_server_thread_{std::bind(&SecondaryRpcCommon::runSecondaryServer,
this)},
458 image_file_{
"mytarget_image.img", image_size} {
459 secondary_server_.wait_until_running();
460 ip_secondary_ = Uptane::IpUptaneSecondary::connectAndCreate(
"localhost", secondary_server_.port());
462 config_.pacman.ostree_server = server_;
463 config_.pacman.type = PACKAGE_MANAGER_NONE;
464 config_.pacman.images_path = temp_dir_.Path() /
"images";
465 config_.storage.path = temp_dir_.Path();
467 storage_ = INvStorage::newStorage(config_.storage);
468 storage_->storeTlsCreds(ca_, cert_, pkey_);
469 storage_->storeRoot(director_root_, Uptane::RepositoryType::Director(),
Uptane::Version(1));
470 storage_->storeNonRoot(director_targets_, Uptane::RepositoryType::Director(), Uptane::Role::Targets());
471 storage_->storeRoot(image_root_, Uptane::RepositoryType::Image(),
Uptane::Version(1));
472 storage_->storeNonRoot(image_timestamp_, Uptane::RepositoryType::Image(), Uptane::Role::Timestamp());
473 storage_->storeNonRoot(image_snapshot_, Uptane::RepositoryType::Image(), Uptane::Role::Snapshot());
474 storage_->storeNonRoot(image_targets_, Uptane::RepositoryType::Image(), Uptane::Role::Targets());
476 package_manager_ = PackageManagerFactory::makePackageManager(config_.pacman, config_.bootloader, storage_,
nullptr);
477 secondary_provider_ = SecondaryProviderBuilder::Build(config_, storage_, package_manager_);
478 ip_secondary_->init(secondary_provider_);
482 secondary_server_.stop();
483 secondary_server_thread_.join();
486 void runSecondaryServer() { secondary_server_.
run(); }
488 void resetHandlers(HandlerVersion handler_version) {
489 secondary_.setHandlerVersion(handler_version);
490 secondary_.registerHandlers();
493 void verifyMetadata(
const Uptane::MetaBundle& meta_bundle) {
494 EXPECT_EQ(Uptane::getMetaFromBundle(meta_bundle, Uptane::RepositoryType::Director(), Uptane::Role::Root()),
496 EXPECT_EQ(Uptane::getMetaFromBundle(meta_bundle, Uptane::RepositoryType::Director(), Uptane::Role::Targets()),
498 EXPECT_EQ(Uptane::getMetaFromBundle(meta_bundle, Uptane::RepositoryType::Image(), Uptane::Role::Root()),
500 EXPECT_EQ(Uptane::getMetaFromBundle(meta_bundle, Uptane::RepositoryType::Image(), Uptane::Role::Timestamp()),
502 EXPECT_EQ(Uptane::getMetaFromBundle(meta_bundle, Uptane::RepositoryType::Image(), Uptane::Role::Snapshot()),
504 EXPECT_EQ(Uptane::getMetaFromBundle(meta_bundle, Uptane::RepositoryType::Image(), Uptane::Role::Targets()),
508 void sendAndInstallBinaryImage() {
509 Uptane::Target target = image_file_.createTarget(package_manager_);
510 const HandlerVersion handler_version = secondary_.handlerVersion();
513 if (handler_version == HandlerVersion::kV2Failure) {
515 EXPECT_EQ(
result.description, secondary_.verification_failure);
517 EXPECT_TRUE(
result.isSuccess());
518 verifyMetadata(secondary_.metadata());
521 result = ip_secondary_->sendFirmware(target);
522 if (handler_version == HandlerVersion::kV2Failure) {
524 EXPECT_EQ(
result.description, secondary_.upload_data_failure);
526 EXPECT_TRUE(
result.isSuccess());
529 result = ip_secondary_->install(target);
530 if (handler_version == HandlerVersion::kV2Failure) {
532 EXPECT_EQ(
result.description, secondary_.installation_failure);
534 EXPECT_TRUE(
result.isSuccess());
535 EXPECT_EQ(image_file_.hash(), secondary_.getReceivedImageHash());
539 void installOstreeRev() {
540 Json::Value target_json;
541 target_json[
"custom"][
"targetFormat"] =
"OSTREE";
544 const HandlerVersion handler_version = secondary_.handlerVersion();
547 if (handler_version == HandlerVersion::kV2Failure) {
549 EXPECT_EQ(
result.description, secondary_.verification_failure);
551 EXPECT_TRUE(
result.isSuccess());
552 verifyMetadata(secondary_.metadata());
555 result = ip_secondary_->sendFirmware(target);
556 if (handler_version == HandlerVersion::kV2Failure) {
558 EXPECT_EQ(
result.description, secondary_.ostree_failure);
560 EXPECT_TRUE(
result.isSuccess());
563 result = ip_secondary_->install(target);
564 if (handler_version == HandlerVersion::kV2Failure) {
566 EXPECT_EQ(
result.description, secondary_.installation_failure);
568 EXPECT_TRUE(
result.isSuccess());
569 std::string archive = secondary_.getReceivedTlsCreds();
571 std::stringstream as(archive);
572 EXPECT_EQ(ca_, Utils::readFileFromArchive(as,
"ca.pem"));
575 std::stringstream as(archive);
576 EXPECT_EQ(cert_, Utils::readFileFromArchive(as,
"client.pem"));
579 std::stringstream as(archive);
580 EXPECT_EQ(pkey_, Utils::readFileFromArchive(as,
"pkey.pem"));
583 std::stringstream as(archive);
584 EXPECT_EQ(server_, Utils::readFileFromArchive(as,
"server.url",
true));
590 std::shared_ptr<SecondaryProvider> secondary_provider_;
592 std::thread secondary_server_thread_;
594 SecondaryInterface::Ptr ip_secondary_;
596 std::shared_ptr<INvStorage> storage_;
598 std::shared_ptr<PackageManagerInterface> package_manager_;
602 public ::testing::WithParamInterface<std::pair<size_t, HandlerVersion>> {
610 ASSERT_TRUE(ip_secondary_ !=
nullptr) <<
"Failed to create IP Secondary";
611 EXPECT_EQ(ip_secondary_->getSerial(), secondary_.serial());
612 EXPECT_EQ(ip_secondary_->getHwId(), secondary_.hwID());
613 EXPECT_EQ(ip_secondary_->getPublicKey(), secondary_.publicKey());
614 EXPECT_EQ(ip_secondary_->getManifest(), secondary_.manifest());
616 sendAndInstallBinaryImage();
624 INSTANTIATE_TEST_SUITE_P(
626 ::testing::Values(std::make_pair(1, HandlerVersion::kV2), std::make_pair(1024, HandlerVersion::kV2),
627 std::make_pair(1024 - 1, HandlerVersion::kV2), std::make_pair(1024 + 1, HandlerVersion::kV2),
628 std::make_pair(1024 * 10 + 1, HandlerVersion::kV2), std::make_pair(1, HandlerVersion::kV1),
629 std::make_pair(1024, HandlerVersion::kV1), std::make_pair(1024 - 1, HandlerVersion::kV1),
630 std::make_pair(1024 + 1, HandlerVersion::kV1), std::make_pair(1024 * 10 + 1, HandlerVersion::kV1),
631 std::make_pair(1024, HandlerVersion::kV2Failure)));
641 ASSERT_TRUE(ip_secondary_ !=
nullptr) <<
"Failed to create IP Secondary";
643 sendAndInstallBinaryImage();
644 resetHandlers(HandlerVersion::kV2);
645 secondary_.resetImageHash();
646 sendAndInstallBinaryImage();
647 resetHandlers(HandlerVersion::kV1);
648 secondary_.resetImageHash();
649 sendAndInstallBinaryImage();
651 resetHandlers(HandlerVersion::kV1);
653 resetHandlers(HandlerVersion::kV2);
655 resetHandlers(HandlerVersion::kV1);
660 in_port_t secondary_port = TestUtils::getFreePortAsInt();
661 SecondaryInterface::Ptr ip_secondary;
664 ip_secondary = Uptane::IpUptaneSecondary::connectAndCreate(
"localhost", secondary_port);
665 EXPECT_EQ(ip_secondary,
nullptr);
668 ip_secondary = std::make_shared<Uptane::IpUptaneSecondary>(
"localhost", secondary_port,
Uptane::EcuSerial(
"serial"),
674 config.storage.path = temp_dir.Path();
675 config.pacman.type = PACKAGE_MANAGER_NONE;
676 config.pacman.images_path = temp_dir.Path() /
"images";
677 std::shared_ptr<INvStorage> storage = INvStorage::newStorage(config.storage);
678 std::shared_ptr<PackageManagerInterface> package_manager =
679 PackageManagerFactory::makePackageManager(config.pacman, config.bootloader, storage,
nullptr);
680 std::shared_ptr<SecondaryProvider> secondary_provider =
681 SecondaryProviderBuilder::Build(config, storage, package_manager);
682 ip_secondary->init(secondary_provider);
685 EXPECT_EQ(ip_secondary->getManifest(), Json::Value());
688 Uptane::Target target = target_file.createTarget(package_manager);
691 EXPECT_FALSE(ip_secondary->putMetadata(target).isSuccess());
692 EXPECT_FALSE(ip_secondary->sendFirmware(target).isSuccess());
693 EXPECT_FALSE(ip_secondary->install(target).isSuccess());
701 : secondary_server_{*
this,
"", 0}, secondary_server_thread_{[&]() { secondary_server_.
run(); }} {
702 secondary_server_.wait_until_running();
706 secondary_server_.stop();
707 secondary_server_thread_.join();
711 ReturnCode handleMsg(
const Asn1Message::Ptr& in_msg, Asn1Message::Ptr& out_msg)
override {
713 out_msg->present(AKIpUptaneMes_PR_installResp).installResp()->result = AKInstallationResultCode_ok;
714 return ReturnCode::kOk;
717 AKIpUptaneMes_PR sendInstallMsg() {
720 req->present(AKIpUptaneMes_PR_installReq);
723 auto req_mes = req->installReq();
724 SetString(&req_mes->hash,
"target_name");
726 std::pair<std::string, uint16_t> secondary_server_addr{
"127.0.0.1", secondary_server_.port()};
727 auto resp = Asn1Rpc(req, secondary_server_addr);
729 return resp->present();
734 std::thread secondary_server_thread_;
752 ASSERT_EQ(sendInstallMsg(), AKIpUptaneMes_PR_installResp);
759 uint8_t garbage[] = {0x30, 0x13, 0x02, 0x01, 0x05, 0x16, 0x0e, 0x41, 0x6e, 0x79, 0x62,
760 0x6f, 0x64, 0x79, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x3f};
761 send(*con_sock, garbage,
sizeof(garbage), 0);
765 ASSERT_EQ(sendInstallMsg(), AKIpUptaneMes_PR_installResp);
772 uint8_t garbage[] = {0x30, 0x99, 0x02, 0x01, 0x05, 0x16, 0x0e, 0x41, 0x6e, 0x79,
773 0x62, 0x6f, 0x64, 0x79, 0x20, 0x74, 0x68, 0x72, 0x65, 0x3f};
774 send(*con_sock, garbage,
sizeof(garbage), 0);
778 ASSERT_EQ(sendInstallMsg(), AKIpUptaneMes_PR_installResp);
785 uint8_t garbage[] =
"some garbage message";
786 send(*con_sock, garbage,
sizeof(garbage), 0);
790 ASSERT_EQ(sendInstallMsg(), AKIpUptaneMes_PR_installResp);
793 int main(
int argc,
char** argv) {
794 ::testing::InitGoogleTest(&argc, argv);
797 logger_set_threshold(boost::log::trivial::debug);
799 return RUN_ALL_TESTS();