Skip to content

Commit 79e8d72

Browse files
switch test_db tests to TraitsTest
1 parent 41a3913 commit 79e8d72

File tree

3 files changed

+316
-110
lines changed

3 files changed

+316
-110
lines changed
Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
// Copyright (C) 2025 Category Labs, Inc.
2+
//
3+
// This program is free software: you can redistribute it and/or modify
4+
// it under the terms of the GNU General Public License as published by
5+
// the Free Software Foundation, either version 3 of the License, or
6+
// (at your option) any later version.
7+
//
8+
// This program is distributed in the hope that it will be useful,
9+
// but WITHOUT ANY WARRANTY; without even the implied warranty of
10+
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+
// GNU General Public License for more details.
12+
//
13+
// You should have received a copy of the GNU General Public License
14+
// along with this program. If not, see <http://www.gnu.org/licenses/>.
15+
16+
#pragma once
17+
18+
#include <category/execution/ethereum/db/trie_db.hpp>
19+
#include <category/execution/ethereum/db/util.hpp>
20+
#include <category/mpt/ondisk_db_config.hpp>
21+
#include <category/vm/evm/traits.hpp>
22+
#include <category/vm/vm.hpp>
23+
#include <monad/test/traits_test.hpp>
24+
25+
#include <gtest/gtest.h>
26+
27+
using namespace monad;
28+
29+
namespace
30+
{
31+
template <typename T, T rev>
32+
struct TrieDbFixtureTraits : public ::testing::Test
33+
{
34+
vm::VM vm;
35+
36+
static constexpr auto get_trait()
37+
{
38+
if constexpr (std::same_as<T, monad_revision>) {
39+
return monad::MonadTraits<rev>{};
40+
}
41+
else if constexpr (std::same_as<T, evmc_revision>) {
42+
return monad::EvmTraits<rev>{};
43+
}
44+
else {
45+
return std::monostate{};
46+
}
47+
}
48+
49+
using Trait = decltype(get_trait());
50+
51+
static constexpr std::string get_traits_name()
52+
{
53+
if constexpr (std::same_as<T, monad_revision>) {
54+
return "/" + std::string(monad_revision_to_string(
55+
monad::MonadTraits<rev>::monad_rev()));
56+
}
57+
else if constexpr (std::same_as<T, evmc_revision>) {
58+
return "/" + std::string(evmc_revision_to_string(
59+
monad::EvmTraits<rev>::evm_rev()));
60+
}
61+
else {
62+
return "";
63+
}
64+
}
65+
};
66+
67+
template <typename T, T rev>
68+
struct InMemoryTrieDbFixtureTraits : public TrieDbFixtureTraits<T, rev>
69+
{
70+
static constexpr bool on_disk = false;
71+
72+
InMemoryMachine machine;
73+
mpt::Db db{machine};
74+
TrieDb tdb{db};
75+
76+
static constexpr auto get_name()
77+
{
78+
return "InMemoryTrieDbFixture" +
79+
TrieDbFixtureTraits<T, rev>::get_traits_name();
80+
}
81+
};
82+
83+
template <monad_revision rev>
84+
using MonadInMemoryTrieDbFixtureTraits =
85+
InMemoryTrieDbFixtureTraits<monad_revision, rev>;
86+
87+
template <evmc_revision rev>
88+
using EvmInMemoryTrieDbFixtureTraits =
89+
InMemoryTrieDbFixtureTraits<evmc_revision, rev>;
90+
91+
template <typename T, T rev>
92+
struct OnDiskTrieDbFixtureTraits : public TrieDbFixtureTraits<T, rev>
93+
{
94+
static constexpr bool on_disk = true;
95+
96+
OnDiskMachine machine;
97+
mpt::Db db{machine, mpt::OnDiskDbConfig{}};
98+
TrieDb tdb{db};
99+
100+
static constexpr auto get_name()
101+
{
102+
return "OnDiskTrieDbFixture" +
103+
TrieDbFixtureTraits<T, rev>::get_traits_name();
104+
}
105+
};
106+
107+
template <monad_revision rev>
108+
using MonadOnDiskTrieDbFixtureTraits =
109+
OnDiskTrieDbFixtureTraits<monad_revision, rev>;
110+
111+
template <evmc_revision rev>
112+
using EvmOnDiskTrieDbFixtureTraits =
113+
OnDiskTrieDbFixtureTraits<evmc_revision, rev>;
114+
115+
// Helper to concatenate four ::testing::Types
116+
template <typename... Ts>
117+
struct concat_types;
118+
119+
template <
120+
typename... Ts1, typename... Ts2, typename... Ts3, typename... Ts4>
121+
struct concat_types<
122+
::testing::Types<Ts1...>, ::testing::Types<Ts2...>,
123+
::testing::Types<Ts3...>, ::testing::Types<Ts4...>>
124+
{
125+
using type = ::testing::Types<Ts1..., Ts2..., Ts3..., Ts4...>;
126+
};
127+
128+
template <typename... Ts>
129+
using concat_types_t = typename concat_types<Ts...>::type;
130+
131+
// Union of MonadRevisionTypes and EvmRevisionTypes for both InMemoryTrieDb
132+
// and OnDiskTrieDb
133+
using MonadEvmRevisionDBTypes = concat_types_t<
134+
decltype(make_monad_revision_types<MonadInMemoryTrieDbFixtureTraits>()),
135+
decltype(make_evm_revision_types<EvmInMemoryTrieDbFixtureTraits>()),
136+
decltype(make_monad_revision_types<MonadOnDiskTrieDbFixtureTraits>()),
137+
decltype(make_evm_revision_types<EvmOnDiskTrieDbFixtureTraits>())>;
138+
139+
struct RevisionTestNameGenerator
140+
{
141+
template <typename T>
142+
static std::string GetName(int)
143+
{
144+
return T::get_name();
145+
}
146+
};
147+
}
148+
149+
using InMemoryTrieDbFixture = InMemoryTrieDbFixtureTraits<std::monostate, {}>;
150+
using OnDiskTrieDbFixture = OnDiskTrieDbFixtureTraits<std::monostate, {}>;
151+
152+
template <typename TDB>
153+
struct DBTest : public TDB
154+
{
155+
};
156+
157+
using DBTypes = ::testing::Types<InMemoryTrieDbFixture, OnDiskTrieDbFixture>;
158+
TYPED_TEST_SUITE(DBTest, DBTypes, RevisionTestNameGenerator);
159+
160+
template <typename TDB>
161+
struct DBTraitsTest : public TDB
162+
{
163+
};
164+
165+
TYPED_TEST_SUITE(
166+
DBTraitsTest, MonadEvmRevisionDBTypes, RevisionTestNameGenerator);

0 commit comments

Comments
 (0)