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