blob: 3a462d84506624a8e0806c47a8d4c287a9ae6f07 [file] [log] [blame]
// 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