diff -r 000000000000 -r 6474c204b198 mobile/android/base/tests/testSessionOOMSave.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mobile/android/base/tests/testSessionOOMSave.java Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,87 @@ +package org.mozilla.gecko.tests; + +import org.mozilla.gecko.Actions; + +import com.jayway.android.robotium.solo.Condition; + +/** + * Tests session OOM save behavior. + * + * Builds a session and tests that the saved state is correct. + */ +public class testSessionOOMSave extends SessionTest { + private final static int SESSION_TIMEOUT = 25000; + + public void testSessionOOMSave() { + Actions.EventExpecter pageShowExpecter = mActions.expectGeckoEvent("Content:PageShow"); + pageShowExpecter.blockForEvent(); + pageShowExpecter.unregisterListener(); + + PageInfo home = new PageInfo("about:home"); + PageInfo page1 = new PageInfo("page1"); + PageInfo page2 = new PageInfo("page2"); + PageInfo page3 = new PageInfo("page3"); + PageInfo page4 = new PageInfo("page4"); + PageInfo page5 = new PageInfo("page5"); + PageInfo page6 = new PageInfo("page6"); + + SessionTab tab1 = new SessionTab(0, home, page1, page2); + SessionTab tab2 = new SessionTab(1, home, page3, page4); + SessionTab tab3 = new SessionTab(2, home, page5, page6); + + final Session session = new Session(1, tab1, tab2, tab3); + + // Load the tabs into the browser + loadSessionTabs(session); + + // Verify sessionstore.js written by Gecko. The session write is + // delayed for certain interactions (such as changing the selected + // tab), so the file is repeatedly read until it matches the expected + // output. Because of the delay, this part of the test takes ~9 seconds + // to pass. + VerifyJSONCondition verifyJSONCondition = new VerifyJSONCondition(session); + boolean success = waitForCondition(verifyJSONCondition, SESSION_TIMEOUT); + if (success) { + mAsserter.ok(true, "verified session JSON", null); + } else { + mAsserter.ok(false, "failed to verify session JSON", + getStackTraceString(verifyJSONCondition.getLastException())); + } + } + + private class VerifyJSONCondition implements Condition { + private AssertException mLastException; + private final NonFatalAsserter mAsserter = new NonFatalAsserter(); + private final Session mSession; + + public VerifyJSONCondition(Session session) { + mSession = session; + } + + @Override + public boolean isSatisfied() { + try { + String sessionString = readProfileFile("sessionstore.js"); + if (sessionString == null) { + mLastException = new AssertException("Could not read sessionstore.js"); + return false; + } + + verifySessionJSON(mSession, sessionString, mAsserter); + } catch (AssertException e) { + mLastException = e; + return false; + } + return true; + } + + /** + * Gets the last AssertException thrown by verifySessionJSON(). + * + * This is useful to get the stack trace if the test fails. + */ + public AssertException getLastException() { + return mLastException; + } + } +}