• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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