1 #include <gtest/gtest.h>
8 #include <boost/algorithm/hex.hpp>
9 #include <boost/filesystem.hpp>
11 #include "config/config.h"
12 #include "package_manager/ostreemanager.h"
13 #include "storage/invstorage.h"
15 #include "utilities/utils.h"
17 boost::filesystem::path test_sysroot;
23 config.pacman.ostree_server =
"bad-url";
24 config.pacman.type = PACKAGE_MANAGER_OSTREE;
25 config.pacman.sysroot = test_sysroot;
26 config.storage.path = temp_dir.Path();
28 std::shared_ptr<INvStorage> storage = INvStorage::newStorage(config.storage);
29 KeyManager keys(storage, config.keymanagerConfig());
31 Json::Value target_json_test;
32 target_json_test[
"hashes"][
"sha256"] =
"some_hash";
33 target_json_test[
"length"] = 0;
36 OstreeManager::pull(config.pacman.sysroot, config.pacman.ostree_server, keys, target_test);
39 EXPECT_EQ(
result.description,
"Failed to parse uri: bad-url");
46 config.pacman.ostree_server =
"bad-url";
47 config.pacman.type = PACKAGE_MANAGER_OSTREE;
48 config.pacman.sysroot = test_sysroot;
49 config.storage.path = temp_dir.Path();
51 std::shared_ptr<INvStorage> storage = INvStorage::newStorage(config.storage);
52 std::string ca = Utils::readFile(
"tests/test_data/prov/root.crt");
53 std::string pkey = Utils::readFile(
"tests/test_data/prov/pkey.pem");
54 std::string cert = Utils::readFile(
"tests/test_data/prov/client.pem");
55 storage->storeTlsCa(ca);
56 storage->storeTlsPkey(pkey);
57 storage->storeTlsCert(cert);
58 KeyManager keys(storage, config.keymanagerConfig());
60 Json::Value target_json_test;
61 target_json_test[
"hashes"][
"sha256"] =
"some_hash";
62 target_json_test[
"length"] = 0;
65 OstreeManager::pull(config.pacman.sysroot, config.pacman.ostree_server, keys, target_test);
68 EXPECT_EQ(
result.description,
"Failed to parse uri: bad-url");
73 Json::Value target_json;
74 target_json[
"hashes"][
"sha256"] =
"hash";
75 target_json[
"length"] = 0;
79 config.pacman.type = PACKAGE_MANAGER_OSTREE;
80 config.pacman.sysroot = test_sysroot;
81 config.storage.path = temp_dir.Path();
83 std::shared_ptr<INvStorage> storage = INvStorage::newStorage(config.storage);
84 OstreeManager ostree(config.pacman, config.bootloader, storage,
nullptr);
87 EXPECT_EQ(
result.description,
"Refspec 'hash' not found");
94 config.pacman.type = PACKAGE_MANAGER_OSTREE;
95 config.pacman.sysroot =
"sysroot-that-is-missing";
96 config.storage.path = temp_dir.Path();
97 std::shared_ptr<INvStorage> storage = INvStorage::newStorage(config.storage);
98 EXPECT_THROW(
OstreeManager ostree(config.pacman, config.bootloader, storage,
nullptr), std::runtime_error);
104 boost::filesystem::path packages_file = temp_dir /
"package.manifest";
108 content +=
"vim 1.0\n";
109 content +=
"emacs 2.0\n";
110 content +=
"bash 1.1\n";
112 Utils::writeFile(packages_file, content);
115 config.pacman.type = PACKAGE_MANAGER_OSTREE;
116 config.pacman.sysroot = test_sysroot;
117 config.pacman.packages_file = packages_file;
118 config.storage.path = temp_dir.Path();
120 std::shared_ptr<INvStorage> storage = INvStorage::newStorage(config.storage);
121 OstreeManager ostree(config.pacman, config.bootloader, storage,
nullptr);
122 Json::Value packages = ostree.getInstalledPackages();
123 EXPECT_EQ(packages[0][
"name"].asString(),
"vim");
124 EXPECT_EQ(packages[0][
"version"].asString(),
"1.0");
125 EXPECT_EQ(packages[1][
"name"].asString(),
"emacs");
126 EXPECT_EQ(packages[1][
"version"].asString(),
"2.0");
127 EXPECT_EQ(packages[2][
"name"].asString(),
"bash");
128 EXPECT_EQ(packages[2][
"version"].asString(),
"1.1");
135 config.pacman.type = PACKAGE_MANAGER_OSTREE;
136 config.pacman.sysroot = test_sysroot;
137 config.storage.path = temp_dir.Path();
139 std::shared_ptr<INvStorage> storage = INvStorage::newStorage(config.storage);
140 KeyManager keys(storage, config.keymanagerConfig());
143 OstreeRepo *repo =
nullptr;
144 GError *error =
nullptr;
145 std::shared_ptr<OstreeSysroot> sysroot = OstreeManager::LoadSysroot(config.pacman.sysroot);
146 EXPECT_TRUE(ostree_sysroot_get_repo(sysroot.get(), &repo,
nullptr, &error));
147 EXPECT_TRUE(OstreeManager::addRemote(repo, config.pacman.ostree_server, keys));
149 g_autofree
char *url =
nullptr;
150 EXPECT_TRUE(ostree_repo_get_remote_option(repo, remote,
"url",
nullptr, &url, &error));
151 EXPECT_EQ(url, config.pacman.ostree_server);
153 gboolean out_gpg_verify;
154 EXPECT_TRUE(ostree_repo_get_remote_boolean_option(repo, remote,
"gpg-verify", FALSE, &out_gpg_verify, &error));
156 g_autofree
char *ostree_cert =
nullptr;
157 EXPECT_TRUE(ostree_repo_get_remote_option(repo, remote,
"tls-client-cert-path",
nullptr, &ostree_cert, &error));
158 EXPECT_EQ(ostree_cert,
nullptr);
160 g_autofree
char *ostree_key =
nullptr;
161 EXPECT_TRUE(ostree_repo_get_remote_option(repo, remote,
"tls-client-key-path",
nullptr, &ostree_key, &error));
162 EXPECT_EQ(ostree_key,
nullptr);
164 g_autofree
char *ostree_ca =
nullptr;
165 EXPECT_TRUE(ostree_repo_get_remote_option(repo, remote,
"tls-ca-path",
nullptr, &ostree_ca, &error));
166 EXPECT_EQ(ostree_ca,
nullptr);
168 g_object_unref(repo);
175 config.pacman.type = PACKAGE_MANAGER_OSTREE;
176 config.pacman.sysroot = test_sysroot;
177 config.storage.path = temp_dir.Path();
179 std::shared_ptr<INvStorage> storage = INvStorage::newStorage(config.storage);
180 std::string ca = Utils::readFile(
"tests/test_data/prov/root.crt");
181 std::string pkey = Utils::readFile(
"tests/test_data/prov/pkey.pem");
182 std::string cert = Utils::readFile(
"tests/test_data/prov/client.pem");
183 storage->storeTlsCa(ca);
184 storage->storeTlsPkey(pkey);
185 storage->storeTlsCert(cert);
186 KeyManager keys(storage, config.keymanagerConfig());
189 OstreeRepo *repo =
nullptr;
190 GError *error =
nullptr;
191 std::shared_ptr<OstreeSysroot> sysroot = OstreeManager::LoadSysroot(config.pacman.sysroot);
192 EXPECT_TRUE(ostree_sysroot_get_repo(sysroot.get(), &repo,
nullptr, &error));
193 EXPECT_TRUE(OstreeManager::addRemote(repo, config.pacman.ostree_server, keys));
195 g_autofree
char *url =
nullptr;
196 EXPECT_TRUE(ostree_repo_get_remote_option(repo, remote,
"url",
nullptr, &url, &error));
197 EXPECT_EQ(url, config.pacman.ostree_server);
199 gboolean out_gpg_verify;
200 EXPECT_TRUE(ostree_repo_get_remote_boolean_option(repo, remote,
"gpg-verify", FALSE, &out_gpg_verify, &error));
202 g_autofree
char *ostree_cert =
nullptr;
203 EXPECT_TRUE(ostree_repo_get_remote_option(repo, remote,
"tls-client-cert-path",
nullptr, &ostree_cert, &error));
204 EXPECT_EQ(ostree_cert, keys.getCertFile());
206 g_autofree
char *ostree_key =
nullptr;
207 EXPECT_TRUE(ostree_repo_get_remote_option(repo, remote,
"tls-client-key-path",
nullptr, &ostree_key, &error));
208 EXPECT_EQ(ostree_key, keys.getPkeyFile());
210 g_autofree
char *ostree_ca =
nullptr;
211 EXPECT_TRUE(ostree_repo_get_remote_option(repo, remote,
"tls-ca-path",
nullptr, &ostree_ca, &error));
212 EXPECT_EQ(ostree_ca, keys.getCaFile());
214 g_object_unref(repo);
218 int main(
int argc,
char **argv) {
219 ::testing::InitGoogleTest(&argc, argv);
222 std::cerr <<
"Error: " << argv[0] <<
" requires the path to an OSTree sysroot as an input argument.\n";
227 test_sysroot = temp_sysroot /
"sysroot";
229 int r = system((std::string(
"cp -r ") + argv[1] + std::string(
" ") + test_sysroot.string()).c_str());
234 return RUN_ALL_TESTS();