16e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 26e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 36e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// found in the LICENSE file. 46e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 56e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/test/simple_test_tick_clock.h" 66e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "extensions/browser/api/cast_channel/cast_auth_util.h" 76e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "extensions/browser/api/cast_channel/logger.h" 86e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "extensions/browser/api/cast_channel/logger_util.h" 96e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "third_party/zlib/zlib.h" 116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)namespace extensions { 136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)namespace core_api { 146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)namespace cast_channel { 156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)const int kTestNssErrorCode = -8164; 176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)using proto::AggregatedSocketEvent; 196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)using proto::EventType; 206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)using proto::Log; 216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)using proto::SocketEvent; 226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class CastChannelLoggerTest : public testing::Test { 246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) public: 256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // |logger_| will take ownership of |clock_|. 266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) CastChannelLoggerTest() 276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) : clock_(new base::SimpleTestTickClock), 286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) logger_(new Logger(scoped_ptr<base::TickClock>(clock_), 296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::TimeTicks())) {} 306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual ~CastChannelLoggerTest() {} 316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) bool Uncompress(const char* input, int length, std::string* output) { 336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) z_stream stream = {0}; 346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) stream.next_in = reinterpret_cast<uint8*>(const_cast<char*>(input)); 366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) stream.avail_in = length; 376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) stream.next_out = reinterpret_cast<uint8*>(&(*output)[0]); 386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) stream.avail_out = output->size(); 396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) bool success = false; 416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) while (stream.avail_in > 0 && stream.avail_out > 0) { 426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // 16 is added to read in gzip format. 436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) int result = inflateInit2(&stream, MAX_WBITS + 16); 446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DCHECK_EQ(Z_OK, result); 456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) result = inflate(&stream, Z_FINISH); 476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) success = (result == Z_STREAM_END); 486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (!success) { 496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DVLOG(2) << "inflate() failed. Result: " << result; 506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) break; 516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) result = inflateEnd(&stream); 546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DCHECK(result == Z_OK); 556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (stream.avail_in == 0) { 586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) success = true; 596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) output->resize(output->size() - stream.avail_out); 606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return success; 626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<Log> GetLog() { 656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) size_t length = 0; 666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<char[]> output = logger_->GetLogs(&length); 676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (!output.get()) 686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return scoped_ptr<Log>(); 696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // 20kb should be enough for test purposes. 716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) std::string uncompressed(20000, 0); 726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (!Uncompress(output.get(), length, &uncompressed)) 736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return scoped_ptr<Log>(); 746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<Log> log(new Log); 766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (!log->ParseFromString(uncompressed)) 776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return scoped_ptr<Log>(); 786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return log.Pass(); 806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) protected: 836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::SimpleTestTickClock* clock_; 846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_refptr<Logger> logger_; 856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}; 866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(CastChannelLoggerTest, BasicLogging) { 886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) logger_->LogSocketEvent(1, EventType::CAST_SOCKET_CREATED); 896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) clock_->Advance(base::TimeDelta::FromMicroseconds(1)); 906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) logger_->LogSocketEventWithDetails( 916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1, EventType::TCP_SOCKET_CONNECT, "TCP socket"); 926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) clock_->Advance(base::TimeDelta::FromMicroseconds(1)); 936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) logger_->LogSocketEvent(2, EventType::CAST_SOCKET_CREATED); 946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) clock_->Advance(base::TimeDelta::FromMicroseconds(1)); 956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) logger_->LogSocketEventWithRv(1, EventType::SSL_SOCKET_CONNECT, -1); 966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) clock_->Advance(base::TimeDelta::FromMicroseconds(1)); 976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) logger_->LogSocketEventForMessage( 986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2, EventType::MESSAGE_ENQUEUED, "foo_namespace", "details"); 996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) clock_->Advance(base::TimeDelta::FromMicroseconds(1)); 1006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) AuthResult auth_result = 1026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) AuthResult::Create("No response", AuthResult::ERROR_NO_RESPONSE); 1036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) logger_->LogSocketChallengeReplyEvent(2, auth_result); 1056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) clock_->Advance(base::TimeDelta::FromMicroseconds(1)); 1066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) auth_result = 1086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) AuthResult::CreateWithNSSError("Parsing failed", 1096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) AuthResult::ERROR_NSS_CERT_PARSING_FAILED, 1106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) kTestNssErrorCode); 1116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) logger_->LogSocketChallengeReplyEvent(2, auth_result); 1126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) LastErrors last_errors = logger_->GetLastErrors(2); 1146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(last_errors.event_type, proto::AUTH_CHALLENGE_REPLY); 1156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(last_errors.net_return_value, 0); 1166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(last_errors.challenge_reply_error_type, 1176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) proto::CHALLENGE_REPLY_ERROR_NSS_CERT_PARSING_FAILED); 1186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(last_errors.nss_error_code, kTestNssErrorCode); 1196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<Log> log = GetLog(); 1216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ASSERT_TRUE(log.get() != NULL); 1226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ASSERT_EQ(2, log->aggregated_socket_event_size()); 1246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) { 1256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const AggregatedSocketEvent& aggregated_socket_event = 1266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) log->aggregated_socket_event(0); 1276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(1, aggregated_socket_event.id()); 1286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(3, aggregated_socket_event.socket_event_size()); 1296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) { 1306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const SocketEvent& event = aggregated_socket_event.socket_event(0); 1316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(EventType::CAST_SOCKET_CREATED, event.type()); 1326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(0, event.timestamp_micros()); 1336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 1346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) { 1356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const SocketEvent& event = aggregated_socket_event.socket_event(1); 1366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(EventType::TCP_SOCKET_CONNECT, event.type()); 1376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(1, event.timestamp_micros()); 1386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ("TCP socket", event.details()); 1396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 1406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) { 1416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const SocketEvent& event = aggregated_socket_event.socket_event(2); 1426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(EventType::SSL_SOCKET_CONNECT, event.type()); 1436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(3, event.timestamp_micros()); 1446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(-1, event.net_return_value()); 1456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 1466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 1476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) { 1486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const AggregatedSocketEvent& aggregated_socket_event = 1496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) log->aggregated_socket_event(1); 1506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(2, aggregated_socket_event.id()); 1516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(4, aggregated_socket_event.socket_event_size()); 1526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) { 1536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const SocketEvent& event = aggregated_socket_event.socket_event(0); 1546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(EventType::CAST_SOCKET_CREATED, event.type()); 1556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(2, event.timestamp_micros()); 1566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 1576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) { 1586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const SocketEvent& event = aggregated_socket_event.socket_event(1); 1596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(EventType::MESSAGE_ENQUEUED, event.type()); 1606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(4, event.timestamp_micros()); 1616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_FALSE(event.has_message_namespace()); 1626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ("details", event.details()); 1636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 1646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) { 1656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const SocketEvent& event = aggregated_socket_event.socket_event(2); 1666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(EventType::AUTH_CHALLENGE_REPLY, event.type()); 1676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(5, event.timestamp_micros()); 1686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(proto::CHALLENGE_REPLY_ERROR_NO_RESPONSE, 1696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) event.challenge_reply_error_type()); 1706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_FALSE(event.has_net_return_value()); 1716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_FALSE(event.has_nss_error_code()); 1726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 1736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) { 1746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const SocketEvent& event = aggregated_socket_event.socket_event(3); 1756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(EventType::AUTH_CHALLENGE_REPLY, event.type()); 1766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(6, event.timestamp_micros()); 1776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(proto::CHALLENGE_REPLY_ERROR_NSS_CERT_PARSING_FAILED, 1786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) event.challenge_reply_error_type()); 1796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_FALSE(event.has_net_return_value()); 1806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(kTestNssErrorCode, event.nss_error_code()); 1816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 1826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 1836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 1846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(CastChannelLoggerTest, LogSocketReadWrite) { 1866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) logger_->LogSocketEventWithRv(1, EventType::SOCKET_READ, 50); 1876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) clock_->Advance(base::TimeDelta::FromMicroseconds(1)); 1886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) logger_->LogSocketEventWithRv(1, EventType::SOCKET_READ, 30); 1896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) clock_->Advance(base::TimeDelta::FromMicroseconds(1)); 1906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) logger_->LogSocketEventWithRv(1, EventType::SOCKET_READ, -1); 1916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) clock_->Advance(base::TimeDelta::FromMicroseconds(1)); 1926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) logger_->LogSocketEventWithRv(1, EventType::SOCKET_WRITE, 20); 1936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) clock_->Advance(base::TimeDelta::FromMicroseconds(1)); 1946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) logger_->LogSocketEventWithRv(2, EventType::SOCKET_READ, 100); 1966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) clock_->Advance(base::TimeDelta::FromMicroseconds(1)); 1976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) logger_->LogSocketEventWithRv(2, EventType::SOCKET_WRITE, 100); 1986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) clock_->Advance(base::TimeDelta::FromMicroseconds(1)); 1996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) logger_->LogSocketEventWithRv(2, EventType::SOCKET_WRITE, -5); 2006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) clock_->Advance(base::TimeDelta::FromMicroseconds(1)); 2016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<Log> log = GetLog(); 2036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ASSERT_TRUE(log.get() != NULL); 2046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ASSERT_EQ(2, log->aggregated_socket_event_size()); 2066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) { 2076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const AggregatedSocketEvent& aggregated_socket_event = 2086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) log->aggregated_socket_event(0); 2096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(1, aggregated_socket_event.id()); 2106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(4, aggregated_socket_event.socket_event_size()); 2116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(80, aggregated_socket_event.bytes_read()); 2126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(20, aggregated_socket_event.bytes_written()); 2136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 2146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) { 2156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const AggregatedSocketEvent& aggregated_socket_event = 2166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) log->aggregated_socket_event(1); 2176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(2, aggregated_socket_event.id()); 2186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(3, aggregated_socket_event.socket_event_size()); 2196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(100, aggregated_socket_event.bytes_read()); 2206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(100, aggregated_socket_event.bytes_written()); 2216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 2226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 2236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(CastChannelLoggerTest, TooManySockets) { 2256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) for (int i = 0; i < kMaxSocketsToLog + 5; i++) { 2266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) logger_->LogSocketEvent(i, EventType::CAST_SOCKET_CREATED); 2276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 2286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<Log> log = GetLog(); 2306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ASSERT_TRUE(log.get() != NULL); 2316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ASSERT_EQ(kMaxSocketsToLog, log->aggregated_socket_event_size()); 2336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(5, log->num_evicted_aggregated_socket_events()); 2346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(5, log->num_evicted_socket_events()); 2356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const AggregatedSocketEvent& aggregated_socket_event = 2376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) log->aggregated_socket_event(0); 2386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(5, aggregated_socket_event.id()); 2396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 2406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(CastChannelLoggerTest, TooManyEvents) { 2426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) for (int i = 0; i < kMaxEventsPerSocket + 5; i++) { 2436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) logger_->LogSocketEvent(1, EventType::CAST_SOCKET_CREATED); 2446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) clock_->Advance(base::TimeDelta::FromMicroseconds(1)); 2456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 2466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<Log> log = GetLog(); 2486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ASSERT_TRUE(log.get() != NULL); 2496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ASSERT_EQ(1, log->aggregated_socket_event_size()); 2516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(0, log->num_evicted_aggregated_socket_events()); 2526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(5, log->num_evicted_socket_events()); 2536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const AggregatedSocketEvent& aggregated_socket_event = 2556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) log->aggregated_socket_event(0); 2566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ASSERT_EQ(kMaxEventsPerSocket, aggregated_socket_event.socket_event_size()); 2576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(5, aggregated_socket_event.socket_event(0).timestamp_micros()); 2586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 2596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(CastChannelLoggerTest, Reset) { 2616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) logger_->LogSocketEvent(1, EventType::CAST_SOCKET_CREATED); 2626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<Log> log = GetLog(); 2646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ASSERT_TRUE(log.get() != NULL); 2656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(1, log->aggregated_socket_event_size()); 2676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) logger_->Reset(); 2696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) log = GetLog(); 2716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ASSERT_TRUE(log.get() != NULL); 2726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(0, log->aggregated_socket_event_size()); 2746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 2756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} // namespace cast_channel 2776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} // namespace api 2786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} // namespace extensions 279