Skip to content

Commit 2d172fb

Browse files
authored
Merge pull request #10749 from Icinga/fix-certificate-fixture-broken-after-failed-test
Fix `CertificateFixture` error if previous test fails
2 parents 32ca211 + e153e6d commit 2d172fb

File tree

3 files changed

+42
-15
lines changed

3 files changed

+42
-15
lines changed

test/base-tlsutility.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include "base/utility.hpp"
77
#include "remote/pkiutility.hpp"
88
#include "test/remote-certificate-fixture.hpp"
9+
#include "test/test-ctest.hpp"
910
#include <BoostTestTargetConfig.h>
1011
#include <openssl/evp.h>
1112
#include <openssl/x509.h>
@@ -171,7 +172,8 @@ BOOST_AUTO_TEST_CASE(static_certs_uptodate)
171172
BOOST_CHECK(!IsCertUptodate(StringToCertificate(l_ExpiredCrt)));
172173
}
173174

174-
BOOST_FIXTURE_TEST_CASE(create_verify_ca, CertificateFixture)
175+
BOOST_FIXTURE_TEST_CASE(create_verify_ca, CertificateFixture,
176+
*CTestProperties("FIXTURES_REQUIRED dirty_ssl_certs"))
175177
{
176178
auto cacert(GetX509Certificate(m_CaDir.string()+"/ca.crt"));
177179
if constexpr (OPENSSL_VERSION_NUMBER >= 0x10100000L) {
@@ -195,7 +197,8 @@ BOOST_FIXTURE_TEST_CASE(create_verify_ca, CertificateFixture)
195197
BOOST_CHECK(!IsCaUptodate(cacert.get())); // Still outdated, as it's less than LEAF_VALID_FOR.
196198
}
197199

198-
BOOST_FIXTURE_TEST_CASE(create_verify_leaf_certs, CertificateFixture)
200+
BOOST_FIXTURE_TEST_CASE(create_verify_leaf_certs, CertificateFixture,
201+
*CTestProperties("FIXTURES_REQUIRED dirty_ssl_certs"))
199202
{
200203
String caDir = m_CaDir.string();
201204
String certsDir = m_CertsDir.string();

test/remote-certificate-fixture.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,18 @@ static void CleanupPersistentCertificateDir()
2828
}
2929
}
3030

31-
BOOST_FIXTURE_TEST_CASE(prepare_directory, ConfigurationDataDirFixture, *CTestProperties("FIXTURES_SETUP ssl_certs"))
31+
BOOST_FIXTURE_TEST_CASE(prepare_directory_for_dirty_tests, ConfigurationDataDirFixture,
32+
*CTestProperties("FIXTURES_SETUP dirty_ssl_certs"))
33+
{
34+
/* Same as the other prepare_directory below, only that the dirty_ssl_certs fixture this
35+
* establishes cleans up before and after tests that leave behind certs in a broken state.
36+
*/
37+
CleanupPersistentCertificateDir();
38+
}
39+
40+
BOOST_FIXTURE_TEST_CASE(prepare_directory_for_regular_tests, ConfigurationDataDirFixture,
41+
*CTestProperties("FIXTURES_CLEANUP dirty_ssl_certs")
42+
*CTestProperties("FIXTURES_SETUP ssl_certs"))
3243
{
3344
// Remove any existing left-overs of the persistent certificate directory from a previous
3445
// test run.

test/remote-certificate-fixture.hpp

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,30 +20,43 @@ struct CertificateFixture : ConfigurationDataDirFixture
2020
m_CertsDir = ApiListener::GetCertsDir();
2121
m_CaCrtFile = m_CertsDir / "ca.crt";
2222

23-
fs::create_directories(m_PersistentCertsDir / "ca");
24-
fs::create_directories(m_PersistentCertsDir / "certs");
23+
Utility::MkDirP((m_PersistentCertsDir / "ca").string(), 0700);
24+
Utility::MkDirP((m_PersistentCertsDir / "certs").string(), 0700);
2525

26-
if (fs::exists(m_DataDir / "ca")) {
27-
fs::remove(m_DataDir / "ca");
26+
if (Utility::PathExists(m_CaDir.string())) {
27+
Utility::RemoveDirRecursive(m_CaDir.string());
2828
}
29-
if (fs::exists(m_DataDir / "certs")) {
30-
fs::remove(m_DataDir / "certs");
29+
if (Utility::PathExists(m_CertsDir.string())) {
30+
Utility::RemoveDirRecursive(m_CertsDir.string());
3131
}
3232

33-
fs::rename(m_PersistentCertsDir / "ca", m_DataDir / "ca");
34-
fs::rename(m_PersistentCertsDir / "certs", m_DataDir / "certs");
33+
Utility::MkDirP(m_CaDir.string(), 0700);
34+
for(const auto& entry : fs::directory_iterator{m_PersistentCertsDir / "ca"}){
35+
Utility::CopyFile(entry.path().string(), (m_CaDir / entry.path().filename()).string());
36+
}
37+
38+
Utility::MkDirP(m_CertsDir.string(), 0700);
39+
for(const auto& entry : fs::directory_iterator{m_PersistentCertsDir / "certs"}){
40+
Utility::CopyFile(entry.path().string(), (m_CertsDir / entry.path().filename()).string());
41+
}
3542

36-
if (!fs::exists(m_CaCrtFile)) {
43+
if (!Utility::PathExists(m_CaCrtFile.string())) {
3744
PkiUtility::NewCa();
38-
fs::copy_file(m_CaDir / "ca.crt", m_CaCrtFile);
45+
Utility::CopyFile((m_CaDir / "ca.crt").string(), m_CaCrtFile.string());
3946
}
4047
}
4148

4249
~CertificateFixture()
4350
{
4451
namespace fs = boost::filesystem;
45-
fs::rename(m_DataDir / "ca", m_PersistentCertsDir / "ca");
46-
fs::rename(m_DataDir / "certs", m_PersistentCertsDir / "certs");
52+
53+
for(const auto& entry : fs::directory_iterator{m_CaDir}){
54+
Utility::CopyFile(entry.path().string(), (m_PersistentCertsDir / "ca" / entry.path().filename()).string());
55+
}
56+
57+
for(const auto& entry : fs::directory_iterator{m_CertsDir}){
58+
Utility::CopyFile(entry.path().string(), (m_PersistentCertsDir / "certs" / entry.path().filename()).string());
59+
}
4760
}
4861

4962
[[nodiscard]] auto EnsureCertFor(const std::string& name, bool overrideExisting = false) const

0 commit comments

Comments
 (0)