1 #include <gtest/gtest.h> 3 #include <boost/process.hpp> 11 #include "http/httpclient.h" 12 #include "libaktualizr/config.h" 13 #include "logging/logging.h" 14 #include "package_manager/packagemanagerfake.h" 15 #include "storage/sqlstorage.h" 16 #include "test_utils.h" 17 #include "uptane/tuf.h" 19 static const int die_after = 50;
20 static const int pause_duration = 2;
24 static std::mutex pause_m;
25 static std::condition_variable cv;
26 static bool die =
false;
27 static bool resumed =
false;
31 static void progress_cb(
const Uptane::Target& target,
const std::string& description,
unsigned int progress) {
34 std::cout <<
"progress: " << progress << std::endl;
35 if (progress >= die_after) {
36 std::lock_guard<std::mutex> lk(pause_m);
41 EXPECT_GE(progress, die_after);
46 std::shared_ptr<INvStorage> storage(
new SQLStorage(config.storage,
false));
47 auto http = std::make_shared<HttpClient>();
48 auto pacman = std::make_shared<PackageManagerFake>(config.pacman, config.bootloader, storage, http);
50 KeyManager keys(storage, config.keymanagerConfig());
54 bool res = pacman->fetchTarget(target, fetcher, keys, progress_cb, &token);
60 std::shared_ptr<INvStorage> storage(
new SQLStorage(config.storage,
false));
61 auto http = std::make_shared<HttpClient>();
63 auto pacman = std::make_shared<PackageManagerFake>(config.pacman, config.bootloader, storage, http);
64 KeyManager keys(storage, config.keymanagerConfig());
67 std::promise<bool> download_promise;
68 auto result = download_promise.get_future();
70 std::thread([&target, &fetcher, &download_promise, &token, pacman, &keys]() {
71 bool res = pacman->fetchTarget(target, fetcher, keys, progress_cb, &token);
72 download_promise.set_value(res);
75 std::unique_lock<std::mutex> lk(pause_m);
76 cv.wait(lk, [] {
return die; });
79 std::this_thread::sleep_for(std::chrono::seconds(pause_duration));
86 TEST(FetcherDeathTest, TestResumeAfterPause) {
88 config.storage.path = temp_dir.Path();
89 config.pacman.images_path = temp_dir.Path() /
"images";
91 Json::Value target_json;
92 target_json[
"hashes"][
"sha256"] =
"dd7bd1c37a3226e520b8d6939c30991b1c08772d5dab62b381c3a63541dc629a";
93 target_json[
"length"] = 100 * (1 << 20);
98 ASSERT_DEATH(try_and_die(target,
true),
"");
99 std::cout <<
"Fetcher died, retrying" << std::endl;
103 TEST(FetcherDeathTest, TestResumeAfterSigkill) {
105 config.storage.path = temp_dir.Path();
107 Json::Value target_json;
108 target_json[
"hashes"][
"sha256"] =
"dd7bd1c37a3226e520b8d6939c30991b1c08772d5dab62b381c3a63541dc629a";
109 target_json[
"length"] = 100 * (1 << 20);
114 ASSERT_DEATH(try_and_die(target,
false),
"");
115 std::cout <<
"Fetcher died, retrying" << std::endl;
120 int main(
int argc,
char** argv) {
121 ::testing::InitGoogleTest(&argc, argv);
124 logger_set_threshold(boost::log::trivial::trace);
126 std::string port = TestUtils::getFreePort();
127 server =
"http://127.0.0.1:" + port;
128 config.uptane.repo_server = server;
129 boost::process::child http_server_process(
"tests/fake_http_server/fake_test_server.py", port,
"-f");
130 TestUtils::waitForServer(server +
"/");
131 return RUN_ALL_TESTS();
133 #endif // __NO_MAIN__ Provides a thread-safe way to pause and terminate task execution.
Configuration object for an aktualizr instance running on a Primary ECU.
Results of libaktualizr API calls.