OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 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 "base/test/simple_test_tick_clock.h" | 5 #include "base/test/simple_test_tick_clock.h" |
6 #include "extensions/browser/api/cast_channel/cast_auth_util.h" | 6 #include "extensions/browser/api/cast_channel/cast_auth_util.h" |
7 #include "extensions/browser/api/cast_channel/logger.h" | 7 #include "extensions/browser/api/cast_channel/logger.h" |
8 #include "testing/gtest/include/gtest/gtest.h" | 8 #include "testing/gtest/include/gtest/gtest.h" |
9 #include "third_party/zlib/zlib.h" | |
9 | 10 |
10 namespace extensions { | 11 namespace extensions { |
11 namespace core_api { | 12 namespace core_api { |
12 namespace cast_channel { | 13 namespace cast_channel { |
13 | 14 |
14 using proto::AggregatedSocketEvent; | 15 using proto::AggregatedSocketEvent; |
15 using proto::EventType; | 16 using proto::EventType; |
16 using proto::Log; | 17 using proto::Log; |
17 using proto::SocketEvent; | 18 using proto::SocketEvent; |
18 | 19 |
19 class CastChannelLoggerTest : public testing::Test { | 20 class CastChannelLoggerTest : public testing::Test { |
20 public: | 21 public: |
21 // |logger_| will take ownership of |clock_|. | 22 // |logger_| will take ownership of |clock_|. |
22 CastChannelLoggerTest() | 23 CastChannelLoggerTest() |
23 : clock_(new base::SimpleTestTickClock), | 24 : clock_(new base::SimpleTestTickClock), |
24 logger_(new Logger(scoped_ptr<base::TickClock>(clock_), | 25 logger_(new Logger(scoped_ptr<base::TickClock>(clock_), |
25 base::TimeTicks())) {} | 26 base::TimeTicks())) {} |
26 virtual ~CastChannelLoggerTest() {} | 27 virtual ~CastChannelLoggerTest() {} |
27 | 28 |
29 bool Uncompress(const char* input, int length, std::string* output) { | |
30 z_stream stream = {0}; | |
31 | |
32 stream.next_in = reinterpret_cast<uint8*>(const_cast<char*>(input)); | |
33 stream.avail_in = length; | |
34 stream.next_out = reinterpret_cast<uint8*>(&(*output)[0]); | |
35 stream.avail_out = output->size(); | |
36 | |
37 bool success = false; | |
38 while (stream.avail_in > 0 && stream.avail_out > 0) { | |
39 // 16 is added to read in gzip format. | |
40 int result = inflateInit2(&stream, MAX_WBITS + 16); | |
41 DCHECK_EQ(Z_OK, result); | |
42 | |
43 result = inflate(&stream, Z_FINISH); | |
44 success = (result == Z_STREAM_END); | |
45 if (!success) { | |
46 DVLOG(2) << "inflate() failed. Result: " << result; | |
47 break; | |
48 } | |
49 | |
50 result = inflateEnd(&stream); | |
51 DCHECK(result == Z_OK); | |
52 } | |
53 | |
54 if (stream.avail_in == 0) { | |
55 success = true; | |
56 output->resize(output->size() - stream.avail_out); | |
57 } | |
58 return success; | |
59 } | |
60 | |
61 scoped_ptr<Log> GetLog() { | |
62 size_t length = 0; | |
63 scoped_ptr<char[]> output = logger_->GetLogs(&length); | |
64 ASSERT_TRUE(output.get() != NULL); | |
65 | |
66 // 100kb should be enough for test purposes. | |
Wez
2014/08/14 18:51:23
Do any of these tests even generate 10kb of data?
imcheng
2014/08/14 21:12:34
Changed to 20kb. 10kb wasn't enough for the evicti
| |
67 std::string uncompressed(100000, 0); | |
68 ASSERT_TRUE(Uncompress(output.get(), length, &uncompressed)); | |
69 | |
70 scoped_ptr<Log> log(new Log); | |
71 ASSERT_TRUE(log->ParseFromString(uncompressed)); | |
72 | |
73 return log.Pass(); | |
74 } | |
75 | |
28 protected: | 76 protected: |
29 base::SimpleTestTickClock* clock_; | 77 base::SimpleTestTickClock* clock_; |
30 scoped_refptr<Logger> logger_; | 78 scoped_refptr<Logger> logger_; |
31 }; | 79 }; |
32 | 80 |
33 TEST_F(CastChannelLoggerTest, BasicLogging) { | 81 TEST_F(CastChannelLoggerTest, BasicLogging) { |
34 logger_->LogSocketEvent(1, EventType::CAST_SOCKET_CREATED); | 82 logger_->LogSocketEvent(1, EventType::CAST_SOCKET_CREATED); |
35 clock_->Advance(base::TimeDelta::FromMicroseconds(1)); | 83 clock_->Advance(base::TimeDelta::FromMicroseconds(1)); |
36 logger_->LogSocketEventWithDetails( | 84 logger_->LogSocketEventWithDetails( |
37 1, EventType::TCP_SOCKET_CONNECT, "TCP socket"); | 85 1, EventType::TCP_SOCKET_CONNECT, "TCP socket"); |
38 clock_->Advance(base::TimeDelta::FromMicroseconds(1)); | 86 clock_->Advance(base::TimeDelta::FromMicroseconds(1)); |
39 logger_->LogSocketEvent(2, EventType::CAST_SOCKET_CREATED); | 87 logger_->LogSocketEvent(2, EventType::CAST_SOCKET_CREATED); |
40 clock_->Advance(base::TimeDelta::FromMicroseconds(1)); | 88 clock_->Advance(base::TimeDelta::FromMicroseconds(1)); |
41 logger_->LogSocketEventWithRv(1, EventType::SSL_SOCKET_CONNECT, -1); | 89 logger_->LogSocketEventWithRv(1, EventType::SSL_SOCKET_CONNECT, -1); |
42 clock_->Advance(base::TimeDelta::FromMicroseconds(1)); | 90 clock_->Advance(base::TimeDelta::FromMicroseconds(1)); |
43 logger_->LogSocketEventForMessage( | 91 logger_->LogSocketEventForMessage( |
44 2, EventType::MESSAGE_ENQUEUED, "foo_namespace", "details"); | 92 2, EventType::MESSAGE_ENQUEUED, "foo_namespace", "details"); |
45 clock_->Advance(base::TimeDelta::FromMicroseconds(1)); | 93 clock_->Advance(base::TimeDelta::FromMicroseconds(1)); |
46 | 94 |
47 AuthResult auth_result = | 95 AuthResult auth_result = |
48 AuthResult::Create("No response", AuthResult::ERROR_NO_RESPONSE); | 96 AuthResult::Create("No response", AuthResult::ERROR_NO_RESPONSE); |
49 | 97 |
50 logger_->LogSocketChallengeReplyEvent(2, auth_result); | 98 logger_->LogSocketChallengeReplyEvent(2, auth_result); |
51 clock_->Advance(base::TimeDelta::FromMicroseconds(1)); | 99 clock_->Advance(base::TimeDelta::FromMicroseconds(1)); |
52 | 100 |
53 auth_result = AuthResult::CreateWithNSSError( | 101 auth_result = AuthResult::CreateWithNSSError( |
54 "Parsing failed", AuthResult::ERROR_NSS_CERT_PARSING_FAILED, 4); | 102 "Parsing failed", AuthResult::ERROR_NSS_CERT_PARSING_FAILED, 4); |
55 logger_->LogSocketChallengeReplyEvent(2, auth_result); | 103 logger_->LogSocketChallengeReplyEvent(2, auth_result); |
56 | 104 |
57 std::string output; | 105 scoped_ptr<Log> log = GetLog(); |
58 bool success = logger_->LogToString(&output); | |
59 ASSERT_TRUE(success); | |
60 | 106 |
61 Log log; | 107 ASSERT_EQ(2, log->aggregated_socket_event_size()); |
62 success = log.ParseFromString(output); | |
63 ASSERT_TRUE(success); | |
64 | |
65 ASSERT_EQ(2, log.aggregated_socket_event_size()); | |
66 { | 108 { |
67 const AggregatedSocketEvent& aggregated_socket_event = | 109 const AggregatedSocketEvent& aggregated_socket_event = |
68 log.aggregated_socket_event(0); | 110 log->aggregated_socket_event(0); |
69 EXPECT_EQ(1, aggregated_socket_event.id()); | 111 EXPECT_EQ(1, aggregated_socket_event.id()); |
70 EXPECT_EQ(3, aggregated_socket_event.socket_event_size()); | 112 EXPECT_EQ(3, aggregated_socket_event.socket_event_size()); |
71 { | 113 { |
72 const SocketEvent& event = aggregated_socket_event.socket_event(0); | 114 const SocketEvent& event = aggregated_socket_event.socket_event(0); |
73 EXPECT_EQ(EventType::CAST_SOCKET_CREATED, event.type()); | 115 EXPECT_EQ(EventType::CAST_SOCKET_CREATED, event.type()); |
74 EXPECT_EQ(0, event.timestamp_micros()); | 116 EXPECT_EQ(0, event.timestamp_micros()); |
75 } | 117 } |
76 { | 118 { |
77 const SocketEvent& event = aggregated_socket_event.socket_event(1); | 119 const SocketEvent& event = aggregated_socket_event.socket_event(1); |
78 EXPECT_EQ(EventType::TCP_SOCKET_CONNECT, event.type()); | 120 EXPECT_EQ(EventType::TCP_SOCKET_CONNECT, event.type()); |
79 EXPECT_EQ(1, event.timestamp_micros()); | 121 EXPECT_EQ(1, event.timestamp_micros()); |
80 EXPECT_EQ("TCP socket", event.details()); | 122 EXPECT_EQ("TCP socket", event.details()); |
81 } | 123 } |
82 { | 124 { |
83 const SocketEvent& event = aggregated_socket_event.socket_event(2); | 125 const SocketEvent& event = aggregated_socket_event.socket_event(2); |
84 EXPECT_EQ(EventType::SSL_SOCKET_CONNECT, event.type()); | 126 EXPECT_EQ(EventType::SSL_SOCKET_CONNECT, event.type()); |
85 EXPECT_EQ(3, event.timestamp_micros()); | 127 EXPECT_EQ(3, event.timestamp_micros()); |
86 EXPECT_EQ(-1, event.return_value()); | 128 EXPECT_EQ(-1, event.return_value()); |
87 } | 129 } |
88 } | 130 } |
89 { | 131 { |
90 const AggregatedSocketEvent& aggregated_socket_event = | 132 const AggregatedSocketEvent& aggregated_socket_event = |
91 log.aggregated_socket_event(1); | 133 log->aggregated_socket_event(1); |
92 EXPECT_EQ(2, aggregated_socket_event.id()); | 134 EXPECT_EQ(2, aggregated_socket_event.id()); |
93 EXPECT_EQ(4, aggregated_socket_event.socket_event_size()); | 135 EXPECT_EQ(4, aggregated_socket_event.socket_event_size()); |
94 { | 136 { |
95 const SocketEvent& event = aggregated_socket_event.socket_event(0); | 137 const SocketEvent& event = aggregated_socket_event.socket_event(0); |
96 EXPECT_EQ(EventType::CAST_SOCKET_CREATED, event.type()); | 138 EXPECT_EQ(EventType::CAST_SOCKET_CREATED, event.type()); |
97 EXPECT_EQ(2, event.timestamp_micros()); | 139 EXPECT_EQ(2, event.timestamp_micros()); |
98 } | 140 } |
99 { | 141 { |
100 const SocketEvent& event = aggregated_socket_event.socket_event(1); | 142 const SocketEvent& event = aggregated_socket_event.socket_event(1); |
101 EXPECT_EQ(EventType::MESSAGE_ENQUEUED, event.type()); | 143 EXPECT_EQ(EventType::MESSAGE_ENQUEUED, event.type()); |
(...skipping 18 matching lines...) Expand all Loading... | |
120 EXPECT_EQ(4, event.return_value()); | 162 EXPECT_EQ(4, event.return_value()); |
121 } | 163 } |
122 } | 164 } |
123 } | 165 } |
124 | 166 |
125 TEST_F(CastChannelLoggerTest, TooManySockets) { | 167 TEST_F(CastChannelLoggerTest, TooManySockets) { |
126 for (int i = 0; i < kMaxSocketsToLog + 5; i++) { | 168 for (int i = 0; i < kMaxSocketsToLog + 5; i++) { |
127 logger_->LogSocketEvent(i, EventType::CAST_SOCKET_CREATED); | 169 logger_->LogSocketEvent(i, EventType::CAST_SOCKET_CREATED); |
128 } | 170 } |
129 | 171 |
130 std::string output; | 172 scoped_ptr<Log> log = GetLog(); |
131 bool success = logger_->LogToString(&output); | |
132 ASSERT_TRUE(success); | |
133 | 173 |
134 Log log; | 174 ASSERT_EQ(kMaxSocketsToLog, log->aggregated_socket_event_size()); |
135 success = log.ParseFromString(output); | 175 EXPECT_EQ(5, log->num_evicted_aggregated_socket_events()); |
136 ASSERT_TRUE(success); | 176 EXPECT_EQ(5, log->num_evicted_socket_events()); |
137 | |
138 ASSERT_EQ(kMaxSocketsToLog, log.aggregated_socket_event_size()); | |
139 EXPECT_EQ(5, log.num_evicted_aggregated_socket_events()); | |
140 EXPECT_EQ(5, log.num_evicted_socket_events()); | |
141 | 177 |
142 const AggregatedSocketEvent& aggregated_socket_event = | 178 const AggregatedSocketEvent& aggregated_socket_event = |
143 log.aggregated_socket_event(0); | 179 log->aggregated_socket_event(0); |
144 EXPECT_EQ(5, aggregated_socket_event.id()); | 180 EXPECT_EQ(5, aggregated_socket_event.id()); |
145 } | 181 } |
146 | 182 |
147 TEST_F(CastChannelLoggerTest, TooManyEvents) { | 183 TEST_F(CastChannelLoggerTest, TooManyEvents) { |
148 for (int i = 0; i < kMaxEventsPerSocket + 5; i++) { | 184 for (int i = 0; i < kMaxEventsPerSocket + 5; i++) { |
149 logger_->LogSocketEvent(1, EventType::CAST_SOCKET_CREATED); | 185 logger_->LogSocketEvent(1, EventType::CAST_SOCKET_CREATED); |
150 clock_->Advance(base::TimeDelta::FromMicroseconds(1)); | 186 clock_->Advance(base::TimeDelta::FromMicroseconds(1)); |
151 } | 187 } |
152 | 188 |
153 std::string output; | 189 scoped_ptr<Log> log = GetLog(); |
154 bool success = logger_->LogToString(&output); | |
155 ASSERT_TRUE(success); | |
156 | 190 |
157 Log log; | 191 ASSERT_EQ(1, log->aggregated_socket_event_size()); |
158 success = log.ParseFromString(output); | 192 EXPECT_EQ(0, log->num_evicted_aggregated_socket_events()); |
159 ASSERT_TRUE(success); | 193 EXPECT_EQ(5, log->num_evicted_socket_events()); |
160 | |
161 ASSERT_EQ(1, log.aggregated_socket_event_size()); | |
162 EXPECT_EQ(0, log.num_evicted_aggregated_socket_events()); | |
163 EXPECT_EQ(5, log.num_evicted_socket_events()); | |
164 | 194 |
165 const AggregatedSocketEvent& aggregated_socket_event = | 195 const AggregatedSocketEvent& aggregated_socket_event = |
166 log.aggregated_socket_event(0); | 196 log->aggregated_socket_event(0); |
167 ASSERT_EQ(kMaxEventsPerSocket, aggregated_socket_event.socket_event_size()); | 197 ASSERT_EQ(kMaxEventsPerSocket, aggregated_socket_event.socket_event_size()); |
168 EXPECT_EQ(5, aggregated_socket_event.socket_event(0).timestamp_micros()); | 198 EXPECT_EQ(5, aggregated_socket_event.socket_event(0).timestamp_micros()); |
169 } | 199 } |
170 | 200 |
171 TEST_F(CastChannelLoggerTest, Reset) { | 201 TEST_F(CastChannelLoggerTest, Reset) { |
172 logger_->LogSocketEvent(1, EventType::CAST_SOCKET_CREATED); | 202 logger_->LogSocketEvent(1, EventType::CAST_SOCKET_CREATED); |
173 | 203 |
174 std::string output; | 204 scoped_ptr<Log> log = GetLog(); |
175 bool success = logger_->LogToString(&output); | |
176 ASSERT_TRUE(success); | |
177 | 205 |
178 Log log; | 206 EXPECT_EQ(1, log->aggregated_socket_event_size()); |
179 success = log.ParseFromString(output); | |
180 ASSERT_TRUE(success); | |
181 | |
182 EXPECT_EQ(1, log.aggregated_socket_event_size()); | |
183 | 207 |
184 logger_->Reset(); | 208 logger_->Reset(); |
185 | 209 |
186 success = logger_->LogToString(&output); | 210 log = GetLog(); |
187 ASSERT_TRUE(success); | |
188 success = log.ParseFromString(output); | |
189 ASSERT_TRUE(success); | |
190 | 211 |
191 EXPECT_EQ(0, log.aggregated_socket_event_size()); | 212 EXPECT_EQ(0, log->aggregated_socket_event_size()); |
192 } | 213 } |
193 | 214 |
194 } // namespace cast_channel | 215 } // namespace cast_channel |
195 } // namespace api | 216 } // namespace api |
196 } // namespace extensions | 217 } // namespace extensions |
OLD | NEW |