diff --git a/src/test/dbwrapper_tests.cpp b/src/test/dbwrapper_tests.cpp index 3a86036327..bd50db17c1 100644 --- a/src/test/dbwrapper_tests.cpp +++ b/src/test/dbwrapper_tests.cpp @@ -30,18 +30,50 @@ BOOST_AUTO_TEST_CASE(dbwrapper) { // Perform tests both obfuscated and non-obfuscated. for (const bool obfuscate : {false, true}) { - fs::path ph = m_args.GetDataDirBase() / (obfuscate ? "dbwrapper_obfuscate_true" : "dbwrapper_obfuscate_false"); - CDBWrapper dbw({.path = ph, .cache_bytes = 1 << 20, .memory_only = true, .wipe_data = false, .obfuscate = obfuscate}); - uint8_t key{'k'}; - uint256 in = m_rng.rand256(); - uint256 res; + constexpr size_t CACHE_SIZE{1_MiB}; + const fs::path path{m_args.GetDataDirBase() / "dbwrapper"}; - // Ensure that we're doing real obfuscation when obfuscate=true - BOOST_CHECK(obfuscate != is_null_key(dbwrapper_private::GetObfuscateKey(dbw))); + std::vector obfuscation_key{}; + std::vector> key_values{}; - BOOST_CHECK(dbw.Write(key, in)); - BOOST_CHECK(dbw.Read(key, res)); - BOOST_CHECK_EQUAL(res.ToString(), in.ToString()); + // Write values + { + CDBWrapper dbw{{.path = path, .cache_bytes = CACHE_SIZE, .wipe_data = true, .obfuscate = obfuscate}}; + BOOST_CHECK_EQUAL(obfuscate, !dbw.IsEmpty()); + + // Ensure that we're doing real obfuscation when obfuscate=true + obfuscation_key = dbwrapper_private::GetObfuscateKey(dbw); + BOOST_CHECK_EQUAL(obfuscate, !is_null_key(obfuscation_key)); + + for (uint8_t k{0}; k < 10; ++k) { + uint8_t key{k}; + uint256 value{m_rng.rand256()}; + BOOST_CHECK(dbw.Write(key, value)); + key_values.emplace_back(key, value); + } + } + + // Verify that the obfuscation key is never obfuscated + { + CDBWrapper dbw{{.path = path, .cache_bytes = CACHE_SIZE, .obfuscate = false}}; + BOOST_CHECK(obfuscation_key == dbwrapper_private::GetObfuscateKey(dbw)); + } + + // Read back the values + { + CDBWrapper dbw{{.path = path, .cache_bytes = CACHE_SIZE, .obfuscate = obfuscate}}; + + // Ensure obfuscation is read back correctly + BOOST_CHECK(obfuscation_key == dbwrapper_private::GetObfuscateKey(dbw)); + BOOST_CHECK_EQUAL(obfuscate, !is_null_key(obfuscation_key)); + + // Verify all written values + for (const auto& [key, expected_value] : key_values) { + uint256 read_value{}; + BOOST_CHECK(dbw.Read(key, read_value)); + BOOST_CHECK_EQUAL(read_value, expected_value); + } + } } } @@ -57,7 +89,7 @@ BOOST_AUTO_TEST_CASE(dbwrapper_basic_data) bool res_bool; // Ensure that we're doing real obfuscation when obfuscate=true - BOOST_CHECK(obfuscate != is_null_key(dbwrapper_private::GetObfuscateKey(dbw))); + BOOST_CHECK_EQUAL(obfuscate, !is_null_key(dbwrapper_private::GetObfuscateKey(dbw))); //Simulate block raw data - "b + block hash" std::string key_block = "b" + m_rng.rand256().ToString(); @@ -116,13 +148,13 @@ BOOST_AUTO_TEST_CASE(dbwrapper_basic_data) std::string file_option_tag = "F"; uint8_t filename_length = m_rng.randbits(8); std::string filename = "randomfilename"; - std::string key_file_option = strprintf("%s%01x%s", file_option_tag,filename_length,filename); + std::string key_file_option = strprintf("%s%01x%s", file_option_tag, filename_length, filename); bool in_file_bool = m_rng.randbool(); BOOST_CHECK(dbw.Write(key_file_option, in_file_bool)); BOOST_CHECK(dbw.Read(key_file_option, res_bool)); BOOST_CHECK_EQUAL(res_bool, in_file_bool); - } + } } // Test batch operations @@ -231,7 +263,7 @@ BOOST_AUTO_TEST_CASE(existing_data_no_obfuscate) BOOST_CHECK(odbw.Read(key, res2)); BOOST_CHECK_EQUAL(res2.ToString(), in.ToString()); - BOOST_CHECK(!odbw.IsEmpty()); // There should be existing data + BOOST_CHECK(!odbw.IsEmpty()); BOOST_CHECK(is_null_key(dbwrapper_private::GetObfuscateKey(odbw))); // The key should be an empty string uint256 in2 = m_rng.rand256();