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

Unified Diff: chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationManagerTestBase.java

Issue 2816603002: Adding JUnit tests for MediaNotificationManager (Closed)
Patch Set: rebased Created 3 years, 8 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/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationManagerTestBase.java
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationManagerTestBase.java b/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationManagerTestBase.java
new file mode 100644
index 0000000000000000000000000000000000000000..df9dbeea9b29ff397720aa859aa7e81bd01be821
--- /dev/null
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationManagerTestBase.java
@@ -0,0 +1,193 @@
+// Copyright 2017 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.media.ui;
+
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.clearInvocations;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.Bitmap;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Icon;
+import android.os.Build;
+import android.support.v4.media.session.MediaSessionCompat;
+import android.view.KeyEvent;
+
+import org.junit.Before;
+
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.shadows.ShadowLog;
+
+import org.chromium.base.CommandLine;
+import org.chromium.base.ContextUtils;
+import org.chromium.chrome.browser.AppHooks;
+import org.chromium.chrome.browser.AppHooksImpl;
+import org.chromium.chrome.browser.media.ui.MediaNotificationManager.ListenerService;
+import org.chromium.content_public.common.MediaMetadata;
+
+/**
+ * Common test fixtures for MediaNotificationManager JUnit tests.
+ */
+public class MediaNotificationManagerTestBase {
+ static final int NOTIFICATION_ID = 0;
+ static final String NOTIFICATION_GROUP_NAME = "group-name";
+ Context mMockContext;
+ MockListenerService mService;
+ MediaNotificationListener mListener;
+ AppHooksImpl mMockAppHooks;
+
+ MediaNotificationInfo.Builder mMediaNotificationInfoBuilder;
+
+ static class MockMediaNotificationManager extends MediaNotificationManager {
+ public MockMediaNotificationManager() {
+ super(NOTIFICATION_ID);
+ }
+ }
+
+ static class MockListenerService extends ListenerService {
+ @Override
+ protected MediaNotificationManager getManager() {
+ return MediaNotificationManager.getManager(NOTIFICATION_ID);
+ }
+
+ @Override
+ public int onStartCommand(Intent intent, int flags, int startId) {
+ return super.onStartCommand(intent, flags, startId);
+ }
+ }
+
+ static class MockMediaButtonReceiver extends MediaButtonReceiver {
+ @Override
+ public Class<?> getServiceClass() {
+ return MockListenerService.class;
+ }
+ }
+
+ @Before
+ public void setUp() {
+ // For checking the notification presented to NotificationManager.
+ assertTrue(RuntimeEnvironment.getApiLevel() >= Build.VERSION_CODES.N);
+
+ ShadowLog.stream = System.out;
+
+ mMockContext = spy(RuntimeEnvironment.application);
+ ContextUtils.initApplicationContextForTests(mMockContext);
+
+ mListener = mock(MediaNotificationListener.class);
+
+ MediaNotificationManager.sMapNotificationIdToOptions.put(NOTIFICATION_ID,
+ new MediaNotificationManager.NotificationOptions(MockListenerService.class,
+ MockMediaButtonReceiver.class, NOTIFICATION_GROUP_NAME));
+
+ MediaNotificationManager.setManagerForTesting(
+ NOTIFICATION_ID, spy(new MockMediaNotificationManager()));
+
+ mMediaNotificationInfoBuilder =
+ new MediaNotificationInfo.Builder()
+ .setMetadata(new MediaMetadata("title", "artist", "album"))
+ .setOrigin("https://example.com")
+ .setListener(mListener)
+ .setId(NOTIFICATION_ID);
+
+ doNothing().when(getManager()).onServiceStarted(any(ListenerService.class));
+ // Robolectric does not have "ShadowMediaSession".
+ doAnswer(new Answer() {
+ @Override
+ public Object answer(InvocationOnMock invocation) {
+ MediaSessionCompat mockSession = mock(MediaSessionCompat.class);
+ getManager().mMediaSession = mockSession;
+ doReturn(null).when(mockSession).getSessionToken();
+ return "Created mock media session";
+ }
+ })
+ .when(getManager())
+ .updateMediaSession();
+
+ doAnswer(new Answer() {
+ @Override
+ public Object answer(InvocationOnMock invocation) {
+ Intent intent = (Intent) invocation.getArgument(0);
+ startService(intent);
+ return new ComponentName(mMockContext, MockListenerService.class);
+ }
+ })
+ .when(mMockContext)
+ .startService(any(Intent.class));
+
+ mMockAppHooks = mock(AppHooksImpl.class);
+ AppHooks.setInstanceForTesting(mMockAppHooks);
+
+ // Init the command line to avoid assertion failure in |SysUtils#isLowEndDevice()|.
+ CommandLine.init(null);
+ }
+
+ MediaNotificationManager getManager() {
+ return MediaNotificationManager.getManager(NOTIFICATION_ID);
+ }
+
+ void ensureMediaNotificationInfo() {
+ getManager().mMediaNotificationInfo = mMediaNotificationInfoBuilder.build();
+ }
+
+ void setUpServiceAndClearInvocations() {
+ setUpService();
+ clearInvocations(getManager());
+ clearInvocations(mService);
+ clearInvocations(mMockContext);
+ }
+
+ void setUpService() {
+ ensureMediaNotificationInfo();
+
+ Intent intent = getManager().createIntent();
+ mMockContext.startService(intent);
+ }
+
+ private void startService(Intent intent) {
+ ensureService();
+ mService.onStartCommand(intent, 0, 0);
+ }
+
+ private void ensureService() {
+ if (mService != null) return;
+ mService = spy(new MockListenerService());
+
+ doAnswer(new Answer() {
+ public Object answer(InvocationOnMock invocation) {
+ mService.onDestroy();
+ mService = null;
+ return "service stopped";
+ }
+ })
+ .when(mService)
+ .stopListenerService();
+ }
+
+ Intent createMediaButtonActionIntent(int keyCode) {
+ Intent intent = new Intent(Intent.ACTION_MEDIA_BUTTON);
+ KeyEvent keyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, keyCode);
+ intent.putExtra(Intent.EXTRA_KEY_EVENT, keyEvent);
+
+ return intent;
+ }
+
+ Bitmap iconToBitmap(Icon icon) {
+ if (icon == null) return null;
+
+ BitmapDrawable drawable = (BitmapDrawable) icon.loadDrawable(mMockContext);
+ assert drawable != null;
+ return drawable.getBitmap();
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698