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 = PackageManager::kNone;
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(); }
39 AktualizrSecondary::Ptr _secondary;
40 std::shared_ptr<INvStorage> _storage;
47 Metadata addImageFile(
const std::string& targetname,
const std::string& hardware_id,
const std::string& serial,
48 bool add_and_sign_target =
true) {
49 const auto image_file_path = _root_dir / targetname;
50 boost::filesystem::ofstream(image_file_path) <<
"some data";
52 _uptane_repo.addImage(image_file_path, targetname, hardware_id,
"",
Delegation());
53 if (add_and_sign_target) {
54 _uptane_repo.addTarget(targetname, hardware_id, serial,
"");
55 _uptane_repo.signTargets();
58 return getCurrentMetadata();
64 boost::filesystem::load_string_file(_director_dir /
"root.json", metadata.director_root);
65 boost::filesystem::load_string_file(_director_dir /
"targets.json", metadata.director_targets);
67 boost::filesystem::load_string_file(_imagerepo_dir /
"root.json", metadata.image_root);
68 boost::filesystem::load_string_file(_imagerepo_dir /
"timestamp.json", metadata.image_timestamp);
69 boost::filesystem::load_string_file(_imagerepo_dir /
"snapshot.json", metadata.image_snapshot);
70 boost::filesystem::load_string_file(_imagerepo_dir /
"targets.json", metadata.image_targets);
75 std::string getImageData(
const std::string& targetname)
const {
76 std::string image_data;
77 boost::filesystem::load_string_file(_root_dir / targetname, image_data);
85 boost::filesystem::path _director_dir{_root_dir /
"repo/director"};
86 boost::filesystem::path _imagerepo_dir{_root_dir /
"repo/repo"};
87 UptaneRepo _uptane_repo{_root_dir.Path(),
"",
""};
93 _uptane_repo.addImageFile(_default_target, _secondary->getHwId().ToString(), _secondary->getSerial().ToString());
96 std::string getImageData(
const std::string& targetname = _default_target)
const {
97 return _uptane_repo.getImageData(targetname);
101 static constexpr
const char*
const _default_target{
"defaulttarget"};
107 public ::testing::WithParamInterface<std::pair<Uptane::RepositoryType, Uptane::Role>> {
113 :
Metadata(valid_metadata), _repo_type(repo), _role(role) {}
117 auto return_val = Metadata::getRoleMetadata(
result, repo, role, version);
118 if (!(_repo_type == repo && _role == role)) {
132 return MetadataInvalidator(_uptane_repo.getCurrentMetadata(), GetParam().first, GetParam().second);
142 TEST_P(
SecondaryTestNegative, MalformedMetadaJson) { EXPECT_FALSE(_secondary->putMetadata(currentMetadata())); }
149 ::testing::Values(std::make_pair(Uptane::RepositoryType::Director(), Uptane::Role::Root()),
150 std::make_pair(Uptane::RepositoryType::Director(), Uptane::Role::Targets()),
151 std::make_pair(Uptane::RepositoryType::Image(), Uptane::Role::Root()),
152 std::make_pair(Uptane::RepositoryType::Image(), Uptane::Role::Timestamp()),
153 std::make_pair(Uptane::RepositoryType::Image(), Uptane::Role::Snapshot()),
154 std::make_pair(Uptane::RepositoryType::Image(), Uptane::Role::Targets())));
157 EXPECT_TRUE(_secondary->putMetadata(_uptane_repo.getCurrentMetadata()));
158 EXPECT_TRUE(_secondary->sendFirmware(getImageData()));
159 EXPECT_EQ(_secondary->install(_default_target), data::ResultCode::Numeric::kOk);
165 _uptane_repo.addImageFile(
"second_image_00", _secondary->getHwId().ToString(), _secondary->getSerial().ToString(),
167 EXPECT_TRUE(_secondary->putMetadata(_uptane_repo.getCurrentMetadata()));
173 _uptane_repo.addImageFile(
"second_target", _secondary->getHwId().ToString(), _secondary->getSerial().ToString());
175 EXPECT_FALSE(_secondary->putMetadata(_uptane_repo.getCurrentMetadata()));
181 UptaneRepoWrapper().addImageFile(
"mytarget", _secondary->getHwId().ToString(),
"non-existing-serial");
183 EXPECT_FALSE(_secondary->putMetadata(metadata));
189 UptaneRepoWrapper().addImageFile(
"mytarget",
"non-existig-hwid", _secondary->getSerial().ToString());
191 EXPECT_FALSE(_secondary->putMetadata(metadata));
196 _uptane_repo.refreshRoot(Uptane::RepositoryType::Director());
197 EXPECT_TRUE(_secondary->putMetadata(_uptane_repo.getCurrentMetadata()));
201 _uptane_repo.refreshRoot(Uptane::RepositoryType::Image());
202 EXPECT_TRUE(_secondary->putMetadata(_uptane_repo.getCurrentMetadata()));
206 EXPECT_TRUE(_secondary->putMetadata(_uptane_repo.getCurrentMetadata()));
207 auto image_data = getImageData();
208 image_data.append(
"\n");
209 EXPECT_FALSE(_secondary->sendFirmware(image_data));
213 EXPECT_TRUE(_secondary->putMetadata(_uptane_repo.getCurrentMetadata()));
214 auto image_data = getImageData();
215 image_data.operator[](3) =
'0';
216 EXPECT_FALSE(_secondary->sendFirmware(image_data));
221 int main(
int argc,
char** argv) {
222 ::testing::InitGoogleTest(&argc, argv);
225 logger_set_threshold(boost::log::trivial::info);
227 return RUN_ALL_TESTS();