2 * Copyright (C) 2007 The Android Open Source Project
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 import android.net.http.RequestHandle;
20 import android.net.http.RequestQueue;
21 import android.test.AndroidTestCase;
22 import android.test.suitebuilder.annotation.Suppress;
23 import android.util.Log;
24 import android.webkit.CookieSyncManager;
25 import com.google.android.collect.Maps;
27 import java.io.ByteArrayInputStream;
28 import java.io.InputStream;
29 import java.util.HashMap;
33 * Container class for all RequestAPI tests
35 //http://b/issue?id=1200337
37 public class RequestAPITest extends AndroidTestCase implements HttpConstants {
38 private static final String LOGTAG = "http";
42 GET, HEAD, POST with differing parameters to RequestQueue
43 More reuse and pipelining tests - testing for server closing unexpectedly
46 // Sync object for synchronizing end of each test that does communications
47 public static Object syncObj = new Object();
49 private RequestQueue mRequestQueue;
50 private TestWebServer mTestWebServer;
52 protected void setUp() throws Exception {
54 Log.d(LOGTAG, "Base setup context = " + mContext);
55 mRequestQueue = new RequestQueue(mContext);
56 CookieSyncManager.createInstance(mContext);
58 mTestWebServer = new TestWebServer();
59 mTestWebServer.initServer(8080, true);
62 protected void tearDown() throws Exception {
63 Log.d(LOGTAG, "Base tearDown");
64 mTestWebServer.close();
65 Log.d(LOGTAG, "Base teardown done");
70 public void verifyFailure(Map<String, String> headers) {
72 RequestHandle handle =
73 mRequestQueue.queueRequest(
74 "http://localhost:8080/test1", "GET", headers, null,
77 handle.waitUntilComplete();
78 fail("expected exception not thrown");
79 } catch (RuntimeException e) {
84 public void testRequestAddNullHeader() throws Exception {
86 * Test Request.addHeader throws a NullPointerException if a null
87 * header is attempted to be set
89 Log.d(LOGTAG, "testRequestAddNullHeader start ");
90 Map<String, String> headers = Maps.newHashMap();
91 headers.put(null, null);
92 verifyFailure(headers);
93 Log.d(LOGTAG, "testRequestAddNullHeader - returning");
96 public void testRequestAddNullValue() throws Exception {
98 * Test Request.addHeader throws a RuntimeException if a null
99 * value is attempted to be set
101 Log.d(LOGTAG, "testRequestAddNullValue start ");
102 Map<String, String> headers = Maps.newHashMap();
103 headers.put("TestHeader", null);
104 verifyFailure(headers);
105 Log.d(LOGTAG, "testRequestAddNullValue - returning");
108 public void testRequestAddEmptyValue() throws Exception {
110 * Test Request.addEmptyValue throws a RuntimeException if an empty
111 * header is attempted to be set
113 Log.d(LOGTAG, "testRequestAddEmptyValue start ");
114 Map<String, String> headers = Maps.newHashMap();
115 headers.put("TestHeader", "");
116 verifyFailure(headers);
117 Log.d(LOGTAG, "testRequestAddEmptyValue - returning");
120 public void verifySuccess(Map<String, String> headers) {
121 mTestWebServer.setKeepAlive(false);
122 RequestHandle handle = mRequestQueue.queueRequest(
123 "http://localhost:8080/test1", "GET", headers, null,
125 handle.waitUntilComplete();
128 public void testRequestAddHeader() throws Exception {
130 * Test Request.addHeader with a valid header and value can be set without
131 * generating and exception
133 Log.d(LOGTAG, "testRequestAddHeader start ");
134 Map<String, String> headers = Maps.newHashMap();
135 headers.put("TestHeader", "RequestAddHeader");
136 verifySuccess(headers);
137 Log.d(LOGTAG, "testRequestAddHeader - returning");
140 public void testRequestAddMultiHeader() throws Exception {
142 * Test multiple calls to Request.addHeader with valid headers and values
143 * can be set without generating and exception
145 Log.d(LOGTAG, "testRequestAddMultiHeader start ");
146 Map<String, String> headers = Maps.newHashMap();
147 headers.put("TestHeader", "RequestAddMultiHeader");
148 headers.put("TestHeader2", "RequestAddMultiHeader");
149 headers.put("TestHeader3", "RequestAddMultiHeader");
150 verifySuccess(headers);
151 Log.d(LOGTAG, "testRequestAddMultiHeader - returning");
154 public void testRequestAddSameHeader() throws Exception {
156 * Test multiple calls to Request.addHeader with valid identical headers
157 * and values can be set without generating and exception
159 Log.d(LOGTAG, "testRequestAddSameHeader start ");
160 Map<String, String> headers = Maps.newHashMap();
161 headers.put("TestHeader", "RequestAddSameHeader");
162 headers.put("TestHeader", "RequestAddSameHeader");
163 headers.put("TestHeader", "RequestAddSameHeader");
164 verifySuccess(headers);
165 Log.d(LOGTAG, "testRequestAddSameHeader - returning");
168 public void testRequestAddNullHeaders() throws Exception {
170 * Test Request.addHeaders with a null header map. This should not generate
171 * any exceptions but accept that there are no headers to add.
173 Log.d(LOGTAG, "testRequestAddNullHeaders start ");
175 Log.d(LOGTAG, "testRequestAddNullHeaders - returning");
178 public void testGet() throws Exception {
180 * Test sending a GET request. Test will pass if the events received
181 * correspond with the expected response. This should respond with the
182 * test data requested.
184 TestEventHandler testEventHandler = new TestEventHandler();
186 mTestWebServer.setKeepAlive(false);
188 Log.d(LOGTAG, "testGet start ");
190 // Load up expected response
191 testEventHandler.expectStatus(200);
192 testEventHandler.expectHeaders();
193 testEventHandler.expectHeaderAdd(requestHeaders[REQ_CONNECTION], "Close");
194 testEventHandler.expectHeaderAdd(requestHeaders[REQ_CONTENT_LENGTH], "52");
195 testEventHandler.expectHeaderAdd(requestHeaders[REQ_CONTENT_TYPE], "text/html");
196 testEventHandler.expectData(52);
198 RequestHandle handle = mRequestQueue.queueRequest(
199 "http://localhost:8080/test1", "GET", null, testEventHandler,
202 Log.d(LOGTAG, "testGet - sent request. Waiting");
203 handle.waitUntilComplete();
204 Log.d(LOGTAG, "testGet - sent request. Notified");
206 if (!testEventHandler.expectPassed()) {
207 Log.d(LOGTAG, testEventHandler.getFailureMessage());
208 fail("expectPassed was false " + testEventHandler.getFailureMessage());
212 public void testReuse() throws Exception {
214 * Test sending two GET requests. Test will pass if the events
215 * received correspond with the expected response.
217 final String TEST_NAME = "testReuse";
218 Log.d(LOGTAG, TEST_NAME + " start ");
220 TestEventHandler testEventHandler = new TestEventHandler();
222 // Load up expected response
223 testEventHandler.expectStatus(200);
224 testEventHandler.expectHeaders();
226 TestEventHandler testEventHandler2 = new TestEventHandler();
227 testEventHandler2.expectStatus(200);
228 testEventHandler2.expectHeaders();
230 mTestWebServer.setAcceptLimit(2);
232 RequestHandle handle0 = mRequestQueue.queueRequest(
233 "http://localhost:8080/test1", "GET", null, testEventHandler,
235 handle0.waitUntilComplete();
236 RequestHandle handle1 = mRequestQueue.queueRequest(
237 "http://localhost:8080/test1", "GET", null, testEventHandler2,
239 handle1.waitUntilComplete();
241 /* It's not correct to use same listener for multiple
242 requests. Otherwise there would be no distiction between
243 events delivered for either request. */
245 if (!testEventHandler.expectPassed() && !testEventHandler2.expectPassed()) {
246 Log.d(LOGTAG, testEventHandler.getFailureMessage());
247 Log.d(LOGTAG, testEventHandler2.getFailureMessage());
250 Log.d(LOGTAG, TEST_NAME + " - sent request. Notified");
253 public void testHead() throws Exception {
255 * Test sending a HEAD request. Test will pass if the events
256 * delivered match the expected response.
258 TestEventHandler testEventHandler = new TestEventHandler();
260 // Load up expected response
261 testEventHandler.expectStatus(200);
262 testEventHandler.expectHeaders();
263 testEventHandler.expectNoData();
265 mTestWebServer.setKeepAlive(false);
266 mTestWebServer.setAcceptLimit(1);
269 Log.d(LOGTAG, "testHead start - rq = " + mRequestQueue);
271 RequestHandle handle = mRequestQueue.queueRequest(
272 "http://localhost:8080/test1", "HEAD", null, testEventHandler,
275 Log.d(LOGTAG, "testHead - sent request waiting");
276 handle.waitUntilComplete();
278 if (!testEventHandler.expectPassed()) {
279 Log.d(LOGTAG, testEventHandler.getFailureMessage());
280 fail("expectPassed was false " + testEventHandler.getFailureMessage());
284 public void testChunked() throws Exception {
285 TestEventHandler testEventHandler = new TestEventHandler();
287 // Load up expected response
288 testEventHandler.expectStatus(200);
289 testEventHandler.expectHeaders();
291 mTestWebServer.setKeepAlive(false);
292 mTestWebServer.setChunked(true);
293 mTestWebServer.setAcceptLimit(1);
296 Log.d(LOGTAG, "testChunked start - rq = " + mRequestQueue);
298 RequestHandle handle = mRequestQueue.queueRequest(
299 "http://localhost:8080/test1", "GET", null, testEventHandler,
302 Log.d(LOGTAG, "testChunked - sent request waiting");
303 handle.waitUntilComplete();
305 if (!testEventHandler.expectPassed()) {
306 Log.d(LOGTAG, testEventHandler.getFailureMessage());
307 fail("expectPassed was false " + testEventHandler.getFailureMessage());
311 public void verifyRedirect(int statusCode, String testName) throws Exception {
312 final String REDIRECT_TO = "http://localhost:8081/test1";
314 mTestWebServer.setKeepAlive(false);
315 TestWebServer redirectWebServer = new TestWebServer();
316 redirectWebServer.initServer(8081, true);
317 redirectWebServer.setKeepAlive(false);
320 TestEventHandler testEventHandler = new TestEventHandler();
321 // Load up expected response
322 testEventHandler.expectStatus(statusCode);
323 testEventHandler.expectHeaders();
324 testEventHandler.expectHeaderAdd(requestHeaders[REQ_LOCATION], REDIRECT_TO);
326 mTestWebServer.setAcceptLimit(1);
327 mTestWebServer.setRedirect(REDIRECT_TO, statusCode);
328 redirectWebServer.setAcceptLimit(1);
330 Log.d(LOGTAG, testName + " start - rq = " + mRequestQueue);
332 RequestHandle requestHandle = mRequestQueue.queueRequest(
333 "http://localhost:8080/test1", "GET", null, testEventHandler, null, 0);
334 Log.d(LOGTAG, testName + " - sent request waiting");
336 requestHandle.waitUntilComplete();
338 if (!testEventHandler.expectPassed()) {
339 Log.d(LOGTAG, testEventHandler.getFailureMessage());
340 fail("expectPassed was false " + testEventHandler.getFailureMessage());
343 requestHandle.setupRedirect(REDIRECT_TO, statusCode, new HashMap<String, String>());
345 testEventHandler.expectStatus(HttpConstants.HTTP_OK);
346 testEventHandler.expectHeaders();
347 testEventHandler.expectHeaderAdd(requestHeaders[REQ_CONTENT_LENGTH], "52");
348 testEventHandler.expectHeaderAdd(requestHeaders[REQ_CONTENT_TYPE], "text/html");
349 // Server name should be TestWebServer+port
350 // we ignore the server tag, so don't test it
351 // testEventHandler.expectHeaderAdd(requestHeaders[REQ_SERVER], "TestWebServer8081");
352 testEventHandler.expectData(52);
353 testEventHandler.expectEndData();
355 requestHandle.waitUntilComplete();
357 if (!testEventHandler.expectPassed()) {
358 Log.d(LOGTAG, testEventHandler.getFailureMessage());
359 fail("expectPassed was false " + testEventHandler.getFailureMessage());
362 Log.d(LOGTAG, testName + " - returning");
363 redirectWebServer.close();
367 public void testRedirect301() throws Exception {
368 verifyRedirect(HttpConstants.HTTP_MOVED_PERM, "testRedirect301");
371 public void testRedirect302() throws Exception {
372 verifyRedirect(HttpConstants.HTTP_MOVED_TEMP, "testRedirect302");
375 public void testRedirect303() throws Exception {
376 verifyRedirect(HttpConstants.HTTP_SEE_OTHER, "testRedirect303");
379 public void testRedirect307() throws Exception {
380 verifyRedirect(307, "testRedirect307");
383 public void testGetAndHead() throws Exception {
385 * Test sending a GET and a HEAD request. Test will pass if the
386 * event received correspond with the expected response. The two
387 * requests should respond the same test data.
389 mTestWebServer.setKeepAlive(true);
390 mTestWebServer.setAcceptLimit(2);
392 TestEventHandler testEventHandler = new TestEventHandler();
393 testEventHandler.expectStatus(200);
394 testEventHandler.expectHeaders();
396 TestEventHandler leh2 = new TestEventHandler();
397 leh2.expectStatus(200);
398 leh2.expectHeaders();
400 RequestHandle handle0 = mRequestQueue.queueRequest(
401 "http://localhost:8080/test1", "GET", null, testEventHandler, null, 0);
402 handle0.waitUntilComplete();
403 RequestHandle handle1 = mRequestQueue.queueRequest(
404 "http://localhost:8080/test1", "HEAD", null, testEventHandler, null, 0);
406 Log.d(LOGTAG, "testGetAndHead - sent request. Waiting");
407 handle1.waitUntilComplete();
409 if (!testEventHandler.expectPassed() && !leh2.expectPassed()) {
410 Log.d(LOGTAG, testEventHandler.getFailureMessage());
411 Log.d(LOGTAG, leh2.getFailureMessage());
416 public void testPost() throws Exception {
418 * Test sending a POST request with no body data. Test will pass if the event
419 * received correspond with the expected response. This should respond with
420 * the test data requested.
422 TestEventHandler testEventHandler = new TestEventHandler();
424 // Load up expected response
425 testEventHandler.expectStatus(200);
426 testEventHandler.expectHeaders();
427 testEventHandler.expectData(52);
429 mTestWebServer.setKeepAlive(false);
430 mTestWebServer.setAcceptLimit(1);
432 Log.d(LOGTAG, "testPost start - rq = " + mRequestQueue);
434 RequestHandle handle = mRequestQueue.queueRequest(
435 "http://localhost:8080/test1", "POST", null, testEventHandler, null, 0);
437 Log.d(LOGTAG, "testPost - sent request waiting");
438 handle.waitUntilComplete();
440 if (!testEventHandler.expectPassed()) {
441 Log.d(LOGTAG, testEventHandler.getFailureMessage());
442 fail("expectPassed was false " + testEventHandler.getFailureMessage());
447 public void testPostWithData() throws Exception {
449 * Test sending a POST request with body data. Test will pass if the event
450 * received correspond with the expected response. This should respond with
451 * the test data requested.
454 TestEventHandler testEventHandler = new TestEventHandler();
455 // Load up expected response
456 testEventHandler.expectStatus(200);
457 testEventHandler.expectHeaders();
458 testEventHandler.expectData(52);
460 mTestWebServer.setKeepAlive(false);
461 mTestWebServer.setAcceptLimit(1);
463 Log.d(LOGTAG, "testPostWithData start - rq = " + mRequestQueue);
465 String mBody = TestWebData.postContent;
466 int bodyLength = mBody.length();
467 if (bodyLength > 0) {
468 Log.v(LOGTAG, "testPostWithData: body " + mBody);
470 InputStream bodyProvider = new ByteArrayInputStream(mBody.getBytes());
472 RequestHandle handle = mRequestQueue.queueRequest(
473 "http://localhost:8080/test1", "POST", null, testEventHandler, bodyProvider, bodyLength);
475 Log.d(LOGTAG, "testPostWithData - sent request waiting");
476 handle.waitUntilComplete();
478 if (!testEventHandler.expectPassed()) {
479 Log.d(LOGTAG, testEventHandler.getFailureMessage());
480 fail("expectPassed was false " + testEventHandler.getFailureMessage());