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