Commit a21168de authored by xunjieli's avatar xunjieli Committed by Commit bot

Setup initial mock url request job tests for Cronet

This CL adds two initial tests that use mock URLRequestJob to
intercept URL requests.

BUG=415781

Review URL: https://codereview.chromium.org/558333007

Cr-Commit-Position: refs/heads/master@{#296201}
parent 7dbed157
......@@ -400,6 +400,7 @@
'type': 'none',
'sources': [
'cronet/android/test/src/org/chromium/cronet_test_apk/CronetTestUtil.java',
'cronet/android/test/javatests/src/org/chromium/cronet_test_apk/MockUrlRequestJobTest.java',
],
'variables': {
'jni_gen_package': 'cronet_tests',
......@@ -411,14 +412,24 @@
'type': 'shared_library',
'sources': [
'cronet/android/test/cronet_test_jni.cc',
'cronet/android/test/mock_url_request_job_test.cc',
'cronet/android/test/mock_url_request_job_test.h',
'../net/base/directory_lister.cc',
'../net/base/directory_lister.h',
'../net/url_request/url_request_file_job.cc',
'../net/url_request/url_request_file_job.h',
],
'dependencies': [
'cronet_static',
'cronet_tests_jni_headers',
'../base/base.gyp:base',
'../net/net.gyp:net',
'../net/net.gyp:net_test_support',
'../net/net.gyp:quic_tools',
'../url/url.gyp:url_lib',
'../base/base.gyp:base_i18n',
'../third_party/icu/icu.gyp:icui18n',
'../third_party/icu/icu.gyp:icuuc',
],
},
{
......@@ -431,6 +442,7 @@
'apk_name': 'CronetTest',
'java_in_dir': 'cronet/android/test',
'resource_dir': 'cronet/android/test/res',
'asset_location': 'cronet/android/test/assets',
'native_lib_target': 'libcronet_tests',
},
'includes': [ '../build/java_apk.gypi' ],
......
<!DOCTYPE html>
<html>
<head>
<title>Not found</title>
<p>Test page loaded.</p>
</head>
</html>
<!DOCTYPE html>
<html>
<head>
<title>Redirect</title>
<p>Redirecting...</p>
</head>
</html>
HTTP/1.1 302 Found
Location: http://mock.http/success.txt
HTTP/1.1 200 OK
Content-Type: text/plain
Access-Control-Allow-Origin: *
......@@ -8,11 +8,12 @@
#include "base/android/jni_android.h"
#include "base/android/jni_registrar.h"
#include "components/cronet/android/cronet_loader.h"
#include "mock_url_request_job_test.h"
namespace {
const base::android::RegistrationMethod kCronetTestsRegisteredMethods[] = {
{"BaseAndroid", base::android::RegisterJni},
{"MockURLRequestJobTest", cronet::RegisterMockUrlRequestJobTest},
};
} // namespace
......
// Copyright 2014 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.
package org.chromium.cronet_test_apk;
import android.os.ConditionVariable;
import android.test.suitebuilder.annotation.SmallTest;
import android.util.Log;
import org.chromium.base.JNINamespace;
import org.chromium.base.test.util.Feature;
import org.chromium.net.HttpUrlRequest;
import org.chromium.net.HttpUrlRequestListener;
import java.util.HashMap;
// Tests that use mock URLRequestJobs to simulate URL requests.
@JNINamespace("cronet")
public class MockUrlRequestJobTest extends CronetTestBase {
private static final String TAG = "MockURLRequestJobTest";
private static final String MOCK_CRONET_TEST_SUCCESS_URL =
"http://mock.http/success.txt";
private static final String MOCK_CRONET_TEST_REDIRECT_URL =
"http://mock.http/redirect.html";
private static final String MOCK_CRONET_TEST_NOTFOUND_URL =
"http://mock.http/notfound.html";
private static final String MOCK_CRONET_TEST_FAILED_URL =
"http://mock.failed.request/-2";
class MockHttpUrlRequestListener implements HttpUrlRequestListener {
ConditionVariable mComplete = new ConditionVariable();
public int mHttpStatusCode = 0;
public String mUrl;
public byte[] mResponseAsBytes;
public MockHttpUrlRequestListener() {
}
@Override
public void onResponseStarted(HttpUrlRequest request) {
Log.i(TAG, "****** Response Started, content length is " +
request.getContentLength());
Log.i(TAG, "*** Headers Are *** " + request.getAllHeaders());
mHttpStatusCode = request.getHttpStatusCode();
}
public void blockForComplete() {
mComplete.block();
}
@Override
public void onRequestComplete(HttpUrlRequest request) {
mUrl = request.getUrl();
mResponseAsBytes = request.getResponseAsBytes();
mComplete.open();
Log.i(TAG, "****** Request Complete, status code is " +
request.getHttpStatusCode());
}
}
// Helper function to create a HttpUrlRequest with the specified url.
private MockHttpUrlRequestListener createUrlRequestAndWaitForComplete(
String url) {
CronetTestActivity activity = launchCronetTestApp();
assertNotNull(activity);
// AddUrlInterceptors() after native application context is initialized.
nativeAddUrlInterceptors();
HashMap<String, String> headers = new HashMap<String, String>();
MockHttpUrlRequestListener listener = new MockHttpUrlRequestListener();
HttpUrlRequest request = activity.mChromiumRequestFactory.createRequest(
url,
HttpUrlRequest.REQUEST_PRIORITY_MEDIUM,
headers,
listener);
request.start();
listener.blockForComplete();
return listener;
}
@SmallTest
@Feature({"Cronet"})
public void testSuccessURLRequest() throws Exception {
MockHttpUrlRequestListener listener =
createUrlRequestAndWaitForComplete(MOCK_CRONET_TEST_SUCCESS_URL);
assertEquals(MOCK_CRONET_TEST_SUCCESS_URL, listener.mUrl);
assertEquals(200, listener.mHttpStatusCode);
assertEquals("this is a text file\n",
new String(listener.mResponseAsBytes));
}
@SmallTest
@Feature({"Cronet"})
public void testRedirectURLRequest() throws Exception {
MockHttpUrlRequestListener listener =
createUrlRequestAndWaitForComplete(MOCK_CRONET_TEST_REDIRECT_URL);
// Currently Cronet does not expose the url after redirect.
assertEquals(MOCK_CRONET_TEST_REDIRECT_URL, listener.mUrl);
assertEquals(200, listener.mHttpStatusCode);
// Expect that the request is redirected to success.txt.
assertEquals("this is a text file\n",
new String(listener.mResponseAsBytes));
}
@SmallTest
@Feature({"Cronet"})
public void testNotFoundURLRequest() throws Exception {
MockHttpUrlRequestListener listener =
createUrlRequestAndWaitForComplete(MOCK_CRONET_TEST_NOTFOUND_URL);
assertEquals(MOCK_CRONET_TEST_NOTFOUND_URL, listener.mUrl);
assertEquals(404, listener.mHttpStatusCode);
assertEquals(
"<!DOCTYPE html>\n<html>\n<head>\n<title>Not found</title>\n" +
"<p>Test page loaded.</p>\n</head>\n</html>\n",
new String(listener.mResponseAsBytes));
}
@SmallTest
@Feature({"Cronet"})
public void testFailedURLRequest() throws Exception {
MockHttpUrlRequestListener listener =
createUrlRequestAndWaitForComplete(MOCK_CRONET_TEST_FAILED_URL);
assertEquals(MOCK_CRONET_TEST_FAILED_URL, listener.mUrl);
assertEquals(0, listener.mHttpStatusCode);
}
private native void nativeAddUrlInterceptors();
}
// Copyright 2014 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 "mock_url_request_job_test.h"
#include "base/android/jni_android.h"
#include "base/files/file_path.h"
#include "base/path_service.h"
#include "base/threading/sequenced_worker_pool.h"
#include "jni/MockUrlRequestJobTest_jni.h"
#include "net/test/url_request/url_request_failed_job.h"
#include "net/test/url_request/url_request_mock_http_job.h"
namespace cronet {
static void AddUrlInterceptors(JNIEnv* env, jobject jcaller) {
base::FilePath test_files_root;
PathService::Get(base::DIR_ANDROID_APP_DATA, &test_files_root);
net::URLRequestMockHTTPJob::AddUrlHandler(
test_files_root, new base::SequencedWorkerPool(1, "Worker"));
net::URLRequestFailedJob::AddUrlHandler();
}
bool RegisterMockUrlRequestJobTest(JNIEnv* env) {
return RegisterNativesImpl(env);
}
} // namespace cronet
// Copyright 2014 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.
#ifndef CRONET_MOCK_URL_REQUEST_JOB_TEST_H_
#define CRONET_MOCK_URL_REQUEST_JOB_TEST_H_
#include <jni.h>
namespace cronet {
bool RegisterMockUrlRequestJobTest(JNIEnv* env);
} // namespace cronet
#endif // CRONET_MOCK_URL_REQUEST_JOB_TEST_H_
......@@ -6,10 +6,12 @@ package org.chromium.cronet_test_apk;
import android.app.Activity;
import android.content.Intent;
import android.content.res.AssetManager;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import org.chromium.base.PathUtils;
import org.chromium.net.ChromiumUrlRequestFactory;
import org.chromium.net.HttpUrlRequest;
import org.chromium.net.HttpUrlRequestFactory;
......@@ -17,7 +19,9 @@ import org.chromium.net.HttpUrlRequestFactoryConfig;
import org.chromium.net.HttpUrlRequestListener;
import java.io.ByteArrayInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
......@@ -61,6 +65,19 @@ public class CronetTestActivity extends Activity {
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (!loadTestFiles()) {
Log.e(TAG, "Loading test files failed");
return;
}
try {
System.loadLibrary("cronet_tests");
} catch (UnsatisfiedLinkError e) {
Log.e(TAG, "libcronet_test initialization failed.", e);
finish();
return;
}
HttpUrlRequestFactoryConfig config = new HttpUrlRequestFactoryConfig();
config.enableHttpCache(HttpUrlRequestFactoryConfig.HttpCache.IN_MEMORY,
100 * 1024)
......@@ -95,6 +112,50 @@ public class CronetTestActivity extends Activity {
}
}
private boolean loadTestFiles() {
String testFilePath = "test";
String toPath = PathUtils.getDataDirectory(getApplicationContext());
AssetManager assetManager = getAssets();
try {
String[] files = assetManager.list(testFilePath);
Log.i(TAG, "Begin loading " + files.length + " test files.");
for (String file : files) {
Log.i(TAG, "Loading " + file);
if (!copyTestFile(assetManager,
testFilePath + "/" + file,
toPath + "/" + file)) {
return false;
}
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
// Helper function to copy a file to a destination.
private static boolean copyTestFile(AssetManager assetManager,
String testFile,
String testFileCopy) {
try {
InputStream in = assetManager.open(testFile);
OutputStream out = new FileOutputStream(testFileCopy);
byte[] buffer = new byte[1024];
int read;
while ((read = in.read(buffer)) != -1) {
out.write(buffer, 0, read);
}
in.close();
out.flush();
out.close();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
private static String getUrlFromIntent(Intent intent) {
return intent != null ? intent.getDataString() : null;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment