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