// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "base/basictypes.h" #include "base/metrics/histogram.h" #include "googleurl/src/gurl.h" #include "net/socket_stream/socket_stream_metrics.h" #include "testing/gtest/include/gtest/gtest.h" #include "testing/platform_test.h" using base::Histogram; using base::StatisticsRecorder; namespace net { TEST(SocketStreamMetricsTest, Initialize) { if (!StatisticsRecorder::IsActive()) { // Create the recorder if not yet started, as SocketStreamMetrics // relys on the StatisticsRecorder to be present. This is useful when // tests are run with --gtest_filter='SocketStreamMetricsTest*'. static StatisticsRecorder *recorder = NULL; recorder = new StatisticsRecorder; } } TEST(SocketStreamMetricsTest, ProtocolType) { Histogram* histogram; // First we'll preserve the original values. We need to do this // as histograms can get affected by other tests. In particular, // SocketStreamTest and WebSocketTest can affect the histograms. Histogram::SampleSet original; if (StatisticsRecorder::FindHistogram( "Net.SocketStream.ProtocolType", &histogram)) { histogram->SnapshotSample(&original); } SocketStreamMetrics unknown(GURL("unknown://www.example.com/")); SocketStreamMetrics ws1(GURL("ws://www.example.com/")); SocketStreamMetrics ws2(GURL("ws://www.example.com/")); SocketStreamMetrics wss1(GURL("wss://www.example.com/")); SocketStreamMetrics wss2(GURL("wss://www.example.com/")); SocketStreamMetrics wss3(GURL("wss://www.example.com/")); ASSERT_TRUE(StatisticsRecorder::FindHistogram( "Net.SocketStream.ProtocolType", &histogram)); EXPECT_EQ(Histogram::kUmaTargetedHistogramFlag, histogram->flags()); Histogram::SampleSet sample; histogram->SnapshotSample(&sample); original.Resize(*histogram); // Ensure |original| size is same as |sample|. sample.Subtract(original); // Cancel the original values. EXPECT_EQ(1, sample.counts(SocketStreamMetrics::PROTOCOL_UNKNOWN)); EXPECT_EQ(2, sample.counts(SocketStreamMetrics::PROTOCOL_WEBSOCKET)); EXPECT_EQ(3, sample.counts(SocketStreamMetrics::PROTOCOL_WEBSOCKET_SECURE)); } TEST(SocketStreamMetricsTest, ConnectionType) { Histogram* histogram; // First we'll preserve the original values. Histogram::SampleSet original; if (StatisticsRecorder::FindHistogram( "Net.SocketStream.ConnectionType", &histogram)) { histogram->SnapshotSample(&original); } SocketStreamMetrics metrics(GURL("ws://www.example.com/")); for (int i = 0; i < 1; ++i) metrics.OnStartConnection(); for (int i = 0; i < 2; ++i) metrics.OnTunnelProxy(); for (int i = 0; i < 3; ++i) metrics.OnSOCKSProxy(); for (int i = 0; i < 4; ++i) metrics.OnSSLConnection(); ASSERT_TRUE(StatisticsRecorder::FindHistogram( "Net.SocketStream.ConnectionType", &histogram)); EXPECT_EQ(Histogram::kUmaTargetedHistogramFlag, histogram->flags()); Histogram::SampleSet sample; histogram->SnapshotSample(&sample); original.Resize(*histogram); sample.Subtract(original); EXPECT_EQ(1, sample.counts(SocketStreamMetrics::ALL_CONNECTIONS)); EXPECT_EQ(2, sample.counts(SocketStreamMetrics::TUNNEL_CONNECTION)); EXPECT_EQ(3, sample.counts(SocketStreamMetrics::SOCKS_CONNECTION)); EXPECT_EQ(4, sample.counts(SocketStreamMetrics::SSL_CONNECTION)); } TEST(SocketStreamMetricsTest, OtherNumbers) { Histogram* histogram; // First we'll preserve the original values. int64 original_received_bytes = 0; int64 original_received_counts = 0; int64 original_sent_bytes = 0; int64 original_sent_counts = 0; Histogram::SampleSet original; if (StatisticsRecorder::FindHistogram( "Net.SocketStream.ReceivedBytes", &histogram)) { histogram->SnapshotSample(&original); original_received_bytes = original.sum(); } if (StatisticsRecorder::FindHistogram( "Net.SocketStream.ReceivedCounts", &histogram)) { histogram->SnapshotSample(&original); original_received_counts = original.sum(); } if (StatisticsRecorder::FindHistogram( "Net.SocketStream.SentBytes", &histogram)) { histogram->SnapshotSample(&original); original_sent_bytes = original.sum(); } if (StatisticsRecorder::FindHistogram( "Net.SocketStream.SentCounts", &histogram)) { histogram->SnapshotSample(&original); original_sent_counts = original.sum(); } SocketStreamMetrics metrics(GURL("ws://www.example.com/")); metrics.OnWaitConnection(); metrics.OnStartConnection(); metrics.OnConnected(); metrics.OnRead(1); metrics.OnRead(10); metrics.OnWrite(2); metrics.OnWrite(20); metrics.OnWrite(200); metrics.OnClose(); Histogram::SampleSet sample; // ConnectionLatency. ASSERT_TRUE(StatisticsRecorder::FindHistogram( "Net.SocketStream.ConnectionLatency", &histogram)); EXPECT_EQ(Histogram::kUmaTargetedHistogramFlag, histogram->flags()); // We don't check the contents of the histogram as it's time sensitive. // ConnectionEstablish. ASSERT_TRUE(StatisticsRecorder::FindHistogram( "Net.SocketStream.ConnectionEstablish", &histogram)); EXPECT_EQ(Histogram::kUmaTargetedHistogramFlag, histogram->flags()); // We don't check the contents of the histogram as it's time sensitive. // Duration. ASSERT_TRUE(StatisticsRecorder::FindHistogram( "Net.SocketStream.Duration", &histogram)); EXPECT_EQ(Histogram::kUmaTargetedHistogramFlag, histogram->flags()); // We don't check the contents of the histogram as it's time sensitive. // ReceivedBytes. ASSERT_TRUE(StatisticsRecorder::FindHistogram( "Net.SocketStream.ReceivedBytes", &histogram)); EXPECT_EQ(Histogram::kUmaTargetedHistogramFlag, histogram->flags()); histogram->SnapshotSample(&sample); EXPECT_EQ(11, sample.sum() - original_received_bytes); // 11 bytes read. // ReceivedCounts. ASSERT_TRUE(StatisticsRecorder::FindHistogram( "Net.SocketStream.ReceivedCounts", &histogram)); EXPECT_EQ(Histogram::kUmaTargetedHistogramFlag, histogram->flags()); histogram->SnapshotSample(&sample); EXPECT_EQ(2, sample.sum() - original_received_counts); // 2 read requests. // SentBytes. ASSERT_TRUE(StatisticsRecorder::FindHistogram( "Net.SocketStream.SentBytes", &histogram)); EXPECT_EQ(Histogram::kUmaTargetedHistogramFlag, histogram->flags()); histogram->SnapshotSample(&sample); EXPECT_EQ(222, sample.sum() - original_sent_bytes); // 222 bytes sent. // SentCounts. ASSERT_TRUE(StatisticsRecorder::FindHistogram( "Net.SocketStream.SentCounts", &histogram)); EXPECT_EQ(Histogram::kUmaTargetedHistogramFlag, histogram->flags()); histogram->SnapshotSample(&sample); EXPECT_EQ(3, sample.sum() - original_sent_counts); // 3 write requests. } } // namespace net