tmf: Add unit tests to prevent waitForStart() from blocking
authorAlexandre Montplaisir <alexmonthy@efficios.com>
Thu, 7 Jul 2016 23:08:54 +0000 (19:08 -0400)
committerAlexandre Montplaisir <alexmonthy@efficios.com>
Fri, 8 Jul 2016 01:33:47 +0000 (21:33 -0400)
Make sure that if an event request is already started and
waitForStart() is called on it, it does not block forever.

Change-Id: Ic374e5092ac04fe5ca9fb6c20221508859db7825
Signed-off-by: Alexandre Montplaisir <alexmonthy@efficios.com>
Signed-off-by: Matthew Khouzam <matthew.khouzam@ericsson.com>
Reviewed-on: https://git.eclipse.org/r/76915
Reviewed-by: Hudson CI
tmf/org.eclipse.tracecompass.tmf.core.tests/src/org/eclipse/tracecompass/tmf/core/tests/request/TmfEventRequestTest.java

index 6abb807b07c185696ef09f5ceca3ad6273f25564..ec89a9da15430ca762ba4b277fb999e7143b6d34 100644 (file)
@@ -19,6 +19,8 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 
+import java.util.concurrent.TimeUnit;
+
 import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
 import org.eclipse.tracecompass.tmf.core.request.ITmfEventRequest;
 import org.eclipse.tracecompass.tmf.core.request.ITmfEventRequest.ExecutionType;
@@ -27,7 +29,10 @@ import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimeRange;
 import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimestamp;
 import org.eclipse.tracecompass.tmf.tests.stubs.request.TmfEventRequestStub;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TestRule;
+import org.junit.rules.Timeout;
 
 /**
  * Test suite for the TmfEventRequest class.
@@ -35,6 +40,9 @@ import org.junit.Test;
 @SuppressWarnings("javadoc")
 public class TmfEventRequestTest {
 
+    @Rule
+    public TestRule globalTimeout = new Timeout(20, TimeUnit.SECONDS);
+
     // ------------------------------------------------------------------------
     // Variables
     // ------------------------------------------------------------------------
@@ -123,7 +131,7 @@ public class TmfEventRequestTest {
         TmfTimeRange range = new TmfTimeRange(TmfTimestamp.fromSeconds(0), TmfTimestamp.BIG_CRUNCH);
         TmfEventRequest request = new TmfEventRequestStub(ITmfEvent.class, range);
 
-        assertEquals("getDataType",  ITmfEvent.class, request.getDataType());
+        assertEquals("getDataType", ITmfEvent.class, request.getDataType());
 
         assertEquals("StartTime", TmfTimestamp.fromSeconds(0), request.getRange().getStartTime());
         assertEquals("EndTime", TmfTimestamp.BIG_CRUNCH, request.getRange().getEndTime());
@@ -144,7 +152,7 @@ public class TmfEventRequestTest {
         TmfTimeRange range = new TmfTimeRange(TmfTimestamp.fromSeconds(0), TmfTimestamp.BIG_CRUNCH);
         TmfEventRequest request = new TmfEventRequestStub(ITmfEvent.class, range, 100);
 
-        assertEquals("getDataType",  ITmfEvent.class, request.getDataType());
+        assertEquals("getDataType", ITmfEvent.class, request.getDataType());
 
         assertEquals("StartTime", TmfTimestamp.fromSeconds(0), request.getRange().getStartTime());
         assertEquals("EndTime", TmfTimestamp.BIG_CRUNCH, request.getRange().getEndTime());
@@ -165,7 +173,7 @@ public class TmfEventRequestTest {
         TmfTimeRange range = new TmfTimeRange(TmfTimestamp.fromSeconds(0), TmfTimestamp.BIG_CRUNCH);
         TmfEventRequest request = new TmfEventRequestStub(ITmfEvent.class, range, 100, 200);
 
-        assertEquals("getDataType",  ITmfEvent.class, request.getDataType());
+        assertEquals("getDataType", ITmfEvent.class, request.getDataType());
 
         assertEquals("StartTime", TmfTimestamp.fromSeconds(0), request.getRange().getStartTime());
         assertEquals("EndTime", TmfTimestamp.BIG_CRUNCH, request.getRange().getEndTime());
@@ -186,7 +194,7 @@ public class TmfEventRequestTest {
         TmfTimeRange range = new TmfTimeRange(TmfTimestamp.fromSeconds(0), TmfTimestamp.BIG_CRUNCH);
         TmfEventRequest request = new TmfEventRequestStub(ITmfEvent.class, range, 100, 200, ExecutionType.FOREGROUND, 1);
 
-        assertEquals("getDataType",  ITmfEvent.class, request.getDataType());
+        assertEquals("getDataType", ITmfEvent.class, request.getDataType());
 
         assertEquals("StartTime", TmfTimestamp.fromSeconds(0), request.getRange().getStartTime());
         assertEquals("EndTime", TmfTimestamp.BIG_CRUNCH, request.getRange().getEndTime());
@@ -217,7 +225,10 @@ public class TmfEventRequestTest {
         assertFalse(fRequest1.equals(fRequest3));
         assertFalse(fRequest1.equals(fRequest4));
 
-        /* Request with different dependency level, but otherwise identical, are not equal */
+        /*
+         * Request with different dependency level, but otherwise identical, are
+         * not equal
+         */
         assertFalse(fRequest4.equals(fRequest5));
     }
 
@@ -303,4 +314,111 @@ public class TmfEventRequestTest {
         assertTrue("handleCancel", flags[3]);
     }
 
+    // ------------------------------------------------------------------------
+    // waitForStart
+    // ------------------------------------------------------------------------
+
+    /**
+     * Test calling waitForStart() after the request has already been started.
+     * It should not block.
+     */
+    @Test
+    public void testWaitForStartAfterStart() throws InterruptedException {
+        final boolean[] flags = new boolean[4];
+        TmfEventRequest request = setupTestRequest(flags);
+
+        request.start();
+        request.waitForStart();
+        request.done();
+
+        assertTrue("isCompleted", request.isCompleted());
+        assertFalse("isFailed", request.isFailed());
+        assertFalse("isCancelled", request.isCancelled());
+
+        assertTrue("handleCompleted", flags[0]);
+        assertTrue("handleSuccess", flags[1]);
+        assertFalse("handleFailure", flags[2]);
+        assertFalse("handleCancel", flags[3]);
+    }
+
+    /**
+     * Test calling waitForStart() after the request has ended. It should not
+     * block.
+     */
+    @Test
+    public void testWaitForStartAfterDone() throws InterruptedException {
+        final boolean[] flags = new boolean[4];
+        TmfEventRequest request = setupTestRequest(flags);
+
+        request.start();
+        request.done();
+        request.waitForStart();
+
+        assertTrue("isCompleted", request.isCompleted());
+        assertFalse("isFailed", request.isFailed());
+        assertFalse("isCancelled", request.isCancelled());
+
+        assertTrue("handleCompleted", flags[0]);
+        assertTrue("handleSuccess", flags[1]);
+        assertFalse("handleFailure", flags[2]);
+        assertFalse("handleCancel", flags[3]);
+    }
+
+    /**
+     * Test calling waitForStart() after the request has beend cancelled. It
+     * should not block.
+     */
+    @Test
+    public void testWaitForStartAfterCancel() throws InterruptedException {
+        final boolean[] flags = new boolean[4];
+        TmfEventRequest request = setupTestRequest(flags);
+
+        request.start();
+        request.cancel();
+        request.waitForStart();
+
+        assertTrue("isCompleted", request.isCompleted());
+        assertFalse("isFailed", request.isFailed());
+        assertTrue("isCancelled", request.isCancelled());
+
+        assertTrue("handleCompleted", flags[0]);
+        assertFalse("handleSuccess", flags[1]);
+        assertFalse("handleFailure", flags[2]);
+        assertTrue("handleCancel", flags[3]);
+    }
+
+    /**
+     * Test calling waitForStart() before the request is started. It should not
+     * block.
+     */
+    @Test
+    public void testWaitForStartBeforeStart() throws InterruptedException {
+        final boolean[] flags = new boolean[4];
+        TmfEventRequest request = setupTestRequest(flags);
+        Thread t = new Thread() {
+            @Override
+            public void run() {
+                try {
+                    request.waitForStart();
+                } catch (InterruptedException e) {
+                    // nothing
+                }
+            }
+        };
+        t.setPriority(Thread.MAX_PRIORITY);
+        t.start();
+        request.start();
+        t.join();
+        request.done();
+
+        assertTrue("isCompleted", request.isCompleted());
+        assertFalse("isFailed", request.isFailed());
+        assertFalse("isCancelled", request.isCancelled());
+
+        assertTrue("handleCompleted", flags[0]);
+        assertTrue("handleSuccess", flags[1]);
+        assertFalse("handleFailure", flags[2]);
+        assertFalse("handleCancel", flags[3]);
+    }
+
 }
This page took 0.029786 seconds and 5 git commands to generate.