/******************************************************************************* * Copyright (c) 2016 École Polytechnique de Montréal * * All rights reserved. This program and the accompanying materials are * made available under the terms of the Eclipse Public License v1.0 which * accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html *******************************************************************************/ package org.eclipse.tracecompass.tmf.core.tests.request; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.io.File; import java.io.IOException; import java.net.URISyntaxException; import java.net.URL; import java.util.concurrent.TimeUnit; import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.Path; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.tracecompass.internal.tmf.core.request.TmfCoalescedEventRequest; import org.eclipse.tracecompass.tmf.core.event.ITmfEvent; import org.eclipse.tracecompass.tmf.core.exceptions.TmfTraceException; import org.eclipse.tracecompass.tmf.core.request.ITmfEventRequest.ExecutionType; import org.eclipse.tracecompass.tmf.core.request.TmfEventRequest; import org.eclipse.tracecompass.tmf.core.tests.TmfCoreTestPlugin; import org.eclipse.tracecompass.tmf.core.tests.shared.TmfTestTrace; import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimeRange; import org.eclipse.tracecompass.tmf.core.trace.TmfTrace; import org.eclipse.tracecompass.tmf.tests.stubs.request.TmfEventRequestStub; import org.eclipse.tracecompass.tmf.tests.stubs.trace.TmfTraceStub; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TestRule; import org.junit.rules.Timeout; /** * Test how requests behave * * @author Geneviève Bastien */ public class TmfEventRequestIntegrationTest { /** * The test should timeout after a few seconds, that would mean a deadlock * may have hapened */ @Rule public TestRule globalTimeout = new Timeout(120, TimeUnit.SECONDS); private static final TmfTestTrace TEST_TRACE = TmfTestTrace.A_TEST_10K; // Initialize the test trace private TmfTraceStub fTrace = null; private synchronized TmfTraceStub setupTrace(String path) { if (fTrace == null) { try { URL location = FileLocator.find(TmfCoreTestPlugin.getDefault().getBundle(), new Path(path), null); File test = new File(FileLocator.toFileURL(location).toURI()); fTrace = new TmfTraceStub(test.getPath(), 500, false, null); } catch (TmfTraceException e) { e.printStackTrace(); } catch (URISyntaxException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } return fTrace; } /** * Test the behavior of a failed request * * @throws InterruptedException * The test timed out */ @Test public void testSingleRequestException() throws InterruptedException { TmfTrace trace = setupTrace(TEST_TRACE.getFullPath()); TmfEventRequest requestFail = new TmfEventRequestStub(ITmfEvent.class, TmfTimeRange.ETERNITY, 2, 0, ExecutionType.BACKGROUND, 0) { @Override public void handleData(@NonNull ITmfEvent data) { throw new IllegalArgumentException(); } }; trace.sendRequest(requestFail); requestFail.waitForCompletion(); assertTrue(requestFail.isCompleted()); assertFalse(requestFail.isCancelled()); assertTrue(requestFail.isFailed()); } /** * Test the behavior of multiple coalesced requests when one fails * * @throws InterruptedException * The test timed out */ @Test public void testRequestException() throws InterruptedException { TmfTrace trace = setupTrace(TEST_TRACE.getFullPath()); TmfCoalescedEventRequest allRequests = new TmfCoalescedEventRequest(ITmfEvent.class, TmfTimeRange.ETERNITY, 2, 0, ExecutionType.BACKGROUND, 0); TmfEventRequest requestOk = new TmfEventRequestStub(ITmfEvent.class, TmfTimeRange.ETERNITY, 2, 0, ExecutionType.BACKGROUND, 0); requestOk.setProviderFilter(trace); allRequests.addRequest(requestOk); TmfEventRequest requestFail = new TmfEventRequestStub(ITmfEvent.class, TmfTimeRange.ETERNITY, 2, 0, ExecutionType.BACKGROUND, 0) { @Override public void handleData(@NonNull ITmfEvent data) { throw new IllegalArgumentException(); } }; requestFail.setProviderFilter(trace); allRequests.addRequest(requestFail); trace.sendRequest(allRequests); requestOk.waitForCompletion(); requestFail.waitForCompletion(); assertTrue(requestOk.isCompleted()); assertFalse(requestOk.isCancelled()); assertFalse(requestOk.isFailed()); assertTrue(requestFail.isCompleted()); assertFalse(requestFail.isCancelled()); assertTrue(requestFail.isFailed()); } }