Aktualizr
C++ SOTA Client
device_cred_prov_test.cc
Go to the documentation of this file.
1 /**
2  * \file
3  */
4 
5 #include <gtest/gtest.h>
6 
7 #include <boost/filesystem.hpp>
8 #include <boost/smart_ptr/make_shared.hpp>
9 
10 #include "httpfake.h"
11 #include "logging/logging.h"
12 #include "primary/initializer.h"
13 #include "primary/sotauptaneclient.h"
14 #include "storage/invstorage.h"
15 #include "uptane/uptanerepository.h"
16 #include "utilities/utils.h"
17 
18 /**
19  * Verify that when provisioning with device credentials, aktualizr fails if
20  * credentials are not available.
21  */
22 TEST(DeviceCredProv, DeviceIdFailure) {
23  RecordProperty("zephyr_key", "OTA-1209,TST-185");
24  TemporaryDirectory temp_dir;
25  Config config;
26  config.storage.path = temp_dir.Path();
27  EXPECT_EQ(config.provision.mode, ProvisionMode::kDeviceCred);
28 
29  auto storage = INvStorage::newStorage(config.storage);
30  auto http = std::make_shared<HttpFake>(temp_dir.Path());
31  KeyManager keys(storage, config.keymanagerConfig());
32 
33  // Expect failure when trying to read the certificate to get the device ID.
34  EXPECT_THROW(Initializer(config.provision, storage, http, keys, {}), std::exception);
35 }
36 
37 /**
38  * Verify that when provisioning with device credentials, aktualizr fails if
39  * device ID is provided but credentials are not available.
40  */
41 TEST(DeviceCredProv, TlsFailure) {
42  RecordProperty("zephyr_key", "OTA-1209,TST-185");
43  TemporaryDirectory temp_dir;
44  Config config;
45  // Set device_id to prevent trying to read it from the certificate.
46  config.provision.device_id = "device_id";
47  config.storage.path = temp_dir.Path();
48  EXPECT_EQ(config.provision.mode, ProvisionMode::kDeviceCred);
49 
50  auto storage = INvStorage::newStorage(config.storage);
51  auto http = std::make_shared<HttpFake>(temp_dir.Path());
52  KeyManager keys(storage, config.keymanagerConfig());
53 
54  // Expect failure when trying to read the TLS credentials.
55  EXPECT_THROW(Initializer(config.provision, storage, http, keys, {}), Initializer::Error);
56 }
57 
58 /**
59  * Verfiy that aktualizr halts when provided incomplete device provisioning
60  * credentials.
61  */
62 TEST(DeviceCredProv, Incomplete) {
63  RecordProperty("zephyr_key", "OTA-1209,TST-187");
64  TemporaryDirectory temp_dir;
65  Config config;
66  // Set device_id to prevent trying to read it from the certificate.
67  config.provision.device_id = "device_id";
68  config.storage.path = temp_dir.Path();
69  config.import.base_path = temp_dir / "import";
70  EXPECT_EQ(config.provision.mode, ProvisionMode::kDeviceCred);
71 
72  auto http = std::make_shared<HttpFake>(temp_dir.Path());
73 
74  {
75  config.import.tls_cacert_path = utils::BasedPath("ca.pem");
76  config.import.tls_clientcert_path = utils::BasedPath("");
77  config.import.tls_pkey_path = utils::BasedPath("");
78  Utils::createDirectories(temp_dir / "import", S_IRWXU);
79  boost::filesystem::copy_file("tests/test_data/device_cred_prov/ca.pem", temp_dir / "import/ca.pem");
80  auto storage = INvStorage::newStorage(config.storage);
81  storage->importData(config.import);
82  KeyManager keys(storage, config.keymanagerConfig());
83 
84  EXPECT_THROW(Initializer(config.provision, storage, http, keys, {}), Initializer::Error);
85  }
86 
87  {
88  config.import.tls_cacert_path = utils::BasedPath("");
89  config.import.tls_clientcert_path = utils::BasedPath("client.pem");
90  config.import.tls_pkey_path = utils::BasedPath("");
91  boost::filesystem::remove_all(temp_dir.Path());
92  Utils::createDirectories(temp_dir / "import", S_IRWXU);
93  boost::filesystem::copy_file("tests/test_data/device_cred_prov/client.pem", temp_dir / "import/client.pem");
94  auto storage = INvStorage::newStorage(config.storage);
95  storage->importData(config.import);
96  KeyManager keys(storage, config.keymanagerConfig());
97 
98  EXPECT_THROW(Initializer(config.provision, storage, http, keys, {}), Initializer::Error);
99  }
100 
101  {
102  config.import.tls_cacert_path = utils::BasedPath("");
103  config.import.tls_clientcert_path = utils::BasedPath("");
104  config.import.tls_pkey_path = utils::BasedPath("pkey.pem");
105  boost::filesystem::remove_all(temp_dir.Path());
106  Utils::createDirectories(temp_dir / "import", S_IRWXU);
107  boost::filesystem::copy_file("tests/test_data/device_cred_prov/pkey.pem", temp_dir / "import/pkey.pem");
108  auto storage = INvStorage::newStorage(config.storage);
109  storage->importData(config.import);
110  KeyManager keys(storage, config.keymanagerConfig());
111 
112  EXPECT_THROW(Initializer(config.provision, storage, http, keys, {}), Initializer::Error);
113  }
114 
115  {
116  config.import.tls_cacert_path = utils::BasedPath("ca.pem");
117  config.import.tls_clientcert_path = utils::BasedPath("client.pem");
118  config.import.tls_pkey_path = utils::BasedPath("");
119  boost::filesystem::remove_all(temp_dir.Path());
120  Utils::createDirectories(temp_dir / "import", S_IRWXU);
121  boost::filesystem::copy_file("tests/test_data/device_cred_prov/ca.pem", temp_dir / "import/ca.pem");
122  boost::filesystem::copy_file("tests/test_data/device_cred_prov/client.pem", temp_dir / "import/client.pem");
123  auto storage = INvStorage::newStorage(config.storage);
124  storage->importData(config.import);
125  KeyManager keys(storage, config.keymanagerConfig());
126 
127  EXPECT_THROW(Initializer(config.provision, storage, http, keys, {}), Initializer::Error);
128  }
129 
130  {
131  config.import.tls_cacert_path = utils::BasedPath("ca.pem");
132  config.import.tls_clientcert_path = utils::BasedPath("");
133  config.import.tls_pkey_path = utils::BasedPath("pkey.pem");
134  boost::filesystem::remove_all(temp_dir.Path());
135  Utils::createDirectories(temp_dir / "import", S_IRWXU);
136  boost::filesystem::copy_file("tests/test_data/device_cred_prov/ca.pem", temp_dir / "import/ca.pem");
137  boost::filesystem::copy_file("tests/test_data/device_cred_prov/pkey.pem", temp_dir / "import/pkey.pem");
138  auto storage = INvStorage::newStorage(config.storage);
139  storage->importData(config.import);
140  KeyManager keys(storage, config.keymanagerConfig());
141 
142  EXPECT_THROW(Initializer(config.provision, storage, http, keys, {}), Initializer::Error);
143  }
144 
145  {
146  config.import.tls_cacert_path = utils::BasedPath("");
147  config.import.tls_clientcert_path = utils::BasedPath("client.pem");
148  config.import.tls_pkey_path = utils::BasedPath("pkey.pem");
149  boost::filesystem::remove_all(temp_dir.Path());
150  Utils::createDirectories(temp_dir / "import", S_IRWXU);
151  boost::filesystem::copy_file("tests/test_data/device_cred_prov/client.pem", temp_dir / "import/client.pem");
152  boost::filesystem::copy_file("tests/test_data/device_cred_prov/pkey.pem", temp_dir / "import/pkey.pem");
153  auto storage = INvStorage::newStorage(config.storage);
154  storage->importData(config.import);
155  KeyManager keys(storage, config.keymanagerConfig());
156 
157  EXPECT_THROW(Initializer(config.provision, storage, http, keys, {}), Initializer::Error);
158  }
159 
160  // Do one last round with all three files to make sure it actually works as
161  // expected.
162  config.import.tls_cacert_path = utils::BasedPath("ca.pem");
163  config.import.tls_clientcert_path = utils::BasedPath("client.pem");
164  config.import.tls_pkey_path = utils::BasedPath("pkey.pem");
165  boost::filesystem::remove_all(temp_dir.Path());
166  Utils::createDirectories(temp_dir / "import", S_IRWXU);
167  boost::filesystem::copy_file("tests/test_data/device_cred_prov/ca.pem", temp_dir / "import/ca.pem");
168  boost::filesystem::copy_file("tests/test_data/device_cred_prov/client.pem", temp_dir / "import/client.pem");
169  boost::filesystem::copy_file("tests/test_data/device_cred_prov/pkey.pem", temp_dir / "import/pkey.pem");
170  auto storage = INvStorage::newStorage(config.storage);
171  storage->importData(config.import);
172  KeyManager keys(storage, config.keymanagerConfig());
173 
174  EXPECT_NO_THROW(Initializer(config.provision, storage, http, keys, {}));
175 }
176 
177 /**
178  * Verify that aktualizr can provision with provided device credentials.
179  */
180 TEST(DeviceCredProv, Success) {
181  RecordProperty("zephyr_key", "OTA-996,OTA-1210,TST-186");
182  TemporaryDirectory temp_dir;
183  Config config;
184  Utils::createDirectories(temp_dir / "import", S_IRWXU);
185  boost::filesystem::copy_file("tests/test_data/device_cred_prov/ca.pem", temp_dir / "import/ca.pem");
186  boost::filesystem::copy_file("tests/test_data/device_cred_prov/client.pem", temp_dir / "import/client.pem");
187  boost::filesystem::copy_file("tests/test_data/device_cred_prov/pkey.pem", temp_dir / "import/pkey.pem");
188  config.storage.path = temp_dir.Path();
189  config.import.base_path = temp_dir / "import";
190  config.import.tls_cacert_path = utils::BasedPath("ca.pem");
191  config.import.tls_clientcert_path = utils::BasedPath("client.pem");
192  config.import.tls_pkey_path = utils::BasedPath("pkey.pem");
193  EXPECT_EQ(config.provision.mode, ProvisionMode::kDeviceCred);
194 
195  auto storage = INvStorage::newStorage(config.storage);
196  storage->importData(config.import);
197  auto http = std::make_shared<HttpFake>(temp_dir.Path());
198  KeyManager keys(storage, config.keymanagerConfig());
199 
200  EXPECT_NO_THROW(Initializer(config.provision, storage, http, keys, {}));
201 }
202 
203 #ifndef __NO_MAIN__
204 int main(int argc, char** argv) {
205  ::testing::InitGoogleTest(&argc, argv);
206  logger_set_threshold(boost::log::trivial::trace);
207  return RUN_ALL_TESTS();
208 }
209 #endif
KeyManager
Definition: keymanager.h:13
utils::BasedPath
The BasedPath class Can represent an absolute or relative path, only readable through the BasePath::g...
Definition: types.h:31
Config
Configuration object for an aktualizr instance running on a Primary ECU.
Definition: config.h:208
TemporaryDirectory
Definition: utils.h:82
Initializer
Definition: initializer.h:14
TEST
TEST(DeviceCredProv, DeviceIdFailure)
Verify that when provisioning with device credentials, aktualizr fails if credentials are not availab...
Definition: device_cred_prov_test.cc:22
Initializer::Error
Definition: initializer.h:20