23 #include <gmock/gmock.h>
35 CertificateProviderStoreTest() {
grpc_init(); }
42 RefCountedPtr<grpc_tls_certificate_distributor> distributor()
const override {
48 UniqueTypeName
type()
const override {
49 static UniqueTypeName::Factory kFactory(
"fake");
50 return kFactory.Create();
61 class FakeCertificateProviderFactory1 :
public CertificateProviderFactory {
65 const char*
name()
const override {
return "fake1"; }
70 const char*
name()
const override {
return "fake1"; }
72 RefCountedPtr<CertificateProviderFactory::Config>
73 CreateCertificateProviderConfig(
const Json& ,
75 return MakeRefCounted<Config>();
78 RefCountedPtr<grpc_tls_certificate_provider> CreateCertificateProvider(
79 RefCountedPtr<CertificateProviderFactory::Config> )
override {
80 return MakeRefCounted<FakeCertificateProvider>();
84 class FakeCertificateProviderFactory2 :
public CertificateProviderFactory {
88 const char*
name()
const override {
return "fake2"; }
93 const char*
name()
const override {
return "fake2"; }
95 RefCountedPtr<CertificateProviderFactory::Config>
96 CreateCertificateProviderConfig(
const Json& ,
98 return MakeRefCounted<Config>();
101 RefCountedPtr<grpc_tls_certificate_provider> CreateCertificateProvider(
102 RefCountedPtr<CertificateProviderFactory::Config> )
override {
103 return MakeRefCounted<FakeCertificateProvider>();
107 TEST_F(CertificateProviderStoreTest, Basic) {
109 auto* fake_factory_1 =
new FakeCertificateProviderFactory1;
111 std::unique_ptr<CertificateProviderFactory>(fake_factory_1));
112 auto fake_factory_2 = absl::make_unique<FakeCertificateProviderFactory2>();
116 {
"fake1", fake_factory_1->CreateCertificateProviderConfig(
Json::Object(),
119 {
"fake2", fake_factory_2->CreateCertificateProviderConfig(
Json::Object(),
122 {
"fake1", fake_factory_1->CreateCertificateProviderConfig(
Json::Object(),
125 auto store = MakeOrphanable<CertificateProviderStore>(
std::move(
map));
127 auto cert_provider_1 = store->CreateOrGetCertificateProvider(
"fake_plugin_1");
129 auto cert_provider_3 = store->CreateOrGetCertificateProvider(
"fake_plugin_3");
133 ASSERT_EQ(store->CreateOrGetCertificateProvider(
"fake_plugin_2"),
nullptr);
135 ASSERT_EQ(store->CreateOrGetCertificateProvider(
"unknown"),
nullptr);
137 ASSERT_EQ(store->CreateOrGetCertificateProvider(
"fake_plugin_1"),
139 ASSERT_EQ(store->CreateOrGetCertificateProvider(
"fake_plugin_3"),
143 cert_provider_1.reset();
144 cert_provider_3.reset();
147 TEST_F(CertificateProviderStoreTest, Multithreaded) {
148 auto* fake_factory_1 =
new FakeCertificateProviderFactory1;
150 std::unique_ptr<CertificateProviderFactory>(fake_factory_1));
153 {
"fake1", fake_factory_1->CreateCertificateProviderConfig(
Json::Object(),
155 auto store = MakeOrphanable<CertificateProviderStore>(
std::move(
map));
157 std::vector<std::thread>
threads;
159 for (
auto i = 0;
i < 1000;
i++) {
160 threads.emplace_back([&store]() {
161 for (
auto i = 0;
i < 10; ++
i) {
162 ASSERT_NE(store->CreateOrGetCertificateProvider(
"fake_plugin_1"),
176 int main(
int argc,
char** argv) {