/* Any copyright is dedicated to the Public Domain. http://creativecommons.org/publicdomain/zero/1.0/ */ package org.mozilla.android.sync.test.helpers; import static junit.framework.Assert.assertNotNull; import org.mozilla.gecko.sync.Logger; import org.mozilla.gecko.sync.repositories.InvalidSessionTransitionException; import org.mozilla.gecko.sync.repositories.Repository; import org.mozilla.gecko.sync.repositories.RepositorySession; import android.content.Context; public class SessionTestHelper { protected static RepositorySession prepareRepositorySession( final Context context, final boolean begin, final Repository repository) { final WaitHelper testWaiter = WaitHelper.getTestWaiter(); final String logTag = "prepareRepositorySession"; class CreationDelegate extends DefaultSessionCreationDelegate { private RepositorySession session; synchronized void setSession(RepositorySession session) { this.session = session; } synchronized RepositorySession getSession() { return this.session; } @Override public void onSessionCreated(final RepositorySession session) { assertNotNull(session); Logger.info(logTag, "Setting session to " + session); setSession(session); if (begin) { Logger.info(logTag, "Calling session.begin on new session."); // The begin callbacks will notify. try { session.begin(new ExpectBeginDelegate()); } catch (InvalidSessionTransitionException e) { testWaiter.performNotify(e); } } else { Logger.info(logTag, "Notifying after setting new session."); testWaiter.performNotify(); } } } final CreationDelegate delegate = new CreationDelegate(); try { Runnable runnable = new Runnable() { @Override public void run() { repository.createSession(delegate, context); } }; testWaiter.performWait(runnable); } catch (IllegalArgumentException ex) { Logger.warn(logTag, "Caught IllegalArgumentException."); } Logger.info(logTag, "Retrieving new session."); final RepositorySession session = delegate.getSession(); assertNotNull(session); return session; } public static RepositorySession createSession(final Context context, final Repository repository) { return prepareRepositorySession(context, false, repository); } public static RepositorySession createAndBeginSession(Context context, Repository repository) { return prepareRepositorySession(context, true, repository); } }