1 #include <gtest/gtest.h>
6 #include <boost/algorithm/hex.hpp>
7 #include <boost/filesystem.hpp>
8 #include <boost/program_options.hpp>
10 #include "bootstrap/bootstrap.h"
11 #include "config/config.h"
12 #include "crypto/crypto.h"
13 #include "test_utils.h"
14 #include "utilities/utils.h"
16 namespace bpo = boost::program_options;
17 boost::filesystem::path build_dir;
19 TEST(config, DefaultValues) {
21 EXPECT_EQ(conf.uptane.key_type, KeyType::kRSA2048);
22 EXPECT_EQ(conf.uptane.polling_sec, 10u);
25 TEST(config, TomlBasic) {
26 Config conf(
"tests/config/basic.toml");
27 EXPECT_EQ(conf.pacman.type, PACKAGE_MANAGER_NONE);
30 TEST(config, TomlEmpty) {
32 conf.updateFromTomlString(
"");
33 EXPECT_EQ(conf.uptane.key_type, KeyType::kRSA2048);
34 EXPECT_EQ(conf.uptane.polling_sec, 10u);
37 TEST(config, TomlInt) {
39 conf.updateFromTomlString(
"[uptane]\nkey_type = \"ED25519\"\npolling_sec = 99\n");
40 EXPECT_EQ(conf.uptane.key_type, KeyType::kED25519);
41 EXPECT_EQ(conf.uptane.polling_sec, 99u);
47 TEST(config, TomlPrimarySerial) {
48 RecordProperty(
"zephyr_key",
"OTA-988");
49 Config conf(
"tests/config/testupdate.toml");
50 EXPECT_EQ(conf.provision.primary_ecu_serial,
"723f79763eda1c753ce565c16862c79acdde32eb922d6662f088083c51ffde66");
56 TEST(config, CmdlPrimarySerial) {
57 RecordProperty(
"zephyr_key",
"OTA-988");
58 constexpr
int argc = 5;
59 const char *argv[argc] = {
"./aktualizr",
"--primary-ecu-serial",
"test-serial",
"-c",
"tests/config/minimal.toml"};
61 bpo::options_description description(
"CommandLine Options");
63 description.add_options()
64 (
"primary-ecu-serial", bpo::value<std::string>(),
"serial number of primary ecu")
65 (
"config,c", bpo::value<std::vector<boost::filesystem::path> >()->composing(),
"configuration directory");
68 bpo::variables_map vm;
69 bpo::store(bpo::parse_command_line(argc, argv, description), vm);
72 EXPECT_EQ(conf.provision.primary_ecu_serial,
"test-serial");
78 TEST(config, ExtractCredentials) {
81 conf.storage.path = temp_dir.Path();
82 conf.provision.provision_path =
"tests/test_data/credentials.zip";
83 conf.tls.server.clear();
84 conf.postUpdateValues();
85 EXPECT_EQ(conf.tls.server,
"https://bd8012b4-cf0f-46ca-9d2c-46a41d534af5.tcpgw.prod01.advancedtelematic.com:443");
87 Bootstrap boot(conf.provision.provision_path,
"");
88 EXPECT_EQ(boost::algorithm::hex(Crypto::sha256digest(boot.getCa())),
89 "FBA3C8FAD16D8B3EC64F7D47CBDD8456A51A6399734A3F6B7E2D6E562072F264");
90 std::cout <<
"Certificate: " << boot.getCert() << std::endl;
91 EXPECT_EQ(boost::algorithm::hex(Crypto::sha256digest(boot.getCert())),
92 "02300CC9797556915D88CFA05644BFF22D8C458367A3636F7921585F828ECB81");
93 std::cout <<
"Pkey: " << boot.getPkey() << std::endl;
94 EXPECT_EQ(boost::algorithm::hex(Crypto::sha256digest(boot.getPkey())),
95 "D27E3E56BEF02AAA6D6FFEFDA5357458C477A8E891C5EADF4F04CE67BB5866A4");
101 TEST(config, DeviceCredMode) {
102 RecordProperty(
"zephyr_key",
"OTA-996,TST-184");
104 EXPECT_EQ(config.provision.mode, ProvisionMode::kDeviceCred);
110 TEST(config, SharedCredMode) {
111 Config config(
"tests/config/basic.toml");
112 EXPECT_EQ(config.provision.mode, ProvisionMode::kSharedCred);
118 TEST(config, TomlConsistentEmpty) {
121 std::ofstream sink1((temp_dir /
"output1.toml").c_str(), std::ofstream::out);
122 config1.writeToStream(sink1);
124 Config config2((temp_dir /
"output1.toml").
string());
125 std::ofstream sink2((temp_dir /
"output2.toml").c_str(), std::ofstream::out);
126 config2.writeToStream(sink2);
128 std::string conf_str1 = Utils::readFile((temp_dir /
"output1.toml").
string());
129 std::string conf_str2 = Utils::readFile((temp_dir /
"output2.toml").
string());
130 EXPECT_EQ(conf_str1, conf_str2);
133 TEST(config, TomlConsistentNonempty) {
135 Config config1(
"tests/config/basic.toml");
136 std::ofstream sink1((temp_dir /
"output1.toml").c_str(), std::ofstream::out);
137 config1.writeToStream(sink1);
139 Config config2((temp_dir /
"output1.toml").
string());
140 std::ofstream sink2((temp_dir /
"output2.toml").c_str(), std::ofstream::out);
141 config2.writeToStream(sink2);
143 std::string conf_str1 = Utils::readFile((temp_dir /
"output1.toml").
string());
144 std::string conf_str2 = Utils::readFile((temp_dir /
"output2.toml").
string());
145 EXPECT_EQ(conf_str1, conf_str2);
148 static std::vector<boost::filesystem::path> generate_multi_config(
TemporaryDirectory &temp_dir) {
151 content +=
"[storage]\n";
152 content +=
"path = \"path_a\"\n";
154 content +=
"[pacman]\n";
155 content +=
"os = \"os_a\"";
157 Utils::writeFile((temp_dir /
"a_dir/a.toml"), content);
161 content +=
"[storage]\n";
162 content +=
"path = \"path_z\"\n";
164 content +=
"[pacman]\n";
165 content +=
"sysroot = \"sysroot_z\"";
167 Utils::writeFile((temp_dir /
"a_dir/z.toml"), content);
171 content +=
"[storage]\n";
172 content +=
"path = \"cecond_a\"";
174 Utils::writeFile((temp_dir /
"b_dir/a.toml"), content);
178 content +=
"[storage]\n";
179 content +=
"path = \"latest_path\"\n";
181 content +=
"[provision]\n";
182 content +=
"provision_path = \"y_prov_path\"";
184 Utils::writeFile((temp_dir /
"b_dir/y.toml"), content);
188 content +=
"[storage]\n";
189 content +=
"path = \"this is path from text file\"";
191 Utils::writeFile((temp_dir /
"b_dir/z.txt"), content);
193 return std::vector<boost::filesystem::path>{(temp_dir /
"a_dir"), (temp_dir /
"b_dir")};
196 TEST(config, OneDir) {
198 std::vector<boost::filesystem::path> dirs = generate_multi_config(temp_dir);
200 Config config(std::vector<boost::filesystem::path>{dirs[0]});
201 EXPECT_EQ(config.storage.path.string(),
"path_z");
202 EXPECT_EQ(config.pacman.sysroot.string(),
"sysroot_z");
203 EXPECT_EQ(config.pacman.os,
"os_a");
207 TEST(config, TwoDirs) {
209 std::vector<boost::filesystem::path> dirs = generate_multi_config(temp_dir);
212 EXPECT_EQ(config.storage.path.string(),
"path_z");
213 EXPECT_EQ(config.pacman.sysroot.string(),
"sysroot_z");
214 EXPECT_NE(config.pacman.os,
"os_a");
215 EXPECT_EQ(config.provision.provision_path.string(),
"y_prov_path");
218 void checkConfigExpectations(
const Config &conf) {
219 EXPECT_EQ(conf.storage.type, StorageType::kSqlite);
220 EXPECT_EQ(conf.pacman.type, PACKAGE_MANAGER_NONE);
221 EXPECT_EQ(conf.tls.ca_source, CryptoSource::kPkcs11);
222 EXPECT_EQ(conf.tls.pkey_source, CryptoSource::kPkcs11);
223 EXPECT_EQ(conf.tls.cert_source, CryptoSource::kPkcs11);
224 EXPECT_EQ(conf.uptane.key_source, CryptoSource::kPkcs11);
225 EXPECT_EQ(conf.uptane.key_type, KeyType::kED25519);
226 EXPECT_EQ(conf.bootloader.rollback_mode, RollbackMode::kUbootMasked);
232 TEST(config, TwoTomlCorrectness) {
234 const std::string conf_path_str = (temp_dir.Path() /
"config.toml").
string();
235 TestUtils::writePathToConfig(
"tests/config/minimal.toml", conf_path_str, temp_dir.Path());
237 std::ofstream cs(conf_path_str.c_str(), std::ofstream::app);
238 cs <<
"type = \"sqlite\"\n";
241 cs <<
"type = \"none\"\n";
244 cs <<
"ca_source = \"pkcs11\"\n";
245 cs <<
"pkey_source = \"pkcs11\"\n";
246 cs <<
"cert_source = \"pkcs11\"\n";
249 cs <<
"key_source = \"pkcs11\"\n";
250 cs <<
"key_type = \"ED25519\"\n";
252 cs <<
"[bootloader]\n";
253 cs <<
"rollback_mode = \"uboot_masked\"\n";
256 bpo::variables_map cmd;
257 bpo::options_description description(
"some text");
259 description.add_options()
260 (
"config,c", bpo::value<std::vector<boost::filesystem::path> >()->composing(),
"configuration directory");
263 const char *argv1[] = {
"aktualizr",
"-c", conf_path_str.c_str(),
"-c",
"tests/config/minimal.toml"};
264 bpo::store(bpo::parse_command_line(5, argv1, description), cmd);
266 checkConfigExpectations(conf1);
269 const char *argv2[] = {
"aktualizr",
"-c",
"tests/config/minimal.toml",
"-c", conf_path_str.c_str()};
270 bpo::store(bpo::parse_command_line(5, argv2, description), cmd);
272 checkConfigExpectations(conf2);
276 int main(
int argc,
char **argv) {
277 ::testing::InitGoogleTest(&argc, argv);
280 std::cerr <<
"Error: " << argv[0] <<
" requires the path to the build directory as an input argument.\n";
284 return RUN_ALL_TESTS();