diff options
Diffstat (limited to 'vespalib')
24 files changed, 839 insertions, 1179 deletions
diff --git a/vespalib/src/tests/btree/CMakeLists.txt b/vespalib/src/tests/btree/CMakeLists.txt index bf4edc9e5e9..3b6f012a888 100644 --- a/vespalib/src/tests/btree/CMakeLists.txt +++ b/vespalib/src/tests/btree/CMakeLists.txt @@ -20,6 +20,7 @@ vespa_add_executable(vespalib_btreeaggregation_test_app TEST btreeaggregation_test.cpp DEPENDS vespalib + GTest::gtest ) vespa_add_test(NAME vespalib_btreeaggregation_test_app COMMAND vespalib_btreeaggregation_test_app COST 30) vespa_add_executable(vespalib_iteratespeed_app diff --git a/vespalib/src/tests/btree/btreeaggregation_test.cpp b/vespalib/src/tests/btree/btreeaggregation_test.cpp index b33242b918e..34c1ca76772 100644 --- a/vespalib/src/tests/btree/btreeaggregation_test.cpp +++ b/vespalib/src/tests/btree/btreeaggregation_test.cpp @@ -16,8 +16,8 @@ #include <vespa/vespalib/btree/btreeaggregator.hpp> #include <vespa/vespalib/datastore/buffer_type.hpp> #include <vespa/vespalib/datastore/compaction_strategy.h> +#include <vespa/vespalib/gtest/gtest.h> #include <vespa/vespalib/test/btree/btree_printer.h> -#include <vespa/vespalib/testkit/testapp.h> #include <vespa/vespalib/util/rand48.h> #include <iostream> @@ -216,115 +216,95 @@ cleanup(GenerationHandler & g, cleanup(g, m); } -class Test : public vespalib::TestApp { -private: +class BTreeAggregationTest : public ::testing::Test { +protected: + BTreeAggregationTest(); + ~BTreeAggregationTest() override; template <typename Tree> bool assertTree(const std::string & exp, const Tree &t); template <typename Tree> bool - assertAggregated(const MockTree &m, const Tree &t); + assertAggregated(const MockTree &m, const Tree &t, const vespalib::string& label); template <typename TreeStore> bool - assertAggregated(const MockTree &m, const TreeStore &s, EntryRef ref); + assertAggregated(const MockTree &m, const TreeStore &s, EntryRef ref, const vespalib::string& label); void buildSubTree(const std::vector<LeafPair> &sub, size_t numEntries); - - void requireThatNodeInsertWorks(); - void keys_are_aggregated_correctly_on_node_insertions(); - void requireThatNodeSplitInsertWorks(); - void keys_are_aggregated_correctly_when_node_split_on_insert(); - void requireThatTreeInsertWorks(); - void requireThatNodeStealWorks(); - void requireThatNodeRemoveWorks(); - void keys_are_aggregated_correctly_on_node_removal(); - void requireThatWeCanInsertAndRemoveFromTree(); - void requireThatSortedTreeInsertWorks(); - void requireThatCornerCaseTreeFindWorks(); - void requireThatBasicTreeIteratorWorks(); - void requireThatTreeIteratorAssignWorks(); - void requireThatUpdateOfKeyWorks(); - void requireThatUpdateOfDataWorks(); - void requireThatFrozenViewProvidesAggregatedValues(); - - void - requireThatSmallNodesWorks(); -public: - int Main() override; }; +BTreeAggregationTest::BTreeAggregationTest() = default; +BTreeAggregationTest::~BTreeAggregationTest() = default; template<typename Tree> bool -Test::assertTree(const std::string &exp, const Tree &t) +BTreeAggregationTest::assertTree(const std::string &exp, const Tree &t) { std::stringstream ss; test::BTreePrinter<std::stringstream, typename Tree::NodeAllocatorType> printer(ss, t.getAllocator()); printer.print(t.getRoot()); - if (!EXPECT_EQUAL(exp, ss.str())) return false; - return true; + bool failed = false; + EXPECT_EQ(exp, ss.str()) << (failed = true, ""); + return !failed; } template <typename Tree> bool -Test::assertAggregated(const MockTree &m, const Tree &t) +BTreeAggregationTest::assertAggregated(const MockTree &m, const Tree &t, const vespalib::string& label) { + SCOPED_TRACE(label); const MinMaxAggregated &ta(t.getAggregated()); + bool failed = false; if (t.getRoot().valid()) { - return - EXPECT_FALSE(m._rtree.empty()) && - EXPECT_EQUAL(m._rtree.rbegin()->first, - ta.getMax()) && - EXPECT_EQUAL(m._rtree.begin()->first, - ta.getMin()); + EXPECT_FALSE(m._rtree.empty()) << (failed = true, ""); + if (failed) { + return false; + } + EXPECT_EQ(m._rtree.rbegin()->first, ta.getMax()) << (failed = true, ""); + EXPECT_EQ(m._rtree.begin()->first, ta.getMin()) << (failed = true, ""); } else { - return EXPECT_TRUE(m._rtree.empty()) && - EXPECT_EQUAL(std::numeric_limits<int32_t>::min(), - ta.getMax()) && - EXPECT_EQUAL(std::numeric_limits<int32_t>::max(), - ta.getMin()); + EXPECT_TRUE(m._rtree.empty()) << (failed = true, ""); + EXPECT_EQ(std::numeric_limits<int32_t>::min(), ta.getMax()) << (failed = true, ""); + EXPECT_EQ(std::numeric_limits<int32_t>::max(), ta.getMin()) << (failed = true, ""); } + return !failed; } template <typename TreeStore> bool -Test::assertAggregated(const MockTree &m, const TreeStore &s, EntryRef ref) +BTreeAggregationTest::assertAggregated(const MockTree &m, const TreeStore &s, EntryRef ref, const vespalib::string& label) { + SCOPED_TRACE(label); typename TreeStore::Iterator i(s.begin(ref)); MinMaxAggregated sa(s.getAggregated(ref)); const MinMaxAggregated &ia(i.getAggregated()); + bool failed = false; if (ref.valid()) { - return - EXPECT_FALSE(m._rtree.empty()) && - EXPECT_EQUAL(m._rtree.rbegin()->first, - ia.getMax()) && - EXPECT_EQUAL(m._rtree.begin()->first, - ia.getMin()) && - EXPECT_EQUAL(m._rtree.rbegin()->first, - sa.getMax()) && - EXPECT_EQUAL(m._rtree.begin()->first, - sa.getMin()); + EXPECT_FALSE(m._rtree.empty()) << (failed = true, ""); + if (failed) { + return false; + } + EXPECT_EQ(m._rtree.rbegin()->first, ia.getMax()) << (failed = true, ""); + EXPECT_EQ(m._rtree.begin()->first, ia.getMin()) << (failed = true, ""); + EXPECT_EQ(m._rtree.rbegin()->first, sa.getMax()) << (failed = true, ""); + EXPECT_EQ(m._rtree.begin()->first, sa.getMin()) << (failed = true, ""); } else { - return EXPECT_TRUE(m._rtree.empty()) && - EXPECT_EQUAL(std::numeric_limits<int32_t>::min(), - ia.getMax()) && - EXPECT_EQUAL(std::numeric_limits<int32_t>::max(), - ia.getMin()) && - EXPECT_EQUAL(std::numeric_limits<int32_t>::min(), - sa.getMax()) && - EXPECT_EQUAL(std::numeric_limits<int32_t>::max(), - sa.getMin()); + EXPECT_TRUE(m._rtree.empty()) << (failed = true, ""); + EXPECT_EQ(std::numeric_limits<int32_t>::min(), ia.getMax()) << (failed = true, ""); + EXPECT_EQ(std::numeric_limits<int32_t>::max(), ia.getMin()) << (failed = true, ""); + EXPECT_EQ(std::numeric_limits<int32_t>::min(), sa.getMax()) << (failed =true, ""); + EXPECT_EQ(std::numeric_limits<int32_t>::max(), sa.getMin()) << (failed =true, ""); } + return !failed; } -void -Test::requireThatNodeInsertWorks() +TEST_F(BTreeAggregationTest, require_that_node_insert_works) { MyTree t; t.insert(20, 102); @@ -336,7 +316,8 @@ Test::requireThatNodeInsertWorks() EXPECT_TRUE(assertTree("{{10:101,20:102,30:103,40:104[min=101,max=104]}}", t)); } -void Test::keys_are_aggregated_correctly_on_node_insertions() { +TEST_F(BTreeAggregationTest, keys_are_aggregated_correctly_on_node_insertions) +{ MyKeyAggrTree t; t.insert(20, 102); EXPECT_TRUE(assertTree("{{20:102[min=20,max=20]}}", t)); @@ -367,8 +348,7 @@ populateLeafNode(Tree &t) populateTree(t, 4, 2); } -void -Test::requireThatNodeSplitInsertWorks() +TEST_F(BTreeAggregationTest, require_that_node_split_insert_works) { { // new entry in current node MyTree t; @@ -396,7 +376,8 @@ Test::requireThatNodeSplitInsertWorks() } } -void Test::keys_are_aggregated_correctly_when_node_split_on_insert() { +TEST_F(BTreeAggregationTest, keys_are_aggregated_correctly_when_node_split_on_insert) +{ { // new entry in current node MyKeyAggrTree t; populateLeafNode(t); @@ -423,8 +404,7 @@ void Test::keys_are_aggregated_correctly_when_node_split_on_insert() { } } -void -Test::requireThatTreeInsertWorks() +TEST_F(BTreeAggregationTest, require_that_tree_insert_works) { { // multi level node split MyTree t; @@ -523,8 +503,7 @@ struct BTreeStealTraits } -void -Test::requireThatNodeStealWorks() +TEST_F(BTreeAggregationTest, require_that_node_steal_works) { typedef BTree<MyKey, int32_t, btree::MinMaxAggregated, @@ -602,8 +581,7 @@ Test::requireThatNodeStealWorks() } } -void -Test::requireThatNodeRemoveWorks() +TEST_F(BTreeAggregationTest, require_that_node_remove_works) { MyTree t; populateLeafNode(t); @@ -615,7 +593,8 @@ Test::requireThatNodeRemoveWorks() EXPECT_TRUE(assertTree("{{5:105[min=105,max=105]}}", t)); } -void Test::keys_are_aggregated_correctly_on_node_removal() { +TEST_F(BTreeAggregationTest, keys_are_aggregated_correctly_on_node_removal) +{ MyKeyAggrTree t; populateLeafNode(t); t.remove(3); @@ -640,7 +619,7 @@ generateData(std::vector<LeafPair> & data, size_t numEntries) } void -Test::buildSubTree(const std::vector<LeafPair> &sub, +BTreeAggregationTest::buildSubTree(const std::vector<LeafPair> &sub, size_t numEntries) { GenerationHandler g; @@ -660,31 +639,31 @@ Test::buildSubTree(const std::vector<LeafPair> &sub, assert(numEntries == tree.size()); assert(tree.isValid()); - TEST_DO(EXPECT_TRUE(assertAggregated(mock, tree))); - EXPECT_EQUAL(numEntries, tree.size()); + EXPECT_TRUE(assertAggregated(mock, tree, "build_sub_tree")); + EXPECT_EQ(numEntries, tree.size()); EXPECT_TRUE(tree.isValid()); MyTree::Iterator itr = tree.begin(); MyTree::Iterator ritr = itr; if (numEntries > 0) { EXPECT_TRUE(ritr.valid()); - EXPECT_EQUAL(0u, ritr.position()); + EXPECT_EQ(0u, ritr.position()); --ritr; EXPECT_TRUE(!ritr.valid()); - EXPECT_EQUAL(numEntries, ritr.position()); + EXPECT_EQ(numEntries, ritr.position()); --ritr; EXPECT_TRUE(ritr.valid()); - EXPECT_EQUAL(numEntries - 1, ritr.position()); + EXPECT_EQ(numEntries - 1, ritr.position()); } else { EXPECT_TRUE(!ritr.valid()); - EXPECT_EQUAL(0u, ritr.position()); + EXPECT_EQ(0u, ritr.position()); --ritr; EXPECT_TRUE(!ritr.valid()); - EXPECT_EQUAL(0u, ritr.position()); + EXPECT_EQ(0u, ritr.position()); } for (size_t i = 0; i < numEntries; ++i) { EXPECT_TRUE(itr.valid()); - EXPECT_EQUAL(sorted[i].first, itr.getKey()); - EXPECT_EQUAL(sorted[i].second, itr.getData()); + EXPECT_EQ(sorted[i].first, itr.getKey()); + EXPECT_EQ(sorted[i].second, itr.getData()); ++itr; } EXPECT_TRUE(!itr.valid()); @@ -693,22 +672,21 @@ Test::buildSubTree(const std::vector<LeafPair> &sub, --ritr; for (size_t i = 0; i < numEntries; ++i) { EXPECT_TRUE(ritr.valid()); - EXPECT_EQUAL(sorted[numEntries - 1 - i].first, ritr.getKey()); - EXPECT_EQUAL(sorted[numEntries - 1 - i].second, ritr.getData()); + EXPECT_EQ(sorted[numEntries - 1 - i].first, ritr.getKey()); + EXPECT_EQ(sorted[numEntries - 1 - i].second, ritr.getData()); --ritr; } EXPECT_TRUE(!ritr.valid()); } -void -Test::requireThatWeCanInsertAndRemoveFromTree() +TEST_F(BTreeAggregationTest, require_that_we_can_insert_and_remove_from_tree) { GenerationHandler g; MyTree tree; MockTree mock; std::vector<LeafPair> exp; std::vector<LeafPair> sorted; - TEST_DO(EXPECT_TRUE(assertAggregated(mock, tree))); + EXPECT_TRUE(assertAggregated(mock, tree, "insert_and_remove_1")); size_t numEntries = 1000; generateData(exp, numEntries); sorted = exp; @@ -722,15 +700,15 @@ Test::requireThatWeCanInsertAndRemoveFromTree() EXPECT_TRUE(tree.insert(num, val)); EXPECT_TRUE(!tree.insert(num, val)); mock.insert(num, val); - TEST_DO(EXPECT_TRUE(assertAggregated(mock, tree))); + EXPECT_TRUE(assertAggregated(mock, tree, "insert_and_remove_2")); for (size_t j = 0; j <= i; ++j) { //LOG(info, "find[%zu](%d)", j, exp[j].first._val); MyTree::Iterator itr = tree.find(exp[j].first); EXPECT_TRUE(itr.valid()); - EXPECT_EQUAL(exp[j].first, itr.getKey()); - EXPECT_EQUAL(exp[j].second, itr.getData()); + EXPECT_EQ(exp[j].first, itr.getKey()); + EXPECT_EQ(exp[j].second, itr.getData()); } - EXPECT_EQUAL(i + 1u, tree.size()); + EXPECT_EQ(i + 1u, tree.size()); EXPECT_TRUE(tree.isValid()); buildSubTree(exp, i + 1); } @@ -745,36 +723,36 @@ Test::requireThatWeCanInsertAndRemoveFromTree() ++itre; if (numEntries > 0) { EXPECT_TRUE(ritr.valid()); - EXPECT_EQUAL(0u, ritr.position()); + EXPECT_EQ(0u, ritr.position()); --ritr; EXPECT_TRUE(!ritr.valid()); - EXPECT_EQUAL(numEntries, ritr.position()); + EXPECT_EQ(numEntries, ritr.position()); --ritr; EXPECT_TRUE(ritr.valid()); - EXPECT_EQUAL(numEntries - 1, ritr.position()); + EXPECT_EQ(numEntries - 1, ritr.position()); } else { EXPECT_TRUE(!ritr.valid()); - EXPECT_EQUAL(0u, ritr.position()); + EXPECT_EQ(0u, ritr.position()); --ritr; EXPECT_TRUE(!ritr.valid()); - EXPECT_EQUAL(0u, ritr.position()); + EXPECT_EQ(0u, ritr.position()); } MyTree::Iterator pitr = itr; for (size_t i = 0; i < numEntries; ++i) { ssize_t si = i; ssize_t sileft = numEntries - i; EXPECT_TRUE(itr.valid()); - EXPECT_EQUAL(i, itr.position()); - EXPECT_EQUAL(sileft, itre - itr); - EXPECT_EQUAL(-sileft, itr - itre); - EXPECT_EQUAL(sileft, itre2 - itr); - EXPECT_EQUAL(-sileft, itr - itre2); - EXPECT_EQUAL(si, itr - tree.begin()); - EXPECT_EQUAL(-si, tree.begin() - itr); - EXPECT_EQUAL(i != 0, itr - pitr); - EXPECT_EQUAL(-(i != 0), pitr - itr); - EXPECT_EQUAL(sorted[i].first, itr.getKey()); - EXPECT_EQUAL(sorted[i].second, itr.getData()); + EXPECT_EQ(i, itr.position()); + EXPECT_EQ(sileft, itre - itr); + EXPECT_EQ(-sileft, itr - itre); + EXPECT_EQ(sileft, itre2 - itr); + EXPECT_EQ(-sileft, itr - itre2); + EXPECT_EQ(si, itr - tree.begin()); + EXPECT_EQ(-si, tree.begin() - itr); + EXPECT_EQ(i != 0, itr - pitr); + EXPECT_EQ(-(i != 0), pitr - itr); + EXPECT_EQ(sorted[i].first, itr.getKey()); + EXPECT_EQ(sorted[i].second, itr.getData()); pitr = itr; ++itr; ritr = itr; @@ -783,12 +761,12 @@ Test::requireThatWeCanInsertAndRemoveFromTree() EXPECT_TRUE(ritr == pitr); } EXPECT_TRUE(!itr.valid()); - EXPECT_EQUAL(numEntries, itr.position()); + EXPECT_EQ(numEntries, itr.position()); ssize_t sNumEntries = numEntries; - EXPECT_EQUAL(sNumEntries, itr - tree.begin()); - EXPECT_EQUAL(-sNumEntries, tree.begin() - itr); - EXPECT_EQUAL(1, itr - pitr); - EXPECT_EQUAL(-1, pitr - itr); + EXPECT_EQ(sNumEntries, itr - tree.begin()); + EXPECT_EQ(-sNumEntries, tree.begin() - itr); + EXPECT_EQ(1, itr - pitr); + EXPECT_EQ(-1, pitr - itr); } // compact full tree by calling incremental compaction methods in a loop { @@ -818,52 +796,50 @@ Test::requireThatWeCanInsertAndRemoveFromTree() EXPECT_TRUE(!tree.remove(num)); EXPECT_TRUE(tree.isValid()); mock.erase(num); - TEST_DO(EXPECT_TRUE(assertAggregated(mock, tree))); + EXPECT_TRUE(assertAggregated(mock, tree, "insert_and_remove3")); for (size_t j = i + 1; j < numEntries; ++j) { MyTree::Iterator itr = tree.find(exp[j].first); EXPECT_TRUE(itr.valid()); - EXPECT_EQUAL(exp[j].first, itr.getKey()); - EXPECT_EQUAL(exp[j].second, itr.getData()); + EXPECT_EQ(exp[j].first, itr.getKey()); + EXPECT_EQ(exp[j].second, itr.getData()); } - EXPECT_EQUAL(numEntries - 1 - i, tree.size()); + EXPECT_EQ(numEntries - 1 - i, tree.size()); } } -void -Test::requireThatSortedTreeInsertWorks() +TEST_F(BTreeAggregationTest, require_that_sorted_tree_insert_works) { { MyTree tree; MockTree mock; - TEST_DO(EXPECT_TRUE(assertAggregated(mock, tree))); + EXPECT_TRUE(assertAggregated(mock, tree, "sorted_tree_insert1")); for (int i = 0; i < 1000; ++i) { EXPECT_TRUE(tree.insert(i, toVal(i))); mock.insert(i, toVal(i)); MyTree::Iterator itr = tree.find(i); EXPECT_TRUE(itr.valid()); - EXPECT_EQUAL(toVal(i), itr.getData()); + EXPECT_EQ(toVal(i), itr.getData()); EXPECT_TRUE(tree.isValid()); - TEST_DO(EXPECT_TRUE(assertAggregated(mock, tree))); + EXPECT_TRUE(assertAggregated(mock, tree, "sorted_tree_insert2")); } } { MyTree tree; MockTree mock; - TEST_DO(EXPECT_TRUE(assertAggregated(mock, tree))); + EXPECT_TRUE(assertAggregated(mock, tree, "sorted_tree_insert3")); for (int i = 1000; i > 0; --i) { EXPECT_TRUE(tree.insert(i, toVal(i))); mock.insert(i, toVal(i)); MyTree::Iterator itr = tree.find(i); EXPECT_TRUE(itr.valid()); - EXPECT_EQUAL(toVal(i), itr.getData()); + EXPECT_EQ(toVal(i), itr.getData()); EXPECT_TRUE(tree.isValid()); - TEST_DO(EXPECT_TRUE(assertAggregated(mock, tree))); + EXPECT_TRUE(assertAggregated(mock, tree, "sorted_tree_insert4")); } } } -void -Test::requireThatCornerCaseTreeFindWorks() +TEST_F(BTreeAggregationTest, require_that_corner_case_tree_find_works) { GenerationHandler g; MyTree tree; @@ -874,8 +850,7 @@ Test::requireThatCornerCaseTreeFindWorks() EXPECT_TRUE(!tree.find(1000).valid()); // higher than highest } -void -Test::requireThatBasicTreeIteratorWorks() +TEST_F(BTreeAggregationTest, require_that_basic_tree_iterator_works) { GenerationHandler g; MyTree tree; @@ -890,27 +865,24 @@ Test::requireThatBasicTreeIteratorWorks() size_t ei = 0; MyTree::Iterator itr = tree.begin(); MyTree::Iterator ritr; - EXPECT_EQUAL(1000u, itr.size()); + EXPECT_EQ(1000u, itr.size()); for (; itr.valid(); ++itr) { //LOG(info, "itr(%d, %s)", itr.getKey(), itr.getData().c_str()); - EXPECT_EQUAL(UNWRAP(exp[ei].first), UNWRAP(itr.getKey())); - EXPECT_EQUAL(exp[ei].second, itr.getData()); + EXPECT_EQ(UNWRAP(exp[ei].first), UNWRAP(itr.getKey())); + EXPECT_EQ(exp[ei].second, itr.getData()); ei++; ritr = itr; } - EXPECT_EQUAL(numEntries, ei); + EXPECT_EQ(numEntries, ei); for (; ritr.valid(); --ritr) { --ei; //LOG(info, "itr(%d, %s)", itr.getKey(), itr.getData().c_str()); - EXPECT_EQUAL(UNWRAP(exp[ei].first), UNWRAP(ritr.getKey())); - EXPECT_EQUAL(exp[ei].second, ritr.getData()); + EXPECT_EQ(UNWRAP(exp[ei].first), UNWRAP(ritr.getKey())); + EXPECT_EQ(exp[ei].second, ritr.getData()); } } - - -void -Test::requireThatTreeIteratorAssignWorks() +TEST_F(BTreeAggregationTest, require_that_tree_iterator_assign_works) { GenerationHandler g; MyTree tree; @@ -923,9 +895,9 @@ Test::requireThatTreeIteratorAssignWorks() EXPECT_TRUE(itr == itr2); int expNum = i; for (; itr2.valid(); ++itr2) { - EXPECT_EQUAL(expNum++, UNWRAP(itr2.getKey())); + EXPECT_EQ(expNum++, UNWRAP(itr2.getKey())); } - EXPECT_EQUAL(1000, expNum); + EXPECT_EQ(1000, expNum); } } @@ -940,8 +912,7 @@ struct UpdKeyComp { } }; -void -Test::requireThatUpdateOfKeyWorks() +TEST_F(BTreeAggregationTest, require_that_update_of_key_works) { using UpdKeyTree = BTree<int, BTreeNoLeafData, btree::NoAggregated, UpdKeyComp &>; using UpdKeyTreeIterator = UpdKeyTree::Iterator; @@ -951,7 +922,7 @@ Test::requireThatUpdateOfKeyWorks() for (int i = 0; i < 1000; i+=2) { EXPECT_TRUE(t.insert(i, BTreeNoLeafData(), cmp1)); } - EXPECT_EQUAL(0u, cmp1._numErrors); + EXPECT_EQ(0u, cmp1._numErrors); for (int i = 0; i < 1000; i+=2) { UpdKeyTreeIterator itr = t.find(i, cmp1); itr.writeKey(i + 1); @@ -961,23 +932,22 @@ Test::requireThatUpdateOfKeyWorks() UpdKeyTreeIterator itr = t.find(i, cmp2); EXPECT_TRUE(itr.valid()); } - EXPECT_EQUAL(0u, cmp2._numErrors); + EXPECT_EQ(0u, cmp2._numErrors); } -void -Test::requireThatUpdateOfDataWorks() +TEST_F(BTreeAggregationTest, require_that_update_of_data_works) { GenerationHandler g; MyTree t; MockTree mock; MyAggrCalc ac; MyTree::NodeAllocatorType &manager = t.getAllocator(); - TEST_DO(EXPECT_TRUE(assertAggregated(mock, t))); + EXPECT_TRUE(assertAggregated(mock, t, "update_data1")); for (int i = 0; i < 1000; i+=2) { EXPECT_TRUE(t.insert(i, toVal(i))); mock.insert(i, toVal(i)); - TEST_DO(EXPECT_TRUE(assertAggregated(mock, t))); + EXPECT_TRUE(assertAggregated(mock, t, "udate_data2")); } freezeTree(g, manager); for (int i = 0; i < 1000; i+=2) { @@ -985,31 +955,31 @@ Test::requireThatUpdateOfDataWorks() MyTree::Iterator itr2 = itr; t.thaw(itr); itr.updateData(toHighVal(i), ac); - EXPECT_EQUAL(toHighVal(i), itr.getData()); - EXPECT_EQUAL(toVal(i), itr2.getData()); + EXPECT_EQ(toHighVal(i), itr.getData()); + EXPECT_EQ(toVal(i), itr2.getData()); mock.erase(i); mock.insert(i, toHighVal(i)); - TEST_DO(EXPECT_TRUE(assertAggregated(mock, t))); + EXPECT_TRUE(assertAggregated(mock, t, "update_data3")); freezeTree(g, manager); itr = t.find(i); itr2 = itr; t.thaw(itr); itr.updateData(toLowVal(i), ac); - EXPECT_EQUAL(toLowVal(i), itr.getData()); - EXPECT_EQUAL(toHighVal(i), itr2.getData()); + EXPECT_EQ(toLowVal(i), itr.getData()); + EXPECT_EQ(toHighVal(i), itr2.getData()); mock.erase(i); mock.insert(i, toLowVal(i)); - TEST_DO(EXPECT_TRUE(assertAggregated(mock, t))); + EXPECT_TRUE(assertAggregated(mock, t, "update_data4")); freezeTree(g, manager); itr = t.find(i); itr2 = itr; t.thaw(itr); itr.updateData(toVal(i), ac); - EXPECT_EQUAL(toVal(i), itr.getData()); - EXPECT_EQUAL(toLowVal(i), itr2.getData()); + EXPECT_EQ(toVal(i), itr.getData()); + EXPECT_EQ(toLowVal(i), itr2.getData()); mock.erase(i); mock.insert(i, toVal(i)); - TEST_DO(EXPECT_TRUE(assertAggregated(mock, t))); + EXPECT_TRUE(assertAggregated(mock, t, "update_data5")); freezeTree(g, manager); } } @@ -1030,68 +1000,67 @@ remove(MyTreeStore& s, EntryRef& root, MyTreeStore::KeyType removal) } -void -Test::requireThatSmallNodesWorks() +TEST_F(BTreeAggregationTest, require_that_small_nodes_works) { GenerationHandler g; MyTreeStore s; MockTree mock; EntryRef root; - EXPECT_EQUAL(0u, s.size(root)); + EXPECT_EQ(0u, s.size(root)); EXPECT_TRUE(s.isSmallArray(root)); - TEST_DO(EXPECT_TRUE(assertAggregated(mock, s, root))); + EXPECT_TRUE(assertAggregated(mock, s, root, "small1")); insert(s, root, {40, toVal(40)}); mock.insert(40, toVal(40)); - EXPECT_EQUAL(1u, s.size(root)); + EXPECT_EQ(1u, s.size(root)); EXPECT_TRUE(s.isSmallArray(root)); - TEST_DO(EXPECT_TRUE(assertAggregated(mock, s, root))); + EXPECT_TRUE(assertAggregated(mock, s, root, "small2")); insert(s, root, {20, toVal(20)}); mock.insert(20, toVal(20)); - EXPECT_EQUAL(2u, s.size(root)); + EXPECT_EQ(2u, s.size(root)); EXPECT_TRUE(s.isSmallArray(root)); - TEST_DO(EXPECT_TRUE(assertAggregated(mock, s, root))); + EXPECT_TRUE(assertAggregated(mock, s, root, "small3")); insert(s, root, {60, toVal(60)}); mock.insert(60, toVal(60)); - EXPECT_EQUAL(3u, s.size(root)); + EXPECT_EQ(3u, s.size(root)); EXPECT_TRUE(s.isSmallArray(root)); - TEST_DO(EXPECT_TRUE(assertAggregated(mock, s, root))); + EXPECT_TRUE(assertAggregated(mock, s, root, "small4")); insert(s, root, {50, toVal(50)}); mock.insert(50, toVal(50)); - EXPECT_EQUAL(4u, s.size(root)); + EXPECT_EQ(4u, s.size(root)); EXPECT_TRUE(s.isSmallArray(root)); - TEST_DO(EXPECT_TRUE(assertAggregated(mock, s, root))); + EXPECT_TRUE(assertAggregated(mock, s, root, "small5")); for (uint32_t i = 0; i < 100; ++i) { insert(s, root, {int(1000 + i), 42}); mock.insert(1000 + i, 42); - EXPECT_EQUAL(5u + i, s.size(root)); - EXPECT_EQUAL(5u + i <= MyTreeStore::clusterLimit, s.isSmallArray(root)); - TEST_DO(EXPECT_TRUE(assertAggregated(mock, s, root))); + EXPECT_EQ(5u + i, s.size(root)); + EXPECT_EQ(5u + i <= MyTreeStore::clusterLimit, s.isSmallArray(root)); + EXPECT_TRUE(assertAggregated(mock, s, root, "small6")); } remove(s, root, 40); mock.erase(40); - EXPECT_EQUAL(103u, s.size(root)); + EXPECT_EQ(103u, s.size(root)); EXPECT_TRUE(!s.isSmallArray(root)); - TEST_DO(EXPECT_TRUE(assertAggregated(mock, s, root))); + EXPECT_TRUE(assertAggregated(mock, s, root, "small7")); remove(s, root, 20); mock.erase(20); - EXPECT_EQUAL(102u, s.size(root)); + EXPECT_EQ(102u, s.size(root)); EXPECT_TRUE(!s.isSmallArray(root)); - TEST_DO(EXPECT_TRUE(assertAggregated(mock, s, root))); + EXPECT_TRUE(assertAggregated(mock, s, root, "small8")); remove(s, root, 50); mock.erase(50); - EXPECT_EQUAL(101u, s.size(root)); + EXPECT_EQ(101u, s.size(root)); EXPECT_TRUE(!s.isSmallArray(root)); - TEST_DO(EXPECT_TRUE(assertAggregated(mock, s, root))); + EXPECT_TRUE(assertAggregated(mock, s, root, "small9")); for (uint32_t i = 0; i < 100; ++i) { remove(s, root, 1000 + i); mock.erase(1000 + i); - EXPECT_EQUAL(100 - i, s.size(root)); - EXPECT_EQUAL(100 - i <= MyTreeStore::clusterLimit, s.isSmallArray(root)); - TEST_DO(EXPECT_TRUE(assertAggregated(mock, s, root))); + EXPECT_EQ(100 - i, s.size(root)); + EXPECT_EQ(100 - i <= MyTreeStore::clusterLimit, s.isSmallArray(root)); + EXPECT_TRUE(assertAggregated(mock, s, root, "small10")); } - EXPECT_EQUAL(1u, s.size(root)); + EXPECT_EQ(1u, s.size(root)); EXPECT_TRUE(s.isSmallArray(root)); s.clear(root); @@ -1102,8 +1071,7 @@ Test::requireThatSmallNodesWorks() s.reclaim_memory(g.get_oldest_used_generation()); } -void -Test::requireThatFrozenViewProvidesAggregatedValues() +TEST_F(BTreeAggregationTest, require_that_frozen_view_provides_aggregated_values) { MyTree t; t.insert(20, 102); @@ -1114,39 +1082,13 @@ Test::requireThatFrozenViewProvidesAggregatedValues() t.getAllocator().freeze(); auto new_view = t.getFrozenView(); auto new_aggregated = new_view.getAggregated(); - EXPECT_EQUAL(new_aggregated.getMin(), 101); - EXPECT_EQUAL(new_aggregated.getMax(), 104); + EXPECT_EQ(new_aggregated.getMin(), 101); + EXPECT_EQ(new_aggregated.getMax(), 104); auto old_aggregated = old_view.getAggregated(); - EXPECT_EQUAL(old_aggregated.getMin(), std::numeric_limits<int32_t>::max()); - EXPECT_EQUAL(old_aggregated.getMax(), std::numeric_limits<int32_t>::min()); -} - -int -Test::Main() -{ - TEST_INIT("btreeaggregation_test"); - - requireThatNodeInsertWorks(); - keys_are_aggregated_correctly_on_node_insertions(); - requireThatNodeSplitInsertWorks(); - keys_are_aggregated_correctly_when_node_split_on_insert(); - requireThatTreeInsertWorks(); - requireThatNodeStealWorks(); - requireThatNodeRemoveWorks(); - keys_are_aggregated_correctly_on_node_removal(); - requireThatWeCanInsertAndRemoveFromTree(); - requireThatSortedTreeInsertWorks(); - requireThatCornerCaseTreeFindWorks(); - requireThatBasicTreeIteratorWorks(); - requireThatTreeIteratorAssignWorks(); - requireThatUpdateOfKeyWorks(); - requireThatUpdateOfDataWorks(); - TEST_DO(requireThatSmallNodesWorks()); - TEST_DO(requireThatFrozenViewProvidesAggregatedValues()); - - TEST_DONE(); + EXPECT_EQ(old_aggregated.getMin(), std::numeric_limits<int32_t>::max()); + EXPECT_EQ(old_aggregated.getMax(), std::numeric_limits<int32_t>::min()); } } -TEST_APPHOOK(vespalib::btree::Test); +GTEST_MAIN_RUN_ALL_TESTS() diff --git a/vespalib/src/tests/fileheader/CMakeLists.txt b/vespalib/src/tests/fileheader/CMakeLists.txt index 1b3f527ebd7..be8e91ef414 100644 --- a/vespalib/src/tests/fileheader/CMakeLists.txt +++ b/vespalib/src/tests/fileheader/CMakeLists.txt @@ -4,5 +4,6 @@ vespa_add_executable(vespalib_fileheader_test_app TEST fileheader_test.cpp DEPENDS vespalib + GTest::gtest ) vespa_add_test(NAME vespalib_fileheader_test_app COMMAND vespalib_fileheader_test_app) diff --git a/vespalib/src/tests/fileheader/fileheader_test.cpp b/vespalib/src/tests/fileheader/fileheader_test.cpp index 0dfa28cb24c..db2c7f7c65d 100644 --- a/vespalib/src/tests/fileheader/fileheader_test.cpp +++ b/vespalib/src/tests/fileheader/fileheader_test.cpp @@ -1,8 +1,9 @@ // Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -#include <vespa/vespalib/testkit/testapp.h> #include <vespa/vespalib/data/fileheader.h> #include <vespa/vespalib/data/databuffer.h> +#include <vespa/vespalib/gtest/gtest.h> +#include <vespa/vespalib/testkit/test_path.h> #include <vespa/fastos/file.h> #include <filesystem> @@ -14,63 +15,20 @@ vespalib::string fileheader_tmp("fileheader.tmp"); } -class Test : public vespalib::TestApp { -private: - void testTag(); - void testTagErrors(); - void testTagIteration(); - void testGenericHeader(); - void testBufferReader(); - void testBufferWriter(); - void testBufferAccess(); - void testFileReader(); - void testFileWriter(); - void testFileHeader(); - void testFileAlign(); - void testFileSize(); - void testReadErrors(); +class FileHeaderTest : public ::testing::Test { +protected: + FileHeaderTest(); + ~FileHeaderTest() override; bool testReadError(DataBuffer &buf, const std::string &expected); - void testWriteErrors(); - void testRewriteErrors(); - void testLayout(); - void testReadSize(bool mapped); void testReadSizeErrors(bool mapped); bool testReadSizeError(DataBuffer &buf, const std::string &expected, bool mapped); - -public: - int Main() override { - TEST_INIT("fileheader_test"); - - testTag(); TEST_FLUSH(); - testTagErrors(); TEST_FLUSH(); - testTagIteration(); TEST_FLUSH(); - testGenericHeader(); TEST_FLUSH(); - testBufferReader(); TEST_FLUSH(); - testBufferWriter(); TEST_FLUSH(); - testBufferAccess(); TEST_FLUSH(); - testFileReader(); TEST_FLUSH(); - testFileWriter(); TEST_FLUSH(); - testFileHeader(); TEST_FLUSH(); - testFileAlign(); TEST_FLUSH(); - testFileSize(); TEST_FLUSH(); - testReadErrors(); TEST_FLUSH(); - testWriteErrors(); TEST_FLUSH(); - testRewriteErrors(); TEST_FLUSH(); - testLayout(); TEST_FLUSH(); - testReadSize(false); TEST_FLUSH(); - testReadSizeErrors(false); TEST_FLUSH(); - testReadSize(true); TEST_FLUSH(); - testReadSizeErrors(true); TEST_FLUSH(); - - TEST_DONE(); - } }; -TEST_APPHOOK(Test); +FileHeaderTest::FileHeaderTest() = default; +FileHeaderTest::~FileHeaderTest() = default; -void -Test::testTag() +TEST_F(FileHeaderTest, test_tag) { { std::vector<GenericHeader::Tag> tags; @@ -81,18 +39,18 @@ Test::testTag() { GenericHeader::Tag tag = *it; for (uint32_t i = 0; i < 2; ++i) { - EXPECT_EQUAL(GenericHeader::Tag::TYPE_FLOAT, tag.getType()); - EXPECT_EQUAL("foo", tag.getName()); + EXPECT_EQ(GenericHeader::Tag::TYPE_FLOAT, tag.getType()); + EXPECT_EQ("foo", tag.getName()); EXPECT_TRUE(tag.asString().empty()); - EXPECT_APPROX(6.9, tag.asFloat(), 1E-6); - EXPECT_EQUAL(0, tag.asInteger()); + EXPECT_NEAR(6.9, tag.asFloat(), 1E-6); + EXPECT_EQ(0, tag.asInteger()); uint32_t len = tag.getSize(); DataBuffer buf(len); - EXPECT_EQUAL(len, tag.write(buf)); + EXPECT_EQ(len, tag.write(buf)); GenericHeader::Tag tmp; - EXPECT_EQUAL(len, tmp.read(buf)); + EXPECT_EQ(len, tmp.read(buf)); tag = tmp; } } @@ -111,18 +69,18 @@ Test::testTag() { GenericHeader::Tag tag = *it; for (uint32_t i = 0; i < 2; ++i) { - EXPECT_EQUAL(GenericHeader::Tag::TYPE_INTEGER, tag.getType()); - EXPECT_EQUAL("foo", tag.getName()); + EXPECT_EQ(GenericHeader::Tag::TYPE_INTEGER, tag.getType()); + EXPECT_EQ("foo", tag.getName()); EXPECT_TRUE(tag.asString().empty()); - EXPECT_EQUAL(0.0, tag.asFloat()); - EXPECT_EQUAL(69l, tag.asInteger()); + EXPECT_EQ(0.0, tag.asFloat()); + EXPECT_EQ(69l, tag.asInteger()); uint32_t len = tag.getSize(); DataBuffer buf(len); - EXPECT_EQUAL(len, tag.write(buf)); + EXPECT_EQ(len, tag.write(buf)); GenericHeader::Tag tmp; - EXPECT_EQUAL(len, tmp.read(buf)); + EXPECT_EQ(len, tmp.read(buf)); tag = tmp; } } @@ -130,35 +88,34 @@ Test::testTag() { GenericHeader::Tag tag("foo", "bar"); for (uint32_t i = 0; i < 2; ++i) { - EXPECT_EQUAL(GenericHeader::Tag::TYPE_STRING, tag.getType()); - EXPECT_EQUAL("foo", tag.getName()); - EXPECT_EQUAL("bar", tag.asString()); - EXPECT_EQUAL(0.0, tag.asFloat()); - EXPECT_EQUAL(0, tag.asInteger()); + EXPECT_EQ(GenericHeader::Tag::TYPE_STRING, tag.getType()); + EXPECT_EQ("foo", tag.getName()); + EXPECT_EQ("bar", tag.asString()); + EXPECT_EQ(0.0, tag.asFloat()); + EXPECT_EQ(0, tag.asInteger()); uint32_t len = tag.getSize(); DataBuffer buf(len); - EXPECT_EQUAL(len, tag.write(buf)); + EXPECT_EQ(len, tag.write(buf)); GenericHeader::Tag tmp; - EXPECT_EQUAL(len, tmp.read(buf)); + EXPECT_EQ(len, tmp.read(buf)); tag = tmp; } } { GenericHeader::Tag trueTag("foo", true); GenericHeader::Tag falseTag("foo", false); - EXPECT_EQUAL(GenericHeader::Tag::TYPE_INTEGER, trueTag.getType()); - EXPECT_EQUAL(GenericHeader::Tag::TYPE_INTEGER, falseTag.getType()); - EXPECT_EQUAL(1, trueTag.asInteger()); - EXPECT_EQUAL(0, falseTag.asInteger()); + EXPECT_EQ(GenericHeader::Tag::TYPE_INTEGER, trueTag.getType()); + EXPECT_EQ(GenericHeader::Tag::TYPE_INTEGER, falseTag.getType()); + EXPECT_EQ(1, trueTag.asInteger()); + EXPECT_EQ(0, falseTag.asInteger()); EXPECT_TRUE(trueTag.asBool()); EXPECT_FALSE(falseTag.asBool()); } } -void -Test::testTagErrors() +TEST_F(FileHeaderTest, test_tag_errors) { DataBuffer buf(1024); buf.writeBytes("foo", 3); @@ -170,33 +127,31 @@ Test::testTagErrors() tag.read(buf); EXPECT_TRUE(false); } catch (IllegalHeaderException &e) { - EXPECT_EQUAL("Can not deserialize empty tag.", e.getMessage()); + EXPECT_EQ("Can not deserialize empty tag.", e.getMessage()); } - EXPECT_EQUAL("bar", tag.getName()); - EXPECT_EQUAL(GenericHeader::Tag::TYPE_FLOAT, tag.getType()); - EXPECT_EQUAL(6.9, tag.asFloat()); + EXPECT_EQ("bar", tag.getName()); + EXPECT_EQ(GenericHeader::Tag::TYPE_FLOAT, tag.getType()); + EXPECT_EQ(6.9, tag.asFloat()); } -void -Test::testTagIteration() +TEST_F(FileHeaderTest, test_tag_iteration) { GenericHeader header; header.putTag(GenericHeader::Tag("foo", 6.9)); header.putTag(GenericHeader::Tag("bar", 6699)); header.putTag(GenericHeader::Tag("baz", "666999")); - EXPECT_EQUAL(3u, header.getNumTags()); - EXPECT_EQUAL("bar", header.getTag(0).getName()); - EXPECT_EQUAL("baz", header.getTag(1).getName()); - EXPECT_EQUAL("foo", header.getTag(2).getName()); + EXPECT_EQ(3u, header.getNumTags()); + EXPECT_EQ("bar", header.getTag(0).getName()); + EXPECT_EQ("baz", header.getTag(1).getName()); + EXPECT_EQ("foo", header.getTag(2).getName()); } -void -Test::testGenericHeader() +TEST_F(FileHeaderTest, test_generic_header) { GenericHeader header; EXPECT_TRUE(header.isEmpty()); - EXPECT_EQUAL(0u, header.getNumTags()); + EXPECT_EQ(0u, header.getNumTags()); EXPECT_TRUE(!header.hasTag("foo")); EXPECT_TRUE(header.getTag("foo").isEmpty()); EXPECT_TRUE(!header.hasTag("bar")); @@ -206,9 +161,9 @@ Test::testGenericHeader() header.putTag(GenericHeader::Tag("foo", 6.9)); EXPECT_TRUE(!header.isEmpty()); - EXPECT_EQUAL(1u, header.getNumTags()); + EXPECT_EQ(1u, header.getNumTags()); EXPECT_TRUE(header.hasTag("foo")); - EXPECT_EQUAL(6.9, header.getTag("foo").asFloat()); + EXPECT_EQ(6.9, header.getTag("foo").asFloat()); EXPECT_TRUE(!header.hasTag("bar")); EXPECT_TRUE(header.getTag("bar").isEmpty()); EXPECT_TRUE(!header.hasTag("baz")); @@ -216,29 +171,29 @@ Test::testGenericHeader() header.putTag(GenericHeader::Tag("bar", 6699)); EXPECT_TRUE(!header.isEmpty()); - EXPECT_EQUAL(2u, header.getNumTags()); + EXPECT_EQ(2u, header.getNumTags()); EXPECT_TRUE(header.hasTag("foo")); - EXPECT_EQUAL(6.9, header.getTag("foo").asFloat()); + EXPECT_EQ(6.9, header.getTag("foo").asFloat()); EXPECT_TRUE(header.hasTag("bar")); - EXPECT_EQUAL(6699, header.getTag("bar").asInteger()); + EXPECT_EQ(6699, header.getTag("bar").asInteger()); EXPECT_TRUE(!header.hasTag("baz")); EXPECT_TRUE(header.getTag("baz").isEmpty()); header.putTag(GenericHeader::Tag("baz", "666999")); EXPECT_TRUE(header.hasTag("foo")); - EXPECT_EQUAL(6.9, header.getTag("foo").asFloat()); + EXPECT_EQ(6.9, header.getTag("foo").asFloat()); EXPECT_TRUE(header.hasTag("bar")); - EXPECT_EQUAL(6699, header.getTag("bar").asInteger()); + EXPECT_EQ(6699, header.getTag("bar").asInteger()); EXPECT_TRUE(header.hasTag("baz")); - EXPECT_EQUAL("666999", header.getTag("baz").asString()); + EXPECT_EQ("666999", header.getTag("baz").asString()); header.removeTag("bar"); EXPECT_TRUE(header.hasTag("foo")); - EXPECT_EQUAL(6.9, header.getTag("foo").asFloat()); + EXPECT_EQ(6.9, header.getTag("foo").asFloat()); EXPECT_TRUE(!header.hasTag("bar")); EXPECT_TRUE(header.getTag("bar").isEmpty()); EXPECT_TRUE(header.hasTag("baz")); - EXPECT_EQUAL("666999", header.getTag("baz").asString()); + EXPECT_EQ("666999", header.getTag("baz").asString()); header.removeTag("foo"); EXPECT_TRUE(!header.hasTag("foo")); @@ -246,7 +201,7 @@ Test::testGenericHeader() EXPECT_TRUE(!header.hasTag("bar")); EXPECT_TRUE(header.getTag("bar").isEmpty()); EXPECT_TRUE(header.hasTag("baz")); - EXPECT_EQUAL("666999", header.getTag("baz").asString()); + EXPECT_EQ("666999", header.getTag("baz").asString()); header.removeTag("baz"); EXPECT_TRUE(!header.hasTag("foo")); @@ -257,8 +212,7 @@ Test::testGenericHeader() EXPECT_TRUE(header.getTag("baz").isEmpty()); } -void -Test::testBufferReader() +TEST_F(FileHeaderTest, test_buffer_reader) { DataBuffer src(256); for (uint32_t i = 0; i < 256; ++i) { @@ -272,15 +226,14 @@ Test::testBufferReader() while (sum < 256) { uint32_t len = (uint32_t)reader.getData(dst, 7); for (uint32_t i = 0; i < len; ++i) { - EXPECT_EQUAL(sum + i, (uint8_t)dst[i]); + EXPECT_EQ(sum + i, (uint8_t)dst[i]); } sum += len; } - EXPECT_EQUAL(256u, sum); + EXPECT_EQ(256u, sum); } -void -Test::testBufferWriter() +TEST_F(FileHeaderTest, test_buffer_writer) { DataBuffer dst(256); GenericHeader::BufferWriter writer(dst); @@ -292,20 +245,19 @@ Test::testBufferWriter() src[i] = (uint8_t)(sum + i); } uint32_t len = std::min(7u, 256 - sum); - EXPECT_EQUAL(len, (uint32_t)writer.putData(src, len)); + EXPECT_EQ(len, (uint32_t)writer.putData(src, len)); sum += len; } - EXPECT_EQUAL(256u, sum); + EXPECT_EQ(256u, sum); // flip dst for (uint32_t i = 0; i < 256; ++i) { uint8_t b = dst.readInt8(); - EXPECT_EQUAL(i, (uint32_t)b); + EXPECT_EQ(i, (uint32_t)b); } } -void -Test::testBufferAccess() +TEST_F(FileHeaderTest, test_buffer_access) { DataBuffer buf; uint32_t len; @@ -321,26 +273,25 @@ Test::testBufferAccess() len = header.getSize(); buf.ensureFree(len); GenericHeader::BufferWriter writer(buf); - EXPECT_EQUAL(len, header.write(writer)); + EXPECT_EQ(len, header.write(writer)); } { GenericHeader header; GenericHeader::BufferReader reader(buf); - EXPECT_EQUAL(len, header.read(reader)); + EXPECT_EQ(len, header.read(reader)); EXPECT_TRUE(header.hasTag("foo")); - EXPECT_EQUAL(6.9, header.getTag("foo").asFloat()); + EXPECT_EQ(6.9, header.getTag("foo").asFloat()); EXPECT_TRUE(header.hasTag("bar")); - EXPECT_EQUAL(6699, header.getTag("bar").asInteger()); + EXPECT_EQ(6699, header.getTag("bar").asInteger()); EXPECT_TRUE(header.hasTag("baz")); - EXPECT_EQUAL("666999", header.getTag("baz").asString()); + EXPECT_EQ("666999", header.getTag("baz").asString()); EXPECT_TRUE(header.hasTag("big")); - EXPECT_EQUAL(0x1234567890abcdefLL, header.getTag("big").asInteger()); + EXPECT_EQ(0x1234567890abcdefLL, header.getTag("big").asInteger()); } } -void -Test::testFileReader() +TEST_F(FileHeaderTest, test_file_reader) { { FastOS_File file; @@ -350,7 +301,7 @@ Test::testFileReader() for (uint32_t i = 0; i < 256; ++i) { buf[i] = (uint8_t)i; } - EXPECT_EQUAL(256, file.Write2(buf, 256)); + EXPECT_EQ(256, file.Write2(buf, 256)); } { FastOS_File file; @@ -362,19 +313,18 @@ Test::testFileReader() while(sum < 256) { uint32_t len = (uint32_t)reader.getData(buf, 7); for (uint32_t i = 0; i < len; ++i) { - EXPECT_EQUAL(sum + i, (uint8_t)buf[i]); + EXPECT_EQ(sum + i, (uint8_t)buf[i]); } sum += len; } - EXPECT_EQUAL(256u, sum); + EXPECT_EQ(256u, sum); ASSERT_TRUE(file.Close()); std::filesystem::remove(std::filesystem::path(fileheader_tmp)); } } -void -Test::testFileWriter() +TEST_F(FileHeaderTest, test_file_writer) { { FastOS_File file; @@ -388,19 +338,19 @@ Test::testFileWriter() src[i] = (uint8_t)(sum + i); } uint32_t len = std::min(7u, 256 - sum); - EXPECT_EQUAL(len, (uint32_t)writer.putData(src, len)); + EXPECT_EQ(len, (uint32_t)writer.putData(src, len)); sum += len; } - EXPECT_EQUAL(256u, sum); + EXPECT_EQ(256u, sum); } { FastOS_File file; ASSERT_TRUE(file.OpenReadOnly(fileheader_tmp.c_str())); uint8_t buf[256]; - EXPECT_EQUAL(256, file.Read(buf, 256)); + EXPECT_EQ(256, file.Read(buf, 256)); for (uint32_t i = 0; i < 256; ++i) { - EXPECT_EQUAL(i, (uint32_t)buf[i]); + EXPECT_EQ(i, (uint32_t)buf[i]); } ASSERT_TRUE(file.Close()); @@ -408,8 +358,7 @@ Test::testFileWriter() } } -void -Test::testFileHeader() +TEST_F(FileHeaderTest, test_file_header) { uint32_t len = 0; { @@ -421,60 +370,58 @@ Test::testFileHeader() FastOS_File file; ASSERT_TRUE(file.OpenWriteOnlyTruncate(fileheader_tmp.c_str())); len = header.writeFile(file); - EXPECT_EQUAL(len, header.getSize()); + EXPECT_EQ(len, header.getSize()); } { FastOS_File file; ASSERT_TRUE(file.OpenReadWrite(fileheader_tmp.c_str())); FileHeader header; - EXPECT_EQUAL(len, header.readFile(file)); - EXPECT_EQUAL(len, header.getSize()); + EXPECT_EQ(len, header.readFile(file)); + EXPECT_EQ(len, header.getSize()); EXPECT_TRUE(header.hasTag("foo")); - EXPECT_EQUAL(6.9, header.getTag("foo").asFloat()); + EXPECT_EQ(6.9, header.getTag("foo").asFloat()); EXPECT_TRUE(header.hasTag("bar")); - EXPECT_EQUAL(6699, header.getTag("bar").asInteger()); + EXPECT_EQ(6699, header.getTag("bar").asInteger()); EXPECT_TRUE(header.hasTag("baz")); - EXPECT_EQUAL("666999", header.getTag("baz").asString()); + EXPECT_EQ("666999", header.getTag("baz").asString()); header.putTag(FileHeader::Tag("foo", 9.6)); header.putTag(FileHeader::Tag("bar", 9966)); header.putTag(FileHeader::Tag("baz", "999666")); - EXPECT_EQUAL(len, header.getSize()); - EXPECT_EQUAL(len, header.rewriteFile(file)); + EXPECT_EQ(len, header.getSize()); + EXPECT_EQ(len, header.rewriteFile(file)); } { FileHeader header; FastOS_File file; ASSERT_TRUE(file.OpenReadOnly(fileheader_tmp.c_str())); - EXPECT_EQUAL(len, header.readFile(file)); - EXPECT_EQUAL(len, header.getSize()); + EXPECT_EQ(len, header.readFile(file)); + EXPECT_EQ(len, header.getSize()); ASSERT_TRUE(file.Close()); std::filesystem::remove(std::filesystem::path(fileheader_tmp)); EXPECT_TRUE(header.hasTag("foo")); - EXPECT_EQUAL(9.6, header.getTag("foo").asFloat()); + EXPECT_EQ(9.6, header.getTag("foo").asFloat()); EXPECT_TRUE(header.hasTag("bar")); - EXPECT_EQUAL(9966, header.getTag("bar").asInteger()); + EXPECT_EQ(9966, header.getTag("bar").asInteger()); EXPECT_TRUE(header.hasTag("baz")); - EXPECT_EQUAL("999666", header.getTag("baz").asString()); + EXPECT_EQ("999666", header.getTag("baz").asString()); } } -void -Test::testFileAlign() +TEST_F(FileHeaderTest, test_file_align) { for (uint32_t alignTo = 1; alignTo < 16; ++alignTo) { FileHeader header(alignTo); header.putTag(FileHeader::Tag("foo", "bar")); - EXPECT_EQUAL(0u, header.getSize() % alignTo); + EXPECT_EQ(0u, header.getSize() % alignTo); } } -void -Test::testFileSize() +TEST_F(FileHeaderTest, test_file_size) { for (uint32_t minSize = 0; minSize < 512; ++minSize) { FileHeader header(1u, minSize); @@ -483,8 +430,7 @@ Test::testFileSize() } } -void -Test::testReadErrors() +TEST_F(FileHeaderTest, test_read_errors) { { DataBuffer buf; @@ -524,7 +470,7 @@ Test::testReadErrors() } bool -Test::testReadError(DataBuffer &buf, const std::string &expected) +FileHeaderTest::testReadError(DataBuffer &buf, const std::string &expected) { GenericHeader header; header.putTag(GenericHeader::Tag("foo", "bar")); @@ -534,21 +480,22 @@ Test::testReadError(DataBuffer &buf, const std::string &expected) EXPECT_TRUE(false); return false; } catch (IllegalHeaderException &e) { - if (!EXPECT_EQUAL(expected, e.getMessage())) { + bool failed = false; + EXPECT_EQ(expected, e.getMessage()) << (failed = true, ""); + if (failed) { return false; } } - if (!EXPECT_EQUAL(1u, header.getNumTags())) { + bool failed = false; + EXPECT_EQ(1u, header.getNumTags()) << (failed = true, ""); + if (failed) { return false; } - if (!EXPECT_EQUAL("bar", header.getTag("foo").asString())) { - return false; - } - return true; + EXPECT_EQ("bar", header.getTag("foo").asString()) << (failed = true, ""); + return !failed; } -void -Test::testWriteErrors() +TEST_F(FileHeaderTest, test_write_errors) { GenericHeader header; header.putTag(GenericHeader::Tag("foo", 69)); @@ -562,15 +509,14 @@ Test::testWriteErrors() header.write(writer); EXPECT_TRUE(false); } catch (IllegalHeaderException &e) { - EXPECT_EQUAL("Failed to write header.", e.getMessage()); + EXPECT_EQ("Failed to write header.", e.getMessage()); } EXPECT_TRUE(header.hasTag("foo")); - EXPECT_EQUAL(69, header.getTag("foo").asInteger()); + EXPECT_EQ(69, header.getTag("foo").asInteger()); } -void -Test::testRewriteErrors() +TEST_F(FileHeaderTest, test_rewrite_errors) { FileHeader header; header.putTag(FileHeader::Tag("foo", "bar")); @@ -579,7 +525,7 @@ Test::testRewriteErrors() { FastOS_File file; ASSERT_TRUE(file.OpenWriteOnlyTruncate(fileheader_tmp.c_str())); - EXPECT_EQUAL(len, header.writeFile(file)); + EXPECT_EQ(len, header.writeFile(file)); } { FastOS_File file; @@ -590,13 +536,12 @@ Test::testRewriteErrors() header.rewriteFile(file); EXPECT_TRUE(false); } catch (IllegalHeaderException &e) { - EXPECT_EQUAL("Failed to rewrite resized header.", e.getMessage()); + EXPECT_EQ("Failed to rewrite resized header.", e.getMessage()); } } } -void -Test::testLayout() +TEST_F(FileHeaderTest, test_layout) { FileHeader header; { @@ -604,20 +549,20 @@ Test::testLayout() const std::string fileName = TEST_PATH("fileheader.dat"); ASSERT_TRUE(file.OpenReadOnly(fileName.c_str())); uint32_t len = header.readFile(file); - EXPECT_EQUAL(len, header.getSize()); + EXPECT_EQ(len, header.getSize()); } EXPECT_TRUE(header.hasTag("foo")); - EXPECT_EQUAL(6.9, header.getTag("foo").asFloat()); + EXPECT_EQ(6.9, header.getTag("foo").asFloat()); EXPECT_TRUE(header.hasTag("bar")); - EXPECT_EQUAL(6699, header.getTag("bar").asInteger()); + EXPECT_EQ(6699, header.getTag("bar").asInteger()); EXPECT_TRUE(header.hasTag("baz")); - EXPECT_EQUAL("666999", header.getTag("baz").asString()); + EXPECT_EQ("666999", header.getTag("baz").asString()); } void -Test::testReadSize(bool mapped) +FileHeaderTest::testReadSize(bool mapped) { DataBuffer buf; buf.writeInt32(GenericHeader::MAGIC); @@ -632,12 +577,21 @@ Test::testReadSize(bool mapped) GenericHeader::BufferReader reader(buf); headerLen = FileHeader::readSize(reader); } - EXPECT_EQUAL(21u, headerLen); + EXPECT_EQ(21u, headerLen); +} + +TEST_F(FileHeaderTest, test_read_size_unmapped) +{ + testReadSize(false); } +TEST_F(FileHeaderTest, test_read_size_mapped) +{ + testReadSize(true); +} void -Test::testReadSizeErrors(bool mapped) +FileHeaderTest::testReadSizeErrors(bool mapped) { { DataBuffer buf; @@ -674,9 +628,18 @@ Test::testReadSizeErrors(bool mapped) } } +TEST_F(FileHeaderTest, test_read_size_errors_unmapped) +{ + testReadSizeErrors(false); +} + +TEST_F(FileHeaderTest, test_read_size_errors_mapped) +{ + testReadSizeErrors(true); +} bool -Test::testReadSizeError(DataBuffer &buf, const std::string &expected, +FileHeaderTest::testReadSizeError(DataBuffer &buf, const std::string &expected, bool mapped) { uint32_t headerLen = 0u; @@ -691,11 +654,14 @@ Test::testReadSizeError(DataBuffer &buf, const std::string &expected, EXPECT_TRUE(false); return false; } catch (IllegalHeaderException &e) { - if (!EXPECT_EQUAL(expected, e.getMessage())) { + bool failed = false; + EXPECT_EQ(expected, e.getMessage()) << (failed = true, ""); + if (failed) { return false; } } - EXPECT_EQUAL(headerLen, 0u); + EXPECT_EQ(headerLen, 0u); return true; } +GTEST_MAIN_RUN_ALL_TESTS() diff --git a/vespalib/src/tests/floatingpointtype/CMakeLists.txt b/vespalib/src/tests/floatingpointtype/CMakeLists.txt index ed003fe7b83..9bcd2236eea 100644 --- a/vespalib/src/tests/floatingpointtype/CMakeLists.txt +++ b/vespalib/src/tests/floatingpointtype/CMakeLists.txt @@ -4,5 +4,6 @@ vespa_add_executable(vespalib_floatingpointtype_test_app TEST floatingpointtypetest.cpp DEPENDS vespalib + GTest::gtest ) vespa_add_test(NAME vespalib_floatingpointtype_test_app COMMAND vespalib_floatingpointtype_test_app) diff --git a/vespalib/src/tests/floatingpointtype/floatingpointtypetest.cpp b/vespalib/src/tests/floatingpointtype/floatingpointtypetest.cpp index 8e09d297a84..4b9718f1199 100644 --- a/vespalib/src/tests/floatingpointtype/floatingpointtypetest.cpp +++ b/vespalib/src/tests/floatingpointtype/floatingpointtypetest.cpp @@ -1,17 +1,9 @@ // Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -#include <vespa/vespalib/testkit/testapp.h> +#include <vespa/vespalib/gtest/gtest.h> #include <vespa/vespalib/objects/floatingpointtype.h> -class Test : public vespalib::TestApp -{ -public: - void testFloatingPoint(); - int Main() override; -}; - -void -Test::testFloatingPoint() +TEST(FloatingPointTypeTest, test_floating_point) { vespalib::Double d1(1.0); vespalib::Double d2(1.000000000000001); @@ -20,11 +12,11 @@ Test::testFloatingPoint() EXPECT_TRUE(d1.getValue() != d2.getValue()); - EXPECT_EQUAL(d1, d2); - EXPECT_EQUAL(d2, d1); + EXPECT_EQ(d1, d2); + EXPECT_EQ(d2, d1); - EXPECT_NOT_EQUAL(d1, d3); - EXPECT_NOT_EQUAL(d1, d4); + EXPECT_NE(d1, d3); + EXPECT_NE(d1, d4); EXPECT_TRUE(d1 - d2 == 0); EXPECT_TRUE(d2 - d1 == 0); @@ -40,34 +32,26 @@ Test::testFloatingPoint() EXPECT_TRUE(!(d1 < 1)); EXPECT_TRUE(!(d1 > 1)); - EXPECT_EQUAL(d2 * 4, d4); + EXPECT_EQ(d2 * 4, d4); - EXPECT_EQUAL(++d4, 5.0); - EXPECT_EQUAL(d4++, 5.0); - EXPECT_EQUAL(d4, 6.0); + EXPECT_EQ(++d4, 5.0); + EXPECT_EQ(d4++, 5.0); + EXPECT_EQ(d4, 6.0); d4 /= 3; - EXPECT_EQUAL(d4, 2.00000000001); + EXPECT_EQ(d4, 2.00000000001); d4 *= 2; - EXPECT_EQUAL(d4, 4.000000000001); + EXPECT_EQ(d4, 4.000000000001); - EXPECT_EQUAL(--d4, 3.0); - EXPECT_EQUAL(d4--, 3.0); - EXPECT_EQUAL(d4, 2.0); + EXPECT_EQ(--d4, 3.0); + EXPECT_EQ(d4--, 3.0); + EXPECT_EQ(d4, 2.0); d4 /= 0.50000000001; - EXPECT_EQUAL(d4, 4.0); + EXPECT_EQ(d4, 4.0); EXPECT_TRUE(!(d3 + 1 > 0)); EXPECT_TRUE(!(d3 + 1 < 0)); } -int -Test::Main() -{ - TEST_INIT("floatingpointtype_test"); - testFloatingPoint(); - TEST_DONE(); -} - -TEST_APPHOOK(Test) +GTEST_MAIN_RUN_ALL_TESTS() diff --git a/vespalib/src/tests/growablebytebuffer/CMakeLists.txt b/vespalib/src/tests/growablebytebuffer/CMakeLists.txt index be3ba82594d..0448eedd488 100644 --- a/vespalib/src/tests/growablebytebuffer/CMakeLists.txt +++ b/vespalib/src/tests/growablebytebuffer/CMakeLists.txt @@ -4,5 +4,6 @@ vespa_add_executable(vespalib_growablebytebuffer_test_app TEST growablebytebuffer_test.cpp DEPENDS vespalib + GTest::gtest ) vespa_add_test(NAME vespalib_growablebytebuffer_test_app COMMAND vespalib_growablebytebuffer_test_app) diff --git a/vespalib/src/tests/growablebytebuffer/growablebytebuffer_test.cpp b/vespalib/src/tests/growablebytebuffer/growablebytebuffer_test.cpp index a94a150c4e1..00cc77d19cb 100644 --- a/vespalib/src/tests/growablebytebuffer/growablebytebuffer_test.cpp +++ b/vespalib/src/tests/growablebytebuffer/growablebytebuffer_test.cpp @@ -1,19 +1,11 @@ // Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -#include <vespa/vespalib/testkit/testapp.h> +#include <vespa/vespalib/gtest/gtest.h> #include <vespa/vespalib/util/growablebytebuffer.h> using namespace vespalib; -class Test : public TestApp -{ -public: - void testGrowing(); - int Main() override; -}; - -void -Test::testGrowing() +TEST(GrowableByteBufferTest, test_growing) { GrowableByteBuffer buf(10); @@ -23,15 +15,7 @@ Test::testGrowing() buf.putDouble(1234); buf.putString("hei der"); - EXPECT_EQUAL(35u, buf.position()); -} - -int -Test::Main() -{ - TEST_INIT("guard_test"); - testGrowing(); - TEST_DONE(); + EXPECT_EQ(35u, buf.position()); } -TEST_APPHOOK(Test) +GTEST_MAIN_RUN_ALL_TESTS() diff --git a/vespalib/src/tests/json/CMakeLists.txt b/vespalib/src/tests/json/CMakeLists.txt index 720f8e3a040..89471e18d74 100644 --- a/vespalib/src/tests/json/CMakeLists.txt +++ b/vespalib/src/tests/json/CMakeLists.txt @@ -4,5 +4,6 @@ vespa_add_executable(vespalib_json_test_app TEST json.cpp DEPENDS vespalib + GTest::gtest ) vespa_add_test(NAME vespalib_json_test_app COMMAND vespalib_json_test_app boost) diff --git a/vespalib/src/tests/json/json.cpp b/vespalib/src/tests/json/json.cpp index 2638c6638c3..024d9045cc1 100644 --- a/vespalib/src/tests/json/json.cpp +++ b/vespalib/src/tests/json/json.cpp @@ -1,124 +1,108 @@ // Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -#include <vespa/vespalib/testkit/testapp.h> +#include <vespa/vespalib/gtest/gtest.h> #include <vespa/vespalib/util/jsonstream.h> #include <vespa/vespalib/util/jsonexception.h> #include <vespa/vespalib/stllike/asciistream.h> using namespace vespalib; -class JSONTest : public vespalib::TestApp -{ -private: - void testJSONWriterValues(); - void testJSONWriterObject(); - void testJSONWriterArray(); - void testJSONWriterComplex(); - void testJsonStream(); - void testJsonStreamErrors(); - void testJsonStreamStateReporting(); - -public: - int Main() override; -}; -void -JSONTest::testJSONWriterValues() +TEST(JSONTest, test_json_writer_values) { JSONStringer js; { // bool js.appendBool(true); - EXPECT_EQUAL(js.toString(), "true"); + EXPECT_EQ(js.toString(), "true"); js.clear().appendBool(false); - EXPECT_EQUAL(js.toString(), "false"); + EXPECT_EQ(js.toString(), "false"); } { // double js.clear().appendDouble(1234.5678); - EXPECT_EQUAL(js.toString(), "1234.5678"); + EXPECT_EQ(js.toString(), "1234.5678"); js.clear().appendDouble(-1234.5678); - EXPECT_EQUAL(js.toString(), "-1234.5678"); + EXPECT_EQ(js.toString(), "-1234.5678"); js.clear().appendDouble(0.0); - EXPECT_EQUAL(js.toString(), "0.0"); + EXPECT_EQ(js.toString(), "0.0"); js.clear().appendDouble(0.00000000012345678912356789123456789); - EXPECT_EQUAL(js.toString(), "1.234567891235679e-10"); + EXPECT_EQ(js.toString(), "1.234567891235679e-10"); js.clear().appendDouble(std::numeric_limits<double>::max()); - EXPECT_EQUAL(js.toString(), "1.797693134862316e+308"); + EXPECT_EQ(js.toString(), "1.797693134862316e+308"); js.clear().appendDouble(std::numeric_limits<double>::min()); - EXPECT_EQUAL(js.toString(), "2.225073858507201e-308"); + EXPECT_EQ(js.toString(), "2.225073858507201e-308"); js.clear().appendDouble(1.0 * (uint64_t(1) << 53)); - EXPECT_EQUAL(js.toString(), "9007199254740992.0"); + EXPECT_EQ(js.toString(), "9007199254740992.0"); js.clear().appendDouble(1000); - EXPECT_EQUAL(js.toString(), "1000.0"); + EXPECT_EQ(js.toString(), "1000.0"); } { // float js.clear().appendFloat(1234.5678f); - EXPECT_EQUAL(js.toString(), "1234.5677"); + EXPECT_EQ(js.toString(), "1234.5677"); js.clear().appendFloat(-1234.5678f); - EXPECT_EQUAL(js.toString(), "-1234.5677"); + EXPECT_EQ(js.toString(), "-1234.5677"); js.clear().appendFloat(0.0f); - EXPECT_EQUAL(js.toString(), "0.0"); + EXPECT_EQ(js.toString(), "0.0"); js.clear().appendFloat(0.00000000012345678912356789123456789f); - EXPECT_EQUAL(js.toString(), "1.2345679e-10"); + EXPECT_EQ(js.toString(), "1.2345679e-10"); js.clear().appendFloat(std::numeric_limits<float>::max()); - EXPECT_EQUAL(js.toString(), "3.4028235e+38"); + EXPECT_EQ(js.toString(), "3.4028235e+38"); js.clear().appendFloat(std::numeric_limits<float>::min()); - EXPECT_EQUAL(js.toString(), "1.1754944e-38"); + EXPECT_EQ(js.toString(), "1.1754944e-38"); js.clear().appendFloat(1.0 * (uint64_t(1) << 24)); - EXPECT_EQUAL(js.toString(), "16777216.0"); + EXPECT_EQ(js.toString(), "16777216.0"); js.clear().appendFloat(1000); - EXPECT_EQUAL(js.toString(), "1000.0"); + EXPECT_EQ(js.toString(), "1000.0"); } { // long js.clear().appendInt64(4294967296ll); - EXPECT_EQUAL(js.toString(), "4294967296"); + EXPECT_EQ(js.toString(), "4294967296"); js.clear().appendInt64(-4294967296ll); - EXPECT_EQUAL(js.toString(), "-4294967296"); + EXPECT_EQ(js.toString(), "-4294967296"); } { // string js.clear().appendString("string"); - EXPECT_EQUAL(js.toString(), "\"string\""); + EXPECT_EQ(js.toString(), "\"string\""); } { // NULL js.clear().appendNull(); - EXPECT_EQUAL(js.toString(), "null"); + EXPECT_EQ(js.toString(), "null"); } { // quote js.clear().appendString("x\"y"); - EXPECT_EQUAL(js.toString(), "\"x\\\"y\""); + EXPECT_EQ(js.toString(), "\"x\\\"y\""); js.clear().appendString("x\\y"); - EXPECT_EQUAL(js.toString(), "\"x\\\\y\""); + EXPECT_EQ(js.toString(), "\"x\\\\y\""); js.clear().appendString("x/y"); - EXPECT_EQUAL(js.toString(), "\"x/y\""); + EXPECT_EQ(js.toString(), "\"x/y\""); js.clear().appendString("x\by"); - EXPECT_EQUAL(js.toString(), "\"x\\by\""); + EXPECT_EQ(js.toString(), "\"x\\by\""); js.clear().appendString("x\fy"); - EXPECT_EQUAL(js.toString(), "\"x\\fy\""); + EXPECT_EQ(js.toString(), "\"x\\fy\""); js.clear().appendString("x\ny"); - EXPECT_EQUAL(js.toString(), "\"x\\ny\""); + EXPECT_EQ(js.toString(), "\"x\\ny\""); js.clear().appendString("x\ry"); - EXPECT_EQUAL(js.toString(), "\"x\\ry\""); + EXPECT_EQ(js.toString(), "\"x\\ry\""); js.clear().appendString("x\ty"); - EXPECT_EQUAL(js.toString(), "\"x\\ty\""); + EXPECT_EQ(js.toString(), "\"x\\ty\""); } } -void -JSONTest::testJSONWriterObject() +TEST(JSONTest, test_json_writer_object) { JSONStringer js; { // single pair js.beginObject().appendKey("k1").appendInt64(1l).endObject(); - EXPECT_EQUAL(js.toString(), "{\"k1\":1}"); + EXPECT_EQ(js.toString(), "{\"k1\":1}"); } { // multiple pairs js.clear().beginObject().appendKey("k1").appendInt64(1l).appendKey("k2").appendInt64(2l).endObject(); - EXPECT_EQUAL(js.toString(), "{\"k1\":1,\"k2\":2}"); + EXPECT_EQ(js.toString(), "{\"k1\":1,\"k2\":2}"); } { // object in object js.clear().beginObject().appendKey("k1").beginObject().appendKey("k1.1").appendInt64(11l).endObject().endObject(); - EXPECT_EQUAL(js.toString(), "{\"k1\":{\"k1.1\":11}}"); + EXPECT_EQ(js.toString(), "{\"k1\":{\"k1.1\":11}}"); } { // object in object (multiple pairs) js.clear().beginObject(). @@ -133,65 +117,61 @@ JSONTest::testJSONWriterObject() appendKey("k2.2").appendInt64(22l). endObject(). endObject(); - EXPECT_EQUAL(js.toString(), "{\"k1\":{\"k1.1\":11,\"k1.2\":12},\"k2\":{\"k2.1\":21,\"k2.2\":22}}"); + EXPECT_EQ(js.toString(), "{\"k1\":{\"k1.1\":11,\"k1.2\":12},\"k2\":{\"k2.1\":21,\"k2.2\":22}}"); } { // array in object js.clear().beginObject().appendKey("k1"). beginArray().appendInt64(1l).appendInt64(2l).endArray().endObject(); - EXPECT_EQUAL(js.toString(), "{\"k1\":[1,2]}"); + EXPECT_EQ(js.toString(), "{\"k1\":[1,2]}"); } { // array in object (multiple pairs) js.clear().beginObject(). appendKey("k1").beginArray().appendInt64(1l).appendInt64(2l).endArray(). appendKey("k2").beginArray().appendInt64(3l).appendInt64(4l).endArray(). endObject(); - EXPECT_EQUAL(js.toString(), "{\"k1\":[1,2],\"k2\":[3,4]}"); + EXPECT_EQ(js.toString(), "{\"k1\":[1,2],\"k2\":[3,4]}"); } } - -void -JSONTest::testJSONWriterArray() +TEST(JSONTest, test_json_writer_array) { JSONStringer js; { // single element js.beginArray().appendInt64(1l).endArray(); - EXPECT_EQUAL(js.toString(), "[1]"); + EXPECT_EQ(js.toString(), "[1]"); } { // multiple elements js.clear().beginArray().appendInt64(1l).appendInt64(2l).endArray(); - EXPECT_EQUAL(js.toString(), "[1,2]"); + EXPECT_EQ(js.toString(), "[1,2]"); } { // array in array js.clear().beginArray().beginArray().appendInt64(1l).endArray().endArray(); - EXPECT_EQUAL(js.toString(), "[[1]]"); + EXPECT_EQ(js.toString(), "[[1]]"); } { // array in array (multiple elements) js.clear().beginArray(). beginArray().appendInt64(1l).appendInt64(2l).endArray(). beginArray().appendInt64(3l).appendInt64(4l).endArray(). endArray(); - EXPECT_EQUAL(js.toString(), "[[1,2],[3,4]]"); + EXPECT_EQ(js.toString(), "[[1,2],[3,4]]"); } { // object in array js.clear().beginArray(). beginObject().appendKey("k1").appendInt64(1l).endObject(). endArray(); - EXPECT_EQUAL(js.toString(), "[{\"k1\":1}]"); + EXPECT_EQ(js.toString(), "[{\"k1\":1}]"); } { // object in array (multiple elements) js.clear().beginArray(). beginObject().appendKey("k1").appendInt64(1l).appendKey("k2").appendInt64(2l).endObject(). beginObject().appendKey("k3").appendInt64(3l).appendKey("k4").appendInt64(4l).endObject(). endArray(); - EXPECT_EQUAL(js.toString(), "[{\"k1\":1,\"k2\":2},{\"k3\":3,\"k4\":4}]"); + EXPECT_EQ(js.toString(), "[{\"k1\":1,\"k2\":2},{\"k3\":3,\"k4\":4}]"); } } - -void -JSONTest::testJSONWriterComplex() +TEST(JSONTest, test_json_writer_complex) { JSONStringer js; @@ -269,7 +249,7 @@ JSONTest::testJSONWriterComplex() js.endArray(); } js.endObject(); - EXPECT_EQUAL(js.toString(), "{\"k1\":{\"k1.1\":1,\"k1.2\":[2,3]},\"k2\":{\"k2.1\":{\"k2.1.1\":4,\"k2.1.2\":[5,6]}},\"k3\":[{\"k3.1\":7,\"k3.2\":[8,9]},{\"k3.1\":10,\"k3.2\":[11,12]}]}"); + EXPECT_EQ(js.toString(), "{\"k1\":{\"k1.1\":1,\"k1.2\":[2,3]},\"k2\":{\"k2.1\":{\"k2.1.1\":4,\"k2.1.2\":[5,6]}},\"k3\":[{\"k3.1\":7,\"k3.2\":[8,9]},{\"k3.1\":10,\"k3.2\":[11,12]}]}"); } namespace { @@ -304,19 +284,17 @@ namespace { }; } -void -JSONTest::testJsonStream() +TEST(JSONTest, test_json_stream) { vespalib::asciistream as; vespalib::JsonStream stream(as); Builder b; b.build(stream); stream.finalize(); - EXPECT_EQUAL(as.str(), "{\"k1\":{\"k1.1\":1,\"k1.2\":[2,3]},\"k2\":{\"k2.1\":{\"k2.1.1\":4,\"k2.1.2\":[5,6]}},\"k3\":[{\"k3.1\":-7,\"k3.2\":[-8,-9]},{\"k3.1\":10,\"k3.2\":[11,12]}]}"); + EXPECT_EQ(as.str(), "{\"k1\":{\"k1.1\":1,\"k1.2\":[2,3]},\"k2\":{\"k2.1\":{\"k2.1.1\":4,\"k2.1.2\":[5,6]}},\"k3\":[{\"k3.1\":-7,\"k3.2\":[-8,-9]},{\"k3.1\":10,\"k3.2\":[11,12]}]}"); } -void -JSONTest::testJsonStreamErrors() +TEST(JSONTest, test_json_stream_errors) { using namespace vespalib::jsonstream; // Unsupported object keys @@ -325,42 +303,42 @@ JSONTest::testJsonStreamErrors() vespalib::JsonStream stream(as); stream << Object() << Object(); } catch (vespalib::JsonStreamException& e) { - EXPECT_EQUAL("Invalid state on call: An object value cannot be an object key ({}(ObjectExpectingKey))", e.getReason()); + EXPECT_EQ("Invalid state on call: An object value cannot be an object key ({}(ObjectExpectingKey))", e.getReason()); } try{ vespalib::asciistream as; vespalib::JsonStream stream(as); stream << Object() << true; } catch (vespalib::JsonStreamException& e) { - EXPECT_EQUAL("Invalid state on call: A bool value cannot be an object key ({}(ObjectExpectingKey))", e.getReason()); + EXPECT_EQ("Invalid state on call: A bool value cannot be an object key ({}(ObjectExpectingKey))", e.getReason()); } try{ vespalib::asciistream as; vespalib::JsonStream stream(as); stream << Object() << 13; } catch (vespalib::JsonStreamException& e) { - EXPECT_EQUAL("Invalid state on call: An int64_t value cannot be an object key ({}(ObjectExpectingKey))", e.getReason()); + EXPECT_EQ("Invalid state on call: An int64_t value cannot be an object key ({}(ObjectExpectingKey))", e.getReason()); } try{ vespalib::asciistream as; vespalib::JsonStream stream(as); stream << Object() << uint64_t(13); } catch (vespalib::JsonStreamException& e) { - EXPECT_EQUAL("Invalid state on call: A uint64_t value cannot be an object key ({}(ObjectExpectingKey))", e.getReason()); + EXPECT_EQ("Invalid state on call: A uint64_t value cannot be an object key ({}(ObjectExpectingKey))", e.getReason()); } try{ vespalib::asciistream as; vespalib::JsonStream stream(as); stream << Object() << 0.5; } catch (vespalib::JsonStreamException& e) { - EXPECT_EQUAL("Invalid state on call: A double value cannot be an object key ({}(ObjectExpectingKey))", e.getReason()); + EXPECT_EQ("Invalid state on call: A double value cannot be an object key ({}(ObjectExpectingKey))", e.getReason()); } try{ vespalib::asciistream as; vespalib::JsonStream stream(as); stream << Object() << jsonstream::Array(); } catch (vespalib::JsonStreamException& e) { - EXPECT_EQUAL("Invalid state on call: An array value cannot be an object key ({}(ObjectExpectingKey))", e.getReason()); + EXPECT_EQ("Invalid state on call: An array value cannot be an object key ({}(ObjectExpectingKey))", e.getReason()); } // Invalid points to add End() try{ @@ -368,14 +346,14 @@ JSONTest::testJsonStreamErrors() vespalib::JsonStream stream(as); stream << Object() << "foo" << End(); } catch (vespalib::JsonStreamException& e) { - EXPECT_EQUAL("Invalid state on call: Object got key but not value. Cannot end it now ({foo}(ObjectExpectingValue))", e.getReason()); + EXPECT_EQ("Invalid state on call: Object got key but not value. Cannot end it now ({foo}(ObjectExpectingValue))", e.getReason()); } try{ vespalib::asciistream as; vespalib::JsonStream stream(as); stream << End(); } catch (vespalib::JsonStreamException& e) { - EXPECT_EQUAL("Invalid state on call: No tag to end. At root ((RootExpectingArrayOrObjectStart))", e.getReason()); + EXPECT_EQ("Invalid state on call: No tag to end. At root ((RootExpectingArrayOrObjectStart))", e.getReason()); } // Adding to finalized stream try{ @@ -383,61 +361,60 @@ JSONTest::testJsonStreamErrors() vespalib::JsonStream stream(as); stream << Object() << End() << "foo"; } catch (vespalib::JsonStreamException& e) { - EXPECT_EQUAL("Invalid state on call: Stream already finalized. Can't add a string value. (Finalized)", e.getReason()); + EXPECT_EQ("Invalid state on call: Stream already finalized. Can't add a string value. (Finalized)", e.getReason()); } try{ vespalib::asciistream as; vespalib::JsonStream stream(as); stream << Object() << End() << false; } catch (vespalib::JsonStreamException& e) { - EXPECT_EQUAL("Invalid state on call: Stream already finalized. Can't add a bool value. (Finalized)", e.getReason()); + EXPECT_EQ("Invalid state on call: Stream already finalized. Can't add a bool value. (Finalized)", e.getReason()); } try{ vespalib::asciistream as; vespalib::JsonStream stream(as); stream << Object() << End() << 13; } catch (vespalib::JsonStreamException& e) { - EXPECT_EQUAL("Invalid state on call: Stream already finalized. Can't add a long long value. (Finalized)", e.getReason()); + EXPECT_EQ("Invalid state on call: Stream already finalized. Can't add a long long value. (Finalized)", e.getReason()); } try{ vespalib::asciistream as; vespalib::JsonStream stream(as); stream << Object() << End() << 13u; } catch (vespalib::JsonStreamException& e) { - EXPECT_EQUAL("Invalid state on call: Stream already finalized. Can't add an unsigned long long value. (Finalized)", e.getReason()); + EXPECT_EQ("Invalid state on call: Stream already finalized. Can't add an unsigned long long value. (Finalized)", e.getReason()); } try{ vespalib::asciistream as; vespalib::JsonStream stream(as); stream << Object() << End() << 0.2; } catch (vespalib::JsonStreamException& e) { - EXPECT_EQUAL("Invalid state on call: Stream already finalized. Can't add a double value. (Finalized)", e.getReason()); + EXPECT_EQ("Invalid state on call: Stream already finalized. Can't add a double value. (Finalized)", e.getReason()); } try{ vespalib::asciistream as; vespalib::JsonStream stream(as); stream << Object() << End() << Object(); } catch (vespalib::JsonStreamException& e) { - EXPECT_EQUAL("Invalid state on call: Stream already finalized. Can't start a new object. (Finalized)", e.getReason()); + EXPECT_EQ("Invalid state on call: Stream already finalized. Can't start a new object. (Finalized)", e.getReason()); } try{ vespalib::asciistream as; vespalib::JsonStream stream(as); stream << Object() << End() << jsonstream::Array(); } catch (vespalib::JsonStreamException& e) { - EXPECT_EQUAL("Invalid state on call: Stream already finalized. Can't start a new array. (Finalized)", e.getReason()); + EXPECT_EQ("Invalid state on call: Stream already finalized. Can't start a new array. (Finalized)", e.getReason()); } try{ vespalib::asciistream as; vespalib::JsonStream stream(as); stream << Object() << End() << End(); } catch (vespalib::JsonStreamException& e) { - EXPECT_EQUAL("Invalid state on call: Stream already finalized. Can't end it. (Finalized)", e.getReason()); + EXPECT_EQ("Invalid state on call: Stream already finalized. Can't end it. (Finalized)", e.getReason()); } } -void -JSONTest::testJsonStreamStateReporting() +TEST(JSONTest, test_json_stream_state_reporting) { using namespace vespalib::jsonstream; vespalib::asciistream as; @@ -447,24 +424,8 @@ JSONTest::testJsonStreamStateReporting() << Object() << "key" << "value" << End() << false << End(); - EXPECT_EQUAL("Current: Finalized", stream.getJsonStreamState()); -} - -int -JSONTest::Main() -{ - TEST_INIT("json_test"); - - testJSONWriterValues(); - testJSONWriterObject(); - testJSONWriterArray(); - testJSONWriterComplex(); - testJsonStream(); - testJsonStreamErrors(); - testJsonStreamStateReporting(); - - TEST_DONE(); + EXPECT_EQ("Current: Finalized", stream.getJsonStreamState()); } -TEST_APPHOOK(JSONTest); +GTEST_MAIN_RUN_ALL_TESTS() diff --git a/vespalib/src/tests/objects/identifiable/CMakeLists.txt b/vespalib/src/tests/objects/identifiable/CMakeLists.txt index e8227a8fa14..c3e8a932e20 100644 --- a/vespalib/src/tests/objects/identifiable/CMakeLists.txt +++ b/vespalib/src/tests/objects/identifiable/CMakeLists.txt @@ -5,5 +5,6 @@ vespa_add_executable(vespalib_identifiable_test_app TEST namedobject.cpp DEPENDS vespalib + GTest::gtest ) vespa_add_test(NAME vespalib_identifiable_test_app COMMAND vespalib_identifiable_test_app) diff --git a/vespalib/src/tests/objects/identifiable/identifiable_test.cpp b/vespalib/src/tests/objects/identifiable/identifiable_test.cpp index 4b31ba6e870..6296c7c5922 100644 --- a/vespalib/src/tests/objects/identifiable/identifiable_test.cpp +++ b/vespalib/src/tests/objects/identifiable/identifiable_test.cpp @@ -1,27 +1,26 @@ // Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #include "namedobject.h" +#include <vespa/vespalib/gtest/gtest.h> #include <vespa/vespalib/objects/identifiable.hpp> #include <vespa/vespalib/objects/nbostream.h> #include <vespa/vespalib/util/exceptions.h> -#include <vespa/vespalib/testkit/testapp.h> using namespace vespalib; -class IdentifiableTest : public TestApp { - void requireThatIdentifiableCastCanCastPointers(); - void requireThatIdentifiableCastCanCastReferences(); - void testNamedObject(); - void testNboStream(); +class IdentifiableTest : public ::testing::Test { +protected: + IdentifiableTest(); + ~IdentifiableTest() override; template <typename T> void testStream(const T & a); - void testNboSerializer(); template <typename T> void testSerializer(const T & a); -public: - int Main() override; }; +IdentifiableTest::IdentifiableTest() = default; +IdentifiableTest::~IdentifiableTest() = default; + #define CID_Abstract 0x700000 #define CID_A 0x700001 #define CID_B 0x700002 @@ -74,22 +73,21 @@ IMPLEMENT_IDENTIFIABLE(A, Abstract); IMPLEMENT_IDENTIFIABLE(B, A); IMPLEMENT_IDENTIFIABLE(C, Identifiable); -void -IdentifiableTest::testNamedObject() +TEST_F(IdentifiableTest, test_named_object) { NamedObject a("first"), b("second");; nbostream os; NBOSerializer nos(os); nos << a << b; - EXPECT_EQUAL(27u,os.size()); + EXPECT_EQ(27u,os.size()); Identifiable::UP o1; o1 = Identifiable::create(nos); - EXPECT_EQUAL(14u, os.size()); + EXPECT_EQ(14u, os.size()); ASSERT_TRUE(o1->inherits(NamedObject::classId)); ASSERT_TRUE(o1->getClass().id() == NamedObject::classId); EXPECT_TRUE(static_cast<const NamedObject &>(*o1).getName() == "first"); o1 = Identifiable::create(nos); - EXPECT_EQUAL(0u, os.size()); + EXPECT_EQ(0u, os.size()); ASSERT_TRUE(o1->inherits(NamedObject::classId)); ASSERT_TRUE(o1->getClass().id() == NamedObject::classId); EXPECT_TRUE(static_cast<const NamedObject &>(*o1).getName() == "second"); @@ -103,8 +101,8 @@ void IdentifiableTest::testStream(const T & a) T b; s >> b; EXPECT_TRUE(s.empty()); - EXPECT_EQUAL(a, b); - EXPECT_EQUAL(nbostream::ok, s.state()); + EXPECT_EQ(a, b); + EXPECT_EQ(nbostream::ok, s.state()); EXPECT_TRUE(s.good()); } @@ -117,11 +115,11 @@ void IdentifiableTest::testSerializer(const T & a) T b; s >> b; EXPECT_TRUE(s.getStream().empty()); - EXPECT_EQUAL(a, b); - EXPECT_EQUAL(nbostream::ok, s.getStream().state()); + EXPECT_EQ(a, b); + EXPECT_EQ(nbostream::ok, s.getStream().state()); } -void IdentifiableTest::testNboSerializer() +TEST_F(IdentifiableTest, test_nbo_serializer) { testSerializer(true); testSerializer(false); @@ -138,7 +136,7 @@ void IdentifiableTest::testNboSerializer() testSerializer(vespalib::string("abcdefgh")); } -void IdentifiableTest::testNboStream() +TEST_F(IdentifiableTest, test_nbo_stream) { testStream(true); testStream(false); @@ -156,94 +154,85 @@ void IdentifiableTest::testNboStream() testStream(vespalib::string("abcdefgh")); { nbostream s(4); - EXPECT_EQUAL(4u, s.capacity()); + EXPECT_EQ(4u, s.capacity()); s << "abcdef"; - EXPECT_EQUAL(nbostream::ok, s.state()); - EXPECT_EQUAL(10u, s.size()); - EXPECT_EQUAL(16u, s.capacity()); - EXPECT_EQUAL(0, strncmp(s.data() + 4, "abcdef", 6)); + EXPECT_EQ(nbostream::ok, s.state()); + EXPECT_EQ(10u, s.size()); + EXPECT_EQ(16u, s.capacity()); + EXPECT_EQ(0, strncmp(s.data() + 4, "abcdef", 6)); } { nbostream s(8); - EXPECT_EQUAL(0u, s.size()); - EXPECT_EQUAL(8u, s.capacity()); + EXPECT_EQ(0u, s.size()); + EXPECT_EQ(8u, s.capacity()); const char * prev = s.data(); s << "ABCD"; - EXPECT_EQUAL(8u, s.size()); - EXPECT_EQUAL(8u, s.capacity()); - EXPECT_EQUAL(prev, s.data()); + EXPECT_EQ(8u, s.size()); + EXPECT_EQ(8u, s.capacity()); + EXPECT_EQ(prev, s.data()); s << "A long string that will cause resizing"; - EXPECT_EQUAL(50u, s.size()); - EXPECT_EQUAL(64u, s.capacity()); - EXPECT_NOT_EQUAL(prev, s.data()); + EXPECT_EQ(50u, s.size()); + EXPECT_EQ(64u, s.capacity()); + EXPECT_NE(prev, s.data()); } { nbostream s(8); - EXPECT_EQUAL(0u, s.size()); - EXPECT_EQUAL(8u, s.capacity()); + EXPECT_EQ(0u, s.size()); + EXPECT_EQ(8u, s.capacity()); const char * prev = s.data(); s << "ABCD"; - EXPECT_EQUAL(8u, s.size()); - EXPECT_EQUAL(8u, s.capacity()); - EXPECT_EQUAL(prev, s.data()); + EXPECT_EQ(8u, s.size()); + EXPECT_EQ(8u, s.capacity()); + EXPECT_EQ(prev, s.data()); s.reserve(50); - EXPECT_NOT_EQUAL(prev, s.data()); - EXPECT_EQUAL(8u, s.size()); - EXPECT_EQUAL(64u, s.capacity()); + EXPECT_NE(prev, s.data()); + EXPECT_EQ(8u, s.size()); + EXPECT_EQ(64u, s.capacity()); prev = s.data(); s << "A long string that will cause resizing"; - EXPECT_EQUAL(50u, s.size()); - EXPECT_EQUAL(64u, s.capacity()); - EXPECT_EQUAL(prev, s.data()); + EXPECT_EQ(50u, s.size()); + EXPECT_EQ(64u, s.capacity()); + EXPECT_EQ(prev, s.data()); } { nbostream s; s << int64_t(9); - EXPECT_EQUAL(8u, s.size()); - EXPECT_EQUAL(0u, s.rp()); + EXPECT_EQ(8u, s.size()); + EXPECT_EQ(0u, s.rp()); int64_t a(7), b(1); s >> a; - EXPECT_EQUAL(0u, s.size()); - EXPECT_EQUAL(8u, s.rp()); + EXPECT_EQ(0u, s.size()); + EXPECT_EQ(8u, s.rp()); EXPECT_TRUE(s.empty()); EXPECT_TRUE(s.good()); - EXPECT_EQUAL(9, a); + EXPECT_EQ(9, a); try { s >> b; EXPECT_TRUE(false); } catch (const IllegalStateException & e) { - EXPECT_EQUAL("Stream failed bufsize(1024), readp(8), writep(8)", e.getMessage()); + EXPECT_EQ("Stream failed bufsize(1024), readp(8), writep(8)", e.getMessage()); } - EXPECT_EQUAL(0u, s.size()); - EXPECT_EQUAL(8u, s.rp()); + EXPECT_EQ(0u, s.size()); + EXPECT_EQ(8u, s.rp()); EXPECT_TRUE(s.empty()); EXPECT_FALSE(s.good()); - EXPECT_EQUAL(1, b); - EXPECT_EQUAL(nbostream::eof, s.state()); + EXPECT_EQ(1, b); + EXPECT_EQ(nbostream::eof, s.state()); } } -int -IdentifiableTest::Main() +TEST_F(IdentifiableTest, test_identifiable) { - TEST_INIT("identifiable_test"); - - TEST_DO(requireThatIdentifiableCastCanCastPointers()); - TEST_DO(requireThatIdentifiableCastCanCastReferences()); - testNamedObject(); - testNboStream(); - testNboSerializer(); - A a; B b; const Identifiable::RuntimeClass & rtcA = a.getClass(); - EXPECT_EQUAL(rtcA.id(), static_cast<unsigned int>(A::classId)); - EXPECT_EQUAL(strcmp(rtcA.name(), "A"), 0); + EXPECT_EQ(rtcA.id(), static_cast<unsigned int>(A::classId)); + EXPECT_EQ(strcmp(rtcA.name(), "A"), 0); const Identifiable::RuntimeClass & rtcB = b.getClass(); - EXPECT_EQUAL(rtcB.id(), static_cast<unsigned int>(B::classId)); - EXPECT_EQUAL(strcmp(rtcB.name(), "B"), 0); + EXPECT_EQ(rtcB.id(), static_cast<unsigned int>(B::classId)); + EXPECT_EQ(strcmp(rtcB.name(), "B"), 0); const Identifiable::RuntimeClass * rt(Identifiable::classFromId(0x1ab76245)); ASSERT_TRUE(rt == NULL); @@ -270,7 +259,7 @@ IdentifiableTest::Main() nbostream os; NBOSerializer nos(os); nos << *o; - EXPECT_EQUAL(os.size(), 4u); + EXPECT_EQ(os.size(), 4u); Identifiable::UP o2 = Identifiable::create(nos); EXPECT_TRUE(os.empty()); ASSERT_TRUE(o->inherits(B::classId)); @@ -297,18 +286,17 @@ IdentifiableTest::Main() IdentifiablePtr<C> c1(new C(10)); IdentifiablePtr<C> c2(new C(20)); - EXPECT_LESS(c0.cmp(c1), 0); - EXPECT_EQUAL(c0.cmp(c0), 0); - EXPECT_GREATER(c1.cmp(c0), 0); + EXPECT_LT(c0.cmp(c1), 0); + EXPECT_EQ(c0.cmp(c0), 0); + EXPECT_GT(c1.cmp(c0), 0); - EXPECT_LESS(c1.cmp(c2), 0); - EXPECT_EQUAL(c1.cmp(c1), 0); - EXPECT_GREATER(c2.cmp(c1), 0); - - TEST_DONE(); + EXPECT_LT(c1.cmp(c2), 0); + EXPECT_EQ(c1.cmp(c1), 0); + EXPECT_GT(c2.cmp(c1), 0); } -void IdentifiableTest::requireThatIdentifiableCastCanCastPointers() { +TEST_F(IdentifiableTest, require_that_identifiable_cast_can_cast_pointers) +{ A a; B b; EXPECT_TRUE(Identifiable::cast<A *>(&a)); @@ -319,7 +307,8 @@ void IdentifiableTest::requireThatIdentifiableCastCanCastPointers() { EXPECT_TRUE(Identifiable::cast<Abstract *>(&b)); } -void IdentifiableTest::requireThatIdentifiableCastCanCastReferences() { +TEST_F(IdentifiableTest, require_that_identifiable_cast_can_cast_references) +{ A a; B b; try { @@ -330,9 +319,9 @@ void IdentifiableTest::requireThatIdentifiableCastCanCastReferences() { Identifiable::cast<Abstract &>(a); Identifiable::cast<Abstract &>(b); } catch (std::bad_cast &e) { - TEST_FATAL(e.what()); + FAIL() << e.what(); } - EXPECT_EXCEPTION(Identifiable::cast<B &>(a), std::bad_cast, "bad_cast"); + EXPECT_THROW(Identifiable::cast<B &>(a), std::bad_cast); } -TEST_APPHOOK(IdentifiableTest) +GTEST_MAIN_RUN_ALL_TESTS() diff --git a/vespalib/src/tests/optimized/CMakeLists.txt b/vespalib/src/tests/optimized/CMakeLists.txt index 0e7e85b6678..ce1c3a7cf67 100644 --- a/vespalib/src/tests/optimized/CMakeLists.txt +++ b/vespalib/src/tests/optimized/CMakeLists.txt @@ -4,5 +4,6 @@ vespa_add_executable(vespalib_optimized_test_app TEST optimized_test.cpp DEPENDS vespalib + GTest::gtest ) vespa_add_test(NAME vespalib_optimized_test_app COMMAND vespalib_optimized_test_app) diff --git a/vespalib/src/tests/optimized/optimized_test.cpp b/vespalib/src/tests/optimized/optimized_test.cpp index 9dffefeb012..ec14750f919 100644 --- a/vespalib/src/tests/optimized/optimized_test.cpp +++ b/vespalib/src/tests/optimized/optimized_test.cpp @@ -1,82 +1,64 @@ // Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -#include <vespa/vespalib/testkit/testapp.h> +#include <vespa/vespalib/gtest/gtest.h> #include <vespa/vespalib/util/optimized.h> using namespace vespalib; -class Test : public vespalib::TestApp +template <typename TestType> +class OptimizedTest : public ::testing::Test { -private: - template<typename T> - void testMsbIdx(); - template<typename T> - void testLsbIdx(); - template<typename T> - void testPopCount(); -public: - int Main() override; +protected: + OptimizedTest(); + ~OptimizedTest() override; }; -template<typename T> -void Test::testMsbIdx() +template <typename TestType> +OptimizedTest<TestType>::OptimizedTest() = default; +template <typename TestType> +OptimizedTest<TestType>::~OptimizedTest() = default; + +using OptimizedTestTypes = ::testing::Types<unsigned int, unsigned long, unsigned long long>; +TYPED_TEST_SUITE(OptimizedTest, OptimizedTestTypes); + +TYPED_TEST(OptimizedTest, test_msb_idx) { - EXPECT_EQUAL(Optimized::msbIdx(T(0)), 0); - EXPECT_EQUAL(Optimized::msbIdx(T(1)), 0); - EXPECT_EQUAL(Optimized::msbIdx(T(-1)), int(sizeof(T)*8 - 1)); + using T = TypeParam; + EXPECT_EQ(Optimized::msbIdx(T(0)), 0); + EXPECT_EQ(Optimized::msbIdx(T(1)), 0); + EXPECT_EQ(Optimized::msbIdx(T(-1)), int(sizeof(T)*8 - 1)); T v(static_cast<T>(-1)); for (size_t i(0); i < sizeof(T); i++) { for (size_t j(0); j < 8; j++) { - EXPECT_EQUAL(Optimized::msbIdx(v), int(sizeof(T)*8 - (i*8+j) - 1)); + EXPECT_EQ(Optimized::msbIdx(v), int(sizeof(T)*8 - (i*8+j) - 1)); v = v >> 1; } } } -template<typename T> -void Test::testLsbIdx() +TYPED_TEST(OptimizedTest, test_lsb_idx) { - EXPECT_EQUAL(Optimized::lsbIdx(T(0)), 0); - EXPECT_EQUAL(Optimized::lsbIdx(T(1)), 0); - EXPECT_EQUAL(Optimized::lsbIdx(T(T(1)<<(sizeof(T)*8 - 1))), int(sizeof(T)*8 - 1)); - EXPECT_EQUAL(Optimized::lsbIdx(T(-1)), 0); + using T = TypeParam; + EXPECT_EQ(Optimized::lsbIdx(T(0)), 0); + EXPECT_EQ(Optimized::lsbIdx(T(1)), 0); + EXPECT_EQ(Optimized::lsbIdx(T(T(1)<<(sizeof(T)*8 - 1))), int(sizeof(T)*8 - 1)); + EXPECT_EQ(Optimized::lsbIdx(T(-1)), 0); T v(static_cast<T>(-1)); for (size_t i(0); i < sizeof(T); i++) { for (size_t j(0); j < 8; j++) { - EXPECT_EQUAL(Optimized::lsbIdx(v), int(i*8+j)); + EXPECT_EQ(Optimized::lsbIdx(v), int(i*8+j)); v = v << 1; } } } -template<typename T> -void Test::testPopCount() +TYPED_TEST(OptimizedTest, test_pop_count) { - EXPECT_EQUAL(0, Optimized::popCount(T(0))); - EXPECT_EQUAL(1, Optimized::popCount(T(1))); - EXPECT_EQUAL(int(8 * sizeof(T)), Optimized::popCount(T(-1))); + using T = TypeParam; + EXPECT_EQ(0, Optimized::popCount(T(0))); + EXPECT_EQ(1, Optimized::popCount(T(1))); + EXPECT_EQ(int(8 * sizeof(T)), Optimized::popCount(T(-1))); } -int Test::Main() -{ - TEST_INIT("optimized_test"); - - testMsbIdx<unsigned int>(); - testMsbIdx<unsigned long>(); - testMsbIdx<unsigned long long>(); - - TEST_FLUSH(); - testLsbIdx<unsigned int>(); - testLsbIdx<unsigned long>(); - testLsbIdx<unsigned long long>(); - - TEST_FLUSH(); - testPopCount<unsigned int>(); - testPopCount<unsigned long>(); - testPopCount<unsigned long long>(); - - TEST_FLUSH(); - TEST_DONE(); -} +GTEST_MAIN_RUN_ALL_TESTS() -TEST_APPHOOK(Test) diff --git a/vespalib/src/tests/printable/CMakeLists.txt b/vespalib/src/tests/printable/CMakeLists.txt index e9332bba309..4781e9b8f54 100644 --- a/vespalib/src/tests/printable/CMakeLists.txt +++ b/vespalib/src/tests/printable/CMakeLists.txt @@ -4,5 +4,6 @@ vespa_add_executable(vespalib_printabletest_app TEST printabletest.cpp DEPENDS vespalib + GTest::gtest ) vespa_add_test(NAME vespalib_printabletest_app COMMAND vespalib_printabletest_app) diff --git a/vespalib/src/tests/printable/printabletest.cpp b/vespalib/src/tests/printable/printabletest.cpp index 03e3c777a25..5b6c0058bf0 100644 --- a/vespalib/src/tests/printable/printabletest.cpp +++ b/vespalib/src/tests/printable/printabletest.cpp @@ -1,8 +1,8 @@ // Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +#include <vespa/vespalib/gtest/gtest.h> #include <vespa/vespalib/util/printable.h> #include <vespa/vespalib/stllike/asciistream.h> -#include <vespa/vespalib/testkit/testapp.h> struct Foo : public vespalib::Printable { int val; @@ -74,80 +74,61 @@ struct AsciiBar : public vespalib::AsciiPrintable { } }; -class Test : public vespalib::TestApp -{ -public: - void testSimple(); - void testAsciiVariant(); - int Main() override; -}; - -void -Test::testSimple() +TEST(PrintableTest, test_simple) { Foo foo(3, "myval"); Bar bar(7, 3, "otherval"); - EXPECT_EQUAL("Foo(val = 3, other size 5)", foo.toString()); - EXPECT_EQUAL("Foo(val = 3, other size 5)", foo.toString(false, " ")); - EXPECT_EQUAL("Foo(val = 3, other:\n" - " myval)", foo.toString(true)); - EXPECT_EQUAL("Foo(val = 3, other:\n" - " myval)", foo.toString(true, " ")); + EXPECT_EQ("Foo(val = 3, other size 5)", foo.toString()); + EXPECT_EQ("Foo(val = 3, other size 5)", foo.toString(false, " ")); + EXPECT_EQ("Foo(val = 3, other:\n" + " myval)", foo.toString(true)); + EXPECT_EQ("Foo(val = 3, other:\n" + " myval)", foo.toString(true, " ")); std::ostringstream ost; ost << foo; - EXPECT_EQUAL("Foo(val = 3, other size 5)", ost.str()); - - EXPECT_EQUAL("Bar(7)", bar.toString()); - EXPECT_EQUAL("Bar(7)", bar.toString(false, " ")); - EXPECT_EQUAL("Bar(7) : Foo(val = 3, other:\n" - " otherval)", bar.toString(true)); - EXPECT_EQUAL("Bar(7) : Foo(val = 3, other:\n" - " otherval)", bar.toString(true, " ")); + EXPECT_EQ("Foo(val = 3, other size 5)", ost.str()); + + EXPECT_EQ("Bar(7)", bar.toString()); + EXPECT_EQ("Bar(7)", bar.toString(false, " ")); + EXPECT_EQ("Bar(7) : Foo(val = 3, other:\n" + " otherval)", bar.toString(true)); + EXPECT_EQ("Bar(7) : Foo(val = 3, other:\n" + " otherval)", bar.toString(true, " ")); } -void -Test::testAsciiVariant() +TEST(PrintableTest, test_ascii_variant) { AsciiFoo foo(19); - EXPECT_EQUAL("19", foo.toString()); - EXPECT_EQUAL("AsciiFoo(19)", - foo.toString(vespalib::AsciiPrintable::VERBOSE)); + EXPECT_EQ("19", foo.toString()); + EXPECT_EQ("AsciiFoo(19)", + foo.toString(vespalib::AsciiPrintable::VERBOSE)); { vespalib::asciistream as; as << foo; - EXPECT_EQUAL("19", as.str()); + EXPECT_EQ("19", as.str()); std::ostringstream ost; ost << foo; - EXPECT_EQUAL("19", ost.str()); + EXPECT_EQ("19", ost.str()); } AsciiBar bar(3); - EXPECT_EQUAL("3", bar.toString()); - EXPECT_EQUAL("AsciiBar() {\n" - " AsciiFoo(3)\n" - "}", bar.toString(vespalib::AsciiPrintable::VERBOSE)); + EXPECT_EQ("3", bar.toString()); + EXPECT_EQ("AsciiBar() {\n" + " AsciiFoo(3)\n" + "}", bar.toString(vespalib::AsciiPrintable::VERBOSE)); { vespalib::asciistream as; as << bar; - EXPECT_EQUAL("3", as.str()); + EXPECT_EQ("3", as.str()); std::ostringstream ost; ost << bar; - EXPECT_EQUAL("3", ost.str()); + EXPECT_EQ("3", ost.str()); } } -int -Test::Main() -{ - TEST_INIT("printabletest"); - testSimple(); - testAsciiVariant(); - TEST_DONE(); -} - -TEST_APPHOOK(Test) +GTEST_MAIN_RUN_ALL_TESTS() diff --git a/vespalib/src/tests/programoptions/CMakeLists.txt b/vespalib/src/tests/programoptions/CMakeLists.txt index 81066b19104..524ea8dc416 100644 --- a/vespalib/src/tests/programoptions/CMakeLists.txt +++ b/vespalib/src/tests/programoptions/CMakeLists.txt @@ -5,5 +5,6 @@ vespa_add_executable(vespalib_programoptions_test_app TEST programoptions_testutils.cpp DEPENDS vespalib + GTest::gtest ) vespa_add_test(NAME vespalib_programoptions_test_app COMMAND vespalib_programoptions_test_app) diff --git a/vespalib/src/tests/programoptions/programoptions_test.cpp b/vespalib/src/tests/programoptions/programoptions_test.cpp index bbb5e2ffc20..4f5ff2fc4d1 100644 --- a/vespalib/src/tests/programoptions/programoptions_test.cpp +++ b/vespalib/src/tests/programoptions/programoptions_test.cpp @@ -2,38 +2,11 @@ #include "programoptions_testutils.h" #include <vespa/vespalib/util/programoptions.h> -#include <vespa/vespalib/testkit/testapp.h> +#include <vespa/vespalib/gtest/gtest.h> #include <iostream> namespace vespalib { -class Test : public vespalib::TestApp -{ -public: - void testSyntaxPage(); - void testNormalUsage(); - void testFailures(); - void testVectorArgument(); - void testAllHiddenOption(); - void testOptionsAfterArguments(); - int Main() override; -}; - -int -Test::Main() -{ - TEST_INIT("programoptions_test"); - srandom(1); - testSyntaxPage(); - testNormalUsage(); - testFailures(); - testVectorArgument(); - testAllHiddenOption(); - // Currently not supported - // testOptionsAfterArguments(); - TEST_DONE(); -} - struct MyOptions : public ProgramOptions { bool boolOpt; bool boolWithDefOpt; @@ -86,7 +59,8 @@ MyOptions::MyOptions(int argc, const char* const* argv) MyOptions::~MyOptions() { } -void Test::testSyntaxPage() { +TEST(ProgramOptionsTest, test_syntax_page) +{ AppOptions opts("myapp"); MyOptions options(opts.getArgCount(), opts.getArguments()); std::ostringstream actual; @@ -116,41 +90,42 @@ void Test::testSyntaxPage() { "Advanced options:\n" " -p --properties <key> <value> : Property map (default empty)\n" ); - EXPECT_EQUAL(expected, actual.str()); + EXPECT_EQ(expected, actual.str()); } -void Test::testNormalUsage() { +TEST(ProgramOptionsTest, test_normal_usage) +{ { AppOptions opts("myapp -b --uintopt 4 -s foo tit 1 tei 6"); MyOptions options(opts.getArgCount(), opts.getArguments()); options.parse(); - EXPECT_EQUAL(true, options.boolOpt); - EXPECT_EQUAL(true, options.boolWithDefOpt); - EXPECT_EQUAL(5, options.intOpt); - EXPECT_EQUAL(4u, options.uintOpt); - EXPECT_APPROX(4, options.floatOpt, 0.00001); - EXPECT_EQUAL("foo", options.stringOpt); - EXPECT_EQUAL("tit", options.argString); - EXPECT_EQUAL(1, options.argInt); - EXPECT_EQUAL("tei", options.argOptionalString); - EXPECT_EQUAL(0u, options.properties.size()); - EXPECT_EQUAL(6, options.anotherOptionalArg); + EXPECT_EQ(true, options.boolOpt); + EXPECT_EQ(true, options.boolWithDefOpt); + EXPECT_EQ(5, options.intOpt); + EXPECT_EQ(4u, options.uintOpt); + EXPECT_NEAR(4, options.floatOpt, 0.00001); + EXPECT_EQ("foo", options.stringOpt); + EXPECT_EQ("tit", options.argString); + EXPECT_EQ(1, options.argInt); + EXPECT_EQ("tei", options.argOptionalString); + EXPECT_EQ(0u, options.properties.size()); + EXPECT_EQ(6, options.anotherOptionalArg); } { AppOptions opts("myapp --uintopt 6 tit 1"); MyOptions options(opts.getArgCount(), opts.getArguments()); options.parse(); - EXPECT_EQUAL(false, options.boolOpt); - EXPECT_EQUAL(true, options.boolWithDefOpt); - EXPECT_EQUAL(5, options.intOpt); - EXPECT_EQUAL(6u, options.uintOpt); - EXPECT_APPROX(4, options.floatOpt, 0.00001); - EXPECT_EQUAL("ballalaika", options.stringOpt); - EXPECT_EQUAL("tit", options.argString); - EXPECT_EQUAL(1, options.argInt); - EXPECT_EQUAL("foo", options.argOptionalString); - EXPECT_EQUAL(0u, options.properties.size()); - EXPECT_EQUAL(3, options.anotherOptionalArg); + EXPECT_EQ(false, options.boolOpt); + EXPECT_EQ(true, options.boolWithDefOpt); + EXPECT_EQ(5, options.intOpt); + EXPECT_EQ(6u, options.uintOpt); + EXPECT_NEAR(4, options.floatOpt, 0.00001); + EXPECT_EQ("ballalaika", options.stringOpt); + EXPECT_EQ("tit", options.argString); + EXPECT_EQ(1, options.argInt); + EXPECT_EQ("foo", options.argOptionalString); + EXPECT_EQ(0u, options.properties.size()); + EXPECT_EQ(3, options.anotherOptionalArg); } // Arguments coming after options. // (Required for nesting of short options) @@ -158,62 +133,63 @@ void Test::testNormalUsage() { AppOptions opts("myapp --uintopt --intopt 6 -8 tit 1 tei"); MyOptions options(opts.getArgCount(), opts.getArguments()); options.parse(); - EXPECT_EQUAL(false, options.boolOpt); - EXPECT_EQUAL(true, options.boolWithDefOpt); - EXPECT_EQUAL(-8, options.intOpt); - EXPECT_EQUAL(6u, options.uintOpt); - EXPECT_APPROX(4, options.floatOpt, 0.00001); - EXPECT_EQUAL("ballalaika", options.stringOpt); - EXPECT_EQUAL("tit", options.argString); - EXPECT_EQUAL(1, options.argInt); - EXPECT_EQUAL("tei", options.argOptionalString); - EXPECT_EQUAL(0u, options.properties.size()); + EXPECT_EQ(false, options.boolOpt); + EXPECT_EQ(true, options.boolWithDefOpt); + EXPECT_EQ(-8, options.intOpt); + EXPECT_EQ(6u, options.uintOpt); + EXPECT_NEAR(4, options.floatOpt, 0.00001); + EXPECT_EQ("ballalaika", options.stringOpt); + EXPECT_EQ("tit", options.argString); + EXPECT_EQ(1, options.argInt); + EXPECT_EQ("tei", options.argOptionalString); + EXPECT_EQ(0u, options.properties.size()); } { AppOptions opts( "myapp -uib 6 -8 --boolwithdef tit 1 tei"); MyOptions options(opts.getArgCount(), opts.getArguments()); options.parse(); - EXPECT_EQUAL(true, options.boolOpt); - EXPECT_EQUAL(false, options.boolWithDefOpt); - EXPECT_EQUAL(-8, options.intOpt); - EXPECT_EQUAL(6u, options.uintOpt); - EXPECT_APPROX(4, options.floatOpt, 0.00001); - EXPECT_EQUAL("ballalaika", options.stringOpt); - EXPECT_EQUAL("tit", options.argString); - EXPECT_EQUAL(1, options.argInt); - EXPECT_EQUAL("tei", options.argOptionalString); - EXPECT_EQUAL(0u, options.properties.size()); + EXPECT_EQ(true, options.boolOpt); + EXPECT_EQ(false, options.boolWithDefOpt); + EXPECT_EQ(-8, options.intOpt); + EXPECT_EQ(6u, options.uintOpt); + EXPECT_NEAR(4, options.floatOpt, 0.00001); + EXPECT_EQ("ballalaika", options.stringOpt); + EXPECT_EQ("tit", options.argString); + EXPECT_EQ(1, options.argInt); + EXPECT_EQ("tei", options.argOptionalString); + EXPECT_EQ(0u, options.properties.size()); } // Properties { AppOptions opts("myapp -u 6 -p foo bar --prop hmm brr tit 1 tei"); MyOptions options(opts.getArgCount(), opts.getArguments()); options.parse(); - EXPECT_EQUAL(false, options.boolOpt); - EXPECT_EQUAL(true, options.boolWithDefOpt); - EXPECT_EQUAL(5, options.intOpt); - EXPECT_EQUAL(6u, options.uintOpt); - EXPECT_APPROX(4, options.floatOpt, 0.00001); - EXPECT_EQUAL("ballalaika", options.stringOpt); - EXPECT_EQUAL("tit", options.argString); - EXPECT_EQUAL(1, options.argInt); - EXPECT_EQUAL("tei", options.argOptionalString); - EXPECT_EQUAL(2u, options.properties.size()); - EXPECT_EQUAL("bar", options.properties["foo"]); - EXPECT_EQUAL("brr", options.properties["hmm"]); + EXPECT_EQ(false, options.boolOpt); + EXPECT_EQ(true, options.boolWithDefOpt); + EXPECT_EQ(5, options.intOpt); + EXPECT_EQ(6u, options.uintOpt); + EXPECT_NEAR(4, options.floatOpt, 0.00001); + EXPECT_EQ("ballalaika", options.stringOpt); + EXPECT_EQ("tit", options.argString); + EXPECT_EQ(1, options.argInt); + EXPECT_EQ("tei", options.argOptionalString); + EXPECT_EQ(2u, options.properties.size()); + EXPECT_EQ("bar", options.properties["foo"]); + EXPECT_EQ("brr", options.properties["hmm"]); } } -void Test::testFailures() { +TEST(ProgramOptionsTest, test_failures) +{ // Non-existing long option { AppOptions opts("myapp -b --uintopt 4 -s foo --none"); MyOptions options(opts.getArgCount(), opts.getArguments()); try{ options.parse(); - TEST_FATAL("Expected exception"); + FAIL() << "Expected exception"; } catch (InvalidCommandLineArgumentsException& e) { - EXPECT_EQUAL("Invalid option 'none'.", e.getMessage()); + EXPECT_EQ("Invalid option 'none'.", e.getMessage()); } } // Non-existing short option @@ -222,9 +198,9 @@ void Test::testFailures() { MyOptions options(opts.getArgCount(), opts.getArguments()); try{ options.parse(); - TEST_FATAL("Expected exception"); + FAIL() << "Expected exception"; } catch (InvalidCommandLineArgumentsException& e) { - EXPECT_EQUAL("Invalid option 'q'.", e.getMessage()); + EXPECT_EQ("Invalid option 'q'.", e.getMessage()); } } // Lacking option argument @@ -233,9 +209,9 @@ void Test::testFailures() { MyOptions options(opts.getArgCount(), opts.getArguments()); try{ options.parse(); - TEST_FATAL("Expected exception"); + FAIL() << "Expected exception"; } catch (InvalidCommandLineArgumentsException& e) { - EXPECT_EQUAL("Option 's' needs 1 arguments. Only 0 available.", + EXPECT_EQ("Option 's' needs 1 arguments. Only 0 available.", e.getMessage()); } } @@ -245,35 +221,21 @@ void Test::testFailures() { MyOptions options(opts.getArgCount(), opts.getArguments()); try{ options.parse(); - TEST_FATAL("Expected exception"); + FAIL() << "Expected exception"; } catch (InvalidCommandLineArgumentsException& e) { - EXPECT_EQUAL("The argument '3000000000' can not be interpreted as a " + EXPECT_EQ("The argument '3000000000' can not be interpreted as a " "number of type int.", e.getMessage()); } } - // Negative value to unsigned var (Currently doesnt fail) -/* - { - AppOptions opts("myapp -b --uintopt -1 foo 0"); - MyOptions options(opts.getArgCount(), opts.getArguments()); - try{ - options.parse(); - TEST_FATAL("Expected exception"); - } catch (InvalidCommandLineArgumentsException& e) { - EXPECT_EQUAL("The argument '-1' can not be interpreted as a " - "number of type uint.", e.getMessage()); - } - } - */ // Lacking required option { AppOptions opts("myapp -b"); MyOptions options(opts.getArgCount(), opts.getArguments()); try{ options.parse(); - TEST_FATAL("Expected exception"); + FAIL() << "Expected exception"; } catch (InvalidCommandLineArgumentsException& e) { - EXPECT_EQUAL("Option 'uintopt' has no default and must be set.", + EXPECT_EQ("Option 'uintopt' has no default and must be set.", e.getMessage()); } } @@ -283,9 +245,9 @@ void Test::testFailures() { MyOptions options(opts.getArgCount(), opts.getArguments()); try{ options.parse(); - TEST_FATAL("Expected exception"); + FAIL() << "Expected exception"; } catch (InvalidCommandLineArgumentsException& e) { - EXPECT_EQUAL("Insufficient data is given to set required argument " + EXPECT_EQ("Insufficient data is given to set required argument " "'argInt'.", e.getMessage()); } @@ -296,16 +258,16 @@ void Test::testFailures() { MyOptions options(opts.getArgCount(), opts.getArguments()); try{ options.parse(); - TEST_FATAL("Expected exception"); + FAIL() << "Expected exception"; } catch (InvalidCommandLineArgumentsException& e) { - EXPECT_EQUAL("The argument 'en' can not be interpreted as a number " + EXPECT_EQ("The argument 'en' can not be interpreted as a number " "of type int.", e.getMessage()); } } } -void Test::testVectorArgument() +TEST(ProgramOptionsTest, test_vector_argument) { AppOptions opts("myapp foo bar baz"); std::vector<std::string> args; @@ -318,16 +280,16 @@ void Test::testVectorArgument() "Arguments:\n" " ids (string[]) : Vector element\n" ); - EXPECT_EQUAL(expected, actual.str()); + EXPECT_EQ(expected, actual.str()); options.parse(); - EXPECT_EQUAL(3u, args.size()); - EXPECT_EQUAL("foo", args[0]); - EXPECT_EQUAL("bar", args[1]); - EXPECT_EQUAL("baz", args[2]); + EXPECT_EQ(3u, args.size()); + EXPECT_EQ("foo", args[0]); + EXPECT_EQ("bar", args[1]); + EXPECT_EQ("baz", args[2]); } -void Test::testAllHiddenOption() +TEST(ProgramOptionsTest, test_all_hidden_options) { AppOptions opts("myapp --foo bar"); std::string option; @@ -337,25 +299,12 @@ void Test::testAllHiddenOption() std::ostringstream actual; options.writeSyntaxPage(actual); std::string expected("\nUsage: myapp\n"); - EXPECT_EQUAL(expected, actual.str()); + EXPECT_EQ(expected, actual.str()); options.parse(); - EXPECT_EQUAL("bar", option); -} - -void Test::testOptionsAfterArguments() -{ - AppOptions opts("myapp bar --foo baz"); - std::string option; - std::string argument; - ProgramOptions options(opts.getArgCount(), opts.getArguments()); - options.addOption("foo", option, "Description"); - options.addArgument("arg", argument, "Description"); - options.parse(); - EXPECT_EQUAL("baz", option); - EXPECT_EQUAL("bar", argument); + EXPECT_EQ("bar", option); } } // vespalib -TEST_APPHOOK(vespalib::Test) +GTEST_MAIN_RUN_ALL_TESTS() diff --git a/vespalib/src/tests/sharedptr/CMakeLists.txt b/vespalib/src/tests/sharedptr/CMakeLists.txt index 052efb19447..6e038ed31c5 100644 --- a/vespalib/src/tests/sharedptr/CMakeLists.txt +++ b/vespalib/src/tests/sharedptr/CMakeLists.txt @@ -4,5 +4,6 @@ vespa_add_executable(vespalib_ptrholder_test_app TEST ptrholder.cpp DEPENDS vespalib + GTest::gtest ) vespa_add_test(NAME vespalib_ptrholder_test_app COMMAND vespalib_ptrholder_test_app) diff --git a/vespalib/src/tests/sharedptr/ptrholder.cpp b/vespalib/src/tests/sharedptr/ptrholder.cpp index 8dc3bba2722..e6d1710247b 100644 --- a/vespalib/src/tests/sharedptr/ptrholder.cpp +++ b/vespalib/src/tests/sharedptr/ptrholder.cpp @@ -1,20 +1,11 @@ // Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #include <vespa/vespalib/util/ptrholder.h> -#include <vespa/vespalib/testkit/testapp.h> +#include <vespa/vespalib/gtest/gtest.h> using vespalib::PtrHolder; -class Test : public vespalib::TestApp -{ -public: - void testEmpty(); - void testSimple(); - int Main() override; -}; - - struct Data { int ctorCnt; @@ -39,8 +30,7 @@ using PT = std::shared_ptr<DataRef>; using HOLD = PtrHolder<DataRef>; -void -Test::testEmpty() +TEST(PtrHolderTest, test_empty) { HOLD hold; EXPECT_TRUE(hold.get().get() == NULL); @@ -56,8 +46,7 @@ Test::testEmpty() } -void -Test::testSimple() +TEST(PtrHolderTest, test_simple) { Data data; HOLD hold; @@ -86,14 +75,4 @@ Test::testSimple() EXPECT_TRUE(data.dtorCnt == 2); } - -int -Test::Main() -{ - TEST_INIT("ptrholder_test"); - testEmpty(); - testSimple(); - TEST_DONE(); -} - -TEST_APPHOOK(Test) +GTEST_MAIN_RUN_ALL_TESTS() diff --git a/vespalib/src/tests/stllike/CMakeLists.txt b/vespalib/src/tests/stllike/CMakeLists.txt index 7fa8e0cbd1f..644bd4f66d2 100644 --- a/vespalib/src/tests/stllike/CMakeLists.txt +++ b/vespalib/src/tests/stllike/CMakeLists.txt @@ -25,6 +25,7 @@ vespa_add_executable(vespalib_asciistream_test_app TEST asciistream_test.cpp DEPENDS vespalib + GTest::gtest ) vespa_add_test(NAME vespalib_asciistream_test_app COMMAND vespalib_asciistream_test_app) vespa_add_executable(vespalib_hashtable_test_app TEST diff --git a/vespalib/src/tests/stllike/asciistream_test.cpp b/vespalib/src/tests/stllike/asciistream_test.cpp index 05068fb102c..cd710c0adb4 100644 --- a/vespalib/src/tests/stllike/asciistream_test.cpp +++ b/vespalib/src/tests/stllike/asciistream_test.cpp @@ -1,49 +1,31 @@ // Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -#include <vespa/vespalib/testkit/test_kit.h> -#include <vespa/vespalib/testkit/testapp.h> +#include <vespa/vespalib/gtest/gtest.h> #include <vespa/vespalib/stllike/asciistream.h> +#include <vespa/vespalib/testkit/test_path.h> #include <vespa/vespalib/util/exceptions.h> #include <vespa/vespalib/locale/c.h> +#include <cmath> #include <iomanip> #include <float.h> using namespace vespalib; -class AsciistreamTest : public TestApp -{ -public: - int Main() override; - template <typename T> - void verify(T first, T second, const char * firstResult, const char * secondResult, char delim); - template <typename T> - void verifyBothWays(T value, const char * firstResult); - void testIntegerManip(); - void testFill(); - void testString(); - void testCreateFromFile(); - void testWriteThenRead(); - void testGetLine(); - void testCopyConstruct(); - void testMoveIsWellDefined(); - void testIllegalNumbers(); - void testDouble(); - void testFloat(); - void testStateSaver(); -}; +namespace { template <typename T> void -AsciistreamTest::verifyBothWays(T value, const char * expected) +verifyBothWays(T value, const char * expected, const vespalib::string& label) { + SCOPED_TRACE(label); asciistream os; os << value; - EXPECT_EQUAL(os.str(), string(expected)); - EXPECT_EQUAL(os.size(), strlen(expected)); + EXPECT_EQ(os.str(), string(expected)); + EXPECT_EQ(os.size(), strlen(expected)); { T v; os >> v; - EXPECT_EQUAL(value, v); + EXPECT_EQ(value, v); EXPECT_TRUE(os.empty()); } @@ -51,255 +33,253 @@ AsciistreamTest::verifyBothWays(T value, const char * expected) os << " " << expected; T v; os >> v; - EXPECT_EQUAL(value, v); + EXPECT_EQ(value, v); EXPECT_TRUE(os.empty()); - EXPECT_EQUAL(0u, os.size()); + EXPECT_EQ(0u, os.size()); } } template <typename T> void -AsciistreamTest::verify(T first, T second, const char * firstResult, const char * secondResult, char delim) +verify(T first, T second, const char * firstResult, const char * secondResult, char delim, const vespalib::string& label) { + SCOPED_TRACE(label); asciistream os; std::ostringstream ss; os << first; ss << first; - EXPECT_EQUAL(os.str(), string(firstResult)); - EXPECT_EQUAL(os.size(), strlen(firstResult)); - EXPECT_EQUAL(ss.str().size(), strlen(firstResult)); - EXPECT_EQUAL(strcmp(ss.str().c_str(), firstResult), 0); + EXPECT_EQ(os.str(), string(firstResult)); + EXPECT_EQ(os.size(), strlen(firstResult)); + EXPECT_EQ(ss.str().size(), strlen(firstResult)); + EXPECT_EQ(strcmp(ss.str().c_str(), firstResult), 0); os << delim << second; ss << delim << second; - EXPECT_EQUAL(os.size(), strlen(secondResult)); - EXPECT_EQUAL(ss.str().size(), strlen(secondResult)); - EXPECT_EQUAL(strcmp(os.c_str(), secondResult), 0); - EXPECT_EQUAL(strcmp(ss.str().c_str(), secondResult), 0); + EXPECT_EQ(os.size(), strlen(secondResult)); + EXPECT_EQ(ss.str().size(), strlen(secondResult)); + EXPECT_EQ(strcmp(os.c_str(), secondResult), 0); + EXPECT_EQ(strcmp(ss.str().c_str(), secondResult), 0); } -void -AsciistreamTest::testIllegalNumbers() +} + +TEST(AsciistreamTest, test_illegal_numbers) { { asciistream is("777777777777"); uint16_t s(0); - EXPECT_EXCEPTION(is >> s, IllegalArgumentException, "strToInt value '777777777777' is outside of range"); - EXPECT_EQUAL(12u, is.size()); + EXPECT_THROW(is >> s, IllegalArgumentException); + EXPECT_EQ(12u, is.size()); uint32_t i(0); - EXPECT_EXCEPTION(is >> i, IllegalArgumentException, "strToInt value '777777777777' is outside of range"); - EXPECT_EQUAL(12u, is.size()); + EXPECT_THROW(is >> i, IllegalArgumentException); + EXPECT_EQ(12u, is.size()); int16_t si(0); - EXPECT_EXCEPTION(is >> si, IllegalArgumentException, "strToInt value '777777777777' is outside of range"); - EXPECT_EQUAL(12u, is.size()); + EXPECT_THROW(is >> si, IllegalArgumentException); + EXPECT_EQ(12u, is.size()); int32_t ii(0); - EXPECT_EXCEPTION(is >> ii, IllegalArgumentException, "strToInt value '777777777777' is outside of range"); - EXPECT_EQUAL(12u, is.size()); + EXPECT_THROW(is >> ii, IllegalArgumentException); + EXPECT_EQ(12u, is.size()); is << "777777777777"; - EXPECT_EQUAL(24u, is.size()); + EXPECT_EQ(24u, is.size()); uint64_t l(0); - EXPECT_EXCEPTION(is >> l, IllegalArgumentException, "value '777777777777777777777777' is outside of range"); - EXPECT_EQUAL(24u, is.size()); + EXPECT_THROW(is >> l, IllegalArgumentException); + EXPECT_EQ(24u, is.size()); int64_t li(0); - EXPECT_EXCEPTION(is >> li, IllegalArgumentException, "value '777777777777777777777777' is outside of range"); - EXPECT_EQUAL(24u, is.size()); + EXPECT_THROW(is >> li, IllegalArgumentException); + EXPECT_EQ(24u, is.size()); } { asciistream is("-77"); uint16_t s(0); - EXPECT_EXCEPTION(is >> s, IllegalArgumentException, "Illegal strToInt value '-77'"); - EXPECT_EQUAL(3u, is.size()); + EXPECT_THROW(is >> s, IllegalArgumentException); + EXPECT_EQ(3u, is.size()); uint32_t i(0); - EXPECT_EXCEPTION(is >> i, IllegalArgumentException, "Illegal strToInt value '-77'"); - EXPECT_EQUAL(3u, is.size()); + EXPECT_THROW(is >> i, IllegalArgumentException); + EXPECT_EQ(3u, is.size()); } { asciistream is("7777777777777777777777777777777777777777"); - EXPECT_EQUAL(40u, is.size()); + EXPECT_EQ(40u, is.size()); float f(0); - EXPECT_EXCEPTION(is >> f, IllegalArgumentException, "float value '7777777777777777777777777777777777777777' is outside of range"); - EXPECT_EQUAL(40u, is.size()); + EXPECT_THROW(is >> f, IllegalArgumentException); + EXPECT_EQ(40u, is.size()); vespalib::string tmp = is.str(); is << "e" << tmp; - EXPECT_EQUAL(81u, is.size()); + EXPECT_EQ(81u, is.size()); double d(0); - EXPECT_EXCEPTION(is >> d, IllegalArgumentException, "double value '7777777777777777777777777777777777777777e7777777777777777777777777777777777777777' is outside of range"); - EXPECT_EQUAL(81u, is.size()); + EXPECT_THROW(is >> d, IllegalArgumentException); + EXPECT_EQ(81u, is.size()); } { asciistream is("a"); char c(' '); - EXPECT_EQUAL(1u, is.size()); + EXPECT_EQ(1u, is.size()); is >> c; - EXPECT_EQUAL('a', c); + EXPECT_EQ('a', c); EXPECT_TRUE(is.empty()); - EXPECT_EXCEPTION(is >> c, IllegalArgumentException, "buffer underflow at pos 1."); + EXPECT_THROW(is >> c, IllegalArgumentException); EXPECT_TRUE(is.empty()); unsigned char u(' '); - EXPECT_EXCEPTION(is >> u, IllegalArgumentException, "buffer underflow at pos 1."); + EXPECT_THROW(is >> u, IllegalArgumentException); EXPECT_TRUE(is.empty()); bool b(false); - EXPECT_EXCEPTION(is >> b, IllegalArgumentException, "buffer underflow at pos 1."); + EXPECT_THROW(is >> b, IllegalArgumentException); EXPECT_TRUE(is.empty()); { uint32_t l(0); - EXPECT_EXCEPTION(is >> l, IllegalArgumentException, "buffer underflow at pos 0."); + EXPECT_THROW(is >> l, IllegalArgumentException); EXPECT_TRUE(is.empty()); } { int32_t l(0); - EXPECT_EXCEPTION(is >> l, IllegalArgumentException, "buffer underflow at pos 0"); + EXPECT_THROW(is >> l, IllegalArgumentException); EXPECT_TRUE(is.empty()); } { float l(0); - EXPECT_EXCEPTION(is >> l, IllegalArgumentException, "Failed decoding a float from ''."); + EXPECT_THROW(is >> l, IllegalArgumentException); EXPECT_TRUE(is.empty()); } { double l(0); - EXPECT_EXCEPTION(is >> l, IllegalArgumentException, "Failed decoding a double from ''."); + EXPECT_THROW(is >> l, IllegalArgumentException); EXPECT_TRUE(is.empty()); } } } -void -AsciistreamTest::testCopyConstruct() +TEST(AsciistreamTest, test_copy_construct) { asciistream os; os << "test1"; asciistream os2(os); - EXPECT_EQUAL(os.str(), os2.str()); + EXPECT_EQ(os.str(), os2.str()); os2 << " test2"; EXPECT_FALSE(os.str() == os2.str()); asciistream os3(os); os3 = os2; - EXPECT_EQUAL(os2.str(), os3.str()); + EXPECT_EQ(os2.str(), os3.str()); os.swap(os2); - EXPECT_EQUAL(os.str(), os3.str()); + EXPECT_EQ(os.str(), os3.str()); EXPECT_FALSE(os3.str() == os2.str()); os.swap(os2); EXPECT_TRUE(os3.str() == os2.str()); } -void -AsciistreamTest::testMoveIsWellDefined() +TEST(AsciistreamTest, test_move_is_well_defined) { asciistream read_only("hello world"); asciistream dest(std::move(read_only)); - EXPECT_EQUAL("hello world", dest.str()); + EXPECT_EQ("hello world", dest.str()); read_only = asciistream("a string long enough to not be short string optimized"); dest = std::move(read_only); - EXPECT_EQUAL("a string long enough to not be short string optimized", dest.str()); + EXPECT_EQ("a string long enough to not be short string optimized", dest.str()); asciistream written_src; written_src << "a foo walks into a bar"; dest = std::move(written_src); - EXPECT_EQUAL("a foo walks into a bar", dest.str()); + EXPECT_EQ("a foo walks into a bar", dest.str()); } -void -AsciistreamTest::testIntegerManip() +TEST(AsciistreamTest, test_integer_manip) { asciistream os; std::ostringstream ss; os << 10; ss << 10; - EXPECT_EQUAL(os.size(), 2u); - EXPECT_EQUAL(ss.str().size(), 2u); - EXPECT_EQUAL(strcmp(os.c_str(), "10"), 0); - EXPECT_EQUAL(strcmp(ss.str().c_str(), "10"), 0); + EXPECT_EQ(os.size(), 2u); + EXPECT_EQ(ss.str().size(), 2u); + EXPECT_EQ(strcmp(os.c_str(), "10"), 0); + EXPECT_EQ(strcmp(ss.str().c_str(), "10"), 0); os << ' ' << dec << 10; ss << ' ' << std::dec << 10; - EXPECT_EQUAL(os.size(), 5u); - EXPECT_EQUAL(ss.str().size(), 5u); - EXPECT_EQUAL(strcmp(os.c_str(), "10 10"), 0); - EXPECT_EQUAL(strcmp(ss.str().c_str(), "10 10"), 0); + EXPECT_EQ(os.size(), 5u); + EXPECT_EQ(ss.str().size(), 5u); + EXPECT_EQ(strcmp(os.c_str(), "10 10"), 0); + EXPECT_EQ(strcmp(ss.str().c_str(), "10 10"), 0); os << ' ' << hex << 10 << ' ' << 11; ss << ' ' << std::hex << 10 << ' ' << 11; - EXPECT_EQUAL(os.size(), 9u); - EXPECT_EQUAL(ss.str().size(), 9u); - EXPECT_EQUAL(strcmp(os.c_str(), "10 10 a b"), 0); - EXPECT_EQUAL(strcmp(ss.str().c_str(), "10 10 a b"), 0); + EXPECT_EQ(os.size(), 9u); + EXPECT_EQ(ss.str().size(), 9u); + EXPECT_EQ(strcmp(os.c_str(), "10 10 a b"), 0); + EXPECT_EQ(strcmp(ss.str().c_str(), "10 10 a b"), 0); os << ' ' << oct << 10; ss << ' ' << std::oct << 10; - EXPECT_EQUAL(os.size(), 12u); - EXPECT_EQUAL(ss.str().size(), 12u); - EXPECT_EQUAL(strcmp(os.c_str(), "10 10 a b 12"), 0); - EXPECT_EQUAL(strcmp(ss.str().c_str(), "10 10 a b 12"), 0); + EXPECT_EQ(os.size(), 12u); + EXPECT_EQ(ss.str().size(), 12u); + EXPECT_EQ(strcmp(os.c_str(), "10 10 a b 12"), 0); + EXPECT_EQ(strcmp(ss.str().c_str(), "10 10 a b 12"), 0); // std::bin not supported by std::streams. os << ' ' << bin << 10; - EXPECT_EQUAL(os.size(), 19u); - EXPECT_EQUAL(strcmp(os.c_str(), "10 10 a b 12 0b1010"), 0); + EXPECT_EQ(os.size(), 19u); + EXPECT_EQ(strcmp(os.c_str(), "10 10 a b 12 0b1010"), 0); void *fooptr = reinterpret_cast<void*>(0x1badbadc0ffeeull); // Also test that number base is restored OK after ptr print os << dec << ' ' << fooptr << ' ' << 1234; ss << std::dec << ' ' << fooptr << ' ' << 1234; - EXPECT_EQUAL(std::string("10 10 a b 12 0b1010 0x1badbadc0ffee 1234"), os.str()); - EXPECT_EQUAL(std::string("10 10 a b 12 0x1badbadc0ffee 1234"), ss.str()); + EXPECT_EQ(std::string("10 10 a b 12 0b1010 0x1badbadc0ffee 1234"), os.str()); + EXPECT_EQ(std::string("10 10 a b 12 0x1badbadc0ffee 1234"), ss.str()); int i = 0; const char *digits = "12345"; std::string ffs(digits, 4); std::istringstream std_istr(ffs); std_istr >> i; - EXPECT_EQUAL(1234, i); + EXPECT_EQ(1234, i); stringref firstfour(digits, 4); asciistream istr(firstfour); istr >> i; - EXPECT_EQUAL(1234, i); + EXPECT_EQ(1234, i); } -void -AsciistreamTest::testFill() +TEST(AsciistreamTest, test_fill) { { asciistream os; std::ostringstream ss; os << 10 << ' ' << setfill('h') << 11; ss << 10 << ' ' << std::setfill('h') << 11; - EXPECT_EQUAL(os.size(), 5u); - EXPECT_EQUAL(ss.str().size(), 5u); - EXPECT_EQUAL(strcmp(os.c_str(), "10 11"), 0); - EXPECT_EQUAL(strcmp(ss.str().c_str(), "10 11"), 0); + EXPECT_EQ(os.size(), 5u); + EXPECT_EQ(ss.str().size(), 5u); + EXPECT_EQ(strcmp(os.c_str(), "10 11"), 0); + EXPECT_EQ(strcmp(ss.str().c_str(), "10 11"), 0); os << setw(4) << 10 << ' ' << 11; ss << std::setw(4) << 10 << ' ' << 11; - EXPECT_EQUAL(os.size(), 12u); - EXPECT_EQUAL(ss.str().size(), 12u); - EXPECT_EQUAL(strcmp(os.c_str(), "10 11hh10 11"), 0); - EXPECT_EQUAL(strcmp(ss.str().c_str(), "10 11hh10 11"), 0); + EXPECT_EQ(os.size(), 12u); + EXPECT_EQ(ss.str().size(), 12u); + EXPECT_EQ(strcmp(os.c_str(), "10 11hh10 11"), 0); + EXPECT_EQ(strcmp(ss.str().c_str(), "10 11hh10 11"), 0); os << setw(4) << 10 << ' ' << 11; ss << std::setw(4) << 10 << ' ' << 11; - EXPECT_EQUAL(os.size(), 19u); - EXPECT_EQUAL(ss.str().size(), 19u); - EXPECT_EQUAL(strcmp(os.c_str(), "10 11hh10 11hh10 11"), 0); - EXPECT_EQUAL(strcmp(ss.str().c_str(), "10 11hh10 11hh10 11"), 0); + EXPECT_EQ(os.size(), 19u); + EXPECT_EQ(ss.str().size(), 19u); + EXPECT_EQ(strcmp(os.c_str(), "10 11hh10 11hh10 11"), 0); + EXPECT_EQ(strcmp(ss.str().c_str(), "10 11hh10 11hh10 11"), 0); } { asciistream os; std::ostringstream ss; os << setfill('X') << setw(19) << 'a'; ss << std::setfill('X') << std::setw(19) << 'a'; - EXPECT_EQUAL(os.size(), 19u); - EXPECT_EQUAL(ss.str().size(), 19u); - EXPECT_EQUAL(strcmp(os.c_str(), "XXXXXXXXXXXXXXXXXXa"), 0); - EXPECT_EQUAL(strcmp(ss.str().c_str(), "XXXXXXXXXXXXXXXXXXa"), 0); + EXPECT_EQ(os.size(), 19u); + EXPECT_EQ(ss.str().size(), 19u); + EXPECT_EQ(strcmp(os.c_str(), "XXXXXXXXXXXXXXXXXXa"), 0); + EXPECT_EQ(strcmp(ss.str().c_str(), "XXXXXXXXXXXXXXXXXXa"), 0); } { asciistream os; std::ostringstream ss; os << setfill('X') << setw(19) << "a"; ss << std::setfill('X') << std::setw(19) << "a"; - EXPECT_EQUAL(os.size(), 19u); - EXPECT_EQUAL(ss.str().size(), 19u); - EXPECT_EQUAL(strcmp(os.c_str(), "XXXXXXXXXXXXXXXXXXa"), 0); - EXPECT_EQUAL(strcmp(ss.str().c_str(), "XXXXXXXXXXXXXXXXXXa"), 0); + EXPECT_EQ(os.size(), 19u); + EXPECT_EQ(ss.str().size(), 19u); + EXPECT_EQ(strcmp(os.c_str(), "XXXXXXXXXXXXXXXXXXa"), 0); + EXPECT_EQ(strcmp(ss.str().c_str(), "XXXXXXXXXXXXXXXXXXa"), 0); } { float f(8.9); @@ -307,10 +287,10 @@ AsciistreamTest::testFill() std::ostringstream ss; os << setfill('X') << setw(19) << f; ss << std::setfill('X') << std::setw(19) << f; - EXPECT_EQUAL(os.size(), 19u); - EXPECT_EQUAL(ss.str().size(), 19u); - EXPECT_EQUAL(strcmp(os.c_str(), "XXXXXXXXXXXXXXXX8.9"), 0); - EXPECT_EQUAL(strcmp(ss.str().c_str(), "XXXXXXXXXXXXXXXX8.9"), 0); + EXPECT_EQ(os.size(), 19u); + EXPECT_EQ(ss.str().size(), 19u); + EXPECT_EQ(strcmp(os.c_str(), "XXXXXXXXXXXXXXXX8.9"), 0); + EXPECT_EQ(strcmp(ss.str().c_str(), "XXXXXXXXXXXXXXXX8.9"), 0); } { double f(8.9); @@ -318,16 +298,15 @@ AsciistreamTest::testFill() std::ostringstream ss; os << setfill('X') << setw(19) << f; ss << std::setfill('X') << std::setw(19) << f; - EXPECT_EQUAL(os.size(), 19u); - EXPECT_EQUAL(ss.str().size(), 19u); - EXPECT_EQUAL(strcmp(os.c_str(), "XXXXXXXXXXXXXXXX8.9"), 0); - EXPECT_EQUAL(strcmp(ss.str().c_str(), "XXXXXXXXXXXXXXXX8.9"), 0); + EXPECT_EQ(os.size(), 19u); + EXPECT_EQ(ss.str().size(), 19u); + EXPECT_EQ(strcmp(os.c_str(), "XXXXXXXXXXXXXXXX8.9"), 0); + EXPECT_EQ(strcmp(ss.str().c_str(), "XXXXXXXXXXXXXXXX8.9"), 0); } } -void -AsciistreamTest::testString() +TEST(AsciistreamTest, test_string) { std::string ss("a"); @@ -335,56 +314,55 @@ AsciistreamTest::testString() { std::ostringstream oss; oss << ss << vs; - EXPECT_EQUAL("aa", oss.str()); + EXPECT_EQ("aa", oss.str()); } { asciistream oss; oss << ss << vs; - EXPECT_EQUAL("aa", oss.str()); + EXPECT_EQ("aa", oss.str()); } { std::istringstream iss("b c"); iss >> ss >> vs; - EXPECT_EQUAL("b", ss); - EXPECT_EQUAL("c", vs); + EXPECT_EQ("b", ss); + EXPECT_EQ("c", vs); } { std::istringstream iss("b c"); iss >> vs >> ss; - EXPECT_EQUAL("b", vs); - EXPECT_EQUAL("c", ss); + EXPECT_EQ("b", vs); + EXPECT_EQ("c", ss); } { asciistream iss("b c"); iss >> ss >> vs; - EXPECT_EQUAL("b", ss); - EXPECT_EQUAL("c", vs); + EXPECT_EQ("b", ss); + EXPECT_EQ("c", vs); } { asciistream iss("b c"); iss >> vs >> ss; - EXPECT_EQUAL("b", vs); - EXPECT_EQUAL("c", ss); + EXPECT_EQ("b", vs); + EXPECT_EQ("c", ss); } } -void -AsciistreamTest::testCreateFromFile() +TEST(AsciistreamTest, test_create_from_file) { asciistream is(asciistream::createFromFile("non-existing.txt")); EXPECT_TRUE(is.eof()); is = asciistream::createFromFile(TEST_PATH("test.txt")); EXPECT_FALSE(is.eof()); - EXPECT_EQUAL(12u, is.size()); + EXPECT_EQ(12u, is.size()); string s; is >> s; - EXPECT_EQUAL("line1", s); + EXPECT_EQ("line1", s); is >> s; - EXPECT_EQUAL("line2", s); + EXPECT_EQ("line2", s); EXPECT_FALSE(is.eof()); is >> s; - EXPECT_EQUAL("", s); + EXPECT_EQ("", s); EXPECT_TRUE(is.eof()); #ifdef __linux__ @@ -393,30 +371,28 @@ AsciistreamTest::testCreateFromFile() #endif } -void -AsciistreamTest::testWriteThenRead() +TEST(AsciistreamTest, test_write_then_read) { asciistream ios; ios << "3 words"; int n(0); string v; ios >> n >> v; - EXPECT_EQUAL(3, n); - EXPECT_EQUAL("words", v); + EXPECT_EQ(3, n); + EXPECT_EQ("words", v); EXPECT_TRUE(ios.eof()); } -void -AsciistreamTest::testGetLine() +TEST(AsciistreamTest, test_get_line) { asciistream is = asciistream("line 1\nline 2\nline 3"); string s; getline(is, s); - EXPECT_EQUAL("line 1", s); + EXPECT_EQ("line 1", s); getline(is, s); - EXPECT_EQUAL("line 2", s); + EXPECT_EQ("line 2", s); getline(is, s); - EXPECT_EQUAL("line 3", s); + EXPECT_EQ("line 3", s); } #define VERIFY_DOUBLE_SERIALIZATION(value, expected, format, precision) { \ @@ -424,11 +400,11 @@ AsciistreamTest::testGetLine() mystream << format; \ if (precision > 0) mystream << asciistream::Precision(precision); \ mystream << value; \ - EXPECT_EQUAL(expected, mystream.str()); \ + EXPECT_EQ(expected, mystream.str()); \ } -void -AsciistreamTest::testDouble() { +TEST(AsciistreamTest, test_double) +{ VERIFY_DOUBLE_SERIALIZATION(0.0, "0.000000", fixed, -1); VERIFY_DOUBLE_SERIALIZATION(0.0, "0.000000e+00", scientific, -1); VERIFY_DOUBLE_SERIALIZATION(0.0, "0", automatic, -1); @@ -502,119 +478,101 @@ AsciistreamTest::testDouble() { as << "1.0e-325"; dv = 42.0; as >> dv; - EXPECT_EQUAL(dv, 0.0); + EXPECT_EQ(dv, 0.0); as.clear(); as << "1.0e666"; dv = 42.0; - EXPECT_EXCEPTION(as >> dv, IllegalArgumentException, "double value '1.0e666' is outside of range."); - EXPECT_EQUAL(dv, 42.0); + EXPECT_THROW(as >> dv, IllegalArgumentException); + EXPECT_EQ(dv, 42.0); } -void -AsciistreamTest::testFloat() { +TEST(AsciistreamTest, test_float) +{ float f = 0; asciistream as("-5.490412E-39"); as >> f; - EXPECT_EQUAL(f, -5.490412E-39f); + EXPECT_EQ(f, -5.490412E-39f); as.clear(); as << "0.0001E-50"; f = 42.0; as >> f; - EXPECT_EQUAL(f, 0.0); + EXPECT_EQ(f, 0.0); as.clear(); as << "123.4E50"; f = 42.0; - EXPECT_EXCEPTION(as >> f, IllegalArgumentException, "float value '123.4E50' is outside of range."); - EXPECT_EQUAL(f, 42.0); + EXPECT_THROW(as >> f, IllegalArgumentException); + EXPECT_EQ(f, 42.0); errno = 0; char *ep; f = locale::c::strtof_au("-5.490412E-39", &ep); - EXPECT_EQUAL(f, -5.490412E-39f); - EXPECT_EQUAL(errno, 0); - EXPECT_EQUAL(*ep, 0); + EXPECT_EQ(f, -5.490412E-39f); + EXPECT_EQ(errno, 0); + EXPECT_EQ(*ep, 0); f = locale::c::strtof_au("0.0001E-50", &ep); - EXPECT_EQUAL(f, 0.0); - EXPECT_EQUAL(errno, 0); - EXPECT_EQUAL(*ep, 0); + EXPECT_EQ(f, 0.0); + EXPECT_EQ(errno, 0); + EXPECT_EQ(*ep, 0); f = locale::c::strtof_au("123.4E50", &ep); - EXPECT_EQUAL(f, HUGE_VALF); - EXPECT_EQUAL(errno, ERANGE); - EXPECT_EQUAL(*ep, 0); + EXPECT_EQ(f, HUGE_VALF); + EXPECT_EQ(errno, ERANGE); + EXPECT_EQ(*ep, 0); } -void -AsciistreamTest::testStateSaver() +TEST(AsciistreamTest, test_state_saver) { asciistream as; as << vespalib::hex << vespalib::setfill('0'); { asciistream::StateSaver stateSaver(as); as << vespalib::dec << vespalib::setfill('1'); - EXPECT_EQUAL(vespalib::dec, as.getBase()); - EXPECT_EQUAL('1', as.getFill()); + EXPECT_EQ(vespalib::dec, as.getBase()); + EXPECT_EQ('1', as.getFill()); } - ASSERT_EQUAL(vespalib::hex, as.getBase()); - ASSERT_EQUAL('0', as.getFill()); + ASSERT_EQ(vespalib::hex, as.getBase()); + ASSERT_EQ('0', as.getFill()); } -int -AsciistreamTest::Main() +TEST(AsciistreamTest, test_ascii_stream) { - TEST_INIT("asciistream_test"); - - TEST_DO(verify("per", "paal", "per", "per paal", ' ')); - TEST_DO(verify<float>(7.89, -1.3, "7.89", "7.89 -1.3", ' ')); - TEST_DO(verify<double>(7.89, -1.3, "7.89", "7.89 -1.3", ' ')); - TEST_DO(verify<bool>(true, false, "1", "1 0", ' ')); - TEST_DO(verify<char>(65, 66, "A", "A B", ' ')); - TEST_DO(verify<unsigned char>(65, 66, "A", "A B", ' ')); - TEST_DO(verify<signed char>(65, 66, "A", "A B", ' ')); -// TEST_DO(verify<int8_t>(65, -1, "65", "65 -1", ' ')); - TEST_DO(verify<int16_t>(0, -1, "0", "0 -1", ' ')); - TEST_DO(verify<int16_t>(789, -1, "789", "789 -1", ' ')); - TEST_DO(verify<int32_t>(789, -1, "789", "789 -1", ' ')); - TEST_DO(verify<int64_t>(789789789789789l, -1, "789789789789789", "789789789789789 -1", ' ')); -// TEST_DO(verify<uint8_t>(65, -1, "65", "65 255", ' ')); - TEST_DO(verify<uint16_t>(789, -1, "789", "789 65535", ' ')); - TEST_DO(verify<uint32_t>(789, -1, "789", "789 4294967295", ' ')); - TEST_DO(verify<uint64_t>(789789789789789l, -1, "789789789789789", "789789789789789 18446744073709551615", ' ')); - - TEST_DO(verifyBothWays<vespalib::string>("7.89", "7.89")); - TEST_DO(verifyBothWays<std::string>("7.89", "7.89")); - TEST_DO(verifyBothWays<float>(7.89, "7.89")); - TEST_DO(verifyBothWays<double>(7.89, "7.89")); - TEST_DO(verifyBothWays<bool>(true, "1")); - TEST_DO(verifyBothWays<bool>(false, "0")); - TEST_DO(verifyBothWays<char>(65, "A")); - TEST_DO(verifyBothWays<unsigned char>(65, "A")); - //TEST_DO(verifyBothWays<int8_t>(7, "7")); - //TEST_DO(verifyBothWays<uint8_t>(7, "7")); - TEST_DO(verifyBothWays<int16_t>(7, "7")); - TEST_DO(verifyBothWays<uint16_t>(7, "7")); - TEST_DO(verifyBothWays<int32_t>(7, "7")); - TEST_DO(verifyBothWays<uint32_t>(7, "7")); - TEST_DO(verifyBothWays<int64_t>(7, "7")); - TEST_DO(verifyBothWays<uint64_t>(7, "7")); - - testCopyConstruct(); - testMoveIsWellDefined(); - testIntegerManip(); - testFill(); - testString(); - testCreateFromFile(); - testWriteThenRead(); - testGetLine(); - testIllegalNumbers(); - testDouble(); - testFloat(); - testStateSaver(); - TEST_DONE(); + verify("per", "paal", "per", "per paal", ' ', "string"); + verify<float>(7.89, -1.3, "7.89", "7.89 -1.3", ' ', "float"); + verify<double>(7.89, -1.3, "7.89", "7.89 -1.3", ' ', "double"); + verify<bool>(true, false, "1", "1 0", ' ', "bool"); + verify<char>(65, 66, "A", "A B", ' ', "char"); + verify<unsigned char>(65, 66, "A", "A B", ' ', "unsigned char"); + verify<signed char>(65, 66, "A", "A B", ' ', "signed char"); +// verify<int8_t>(65, -1, "65", "65 -1", ' ', "int8_t"); + verify<int16_t>(0, -1, "0", "0 -1", ' ', "int16_t"); + verify<int16_t>(789, -1, "789", "789 -1", ' ', "int16_t again"); + verify<int32_t>(789, -1, "789", "789 -1", ' ', "int32_t"); + verify<int64_t>(789789789789789l, -1, "789789789789789", "789789789789789 -1", ' ', "int64_t"); +// verify<uint8_t>(65, -1, "65", "65 255", ' ', "uint8_t"); + verify<uint16_t>(789, -1, "789", "789 65535", ' ', "uint16_t"); + verify<uint32_t>(789, -1, "789", "789 4294967295", ' ', "uint32_t"); + verify<uint64_t>(789789789789789l, -1, "789789789789789", "789789789789789 18446744073709551615", ' ', "uint64_t"); + + verifyBothWays<vespalib::string>("7.89", "7.89", "vespalib::string"); + verifyBothWays<std::string>("7.89", "7.89", "stsd::string"); + verifyBothWays<float>(7.89, "7.89", "float"); + verifyBothWays<double>(7.89, "7.89", "double"); + verifyBothWays<bool>(true, "1", "bool"); + verifyBothWays<bool>(false, "0", "bool again"); + verifyBothWays<char>(65, "A", "char"); + verifyBothWays<unsigned char>(65, "A", "unsigned char"); + // verifyBothWays<int8_t>(7, "7", "int8_t"); + // verifyBothWays<uint8_t>(7, "7", "uint8_t"); + verifyBothWays<int16_t>(7, "7", "int16_t"); + verifyBothWays<uint16_t>(7, "7", "uint16_t"); + verifyBothWays<int32_t>(7, "7", "int32_t"); + verifyBothWays<uint32_t>(7, "7", "uint32_t"); + verifyBothWays<int64_t>(7, "7", "int64_t"); + verifyBothWays<uint64_t>(7, "7", "uint64_t"); } -TEST_APPHOOK(AsciistreamTest) +GTEST_MAIN_RUN_ALL_TESTS() diff --git a/vespalib/src/tests/xmlserializable/CMakeLists.txt b/vespalib/src/tests/xmlserializable/CMakeLists.txt index 740f1f49bfb..4bd28a668a0 100644 --- a/vespalib/src/tests/xmlserializable/CMakeLists.txt +++ b/vespalib/src/tests/xmlserializable/CMakeLists.txt @@ -4,5 +4,6 @@ vespa_add_executable(vespalib_xmlserializable_test_app TEST xmlserializabletest.cpp DEPENDS vespalib + GTest::gtest ) vespa_add_test(NAME vespalib_xmlserializable_test_app COMMAND vespalib_xmlserializable_test_app) diff --git a/vespalib/src/tests/xmlserializable/xmlserializabletest.cpp b/vespalib/src/tests/xmlserializable/xmlserializabletest.cpp index c4d3fb9f1b9..3a6b933491a 100644 --- a/vespalib/src/tests/xmlserializable/xmlserializabletest.cpp +++ b/vespalib/src/tests/xmlserializable/xmlserializabletest.cpp @@ -1,35 +1,11 @@ // Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -#include <vespa/vespalib/testkit/testapp.h> +#include <vespa/vespalib/gtest/gtest.h> #include <vespa/vespalib/util/xmlstream.h> namespace vespalib { -class Test : public vespalib::TestApp -{ -public: - void testNormalUsage(); - void testEscaping(); - void testNesting(); - void testIndent(); - - int Main() override; -}; - -int -Test::Main() -{ - TEST_INIT("xmlserializables_test"); - srandom(1); - testNormalUsage(); - testEscaping(); - testNesting(); - testIndent(); - TEST_DONE(); -} - -void -Test::testNormalUsage() +TEST(XmlSerializableTest, test_normal_usage) { std::ostringstream ost; XmlOutputStream xos(ost); @@ -47,11 +23,10 @@ Test::testNormalUsage() "<door windowstate=\"up\"/>\n" "<description>This is a car description used to test</description>\n" "</car>"; - EXPECT_EQUAL(expected, ost.str()); + EXPECT_EQ(expected, ost.str()); } -void -Test::testEscaping() +TEST(XmlSerializableTest, test_escaping) { std::ostringstream ost; XmlOutputStream xos(ost); @@ -83,7 +58,7 @@ Test::testEscaping() "<auto1><>&	 \nfoo</auto1>\n" "<auto2 binaryencoding=\"base64\">PD4mCQANCmZvbw==</auto2>\n" "</__trash_->"; - EXPECT_EQUAL(expected, ost.str()); + EXPECT_EQ(expected, ost.str()); } namespace { @@ -103,8 +78,7 @@ namespace { }; } -void -Test::testNesting() +TEST(XmlSerializableTest, test_nesting) { std::ostringstream ost; XmlOutputStream xos(ost); @@ -127,11 +101,10 @@ Test::testNesting() "</door>\n" "<description>This is a car description used to test</description>\n" "</car>"; - EXPECT_EQUAL(expected, ost.str()); + EXPECT_EQ(expected, ost.str()); } -void -Test::testIndent() +TEST(XmlSerializableTest, test_indent) { std::ostringstream ost; XmlOutputStream xos(ost, " "); @@ -155,9 +128,9 @@ Test::testIndent() " <base binaryencoding=\"base64\">Zm9vYmFy</base>\n" " </nytag>\n" "</foo>"; - EXPECT_EQUAL(expected, ost.str()); + EXPECT_EQ(expected, ost.str()); } } // vespalib -TEST_APPHOOK(vespalib::Test) +GTEST_MAIN_RUN_ALL_TESTS() |