/******************************************************************************* * Copyright (c) 2012, 2014 Ericsson * * 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 * * Contributors: * Matthew Khouzam - Initial implementation * Alexandre Montplaisir * Patrick Tasse - Updated for removal of context clone *******************************************************************************/ package org.eclipse.tracecompass.tmf.ctf.core.tests.context; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.util.ArrayList; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.tracecompass.testtraces.ctf.CtfTestTrace; import org.eclipse.tracecompass.tmf.ctf.core.context.CtfTmfContext; import org.eclipse.tracecompass.tmf.ctf.core.tests.shared.CtfTmfTestTraceUtils; import org.eclipse.tracecompass.tmf.ctf.core.trace.CtfTmfTrace; import org.junit.After; import org.junit.Before; import org.junit.Test; /** * Tests for the CtfTmfLightweightContext class * * @author Matthew Khouzam * @version 1.1 */ public class CtfTmfContextTest { private static final @NonNull CtfTestTrace testTrace = CtfTestTrace.KERNEL; private static final long begin = 1332170682440133097L; /* * Trace start time */ private static final long end = 1332170692664579801L; /* Trace end time */ private CtfTmfTrace trace; private class SeekerThread extends Thread { long val; public void setVal(long val) { this.val = val; } } /** * Pre-test initialization */ @Before public void setUp() { trace = CtfTmfTestTraceUtils.getTrace(testTrace); } /** * Post-test clean-up. */ @After public void tearDown() { if (trace != null) { trace.dispose(); } } /** * Index all the events in the test trace. */ @Test public void testIndexing() { CtfTmfContext context = new CtfTmfContext(trace); context.seek(0); int count = 0; while (trace.getNext(context) != null) { count++; } assertTrue(count > 0); } /** * Context fuzzer. Use an amount of contexts greater than the size of the * iterator cache and have them access the trace in parallel. * * @throws InterruptedException * Would fail the test */ @Test public void testTooManyContexts() throws InterruptedException { final int lwcCount = 101; double increment = (end - begin) / lwcCount; final ArrayList<Long> vals = new ArrayList<>(); final ArrayList<Thread> threads = new ArrayList<>(); double time = begin; for (int i = 0; i < lwcCount; i++) { SeekerThread thread = new SeekerThread() { @Override public void run() { CtfTmfContext lwc = new CtfTmfContext(trace); lwc.seek(val); trace.getNext(lwc); synchronized (trace) { if (lwc.getCurrentEvent() != null) { vals.add(lwc.getCurrentEvent().getTimestamp().getValue()); } } } }; thread.setVal((long) time); threads.add(thread); thread.start(); time += increment; } for (Thread t : threads) { t.join(); } assertEquals("seeks done ", lwcCount, vals.size()); for (long val : vals) { assertTrue("val >= begin, " + val + " " + begin, val >= begin); assertTrue("val >= end, " + val + " " + end, val <= end); } } }