/proc/self/cwd/test/test_common/registry.h
Line | Count | Source |
1 | | #pragma once |
2 | | |
3 | | #include "envoy/registry/registry.h" |
4 | | |
5 | | #include "gtest/gtest.h" |
6 | | |
7 | | namespace Envoy { |
8 | | namespace Registry { |
9 | | |
10 | | /** |
11 | | * Factory registration template for tests. This can be used to inject a mock or dummy version |
12 | | * of a factory for testing purposes. It will restore the original value, if any, when it goes |
13 | | * out of scope. |
14 | | */ |
15 | | template <class Base> class InjectFactory { |
16 | | public: |
17 | 2 | InjectFactory(Base& instance) : InjectFactory(instance, {}) {} Envoy::Registry::InjectFactory<Envoy::Network::DnsResolverFactory>::InjectFactory(Envoy::Network::DnsResolverFactory&) Line | Count | Source | 17 | 1 | InjectFactory(Base& instance) : InjectFactory(instance, {}) {} |
Envoy::Registry::InjectFactory<Envoy::Router::GenericConnPoolFactory>::InjectFactory(Envoy::Router::GenericConnPoolFactory&) Line | Count | Source | 17 | 1 | InjectFactory(Base& instance) : InjectFactory(instance, {}) {} |
|
18 | | |
19 | | InjectFactory(Base& instance, std::initializer_list<absl::string_view> deprecated_names) |
20 | 2 | : instance_(instance) { |
21 | 2 | EXPECT_STRNE(instance.category().c_str(), ""); |
22 | | |
23 | 2 | original_ = Registry::FactoryRegistry<Base>::getFactory(instance_.name()); |
24 | 2 | restore_factories_ = |
25 | 2 | Registry::FactoryRegistry<Base>::replaceFactoryForTest(instance_, deprecated_names); |
26 | 2 | } Envoy::Registry::InjectFactory<Envoy::Network::DnsResolverFactory>::InjectFactory(Envoy::Network::DnsResolverFactory&, std::initializer_list<std::__1::basic_string_view<char, std::__1::char_traits<char> > >) Line | Count | Source | 20 | 1 | : instance_(instance) { | 21 | 1 | EXPECT_STRNE(instance.category().c_str(), ""); | 22 | | | 23 | 1 | original_ = Registry::FactoryRegistry<Base>::getFactory(instance_.name()); | 24 | 1 | restore_factories_ = | 25 | 1 | Registry::FactoryRegistry<Base>::replaceFactoryForTest(instance_, deprecated_names); | 26 | 1 | } |
Envoy::Registry::InjectFactory<Envoy::Router::GenericConnPoolFactory>::InjectFactory(Envoy::Router::GenericConnPoolFactory&, std::initializer_list<std::__1::basic_string_view<char, std::__1::char_traits<char> > >) Line | Count | Source | 20 | 1 | : instance_(instance) { | 21 | 1 | EXPECT_STRNE(instance.category().c_str(), ""); | 22 | | | 23 | 1 | original_ = Registry::FactoryRegistry<Base>::getFactory(instance_.name()); | 24 | 1 | restore_factories_ = | 25 | 1 | Registry::FactoryRegistry<Base>::replaceFactoryForTest(instance_, deprecated_names); | 26 | 1 | } |
|
27 | | |
28 | 2 | ~InjectFactory() { |
29 | 2 | restore_factories_(); |
30 | | |
31 | 2 | auto* restored = Registry::FactoryRegistry<Base>::getFactory(instance_.name()); |
32 | 2 | ASSERT(restored == original_); |
33 | 2 | } Envoy::Registry::InjectFactory<Envoy::Network::DnsResolverFactory>::~InjectFactory() Line | Count | Source | 28 | 1 | ~InjectFactory() { | 29 | 1 | restore_factories_(); | 30 | | | 31 | 1 | auto* restored = Registry::FactoryRegistry<Base>::getFactory(instance_.name()); | 32 | 1 | ASSERT(restored == original_); | 33 | 1 | } |
Envoy::Registry::InjectFactory<Envoy::Router::GenericConnPoolFactory>::~InjectFactory() Line | Count | Source | 28 | 1 | ~InjectFactory() { | 29 | 1 | restore_factories_(); | 30 | | | 31 | 1 | auto* restored = Registry::FactoryRegistry<Base>::getFactory(instance_.name()); | 32 | 1 | ASSERT(restored == original_); | 33 | 1 | } |
|
34 | | |
35 | | // Rebuilds the registry's factory-by-type mapping from scratch. In most cases, this is handled |
36 | | // by the replaceFactoryForTest calls in the constructor and destructor. This method is only |
37 | | // necessary if the disabled state of the factory is modified. |
38 | | static void resetTypeMappings() { |
39 | | Registry::FactoryRegistry<Base>::rebuildFactoriesByTypeForTest(); |
40 | | } |
41 | | |
42 | | static void forceAllowDuplicates() { Registry::FactoryRegistry<Base>::allowDuplicates() = true; } |
43 | | |
44 | | private: |
45 | | Base& instance_; |
46 | | Base* original_{}; |
47 | | std::function<void()> restore_factories_; |
48 | | }; |
49 | | |
50 | | /** |
51 | | * Registers a factory category for tests. Most tests do not need this functionality. It's only |
52 | | * useful for testing the registration infrastructure. |
53 | | */ |
54 | | template <class Base> class InjectFactoryCategory { |
55 | | public: |
56 | | InjectFactoryCategory(Base& instance) |
57 | | : proxy_(std::make_unique<FactoryRegistryProxyImpl<Base>>()), instance_(instance) { |
58 | | // Register a new category. |
59 | | FactoryCategoryRegistry::registerCategory(instance_.category(), proxy_.get()); |
60 | | } |
61 | | |
62 | | ~InjectFactoryCategory() { |
63 | | FactoryCategoryRegistry::deregisterCategoryForTest(instance_.category()); |
64 | | } |
65 | | |
66 | | private: |
67 | | std::unique_ptr<FactoryRegistryProxyImpl<Base>> proxy_; |
68 | | Base& instance_; |
69 | | }; |
70 | | |
71 | | } // namespace Registry |
72 | | } // namespace Envoy |