1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be 3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file. 4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "base/basictypes.h" 6731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/metrics/histogram.h" 7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "googleurl/src/gurl.h" 8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "net/socket_stream/socket_stream_metrics.h" 9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "testing/gtest/include/gtest/gtest.h" 10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "testing/platform_test.h" 11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 12731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickusing base::Histogram; 13731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickusing base::StatisticsRecorder; 14731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace net { 16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(SocketStreamMetricsTest, Initialize) { 1821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (!StatisticsRecorder::IsActive()) { 19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Create the recorder if not yet started, as SocketStreamMetrics 20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // relys on the StatisticsRecorder to be present. This is useful when 21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // tests are run with --gtest_filter='SocketStreamMetricsTest*'. 22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott static StatisticsRecorder *recorder = NULL; 23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott recorder = new StatisticsRecorder; 24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(SocketStreamMetricsTest, ProtocolType) { 28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Histogram* histogram; 29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // First we'll preserve the original values. We need to do this 31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // as histograms can get affected by other tests. In particular, 32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // SocketStreamTest and WebSocketTest can affect the histograms. 33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Histogram::SampleSet original; 34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (StatisticsRecorder::FindHistogram( 35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Net.SocketStream.ProtocolType", &histogram)) { 36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott histogram->SnapshotSample(&original); 37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SocketStreamMetrics unknown(GURL("unknown://www.example.com/")); 40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SocketStreamMetrics ws1(GURL("ws://www.example.com/")); 41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SocketStreamMetrics ws2(GURL("ws://www.example.com/")); 42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SocketStreamMetrics wss1(GURL("wss://www.example.com/")); 43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SocketStreamMetrics wss2(GURL("wss://www.example.com/")); 44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SocketStreamMetrics wss3(GURL("wss://www.example.com/")); 45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(StatisticsRecorder::FindHistogram( 47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Net.SocketStream.ProtocolType", &histogram)); 48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(Histogram::kUmaTargetedHistogramFlag, histogram->flags()); 49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Histogram::SampleSet sample; 51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott histogram->SnapshotSample(&sample); 52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott original.Resize(*histogram); // Ensure |original| size is same as |sample|. 53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott sample.Subtract(original); // Cancel the original values. 54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(1, sample.counts(SocketStreamMetrics::PROTOCOL_UNKNOWN)); 55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(2, sample.counts(SocketStreamMetrics::PROTOCOL_WEBSOCKET)); 56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(3, sample.counts(SocketStreamMetrics::PROTOCOL_WEBSOCKET_SECURE)); 57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(SocketStreamMetricsTest, ConnectionType) { 60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Histogram* histogram; 61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // First we'll preserve the original values. 63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Histogram::SampleSet original; 64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (StatisticsRecorder::FindHistogram( 65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Net.SocketStream.ConnectionType", &histogram)) { 66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott histogram->SnapshotSample(&original); 67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SocketStreamMetrics metrics(GURL("ws://www.example.com/")); 70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (int i = 0; i < 1; ++i) 71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott metrics.OnStartConnection(); 72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (int i = 0; i < 2; ++i) 73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott metrics.OnTunnelProxy(); 74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (int i = 0; i < 3; ++i) 75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott metrics.OnSOCKSProxy(); 76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott for (int i = 0; i < 4; ++i) 77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott metrics.OnSSLConnection(); 78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(StatisticsRecorder::FindHistogram( 80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Net.SocketStream.ConnectionType", &histogram)); 81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(Histogram::kUmaTargetedHistogramFlag, histogram->flags()); 82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Histogram::SampleSet sample; 84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott histogram->SnapshotSample(&sample); 85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott original.Resize(*histogram); 86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott sample.Subtract(original); 87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(1, sample.counts(SocketStreamMetrics::ALL_CONNECTIONS)); 88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(2, sample.counts(SocketStreamMetrics::TUNNEL_CONNECTION)); 89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(3, sample.counts(SocketStreamMetrics::SOCKS_CONNECTION)); 90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(4, sample.counts(SocketStreamMetrics::SSL_CONNECTION)); 91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST(SocketStreamMetricsTest, OtherNumbers) { 94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Histogram* histogram; 95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // First we'll preserve the original values. 97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int64 original_received_bytes = 0; 98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int64 original_received_counts = 0; 99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int64 original_sent_bytes = 0; 100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott int64 original_sent_counts = 0; 101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Histogram::SampleSet original; 103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (StatisticsRecorder::FindHistogram( 104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Net.SocketStream.ReceivedBytes", &histogram)) { 105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott histogram->SnapshotSample(&original); 106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott original_received_bytes = original.sum(); 107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (StatisticsRecorder::FindHistogram( 109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Net.SocketStream.ReceivedCounts", &histogram)) { 110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott histogram->SnapshotSample(&original); 111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott original_received_counts = original.sum(); 112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (StatisticsRecorder::FindHistogram( 114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Net.SocketStream.SentBytes", &histogram)) { 115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott histogram->SnapshotSample(&original); 116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott original_sent_bytes = original.sum(); 117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott if (StatisticsRecorder::FindHistogram( 119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Net.SocketStream.SentCounts", &histogram)) { 120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott histogram->SnapshotSample(&original); 121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott original_sent_counts = original.sum(); 122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott } 123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott SocketStreamMetrics metrics(GURL("ws://www.example.com/")); 125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott metrics.OnWaitConnection(); 126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott metrics.OnStartConnection(); 127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott metrics.OnConnected(); 128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott metrics.OnRead(1); 129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott metrics.OnRead(10); 130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott metrics.OnWrite(2); 131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott metrics.OnWrite(20); 132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott metrics.OnWrite(200); 133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott metrics.OnClose(); 134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott Histogram::SampleSet sample; 136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // ConnectionLatency. 138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(StatisticsRecorder::FindHistogram( 139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Net.SocketStream.ConnectionLatency", &histogram)); 140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(Histogram::kUmaTargetedHistogramFlag, histogram->flags()); 141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // We don't check the contents of the histogram as it's time sensitive. 142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // ConnectionEstablish. 144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(StatisticsRecorder::FindHistogram( 145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Net.SocketStream.ConnectionEstablish", &histogram)); 146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(Histogram::kUmaTargetedHistogramFlag, histogram->flags()); 147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // We don't check the contents of the histogram as it's time sensitive. 148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // Duration. 150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(StatisticsRecorder::FindHistogram( 151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Net.SocketStream.Duration", &histogram)); 152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(Histogram::kUmaTargetedHistogramFlag, histogram->flags()); 153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // We don't check the contents of the histogram as it's time sensitive. 154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // ReceivedBytes. 156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(StatisticsRecorder::FindHistogram( 157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Net.SocketStream.ReceivedBytes", &histogram)); 158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(Histogram::kUmaTargetedHistogramFlag, histogram->flags()); 159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott histogram->SnapshotSample(&sample); 160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(11, sample.sum() - original_received_bytes); // 11 bytes read. 161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // ReceivedCounts. 163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(StatisticsRecorder::FindHistogram( 164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Net.SocketStream.ReceivedCounts", &histogram)); 165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(Histogram::kUmaTargetedHistogramFlag, histogram->flags()); 166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott histogram->SnapshotSample(&sample); 167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(2, sample.sum() - original_received_counts); // 2 read requests. 168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // SentBytes. 170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(StatisticsRecorder::FindHistogram( 171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Net.SocketStream.SentBytes", &histogram)); 172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(Histogram::kUmaTargetedHistogramFlag, histogram->flags()); 173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott histogram->SnapshotSample(&sample); 174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(222, sample.sum() - original_sent_bytes); // 222 bytes sent. 175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott // SentCounts. 177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott ASSERT_TRUE(StatisticsRecorder::FindHistogram( 178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott "Net.SocketStream.SentCounts", &histogram)); 179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(Histogram::kUmaTargetedHistogramFlag, histogram->flags()); 180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott histogram->SnapshotSample(&sample); 181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott EXPECT_EQ(3, sample.sum() - original_sent_counts); // 3 write requests. 182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} 183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott 184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott} // namespace net 185