1 // Copyright 2015 The Chromium Authors
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 "net/android/traffic_stats.h"
6
7 #include <unistd.h> // For usleep
8
9 #include "base/run_loop.h"
10 #include "base/test/task_environment.h"
11 #include "base/time/time.h"
12 #include "net/test/embedded_test_server/embedded_test_server.h"
13 #include "net/url_request/url_request_context.h"
14 #include "net/url_request/url_request_context_builder.h"
15 #include "net/url_request/url_request_test_util.h"
16 #include "testing/gtest/include/gtest/gtest.h"
17 #include "url/gurl.h"
18
19 namespace net {
20
21 namespace {
22
23 template <typename Predicate>
ExpectWithRetry(Predicate predicate)24 void ExpectWithRetry(Predicate predicate) {
25 const int kMaxRetries = 500;
26 const auto kRetryInterval = base::Milliseconds(10);
27 for (int retry_count = 0;; ++retry_count) {
28 if (predicate()) {
29 return;
30 }
31 if (retry_count == kMaxRetries) {
32 break;
33 }
34 base::PlatformThreadBase::Sleep(kRetryInterval);
35 }
36
37 // If reached here, all retries have failed.
38 FAIL() << "Condition remained false even after "
39 << kMaxRetries * kRetryInterval;
40 }
41
GetTotalTxBytes()42 int64_t GetTotalTxBytes() {
43 int64_t ret = -1;
44 EXPECT_TRUE(android::traffic_stats::GetTotalTxBytes(&ret));
45 EXPECT_GE(ret, 0);
46 return ret;
47 }
48
GetTotalRxBytes()49 int64_t GetTotalRxBytes() {
50 int64_t ret = -1;
51 EXPECT_TRUE(android::traffic_stats::GetTotalRxBytes(&ret));
52 EXPECT_GE(ret, 0);
53 return ret;
54 }
55
TEST(TrafficStatsAndroidTest,BasicsTest)56 TEST(TrafficStatsAndroidTest, BasicsTest) {
57 base::test::TaskEnvironment task_environment(
58 base::test::TaskEnvironment::MainThreadType::IO);
59
60 EmbeddedTestServer embedded_test_server;
61 embedded_test_server.ServeFilesFromDirectory(
62 base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest")));
63 ASSERT_TRUE(embedded_test_server.Start());
64
65 int64_t tx_bytes_before_request = -1;
66 int64_t rx_bytes_before_request = -1;
67 EXPECT_TRUE(
68 android::traffic_stats::GetTotalTxBytes(&tx_bytes_before_request));
69 EXPECT_GE(tx_bytes_before_request, 0);
70 EXPECT_TRUE(
71 android::traffic_stats::GetTotalRxBytes(&rx_bytes_before_request));
72 EXPECT_GE(rx_bytes_before_request, 0);
73
74 TestDelegate test_delegate;
75 auto context = CreateTestURLRequestContextBuilder()->Build();
76
77 std::unique_ptr<URLRequest> request(
78 context->CreateRequest(embedded_test_server.GetURL("/echo.html"),
79 DEFAULT_PRIORITY, &test_delegate));
80 request->Start();
81 test_delegate.RunUntilComplete();
82
83 // Bytes should increase because of the network traffic.
84 // Retry is needed to work around rate-limit caching for
85 // TrafficStats API results on V+ devices.
86 ExpectWithRetry([&] { return GetTotalTxBytes() > tx_bytes_before_request; });
87 ExpectWithRetry([&] { return GetTotalRxBytes() > rx_bytes_before_request; });
88 }
89
TEST(TrafficStatsAndroidTest,UIDBasicsTest)90 TEST(TrafficStatsAndroidTest, UIDBasicsTest) {
91 base::test::TaskEnvironment task_environment(
92 base::test::TaskEnvironment::MainThreadType::IO);
93
94 EmbeddedTestServer embedded_test_server;
95 embedded_test_server.ServeFilesFromDirectory(
96 base::FilePath(FILE_PATH_LITERAL("net/data/url_request_unittest")));
97 ASSERT_TRUE(embedded_test_server.Start());
98
99 int64_t tx_bytes_before_request = -1;
100 int64_t rx_bytes_before_request = -1;
101 EXPECT_TRUE(
102 android::traffic_stats::GetCurrentUidTxBytes(&tx_bytes_before_request));
103 EXPECT_GE(tx_bytes_before_request, 0);
104 EXPECT_TRUE(
105 android::traffic_stats::GetCurrentUidRxBytes(&rx_bytes_before_request));
106 EXPECT_GE(rx_bytes_before_request, 0);
107
108 TestDelegate test_delegate;
109 auto context = CreateTestURLRequestContextBuilder()->Build();
110
111 std::unique_ptr<URLRequest> request(
112 context->CreateRequest(embedded_test_server.GetURL("/echo.html"),
113 DEFAULT_PRIORITY, &test_delegate));
114 request->Start();
115 test_delegate.RunUntilComplete();
116
117 // Bytes should increase because of the network traffic.
118 // Retry is needed to work around rate-limit caching for
119 // TrafficStats API results on V+ devices.
120 ExpectWithRetry([&] { return GetTotalTxBytes() > tx_bytes_before_request; });
121 ExpectWithRetry([&] { return GetTotalRxBytes() > rx_bytes_before_request; });
122 }
123
124 } // namespace
125
126 } // namespace net
127