forked from EvergreenCrypto/docker-finance
container: root: test: benchmark/unit: add bitcoin plugin support
- Adds test cases and benchmark for bitcoin's RNG via `dfi`'s `Random` * Currently only supports one of bitcoin's RNG's (`FastRandomContext`)
This commit is contained in:
@@ -128,6 +128,30 @@ BENCHMARK_F(RandomLibsodium, generate)(::benchmark::State& state) // NOLINT
|
|||||||
random.generate();
|
random.generate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bitcoin
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifdef __DFI_PLUGIN_BITCOIN__
|
||||||
|
//! \brief Bitcoin Random fixture w/ real implementation
|
||||||
|
//! \since docker-finance 1.1.0
|
||||||
|
struct RandomBitcoin : public ::benchmark::Fixture,
|
||||||
|
public tests::RandomBitcoin_Impl
|
||||||
|
{
|
||||||
|
void SetUp(const ::benchmark::State& state) {}
|
||||||
|
void TearDown(const ::benchmark::State& state) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
BENCHMARK_F(RandomBitcoin, generate)(::benchmark::State& state) // NOLINT
|
||||||
|
{
|
||||||
|
for (auto st : state)
|
||||||
|
{
|
||||||
|
random.generate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
} // namespace benchmarks
|
} // namespace benchmarks
|
||||||
} // namespace tests
|
} // namespace tests
|
||||||
} // namespace dfi
|
} // namespace dfi
|
||||||
|
|||||||
@@ -90,6 +90,18 @@ struct RandomLibsodium_Impl
|
|||||||
using Random = ::dfi::crypto::libsodium::Random;
|
using Random = ::dfi::crypto::libsodium::Random;
|
||||||
Random random;
|
Random random;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef __DFI_PLUGIN_BITCOIN__
|
||||||
|
//! \brief Bitcoin random implementation fixture
|
||||||
|
//! \since docker-finance 1.1.0
|
||||||
|
struct RandomBitcoin_Impl
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
using Random = ::dfi::crypto::bitcoin::Random;
|
||||||
|
Random random;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
} // namespace tests
|
} // namespace tests
|
||||||
} // namespace dfi
|
} // namespace dfi
|
||||||
|
|
||||||
|
|||||||
@@ -70,6 +70,11 @@ TEST_F(RandomInterface, generate_uint32_t)
|
|||||||
ASSERT_EQ(random.generate<uint32_t>(), std::numeric_limits<uint32_t>::max());
|
ASSERT_EQ(random.generate<uint32_t>(), std::numeric_limits<uint32_t>::max());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(RandomInterface, generate_uint64_t)
|
||||||
|
{
|
||||||
|
ASSERT_EQ(random.generate<uint64_t>(), std::numeric_limits<uint64_t>::max());
|
||||||
|
}
|
||||||
|
|
||||||
TEST_F(RandomInterface, generate_int16_t)
|
TEST_F(RandomInterface, generate_int16_t)
|
||||||
{
|
{
|
||||||
ASSERT_EQ(random.generate<int16_t>(), std::numeric_limits<int16_t>::max());
|
ASSERT_EQ(random.generate<int16_t>(), std::numeric_limits<int16_t>::max());
|
||||||
@@ -96,9 +101,13 @@ struct RandomFixture : public ::testing::Test, protected t_impl
|
|||||||
auto two = t_impl::random.template generate<t_random>();
|
auto two = t_impl::random.template generate<t_random>();
|
||||||
static_assert(std::is_same_v<decltype(two), t_random>);
|
static_assert(std::is_same_v<decltype(two), t_random>);
|
||||||
|
|
||||||
// NOTE: t_random limits are implementation-specific
|
// TODO(unassigned): gtest implicit conversion of uint64_t with ASSERT_NEAR
|
||||||
ASSERT_NEAR(0, one, std::numeric_limits<t_random>::max());
|
if constexpr (!std::is_same_v<t_random, uint64_t>)
|
||||||
ASSERT_NEAR(0, two, std::numeric_limits<t_random>::max());
|
{
|
||||||
|
// NOTE: t_random limits are implementation-specific
|
||||||
|
ASSERT_NEAR(0, one, std::numeric_limits<t_random>::max());
|
||||||
|
ASSERT_NEAR(0, two, std::numeric_limits<t_random>::max());
|
||||||
|
}
|
||||||
|
|
||||||
// Exceedingly rare (tests the obvious, but is not an accurate entropy test)
|
// Exceedingly rare (tests the obvious, but is not an accurate entropy test)
|
||||||
// If fails, re-run tests to confirm
|
// If fails, re-run tests to confirm
|
||||||
@@ -176,6 +185,28 @@ TEST_F(RandomLibsodium, generate_uint32_t)
|
|||||||
ASSERT_NO_THROW(generate<uint32_t>());
|
ASSERT_NO_THROW(generate<uint32_t>());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef __DFI_PLUGIN_BITCOIN__
|
||||||
|
//
|
||||||
|
// Bitcoin
|
||||||
|
//
|
||||||
|
|
||||||
|
//! \brief Bitcoin random number fixture
|
||||||
|
//! \since docker-finance 1.1.0
|
||||||
|
struct RandomBitcoin : public RandomFixture<tests::RandomBitcoin_Impl>
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST_F(RandomBitcoin, generate_uint32_t)
|
||||||
|
{
|
||||||
|
ASSERT_NO_THROW(generate<uint32_t>());
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(RandomBitcoin, generate_uint64_t)
|
||||||
|
{
|
||||||
|
ASSERT_NO_THROW(generate<uint64_t>());
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
} // namespace unit
|
} // namespace unit
|
||||||
} // namespace tests
|
} // namespace tests
|
||||||
} // namespace dfi
|
} // namespace dfi
|
||||||
|
|||||||
Reference in New Issue
Block a user