Chromium Code Reviews| 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 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 Loading... | |
| 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 |
| OLD | NEW |