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
12using base::Histogram;
13using base::StatisticsRecorder;
14
15namespace net {
16
17TEST(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
27TEST(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
59TEST(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
93TEST(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