xref: /aosp_15_r20/external/cronet/components/cronet/android/test/cronet_test_util.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright 2016 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 "components/cronet/android/test/cronet_test_util.h"
6 
7 #include "base/android/jni_android.h"
8 #include "base/android/jni_string.h"
9 #include "base/functional/bind.h"
10 #include "base/message_loop/message_pump.h"
11 #include "base/message_loop/message_pump_type.h"
12 #include "base/synchronization/waitable_event.h"
13 #include "base/task/sequence_manager/sequence_manager.h"
14 #include "base/task/single_thread_task_runner.h"
15 #include "base/test/bind.h"
16 #include "components/cronet/android/cronet_context_adapter.h"
17 #include "components/cronet/android/cronet_test_apk_jni/CronetTestUtil_jni.h"
18 #include "components/cronet/android/cronet_url_request_adapter.h"
19 #include "components/cronet/cronet_context.h"
20 #include "components/cronet/cronet_url_request.h"
21 #include "net/http/http_server_properties.h"
22 #include "net/socket/socket_test_util.h"
23 #include "net/url_request/url_request.h"
24 #include "net/url_request/url_request_context.h"
25 
26 namespace cronet {
27 namespace {
28 
29 using ::base::MessagePump;
30 using ::base::MessagePumpType;
31 using ::base::android::JavaParamRef;
32 using ::base::sequence_manager::SequenceManager;
33 
34 SequenceManager* g_sequence_manager = nullptr;
35 
36 }  // namespace
37 
JNI_CronetTestUtil_GetLoadFlags(JNIEnv * env,const jlong jurl_request_adapter)38 jint JNI_CronetTestUtil_GetLoadFlags(JNIEnv* env,
39                                      const jlong jurl_request_adapter) {
40   return TestUtil::GetURLRequest(jurl_request_adapter)->load_flags();
41 }
42 
JNI_CronetTestUtil_URLRequestContextExistsForTesting(JNIEnv * env,jlong jcontext_adapter,jlong jnetwork_handle)43 jboolean JNI_CronetTestUtil_URLRequestContextExistsForTesting(
44     JNIEnv* env,
45     jlong jcontext_adapter,
46     jlong jnetwork_handle) {
47   return TestUtil::GetURLRequestContexts(jcontext_adapter)
48       ->contains(jnetwork_handle);
49 }
50 
51 // static
52 base::flat_map<net::handles::NetworkHandle,
53                std::unique_ptr<net::URLRequestContext>>*
GetURLRequestContexts(jlong jcontext_adapter)54 TestUtil::GetURLRequestContexts(jlong jcontext_adapter) {
55   CronetContextAdapter* context_adapter =
56       reinterpret_cast<CronetContextAdapter*>(jcontext_adapter);
57   return &context_adapter->context_->network_tasks_->contexts_;
58 }
59 
60 // static
GetTaskRunner(jlong jcontext_adapter)61 scoped_refptr<base::SingleThreadTaskRunner> TestUtil::GetTaskRunner(
62     jlong jcontext_adapter) {
63   CronetContextAdapter* context_adapter =
64       reinterpret_cast<CronetContextAdapter*>(jcontext_adapter);
65   return context_adapter->context_->network_task_runner_;
66 }
67 
68 // static
GetURLRequestContext(jlong jcontext_adapter)69 net::URLRequestContext* TestUtil::GetURLRequestContext(jlong jcontext_adapter) {
70   CronetContextAdapter* context_adapter =
71       reinterpret_cast<CronetContextAdapter*>(jcontext_adapter);
72   return context_adapter->context_->network_tasks_->default_context_;
73 }
74 
75 // static
RunAfterContextInitOnNetworkThread(jlong jcontext_adapter,base::OnceClosure task)76 void TestUtil::RunAfterContextInitOnNetworkThread(jlong jcontext_adapter,
77                                                   base::OnceClosure task) {
78   CronetContextAdapter* context_adapter =
79       reinterpret_cast<CronetContextAdapter*>(jcontext_adapter);
80   if (context_adapter->context_->network_tasks_
81           ->is_default_context_initialized_) {
82     std::move(task).Run();
83   } else {
84     context_adapter->context_->network_tasks_->tasks_waiting_for_context_.push(
85         std::move(task));
86   }
87 }
88 
89 // static
RunAfterContextInit(jlong jcontext_adapter,base::OnceClosure task)90 void TestUtil::RunAfterContextInit(jlong jcontext_adapter,
91                                    base::OnceClosure task) {
92   GetTaskRunner(jcontext_adapter)
93       ->PostTask(FROM_HERE,
94                  base::BindOnce(&TestUtil::RunAfterContextInitOnNetworkThread,
95                                 jcontext_adapter, std::move(task)));
96 }
97 
98 // static
GetURLRequest(jlong jrequest_adapter)99 net::URLRequest* TestUtil::GetURLRequest(jlong jrequest_adapter) {
100   CronetURLRequestAdapter* request_adapter =
101       reinterpret_cast<CronetURLRequestAdapter*>(jrequest_adapter);
102   return request_adapter->request_->network_tasks_.url_request_.get();
103 }
104 
PrepareNetworkThreadOnNetworkThread(jlong jcontext_adapter)105 static void PrepareNetworkThreadOnNetworkThread(jlong jcontext_adapter) {
106   g_sequence_manager =
107       base::sequence_manager::CreateSequenceManagerOnCurrentThreadWithPump(
108           MessagePump::Create(MessagePumpType::IO),
109           SequenceManager::Settings::Builder()
110               .SetMessagePumpType(MessagePumpType::IO)
111               .Build())
112           .release();
113   g_sequence_manager->SetDefaultTaskRunner(
114       TestUtil::GetTaskRunner(jcontext_adapter));
115 }
116 
117 // Tests need to call into libcronet.so code on libcronet.so threads.
118 // libcronet.so's threads are registered with static tables for MessageLoops
119 // and SingleThreadTaskRunners in libcronet.so, so libcronet_test.so
120 // functions that try and access these tables will find missing entries in
121 // the corresponding static tables in libcronet_test.so.  Fix this by
122 // initializing a MessageLoop and SingleThreadTaskRunner in libcronet_test.so
123 // for these threads.  Called from Java CronetTestUtil class.
JNI_CronetTestUtil_PrepareNetworkThread(JNIEnv * env,jlong jcontext_adapter)124 void JNI_CronetTestUtil_PrepareNetworkThread(JNIEnv* env,
125                                              jlong jcontext_adapter) {
126   TestUtil::GetTaskRunner(jcontext_adapter)
127       ->PostTask(FROM_HERE, base::BindOnce(&PrepareNetworkThreadOnNetworkThread,
128                                            jcontext_adapter));
129 }
130 
CleanupNetworkThreadOnNetworkThread()131 static void CleanupNetworkThreadOnNetworkThread() {
132   DCHECK(g_sequence_manager);
133   delete g_sequence_manager;
134   g_sequence_manager = nullptr;
135 }
136 
137 // Called from Java CronetTestUtil class.
JNI_CronetTestUtil_CleanupNetworkThread(JNIEnv * env,jlong jcontext_adapter)138 void JNI_CronetTestUtil_CleanupNetworkThread(JNIEnv* env,
139                                              jlong jcontext_adapter) {
140   TestUtil::RunAfterContextInit(
141       jcontext_adapter, base::BindOnce(&CleanupNetworkThreadOnNetworkThread));
142 }
143 
JNI_CronetTestUtil_CanGetTaggedBytes(JNIEnv * env)144 jboolean JNI_CronetTestUtil_CanGetTaggedBytes(JNIEnv* env) {
145   return net::CanGetTaggedBytes();
146 }
147 
JNI_CronetTestUtil_GetTaggedBytes(JNIEnv * env,jint jexpected_tag)148 jlong JNI_CronetTestUtil_GetTaggedBytes(JNIEnv* env, jint jexpected_tag) {
149   return net::GetTaggedBytes(jexpected_tag);
150 }
151 
152 }  // namespace cronet
153