OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "remoting/client/client_telemetry_logger.h" | 5 #include "remoting/client/client_telemetry_logger.h" |
6 | 6 |
7 #include <deque> | 7 #include <deque> |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
| 11 #include "base/memory/weak_ptr.h" |
11 #include "remoting/protocol/connection_to_host.h" | 12 #include "remoting/protocol/connection_to_host.h" |
12 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" |
13 | 14 |
14 namespace { | 15 namespace { |
15 | 16 |
16 // Returns true if |actual| has all fields that |expected| has and the values | 17 // Returns true if |actual| has all fields that |expected| has and the values |
17 // also match. |actual| can have fields that |expected| doesn't have but not the | 18 // also match. |actual| can have fields that |expected| doesn't have but not the |
18 // other way around. | 19 // other way around. |
19 static bool Contains(const remoting::ChromotingEvent& actual, | 20 static bool Contains(const remoting::ChromotingEvent& actual, |
20 const remoting::ChromotingEvent& expected) { | 21 const remoting::ChromotingEvent& expected) { |
(...skipping 19 matching lines...) Expand all Loading... |
40 | 41 |
41 namespace remoting { | 42 namespace remoting { |
42 | 43 |
43 // The fake log writer will pass the test IFF: | 44 // The fake log writer will pass the test IFF: |
44 // 1. The caller logs an entry when the writer expects an entry to be logged. | 45 // 1. The caller logs an entry when the writer expects an entry to be logged. |
45 // 2. The caller logs an entry with all key-value pairs found in the expected | 46 // 2. The caller logs an entry with all key-value pairs found in the expected |
46 // entry. | 47 // entry. |
47 // 3. There are no more expected log entries when the writer destructs. | 48 // 3. There are no more expected log entries when the writer destructs. |
48 class FakeLogWriter : public ChromotingEventLogWriter { | 49 class FakeLogWriter : public ChromotingEventLogWriter { |
49 public: | 50 public: |
| 51 FakeLogWriter(); |
| 52 |
50 ~FakeLogWriter() override { | 53 ~FakeLogWriter() override { |
51 EXPECT_TRUE(expected_events_.empty()) << "Sent less logs than expected."; | 54 EXPECT_TRUE(expected_events_.empty()) << "Sent less logs than expected."; |
52 } | 55 } |
53 | 56 |
54 // Add the event to |expected_events_|. Log() will only succeed IFF the actual | 57 // Add the event to |expected_events_|. Log() will only succeed IFF the actual |
55 // entry has all fields that the expected entry (first entry in | 58 // entry has all fields that the expected entry (first entry in |
56 // |expected_events|) has and the values also match. The actual entry can have | 59 // |expected_events|) has and the values also match. The actual entry can have |
57 // more fields in addition to those in the expected entry. | 60 // more fields in addition to those in the expected entry. |
58 void AddExpectedEvent(const ChromotingEvent& entry); | 61 void AddExpectedEvent(const ChromotingEvent& entry); |
59 | 62 |
| 63 base::WeakPtr<FakeLogWriter> GetWeakPtr(); |
| 64 |
60 // ChromotingEventLogWriter overrides. | 65 // ChromotingEventLogWriter overrides. |
61 void Log(const ChromotingEvent& entry) override; | 66 void Log(const ChromotingEvent& entry) override; |
62 void SetAuthToken(const std::string& auth_token) override; | 67 void SetAuthToken(const std::string& auth_token) override; |
63 void SetAuthClosure(const base::Closure& closure) override; | 68 void SetAuthClosure(const base::Closure& closure) override; |
64 | 69 |
65 const std::string& auth_token() const { return auth_token_; } | 70 const std::string& auth_token() const { return auth_token_; } |
66 const base::Closure& auth_closure() const { return auth_closure_; } | 71 const base::Closure& auth_closure() const { return auth_closure_; } |
67 | 72 |
68 private: | 73 private: |
69 std::deque<ChromotingEvent> expected_events_; | 74 std::deque<ChromotingEvent> expected_events_; |
70 std::string auth_token_; | 75 std::string auth_token_; |
71 base::Closure auth_closure_; | 76 base::Closure auth_closure_; |
| 77 base::WeakPtrFactory<FakeLogWriter> weak_factory_; |
72 }; | 78 }; |
73 | 79 |
| 80 FakeLogWriter::FakeLogWriter() : weak_factory_(this) { |
| 81 } |
| 82 |
74 void FakeLogWriter::AddExpectedEvent(const ChromotingEvent& entry) { | 83 void FakeLogWriter::AddExpectedEvent(const ChromotingEvent& entry) { |
75 expected_events_.push_back(entry); | 84 expected_events_.push_back(entry); |
76 } | 85 } |
77 | 86 |
| 87 base::WeakPtr<FakeLogWriter> FakeLogWriter::GetWeakPtr() { |
| 88 return weak_factory_.GetWeakPtr(); |
| 89 } |
| 90 |
78 void FakeLogWriter::Log(const ChromotingEvent& entry) { | 91 void FakeLogWriter::Log(const ChromotingEvent& entry) { |
79 ASSERT_FALSE(expected_events_.empty()) | 92 ASSERT_FALSE(expected_events_.empty()) |
80 << "Trying to send more logs than expected"; | 93 << "Trying to send more logs than expected"; |
81 ASSERT_TRUE(Contains(entry, expected_events_.front())) | 94 ASSERT_TRUE(Contains(entry, expected_events_.front())) |
82 << "Unexpected log being sent."; | 95 << "Unexpected log being sent."; |
83 expected_events_.pop_front(); | 96 expected_events_.pop_front(); |
84 } | 97 } |
85 | 98 |
86 void FakeLogWriter::SetAuthToken(const std::string& auth_token) { | 99 void FakeLogWriter::SetAuthToken(const std::string& auth_token) { |
87 auth_token_ = auth_token; | 100 auth_token_ = auth_token; |
88 } | 101 } |
89 | 102 |
90 void FakeLogWriter::SetAuthClosure(const base::Closure& closure) { | 103 void FakeLogWriter::SetAuthClosure(const base::Closure& closure) { |
91 auth_closure_ = closure; | 104 auth_closure_ = closure; |
92 } | 105 } |
93 | 106 |
94 class ClientTelemetryLoggerTest : public testing::Test { | 107 class ClientTelemetryLoggerTest : public testing::Test { |
95 public: | 108 public: |
96 // testing::Test override. | 109 // testing::Test override. |
97 void SetUp() override; | 110 void SetUp() override; |
98 | 111 |
99 protected: | 112 protected: |
100 // |log_writer_| will be owned by |logger_| and freed when |logger_| | 113 std::unique_ptr<FakeLogWriter> log_writer_; |
101 // destructs. Feel free to use this reference in the test. | |
102 FakeLogWriter* log_writer_ = nullptr; | |
103 std::unique_ptr<ClientTelemetryLogger> logger_; | 114 std::unique_ptr<ClientTelemetryLogger> logger_; |
104 }; | 115 }; |
105 | 116 |
106 void ClientTelemetryLoggerTest::SetUp() { | 117 void ClientTelemetryLoggerTest::SetUp() { |
107 log_writer_ = new FakeLogWriter(); | 118 log_writer_.reset(new FakeLogWriter()); |
108 logger_.reset(new ClientTelemetryLogger(ChromotingEvent::Mode::ME2ME)); | 119 logger_.reset(new ClientTelemetryLogger(log_writer_->GetWeakPtr(), |
109 logger_->StartForTest(base::WrapUnique(log_writer_)); | 120 ChromotingEvent::Mode::ME2ME)); |
110 } | 121 } |
111 | 122 |
112 TEST_F(ClientTelemetryLoggerTest, LogSessionStateChange) { | 123 TEST_F(ClientTelemetryLoggerTest, LogSessionStateChange) { |
113 ChromotingEvent event(ChromotingEvent::Type::SESSION_STATE); | 124 ChromotingEvent event(ChromotingEvent::Type::SESSION_STATE); |
114 event.SetEnum("session_state", ChromotingEvent::SessionState::CONNECTED); | 125 event.SetEnum("session_state", ChromotingEvent::SessionState::CONNECTED); |
115 event.SetEnum("connection_error", ChromotingEvent::ConnectionError::NONE); | 126 event.SetEnum("connection_error", ChromotingEvent::ConnectionError::NONE); |
116 log_writer_->AddExpectedEvent(event); | 127 log_writer_->AddExpectedEvent(event); |
117 logger_->LogSessionStateChange(ChromotingEvent::SessionState::CONNECTED, | 128 logger_->LogSessionStateChange(ChromotingEvent::SessionState::CONNECTED, |
118 ChromotingEvent::ConnectionError::NONE); | 129 ChromotingEvent::ConnectionError::NONE); |
119 | 130 |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
167 | 178 |
168 // kMaxSessionIdAgeDays = 1. Fake the generation time to be 2 days ago and | 179 // kMaxSessionIdAgeDays = 1. Fake the generation time to be 2 days ago and |
169 // force it to expire. | 180 // force it to expire. |
170 logger_->SetSessionIdGenerationTimeForTest(base::TimeTicks::Now() - | 181 logger_->SetSessionIdGenerationTimeForTest(base::TimeTicks::Now() - |
171 base::TimeDelta::FromDays(2)); | 182 base::TimeDelta::FromDays(2)); |
172 protocol::PerformanceTracker perf_tracker; | 183 protocol::PerformanceTracker perf_tracker; |
173 logger_->LogStatistics(&perf_tracker); | 184 logger_->LogStatistics(&perf_tracker); |
174 EXPECT_NE(last_id, logger_->session_id()); | 185 EXPECT_NE(last_id, logger_->session_id()); |
175 } | 186 } |
176 | 187 |
177 TEST_F(ClientTelemetryLoggerTest, PassesThroughAuthTokenAndClosure) { | |
178 std::string token("some token"); | |
179 base::Closure closure = base::Bind(&base::DoNothing); | |
180 logger_->SetAuthToken(token); | |
181 logger_->SetAuthClosure(closure); | |
182 EXPECT_EQ(token, log_writer_->auth_token()); | |
183 EXPECT_TRUE(closure.Equals(log_writer_->auth_closure())); | |
184 } | |
185 | |
186 } // namespace remoting | 188 } // namespace remoting |
OLD | NEW |