1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 package org.chromium.cronet_test_apk;
7 import android.os.ConditionVariable;
9 import android.test.suitebuilder.annotation.SmallTest;
11 import org.chromium.base.test.util.Feature;
12 import org.chromium.net.ChromiumUrlRequest;
13 import org.chromium.net.HttpUrlRequest;
14 import org.chromium.net.HttpUrlRequestFactoryConfig;
15 import org.chromium.net.HttpUrlRequestListener;
18 import java.util.HashMap;
21 * Example test that just starts the cronet sample.
23 public class CronetUrlTest extends CronetTestBase {
24 // URL used for base tests.
25 private static final String URL = "http://127.0.0.1:8000";
29 public void testLoadUrl() throws Exception {
30 CronetTestActivity activity = launchCronetTestAppWithUrl(URL);
32 // Make sure the activity was created as expected.
33 assertNotNull(activity);
35 waitForActiveShellToBeDoneLoading();
37 // Make sure that the URL is set as expected.
38 assertEquals(URL, activity.getUrl());
39 assertEquals(200, activity.getHttpStatusCode());
44 public void testInvalidUrl() throws Exception {
45 CronetTestActivity activity = launchCronetTestAppWithUrl(
48 // Make sure the activity was created as expected.
49 assertNotNull(activity);
51 waitForActiveShellToBeDoneLoading();
53 // The load should fail.
54 assertEquals(0, activity.getHttpStatusCode());
59 public void testPostData() throws Exception {
60 String[] commandLineArgs = {
61 CronetTestActivity.POST_DATA_KEY, "test" };
62 CronetTestActivity activity =
63 launchCronetTestAppWithUrlAndCommandLineArgs(URL,
66 // Make sure the activity was created as expected.
67 assertNotNull(activity);
69 waitForActiveShellToBeDoneLoading();
71 // Make sure that the URL is set as expected.
72 assertEquals(URL, activity.getUrl());
73 assertEquals(200, activity.getHttpStatusCode());
78 public void testNetLog() throws Exception {
79 CronetTestActivity activity = launchCronetTestAppWithUrl(
82 // Make sure the activity was created as expected.
83 assertNotNull(activity);
85 waitForActiveShellToBeDoneLoading();
86 File file = File.createTempFile("cronet", "json");
87 activity.mChromiumRequestFactory.getRequestContext().startNetLogToFile(
89 activity.startWithURL(URL);
91 activity.mChromiumRequestFactory.getRequestContext().stopNetLog();
92 assertTrue(file.exists());
93 assertTrue(file.length() != 0);
94 assertTrue(file.delete());
95 assertTrue(!file.exists());
98 class SimpleHttpUrlRequestListener implements HttpUrlRequestListener {
99 ConditionVariable mComplete = new ConditionVariable();
100 public String negotiatedProtocol;
101 public int httpStatusCode = 0;
102 public byte httpResponseData[];
104 public SimpleHttpUrlRequestListener() {
108 public void onResponseStarted(HttpUrlRequest request) {
109 negotiatedProtocol = request.getNegotiatedProtocol();
110 httpStatusCode = request.getHttpStatusCode();
114 public void onRequestComplete(HttpUrlRequest request) {
115 httpResponseData = request.getResponseAsBytes();
119 public void blockForComplete() {
123 public void resetComplete() {
128 class BadHttpUrlRequestListener extends SimpleHttpUrlRequestListener {
129 static final String THROW_TAG = "BadListener";
131 public BadHttpUrlRequestListener() {
135 public void onResponseStarted(HttpUrlRequest request) {
136 throw new NullPointerException(THROW_TAG);
142 public void testCalledByNativeException() throws Exception {
143 CronetTestActivity activity = launchCronetTestAppWithUrl(URL);
145 // Make sure the activity was created as expected.
146 assertNotNull(activity);
148 waitForActiveShellToBeDoneLoading();
150 HashMap<String, String> headers = new HashMap<String, String>();
151 BadHttpUrlRequestListener listener = new BadHttpUrlRequestListener();
153 // Create request with bad listener to trigger an exception.
154 HttpUrlRequest request = activity.mChromiumRequestFactory.createRequest(
155 URL, HttpUrlRequest.REQUEST_PRIORITY_MEDIUM, headers, listener);
157 listener.blockForComplete();
158 assertTrue(request.isCanceled());
159 assertNotNull(request.getException());
160 assertEquals(listener.THROW_TAG,
161 request.getException().getCause().getMessage());
166 public void testSetUploadDataWithNullContentType() throws Exception {
167 CronetTestActivity activity = launchCronetTestAppWithUrl(URL);
169 // Make sure the activity was created as expected.
170 assertNotNull(activity);
172 waitForActiveShellToBeDoneLoading();
174 HashMap<String, String> headers = new HashMap<String, String>();
175 BadHttpUrlRequestListener listener = new BadHttpUrlRequestListener();
178 HttpUrlRequest request = activity.mChromiumRequestFactory.createRequest(
179 URL, HttpUrlRequest.REQUEST_PRIORITY_MEDIUM, headers, listener);
180 byte[] uploadData = new byte[] {1, 2, 3};
182 request.setUploadData(null, uploadData);
183 fail("setUploadData should throw on null content type");
184 } catch (NullPointerException e) {
185 // Nothing to do here.
191 public void disabled_testQuicLoadUrl() throws Exception {
192 HttpUrlRequestFactoryConfig config = new HttpUrlRequestFactoryConfig();
193 // TODO(mef): Test Quic end-to-end using local QUIC server.
194 String quicURL = "https://www.google.com:443";
195 String quicNegotiatedProtocol = "quic/1+spdy/3";
196 config.enableQUIC(true);
197 config.addQuicHint("www.google.com", 443, 443);
199 String[] commandLineArgs = {
200 CronetTestActivity.CONFIG_KEY, config.toString() };
201 CronetTestActivity activity =
202 launchCronetTestAppWithUrlAndCommandLineArgs(quicURL,
205 // Make sure the activity was created as expected.
206 assertNotNull(activity);
207 waitForActiveShellToBeDoneLoading();
209 HashMap<String, String> headers = new HashMap<String, String>();
210 SimpleHttpUrlRequestListener listener =
211 new SimpleHttpUrlRequestListener();
213 // Try several times as first request may not use QUIC.
214 // TODO(mef): Remove loop after adding http server properties manager.
215 for (int i = 0; i < 10; ++i) {
216 ChromiumUrlRequest request =
217 activity.mChromiumRequestFactory.createRequest(
219 HttpUrlRequest.REQUEST_PRIORITY_MEDIUM,
223 listener.blockForComplete();
224 assertEquals(200, listener.httpStatusCode);
225 if (listener.negotiatedProtocol.equals(quicNegotiatedProtocol))
229 listener.resetComplete();
232 assertEquals(quicNegotiatedProtocol, listener.negotiatedProtocol);
237 public void testLegacyLoadUrl() throws Exception {
238 HttpUrlRequestFactoryConfig config = new HttpUrlRequestFactoryConfig();
239 config.enableLegacyMode(true);
240 // TODO(mef) fix tests so that library isn't loaded for legacy stack
241 config.setLibraryName("cronet_tests");
243 String[] commandLineArgs = {
244 CronetTestActivity.CONFIG_KEY, config.toString() };
245 CronetTestActivity activity =
246 launchCronetTestAppWithUrlAndCommandLineArgs(URL,
249 // Make sure the activity was created as expected.
250 assertNotNull(activity);
252 waitForActiveShellToBeDoneLoading();
254 // Make sure that the URL is set as expected.
255 assertEquals(URL, activity.getUrl());
256 assertEquals(200, activity.getHttpStatusCode());
261 public void testRequestHead() throws Exception {
262 CronetTestActivity activity = launchCronetTestAppWithUrl(URL);
264 // Make sure the activity was created as expected.
265 waitForActiveShellToBeDoneLoading();
267 HashMap<String, String> headers = new HashMap<String, String>();
268 SimpleHttpUrlRequestListener listener =
269 new SimpleHttpUrlRequestListener();
272 HttpUrlRequest request = activity.mChromiumRequestFactory.createRequest(
273 URL, HttpUrlRequest.REQUEST_PRIORITY_MEDIUM, headers, listener);
274 request.setHttpMethod("HEAD");
276 listener.blockForComplete();
277 assertEquals(200, listener.httpStatusCode);
278 // HEAD requests do not get any response data and Content-Length must be
280 assertEquals(0, listener.httpResponseData.length);