From c14ccd7e4816b8b7a1bd7bb92b8c433f40c3bea7 Mon Sep 17 00:00:00 2001 From: NeaguGeorgiana23 Date: Mon, 8 Dec 2025 07:47:17 +0000 Subject: [PATCH 1/3] Unit tests for FeatureProviderStatusManager.. Signed-off-by: NeaguGeorgiana23 --- test/BUILD | 26 ++++- test/feature_provider_status_manager_test.cpp | 110 ++++++++++++++++++ test/mocks/mock_feature_provider.h | 27 +++++ 3 files changed, 160 insertions(+), 3 deletions(-) create mode 100644 test/feature_provider_status_manager_test.cpp create mode 100644 test/mocks/mock_feature_provider.h diff --git a/test/BUILD b/test/BUILD index c7a0f66..616b2ee 100644 --- a/test/BUILD +++ b/test/BUILD @@ -1,11 +1,31 @@ cc_test( name = "resolution_details_test", - # Path is relative to cpp-sdk/src/test/ + # Path is relative to cpp-sdk/test/ srcs = ["resolution_details_test.cpp"], deps = [ - # We reference the library defined in the parent 'src' package "//src:resolution_details", - # Google Test dependency remains the same + "@googletest//:gtest_main", + ], +) + +cc_library( + name = "mock_feature_provider", + testonly = True, + hdrs = ["mocks/mock_feature_provider.h"], + visibility = ["//test:__pkg__"], + deps = [ + "//include:openfeature_headers", + "@googletest//:gtest", + ], +) + +cc_test( + name = "feature_provider_status_manager_test", + # Path is relative to cpp-sdk/test/ + srcs = ["feature_provider_status_manager_test.cpp"], + deps = [ + ":mock_feature_provider", + "//src:feature_provider_status_manager", "@googletest//:gtest_main", ], ) \ No newline at end of file diff --git a/test/feature_provider_status_manager_test.cpp b/test/feature_provider_status_manager_test.cpp new file mode 100644 index 0000000..72e7066 --- /dev/null +++ b/test/feature_provider_status_manager_test.cpp @@ -0,0 +1,110 @@ +#include "openfeature/feature_provider_status_manager.h" + +#include + +#include +#include + +#include "absl/status/status.h" +#include "mocks/mock_feature_provider.h" +#include "openfeature/evaluation_context.h" +#include "openfeature/provider_status.h" + +using namespace openfeature; +using ::testing::_; +using ::testing::Return; +using ::testing::Test; +using ::testing::WithParamInterface; + +class FeatureProviderStatusManagerTest : public Test { + protected: + void SetUp() override { + mock_provider = std::make_shared(); + auto result = FeatureProviderStatusManager::Create(mock_provider); + ASSERT_TRUE(result.ok()); + manager = std::move(result).value(); + ASSERT_NE(manager, nullptr); + } + + std::shared_ptr mock_provider; + std::unique_ptr manager; + EvaluationContext ctx; +}; + +TEST_F(FeatureProviderStatusManagerTest, CreateWithNullProviderReturnsError) { + auto result = FeatureProviderStatusManager::Create(nullptr); + ASSERT_FALSE(result.ok()); + EXPECT_EQ(result.status().code(), absl::StatusCode::kInvalidArgument); +} + +TEST_F(FeatureProviderStatusManagerTest, CreateWithValidProviderSucceeds) { + EXPECT_EQ(manager->GetStatus(), ProviderStatus::kNotReady); + EXPECT_EQ(manager->GetProvider(), mock_provider); +} + +class FeatureProviderStatusManagerInitTest + : public FeatureProviderStatusManagerTest, + public WithParamInterface> {}; + +TEST_P(FeatureProviderStatusManagerInitTest, InitSetsCorrectStatus) { + auto [provider_init_status, expected_manager_status] = GetParam(); + + EXPECT_CALL(*mock_provider, Init(_)).WillOnce(Return(provider_init_status)); + manager->Init(ctx); + EXPECT_EQ(manager->GetStatus(), expected_manager_status); +} + +INSTANTIATE_TEST_SUITE_P( + InitStatusTests, FeatureProviderStatusManagerInitTest, + ::testing::Values( + std::make_tuple(absl::OkStatus(), ProviderStatus::kReady), + std::make_tuple(absl::InternalError("Initialization failed"), + ProviderStatus::kError))); + +class FeatureProviderStatusManagerShutdownTest + : public FeatureProviderStatusManagerTest, + public WithParamInterface {}; + +TEST_P(FeatureProviderStatusManagerShutdownTest, + ShutdownAlwaysSetsStatusToNotReady) { + manager->SetStatus(ProviderStatus::kReady); + auto provider_shutdown_status = GetParam(); + EXPECT_CALL(*mock_provider, Shutdown()) + .WillOnce(Return(provider_shutdown_status)); + manager->Shutdown(); + EXPECT_EQ(manager->GetStatus(), ProviderStatus::kNotReady); +} + +INSTANTIATE_TEST_SUITE_P( + ShutdownStatusTests, FeatureProviderStatusManagerShutdownTest, + ::testing::Values(absl::OkStatus(), + absl::InternalError("Shutdown failed"))); + +TEST_F(FeatureProviderStatusManagerTest, SetStatusAndGetStatusWorkCorrectly) { + // Verify initial status from SetUp. + ASSERT_EQ(manager->GetStatus(), ProviderStatus::kNotReady); + + // Define a list of statuses to test. + const std::vector statuses_to_test = { + ProviderStatus::kStale, ProviderStatus::kFatal, ProviderStatus::kReady, + ProviderStatus::kNotReady, ProviderStatus::kError}; + + // Iterate and test each status. + for (const auto& status : statuses_to_test) { + manager->SetStatus(status); + EXPECT_EQ(manager->GetStatus(), status); + } +} + +TEST_F(FeatureProviderStatusManagerTest, GetProviderReturnsCorrectProvider) { + // The GetProvider method should return the same instance of the provider + // regardless of the manager's status. + EXPECT_EQ(manager->GetProvider(), mock_provider); + manager->SetStatus(ProviderStatus::kReady); + EXPECT_EQ(manager->GetProvider(), mock_provider); +} + +int main(int argc, char** argv) { + ::testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} \ No newline at end of file diff --git a/test/mocks/mock_feature_provider.h b/test/mocks/mock_feature_provider.h new file mode 100644 index 0000000..6ed49ae --- /dev/null +++ b/test/mocks/mock_feature_provider.h @@ -0,0 +1,27 @@ +#ifndef CPP_SDK_TEST_MOCKS_MOCK_FEATURE_PROVIDER_H_ +#define CPP_SDK_TEST_MOCKS_MOCK_FEATURE_PROVIDER_H_ + +#include + +#include "openfeature/provider.h" + +namespace openfeature { + +// Mock class for FeatureProvider to simulate its behavior in tests. +class MockFeatureProvider : public FeatureProvider { + public: + MOCK_METHOD(Metadata, GetMetadata, (), (const, override)); + MOCK_METHOD(std::unique_ptr, GetBooleanEvaluation, + (std::string_view flag, bool default_value, + const EvaluationContext& ctx), + (override)); + + MOCK_METHOD(absl::Status, Init, (const EvaluationContext& ctx), (override)); + MOCK_METHOD(absl::Status, Shutdown, (), (override)); + + // TODO: Update mock when FeatureProvider interface is completed +}; + +} // namespace openfeature + +#endif // CPP_SDK_TEST_MOCKS_MOCK_FEATURE_PROVIDER_H_ \ No newline at end of file From c790dd823470be799a76588df58a95c1b38a2cf2 Mon Sep 17 00:00:00 2001 From: NeaguGeorgiana23 Date: Mon, 8 Dec 2025 10:21:46 +0000 Subject: [PATCH 2/3] Fix comments. Signed-off-by: NeaguGeorgiana23 --- test/BUILD | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/BUILD b/test/BUILD index 616b2ee..466fbe4 100644 --- a/test/BUILD +++ b/test/BUILD @@ -1,6 +1,5 @@ cc_test( name = "resolution_details_test", - # Path is relative to cpp-sdk/test/ srcs = ["resolution_details_test.cpp"], deps = [ "//src:resolution_details", @@ -21,7 +20,6 @@ cc_library( cc_test( name = "feature_provider_status_manager_test", - # Path is relative to cpp-sdk/test/ srcs = ["feature_provider_status_manager_test.cpp"], deps = [ ":mock_feature_provider", From 29e78678e3b19c83fbedc238ff7e8c026f5a4d80 Mon Sep 17 00:00:00 2001 From: NeaguGeorgiana23 Date: Mon, 8 Dec 2025 10:21:46 +0000 Subject: [PATCH 3/3] Fix comments. Signed-off-by: NeaguGeorgiana23 --- test/BUILD | 2 - test/feature_provider_status_manager_test.cpp | 52 +++++++++---------- 2 files changed, 26 insertions(+), 28 deletions(-) diff --git a/test/BUILD b/test/BUILD index 616b2ee..466fbe4 100644 --- a/test/BUILD +++ b/test/BUILD @@ -1,6 +1,5 @@ cc_test( name = "resolution_details_test", - # Path is relative to cpp-sdk/test/ srcs = ["resolution_details_test.cpp"], deps = [ "//src:resolution_details", @@ -21,7 +20,6 @@ cc_library( cc_test( name = "feature_provider_status_manager_test", - # Path is relative to cpp-sdk/test/ srcs = ["feature_provider_status_manager_test.cpp"], deps = [ ":mock_feature_provider", diff --git a/test/feature_provider_status_manager_test.cpp b/test/feature_provider_status_manager_test.cpp index 72e7066..362ec4f 100644 --- a/test/feature_provider_status_manager_test.cpp +++ b/test/feature_provider_status_manager_test.cpp @@ -19,16 +19,17 @@ using ::testing::WithParamInterface; class FeatureProviderStatusManagerTest : public Test { protected: void SetUp() override { - mock_provider = std::make_shared(); - auto result = FeatureProviderStatusManager::Create(mock_provider); + mock_provider_ = std::make_shared(); + absl::StatusOr> result = + FeatureProviderStatusManager::Create(mock_provider_); ASSERT_TRUE(result.ok()); - manager = std::move(result).value(); - ASSERT_NE(manager, nullptr); + manager_ = std::move(result).value(); + ASSERT_NE(manager_, nullptr); } - std::shared_ptr mock_provider; - std::unique_ptr manager; - EvaluationContext ctx; + std::shared_ptr mock_provider_; + std::unique_ptr manager_; + EvaluationContext ctx_; }; TEST_F(FeatureProviderStatusManagerTest, CreateWithNullProviderReturnsError) { @@ -38,8 +39,8 @@ TEST_F(FeatureProviderStatusManagerTest, CreateWithNullProviderReturnsError) { } TEST_F(FeatureProviderStatusManagerTest, CreateWithValidProviderSucceeds) { - EXPECT_EQ(manager->GetStatus(), ProviderStatus::kNotReady); - EXPECT_EQ(manager->GetProvider(), mock_provider); + EXPECT_EQ(manager_->GetStatus(), ProviderStatus::kNotReady); + EXPECT_EQ(manager_->GetProvider(), mock_provider_); } class FeatureProviderStatusManagerInitTest @@ -49,14 +50,14 @@ class FeatureProviderStatusManagerInitTest TEST_P(FeatureProviderStatusManagerInitTest, InitSetsCorrectStatus) { auto [provider_init_status, expected_manager_status] = GetParam(); - EXPECT_CALL(*mock_provider, Init(_)).WillOnce(Return(provider_init_status)); - manager->Init(ctx); - EXPECT_EQ(manager->GetStatus(), expected_manager_status); + EXPECT_CALL(*mock_provider_, Init(_)).WillOnce(Return(provider_init_status)); + manager_->Init(ctx_); + EXPECT_EQ(manager_->GetStatus(), expected_manager_status); } INSTANTIATE_TEST_SUITE_P( InitStatusTests, FeatureProviderStatusManagerInitTest, - ::testing::Values( + testing::Values( std::make_tuple(absl::OkStatus(), ProviderStatus::kReady), std::make_tuple(absl::InternalError("Initialization failed"), ProviderStatus::kError))); @@ -67,22 +68,21 @@ class FeatureProviderStatusManagerShutdownTest TEST_P(FeatureProviderStatusManagerShutdownTest, ShutdownAlwaysSetsStatusToNotReady) { - manager->SetStatus(ProviderStatus::kReady); + manager_->SetStatus(ProviderStatus::kReady); auto provider_shutdown_status = GetParam(); - EXPECT_CALL(*mock_provider, Shutdown()) + EXPECT_CALL(*mock_provider_, Shutdown()) .WillOnce(Return(provider_shutdown_status)); - manager->Shutdown(); - EXPECT_EQ(manager->GetStatus(), ProviderStatus::kNotReady); + manager_->Shutdown(); + EXPECT_EQ(manager_->GetStatus(), ProviderStatus::kNotReady); } INSTANTIATE_TEST_SUITE_P( ShutdownStatusTests, FeatureProviderStatusManagerShutdownTest, - ::testing::Values(absl::OkStatus(), - absl::InternalError("Shutdown failed"))); + testing::Values(absl::OkStatus(), absl::InternalError("Shutdown failed"))); TEST_F(FeatureProviderStatusManagerTest, SetStatusAndGetStatusWorkCorrectly) { // Verify initial status from SetUp. - ASSERT_EQ(manager->GetStatus(), ProviderStatus::kNotReady); + ASSERT_EQ(manager_->GetStatus(), ProviderStatus::kNotReady); // Define a list of statuses to test. const std::vector statuses_to_test = { @@ -91,20 +91,20 @@ TEST_F(FeatureProviderStatusManagerTest, SetStatusAndGetStatusWorkCorrectly) { // Iterate and test each status. for (const auto& status : statuses_to_test) { - manager->SetStatus(status); - EXPECT_EQ(manager->GetStatus(), status); + manager_->SetStatus(status); + EXPECT_EQ(manager_->GetStatus(), status); } } TEST_F(FeatureProviderStatusManagerTest, GetProviderReturnsCorrectProvider) { // The GetProvider method should return the same instance of the provider // regardless of the manager's status. - EXPECT_EQ(manager->GetProvider(), mock_provider); - manager->SetStatus(ProviderStatus::kReady); - EXPECT_EQ(manager->GetProvider(), mock_provider); + EXPECT_EQ(manager_->GetProvider(), mock_provider_); + manager_->SetStatus(ProviderStatus::kReady); + EXPECT_EQ(manager_->GetProvider(), mock_provider_); } int main(int argc, char** argv) { - ::testing::InitGoogleTest(&argc, argv); + testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); } \ No newline at end of file