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

Unified Diff: chrome/android/webapk/libs/client/junit/src/org/chromium/webapk/lib/client/WebApkServiceConnectionManagerTest.java

Issue 1969303002: Upstream WebAPK notification related code (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 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/webapk/libs/client/junit/src/org/chromium/webapk/lib/client/WebApkServiceConnectionManagerTest.java
diff --git a/chrome/android/webapk/libs/client/junit/src/org/chromium/webapk/lib/client/WebApkServiceConnectionManagerTest.java b/chrome/android/webapk/libs/client/junit/src/org/chromium/webapk/lib/client/WebApkServiceConnectionManagerTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..e8e173283e61bd685e9cc95e399432f25b021e41
--- /dev/null
+++ b/chrome/android/webapk/libs/client/junit/src/org/chromium/webapk/lib/client/WebApkServiceConnectionManagerTest.java
@@ -0,0 +1,152 @@
+// Copyright 2016 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.webapk.lib.client;
+
+import android.content.Context;
+import android.content.ContextWrapper;
+import android.content.Intent;
+import android.content.ServiceConnection;
+
+import org.chromium.base.Callback;
+import org.chromium.base.ContextUtils;
+import org.chromium.testing.local.CustomShadowAsyncTask;
+import org.chromium.testing.local.LocalRobolectricTestRunner;
+import org.chromium.webapk.lib.runtime_library.IWebApkApi;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.Robolectric;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowApplication;
+
+/**
+ * Unit tests for {@link org.chromium.libs.client.WebApkServiceConnectionManager}.
+ */
+@RunWith(LocalRobolectricTestRunner.class)
+@Config(manifest = Config.NONE, shadows = {CustomShadowAsyncTask.class})
+public class WebApkServiceConnectionManagerTest {
+
+ private static final String WEB_APK_PACKAGE = "com.webapk.package";
+
+ private ShadowApplication mShadowApplication;
+ private WebApkServiceConnectionManager mConnectionManager;
+
+ private class TestCallback implements Callback<IWebApkApi> {
+ public boolean mGotResult = false;
+
+ @Override
+ public void onResult(IWebApkApi api) {
+ mGotResult = true;
+ }
+ }
+
+ @Before
+ public void setUp() {
+ ContextUtils.initApplicationContextForTests(Robolectric.application);
+ mShadowApplication = Robolectric.shadowOf(Robolectric.application);
+ mConnectionManager = new WebApkServiceConnectionManager();
+ }
+
+ /**
+ * Test that a connection request to a WebAPK's service does not create a new connection if one
+ * already exists.
+ */
+ @Test
+ public void testAfterConnectionEstablished() throws Exception {
+ TestCallback callback1 = new TestCallback();
+ TestCallback callback2 = new TestCallback();
+
+ mConnectionManager.connect(WEB_APK_PACKAGE, callback1);
+ mConnectionManager.connect(WEB_APK_PACKAGE, callback2);
+
+ // Only one connection should have been created.
+ Assert.assertEquals(WEB_APK_PACKAGE, getNextStartedServicePackage());
+ Assert.assertEquals(null, getNextStartedServicePackage());
+
+ // Both callbacks should have been called.
+ Assert.assertTrue(callback1.mGotResult);
+ Assert.assertTrue(callback2.mGotResult);
+ }
+
+ /**
+ * Test connecting to a WebAPK when Chrome is in the process of establishing a connection to the
+ * WebAPK but has not established a connection yet.
+ */
+ @Test
+ public void testConnectWhileConnectionBeingEstablished() throws Exception {
+ // Context for testing {@link Context#bindService()} occurring asynchronously.
+ class AsyncBindContext extends ContextWrapper {
+ private ServiceConnection mConnection;
+
+ public AsyncBindContext() {
+ super(null);
+ }
+
+ // Establish pending connection created in {@link #bindService}.
+ public void establishServiceConnection() {
+ if (mConnection != null) {
+ mConnection.onServiceConnected(null, null);
+ }
+ }
+
+ @Override
+ public Context getApplicationContext() {
+ // Need to return real context so that ContextUtils#fetchAppSharedPreferences() does
+ // not crash.
+ return Robolectric.application;
+ }
+
+ // Create pending connection.
+ @Override
+ public boolean bindService(Intent service, ServiceConnection connection, int flags) {
+ mConnection = connection;
+ return true;
+ }
+ }
+
+ AsyncBindContext asyncBindContext = new AsyncBindContext();
+ ContextUtils.initApplicationContextForTests(asyncBindContext);
+
+ TestCallback callback1 = new TestCallback();
+ TestCallback callback2 = new TestCallback();
+ mConnectionManager.connect(WEB_APK_PACKAGE, callback1);
+ mConnectionManager.connect(WEB_APK_PACKAGE, callback2);
+
+ // The connection has not been established yet. Neither of the callbacks should have been
+ // called.
+ Assert.assertFalse(callback1.mGotResult);
+ Assert.assertFalse(callback2.mGotResult);
+
+ // Establishing the connection should cause both callbacks to be called.
+ asyncBindContext.establishServiceConnection();
+ Assert.assertTrue(callback1.mGotResult);
+ Assert.assertTrue(callback2.mGotResult);
+ }
+
+ /**
+ * Test reconnecting to a WebAPK's service.
+ */
+ @Test
+ public void testDisconnectConnect() throws Exception {
+ mConnectionManager.connect(WEB_APK_PACKAGE, new TestCallback());
+ Assert.assertEquals(WEB_APK_PACKAGE, getNextStartedServicePackage());
+ Assert.assertEquals(null, getNextStartedServicePackage());
+
+ mConnectionManager.disconnect(WEB_APK_PACKAGE);
+ mConnectionManager.connect(WEB_APK_PACKAGE, new TestCallback());
+ Assert.assertEquals(WEB_APK_PACKAGE, getNextStartedServicePackage());
+ Assert.assertEquals(null, getNextStartedServicePackage());
+ }
+
+ /**
+ * Returns the package name of the most recently started service.
+ */
+ public String getNextStartedServicePackage() {
+ Intent intent = mShadowApplication.getNextStartedService();
+ return (intent == null) ? null : intent.getPackage();
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698