1 #include <gtest/gtest.h> 6 #include <boost/filesystem.hpp> 8 #include "logging/logging.h" 9 #include "storage/sqlstorage.h" 11 #include "utilities/utils.h" 13 StorageType current_storage_type{StorageType::kSqlite};
15 std::unique_ptr<INvStorage> Storage(
const boost::filesystem::path &dir) {
17 storage_config.type = current_storage_type;
18 storage_config.path = dir;
20 if (storage_config.type == StorageType::kSqlite) {
21 return std::unique_ptr<INvStorage>(
new SQLStorage(storage_config,
false));
23 throw std::runtime_error(
"Invalid config type");
27 StorageConfig MakeConfig(StorageType type,
const boost::filesystem::path &storage_dir) {
31 if (config.type == StorageType::kSqlite) {
32 config.sqldb_path = storage_dir /
"test.db";
34 throw std::runtime_error(
"Invalid config type");
40 TEST(storage, load_store_primary_keys) {
42 std::unique_ptr<INvStorage> storage = Storage(temp_dir.Path());
44 storage->storePrimaryKeys(
"",
"");
45 storage->storePrimaryKeys(
"pr_public",
"pr_private");
50 EXPECT_TRUE(storage->loadPrimaryKeys(&pubkey, &privkey));
51 EXPECT_EQ(pubkey,
"pr_public");
52 EXPECT_EQ(privkey,
"pr_private");
53 storage->clearPrimaryKeys();
54 EXPECT_FALSE(storage->loadPrimaryKeys(
nullptr,
nullptr));
58 TEST(storage, load_store_tls) {
60 std::unique_ptr<INvStorage> storage = Storage(temp_dir.Path());
62 storage->storeTlsCreds(
"",
"",
"");
63 storage->storeTlsCreds(
"ca",
"cert",
"priv");
68 EXPECT_TRUE(storage->loadTlsCreds(&ca, &cert, &priv));
71 EXPECT_EQ(cert,
"cert");
72 EXPECT_EQ(priv,
"priv");
73 storage->clearTlsCreds();
74 EXPECT_FALSE(storage->loadTlsCreds(
nullptr,
nullptr,
nullptr));
78 TEST(storage, load_store_metadata) {
80 std::unique_ptr<INvStorage> storage = Storage(temp_dir.Path());
82 Json::Value root_json;
83 root_json[
"_type"] =
"Root";
84 root_json[
"consistent_snapshot"] =
false;
85 root_json[
"expires"] =
"2038-01-19T03:14:06Z";
86 root_json[
"keys"][
"firstid"][
"keytype"] =
"ed25519";
87 root_json[
"keys"][
"firstid"][
"keyval"][
"public"] =
"firstval";
88 root_json[
"keys"][
"secondid"][
"keytype"] =
"ed25519";
89 root_json[
"keys"][
"secondid"][
"keyval"][
"public"] =
"secondval";
91 root_json[
"roles"][
"root"][
"threshold"] = 1;
92 root_json[
"roles"][
"root"][
"keyids"][0] =
"firstid";
93 root_json[
"roles"][
"snapshot"][
"threshold"] = 1;
94 root_json[
"roles"][
"snapshot"][
"keyids"][0] =
"firstid";
95 root_json[
"roles"][
"targets"][
"threshold"] = 1;
96 root_json[
"roles"][
"targets"][
"keyids"][0] =
"firstid";
97 root_json[
"roles"][
"timestamp"][
"threshold"] = 1;
98 root_json[
"roles"][
"timestamp"][
"keyids"][0] =
"firstid";
100 Json::Value meta_root;
101 meta_root[
"signed"] = root_json;
102 std::string director_root = Utils::jsonToStr(meta_root);
103 std::string image_root = Utils::jsonToStr(meta_root);
105 Json::Value targets_json;
106 targets_json[
"_type"] =
"Targets";
107 targets_json[
"expires"] =
"2038-01-19T03:14:06Z";
108 targets_json[
"targets"][
"file1"][
"custom"][
"ecu_identifier"] =
"ecu1";
109 targets_json[
"targets"][
"file1"][
"custom"][
"hardware_identifier"] =
"hw1";
110 targets_json[
"targets"][
"file1"][
"hashes"][
"sha256"] =
"12ab";
111 targets_json[
"targets"][
"file1"][
"length"] = 1;
112 targets_json[
"targets"][
"file2"][
"custom"][
"ecu_identifier"] =
"ecu2";
113 targets_json[
"targets"][
"file2"][
"custom"][
"hardware_identifier"] =
"hw2";
114 targets_json[
"targets"][
"file2"][
"hashes"][
"sha512"] =
"12ab";
115 targets_json[
"targets"][
"file2"][
"length"] = 11;
117 Json::Value meta_targets;
118 meta_targets[
"signed"] = targets_json;
119 std::string director_targets = Utils::jsonToStr(meta_targets);
120 std::string image_targets = Utils::jsonToStr(meta_targets);
122 Json::Value timestamp_json;
123 timestamp_json[
"signed"][
"_type"] =
"Timestamp";
124 timestamp_json[
"signed"][
"expires"] =
"2038-01-19T03:14:06Z";
125 std::string image_timestamp = Utils::jsonToStr(timestamp_json);
127 Json::Value snapshot_json;
128 snapshot_json[
"_type"] =
"Snapshot";
129 snapshot_json[
"expires"] =
"2038-01-19T03:14:06Z";
130 snapshot_json[
"meta"][
"root.json"][
"version"] = 1;
131 snapshot_json[
"meta"][
"targets.json"][
"version"] = 2;
132 snapshot_json[
"meta"][
"timestamp.json"][
"version"] = 3;
133 snapshot_json[
"meta"][
"snapshot.json"][
"version"] = 4;
135 Json::Value meta_snapshot;
136 meta_snapshot[
"signed"] = snapshot_json;
137 std::string image_snapshot = Utils::jsonToStr(meta_snapshot);
139 storage->storeRoot(director_root, Uptane::RepositoryType::Director(),
Uptane::Version(1));
140 storage->storeNonRoot(director_targets, Uptane::RepositoryType::Director(), Uptane::Role::Targets());
141 storage->storeRoot(image_root, Uptane::RepositoryType::Image(),
Uptane::Version(1));
142 storage->storeNonRoot(image_targets, Uptane::RepositoryType::Image(), Uptane::Role::Targets());
143 storage->storeNonRoot(image_timestamp, Uptane::RepositoryType::Image(), Uptane::Role::Timestamp());
144 storage->storeNonRoot(image_snapshot, Uptane::RepositoryType::Image(), Uptane::Role::Snapshot());
146 std::string loaded_director_root;
147 std::string loaded_director_targets;
148 std::string loaded_image_root;
149 std::string loaded_image_targets;
150 std::string loaded_image_timestamp;
151 std::string loaded_image_snapshot;
153 EXPECT_TRUE(storage->loadLatestRoot(&loaded_director_root, Uptane::RepositoryType::Director()));
155 storage->loadNonRoot(&loaded_director_targets, Uptane::RepositoryType::Director(), Uptane::Role::Targets()));
156 EXPECT_TRUE(storage->loadLatestRoot(&loaded_image_root, Uptane::RepositoryType::Image()));
157 EXPECT_TRUE(storage->loadNonRoot(&loaded_image_targets, Uptane::RepositoryType::Image(), Uptane::Role::Targets()));
159 storage->loadNonRoot(&loaded_image_timestamp, Uptane::RepositoryType::Image(), Uptane::Role::Timestamp()));
160 EXPECT_TRUE(storage->loadNonRoot(&loaded_image_snapshot, Uptane::RepositoryType::Image(), Uptane::Role::Snapshot()));
161 EXPECT_EQ(director_root, loaded_director_root);
162 EXPECT_EQ(director_targets, loaded_director_targets);
163 EXPECT_EQ(image_root, loaded_image_root);
164 EXPECT_EQ(image_targets, loaded_image_targets);
165 EXPECT_EQ(image_timestamp, loaded_image_timestamp);
166 EXPECT_EQ(image_snapshot, loaded_image_snapshot);
168 storage->clearNonRootMeta(Uptane::RepositoryType::Director());
169 storage->clearNonRootMeta(Uptane::RepositoryType::Image());
171 storage->loadNonRoot(&loaded_director_targets, Uptane::RepositoryType::Director(), Uptane::Role::Targets()));
173 storage->loadNonRoot(&loaded_image_timestamp, Uptane::RepositoryType::Image(), Uptane::Role::Timestamp()));
177 TEST(storage, load_store_root) {
179 std::unique_ptr<INvStorage> storage = Storage(temp_dir.Path());
181 Json::Value root_json;
182 root_json[
"_type"] =
"Root";
183 root_json[
"consistent_snapshot"] =
false;
184 root_json[
"expires"] =
"2038-01-19T03:14:06Z";
185 root_json[
"keys"][
"firstid"][
"keytype"] =
"ed25519";
186 root_json[
"keys"][
"firstid"][
"keyval"][
"public"] =
"firstval";
187 root_json[
"keys"][
"secondid"][
"keytype"] =
"ed25519";
188 root_json[
"keys"][
"secondid"][
"keyval"][
"public"] =
"secondval";
190 root_json[
"roles"][
"root"][
"threshold"] = 1;
191 root_json[
"roles"][
"root"][
"keyids"][0] =
"firstid";
192 root_json[
"roles"][
"snapshot"][
"threshold"] = 1;
193 root_json[
"roles"][
"snapshot"][
"keyids"][0] =
"firstid";
194 root_json[
"roles"][
"targets"][
"threshold"] = 1;
195 root_json[
"roles"][
"targets"][
"keyids"][0] =
"firstid";
196 root_json[
"roles"][
"timestamp"][
"threshold"] = 1;
197 root_json[
"roles"][
"timestamp"][
"keyids"][0] =
"firstid";
199 Json::Value meta_root;
200 meta_root[
"signed"] = root_json;
202 std::string loaded_root;
204 storage->storeRoot(Utils::jsonToStr(meta_root), Uptane::RepositoryType::Director(),
Uptane::Version(2));
205 EXPECT_TRUE(storage->loadRoot(&loaded_root, Uptane::RepositoryType::Director(),
Uptane::Version(2)));
206 EXPECT_EQ(Utils::jsonToStr(meta_root), loaded_root);
208 EXPECT_TRUE(storage->loadLatestRoot(&loaded_root, Uptane::RepositoryType::Director()));
209 EXPECT_EQ(Utils::jsonToStr(meta_root), loaded_root);
213 TEST(storage, load_store_deviceid) {
215 std::unique_ptr<INvStorage> storage = Storage(temp_dir.Path());
217 storage->storeDeviceId(
"");
218 storage->storeDeviceId(
"device_id");
220 std::string device_id;
222 EXPECT_TRUE(storage->loadDeviceId(&device_id));
224 EXPECT_EQ(device_id,
"device_id");
225 storage->clearDeviceId();
226 EXPECT_FALSE(storage->loadDeviceId(
nullptr));
232 TEST(storage, load_store_ecu_serials) {
234 std::unique_ptr<INvStorage> storage = Storage(temp_dir.Path());
240 storage->storeEcuSerials(serials);
242 EcuSerials serials_out;
244 EXPECT_TRUE(storage->loadEcuSerials(&serials_out));
246 EXPECT_EQ(serials, serials_out);
247 storage->clearEcuSerials();
248 EXPECT_FALSE(storage->loadEcuSerials(
nullptr));
252 TEST(storage, load_store_misconfigured_ecus) {
254 std::unique_ptr<INvStorage> storage = Storage(temp_dir.Path());
256 std::vector<MisconfiguredEcu> ecus;
258 EcuState::kNotRegistered));
260 storage->storeMisconfiguredEcus(ecus);
262 std::vector<MisconfiguredEcu> ecus_out;
264 EXPECT_TRUE(storage->loadMisconfiguredEcus(&ecus_out));
266 EXPECT_EQ(ecus_out.size(), ecus.size());
269 EXPECT_EQ(ecus_out[0].state, EcuState::kNotRegistered);
271 storage->clearMisconfiguredEcus();
273 EXPECT_FALSE(storage->loadMisconfiguredEcus(&ecus_out));
277 TEST(storage, load_store_ecu_registered) {
279 std::unique_ptr<INvStorage> storage = Storage(temp_dir.Path());
281 EXPECT_THROW(storage->storeEcuRegistered(), std::runtime_error);
282 storage->storeDeviceId(
"test");
283 storage->storeEcuRegistered();
284 storage->storeEcuRegistered();
286 EXPECT_TRUE(storage->loadEcuRegistered());
288 storage->clearEcuRegistered();
289 EXPECT_FALSE(storage->loadEcuRegistered());
293 TEST(storage, load_store_installed_versions) {
295 std::unique_ptr<INvStorage> storage = Storage(temp_dir.Path());
298 const std::vector<Hash> hashes = {
299 Hash{Hash::Type::kSha256,
"2561"},
300 Hash{Hash::Type::kSha512,
"5121"},
303 Uptane::Target t1{
"update.bin", primary_ecu, hashes, 1,
"corrid"};
305 custom[
"version"] = 42;
306 custom[
"foo"] =
"bar";
307 t1.updateCustom(custom);
308 storage->savePrimaryInstalledVersion(t1, InstalledVersionUpdateMode::kCurrent);
310 std::vector<Uptane::Target> log;
311 storage->loadPrimaryInstallationLog(&log,
true);
312 EXPECT_EQ(log.size(), 1);
313 EXPECT_EQ(log[0].filename(),
"update.bin");
319 storage->storeEcuSerials(serials);
322 boost::optional<Uptane::Target> current;
323 EXPECT_TRUE(storage->loadInstalledVersions(
"primary", ¤t,
nullptr));
324 EXPECT_FALSE(storage->hasPendingInstall());
325 EXPECT_TRUE(!!current);
326 EXPECT_EQ(current->filename(),
"update.bin");
327 EXPECT_EQ(current->sha256Hash(),
"2561");
328 EXPECT_EQ(current->hashes(), hashes);
329 EXPECT_EQ(current->ecus(), primary_ecu);
330 EXPECT_EQ(current->correlation_id(),
"corrid");
331 EXPECT_EQ(current->length(), 1);
332 EXPECT_EQ(current->custom_data()[
"foo"],
"bar");
333 EXPECT_EQ(current->custom_data()[
"version"], 42);
337 Uptane::Target t2{
"update2.bin", primary_ecu, {
Hash{Hash::Type::kSha256,
"2562"}}, 2};
338 storage->savePrimaryInstalledVersion(t2, InstalledVersionUpdateMode::kPending);
341 boost::optional<Uptane::Target> pending;
342 EXPECT_TRUE(storage->loadInstalledVersions(
"primary",
nullptr, &pending));
343 EXPECT_TRUE(!!pending);
344 EXPECT_TRUE(storage->hasPendingInstall());
345 EXPECT_EQ(pending->filename(),
"update2.bin");
349 Uptane::Target t3{
"update3.bin", primary_ecu, {
Hash{Hash::Type::kSha256,
"2563"}}, 3};
350 storage->savePrimaryInstalledVersion(t3, InstalledVersionUpdateMode::kPending);
353 boost::optional<Uptane::Target> pending;
354 EXPECT_TRUE(storage->loadInstalledVersions(
"primary",
nullptr, &pending));
355 EXPECT_TRUE(!!pending);
356 EXPECT_TRUE(storage->hasPendingInstall());
357 EXPECT_EQ(pending->filename(),
"update3.bin");
362 storage->savePrimaryInstalledVersion(t3, InstalledVersionUpdateMode::kCurrent);
364 boost::optional<Uptane::Target> current;
365 boost::optional<Uptane::Target> pending;
366 EXPECT_TRUE(storage->loadInstalledVersions(
"primary", ¤t, &pending));
367 EXPECT_TRUE(!!current);
368 EXPECT_EQ(current->filename(),
"update3.bin");
369 EXPECT_FALSE(!!pending);
370 EXPECT_FALSE(storage->hasPendingInstall());
372 std::vector<Uptane::Target> log;
373 storage->loadInstallationLog(
"primary", &log,
true);
374 EXPECT_EQ(log.size(), 2);
375 EXPECT_EQ(log.back().filename(),
"update3.bin");
380 storage->savePrimaryInstalledVersion(t1, InstalledVersionUpdateMode::kCurrent);
381 std::vector<Uptane::Target> log;
382 storage->loadInstallationLog(
"primary", &log,
true);
383 EXPECT_EQ(log.size(), 3);
384 EXPECT_EQ(log.back().filename(),
"update.bin");
385 EXPECT_FALSE(storage->hasPendingInstall());
390 storage->savePrimaryInstalledVersion(t2, InstalledVersionUpdateMode::kPending);
391 storage->savePrimaryInstalledVersion(t3, InstalledVersionUpdateMode::kCurrent);
394 boost::optional<Uptane::Target> current;
395 boost::optional<Uptane::Target> pending;
396 EXPECT_TRUE(storage->loadInstalledVersions(
"primary", ¤t, &pending));
397 EXPECT_TRUE(!!current);
398 EXPECT_EQ(current->filename(),
"update3.bin");
399 EXPECT_FALSE(!!pending);
400 EXPECT_FALSE(storage->hasPendingInstall());
402 std::vector<Uptane::Target> log;
403 storage->loadInstallationLog(
"primary", &log,
true);
404 EXPECT_EQ(log.size(), 4);
405 EXPECT_EQ(log.back().filename(),
"update3.bin");
406 EXPECT_EQ(log[0].custom_data()[
"foo"],
"bar");
411 Uptane::Target tsec{
"secondary.bin", secondary_ecu, {
Hash{Hash::Type::kSha256,
"256s"}}, 4};
412 storage->saveInstalledVersion(
"secondary_1", tsec, InstalledVersionUpdateMode::kCurrent);
415 EXPECT_TRUE(storage->loadInstalledVersions(
"primary",
nullptr,
nullptr));
416 EXPECT_TRUE(storage->loadInstalledVersions(
"secondary_1",
nullptr,
nullptr));
418 std::vector<Uptane::Target> log;
419 storage->loadInstallationLog(
"secondary_1", &log,
true);
420 EXPECT_EQ(log.size(), 1);
421 EXPECT_EQ(log.back().filename(),
"secondary.bin");
429 TEST(storage, load_store_installation_results) {
431 std::unique_ptr<INvStorage> storage = Storage(temp_dir.Path());
436 storage->storeEcuSerials(serials);
443 std::vector<std::pair<Uptane::EcuSerial, data::InstallationResult>> res;
444 EXPECT_TRUE(storage->loadEcuInstallationResults(&res));
445 EXPECT_EQ(res.size(), 2);
446 EXPECT_EQ(res.at(0).first.ToString(),
"primary");
448 EXPECT_EQ(res.at(1).first.ToString(),
"secondary_2");
449 EXPECT_EQ(res.at(1).second.result_code.num_code, data::ResultCode::Numeric::kOk);
456 std::string correlation_id;
457 EXPECT_TRUE(storage->loadDeviceInstallationResult(&dev_res, &report, &correlation_id));
459 EXPECT_EQ(report,
"raw");
460 EXPECT_EQ(correlation_id,
"corrid");
462 storage->clearInstallationResults();
464 EXPECT_FALSE(storage->loadEcuInstallationResults(&res));
465 EXPECT_EQ(res.size(), 0);
466 EXPECT_FALSE(storage->loadDeviceInstallationResult(&dev_res, &report, &correlation_id));
470 TEST(storage, store_target) {
472 std::unique_ptr<INvStorage> storage = Storage(temp_dir.Path());
474 Json::Value target_json;
475 target_json[
"hashes"][
"sha256"] =
"hash";
476 target_json[
"length"] = 2;
481 std::unique_ptr<StorageTargetWHandle> fhandle = storage->allocateTargetFile(target);
482 const uint8_t wb[] =
"ab";
483 fhandle->wfeed(wb, 1);
484 fhandle->wfeed(wb + 1, 1);
490 std::unique_ptr<StorageTargetRHandle> rhandle = storage->openTargetFile(target);
492 EXPECT_EQ(rhandle->rsize(), 2);
493 rhandle->rread(rb, 1);
494 rhandle->rread(rb + 1, 1);
496 EXPECT_STREQ(reinterpret_cast<char *>(rb),
"ab");
501 std::unique_ptr<StorageTargetWHandle> fhandle = storage->allocateTargetFile(target);
502 const uint8_t wb[] =
"ab";
503 fhandle->wfeed(wb, 1);
504 fhandle->wfeed(wb + 1, 1);
510 storage->removeTargetFile(target.filename());
512 EXPECT_THROW(storage->removeTargetFile(target.filename()), std::runtime_error);
517 std::unique_ptr<StorageTargetWHandle> fhandle = storage->allocateTargetFile(target);
518 std::stringstream(
"ab") >> *fhandle;
523 std::stringstream sstr;
524 std::unique_ptr<StorageTargetRHandle> rhandle = storage->openTargetFile(target);
526 EXPECT_STREQ(sstr.str().c_str(),
"ab");
534 TEST(storage, list_remove_targets) {
536 std::unique_ptr<INvStorage> storage = Storage(temp_dir.Path());
538 Json::Value target_json;
539 target_json[
"hashes"][
"sha256"] =
"HASH";
540 target_json[
"length"] = 2;
543 auto tfs = storage->getTargetFiles();
544 EXPECT_EQ(tfs.size(), 0);
548 std::unique_ptr<StorageTargetWHandle> fhandle = storage->allocateTargetFile(target);
549 const uint8_t wb[] =
"ab";
550 fhandle->wfeed(wb, 1);
551 fhandle->wfeed(wb + 1, 1);
555 tfs = storage->getTargetFiles();
556 ASSERT_EQ(tfs.size(), 1);
560 EXPECT_EQ(tf.filename(),
"some.deb");
561 EXPECT_EQ(tf.length(), 2);
562 EXPECT_EQ(tf.hashes().size(), 1);
563 EXPECT_EQ(tf.hashes().at(0),
Hash(Hash::Type::kSha256,
"HASH"));
566 EXPECT_TRUE(boost::filesystem::exists(temp_dir.Path() /
"images" /
"HASH"));
568 storage->removeTargetFile(tf.filename());
570 tfs = storage->getTargetFiles();
571 EXPECT_EQ(tfs.size(), 0);
572 EXPECT_FALSE(boost::filesystem::exists(temp_dir.Path() /
"images" /
"HASH"));
575 TEST(storage, load_store_secondary_info) {
577 std::unique_ptr<INvStorage> storage = Storage(temp_dir.Path());
585 storage->storeEcuSerials(serials);
592 std::vector<SecondaryInfo> sec_infos;
593 EXPECT_TRUE(storage->loadSecondariesInfo(&sec_infos));
595 ASSERT_EQ(sec_infos.size(), 2);
596 EXPECT_EQ(sec_infos[0].serial.ToString(),
"secondary_1");
597 EXPECT_EQ(sec_infos[0].hw_id.ToString(),
"secondary_hw");
598 EXPECT_EQ(sec_infos[0].type,
"ip");
599 EXPECT_EQ(sec_infos[0].pub_key.Value(),
"key1");
600 EXPECT_EQ(sec_infos[0].pub_key.Type(), KeyType::kED25519);
601 EXPECT_EQ(sec_infos[1].pub_key.Type(), KeyType::kUnknown);
602 EXPECT_EQ(sec_infos[1].type,
"");
603 EXPECT_EQ(sec_infos[1].extra,
"data2");
608 EXPECT_TRUE(storage->loadSecondariesInfo(&sec_infos));
610 ASSERT_EQ(sec_infos.size(), 2);
611 EXPECT_EQ(sec_infos[0].pub_key.Value(),
"key2");
612 EXPECT_EQ(sec_infos[0].extra,
"data1");
615 TEST(storage, checksum) {
617 std::unique_ptr<INvStorage> storage = Storage(temp_dir.Path());
619 Json::Value target_json1;
620 target_json1[
"hashes"][
"sha256"] =
"hash1";
621 target_json1[
"length"] = 2;
623 Json::Value target_json2;
624 target_json2[
"length"] = 2;
625 target_json2[
"hashes"][
"sha256"] =
"hash2";
630 std::unique_ptr<StorageTargetWHandle> fhandle = storage->allocateTargetFile(target1);
631 const uint8_t wb[] =
"ab";
632 fhandle->wfeed(wb, 2);
638 std::unique_ptr<StorageTargetRHandle> rhandle = storage->openTargetFile(target1);
640 EXPECT_EQ(rhandle->rsize(), 2);
641 rhandle->rread(rb, 2);
643 EXPECT_STREQ(reinterpret_cast<char *>(rb),
"ab");
650 TEST(storage, partial) {
652 std::unique_ptr<INvStorage> storage = Storage(temp_dir.Path());
654 Json::Value target_json;
655 target_json[
"hashes"][
"sha256"] =
"hash1";
656 target_json[
"length"] = 3;
661 std::unique_ptr<StorageTargetWHandle> fhandle = storage->allocateTargetFile(target);
662 const uint8_t wb[] =
"a";
663 fhandle->wfeed(wb, 1);
669 std::unique_ptr<StorageTargetRHandle> rhandle = storage->openTargetFile(target);
671 EXPECT_EQ(rhandle->rsize(), 1);
672 EXPECT_TRUE(rhandle->isPartial());
673 rhandle->rread(rb, 1);
675 EXPECT_STREQ(reinterpret_cast<char *>(rb),
"a");
680 std::unique_ptr<StorageTargetWHandle> whandle = storage->openTargetFile(target)->toWriteHandle();
681 const uint8_t wb[] =
"b";
682 whandle->wfeed(wb, 1);
687 std::unique_ptr<StorageTargetRHandle> rhandle = storage->openTargetFile(target);
689 EXPECT_EQ(rhandle->rsize(), 2);
690 EXPECT_TRUE(rhandle->isPartial());
691 rhandle->rread(rb, 2);
693 EXPECT_STREQ(reinterpret_cast<char *>(rb),
"ab");
698 std::unique_ptr<StorageTargetWHandle> whandle = storage->openTargetFile(target)->toWriteHandle();
699 const uint8_t wb[] =
"c";
700 whandle->wfeed(wb, 1);
706 std::unique_ptr<StorageTargetRHandle> rhandle = storage->openTargetFile(target);
707 EXPECT_EQ(rhandle->rsize(), 3);
708 EXPECT_FALSE(rhandle->isPartial());
713 TEST(storage, import_data) {
715 std::unique_ptr<INvStorage> storage = Storage(temp_dir.Path());
716 boost::filesystem::create_directories(temp_dir /
"import");
719 import_config.base_path = temp_dir.Path() /
"import";
720 import_config.uptane_private_key_path =
BasedPath(
"private");
721 import_config.uptane_public_key_path =
BasedPath(
"public");
722 import_config.tls_cacert_path =
BasedPath(
"ca");
723 import_config.tls_clientcert_path =
BasedPath(
"cert");
724 import_config.tls_pkey_path =
BasedPath(
"pkey");
726 Utils::writeFile(import_config.uptane_private_key_path.get(import_config.base_path).string(),
727 std::string(
"uptane_private_1"));
728 Utils::writeFile(import_config.uptane_public_key_path.get(import_config.base_path).string(),
729 std::string(
"uptane_public_1"));
730 Utils::writeFile(import_config.tls_cacert_path.get(import_config.base_path).string(), std::string(
"tls_cacert_1"));
731 Utils::writeFile(import_config.tls_clientcert_path.get(import_config.base_path).string(), std::string(
"tls_cert_1"));
732 Utils::writeFile(import_config.tls_pkey_path.get(import_config.base_path).string(), std::string(
"tls_pkey_1"));
735 EXPECT_FALSE(storage->loadPrimaryPublic(
nullptr));
736 EXPECT_FALSE(storage->loadPrimaryPrivate(
nullptr));
737 EXPECT_FALSE(storage->loadTlsCa(
nullptr));
738 EXPECT_FALSE(storage->loadTlsCert(
nullptr));
739 EXPECT_FALSE(storage->loadTlsPkey(
nullptr));
741 storage->importData(import_config);
743 std::string primary_public;
744 std::string primary_private;
746 std::string tls_cert;
747 std::string tls_pkey;
750 EXPECT_TRUE(storage->loadPrimaryPublic(&primary_public));
751 EXPECT_TRUE(storage->loadPrimaryPrivate(&primary_private));
752 EXPECT_TRUE(storage->loadTlsCa(&tls_ca));
753 EXPECT_TRUE(storage->loadTlsCert(&tls_cert));
754 EXPECT_TRUE(storage->loadTlsPkey(&tls_pkey));
756 EXPECT_EQ(primary_private,
"uptane_private_1");
757 EXPECT_EQ(primary_public,
"uptane_public_1");
758 EXPECT_EQ(tls_ca,
"tls_cacert_1");
759 EXPECT_EQ(tls_cert,
"tls_cert_1");
760 EXPECT_EQ(tls_pkey,
"tls_pkey_1");
762 Utils::writeFile(import_config.uptane_private_key_path.get(import_config.base_path).string(),
763 std::string(
"uptane_private_2"));
764 Utils::writeFile(import_config.uptane_public_key_path.get(import_config.base_path).string(),
765 std::string(
"uptane_public_2"));
766 Utils::writeFile(import_config.tls_cacert_path.get(import_config.base_path).string(), std::string(
"tls_cacert_2"));
767 Utils::writeFile(import_config.tls_clientcert_path.get(import_config.base_path).string(), std::string(
"tls_cert_2"));
768 Utils::writeFile(import_config.tls_pkey_path.get(import_config.base_path).string(), std::string(
"tls_pkey_2"));
770 storage->importData(import_config);
772 EXPECT_TRUE(storage->loadPrimaryPublic(&primary_public));
773 EXPECT_TRUE(storage->loadPrimaryPrivate(&primary_private));
774 EXPECT_TRUE(storage->loadTlsCa(&tls_ca));
775 EXPECT_TRUE(storage->loadTlsCert(&tls_cert));
776 EXPECT_TRUE(storage->loadTlsPkey(&tls_pkey));
779 EXPECT_EQ(primary_private,
"uptane_private_1");
780 EXPECT_EQ(primary_public,
"uptane_public_1");
781 EXPECT_EQ(tls_ca,
"tls_cacert_2");
782 EXPECT_EQ(tls_cert,
"tls_cert_1");
783 EXPECT_EQ(tls_pkey,
"tls_pkey_1");
787 int main(
int argc,
char **argv) {
788 ::testing::InitGoogleTest(&argc, argv);
790 logger_set_threshold(boost::log::trivial::trace);
792 std::cout <<
"Running tests for SQLStorage" << std::endl;
793 current_storage_type = StorageType::kSqlite;
794 int res_sql = RUN_ALL_TESTS();
Metadata version numbers.
The hash of a file or Uptane metadata.