Index: extensions/browser/api/cast_channel/logger_unittest.cc |
diff --git a/extensions/browser/api/cast_channel/logger_unittest.cc b/extensions/browser/api/cast_channel/logger_unittest.cc |
index 6909644da120b5098712e669053aa9ccedd8535c..cf99f6a984ab9df95f38584b355a98185802e3d8 100644 |
--- a/extensions/browser/api/cast_channel/logger_unittest.cc |
+++ b/extensions/browser/api/cast_channel/logger_unittest.cc |
@@ -7,321 +7,65 @@ |
#include <string> |
-#include "base/test/simple_test_clock.h" |
#include "extensions/browser/api/cast_channel/cast_auth_util.h" |
#include "extensions/browser/api/cast_channel/logger.h" |
-#include "extensions/browser/api/cast_channel/logger_util.h" |
#include "net/base/net_errors.h" |
#include "testing/gtest/include/gtest/gtest.h" |
-#include "third_party/zlib/zlib.h" |
namespace extensions { |
namespace api { |
namespace cast_channel { |
-using proto::AggregatedSocketEvent; |
using proto::EventType; |
using proto::Log; |
using proto::SocketEvent; |
-class CastChannelLoggerTest : public testing::Test { |
- public: |
- // |logger_| will take ownership of |clock_|. |
- CastChannelLoggerTest() |
- : clock_(new base::SimpleTestClock), |
- logger_( |
- new Logger(std::unique_ptr<base::Clock>(clock_), base::Time())) {} |
- ~CastChannelLoggerTest() override {} |
+TEST(CastChannelLoggerTest, LogLastErrorEvents) { |
+ scoped_refptr<Logger> logger(new Logger()); |
- bool Uncompress(const char* input, int length, std::string* output) { |
- z_stream stream = {0}; |
- |
- stream.next_in = reinterpret_cast<uint8_t*>(const_cast<char*>(input)); |
- stream.avail_in = length; |
- stream.next_out = reinterpret_cast<uint8_t*>(&(*output)[0]); |
- stream.avail_out = output->size(); |
- |
- bool success = false; |
- while (stream.avail_in > 0 && stream.avail_out > 0) { |
- // 16 is added to read in gzip format. |
- int result = inflateInit2(&stream, MAX_WBITS + 16); |
- DCHECK_EQ(Z_OK, result); |
- |
- result = inflate(&stream, Z_FINISH); |
- success = (result == Z_STREAM_END); |
- if (!success) { |
- DVLOG(2) << "inflate() failed. Result: " << result; |
- break; |
- } |
- |
- result = inflateEnd(&stream); |
- DCHECK(result == Z_OK); |
- } |
- |
- if (stream.avail_in == 0) { |
- success = true; |
- output->resize(output->size() - stream.avail_out); |
- } |
- return success; |
- } |
- |
- std::unique_ptr<Log> GetLog() { |
- size_t length = 0; |
- std::unique_ptr<char[]> output = logger_->GetLogs(&length); |
- if (!output.get()) |
- return std::unique_ptr<Log>(); |
- |
- // 20kb should be enough for test purposes. |
- std::string uncompressed(20000, 0); |
- if (!Uncompress(output.get(), length, &uncompressed)) |
- return std::unique_ptr<Log>(); |
- |
- std::unique_ptr<Log> log(new Log); |
- if (!log->ParseFromString(uncompressed)) |
- return std::unique_ptr<Log>(); |
- |
- return log; |
- } |
- |
- protected: |
- base::SimpleTestClock* clock_; |
- scoped_refptr<Logger> logger_; |
-}; |
- |
-TEST_F(CastChannelLoggerTest, BasicLogging) { |
- logger_->LogSocketEvent(1, EventType::CAST_SOCKET_CREATED); |
- clock_->Advance(base::TimeDelta::FromMicroseconds(1)); |
- logger_->LogSocketEventWithDetails( |
- 1, EventType::TCP_SOCKET_CONNECT, "TCP socket"); |
- clock_->Advance(base::TimeDelta::FromMicroseconds(1)); |
- logger_->LogSocketEvent(2, EventType::CAST_SOCKET_CREATED); |
- clock_->Advance(base::TimeDelta::FromMicroseconds(1)); |
- logger_->LogSocketEventWithRv(1, EventType::SSL_SOCKET_CONNECT, -1); |
- clock_->Advance(base::TimeDelta::FromMicroseconds(1)); |
- logger_->LogSocketEventForMessage( |
- 2, EventType::MESSAGE_ENQUEUED, "foo_namespace", "details"); |
- clock_->Advance(base::TimeDelta::FromMicroseconds(1)); |
- |
- AuthResult auth_result = AuthResult::CreateWithParseError( |
- "No response", AuthResult::ERROR_NO_RESPONSE); |
- |
- logger_->LogSocketChallengeReplyEvent(2, auth_result); |
- clock_->Advance(base::TimeDelta::FromMicroseconds(1)); |
- |
- auth_result = |
- AuthResult("Parsing failed", AuthResult::ERROR_CERT_PARSING_FAILED); |
- logger_->LogSocketChallengeReplyEvent(2, auth_result); |
- |
- LastErrors last_errors = logger_->GetLastErrors(2); |
- EXPECT_EQ(last_errors.event_type, proto::AUTH_CHALLENGE_REPLY); |
- EXPECT_EQ(last_errors.net_return_value, net::OK); |
- EXPECT_EQ(last_errors.challenge_reply_error_type, |
- proto::CHALLENGE_REPLY_ERROR_CERT_PARSING_FAILED); |
- |
- std::unique_ptr<Log> log = GetLog(); |
- ASSERT_TRUE(log); |
- |
- ASSERT_EQ(2, log->aggregated_socket_event_size()); |
- { |
- const AggregatedSocketEvent& aggregated_socket_event = |
- log->aggregated_socket_event(0); |
- EXPECT_EQ(1, aggregated_socket_event.id()); |
- EXPECT_EQ(3, aggregated_socket_event.socket_event_size()); |
- { |
- const SocketEvent& event = aggregated_socket_event.socket_event(0); |
- EXPECT_EQ(EventType::CAST_SOCKET_CREATED, event.type()); |
- EXPECT_EQ(0, event.timestamp_micros()); |
- } |
- { |
- const SocketEvent& event = aggregated_socket_event.socket_event(1); |
- EXPECT_EQ(EventType::TCP_SOCKET_CONNECT, event.type()); |
- EXPECT_EQ(1, event.timestamp_micros()); |
- EXPECT_EQ("TCP socket", event.details()); |
- } |
- { |
- const SocketEvent& event = aggregated_socket_event.socket_event(2); |
- EXPECT_EQ(EventType::SSL_SOCKET_CONNECT, event.type()); |
- EXPECT_EQ(3, event.timestamp_micros()); |
- EXPECT_EQ(-1, event.net_return_value()); |
- } |
- } |
- { |
- const AggregatedSocketEvent& aggregated_socket_event = |
- log->aggregated_socket_event(1); |
- EXPECT_EQ(2, aggregated_socket_event.id()); |
- EXPECT_EQ(4, aggregated_socket_event.socket_event_size()); |
- { |
- const SocketEvent& event = aggregated_socket_event.socket_event(0); |
- EXPECT_EQ(EventType::CAST_SOCKET_CREATED, event.type()); |
- EXPECT_EQ(2, event.timestamp_micros()); |
- } |
- { |
- const SocketEvent& event = aggregated_socket_event.socket_event(1); |
- EXPECT_EQ(EventType::MESSAGE_ENQUEUED, event.type()); |
- EXPECT_EQ(4, event.timestamp_micros()); |
- EXPECT_FALSE(event.has_message_namespace()); |
- EXPECT_EQ("details", event.details()); |
- } |
- { |
- const SocketEvent& event = aggregated_socket_event.socket_event(2); |
- EXPECT_EQ(EventType::AUTH_CHALLENGE_REPLY, event.type()); |
- EXPECT_EQ(5, event.timestamp_micros()); |
- EXPECT_EQ(proto::CHALLENGE_REPLY_ERROR_NO_RESPONSE, |
- event.challenge_reply_error_type()); |
- EXPECT_FALSE(event.has_net_return_value()); |
- EXPECT_FALSE(event.has_nss_error_code()); |
- } |
- { |
- const SocketEvent& event = aggregated_socket_event.socket_event(3); |
- EXPECT_EQ(EventType::AUTH_CHALLENGE_REPLY, event.type()); |
- EXPECT_EQ(6, event.timestamp_micros()); |
- EXPECT_EQ(proto::CHALLENGE_REPLY_ERROR_CERT_PARSING_FAILED, |
- event.challenge_reply_error_type()); |
- EXPECT_FALSE(event.has_net_return_value()); |
- EXPECT_FALSE(event.has_nss_error_code()); |
- } |
- } |
-} |
- |
-TEST_F(CastChannelLoggerTest, LogLastErrorEvents) { |
// Net return value is set to an error |
- logger_->LogSocketEventWithRv( |
- 1, EventType::TCP_SOCKET_CONNECT, net::ERR_CONNECTION_FAILED); |
+ logger->LogSocketEventWithRv(1, EventType::TCP_SOCKET_CONNECT, |
+ net::ERR_CONNECTION_FAILED); |
- LastErrors last_errors = logger_->GetLastErrors(1); |
+ LastErrors last_errors = logger->GetLastErrors(1); |
EXPECT_EQ(last_errors.event_type, proto::TCP_SOCKET_CONNECT); |
EXPECT_EQ(last_errors.net_return_value, net::ERR_CONNECTION_FAILED); |
// Challenge reply error set |
- clock_->Advance(base::TimeDelta::FromMicroseconds(1)); |
AuthResult auth_result = AuthResult::CreateWithParseError( |
"Some error", AuthResult::ErrorType::ERROR_PEER_CERT_EMPTY); |
- logger_->LogSocketChallengeReplyEvent(2, auth_result); |
- last_errors = logger_->GetLastErrors(2); |
+ logger->LogSocketChallengeReplyEvent(2, auth_result); |
+ last_errors = logger->GetLastErrors(2); |
EXPECT_EQ(last_errors.event_type, proto::AUTH_CHALLENGE_REPLY); |
EXPECT_EQ(last_errors.challenge_reply_error_type, |
proto::CHALLENGE_REPLY_ERROR_PEER_CERT_EMPTY); |
// Logging a non-error event does not set the LastErrors for the channel. |
- clock_->Advance(base::TimeDelta::FromMicroseconds(1)); |
- logger_->LogSocketEventWithRv(3, EventType::TCP_SOCKET_CONNECT, net::OK); |
- last_errors = logger_->GetLastErrors(3); |
+ logger->LogSocketEventWithRv(3, EventType::TCP_SOCKET_CONNECT, net::OK); |
+ last_errors = logger->GetLastErrors(3); |
EXPECT_EQ(last_errors.event_type, proto::EVENT_TYPE_UNKNOWN); |
EXPECT_EQ(last_errors.net_return_value, net::OK); |
EXPECT_EQ(last_errors.challenge_reply_error_type, |
proto::CHALLENGE_REPLY_ERROR_NONE); |
// Now log a challenge reply error. LastErrors will be set. |
- clock_->Advance(base::TimeDelta::FromMicroseconds(1)); |
auth_result = |
AuthResult("Some error failed", AuthResult::ERROR_WRONG_PAYLOAD_TYPE); |
- logger_->LogSocketChallengeReplyEvent(3, auth_result); |
- last_errors = logger_->GetLastErrors(3); |
+ logger->LogSocketChallengeReplyEvent(3, auth_result); |
+ last_errors = logger->GetLastErrors(3); |
EXPECT_EQ(last_errors.event_type, proto::AUTH_CHALLENGE_REPLY); |
EXPECT_EQ(last_errors.challenge_reply_error_type, |
proto::CHALLENGE_REPLY_ERROR_WRONG_PAYLOAD_TYPE); |
// Logging a non-error event does not change the LastErrors for the channel. |
- clock_->Advance(base::TimeDelta::FromMicroseconds(1)); |
- logger_->LogSocketEventWithRv(3, EventType::TCP_SOCKET_CONNECT, net::OK); |
- last_errors = logger_->GetLastErrors(3); |
+ logger->LogSocketEventWithRv(3, EventType::TCP_SOCKET_CONNECT, net::OK); |
+ last_errors = logger->GetLastErrors(3); |
EXPECT_EQ(last_errors.event_type, proto::AUTH_CHALLENGE_REPLY); |
EXPECT_EQ(last_errors.challenge_reply_error_type, |
proto::CHALLENGE_REPLY_ERROR_WRONG_PAYLOAD_TYPE); |
} |
-TEST_F(CastChannelLoggerTest, LogSocketReadWrite) { |
- logger_->LogSocketEventWithRv(1, EventType::SOCKET_READ, 50); |
- clock_->Advance(base::TimeDelta::FromMicroseconds(1)); |
- logger_->LogSocketEventWithRv(1, EventType::SOCKET_READ, 30); |
- clock_->Advance(base::TimeDelta::FromMicroseconds(1)); |
- logger_->LogSocketEventWithRv(1, EventType::SOCKET_READ, -1); |
- clock_->Advance(base::TimeDelta::FromMicroseconds(1)); |
- logger_->LogSocketEventWithRv(1, EventType::SOCKET_WRITE, 20); |
- clock_->Advance(base::TimeDelta::FromMicroseconds(1)); |
- |
- logger_->LogSocketEventWithRv(2, EventType::SOCKET_READ, 100); |
- clock_->Advance(base::TimeDelta::FromMicroseconds(1)); |
- logger_->LogSocketEventWithRv(2, EventType::SOCKET_WRITE, 100); |
- clock_->Advance(base::TimeDelta::FromMicroseconds(1)); |
- logger_->LogSocketEventWithRv(2, EventType::SOCKET_WRITE, -5); |
- clock_->Advance(base::TimeDelta::FromMicroseconds(1)); |
- |
- std::unique_ptr<Log> log = GetLog(); |
- ASSERT_TRUE(log); |
- |
- ASSERT_EQ(2, log->aggregated_socket_event_size()); |
- { |
- const AggregatedSocketEvent& aggregated_socket_event = |
- log->aggregated_socket_event(0); |
- EXPECT_EQ(1, aggregated_socket_event.id()); |
- EXPECT_EQ(4, aggregated_socket_event.socket_event_size()); |
- EXPECT_EQ(80, aggregated_socket_event.bytes_read()); |
- EXPECT_EQ(20, aggregated_socket_event.bytes_written()); |
- } |
- { |
- const AggregatedSocketEvent& aggregated_socket_event = |
- log->aggregated_socket_event(1); |
- EXPECT_EQ(2, aggregated_socket_event.id()); |
- EXPECT_EQ(3, aggregated_socket_event.socket_event_size()); |
- EXPECT_EQ(100, aggregated_socket_event.bytes_read()); |
- EXPECT_EQ(100, aggregated_socket_event.bytes_written()); |
- } |
-} |
- |
-TEST_F(CastChannelLoggerTest, TooManySockets) { |
- for (int i = 0; i < kMaxSocketsToLog + 5; i++) { |
- logger_->LogSocketEvent(i, EventType::CAST_SOCKET_CREATED); |
- } |
- |
- std::unique_ptr<Log> log = GetLog(); |
- ASSERT_TRUE(log); |
- |
- ASSERT_EQ(kMaxSocketsToLog, log->aggregated_socket_event_size()); |
- EXPECT_EQ(5, log->num_evicted_aggregated_socket_events()); |
- EXPECT_EQ(5, log->num_evicted_socket_events()); |
- |
- const AggregatedSocketEvent& aggregated_socket_event = |
- log->aggregated_socket_event(0); |
- EXPECT_EQ(5, aggregated_socket_event.id()); |
-} |
- |
-TEST_F(CastChannelLoggerTest, TooManyEvents) { |
- for (int i = 0; i < kMaxEventsPerSocket + 5; i++) { |
- logger_->LogSocketEvent(1, EventType::CAST_SOCKET_CREATED); |
- clock_->Advance(base::TimeDelta::FromMicroseconds(1)); |
- } |
- |
- std::unique_ptr<Log> log = GetLog(); |
- ASSERT_TRUE(log); |
- |
- ASSERT_EQ(1, log->aggregated_socket_event_size()); |
- EXPECT_EQ(0, log->num_evicted_aggregated_socket_events()); |
- EXPECT_EQ(5, log->num_evicted_socket_events()); |
- |
- const AggregatedSocketEvent& aggregated_socket_event = |
- log->aggregated_socket_event(0); |
- ASSERT_EQ(kMaxEventsPerSocket, aggregated_socket_event.socket_event_size()); |
- EXPECT_EQ(5, aggregated_socket_event.socket_event(0).timestamp_micros()); |
-} |
- |
-TEST_F(CastChannelLoggerTest, Reset) { |
- logger_->LogSocketEvent(1, EventType::CAST_SOCKET_CREATED); |
- |
- std::unique_ptr<Log> log = GetLog(); |
- ASSERT_TRUE(log); |
- |
- EXPECT_EQ(1, log->aggregated_socket_event_size()); |
- |
- logger_->Reset(); |
- |
- log = GetLog(); |
- ASSERT_TRUE(log); |
- |
- EXPECT_EQ(0, log->aggregated_socket_event_size()); |
-} |
- |
} // namespace cast_channel |
} // namespace api |
} // namespace extensions |