| 198 | |
| 199 | template <typename DrainWorkFn, typename RunOneFn> |
| 200 | void TestDbWrapper(FuzzedDataProvider& provider, |
| 201 | leveldb::Env* testing_env, |
| 202 | DrainWorkFn drain_work, |
| 203 | RunOneFn run_one, |
| 204 | bool allow_force_compact) |
| 205 | { |
| 206 | SeedRandomStateForTest(SeedRand::ZEROS); |
| 207 | |
| 208 | const bool obfuscate{provider.ConsumeBool()}; |
| 209 | |
| 210 | const auto make_db{[&](DBOptions options = {}) { |
| 211 | return std::make_unique<CDBWrapper>(ConsumeDBParams(provider, testing_env, obfuscate, options)); |
| 212 | }}; |
| 213 | std::unique_ptr<CDBWrapper> dbw{make_db()}; |
| 214 | |
| 215 | // Oracle: key → value size. Content is reconstructed via MakeValue(). |
| 216 | Oracle oracle; |
| 217 | |
| 218 | LIMITED_WHILE(provider.ConsumeBool(), 1'000) |
| 219 | { |
| 220 | CallOneOf( |
| 221 | provider, |
| 222 | // --- Mutations --- |
| 223 | [&] { |
| 224 | const auto key{ConsumeKey(provider)}; |
| 225 | const auto size{ConsumeValueSize(provider)}; |
| 226 | drain_work(); |
| 227 | dbw->Write(key, MakeValue(key, size), /*fSync=*/provider.ConsumeBool()); |
| 228 | oracle[key] = size; |
| 229 | }, |
| 230 | [&] { |
| 231 | const auto key{ConsumeKey(provider)}; |
| 232 | drain_work(); |
| 233 | dbw->Erase(key, /*fSync=*/provider.ConsumeBool()); |
| 234 | oracle.erase(key); |
| 235 | }, |
| 236 | [&] { |
| 237 | CDBBatch batch{*dbw}; |
| 238 | std::map<uint16_t, uint32_t> batch_writes; |
| 239 | std::set<uint16_t> batch_erases; |
| 240 | const auto fill{[&] { |
| 241 | LIMITED_WHILE(provider.ConsumeBool(), 20) |
| 242 | { |
| 243 | const auto key{ConsumeKey(provider)}; |
| 244 | if (provider.ConsumeBool()) { |
| 245 | const auto size{ConsumeValueSize(provider)}; |
| 246 | batch.Write(key, MakeValue(key, size)); |
| 247 | batch_writes[key] = size; |
| 248 | batch_erases.erase(key); |
| 249 | } else { |
| 250 | batch.Erase(key); |
| 251 | batch_erases.insert(key); |
| 252 | batch_writes.erase(key); |
| 253 | } |
| 254 | } |
| 255 | }}; |
| 256 | fill(); |
| 257 | if (provider.ConsumeBool()) { |
no test coverage detected