Bug 926310 - Robocop: Add test for 'Reader Mode' feature. r=jmaher
authorPaul Feher <paul.feher@softvision.ro>
Mon, 14 Oct 2013 16:54:06 +0300
changeset 165661 8ac8f0ebecddcc193900d8761b8fa83bae0e2b42
parent 165660 5d220eac034245553413489cf24eb9264d20312f
child 165662 f05da065e7af66ddb3c955713c97b2ca58847dc2
push id428
push userbbajaj@mozilla.com
push dateTue, 28 Jan 2014 00:16:25 +0000
treeherdermozilla-release@cd72a7ff3a75 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersjmaher
bugs926310
milestone27.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 926310 - Robocop: Add test for 'Reader Mode' feature. r=jmaher
mobile/android/base/tests/AboutHomeTest.java.in
mobile/android/base/tests/robocop.ini
mobile/android/base/tests/testReaderMode.java.in
--- a/mobile/android/base/tests/AboutHomeTest.java.in
+++ b/mobile/android/base/tests/AboutHomeTest.java.in
@@ -22,17 +22,17 @@ import java.lang.reflect.Method;
 import java.util.ArrayList;
 
 /**
  * This class is an extension of BaseTest that helps with interaction with about:home
  * This class contains methods that access the different tabs from about:home, methods that get information like history and bookmarks from the database, edit and remove bookmarks and history items
  * The purpose of this class is to collect all the logically connected methods that deal with about:home
  * To use any of these methods in your test make sure it extends AboutHomeTest instead of BaseTest
  */
-abstract class AboutHomeTest extends BaseTest {
+abstract class AboutHomeTest extends PixelTest {
     protected enum AboutHomeTabs {HISTORY, MOST_RECENT, TABS_FROM_LAST_TIME, TOP_SITES, BOOKMARKS, READING_LIST};
     private ArrayList<String> aboutHomeTabs = new ArrayList<String>() {{
                   add("TOP_SITES");
                   add("BOOKMARKS");
                   add("READING_LIST");
               }};
 
 
@@ -275,22 +275,25 @@ abstract class AboutHomeTest extends Bas
     /**
      * This method can be used to open the different tabs of about:home.
      *
      * @param AboutHomeTabs enum item {MOST_RECENT, TABS_FROM_LAST_TIME, TOP_SITES, BOOKMARKS, READING_LIST}
      */
     protected void openAboutHomeTab(AboutHomeTabs tab) {
         focusUrlBar();
         ViewPager pager = (ViewPager)mSolo.getView(ViewPager.class, 0);
+        final int currentTabIndex = pager.getCurrentItem();
+        int tabOffset;
 
         // Handle tablets by just clicking the visible tab title.
         if (mDevice.type.equals("tablet")) {
-            // Just click for tablets, since all the titles are visible.
             if (AboutHomeTabs.MOST_RECENT == tab || AboutHomeTabs.TABS_FROM_LAST_TIME == tab) {
-                mSolo.clickOnText(AboutHomeTabs.HISTORY.toString());
+                tabOffset = aboutHomeTabs.indexOf(AboutHomeTabs.HISTORY.toString()) - currentTabIndex;
+                swipeAboutHome(tabOffset);
+                waitForAboutHomeTab(aboutHomeTabs.indexOf(StringHelper.HISTORY_LABEL));
                 TabWidget tabwidget = (TabWidget)mSolo.getView(TabWidget.class, 0);
 
                 switch (tab) {
                     case MOST_RECENT: {
                         mSolo.clickOnView(tabwidget.getChildAt(0));
                         // We can determine if we are on the MOST_RECENT tab only if pages were first visited during the test
                         mAsserter.ok(waitForText(StringHelper.TODAY_LABEL), "Checking that we are in the most recent tab of about:home", "We are in the most recent tab");
                         break;
@@ -303,18 +306,17 @@ abstract class AboutHomeTest extends Bas
                 }
             } else {
                 clickAboutHomeTab(tab);
             }
             return;
         }
 
         // Handle phones (non-tablets).
-        final int currentTabIndex = pager.getCurrentItem();
-        int tabOffset = aboutHomeTabs.indexOf(tab.toString()) - currentTabIndex;
+        tabOffset = aboutHomeTabs.indexOf(tab.toString()) - currentTabIndex;
         switch (tab) {
             case TOP_SITES : {
                 swipeAboutHome(tabOffset);
                 waitForAboutHomeTab(aboutHomeTabs.indexOf(tab.toString()));
                 break;
             }
             case BOOKMARKS : {
                 swipeAboutHome(tabOffset);
--- a/mobile/android/base/tests/robocop.ini
+++ b/mobile/android/base/tests/robocop.ini
@@ -40,14 +40,15 @@
 [testDistribution]
 [testFindInPage]
 [testInputUrlBar]
 [testAddSearchEngine]
 [testImportFromAndroid]
 [testMasterPassword]
 [testDeviceSearchEngine]
 [testPrivateBrowsing]
+[testReaderMode]
 
 # Used for Talos, please don't use in mochitest
 #[testPan]
 #[testCheck]
 #[testCheck2]
 #[testBrowserProviderPerf]
new file mode 100644
--- /dev/null
+++ b/mobile/android/base/tests/testReaderMode.java.in
@@ -0,0 +1,170 @@
+#filter substitution
+package @ANDROID_PACKAGE_NAME@.tests;
+
+import @ANDROID_PACKAGE_NAME@.*;
+import com.jayway.android.robotium.solo.Solo;
+import android.widget.ListView;
+import android.view.View;
+import java.util.ArrayList;
+import android.view.ViewGroup;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * This patch tests the Reader Mode feature by adding and removing items in reading list
+ * checks the reader toolbar functionality(share, add/remove to reading list, go to reading list)
+ * accessing a page from reading list menu, checks that the reader icon is associated in History tab
+ * and that the reading list is properly populated after adding or removing reader items
+ */
+public class testReaderMode extends AboutHomeTest {
+    int height,width;
+
+    @Override
+    protected int getTestType() {
+        return TEST_MOCHITEST;
+    }
+    public void testReaderMode() {
+        blockForGeckoReady();
+
+        Actions.EventExpecter contentEventExpecter;
+        Actions.EventExpecter contentReaderAddedExpecter;
+        Actions.EventExpecter faviconExpecter;
+        ListView list;
+        View child;
+        String textUrl = getAbsoluteUrl(StringHelper.ROBOCOP_TEXT_PAGE_URL);
+        String devType = mDevice.type;
+        int childNo;
+
+        contentEventExpecter = mActions.expectGeckoEvent("DOMContentLoaded");
+        loadAndPaint(textUrl);
+        contentEventExpecter.blockForEvent();
+        contentEventExpecter.unregisterListener();
+        View readerIcon = getReaderIcon();
+
+        // Add the page to the Reading List using log click on the reader icon
+        contentReaderAddedExpecter = mActions.expectGeckoEvent("Reader:Added");
+        mSolo.clickLongOnView(readerIcon);
+        String eventData = contentReaderAddedExpecter.blockForEventData();
+        isAdded(eventData);
+        contentReaderAddedExpecter.unregisterListener();
+
+        // Try to add the page to the Reading List using log click on the reader icon a second time
+        contentReaderAddedExpecter = mActions.expectGeckoEvent("Reader:Added");
+        mSolo.clickLongOnView(readerIcon);
+        eventData = contentReaderAddedExpecter.blockForEventData();
+        isAdded(eventData);
+        contentReaderAddedExpecter.unregisterListener();
+
+        // Waiting for the favicon since is the last element loaded usually
+        faviconExpecter = mActions.expectGeckoEvent("Reader:FaviconRequest");
+        mSolo.clickOnView(getReaderIcon());
+
+        // Changing devices orientation to be sure that all devices are in portrait when will access the reader toolbar
+        mSolo.setActivityOrientation(Solo.PORTRAIT);
+        faviconExpecter.blockForEvent();
+        faviconExpecter.unregisterListener();
+        verifyPageTitle("Robocop Text Page");
+
+        // Open the share menu for the reader toolbar
+        height = mDriver.getGeckoTop() + mDriver.getGeckoHeight() - 10;
+        width = mDriver.getGeckoLeft() + mDriver.getGeckoWidth() - 10;
+        mAsserter.dumpLog("Long Clicking at width = " + String.valueOf(width) + " and height = " + String.valueOf(height));
+        mSolo.clickOnScreen(width,height);
+        mAsserter.ok(mSolo.waitForText("Share via"), "Waiting for the share menu", "The share menu is present");
+        mActions.sendSpecialKey(Actions.SpecialKey.BACK); // Close the share menu
+
+        // Remove page from the Reading List using reader toolbar
+        height = mDriver.getGeckoTop() + mDriver.getGeckoHeight() - 10;
+        width = mDriver.getGeckoLeft() + 50;
+        mAsserter.dumpLog("Long Clicking at width = " + String.valueOf(width) + " and height = " + String.valueOf(height));
+        mSolo.clickOnScreen(width,height);
+        mAsserter.ok(mSolo.waitForText("Page removed from your Reading List"), "Waiting for the page to removed from your Reading List", "The page is removed from your Reading List");
+
+        //Add page to the Reading List using reader toolbar
+        mSolo.clickOnScreen(width,height);
+        mAsserter.ok(mSolo.waitForText("Page added to your Reading List"), "Waiting for the page to be added to your Reading List", "The page was added to your Reading List");
+
+        // Open the Reading List menu for the toolbar
+        height = mDriver.getGeckoTop() + mDriver.getGeckoHeight() - 10;
+        width = mDriver.getGeckoLeft() + mDriver.getGeckoWidth()/2 - 10;
+        mAsserter.dumpLog("Long Clicking at width = " + String.valueOf(width) + " and height = " + String.valueOf(height));
+        contentEventExpecter = mActions.expectGeckoEvent("DOMContentLoaded");
+        mSolo.clickOnScreen(width,height);
+        contentEventExpecter.blockForEvent();
+        contentEventExpecter.unregisterListener();
+
+        // Check if the page is present in the Reading List
+        mAsserter.ok(mSolo.waitForText("Robocop Text Page"), "Verify if the page is added to your Reading List", "The page is present in your Reading List");
+
+        // Check if the page is added in History tab like a Reading List item
+        openAboutHomeTab(AboutHomeTabs.MOST_RECENT);
+        list = findListViewWithTag("most_recent");
+        child = list.getChildAt(1);
+        mAsserter.ok(child != null, "item can be retrieved", child != null ? child.toString() : "null!");
+        mSolo.clickLongOnView(child);
+        mAsserter.ok(mSolo.waitForText("Open in Reader"), "Verify if the page is present in history as a Reading List item", "The page is present in history as a Reading List item");
+        mActions.sendSpecialKey(Actions.SpecialKey.BACK); // Dismiss the context menu
+        mSolo.waitForText("Robocop Text Page");
+
+        // Verify separately the Reading List entries for tablets and phone because for tablets there is an extra child in UI design
+        if (devType.equals("phone")) {
+            childNo = 1;
+        }
+        else {
+            childNo = 2;
+        }
+        // Verify if the page is present to your Reading List
+        openAboutHomeTab(AboutHomeTabs.READING_LIST);
+        list = findListViewWithTag("reading_list");
+        child = list.getChildAt(childNo-1);
+        mAsserter.ok(child != null, "Verify if the page is present to your Reading List", "The page is present in your Reading List");
+        contentEventExpecter = mActions.expectGeckoEvent("DOMContentLoaded");
+        mSolo.clickOnView(child);
+        contentEventExpecter.blockForEvent();
+        contentEventExpecter.unregisterListener();
+        verifyPageTitle("Robocop Text Page");
+
+        // Verify that we are in reader mode and remove the page from Reading List
+        height = mDriver.getGeckoTop() + mDriver.getGeckoHeight() - 10;
+        width = mDriver.getGeckoLeft() + 50;
+        mAsserter.dumpLog("Long Clicking at width = " + String.valueOf(width) + " and height = " + String.valueOf(height));
+        mSolo.clickOnScreen(width,height);
+        mAsserter.ok(mSolo.waitForText("Page removed from your Reading List"), "Waiting for the page to removed from your Reading List", "The page is removed from your Reading List");
+        verifyPageTitle("Robocop Text Page");
+
+        //Check if the Reading List is empty
+        openAboutHomeTab(AboutHomeTabs.READING_LIST);
+        list = findListViewWithTag("reading_list");
+        child = list.getChildAt(childNo-1);
+        mAsserter.ok(child == null, "Verify if the Reading List is empty", "The Reading List is empty");
+    }
+
+    // Get the reader icon method
+    protected View getReaderIcon() {
+        View pageActionLayout = mSolo.getView(0x7f070025);
+        ArrayList<String> pageActionLayoutChilds = new ArrayList();
+        View actionLayoutItem = pageActionLayout;
+        ViewGroup actionLayoutEntry = (ViewGroup)actionLayoutItem;
+        View icon = actionLayoutEntry.getChildAt(1);
+        return icon;
+    }
+
+    // This method check to see if a reader item is added to the reader list
+    private boolean isAdded(String eventData) {
+        try {
+            JSONObject data = new JSONObject(eventData);
+                if (data.getInt("result") == 0) {
+                    mAsserter.ok(true, "Waiting for the page to be added to your Reading List", "The page was added to your Reading List");
+                }
+                else {
+                    if (data.getInt("result") == 2) {
+                        mAsserter.ok(true, "Trying to add a second time the page in your Reading List", "The page is already in your Reading List");
+                    }
+                }
+        } catch (JSONException e) {
+            mAsserter.ok(false, "Error parsing the event data", e.toString());
+            return false;
+        }
+        return true;
+    }
+}