From 9907b61c574baf0747747f1c512f7cdd88ebed25 Mon Sep 17 00:00:00 2001 From: KunoiSayami Date: Tue, 9 Nov 2021 22:00:01 +0800 Subject: init --- issues/issue200_test.cc | 59 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 issues/issue200_test.cc (limited to 'issues/issue200_test.cc') diff --git a/issues/issue200_test.cc b/issues/issue200_test.cc new file mode 100644 index 0000000..4eba23a --- /dev/null +++ b/issues/issue200_test.cc @@ -0,0 +1,59 @@ +// Copyright (c) 2013 The LevelDB Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. See the AUTHORS file for names of contributors. + +// Test for issue 200: when iterator switches direction from backward +// to forward, the current key can be yielded unexpectedly if a new +// mutation has been added just before the current key. + +#include "gtest/gtest.h" +#include "leveldb/db.h" +#include "util/testutil.h" + +namespace leveldb { + +TEST(Issue200, Test) { + // Get rid of any state from an old run. + std::string dbpath = testing::TempDir() + "leveldb_issue200_test"; + DestroyDB(dbpath, Options()); + + DB* db; + Options options; + options.create_if_missing = true; + ASSERT_LEVELDB_OK(DB::Open(options, dbpath, &db)); + + WriteOptions write_options; + ASSERT_LEVELDB_OK(db->Put(write_options, "1", "b")); + ASSERT_LEVELDB_OK(db->Put(write_options, "2", "c")); + ASSERT_LEVELDB_OK(db->Put(write_options, "3", "d")); + ASSERT_LEVELDB_OK(db->Put(write_options, "4", "e")); + ASSERT_LEVELDB_OK(db->Put(write_options, "5", "f")); + + ReadOptions read_options; + Iterator* iter = db->NewIterator(read_options); + + // Add an element that should not be reflected in the iterator. + ASSERT_LEVELDB_OK(db->Put(write_options, "25", "cd")); + + iter->Seek("5"); + ASSERT_EQ(iter->key().ToString(), "5"); + iter->Prev(); + ASSERT_EQ(iter->key().ToString(), "4"); + iter->Prev(); + ASSERT_EQ(iter->key().ToString(), "3"); + iter->Next(); + ASSERT_EQ(iter->key().ToString(), "4"); + iter->Next(); + ASSERT_EQ(iter->key().ToString(), "5"); + + delete iter; + delete db; + DestroyDB(dbpath, options); +} + +} // namespace leveldb + +int main(int argc, char** argv) { + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} -- cgit v1.3.1