Commit f1bc438e authored by Becky Zhou's avatar Becky Zhou Committed by Commit Bot

[NTP OptOut] Add instrumentation tests and render tests

+ test header state on multiple tabs
+ test header state with other sections
+ parameterized context menu actions
+ render test on toggling header

Bug: 824900
Change-Id: Id82742a8d27e263bf0db9563473f9a320ed33875
Reviewed-on: https://chromium-review.googlesource.com/984377
Commit-Queue: Becky Zhou <huayinz@chromium.org>
Reviewed-by: default avatarBernhard Bauer <bauerb@chromium.org>
Reviewed-by: default avatarTheresa <twellington@chromium.org>
Cr-Commit-Position: refs/heads/master@{#548148}
parent 52d81474
...@@ -407,7 +407,7 @@ public class NewTabPageAdapter extends Adapter<NewTabPageViewHolder> implements ...@@ -407,7 +407,7 @@ public class NewTabPageAdapter extends Adapter<NewTabPageViewHolder> implements
return RecyclerView.NO_POSITION; return RecyclerView.NO_POSITION;
} }
SectionList getSectionListForTesting() { public SectionList getSectionListForTesting() {
return mSections; return mSections;
} }
......
...@@ -673,7 +673,7 @@ public class SuggestionsSection extends InnerNode { ...@@ -673,7 +673,7 @@ public class SuggestionsSection extends InnerNode {
return mMoreButton; return mMoreButton;
} }
SectionHeader getHeaderItemForTesting() { public SectionHeader getHeaderItemForTesting() {
return mHeader; return mHeader;
} }
......
...@@ -4,11 +4,16 @@ ...@@ -4,11 +4,16 @@
package org.chromium.chrome.browser.ntp; package org.chromium.chrome.browser.ntp;
import static android.support.test.espresso.Espresso.onView;
import static android.support.test.espresso.action.ViewActions.click;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.support.test.InstrumentationRegistry; import android.support.test.InstrumentationRegistry;
import android.support.test.filters.LargeTest; import android.support.test.filters.LargeTest;
import android.support.test.filters.MediumTest; import android.support.test.filters.MediumTest;
import android.support.test.filters.SmallTest; import android.support.test.filters.SmallTest;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils; import android.text.TextUtils;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.View; import android.view.View;
...@@ -38,10 +43,16 @@ import org.chromium.chrome.R; ...@@ -38,10 +43,16 @@ import org.chromium.chrome.R;
import org.chromium.chrome.browser.ChromeFeatureList; import org.chromium.chrome.browser.ChromeFeatureList;
import org.chromium.chrome.browser.ChromeSwitches; import org.chromium.chrome.browser.ChromeSwitches;
import org.chromium.chrome.browser.UrlConstants; import org.chromium.chrome.browser.UrlConstants;
import org.chromium.chrome.browser.ntp.cards.NewTabPageAdapter;
import org.chromium.chrome.browser.ntp.cards.NewTabPageRecyclerView; import org.chromium.chrome.browser.ntp.cards.NewTabPageRecyclerView;
import org.chromium.chrome.browser.ntp.cards.SuggestionsSection;
import org.chromium.chrome.browser.ntp.snippets.KnownCategories;
import org.chromium.chrome.browser.ntp.snippets.SectionHeader;
import org.chromium.chrome.browser.omnibox.LocationBarLayout; import org.chromium.chrome.browser.omnibox.LocationBarLayout;
import org.chromium.chrome.browser.omnibox.UrlBar; import org.chromium.chrome.browser.omnibox.UrlBar;
import org.chromium.chrome.browser.preferences.ChromePreferenceManager; import org.chromium.chrome.browser.preferences.ChromePreferenceManager;
import org.chromium.chrome.browser.preferences.Pref;
import org.chromium.chrome.browser.preferences.PrefServiceBridge;
import org.chromium.chrome.browser.suggestions.SiteSuggestion; import org.chromium.chrome.browser.suggestions.SiteSuggestion;
import org.chromium.chrome.browser.suggestions.TileSectionType; import org.chromium.chrome.browser.suggestions.TileSectionType;
import org.chromium.chrome.browser.suggestions.TileSource; import org.chromium.chrome.browser.suggestions.TileSource;
...@@ -60,6 +71,7 @@ import org.chromium.chrome.test.util.RenderTestRule; ...@@ -60,6 +71,7 @@ import org.chromium.chrome.test.util.RenderTestRule;
import org.chromium.chrome.test.util.browser.ChromeModernDesign; import org.chromium.chrome.test.util.browser.ChromeModernDesign;
import org.chromium.chrome.test.util.browser.Features; import org.chromium.chrome.test.util.browser.Features;
import org.chromium.chrome.test.util.browser.Features.DisableFeatures; import org.chromium.chrome.test.util.browser.Features.DisableFeatures;
import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
import org.chromium.chrome.test.util.browser.RecyclerViewTestUtils; import org.chromium.chrome.test.util.browser.RecyclerViewTestUtils;
import org.chromium.chrome.test.util.browser.suggestions.FakeMostVisitedSites; import org.chromium.chrome.test.util.browser.suggestions.FakeMostVisitedSites;
import org.chromium.chrome.test.util.browser.suggestions.SuggestionsDependenciesRule; import org.chromium.chrome.test.util.browser.suggestions.SuggestionsDependenciesRule;
...@@ -569,6 +581,67 @@ public class NewTabPageTest { ...@@ -569,6 +581,67 @@ public class NewTabPageTest {
mNtp.getManagerForTesting().getSuggestionsSource().areRemoteSuggestionsEnabled()); mNtp.getManagerForTesting().getSuggestionsSource().areRemoteSuggestionsEnabled());
} }
@Test
@SmallTest
@Feature({"NewTabPage"})
@EnableFeatures(ChromeFeatureList.NTP_ARTICLE_SUGGESTIONS_EXPANDABLE_HEADER)
public void testArticleExpandableHeaderOnMultipleTabs() throws Exception {
// Open a new tab.
SuggestionsSection firstSection = getArticleSectionOnNewTab();
SectionHeader firstHeader = firstSection.getHeaderItemForTesting();
int firstTabId = mActivityTestRule.getActivity().getActivityTab().getId();
// Check header is expanded.
Assert.assertTrue(firstHeader.isExpandable() && firstHeader.isExpanded());
Assert.assertTrue(firstSection.getItemCount() > 1);
Assert.assertTrue(getPreferenceForExpandableHeader());
// Toggle header on the current tab.
onView(withId(R.id.header_title)).perform(click());
// Check header is collapsed.
Assert.assertTrue(firstHeader.isExpandable() && !firstHeader.isExpanded());
Assert.assertEquals(1, firstSection.getItemCount());
Assert.assertFalse(getPreferenceForExpandableHeader());
// Open a second new tab.
SuggestionsSection secondSection = getArticleSectionOnNewTab();
SectionHeader secondHeader = secondSection.getHeaderItemForTesting();
// Check header on the second tab is collapsed.
Assert.assertTrue(secondHeader.isExpandable() && !secondHeader.isExpanded());
Assert.assertEquals(1, secondSection.getItemCount());
Assert.assertFalse(getPreferenceForExpandableHeader());
// Toggle header on the second tab.
onView(withId(R.id.header_title)).perform(click());
// Check header on the second tab is expanded.
Assert.assertTrue(secondHeader.isExpandable() && secondHeader.isExpanded());
Assert.assertTrue(secondSection.getItemCount() > 1);
Assert.assertTrue(getPreferenceForExpandableHeader());
// Go back to the first tab and check header is expanded.
ChromeTabUtils.switchTabInCurrentTabModel(mActivityTestRule.getActivity(), firstTabId);
Assert.assertTrue(firstHeader.isExpandable() && firstHeader.isExpanded());
Assert.assertTrue(firstSection.getItemCount() > 1);
Assert.assertTrue(getPreferenceForExpandableHeader());
}
@Test
@SmallTest
@Feature({"NewTabPage", "RenderTest"})
@EnableFeatures(ChromeFeatureList.NTP_ARTICLE_SUGGESTIONS_EXPANDABLE_HEADER)
public void testArticleExpandableHeaderAppearance() throws Exception {
NewTabPage ntp =
(NewTabPage) mActivityTestRule.getActivity().getActivityTab().getNativePage();
RecyclerView recyclerView = ntp.getNewTabPageView().getRecyclerView();
NewTabPageAdapter adapter = (NewTabPageAdapter) recyclerView.getAdapter();
View view = recyclerView.findViewHolderForAdapterPosition(
adapter.getFirstHeaderPosition()).itemView;
// Check header is expanded.
mRenderTestRule.render(view, "expandable_header_expanded");
// Toggle header on the current tab.
onView(withId(R.id.header_title)).perform(click());
// Check header is collapsed.
mRenderTestRule.render(view, "expandable_header_collapsed");
}
private void assertThumbnailInvalidAndRecapture() { private void assertThumbnailInvalidAndRecapture() {
Assert.assertTrue(mNtp.shouldCaptureThumbnail()); Assert.assertTrue(mNtp.shouldCaptureThumbnail());
captureThumbnail(); captureThumbnail();
...@@ -695,4 +768,17 @@ public class NewTabPageTest { ...@@ -695,4 +768,17 @@ public class NewTabPageTest {
mActivityTestRule.getActivity().getTabModelSelector().isIncognitoSelected()); mActivityTestRule.getActivity().getTabModelSelector().isIncognitoSelected());
} }
} }
private SuggestionsSection getArticleSectionOnNewTab() throws Exception {
Tab tab = mActivityTestRule.loadUrlInNewTab(UrlConstants.NTP_URL);
NewTabPage ntp = (NewTabPage) tab.getNativePage();
NewTabPageAdapter adapter =
(NewTabPageAdapter) ntp.getNewTabPageView().getRecyclerView().getAdapter();
return adapter.getSectionListForTesting().getSection(KnownCategories.ARTICLES);
}
private boolean getPreferenceForExpandableHeader() throws Exception {
return ThreadUtils.runOnUiThreadBlocking(
() -> PrefServiceBridge.getInstance().getBoolean(Pref.NTP_ARTICLES_LIST_VISIBLE));
}
} }
...@@ -21,12 +21,16 @@ import org.junit.Test; ...@@ -21,12 +21,16 @@ import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.chromium.base.ThreadUtils; import org.chromium.base.ThreadUtils;
import org.chromium.base.test.params.ParameterAnnotations;
import org.chromium.base.test.params.ParameterSet;
import org.chromium.base.test.params.ParameterizedRunner;
import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.CommandLineFlags;
import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.DisabledTest;
import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.Feature;
import org.chromium.base.test.util.Restriction; import org.chromium.base.test.util.Restriction;
import org.chromium.base.test.util.RetryOnFailure; import org.chromium.base.test.util.RetryOnFailure;
import org.chromium.chrome.R; import org.chromium.chrome.R;
import org.chromium.chrome.browser.ChromeFeatureList;
import org.chromium.chrome.browser.ChromeSwitches; import org.chromium.chrome.browser.ChromeSwitches;
import org.chromium.chrome.browser.UrlConstants; import org.chromium.chrome.browser.UrlConstants;
import org.chromium.chrome.browser.ntp.ContextMenuManager; import org.chromium.chrome.browser.ntp.ContextMenuManager;
...@@ -39,7 +43,7 @@ import org.chromium.chrome.browser.ntp.snippets.KnownCategories; ...@@ -39,7 +43,7 @@ import org.chromium.chrome.browser.ntp.snippets.KnownCategories;
import org.chromium.chrome.browser.ntp.snippets.SnippetArticle; import org.chromium.chrome.browser.ntp.snippets.SnippetArticle;
import org.chromium.chrome.browser.suggestions.ContentSuggestionsAdditionalAction; import org.chromium.chrome.browser.suggestions.ContentSuggestionsAdditionalAction;
import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.ChromeJUnit4RunnerDelegate;
import org.chromium.chrome.test.ChromeTabbedActivityTestRule; import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
import org.chromium.chrome.test.util.ChromeTabUtils; import org.chromium.chrome.test.util.ChromeTabUtils;
import org.chromium.chrome.test.util.NewTabPageTestUtils; import org.chromium.chrome.test.util.NewTabPageTestUtils;
...@@ -62,7 +66,8 @@ import java.util.concurrent.TimeoutException; ...@@ -62,7 +66,8 @@ import java.util.concurrent.TimeoutException;
/** /**
* Instrumentation tests for {@link NewTabPageRecyclerView}. * Instrumentation tests for {@link NewTabPageRecyclerView}.
*/ */
@RunWith(ChromeJUnit4ClassRunner.class) @RunWith(ParameterizedRunner.class)
@ParameterAnnotations.UseRunnerDelegate(ChromeJUnit4RunnerDelegate.class)
@CommandLineFlags.Add(ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE) @CommandLineFlags.Add(ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE)
@Features.DisableFeatures("NetworkPrediction") @Features.DisableFeatures("NetworkPrediction")
@RetryOnFailure @RetryOnFailure
...@@ -73,6 +78,11 @@ public class NewTabPageRecyclerViewTest { ...@@ -73,6 +78,11 @@ public class NewTabPageRecyclerViewTest {
@Rule @Rule
public SuggestionsDependenciesRule mSuggestionsDeps = new SuggestionsDependenciesRule(); public SuggestionsDependenciesRule mSuggestionsDeps = new SuggestionsDependenciesRule();
@ParameterAnnotations.ClassParameter
private static List<ParameterSet> sClassParams =
Arrays.asList(new ParameterSet().value(false).name("DisableExpandableHeader"),
new ParameterSet().value(true).name("EnableExpandableHeader"));
private static final String TEST_PAGE = "/chrome/test/data/android/navigate/simple.html"; private static final String TEST_PAGE = "/chrome/test/data/android/navigate/simple.html";
private static final long FAKE_PUBLISH_TIMESTAMP = 1466614774; private static final long FAKE_PUBLISH_TIMESTAMP = 1466614774;
private static final long FAKE_FETCH_TIMESTAMP = 1466634774; private static final long FAKE_FETCH_TIMESTAMP = 1466634774;
...@@ -84,13 +94,27 @@ public class NewTabPageRecyclerViewTest { ...@@ -84,13 +94,27 @@ public class NewTabPageRecyclerViewTest {
@CategoryInt @CategoryInt
private static final int TEST_CATEGORY = KnownCategories.ARTICLES; private static final int TEST_CATEGORY = KnownCategories.ARTICLES;
private final boolean mEnableExpandableHeader;
private Tab mTab; private Tab mTab;
private NewTabPage mNtp; private NewTabPage mNtp;
private EmbeddedTestServer mTestServer; private EmbeddedTestServer mTestServer;
private FakeSuggestionsSource mSource; private FakeSuggestionsSource mSource;
public NewTabPageRecyclerViewTest(boolean enableExpandableHeader) {
mEnableExpandableHeader = enableExpandableHeader;
}
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
if (mEnableExpandableHeader) {
Features.getInstance().enable(
ChromeFeatureList.NTP_ARTICLE_SUGGESTIONS_EXPANDABLE_HEADER);
} else {
Features.getInstance().disable(
ChromeFeatureList.NTP_ARTICLE_SUGGESTIONS_EXPANDABLE_HEADER);
}
mTestServer = EmbeddedTestServer.createAndStartServer(InstrumentationRegistry.getContext()); mTestServer = EmbeddedTestServer.createAndStartServer(InstrumentationRegistry.getContext());
FakeMostVisitedSites mostVisitedSites = new FakeMostVisitedSites(); FakeMostVisitedSites mostVisitedSites = new FakeMostVisitedSites();
......
...@@ -391,6 +391,27 @@ public class SectionListTest { ...@@ -391,6 +391,27 @@ public class SectionListTest {
assertNull(section); assertNull(section);
} }
@Test
@Feature({"Ntp"})
@EnableFeatures(ChromeFeatureList.NTP_ARTICLE_SUGGESTIONS_EXPANDABLE_HEADER)
public void testArticlesHeaderExpandableWithOtherSections() {
registerCategory(mSuggestionSource, KnownCategories.ARTICLES, 1);
registerCategory(mSuggestionSource, CATEGORY1, 1);
SectionList sectionList = new SectionList(mUiDelegate, mOfflinePageBridge);
sectionList.refreshSuggestions();
// Check article header is expandable.
SuggestionsSection articles = sectionList.getSection(KnownCategories.ARTICLES);
assertTrue(articles.getHeaderItemForTesting().isVisible());
assertTrue(articles.getHeaderItemForTesting().isExpandable());
// Check header of other section is not expandable.
SuggestionsSection otherSection = sectionList.getSection(CATEGORY1);
assertTrue(otherSection.getHeaderItemForTesting().isVisible());
assertFalse(otherSection.getHeaderItemForTesting().isExpandable());
}
@Test @Test
@Feature({"Ntp"}) @Feature({"Ntp"})
@EnableFeatures(ChromeFeatureList.NTP_ARTICLE_SUGGESTIONS_EXPANDABLE_HEADER) @EnableFeatures(ChromeFeatureList.NTP_ARTICLE_SUGGESTIONS_EXPANDABLE_HEADER)
......
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