Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(321)

Side by Side Diff: extensions/browser/api/cast_channel/logger_unittest.cc

Issue 456213002: Cast channel: Add cast.channel.getLogs extension API. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed comments Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 int length = 0;
63 scoped_ptr<char[]> output = logger_->GetLogs(&length);
64 if (!output.get())
65 return scoped_ptr<Log>();
66
67 // 100kb should be enough for test purposes.
68 std::string uncompressed(100000, 0);
69 if (!Uncompress(output.get(), length, &uncompressed))
70 return scoped_ptr<Log>();
71
72 scoped_ptr<Log> log(new Log);
73 if (!log->ParseFromString(uncompressed))
74 return scoped_ptr<Log>();
75
76 return log.Pass();
77 }
78
28 protected: 79 protected:
29 base::SimpleTestTickClock* clock_; 80 base::SimpleTestTickClock* clock_;
30 scoped_refptr<Logger> logger_; 81 scoped_refptr<Logger> logger_;
31 }; 82 };
32 83
33 TEST_F(CastChannelLoggerTest, BasicLogging) { 84 TEST_F(CastChannelLoggerTest, BasicLogging) {
34 logger_->LogSocketEvent(1, EventType::CAST_SOCKET_CREATED); 85 logger_->LogSocketEvent(1, EventType::CAST_SOCKET_CREATED);
35 clock_->Advance(base::TimeDelta::FromMicroseconds(1)); 86 clock_->Advance(base::TimeDelta::FromMicroseconds(1));
36 logger_->LogSocketEventWithDetails( 87 logger_->LogSocketEventWithDetails(
37 1, EventType::TCP_SOCKET_CONNECT, "TCP socket"); 88 1, EventType::TCP_SOCKET_CONNECT, "TCP socket");
38 clock_->Advance(base::TimeDelta::FromMicroseconds(1)); 89 clock_->Advance(base::TimeDelta::FromMicroseconds(1));
39 logger_->LogSocketEvent(2, EventType::CAST_SOCKET_CREATED); 90 logger_->LogSocketEvent(2, EventType::CAST_SOCKET_CREATED);
40 clock_->Advance(base::TimeDelta::FromMicroseconds(1)); 91 clock_->Advance(base::TimeDelta::FromMicroseconds(1));
41 logger_->LogSocketEventWithRv(1, EventType::SSL_SOCKET_CONNECT, -1); 92 logger_->LogSocketEventWithRv(1, EventType::SSL_SOCKET_CONNECT, -1);
42 clock_->Advance(base::TimeDelta::FromMicroseconds(1)); 93 clock_->Advance(base::TimeDelta::FromMicroseconds(1));
43 logger_->LogSocketEventForMessage( 94 logger_->LogSocketEventForMessage(
44 2, EventType::MESSAGE_ENQUEUED, "foo_namespace", "details"); 95 2, EventType::MESSAGE_ENQUEUED, "foo_namespace", "details");
45 clock_->Advance(base::TimeDelta::FromMicroseconds(1)); 96 clock_->Advance(base::TimeDelta::FromMicroseconds(1));
46 97
47 AuthResult auth_result = 98 AuthResult auth_result =
48 AuthResult::Create("No response", AuthResult::ERROR_NO_RESPONSE); 99 AuthResult::Create("No response", AuthResult::ERROR_NO_RESPONSE);
49 100
50 logger_->LogSocketChallengeReplyEvent(2, auth_result); 101 logger_->LogSocketChallengeReplyEvent(2, auth_result);
51 clock_->Advance(base::TimeDelta::FromMicroseconds(1)); 102 clock_->Advance(base::TimeDelta::FromMicroseconds(1));
52 103
53 auth_result = AuthResult::CreateWithNSSError( 104 auth_result = AuthResult::CreateWithNSSError(
54 "Parsing failed", AuthResult::ERROR_NSS_CERT_PARSING_FAILED, 4); 105 "Parsing failed", AuthResult::ERROR_NSS_CERT_PARSING_FAILED, 4);
55 logger_->LogSocketChallengeReplyEvent(2, auth_result); 106 logger_->LogSocketChallengeReplyEvent(2, auth_result);
56 107
57 std::string output; 108 scoped_ptr<Log> log = GetLog();
58 bool success = logger_->LogToString(&output); 109 ASSERT_TRUE(log.get() != NULL);
mark a. foltz 2014/08/14 00:09:38 Sorry, to be clear the ASSERTs would move into Get
imcheng 2014/08/14 00:59:19 Done.
59 ASSERT_TRUE(success);
60 110
61 Log log; 111 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 { 112 {
67 const AggregatedSocketEvent& aggregated_socket_event = 113 const AggregatedSocketEvent& aggregated_socket_event =
68 log.aggregated_socket_event(0); 114 log->aggregated_socket_event(0);
69 EXPECT_EQ(1, aggregated_socket_event.id()); 115 EXPECT_EQ(1, aggregated_socket_event.id());
70 EXPECT_EQ(3, aggregated_socket_event.socket_event_size()); 116 EXPECT_EQ(3, aggregated_socket_event.socket_event_size());
71 { 117 {
72 const SocketEvent& event = aggregated_socket_event.socket_event(0); 118 const SocketEvent& event = aggregated_socket_event.socket_event(0);
73 EXPECT_EQ(EventType::CAST_SOCKET_CREATED, event.type()); 119 EXPECT_EQ(EventType::CAST_SOCKET_CREATED, event.type());
74 EXPECT_EQ(0, event.timestamp_micros()); 120 EXPECT_EQ(0, event.timestamp_micros());
75 } 121 }
76 { 122 {
77 const SocketEvent& event = aggregated_socket_event.socket_event(1); 123 const SocketEvent& event = aggregated_socket_event.socket_event(1);
78 EXPECT_EQ(EventType::TCP_SOCKET_CONNECT, event.type()); 124 EXPECT_EQ(EventType::TCP_SOCKET_CONNECT, event.type());
79 EXPECT_EQ(1, event.timestamp_micros()); 125 EXPECT_EQ(1, event.timestamp_micros());
80 EXPECT_EQ("TCP socket", event.details()); 126 EXPECT_EQ("TCP socket", event.details());
81 } 127 }
82 { 128 {
83 const SocketEvent& event = aggregated_socket_event.socket_event(2); 129 const SocketEvent& event = aggregated_socket_event.socket_event(2);
84 EXPECT_EQ(EventType::SSL_SOCKET_CONNECT, event.type()); 130 EXPECT_EQ(EventType::SSL_SOCKET_CONNECT, event.type());
85 EXPECT_EQ(3, event.timestamp_micros()); 131 EXPECT_EQ(3, event.timestamp_micros());
86 EXPECT_EQ(-1, event.return_value()); 132 EXPECT_EQ(-1, event.return_value());
87 } 133 }
88 } 134 }
89 { 135 {
90 const AggregatedSocketEvent& aggregated_socket_event = 136 const AggregatedSocketEvent& aggregated_socket_event =
91 log.aggregated_socket_event(1); 137 log->aggregated_socket_event(1);
92 EXPECT_EQ(2, aggregated_socket_event.id()); 138 EXPECT_EQ(2, aggregated_socket_event.id());
93 EXPECT_EQ(4, aggregated_socket_event.socket_event_size()); 139 EXPECT_EQ(4, aggregated_socket_event.socket_event_size());
94 { 140 {
95 const SocketEvent& event = aggregated_socket_event.socket_event(0); 141 const SocketEvent& event = aggregated_socket_event.socket_event(0);
96 EXPECT_EQ(EventType::CAST_SOCKET_CREATED, event.type()); 142 EXPECT_EQ(EventType::CAST_SOCKET_CREATED, event.type());
97 EXPECT_EQ(2, event.timestamp_micros()); 143 EXPECT_EQ(2, event.timestamp_micros());
98 } 144 }
99 { 145 {
100 const SocketEvent& event = aggregated_socket_event.socket_event(1); 146 const SocketEvent& event = aggregated_socket_event.socket_event(1);
101 EXPECT_EQ(EventType::MESSAGE_ENQUEUED, event.type()); 147 EXPECT_EQ(EventType::MESSAGE_ENQUEUED, event.type());
(...skipping 18 matching lines...) Expand all
120 EXPECT_EQ(4, event.return_value()); 166 EXPECT_EQ(4, event.return_value());
121 } 167 }
122 } 168 }
123 } 169 }
124 170
125 TEST_F(CastChannelLoggerTest, TooManySockets) { 171 TEST_F(CastChannelLoggerTest, TooManySockets) {
126 for (int i = 0; i < kMaxSocketsToLog + 5; i++) { 172 for (int i = 0; i < kMaxSocketsToLog + 5; i++) {
127 logger_->LogSocketEvent(i, EventType::CAST_SOCKET_CREATED); 173 logger_->LogSocketEvent(i, EventType::CAST_SOCKET_CREATED);
128 } 174 }
129 175
130 std::string output; 176 scoped_ptr<Log> log = GetLog();
131 bool success = logger_->LogToString(&output); 177 ASSERT_TRUE(log.get() != NULL);
132 ASSERT_TRUE(success);
133 178
134 Log log; 179 ASSERT_EQ(kMaxSocketsToLog, log->aggregated_socket_event_size());
135 success = log.ParseFromString(output); 180 EXPECT_EQ(5, log->num_evicted_aggregated_socket_events());
136 ASSERT_TRUE(success); 181 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 182
142 const AggregatedSocketEvent& aggregated_socket_event = 183 const AggregatedSocketEvent& aggregated_socket_event =
143 log.aggregated_socket_event(0); 184 log->aggregated_socket_event(0);
144 EXPECT_EQ(5, aggregated_socket_event.id()); 185 EXPECT_EQ(5, aggregated_socket_event.id());
145 } 186 }
146 187
147 TEST_F(CastChannelLoggerTest, TooManyEvents) { 188 TEST_F(CastChannelLoggerTest, TooManyEvents) {
148 for (int i = 0; i < kMaxEventsPerSocket + 5; i++) { 189 for (int i = 0; i < kMaxEventsPerSocket + 5; i++) {
149 logger_->LogSocketEvent(1, EventType::CAST_SOCKET_CREATED); 190 logger_->LogSocketEvent(1, EventType::CAST_SOCKET_CREATED);
150 clock_->Advance(base::TimeDelta::FromMicroseconds(1)); 191 clock_->Advance(base::TimeDelta::FromMicroseconds(1));
151 } 192 }
152 193
153 std::string output; 194 scoped_ptr<Log> log = GetLog();
154 bool success = logger_->LogToString(&output); 195 ASSERT_TRUE(log.get() != NULL);
155 ASSERT_TRUE(success);
156 196
157 Log log; 197 ASSERT_EQ(1, log->aggregated_socket_event_size());
158 success = log.ParseFromString(output); 198 EXPECT_EQ(0, log->num_evicted_aggregated_socket_events());
159 ASSERT_TRUE(success); 199 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 200
165 const AggregatedSocketEvent& aggregated_socket_event = 201 const AggregatedSocketEvent& aggregated_socket_event =
166 log.aggregated_socket_event(0); 202 log->aggregated_socket_event(0);
167 ASSERT_EQ(kMaxEventsPerSocket, aggregated_socket_event.socket_event_size()); 203 ASSERT_EQ(kMaxEventsPerSocket, aggregated_socket_event.socket_event_size());
168 EXPECT_EQ(5, aggregated_socket_event.socket_event(0).timestamp_micros()); 204 EXPECT_EQ(5, aggregated_socket_event.socket_event(0).timestamp_micros());
169 } 205 }
170 206
171 TEST_F(CastChannelLoggerTest, Reset) { 207 TEST_F(CastChannelLoggerTest, Reset) {
172 logger_->LogSocketEvent(1, EventType::CAST_SOCKET_CREATED); 208 logger_->LogSocketEvent(1, EventType::CAST_SOCKET_CREATED);
173 209
174 std::string output; 210 scoped_ptr<Log> log = GetLog();
175 bool success = logger_->LogToString(&output); 211 ASSERT_TRUE(log.get() != NULL);
176 ASSERT_TRUE(success);
177 212
178 Log log; 213 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 214
184 logger_->Reset(); 215 logger_->Reset();
185 216
186 success = logger_->LogToString(&output); 217 log = GetLog();
187 ASSERT_TRUE(success); 218 ASSERT_TRUE(log.get() != NULL);
188 success = log.ParseFromString(output);
189 ASSERT_TRUE(success);
190 219
191 EXPECT_EQ(0, log.aggregated_socket_event_size()); 220 EXPECT_EQ(0, log->aggregated_socket_event_size());
192 } 221 }
193 222
194 } // namespace cast_channel 223 } // namespace cast_channel
195 } // namespace api 224 } // namespace api
196 } // namespace extensions 225 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698