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