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