package io.pivotal.arca.dispatcher; import android.content.Intent; import android.net.Uri; import android.os.Looper; import android.os.Message; import android.test.AndroidTestCase; import junit.framework.Assert; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import io.pivotal.arca.broadcaster.ArcaBroadcastManager; public class ErrorBroadcasterTest extends AndroidTestCase { private static final Uri URI = Uri.parse("content://empty"); private static final int ERROR_CODE = 100; private static final String ERROR_MESSAGE = "error message"; @Override protected void setUp() throws Exception { super.setUp(); final Looper looper = getContext().getMainLooper(); final TestBroadcastHandler handler = new TestBroadcastHandler(looper); ArcaBroadcastManager.initialize(getContext(), handler); } public void testErrorBroadcast() { final AssertionLatch latch = new AssertionLatch(1); final ErrorReceiver receiver = new ErrorReceiver(new ErrorListener() { @Override public void onRequestError(final io.pivotal.arca.dispatcher.Error error) { latch.countDown(); assertEquals(ERROR_CODE, error.getCode()); assertEquals(ERROR_MESSAGE, error.getMessage()); } }); receiver.register(URI); ErrorBroadcaster.broadcast(getContext(), URI, ERROR_CODE, ERROR_MESSAGE); latch.assertComplete(); } public void testErrorFromIntent() { final Error error = new Error(ERROR_CODE, ERROR_MESSAGE); final Intent intent = new Intent(URI.toString()); intent.putExtra(ErrorBroadcaster.Extras.ERROR, error); final Error actual = ErrorBroadcaster.getError(intent); assertEquals(error, actual); } public void testNullErrorFromIntent() { final Error error = ErrorBroadcaster.getError(null); assertNull(error); } // ============================================ private static class TestBroadcastHandler extends ArcaBroadcastManager.BroadcastHandler { public TestBroadcastHandler(final Looper looper) { super(looper); } @Override public boolean sendMessageAtTime(final Message msg, final long uptimeMillis) { handleMessage(msg); return true; } } // ============================================ public class AssertionLatch extends CountDownLatch { public AssertionLatch(final int count) { super(count); } @Override public void countDown() { final long count = getCount(); if (count == 0) { Assert.fail("This latch has already finished."); } else { super.countDown(); } } public void assertComplete() { try { Assert.assertTrue(await(0, TimeUnit.SECONDS)); } catch (final InterruptedException e) { Assert.fail(); } } } }