From 15ede521c756eb5c5b74f986d4baadadf08f3c1a Mon Sep 17 00:00:00 2001 From: Dhrupad Bhardwaj Date: Sat, 31 Mar 2018 17:23:09 -0400 Subject: [PATCH 01/11] Stub local API server test --- test/Makefile | 3 + test/api_server_unittest.cc | 10 ++ test/store_unittest.cc | 225 ------------------------------------ 3 files changed, 13 insertions(+), 225 deletions(-) create mode 100644 test/api_server_unittest.cc delete mode 100644 test/store_unittest.cc diff --git a/test/Makefile b/test/Makefile index e46b57ab..63a58691 100644 --- a/test/Makefile +++ b/test/Makefile @@ -47,6 +47,7 @@ TEST_DIR=. TEST_SOURCES=$(wildcard $(TEST_DIR)/*_unittest.cc) TEST_OBJS=$(TEST_SOURCES:$(TEST_DIR)/%.cc=%.o) TESTS=\ + api_server_unittest \ base64_unittest \ configuration_unittest \ environment_unittest \ @@ -108,6 +109,8 @@ $(TESTS): $(GTEST_LIB) $(CPP_NETLIB_LIBS) $(YAML_CPP_LIBS) # All unittest objects depend on GTEST_LIB. $(TESTS:%=%.o): $(GTEST_LIB) +api_server_unittest: api_server_unittest.o $(SRC_DIR)/api_server.o $(SRC_DIR)/configuration.o $(SRC_DIR)/store.o $(SRC_DIR)/logging.o + $(CXX) $(LDFLAGS) $^ $(LDLIBS) -o $@ base64_unittest: base64_unittest.o $(SRC_DIR)/base64.o $(CXX) $(LDFLAGS) $^ $(LDLIBS) -o $@ configuration_unittest: configuration_unittest.o $(SRC_DIR)/configuration.o diff --git a/test/api_server_unittest.cc b/test/api_server_unittest.cc new file mode 100644 index 00000000..4542e3c7 --- /dev/null +++ b/test/api_server_unittest.cc @@ -0,0 +1,10 @@ +#include "../src/api_server.h" +#include "gtest/gtest.h" + +namespace { + +TEST(ApiServerTest, BaseTest) { + EXPECT_EQ("", ""); +} + +} // namespace diff --git a/test/store_unittest.cc b/test/store_unittest.cc deleted file mode 100644 index c6917e2a..00000000 --- a/test/store_unittest.cc +++ /dev/null @@ -1,225 +0,0 @@ -#include "../src/configuration.h" -#include "../src/resource.h" -#include "../src/store.h" -#include "../src/time.h" -#include "gtest/gtest.h" - -namespace google { - -class MetadataStoreTest : public ::testing::Test { - protected: - MetadataStoreTest() : config(), store(config) {} - - void PurgeDeletedEntries() { - store.PurgeDeletedEntries(); - } - - Configuration config; - MetadataStore store; -}; - -TEST_F(MetadataStoreTest, ResourceWithOneIdCorrectlyStored) { - MonitoredResource resource("type", {}); - store.UpdateResource({"id"}, resource); - EXPECT_EQ(resource, store.LookupResource("id")); -} - -TEST_F(MetadataStoreTest, EmptyStoreLookupThrowsError) { - EXPECT_THROW(store.LookupResource("missing_id"), std::out_of_range); -} - -TEST_F(MetadataStoreTest, ResourceLookupFailuresAreIndependent) { - MonitoredResource resource("type", {}); - store.UpdateResource({"id"}, resource); - EXPECT_THROW(store.LookupResource("missing_id"), std::out_of_range); - EXPECT_EQ(resource, store.LookupResource("id")); -} - -TEST_F(MetadataStoreTest, MultipleResourcesWithSingleIdsCorrectlyStored) { - MonitoredResource resource1("type1", {}); - MonitoredResource resource2("type2", {}); - store.UpdateResource({"id1"}, resource1); - store.UpdateResource({"id2"}, resource2); - EXPECT_EQ(resource2, store.LookupResource("id2")); - EXPECT_EQ(resource1, store.LookupResource("id1")); -} - -TEST_F(MetadataStoreTest, SingleResourceWithMultipleIdsCorrectlyStored) { - MonitoredResource resource("type", {}); - store.UpdateResource({"id1", "id2", "id3"}, resource); - EXPECT_EQ(resource, store.LookupResource("id3")); - EXPECT_EQ(resource, store.LookupResource("id1")); - EXPECT_EQ(resource, store.LookupResource("id2")); -} - -TEST_F(MetadataStoreTest, MultipleResourcesAndIdsCorrectlyStored) { - MonitoredResource resource1("type1", {}); - MonitoredResource resource2("type2", {}); - store.UpdateResource({"id1", "id2", "id3"}, resource1); - store.UpdateResource({"id-a", "id-b", "id-c"}, resource2); - EXPECT_EQ(resource1, store.LookupResource("id1")); - EXPECT_EQ(resource1, store.LookupResource("id2")); - EXPECT_EQ(resource1, store.LookupResource("id3")); - EXPECT_EQ(resource2, store.LookupResource("id-a")); - EXPECT_EQ(resource2, store.LookupResource("id-b")); - EXPECT_EQ(resource2, store.LookupResource("id-c")); -} - -TEST_F(MetadataStoreTest, ResourceToIdsAssociationCorrectlyUpdated) { - MonitoredResource resource("type", {}); - store.UpdateResource({"id1", "id2"}, resource); - EXPECT_EQ(resource, store.LookupResource("id1")); - EXPECT_EQ(resource, store.LookupResource("id2")); - store.UpdateResource({"id-a", "id-b"}, resource); - EXPECT_EQ(resource, store.LookupResource("id1")); - EXPECT_EQ(resource, store.LookupResource("id2")); - EXPECT_EQ(resource, store.LookupResource("id-a")); - EXPECT_EQ(resource, store.LookupResource("id-b")); -} - -TEST_F(MetadataStoreTest, DefaultMetadataMapIsEmpty) { - const auto metadata_map = store.GetMetadataMap(); - EXPECT_TRUE(metadata_map.empty()); -} - -TEST_F(MetadataStoreTest, UpdateResourceDoesNotUpdateMetadata) { - MonitoredResource resource("type", {}); - store.UpdateResource({"id1"}, resource); - const auto metadata_map = store.GetMetadataMap(); - EXPECT_TRUE(metadata_map.empty()); -} - -TEST_F(MetadataStoreTest, UpdateMetadataChangesMetadataMap) { - MonitoredResource resource("type", {}); - MetadataStore::Metadata m( - "default-version", - false, - std::chrono::system_clock::now(), - std::chrono::system_clock::now(), - json::object({{"f", json::string("hello")}})); - store.UpdateMetadata(resource, std::move(m)); - const auto metadata_map = store.GetMetadataMap(); - EXPECT_EQ(1, metadata_map.size()); - EXPECT_EQ("default-version", metadata_map.at(resource).version); -} - -TEST_F(MetadataStoreTest, MultipleUpdateMetadataChangesMetadataMap) { - MonitoredResource resource1("type1", {}); - MonitoredResource resource2("type2", {}); - MetadataStore::Metadata m1( - "default-version1", - false, - std::chrono::system_clock::now(), - std::chrono::system_clock::now(), - json::object({{"f", json::string("hello")}})); - MetadataStore::Metadata m2( - "default-version2", - false, - std::chrono::system_clock::now(), - std::chrono::system_clock::now(), - json::object({{"f", json::string("hello")}})); - store.UpdateMetadata(resource1, std::move(m1)); - store.UpdateMetadata(resource2, std::move(m2)); - const auto metadata_map = store.GetMetadataMap(); - EXPECT_EQ(2, metadata_map.size()); - EXPECT_EQ("default-version1", metadata_map.at(resource1).version); - EXPECT_EQ("default-version2", metadata_map.at(resource2).version); -} - -TEST_F(MetadataStoreTest, UpdateMetadataForResourceChangesMetadataEntry) { - MonitoredResource resource("type", {}); - MetadataStore::Metadata m1( - "default-version1", - false, - std::chrono::system_clock::now(), - std::chrono::system_clock::now(), - json::object({{"f", json::string("hello")}})); - store.UpdateMetadata(resource, std::move(m1)); - const auto metadata_map_before = store.GetMetadataMap(); - EXPECT_EQ(1, metadata_map_before.size()); - EXPECT_EQ("default-version1", metadata_map_before.at(resource).version); - MetadataStore::Metadata m2( - "default-version2", - false, - std::chrono::system_clock::now(), - std::chrono::system_clock::now(), - json::object({{"f", json::string("hello")}})); - store.UpdateMetadata(resource, std::move(m2)); - const auto metadata_map_after = store.GetMetadataMap(); - EXPECT_EQ(1, metadata_map_after.size()); - EXPECT_EQ("default-version2", metadata_map_after.at(resource).version); -} - -TEST_F(MetadataStoreTest, PurgeDeletedEntriesDeletesCorrectMetadata) { - MonitoredResource resource1("type1", {}); - MonitoredResource resource2("type2", {}); - MetadataStore::Metadata m1( - "default-version1", - false, - std::chrono::system_clock::now(), - std::chrono::system_clock::now(), - json::object({{"f", json::string("hello")}})); - MetadataStore::Metadata m2( - "default-version2", - true, - std::chrono::system_clock::now(), - std::chrono::system_clock::now(), - json::object({{"f", json::string("hello")}})); - store.UpdateMetadata(resource1, std::move(m1)); - store.UpdateMetadata(resource2, std::move(m2)); - const auto metadata_map_before = store.GetMetadataMap(); - EXPECT_EQ(2, metadata_map_before.size()); - EXPECT_EQ("default-version1", metadata_map_before.at(resource1).version); - EXPECT_EQ("default-version2", metadata_map_before.at(resource2).version); - PurgeDeletedEntries(); - const auto metadata_map_after = store.GetMetadataMap(); - EXPECT_EQ(1, metadata_map_after.size()); - EXPECT_EQ("default-version1", metadata_map_after.at(resource1).version); - EXPECT_THROW(metadata_map_after.at(resource2), std::out_of_range); -} - -TEST(MetadataTest, MetadataCorrectlyConstructed) { - MetadataStore::Metadata m( - "default-version", - false, - time::rfc3339::FromString("2018-03-03T01:23:45.678901234Z"), - time::rfc3339::FromString("2018-03-03T01:32:45.678901234Z"), - json::object({{"f", json::string("hello")}})); - EXPECT_FALSE(m.ignore); - EXPECT_EQ("default-version", m.version); - EXPECT_FALSE(m.is_deleted); - EXPECT_EQ(time::rfc3339::FromString("2018-03-03T01:23:45.678901234Z"), - m.created_at); - EXPECT_EQ(time::rfc3339::FromString("2018-03-03T01:32:45.678901234Z"), - m.collected_at); - EXPECT_EQ("{\"f\":\"hello\"}", m.metadata->ToString()); -} - -TEST(MetadataTest, MetadataCorrectlyCloned) { - MetadataStore::Metadata m( - "default-version", - false, - time::rfc3339::FromString("2018-03-03T01:23:45.678901234Z"), - time::rfc3339::FromString("2018-03-03T01:32:45.678901234Z"), - json::object({{"f", json::string("hello")}})); - MetadataStore::Metadata m_clone = m.Clone(); - EXPECT_FALSE(m_clone.ignore); - EXPECT_EQ(m.version, m_clone.version); - EXPECT_FALSE(m_clone.is_deleted); - EXPECT_EQ(m.created_at, m_clone.created_at); - EXPECT_EQ(m.collected_at, m_clone.collected_at); - EXPECT_EQ(m.metadata->ToString(), m_clone.metadata->ToString()); -} - -TEST(MetadataTest, IgnoredMetadataCorrectlyCreated) { - MetadataStore::Metadata m = MetadataStore::Metadata::IGNORED(); - EXPECT_TRUE(m.ignore); -} - -TEST(MetadataTest, IgnoredMetadataCorrectlyCloned) { - MetadataStore::Metadata m = MetadataStore::Metadata::IGNORED(); - MetadataStore::Metadata m_clone = m.Clone(); - EXPECT_EQ(m.ignore, m_clone.ignore); -} - -} // namespace From f996db9ed75cd08236860d90d38e3ff93c7aec41 Mon Sep 17 00:00:00 2001 From: Igor Peshansky Date: Sat, 31 Mar 2018 19:04:59 -0400 Subject: [PATCH 02/11] Restore deleted store_unittest.cc. --- test/store_unittest.cc | 229 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 229 insertions(+) create mode 100644 test/store_unittest.cc diff --git a/test/store_unittest.cc b/test/store_unittest.cc new file mode 100644 index 00000000..7f5cd846 --- /dev/null +++ b/test/store_unittest.cc @@ -0,0 +1,229 @@ +#include "../src/configuration.h" +#include "../src/resource.h" +#include "../src/store.h" +#include "../src/time.h" +#include "gtest/gtest.h" + +namespace google { + +class MetadataStoreTest : public ::testing::Test { + protected: + MetadataStoreTest() : config(), store(config) {} + + std::map GetMetadataMap() const { + return store.GetMetadataMap(); + } + + void PurgeDeletedEntries() { + store.PurgeDeletedEntries(); + } + + Configuration config; + MetadataStore store; +}; + +TEST_F(MetadataStoreTest, ResourceWithOneIdCorrectlyStored) { + MonitoredResource resource("type", {}); + store.UpdateResource({"id"}, resource); + EXPECT_EQ(resource, store.LookupResource("id")); +} + +TEST_F(MetadataStoreTest, EmptyStoreLookupThrowsError) { + EXPECT_THROW(store.LookupResource("missing_id"), std::out_of_range); +} + +TEST_F(MetadataStoreTest, ResourceLookupFailuresAreIndependent) { + MonitoredResource resource("type", {}); + store.UpdateResource({"id"}, resource); + EXPECT_THROW(store.LookupResource("missing_id"), std::out_of_range); + EXPECT_EQ(resource, store.LookupResource("id")); +} + +TEST_F(MetadataStoreTest, MultipleResourcesWithSingleIdsCorrectlyStored) { + MonitoredResource resource1("type1", {}); + MonitoredResource resource2("type2", {}); + store.UpdateResource({"id1"}, resource1); + store.UpdateResource({"id2"}, resource2); + EXPECT_EQ(resource2, store.LookupResource("id2")); + EXPECT_EQ(resource1, store.LookupResource("id1")); +} + +TEST_F(MetadataStoreTest, SingleResourceWithMultipleIdsCorrectlyStored) { + MonitoredResource resource("type", {}); + store.UpdateResource({"id1", "id2", "id3"}, resource); + EXPECT_EQ(resource, store.LookupResource("id3")); + EXPECT_EQ(resource, store.LookupResource("id1")); + EXPECT_EQ(resource, store.LookupResource("id2")); +} + +TEST_F(MetadataStoreTest, MultipleResourcesAndIdsCorrectlyStored) { + MonitoredResource resource1("type1", {}); + MonitoredResource resource2("type2", {}); + store.UpdateResource({"id1", "id2", "id3"}, resource1); + store.UpdateResource({"id-a", "id-b", "id-c"}, resource2); + EXPECT_EQ(resource1, store.LookupResource("id1")); + EXPECT_EQ(resource1, store.LookupResource("id2")); + EXPECT_EQ(resource1, store.LookupResource("id3")); + EXPECT_EQ(resource2, store.LookupResource("id-a")); + EXPECT_EQ(resource2, store.LookupResource("id-b")); + EXPECT_EQ(resource2, store.LookupResource("id-c")); +} + +TEST_F(MetadataStoreTest, ResourceToIdsAssociationCorrectlyUpdated) { + MonitoredResource resource("type", {}); + store.UpdateResource({"id1", "id2"}, resource); + EXPECT_EQ(resource, store.LookupResource("id1")); + EXPECT_EQ(resource, store.LookupResource("id2")); + store.UpdateResource({"id-a", "id-b"}, resource); + EXPECT_EQ(resource, store.LookupResource("id1")); + EXPECT_EQ(resource, store.LookupResource("id2")); + EXPECT_EQ(resource, store.LookupResource("id-a")); + EXPECT_EQ(resource, store.LookupResource("id-b")); +} + +TEST_F(MetadataStoreTest, DefaultMetadataMapIsEmpty) { + const auto metadata_map = GetMetadataMap(); + EXPECT_TRUE(metadata_map.empty()); +} + +TEST_F(MetadataStoreTest, UpdateResourceDoesNotUpdateMetadata) { + MonitoredResource resource("type", {}); + store.UpdateResource({"id1"}, resource); + const auto metadata_map = GetMetadataMap(); + EXPECT_TRUE(metadata_map.empty()); +} + +TEST_F(MetadataStoreTest, UpdateMetadataChangesMetadataMap) { + MonitoredResource resource("type", {}); + MetadataStore::Metadata m( + "default-version", + false, + std::chrono::system_clock::now(), + std::chrono::system_clock::now(), + json::object({{"f", json::string("hello")}})); + store.UpdateMetadata(resource, std::move(m)); + const auto metadata_map = GetMetadataMap(); + EXPECT_EQ(1, metadata_map.size()); + EXPECT_EQ("default-version", metadata_map.at(resource).version); +} + +TEST_F(MetadataStoreTest, MultipleUpdateMetadataChangesMetadataMap) { + MonitoredResource resource1("type1", {}); + MonitoredResource resource2("type2", {}); + MetadataStore::Metadata m1( + "default-version1", + false, + std::chrono::system_clock::now(), + std::chrono::system_clock::now(), + json::object({{"f", json::string("hello")}})); + MetadataStore::Metadata m2( + "default-version2", + false, + std::chrono::system_clock::now(), + std::chrono::system_clock::now(), + json::object({{"f", json::string("hello")}})); + store.UpdateMetadata(resource1, std::move(m1)); + store.UpdateMetadata(resource2, std::move(m2)); + const auto metadata_map = GetMetadataMap(); + EXPECT_EQ(2, metadata_map.size()); + EXPECT_EQ("default-version1", metadata_map.at(resource1).version); + EXPECT_EQ("default-version2", metadata_map.at(resource2).version); +} + +TEST_F(MetadataStoreTest, UpdateMetadataForResourceChangesMetadataEntry) { + MonitoredResource resource("type", {}); + MetadataStore::Metadata m1( + "default-version1", + false, + std::chrono::system_clock::now(), + std::chrono::system_clock::now(), + json::object({{"f", json::string("hello")}})); + store.UpdateMetadata(resource, std::move(m1)); + const auto metadata_map_before = GetMetadataMap(); + EXPECT_EQ(1, metadata_map_before.size()); + EXPECT_EQ("default-version1", metadata_map_before.at(resource).version); + MetadataStore::Metadata m2( + "default-version2", + false, + std::chrono::system_clock::now(), + std::chrono::system_clock::now(), + json::object({{"f", json::string("hello")}})); + store.UpdateMetadata(resource, std::move(m2)); + const auto metadata_map_after = GetMetadataMap(); + EXPECT_EQ(1, metadata_map_after.size()); + EXPECT_EQ("default-version2", metadata_map_after.at(resource).version); +} + +TEST_F(MetadataStoreTest, PurgeDeletedEntriesDeletesCorrectMetadata) { + MonitoredResource resource1("type1", {}); + MonitoredResource resource2("type2", {}); + MetadataStore::Metadata m1( + "default-version1", + false, + std::chrono::system_clock::now(), + std::chrono::system_clock::now(), + json::object({{"f", json::string("hello")}})); + MetadataStore::Metadata m2( + "default-version2", + true, + std::chrono::system_clock::now(), + std::chrono::system_clock::now(), + json::object({{"f", json::string("hello")}})); + store.UpdateMetadata(resource1, std::move(m1)); + store.UpdateMetadata(resource2, std::move(m2)); + const auto metadata_map_before = GetMetadataMap(); + EXPECT_EQ(2, metadata_map_before.size()); + EXPECT_EQ("default-version1", metadata_map_before.at(resource1).version); + EXPECT_EQ("default-version2", metadata_map_before.at(resource2).version); + PurgeDeletedEntries(); + const auto metadata_map_after = GetMetadataMap(); + EXPECT_EQ(1, metadata_map_after.size()); + EXPECT_EQ("default-version1", metadata_map_after.at(resource1).version); + EXPECT_THROW(metadata_map_after.at(resource2), std::out_of_range); +} + +TEST(MetadataTest, MetadataCorrectlyConstructed) { + MetadataStore::Metadata m( + "default-version", + false, + time::rfc3339::FromString("2018-03-03T01:23:45.678901234Z"), + time::rfc3339::FromString("2018-03-03T01:32:45.678901234Z"), + json::object({{"f", json::string("hello")}})); + EXPECT_FALSE(m.ignore); + EXPECT_EQ("default-version", m.version); + EXPECT_FALSE(m.is_deleted); + EXPECT_EQ(time::rfc3339::FromString("2018-03-03T01:23:45.678901234Z"), + m.created_at); + EXPECT_EQ(time::rfc3339::FromString("2018-03-03T01:32:45.678901234Z"), + m.collected_at); + EXPECT_EQ("{\"f\":\"hello\"}", m.metadata->ToString()); +} + +TEST(MetadataTest, MetadataCorrectlyCloned) { + MetadataStore::Metadata m( + "default-version", + false, + time::rfc3339::FromString("2018-03-03T01:23:45.678901234Z"), + time::rfc3339::FromString("2018-03-03T01:32:45.678901234Z"), + json::object({{"f", json::string("hello")}})); + MetadataStore::Metadata m_clone = m.Clone(); + EXPECT_FALSE(m_clone.ignore); + EXPECT_EQ(m.version, m_clone.version); + EXPECT_FALSE(m_clone.is_deleted); + EXPECT_EQ(m.created_at, m_clone.created_at); + EXPECT_EQ(m.collected_at, m_clone.collected_at); + EXPECT_EQ(m.metadata->ToString(), m_clone.metadata->ToString()); +} + +TEST(MetadataTest, IgnoredMetadataCorrectlyCreated) { + MetadataStore::Metadata m = MetadataStore::Metadata::IGNORED(); + EXPECT_TRUE(m.ignore); +} + +TEST(MetadataTest, IgnoredMetadataCorrectlyCloned) { + MetadataStore::Metadata m = MetadataStore::Metadata::IGNORED(); + MetadataStore::Metadata m_clone = m.Clone(); + EXPECT_EQ(m.ignore, m_clone.ignore); +} + +} // namespace From 419570cf5131cef4bf4d7406a94025271287fa05 Mon Sep 17 00:00:00 2001 From: Igor Peshansky Date: Sat, 31 Mar 2018 19:05:15 -0400 Subject: [PATCH 03/11] Add appropriate includes and object dependencies. --- test/Makefile | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/test/Makefile b/test/Makefile index 63a58691..394ed5cc 100644 --- a/test/Makefile +++ b/test/Makefile @@ -24,7 +24,7 @@ YAML_CPP_LIBS=$(YAML_CPP_LIBDIR)/libyaml-cpp.a CPPFLAGS+= \ -DENABLE_KUBERNETES_METADATA \ -isystem $(GTEST_DIR)/include -I$(GMOCK_DIR)/include \ - -I$(YAML_CPP_DIR)/include + -I$(CPP_NETLIB_DIR) -I$(NETWORK_URI_DIR)/include -I$(YAML_CPP_DIR)/include CXXFLAGS=\ -std=c++11 -g -pthread -Wno-write-strings -Wno-deprecated LDFLAGS=-L$(CPP_NETLIB_LIBDIR) -L$(NETWORK_URI_LIBDIR) -L$(YAML_CPP_LIBDIR) @@ -107,9 +107,10 @@ $(GTEST_LIB): gtest-all.o gtest_main.o $(TESTS): $(GTEST_LIB) $(CPP_NETLIB_LIBS) $(YAML_CPP_LIBS) # All unittest objects depend on GTEST_LIB. -$(TESTS:%=%.o): $(GTEST_LIB) +# Some headers need CPP_NETLIB_LIBS and YAML_CPP_LIBS. +$(TESTS:%=%.o): $(GTEST_LIB) $(CPP_NETLIB_LIBS) $(YAML_CPP_LIBS) -api_server_unittest: api_server_unittest.o $(SRC_DIR)/api_server.o $(SRC_DIR)/configuration.o $(SRC_DIR)/store.o $(SRC_DIR)/logging.o +api_server_unittest: api_server_unittest.o $(SRC_DIR)/api_server.o $(SRC_DIR)/configuration.o $(SRC_DIR)/store.o $(SRC_DIR)/json.o $(SRC_DIR)/resource.o $(SRC_DIR)/logging.o $(SRC_DIR)/time.o $(CXX) $(LDFLAGS) $^ $(LDLIBS) -o $@ base64_unittest: base64_unittest.o $(SRC_DIR)/base64.o $(CXX) $(LDFLAGS) $^ $(LDLIBS) -o $@ From 8aad264a4ee5e50e5fdd50619fdf42b11bdd88ca Mon Sep 17 00:00:00 2001 From: Igor Peshansky Date: Sat, 31 Mar 2018 19:09:30 -0400 Subject: [PATCH 04/11] Fix parallel builds. --- test/Makefile | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/test/Makefile b/test/Makefile index 394ed5cc..b729dfda 100644 --- a/test/Makefile +++ b/test/Makefile @@ -63,7 +63,7 @@ TESTS=\ GTEST_LIB=gtest_lib.a -all: $(TESTS) +all: $(SRC_DIR)/build-cpp-netlib $(SRC_DIR)/build-yaml-cpp $(TESTS) # TODO: Running the test prints "Running main() from gtest_main.cc". # Figure out how to fix this. @@ -84,13 +84,17 @@ init-submodules: git submodule update --init $(GTEST_MODULE) touch init-submodules -$(CPP_NETLIB_LIBS): - cd $(SRC_DIR) && $(MAKE) $@ +$(SRC_DIR)/init-submodules: + cd $(SRC_DIR) && $(MAKE) $(@:$(SRC_DIR)/%=%) + +$(SRC_DIR)/build-cpp-netlib $(SRC_DIR)/build-yaml-cpp: $(SRC_DIR)/init-submodules + cd $(SRC_DIR) && $(MAKE) $(@:$(SRC_DIR)/%=%) + +$(CPP_NETLIB_LIBS): $(SRC_DIR)/build-cpp-netlib -$(YAML_CPP_LIBS): - cd $(SRC_DIR) && $(MAKE) $@ +$(YAML_CPP_LIBS): $(SRC_DIR)/build-yaml-cpp -$(SRC_DIR)/%.o: $(SRC_DIR)/%.cc +$(SRC_DIR)/%.o: $(SRC_DIR)/build-cpp-netlib $(SRC_DIR)/build-yaml-cpp $(SRC_DIR)/%.cc cd $(SRC_DIR) && $(MAKE) $(@:$(SRC_DIR)/%=%) $(GTEST_SOURCEDIR)/gtest-all.cc $(GTEST_SOURCEDIR)/gtest_main.cc: init-submodules From e7e081b454b76496baf3afeb59404e29af8dc670 Mon Sep 17 00:00:00 2001 From: Andrew Emil Date: Wed, 4 Apr 2018 10:56:23 -0400 Subject: [PATCH 05/11] Added unit tests for api server dispatcher operator() --- src/api_server.h | 2 + test/api_server_unittest.cc | 94 +++++++++++++++++++++++++++++++++++-- 2 files changed, 92 insertions(+), 4 deletions(-) diff --git a/src/api_server.h b/src/api_server.h index efbcad7f..dccace89 100644 --- a/src/api_server.h +++ b/src/api_server.h @@ -44,6 +44,8 @@ class MetadataApiServer { ~MetadataApiServer(); private: + friend class ApiServerTest; + class Dispatcher; using HttpServer = http::server; using Handler = std::function conn) { + server->dispatcher_(request, conn); + } + + static void BasicDispatcher() { + bool handler_called; + MetadataApiServer::Handler handler = [&handler_called]( + const MetadataApiServer::HttpServer::request& request, + std::shared_ptr conn) { + handler_called = true; + }; + MetadataApiServer::Handler badHandler = [&handler_called]( + const MetadataApiServer::HttpServer::request& request, + std::shared_ptr conn) { + handler_called = false; + }; + MetadataApiServer::Dispatcher::HandlerMap handlers({ + {{"GET", "/testPath/"}, handler}, + {{"GET", "/badPath/"}, badHandler}, + }); + MetadataApiServer::Dispatcher dispatcher(handlers, false); + MetadataApiServer::HttpServer::request request; + request.method = "GET"; + request.destination = "/testPath/"; + dispatcher(request, nullptr); + EXPECT_TRUE(handler_called); + } + + static void DispatcherMethodCheck() { + bool handler_called; + MetadataApiServer::Handler handler = [&handler_called]( + const MetadataApiServer::HttpServer::request& request, + std::shared_ptr conn) { + handler_called = true; + }; + MetadataApiServer::Dispatcher::HandlerMap handlers({ + {{"GET", "/testPath/"}, handler}, + }); + MetadataApiServer::Dispatcher dispatcher(handlers, false); + MetadataApiServer::HttpServer::request request; + request.method = "POST"; + request.destination = "/testPath/"; + dispatcher(request, nullptr); + EXPECT_FALSE(handler_called); + } + + static void DispatcherSubstringCheck() { + bool handler_called; + MetadataApiServer::Handler handler = [&handler_called]( + const MetadataApiServer::HttpServer::request& request, + std::shared_ptr conn) { + handler_called = true; + }; + MetadataApiServer::Dispatcher::HandlerMap handlers({ + {{"GET", "/testPath/"}, handler}, + }); + MetadataApiServer::Dispatcher dispatcher(handlers, false); + MetadataApiServer::HttpServer::request request; + request.method = "GET"; + request.destination = "/testPathFoo/"; + dispatcher(request, nullptr); + EXPECT_FALSE(handler_called); + request.destination = "/test/"; + dispatcher(request, nullptr); + EXPECT_FALSE(handler_called); + request.destination = "/testFooPath/"; + dispatcher(request, nullptr); + EXPECT_FALSE(handler_called); + } +}; + +TEST_F(ApiServerTest, BasicDispacher) { + BasicDispatcher(); +} + +TEST_F(ApiServerTest, DispatcherMethodCheck) { + DispatcherMethodCheck(); +} + +TEST_F(ApiServerTest, DispatcherSubstringCheck) { + DispatcherSubstringCheck(); } -} // namespace +} // namespace google From b64f73de4c726143ff4a0049fb88dee6b1dbb391 Mon Sep 17 00:00:00 2001 From: Andrew Emil Date: Wed, 4 Apr 2018 10:58:50 -0400 Subject: [PATCH 06/11] Remove unused fixture function --- test/api_server_unittest.cc | 7 ------- 1 file changed, 7 deletions(-) diff --git a/test/api_server_unittest.cc b/test/api_server_unittest.cc index 1031eac2..0c4078c5 100644 --- a/test/api_server_unittest.cc +++ b/test/api_server_unittest.cc @@ -7,13 +7,6 @@ namespace google { class ApiServerTest : public ::testing::Test { protected: - static void CallDispatcher( - MetadataApiServer* server, - const MetadataApiServer::HttpServer::request& request, - std::shared_ptr conn) { - server->dispatcher_(request, conn); - } - static void BasicDispatcher() { bool handler_called; MetadataApiServer::Handler handler = [&handler_called]( From 3919d16266db693a157fe26e750933b6466a2bd4 Mon Sep 17 00:00:00 2001 From: Andrew Emil Date: Wed, 4 Apr 2018 14:29:59 -0400 Subject: [PATCH 07/11] Fix spacing --- test/api_server_unittest.cc | 128 ++++++++++++++++++------------------ 1 file changed, 64 insertions(+), 64 deletions(-) diff --git a/test/api_server_unittest.cc b/test/api_server_unittest.cc index 0c4078c5..1c0e3ff2 100644 --- a/test/api_server_unittest.cc +++ b/test/api_server_unittest.cc @@ -6,72 +6,72 @@ namespace google { class ApiServerTest : public ::testing::Test { - protected: - static void BasicDispatcher() { - bool handler_called; - MetadataApiServer::Handler handler = [&handler_called]( - const MetadataApiServer::HttpServer::request& request, - std::shared_ptr conn) { - handler_called = true; - }; - MetadataApiServer::Handler badHandler = [&handler_called]( - const MetadataApiServer::HttpServer::request& request, - std::shared_ptr conn) { - handler_called = false; - }; - MetadataApiServer::Dispatcher::HandlerMap handlers({ - {{"GET", "/testPath/"}, handler}, - {{"GET", "/badPath/"}, badHandler}, - }); - MetadataApiServer::Dispatcher dispatcher(handlers, false); - MetadataApiServer::HttpServer::request request; - request.method = "GET"; - request.destination = "/testPath/"; - dispatcher(request, nullptr); - EXPECT_TRUE(handler_called); - } + protected: + static void BasicDispatcher() { + bool handler_called; + MetadataApiServer::Handler handler = [&handler_called]( + const MetadataApiServer::HttpServer::request& request, + std::shared_ptr conn) { + handler_called = true; + }; + MetadataApiServer::Handler badHandler = [&handler_called]( + const MetadataApiServer::HttpServer::request& request, + std::shared_ptr conn) { + handler_called = false; + }; + MetadataApiServer::Dispatcher::HandlerMap handlers({ + {{"GET", "/testPath/"}, handler}, + {{"GET", "/badPath/"}, badHandler}, + }); + MetadataApiServer::Dispatcher dispatcher(handlers, false); + MetadataApiServer::HttpServer::request request; + request.method = "GET"; + request.destination = "/testPath/"; + dispatcher(request, nullptr); + EXPECT_TRUE(handler_called); + } - static void DispatcherMethodCheck() { - bool handler_called; - MetadataApiServer::Handler handler = [&handler_called]( - const MetadataApiServer::HttpServer::request& request, - std::shared_ptr conn) { - handler_called = true; - }; - MetadataApiServer::Dispatcher::HandlerMap handlers({ - {{"GET", "/testPath/"}, handler}, - }); - MetadataApiServer::Dispatcher dispatcher(handlers, false); - MetadataApiServer::HttpServer::request request; - request.method = "POST"; - request.destination = "/testPath/"; - dispatcher(request, nullptr); - EXPECT_FALSE(handler_called); - } + static void DispatcherMethodCheck() { + bool handler_called; + MetadataApiServer::Handler handler = [&handler_called]( + const MetadataApiServer::HttpServer::request& request, + std::shared_ptr conn) { + handler_called = true; + }; + MetadataApiServer::Dispatcher::HandlerMap handlers({ + {{"GET", "/testPath/"}, handler}, + }); + MetadataApiServer::Dispatcher dispatcher(handlers, false); + MetadataApiServer::HttpServer::request request; + request.method = "POST"; + request.destination = "/testPath/"; + dispatcher(request, nullptr); + EXPECT_FALSE(handler_called); + } - static void DispatcherSubstringCheck() { - bool handler_called; - MetadataApiServer::Handler handler = [&handler_called]( - const MetadataApiServer::HttpServer::request& request, - std::shared_ptr conn) { - handler_called = true; - }; - MetadataApiServer::Dispatcher::HandlerMap handlers({ - {{"GET", "/testPath/"}, handler}, - }); - MetadataApiServer::Dispatcher dispatcher(handlers, false); - MetadataApiServer::HttpServer::request request; - request.method = "GET"; - request.destination = "/testPathFoo/"; - dispatcher(request, nullptr); - EXPECT_FALSE(handler_called); - request.destination = "/test/"; - dispatcher(request, nullptr); - EXPECT_FALSE(handler_called); - request.destination = "/testFooPath/"; - dispatcher(request, nullptr); - EXPECT_FALSE(handler_called); - } + static void DispatcherSubstringCheck() { + bool handler_called; + MetadataApiServer::Handler handler = [&handler_called]( + const MetadataApiServer::HttpServer::request& request, + std::shared_ptr conn) { + handler_called = true; + }; + MetadataApiServer::Dispatcher::HandlerMap handlers({ + {{"GET", "/testPath/"}, handler}, + }); + MetadataApiServer::Dispatcher dispatcher(handlers, false); + MetadataApiServer::HttpServer::request request; + request.method = "GET"; + request.destination = "/testPathFoo/"; + dispatcher(request, nullptr); + EXPECT_FALSE(handler_called); + request.destination = "/test/"; + dispatcher(request, nullptr); + EXPECT_FALSE(handler_called); + request.destination = "/testFooPath/"; + dispatcher(request, nullptr); + EXPECT_FALSE(handler_called); + } }; TEST_F(ApiServerTest, BasicDispacher) { From cd1f822f88b366a8e343a342423d5c1119cbac60 Mon Sep 17 00:00:00 2001 From: Andrew Emil Date: Thu, 5 Apr 2018 14:27:35 -0400 Subject: [PATCH 08/11] Back out unneeded changes to store --- test/store_unittest.cc | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/test/store_unittest.cc b/test/store_unittest.cc index 7f5cd846..c6917e2a 100644 --- a/test/store_unittest.cc +++ b/test/store_unittest.cc @@ -10,10 +10,6 @@ class MetadataStoreTest : public ::testing::Test { protected: MetadataStoreTest() : config(), store(config) {} - std::map GetMetadataMap() const { - return store.GetMetadataMap(); - } - void PurgeDeletedEntries() { store.PurgeDeletedEntries(); } @@ -82,14 +78,14 @@ TEST_F(MetadataStoreTest, ResourceToIdsAssociationCorrectlyUpdated) { } TEST_F(MetadataStoreTest, DefaultMetadataMapIsEmpty) { - const auto metadata_map = GetMetadataMap(); + const auto metadata_map = store.GetMetadataMap(); EXPECT_TRUE(metadata_map.empty()); } TEST_F(MetadataStoreTest, UpdateResourceDoesNotUpdateMetadata) { MonitoredResource resource("type", {}); store.UpdateResource({"id1"}, resource); - const auto metadata_map = GetMetadataMap(); + const auto metadata_map = store.GetMetadataMap(); EXPECT_TRUE(metadata_map.empty()); } @@ -102,7 +98,7 @@ TEST_F(MetadataStoreTest, UpdateMetadataChangesMetadataMap) { std::chrono::system_clock::now(), json::object({{"f", json::string("hello")}})); store.UpdateMetadata(resource, std::move(m)); - const auto metadata_map = GetMetadataMap(); + const auto metadata_map = store.GetMetadataMap(); EXPECT_EQ(1, metadata_map.size()); EXPECT_EQ("default-version", metadata_map.at(resource).version); } @@ -124,7 +120,7 @@ TEST_F(MetadataStoreTest, MultipleUpdateMetadataChangesMetadataMap) { json::object({{"f", json::string("hello")}})); store.UpdateMetadata(resource1, std::move(m1)); store.UpdateMetadata(resource2, std::move(m2)); - const auto metadata_map = GetMetadataMap(); + const auto metadata_map = store.GetMetadataMap(); EXPECT_EQ(2, metadata_map.size()); EXPECT_EQ("default-version1", metadata_map.at(resource1).version); EXPECT_EQ("default-version2", metadata_map.at(resource2).version); @@ -139,7 +135,7 @@ TEST_F(MetadataStoreTest, UpdateMetadataForResourceChangesMetadataEntry) { std::chrono::system_clock::now(), json::object({{"f", json::string("hello")}})); store.UpdateMetadata(resource, std::move(m1)); - const auto metadata_map_before = GetMetadataMap(); + const auto metadata_map_before = store.GetMetadataMap(); EXPECT_EQ(1, metadata_map_before.size()); EXPECT_EQ("default-version1", metadata_map_before.at(resource).version); MetadataStore::Metadata m2( @@ -149,7 +145,7 @@ TEST_F(MetadataStoreTest, UpdateMetadataForResourceChangesMetadataEntry) { std::chrono::system_clock::now(), json::object({{"f", json::string("hello")}})); store.UpdateMetadata(resource, std::move(m2)); - const auto metadata_map_after = GetMetadataMap(); + const auto metadata_map_after = store.GetMetadataMap(); EXPECT_EQ(1, metadata_map_after.size()); EXPECT_EQ("default-version2", metadata_map_after.at(resource).version); } @@ -171,12 +167,12 @@ TEST_F(MetadataStoreTest, PurgeDeletedEntriesDeletesCorrectMetadata) { json::object({{"f", json::string("hello")}})); store.UpdateMetadata(resource1, std::move(m1)); store.UpdateMetadata(resource2, std::move(m2)); - const auto metadata_map_before = GetMetadataMap(); + const auto metadata_map_before = store.GetMetadataMap(); EXPECT_EQ(2, metadata_map_before.size()); EXPECT_EQ("default-version1", metadata_map_before.at(resource1).version); EXPECT_EQ("default-version2", metadata_map_before.at(resource2).version); PurgeDeletedEntries(); - const auto metadata_map_after = GetMetadataMap(); + const auto metadata_map_after = store.GetMetadataMap(); EXPECT_EQ(1, metadata_map_after.size()); EXPECT_EQ("default-version1", metadata_map_after.at(resource1).version); EXPECT_THROW(metadata_map_after.at(resource2), std::out_of_range); From e804af85bb13fc8185d631837ec27e41ea42ecba Mon Sep 17 00:00:00 2001 From: Andrew Emil Date: Tue, 10 Apr 2018 11:32:58 -0400 Subject: [PATCH 09/11] Address code review comments --- src/api_server.cc | 6 +- src/api_server.h | 4 +- test/api_server_unittest.cc | 119 ++++++++++++++++-------------------- 3 files changed, 59 insertions(+), 70 deletions(-) diff --git a/src/api_server.cc b/src/api_server.cc index 3b347c68..6768b9a4 100644 --- a/src/api_server.cc +++ b/src/api_server.cc @@ -31,7 +31,7 @@ MetadataApiServer::Dispatcher::Dispatcher( void MetadataApiServer::Dispatcher::operator()( const HttpServer::request& request, - std::shared_ptr conn) { + std::shared_ptr conn) const { if (verbose_) { LOG(INFO) << "Dispatcher called: " << request.method << " " << request.destination @@ -40,7 +40,7 @@ void MetadataApiServer::Dispatcher::operator()( } // Look for the longest match first. This means going backwards through // the map, since strings are sorted in lexicographical order. - for (auto it = handlers_.crbegin(); it != handlers_.crend(); --it) { + for (auto it = handlers_.crbegin(); it != handlers_.crend(); ++it) { const std::string& method = it->first.first; const std::string& prefix = it->first.second; #ifdef VERBOSE @@ -61,7 +61,7 @@ void MetadataApiServer::Dispatcher::operator()( } } -void MetadataApiServer::Dispatcher::log(const HttpServer::string_type& info) { +void MetadataApiServer::Dispatcher::log(const HttpServer::string_type& info) const { LOG(ERROR) << info; } diff --git a/src/api_server.h b/src/api_server.h index dccace89..850eb8be 100644 --- a/src/api_server.h +++ b/src/api_server.h @@ -56,8 +56,8 @@ class MetadataApiServer { using HandlerMap = std::map, Handler>; Dispatcher(const HandlerMap& handlers, bool verbose); void operator()(const HttpServer::request& request, - std::shared_ptr conn); - void log(const HttpServer::string_type& info); + std::shared_ptr conn) const; + void log(const HttpServer::string_type& info) const; private: // A mapping from a method/prefix pair to the handler function. // Order matters: later entries override earlier ones. diff --git a/test/api_server_unittest.cc b/test/api_server_unittest.cc index 1c0e3ff2..4cc5b2ca 100644 --- a/test/api_server_unittest.cc +++ b/test/api_server_unittest.cc @@ -7,83 +7,72 @@ namespace google { class ApiServerTest : public ::testing::Test { protected: - static void BasicDispatcher() { - bool handler_called; - MetadataApiServer::Handler handler = [&handler_called]( - const MetadataApiServer::HttpServer::request& request, - std::shared_ptr conn) { - handler_called = true; - }; - MetadataApiServer::Handler badHandler = [&handler_called]( - const MetadataApiServer::HttpServer::request& request, - std::shared_ptr conn) { - handler_called = false; - }; - MetadataApiServer::Dispatcher::HandlerMap handlers({ - {{"GET", "/testPath/"}, handler}, - {{"GET", "/badPath/"}, badHandler}, - }); - MetadataApiServer::Dispatcher dispatcher(handlers, false); - MetadataApiServer::HttpServer::request request; - request.method = "GET"; - request.destination = "/testPath/"; - dispatcher(request, nullptr); - EXPECT_TRUE(handler_called); - } - - static void DispatcherMethodCheck() { - bool handler_called; - MetadataApiServer::Handler handler = [&handler_called]( - const MetadataApiServer::HttpServer::request& request, - std::shared_ptr conn) { - handler_called = true; - }; - MetadataApiServer::Dispatcher::HandlerMap handlers({ - {{"GET", "/testPath/"}, handler}, - }); - MetadataApiServer::Dispatcher dispatcher(handlers, false); - MetadataApiServer::HttpServer::request request; - request.method = "POST"; - request.destination = "/testPath/"; - dispatcher(request, nullptr); - EXPECT_FALSE(handler_called); + using Dispatcher = MetadataApiServer::Dispatcher; + std::unique_ptr CreateDispatcher( + const std::map, + std::function>& handlers) { + Dispatcher::HandlerMap handler_map; + for (const auto& element : handlers) { + std::function handler = element.second; + handler_map.emplace(element.first, [handler]( + const MetadataApiServer::HttpServer::request& request, + std::shared_ptr conn) { + handler(); + }); + } + return std::unique_ptr(new Dispatcher(handler_map, false)); } - static void DispatcherSubstringCheck() { - bool handler_called; - MetadataApiServer::Handler handler = [&handler_called]( - const MetadataApiServer::HttpServer::request& request, - std::shared_ptr conn) { - handler_called = true; - }; - MetadataApiServer::Dispatcher::HandlerMap handlers({ - {{"GET", "/testPath/"}, handler}, - }); - MetadataApiServer::Dispatcher dispatcher(handlers, false); + void InvokeDispatcher( + const std:: unique_ptr& dispatcher, + const std::string& method, const std::string& path) { MetadataApiServer::HttpServer::request request; - request.method = "GET"; - request.destination = "/testPathFoo/"; - dispatcher(request, nullptr); - EXPECT_FALSE(handler_called); - request.destination = "/test/"; - dispatcher(request, nullptr); - EXPECT_FALSE(handler_called); - request.destination = "/testFooPath/"; - dispatcher(request, nullptr); - EXPECT_FALSE(handler_called); + request.method = method; + request.destination = path; + (*dispatcher)(request, nullptr); } }; TEST_F(ApiServerTest, BasicDispacher) { - BasicDispatcher(); + bool handler_called = false; + std::unique_ptr dispatcher = CreateDispatcher({ + {{"GET", "/testPath/"}, [&handler_called]() { + handler_called = true; + }}, + {{"GET", "/badPath/"}, [&handler_called]() { + handler_called = false; + }}, + }); + + InvokeDispatcher(dispatcher, "GET", "/testPath/"); + EXPECT_TRUE(handler_called); } TEST_F(ApiServerTest, DispatcherMethodCheck) { - DispatcherMethodCheck(); + bool handler_called = false; + std::unique_ptr dispatcher = CreateDispatcher({ + {{"GET", "/testPath/"}, [&handler_called]() { + handler_called = true; + }}, + }); + + InvokeDispatcher(dispatcher, "POST", "/testPath/"); + EXPECT_FALSE(handler_called); } TEST_F(ApiServerTest, DispatcherSubstringCheck) { - DispatcherSubstringCheck(); -} + bool handler_called = false; + std::unique_ptr dispatcher = CreateDispatcher({ + {{"GET", "/testPath/"}, [&handler_called]() { + handler_called = true; + }}, + }); + InvokeDispatcher(dispatcher, "GET", "/testPathFoo/"); + EXPECT_FALSE(handler_called); + InvokeDispatcher(dispatcher, "GET", "/test/"); + EXPECT_FALSE(handler_called); + InvokeDispatcher(dispatcher, "GET", "/testFooPath/"); + EXPECT_FALSE(handler_called); +} } // namespace google From 40965cae87d4396440f0944883b175a1dd506181 Mon Sep 17 00:00:00 2001 From: Andrew Emil Date: Tue, 10 Apr 2018 13:19:56 -0400 Subject: [PATCH 10/11] Updated unittest based on code review --- test/api_server_unittest.cc | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/test/api_server_unittest.cc b/test/api_server_unittest.cc index 4cc5b2ca..4e6d4489 100644 --- a/test/api_server_unittest.cc +++ b/test/api_server_unittest.cc @@ -24,7 +24,7 @@ class ApiServerTest : public ::testing::Test { } void InvokeDispatcher( - const std:: unique_ptr& dispatcher, + const std::unique_ptr& dispatcher, const std::string& method, const std::string& path) { MetadataApiServer::HttpServer::request request; request.method = method; @@ -33,22 +33,24 @@ class ApiServerTest : public ::testing::Test { } }; -TEST_F(ApiServerTest, BasicDispacher) { +TEST_F(ApiServerTest, DispatcherMatchesFullPath) { bool handler_called = false; + bool bad_handler_called = false; std::unique_ptr dispatcher = CreateDispatcher({ {{"GET", "/testPath/"}, [&handler_called]() { handler_called = true; }}, - {{"GET", "/badPath/"}, [&handler_called]() { - handler_called = false; + {{"GET", "/badPath/"}, [&bad_handler_called]() { + bad_handler_called = true; }}, }); InvokeDispatcher(dispatcher, "GET", "/testPath/"); EXPECT_TRUE(handler_called); + EXPECT_FALSE(bad_handler_called); } -TEST_F(ApiServerTest, DispatcherMethodCheck) { +TEST_F(ApiServerTest, DispatcherUnmatchedMethod) { bool handler_called = false; std::unique_ptr dispatcher = CreateDispatcher({ {{"GET", "/testPath/"}, [&handler_called]() { @@ -74,5 +76,7 @@ TEST_F(ApiServerTest, DispatcherSubstringCheck) { EXPECT_FALSE(handler_called); InvokeDispatcher(dispatcher, "GET", "/testFooPath/"); EXPECT_FALSE(handler_called); + InvokeDispatcher(dispatcher, "GET", "/testPath/subPath"); + EXPECT_TRUE(handler_called); } } // namespace google From 9a040082397ce76551bbdd321ee2a79c8b4993a0 Mon Sep 17 00:00:00 2001 From: Andrew Emil Date: Tue, 10 Apr 2018 16:04:29 -0400 Subject: [PATCH 11/11] Added trailing slash to test case --- test/api_server_unittest.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/api_server_unittest.cc b/test/api_server_unittest.cc index 4e6d4489..f3e5e334 100644 --- a/test/api_server_unittest.cc +++ b/test/api_server_unittest.cc @@ -76,7 +76,7 @@ TEST_F(ApiServerTest, DispatcherSubstringCheck) { EXPECT_FALSE(handler_called); InvokeDispatcher(dispatcher, "GET", "/testFooPath/"); EXPECT_FALSE(handler_called); - InvokeDispatcher(dispatcher, "GET", "/testPath/subPath"); + InvokeDispatcher(dispatcher, "GET", "/testPath/subPath/"); EXPECT_TRUE(handler_called); } } // namespace google