| Index: chrome/android/javatests/src/org/chromium/chrome/browser/ntp/snippets/ArticleSnippetsTest.java
|
| diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/snippets/ArticleSnippetsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/snippets/ArticleSnippetsTest.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..78a216fd6b33a0511daf4dd39c7f9c9cc0e29133
|
| --- /dev/null
|
| +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/snippets/ArticleSnippetsTest.java
|
| @@ -0,0 +1,298 @@
|
| +// Copyright 2016 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.ntp.snippets;
|
| +
|
| +import android.graphics.Bitmap;
|
| +import android.graphics.BitmapFactory;
|
| +import android.view.ContextMenu;
|
| +import android.view.MenuItem.OnMenuItemClickListener;
|
| +import android.view.View;
|
| +import android.widget.FrameLayout;
|
| +
|
| +import org.chromium.base.Callback;
|
| +import org.chromium.base.ThreadUtils;
|
| +import org.chromium.base.test.util.Feature;
|
| +import org.chromium.base.test.util.RenderTest;
|
| +import org.chromium.chrome.R;
|
| +import org.chromium.chrome.browser.ChromeActivity;
|
| +import org.chromium.chrome.browser.favicon.FaviconHelper.FaviconImageCallback;
|
| +import org.chromium.chrome.browser.favicon.FaviconHelper.IconAvailabilityCallback;
|
| +import org.chromium.chrome.browser.favicon.LargeIconBridge.LargeIconCallback;
|
| +import org.chromium.chrome.browser.ntp.LogoBridge.LogoObserver;
|
| +import org.chromium.chrome.browser.ntp.MostVisitedItem;
|
| +import org.chromium.chrome.browser.ntp.NewTabPageView.NewTabPageManager;
|
| +import org.chromium.chrome.browser.ntp.cards.NewTabPageAdapter;
|
| +import org.chromium.chrome.browser.ntp.cards.NewTabPageListItem;
|
| +import org.chromium.chrome.browser.ntp.cards.NewTabPageRecyclerView;
|
| +import org.chromium.chrome.browser.profiles.MostVisitedSites.MostVisitedURLsObserver;
|
| +import org.chromium.chrome.test.ChromeActivityTestCaseBase;
|
| +import org.chromium.chrome.test.util.RenderUtils.ViewRenderer;
|
| +
|
| +import java.io.IOException;
|
| +import java.util.Arrays;
|
| +import java.util.List;
|
| +import java.util.Set;
|
| +
|
| +/**
|
| + * Tests for the appearance of Article Snippets.
|
| + */
|
| +public class ArticleSnippetsTest extends ChromeActivityTestCaseBase<ChromeActivity> {
|
| + private ViewRenderer mViewRenderer;
|
| +
|
| + private NewTabPageManager mNtpManager;
|
| + private MockSnippetsSource mSnippetsSource;
|
| + private NewTabPageRecyclerView mRecyclerView;
|
| + private NewTabPageAdapter mAdapter;
|
| +
|
| + public ArticleSnippetsTest() {
|
| + super(ChromeActivity.class);
|
| + }
|
| +
|
| + @RenderTest()
|
| + @Feature({"ArticleSnippets"})
|
| + public void testSnippetAppearance() throws IOException, InterruptedException {
|
| + ThreadUtils.runOnUiThreadBlocking(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + FrameLayout layout = new FrameLayout(getActivity());
|
| + getActivity().setContentView(layout);
|
| +
|
| + mRecyclerView = (NewTabPageRecyclerView) getActivity().getLayoutInflater()
|
| + .inflate(R.layout.new_tab_page_recycler_view, layout, false);
|
| + layout.addView(mRecyclerView);
|
| +
|
| + View aboveTheFold = new View(getActivity());
|
| +
|
| + mRecyclerView.setAboveTheFoldView(aboveTheFold);
|
| + mAdapter = new NewTabPageAdapter(mNtpManager, aboveTheFold, mSnippetsSource);
|
| + mRecyclerView.setAdapter(mAdapter);
|
| + mSnippetsSource.provideSnippets(genTestData());
|
| + }
|
| + });
|
| +
|
| + getInstrumentation().waitForIdleSync();
|
| +
|
| + int firstSnippet = 0;
|
| + for (; firstSnippet < mAdapter.getItemCount(); firstSnippet++) {
|
| + if (mAdapter.getItemViewType(firstSnippet) == NewTabPageListItem.VIEW_TYPE_SNIPPET)
|
| + break;
|
| + }
|
| +
|
| + mViewRenderer.save(mRecyclerView.getChildAt(firstSnippet), "short_snippet");
|
| + mViewRenderer.save(mRecyclerView.getChildAt(firstSnippet + 1), "long_snippet");
|
| + mViewRenderer.save(mRecyclerView, "snippets");
|
| + }
|
| +
|
| + private List<SnippetArticle> genTestData() {
|
| + SnippetArticle shortSnippet = new SnippetArticle(
|
| + "id1",
|
| + "Title",
|
| + "Publisher",
|
| + "Preview Text",
|
| + "www.google.com",
|
| + "", // Amp Url
|
| + "", // Thumbnail Url
|
| + 1466614774, // Timestamp
|
| + 10f, // Score
|
| + 0); // Position
|
| +
|
| + shortSnippet.setThumbnailBitmap(BitmapFactory.decodeResource(getActivity().getResources(),
|
| + R.drawable.signin_promo_illustration));
|
| + SnippetArticle longSnippet = new SnippetArticle(
|
| + "id2",
|
| + new String(new char[20]).replace("\0", "Title "),
|
| + new String(new char[20]).replace("\0", "Publisher "),
|
| + new String(new char[80]).replace("\0", "Preview Text "),
|
| + "www.google.com",
|
| + "", // Amp Url
|
| + "", // Thumbnail Url
|
| + 1466614074, // Timestamp
|
| + 20f, // Score
|
| + 1); // Position
|
| +
|
| + return Arrays.asList(shortSnippet, longSnippet);
|
| + }
|
| +
|
| + @Override
|
| + public void startMainActivity() throws InterruptedException {
|
| + startMainActivityOnBlankPage();
|
| + mViewRenderer = new ViewRenderer(getActivity(), this.getClass().getSimpleName());
|
| + }
|
| +
|
| + @Override
|
| + protected void setUp() throws Exception {
|
| + super.setUp();
|
| + mNtpManager = new MockNewTabPageManager();
|
| + mSnippetsSource = new MockSnippetsSource();
|
| + }
|
| +
|
| + /**
|
| + * A SnippetSource we can feed our own data into. Only the operations exercised in the test
|
| + * path have been implemented.
|
| + */
|
| + private class MockSnippetsSource implements SnippetsSource {
|
| + SnippetsObserver mObserver;
|
| +
|
| + @Override
|
| + public void setObserver(SnippetsObserver observer) {
|
| + mObserver = observer;
|
| + }
|
| +
|
| + public void provideSnippets(List<SnippetArticle> snippets) {
|
| + mObserver.onSnippetsReceived(snippets);
|
| + }
|
| +
|
| + @Override
|
| + public int getDisabledReason() {
|
| + return DisabledReason.NONE;
|
| + }
|
| +
|
| + @Override
|
| + public void fetchSnippetImage(SnippetArticle snippet, Callback<Bitmap> callback) {
|
| + // We provide the snippet image when we create the image, so we don't need to
|
| + // implement anything here.
|
| + // TODO(peconn): Ensure fetchSnippetImage is not called when the Snippet already has
|
| + // an image.
|
| + }
|
| +
|
| + @Override
|
| + public void discardSnippet(SnippetArticle snippet) {
|
| + throw new UnsupportedOperationException();
|
| + }
|
| +
|
| + @Override
|
| + public void getSnippedVisited(SnippetArticle snippet, Callback<Boolean> callback) {
|
| + throw new UnsupportedOperationException();
|
| + }
|
| + }
|
| +
|
| + /**
|
| + * A NewTabPageManager to initialize our Adapter. It is required, but currently none of its
|
| + * methods are actually used.
|
| + */
|
| + private class MockNewTabPageManager implements NewTabPageManager {
|
| + @Override
|
| + public void getLocalFaviconImageForURL(
|
| + final String url, int size, final FaviconImageCallback faviconCallback) {
|
| + // Run the callback asynchronously incase the caller made that assumption.
|
| + ThreadUtils.postOnUiThread(new Runnable(){
|
| + @Override
|
| + public void run() {
|
| + // Return an arbitrary drawable.
|
| + faviconCallback.onFaviconAvailable(
|
| + BitmapFactory.decodeResource(getActivity().getResources(),
|
| + R.drawable.star_green),
|
| + url);
|
| + }
|
| + });
|
| + }
|
| +
|
| + @Override
|
| + public boolean isInterestsEnabled() {
|
| + throw new UnsupportedOperationException();
|
| + }
|
| +
|
| + @Override
|
| + public void openMostVisitedItem(MostVisitedItem item) {
|
| + throw new UnsupportedOperationException();
|
| + }
|
| +
|
| + @Override
|
| + public void onCreateContextMenu(ContextMenu menu, OnMenuItemClickListener listener) {
|
| + throw new UnsupportedOperationException();
|
| + }
|
| +
|
| + @Override
|
| + public boolean onMenuItemClick(int menuId, MostVisitedItem item) {
|
| + throw new UnsupportedOperationException();
|
| + }
|
| +
|
| + @Override
|
| + public boolean isLocationBarShownInNTP() {
|
| + throw new UnsupportedOperationException();
|
| + }
|
| +
|
| + @Override
|
| + public boolean isVoiceSearchEnabled() {
|
| + throw new UnsupportedOperationException();
|
| + }
|
| +
|
| + @Override
|
| + public boolean isToolbarEnabled() {
|
| + throw new UnsupportedOperationException();
|
| + }
|
| +
|
| + @Override
|
| + public boolean isFakeOmniboxTextEnabledTablet() {
|
| + throw new UnsupportedOperationException();
|
| + }
|
| +
|
| + @Override
|
| + public void navigateToBookmarks() {
|
| + throw new UnsupportedOperationException();
|
| + }
|
| +
|
| + @Override
|
| + public void navigateToRecentTabs() {
|
| + throw new UnsupportedOperationException();
|
| + }
|
| +
|
| + @Override
|
| + public void openSnippet(String url) {
|
| + throw new UnsupportedOperationException();
|
| + }
|
| +
|
| + @Override
|
| + public void navigateToInterests() {
|
| + throw new UnsupportedOperationException();
|
| + }
|
| +
|
| + @Override
|
| + public void focusSearchBox(boolean beginVoiceSearch, String pastedText) {
|
| + throw new UnsupportedOperationException();
|
| + }
|
| +
|
| + @Override
|
| + public void setMostVisitedURLsObserver(MostVisitedURLsObserver observer, int numResults) {
|
| + throw new UnsupportedOperationException();
|
| + }
|
| +
|
| + @Override
|
| + public void getLargeIconForUrl(String url, int size, LargeIconCallback callback) {
|
| + throw new UnsupportedOperationException();
|
| + }
|
| +
|
| + @Override
|
| + public void ensureIconIsAvailable(String pageUrl, String iconUrl, boolean isLargeIcon,
|
| + boolean isTemporary, IconAvailabilityCallback callback) {
|
| + throw new UnsupportedOperationException();
|
| + }
|
| +
|
| + @Override
|
| + public void getUrlsAvailableOffline(Set<String> pageUrls, Callback<Set<String>> callback) {
|
| + throw new UnsupportedOperationException();
|
| + }
|
| +
|
| + @Override
|
| + public void onLogoClicked(boolean isAnimatedLogoShowing) {
|
| + throw new UnsupportedOperationException();
|
| + }
|
| +
|
| + @Override
|
| + public void getSearchProviderLogo(LogoObserver logoObserver) {
|
| + throw new UnsupportedOperationException();
|
| + }
|
| +
|
| + @Override
|
| + public void onLoadingComplete(MostVisitedItem[] mostVisitedItems) {
|
| + throw new UnsupportedOperationException();
|
| + }
|
| +
|
| + @Override
|
| + public void openUrl(String url) {
|
| + throw new UnsupportedOperationException();
|
| + }
|
| + }
|
| +}
|
|
|