Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(26)

Side by Side Diff: components/cronet/android/test/test_upload_data_stream_handler.cc

Issue 2406273002: [Cronet] Test the libcronet that's shipped, not libcronet_test (Closed)
Patch Set: fix shutdown race Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/cronet/android/test/test_upload_data_stream_handler.h" 5 #include "components/cronet/android/test/test_upload_data_stream_handler.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <string> 8 #include <string>
9 #include <utility> 9 #include <utility>
10 10
11 #include "base/android/jni_android.h" 11 #include "base/android/jni_android.h"
12 #include "base/android/jni_string.h" 12 #include "base/android/jni_string.h"
13 #include "base/bind.h" 13 #include "base/bind.h"
14 #include "components/cronet/android/test/cronet_test_util.h"
14 #include "jni/TestUploadDataStreamHandler_jni.h" 15 #include "jni/TestUploadDataStreamHandler_jni.h"
15 #include "net/base/net_errors.h" 16 #include "net/base/net_errors.h"
16 #include "net/log/net_log_with_source.h" 17 #include "net/log/net_log_with_source.h"
17 18
18 using base::android::JavaParamRef; 19 using base::android::JavaParamRef;
19 20
20 namespace cronet { 21 namespace cronet {
21 22
22 static const size_t kReadBufferSize = 32768; 23 static const size_t kReadBufferSize = 32768;
23 24
24 TestUploadDataStreamHandler::TestUploadDataStreamHandler( 25 TestUploadDataStreamHandler::TestUploadDataStreamHandler(
25 std::unique_ptr<net::UploadDataStream> upload_data_stream, 26 std::unique_ptr<net::UploadDataStream> upload_data_stream,
26 JNIEnv* env, 27 JNIEnv* env,
27 jobject jtest_upload_data_stream_handler) 28 jobject jtest_upload_data_stream_handler,
29 jlong jcontext_adapter)
28 : init_callback_invoked_(false), 30 : init_callback_invoked_(false),
29 read_callback_invoked_(false), 31 read_callback_invoked_(false),
30 bytes_read_(0), 32 bytes_read_(0),
31 network_thread_(new base::Thread("network")) { 33 network_thread_(TestUtil::GetTaskRunner(jcontext_adapter)) {
32 upload_data_stream_ = std::move(upload_data_stream); 34 upload_data_stream_ = std::move(upload_data_stream);
33 base::Thread::Options options;
34 options.message_loop_type = base::MessageLoop::TYPE_IO;
35 network_thread_->StartWithOptions(options);
36 jtest_upload_data_stream_handler_.Reset(env, 35 jtest_upload_data_stream_handler_.Reset(env,
37 jtest_upload_data_stream_handler); 36 jtest_upload_data_stream_handler);
38 } 37 }
39 38
40 TestUploadDataStreamHandler::~TestUploadDataStreamHandler() { 39 TestUploadDataStreamHandler::~TestUploadDataStreamHandler() {
41 } 40 }
42 41
43 void TestUploadDataStreamHandler::Destroy( 42 void TestUploadDataStreamHandler::Destroy(
44 JNIEnv* env, 43 JNIEnv* env,
45 const JavaParamRef<jobject>& jcaller) { 44 const JavaParamRef<jobject>& jcaller) {
46 DCHECK(!network_thread_->task_runner()->BelongsToCurrentThread()); 45 DCHECK(!network_thread_->BelongsToCurrentThread());
47 // Stick network_thread_ in a local, so |this| may be destroyed from the 46 network_thread_->DeleteSoon(FROM_HERE, this);
48 // network thread before the network thread is destroyed.
49 std::unique_ptr<base::Thread> network_thread = std::move(network_thread_);
50 network_thread->task_runner()->DeleteSoon(FROM_HERE, this);
51 // Deleting thread stops it after all tasks are completed.
52 network_thread.reset();
53 } 47 }
54 48
55 void TestUploadDataStreamHandler::OnInitCompleted(int res) { 49 void TestUploadDataStreamHandler::OnInitCompleted(int res) {
56 DCHECK(network_thread_->task_runner()->BelongsToCurrentThread()); 50 DCHECK(network_thread_->BelongsToCurrentThread());
57 init_callback_invoked_ = true; 51 init_callback_invoked_ = true;
58 JNIEnv* env = base::android::AttachCurrentThread(); 52 JNIEnv* env = base::android::AttachCurrentThread();
59 cronet::Java_TestUploadDataStreamHandler_onInitCompleted( 53 cronet::Java_TestUploadDataStreamHandler_onInitCompleted(
60 env, jtest_upload_data_stream_handler_, res); 54 env, jtest_upload_data_stream_handler_, res);
61 } 55 }
62 56
63 void TestUploadDataStreamHandler::OnReadCompleted(int res) { 57 void TestUploadDataStreamHandler::OnReadCompleted(int res) {
64 DCHECK(network_thread_->task_runner()->BelongsToCurrentThread()); 58 DCHECK(network_thread_->BelongsToCurrentThread());
65 read_callback_invoked_ = true; 59 read_callback_invoked_ = true;
66 bytes_read_ = res; 60 bytes_read_ = res;
67 NotifyJavaReadCompleted(); 61 NotifyJavaReadCompleted();
68 } 62 }
69 63
70 void TestUploadDataStreamHandler::Init(JNIEnv* env, 64 void TestUploadDataStreamHandler::Init(JNIEnv* env,
71 const JavaParamRef<jobject>& jcaller) { 65 const JavaParamRef<jobject>& jcaller) {
72 DCHECK(!network_thread_->task_runner()->BelongsToCurrentThread()); 66 DCHECK(!network_thread_->BelongsToCurrentThread());
73 network_thread_->task_runner()->PostTask( 67 network_thread_->PostTask(
74 FROM_HERE, base::Bind(&TestUploadDataStreamHandler::InitOnNetworkThread, 68 FROM_HERE, base::Bind(&TestUploadDataStreamHandler::InitOnNetworkThread,
75 base::Unretained(this))); 69 base::Unretained(this)));
76 } 70 }
77 71
78 void TestUploadDataStreamHandler::Read(JNIEnv* env, 72 void TestUploadDataStreamHandler::Read(JNIEnv* env,
79 const JavaParamRef<jobject>& jcaller) { 73 const JavaParamRef<jobject>& jcaller) {
80 DCHECK(!network_thread_->task_runner()->BelongsToCurrentThread()); 74 DCHECK(!network_thread_->BelongsToCurrentThread());
81 network_thread_->task_runner()->PostTask( 75 network_thread_->PostTask(
82 FROM_HERE, base::Bind(&TestUploadDataStreamHandler::ReadOnNetworkThread, 76 FROM_HERE, base::Bind(&TestUploadDataStreamHandler::ReadOnNetworkThread,
83 base::Unretained(this))); 77 base::Unretained(this)));
84 } 78 }
85 79
86 void TestUploadDataStreamHandler::Reset(JNIEnv* env, 80 void TestUploadDataStreamHandler::Reset(JNIEnv* env,
87 const JavaParamRef<jobject>& jcaller) { 81 const JavaParamRef<jobject>& jcaller) {
88 DCHECK(!network_thread_->task_runner()->BelongsToCurrentThread()); 82 DCHECK(!network_thread_->BelongsToCurrentThread());
89 network_thread_->task_runner()->PostTask( 83 network_thread_->PostTask(
90 FROM_HERE, base::Bind(&TestUploadDataStreamHandler::ResetOnNetworkThread, 84 FROM_HERE, base::Bind(&TestUploadDataStreamHandler::ResetOnNetworkThread,
91 base::Unretained(this))); 85 base::Unretained(this)));
92 } 86 }
93 87
94 void TestUploadDataStreamHandler::CheckInitCallbackNotInvoked( 88 void TestUploadDataStreamHandler::CheckInitCallbackNotInvoked(
95 JNIEnv* env, 89 JNIEnv* env,
96 const JavaParamRef<jobject>& jcaller) { 90 const JavaParamRef<jobject>& jcaller) {
97 DCHECK(!network_thread_->task_runner()->BelongsToCurrentThread()); 91 DCHECK(!network_thread_->BelongsToCurrentThread());
98 network_thread_->task_runner()->PostTask( 92 network_thread_->PostTask(
99 FROM_HERE, base::Bind(&TestUploadDataStreamHandler:: 93 FROM_HERE, base::Bind(&TestUploadDataStreamHandler::
100 CheckInitCallbackNotInvokedOnNetworkThread, 94 CheckInitCallbackNotInvokedOnNetworkThread,
101 base::Unretained(this))); 95 base::Unretained(this)));
102 } 96 }
103 97
104 void TestUploadDataStreamHandler::CheckReadCallbackNotInvoked( 98 void TestUploadDataStreamHandler::CheckReadCallbackNotInvoked(
105 JNIEnv* env, 99 JNIEnv* env,
106 const JavaParamRef<jobject>& jcaller) { 100 const JavaParamRef<jobject>& jcaller) {
107 DCHECK(!network_thread_->task_runner()->BelongsToCurrentThread()); 101 DCHECK(!network_thread_->BelongsToCurrentThread());
108 network_thread_->task_runner()->PostTask( 102 network_thread_->PostTask(
109 FROM_HERE, base::Bind(&TestUploadDataStreamHandler:: 103 FROM_HERE, base::Bind(&TestUploadDataStreamHandler::
110 CheckReadCallbackNotInvokedOnNetworkThread, 104 CheckReadCallbackNotInvokedOnNetworkThread,
111 base::Unretained(this))); 105 base::Unretained(this)));
112 } 106 }
113 107
114 void TestUploadDataStreamHandler::InitOnNetworkThread() { 108 void TestUploadDataStreamHandler::InitOnNetworkThread() {
115 DCHECK(network_thread_->task_runner()->BelongsToCurrentThread()); 109 DCHECK(network_thread_->BelongsToCurrentThread());
116 init_callback_invoked_ = false; 110 init_callback_invoked_ = false;
117 read_buffer_ = nullptr; 111 read_buffer_ = nullptr;
118 bytes_read_ = 0; 112 bytes_read_ = 0;
119 int res = upload_data_stream_->Init( 113 int res = upload_data_stream_->Init(
120 base::Bind(&TestUploadDataStreamHandler::OnInitCompleted, 114 base::Bind(&TestUploadDataStreamHandler::OnInitCompleted,
121 base::Unretained(this)), 115 base::Unretained(this)),
122 net::NetLogWithSource()); 116 net::NetLogWithSource());
123 JNIEnv* env = base::android::AttachCurrentThread(); 117 JNIEnv* env = base::android::AttachCurrentThread();
124 cronet::Java_TestUploadDataStreamHandler_onInitCalled( 118 cronet::Java_TestUploadDataStreamHandler_onInitCalled(
125 env, jtest_upload_data_stream_handler_, res); 119 env, jtest_upload_data_stream_handler_, res);
126 120
127 if (res == net::OK) { 121 if (res == net::OK) {
128 cronet::Java_TestUploadDataStreamHandler_onInitCompleted( 122 cronet::Java_TestUploadDataStreamHandler_onInitCompleted(
129 env, jtest_upload_data_stream_handler_, res); 123 env, jtest_upload_data_stream_handler_, res);
130 } 124 }
131 } 125 }
132 126
133 void TestUploadDataStreamHandler::ReadOnNetworkThread() { 127 void TestUploadDataStreamHandler::ReadOnNetworkThread() {
134 DCHECK(network_thread_->task_runner()->BelongsToCurrentThread()); 128 DCHECK(network_thread_->BelongsToCurrentThread());
135 read_callback_invoked_ = false; 129 read_callback_invoked_ = false;
136 if (!read_buffer_.get()) 130 if (!read_buffer_.get())
137 read_buffer_ = new net::IOBufferWithSize(kReadBufferSize); 131 read_buffer_ = new net::IOBufferWithSize(kReadBufferSize);
138 132
139 int bytes_read = upload_data_stream_->Read( 133 int bytes_read = upload_data_stream_->Read(
140 read_buffer_.get(), kReadBufferSize, 134 read_buffer_.get(), kReadBufferSize,
141 base::Bind(&TestUploadDataStreamHandler::OnReadCompleted, 135 base::Bind(&TestUploadDataStreamHandler::OnReadCompleted,
142 base::Unretained(this))); 136 base::Unretained(this)));
143 if (bytes_read == net::OK) { 137 if (bytes_read == net::OK) {
144 bytes_read_ = bytes_read; 138 bytes_read_ = bytes_read;
145 NotifyJavaReadCompleted(); 139 NotifyJavaReadCompleted();
146 } 140 }
147 } 141 }
148 142
149 void TestUploadDataStreamHandler::ResetOnNetworkThread() { 143 void TestUploadDataStreamHandler::ResetOnNetworkThread() {
150 DCHECK(network_thread_->task_runner()->BelongsToCurrentThread()); 144 DCHECK(network_thread_->BelongsToCurrentThread());
151 read_buffer_ = nullptr; 145 read_buffer_ = nullptr;
152 bytes_read_ = 0; 146 bytes_read_ = 0;
153 upload_data_stream_->Reset(); 147 upload_data_stream_->Reset();
154 JNIEnv* env = base::android::AttachCurrentThread(); 148 JNIEnv* env = base::android::AttachCurrentThread();
155 cronet::Java_TestUploadDataStreamHandler_onResetCompleted( 149 cronet::Java_TestUploadDataStreamHandler_onResetCompleted(
156 env, jtest_upload_data_stream_handler_); 150 env, jtest_upload_data_stream_handler_);
157 } 151 }
158 152
159 void TestUploadDataStreamHandler::CheckInitCallbackNotInvokedOnNetworkThread() { 153 void TestUploadDataStreamHandler::CheckInitCallbackNotInvokedOnNetworkThread() {
160 DCHECK(network_thread_->task_runner()->BelongsToCurrentThread()); 154 DCHECK(network_thread_->BelongsToCurrentThread());
161 JNIEnv* env = base::android::AttachCurrentThread(); 155 JNIEnv* env = base::android::AttachCurrentThread();
162 cronet::Java_TestUploadDataStreamHandler_onCheckInitCallbackNotInvoked( 156 cronet::Java_TestUploadDataStreamHandler_onCheckInitCallbackNotInvoked(
163 env, jtest_upload_data_stream_handler_, !init_callback_invoked_); 157 env, jtest_upload_data_stream_handler_, !init_callback_invoked_);
164 } 158 }
165 159
166 void TestUploadDataStreamHandler::CheckReadCallbackNotInvokedOnNetworkThread() { 160 void TestUploadDataStreamHandler::CheckReadCallbackNotInvokedOnNetworkThread() {
167 DCHECK(network_thread_->task_runner()->BelongsToCurrentThread()); 161 DCHECK(network_thread_->BelongsToCurrentThread());
168 JNIEnv* env = base::android::AttachCurrentThread(); 162 JNIEnv* env = base::android::AttachCurrentThread();
169 cronet::Java_TestUploadDataStreamHandler_onCheckReadCallbackNotInvoked( 163 cronet::Java_TestUploadDataStreamHandler_onCheckReadCallbackNotInvoked(
170 env, jtest_upload_data_stream_handler_, !read_callback_invoked_); 164 env, jtest_upload_data_stream_handler_, !read_callback_invoked_);
171 } 165 }
172 166
173 void TestUploadDataStreamHandler::NotifyJavaReadCompleted() { 167 void TestUploadDataStreamHandler::NotifyJavaReadCompleted() {
174 DCHECK(network_thread_->task_runner()->BelongsToCurrentThread()); 168 DCHECK(network_thread_->BelongsToCurrentThread());
175 JNIEnv* env = base::android::AttachCurrentThread(); 169 JNIEnv* env = base::android::AttachCurrentThread();
176 std::string data_read = ""; 170 std::string data_read = "";
177 if (read_buffer_.get() && bytes_read_ > 0) 171 if (read_buffer_.get() && bytes_read_ > 0)
178 data_read = std::string(read_buffer_->data(), bytes_read_); 172 data_read = std::string(read_buffer_->data(), bytes_read_);
179 cronet::Java_TestUploadDataStreamHandler_onReadCompleted( 173 cronet::Java_TestUploadDataStreamHandler_onReadCompleted(
180 env, jtest_upload_data_stream_handler_, bytes_read_, 174 env, jtest_upload_data_stream_handler_, bytes_read_,
181 base::android::ConvertUTF8ToJavaString(env, data_read).obj()); 175 base::android::ConvertUTF8ToJavaString(env, data_read).obj());
182 } 176 }
183 177
184 static jlong CreateTestUploadDataStreamHandler( 178 static jlong CreateTestUploadDataStreamHandler(
185 JNIEnv* env, 179 JNIEnv* env,
186 const JavaParamRef<jobject>& jtest_upload_data_stream_handler, 180 const JavaParamRef<jobject>& jtest_upload_data_stream_handler,
187 jlong jupload_data_stream) { 181 jlong jupload_data_stream,
182 jlong jcontext_adapter) {
188 std::unique_ptr<net::UploadDataStream> upload_data_stream( 183 std::unique_ptr<net::UploadDataStream> upload_data_stream(
189 reinterpret_cast<net::UploadDataStream*>(jupload_data_stream)); 184 reinterpret_cast<net::UploadDataStream*>(jupload_data_stream));
190 TestUploadDataStreamHandler* handler = new TestUploadDataStreamHandler( 185 TestUploadDataStreamHandler* handler = new TestUploadDataStreamHandler(
191 std::move(upload_data_stream), env, jtest_upload_data_stream_handler); 186 std::move(upload_data_stream), env, jtest_upload_data_stream_handler,
187 jcontext_adapter);
192 return reinterpret_cast<jlong>(handler); 188 return reinterpret_cast<jlong>(handler);
193 } 189 }
194 190
195 bool TestUploadDataStreamHandlerRegisterJni(JNIEnv* env) { 191 bool TestUploadDataStreamHandlerRegisterJni(JNIEnv* env) {
196 return RegisterNativesImpl(env); 192 return RegisterNativesImpl(env);
197 } 193 }
198 194
199 } // namespace cronet 195 } // namespace cronet
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698