Coverage Report

Created: 2024-09-19 09:45

/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