1 // Copyright 2023 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "net/cert/cert_database.h"
6
7 #include "base/test/metrics/histogram_tester.h"
8 #include "base/test/task_environment.h"
9 #include "net/log/test_net_log.h"
10 #include "testing/gtest/include/gtest/gtest.h"
11
12 namespace net {
13
14 namespace {
15 class Observer : public CertDatabase::Observer {
16 public:
OnTrustStoreChanged()17 void OnTrustStoreChanged() override { trust_store_change_count_++; }
18
OnClientCertStoreChanged()19 void OnClientCertStoreChanged() override { client_cert_change_count_++; }
20
21 int trust_store_change_count_ = 0;
22 int client_cert_change_count_ = 0;
23 };
24
25 } // namespace
26
TEST(CertDatabaseTest,Notifications)27 TEST(CertDatabaseTest, Notifications) {
28 base::test::SingleThreadTaskEnvironment task_environment;
29
30 CertDatabase* cert_database = CertDatabase::GetInstance();
31 ASSERT_TRUE(cert_database);
32
33 Observer observer_1;
34 Observer observer_2;
35
36 cert_database->AddObserver(&observer_1);
37 cert_database->AddObserver(&observer_2);
38
39 {
40 RecordingNetLogObserver net_log_observer;
41 base::HistogramTester histograms;
42 cert_database->NotifyObserversClientCertStoreChanged();
43 task_environment.RunUntilIdle();
44
45 EXPECT_EQ(observer_1.trust_store_change_count_, 0);
46 EXPECT_EQ(observer_1.client_cert_change_count_, 1);
47 EXPECT_EQ(observer_2.trust_store_change_count_,
48 observer_1.trust_store_change_count_);
49 EXPECT_EQ(observer_2.client_cert_change_count_,
50 observer_1.client_cert_change_count_);
51
52 EXPECT_EQ(net_log_observer.GetEntries().size(), 1u);
53 EXPECT_EQ(
54 net_log_observer
55 .GetEntriesWithType(
56 NetLogEventType::CERTIFICATE_DATABASE_CLIENT_CERT_STORE_CHANGED)
57 .size(),
58 1u);
59
60 histograms.ExpectUniqueSample(
61 "Net.Certificate.ChangeNotification",
62 CertDatabase::HistogramNotificationType::kClientCert, 1);
63 }
64
65 {
66 RecordingNetLogObserver net_log_observer;
67 base::HistogramTester histograms;
68 cert_database->NotifyObserversTrustStoreChanged();
69 task_environment.RunUntilIdle();
70
71 EXPECT_EQ(observer_1.trust_store_change_count_, 1);
72 EXPECT_EQ(observer_1.client_cert_change_count_, 1);
73 EXPECT_EQ(observer_2.trust_store_change_count_,
74 observer_1.trust_store_change_count_);
75 EXPECT_EQ(observer_2.client_cert_change_count_,
76 observer_1.client_cert_change_count_);
77
78 EXPECT_EQ(net_log_observer.GetEntries().size(), 1u);
79 EXPECT_EQ(net_log_observer
80 .GetEntriesWithType(
81 NetLogEventType::CERTIFICATE_DATABASE_TRUST_STORE_CHANGED)
82 .size(),
83 1u);
84
85 histograms.ExpectUniqueSample(
86 "Net.Certificate.ChangeNotification",
87 CertDatabase::HistogramNotificationType::kTrust, 1);
88 }
89
90 cert_database->RemoveObserver(&observer_1);
91 cert_database->RemoveObserver(&observer_2);
92 }
93
94 } // namespace net
95