b4b69e4f77
Summary: Our existing test notation is very similar to what is used in gtest. It makes it easy to adopt what is different. In this diff I modify existing [[ https://code.google.com/p/googletest/wiki/Primer#Test_Fixtures:_Using_the_Same_Data_Configuration_for_Multiple_Te | test fixture ]] classes to inherit from `testing::Test`. Also for unit tests that use fixture class, `TEST` is replaced with `TEST_F` as required in gtest. There are several custom `main` functions in our existing tests. To make this transition easier, I modify all `main` functions to fallow gtest notation. But eventually we can remove them and use implementation of `main` that gtest provides. ```lang=bash % cat ~/transform #!/bin/sh files=$(git ls-files '*test\.cc') for file in $files do if grep -q "rocksdb::test::RunAllTests()" $file then if grep -Eq '^class \w+Test {' $file then perl -pi -e 's/^(class \w+Test) {/${1}: public testing::Test {/g' $file perl -pi -e 's/^(TEST)/${1}_F/g' $file fi perl -pi -e 's/(int main.*\{)/${1}::testing::InitGoogleTest(&argc, argv);/g' $file perl -pi -e 's/rocksdb::test::RunAllTests/RUN_ALL_TESTS/g' $file fi done % sh ~/transform % make format ``` Second iteration of this diff contains only scripted changes. Third iteration contains manual changes to fix last errors and make it compilable. Test Plan: Build and notice no errors. ```lang=bash % USE_CLANG=1 make check -j55 ``` Tests are still testing. Reviewers: meyering, sdong, rven, igor Reviewed By: igor Subscribers: dhruba, leveldb Differential Revision: https://reviews.facebook.net/D35157
125 lines
3.5 KiB
C++
125 lines
3.5 KiB
C++
// Copyright (c) 2013, Facebook, Inc. All rights reserved.
|
|
// This source code is licensed under the BSD-style license found in the
|
|
// LICENSE file in the root directory of this source tree. An additional grant
|
|
// of patent rights can be found in the PATENTS file in the same directory.
|
|
//
|
|
//
|
|
#include "utilities/geodb/geodb_impl.h"
|
|
|
|
#include <cctype>
|
|
#include "util/testharness.h"
|
|
|
|
namespace rocksdb {
|
|
|
|
class GeoDBTest : public testing::Test {
|
|
public:
|
|
static const std::string kDefaultDbName;
|
|
static Options options;
|
|
DB* db;
|
|
GeoDB* geodb;
|
|
|
|
GeoDBTest() {
|
|
GeoDBOptions geodb_options;
|
|
EXPECT_OK(DestroyDB(kDefaultDbName, options));
|
|
options.create_if_missing = true;
|
|
Status status = DB::Open(options, kDefaultDbName, &db);
|
|
geodb = new GeoDBImpl(db, geodb_options);
|
|
}
|
|
|
|
~GeoDBTest() {
|
|
delete geodb;
|
|
}
|
|
|
|
GeoDB* getdb() {
|
|
return geodb;
|
|
}
|
|
};
|
|
|
|
const std::string GeoDBTest::kDefaultDbName = "/tmp/geodefault";
|
|
Options GeoDBTest::options = Options();
|
|
|
|
// Insert, Get and Remove
|
|
TEST_F(GeoDBTest, SimpleTest) {
|
|
GeoPosition pos1(100, 101);
|
|
std::string id1("id1");
|
|
std::string value1("value1");
|
|
|
|
// insert first object into database
|
|
GeoObject obj1(pos1, id1, value1);
|
|
Status status = getdb()->Insert(obj1);
|
|
ASSERT_TRUE(status.ok());
|
|
|
|
// insert second object into database
|
|
GeoPosition pos2(200, 201);
|
|
std::string id2("id2");
|
|
std::string value2 = "value2";
|
|
GeoObject obj2(pos2, id2, value2);
|
|
status = getdb()->Insert(obj2);
|
|
ASSERT_TRUE(status.ok());
|
|
|
|
// retrieve first object using position
|
|
std::string value;
|
|
status = getdb()->GetByPosition(pos1, Slice(id1), &value);
|
|
ASSERT_TRUE(status.ok());
|
|
ASSERT_EQ(value, value1);
|
|
|
|
// retrieve first object using id
|
|
GeoObject obj;
|
|
status = getdb()->GetById(Slice(id1), &obj);
|
|
ASSERT_TRUE(status.ok());
|
|
ASSERT_EQ(obj.position.latitude, 100);
|
|
ASSERT_EQ(obj.position.longitude, 101);
|
|
ASSERT_EQ(obj.id.compare(id1), 0);
|
|
ASSERT_EQ(obj.value, value1);
|
|
|
|
// delete first object
|
|
status = getdb()->Remove(Slice(id1));
|
|
ASSERT_TRUE(status.ok());
|
|
status = getdb()->GetByPosition(pos1, Slice(id1), &value);
|
|
ASSERT_TRUE(status.IsNotFound());
|
|
status = getdb()->GetById(id1, &obj);
|
|
ASSERT_TRUE(status.IsNotFound());
|
|
|
|
// check that we can still find second object
|
|
status = getdb()->GetByPosition(pos2, id2, &value);
|
|
ASSERT_TRUE(status.ok());
|
|
ASSERT_EQ(value, value2);
|
|
status = getdb()->GetById(id2, &obj);
|
|
ASSERT_TRUE(status.ok());
|
|
}
|
|
|
|
// Search.
|
|
// Verify distances via http://www.stevemorse.org/nearest/distance.php
|
|
TEST_F(GeoDBTest, Search) {
|
|
GeoPosition pos1(45, 45);
|
|
std::string id1("mid1");
|
|
std::string value1 = "midvalue1";
|
|
|
|
// insert object at 45 degree latitude
|
|
GeoObject obj1(pos1, id1, value1);
|
|
Status status = getdb()->Insert(obj1);
|
|
ASSERT_TRUE(status.ok());
|
|
|
|
// search all objects centered at 46 degree latitude with
|
|
// a radius of 200 kilometers. We should find the one object that
|
|
// we inserted earlier.
|
|
std::vector<GeoObject> values;
|
|
status = getdb()->SearchRadial(GeoPosition(46, 46), 200000, &values);
|
|
ASSERT_TRUE(status.ok());
|
|
ASSERT_EQ(values.size(), 1U);
|
|
|
|
// search all objects centered at 46 degree latitude with
|
|
// a radius of 2 kilometers. There should be none.
|
|
values.clear();
|
|
status = getdb()->SearchRadial(GeoPosition(46, 46), 2, &values);
|
|
ASSERT_TRUE(status.ok());
|
|
ASSERT_EQ(values.size(), 0U);
|
|
}
|
|
|
|
} // namespace rocksdb
|
|
|
|
int main(int argc, char* argv[]) {
|
|
::testing::InitGoogleTest(&argc, argv);
|
|
return RUN_ALL_TESTS();
|
|
}
|