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