Commit 26d805ac authored by Henrique Nakashima's avatar Henrique Nakashima Committed by Commit Bot

Mock BackgroundTaskSchedulerExternalUma in NativeBackgroundTaskTest

Use this to add verifications that the expected calls are made to
BackgroundTaskSchedulerExternalUma.

Bug: 1017130
Change-Id: Ica99e12df6d1d655f1d2fdba8ad20b5065a2170a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1884821Reviewed-by: default avatarMohamed Heikal <mheikal@chromium.org>
Reviewed-by: default avatarDavid Trainor <dtrainor@chromium.org>
Commit-Queue: Henrique Nakashima <hnakashima@chromium.org>
Cr-Commit-Position: refs/heads/master@{#711824}
parent 77e4c971
......@@ -49,8 +49,6 @@ public abstract class NativeBackgroundTask implements BackgroundTask {
int DONE = 2;
}
protected NativeBackgroundTask() {}
/** Indicates that the task has already been stopped. Should only be accessed on UI Thread. */
private boolean mTaskStopped;
......@@ -66,6 +64,17 @@ public abstract class NativeBackgroundTask implements BackgroundTask {
/** Make sure that we do not double record task finished metric */
private boolean mFinishMetricRecorded;
private BackgroundTaskSchedulerExternalUma mExternalUma;
protected NativeBackgroundTask() {
this(BackgroundTaskSchedulerExternalUma.getInstance());
}
@VisibleForTesting
NativeBackgroundTask(BackgroundTaskSchedulerExternalUma externalUma) {
mExternalUma = externalUma;
}
@Override
public final boolean onStartTask(
Context context, TaskParameters taskParameters, TaskFinishedCallback callback) {
......@@ -129,8 +138,7 @@ public abstract class NativeBackgroundTask implements BackgroundTask {
final Runnable rescheduleRunnable) {
if (isNativeLoadedInFullBrowserMode()) {
mRunningInServiceManagerOnlyMode = false;
BackgroundTaskSchedulerExternalUma.reportNativeTaskStarted(
mTaskId, mRunningInServiceManagerOnlyMode);
mExternalUma.reportNativeTaskStarted(mTaskId, mRunningInServiceManagerOnlyMode);
recordMemoryUsageWithRandomDelay(mRunningInServiceManagerOnlyMode);
PostTask.postTask(UiThreadTaskTraits.DEFAULT, startWithNativeRunnable);
return;
......@@ -138,8 +146,7 @@ public abstract class NativeBackgroundTask implements BackgroundTask {
boolean wasInServiceManagerOnlyMode = isNativeLoadedInServiceManagerOnlyMode();
mRunningInServiceManagerOnlyMode = supportsServiceManagerOnly();
BackgroundTaskSchedulerExternalUma.reportNativeTaskStarted(
mTaskId, mRunningInServiceManagerOnlyMode);
mExternalUma.reportNativeTaskStarted(mTaskId, mRunningInServiceManagerOnlyMode);
final BrowserParts parts = new EmptyBrowserParts() {
@Override
......@@ -167,8 +174,7 @@ public abstract class NativeBackgroundTask implements BackgroundTask {
// to Full Browser mode, but not cases in which Service Manager Only Mode was
// already started.
if (!wasInServiceManagerOnlyMode) {
BackgroundTaskSchedulerExternalUma.reportTaskStartedNative(
mTaskId, mRunningInServiceManagerOnlyMode);
mExternalUma.reportTaskStartedNative(mTaskId, mRunningInServiceManagerOnlyMode);
}
try {
......@@ -270,8 +276,7 @@ public abstract class NativeBackgroundTask implements BackgroundTask {
ThreadUtils.assertOnUiThread();
if (!mFinishMetricRecorded) {
mFinishMetricRecorded = true;
BackgroundTaskSchedulerExternalUma.reportNativeTaskFinished(
mTaskId, mRunningInServiceManagerOnlyMode);
mExternalUma.reportNativeTaskFinished(mTaskId, mRunningInServiceManagerOnlyMode);
}
}
......
......@@ -317,8 +317,9 @@ public class ChromeBrowserInitializer {
int startupMode =
getBrowserStartupController().getStartupMode(delegate.startServiceManagerOnly());
tasks.add(UiThreadTaskTraits.DEFAULT,
() -> { BackgroundTaskSchedulerExternalUma.reportStartupMode(startupMode); });
tasks.add(UiThreadTaskTraits.DEFAULT, () -> {
BackgroundTaskSchedulerExternalUma.getInstance().reportStartupMode(startupMode);
});
if (isAsync) {
// We want to start this queue once the C++ startup tasks have run; allow the
......
......@@ -14,9 +14,11 @@ import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import android.content.Context;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
......@@ -40,6 +42,7 @@ import org.chromium.chrome.browser.init.ChromeBrowserInitializer;
import org.chromium.chrome.browser.metrics.BackgroundTaskMemoryMetricsEmitter;
import org.chromium.chrome.browser.metrics.BackgroundTaskMemoryMetricsEmitterJni;
import org.chromium.components.background_task_scheduler.BackgroundTask;
import org.chromium.components.background_task_scheduler.BackgroundTaskSchedulerExternalUma;
import org.chromium.components.background_task_scheduler.TaskIds;
import org.chromium.components.background_task_scheduler.TaskParameters;
import org.chromium.content_public.browser.BrowserStartupController;
......@@ -125,6 +128,9 @@ public class NativeBackgroundTaskTest {
@Captor
ArgumentCaptor<BrowserParts> mBrowserParts;
@Mock
private BackgroundTaskSchedulerExternalUma mExternalUmaMock;
private static class TaskFinishedCallback implements BackgroundTask.TaskFinishedCallback {
private boolean mWasCalled;
private boolean mNeedsReschedule;
......@@ -164,7 +170,9 @@ public class NativeBackgroundTaskTest {
private boolean mWasOnStopTaskBeforeNativeLoadedCalled;
private BrowserStartupController mBrowserStartupController;
public TestNativeBackgroundTask(BrowserStartupController controller) {
public TestNativeBackgroundTask(BrowserStartupController controller,
BackgroundTaskSchedulerExternalUma externalUma) {
super(externalUma);
mBrowserStartupController = controller;
mWasOnStartTaskWithNativeCalled = false;
mStartBeforeNativeResult = StartBeforeNativeResult.LOAD_NATIVE;
......@@ -239,11 +247,16 @@ public class NativeBackgroundTaskTest {
mocker.mock(BackgroundTaskMemoryMetricsEmitterJni.TEST_HOOKS, mEmitterNativeMock);
mBrowserStartupController = new TestBrowserStartupController();
mCallback = new TaskFinishedCallback();
mTask = new TestNativeBackgroundTask(mBrowserStartupController);
mTask = new TestNativeBackgroundTask(mBrowserStartupController, mExternalUmaMock);
ChromeBrowserInitializer.setForTesting(mChromeBrowserInitializer);
ChromeBrowserInitializer.setBrowserStartupControllerForTesting(mBrowserStartupController);
}
@After
public void tearDown() {
verifyNoMoreInteractions(mExternalUmaMock);
}
private void setUpChromeBrowserInitializer(InitializerSetup setup) {
doNothing().when(mChromeBrowserInitializer).handlePreNativeStartup(any(BrowserParts.class));
switch (setup) {
......@@ -335,6 +348,7 @@ public class NativeBackgroundTaskTest {
verifyStartupCalls(0, 0);
assertTrue(mTask.wasOnStartTaskWithNativeCalled());
assertFalse(mCallback.wasCalled());
verify(mExternalUmaMock).reportNativeTaskStarted(TaskIds.TEST, false);
}
@Test
......@@ -349,6 +363,8 @@ public class NativeBackgroundTaskTest {
verifyStartupCalls(1, 1);
assertTrue(mTask.wasOnStartTaskWithNativeCalled());
assertFalse(mCallback.wasCalled());
verify(mExternalUmaMock).reportNativeTaskStarted(TaskIds.TEST, false);
verify(mExternalUmaMock).reportTaskStartedNative(TaskIds.TEST, false);
}
@Test
......@@ -364,6 +380,9 @@ public class NativeBackgroundTaskTest {
assertFalse(mTask.wasOnStartTaskWithNativeCalled());
assertTrue(mCallback.wasCalled());
assertTrue(mCallback.needsRescheduling());
verify(mExternalUmaMock).reportNativeTaskStarted(TaskIds.TEST, false);
verify(mExternalUmaMock).reportTaskStartedNative(TaskIds.TEST, false);
verify(mExternalUmaMock).reportNativeTaskFinished(TaskIds.TEST, false);
}
@Test
......@@ -379,6 +398,9 @@ public class NativeBackgroundTaskTest {
assertFalse(mTask.wasOnStartTaskWithNativeCalled());
assertTrue(mCallback.wasCalled());
assertTrue(mCallback.needsRescheduling());
verify(mExternalUmaMock).reportNativeTaskStarted(TaskIds.TEST, false);
verify(mExternalUmaMock).reportTaskStartedNative(TaskIds.TEST, false);
verify(mExternalUmaMock).reportNativeTaskFinished(TaskIds.TEST, false);
}
@Test
......@@ -391,6 +413,9 @@ public class NativeBackgroundTaskTest {
assertTrue(mTask.onStopTask(ContextUtils.getApplicationContext(), getTaskParameters()));
assertTrue(mTask.wasOnStopTaskBeforeNativeLoadedCalled());
assertFalse(mTask.wasOnStopTaskWithNativeCalled());
verify(mExternalUmaMock).reportNativeTaskStarted(TaskIds.TEST, false);
verify(mExternalUmaMock).reportTaskStartedNative(TaskIds.TEST, false);
verify(mExternalUmaMock).reportNativeTaskFinished(TaskIds.TEST, false);
}
@Test
......@@ -403,6 +428,9 @@ public class NativeBackgroundTaskTest {
assertFalse(mTask.onStopTask(ContextUtils.getApplicationContext(), getTaskParameters()));
assertTrue(mTask.wasOnStopTaskBeforeNativeLoadedCalled());
assertFalse(mTask.wasOnStopTaskWithNativeCalled());
verify(mExternalUmaMock).reportNativeTaskStarted(TaskIds.TEST, false);
verify(mExternalUmaMock).reportTaskStartedNative(TaskIds.TEST, false);
verify(mExternalUmaMock).reportNativeTaskFinished(TaskIds.TEST, false);
}
@Test
......@@ -415,6 +443,8 @@ public class NativeBackgroundTaskTest {
assertTrue(mTask.onStopTask(ContextUtils.getApplicationContext(), getTaskParameters()));
assertFalse(mTask.wasOnStopTaskBeforeNativeLoadedCalled());
assertTrue(mTask.wasOnStopTaskWithNativeCalled());
verify(mExternalUmaMock).reportNativeTaskStarted(TaskIds.TEST, false);
verify(mExternalUmaMock).reportNativeTaskFinished(TaskIds.TEST, false);
}
@Test
......@@ -427,5 +457,7 @@ public class NativeBackgroundTaskTest {
assertFalse(mTask.onStopTask(ContextUtils.getApplicationContext(), getTaskParameters()));
assertFalse(mTask.wasOnStopTaskBeforeNativeLoadedCalled());
assertTrue(mTask.wasOnStopTaskWithNativeCalled());
verify(mExternalUmaMock).reportNativeTaskStarted(TaskIds.TEST, false);
verify(mExternalUmaMock).reportNativeTaskFinished(TaskIds.TEST, false);
}
}
......@@ -4,12 +4,27 @@
package org.chromium.components.background_task_scheduler;
import org.chromium.base.VisibleForTesting;
/**
* Helper class to allow external code (typically Chrome-specific BackgroundTaskScheduler code) to
* report UMA.
*/
public final class BackgroundTaskSchedulerExternalUma {
private BackgroundTaskSchedulerExternalUma() {}
public class BackgroundTaskSchedulerExternalUma {
@VisibleForTesting
BackgroundTaskSchedulerExternalUma() {}
private static class LazyHolder {
static final BackgroundTaskSchedulerExternalUma INSTANCE =
new BackgroundTaskSchedulerExternalUma();
}
/**
* @return the BackgroundTaskSchedulerExternalUma singleton
*/
public static BackgroundTaskSchedulerExternalUma getInstance() {
return LazyHolder.INSTANCE;
}
/**
* Reports metrics for when a NativeBackgroundTask loads the native library.
......@@ -17,7 +32,7 @@ public final class BackgroundTaskSchedulerExternalUma {
* @param serviceManagerOnlyMode Whether the task will start native in Service Manager Only Mode
* (Reduced Mode) instead of Full Browser Mode.
*/
public static void reportTaskStartedNative(int taskId, boolean serviceManagerOnlyMode) {
public void reportTaskStartedNative(int taskId, boolean serviceManagerOnlyMode) {
BackgroundTaskSchedulerUma.getInstance().reportTaskStartedNative(
taskId, serviceManagerOnlyMode);
}
......@@ -29,7 +44,7 @@ public final class BackgroundTaskSchedulerExternalUma {
* @param serviceManagerOnlyMode Whether the task will run in Service Manager Only Mode (Reduced
* Mode) instead of Full Browser Mode.
*/
public static void reportNativeTaskStarted(int taskId, boolean serviceManagerOnlyMode) {
public void reportNativeTaskStarted(int taskId, boolean serviceManagerOnlyMode) {
BackgroundTaskSchedulerUma.getInstance().reportNativeTaskStarted(
taskId, serviceManagerOnlyMode);
}
......@@ -42,7 +57,7 @@ public final class BackgroundTaskSchedulerExternalUma {
* @param serviceManagerOnlyMode Whether the task will run in Service Manager Only Mode (Reduced
* Mode) instead of Full Browser Mode.
*/
public static void reportNativeTaskFinished(int taskId, boolean serviceManagerOnlyMode) {
public void reportNativeTaskFinished(int taskId, boolean serviceManagerOnlyMode) {
BackgroundTaskSchedulerUma.getInstance().reportNativeTaskFinished(
taskId, serviceManagerOnlyMode);
}
......@@ -53,7 +68,7 @@ public final class BackgroundTaskSchedulerExternalUma {
* See {@link org.chromium.content.browser.ServicificationStartupUma} for more details.
* @param startupMode Chrome's startup mode.
*/
public static void reportStartupMode(int startupMode) {
public void reportStartupMode(int startupMode) {
BackgroundTaskSchedulerUma.getInstance().reportStartupMode(startupMode);
}
......
......@@ -34,10 +34,13 @@ public class BackgroundTaskSchedulerUmaTest {
@Spy
private BackgroundTaskSchedulerUma mUmaSpy;
private BackgroundTaskSchedulerExternalUma mExternalUma;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
BackgroundTaskSchedulerUma.setInstanceForTesting(mUmaSpy);
mExternalUma = new BackgroundTaskSchedulerExternalUma();
doNothing().when(mUmaSpy).assertNativeIsLoaded();
}
......@@ -280,8 +283,7 @@ public class BackgroundTaskSchedulerUmaTest {
@Feature({"BackgroundTaskScheduler"})
public void testReportTaskStartedNativeFullBrowser() {
doNothing().when(mUmaSpy).cacheEvent(anyString(), anyInt());
BackgroundTaskSchedulerExternalUma.reportTaskStartedNative(
TaskIds.DOWNLOAD_SERVICE_JOB_ID, false);
mExternalUma.reportTaskStartedNative(TaskIds.DOWNLOAD_SERVICE_JOB_ID, false);
verify(mUmaSpy, times(1))
.cacheEvent(eq("Android.BackgroundTaskScheduler.TaskLoadedNative"),
eq(BackgroundTaskSchedulerUma.BACKGROUND_TASK_DOWNLOAD_SERVICE));
......@@ -297,8 +299,7 @@ public class BackgroundTaskSchedulerUmaTest {
@Feature({"BackgroundTaskScheduler"})
public void testReportTaskStartedNativeReducedMode() {
doNothing().when(mUmaSpy).cacheEvent(anyString(), anyInt());
BackgroundTaskSchedulerExternalUma.reportTaskStartedNative(
TaskIds.DOWNLOAD_SERVICE_JOB_ID, true);
mExternalUma.reportTaskStartedNative(TaskIds.DOWNLOAD_SERVICE_JOB_ID, true);
verify(mUmaSpy, times(1))
.cacheEvent(eq("Android.BackgroundTaskScheduler.TaskLoadedNative"),
eq(BackgroundTaskSchedulerUma.BACKGROUND_TASK_DOWNLOAD_SERVICE));
......@@ -314,8 +315,7 @@ public class BackgroundTaskSchedulerUmaTest {
@Feature({"BackgroundTaskScheduler"})
public void testReportNativeTaskStartedFullBrowser() {
doNothing().when(mUmaSpy).cacheEvent(anyString(), anyInt());
BackgroundTaskSchedulerExternalUma.reportNativeTaskStarted(
TaskIds.DOWNLOAD_SERVICE_JOB_ID, false);
mExternalUma.reportNativeTaskStarted(TaskIds.DOWNLOAD_SERVICE_JOB_ID, false);
verify(mUmaSpy, times(1))
.cacheEvent(eq("Android.NativeBackgroundTask.TaskStarted"),
eq(BackgroundTaskSchedulerUma.BACKGROUND_TASK_DOWNLOAD_SERVICE));
......@@ -331,8 +331,7 @@ public class BackgroundTaskSchedulerUmaTest {
@Feature({"BackgroundTaskScheduler"})
public void testReportNativeTaskStartedReducedMode() {
doNothing().when(mUmaSpy).cacheEvent(anyString(), anyInt());
BackgroundTaskSchedulerExternalUma.reportNativeTaskStarted(
TaskIds.DOWNLOAD_SERVICE_JOB_ID, true);
mExternalUma.reportNativeTaskStarted(TaskIds.DOWNLOAD_SERVICE_JOB_ID, true);
verify(mUmaSpy, times(1))
.cacheEvent(eq("Android.NativeBackgroundTask.TaskStarted"),
eq(BackgroundTaskSchedulerUma.BACKGROUND_TASK_DOWNLOAD_SERVICE));
......@@ -348,8 +347,7 @@ public class BackgroundTaskSchedulerUmaTest {
@Feature({"BackgroundTaskScheduler"})
public void testReportNativeTaskFinishedFullBrowser() {
doNothing().when(mUmaSpy).cacheEvent(anyString(), anyInt());
BackgroundTaskSchedulerExternalUma.reportNativeTaskFinished(
TaskIds.DOWNLOAD_SERVICE_JOB_ID, false);
mExternalUma.reportNativeTaskFinished(TaskIds.DOWNLOAD_SERVICE_JOB_ID, false);
verify(mUmaSpy, times(1))
.cacheEvent(eq("Android.NativeBackgroundTask.TaskFinished"),
eq(BackgroundTaskSchedulerUma.BACKGROUND_TASK_DOWNLOAD_SERVICE));
......@@ -365,8 +363,7 @@ public class BackgroundTaskSchedulerUmaTest {
@Feature({"BackgroundTaskScheduler"})
public void testReportNativeTaskFinishedReducedMode() {
doNothing().when(mUmaSpy).cacheEvent(anyString(), anyInt());
BackgroundTaskSchedulerExternalUma.reportNativeTaskFinished(
TaskIds.DOWNLOAD_SERVICE_JOB_ID, true);
mExternalUma.reportNativeTaskFinished(TaskIds.DOWNLOAD_SERVICE_JOB_ID, true);
verify(mUmaSpy, times(1))
.cacheEvent(eq("Android.NativeBackgroundTask.TaskFinished"),
eq(BackgroundTaskSchedulerUma.BACKGROUND_TASK_DOWNLOAD_SERVICE));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment