blob: 416c32ce3a6f58fb4b6e08c61fb363705e6a499e [file] [log] [blame]
Zhiyi Zhang91c846b2017-04-12 14:16:31 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Davide Pesavento914d05f2019-07-13 16:20:19 -04002/*
Davide Pesavento0d1d11c2022-04-11 22:11:34 -04003 * Copyright (c) 2017-2022, Regents of the University of California.
Zhiyi Zhang91c846b2017-04-12 14:16:31 -07004 *
5 * This file is part of ndncert, a certificate management system based on NDN.
6 *
7 * ndncert is free software: you can redistribute it and/or modify it under the terms
8 * of the GNU General Public License as published by the Free Software Foundation, either
9 * version 3 of the License, or (at your option) any later version.
10 *
11 * ndncert is distributed in the hope that it will be useful, but WITHOUT ANY
12 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
13 * PARTICULAR PURPOSE. See the GNU General Public License for more details.
14 *
15 * You should have received copies of the GNU General Public License along with
16 * ndncert, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
17 *
18 * See AUTHORS.md for complete list of ndncert authors and contributors.
19 */
20
Zhiyi Zhang062be6d2020-10-14 17:13:43 -070021#include "detail/ca-sqlite.hpp"
Davide Pesavento0d1d11c2022-04-11 22:11:34 -040022
Davide Pesavento829aff62022-05-15 20:30:34 -040023#include "tests/boost-test.hpp"
24#include "tests/key-chain-fixture.hpp"
25
26#include <boost/filesystem/operations.hpp>
27#include <boost/filesystem/path.hpp>
Zhiyi Zhang91c846b2017-04-12 14:16:31 -070028
Davide Pesavento0d1d11c2022-04-11 22:11:34 -040029namespace ndncert::tests {
Zhiyi Zhang91c846b2017-04-12 14:16:31 -070030
Zhiyi Zhang32d4b4e2020-10-28 22:10:49 -070031using namespace ca;
32
Davide Pesavento829aff62022-05-15 20:30:34 -040033class DatabaseFixture : public KeyChainFixture
34{
35public:
36 DatabaseFixture()
37 {
38 boost::filesystem::path parentDir{UNIT_TESTS_TMPDIR};
39 dbDir = parentDir / "test-home" / ".ndncert";
40 if (!boost::filesystem::exists(dbDir)) {
41 boost::filesystem::create_directory(dbDir);
42 }
43 }
44
45 ~DatabaseFixture()
46 {
47 boost::filesystem::remove_all(dbDir);
48 }
49
50protected:
51 boost::filesystem::path dbDir;
52};
53
Zhiyi Zhangae123bf2017-04-14 12:24:53 -070054BOOST_FIXTURE_TEST_SUITE(TestCaSqlite, DatabaseFixture)
Zhiyi Zhang91c846b2017-04-12 14:16:31 -070055
Zhiyi Zhang91c846b2017-04-12 14:16:31 -070056BOOST_AUTO_TEST_CASE(RequestOperations)
57{
Zhiyi Zhangcf214572020-10-06 16:55:43 -070058 CaSqlite storage(Name(), dbDir.string() + "/TestCaSqlite_RequestOperations.db");
Zhiyi Zhang91c846b2017-04-12 14:16:31 -070059
Davide Pesavento829aff62022-05-15 20:30:34 -040060 auto identity1 = m_keyChain.createIdentity(Name("/ndn/site1"));
Zhiyi Zhangae123bf2017-04-14 12:24:53 -070061 auto key1 = identity1.getDefaultKey();
62 auto cert1 = key1.getDefaultCertificate();
Zhiyi Zhang91c846b2017-04-12 14:16:31 -070063
Zhiyi Zhangae123bf2017-04-14 12:24:53 -070064 // add operation
Zhiyi Zhang1f5e86e2020-12-04 15:07:57 -080065 RequestId requestId = {{101}};
66 RequestState request1;
67 request1.caPrefix = Name("/ndn/site1");
68 request1.requestId = requestId;
69 request1.requestType = RequestType::NEW;
70 request1.cert = cert1;
Zhiyi Zhang48f546f2020-12-24 17:31:02 -080071 request1.encryptionKey = {{102}};
72 request1.decryptionIv.assign({1,2,3,4,5,6,7,8,9,10,11,12});
73 request1.decryptionIv.assign({2,3,4,5,6,7,8,9,10,11,12,13});
Zhiyi Zhangc74f1582020-10-06 16:51:51 -070074 storage.addRequest(request1);
Zhiyi Zhangae123bf2017-04-14 12:24:53 -070075
76 // get operation
Zhiyi Zhang8fdb36b2020-10-18 11:58:51 -070077 auto result = storage.getRequest(requestId);
tylerliu7b9185c2020-11-24 12:15:18 -080078 BOOST_CHECK_EQUAL(request1.cert, result.cert);
79 BOOST_CHECK(request1.status == result.status);
80 BOOST_CHECK_EQUAL(request1.caPrefix, result.caPrefix);
81 BOOST_CHECK_EQUAL_COLLECTIONS(request1.encryptionKey.begin(), request1.encryptionKey.end(),
82 result.encryptionKey.begin(), result.encryptionKey.end());
Zhiyi Zhang48f546f2020-12-24 17:31:02 -080083 BOOST_CHECK_EQUAL_COLLECTIONS(request1.encryptionIv.begin(), request1.encryptionIv.end(),
84 result.encryptionIv.begin(), result.encryptionIv.end());
85 BOOST_CHECK_EQUAL_COLLECTIONS(request1.decryptionIv.begin(), request1.decryptionIv.end(),
86 result.decryptionIv.begin(), result.decryptionIv.end());
Zhiyi Zhang91c846b2017-04-12 14:16:31 -070087
Zhiyi Zhangae123bf2017-04-14 12:24:53 -070088 // update operation
Zhiyi Zhang1f5e86e2020-12-04 15:07:57 -080089 RequestState request2;
90 request2.caPrefix = Name("/ndn/site1");
91 request2.requestId = requestId;
92 request2.requestType = RequestType::NEW;
93 request2.cert = cert1;
94 request2.challengeType = "email";
95 JsonSection secret;
96 secret.add("code", "1234");
97 request2.challengeState = ChallengeState("test", time::system_clock::now(), 3,
98 time::seconds(3600), std::move(secret));
Zhiyi Zhang48f546f2020-12-24 17:31:02 -080099 request2.decryptionIv.assign({1,2,3,4,5,6,7,8,9,10,11,14});
100 request2.decryptionIv.assign({2,3,4,5,6,7,8,9,10,11,12,15});
Zhiyi Zhang91c846b2017-04-12 14:16:31 -0700101 storage.updateRequest(request2);
Zhiyi Zhang8fdb36b2020-10-18 11:58:51 -0700102 result = storage.getRequest(requestId);
tylerliu7b9185c2020-11-24 12:15:18 -0800103 BOOST_CHECK_EQUAL(request2.cert, result.cert);
104 BOOST_CHECK(request2.status == result.status);
105 BOOST_CHECK_EQUAL(request2.caPrefix, result.caPrefix);
Zhiyi Zhang48f546f2020-12-24 17:31:02 -0800106 BOOST_CHECK_EQUAL_COLLECTIONS(request2.encryptionIv.begin(), request2.encryptionIv.end(),
107 result.encryptionIv.begin(), result.encryptionIv.end());
108 BOOST_CHECK_EQUAL_COLLECTIONS(request2.decryptionIv.begin(), request2.decryptionIv.end(),
109 result.decryptionIv.begin(), result.decryptionIv.end());
Zhiyi Zhangae123bf2017-04-14 12:24:53 -0700110
Zhiyi Zhang1f5e86e2020-12-04 15:07:57 -0800111 // another add operation
Davide Pesavento829aff62022-05-15 20:30:34 -0400112 auto identity2 = m_keyChain.createIdentity(Name("/ndn/site2"));
Zhiyi Zhangae123bf2017-04-14 12:24:53 -0700113 auto key2 = identity2.getDefaultKey();
114 auto cert2 = key2.getDefaultCertificate();
Zhiyi Zhang1f5e86e2020-12-04 15:07:57 -0800115 RequestId requestId2 = {{102}};
116 RequestState request3;
117 request3.caPrefix = Name("/ndn/site2");
118 request3.requestId = requestId2;
119 request3.requestType = RequestType::NEW;
120 request3.cert = cert2;
Zhiyi Zhangae123bf2017-04-14 12:24:53 -0700121 storage.addRequest(request3);
122
123 // list operation
124 auto allRequests = storage.listAllRequests();
125 BOOST_CHECK_EQUAL(allRequests.size(), 2);
126
Zhiyi Zhang8fdb36b2020-10-18 11:58:51 -0700127 storage.deleteRequest(requestId2);
Zhiyi Zhangae123bf2017-04-14 12:24:53 -0700128 allRequests = storage.listAllRequests();
129 BOOST_CHECK_EQUAL(allRequests.size(), 1);
130
Zhiyi Zhang8fdb36b2020-10-18 11:58:51 -0700131 storage.deleteRequest(requestId);
Zhiyi Zhangae123bf2017-04-14 12:24:53 -0700132 allRequests = storage.listAllRequests();
133 BOOST_CHECK_EQUAL(allRequests.size(), 0);
Zhiyi Zhang91c846b2017-04-12 14:16:31 -0700134}
135
tylerliu63900d52020-09-30 03:01:18 -0700136BOOST_AUTO_TEST_CASE(DuplicateAdd)
137{
Zhiyi Zhang1f5e86e2020-12-04 15:07:57 -0800138 CaSqlite storage(Name(), dbDir.string() + "/TestCaSqlite_DuplicateAdd.db");
tylerliu63900d52020-09-30 03:01:18 -0700139
Davide Pesavento829aff62022-05-15 20:30:34 -0400140 auto identity1 = m_keyChain.createIdentity(Name("/ndn/site1"));
Zhiyi Zhang1f5e86e2020-12-04 15:07:57 -0800141 auto key1 = identity1.getDefaultKey();
142 auto cert1 = key1.getDefaultCertificate();
tylerliu63900d52020-09-30 03:01:18 -0700143
Zhiyi Zhang1f5e86e2020-12-04 15:07:57 -0800144 // add operation
145 RequestId requestId = {{101}};
146 RequestState request1;
147 request1.caPrefix = Name("/ndn/site1");
148 request1.requestId = requestId;
149 request1.requestType = RequestType::NEW;
150 request1.cert = cert1;
151 BOOST_CHECK_NO_THROW(storage.addRequest(request1));
152
153 // add again
154 BOOST_CHECK_THROW(storage.addRequest(request1), std::runtime_error);
tylerliu63900d52020-09-30 03:01:18 -0700155}
156
Davide Pesavento0dc02012021-11-23 22:55:03 -0500157BOOST_AUTO_TEST_SUITE_END() // TestCaSqlite
Zhiyi Zhang91c846b2017-04-12 14:16:31 -0700158
Davide Pesavento0d1d11c2022-04-11 22:11:34 -0400159} // namespace ndncert::tests