1 #include <gtest/gtest.h>
3 #include <boost/process.hpp>
5 #include "aktualizr_secondary.h"
6 #include "aktualizr_secondary_factory.h"
7 #include "test_utils.h"
8 #include "uptane_repo.h"
14 config.pacman.type = PACKAGE_MANAGER_NONE;
16 config.storage.path = _storage_dir.Path();
17 config.storage.type = StorageType::kSqlite;
19 _storage = INvStorage::newStorage(config.storage);
20 _secondary = AktualizrSecondaryFactory::create(config, _storage);
24 std::shared_ptr<AktualizrSecondary>& operator->() {
return _secondary; }
27 boost::optional<Uptane::Target> pending_target;
29 _storage->loadInstalledVersions(_secondary->getSerial().ToString(),
nullptr, &pending_target);
30 return *pending_target;
33 std::string hardwareID()
const {
return _secondary->getHwId().ToString(); }
35 std::string serial()
const {
return _secondary->getSerial().ToString(); }
37 boost::filesystem::path targetFilepath()
const {
38 return _storage_dir.Path() / AktualizrSecondaryFactory::BinaryUpdateDefaultFile;
43 AktualizrSecondary::Ptr _secondary;
44 std::shared_ptr<INvStorage> _storage;
51 Metadata addImageFile(
const std::string& targetname,
const std::string& hardware_id,
const std::string& serial,
52 bool add_and_sign_target =
true) {
53 const auto image_file_path = _root_dir / targetname;
54 boost::filesystem::ofstream(image_file_path) <<
"some data";
56 _uptane_repo.addImage(image_file_path, targetname, hardware_id,
"",
Delegation());
57 if (add_and_sign_target) {
58 _uptane_repo.addTarget(targetname, hardware_id, serial,
"");
59 _uptane_repo.signTargets();
62 return getCurrentMetadata();
68 boost::filesystem::load_string_file(_director_dir /
"root.json", metadata.director_root);
69 boost::filesystem::load_string_file(_director_dir /
"targets.json", metadata.director_targets);
71 boost::filesystem::load_string_file(_imagerepo_dir /
"root.json", metadata.image_root);
72 boost::filesystem::load_string_file(_imagerepo_dir /
"timestamp.json", metadata.image_timestamp);
73 boost::filesystem::load_string_file(_imagerepo_dir /
"snapshot.json", metadata.image_snapshot);
74 boost::filesystem::load_string_file(_imagerepo_dir /
"targets.json", metadata.image_targets);
79 std::string getImageData(
const std::string& targetname)
const {
80 std::string image_data;
81 boost::filesystem::load_string_file(_root_dir / targetname, image_data);
89 boost::filesystem::path _director_dir{_root_dir /
"repo/director"};
90 boost::filesystem::path _imagerepo_dir{_root_dir /
"repo/repo"};
91 UptaneRepo _uptane_repo{_root_dir.Path(),
"",
""};
98 _uptane_repo.addImageFile(_default_target, _secondary->getHwId().ToString(), _secondary->getSerial().ToString());
101 std::string getImageData(
const std::string& targetname = _default_target)
const {
102 return _uptane_repo.getImageData(targetname);
105 std::vector<Uptane::Target> getCurrentTargets() {
106 auto targets =
Uptane::Targets(Utils::parseJSON(_uptane_repo.getCurrentMetadata().director_targets));
107 return targets.getTargets(_secondary->getSerial(), _secondary->getHwId());
111 auto targets = getCurrentTargets();
112 EXPECT_GT(targets.size(), 0);
117 return Uptane::Hash(Uptane::Hash::Type::kSha256, getDefaultTarget().sha256Hash());
121 static constexpr
const char*
const _default_target{
"default-target"};
127 public ::testing::WithParamInterface<std::pair<Uptane::RepositoryType, Uptane::Role>> {
133 :
Metadata(valid_metadata), _repo_type(repo), _role(role) {}
137 auto return_val = Metadata::getRoleMetadata(
result, repo, role, version);
138 if (!(_repo_type == repo && _role == role)) {
152 return MetadataInvalidator(_uptane_repo.getCurrentMetadata(), GetParam().first, GetParam().second);
169 TEST_P(
SecondaryTestNegative, MalformedMetadaJson) { EXPECT_FALSE(_secondary->putMetadata(currentMetadata())); }
176 ::testing::Values(std::make_pair(Uptane::RepositoryType::Director(), Uptane::Role::Root()),
177 std::make_pair(Uptane::RepositoryType::Director(), Uptane::Role::Targets()),
178 std::make_pair(Uptane::RepositoryType::Image(), Uptane::Role::Root()),
179 std::make_pair(Uptane::RepositoryType::Image(), Uptane::Role::Timestamp()),
180 std::make_pair(Uptane::RepositoryType::Image(), Uptane::Role::Snapshot()),
181 std::make_pair(Uptane::RepositoryType::Image(), Uptane::Role::Targets())));
184 ASSERT_TRUE(_secondary->putMetadata(_uptane_repo.getCurrentMetadata()));
185 ASSERT_TRUE(_secondary->sendFirmware(getImageData()));
186 ASSERT_EQ(_secondary->install(_default_target), data::ResultCode::Numeric::kOk);
189 ASSERT_TRUE(boost::filesystem::exists(_secondary.targetFilepath()));
190 auto target = getDefaultTarget();
193 auto target_hash =
Uptane::Hash(Uptane::Hash::Type::kSha256, target.sha256Hash());
194 auto target_file_hash =
195 Uptane::Hash::generate(Uptane::Hash::Type::kSha256, Utils::readFile(_secondary.targetFilepath()));
196 EXPECT_EQ(target_hash, target_file_hash);
199 auto manifest = _secondary->getManifest();
200 EXPECT_EQ(manifest.installedImageHash(), target_file_hash);
201 EXPECT_EQ(manifest.filepath(), target.filename());
207 _uptane_repo.addImageFile(
"second_image_00", _secondary->getHwId().ToString(), _secondary->getSerial().ToString(),
209 EXPECT_TRUE(_secondary->putMetadata(_uptane_repo.getCurrentMetadata()));
215 _uptane_repo.addImageFile(
"second_target", _secondary->getHwId().ToString(), _secondary->getSerial().ToString());
217 EXPECT_FALSE(_secondary->putMetadata(_uptane_repo.getCurrentMetadata()));
223 UptaneRepoWrapper().addImageFile(
"mytarget", _secondary->getHwId().ToString(),
"non-existing-serial");
225 EXPECT_FALSE(_secondary->putMetadata(metadata));
231 UptaneRepoWrapper().addImageFile(
"mytarget",
"non-existig-hwid", _secondary->getSerial().ToString());
233 EXPECT_FALSE(_secondary->putMetadata(metadata));
238 _uptane_repo.refreshRoot(Uptane::RepositoryType::Director());
239 EXPECT_TRUE(_secondary->putMetadata(_uptane_repo.getCurrentMetadata()));
243 _uptane_repo.refreshRoot(Uptane::RepositoryType::Image());
244 EXPECT_TRUE(_secondary->putMetadata(_uptane_repo.getCurrentMetadata()));
248 EXPECT_TRUE(_secondary->putMetadata(_uptane_repo.getCurrentMetadata()));
249 auto image_data = getImageData();
250 image_data.append(
"\n");
251 EXPECT_FALSE(_secondary->sendFirmware(image_data));
255 EXPECT_TRUE(_secondary->putMetadata(_uptane_repo.getCurrentMetadata()));
256 auto image_data = getImageData();
257 image_data.operator[](3) =
'0';
258 EXPECT_FALSE(_secondary->sendFirmware(image_data));
261 int main(
int argc,
char** argv) {
262 ::testing::InitGoogleTest(&argc, argv);
265 logger_set_threshold(boost::log::trivial::info);
267 return RUN_ALL_TESTS();