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

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

Issue 2339223002: Cronet API Refactoring (Closed)
Patch Set: Javadoc + rebase Created 4 years, 3 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.content.Context; 7 import android.content.Context;
8 import android.os.ConditionVariable;
9 import android.os.Environment; 8 import android.os.Environment;
10 9
11 import static junit.framework.Assert.assertEquals; 10 import static junit.framework.Assert.assertEquals;
12 import static junit.framework.Assert.assertTrue; 11 import static junit.framework.Assert.assertTrue;
13 12
14 import org.chromium.base.Log; 13 import org.chromium.base.Log;
15 import org.chromium.base.PathUtils; 14 import org.chromium.base.PathUtils;
16 import org.chromium.base.annotations.SuppressFBWarnings; 15 import org.chromium.base.annotations.SuppressFBWarnings;
16 import org.chromium.net.impl.CronetEngineBase;
17 17
18 import java.io.ByteArrayInputStream;
19 import java.io.File; 18 import java.io.File;
20 import java.io.InputStream;
21 import java.net.URLStreamHandlerFactory; 19 import java.net.URLStreamHandlerFactory;
22 import java.nio.channels.Channels;
23 import java.nio.channels.ReadableByteChannel;
24 import java.util.HashMap;
25 20
26 /** 21 /**
27 * Framework for testing Cronet. 22 * Framework for testing Cronet.
28 */ 23 */
29 @SuppressFBWarnings("URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD") 24 @SuppressFBWarnings("URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
30 public class CronetTestFramework { 25 public class CronetTestFramework {
31 private static final String TAG = "CronetTestFramework"; 26 private static final String TAG = "CronetTestFramework";
32 27
33 public static final String COMMAND_LINE_ARGS_KEY = "commandLineArgs"; 28 public static final String COMMAND_LINE_ARGS_KEY = "commandLineArgs";
34 public static final String POST_DATA_KEY = "postData"; 29 public static final String POST_DATA_KEY = "postData";
35 public static final String CACHE_KEY = "cache"; 30 public static final String CACHE_KEY = "cache";
36 public static final String SDCH_KEY = "sdch"; 31 public static final String SDCH_KEY = "sdch";
37 public static final String LIBRARY_INIT_KEY = "libraryInit"; 32 public static final String LIBRARY_INIT_KEY = "libraryInit";
38 33
39 // Uses disk cache. 34 // Uses disk cache.
40 public static final String CACHE_DISK = "disk"; 35 public static final String CACHE_DISK = "disk";
41 36
42 // Uses disk cache but does not store http data. 37 // Uses disk cache but does not store http data.
43 public static final String CACHE_DISK_NO_HTTP = "diskNoHttp"; 38 public static final String CACHE_DISK_NO_HTTP = "diskNoHttp";
44 39
45 // Uses in-memory cache. 40 // Uses in-memory cache.
46 public static final String CACHE_IN_MEMORY = "memory"; 41 public static final String CACHE_IN_MEMORY = "memory";
47 42
48 // Enables Sdch. 43 // Enables Sdch.
49 public static final String SDCH_ENABLE = "enable"; 44 public static final String SDCH_ENABLE = "enable";
50 45
51 /** 46 /**
52 * Library init type strings to use along with {@link LIBRARY_INIT_KEY}. 47 * Library init type strings to use along with {@link #LIBRARY_INIT_KEY}.
53 * If unspecified, {@link LibraryInitType.CRONET} will be used. 48 * If unspecified, {@link LibraryInitType#CRONET} will be used.
54 */ 49 */
55 public static final class LibraryInitType { 50 public static final class LibraryInitType {
56 // Initializes Cronet Async API. 51 // Initializes Cronet Async API.
57 public static final String CRONET = "cronet"; 52 public static final String CRONET = "cronet";
58 // Initializes Cronet legacy API. 53 // Initializes Cronet legacy API.
59 public static final String LEGACY = "legacy"; 54 public static final String LEGACY = "legacy";
60 // Initializes Cronet HttpURLConnection API. 55 // Initializes Cronet HttpURLConnection API.
61 public static final String HTTP_URL_CONNECTION = "http_url_connection"; 56 public static final String HTTP_URL_CONNECTION = "http_url_connection";
62 // Do not initialize. 57 // Do not initialize.
63 public static final String NONE = "none"; 58 public static final String NONE = "none";
64 59
65 private LibraryInitType() {} 60 private LibraryInitType() {}
66 } 61 }
67 62
68 public URLStreamHandlerFactory mStreamHandlerFactory; 63 public URLStreamHandlerFactory mStreamHandlerFactory;
69 public CronetEngine mCronetEngine; 64 public CronetEngineBase mCronetEngine;
70 @SuppressWarnings("deprecation")
71 HttpUrlRequestFactory mRequestFactory;
72 65
73 private final String[] mCommandLine; 66 private final String[] mCommandLine;
74 private final Context mContext; 67 private final Context mContext;
75 68
76 private String mUrl;
77 private int mHttpStatusCode = 0; 69 private int mHttpStatusCode = 0;
78 70
79 // CronetEngine.Builder used for this activity. 71 // CronetEngine.Builder used for this activity.
80 private CronetEngine.Builder mCronetEngineBuilder; 72 private ExperimentalCronetEngine.Builder mCronetEngineBuilder;
81
82 @SuppressWarnings("deprecation")
83 private class TestHttpUrlRequestListener implements HttpUrlRequestListener {
84 private final ConditionVariable mComplete = new ConditionVariable();
85
86 public TestHttpUrlRequestListener() {}
87
88 @Override
89 public void onResponseStarted(HttpUrlRequest request) {
90 mHttpStatusCode = request.getHttpStatusCode();
91 }
92
93 @Override
94 public void onRequestComplete(HttpUrlRequest request) {
95 mComplete.open();
96 }
97
98 public void blockForComplete() {
99 mComplete.block();
100 }
101 }
102 73
103 // TODO(crbug.com/547160): Fix this findbugs error and remove the suppressio n. 74 // TODO(crbug.com/547160): Fix this findbugs error and remove the suppressio n.
104 @SuppressFBWarnings("EI_EXPOSE_REP2") 75 @SuppressFBWarnings("EI_EXPOSE_REP2")
105 public CronetTestFramework( 76 public CronetTestFramework(String appUrl, String[] commandLine, Context cont ext,
106 String appUrl, String[] commandLine, Context context, CronetEngine.B uilder builder) { 77 ExperimentalCronetEngine.Builder builder) {
107 mCommandLine = commandLine; 78 mCommandLine = commandLine;
108 mContext = context; 79 mContext = context;
109 80
110 // Print out extra arguments passed in starting this activity. 81 // Print out extra arguments passed in starting this activity.
111 if (commandLine != null) { 82 if (commandLine != null) {
112 assertEquals(0, commandLine.length % 2); 83 assertEquals(0, commandLine.length % 2);
113 for (int i = 0; i < commandLine.length / 2; i++) { 84 for (int i = 0; i < commandLine.length / 2; i++) {
114 Log.i(TAG, "Cronet commandLine %s = %s", commandLine[i * 2], 85 Log.i(TAG, "Cronet commandLine %s = %s", commandLine[i * 2],
115 commandLine[i * 2 + 1]); 86 commandLine[i * 2 + 1]);
116 } 87 }
117 } 88 }
118 89
119 // Initializes CronetEngine.Builder from commandLine args. 90 // Initializes CronetEngine.Builder from commandLine args.
120 mCronetEngineBuilder = initializeCronetEngineBuilderWithPresuppliedBuild er(builder); 91 mCronetEngineBuilder = initializeCronetEngineBuilderWithPresuppliedBuild er(builder);
121 92
122 String initString = getCommandLineArg(LIBRARY_INIT_KEY); 93 String initString = getCommandLineArg(LIBRARY_INIT_KEY);
123 94
124 if (initString == null) { 95 if (initString == null) {
125 initString = LibraryInitType.CRONET; 96 initString = LibraryInitType.CRONET;
126 } 97 }
127 98
128 switch (initString) { 99 switch (initString) {
129 case LibraryInitType.NONE: 100 case LibraryInitType.NONE:
130 break; 101 break;
131 case LibraryInitType.LEGACY:
132 mRequestFactory = initRequestFactory();
133 if (appUrl != null) {
134 startWithURL(appUrl);
135 }
136 break;
137 case LibraryInitType.HTTP_URL_CONNECTION: 102 case LibraryInitType.HTTP_URL_CONNECTION:
138 mCronetEngine = initCronetEngine(); 103 mCronetEngine = initCronetEngine();
139 mStreamHandlerFactory = mCronetEngine.createURLStreamHandlerFact ory(); 104 mStreamHandlerFactory = mCronetEngine.createURLStreamHandlerFact ory();
140 break; 105 break;
141 default: 106 default:
142 mCronetEngine = initCronetEngine(); 107 mCronetEngine = initCronetEngine();
143 // Start collecting metrics. 108 // Start collecting metrics.
144 mCronetEngine.getGlobalMetricsDeltas(); 109 mCronetEngine.getGlobalMetricsDeltas();
145 break; 110 break;
146 } 111 }
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
189 if (path.isDirectory()) { 154 if (path.isDirectory()) {
190 for (File c : path.listFiles()) { 155 for (File c : path.listFiles()) {
191 if (!recursiveDelete(c)) { 156 if (!recursiveDelete(c)) {
192 return false; 157 return false;
193 } 158 }
194 } 159 }
195 } 160 }
196 return path.delete(); 161 return path.delete();
197 } 162 }
198 163
199 CronetEngine.Builder getCronetEngineBuilder() { 164 ExperimentalCronetEngine.Builder getCronetEngineBuilder() {
200 return mCronetEngineBuilder; 165 return mCronetEngineBuilder;
201 } 166 }
202 167
203 private CronetEngine.Builder initializeCronetEngineBuilderWithPresuppliedBui lder( 168 private ExperimentalCronetEngine.Builder initializeCronetEngineBuilderWithPr esuppliedBuilder(
204 CronetEngine.Builder builder) { 169 ExperimentalCronetEngine.Builder builder) {
205 return createCronetEngineBuilderWithPresuppliedBuilder(mContext, builder ); 170 return createCronetEngineBuilderWithPresuppliedBuilder(mContext, builder );
206 } 171 }
207 172
208 CronetEngine.Builder createCronetEngineBuilder(Context context) { 173 ExperimentalCronetEngine.Builder createCronetEngineBuilder(Context context) {
209 return createCronetEngineBuilderWithPresuppliedBuilder(context, null); 174 return createCronetEngineBuilderWithPresuppliedBuilder(context, null);
210 } 175 }
211 176
212 private CronetEngine.Builder createCronetEngineBuilderWithPresuppliedBuilder ( 177 private ExperimentalCronetEngine.Builder createCronetEngineBuilderWithPresup pliedBuilder(
213 Context context, CronetEngine.Builder cronetEngineBuilder) { 178 Context context, ExperimentalCronetEngine.Builder cronetEngineBuilde r) {
214 if (cronetEngineBuilder == null) { 179 if (cronetEngineBuilder == null) {
215 cronetEngineBuilder = new CronetEngine.Builder(context); 180 cronetEngineBuilder = new ExperimentalCronetEngine.Builder(context);
216 cronetEngineBuilder.enableHttp2(true).enableQuic(true); 181 cronetEngineBuilder.enableHttp2(true).enableQuic(true);
217 } 182 }
218 183
219 String cacheString = getCommandLineArg(CACHE_KEY); 184 String cacheString = getCommandLineArg(CACHE_KEY);
220 if (CACHE_DISK.equals(cacheString)) { 185 if (CACHE_DISK.equals(cacheString)) {
221 cronetEngineBuilder.setStoragePath(getTestStorage(context)); 186 cronetEngineBuilder.setStoragePath(getTestStorage(context));
222 cronetEngineBuilder.enableHttpCache(CronetEngine.Builder.HTTP_CACHE_ DISK, 1000 * 1024); 187 cronetEngineBuilder.enableHttpCache(CronetEngine.Builder.HTTP_CACHE_ DISK, 1000 * 1024);
223 } else if (CACHE_DISK_NO_HTTP.equals(cacheString)) { 188 } else if (CACHE_DISK_NO_HTTP.equals(cacheString)) {
224 cronetEngineBuilder.setStoragePath(getTestStorage(context)); 189 cronetEngineBuilder.setStoragePath(getTestStorage(context));
225 cronetEngineBuilder.enableHttpCache( 190 cronetEngineBuilder.enableHttpCache(
226 CronetEngine.Builder.HTTP_CACHE_DISK_NO_HTTP, 1000 * 1024); 191 CronetEngine.Builder.HTTP_CACHE_DISK_NO_HTTP, 1000 * 1024);
227 } else if (CACHE_IN_MEMORY.equals(cacheString)) { 192 } else if (CACHE_IN_MEMORY.equals(cacheString)) {
228 cronetEngineBuilder.enableHttpCache( 193 cronetEngineBuilder.enableHttpCache(
229 CronetEngine.Builder.HTTP_CACHE_IN_MEMORY, 100 * 1024); 194 CronetEngine.Builder.HTTP_CACHE_IN_MEMORY, 100 * 1024);
230 } 195 }
231 196
232 String sdchString = getCommandLineArg(SDCH_KEY); 197 String sdchString = getCommandLineArg(SDCH_KEY);
233 if (SDCH_ENABLE.equals(sdchString)) { 198 if (SDCH_ENABLE.equals(sdchString)) {
234 cronetEngineBuilder.enableSdch(true); 199 cronetEngineBuilder.enableSdch(true);
235 } 200 }
236 201
237 // Setting this here so it isn't overridden on the command line 202 // Setting this here so it isn't overridden on the command line
238 cronetEngineBuilder.setLibraryName("cronet_tests"); 203 CronetTestUtil.setLibraryName(cronetEngineBuilder, "cronet_tests");
239 return cronetEngineBuilder; 204 return cronetEngineBuilder;
240 } 205 }
241 206
242 // Helper function to initialize Cronet engine. Also used in testing. 207 // Helper function to initialize Cronet engine. Also used in testing.
243 public CronetEngine initCronetEngine() { 208 public CronetEngineBase initCronetEngine() {
244 return mCronetEngineBuilder.build(); 209 return (CronetEngineBase) mCronetEngineBuilder.build();
245 }
246
247 // Helper function to initialize request factory. Also used in testing.
248 @SuppressWarnings("deprecation")
249 public HttpUrlRequestFactory initRequestFactory() {
250 return HttpUrlRequestFactory.createFactory(mContext, mCronetEngineBuilde r);
251 } 210 }
252 211
253 private String getCommandLineArg(String key) { 212 private String getCommandLineArg(String key) {
254 if (mCommandLine != null) { 213 if (mCommandLine != null) {
255 for (int i = 0; i < mCommandLine.length; ++i) { 214 for (int i = 0; i < mCommandLine.length; ++i) {
256 if (mCommandLine[i].equals(key)) { 215 if (mCommandLine[i].equals(key)) {
257 return mCommandLine[++i]; 216 return mCommandLine[++i];
258 } 217 }
259 } 218 }
260 } 219 }
261 return null; 220 return null;
262 } 221 }
263 222
264 @SuppressWarnings("deprecation")
265 private void applyCommandLineToHttpUrlRequest(HttpUrlRequest request) {
266 String postData = getCommandLineArg(POST_DATA_KEY);
267 if (postData != null) {
268 InputStream dataStream = new ByteArrayInputStream(postData.getBytes( ));
269 ReadableByteChannel dataChannel = Channels.newChannel(dataStream);
270 request.setUploadChannel("text/plain", dataChannel, postData.length( ));
271 request.setHttpMethod("POST");
272 }
273 }
274
275 @SuppressWarnings("deprecation")
276 public void startWithURL(String url) {
277 Log.i(TAG, "Cronet started: %s", url);
278 mUrl = url;
279
280 HashMap<String, String> headers = new HashMap<String, String>();
281 TestHttpUrlRequestListener listener = new TestHttpUrlRequestListener();
282 HttpUrlRequest request = mRequestFactory.createRequest(
283 url, HttpUrlRequest.REQUEST_PRIORITY_MEDIUM, headers, listener);
284 applyCommandLineToHttpUrlRequest(request);
285 request.start();
286 listener.blockForComplete();
287 }
288
289 public String getUrl() {
290 return mUrl;
291 }
292
293 public int getHttpStatusCode() { 223 public int getHttpStatusCode() {
294 return mHttpStatusCode; 224 return mHttpStatusCode;
295 } 225 }
296 226
297 public void startNetLog() { 227 public void startNetLog() {
298 if (mRequestFactory != null) {
299 mRequestFactory.startNetLogToFile(Environment.getExternalStorageDire ctory().getPath()
300 + "/cronet_sample_netlog_old_api.json",
301 false);
302 }
303 if (mCronetEngine != null) { 228 if (mCronetEngine != null) {
304 mCronetEngine.startNetLogToFile(Environment.getExternalStorageDirect ory().getPath() 229 mCronetEngine.startNetLogToFile(Environment.getExternalStorageDirect ory().getPath()
305 + "/cronet_sample_netlog_new_api.json", 230 + "/cronet_sample_netlog_new_api.json",
306 false); 231 false);
307 } 232 }
308 } 233 }
309 234
310 public void stopNetLog() { 235 public void stopNetLog() {
311 if (mRequestFactory != null) {
312 mRequestFactory.stopNetLog();
313 }
314 if (mCronetEngine != null) { 236 if (mCronetEngine != null) {
315 mCronetEngine.stopNetLog(); 237 mCronetEngine.stopNetLog();
316 } 238 }
317 } 239 }
318 } 240 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698