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.test.suitebuilder.annotation.SmallTest;
9 import org.chromium.base.test.util.Feature;
10 import org.chromium.net.HttpUrlRequest;
11 import org.chromium.net.HttpUrlRequestListener;
13 import java.io.ByteArrayInputStream;
14 import java.io.InputStream;
15 import java.nio.channels.Channels;
16 import java.nio.channels.ReadableByteChannel;
17 import java.util.HashMap;
20 * Test fixture to test upload APIs. Uses an in-process test server.
22 public class UploadTest extends CronetTestBase {
23 private static final String UPLOAD_DATA = "Nifty upload data!";
24 private static final String UPLOAD_CHANNEL_DATA = "Upload channel data";
26 private CronetTestActivity mActivity;
29 protected void setUp() throws Exception {
31 mActivity = launchCronetTestApp();
32 assertNotNull(mActivity);
33 assertTrue(UploadTestServer.startUploadTestServer());
36 private HttpUrlRequest createRequest(
37 String url, HttpUrlRequestListener listener) {
38 HashMap<String, String> headers = new HashMap<String, String>();
39 return mActivity.mRequestFactory.createRequest(
40 url, HttpUrlRequest.REQUEST_PRIORITY_MEDIUM, headers, listener);
44 * Sets request to have an upload channel containing the given data.
45 * uploadDataLength should generally be uploadData.length(), unless a test
46 * needs to get a read error.
48 private void setUploadChannel(HttpUrlRequest request,
51 int uploadDataLength) {
52 InputStream uploadDataStream = new ByteArrayInputStream(
53 uploadData.getBytes());
54 ReadableByteChannel uploadDataChannel =
55 Channels.newChannel(uploadDataStream);
56 request.setUploadChannel(
57 contentType, uploadDataChannel, uploadDataLength);
61 * Tests uploading an in-memory string.
65 public void testUploadData() throws Exception {
66 TestHttpUrlRequestListener listener = new TestHttpUrlRequestListener();
67 HttpUrlRequest request = createRequest(
68 UploadTestServer.getEchoBodyURL(), listener);
69 request.setUploadData("text/plain", UPLOAD_DATA.getBytes("UTF8"));
71 listener.blockForComplete();
73 assertEquals(200, listener.mHttpStatusCode);
74 assertEquals(UPLOAD_DATA, listener.mResponseAsString);
78 * Tests uploading an in-memory string with a redirect that preserves the
79 * POST body. This makes sure the body is correctly sent again.
83 public void testUploadDataWithRedirect() throws Exception {
84 TestHttpUrlRequestListener listener = new TestHttpUrlRequestListener();
85 HttpUrlRequest request = createRequest(
86 UploadTestServer.getRedirectToEchoBody(), listener);
87 request.setUploadData("text/plain", UPLOAD_DATA.getBytes("UTF8"));
89 listener.blockForComplete();
91 assertEquals(200, listener.mHttpStatusCode);
92 assertEquals(UPLOAD_DATA, listener.mResponseAsString);
96 * Tests Content-Type can be set when uploading an in-memory string.
100 public void testUploadDataContentType() throws Exception {
101 String contentTypes[] = {"text/plain", "chicken/spicy"};
102 for (String contentType : contentTypes) {
103 TestHttpUrlRequestListener listener =
104 new TestHttpUrlRequestListener();
105 HttpUrlRequest request = createRequest(
106 UploadTestServer.getEchoHeaderURL("Content-Type"),
108 request.setUploadData(contentType, UPLOAD_DATA.getBytes("UTF8"));
110 listener.blockForComplete();
112 assertEquals(200, listener.mHttpStatusCode);
113 assertEquals(contentType, listener.mResponseAsString);
118 * Tests the default method when uploading.
122 public void testDefaultUploadMethod() throws Exception {
123 TestHttpUrlRequestListener listener = new TestHttpUrlRequestListener();
124 HttpUrlRequest request = createRequest(
125 UploadTestServer.getEchoMethodURL(), listener);
126 request.setUploadData("text/plain", UPLOAD_DATA.getBytes("UTF8"));
128 listener.blockForComplete();
130 assertEquals(200, listener.mHttpStatusCode);
131 assertEquals("POST", listener.mResponseAsString);
135 * Tests methods can be set when uploading.
139 public void testUploadMethods() throws Exception {
140 String uploadMethods[] = {"POST", "PUT"};
141 for (String uploadMethod : uploadMethods) {
142 TestHttpUrlRequestListener listener =
143 new TestHttpUrlRequestListener();
144 HttpUrlRequest request = createRequest(
145 UploadTestServer.getEchoMethodURL(), listener);
146 request.setHttpMethod(uploadMethod);
147 request.setUploadData("text/plain", UPLOAD_DATA.getBytes("UTF8"));
149 listener.blockForComplete();
151 assertEquals(200, listener.mHttpStatusCode);
152 assertEquals(uploadMethod, listener.mResponseAsString);
157 * Tests uploading from a channel.
161 public void testUploadChannel() throws Exception {
162 TestHttpUrlRequestListener listener = new TestHttpUrlRequestListener();
163 HttpUrlRequest request = createRequest(
164 UploadTestServer.getEchoBodyURL(), listener);
165 setUploadChannel(request, "text/plain", UPLOAD_CHANNEL_DATA,
166 UPLOAD_CHANNEL_DATA.length());
168 listener.blockForComplete();
170 assertEquals(200, listener.mHttpStatusCode);
171 assertEquals(UPLOAD_CHANNEL_DATA, listener.mResponseAsString);
175 * Tests uploading from a channel in the case a redirect preserves the post
176 * body. Since channels can't be rewound, the request fails when we try to
177 * rewind it to send the second request.
181 public void testUploadChannelWithRedirect() throws Exception {
182 TestHttpUrlRequestListener listener = new TestHttpUrlRequestListener();
183 HttpUrlRequest request = createRequest(
184 UploadTestServer.getRedirectToEchoBody(), listener);
185 setUploadChannel(request, "text/plain", UPLOAD_CHANNEL_DATA,
186 UPLOAD_CHANNEL_DATA.length());
188 listener.blockForComplete();
190 assertEquals(0, listener.mHttpStatusCode);
192 "System error: net::ERR_UPLOAD_STREAM_REWIND_NOT_SUPPORTED(-25)",
193 listener.mException.getMessage());
197 * Tests uploading from a channel when there's a read error. The body
198 * should be 0-padded.
202 public void testUploadChannelWithReadError() throws Exception {
203 TestHttpUrlRequestListener listener = new TestHttpUrlRequestListener();
204 HttpUrlRequest request = createRequest(
205 UploadTestServer.getEchoBodyURL(), listener);
206 setUploadChannel(request, "text/plain", UPLOAD_CHANNEL_DATA,
207 UPLOAD_CHANNEL_DATA.length() + 2);
209 listener.blockForComplete();
211 assertEquals(200, listener.mHttpStatusCode);
212 assertEquals(UPLOAD_CHANNEL_DATA + "\0\0", listener.mResponseAsString);
216 * Tests Content-Type can be set when uploading from a channel.
220 public void testUploadChannelContentType() throws Exception {
221 String contentTypes[] = {"text/plain", "chicken/spicy"};
222 for (String contentType : contentTypes) {
223 TestHttpUrlRequestListener listener =
224 new TestHttpUrlRequestListener();
225 HttpUrlRequest request = createRequest(
226 UploadTestServer.getEchoHeaderURL("Content-Type"),
228 setUploadChannel(request, contentType, UPLOAD_CHANNEL_DATA,
229 UPLOAD_CHANNEL_DATA.length());
231 listener.blockForComplete();
233 assertEquals(200, listener.mHttpStatusCode);
234 assertEquals(contentType, listener.mResponseAsString);