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
12using testing::_;
13
14namespace password_manager {
15
16namespace {
17
18const char kTestText[] = "abcd1234";
19
20class MockLogReceiver : public LogReceiver {
21 public:
22  MockLogReceiver() {}
23
24  MOCK_METHOD1(LogSavePasswordProgress, void(const std::string&));
25};
26
27class MockClient : public StubPasswordManagerClient {
28 public:
29  MOCK_METHOD1(OnLogRouterAvailabilityChanged, void(bool));
30};
31
32}  // namespace
33
34class LogRouterTest : public testing::Test {
35 protected:
36  testing::StrictMock<MockLogReceiver> receiver_;
37  testing::StrictMock<MockLogReceiver> receiver2_;
38  testing::StrictMock<MockClient> client_;
39};
40
41TEST_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
53TEST_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
62TEST_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
76TEST_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
89TEST_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
102TEST_F(LogRouterTest, RegisterClient_NoReceivers) {
103  LogRouter router;
104  EXPECT_FALSE(router.RegisterClient(&client_));
105  router.UnregisterClient(&client_);
106}
107
108TEST_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
121TEST_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
136TEST_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