Commit 0440b549 authored by Xi Han's avatar Xi Han Committed by Commit Bot

Add browser tests for running in service manager only mode.

This is the first patch that adds tests that start Service Manager and run
without full browser starts.

Bug: 904549
Change-Id: I713aa68ba5ce7af11075a73a4ff52303b3c013ec
Reviewed-on: https://chromium-review.googlesource.com/c/1332259
Commit-Queue: Xi Han <hanxi@chromium.org>
Reviewed-by: default avatarMin Qin <qinmin@chromium.org>
Reviewed-by: default avatarYaron Friedman <yfriedman@chromium.org>
Cr-Commit-Position: refs/heads/master@{#611872}
parent c16a3ea0
...@@ -15,6 +15,7 @@ import org.chromium.base.ThreadUtils; ...@@ -15,6 +15,7 @@ import org.chromium.base.ThreadUtils;
import org.chromium.base.VisibleForTesting; import org.chromium.base.VisibleForTesting;
import org.chromium.base.library_loader.ProcessInitException; import org.chromium.base.library_loader.ProcessInitException;
import org.chromium.chrome.browser.init.ChromeBrowserInitializer; import org.chromium.chrome.browser.init.ChromeBrowserInitializer;
import org.chromium.chrome.browser.init.ServiceManagerStartupUtils;
import org.chromium.chrome.browser.ntp.snippets.SnippetsBridge; import org.chromium.chrome.browser.ntp.snippets.SnippetsBridge;
import org.chromium.chrome.browser.ntp.snippets.SnippetsLauncher; import org.chromium.chrome.browser.ntp.snippets.SnippetsLauncher;
import org.chromium.chrome.browser.offlinepages.BackgroundScheduler; import org.chromium.chrome.browser.offlinepages.BackgroundScheduler;
...@@ -54,6 +55,11 @@ public class ChromeBackgroundService extends GcmTaskService { ...@@ -54,6 +55,11 @@ public class ChromeBackgroundService extends GcmTaskService {
handleSnippetsOnPersistentSchedulerWakeUp(context, taskTag); handleSnippetsOnPersistentSchedulerWakeUp(context, taskTag);
break; break;
// This is only for tests.
case ServiceManagerStartupUtils.TASK_TAG:
handleServicificationStartupTask(context, taskTag);
break;
default: default:
Log.i(TAG, "Unknown task tag " + taskTag); Log.i(TAG, "Unknown task tag " + taskTag);
break; break;
...@@ -81,6 +87,10 @@ public class ChromeBackgroundService extends GcmTaskService { ...@@ -81,6 +87,10 @@ public class ChromeBackgroundService extends GcmTaskService {
snippetsOnPersistentSchedulerWakeUp(); snippetsOnPersistentSchedulerWakeUp();
} }
private void handleServicificationStartupTask(Context context, String tag) {
launchBrowser(context, tag);
}
@VisibleForTesting @VisibleForTesting
protected void snippetsOnPersistentSchedulerWakeUp() { protected void snippetsOnPersistentSchedulerWakeUp() {
SnippetsBridge.onPersistentSchedulerWakeUp(); SnippetsBridge.onPersistentSchedulerWakeUp();
......
...@@ -19,6 +19,8 @@ import java.util.Set; ...@@ -19,6 +19,8 @@ import java.util.Set;
* SharedPreferences so that Java classes can access them on next startup. * SharedPreferences so that Java classes can access them on next startup.
*/ */
public class ServiceManagerStartupUtils { public class ServiceManagerStartupUtils {
public static final String TASK_TAG = "Servicification Startup Task";
// List of features that supports starting ServiceManager on startup. // List of features that supports starting ServiceManager on startup.
private static final String[] SERVICE_MANAGER_FEATURES = { private static final String[] SERVICE_MANAGER_FEATURES = {
ChromeFeatureList.SERVICE_MANAGER_FOR_DOWNLOAD}; ChromeFeatureList.SERVICE_MANAGER_FOR_DOWNLOAD};
......
...@@ -1809,6 +1809,7 @@ chrome_test_java_sources = [ ...@@ -1809,6 +1809,7 @@ chrome_test_java_sources = [
"javatests/src/org/chromium/chrome/browser/BluetoothChooserDialogTest.java", "javatests/src/org/chromium/chrome/browser/BluetoothChooserDialogTest.java",
"javatests/src/org/chromium/chrome/browser/ChromeActivityTest.java", "javatests/src/org/chromium/chrome/browser/ChromeActivityTest.java",
"javatests/src/org/chromium/chrome/browser/ChromeBackgroundServiceTest.java", "javatests/src/org/chromium/chrome/browser/ChromeBackgroundServiceTest.java",
"javatests/src/org/chromium/chrome/browser/ServicificationBackgroundServiceTest.java",
"javatests/src/org/chromium/chrome/browser/ChromeHttpAuthHandlerTest.java", "javatests/src/org/chromium/chrome/browser/ChromeHttpAuthHandlerTest.java",
"javatests/src/org/chromium/chrome/browser/ContentViewFocusTest.java", "javatests/src/org/chromium/chrome/browser/ContentViewFocusTest.java",
"javatests/src/org/chromium/chrome/browser/CopylessPasteTest.java", "javatests/src/org/chromium/chrome/browser/CopylessPasteTest.java",
......
// Copyright 2018 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;
import android.content.Context;
import android.support.test.filters.MediumTest;
import com.google.android.gms.gcm.TaskParams;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.chromium.base.ThreadUtils;
import org.chromium.base.library_loader.ProcessInitException;
import org.chromium.base.metrics.RecordHistogram;
import org.chromium.base.test.util.CommandLineFlags;
import org.chromium.base.test.util.Feature;
import org.chromium.base.test.util.RetryOnFailure;
import org.chromium.chrome.browser.init.BrowserParts;
import org.chromium.chrome.browser.init.ChromeBrowserInitializer;
import org.chromium.chrome.browser.init.EmptyBrowserParts;
import org.chromium.chrome.browser.init.ServiceManagerStartupUtils;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.content_public.browser.test.util.Criteria;
import org.chromium.content_public.browser.test.util.CriteriaHelper;
/**
* Tests background tasks can be run in Service Manager only mode, i.e., without starting the full
* browser.
*/
@RunWith(ChromeJUnit4ClassRunner.class)
@RetryOnFailure
public final class ServicificationBackgroundServiceTest {
private MockTaskService mTaskService;
static class MockTaskService extends ChromeBackgroundService {
private boolean mDidLaunchBrowser;
private boolean mDidStartServiceManager;
@Override
protected void launchBrowser(Context context, String tag) {
mDidLaunchBrowser = true;
final BrowserParts parts = new EmptyBrowserParts() {
@Override
public void finishNativeInitialization() {
mDidStartServiceManager = true;
}
@Override
public boolean startServiceManagerOnly() {
return true;
}
};
try {
ChromeBrowserInitializer.getInstance().handlePreNativeStartup(parts);
ChromeBrowserInitializer.getInstance().handlePostNativeStartup(true, parts);
} catch (ProcessInitException e) {
ChromeApplication.reportStartupErrorAndExit(e);
}
}
// Posts an assertion task to the UI thread. Since this is only called after the call
// to onRunTask, it will be enqueued after any possible call to launchBrowser, and we
// can reliably check whether launchBrowser was called.
protected void checkExpectations(final boolean expectedLaunchBrowser) {
ThreadUtils.runOnUiThread(() -> {
Assert.assertEquals("StartedService", expectedLaunchBrowser, mDidLaunchBrowser);
});
}
public void waitForServiceManagerStart() {
CriteriaHelper.pollUiThread(
new Criteria("Failed while waiting for starting Service Manager.") {
@Override
public boolean isSatisfied() {
return mDidStartServiceManager;
}
});
}
}
@Before
public void setUp() {
BackgroundSyncLauncher.setGCMEnabled(false);
RecordHistogram.setDisabledForTests(true);
mTaskService = new MockTaskService();
}
@After
public void tearDown() throws Exception {
RecordHistogram.setDisabledForTests(false);
}
private void startOnRunTaskAndVerify(String taskTag, boolean shouldStart) {
mTaskService.onRunTask(new TaskParams(taskTag));
mTaskService.checkExpectations(shouldStart);
mTaskService.waitForServiceManagerStart();
}
@Test
@MediumTest
@Feature({"ServicificationStartup"})
@CommandLineFlags.Add({"allow-start-service-manager-only",
"enable-features=NetworkService,NetworkServiceInProcess"})
public void testSeriveManagerStarts() {
startOnRunTaskAndVerify(ServiceManagerStartupUtils.TASK_TAG, true);
}
}
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