blob: fc82af09563134a0d9ba4d1747ee6f8250ab21fd [file] [log] [blame]
Alexander Afanasyeve4f8c3b2016-06-23 16:03:48 -07001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Davide Pesavento7e780642018-11-24 15:51:34 -05002/*
Davide Pesavento51974f62024-12-21 20:42:45 -05003 * Copyright (c) 2013-2024 Regents of the University of California.
Alexander Afanasyeve4f8c3b2016-06-23 16:03:48 -07004 *
5 * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
6 *
7 * ndn-cxx library is free software: you can redistribute it and/or modify it under the
8 * terms of the GNU Lesser General Public License as published by the Free Software
9 * Foundation, either version 3 of the License, or (at your option) any later version.
10 *
11 * ndn-cxx library 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 Lesser General Public License for more details.
14 *
15 * You should have received copies of the GNU General Public License and GNU Lesser
16 * General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
17 * <http://www.gnu.org/licenses/>.
18 *
19 * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
20 */
21
Davide Pesavento09904412021-03-24 16:40:53 -040022#ifndef NDN_CXX_TESTS_TEST_HOME_FIXTURE_HPP
23#define NDN_CXX_TESTS_TEST_HOME_FIXTURE_HPP
Alexander Afanasyeve4f8c3b2016-06-23 16:03:48 -070024
Alexander Afanasyev09236c22020-06-03 13:42:38 -040025#include "ndn-cxx/security/key-chain.hpp"
Alexander Afanasyeve4f8c3b2016-06-23 16:03:48 -070026
Davide Pesavento7e780642018-11-24 15:51:34 -050027#include <cstdlib>
Davide Pesavento51974f62024-12-21 20:42:45 -050028#include <filesystem>
Alexander Afanasyevcf490552016-06-27 22:51:36 -070029#include <fstream>
Davide Pesavento7e780642018-11-24 15:51:34 -050030#include <initializer_list>
31
Davide Pesavento25d4f1c2020-04-29 23:31:04 -040032#include <boost/algorithm/string/replace.hpp>
Alexander Afanasyeve4f8c3b2016-06-23 16:03:48 -070033
Davide Pesavento47ce2ee2023-05-09 01:33:33 -040034namespace ndn::tests {
Alexander Afanasyeve4f8c3b2016-06-23 16:03:48 -070035
36/**
37 * @brief Fixture to adjust/restore NDN_CLIENT_PIB and NDN_CLIENT_TPM paths
38 *
39 * Note that the specified PATH will be removed after fixture is destroyed.
40 * **Do not specify non-temporary paths.**
41 */
42template<class Path>
43class PibDirFixture
44{
45public:
46 PibDirFixture()
Alexander Afanasyeve4f8c3b2016-06-23 16:03:48 -070047 {
Davide Pesavento51974f62024-12-21 20:42:45 -050048 if (const char* envPib = std::getenv("NDN_CLIENT_PIB"); envPib != nullptr) {
49 m_oldPib = envPib;
Alexander Afanasyeve4f8c3b2016-06-23 16:03:48 -070050 }
Davide Pesavento51974f62024-12-21 20:42:45 -050051 if (const char* envTpm = std::getenv("NDN_CLIENT_TPM"); envTpm != nullptr) {
52 m_oldTpm = envTpm;
Alexander Afanasyeve4f8c3b2016-06-23 16:03:48 -070053 }
54
55 /// @todo Consider change to an in-memory PIB/TPM
56 setenv("NDN_CLIENT_PIB", ("pib-sqlite3:" + m_pibDir).c_str(), true);
57 setenv("NDN_CLIENT_TPM", ("tpm-file:" + m_pibDir).c_str(), true);
58 }
59
60 ~PibDirFixture()
61 {
62 if (!m_oldPib.empty()) {
Davide Pesavento7e780642018-11-24 15:51:34 -050063 setenv("NDN_CLIENT_PIB", m_oldPib.data(), true);
Alexander Afanasyeve4f8c3b2016-06-23 16:03:48 -070064 }
65 else {
66 unsetenv("NDN_CLIENT_PIB");
67 }
68
69 if (!m_oldTpm.empty()) {
Davide Pesavento7e780642018-11-24 15:51:34 -050070 setenv("NDN_CLIENT_TPM", m_oldTpm.data(), true);
Alexander Afanasyeve4f8c3b2016-06-23 16:03:48 -070071 }
72 else {
73 unsetenv("NDN_CLIENT_TPM");
74 }
75
Davide Pesavento51974f62024-12-21 20:42:45 -050076 std::filesystem::remove_all(m_pibDir);
Davide Pesavento0e768ef2022-05-09 20:03:44 -040077 KeyChain::resetDefaultLocators();
Alexander Afanasyeve4f8c3b2016-06-23 16:03:48 -070078 }
79
80protected:
Davide Pesavento3fdb02f2023-04-12 02:32:38 -040081 const std::string m_pibDir{Path::PATH};
Alexander Afanasyeve4f8c3b2016-06-23 16:03:48 -070082
83private:
84 std::string m_oldPib;
85 std::string m_oldTpm;
86};
87
Alexander Afanasyevcf490552016-06-27 22:51:36 -070088/**
89 * @brief Extension of PibDirFixture to set TEST_HOME variable and allow config file creation
90 */
91template<class Path>
92class TestHomeFixture : public PibDirFixture<Path>
93{
94public:
95 TestHomeFixture()
96 {
97 setenv("TEST_HOME", this->m_pibDir.c_str(), true);
98 }
99
100 ~TestHomeFixture()
101 {
102 unsetenv("TEST_HOME");
103 }
104
105 void
Davide Pesavento7e780642018-11-24 15:51:34 -0500106 createClientConf(std::initializer_list<std::string> lines) const
Alexander Afanasyevcf490552016-06-27 22:51:36 -0700107 {
Davide Pesavento51974f62024-12-21 20:42:45 -0500108 auto ndnDir = std::filesystem::path(this->m_pibDir) / ".ndn";
109 std::filesystem::create_directories(ndnDir);
110 std::ofstream of(ndnDir / "client.conf");
Alexander Afanasyevcf490552016-06-27 22:51:36 -0700111 for (auto line : lines) {
112 boost::replace_all(line, "%PATH%", this->m_pibDir);
113 of << line << std::endl;
114 }
115 }
116};
117
Alexander Afanasyeve4f8c3b2016-06-23 16:03:48 -0700118struct DefaultPibDir
119{
Davide Pesavento3fdb02f2023-04-12 02:32:38 -0400120 static constexpr std::string_view PATH{"build/keys"};
Alexander Afanasyeve4f8c3b2016-06-23 16:03:48 -0700121};
122
Davide Pesavento47ce2ee2023-05-09 01:33:33 -0400123} // namespace ndn::tests
Alexander Afanasyeve4f8c3b2016-06-23 16:03:48 -0700124
Davide Pesavento09904412021-03-24 16:40:53 -0400125#endif // NDN_CXX_TESTS_TEST_HOME_FIXTURE_HPP