diff --git a/source/common/config/config_provider_impl.cc b/source/common/config/config_provider_impl.cc index f13058d631dfa..ed209e8427ad9 100644 --- a/source/common/config/config_provider_impl.cc +++ b/source/common/config/config_provider_impl.cc @@ -10,6 +10,8 @@ ImmutableConfigProviderBase::ImmutableConfigProviderBase( : last_updated_(factory_context.timeSource().systemTime()), config_provider_manager_(config_provider_manager), instance_type_(instance_type), api_type_(api_type) { + ASSERT(instance_type_ == ConfigProviderInstanceType::Static || + instance_type_ == ConfigProviderInstanceType::Inline); config_provider_manager_.bindImmutableConfigProvider(this); } @@ -118,8 +120,6 @@ ConfigProviderManagerImplBase::immutableConfigProviders(ConfigProviderInstanceTy void ConfigProviderManagerImplBase::bindImmutableConfigProvider( ImmutableConfigProviderBase* provider) { - ASSERT(provider->instanceType() == ConfigProviderInstanceType::Static || - provider->instanceType() == ConfigProviderInstanceType::Inline); ConfigProviderMap::iterator it; if ((it = immutable_config_providers_map_.find(provider->instanceType())) == immutable_config_providers_map_.end()) { @@ -133,8 +133,6 @@ void ConfigProviderManagerImplBase::bindImmutableConfigProvider( void ConfigProviderManagerImplBase::unbindImmutableConfigProvider( ImmutableConfigProviderBase* provider) { - ASSERT(provider->instanceType() == ConfigProviderInstanceType::Static || - provider->instanceType() == ConfigProviderInstanceType::Inline); auto it = immutable_config_providers_map_.find(provider->instanceType()); ASSERT(it != immutable_config_providers_map_.end()); it->second->erase(provider); diff --git a/test/common/config/config_provider_impl_test.cc b/test/common/config/config_provider_impl_test.cc index 3945dc9d79ad1..69924133af715 100644 --- a/test/common/config/config_provider_impl_test.cc +++ b/test/common/config/config_provider_impl_test.cc @@ -369,6 +369,33 @@ TEST_F(ConfigProviderImplTest, DuplicateConfigProto) { subscription.onConfigUpdate(untyped_dummy_configs, "1"); } +// An empty config provider tests on base class' constructor. +class InlineDummyConfigProvider : public ImmutableConfigProviderBase { +public: + InlineDummyConfigProvider(Server::Configuration::FactoryContext& factory_context, + DummyConfigProviderManager& config_provider_manager, + ConfigProviderInstanceType instance_type) + : ImmutableConfigProviderBase(factory_context, config_provider_manager, instance_type, + ApiType::Full) {} + ConfigConstSharedPtr getConfig() const override { return nullptr; } + std::string getConfigVersion() const override { return ""; } + const Protobuf::Message* getConfigProto() const override { return nullptr; } +}; + +class ConfigProviderImplDeathTest : public ConfigProviderImplTest {}; + +TEST_F(ConfigProviderImplDeathTest, AssertionFailureOnIncorrectInstanceType) { + initialize(); + + InlineDummyConfigProvider foo(factory_context_, *provider_manager_, + ConfigProviderInstanceType::Inline); + InlineDummyConfigProvider bar(factory_context_, *provider_manager_, + ConfigProviderInstanceType::Static); + EXPECT_DEBUG_DEATH(InlineDummyConfigProvider(factory_context_, *provider_manager_, + ConfigProviderInstanceType::Xds), + ""); +} + // Tests that the base ConfigProvider*s are handling registration with the // /config_dump admin handler as well as generic bookkeeping such as timestamp // updates.