From def8a69514d2c7799ebf761260eabaaa72c1ab8e Mon Sep 17 00:00:00 2001 From: Dhrupad Bhardwaj Date: Sat, 31 Mar 2018 17:23:09 -0400 Subject: [PATCH 1/7] 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 51bf89d3..5f23d4ce 100644 --- a/test/Makefile +++ b/test/Makefile @@ -40,6 +40,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 \ format_unittest \ @@ -100,6 +101,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 $@ format_unittest: format_unittest.o $(SRC_DIR)/format.o $(CXX) $(LDFLAGS) $^ $(LDLIBS) -o $@ base64_unittest: base64_unittest.o $(SRC_DIR)/base64.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 51e6e0994745b0486c5a89262e1b9ea79a263a28 Mon Sep 17 00:00:00 2001 From: Igor Peshansky Date: Sat, 31 Mar 2018 19:04:59 -0400 Subject: [PATCH 2/7] 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 22f448e32d95342b9363bc553c6aa0df1c3da0d3 Mon Sep 17 00:00:00 2001 From: Igor Peshansky Date: Sat, 31 Mar 2018 19:05:15 -0400 Subject: [PATCH 3/7] 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 5f23d4ce..585e0621 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) @@ -99,9 +99,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 $@ format_unittest: format_unittest.o $(SRC_DIR)/format.o $(CXX) $(LDFLAGS) $^ $(LDLIBS) -o $@ From 2aaceb706475c2aaba182656959f64a2b08ecc54 Mon Sep 17 00:00:00 2001 From: Igor Peshansky Date: Sat, 31 Mar 2018 19:09:30 -0400 Subject: [PATCH 4/7] Fix parallel builds. --- test/Makefile | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/test/Makefile b/test/Makefile index 585e0621..056157bf 100644 --- a/test/Makefile +++ b/test/Makefile @@ -55,7 +55,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. @@ -76,13 +76,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 b07b8999e908a139eb77a068e98e989165bf0d32 Mon Sep 17 00:00:00 2001 From: Andrew Emil Date: Tue, 3 Apr 2018 14:16:04 -0400 Subject: [PATCH 5/7] Pulled out constructor to pass in handlers --- src/api_server.cc | 27 +++++++++++++++++---------- src/api_server.h | 14 ++++++++------ 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/src/api_server.cc b/src/api_server.cc index 3b347c68..8d080c02 100644 --- a/src/api_server.cc +++ b/src/api_server.cc @@ -65,19 +65,13 @@ void MetadataApiServer::Dispatcher::log(const HttpServer::string_type& info) { LOG(ERROR) << info; } - MetadataApiServer::MetadataApiServer(const Configuration& config, const MetadataStore& store, int server_threads, - const std::string& host, int port) - : config_(config), store_(store), dispatcher_({ - {{"GET", "/monitoredResource/"}, - [=](const HttpServer::request& request, - std::shared_ptr conn) { - HandleMonitoredResource(request, conn); - }}, - }, config_.VerboseLogging()), - server_( + const std::string& host, int port, + const HandlerMap& handlers) + : config_(config), store_(store), + dispatcher_(handlers, config_.VerboseLogging()), server_( HttpServer::options(dispatcher_) .address(host) .port(std::to_string(port))), @@ -88,6 +82,19 @@ MetadataApiServer::MetadataApiServer(const Configuration& config, } } +MetadataApiServer::MetadataApiServer(const Configuration& config, + const MetadataStore& store, + int server_threads, + const std::string& host, int port) + : MetadataApiServer(config, store, server_threads, host, port, + std::map, Handler>({ + {std::pair({"GET", "/monitoredResource/"}), + [=](const HttpServer::request& request, + std::shared_ptr conn) { + HandleMonitoredResource(request, conn); + } + }})) {} + MetadataApiServer::~MetadataApiServer() { for (auto& thread : server_pool_) { thread.join(); diff --git a/src/api_server.h b/src/api_server.h index efbcad7f..d55cf0ef 100644 --- a/src/api_server.h +++ b/src/api_server.h @@ -39,19 +39,20 @@ class MetadataStore; // A server that implements the metadata agent API. class MetadataApiServer { public: - MetadataApiServer(const Configuration& config, const MetadataStore& store, - int server_threads, const std::string& host, int port); - ~MetadataApiServer(); - - private: class Dispatcher; using HttpServer = http::server; using Handler = std::function)>; + using HandlerMap = std::map, Handler>; + MetadataApiServer(const Configuration& config, const MetadataStore& store, + int server_threads, const std::string& host, int port, + const HandlerMap& handlers); + MetadataApiServer(const Configuration& config, const MetadataStore& store, + int server_threads, const std::string& host, int port); + ~MetadataApiServer(); class Dispatcher { public: - using HandlerMap = std::map, Handler>; Dispatcher(const HandlerMap& handlers, bool verbose); void operator()(const HttpServer::request& request, std::shared_ptr conn); @@ -63,6 +64,7 @@ class MetadataApiServer { bool verbose_; }; + private: // Handler functions. void HandleMonitoredResource(const HttpServer::request& request, std::shared_ptr conn); From 7010ae967fe69e031808be14d05c433cfa56c8da Mon Sep 17 00:00:00 2001 From: Andrew Emil Date: Tue, 3 Apr 2018 16:03:51 -0400 Subject: [PATCH 6/7] Support for testing dispatch operator --- src/api_server.h | 1 + test/api_server_unittest.cc | 85 +++++++++++++++++++++++++++++++++++-- 2 files changed, 82 insertions(+), 4 deletions(-) diff --git a/src/api_server.h b/src/api_server.h index d55cf0ef..2e1df551 100644 --- a/src/api_server.h +++ b/src/api_server.h @@ -65,6 +65,7 @@ class MetadataApiServer { }; private: + friend class ApiServerTest; // Handler functions. void HandleMonitoredResource(const HttpServer::request& request, std::shared_ptr conn); diff --git a/test/api_server_unittest.cc b/test/api_server_unittest.cc index 4542e3c7..a7dc0d84 100644 --- a/test/api_server_unittest.cc +++ b/test/api_server_unittest.cc @@ -1,10 +1,87 @@ #include "../src/api_server.h" +#include "../src/configuration.h" +#include "../src/store.h" #include "gtest/gtest.h" -namespace { +namespace google { -TEST(ApiServerTest, BaseTest) { - EXPECT_EQ("", ""); +class ApiServerTest : public ::testing::Test { + protected: + static void CallDispatcher( + MetadataApiServer* server, + const MetadataApiServer::HttpServer::request& request, + std::shared_ptr conn) { + server->dispatcher_(request, conn); + } +}; + +TEST_F(ApiServerTest, BasicDispacher) { + Configuration config(std::istringstream("")); + MetadataStore store(config); + 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::HandlerMap handlers({ + {{"GET", "/testPath/"}, handler}, + {{"GET", "/badPath/"}, badHandler} + }); + MetadataApiServer server(config, store, 0, "TestHost", 1234, handlers); + MetadataApiServer::HttpServer::request request; + request.method = "GET"; + request.destination = "/testPath/"; + CallDispatcher(&server, request, nullptr); + EXPECT_TRUE(handler_called); +} + +TEST_F(ApiServerTest, DispatcherMethodCheck) { + Configuration config(std::istringstream("")); + MetadataStore store(config); + bool handler_called; + MetadataApiServer::Handler handler = [&handler_called]( + const MetadataApiServer::HttpServer::request& request, + std::shared_ptr conn) { + handler_called = true; + }; + MetadataApiServer::HandlerMap handlers({{{"GET", "/testPath/"}, handler}}); + MetadataApiServer server(config, store, 0, "TestHost", 1234, handlers); + MetadataApiServer::HttpServer::request request; + request.method = "POST"; + request.destination = "/testPath/"; + CallDispatcher(&server, request, nullptr); + EXPECT_FALSE(handler_called); +} + +TEST_F(ApiServerTest, DispatcherSubstringCheck) { + Configuration config(std::istringstream("")); + MetadataStore store(config); + bool handler_called; + MetadataApiServer::Handler handler = [&handler_called]( + const MetadataApiServer::HttpServer::request& request, + std::shared_ptr conn) { + handler_called = true; + }; + MetadataApiServer::HandlerMap handlers({{{"GET", "/testPath/"}, handler}}); + MetadataApiServer server(config, store, 0, "TestHost", 1234, handlers); + MetadataApiServer::HttpServer::request request; + + request.method = "GET"; + request.destination = "/testPathFoo/"; + CallDispatcher(&server, request, nullptr); + EXPECT_FALSE(handler_called); + request.destination = "/test/"; + CallDispatcher(&server, request, nullptr); + EXPECT_FALSE(handler_called); + request.destination = "/testFooPath/"; + CallDispatcher(&server, request, nullptr); + EXPECT_FALSE(handler_called); } -} // namespace +} // namespace google From 599affda2ca3eac50a4521a5b902ba0e01eea615 Mon Sep 17 00:00:00 2001 From: Andrew Emil Date: Tue, 3 Apr 2018 17:42:21 -0400 Subject: [PATCH 7/7] Back out changes on store_unittest.cc --- 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);