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