blob: 5a579666736eefe45b03c01329f0563e383e38fe [file] [log] [blame]
// 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.tasks.tab_management.suggestions;
import static org.mockito.Mockito.CALLS_REAL_METHODS;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestRule;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.annotation.Config;
import org.chromium.base.test.util.Feature;
import org.chromium.chrome.test.util.browser.Features;
import org.chromium.testing.local.LocalRobolectricTestRunner;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
* Tests the provider which identifies Tabs which have not been used in a long time
*/
@SuppressWarnings("ResultOfMethodCallIgnored")
@RunWith(LocalRobolectricTestRunner.class)
@Config(manifest = Config.NONE)
public class StaleTabSuggestionProviderTest {
// Hard code current time in milliseconds to ensure stable test
private static final long CURRENT_TIME_MILLIS = 1573866756832L;
@Rule
public TestRule mProcessor = new Features.JUnitProcessor();
@Mock
TabContext mTabContext;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}
private TabContext.TabInfo getMockTab(int id, String title, String url, String originalUrl,
String referrer, long timestamp, double siteEngagementScore) {
TabContext.TabInfo tabInfo =
spy(new TabContext.TabInfo(id, title, url, originalUrl, referrer, timestamp, ""));
doReturn(siteEngagementScore).when(tabInfo).getSiteEngagementScore();
return tabInfo;
}
@Test
@Feature({"AdvancedStaleTabSuggestionProviderMeanVariance"})
public void testTimeLastUsedFeatureMeanVariance() {
StaleTabSuggestionProvider staleTabSuggestionProvider =
mock(StaleTabSuggestionProvider.class, CALLS_REAL_METHODS);
when(staleTabSuggestionProvider.isLastTimeUsedFeatureEnabled()).thenReturn(true);
when(staleTabSuggestionProvider.getLastTimeUsedFeatureThreshold()).thenReturn(0.0);
when(staleTabSuggestionProvider.isSiteEngagementFeatureEnabled()).thenReturn(false);
when(staleTabSuggestionProvider.getMinNumTabs()).thenReturn(3);
when(staleTabSuggestionProvider.getTimeTransformString()).thenReturn("MEAN_VARIANCE");
List<TabContext.TabInfo> tabInfos = new ArrayList<>();
tabInfos.add(getMockTab(1, "mock_recent_title_1", "mock_recent_url_1",
"mock_recent_original_url_1", "mock_recent_referrer_1",
CURRENT_TIME_MILLIS - TimeUnit.MINUTES.toMillis(5), 1.0));
tabInfos.add(getMockTab(2, "mock_recent_title_2", "mock_recent_url_2",
"mock_recent_original_url_2", "mock_recent_referrer_2",
CURRENT_TIME_MILLIS - TimeUnit.MINUTES.toMillis(20), 1.0));
tabInfos.add(getMockTab(3, "mock_recent_title_3", "mock_recent_url_3",
"mock_recent_original_url_3", "mock_recent_referrer_3",
CURRENT_TIME_MILLIS - TimeUnit.MINUTES.toMillis(36), 1.0));
tabInfos.add(getMockTab(4, "mock_stale_title", "mock_stale_url_1",
"mock_stale_original_url", "mock_stale_referrer_url",
CURRENT_TIME_MILLIS - TimeUnit.DAYS.toMillis(4), 1.0));
doReturn(tabInfos).when(mTabContext).getUngroupedTabs();
List<TabSuggestion> staleSuggestions = staleTabSuggestionProvider.suggest(mTabContext);
Assert.assertEquals(1, staleSuggestions.size());
TabSuggestion staleSuggestion = staleSuggestions.get(0);
Assert.assertEquals("mock_stale_title", staleSuggestion.getTabsInfo().get(0).title);
Assert.assertEquals(TabSuggestion.TabSuggestionAction.CLOSE, staleSuggestion.getAction());
Assert.assertEquals(TabSuggestionsRanker.SuggestionProviders.STALE_TABS_SUGGESTION_PROVIDER,
staleSuggestion.getProviderName());
}
@Test
@Feature({"AdvancedStaleTabSuggestionProvider"})
public void testTimeLastUsedFeatureDayNormalization() {
StaleTabSuggestionProvider staleTabSuggestionProvider =
mock(StaleTabSuggestionProvider.class, CALLS_REAL_METHODS);
when(staleTabSuggestionProvider.isLastTimeUsedFeatureEnabled()).thenReturn(true);
when(staleTabSuggestionProvider.getLastTimeUsedFeatureThreshold()).thenReturn(3.0);
when(staleTabSuggestionProvider.isSiteEngagementFeatureEnabled()).thenReturn(false);
when(staleTabSuggestionProvider.getMinNumTabs()).thenReturn(3);
when(staleTabSuggestionProvider.getTimeTransformString()).thenReturn("DAY_NORMALIZATION");
List<TabContext.TabInfo> tabInfos = new ArrayList<>();
tabInfos.add(getMockTab(1, "mock_recent_title_1", "mock_recent_url_1",
"mock_recent_original_url_1", "mock_recent_referrer_1",
System.currentTimeMillis() - TimeUnit.MINUTES.toMillis(5), 1.0));
tabInfos.add(getMockTab(2, "mock_recent_title_2", "mock_recent_url_2",
"mock_recent_original_url_2", "mock_recent_referrer_2",
System.currentTimeMillis() - TimeUnit.MINUTES.toMillis(20), 1.0));
tabInfos.add(getMockTab(3, "mock_recent_title_3", "mock_recent_url_3",
"mock_recent_original_url_3", "mock_recent_referrer_3",
System.currentTimeMillis() - TimeUnit.MINUTES.toMillis(36), 1.0));
tabInfos.add(getMockTab(4, "mock_stale_title", "mock_stale_url_1",
"mock_stale_original_url", "mock_stale_referrer_url",
System.currentTimeMillis() - TimeUnit.DAYS.toMillis(4), 1.0));
doReturn(tabInfos).when(mTabContext).getUngroupedTabs();
List<TabSuggestion> staleSuggestions = staleTabSuggestionProvider.suggest(mTabContext);
Assert.assertEquals(1, staleSuggestions.size());
TabSuggestion staleSuggestion = staleSuggestions.get(0);
Assert.assertEquals("mock_stale_title", staleSuggestion.getTabsInfo().get(0).title);
Assert.assertEquals(TabSuggestion.TabSuggestionAction.CLOSE, staleSuggestion.getAction());
Assert.assertEquals(TabSuggestionsRanker.SuggestionProviders.STALE_TABS_SUGGESTION_PROVIDER,
staleSuggestion.getProviderName());
}
@Test
@Feature({"AdvancedStaleTabSuggestionProvider"})
public void testSiteEngagementFeature() {
StaleTabSuggestionProvider staleTabSuggestionProvider =
mock(StaleTabSuggestionProvider.class, CALLS_REAL_METHODS);
when(staleTabSuggestionProvider.isLastTimeUsedFeatureEnabled()).thenReturn(false);
when(staleTabSuggestionProvider.isSiteEngagementFeatureEnabled()).thenReturn(true);
when(staleTabSuggestionProvider.getSiteEngagementFeaturesThreshold()).thenReturn(2.0);
when(staleTabSuggestionProvider.getMinNumTabs()).thenReturn(3);
List<TabContext.TabInfo> tabInfos = new ArrayList<>();
tabInfos.add(getMockTab(1, "mock_very_engaged_title_1", "mock_very_engaged_url_1",
"mock_very_engaged_url_1", "mock_very_engaged_referrer_1",
CURRENT_TIME_MILLIS - TimeUnit.MINUTES.toMillis(5), 20.0));
tabInfos.add(getMockTab(2, "mock_very_engaged_title_2", "mock_very_engaged_url_2",
"mock_very_engaged_url_2", "mock_very_engaged_referrer_2",
CURRENT_TIME_MILLIS - TimeUnit.MINUTES.toMillis(5), 25.0));
tabInfos.add(getMockTab(3, "mock_medium_engaged_title", "mock_medium_engaged_url",
"mock_very_medium_url", "mock_very_engaged_referrer",
CURRENT_TIME_MILLIS - TimeUnit.MINUTES.toMillis(5), 10.0));
tabInfos.add(getMockTab(4, "mock_low_engaged_title", "mock_low_engaged_url",
"mock_low_medium_url", "mock_low_engaged_referrer",
CURRENT_TIME_MILLIS - TimeUnit.MINUTES.toMillis(5), 1.0));
doReturn(tabInfos).when(mTabContext).getUngroupedTabs();
List<TabSuggestion> staleSuggestions = staleTabSuggestionProvider.suggest(mTabContext);
Assert.assertEquals(1, staleSuggestions.size());
TabSuggestion staleSuggestion = staleSuggestions.get(0);
Assert.assertEquals("mock_low_engaged_title", staleSuggestion.getTabsInfo().get(0).title);
Assert.assertEquals(TabSuggestion.TabSuggestionAction.CLOSE, staleSuggestion.getAction());
Assert.assertEquals(TabSuggestionsRanker.SuggestionProviders.STALE_TABS_SUGGESTION_PROVIDER,
staleSuggestion.getProviderName());
}
@Test
@Feature({"AdvancedStaleTabSuggestionProvider"})
public void testTimeLastUsedFeatureAndSiteEngagement() {
StaleTabSuggestionProvider staleTabSuggestionProvider =
mock(StaleTabSuggestionProvider.class, CALLS_REAL_METHODS);
when(staleTabSuggestionProvider.isLastTimeUsedFeatureEnabled()).thenReturn(true);
when(staleTabSuggestionProvider.getLastTimeUsedFeatureThreshold()).thenReturn(0.0);
when(staleTabSuggestionProvider.isSiteEngagementFeatureEnabled()).thenReturn(true);
when(staleTabSuggestionProvider.getSiteEngagementFeaturesThreshold()).thenReturn(2.0);
when(staleTabSuggestionProvider.getMinNumTabs()).thenReturn(3);
when(staleTabSuggestionProvider.getTimeTransformString()).thenReturn("MEAN_VARIANCE");
List<TabContext.TabInfo> tabInfos = new ArrayList<>();
tabInfos.add(getMockTab(1, "mock_recent_title_1", "mock_recent_url_1",
"mock_recent_original_url_1", "mock_recent_referrer_1",
CURRENT_TIME_MILLIS - TimeUnit.MINUTES.toMillis(5), 1.0));
tabInfos.add(getMockTab(2, "mock_recent_title_2", "mock_recent_url_2",
"mock_recent_original_url_2", "mock_recent_referrer_2",
CURRENT_TIME_MILLIS - TimeUnit.MINUTES.toMillis(20), 1.0));
tabInfos.add(getMockTab(3, "mock_recent_title_3", "mock_recent_url_3",
"mock_recent_original_url_3", "mock_recent_referrer_3",
CURRENT_TIME_MILLIS - TimeUnit.MINUTES.toMillis(36), 1.0));
tabInfos.add(getMockTab(4, "mock_stale_title", "mock_stale_url", "mock_stale_original_url",
"mock_stale_referrer_url", CURRENT_TIME_MILLIS - TimeUnit.DAYS.toMillis(4), 1.0));
tabInfos.add(getMockTab(5, "mock_stale_title_highly_engaged",
"mock_stale_url_highly_engaged", "mock_stale_original_url_highly_engaged",
"mock_stale_referrer_url_highly_engaged",
CURRENT_TIME_MILLIS - TimeUnit.DAYS.toMillis(4), 20.0));
doReturn(tabInfos).when(mTabContext).getUngroupedTabs();
List<TabSuggestion> staleSuggestions = staleTabSuggestionProvider.suggest(mTabContext);
Assert.assertEquals(1, staleSuggestions.size());
TabSuggestion staleSuggestion = staleSuggestions.get(0);
Assert.assertEquals("mock_stale_title", staleSuggestion.getTabsInfo().get(0).title);
Assert.assertEquals(TabSuggestion.TabSuggestionAction.CLOSE, staleSuggestion.getAction());
Assert.assertEquals(TabSuggestionsRanker.SuggestionProviders.STALE_TABS_SUGGESTION_PROVIDER,
staleSuggestion.getProviderName());
}
@Test
@Feature({"AdvancedStaleTabSuggestionProvider"})
public void testNoFeaturesActive() {
StaleTabSuggestionProvider staleTabSuggestionProvider =
mock(StaleTabSuggestionProvider.class, CALLS_REAL_METHODS);
when(staleTabSuggestionProvider.isLastTimeUsedFeatureEnabled()).thenReturn(false);
when(staleTabSuggestionProvider.isSiteEngagementFeatureEnabled()).thenReturn(false);
when(staleTabSuggestionProvider.getMinNumTabs()).thenReturn(1);
List<TabContext.TabInfo> tabInfos = new ArrayList<>();
tabInfos.add(getMockTab(1, "mock_title", "mock_url", "mock_original_url",
"mock_recent_referrer", CURRENT_TIME_MILLIS - TimeUnit.MINUTES.toMillis(5), 1.0));
doReturn(tabInfos).when(mTabContext).getUngroupedTabs();
List<TabSuggestion> staleSuggestions = staleTabSuggestionProvider.suggest(mTabContext);
Assert.assertNull(staleSuggestions);
}
@Test
@Feature({"AdvancedStaleTabSuggestionProvider"})
public void testNotEnoughTabs() {
StaleTabSuggestionProvider staleTabSuggestionProvider =
mock(StaleTabSuggestionProvider.class, CALLS_REAL_METHODS);
when(staleTabSuggestionProvider.isLastTimeUsedFeatureEnabled()).thenReturn(false);
when(staleTabSuggestionProvider.isSiteEngagementFeatureEnabled()).thenReturn(false);
when(staleTabSuggestionProvider.getMinNumTabs()).thenReturn(3);
List<TabContext.TabInfo> tabInfos = new ArrayList<>();
tabInfos.add(getMockTab(1, "mock_title", "mock_url", "mock_original_url",
"mock_recent_referrer_1", CURRENT_TIME_MILLIS - TimeUnit.MINUTES.toMillis(5), 1.0));
doReturn(tabInfos).when(mTabContext).getUngroupedTabs();
List<TabSuggestion> staleSuggestions = staleTabSuggestionProvider.suggest(mTabContext);
Assert.assertNull(staleSuggestions);
}
}