1 #include <gtest/gtest.h>
8 #include <boost/process.hpp>
10 #include "uptane_test_common.h"
12 #include "config/config.h"
13 #include "logging/logging.h"
14 #include "package_manager/ostreemanager.h"
15 #include "primary/aktualizr.h"
16 #include "storage/sqlstorage.h"
17 #include "test_utils.h"
19 boost::filesystem::path uptane_generator_path;
20 static std::string server =
"http://127.0.0.1:";
21 static std::string treehub_server =
"http://127.0.0.1:";
22 static boost::filesystem::path sysroot;
28 static std::string new_rev;
31 extern "C" OstreeDeployment *ostree_sysroot_get_booted_deployment(OstreeSysroot *
self) {
33 static GObjectUniquePtr<OstreeDeployment> dep;
35 dep.reset(ostree_deployment_new(0,
"dummy-os", ostree_deployment.rev.c_str(), ostree_deployment.serial,
36 ostree_deployment.rev.c_str(), ostree_deployment.serial));
40 extern "C" const char *ostree_deployment_get_csum(OstreeDeployment *
self) {
42 return ostree_deployment.rev.c_str();
50 Config conf = UptaneTestCommon::makeTestConfig(temp_dir, server);
51 conf.pacman.type = PACKAGE_MANAGER_OSTREE;
52 conf.pacman.sysroot = sysroot.string();
53 conf.pacman.ostree_server = treehub_server;
54 conf.pacman.os =
"dummy-os";
55 conf.provision.device_id =
"device_id";
56 conf.provision.ecu_registration_endpoint = server +
"/director/ecus";
57 conf.tls.server = server;
59 LOG_INFO <<
"conf: " << conf;
63 aktualizr.Initialize();
66 ASSERT_EQ(update_result.status, result::UpdateStatus::kUpdatesAvailable);
68 EXPECT_EQ(aktualizr.uptane_client()->package_manager_->verifyTarget(update_result.updates[0]),
69 TargetStatus::kNotFound);
71 result::Download download_result = aktualizr.Download(update_result.updates).get();
72 EXPECT_EQ(download_result.status, result::DownloadStatus::kSuccess);
74 EXPECT_EQ(aktualizr.uptane_client()->package_manager_->verifyTarget(update_result.updates[0]), TargetStatus::kGood);
76 result::Install install_result = aktualizr.Install(update_result.updates).get();
77 EXPECT_EQ(install_result.ecu_reports.size(), 1);
78 EXPECT_EQ(install_result.ecu_reports[0].install_res.result_code.num_code,
79 data::ResultCode::Numeric::kNeedCompletion);
83 ostree_deployment.serial = 1;
84 ostree_deployment.rev = new_rev;
85 boost::filesystem::remove(conf.bootloader.reboot_sentinel_dir / conf.bootloader.reboot_sentinel_name);
89 aktualizr.Initialize();
92 ASSERT_EQ(update_result.status, result::UpdateStatus::kNoUpdatesAvailable);
95 const auto target = aktualizr.uptane_client()->package_manager_->getCurrent();
96 EXPECT_EQ(target.sha256Hash(), new_rev);
103 Uptane::EcuMap primary_ecu{{
Uptane::EcuSerial(conf.provision.primary_ecu_serial),
105 Uptane::Target target_bad(
"some-pkg", primary_ecu, {
Hash(Hash::Type::kSha256,
"hash-bad")}, 4,
"");
106 EXPECT_EQ(aktualizr.uptane_client()->package_manager_->verifyTarget(target_bad), TargetStatus::kNotFound);
111 int main(
int argc,
char **argv) {
112 ::testing::InitGoogleTest(&argc, argv);
117 std::cerr <<
"Error: " << argv[0] <<
" requires the path to the uptane-generator utility "
118 <<
"and an OSTree sysroot\n";
121 uptane_generator_path = argv[1];
127 sysroot = temp_sysroot /
"sysroot";
129 int res = system((std::string(
"cp -r ") + argv[2] + std::string(
" ") + sysroot.string()).c_str());
134 {
"rev-parse", std::string(
"--repo"), (sysroot /
"/ostree/repo").
string(),
"generate-remote/generated"});
135 if (std::get<0>(r) != 0) {
138 ostree_deployment.serial = 0;
139 ostree_deployment.rev = ostree.lastStdOut();
140 boost::trim_if(ostree_deployment.rev, boost::is_any_of(
" \t\r\n"));
141 LOG_INFO <<
"ORIG: " << ostree_deployment.rev;
143 std::string port = TestUtils::getFreePort();
145 boost::process::child http_server_process(
"tests/fake_http_server/fake_test_server.py", port,
"-m", meta_dir.Path());
146 TestUtils::waitForServer(server +
"/");
148 std::string treehub_port = TestUtils::getFreePort();
149 treehub_server += treehub_port;
151 boost::process::child ostree_server_process(
"tests/sota_tools/treehub_server.py", std::string(
"-p"), treehub_port,
152 std::string(
"-d"), treehub_dir.PathString(), std::string(
"-s0.5"),
153 std::string(
"--create"));
154 TestUtils::waitForServer(treehub_server +
"/");
155 r = ostree.run({
"rev-parse", std::string(
"--repo"), treehub_dir.PathString(),
"master"});
156 if (std::get<0>(r) != 0) {
159 new_rev = ostree.lastStdOut();
160 boost::trim_if(new_rev, boost::is_any_of(
" \t\r\n"));
161 LOG_INFO <<
"DEST: " << new_rev;
163 Process uptane_gen(uptane_generator_path.string());
164 uptane_gen.run({
"generate",
"--path", meta_dir.PathString(),
"--correlationid",
"abc123"});
165 uptane_gen.run({
"image",
"--path", meta_dir.PathString(),
"--targetname",
"update_1.0",
"--targetsha256", new_rev,
166 "--targetlength",
"0",
"--targetformat",
"OSTREE",
"--hwid",
"primary_hw"});
167 uptane_gen.run({
"addtarget",
"--path", meta_dir.PathString(),
"--targetname",
"update_1.0",
"--hwid",
"primary_hw",
168 "--serial",
"CA:FE:A6:D2:84:9D"});
169 uptane_gen.run({
"signtargets",
"--path", meta_dir.PathString(),
"--correlationid",
"abc123"});
170 LOG_INFO << uptane_gen.lastStdOut();
172 return RUN_ALL_TESTS();
174 #endif // __NO_MAIN__