1 #include <boost/test/unit_test.hpp>
5 #include <ckm/ckm-type.h>
6 #include <ckm/ckm-error.h>
8 #include <test_common.h>
15 const int restricted_local = 1;
16 const int restricted_global = 0;
18 const unsigned int c_test_retries = 1000;
19 const unsigned int c_num_names = 500;
20 const unsigned int c_num_names_add_test = 5000;
21 const unsigned int c_names_per_label = 15;
22 } // namespace anonymous
24 BOOST_FIXTURE_TEST_SUITE(DBCRYPTO_TEST, DBFixture)
25 BOOST_AUTO_TEST_CASE(DBtestSimple) {
26 DBRow rowPattern = create_default_row();
27 rowPattern.data = RawBuffer(32, 1);
28 rowPattern.dataSize = rowPattern.data.size();
29 rowPattern.tag = RawBuffer(AES_GCM_TAG_SIZE, 1);
31 check_DB_integrity(rowPattern);
33 BOOST_AUTO_TEST_CASE(DBtestBIG) {
34 DBRow rowPattern = create_default_row();
35 rowPattern.data = createBigBlob(4096);
36 rowPattern.dataSize = rowPattern.data.size();
37 rowPattern.tag = RawBuffer(AES_GCM_TAG_SIZE, 1);
39 check_DB_integrity(rowPattern);
41 BOOST_AUTO_TEST_CASE(DBtestGlobal) {
42 DBRow rowPattern = create_default_row();
43 rowPattern.data = RawBuffer(1024, 2);
44 rowPattern.dataSize = rowPattern.data.size();
45 rowPattern.tag = RawBuffer(AES_GCM_TAG_SIZE, 1);
47 BOOST_REQUIRE_NO_THROW(m_db.saveDBRow(rowPattern));
49 DBRow name_duplicate = rowPattern;
50 rowPattern.ownerLabel = rowPattern.ownerLabel + "1";
52 BOOST_AUTO_TEST_CASE(DBtestTransaction) {
53 DBRow rowPattern = create_default_row();
54 rowPattern.data = RawBuffer(100, 20);
55 rowPattern.dataSize = rowPattern.data.size();
56 rowPattern.tag = RawBuffer(AES_GCM_TAG_SIZE, 1);
57 DBCrypto::Transaction transaction(&m_db);
59 BOOST_REQUIRE_NO_THROW(m_db.saveDBRow(rowPattern));
60 BOOST_REQUIRE_NO_THROW(transaction.rollback());
62 DBCrypto::DBRowOptional row_optional;
63 BOOST_REQUIRE_NO_THROW(row_optional = m_db.getDBRow(m_default_name, m_default_label,
64 DBDataType::BINARY_DATA));
65 BOOST_CHECK_MESSAGE(!row_optional, "Row still present after rollback");
68 BOOST_AUTO_TEST_SUITE_END()
72 BOOST_FIXTURE_TEST_SUITE(DBCRYPTO_PERF_TEST, DBFixture)
74 BOOST_AUTO_TEST_CASE(DBperfAddNames)
77 performance_start("saveDBRow");
79 generate_perf_DB(c_num_names_add_test, c_names_per_label);
81 performance_stop(c_num_names_add_test);
84 BOOST_AUTO_TEST_CASE(DBperfLookupAliasByOwner)
87 generate_perf_DB(c_num_names, c_names_per_label);
89 unsigned int num_labels = c_num_names/c_names_per_label;
93 // actual test - successful lookup
94 performance_start("getDBRow");
95 for(unsigned int t=0; t<c_test_retries; t++)
97 int label_num = rand() % num_labels;
98 generate_label(label_num, label);
100 unsigned int start_name = label_num*c_names_per_label;
101 for(unsigned int name_num=start_name; name_num<(start_name+c_names_per_label); name_num++)
103 generate_name(name_num, name);
104 read_row_expect_success(name, label);
107 performance_stop(c_test_retries * c_num_names);
110 BOOST_AUTO_TEST_CASE(DBperfLookupAliasRandomOwnershipNoPermissions)
113 generate_perf_DB(c_num_names, c_names_per_label);
118 unsigned int num_labels = c_num_names / c_names_per_label;
120 // actual test - random lookup
121 performance_start("getDBRow");
122 for(unsigned int t=0; t<c_test_retries; t++)
124 int name_idx = rand()%c_num_names;
125 generate_name(name_idx, name);
126 generate_label(name_idx/c_names_per_label, owner_label);
127 generate_label(rand()%num_labels, smack_label);
129 // do not care of result
130 m_db.getDBRow(name, owner_label, DBDataType::BINARY_DATA);
132 performance_stop(c_test_retries * c_num_names);
135 BOOST_AUTO_TEST_CASE(DBperfAddPermissions)
138 generate_perf_DB(c_num_names, c_names_per_label);
140 // actual test - add access rights
141 performance_start("setPermission");
142 long iterations = add_full_access_rights(c_num_names, c_names_per_label);
143 performance_stop(iterations);
146 BOOST_AUTO_TEST_CASE(DBperfAliasRemoval)
149 generate_perf_DB(c_num_names, c_names_per_label);
150 add_full_access_rights(c_num_names, c_names_per_label);
152 // actual test - random lookup
153 performance_start("deleteDBRow");
156 for(unsigned int t=0; t<c_num_names; t++)
158 generate_name(t, name);
159 generate_label(t/c_names_per_label, label);
161 BOOST_REQUIRE_NO_THROW(m_db.deleteDBRow(name, label));
163 performance_stop(c_num_names);
165 // verify everything has been removed
166 unsigned int num_labels = c_num_names / c_names_per_label;
167 for(unsigned int l=0; l<num_labels; l++)
169 generate_label(l, label);
170 LabelNameVector expect_no_data;
171 BOOST_REQUIRE_NO_THROW(m_db.listNames(label, expect_no_data, DBDataType::BINARY_DATA));
172 BOOST_REQUIRE(0 == expect_no_data.size());
176 BOOST_AUTO_TEST_CASE(DBperfGetAliasList)
179 generate_perf_DB(c_num_names, c_names_per_label);
180 add_full_access_rights(c_num_names, c_names_per_label);
182 unsigned int num_labels = c_num_names / c_names_per_label;
185 // actual test - random lookup
186 performance_start("listNames");
187 for(unsigned int t=0; t<(c_test_retries/num_labels); t++)
189 LabelNameVector ret_list;
190 generate_label(rand()%num_labels, label);
192 BOOST_REQUIRE_NO_THROW(m_db.listNames(label, ret_list, DBDataType::BINARY_DATA));
193 BOOST_REQUIRE(c_num_names == ret_list.size());
196 performance_stop(c_test_retries/num_labels);
198 BOOST_AUTO_TEST_SUITE_END()
201 BOOST_AUTO_TEST_SUITE(DBCRYPTO_MIGRATION_TEST)
204 const unsigned migration_names = 16107;
205 const unsigned migration_labels = 273;
206 const unsigned migration_reference_label_idx = 0;
207 const unsigned migration_accessed_element_idx = 7;
209 void verifyDBisValid(DBFixture & fixture)
212 * there are (migration_labels), each having (migration_names)/(migration_labels) entries.
213 * reference label (migration_reference_label_idx) exists such that it has access to
214 * all others' label element with index (migration_accessed_element_idx).
217 * - migration_label_63 has access to all items owned by migration_label_63,
218 * which gives (migration_names)/(migration_labels) entries.
220 * - migration_label_0 (0 is the reference label) has access to all items
221 * owned by migration_label_0 and all others' label element index 7,
222 * which gives (migration_names)/(migration_labels) + (migration_labels-1) entries.
225 Label reference_label;
226 fixture.generate_label(migration_reference_label_idx, reference_label);
228 // check number of elements accessible to the reference label
229 LabelNameVector ret_list;
230 BOOST_REQUIRE_NO_THROW(fixture.m_db.listNames(reference_label, ret_list, DBDataType::BINARY_DATA));
231 BOOST_REQUIRE((migration_names/migration_labels)/*own items*/ + (migration_labels-1)/*other labels'*/ == ret_list.size());
234 // check number of elements accessible to the other labels
235 for(unsigned int l=0; l<migration_labels; l++)
237 // bypass the reference owner label
238 if(l == migration_reference_label_idx)
242 fixture.generate_label(l, current_label);
243 BOOST_REQUIRE_NO_THROW(fixture.m_db.listNames(current_label, ret_list, DBDataType::BINARY_DATA));
244 BOOST_REQUIRE((migration_names/migration_labels) == ret_list.size());
245 for(auto it: ret_list)
246 BOOST_REQUIRE(it.first == current_label);
250 struct DBVer1Migration : public DBFixture
252 DBVer1Migration() : DBFixture("/usr/share/ckm-db-test/testme_ver1.db")
256 struct DBVer2Migration : public DBFixture
258 DBVer2Migration() : DBFixture("/usr/share/ckm-db-test/testme_ver2.db")
263 BOOST_AUTO_TEST_CASE(DBMigrationDBVer1)
265 DBVer1Migration DBver1;
266 verifyDBisValid(DBver1);
269 BOOST_AUTO_TEST_CASE(DBMigrationDBVer2)
271 DBVer2Migration DBver2;
272 verifyDBisValid(DBver2);
275 BOOST_AUTO_TEST_CASE(DBMigrationDBCurrent)
279 // prepare data using current DB mechanism
280 Label reference_label;
281 currentDB.generate_label(migration_reference_label_idx, reference_label);
283 currentDB.generate_perf_DB(migration_names, migration_names/migration_labels);
285 // only the reference label has access to the other labels element <migration_accessed_element_idx>
286 for(unsigned int l=0; l<migration_labels; l++)
288 // bypass the reference owner label
289 if(l == migration_reference_label_idx)
292 unsigned element_index = migration_accessed_element_idx + l*migration_names/migration_labels;
296 currentDB.generate_name(element_index, accessed_name);
298 currentDB.generate_label(l, current_label);
299 currentDB.add_permission(accessed_name, current_label, reference_label);
303 verifyDBisValid(currentDB);
306 BOOST_AUTO_TEST_SUITE_END()