blob: ecda0a7d16000b763cd966b2ebb7aff0caced190 [file] [log] [blame]
// 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;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.Spy;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.robolectric.annotation.Config;
import org.chromium.blink.mojom.document_metadata.CopylessPaste;
import org.chromium.blink.mojom.document_metadata.WebPage;
import org.chromium.chrome.browser.historyreport.AppIndexingReporter;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.testing.local.LocalRobolectricTestRunner;
import org.chromium.url.mojom.Url;
/**
* Unit tests for {@link org.chromium.chrome.browser.AppIndexingUtil}.
*/
@RunWith(LocalRobolectricTestRunner.class)
@Config(manifest = Config.NONE)
public class AppIndexingUtilTest {
@Rule
public DisableHistogramsRule mDisableHistogramsRule = new DisableHistogramsRule();
@Spy
AppIndexingUtil mUtil = new AppIndexingUtil();
@Mock
private AppIndexingReporter mReporter;
@Mock
private CopylessPasteTestImpl mCopylessPaste;
@Mock
private Tab mTab;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
doReturn(mReporter).when(mUtil).getAppIndexingReporter();
doReturn(mCopylessPaste).when(mUtil).getCopylessPasteInterface(any(Tab.class));
doReturn(true).when(mUtil).isEnabledForDevice();
doReturn(false).when(mTab).isIncognito();
doReturn("http://www.test.com").when(mTab).getUrl();
doReturn("My neat website").when(mTab).getTitle();
doReturn(0L).when(mUtil).getElapsedTime();
doAnswer(new Answer<Void>() {
public Void answer(InvocationOnMock invocation) {
CopylessPaste.GetEntitiesResponse callback =
(CopylessPaste.GetEntitiesResponse) invocation.getArguments()[0];
WebPage webpage = new WebPage();
webpage.url = createUrl("http://www.test.com");
webpage.title = "My neat website";
callback.call(webpage);
return null;
}
})
.when(mCopylessPaste)
.getEntities(any(CopylessPaste.GetEntitiesResponse.class));
}
@Test
public void testNoCacheHit() {
mUtil.extractCopylessPasteMetadata(mTab);
verify(mCopylessPaste).getEntities(any(CopylessPaste.GetEntitiesResponse.class));
verify(mReporter).reportWebPage(any(WebPage.class));
}
@Test
public void testCacheHit() {
mUtil.extractCopylessPasteMetadata(mTab);
verify(mCopylessPaste).getEntities(any(CopylessPaste.GetEntitiesResponse.class));
verify(mReporter).reportWebPage(any(WebPage.class));
verify(mReporter, never()).reportWebPageView(any(String.class), any(String.class));
doReturn(1L).when(mUtil).getElapsedTime();
mUtil.extractCopylessPasteMetadata(mTab);
verify(mReporter).reportWebPageView(eq("http://www.test.com"), eq("My neat website"));
verifyNoMoreInteractions(mCopylessPaste);
verifyNoMoreInteractions(mReporter);
}
@Test
public void testCacheHit_expired() {
mUtil.extractCopylessPasteMetadata(mTab);
doReturn(60 * 60 * 1000L + 1).when(mUtil).getElapsedTime();
mUtil.extractCopylessPasteMetadata(mTab);
verify(mCopylessPaste, times(2)).getEntities(any(CopylessPaste.GetEntitiesResponse.class));
}
@Test
public void testCacheHit_noEntity() {
doAnswer(new Answer<Void>() {
public Void answer(InvocationOnMock invocation) {
CopylessPaste.GetEntitiesResponse callback =
(CopylessPaste.GetEntitiesResponse) invocation.getArguments()[0];
callback.call(null);
return null;
}
})
.when(mCopylessPaste)
.getEntities(any(CopylessPaste.GetEntitiesResponse.class));
mUtil.extractCopylessPasteMetadata(mTab);
doReturn(1L).when(mUtil).getElapsedTime();
mUtil.extractCopylessPasteMetadata(mTab);
verify(mCopylessPaste, times(1)).getEntities(any(CopylessPaste.GetEntitiesResponse.class));
verifyNoMoreInteractions(mReporter);
}
private Url createUrl(String s) {
Url url = new Url();
url.url = s;
return url;
}
abstract static class CopylessPasteTestImpl implements CopylessPaste {}
}