From 4e5b459a45af275e8799383f65be10f859b5c06a Mon Sep 17 00:00:00 2001 From: Marcin Olko Date: Thu, 12 Mar 2026 15:35:07 +0000 Subject: [PATCH 1/4] Added missing sync unit tests Signed-off-by: Marcin Olko --- providers/flagd/tests/BUILD | 10 +++ providers/flagd/tests/sync_test.cpp | 133 ++++++++++++++++++++++++++++ 2 files changed, 143 insertions(+) create mode 100644 providers/flagd/tests/sync_test.cpp diff --git a/providers/flagd/tests/BUILD b/providers/flagd/tests/BUILD index 1227f7c..d36cb71 100644 --- a/providers/flagd/tests/BUILD +++ b/providers/flagd/tests/BUILD @@ -10,3 +10,13 @@ cc_test( "@nlohmann_json//:json", ], ) + +cc_test( + name = "sync_test", + srcs = ["sync_test.cpp"], + deps = [ + "//providers/flagd/src:sync", + "@googletest//:gtest_main", + "@nlohmann_json//:json", + ], +) diff --git a/providers/flagd/tests/sync_test.cpp b/providers/flagd/tests/sync_test.cpp new file mode 100644 index 0000000..4c3004b --- /dev/null +++ b/providers/flagd/tests/sync_test.cpp @@ -0,0 +1,133 @@ +#include "flagd/sync.h" + +#include + +#include + +namespace flagd { + +class TestableSync : public FlagSync { + public: + using FlagSync::FlagSync; + + absl::Status Init(const openfeature::EvaluationContext& /*ctx*/) override { + return absl::OkStatus(); + } + absl::Status Shutdown() override { return absl::OkStatus(); } + + void TriggerUpdate(const nlohmann::json& new_json) { + this->UpdateFlags(new_json); + } +}; + +TEST(SyncTest, ValidatorAcceptsValidJson) { + TestableSync sync; + nlohmann::json valid_json = R"({ + "flags": { + "my-flag": { + "state": "ENABLED", + "variants": { + "on": true, + "off": false + }, + "defaultVariant": "on" + } + } + })"_json; + + sync.TriggerUpdate(valid_json); + + auto flags = sync.GetFlags(); + EXPECT_TRUE(flags->contains("my-flag")); +} + +TEST(SyncTest, ValidatorRejectsInvalidJson) { + TestableSync sync; + // Missing 'flags' field + nlohmann::json invalid_json = R"({ + "something": "else" + })"_json; + + sync.TriggerUpdate(invalid_json); + + auto flags = sync.GetFlags(); + EXPECT_TRUE(flags->empty()); +} + +TEST(SyncTest, ValidatorRejectsInvalidType) { + TestableSync sync; + // 'state' should be a string, not an integer + nlohmann::json invalid_json = R"({ + "flags": { + "my-flag": { + "state": 123, + "variants": { + "on": true, + "off": false + }, + "defaultVariant": "on" + } + } + })"_json; + + sync.TriggerUpdate(invalid_json); + + auto flags = sync.GetFlags(); + EXPECT_TRUE(flags->empty()); +} + +TEST(SyncTest, ValidatorRejectsMissingVariants) { + TestableSync sync; + // Missing 'variants' field + nlohmann::json invalid_json = R"({ + "flags": { + "my-flag": { + "state": "ENABLED", + "defaultVariant": "on" + } + } + })"_json; + + sync.TriggerUpdate(invalid_json); + + auto flags = sync.GetFlags(); + EXPECT_TRUE(flags->empty()); +} + +TEST(SyncTest, ValidatorRejectsMalformedFlag) { + TestableSync sync; + // 'state' has invalid value + nlohmann::json invalid_json = R"({ + "flags": { + "my-flag": { + "state": "INVALID_STATE", + "variants": { + "on": true + }, + "defaultVariant": "on" + } + } + })"_json; + + sync.TriggerUpdate(invalid_json); + + auto flags = sync.GetFlags(); + EXPECT_TRUE(flags->empty()); +} + +TEST(SyncTest, MetadataIsExtracted) { + TestableSync sync; + nlohmann::json json_with_metadata = R"({ + "flags": {}, + "metadata": { + "foo": "bar" + } + })"_json; + + sync.TriggerUpdate(json_with_metadata); + + auto metadata = sync.GetMetadata(); + EXPECT_EQ((*metadata)["foo"], "bar"); +} + +} // namespace flagd From 521341ffc8d1b461f32140cc98a77f650f0158b9 Mon Sep 17 00:00:00 2001 From: Marcin Olko Date: Fri, 13 Mar 2026 12:49:32 +0000 Subject: [PATCH 2/4] Added test fixture Signed-off-by: Marcin Olko --- providers/flagd/tests/sync_test.cpp | 47 ++++++++++++++--------------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/providers/flagd/tests/sync_test.cpp b/providers/flagd/tests/sync_test.cpp index 4c3004b..a4c08b9 100644 --- a/providers/flagd/tests/sync_test.cpp +++ b/providers/flagd/tests/sync_test.cpp @@ -20,8 +20,12 @@ class TestableSync : public FlagSync { } }; -TEST(SyncTest, ValidatorAcceptsValidJson) { - TestableSync sync; +class SyncTest : public ::testing::Test { + protected: + TestableSync sync_; +}; + +TEST_F(SyncTest, ValidatorAcceptsValidJson) { nlohmann::json valid_json = R"({ "flags": { "my-flag": { @@ -35,27 +39,25 @@ TEST(SyncTest, ValidatorAcceptsValidJson) { } })"_json; - sync.TriggerUpdate(valid_json); + sync_.TriggerUpdate(valid_json); - auto flags = sync.GetFlags(); + auto flags = sync_.GetFlags(); EXPECT_TRUE(flags->contains("my-flag")); } -TEST(SyncTest, ValidatorRejectsInvalidJson) { - TestableSync sync; +TEST_F(SyncTest, ValidatorRejectsInvalidJson) { // Missing 'flags' field nlohmann::json invalid_json = R"({ "something": "else" })"_json; - sync.TriggerUpdate(invalid_json); + sync_.TriggerUpdate(invalid_json); - auto flags = sync.GetFlags(); + auto flags = sync_.GetFlags(); EXPECT_TRUE(flags->empty()); } -TEST(SyncTest, ValidatorRejectsInvalidType) { - TestableSync sync; +TEST_F(SyncTest, ValidatorRejectsInvalidType) { // 'state' should be a string, not an integer nlohmann::json invalid_json = R"({ "flags": { @@ -70,14 +72,13 @@ TEST(SyncTest, ValidatorRejectsInvalidType) { } })"_json; - sync.TriggerUpdate(invalid_json); + sync_.TriggerUpdate(invalid_json); - auto flags = sync.GetFlags(); + auto flags = sync_.GetFlags(); EXPECT_TRUE(flags->empty()); } -TEST(SyncTest, ValidatorRejectsMissingVariants) { - TestableSync sync; +TEST_F(SyncTest, ValidatorRejectsMissingVariants) { // Missing 'variants' field nlohmann::json invalid_json = R"({ "flags": { @@ -88,14 +89,13 @@ TEST(SyncTest, ValidatorRejectsMissingVariants) { } })"_json; - sync.TriggerUpdate(invalid_json); + sync_.TriggerUpdate(invalid_json); - auto flags = sync.GetFlags(); + auto flags = sync_.GetFlags(); EXPECT_TRUE(flags->empty()); } -TEST(SyncTest, ValidatorRejectsMalformedFlag) { - TestableSync sync; +TEST_F(SyncTest, ValidatorRejectsMalformedFlag) { // 'state' has invalid value nlohmann::json invalid_json = R"({ "flags": { @@ -109,14 +109,13 @@ TEST(SyncTest, ValidatorRejectsMalformedFlag) { } })"_json; - sync.TriggerUpdate(invalid_json); + sync_.TriggerUpdate(invalid_json); - auto flags = sync.GetFlags(); + auto flags = sync_.GetFlags(); EXPECT_TRUE(flags->empty()); } -TEST(SyncTest, MetadataIsExtracted) { - TestableSync sync; +TEST_F(SyncTest, MetadataIsExtracted) { nlohmann::json json_with_metadata = R"({ "flags": {}, "metadata": { @@ -124,9 +123,9 @@ TEST(SyncTest, MetadataIsExtracted) { } })"_json; - sync.TriggerUpdate(json_with_metadata); + sync_.TriggerUpdate(json_with_metadata); - auto metadata = sync.GetMetadata(); + auto metadata = sync_.GetMetadata(); EXPECT_EQ((*metadata)["foo"], "bar"); } From b6459ef15141edc74002718f6fb5770e271b30fc Mon Sep 17 00:00:00 2001 From: Marcin Olko Date: Wed, 18 Mar 2026 09:31:50 +0000 Subject: [PATCH 3/4] Addressed comments Signed-off-by: Marcin Olko --- providers/flagd/tests/sync_test.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/providers/flagd/tests/sync_test.cpp b/providers/flagd/tests/sync_test.cpp index a4c08b9..6047c2a 100644 --- a/providers/flagd/tests/sync_test.cpp +++ b/providers/flagd/tests/sync_test.cpp @@ -10,7 +10,7 @@ class TestableSync : public FlagSync { public: using FlagSync::FlagSync; - absl::Status Init(const openfeature::EvaluationContext& /*ctx*/) override { + absl::Status Init(const openfeature::EvaluationContext& ctx) override { return absl::OkStatus(); } absl::Status Shutdown() override { return absl::OkStatus(); } @@ -41,7 +41,7 @@ TEST_F(SyncTest, ValidatorAcceptsValidJson) { sync_.TriggerUpdate(valid_json); - auto flags = sync_.GetFlags(); + std::shared_ptr flags = sync_.GetFlags(); EXPECT_TRUE(flags->contains("my-flag")); } @@ -53,7 +53,7 @@ TEST_F(SyncTest, ValidatorRejectsInvalidJson) { sync_.TriggerUpdate(invalid_json); - auto flags = sync_.GetFlags(); + std::shared_ptr flags = sync_.GetFlags(); EXPECT_TRUE(flags->empty()); } @@ -74,7 +74,7 @@ TEST_F(SyncTest, ValidatorRejectsInvalidType) { sync_.TriggerUpdate(invalid_json); - auto flags = sync_.GetFlags(); + std::shared_ptr flags = sync_.GetFlags(); EXPECT_TRUE(flags->empty()); } @@ -91,7 +91,7 @@ TEST_F(SyncTest, ValidatorRejectsMissingVariants) { sync_.TriggerUpdate(invalid_json); - auto flags = sync_.GetFlags(); + std::shared_ptr flags = sync_.GetFlags(); EXPECT_TRUE(flags->empty()); } @@ -111,7 +111,7 @@ TEST_F(SyncTest, ValidatorRejectsMalformedFlag) { sync_.TriggerUpdate(invalid_json); - auto flags = sync_.GetFlags(); + std::shared_ptr flags = sync_.GetFlags(); EXPECT_TRUE(flags->empty()); } @@ -125,7 +125,7 @@ TEST_F(SyncTest, MetadataIsExtracted) { sync_.TriggerUpdate(json_with_metadata); - auto metadata = sync_.GetMetadata(); + std::shared_ptr metadata = sync_.GetMetadata(); EXPECT_EQ((*metadata)["foo"], "bar"); } From a2c5331d61441465acbbd5350170246494ae724e Mon Sep 17 00:00:00 2001 From: Marcin Olko Date: Wed, 18 Mar 2026 09:35:54 +0000 Subject: [PATCH 4/4] Fixed tests Signed-off-by: Marcin Olko --- providers/flagd/tests/BUILD | 2 +- providers/flagd/tests/sync_test.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/providers/flagd/tests/BUILD b/providers/flagd/tests/BUILD index 8e0ad89..8dfb0d7 100644 --- a/providers/flagd/tests/BUILD +++ b/providers/flagd/tests/BUILD @@ -13,7 +13,7 @@ cc_test( name = "sync_test", srcs = ["sync_test.cpp"], deps = [ - "//providers/flagd/src:sync", + "//providers/flagd/src/sync", "@googletest//:gtest_main", "@nlohmann_json//:json", ], diff --git a/providers/flagd/tests/sync_test.cpp b/providers/flagd/tests/sync_test.cpp index 6047c2a..0d29935 100644 --- a/providers/flagd/tests/sync_test.cpp +++ b/providers/flagd/tests/sync_test.cpp @@ -1,4 +1,4 @@ -#include "flagd/sync.h" +#include "flagd/sync/sync.h" #include