14#include <gtest/gtest.h>
23template <
typename Builder_,
size_t TableSize_,
size_t NumReads_>
struct ROMTestParams {
39 if constexpr (num_reads > 0 && table_size > 0) {
46 std::vector<std::string> labels = {
"None" };
47 if constexpr (num_reads > 0 && table_size > 0) {
48 labels.push_back(
"ReadValueIncremented");
59 std::vector<bb::fr> table_values;
60 table_values.reserve(table_size);
61 for (
size_t _i = 0; _i < table_size; _i++) {
66 std::vector<uint32_t> init_indices;
67 for (
const auto& val : table_values) {
70 init_indices.push_back(value_index);
77 if constexpr (table_size > 0) {
78 for (
size_t _i = 0; _i < num_reads; ++_i) {
81 bb::fr read_value = table_values[rom_index_to_read];
83 const uint32_t index_for_read =
88 .index = index_for_read,
89 .value = value_for_read };
91 trace.push_back(read_op);
103 switch (invalid_witness_target) {
107 if constexpr (num_reads > 0 && table_size > 0) {
112 const size_t read_value_witness_index = table_size + (random_read * 2) + 1;
113 witness_values[read_value_witness_index] +=
bb::fr(1);
118 return { memory_constraint, witness_values };
121template <
typename Params>
123 public TestClass<ROMTestingFunctions<typename Params::Builder, Params::table_size, Params::num_reads>> {
140 TestFixture::template test_vk_independence<Flavor>();
145 TestFixture::test_tampering();
148template <
typename Builder_,
size_t TableSize_,
size_t NumReads_,
size_t NumWrites_>
struct RAMTestParams {
155template <
typename Builder_,
size_t table_size,
size_t num_reads,
size_t num_writes>
class RAMTestingFunctions {
172 if constexpr (num_reads > 0 && table_size > 0) {
179 std::vector<std::string> labels = {
"None" };
180 if constexpr (num_reads > 0 && table_size > 0) {
181 labels.push_back(
"ReadValueIncremented");
192 std::vector<bb::fr> table_values;
193 table_values.reserve(table_size);
194 for (
size_t _i = 0; _i < table_size; _i++) {
199 std::vector<uint32_t> init_indices;
200 for (
size_t i = 0; i < table_size; ++i) {
201 const auto val = table_values[i];
203 init_indices.push_back(value_index);
207 size_t num_reads_remaining = num_reads;
208 size_t num_writes_remaining = num_writes;
212 while (num_reads_remaining + num_writes_remaining > 0) {
214 if (try_read && (num_reads_remaining > 0)) {
215 read_write_sequence.push_back(AccessType::Read);
216 num_reads_remaining--;
217 }
else if (num_writes_remaining > 0) {
218 read_write_sequence.push_back(AccessType::Write);
219 num_writes_remaining--;
222 for (
size_t _j = 0; _j < num_reads_remaining; _j++) {
223 read_write_sequence.push_back(AccessType::Read);
225 num_reads_remaining = 0;
230 if constexpr (table_size > 0) {
231 for (
auto& access_type : read_write_sequence) {
233 switch (access_type) {
234 case AccessType::Read: {
236 const uint32_t index_for_read =
238 bb::fr read_value = table_values[ram_index_to_read];
241 mem_op = { .
access_type = AccessType::Read, .index = index_for_read, .value = value_for_read };
242 trace.push_back(mem_op);
245 case AccessType::Write: {
247 const uint32_t index_to_write =
253 table_values[ram_index_to_write] = write_value;
255 mem_op = { .
access_type = AccessType::Write, .index = index_to_write, .value = value_to_write };
256 trace.push_back(mem_op);
272 switch (invalid_witness_target) {
276 if constexpr (num_reads > 0 && table_size > 0) {
279 while (memory_constraint.trace[random_read_idx].access_type != AccessType::Read) {
283 const uint32_t witness_idx = memory_constraint.trace[random_read_idx].value;
284 witness_values[witness_idx] +=
bb::fr(1);
289 return { memory_constraint, witness_values };
293template <
typename Params>
295 :
public ::testing::Test,
297 RAMTestingFunctions<typename Params::Builder, Params::table_size, Params::num_reads, Params::num_writes>> {
303using RAMTestConfigs = testing::Types<RAMTestParams<UltraCircuitBuilder, 0, 0, 0>,
320 TestFixture::template test_vk_independence<Flavor>();
325 TestFixture::test_tampering();
328template <CallDataType CallDataType_,
size_t CallDataSize_,
size_t NumReads_>
struct CallDataTestParams {
345 if constexpr (num_reads > 0) {
353 if constexpr (num_reads > 0) {
354 return {
"None",
"ReadValueIncremented" };
366 std::vector<bb::fr> calldata_values;
373 std::vector<uint32_t> init_indices;
376 init_indices.push_back(value_index);
383 for (
size_t idx = 0; idx < num_reads; ++idx) {
386 const uint32_t index_for_read =
388 bb::fr read_value = calldata_values[calldata_idx_to_read];
391 mem_op = { .
access_type = AccessType::Read, .index = index_for_read, .value = value_for_read };
392 trace.push_back(mem_op);
398 .
init = init_indices, .trace =
trace, .type = BlockType::CallData, .calldata_id = calldata_type
407 switch (invalid_witness_target) {
412 if constexpr (num_reads > 0) {
414 const uint32_t witness_idx = memory_constraint.
trace[random_read_idx].index;
415 witness_values[witness_idx] +=
bb::fr(1);
420 return { memory_constraint, witness_values };
431template <
typename Params>
433 :
public ::testing::Test,
434 public TestClass<CallDataTestingFunctions<Params::calldata_type, Params::calldata_size, Params::num_reads>> {
443 TestFixture::template test_vk_independence<MegaFlavor>();
448 TestFixture::test_tampering();
451template <
size_t returndata_size>
467 static std::vector<std::string>
get_labels() {
return {
"None" }; };
475 std::vector<bb::fr> returndata_values;
476 returndata_values.reserve(returndata_size);
477 for (
size_t _i = 0; _i < returndata_size; _i++) {
482 std::vector<uint32_t> init_indices;
483 for (
size_t i = 0; i < returndata_size; ++i) {
485 init_indices.push_back(value_index);
489 memory_constraint =
AcirConstraint{ .
init = init_indices, .trace = {}, .type = BlockType::ReturnData };
497 switch (invalid_witness_target) {
502 return { memory_constraint, witness_values };
511template <
typename Params>
523 TestFixture::template test_vk_independence<MegaFlavor>();
testing::Types< CallDataTestParams< CallDataType::KernelCalldata, 0, 0 >, CallDataTestParams< CallDataType::KernelCalldata, 10, 5 >, CallDataTestParams< CallDataType::FirstAppCalldata, 0, 0 >, CallDataTestParams< CallDataType::FirstAppCalldata, 10, 5 >, CallDataTestParams< CallDataType::SecondAppCalldata, 10, 5 >, CallDataTestParams< CallDataType::ThirdAppCalldata, 10, 5 > > CallDataTestConfigs
testing::Types< RAMTestParams< UltraCircuitBuilder, 0, 0, 0 >, RAMTestParams< UltraCircuitBuilder, 10, 0, 0 >, RAMTestParams< UltraCircuitBuilder, 10, 0, 10 >, RAMTestParams< UltraCircuitBuilder, 10, 10, 0 >, RAMTestParams< UltraCircuitBuilder, 10, 20, 10 >, RAMTestParams< MegaCircuitBuilder, 0, 0, 0 >, RAMTestParams< MegaCircuitBuilder, 10, 0, 0 >, RAMTestParams< MegaCircuitBuilder, 10, 0, 10 >, RAMTestParams< MegaCircuitBuilder, 10, 10, 0 >, RAMTestParams< MegaCircuitBuilder, 10, 20, 10 > > RAMTestConfigs
testing::Types< ROMTestParams< UltraCircuitBuilder, 0, 0 >, ROMTestParams< UltraCircuitBuilder, 10, 0 >, ROMTestParams< UltraCircuitBuilder, 10, 20 >, ROMTestParams< MegaCircuitBuilder, 0, 0 >, ROMTestParams< MegaCircuitBuilder, 10, 0 >, ROMTestParams< MegaCircuitBuilder, 10, 20 > > ROMTestConfigs
testing::Types< ReturnDataTestsParams< 0 >, ReturnDataTestsParams< 10 > > ReturnDataTestConfigs
static std::vector< Target > get_all()
static std::vector< std::string > get_labels()
static ProgramMetadata generate_metadata()
static std::pair< AcirConstraint, WitnessVector > invalidate_witness(AcirConstraint memory_constraint, WitnessVector witness_values, const InvalidWitness::Target &invalid_witness_target)
static void generate_constraints(AcirConstraint &memory_constraint, WitnessVector &witness_values)
static void SetUpTestSuite()
static void SetUpTestSuite()
static std::vector< std::string > get_labels()
static std::vector< Target > get_all()
static std::pair< AcirConstraint, WitnessVector > invalidate_witness(AcirConstraint memory_constraint, WitnessVector witness_values, const InvalidWitness::Target &invalid_witness_target)
static void generate_constraints(AcirConstraint &memory_constraint, WitnessVector &witness_values)
static ProgramMetadata generate_metadata()
static void SetUpTestSuite()
static std::vector< Target > get_all()
static std::vector< std::string > get_labels()
static void generate_constraints(AcirConstraint &memory_constraint, WitnessVector &witness_values)
static ProgramMetadata generate_metadata()
static std::pair< AcirConstraint, WitnessVector > invalidate_witness(AcirConstraint memory_constraint, WitnessVector witness_values, const InvalidWitness::Target &invalid_witness_target)
static std::vector< Target > get_all()
static std::vector< std::string > get_labels()
static ProgramMetadata generate_metadata()
static std::pair< AcirConstraint, WitnessVector > invalidate_witness(AcirConstraint memory_constraint, WitnessVector witness_values, const InvalidWitness::Target &invalid_witness_target)
static void generate_constraints(AcirConstraint &memory_constraint, WitnessVector &witness_values)
static void SetUpTestSuite()
static constexpr size_t returndata_size
virtual uint32_t get_random_uint32()=0
RNG & get_debug_randomness(bool reset, std::uint_fast64_t seed)
std::filesystem::path bb_crs_path()
void init_file_crs_factory(const std::filesystem::path &path)
TYPED_TEST_SUITE(CommitmentKeyTest, Curves)
field< Bn254FrParams > fr
TYPED_TEST(CommitmentKeyTest, CommitToZeroPoly)
MegaCircuitBuilder_< field< Bn254FrParams > > MegaCircuitBuilder
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
static constexpr size_t calldata_size
static constexpr CallDataType calldata_type
static constexpr size_t num_reads
static constexpr size_t table_size
static constexpr size_t num_writes
static constexpr size_t num_reads
static constexpr size_t num_reads
static constexpr size_t table_size
static field random_element(numeric::RNG *engine=nullptr) noexcept