cc: Make a FakeResourceProvider and use it in tests to construct.
[chromium-blink-merge.git] / net / base / network_quality_estimator_unittest.cc
blob69b86fe8bad87030987d442a375bdbde78fd800c
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"
19 #include "url/gurl.h"
21 namespace net {
23 // SpawnedTestServer not supported on iOS (see http://crbug.com/148666).
24 #if !defined(OS_IOS)
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);
39 TestDelegate d;
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));
49 request->Start();
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
66 // updated.
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));
74 EXPECT_LE(
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)
99 } // namespace net