package edu.mit.media.funf.probe; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; import android.test.AndroidTestCase; public class ProbeTest extends AndroidTestCase { private TestProbe testProbe; public class TestProbe extends Probe.Base implements Probe { public BlockingQueue<String> messageQueue = new LinkedBlockingQueue<String>(); public static final String ENABLED = "ENABLED", DISABLED = "DISABLED", STARTED = "STARTED", STOPPED = "STOPPED"; @Override protected void onEnable() { messageQueue.offer(ENABLED); } @Override protected void onStart() { messageQueue.offer(STARTED); } @Override protected void onStop() { messageQueue.offer(STOPPED); } @Override protected void onDisable() { messageQueue.offer(DISABLED); } } @Override protected void setUp() throws Exception { super.setUp(); testProbe = new TestProbe(); } @Override protected void tearDown() throws Exception { if (testProbe != null) { testProbe.disable(); } super.tearDown(); } public void testFullStateFlow() { assertEquals(Probe.State.DISABLED, testProbe.getState()); testProbe.enable(); assertStateChange(testProbe, Probe.State.ENABLED, TestProbe.ENABLED); testProbe.start(); assertStateChange(testProbe, Probe.State.RUNNING, TestProbe.STARTED); testProbe.stop(); assertStateChange(testProbe, Probe.State.ENABLED, TestProbe.STOPPED); testProbe.disable(); assertStateChange(testProbe, Probe.State.DISABLED, TestProbe.DISABLED); } public void testIndempotence() { assertEquals(Probe.State.DISABLED, testProbe.getState()); testProbe.disable(); assertStateChange(testProbe, Probe.State.DISABLED); // Test multiple times to ensure it doesn't call onEnabled testProbe.enable(); assertStateChange(testProbe, Probe.State.ENABLED, TestProbe.ENABLED); testProbe.enable(); assertStateChange(testProbe, Probe.State.ENABLED); testProbe.enable(); assertStateChange(testProbe, Probe.State.ENABLED); testProbe.disable(); assertStateChange(testProbe, Probe.State.DISABLED, TestProbe.DISABLED); } /** * Asserts that the current state is as defined at the end of the list of state changes. * If no state changes are provided, it is assumed that there should NOT be a state change. * @param theTestProbe * @param correctState * @param correctMessages */ private void assertStateChange(TestProbe theTestProbe, Probe.State correctState, String... correctMessages) { try { if (correctMessages == null) { correctMessages = new String[] { null }; } for (String correctMessage : correctMessages) { String message = testProbe.messageQueue.poll(100, TimeUnit.MILLISECONDS); if (correctMessage == null) { assertNull(message); } else { assertNotNull(message); assertEquals(correctMessage, message); } } assertEquals(correctState, testProbe.getState()); } catch (InterruptedException e) { fail(); } } }