1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
|
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/cronet/android/test/cronet_test_util.h"
#include "base/android/jni_android.h"
#include "base/android/jni_string.h"
#include "base/message_loop/message_loop.h"
#include "base/threading/thread_task_runner_handle.h"
#include "components/cronet/android/cronet_url_request_adapter.h"
#include "components/cronet/android/cronet_url_request_context_adapter.h"
#include "jni/CronetTestUtil_jni.h"
#include "net/url_request/url_request.h"
using base::android::JavaParamRef;
namespace cronet {
jint GetLoadFlags(JNIEnv* env,
const JavaParamRef<jclass>& jcaller,
const jlong jurl_request_adapter) {
return TestUtil::GetURLRequest(jurl_request_adapter)->load_flags();
}
// static
scoped_refptr<base::SingleThreadTaskRunner> TestUtil::GetTaskRunner(
jlong jcontext_adapter) {
CronetURLRequestContextAdapter* context_adapter =
reinterpret_cast<CronetURLRequestContextAdapter*>(jcontext_adapter);
return context_adapter->network_thread_->task_runner();
}
// static
net::URLRequestContext* TestUtil::GetURLRequestContext(jlong jcontext_adapter) {
CronetURLRequestContextAdapter* context_adapter =
reinterpret_cast<CronetURLRequestContextAdapter*>(jcontext_adapter);
return context_adapter->context_.get();
}
// static
void TestUtil::RunAfterContextInitOnNetworkThread(jlong jcontext_adapter,
const base::Closure& task) {
CronetURLRequestContextAdapter* context_adapter =
reinterpret_cast<CronetURLRequestContextAdapter*>(jcontext_adapter);
if (context_adapter->is_context_initialized_) {
task.Run();
} else {
context_adapter->tasks_waiting_for_context_.push(task);
}
}
// static
void TestUtil::RunAfterContextInit(jlong jcontext_adapter,
const base::Closure& task) {
GetTaskRunner(jcontext_adapter)
->PostTask(FROM_HERE,
base::Bind(&TestUtil::RunAfterContextInitOnNetworkThread,
jcontext_adapter, task));
}
// static
net::URLRequest* TestUtil::GetURLRequest(jlong jrequest_adapter) {
CronetURLRequestAdapter* request_adapter =
reinterpret_cast<CronetURLRequestAdapter*>(jrequest_adapter);
return request_adapter->url_request_.get();
}
static void PrepareNetworkThreadOnNetworkThread(jlong jcontext_adapter) {
(new base::MessageLoopForIO())
->SetTaskRunner(TestUtil::GetTaskRunner(jcontext_adapter));
}
// Tests need to call into libcronet.so code on libcronet.so threads.
// libcronet.so's threads are registered with static tables for MessageLoops
// and SingleThreadTaskRunners in libcronet.so, so libcronet_test.so
// functions that try and access these tables will find missing entries in
// the corresponding static tables in libcronet_test.so. Fix this by
// initializing a MessageLoop and SingleThreadTaskRunner in libcronet_test.so
// for these threads. Called from Java CronetTestUtil class.
void PrepareNetworkThread(JNIEnv* env,
const JavaParamRef<jclass>& jcaller,
jlong jcontext_adapter) {
TestUtil::GetTaskRunner(jcontext_adapter)
->PostTask(FROM_HERE, base::Bind(&PrepareNetworkThreadOnNetworkThread,
jcontext_adapter));
}
static void CleanupNetworkThreadOnNetworkThread() {
delete base::MessageLoop::current();
}
// Called from Java CronetTestUtil class.
void CleanupNetworkThread(JNIEnv* env,
const JavaParamRef<jclass>& jcaller,
jlong jcontext_adapter) {
TestUtil::GetTaskRunner(jcontext_adapter)
->PostTask(FROM_HERE, base::Bind(&CleanupNetworkThreadOnNetworkThread));
}
bool TestUtil::Register(JNIEnv* env) {
return RegisterNativesImpl(env);
}
} // namespace cronet
|