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