/* * Copyright (C) 2015 ScyllaDB */ /* * This file is part of Scylla. * * Scylla is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Scylla is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Scylla. If not, see . */ #pragma once #include "mutation_reader.hh" #include "test/lib/sstable_utils.hh" using populate_fn = std::function&)>; using populate_fn_ex = std::function&, gc_clock::time_point)>; // Must be run in a seastar thread void run_mutation_source_tests(populate_fn populate); void run_mutation_source_tests(populate_fn_ex populate); enum are_equal { no, yes }; // Calls the provided function on mutation pairs, equal and not equal. Is supposed // to exercise all potential ways two mutations may differ. void for_each_mutation_pair(std::function); // Calls the provided function on mutations. Is supposed to exercise as many differences as possible. void for_each_mutation(std::function); // Returns true if mutations in schema s1 can be upgraded to s2. inline bool can_upgrade_schema(schema_ptr from, schema_ptr to) { return from->is_counter() == to->is_counter(); } class random_mutation_generator { class impl; std::unique_ptr _impl; public: struct generate_counters_tag { }; using generate_counters = bool_class; using generate_uncompactable = bool_class; // With generate_uncompactable::yes, the mutation will be uncompactable, that // is no higher level tombstone will cover lower level tombstones and no // tombstone will cover data, i.e. compacting the mutation will not result // in any changes. explicit random_mutation_generator(generate_counters, local_shard_only lso = local_shard_only::yes, generate_uncompactable uc = generate_uncompactable::no); ~random_mutation_generator(); mutation operator()(); // Generates n mutations sharing the same schema nad sorted by their decorated keys. std::vector operator()(size_t n); schema_ptr schema() const; clustering_key make_random_key(); std::vector make_partition_keys(size_t n); std::vector make_random_ranges(unsigned n_ranges); }; bytes make_blob(size_t blob_size); void for_each_schema_change(std::function&, schema_ptr, const std::vector&)>); void compare_readers(const schema&, flat_mutation_reader authority, flat_mutation_reader tested); void compare_readers(const schema&, flat_mutation_reader authority, flat_mutation_reader tested, const std::vector& fwd_ranges);