Commit ba1197c8 authored by Mehran Mahmoudi's avatar Mehran Mahmoudi Committed by Commit Bot

[Touchless] Add unit tests for progress bar

This adds some unit tests for the progress bar in touchless mode.

Bug: 967453
Change-Id: Id85c3ba30ad2c9779f2716b2b5af2e708e3cbe83
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1637427Reviewed-by: default avatarYaron Friedman <yfriedman@chromium.org>
Reviewed-by: default avatarMatthew Jones <mdjones@chromium.org>
Commit-Queue: Mehran Mahmoudi <mahmoudi@chromium.org>
Cr-Commit-Position: refs/heads/master@{#665244}
parent fbbe79f5
...@@ -3420,6 +3420,7 @@ if (is_android) { ...@@ -3420,6 +3420,7 @@ if (is_android) {
"android/junit/src/org/chromium/base/util/GarbageCollectionTestUtil.java", "android/junit/src/org/chromium/base/util/GarbageCollectionTestUtil.java",
"test/android/junit/src/org/chromium/base/task/test/BackgroundShadowAsyncTask.java", "test/android/junit/src/org/chromium/base/task/test/BackgroundShadowAsyncTask.java",
"test/android/junit/src/org/chromium/base/task/test/CustomShadowAsyncTask.java", "test/android/junit/src/org/chromium/base/task/test/CustomShadowAsyncTask.java",
"test/android/junit/src/org/chromium/base/task/test/ShadowPostTask.java",
"test/android/junit/src/org/chromium/base/test/BaseRobolectricTestRunner.java", "test/android/junit/src/org/chromium/base/test/BaseRobolectricTestRunner.java",
"test/android/junit/src/org/chromium/base/test/util/TestRunnerTestRule.java", "test/android/junit/src/org/chromium/base/test/util/TestRunnerTestRule.java",
"//third_party/robolectric/custom_asynctask/java/src/org/chromium/base/task/test/ShadowAsyncTask.java", "//third_party/robolectric/custom_asynctask/java/src/org/chromium/base/task/test/ShadowAsyncTask.java",
......
...@@ -2,22 +2,42 @@ ...@@ -2,22 +2,42 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
package org.chromium.chrome.browser.customtabs.shadows; package org.chromium.base.task.test;
import org.robolectric.Robolectric;
import org.robolectric.annotation.Implementation; import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements; import org.robolectric.annotation.Implements;
import org.robolectric.annotation.Resetter;
import org.chromium.base.task.PostTask; import org.chromium.base.task.PostTask;
import org.chromium.base.task.TaskTraits; import org.chromium.base.task.TaskTraits;
/** /**
* TODO(pshmakov): make a more elaborate shadow, or perhaps a non-static wrapper for PostTask * Shadow implementation for {@link PostTask}.
* to be injected.
*/ */
@Implements(PostTask.class) @Implements(PostTask.class)
public class ShadowPostTask { public class ShadowPostTask {
private static TestImpl sTestImpl = new TestImpl();
/** Set implementation for tests. Don't forget to call {@link #reset} later. */
public static void setTestImpl(TestImpl testImpl) {
sTestImpl = testImpl;
}
@Resetter
public static void reset() {
sTestImpl = new TestImpl();
}
@Implementation @Implementation
public static void postDelayedTask(TaskTraits taskTraits, Runnable task, long delay) { public static void postDelayedTask(TaskTraits taskTraits, Runnable task, long delay) {
sTestImpl.postDelayedTask(taskTraits, task, delay);
}
/** Default implementation for tests. Override methods or add new ones as necessary. */
public static class TestImpl {
public void postDelayedTask(TaskTraits taskTraits, Runnable task, long delay) {
Robolectric.getForegroundThreadScheduler().postDelayed(task, delay);
}
} }
} }
...@@ -57,7 +57,6 @@ chrome_junit_test_java_sources = [ ...@@ -57,7 +57,6 @@ chrome_junit_test_java_sources = [
"junit/src/org/chromium/chrome/browser/customtabs/content/CustomTabActivityTabControllerTest.java", "junit/src/org/chromium/chrome/browser/customtabs/content/CustomTabActivityTabControllerTest.java",
"junit/src/org/chromium/chrome/browser/customtabs/content/CustomTabActivityUrlLoadingTest.java", "junit/src/org/chromium/chrome/browser/customtabs/content/CustomTabActivityUrlLoadingTest.java",
"junit/src/org/chromium/chrome/browser/customtabs/shadows/ShadowExternalNavigationDelegateImpl.java", "junit/src/org/chromium/chrome/browser/customtabs/shadows/ShadowExternalNavigationDelegateImpl.java",
"junit/src/org/chromium/chrome/browser/customtabs/shadows/ShadowPostTask.java",
"junit/src/org/chromium/chrome/browser/display_cutout/DisplayCutoutControllerTest.java", "junit/src/org/chromium/chrome/browser/display_cutout/DisplayCutoutControllerTest.java",
"junit/src/org/chromium/chrome/browser/download/DownloadResumptionSchedulerTest.java", "junit/src/org/chromium/chrome/browser/download/DownloadResumptionSchedulerTest.java",
"junit/src/org/chromium/chrome/browser/download/DownloadSharedPreferenceEntryTest.java", "junit/src/org/chromium/chrome/browser/download/DownloadSharedPreferenceEntryTest.java",
......
...@@ -15,6 +15,7 @@ import static org.mockito.Mockito.never; ...@@ -15,6 +15,7 @@ import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
...@@ -25,11 +26,12 @@ import org.mockito.MockitoAnnotations; ...@@ -25,11 +26,12 @@ import org.mockito.MockitoAnnotations;
import org.mockito.stubbing.Answer; import org.mockito.stubbing.Answer;
import org.robolectric.annotation.Config; import org.robolectric.annotation.Config;
import org.chromium.base.task.TaskTraits;
import org.chromium.base.task.test.ShadowPostTask;
import org.chromium.chrome.browser.customtabs.content.CustomTabActivityNavigationController.BackHandler; import org.chromium.chrome.browser.customtabs.content.CustomTabActivityNavigationController.BackHandler;
import org.chromium.chrome.browser.customtabs.content.CustomTabActivityNavigationController.FinishHandler; import org.chromium.chrome.browser.customtabs.content.CustomTabActivityNavigationController.FinishHandler;
import org.chromium.chrome.browser.customtabs.content.CustomTabActivityNavigationController.FinishReason; import org.chromium.chrome.browser.customtabs.content.CustomTabActivityNavigationController.FinishReason;
import org.chromium.chrome.browser.customtabs.shadows.ShadowExternalNavigationDelegateImpl; import org.chromium.chrome.browser.customtabs.shadows.ShadowExternalNavigationDelegateImpl;
import org.chromium.chrome.browser.customtabs.shadows.ShadowPostTask;
import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
import org.chromium.testing.local.LocalRobolectricTestRunner; import org.chromium.testing.local.LocalRobolectricTestRunner;
...@@ -55,6 +57,10 @@ public class CustomTabActivityNavigationControllerTest { ...@@ -55,6 +57,10 @@ public class CustomTabActivityNavigationControllerTest {
@Before @Before
public void setUp() { public void setUp() {
ShadowPostTask.setTestImpl(new ShadowPostTask.TestImpl() {
@Override
public void postDelayedTask(TaskTraits taskTraits, Runnable task, long delay) {}
});
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
mNavigationController = env.createNavigationController(mTabController); mNavigationController = env.createNavigationController(mTabController);
mNavigationController.setFinishHandler(mFinishHandler); mNavigationController.setFinishHandler(mFinishHandler);
...@@ -139,4 +145,9 @@ public class CustomTabActivityNavigationControllerTest { ...@@ -139,4 +145,9 @@ public class CustomTabActivityNavigationControllerTest {
verify(mTabController, never()).detachAndStartReparenting(any(), any(), any()); verify(mTabController, never()).detachAndStartReparenting(any(), any(), any());
verify(env.activity).startActivity(any(), any()); verify(env.activity).startActivity(any(), any());
} }
@After
public void tearDown() {
ShadowPostTask.reset();
}
} }
// Copyright 2019 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.touchless.ui.progressbar;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.robolectric.annotation.Config;
import org.robolectric.shadows.ShadowLooper;
import org.chromium.base.task.test.ShadowPostTask;
import org.chromium.base.test.BaseRobolectricTestRunner;
import org.chromium.chrome.browser.ActivityTabProvider;
import org.chromium.chrome.browser.UrlConstants;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.browser.tab.TabObserver;
import org.chromium.chrome.browser.util.test.ShadowUrlUtilities;
import org.chromium.ui.modelutil.PropertyModel;
/**
* Unit tests for the {@link ProgressBarMediator} class.
*/
@RunWith(BaseRobolectricTestRunner.class)
@Config(manifest = Config.NONE, shadows = {ShadowUrlUtilities.class, ShadowPostTask.class})
public class ProgressBarMediatorTest {
private static final String SAMPLE_URL = "https://www.google.com/chrome";
private static final String SAMPLE_URL_SHORT = "google.com";
private PropertyModel mModel;
private ArgumentCaptor<TabObserver> mTabObserver;
private Tab mTab;
@Before
public void setUp() {
ShadowUrlUtilities.setTestImpl(new ShadowUrlUtilities.TestImpl() {
@Override
public String getDomainAndRegistry(String uri, boolean includePrivateRegistries) {
return SAMPLE_URL_SHORT;
}
});
}
private ProgressBarMediator initProgressBarMediator() {
mModel = spy(new PropertyModel.Builder(ProgressBarProperties.ALL_KEYS).build());
mTabObserver = ArgumentCaptor.forClass(TabObserver.class);
mTab = mock(Tab.class);
ActivityTabProvider activityTabProvider = spy(ActivityTabProvider.class);
when(activityTabProvider.get()).thenReturn(mTab);
ProgressBarMediator progressBarMediator =
new ProgressBarMediator(mModel, activityTabProvider);
verify(mTab).addObserver(mTabObserver.capture());
return progressBarMediator;
}
@Test
public void visibilityTest() {
ProgressBarMediator progressBarMediator = initProgressBarMediator();
Assert.assertEquals(mModel.get(ProgressBarProperties.IS_ENABLED), false);
Assert.assertEquals(mModel.get(ProgressBarProperties.IS_VISIBLE), false);
mTabObserver.getValue().onPageLoadStarted(mTab, SAMPLE_URL);
Assert.assertEquals(mModel.get(ProgressBarProperties.IS_ENABLED), true);
Assert.assertEquals(mModel.get(ProgressBarProperties.IS_VISIBLE), true);
// Mock page load finish, but not display timeout. The progress bar should still be visible.
mTabObserver.getValue().onPageLoadFinished(mTab, SAMPLE_URL);
Assert.assertEquals(mModel.get(ProgressBarProperties.IS_ENABLED), true);
Assert.assertEquals(mModel.get(ProgressBarProperties.IS_VISIBLE), true);
// Mock display timeout. The progress bar should not be visible at this point.
ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
Assert.assertEquals(mModel.get(ProgressBarProperties.IS_ENABLED), true);
Assert.assertEquals(mModel.get(ProgressBarProperties.IS_VISIBLE), false);
// The progress bar should be shown on activity resume.
progressBarMediator.onActivityResume();
Assert.assertEquals(mModel.get(ProgressBarProperties.IS_ENABLED), true);
Assert.assertEquals(mModel.get(ProgressBarProperties.IS_VISIBLE), true);
// And should disappear after the timeout.
ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
Assert.assertEquals(mModel.get(ProgressBarProperties.IS_ENABLED), true);
Assert.assertEquals(mModel.get(ProgressBarProperties.IS_VISIBLE), false);
// The progress bar should be disabled for native pages.
mTabObserver.getValue().onPageLoadStarted(mTab, UrlConstants.NTP_URL);
Assert.assertEquals(mModel.get(ProgressBarProperties.IS_ENABLED), false);
Assert.assertEquals(mModel.get(ProgressBarProperties.IS_VISIBLE), false);
// Mock key press before timeout and page load finish.
mTabObserver.getValue().onPageLoadStarted(mTab, SAMPLE_URL);
progressBarMediator.onKeyEvent();
Assert.assertEquals(mModel.get(ProgressBarProperties.IS_ENABLED), true);
Assert.assertEquals(mModel.get(ProgressBarProperties.IS_VISIBLE), true);
// Mock display timeout before page load finish, and after key press.
ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
Assert.assertEquals(mModel.get(ProgressBarProperties.IS_ENABLED), true);
Assert.assertEquals(mModel.get(ProgressBarProperties.IS_VISIBLE), false);
}
@Test
public void progressAndUrlTest() {
initProgressBarMediator();
Assert.assertNull(mModel.get(ProgressBarProperties.URL));
when(mTab.getUrl()).thenReturn(SAMPLE_URL);
mTabObserver.getValue().onLoadProgressChanged(mTab, 10);
Assert.assertEquals(mModel.get(ProgressBarProperties.PROGRESS_FRACTION), .1, .001);
Assert.assertEquals(mModel.get(ProgressBarProperties.URL), SAMPLE_URL_SHORT);
// Progress and URL should not be updated for native pages.
when(mTab.getUrl()).thenReturn(UrlConstants.NTP_URL);
mTabObserver.getValue().onLoadProgressChanged(mTab, 20);
Assert.assertEquals(mModel.get(ProgressBarProperties.PROGRESS_FRACTION), .1, .001);
Assert.assertEquals(mModel.get(ProgressBarProperties.URL), SAMPLE_URL_SHORT);
}
@After
public void tearDown() {
ShadowUrlUtilities.reset();
}
}
...@@ -75,6 +75,7 @@ touchless_test_java_sources = [ ...@@ -75,6 +75,7 @@ touchless_test_java_sources = [
touchless_junit_test_java_sources = [ touchless_junit_test_java_sources = [
"touchless/junit/src/org/chromium/chrome/browser/touchless/ScrollPositionInfoTest.java", "touchless/junit/src/org/chromium/chrome/browser/touchless/ScrollPositionInfoTest.java",
"touchless/junit/src/org/chromium/chrome/browser/touchless/TouchlessActionItemViewHolderTest.java", "touchless/junit/src/org/chromium/chrome/browser/touchless/TouchlessActionItemViewHolderTest.java",
"touchless/junit/src/org/chromium/chrome/browser/touchless/ui/progressbar/ProgressBarMediatorTest.java",
] ]
touchess_fallback_java_sources = [ touchess_fallback_java_sources = [
......
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