1 // Copyright 2014 The Chromium Authors. All rights reserved.
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 "components/password_manager/core/browser/log_router.h"
6
7 #include "components/password_manager/core/browser/log_receiver.h"
8 #include "components/password_manager/core/browser/stub_password_manager_client.h"
9 #include "testing/gmock/include/gmock/gmock.h"
10 #include "testing/gtest/include/gtest/gtest.h"
11
12 using testing::_;
13
14 namespace password_manager {
15
16 namespace {
17
18 const char kTestText[] = "abcd1234";
19
20 class MockLogReceiver : public LogReceiver {
21 public:
MockLogReceiver()22 MockLogReceiver() {}
23
24 MOCK_METHOD1(LogSavePasswordProgress, void(const std::string&));
25 };
26
27 class MockClient : public StubPasswordManagerClient {
28 public:
29 MOCK_METHOD1(OnLogRouterAvailabilityChanged, void(bool));
30 };
31
32 } // namespace
33
34 class LogRouterTest : public testing::Test {
35 protected:
36 testing::StrictMock<MockLogReceiver> receiver_;
37 testing::StrictMock<MockLogReceiver> receiver2_;
38 testing::StrictMock<MockClient> client_;
39 };
40
TEST_F(LogRouterTest,ProcessLog_NoReceiver)41 TEST_F(LogRouterTest, ProcessLog_NoReceiver) {
42 LogRouter router;
43 EXPECT_EQ(std::string(), router.RegisterReceiver(&receiver_));
44 EXPECT_CALL(receiver_, LogSavePasswordProgress(kTestText)).Times(1);
45 router.ProcessLog(kTestText);
46 router.UnregisterReceiver(&receiver_);
47 // Without receivers, accumulated logs should not have been kept. That means
48 // that on the registration of the first receiver, none are returned.
49 EXPECT_EQ(std::string(), router.RegisterReceiver(&receiver_));
50 router.UnregisterReceiver(&receiver_);
51 }
52
TEST_F(LogRouterTest,ProcessLog_OneReceiver)53 TEST_F(LogRouterTest, ProcessLog_OneReceiver) {
54 LogRouter router;
55 EXPECT_EQ(std::string(), router.RegisterReceiver(&receiver_));
56 // Check that logs generated after activation are passed.
57 EXPECT_CALL(receiver_, LogSavePasswordProgress(kTestText)).Times(1);
58 router.ProcessLog(kTestText);
59 router.UnregisterReceiver(&receiver_);
60 }
61
TEST_F(LogRouterTest,ProcessLog_TwoReceiversAccumulatedLogsPassed)62 TEST_F(LogRouterTest, ProcessLog_TwoReceiversAccumulatedLogsPassed) {
63 LogRouter router;
64 EXPECT_EQ(std::string(), router.RegisterReceiver(&receiver_));
65
66 // Log something with only the first receiver, to accumulate some logs.
67 EXPECT_CALL(receiver_, LogSavePasswordProgress(kTestText)).Times(1);
68 EXPECT_CALL(receiver2_, LogSavePasswordProgress(kTestText)).Times(0);
69 router.ProcessLog(kTestText);
70 // Accumulated logs get passed on registration.
71 EXPECT_EQ(kTestText, router.RegisterReceiver(&receiver2_));
72 router.UnregisterReceiver(&receiver_);
73 router.UnregisterReceiver(&receiver2_);
74 }
75
TEST_F(LogRouterTest,ProcessLog_TwoReceiversBothUpdated)76 TEST_F(LogRouterTest, ProcessLog_TwoReceiversBothUpdated) {
77 LogRouter router;
78 EXPECT_EQ(std::string(), router.RegisterReceiver(&receiver_));
79 EXPECT_EQ(std::string(), router.RegisterReceiver(&receiver2_));
80
81 // Check that both receivers get log updates.
82 EXPECT_CALL(receiver_, LogSavePasswordProgress(kTestText)).Times(1);
83 EXPECT_CALL(receiver2_, LogSavePasswordProgress(kTestText)).Times(1);
84 router.ProcessLog(kTestText);
85 router.UnregisterReceiver(&receiver2_);
86 router.UnregisterReceiver(&receiver_);
87 }
88
TEST_F(LogRouterTest,ProcessLog_TwoReceiversNoUpdateAfterUnregistering)89 TEST_F(LogRouterTest, ProcessLog_TwoReceiversNoUpdateAfterUnregistering) {
90 LogRouter router;
91 EXPECT_EQ(std::string(), router.RegisterReceiver(&receiver_));
92 EXPECT_EQ(std::string(), router.RegisterReceiver(&receiver2_));
93
94 // Check that no logs are passed to an unregistered receiver.
95 router.UnregisterReceiver(&receiver_);
96 EXPECT_CALL(receiver_, LogSavePasswordProgress(_)).Times(0);
97 EXPECT_CALL(receiver2_, LogSavePasswordProgress(kTestText)).Times(1);
98 router.ProcessLog(kTestText);
99 router.UnregisterReceiver(&receiver2_);
100 }
101
TEST_F(LogRouterTest,RegisterClient_NoReceivers)102 TEST_F(LogRouterTest, RegisterClient_NoReceivers) {
103 LogRouter router;
104 EXPECT_FALSE(router.RegisterClient(&client_));
105 router.UnregisterClient(&client_);
106 }
107
TEST_F(LogRouterTest,RegisterClient_OneReceiverBeforeClient)108 TEST_F(LogRouterTest, RegisterClient_OneReceiverBeforeClient) {
109 LogRouter router;
110 // First register a receiver.
111 EXPECT_EQ(std::string(), router.RegisterReceiver(&receiver_));
112 // The client should be told the LogRouter has some receivers.
113 EXPECT_TRUE(router.RegisterClient(&client_));
114 // Now unregister the reciever. The client should be told the LogRouter has no
115 // receivers.
116 EXPECT_CALL(client_, OnLogRouterAvailabilityChanged(false)).Times(1);
117 router.UnregisterReceiver(&receiver_);
118 router.UnregisterClient(&client_);
119 }
120
TEST_F(LogRouterTest,RegisterClient_OneClientBeforeReceiver)121 TEST_F(LogRouterTest, RegisterClient_OneClientBeforeReceiver) {
122 LogRouter router;
123 // First register a client; the client should be told the LogRouter has no
124 // receivers.
125 EXPECT_FALSE(router.RegisterClient(&client_));
126 // Now register the receiver. The client should be notified.
127 EXPECT_CALL(client_, OnLogRouterAvailabilityChanged(true)).Times(1);
128 EXPECT_EQ(std::string(), router.RegisterReceiver(&receiver_));
129 // Now unregister the client.
130 router.UnregisterClient(&client_);
131 // Now unregister the reciever. The client should not hear about it.
132 EXPECT_CALL(client_, OnLogRouterAvailabilityChanged(_)).Times(0);
133 router.UnregisterReceiver(&receiver_);
134 }
135
TEST_F(LogRouterTest,RegisterClient_OneClientTwoReceivers)136 TEST_F(LogRouterTest, RegisterClient_OneClientTwoReceivers) {
137 LogRouter router;
138 // First register a client; the client should be told the LogRouter has no
139 // receivers.
140 EXPECT_FALSE(router.RegisterClient(&client_));
141 // Now register the 1st receiver. The client should be notified.
142 EXPECT_CALL(client_, OnLogRouterAvailabilityChanged(true)).Times(1);
143 EXPECT_EQ(std::string(), router.RegisterReceiver(&receiver_));
144 // Now register the 2nd receiver. The client should not be notified.
145 EXPECT_CALL(client_, OnLogRouterAvailabilityChanged(true)).Times(0);
146 EXPECT_EQ(std::string(), router.RegisterReceiver(&receiver2_));
147 // Now unregister the 1st reciever. The client should not hear about it.
148 EXPECT_CALL(client_, OnLogRouterAvailabilityChanged(false)).Times(0);
149 router.UnregisterReceiver(&receiver_);
150 // Now unregister the 2nd reciever. The client should hear about it.
151 EXPECT_CALL(client_, OnLogRouterAvailabilityChanged(false)).Times(1);
152 router.UnregisterReceiver(&receiver2_);
153 // Now unregister the client.
154 router.UnregisterClient(&client_);
155 }
156
157 } // namespace password_manager
158