xref: /aosp_15_r20/external/cronet/components/cronet/android/test/test_upload_data_stream_handler.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 "components/cronet/android/test/test_upload_data_stream_handler.h"
6 
7 #include <stddef.h>
8 #include <string>
9 #include <utility>
10 
11 #include "base/android/jni_android.h"
12 #include "base/android/jni_string.h"
13 #include "base/functional/bind.h"
14 #include "components/cronet/android/cronet_test_apk_jni/TestUploadDataStreamHandler_jni.h"
15 #include "components/cronet/android/test/cronet_test_util.h"
16 #include "net/base/net_errors.h"
17 #include "net/log/net_log_with_source.h"
18 
19 using base::android::JavaParamRef;
20 
21 namespace cronet {
22 
23 static const size_t kReadBufferSize = 32768;
24 
TestUploadDataStreamHandler(std::unique_ptr<net::UploadDataStream> upload_data_stream,JNIEnv * env,jobject jtest_upload_data_stream_handler,jlong jcontext_adapter)25 TestUploadDataStreamHandler::TestUploadDataStreamHandler(
26     std::unique_ptr<net::UploadDataStream> upload_data_stream,
27     JNIEnv* env,
28     jobject jtest_upload_data_stream_handler,
29     jlong jcontext_adapter)
30     : init_callback_invoked_(false),
31       read_callback_invoked_(false),
32       bytes_read_(0),
33       network_thread_(TestUtil::GetTaskRunner(jcontext_adapter)) {
34   upload_data_stream_ = std::move(upload_data_stream);
35   jtest_upload_data_stream_handler_.Reset(env,
36                                           jtest_upload_data_stream_handler);
37 }
38 
~TestUploadDataStreamHandler()39 TestUploadDataStreamHandler::~TestUploadDataStreamHandler() {
40 }
41 
Destroy(JNIEnv * env)42 void TestUploadDataStreamHandler::Destroy(JNIEnv* env) {
43   DCHECK(!network_thread_->BelongsToCurrentThread());
44   network_thread_->DeleteSoon(FROM_HERE, this);
45 }
46 
OnInitCompleted(int res)47 void TestUploadDataStreamHandler::OnInitCompleted(int res) {
48   DCHECK(network_thread_->BelongsToCurrentThread());
49   init_callback_invoked_ = true;
50   JNIEnv* env = base::android::AttachCurrentThread();
51   cronet::Java_TestUploadDataStreamHandler_onInitCompleted(
52       env, jtest_upload_data_stream_handler_, res);
53 }
54 
OnReadCompleted(int res)55 void TestUploadDataStreamHandler::OnReadCompleted(int res) {
56   DCHECK(network_thread_->BelongsToCurrentThread());
57   read_callback_invoked_ = true;
58   bytes_read_ = res;
59   NotifyJavaReadCompleted();
60 }
61 
Init(JNIEnv * env)62 void TestUploadDataStreamHandler::Init(JNIEnv* env) {
63   DCHECK(!network_thread_->BelongsToCurrentThread());
64   network_thread_->PostTask(
65       FROM_HERE,
66       base::BindOnce(&TestUploadDataStreamHandler::InitOnNetworkThread,
67                      base::Unretained(this)));
68 }
69 
Read(JNIEnv * env)70 void TestUploadDataStreamHandler::Read(JNIEnv* env) {
71   DCHECK(!network_thread_->BelongsToCurrentThread());
72   network_thread_->PostTask(
73       FROM_HERE,
74       base::BindOnce(&TestUploadDataStreamHandler::ReadOnNetworkThread,
75                      base::Unretained(this)));
76 }
77 
Reset(JNIEnv * env)78 void TestUploadDataStreamHandler::Reset(JNIEnv* env) {
79   DCHECK(!network_thread_->BelongsToCurrentThread());
80   network_thread_->PostTask(
81       FROM_HERE,
82       base::BindOnce(&TestUploadDataStreamHandler::ResetOnNetworkThread,
83                      base::Unretained(this)));
84 }
85 
CheckInitCallbackNotInvoked(JNIEnv * env)86 void TestUploadDataStreamHandler::CheckInitCallbackNotInvoked(JNIEnv* env) {
87   DCHECK(!network_thread_->BelongsToCurrentThread());
88   network_thread_->PostTask(
89       FROM_HERE, base::BindOnce(&TestUploadDataStreamHandler::
90                                     CheckInitCallbackNotInvokedOnNetworkThread,
91                                 base::Unretained(this)));
92 }
93 
CheckReadCallbackNotInvoked(JNIEnv * env)94 void TestUploadDataStreamHandler::CheckReadCallbackNotInvoked(JNIEnv* env) {
95   DCHECK(!network_thread_->BelongsToCurrentThread());
96   network_thread_->PostTask(
97       FROM_HERE, base::BindOnce(&TestUploadDataStreamHandler::
98                                     CheckReadCallbackNotInvokedOnNetworkThread,
99                                 base::Unretained(this)));
100 }
101 
InitOnNetworkThread()102 void TestUploadDataStreamHandler::InitOnNetworkThread() {
103   DCHECK(network_thread_->BelongsToCurrentThread());
104   init_callback_invoked_ = false;
105   read_buffer_ = nullptr;
106   bytes_read_ = 0;
107   int res = upload_data_stream_->Init(
108       base::BindOnce(&TestUploadDataStreamHandler::OnInitCompleted,
109                      base::Unretained(this)),
110       net::NetLogWithSource());
111   JNIEnv* env = base::android::AttachCurrentThread();
112   cronet::Java_TestUploadDataStreamHandler_onInitCalled(
113       env, jtest_upload_data_stream_handler_, res);
114 
115   if (res == net::OK) {
116     cronet::Java_TestUploadDataStreamHandler_onInitCompleted(
117         env, jtest_upload_data_stream_handler_, res);
118   }
119 }
120 
ReadOnNetworkThread()121 void TestUploadDataStreamHandler::ReadOnNetworkThread() {
122   DCHECK(network_thread_->BelongsToCurrentThread());
123   read_callback_invoked_ = false;
124   if (!read_buffer_.get())
125     read_buffer_ = base::MakeRefCounted<net::IOBufferWithSize>(kReadBufferSize);
126 
127   int bytes_read = upload_data_stream_->Read(
128       read_buffer_.get(), kReadBufferSize,
129       base::BindOnce(&TestUploadDataStreamHandler::OnReadCompleted,
130                      base::Unretained(this)));
131   if (bytes_read == net::OK) {
132     bytes_read_ = bytes_read;
133     NotifyJavaReadCompleted();
134   }
135 }
136 
ResetOnNetworkThread()137 void TestUploadDataStreamHandler::ResetOnNetworkThread() {
138   DCHECK(network_thread_->BelongsToCurrentThread());
139   read_buffer_ = nullptr;
140   bytes_read_ = 0;
141   upload_data_stream_->Reset();
142   JNIEnv* env = base::android::AttachCurrentThread();
143   cronet::Java_TestUploadDataStreamHandler_onResetCompleted(
144       env, jtest_upload_data_stream_handler_);
145 }
146 
CheckInitCallbackNotInvokedOnNetworkThread()147 void TestUploadDataStreamHandler::CheckInitCallbackNotInvokedOnNetworkThread() {
148   DCHECK(network_thread_->BelongsToCurrentThread());
149   JNIEnv* env = base::android::AttachCurrentThread();
150   cronet::Java_TestUploadDataStreamHandler_onCheckInitCallbackNotInvoked(
151       env, jtest_upload_data_stream_handler_, !init_callback_invoked_);
152 }
153 
CheckReadCallbackNotInvokedOnNetworkThread()154 void TestUploadDataStreamHandler::CheckReadCallbackNotInvokedOnNetworkThread() {
155   DCHECK(network_thread_->BelongsToCurrentThread());
156   JNIEnv* env = base::android::AttachCurrentThread();
157   cronet::Java_TestUploadDataStreamHandler_onCheckReadCallbackNotInvoked(
158       env, jtest_upload_data_stream_handler_, !read_callback_invoked_);
159 }
160 
NotifyJavaReadCompleted()161 void TestUploadDataStreamHandler::NotifyJavaReadCompleted() {
162   DCHECK(network_thread_->BelongsToCurrentThread());
163   JNIEnv* env = base::android::AttachCurrentThread();
164   std::string data_read = "";
165   if (read_buffer_.get() && bytes_read_ > 0)
166     data_read = std::string(read_buffer_->data(), bytes_read_);
167   cronet::Java_TestUploadDataStreamHandler_onReadCompleted(
168       env, jtest_upload_data_stream_handler_, bytes_read_,
169       base::android::ConvertUTF8ToJavaString(env, data_read));
170 }
171 
JNI_TestUploadDataStreamHandler_CreateTestUploadDataStreamHandler(JNIEnv * env,const JavaParamRef<jobject> & jtest_upload_data_stream_handler,jlong jupload_data_stream,jlong jcontext_adapter)172 static jlong JNI_TestUploadDataStreamHandler_CreateTestUploadDataStreamHandler(
173     JNIEnv* env,
174     const JavaParamRef<jobject>& jtest_upload_data_stream_handler,
175     jlong jupload_data_stream,
176     jlong jcontext_adapter) {
177   std::unique_ptr<net::UploadDataStream> upload_data_stream(
178       reinterpret_cast<net::UploadDataStream*>(jupload_data_stream));
179   TestUploadDataStreamHandler* handler = new TestUploadDataStreamHandler(
180       std::move(upload_data_stream), env, jtest_upload_data_stream_handler,
181       jcontext_adapter);
182   return reinterpret_cast<jlong>(handler);
183 }
184 
185 }  // namespace cronet
186