blob: 80037ed7b3b1875946edfef36fea1efcbb11e749 [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 Pesaventocde062e2024-12-14 16:50:10 -05003 * Copyright (c) 2017-2024, 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
Davide Pesaventocde062e2024-12-14 16:50:10 -050026#include <filesystem>
27#include <system_error>
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()
Davide Pesaventocde062e2024-12-14 16:50:10 -050037 : dbDir(std::filesystem::path{UNIT_TESTS_TMPDIR} / "test-home" / ".ndncert")
Davide Pesavento829aff62022-05-15 20:30:34 -040038 {
Davide Pesaventocde062e2024-12-14 16:50:10 -050039 std::filesystem::create_directory(dbDir);
Davide Pesavento829aff62022-05-15 20:30:34 -040040 }
41
42 ~DatabaseFixture()
43 {
Davide Pesaventocde062e2024-12-14 16:50:10 -050044 std::error_code ec;
45 std::filesystem::remove_all(dbDir, ec); // ignore error
Davide Pesavento829aff62022-05-15 20:30:34 -040046 }
47
48protected:
Davide Pesaventocde062e2024-12-14 16:50:10 -050049 std::filesystem::path dbDir;
Davide Pesavento829aff62022-05-15 20:30:34 -040050};
51
Zhiyi Zhangae123bf2017-04-14 12:24:53 -070052BOOST_FIXTURE_TEST_SUITE(TestCaSqlite, DatabaseFixture)
Zhiyi Zhang91c846b2017-04-12 14:16:31 -070053
Zhiyi Zhang91c846b2017-04-12 14:16:31 -070054BOOST_AUTO_TEST_CASE(RequestOperations)
55{
Zhiyi Zhangcf214572020-10-06 16:55:43 -070056 CaSqlite storage(Name(), dbDir.string() + "/TestCaSqlite_RequestOperations.db");
Zhiyi Zhang91c846b2017-04-12 14:16:31 -070057
Davide Pesavento829aff62022-05-15 20:30:34 -040058 auto identity1 = m_keyChain.createIdentity(Name("/ndn/site1"));
Zhiyi Zhangae123bf2017-04-14 12:24:53 -070059 auto key1 = identity1.getDefaultKey();
60 auto cert1 = key1.getDefaultCertificate();
Zhiyi Zhang91c846b2017-04-12 14:16:31 -070061
Zhiyi Zhangae123bf2017-04-14 12:24:53 -070062 // add operation
Zhiyi Zhang1f5e86e2020-12-04 15:07:57 -080063 RequestId requestId = {{101}};
64 RequestState request1;
65 request1.caPrefix = Name("/ndn/site1");
66 request1.requestId = requestId;
67 request1.requestType = RequestType::NEW;
68 request1.cert = cert1;
Zhiyi Zhang48f546f2020-12-24 17:31:02 -080069 request1.encryptionKey = {{102}};
70 request1.decryptionIv.assign({1,2,3,4,5,6,7,8,9,10,11,12});
71 request1.decryptionIv.assign({2,3,4,5,6,7,8,9,10,11,12,13});
Zhiyi Zhangc74f1582020-10-06 16:51:51 -070072 storage.addRequest(request1);
Zhiyi Zhangae123bf2017-04-14 12:24:53 -070073
74 // get operation
Zhiyi Zhang8fdb36b2020-10-18 11:58:51 -070075 auto result = storage.getRequest(requestId);
tylerliu7b9185c2020-11-24 12:15:18 -080076 BOOST_CHECK_EQUAL(request1.cert, result.cert);
77 BOOST_CHECK(request1.status == result.status);
78 BOOST_CHECK_EQUAL(request1.caPrefix, result.caPrefix);
79 BOOST_CHECK_EQUAL_COLLECTIONS(request1.encryptionKey.begin(), request1.encryptionKey.end(),
80 result.encryptionKey.begin(), result.encryptionKey.end());
Zhiyi Zhang48f546f2020-12-24 17:31:02 -080081 BOOST_CHECK_EQUAL_COLLECTIONS(request1.encryptionIv.begin(), request1.encryptionIv.end(),
82 result.encryptionIv.begin(), result.encryptionIv.end());
83 BOOST_CHECK_EQUAL_COLLECTIONS(request1.decryptionIv.begin(), request1.decryptionIv.end(),
84 result.decryptionIv.begin(), result.decryptionIv.end());
Zhiyi Zhang91c846b2017-04-12 14:16:31 -070085
Zhiyi Zhangae123bf2017-04-14 12:24:53 -070086 // update operation
Zhiyi Zhang1f5e86e2020-12-04 15:07:57 -080087 RequestState request2;
88 request2.caPrefix = Name("/ndn/site1");
89 request2.requestId = requestId;
90 request2.requestType = RequestType::NEW;
91 request2.cert = cert1;
92 request2.challengeType = "email";
93 JsonSection secret;
94 secret.add("code", "1234");
95 request2.challengeState = ChallengeState("test", time::system_clock::now(), 3,
96 time::seconds(3600), std::move(secret));
Zhiyi Zhang48f546f2020-12-24 17:31:02 -080097 request2.decryptionIv.assign({1,2,3,4,5,6,7,8,9,10,11,14});
98 request2.decryptionIv.assign({2,3,4,5,6,7,8,9,10,11,12,15});
Zhiyi Zhang91c846b2017-04-12 14:16:31 -070099 storage.updateRequest(request2);
Zhiyi Zhang8fdb36b2020-10-18 11:58:51 -0700100 result = storage.getRequest(requestId);
tylerliu7b9185c2020-11-24 12:15:18 -0800101 BOOST_CHECK_EQUAL(request2.cert, result.cert);
102 BOOST_CHECK(request2.status == result.status);
103 BOOST_CHECK_EQUAL(request2.caPrefix, result.caPrefix);
Zhiyi Zhang48f546f2020-12-24 17:31:02 -0800104 BOOST_CHECK_EQUAL_COLLECTIONS(request2.encryptionIv.begin(), request2.encryptionIv.end(),
105 result.encryptionIv.begin(), result.encryptionIv.end());
106 BOOST_CHECK_EQUAL_COLLECTIONS(request2.decryptionIv.begin(), request2.decryptionIv.end(),
107 result.decryptionIv.begin(), result.decryptionIv.end());
Zhiyi Zhangae123bf2017-04-14 12:24:53 -0700108
Zhiyi Zhang1f5e86e2020-12-04 15:07:57 -0800109 // another add operation
Davide Pesavento829aff62022-05-15 20:30:34 -0400110 auto identity2 = m_keyChain.createIdentity(Name("/ndn/site2"));
Zhiyi Zhangae123bf2017-04-14 12:24:53 -0700111 auto key2 = identity2.getDefaultKey();
112 auto cert2 = key2.getDefaultCertificate();
Zhiyi Zhang1f5e86e2020-12-04 15:07:57 -0800113 RequestId requestId2 = {{102}};
114 RequestState request3;
115 request3.caPrefix = Name("/ndn/site2");
116 request3.requestId = requestId2;
117 request3.requestType = RequestType::NEW;
118 request3.cert = cert2;
Zhiyi Zhangae123bf2017-04-14 12:24:53 -0700119 storage.addRequest(request3);
120
121 // list operation
122 auto allRequests = storage.listAllRequests();
123 BOOST_CHECK_EQUAL(allRequests.size(), 2);
124
Zhiyi Zhang8fdb36b2020-10-18 11:58:51 -0700125 storage.deleteRequest(requestId2);
Zhiyi Zhangae123bf2017-04-14 12:24:53 -0700126 allRequests = storage.listAllRequests();
127 BOOST_CHECK_EQUAL(allRequests.size(), 1);
128
Zhiyi Zhang8fdb36b2020-10-18 11:58:51 -0700129 storage.deleteRequest(requestId);
Zhiyi Zhangae123bf2017-04-14 12:24:53 -0700130 allRequests = storage.listAllRequests();
131 BOOST_CHECK_EQUAL(allRequests.size(), 0);
Zhiyi Zhang91c846b2017-04-12 14:16:31 -0700132}
133
tylerliu63900d52020-09-30 03:01:18 -0700134BOOST_AUTO_TEST_CASE(DuplicateAdd)
135{
Zhiyi Zhang1f5e86e2020-12-04 15:07:57 -0800136 CaSqlite storage(Name(), dbDir.string() + "/TestCaSqlite_DuplicateAdd.db");
tylerliu63900d52020-09-30 03:01:18 -0700137
Davide Pesavento829aff62022-05-15 20:30:34 -0400138 auto identity1 = m_keyChain.createIdentity(Name("/ndn/site1"));
Zhiyi Zhang1f5e86e2020-12-04 15:07:57 -0800139 auto key1 = identity1.getDefaultKey();
140 auto cert1 = key1.getDefaultCertificate();
tylerliu63900d52020-09-30 03:01:18 -0700141
Zhiyi Zhang1f5e86e2020-12-04 15:07:57 -0800142 // add operation
143 RequestId requestId = {{101}};
144 RequestState request1;
145 request1.caPrefix = Name("/ndn/site1");
146 request1.requestId = requestId;
147 request1.requestType = RequestType::NEW;
148 request1.cert = cert1;
149 BOOST_CHECK_NO_THROW(storage.addRequest(request1));
150
151 // add again
152 BOOST_CHECK_THROW(storage.addRequest(request1), std::runtime_error);
tylerliu63900d52020-09-30 03:01:18 -0700153}
154
Davide Pesavento0dc02012021-11-23 22:55:03 -0500155BOOST_AUTO_TEST_SUITE_END() // TestCaSqlite
Zhiyi Zhang91c846b2017-04-12 14:16:31 -0700156
Davide Pesavento0d1d11c2022-04-11 22:11:34 -0400157} // namespace ndncert::tests