xref: /aosp_15_r20/external/cronet/net/android/traffic_stats_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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