1 #include <gtest/gtest.h>
8 #include <boost/filesystem.hpp>
10 #include "crypto/keymanager.h"
12 #include "libaktualizr/config.h"
14 #include "package_manager/packagemanagerfake.h"
15 #include "storage/invstorage.h"
16 #include "uptane/fetcher.h"
17 #include "uptane/tuf.h"
18 #include "utilities/utils.h"
24 config.pacman.type = PACKAGE_MANAGER_NONE;
25 config.pacman.images_path = temp_dir.Path() /
"images";
26 config.storage.path = temp_dir.Path();
28 auto storage = INvStorage::newStorage(config.storage);
31 Json::Value target_json;
32 target_json[
"hashes"][
"sha256"] =
"D9CD8155764C3543F10FAD8A480D743137466F8D55213C8EAEFCD12F06D43A80";
36 auto out = pacman.createTargetFile(target);
40 auto in = pacman.openTargetFile(target);
43 ASSERT_EQ(ss.str(),
"a");
46 auto out = pacman.appendTargetFile(target);
50 auto in = pacman.openTargetFile(target);
53 ASSERT_EQ(ss.str(),
"aa");
57 auto out = pacman.createTargetFile(target);
61 auto in = pacman.openTargetFile(target);
64 ASSERT_EQ(ss.str(),
"a");
67 pacman.removeTargetFile(target);
68 EXPECT_THROW(pacman.appendTargetFile(target), std::runtime_error);
69 EXPECT_THROW(pacman.openTargetFile(target), std::runtime_error);
76 config.pacman.type = PACKAGE_MANAGER_NONE;
77 config.pacman.images_path = temp_dir.Path() /
"images";
78 config.storage.path = temp_dir.Path();
80 auto storage = INvStorage::newStorage(config.storage);
83 Json::Value target_json;
84 target_json[
"hashes"][
"sha256"] =
"D9CD8155764C3543F10FAD8A480D743137466F8D55213C8EAEFCD12F06D43A80";
86 target_json[
"hashes"][
"sha256"] =
"A81C31AC62620B9215A14FF00544CB07A55B765594F3AB3BE77E70923AE27CF1";
89 pacman.createTargetFile(t1);
90 pacman.createTargetFile(t2);
92 auto targets = pacman.getTargetFiles();
93 ASSERT_EQ(targets.size(), 2);
94 ASSERT_EQ(targets.at(0).filename(),
"aa.bin");
95 ASSERT_EQ(targets.at(1).filename(),
"bb.bin");
97 pacman.removeTargetFile(t1);
98 targets = pacman.getTargetFiles();
99 ASSERT_EQ(targets.size(), 1);
100 ASSERT_EQ(targets.at(0).filename(),
"bb.bin");
101 EXPECT_FALSE(boost::filesystem::exists(temp_dir.Path() /
"images" /
102 "D9CD8155764C3543F10FAD8A480D743137466F8D55213C8EAEFCD12F06D43A80"));
103 EXPECT_TRUE(boost::filesystem::exists(temp_dir.Path() /
"images" /
104 "A81C31AC62620B9215A14FF00544CB07A55B765594F3AB3BE77E70923AE27CF1"));
117 config.pacman.type = PACKAGE_MANAGER_NONE;
118 config.pacman.images_path = temp_dir.Path() /
"images";
119 config.storage.path = temp_dir.Path();
120 std::shared_ptr<INvStorage> storage = INvStorage::newStorage(config.storage);
123 const int length = 4;
124 char content[length];
125 memcpy(content,
"good", length);
127 hasher.update(
reinterpret_cast<uint8_t *
>(content), length);
128 const std::string hash = hasher.getHexDigest();
129 Uptane::Target target(
"some-pkg", primary_ecu, {
Hash(Hash::Type::kSha256, hash)}, length,
"");
133 EXPECT_EQ(fakepm.verifyTarget(target), TargetStatus::kNotFound);
136 auto whandle = fakepm.createTargetFile(target);
137 char content_bad[length + 1];
138 memset(content_bad, 0, length + 1);
139 whandle.write(content_bad, length);
141 EXPECT_EQ(fakepm.verifyTarget(target), TargetStatus::kHashMismatch);
144 whandle = fakepm.createTargetFile(target);
145 whandle.write(content_bad, length + 1);
147 EXPECT_EQ(fakepm.verifyTarget(target), TargetStatus::kOversized);
150 whandle = fakepm.createTargetFile(target);
151 whandle.write(content, length - 1);
153 EXPECT_EQ(fakepm.verifyTarget(target), TargetStatus::kIncomplete);
156 whandle = fakepm.createTargetFile(target);
157 whandle.write(content, length);
159 EXPECT_EQ(fakepm.verifyTarget(target), TargetStatus::kGood);
165 config.pacman.type = PACKAGE_MANAGER_NONE;
166 config.pacman.images_path = temp_dir.Path() /
"images";
167 config.pacman.fake_need_reboot =
true;
168 config.bootloader.reboot_sentinel_dir = temp_dir.Path();
169 config.storage.path = temp_dir.Path();
170 std::shared_ptr<INvStorage> storage = INvStorage::newStorage(config.storage);
171 std::shared_ptr<Bootloader> bootloader = std::make_shared<Bootloader>(config.bootloader, *storage);
175 Uptane::EcuMap primary_ecu;
176 Uptane::Target target(
"pkg", primary_ecu, {
Hash(Hash::Type::kSha256,
"hash")}, 1,
"");
177 auto result = fakepm.install(target);
178 EXPECT_EQ(
result.result_code, data::ResultCode::Numeric::kNeedCompletion);
179 storage->savePrimaryInstalledVersion(target, InstalledVersionUpdateMode::kPending);
181 fakepm.completeInstall();
183 result = fakepm.finalizeInstall(target);
184 EXPECT_EQ(
result.result_code, data::ResultCode::Numeric::kOk);
189 #include "utilities/fault_injection.h"
194 config.pacman.type = PACKAGE_MANAGER_NONE;
195 config.pacman.images_path = temp_dir.Path() /
"images";
196 config.storage.path = temp_dir.Path();
197 std::shared_ptr<INvStorage> storage = INvStorage::newStorage(config.storage);
198 auto http = std::make_shared<HttpFake>(temp_dir.Path());
200 KeyManager keys(storage, config.keymanagerConfig());
204 fault_injection_init();
208 Uptane::Target target(
"pkg", primary_ecu, {
Hash(Hash::Type::kSha256,
"hash")}, 0,
"");
209 EXPECT_TRUE(fakepm.fetchTarget(target, uptane_fetcher, keys,
nullptr,
nullptr));
212 fault_injection_enable(
"fake_package_download", 1,
"", 0);
213 EXPECT_FALSE(fakepm.fetchTarget(target, uptane_fetcher, keys,
nullptr,
nullptr));
214 fault_injection_disable(
"fake_package_download");
218 fault_injection_enable(
"fake_package_download", 1,
"RANDOM_DOWNLOAD_CAUSE", 0);
219 EXPECT_FALSE(fakepm.fetchTarget(target, uptane_fetcher, keys,
nullptr,
nullptr));
220 fault_injection_disable(
"fake_package_download");
226 config.pacman.type = PACKAGE_MANAGER_NONE;
227 config.pacman.images_path = temp_dir.Path() /
"images";
228 config.storage.path = temp_dir.Path();
229 std::shared_ptr<INvStorage> storage = INvStorage::newStorage(config.storage);
233 fault_injection_init();
237 Uptane::Target target(
"pkg", primary_ecu, {
Hash(Hash::Type::kSha256,
"hash")}, 1,
"");
238 auto result = fakepm.install(target);
239 EXPECT_EQ(
result.result_code, data::ResultCode::Numeric::kOk);
242 fault_injection_enable(
"fake_package_install", 1,
"", 0);
243 result = fakepm.install(target);
245 fault_injection_disable(
"fake_package_install");
248 fault_injection_enable(
"fake_package_install", 1,
"RANDOM_INSTALL_CAUSE", 0);
249 result = fakepm.install(target);
251 fault_injection_disable(
"fake_package_install");
257 int main(
int argc,
char **argv) {
258 ::testing::InitGoogleTest(&argc, argv);
260 return RUN_ALL_TESTS();