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

Unified Diff: components/cronet/android/test/javatests/src/org/chromium/net/SdchTest.java

Issue 1133883002: [Cronet] Enable persistence mode for Sdch (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@quic_server_remove_loop
Patch Set: Remove pref file support from legacy API Created 5 years, 7 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 side-by-side diff with in-line comments
Download patch
Index: components/cronet/android/test/javatests/src/org/chromium/net/SdchTest.java
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/SdchTest.java b/components/cronet/android/test/javatests/src/org/chromium/net/SdchTest.java
index 18c3d729a7d21a7d92c049c7420a71dae3b3ba3b..535f9f4f3b907a67066e064eac1f64e6129f411e 100644
--- a/components/cronet/android/test/javatests/src/org/chromium/net/SdchTest.java
+++ b/components/cronet/android/test/javatests/src/org/chromium/net/SdchTest.java
@@ -4,70 +4,90 @@
package org.chromium.net;
+import android.os.ConditionVariable;
import android.test.suitebuilder.annotation.SmallTest;
+import org.chromium.base.Log;
import org.chromium.base.test.util.Feature;
+import org.chromium.net.SdchTestUtil.SdchObserverCallback;
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
/**
* Tests Sdch support.
*/
public class SdchTest extends CronetTestBase {
+ private static final String TAG = Log.makeTag("SdchTest");
private CronetTestActivity mActivity;
- private void setUp(boolean enableSdch) {
- UrlRequestContextConfig config = new UrlRequestContextConfig();
- config.enableSDCH(enableSdch);
- config.setLibraryName("cronet_tests");
- config.enableHttpCache(UrlRequestContextConfig.HttpCache.IN_MEMORY, 100 * 1024);
- String[] commandLineArgs = {CronetTestActivity.CONFIG_KEY, config.toString()};
- mActivity = launchCronetTestAppWithUrlAndCommandLineArgs(null, commandLineArgs);
- mActivity.startNetLog();
-
- // Registers custom DNS mapping for legacy ChromiumUrlRequestFactory.
- ChromiumUrlRequestFactory factory = (ChromiumUrlRequestFactory) mActivity.mRequestFactory;
- long legacyAdapter = factory.getRequestContext().getUrlRequestContextAdapterForTesting();
- assertTrue(legacyAdapter != 0);
- NativeTestServer.registerHostResolverProc(legacyAdapter, true);
-
- // Registers custom DNS mapping for CronetUrlRequestContext.
- CronetUrlRequestContext requestContext =
- (CronetUrlRequestContext) mActivity.mUrlRequestContext;
- long adapter = requestContext.getUrlRequestContextAdapter();
- assertTrue(adapter != 0);
- NativeTestServer.registerHostResolverProc(adapter, false);
-
- // Starts NativeTestServer.
+ private enum SDCH {
+ ENABLED,
+ DISABLED,
+ }
+
+ private enum API {
+ LEGACY,
+ ASYNC,
+ }
+
+ private void setUp(SDCH setting, API api) {
+ List<String> commandLineArgs = new ArrayList<String>();
+ commandLineArgs.add(CronetTestActivity.CACHE_KEY);
+ commandLineArgs.add(CronetTestActivity.CACHE_DISK);
+ if (setting == SDCH.ENABLED) {
+ commandLineArgs.add(CronetTestActivity.SDCH_KEY);
+ commandLineArgs.add(CronetTestActivity.SDCH_ENABLE);
+ }
+
+ String[] args = new String[commandLineArgs.size()];
+ mActivity =
+ launchCronetTestAppWithUrlAndCommandLineArgs(null, commandLineArgs.toArray(args));
+ long urlRequestContextAdapter = (api == API.LEGACY)
+ ? getContextAdapter((ChromiumUrlRequestFactory) mActivity.mRequestFactory)
+ : getContextAdapter((CronetUrlRequestContext) mActivity.mUrlRequestContext);
+ NativeTestServer.registerHostResolverProc(urlRequestContextAdapter, api == API.LEGACY);
+ // Start NativeTestServer.
assertTrue(NativeTestServer.startNativeTestServer(getInstrumentation().getTargetContext()));
}
@Override
protected void tearDown() throws Exception {
NativeTestServer.shutdownNativeTestServer();
- mActivity.stopNetLog();
super.tearDown();
}
@SmallTest
@Feature({"Cronet"})
public void testSdchEnabled_LegacyAPI() throws Exception {
- setUp(true);
+ setUp(SDCH.ENABLED, API.LEGACY);
+ String targetUrl = NativeTestServer.getSdchURL() + "/sdch/test";
+ long contextAdapter =
+ getContextAdapter((ChromiumUrlRequestFactory) mActivity.mRequestFactory);
+ Callback callback = new Callback();
mef 2015/05/21 17:29:44 Optional: I think 'Callback' is too generic, so it
xunjieli 2015/05/21 17:45:26 Done.
+ assertTrue(SdchTestUtil.registerSdchObserverCallback(
+ targetUrl, contextAdapter, callback, true /** Legacy API */));
+
// Make a request to /sdch/index which advertises the dictionary.
- TestHttpUrlRequestListener listener1 = startAndWaitForComplete_LegacyAPI(
- NativeTestServer.getSdchURL() + "/sdch/index?q=LeQxM80O");
+ TestHttpUrlRequestListener listener1 =
+ startAndWaitForComplete_LegacyAPI(mActivity.mRequestFactory,
+ NativeTestServer.getSdchURL() + "/sdch/index?q=LeQxM80O");
assertEquals(200, listener1.mHttpStatusCode);
assertEquals("This is an index page.\n", listener1.mResponseAsString);
assertEquals(Arrays.asList("/sdch/dict/LeQxM80O"),
listener1.mResponseHeaders.get("Get-Dictionary"));
- waitForDictionaryAdded("LeQxM80O", true);
+ callback.waitForDictionaryAdded("LeQxM80O");
// Make a request to fetch encoded response at /sdch/test.
TestHttpUrlRequestListener listener2 =
- startAndWaitForComplete_LegacyAPI(NativeTestServer.getSdchURL() + "/sdch/test");
+ startAndWaitForComplete_LegacyAPI(mActivity.mRequestFactory, targetUrl);
assertEquals(200, listener2.mHttpStatusCode);
assertEquals("The quick brown fox jumps over the lazy dog.\n", listener2.mResponseAsString);
}
@@ -75,11 +95,12 @@ public class SdchTest extends CronetTestBase {
@SmallTest
@Feature({"Cronet"})
public void testSdchDisabled_LegacyAPI() throws Exception {
- setUp(false);
+ setUp(SDCH.DISABLED, API.LEGACY);
// Make a request to /sdch/index.
// Since Sdch is not enabled, no dictionary should be advertised.
- TestHttpUrlRequestListener listener = startAndWaitForComplete_LegacyAPI(
- NativeTestServer.getSdchURL() + "/sdch/index?q=LeQxM80O");
+ TestHttpUrlRequestListener listener =
+ startAndWaitForComplete_LegacyAPI(mActivity.mRequestFactory,
+ NativeTestServer.getSdchURL() + "/sdch/index?q=LeQxM80O");
assertEquals(200, listener.mHttpStatusCode);
assertEquals("This is an index page.\n", listener.mResponseAsString);
assertEquals(null, listener.mResponseHeaders.get("Get-Dictionary"));
@@ -88,21 +109,20 @@ public class SdchTest extends CronetTestBase {
@SmallTest
@Feature({"Cronet"})
public void testDictionaryNotFound_LegacyAPI() throws Exception {
- setUp(true);
+ setUp(SDCH.ENABLED, API.LEGACY);
// Make a request to /sdch/index which advertises a bad dictionary that
// does not exist.
- TestHttpUrlRequestListener listener1 = startAndWaitForComplete_LegacyAPI(
- NativeTestServer.getSdchURL() + "/sdch/index?q=NotFound");
+ TestHttpUrlRequestListener listener1 =
+ startAndWaitForComplete_LegacyAPI(mActivity.mRequestFactory,
+ NativeTestServer.getSdchURL() + "/sdch/index?q=NotFound");
assertEquals(200, listener1.mHttpStatusCode);
assertEquals("This is an index page.\n", listener1.mResponseAsString);
assertEquals(Arrays.asList("/sdch/dict/NotFound"),
listener1.mResponseHeaders.get("Get-Dictionary"));
- waitForDictionaryAdded("NotFound", true);
-
- // Make a request to fetch /sdch/test, and make sure Sdch encoding is not used.
- TestHttpUrlRequestListener listener2 =
- startAndWaitForComplete_LegacyAPI(NativeTestServer.getSdchURL() + "/sdch/test");
+ // Make a request to fetch /sdch/test, and make sure request succeeds.
+ TestHttpUrlRequestListener listener2 = startAndWaitForComplete_LegacyAPI(
+ mActivity.mRequestFactory, NativeTestServer.getSdchURL() + "/sdch/test");
assertEquals(200, listener2.mHttpStatusCode);
assertEquals("Sdch is not used.\n", listener2.mResponseAsString);
}
@@ -110,32 +130,68 @@ public class SdchTest extends CronetTestBase {
@SmallTest
@Feature({"Cronet"})
public void testSdchEnabled() throws Exception {
- setUp(true);
+ setUp(SDCH.ENABLED, API.ASYNC);
+ String targetUrl = NativeTestServer.getSdchURL() + "/sdch/test";
+ long contextAdapter =
+ getContextAdapter((CronetUrlRequestContext) mActivity.mUrlRequestContext);
+ Callback callback = new Callback();
+ assertTrue(SdchTestUtil.registerSdchObserverCallback(
+ targetUrl, contextAdapter, callback, false /** Legacy API */));
+
// Make a request to /sdch which advertises the dictionary.
- TestUrlRequestListener listener1 =
- startAndWaitForComplete(NativeTestServer.getSdchURL() + "/sdch/index?q=LeQxM80O");
+ TestUrlRequestListener listener1 = startAndWaitForComplete(mActivity.mUrlRequestContext,
+ NativeTestServer.getSdchURL() + "/sdch/index?q=LeQxM80O");
assertEquals(200, listener1.mResponseInfo.getHttpStatusCode());
assertEquals("This is an index page.\n", listener1.mResponseAsString);
assertEquals(Arrays.asList("/sdch/dict/LeQxM80O"),
listener1.mResponseInfo.getAllHeaders().get("Get-Dictionary"));
- waitForDictionaryAdded("LeQxM80O", false);
+ callback.waitForDictionaryAdded("LeQxM80O");
// Make a request to fetch encoded response at /sdch/test.
TestUrlRequestListener listener2 =
- startAndWaitForComplete(NativeTestServer.getSdchURL() + "/sdch/test");
- assertEquals(200, listener1.mResponseInfo.getHttpStatusCode());
+ startAndWaitForComplete(mActivity.mUrlRequestContext, targetUrl);
+ assertEquals(200, listener2.mResponseInfo.getHttpStatusCode());
assertEquals("The quick brown fox jumps over the lazy dog.\n", listener2.mResponseAsString);
+
+ // Wait for a bit until SimpleCache finished closing entries before
+ // calling shutdown on the UrlRequestContext.
+ // TODO(xunjieli): Remove once crbug.com/486120 is fixed.
+ Thread.sleep(5000);
+ mActivity.mUrlRequestContext.shutdown();
+
+ // Shutting down the context will make JsonPrefStore to flush pending
+ // writes to disk.
+ String dictUrl = NativeTestServer.getSdchURL() + "/sdch/dict/LeQxM80O";
+ assertTrue(fileContainsString("local_prefs.json", dictUrl));
+
+ // Test persistence.
+ CronetUrlRequestContext newContext = new CronetUrlRequestContext(
+ getInstrumentation().getTargetContext(), mActivity.getContextConfig());
+
+ long newContextAdapter = getContextAdapter(newContext);
+ NativeTestServer.registerHostResolverProc(newContextAdapter, false);
+ Callback newCallback = new Callback();
+ // Only wait for dictionaries when they are yet to be loaded.
+ if (SdchTestUtil.registerSdchObserverCallback(
+ targetUrl, newContextAdapter, newCallback, false /** Legacy API */)) {
+ newCallback.waitForDictionaryAdded("LeQxM80O");
+ }
+
+ // Make a request to fetch encoded response at /sdch/test.
+ TestUrlRequestListener listener3 = startAndWaitForComplete(newContext, targetUrl);
+ assertEquals(200, listener3.mResponseInfo.getHttpStatusCode());
+ assertEquals("The quick brown fox jumps over the lazy dog.\n", listener3.mResponseAsString);
}
@SmallTest
@Feature({"Cronet"})
public void testSdchDisabled() throws Exception {
- setUp(false);
+ setUp(SDCH.DISABLED, API.ASYNC);
// Make a request to /sdch.
// Since Sdch is not enabled, no dictionary should be advertised.
- TestUrlRequestListener listener =
- startAndWaitForComplete(NativeTestServer.getSdchURL() + "/sdch/index?q=LeQxM80O");
+ TestUrlRequestListener listener = startAndWaitForComplete(mActivity.mUrlRequestContext,
+ NativeTestServer.getSdchURL() + "/sdch/index?q=LeQxM80O");
assertEquals(200, listener.mResponseInfo.getHttpStatusCode());
assertEquals("This is an index page.\n", listener.mResponseAsString);
assertEquals(null, listener.mResponseInfo.getAllHeaders().get("Get-Dictionary"));
@@ -144,75 +200,81 @@ public class SdchTest extends CronetTestBase {
@SmallTest
@Feature({"Cronet"})
public void testDictionaryNotFound() throws Exception {
- setUp(true);
+ setUp(SDCH.ENABLED, API.ASYNC);
// Make a request to /sdch/index which advertises a bad dictionary that
// does not exist.
- TestUrlRequestListener listener1 =
- startAndWaitForComplete(NativeTestServer.getSdchURL() + "/sdch/index?q=NotFound");
+ TestUrlRequestListener listener1 = startAndWaitForComplete(mActivity.mUrlRequestContext,
+ NativeTestServer.getSdchURL() + "/sdch/index?q=NotFound");
assertEquals(200, listener1.mResponseInfo.getHttpStatusCode());
assertEquals("This is an index page.\n", listener1.mResponseAsString);
assertEquals(Arrays.asList("/sdch/dict/NotFound"),
listener1.mResponseInfo.getAllHeaders().get("Get-Dictionary"));
- waitForDictionaryAdded("NotFound", false);
-
// Make a request to fetch /sdch/test, and make sure Sdch encoding is not used.
- TestUrlRequestListener listener2 =
- startAndWaitForComplete(NativeTestServer.getSdchURL() + "/sdch/test");
+ TestUrlRequestListener listener2 = startAndWaitForComplete(
+ mActivity.mUrlRequestContext, NativeTestServer.getSdchURL() + "/sdch/test");
assertEquals(200, listener2.mResponseInfo.getHttpStatusCode());
assertEquals("Sdch is not used.\n", listener2.mResponseAsString);
}
- /**
- * Helper method to wait for dictionary to be fetched and added to the list of available
- * dictionaries.
- */
- private void waitForDictionaryAdded(String dict, boolean isLegacyAPI) throws Exception {
- // Since Http cache is enabled, making a request to the dictionary explicitly will
- // be served from the cache.
- String url = NativeTestServer.getSdchURL() + "/sdch/dict/" + dict;
- if (isLegacyAPI) {
- TestHttpUrlRequestListener listener = startAndWaitForComplete_LegacyAPI(url);
- if (dict.equals("NotFound")) {
- assertEquals(404, listener.mHttpStatusCode);
- } else {
- assertEquals(200, listener.mHttpStatusCode);
- assertTrue(listener.mWasCached);
- }
- } else {
- TestUrlRequestListener listener = startAndWaitForComplete(url);
- if (dict.equals("NotFound")) {
- assertEquals(404, listener.mResponseInfo.getHttpStatusCode());
- } else {
- assertEquals(200, listener.mResponseInfo.getHttpStatusCode());
- assertTrue(listener.mResponseInfo.wasCached());
- }
+ private static class Callback extends SdchObserverCallback {
+ ConditionVariable mBlock = new ConditionVariable();
+ private String mLastAddedDict;
+
+ @Override
+ public void onDictionaryAdded(String url) {
+ Log.i(TAG, "Dictionary %s is added ", url);
+ mLastAddedDict = url;
+ mBlock.open();
}
- // Now wait for dictionary to be added to the manager, which occurs
- // asynchronously.
- // TODO(xunjieli): Rather than setting an arbitrary delay, consider
- // implementing a SdchObserver to watch for dictionary add events once
- // add event is implemented in SdchObserver.
- Thread.sleep(1000);
+
+ public void waitForDictionaryAdded(String dictName) {
+ mBlock.block();
+ mBlock.close();
+ assertTrue(mLastAddedDict.contains(dictName));
+ }
+ }
+
+ private long getContextAdapter(ChromiumUrlRequestFactory factory) {
+ return factory.getRequestContext().getUrlRequestContextAdapter();
+ }
+
+ private long getContextAdapter(CronetUrlRequestContext requestContext) {
+ return requestContext.getUrlRequestContextAdapter();
}
- private TestHttpUrlRequestListener startAndWaitForComplete_LegacyAPI(String url)
- throws Exception {
+ private TestHttpUrlRequestListener startAndWaitForComplete_LegacyAPI(
+ HttpUrlRequestFactory factory, String url) throws Exception {
Map<String, String> headers = new HashMap<String, String>();
TestHttpUrlRequestListener listener = new TestHttpUrlRequestListener();
- HttpUrlRequest request = mActivity.mRequestFactory.createRequest(
+ HttpUrlRequest request = factory.createRequest(
url, HttpUrlRequest.REQUEST_PRIORITY_MEDIUM, headers, listener);
request.start();
listener.blockForComplete();
return listener;
}
- private TestUrlRequestListener startAndWaitForComplete(String url) throws Exception {
+ private TestUrlRequestListener startAndWaitForComplete(
+ UrlRequestContext requestContext, String url) throws Exception {
TestUrlRequestListener listener = new TestUrlRequestListener();
- UrlRequest request =
- mActivity.mUrlRequestContext.createRequest(url, listener, listener.getExecutor());
+ UrlRequest request = requestContext.createRequest(url, listener, listener.getExecutor());
request.start();
listener.blockForDone();
return listener;
}
+
+ // Returns whether a file contains a particular string.
+ private boolean fileContainsString(String filename, String content) throws IOException {
+ BufferedReader reader =
+ new BufferedReader(new FileReader(mActivity.getTestStorage() + "/" + filename));
+ String line;
+ while ((line = reader.readLine()) != null) {
+ if (line.contains(content)) {
+ reader.close();
+ return true;
+ }
+ }
+ reader.close();
+ return false;
+ }
}

Powered by Google App Engine
This is Rietveld 408576698