Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(293)

Side by Side Diff: components/cronet/android/test/javatests/src/org/chromium/net/MockUrlRequestJobTest.java

Issue 945843003: [Cronet] Do not call into native adapter after it is destroyed in ChromiumUrlRequest.java (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Do null check on java side and cache status code and text Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 package org.chromium.net; 5 package org.chromium.net;
6 6
7 import android.test.suitebuilder.annotation.LargeTest; 7 import android.test.suitebuilder.annotation.LargeTest;
8 import android.test.suitebuilder.annotation.SmallTest; 8 import android.test.suitebuilder.annotation.SmallTest;
9 9
10 import org.chromium.base.test.util.Feature; 10 import org.chromium.base.test.util.Feature;
11 11
12 import java.io.IOException; 12 import java.io.IOException;
13 import java.nio.ByteBuffer; 13 import java.nio.ByteBuffer;
14 import java.util.HashMap; 14 import java.util.HashMap;
15 import java.util.List; 15 import java.util.List;
16 import java.util.concurrent.Executors; 16 import java.util.concurrent.Executors;
17 17
18 /** 18 /**
19 * Tests that use mock URLRequestJobs to simulate URL requests. 19 * Tests that use mock URLRequestJobs to simulate URL requests.
20 */ 20 */
21 public class MockUrlRequestJobTest extends CronetTestBase { 21 public class MockUrlRequestJobTest extends CronetTestBase {
22 private static final String TAG = "MockURLRequestJobTest"; 22 private static final String TAG = "MockURLRequestJobTest";
23 23
24 private CronetTestActivity mActivity; 24 private CronetTestActivity mActivity;
25 private MockUrlRequestJobFactory mMockUrlRequestJobFactory; 25 private MockUrlRequestJobFactory mMockUrlRequestJobFactory;
26 private TestHttpUrlRequestListener mListener;
27 private HttpUrlRequest mRequest;
26 28
27 // Helper function to create a HttpUrlRequest with the specified url. 29 // Helper function to create a HttpUrlRequest with the specified url.
28 private TestHttpUrlRequestListener createRequestAndWaitForComplete( 30 private void createRequestAndWaitForComplete(
29 String url, boolean disableRedirects) { 31 String url, boolean disableRedirects) {
30 HashMap<String, String> headers = new HashMap<String, String>(); 32 HashMap<String, String> headers = new HashMap<String, String>();
31 TestHttpUrlRequestListener listener = new TestHttpUrlRequestListener(); 33 mListener = new TestHttpUrlRequestListener();
32 34 mRequest = mActivity.mRequestFactory.createRequest(
33 HttpUrlRequest request = mActivity.mRequestFactory.createRequest(
34 url, 35 url,
35 HttpUrlRequest.REQUEST_PRIORITY_MEDIUM, 36 HttpUrlRequest.REQUEST_PRIORITY_MEDIUM,
36 headers, 37 headers,
37 listener); 38 mListener);
38 if (disableRedirects) { 39 if (disableRedirects) {
39 request.disableRedirects(); 40 mRequest.disableRedirects();
40 } 41 }
41 request.start(); 42 mRequest.start();
42 listener.blockForComplete(); 43 mListener.blockForComplete();
43 return listener;
44 } 44 }
45 45
46 @Override 46 @Override
47 protected void setUp() throws Exception { 47 protected void setUp() throws Exception {
48 super.setUp(); 48 super.setUp();
49 mActivity = launchCronetTestApp(); 49 mActivity = launchCronetTestApp();
50 mMockUrlRequestJobFactory = new MockUrlRequestJobFactory( 50 mMockUrlRequestJobFactory = new MockUrlRequestJobFactory(
51 getInstrumentation().getTargetContext()); 51 getInstrumentation().getTargetContext());
52 } 52 }
53 53
54 @SmallTest 54 @SmallTest
55 @Feature({"Cronet"}) 55 @Feature({"Cronet"})
56 public void testSuccessURLRequest() throws Exception { 56 public void testSuccessURLRequest() throws Exception {
57 TestHttpUrlRequestListener listener = createRequestAndWaitForComplete( 57 createRequestAndWaitForComplete(
58 MockUrlRequestJobFactory.SUCCESS_URL, false); 58 MockUrlRequestJobFactory.SUCCESS_URL, false);
59 assertEquals(MockUrlRequestJobFactory.SUCCESS_URL, listener.mUrl); 59 assertEquals(MockUrlRequestJobFactory.SUCCESS_URL, mListener.mUrl);
60 assertEquals(200, listener.mHttpStatusCode); 60 assertEquals(200, mListener.mHttpStatusCode);
61 assertEquals("OK", listener.mHttpStatusText); 61 assertEquals("OK", mListener.mHttpStatusText);
62 assertEquals("this is a text file\n", 62 assertEquals("this is a text file\n",
63 new String(listener.mResponseAsBytes)); 63 new String(mListener.mResponseAsBytes));
64 // Tests that ChromiumUrlRequest caches information which is available
65 // after the native request adapter has been destroyed.
66 assertEquals(200, mRequest.getHttpStatusCode());
67 assertEquals("OK", mRequest.getHttpStatusText());
68 assertNull(mRequest.getException());
64 } 69 }
65 70
66 @SmallTest 71 @SmallTest
67 @Feature({"Cronet"}) 72 @Feature({"Cronet"})
68 public void testRedirectURLRequest() throws Exception { 73 public void testRedirectURLRequest() throws Exception {
69 TestHttpUrlRequestListener listener = createRequestAndWaitForComplete( 74 createRequestAndWaitForComplete(
70 MockUrlRequestJobFactory.REDIRECT_URL, false); 75 MockUrlRequestJobFactory.REDIRECT_URL, false);
71 76 // ChromiumUrlRequest does not expose the url after redirect.
72 // Currently Cronet does not expose the url after redirect. 77 assertEquals(MockUrlRequestJobFactory.REDIRECT_URL, mListener.mUrl);
73 assertEquals(MockUrlRequestJobFactory.REDIRECT_URL, listener.mUrl); 78 assertEquals(200, mListener.mHttpStatusCode);
74 assertEquals(200, listener.mHttpStatusCode); 79 assertEquals("OK", mListener.mHttpStatusText);
75 assertEquals("OK", listener.mHttpStatusText);
76 // Expect that the request is redirected to success.txt. 80 // Expect that the request is redirected to success.txt.
77 assertEquals("this is a text file\n", 81 assertEquals("this is a text file\n",
78 new String(listener.mResponseAsBytes)); 82 new String(mListener.mResponseAsBytes));
83 // Tests that ChromiumUrlRequest caches information which is available
84 // after the native request adapter has been destroyed.
85 assertEquals(200, mRequest.getHttpStatusCode());
86 assertEquals("OK", mRequest.getHttpStatusText());
87 assertNull(mRequest.getException());
79 } 88 }
80 89
81 @SmallTest 90 @SmallTest
82 @Feature({"Cronet"}) 91 @Feature({"Cronet"})
83 public void testNotFoundURLRequest() throws Exception { 92 public void testNotFoundURLRequest() throws Exception {
84 TestHttpUrlRequestListener listener = createRequestAndWaitForComplete( 93 createRequestAndWaitForComplete(
85 MockUrlRequestJobFactory.NOTFOUND_URL, false); 94 MockUrlRequestJobFactory.NOTFOUND_URL, false);
86 assertEquals(MockUrlRequestJobFactory.NOTFOUND_URL, listener.mUrl); 95 assertEquals(MockUrlRequestJobFactory.NOTFOUND_URL, mListener.mUrl);
87 assertEquals(404, listener.mHttpStatusCode); 96 assertEquals(404, mListener.mHttpStatusCode);
88 assertEquals("Not Found", listener.mHttpStatusText); 97 assertEquals("Not Found", mListener.mHttpStatusText);
89 assertEquals( 98 assertEquals(
90 "<!DOCTYPE html>\n<html>\n<head>\n<title>Not found</title>\n" 99 "<!DOCTYPE html>\n<html>\n<head>\n<title>Not found</title>\n"
91 + "<p>Test page loaded.</p>\n</head>\n</html>\n", 100 + "<p>Test page loaded.</p>\n</head>\n</html>\n",
92 new String(listener.mResponseAsBytes)); 101 new String(mListener.mResponseAsBytes));
102 // Tests that ChromiumUrlRequest caches information which is available
103 // after the native request adapter has been destroyed.
104 assertEquals(404, mRequest.getHttpStatusCode());
105 assertEquals("Not Found", mRequest.getHttpStatusText());
106 assertNull(mRequest.getException());
93 } 107 }
94 108
95 @SmallTest 109 @SmallTest
96 @Feature({"Cronet"}) 110 @Feature({"Cronet"})
97 public void testFailedURLRequest() throws Exception { 111 public void testFailedURLRequest() throws Exception {
98 TestHttpUrlRequestListener listener = createRequestAndWaitForComplete( 112 createRequestAndWaitForComplete(
99 MockUrlRequestJobFactory.FAILED_URL, false); 113 MockUrlRequestJobFactory.FAILED_URL, false);
100 114 assertEquals(MockUrlRequestJobFactory.FAILED_URL, mListener.mUrl);
101 assertEquals(MockUrlRequestJobFactory.FAILED_URL, listener.mUrl); 115 assertEquals("", mListener.mHttpStatusText);
102 assertEquals(null, listener.mHttpStatusText); 116 assertEquals(0, mListener.mHttpStatusCode);
103 assertEquals(0, listener.mHttpStatusCode); 117 // Tests that ChromiumUrlRequest caches information which is available
118 // after the native request adapter has been destroyed.
119 assertEquals(0, mRequest.getHttpStatusCode());
120 assertEquals("", mRequest.getHttpStatusText());
121 Exception e = mRequest.getException();
122 assertEquals("System error: net::ERR_FAILED(-2)", e.getMessage());
104 } 123 }
105 124
106 @SmallTest 125 @SmallTest
107 @Feature({"Cronet"}) 126 @Feature({"Cronet"})
108 // Test that redirect can be disabled for a request. 127 // Test that redirect can be disabled for a request.
109 public void testDisableRedirects() throws Exception { 128 public void testDisableRedirects() throws Exception {
110 TestHttpUrlRequestListener listener = createRequestAndWaitForComplete( 129 createRequestAndWaitForComplete(
111 MockUrlRequestJobFactory.REDIRECT_URL, true); 130 MockUrlRequestJobFactory.REDIRECT_URL, true);
112 // Currently Cronet does not expose the url after redirect. 131 // Currently Cronet does not expose the url after redirect.
113 assertEquals(MockUrlRequestJobFactory.REDIRECT_URL, listener.mUrl); 132 assertEquals(MockUrlRequestJobFactory.REDIRECT_URL, mListener.mUrl);
114 assertEquals(302, listener.mHttpStatusCode); 133 assertEquals(302, mListener.mHttpStatusCode);
134 // MockUrlRequestJob somehow does not populate status text as "Found".
135 assertEquals("", mListener.mHttpStatusText);
115 // Expect that the request is not redirected to success.txt. 136 // Expect that the request is not redirected to success.txt.
116 assertNotNull(listener.mResponseHeaders); 137 assertNotNull(mListener.mResponseHeaders);
117 List<String> entry = listener.mResponseHeaders.get("redirect-header"); 138 List<String> entry = mListener.mResponseHeaders.get("redirect-header");
118 assertEquals(1, entry.size()); 139 assertEquals(1, entry.size());
119 assertEquals("header-value", entry.get(0)); 140 assertEquals("header-value", entry.get(0));
120 List<String> location = listener.mResponseHeaders.get("Location"); 141 List<String> location = mListener.mResponseHeaders.get("Location");
121 assertEquals(1, location.size()); 142 assertEquals(1, location.size());
122 assertEquals("/success.txt", location.get(0)); 143 assertEquals("/success.txt", location.get(0));
123 assertEquals("Request failed because there were too many redirects or " 144 assertEquals("Request failed because there were too many redirects or "
124 + "redirects have been disabled", 145 + "redirects have been disabled",
125 listener.mException.getMessage()); 146 mListener.mException.getMessage());
147 // Tests that ChromiumUrlRequest caches information which is available
148 // after the native request adapter has been destroyed.
149 assertEquals(302, mRequest.getHttpStatusCode());
150 // MockUrlRequestJob somehow does not populate status text as "Found".
151 assertEquals("", mRequest.getHttpStatusText());
152 Exception e = mRequest.getException();
153 assertNotNull(e);
154 assertEquals("Request failed because there were too many redirects "
155 + "or redirects have been disabled", e.getMessage());
126 } 156 }
127 157
128 /** 158 /**
129 * TestByteChannel is used for making sure write is not called after the 159 * TestByteChannel is used for making sure write is not called after the
130 * channel has been closed. Can synchronously cancel a request when write is 160 * channel has been closed. Can synchronously cancel a request when write is
131 * called. 161 * called.
132 */ 162 */
133 static class TestByteChannel extends ChunkedWritableByteChannel { 163 static class TestByteChannel extends ChunkedWritableByteChannel {
134 HttpUrlRequest mRequestToCancelOnWrite; 164 HttpUrlRequest mRequestToCancelOnWrite;
135 165
(...skipping 18 matching lines...) Expand all
154 * Set request that will be synchronously canceled when write is called. 184 * Set request that will be synchronously canceled when write is called.
155 */ 185 */
156 public void setRequestToCancelOnWrite(HttpUrlRequest request) { 186 public void setRequestToCancelOnWrite(HttpUrlRequest request) {
157 mRequestToCancelOnWrite = request; 187 mRequestToCancelOnWrite = request;
158 } 188 }
159 } 189 }
160 190
161 @LargeTest 191 @LargeTest
162 @Feature({"Cronet"}) 192 @Feature({"Cronet"})
163 public void testNoWriteAfterCancelOnAnotherThread() throws Exception { 193 public void testNoWriteAfterCancelOnAnotherThread() throws Exception {
164 CronetTestActivity activity = launchCronetTestApp();
165
166 // This test verifies that WritableByteChannel.write is not called after 194 // This test verifies that WritableByteChannel.write is not called after
167 // WritableByteChannel.close if request is canceled from another 195 // WritableByteChannel.close if request is canceled from another
168 // thread. 196 // thread.
169 for (int i = 0; i < 100; ++i) { 197 for (int i = 0; i < 100; ++i) {
170 HashMap<String, String> headers = new HashMap<String, String>(); 198 HashMap<String, String> headers = new HashMap<String, String>();
171 TestByteChannel channel = new TestByteChannel(); 199 TestByteChannel channel = new TestByteChannel();
172 TestHttpUrlRequestListener listener = 200 TestHttpUrlRequestListener listener =
173 new TestHttpUrlRequestListener(); 201 new TestHttpUrlRequestListener();
174 202
175 // Create request. 203 // Create request.
176 final HttpUrlRequest request = 204 final HttpUrlRequest request =
177 activity.mRequestFactory.createRequest( 205 mActivity.mRequestFactory.createRequest(
178 MockUrlRequestJobFactory.SUCCESS_URL, 206 MockUrlRequestJobFactory.SUCCESS_URL,
179 HttpUrlRequest.REQUEST_PRIORITY_LOW, headers, 207 HttpUrlRequest.REQUEST_PRIORITY_LOW, headers,
180 channel, listener); 208 channel, listener);
181 request.start(); 209 request.start();
182 listener.blockForStart(); 210 listener.blockForStart();
183 Runnable cancelTask = new Runnable() { 211 Runnable cancelTask = new Runnable() {
184 public void run() { 212 public void run() {
185 request.cancel(); 213 request.cancel();
186 } 214 }
187 }; 215 };
188 Executors.newCachedThreadPool().execute(cancelTask); 216 Executors.newCachedThreadPool().execute(cancelTask);
189 listener.blockForComplete(); 217 listener.blockForComplete();
190 assertFalse(channel.isOpen()); 218 assertFalse(channel.isOpen());
219 // Tests that ChromiumUrlRequest caches information which is availab le
220 // after the native request adapter has been destroyed.
221 assertEquals(200, request.getHttpStatusCode());
222 assertEquals("OK", request.getHttpStatusText());
191 } 223 }
192 } 224 }
193 225
194 @SmallTest 226 @SmallTest
195 @Feature({"Cronet"}) 227 @Feature({"Cronet"})
196 public void testNoWriteAfterSyncCancel() throws Exception { 228 public void testNoWriteAfterSyncCancel() throws Exception {
197 CronetTestActivity activity = launchCronetTestApp();
198
199 HashMap<String, String> headers = new HashMap<String, String>(); 229 HashMap<String, String> headers = new HashMap<String, String>();
200 TestByteChannel channel = new TestByteChannel(); 230 TestByteChannel channel = new TestByteChannel();
201 TestHttpUrlRequestListener listener = new TestHttpUrlRequestListener(); 231 TestHttpUrlRequestListener listener = new TestHttpUrlRequestListener();
202 232
203 String data = "MyBigFunkyData"; 233 String data = "MyBigFunkyData";
204 int dataLength = data.length(); 234 int dataLength = data.length();
205 int repeatCount = 10000; 235 int repeatCount = 10000;
206 String mockUrl = mMockUrlRequestJobFactory.getMockUrlForData(data, 236 String mockUrl = mMockUrlRequestJobFactory.getMockUrlForData(data,
207 repeatCount); 237 repeatCount);
208 238
209 // Create request. 239 // Create request.
210 final HttpUrlRequest request = 240 final HttpUrlRequest request =
211 activity.mRequestFactory.createRequest( 241 mActivity.mRequestFactory.createRequest(
212 mockUrl, 242 mockUrl,
213 HttpUrlRequest.REQUEST_PRIORITY_LOW, headers, 243 HttpUrlRequest.REQUEST_PRIORITY_LOW, headers,
214 channel, listener); 244 channel, listener);
215 // Channel will cancel the request from the network thread during the 245 // Channel will cancel the request from the network thread during the
216 // first write. 246 // first write.
217 channel.setRequestToCancelOnWrite(request); 247 channel.setRequestToCancelOnWrite(request);
218 request.start(); 248 request.start();
219 listener.blockForComplete(); 249 listener.blockForComplete();
220 assertTrue(request.isCanceled()); 250 assertTrue(request.isCanceled());
221 assertFalse(channel.isOpen()); 251 assertFalse(channel.isOpen());
252 // Tests that ChromiumUrlRequest caches information which is available
253 // after the native request adapter has been destroyed.
254 assertEquals(-1, request.getHttpStatusCode());
255 assertEquals("", request.getHttpStatusText());
222 } 256 }
223 257
224 @SmallTest 258 @SmallTest
225 @Feature({"Cronet"}) 259 @Feature({"Cronet"})
226 public void testBigDataSyncReadRequest() throws Exception { 260 public void testBigDataSyncReadRequest() throws Exception {
227 String data = "MyBigFunkyData"; 261 String data = "MyBigFunkyData";
228 int dataLength = data.length(); 262 int dataLength = data.length();
229 int repeatCount = 100000; 263 int repeatCount = 100000;
230 String mockUrl = mMockUrlRequestJobFactory.getMockUrlForData(data, 264 String mockUrl = mMockUrlRequestJobFactory.getMockUrlForData(data,
231 repeatCount); 265 repeatCount);
232 TestHttpUrlRequestListener listener = createRequestAndWaitForComplete( 266 createRequestAndWaitForComplete(mockUrl, false);
233 mockUrl, false); 267 assertEquals(mockUrl, mListener.mUrl);
234 assertEquals(mockUrl, listener.mUrl);
235 String responseData = new String(listener.mResponseAsBytes);
236 for (int i = 0; i < repeatCount; ++i) { 268 for (int i = 0; i < repeatCount; ++i) {
237 assertEquals(data, responseData.substring(dataLength * i, 269 assertEquals(data, mListener.mResponseAsString.substring(
238 dataLength * (i + 1))); 270 dataLength * i, dataLength * (i + 1)));
239 } 271 }
240 } 272 }
241 } 273 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698