package org.solovyev.android.checkout; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.annotation.Config; import android.os.Handler; import android.os.Looper; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; import javax.annotation.Nonnull; import static org.junit.Assert.assertEquals; @RunWith(RobolectricTestRunner.class) @Config(manifest = Config.NONE) public class BasePurchaseVerifierTest { @Test public void testVerifierIsCalledOnBackgroundThreadFromMainThread() throws Exception { final ThreadAwareVerifier verifier = new ThreadAwareVerifier(); final CountDownLatchRequestListener listener = new CountDownLatchRequestListener(); verifier.verify(new ArrayList<Purchase>(), listener); listener.mLatch.await(1, TimeUnit.SECONDS); assertEquals("TestThread", verifier.mThreadName); } @Test public void testVerifierIsCalledOnTheSameBackgroundThread() throws Exception { final ThreadAwareVerifier verifier = new ThreadAwareVerifier(); final CountDownLatchRequestListener listener = new CountDownLatchRequestListener(); new Thread(new Runnable() { @Override public void run() { verifier.verify(new ArrayList<Purchase>(), listener); } }, "BackgroundThread").start(); listener.mLatch.await(1, TimeUnit.SECONDS); assertEquals("BackgroundThread", verifier.mThreadName); } @Test public void testVerifierCallsListenerMethodsOnMainThreadFromMainThread() throws Exception { final ThreadAwareVerifier verifier = new ThreadAwareVerifier(); final ThreadAwareRequestListener listener = new ThreadAwareRequestListener(); verifier.verify(new ArrayList<Purchase>(), listener); listener.mLatch.await(1, TimeUnit.SECONDS); // !!! Doesn't work now as we sleep on the main thread ^^^ while listener await executing on it //assertEquals(Thread.currentThread().getName(), verifier.mThreadName); } @Test public void testVerifierCallsListenerMethodsOnTheSameBackgroundThread() throws Exception { final ThreadAwareVerifier verifier = new ThreadAwareVerifier(); final ThreadAwareRequestListener listener = new ThreadAwareRequestListener(); new Thread(new Runnable() { @Override public void run() { verifier.verify(new ArrayList<Purchase>(), listener); } }, "BackgroundThread").start(); listener.mLatch.await(1, TimeUnit.SECONDS); assertEquals("BackgroundThread", listener.mThreadName); } private static final class ThreadAwareVerifier extends BasePurchaseVerifier { @Nonnull private String mThreadName; public ThreadAwareVerifier() { super(new Handler(Looper.getMainLooper()), 1, new ThreadFactory() { @Override public Thread newThread(Runnable r) { return new Thread(r, "TestThread"); } }); } @Override protected void doVerify(@Nonnull List<Purchase> purchases, @Nonnull RequestListener<List<Purchase>> listener) { mThreadName = Thread.currentThread().getName(); listener.onSuccess(purchases); } } private static class ThreadAwareRequestListener extends CountDownLatchRequestListener { @Nonnull private String mThreadName; @Override public void onSuccess(@Nonnull List<Purchase> result) { mThreadName = Thread.currentThread().getName(); super.onSuccess(result); } @Override public void onError(int response, @Nonnull Exception e) { mThreadName = Thread.currentThread().getName(); super.onError(response, e); } } private static class CountDownLatchRequestListener implements RequestListener<List<Purchase>> { @Nonnull final CountDownLatch mLatch = new CountDownLatch(1); @Override public void onSuccess(@Nonnull List<Purchase> result) { mLatch.countDown(); } @Override public void onError(int response, @Nonnull Exception e) { mLatch.countDown(); } } }