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

Unified Diff: chrome/android/javatests_shell/src/org/chromium/chrome/browser/feedback/ConnectivityCheckerTest.java

Issue 1127983002: Add connectivity check for Android feedback. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Move test to new test package, and merge with upstream (conflict in chrome_jni_registrar.cc) 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: chrome/android/javatests_shell/src/org/chromium/chrome/browser/feedback/ConnectivityCheckerTest.java
diff --git a/chrome/android/javatests_shell/src/org/chromium/chrome/browser/feedback/ConnectivityCheckerTest.java b/chrome/android/javatests_shell/src/org/chromium/chrome/browser/feedback/ConnectivityCheckerTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..c05ee25549e67dfe889d6c7d7c0c1bd1d5d1b6ef
--- /dev/null
+++ b/chrome/android/javatests_shell/src/org/chromium/chrome/browser/feedback/ConnectivityCheckerTest.java
@@ -0,0 +1,181 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.feedback;
+
+import android.content.Context;
+import android.test.suitebuilder.annotation.MediumTest;
+
+import org.apache.http.HttpException;
+import org.apache.http.HttpRequest;
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpStatus;
+import org.apache.http.HttpVersion;
+import org.apache.http.message.BasicHttpResponse;
+import org.apache.http.params.BasicHttpParams;
+import org.apache.http.params.CoreProtocolPNames;
+import org.apache.http.params.HttpParams;
+import org.chromium.base.ThreadUtils;
+import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.chrome.shell.ChromeShellTestBase;
+import org.chromium.net.test.BaseHttpTestServer;
+
+import java.io.IOException;
+import java.net.Socket;
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+/**
+ * Tests for {@link ConnectivityChecker}.
+ */
+public class ConnectivityCheckerTest extends ChromeShellTestBase {
+ private static final int TIMEOUT_MS = 5000;
+ /**
+ * Port number which spells out DUMMY on a numeric keypad.
+ */
+ private static final int DUMMY_PORT = 38669;
+
+ // Helper URLs for each of the given HTTP response codes.
+ private static final String BASE_URL = "http://127.0.0.1:" + DUMMY_PORT;
+ private static final String GENERATE_200_PATH = "/generate_200";
+ private static final String GENERATE_200_URL = BASE_URL + GENERATE_200_PATH;
+ private static final String GENERATE_204_PATH = "/generate_204";
+ private static final String GENERATE_204_URL = BASE_URL + GENERATE_204_PATH;
+ private static final String GENERATE_204_SLOW_PATH = "/generate_slow_204";
+ private static final String GENERATE_204_SLOW_URL = BASE_URL + GENERATE_204_SLOW_PATH;
+ private static final String GENERATE_302_PATH = "/generate_302";
+ private static final String GENERATE_302_URL = BASE_URL + GENERATE_302_PATH;
+ private static final String GENERATE_404_PATH = "/generate_404";
+ private static final String GENERATE_404_URL = BASE_URL + GENERATE_404_PATH;
+
+ private static class ConnectivityTestServer extends BaseHttpTestServer {
+ /**
+ * Create an HTTP test server.
+ */
+ public ConnectivityTestServer() throws IOException {
+ super(DUMMY_PORT, TIMEOUT_MS);
+ }
+
+ @Override
+ protected boolean validateSocket(Socket sock) {
+ return sock.getInetAddress().isLoopbackAddress();
+ }
+
+ @Override
+ protected HttpParams getConnectionParams() {
+ HttpParams httpParams = new BasicHttpParams();
+ httpParams.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
+ return httpParams;
+ }
+
+ @Override
+ protected HttpResponse handleGet(HttpRequest request) throws HttpException {
+ String requestPath = request.getRequestLine().getUri();
+ int httpStatus = getStatusCodeFromRequestPath(requestPath);
+ String reason = String.valueOf(httpStatus);
+ return new BasicHttpResponse(HttpVersion.HTTP_1_1, httpStatus, reason);
+ }
+
+ private int getStatusCodeFromRequestPath(String requestPath) {
+ switch (requestPath) {
+ case GENERATE_200_PATH:
+ return HttpStatus.SC_OK;
+ case GENERATE_204_PATH:
+ return HttpStatus.SC_NO_CONTENT;
+ case GENERATE_204_SLOW_PATH:
+ // Forcefully delay the response.
+ try {
+ Thread.sleep(TIMEOUT_MS);
+ } catch (InterruptedException e) {
+ // Intentionally ignored.
+ }
+ return HttpStatus.SC_NO_CONTENT;
+ case GENERATE_302_PATH:
+ return HttpStatus.SC_MOVED_TEMPORARILY;
+ case GENERATE_404_PATH:
+ return HttpStatus.SC_NOT_FOUND;
+ default:
+ return HttpStatus.SC_INTERNAL_SERVER_ERROR;
+ }
+ }
+ }
+
+ private static class Callback implements ConnectivityChecker.ConnectivityCheckerCallback {
+ private final Semaphore mSemaphore;
+ private AtomicBoolean mConnected = new AtomicBoolean();
+
+ Callback(Semaphore semaphore) {
+ mSemaphore = semaphore;
+ }
+
+ @Override
+ public void onResult(boolean connected) {
+ mConnected.set(connected);
+ mSemaphore.release();
+ }
+
+ boolean isConnected() {
+ return mConnected.get();
+ }
+ }
+
+ @MediumTest
+ public void testNoContentShouldWork() throws Exception {
+ executeTest(GENERATE_204_URL, true, TIMEOUT_MS);
+ }
+
+ @MediumTest
+ public void testSlowNoContentShouldNotWork() throws Exception {
+ // Force quick timeout. The server will wait TIMEOUT_MS, so this triggers well before.
+ executeTest(GENERATE_204_SLOW_URL, false, 100);
+ }
+
+ @MediumTest
+ public void testHttpOKShouldFail() throws Exception {
+ executeTest(GENERATE_200_URL, false, TIMEOUT_MS);
+ }
+
+ @MediumTest
+ public void testMovedTemporarilyShouldFail() throws Exception {
+ executeTest(GENERATE_302_URL, false, TIMEOUT_MS);
+ }
+
+ @MediumTest
+ public void testNotFoundShouldFail() throws Exception {
+ executeTest(GENERATE_404_URL, false, TIMEOUT_MS);
+ }
+
+ @MediumTest
+ public void testInvalidURLShouldFail() throws Exception {
+ executeTest("http:google.com:foo", false, TIMEOUT_MS);
+ }
+
+ private void executeTest(final String url, boolean expectedResult, final long timeoutMs)
+ throws Exception {
+ Context targetContext = getInstrumentation().getTargetContext();
+ startChromeBrowserProcessSync(targetContext);
+ ConnectivityTestServer testServer = new ConnectivityTestServer();
+ Thread testServerThread = new Thread(testServer);
+ testServerThread.start();
+ testServer.waitForServerToStart();
+
+ Semaphore semaphore = new Semaphore(0);
+ final Callback callback = new Callback(semaphore);
+ ThreadUtils.runOnUiThreadBlocking(new Runnable() {
+ @Override
+ public void run() {
+ ConnectivityChecker.checkConnectivity(
+ Profile.getLastUsedProfile(), url, timeoutMs, callback);
+ }
+ });
+
+ assertTrue(semaphore.tryAcquire(TIMEOUT_MS, TimeUnit.MILLISECONDS));
+ assertEquals("URL: " + url + ", got " + callback.isConnected() + ", want " + expectedResult,
+ expectedResult, callback.isConnected());
+
+ testServer.stop();
+ testServerThread.join();
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698