1 // Copyright 2015 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.
5 #include "net/base/network_quality_estimator.h"
7 #include "base/basictypes.h"
8 #include "base/memory/scoped_ptr.h"
9 #include "base/run_loop.h"
10 #include "base/test/histogram_tester.h"
11 #include "base/threading/platform_thread.h"
12 #include "base/time/time.h"
13 #include "build/build_config.h"
14 #include "net/base/network_change_notifier.h"
15 #include "net/base/network_quality.h"
16 #include "net/test/spawned_test_server/spawned_test_server.h"
17 #include "net/url_request/url_request_test_util.h"
18 #include "testing/gtest/include/gtest/gtest.h"
23 // SpawnedTestServer not supported on iOS (see http://crbug.com/148666).
25 TEST(NetworkQualityEstimatorTest
, TestPeakKbpsFastestRTTUpdates
) {
26 SpawnedTestServer
test_server_(
27 SpawnedTestServer::TYPE_HTTP
, SpawnedTestServer::kLocalhost
,
28 base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest")));
29 ASSERT_TRUE(test_server_
.Start());
31 // Enable requests to local host to be used for network quality estimation.
32 NetworkQualityEstimator
estimator(true);
34 NetworkQuality network_quality
= estimator
.GetEstimate();
35 EXPECT_EQ(network_quality
.fastest_rtt_confidence
, 0);
36 EXPECT_EQ(network_quality
.peak_throughput_kbps_confidence
, 0);
40 TestURLRequestContext
context(false);
42 uint64 min_transfer_size_in_bytes
=
43 NetworkQualityEstimator::kMinTransferSizeInBytes
;
44 base::TimeDelta request_duration
= base::TimeDelta::FromMicroseconds(
45 NetworkQualityEstimator::kMinRequestDurationMicroseconds
);
47 scoped_ptr
<URLRequest
> request(context
.CreateRequest(
48 test_server_
.GetURL("echo.html"), DEFAULT_PRIORITY
, &d
));
51 base::RunLoop().Run();
53 base::PlatformThread::Sleep(request_duration
);
55 // With smaller transfer, |fastest_rtt| will be updated but not
56 // |peak_throughput_kbps|.
57 estimator
.NotifyDataReceived(*(request
.get()),
58 min_transfer_size_in_bytes
- 1);
60 NetworkQuality network_quality
= estimator
.GetEstimate();
61 EXPECT_GT(network_quality
.fastest_rtt_confidence
, 0);
62 EXPECT_EQ(network_quality
.peak_throughput_kbps_confidence
, 0);
65 // With large transfer, both |fastest_rtt| and |peak_throughput_kbps| will be
67 estimator
.NotifyDataReceived(*(request
.get()), min_transfer_size_in_bytes
);
69 NetworkQuality network_quality
= estimator
.GetEstimate();
70 EXPECT_GT(network_quality
.fastest_rtt_confidence
, 0);
71 EXPECT_GT(network_quality
.peak_throughput_kbps_confidence
, 0);
72 EXPECT_GE(network_quality
.fastest_rtt
, request_duration
);
73 EXPECT_GT(network_quality
.peak_throughput_kbps
, uint32(0));
75 network_quality
.peak_throughput_kbps
,
76 min_transfer_size_in_bytes
* 8.0 / request_duration
.InMilliseconds());
78 EXPECT_EQ(estimator
.bytes_read_since_last_connection_change_
, true);
80 // Check UMA histograms.
81 base::HistogramTester histogram_tester
;
82 histogram_tester
.ExpectTotalCount("NQE.PeakKbps.Unknown", 0);
83 histogram_tester
.ExpectTotalCount("NQE.FastestRTT.Unknown", 0);
85 estimator
.OnConnectionTypeChanged(
86 NetworkChangeNotifier::ConnectionType::CONNECTION_WIFI
);
87 histogram_tester
.ExpectTotalCount("NQE.PeakKbps.Unknown", 1);
88 histogram_tester
.ExpectTotalCount("NQE.FastestRTT.Unknown", 1);
90 NetworkQuality network_quality
= estimator
.GetEstimate();
91 EXPECT_EQ(estimator
.current_connection_type_
,
92 NetworkChangeNotifier::ConnectionType::CONNECTION_WIFI
);
93 EXPECT_EQ(network_quality
.fastest_rtt_confidence
, 0);
94 EXPECT_EQ(network_quality
.peak_throughput_kbps_confidence
, 0);
97 #endif // !defined(OS_IOS)