From d18dd09b936089bbea9818e2e21108f9d98b8d76 Mon Sep 17 00:00:00 2001 From: Alvaro Sanchez-Leon Date: Mon, 31 May 2010 19:25:38 +0000 Subject: [PATCH] --- org.eclipse.linuxtools.tmf.tests/.classpath | 8 + org.eclipse.linuxtools.tmf.tests/.project | 28 + .../META-INF/MANIFEST.MF | 13 + .../build.properties | 8 + .../plugin.properties | 3 + .../linuxtools/tmf/tests/AllTmfCoreTests.java | 38 + .../tmf/tests/TmfCorePluginTest.java | 67 ++ .../tmf/tests/TmfCoreTestPlugin.java | 80 ++ .../tmf/tests/component/AllTests.java | 17 + .../tests/component/TmfEventProviderTest.java | 217 ++++++ .../component/TmfProviderManagerTest.java | 321 ++++++++ .../linuxtools/tmf/tests/event/AllTests.java | 26 + .../tmf/tests/event/TmfEventContentTest.java | 282 +++++++ .../tmf/tests/event/TmfEventFieldTest.java | 200 +++++ .../tests/event/TmfEventReferenceTest.java | 150 ++++ .../tmf/tests/event/TmfEventSourceTest.java | 144 ++++ .../tmf/tests/event/TmfEventTest.java | 203 +++++ .../tmf/tests/event/TmfEventTypeTest.java | 203 +++++ .../tmf/tests/event/TmfTimeRangeTest.java | 222 ++++++ .../tmf/tests/event/TmfTimestampTest.java | 420 +++++++++++ .../tmf/tests/event/TmfTraceEventTest.java | 135 ++++ .../tmf/tests/experiment/AllTests.java | 19 + .../tests/experiment/TmfExperimentTest.java | 657 ++++++++++++++++ .../TmfMultiTraceExperimentTest.java | 639 ++++++++++++++++ .../tmf/tests/request/AllTests.java | 22 + .../request/TmfCoalescedDataRequestTest.java | 412 +++++++++++ .../request/TmfCoalescedEventRequestTest.java | 620 ++++++++++++++++ .../tmf/tests/request/TmfDataRequestTest.java | 317 ++++++++ .../tests/request/TmfEventRequestTest.java | 337 +++++++++ .../tests/request/TmfRequestExecutorTest.java | 116 +++ .../linuxtools/tmf/tests/trace/AllTests.java | 21 + .../tmf/tests/trace/TmfCheckpointTest.java | 182 +++++ .../tmf/tests/trace/TmfContextTest.java | 236 ++++++ .../tmf/tests/trace/TmfExperimentTest.java | 657 ++++++++++++++++ .../tmf/tests/trace/TmfLocationTest.java | 262 +++++++ .../tmf/tests/trace/TmfTraceTest.java | 699 ++++++++++++++++++ .../linuxtools/tmf/CreateTestFiles.java | 111 +++ .../tmf/component/TmfClientStub.java | 41 + .../tmf/component/TmfDataProviderStub.java | 79 ++ .../tmf/component/TmfEventProviderStub.java | 80 ++ .../TmfSyntheticEventProviderStub.java | 80 ++ .../tmf/event/TmfEventContentStub.java | 59 ++ .../tmf/event/TmfEventTypeStub.java | 28 + .../tmf/event/TmfSyntheticEventStub.java | 30 + .../tmf/request/TmfDataRequestStub.java | 60 ++ .../tmf/request/TmfEventRequestStub.java | 60 ++ .../tmf/trace/TmfEventParserStub.java | 116 +++ .../linuxtools/tmf/trace/TmfTraceStub.java | 193 +++++ org.eclipse.linuxtools.tmf.tests/test.xml | 77 ++ .../testfiles/A-Test-10K | Bin 0 -> 643257 bytes .../testfiles/E-Test-10K | Bin 0 -> 643257 bytes .../testfiles/O-Test-10K | Bin 0 -> 643257 bytes .../testfiles/R-Test-10K | Bin 0 -> 643257 bytes 53 files changed, 8995 insertions(+) create mode 100644 org.eclipse.linuxtools.tmf.tests/.classpath create mode 100644 org.eclipse.linuxtools.tmf.tests/.project create mode 100644 org.eclipse.linuxtools.tmf.tests/META-INF/MANIFEST.MF create mode 100644 org.eclipse.linuxtools.tmf.tests/build.properties create mode 100644 org.eclipse.linuxtools.tmf.tests/plugin.properties create mode 100644 org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/AllTmfCoreTests.java create mode 100644 org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/TmfCorePluginTest.java create mode 100644 org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/TmfCoreTestPlugin.java create mode 100644 org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/component/AllTests.java create mode 100644 org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/component/TmfEventProviderTest.java create mode 100644 org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/component/TmfProviderManagerTest.java create mode 100644 org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/event/AllTests.java create mode 100644 org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/event/TmfEventContentTest.java create mode 100644 org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/event/TmfEventFieldTest.java create mode 100644 org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/event/TmfEventReferenceTest.java create mode 100644 org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/event/TmfEventSourceTest.java create mode 100644 org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/event/TmfEventTest.java create mode 100644 org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/event/TmfEventTypeTest.java create mode 100644 org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/event/TmfTimeRangeTest.java create mode 100644 org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/event/TmfTimestampTest.java create mode 100644 org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/event/TmfTraceEventTest.java create mode 100644 org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/experiment/AllTests.java create mode 100644 org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/experiment/TmfExperimentTest.java create mode 100644 org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/experiment/TmfMultiTraceExperimentTest.java create mode 100644 org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/request/AllTests.java create mode 100644 org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/request/TmfCoalescedDataRequestTest.java create mode 100644 org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/request/TmfCoalescedEventRequestTest.java create mode 100644 org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/request/TmfDataRequestTest.java create mode 100644 org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/request/TmfEventRequestTest.java create mode 100644 org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/request/TmfRequestExecutorTest.java create mode 100644 org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/trace/AllTests.java create mode 100644 org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/trace/TmfCheckpointTest.java create mode 100644 org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/trace/TmfContextTest.java create mode 100644 org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/trace/TmfExperimentTest.java create mode 100644 org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/trace/TmfLocationTest.java create mode 100644 org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/trace/TmfTraceTest.java create mode 100644 org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/CreateTestFiles.java create mode 100644 org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/component/TmfClientStub.java create mode 100644 org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/component/TmfDataProviderStub.java create mode 100644 org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/component/TmfEventProviderStub.java create mode 100644 org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/component/TmfSyntheticEventProviderStub.java create mode 100644 org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/event/TmfEventContentStub.java create mode 100644 org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/event/TmfEventTypeStub.java create mode 100644 org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/event/TmfSyntheticEventStub.java create mode 100644 org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/request/TmfDataRequestStub.java create mode 100644 org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/request/TmfEventRequestStub.java create mode 100644 org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/trace/TmfEventParserStub.java create mode 100644 org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/trace/TmfTraceStub.java create mode 100644 org.eclipse.linuxtools.tmf.tests/test.xml create mode 100644 org.eclipse.linuxtools.tmf.tests/testfiles/A-Test-10K create mode 100644 org.eclipse.linuxtools.tmf.tests/testfiles/E-Test-10K create mode 100644 org.eclipse.linuxtools.tmf.tests/testfiles/O-Test-10K create mode 100644 org.eclipse.linuxtools.tmf.tests/testfiles/R-Test-10K diff --git a/org.eclipse.linuxtools.tmf.tests/.classpath b/org.eclipse.linuxtools.tmf.tests/.classpath new file mode 100644 index 0000000000..978c0d27e1 --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/org.eclipse.linuxtools.tmf.tests/.project b/org.eclipse.linuxtools.tmf.tests/.project new file mode 100644 index 0000000000..358841c15b --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/.project @@ -0,0 +1,28 @@ + + + org.eclipse.linuxtools.tmf.tests + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/org.eclipse.linuxtools.tmf.tests/META-INF/MANIFEST.MF b/org.eclipse.linuxtools.tmf.tests/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..71deded112 --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/META-INF/MANIFEST.MF @@ -0,0 +1,13 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: %Bundle-Name +Bundle-SymbolicName: org.eclipse.linuxtools.tmf.tests +Bundle-Version: 0.2.0.qualifier +Bundle-RequiredExecutionEnvironment: J2SE-1.5 +Bundle-Vendor: %Bundle-Vendor +Require-Bundle: org.junit;bundle-version="3.8.2", + org.eclipse.linuxtools.tmf;bundle-version="0.2.0", + org.eclipse.core.runtime;bundle-version="3.5.0" +Bundle-Localization: plugin +Bundle-ActivationPolicy: lazy +Bundle-Activator: org.eclipse.linuxtools.tmf.tests.TmfCoreTestPlugin diff --git a/org.eclipse.linuxtools.tmf.tests/build.properties b/org.eclipse.linuxtools.tmf.tests/build.properties new file mode 100644 index 0000000000..686ec8fb3f --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/build.properties @@ -0,0 +1,8 @@ +source.. = stubs/,\ + src/ +output.. = bin/ +bin.includes = META-INF/,\ + .,\ + plugin.properties,\ + test.xml,\ + testfiles/ diff --git a/org.eclipse.linuxtools.tmf.tests/plugin.properties b/org.eclipse.linuxtools.tmf.tests/plugin.properties new file mode 100644 index 0000000000..bd94dbddb5 --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/plugin.properties @@ -0,0 +1,3 @@ +#Properties file for org.eclipse.linuxtools.tmf.tests +Bundle-Vendor = Eclipse Linux Tools +Bundle-Name = Tracing and Monitoring Framework (TMF) Core Unit Test Suite \ No newline at end of file diff --git a/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/AllTmfCoreTests.java b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/AllTmfCoreTests.java new file mode 100644 index 0000000000..d6f4d82cf0 --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/AllTmfCoreTests.java @@ -0,0 +1,38 @@ +/******************************************************************************* + * Copyright (c) 2009, 2010 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: + * Francois Chouinard - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.linuxtools.tmf.tests; + +import junit.framework.Test; +import junit.framework.TestSuite; + +/** + * AllTmfCoreTests + *

+ * Master test suite for TMF Core. + */ +public class AllTmfCoreTests { + + public static Test suite() { + TestSuite suite = new TestSuite(AllTmfCoreTests.class.getName()); + //$JUnit-BEGIN$ + suite.addTestSuite(TmfCorePluginTest.class); + suite.addTest(org.eclipse.linuxtools.tmf.tests.event.AllTests.suite()); + suite.addTest(org.eclipse.linuxtools.tmf.tests.request.AllTests.suite()); + suite.addTest(org.eclipse.linuxtools.tmf.tests.component.AllTests.suite()); + suite.addTest(org.eclipse.linuxtools.tmf.tests.trace.AllTests.suite()); + suite.addTest(org.eclipse.linuxtools.tmf.tests.experiment.AllTests.suite()); + //$JUnit-END$ + return suite; + } + +} diff --git a/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/TmfCorePluginTest.java b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/TmfCorePluginTest.java new file mode 100644 index 0000000000..a07565545a --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/TmfCorePluginTest.java @@ -0,0 +1,67 @@ +/******************************************************************************* + * Copyright (c) 2009, 2010 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: + * Francois Chouinard - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.linuxtools.tmf.tests; + +import org.eclipse.linuxtools.tmf.TmfCorePlugin; + +import junit.framework.TestCase; + +/** + * TmfCorePluginTest + *

+ * Test the TMF core plug-in activator + */ +public class TmfCorePluginTest extends TestCase { + + // ------------------------------------------------------------------------ + // Attributes + // ------------------------------------------------------------------------ + + // Plug-in instantiation + static final TmfCorePlugin fPlugin = new TmfCorePlugin(); + + // ------------------------------------------------------------------------ + // Housekeping + // ------------------------------------------------------------------------ + + /** + * @param name the test name + */ + public TmfCorePluginTest(String name) { + super(name); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + } + + // ------------------------------------------------------------------------ + // Test cases + // ------------------------------------------------------------------------ + + public void testTmfCorePluginId() throws Exception { + assertEquals("Plugin ID", "org.eclipse.linuxtools.tmf", TmfCorePlugin.PLUGIN_ID); + } + + public void testGetDefault() throws Exception { + TmfCorePlugin plugin = TmfCorePlugin.getDefault(); + assertEquals("getDefault()", plugin, fPlugin); + } + +} diff --git a/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/TmfCoreTestPlugin.java b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/TmfCoreTestPlugin.java new file mode 100644 index 0000000000..3c60797663 --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/TmfCoreTestPlugin.java @@ -0,0 +1,80 @@ +/******************************************************************************* + * Copyright (c) 2009, 2010 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: + * Francois Chouinard - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.linuxtools.tmf.tests; + +import org.eclipse.core.runtime.Plugin; +import org.osgi.framework.BundleContext; + +/** + * TmfTestPlugin + *

+ * The activator class controls the plug-in life cycle + */ +public class TmfCoreTestPlugin extends Plugin { + + // ------------------------------------------------------------------------ + // Attributes + // ------------------------------------------------------------------------ + + // The plug-in ID + public static final String PLUGIN_ID = "org.eclipse.linuxtools.tmf.tests"; + + // The shared instance + private static TmfCoreTestPlugin fPlugin; + + // ------------------------------------------------------------------------ + // Constructors + // ------------------------------------------------------------------------ + + /** + * The constructor + */ + public TmfCoreTestPlugin() { + setDefault(this); + } + + // ------------------------------------------------------------------------ + // Accessors + // ------------------------------------------------------------------------ + + /** + * @return the shared instance + */ + public static TmfCoreTestPlugin getDefault() { + return fPlugin; + } + + /** + * @param plugin the shared instance + */ + private static void setDefault(TmfCoreTestPlugin plugin) { + fPlugin = plugin; + } + + // ------------------------------------------------------------------------ + // Operations + // ------------------------------------------------------------------------ + + @Override + public void start(BundleContext context) throws Exception { + super.start(context); + setDefault(this); + } + + @Override + public void stop(BundleContext context) throws Exception { + setDefault(null); + super.stop(context); + } + +} diff --git a/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/component/AllTests.java b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/component/AllTests.java new file mode 100644 index 0000000000..78a0532399 --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/component/AllTests.java @@ -0,0 +1,17 @@ +package org.eclipse.linuxtools.tmf.tests.component; + +import junit.framework.Test; +import junit.framework.TestSuite; + +public class AllTests { + + public static Test suite() { + TestSuite suite = new TestSuite(AllTests.class.getName()); + //$JUnit-BEGIN$ + suite.addTestSuite(TmfProviderManagerTest.class); + suite.addTestSuite(TmfEventProviderTest.class); + //$JUnit-END$ + return suite; + } + +} diff --git a/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/component/TmfEventProviderTest.java b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/component/TmfEventProviderTest.java new file mode 100644 index 0000000000..5acb7ae46a --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/component/TmfEventProviderTest.java @@ -0,0 +1,217 @@ +/******************************************************************************* + * Copyright (c) 2009, 2010 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: + * Francois Chouinard - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.linuxtools.tmf.tests.component; + +import java.io.IOException; +import java.util.Vector; + +import junit.framework.TestCase; + +import org.eclipse.linuxtools.tmf.component.ITmfDataProvider; +import org.eclipse.linuxtools.tmf.component.TmfEventProviderStub; +import org.eclipse.linuxtools.tmf.component.TmfProviderManager; +import org.eclipse.linuxtools.tmf.component.TmfSyntheticEventProviderStub; +import org.eclipse.linuxtools.tmf.event.TmfEvent; +import org.eclipse.linuxtools.tmf.event.TmfSyntheticEventStub; +import org.eclipse.linuxtools.tmf.event.TmfTimeRange; +import org.eclipse.linuxtools.tmf.event.TmfTimestamp; +import org.eclipse.linuxtools.tmf.request.TmfEventRequest; +import org.eclipse.linuxtools.tmf.trace.TmfTraceStub; + +/** + * TmfClientTest + *

+ * Test suite for the TmfEventProvider class. + */ +public class TmfEventProviderTest extends TestCase { + + TmfEventProviderStub fEventProvider; + TmfSyntheticEventProviderStub fSyntheticEventProvider; + + public TmfEventProviderTest(String name) throws IOException { + super(name); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + fEventProvider = new TmfEventProviderStub(); + fSyntheticEventProvider = new TmfSyntheticEventProviderStub(); + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + fEventProvider.dispose(); + fSyntheticEventProvider.dispose(); + } + + // ------------------------------------------------------------------------ + // getProviders (more a sanity check than a test) + // ------------------------------------------------------------------------ + + @SuppressWarnings("unchecked") + public void testGetProviders() { + + // There should be 2 TmfEvent providers: a TmfTraceStub and a TmfEventProviderStub + ITmfDataProvider[] eventProviders = (ITmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class); + assertEquals("getProviders", 2, eventProviders.length); + + eventProviders = (ITmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TmfTraceStub.class); + assertEquals("getProviders", 1, eventProviders.length); + + eventProviders = (ITmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TmfEventProviderStub.class); + assertEquals("getProviders", 1, eventProviders.length); + + // There should be 1 TmfSyntheticEventStub provider + eventProviders = (ITmfDataProvider[]) TmfProviderManager.getProviders(TmfSyntheticEventStub.class); + assertEquals("getProviders", 1, eventProviders.length); + } + + // ------------------------------------------------------------------------ + // getSyntheticEvent + // ------------------------------------------------------------------------ + + @SuppressWarnings("unchecked") + public void testGetPlainEvents() throws InterruptedException { + + final int BLOCK_SIZE = 100; + final int NB_EVENTS = 1000; + final Vector requestedEvents = new Vector(); + + // Get the TmfSyntheticEventStub provider + ITmfDataProvider[] eventProviders = (ITmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TmfEventProviderStub.class); + ITmfDataProvider provider = eventProviders[0]; + + TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch); + final TmfEventRequest request = + new TmfEventRequest(TmfEvent.class, range, NB_EVENTS, BLOCK_SIZE) { + @Override + public void handleData() { + TmfEvent[] events = getData(); + for (TmfEvent e : events) { + requestedEvents.add(e); + } + } + }; + provider.sendRequest(request); + request.waitForCompletion(); + + assertEquals("nbEvents", NB_EVENTS, requestedEvents.size()); + assertTrue("isCompleted", request.isCompleted()); + assertFalse("isCancelled", request.isCancelled()); + + // Make that we have distinct events. + // Don't go overboard: we are not validating the stub! + for (int i = 0; i < NB_EVENTS; i++) { + assertEquals("Distinct events", i+1, requestedEvents.get(i).getTimestamp().getValue()); + } + } + + @SuppressWarnings("unchecked") + private void getSyntheticData(final TmfTimeRange range, final int nbEvents, final int blockSize) throws InterruptedException { + + final Vector requestedEvents = new Vector(); + + // Get the event provider + ITmfDataProvider[] eventProviders = (ITmfDataProvider[]) TmfProviderManager.getProviders(TmfSyntheticEventStub.class); + ITmfDataProvider provider = eventProviders[0]; + + final TmfEventRequest request = + new TmfEventRequest(TmfSyntheticEventStub.class, range, nbEvents, blockSize) { + @Override + public void handleData() { + TmfSyntheticEventStub[] events = getData(); + for (TmfSyntheticEventStub e : events) { + requestedEvents.add(e); + } + } + }; + provider.sendRequest(request); + request.waitForCompletion(); + + if (nbEvents != -1) + assertEquals("nbEvents", nbEvents, requestedEvents.size()); + assertTrue("isCompleted", request.isCompleted()); + assertFalse("isCancelled", request.isCancelled()); + + // For each base event, the stub will queue 2 identical synthetic events + // Ensure that the events are queued properly. + // Don't go overboard: we are not validating the stub! + for (int i = 0; i < (nbEvents / 2); i++) { + assertEquals("Distinct events", i+1, requestedEvents.get(2 * i + 0).getTimestamp().getValue()); + assertEquals("Distinct events", i+1, requestedEvents.get(2 * i + 1).getTimestamp().getValue()); + } + } + + // The following tests are the same but for the size of the requested blocks + // with regards to the size of the TmfSyntheticEventProviderStub block + public void testGetSyntheticEvents_EqualBlockSizes() throws InterruptedException { + TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch); + getSyntheticData(range, 1000, TmfSyntheticEventProviderStub.BLOCK_SIZE); + } + + public void testGetSyntheticEvents_SmallerBlock() throws InterruptedException { + TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch); + getSyntheticData(range, 1000, TmfSyntheticEventProviderStub.BLOCK_SIZE / 2); + } + + public void testGetSyntheticEvents_LargerBlock() throws InterruptedException { + TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch); + getSyntheticData(range, 1000, TmfSyntheticEventProviderStub.BLOCK_SIZE * 2); + } + + public void testGetSyntheticEvents_TimeRange() throws InterruptedException { + TmfTimestamp start = new TmfTimestamp( 1, (byte) -3, 0); + TmfTimestamp end = new TmfTimestamp(1000, (byte) -3, 0); + TmfTimeRange range = new TmfTimeRange(start, end); + getSyntheticData(range, -1, TmfSyntheticEventProviderStub.BLOCK_SIZE); + } + + public void testGetSyntheticEvents_WeirdTimeRange1() throws InterruptedException { + TmfTimestamp start = TmfTimestamp.BigBang; + TmfTimestamp end = new TmfTimestamp(0, (byte) -3, 0); + TmfTimeRange range = new TmfTimeRange(start, end); + getSyntheticData(range, -1, TmfSyntheticEventProviderStub.BLOCK_SIZE); + } + + public void testGetSyntheticEvents_WeirdTimeRange2() throws InterruptedException { + TmfTimestamp start = new TmfTimestamp(0, (byte) -3, 0); + TmfTimestamp end = TmfTimestamp.BigCrunch; + TmfTimeRange range = new TmfTimeRange(start, end); + getSyntheticData(range, -1, TmfSyntheticEventProviderStub.BLOCK_SIZE); + } + + // ------------------------------------------------------------------------ + // getProviders (more a sanity check than a test) + // ------------------------------------------------------------------------ + + @SuppressWarnings("unchecked") + public void testGetProviders2() { + + // There should be 2 TmfEvent providers: a TmfTraceStub and a TmfEventProviderStub + ITmfDataProvider[] eventProviders = (ITmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class); + assertEquals("getProviders", 2, eventProviders.length); + + eventProviders = (ITmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TmfTraceStub.class); + assertEquals("getProviders", 1, eventProviders.length); + + eventProviders = (ITmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TmfEventProviderStub.class); + assertEquals("getProviders", 1, eventProviders.length); + + // There should be 1 TmfSyntheticEventStub provider + eventProviders = (ITmfDataProvider[]) TmfProviderManager.getProviders(TmfSyntheticEventStub.class); + assertEquals("getProviders", 1, eventProviders.length); + } + +} diff --git a/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/component/TmfProviderManagerTest.java b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/component/TmfProviderManagerTest.java new file mode 100644 index 0000000000..1b9e7e2c0c --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/component/TmfProviderManagerTest.java @@ -0,0 +1,321 @@ +/******************************************************************************* + * Copyright (c) 2009, 2010 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: + * Francois Chouinard - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.linuxtools.tmf.tests.component; + +import junit.framework.TestCase; + +import org.eclipse.linuxtools.tmf.component.TmfDataProvider; +import org.eclipse.linuxtools.tmf.component.TmfProviderManager; +import org.eclipse.linuxtools.tmf.event.TmfEvent; +import org.eclipse.linuxtools.tmf.request.ITmfDataRequest; +import org.eclipse.linuxtools.tmf.trace.ITmfContext; + +/** + * TmfProviderManagerTest + *

+ * Test suite for the TmfProviderManager class. + */ +public class TmfProviderManagerTest extends TestCase { + + public TmfProviderManagerTest(String name) { + super(name); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + } + + // ------------------------------------------------------------------------ + // Dummy Providers + // ------------------------------------------------------------------------ + + public class TestProvider1 extends TmfDataProvider { + public TestProvider1(Class type) { + super("TestProvider1", type); + } + @Override + public ITmfContext armRequest(ITmfDataRequest request) { + return null; + } + @Override + public TmfEvent getNext(ITmfContext context) { + return null; + } + @Override + public boolean isCompleted(ITmfDataRequest request, TmfEvent data, int nbRead) { + return false; + } + } + + public class TestProvider2 extends TmfDataProvider { + public TestProvider2(Class type) { + super("TestProvider2", type); + } + @Override + public ITmfContext armRequest(ITmfDataRequest request) { + return null; + } + @Override + public TmfEvent getNext(ITmfContext context) { + return null; + } + @Override + public boolean isCompleted(ITmfDataRequest request, TmfEvent data, int nbRead) { + return false; + } + } + + public class TmfEvent3 extends TmfEvent { + public TmfEvent3(TmfEvent3 other) { + super(other); + } + } + + public class TestProvider3 extends TmfDataProvider { + public TestProvider3(Class type) { + super("TestProvider3", type); + } + @Override + public ITmfContext armRequest(ITmfDataRequest request) { + return null; + } + @Override + public TmfEvent3 getNext(ITmfContext context) { + return null; + } + @Override + public boolean isCompleted(ITmfDataRequest request, TmfEvent3 data, int nbRead) { + return false; + } + } + + // ------------------------------------------------------------------------ + // register/dispose + // ------------------------------------------------------------------------ + + @SuppressWarnings("unchecked") + public void testRegister_0() { + TmfDataProvider[] providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class); + assertEquals("getProviders", 0, providers.length); + + providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class); + assertEquals("getProviders", 0, providers.length); + } + + @SuppressWarnings("unchecked") + public void testRegister_Unregister_1() { + + // Register a single provider + TestProvider1 testProvider1 = new TestProvider1(TmfEvent.class); + + TmfDataProvider[] providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class); + assertEquals("getProviders", 1, providers.length); + assertEquals("getProviders", testProvider1, providers[0]); + + providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class); + assertEquals("getProviders", 1, providers.length); + assertEquals("getProviders", testProvider1, providers[0]); + + // Unregister it + testProvider1.dispose(); + + providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class); + assertEquals("getProviders", 0, providers.length); + + providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class); + assertEquals("getProviders", 0, providers.length); + } + + @SuppressWarnings("unchecked") + public void testRegister_Unregister_2() { + + // Register 2 providers, same data type + TestProvider1 testProvider1 = new TestProvider1(TmfEvent.class); + TestProvider2 testProvider2 = new TestProvider2(TmfEvent.class); + + TmfDataProvider[] providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class); + assertEquals("getProviders", 2, providers.length); + assertTrue(providers.length == 2); + if (providers[0] == testProvider1) { + assertEquals("getProviders", testProvider2, providers[1]); + } + else { + assertEquals("getProviders", testProvider2, providers[0]); + assertEquals("getProviders", testProvider1, providers[1]); + } + + providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class); + assertEquals("getProviders", 1, providers.length); + assertEquals("getProviders", testProvider1, providers[0]); + + providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider2.class); + assertEquals("getProviders", 1, providers.length); + assertEquals("getProviders", testProvider2, providers[0]); + + // Remove one + testProvider1.dispose(); + + providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class); + assertEquals("getProviders", 1, providers.length); + assertEquals("getProviders", testProvider2, providers[0]); + + providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class); + assertEquals("getProviders", 0, providers.length); + + providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider2.class); + assertEquals("getProviders", 1, providers.length); + assertEquals("getProviders", testProvider2, providers[0]); + + // Remove the other + testProvider2.dispose(); + + providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class); + assertEquals("getProviders", 0, providers.length); + + providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class); + assertEquals("getProviders", 0, providers.length); + + providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider2.class); + assertEquals("getProviders", 0, providers.length); + } + + @SuppressWarnings("unchecked") + public void testRegister_Unregister_3() { + + // Register 3 providers, mixed data types + TestProvider1 testProvider1 = new TestProvider1(TmfEvent.class); + TestProvider2 testProvider2 = new TestProvider2(TmfEvent.class); + TestProvider3 testProvider3 = new TestProvider3(TmfEvent3.class); + + TmfDataProvider[] providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class); + assertEquals("getProviders", 2, providers.length); + if (providers[0] == testProvider1) { + assertEquals("getProviders", testProvider2, providers[1]); + } + else { + assertEquals("getProviders", testProvider2, providers[0]); + assertEquals("getProviders", testProvider1, providers[1]); + } + + TmfDataProvider[] providers3 = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent3.class); + assertEquals("getProviders", 1, providers3.length); + assertEquals("getProviders", testProvider3, providers3[0]); + + providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class); + assertEquals("getProviders", 1, providers.length); + assertEquals("getProviders", testProvider1, providers[0]); + + providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider2.class); + assertEquals("getProviders", 1, providers.length); + assertEquals("getProviders", testProvider2, providers[0]); + + providers3 = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent3.class, TestProvider3.class); + assertEquals("getProviders", 1, providers3.length); + assertEquals("getProviders", testProvider3, providers3[0]); + + // Remove one + testProvider1.dispose(); + + providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class); + assertEquals("getProviders", 1, providers.length); + assertEquals("getProviders", testProvider2, providers[0]); + + providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class); + assertEquals("getProviders", 0, providers.length); + + providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider2.class); + assertEquals("getProviders", 1, providers.length); + assertEquals("getProviders", testProvider2, providers[0]); + + providers3 = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent3.class); + assertEquals("getProviders", 1, providers3.length); + assertEquals("getProviders", testProvider3, providers3[0]); + + providers3 = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent3.class, TestProvider3.class); + assertEquals("getProviders", 1, providers3.length); + assertEquals("getProviders", testProvider3, providers3[0]); + + // Remove another one + testProvider2.dispose(); + + providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class); + assertEquals("getProviders", 0, providers.length); + + providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class); + assertEquals("getProviders", 0, providers.length); + + providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider2.class); + assertEquals("getProviders", 0, providers.length); + + providers3 = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent3.class); + assertTrue(providers3.length == 1); + assertTrue(providers3[0] == testProvider3); + + providers3 = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent3.class, TestProvider3.class); + assertEquals("getProviders", 1, providers3.length); + assertEquals("getProviders", testProvider3, providers3[0]); + + // Remove the last one + testProvider3.dispose(); + + providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class); + assertEquals("getProviders", 0, providers.length); + + providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider1.class); + assertEquals("getProviders", 0, providers.length); + + providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TestProvider2.class); + assertEquals("getProviders", 0, providers.length); + + providers3 = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent3.class); + assertEquals("getProviders", 0, providers.length); + + providers3 = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent3.class, TestProvider3.class); + assertEquals("getProviders", 0, providers.length); + } + + @SuppressWarnings("unchecked") + public void testGetProvider() { + + // Register 3 providers, mixed data types + TestProvider1 testProvider1 = new TestProvider1(TmfEvent.class); + TestProvider2 testProvider2 = new TestProvider2(TmfEvent.class); + TestProvider3 testProvider3 = new TestProvider3(TmfEvent3.class); + + TmfDataProvider[] providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, null); + assertEquals("getProviders", 2, providers.length); + if (providers[0] == testProvider1) { + assertEquals("getProviders", testProvider2, providers[1]); + } + else { + assertEquals("getProviders", testProvider2, providers[0]); + assertEquals("getProviders", testProvider1, providers[1]); + } + + providers = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent3.class, null); + assertEquals("getProviders", 1, providers.length); + assertEquals("getProviders", testProvider3, providers[0]); + + // Remove the providers + testProvider1.dispose(); + testProvider2.dispose(); + testProvider3.dispose(); + } + +} \ No newline at end of file diff --git a/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/event/AllTests.java b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/event/AllTests.java new file mode 100644 index 0000000000..c298219812 --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/event/AllTests.java @@ -0,0 +1,26 @@ +package org.eclipse.linuxtools.tmf.tests.event; + +import junit.framework.Test; +import junit.framework.TestSuite; + +import org.eclipse.linuxtools.tmf.TmfCorePlugin; + +public class AllTests { + + public static Test suite() { + TestSuite suite = new TestSuite("Test suite for " + TmfCorePlugin.PLUGIN_ID + ".event"); //$NON-NLS-1$); + //$JUnit-BEGIN$ + suite.addTestSuite(TmfEventFieldTest.class); + suite.addTestSuite(TmfEventContentTest.class); + suite.addTestSuite(TmfEventTypeTest.class); + suite.addTestSuite(TmfEventSourceTest.class); + suite.addTestSuite(TmfTraceEventTest.class); + suite.addTestSuite(TmfEventReferenceTest.class); + suite.addTestSuite(TmfTimestampTest.class); + suite.addTestSuite(TmfTimeRangeTest.class); + suite.addTestSuite(TmfEventTest.class); + //$JUnit-END$ + return suite; + } + +} diff --git a/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/event/TmfEventContentTest.java b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/event/TmfEventContentTest.java new file mode 100644 index 0000000000..da1de6294c --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/event/TmfEventContentTest.java @@ -0,0 +1,282 @@ +/******************************************************************************* + * Copyright (c) 2009 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: + * Francois Chouinard - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.linuxtools.tmf.tests.event; + +import org.eclipse.linuxtools.tmf.event.TmfEvent; +import org.eclipse.linuxtools.tmf.event.TmfEventContent; +import org.eclipse.linuxtools.tmf.event.TmfEventContentStub; +import org.eclipse.linuxtools.tmf.event.TmfEventReference; +import org.eclipse.linuxtools.tmf.event.TmfEventSource; +import org.eclipse.linuxtools.tmf.event.TmfEventType; +import org.eclipse.linuxtools.tmf.event.TmfEventTypeStub; +import org.eclipse.linuxtools.tmf.event.TmfNoSuchFieldException; +import org.eclipse.linuxtools.tmf.event.TmfTimestamp; + +import junit.framework.TestCase; + +/** + * TmfEventContentTest + *

+ * Test suite for the TmfEventContent class. + */ +public class TmfEventContentTest extends TestCase { + + // ------------------------------------------------------------------------ + // Variables + // ------------------------------------------------------------------------ + + private final TmfTimestamp fTimestamp; + private final TmfEventSource fEventSource; + private final TmfEventType fEventType; + private final TmfEventTypeStub fEventTypeStub; + private final TmfEventReference fReference; + private final TmfEvent fEvent; + private final TmfEvent fEventStub; + + private final Object fRawContent0 = new String("Some content"); + private final Object fRawContent1 = new String("Some other content"); + + private final TmfEventContent fBasicContent0; + private final TmfEventContent fBasicContent1; + private final TmfEventContent fBasicContent2; + private final TmfEventContentStub fStubContent; + + // ------------------------------------------------------------------------ + // Housekeeping + // ------------------------------------------------------------------------ + + /** + * @param name the test name + */ + public TmfEventContentTest(String name) { + super(name); + fTimestamp = new TmfTimestamp(); + fEventSource = new TmfEventSource(); + fEventType = new TmfEventType(); + fEventTypeStub = new TmfEventTypeStub(); + fReference = new TmfEventReference(); + + fEvent = new TmfEvent(fTimestamp, fEventSource, fEventType, fReference); + fBasicContent0 = new TmfEventContent(fEvent, fRawContent0); + fBasicContent1 = new TmfEventContent(fEvent, fRawContent0); + fBasicContent2 = new TmfEventContent(fEvent, fRawContent0); + + fEventStub = new TmfEvent(fTimestamp, fEventSource, fEventTypeStub, fReference); + fStubContent = new TmfEventContentStub(fEventStub, fRawContent1); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + } + + // ------------------------------------------------------------------------ + // Constructors + // ------------------------------------------------------------------------ + + public void testTmfEventContent() { + assertSame("getLabels", fEvent, fBasicContent0.getEvent()); + assertEquals("getType", fEventType, fBasicContent0.getType()); + assertEquals("getContent", fRawContent0, fBasicContent0.getContent()); + } + + public void testTmfEventContentCopy() { + TmfEventContent content = new TmfEventContent(fBasicContent0); + assertSame("getLabels", fEvent, content.getEvent()); + assertEquals("getType", fEventType, content.getType()); + assertEquals("getContent", fRawContent0, content.getContent()); + } + + public void testTmfEventContentCopy2() { + try { + new TmfEventContent(null); + fail("null copy"); + } + catch (IllegalArgumentException e) { + // Success + } + } + + // ------------------------------------------------------------------------ + // equals + // ------------------------------------------------------------------------ + + public void testEqualsReflexivity() throws Exception { + @SuppressWarnings("unused") + Object[] fields1 = fBasicContent0.getFields(); + @SuppressWarnings("unused") + Object[] fields2 = fStubContent.getFields(); + + assertTrue("equals", fBasicContent0.equals(fBasicContent0)); + assertTrue("equals", fStubContent.equals(fStubContent)); + + assertTrue("equals", !fBasicContent0.equals(fStubContent)); + assertTrue("equals", !fStubContent.equals(fBasicContent0)); + } + + public void testEqualsSymmetry() throws Exception { + assertTrue("equals", fBasicContent0.equals(fBasicContent2)); + assertTrue("equals", fBasicContent2.equals(fBasicContent0)); + + assertTrue("equals", !fBasicContent0.equals(fStubContent)); + assertTrue("equals", !fStubContent.equals(fBasicContent0)); + } + + public void testEqualsTransivity() throws Exception { + assertTrue("equals", fBasicContent0.equals(fBasicContent1)); + assertTrue("equals", fBasicContent1.equals(fBasicContent2)); + assertTrue("equals", fBasicContent0.equals(fBasicContent2)); + } + + public void testEqualsNull() throws Exception { + assertTrue("equals", !fBasicContent0.equals(null)); + assertTrue("equals", !fStubContent.equals(null)); + } + + // ------------------------------------------------------------------------ + // hashCode + // ------------------------------------------------------------------------ + + public void testHashCode() throws Exception { + assertTrue("hashCode", fBasicContent0.hashCode() == fBasicContent2.hashCode()); + assertTrue("hashCode", fBasicContent0.hashCode() != fStubContent.hashCode()); + } + + public void testHashCode2() throws Exception { + TmfEventContent basicContent0 = new TmfEventContent(null, fRawContent0); + TmfEventContent basicContent1 = new TmfEventContent(fEvent, null); + TmfEventContent basicContent2 = new TmfEventContent(null, null); + + assertTrue("hashCode", fBasicContent0.hashCode() != basicContent0.hashCode()); + assertTrue("hashCode", fBasicContent0.hashCode() != basicContent1.hashCode()); + assertTrue("hashCode", fBasicContent0.hashCode() != basicContent2.hashCode()); + + assertTrue("hashCode", basicContent0.hashCode() != basicContent1.hashCode()); + assertTrue("hashCode", basicContent0.hashCode() != basicContent2.hashCode()); + + assertTrue("hashCode", basicContent1.hashCode() != basicContent2.hashCode()); + } + + // ------------------------------------------------------------------------ + // toString + // ------------------------------------------------------------------------ + + public void testToString() { + String expected = "[TmfEventContent(" + fRawContent0 + ")]"; + TmfEventContent content = new TmfEventContent(fEvent, fRawContent0); + assertEquals("toString", expected, content.toString()); + } + + public void testToString2() { + String expected = "[TmfEventContent(1,-10,true,some string,[TmfTimestamp(1,2,3)])]"; + TmfEventContentStub content = new TmfEventContentStub(fEvent, fRawContent0); + assertEquals("toString", expected, content.toString()); + } + + // ------------------------------------------------------------------------ + // Basic content parsing + // ------------------------------------------------------------------------ + + public void testGetFields() { + Object[] fields = fBasicContent0.getFields(); + assertEquals("getFields", 1, fields.length); + assertEquals("getFields", fRawContent0, fields[0].toString()); + } + + public void testGetFieldFromId() { + Object field; + try { + field = fBasicContent0.getField("Content"); + assertEquals("getField", fRawContent0, field.toString()); + } catch (TmfNoSuchFieldException e) { + fail("Field not found"); + } + } + + public void testGetFieldFromIdFailed() { + try { + fBasicContent0.getField("Dummy"); + fail("Found an inexisting field..."); + } catch (TmfNoSuchFieldException e) { + // Success + } + } + + public void testGetFieldFromPos() { + Object field = fBasicContent0.getField(0); + assertEquals("getField", fRawContent0, field.toString()); + } + + public void testGetFieldFromPosFailed() { + Object field = fBasicContent0.getField(10); + assertEquals("getField", null, field); + } + + // ------------------------------------------------------------------------ + // Standard content parsing + // ------------------------------------------------------------------------ + + public void testGetFields2() { + Object[] fields = fStubContent.getFields(); + assertEquals("getFields", 5, fields.length); + } + + public void testGetFieldFromId2() { + Object field; + try { + field = fStubContent.getField("Field1"); + assertEquals("getField", new Integer(1), field); + + field = fStubContent.getField("Field2"); + assertEquals("getField", new Integer(-10), field); + + field = fStubContent.getField("Field3"); + assertEquals("getField", new Boolean(true), field); + + field = fStubContent.getField("Field4"); + assertEquals("getField", new String("some string"), field); + + field = fStubContent.getField("Field5"); + assertEquals("getField", new TmfTimestamp(1, (byte) 2, 3), field); + + } catch (TmfNoSuchFieldException e) { + fail("Field not found"); + } + } + + public void testGetFieldFromPos2() { + TmfEventContentStub content = new TmfEventContentStub(fEvent, fRawContent0); + + Object field; + field = content.getField(0); + assertEquals("getField", new Integer(1), field); + + field = content.getField(1); + assertEquals("getField", new Integer(-10), field); + + field = content.getField(2); + assertEquals("getField", new Boolean(true), field); + + field = content.getField(3); + assertEquals("getField", new String("some string"), field); + + field = content.getField(4); + assertEquals("getField", new TmfTimestamp(1, (byte) 2, 3), field); + } + +} diff --git a/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/event/TmfEventFieldTest.java b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/event/TmfEventFieldTest.java new file mode 100644 index 0000000000..e63ba86dcb --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/event/TmfEventFieldTest.java @@ -0,0 +1,200 @@ +/******************************************************************************* + * Copyright (c) 2009 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: + * Francois Chouinard - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.linuxtools.tmf.tests.event; + +import junit.framework.TestCase; + +import org.eclipse.linuxtools.tmf.event.TmfEvent; +import org.eclipse.linuxtools.tmf.event.TmfEventContent; +import org.eclipse.linuxtools.tmf.event.TmfEventField; +import org.eclipse.linuxtools.tmf.event.TmfEventReference; +import org.eclipse.linuxtools.tmf.event.TmfEventSource; +import org.eclipse.linuxtools.tmf.event.TmfEventType; +import org.eclipse.linuxtools.tmf.event.TmfEventTypeStub; +import org.eclipse.linuxtools.tmf.event.TmfTimestamp; + +/** + * TmfEventFieldTest + *

+ * Test suite for the TmfEventField class. + */ +public class TmfEventFieldTest extends TestCase { + + // ------------------------------------------------------------------------ + // Variables + // ------------------------------------------------------------------------ + + private final TmfEventContent fContent; + private final String fFieldId = "Field"; + private final Object fValue1 = new String("Value"); + private final Object fValue2 = new Integer(10); + + private TmfEventField fField0; + private TmfEventField fField1; + private TmfEventField fField2; + private TmfEventField fField3; + + // ------------------------------------------------------------------------ + // Housekeeping + // ------------------------------------------------------------------------ + + /** + * @param name the test name + */ + public TmfEventFieldTest(String name) { + super(name); + TmfTimestamp fTimestamp = new TmfTimestamp(); + TmfEventSource fEventSource = new TmfEventSource(); + TmfEventType fEventType = new TmfEventTypeStub(); + TmfEventReference fReference = new TmfEventReference(); + TmfEvent fEvent = new TmfEvent(fTimestamp, fEventSource, fEventType, fReference); + + fContent = new TmfEventContent(fEvent, "Some content"); + + fField0 = new TmfEventField(fContent, fFieldId, fValue1); + fField1 = new TmfEventField(fContent, fFieldId, fValue1); + fField2 = new TmfEventField(fContent, fFieldId, fValue1); + fField3 = new TmfEventField(fContent, fFieldId, fValue2); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + } + + // ------------------------------------------------------------------------ + // Constructors + // ------------------------------------------------------------------------ + + public void testTmfEventField() { + assertSame("getParent", fContent, fField0.getParent()); + assertSame("getId", fFieldId, fField0.getId()); + assertSame("getValue", fValue1, fField0.getValue()); + } + + public void testTmfEventFieldBadArg() { + try { + new TmfEventField(fContent, null, fValue1); + fail("null copy"); + } + catch (IllegalArgumentException e) { + // Success + } + } + + public void testTmfEventFieldCopy() { + TmfEventField original = new TmfEventField(fContent, fFieldId, fValue1); + TmfEventField field = new TmfEventField(original); + assertSame("getParent", fContent, field.getParent()); + assertSame("getId", fFieldId, field.getId()); + assertSame("getValue", fValue1, field.getValue()); + } + + public void testTmfEventFieldCopy2() { + try { + new TmfEventField(null); + fail("null copy"); + } + catch (IllegalArgumentException e) { + // Success + } + } + + // ------------------------------------------------------------------------ + // Modifiers + // ------------------------------------------------------------------------ + + private class MyField extends TmfEventField { + public MyField(TmfEventContent parent, String id, Object value) { + super(parent, id, value); + } + public MyField(TmfEventField field) { + super(field); + } + @Override + public void setValue(Object value) { + super.setValue(value); + } + } + + public void testSetValue() { + TmfEventField original = new TmfEventField(fContent, fFieldId, fValue1); + TmfEventField field = new TmfEventField(original); + + MyField myField = new MyField(field); + assertSame("getValue", fValue1, myField.getValue()); + + myField.setValue(fValue2); + assertSame("getValue", fValue2, myField.getValue()); + } + + // ------------------------------------------------------------------------ + // equals + // ------------------------------------------------------------------------ + + public void testEqualsReflexivity() throws Exception { + assertTrue("equals", fField0.equals(fField0)); + assertTrue("equals", fField3.equals(fField3)); + + assertTrue("equals", !fField0.equals(fField3)); + assertTrue("equals", !fField3.equals(fField0)); + } + + public void testEqualsSymmetry() throws Exception { + assertTrue("equals", fField0.equals(fField1)); + assertTrue("equals", fField1.equals(fField0)); + + assertTrue("equals", !fField0.equals(fField3)); + assertTrue("equals", !fField3.equals(fField0)); + } + + public void testEqualsTransivity() throws Exception { + assertTrue("equals", fField0.equals(fField1)); + assertTrue("equals", fField1.equals(fField2)); + assertTrue("equals", fField0.equals(fField2)); + } + + public void testEqualsNull() throws Exception { + assertTrue("equals", !fField0.equals(null)); + assertTrue("equals", !fField3.equals(null)); + } + + // ------------------------------------------------------------------------ + // hashCode + // ------------------------------------------------------------------------ + + public void testHashCode() throws Exception { + assertTrue("hashCode", fField0.hashCode() == fField1.hashCode()); + assertTrue("hashCode", fField0.hashCode() != fField3.hashCode()); + } + + // ------------------------------------------------------------------------ + // toString + // ------------------------------------------------------------------------ + + public void testToString() { + String expected1 = "[TmfEventField(" + fFieldId + ":" + fValue1.toString() + ")]"; + TmfEventField field = new TmfEventField(fContent, fFieldId, fValue1); + assertEquals("toString", expected1, field.toString()); + + String expected2 = "[TmfEventField(" + fFieldId + ":" + fValue2.toString() + ")]"; + field = new TmfEventField(fContent, fFieldId, fValue2); + assertEquals("toString", expected2, field.toString()); + } + +} diff --git a/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/event/TmfEventReferenceTest.java b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/event/TmfEventReferenceTest.java new file mode 100644 index 0000000000..42e599898c --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/event/TmfEventReferenceTest.java @@ -0,0 +1,150 @@ +/******************************************************************************* + * Copyright (c) 2009 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: + * Francois Chouinard - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.linuxtools.tmf.tests.event; + +import junit.framework.TestCase; + +import org.eclipse.linuxtools.tmf.event.TmfEventReference; + +/** + * TmfEventReferenceTest + *

+ * Test suite for the TmfEventReference class. + */ +public class TmfEventReferenceTest extends TestCase { + + // ------------------------------------------------------------------------ + // Variables + // ------------------------------------------------------------------------ + + private final Object reference0 = new String("Some reference"); + private final Object reference2 = new String("Some other reference"); + + private TmfEventReference fReference0 = new TmfEventReference(reference0); + private TmfEventReference fReference1 = new TmfEventReference(reference0); + private TmfEventReference fReference2 = new TmfEventReference(reference0); + private TmfEventReference fReference3 = new TmfEventReference(reference2); + + // ------------------------------------------------------------------------ + // Housekeeping + // ------------------------------------------------------------------------ + + /** + * @param name the test name + */ + public TmfEventReferenceTest(String name) { + super(name); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + } + + // ------------------------------------------------------------------------ + // Constructors + // ------------------------------------------------------------------------ + + public void testTmfEventReferenceDefault() { + TmfEventReference reference = new TmfEventReference(); + assertEquals("getReference", null, reference.getReference()); + } + + public void testTmfEventReference() { + TmfEventReference reference = new TmfEventReference(reference0); + assertSame("getReference", reference0, reference.getReference()); + } + + public void testTmfEventReferenceCopy() { + TmfEventReference original = new TmfEventReference(reference0); + TmfEventReference reference = new TmfEventReference(original); + assertSame("getReference", reference0, reference.getReference()); + } + + public void testTmfEventReferenceCopy2() { + try { + @SuppressWarnings("unused") + TmfEventReference reference = new TmfEventReference(null); + fail("null copy"); + } + catch (IllegalArgumentException e) { + // Success + } + } + + // ------------------------------------------------------------------------ + // equals + // ------------------------------------------------------------------------ + + public void testEqualsReflexivity() throws Exception { + assertTrue("equals", fReference0.equals(fReference0)); + assertTrue("equals", fReference3.equals(fReference3)); + + assertTrue("equals", !fReference0.equals(fReference3)); + assertTrue("equals", !fReference3.equals(fReference0)); + } + + public void testEqualsSymmetry() throws Exception { + assertTrue("equals", fReference0.equals(fReference1)); + assertTrue("equals", fReference1.equals(fReference0)); + + assertTrue("equals", !fReference0.equals(fReference3)); + assertTrue("equals", !fReference3.equals(fReference0)); + } + + public void testEqualsTransivity() throws Exception { + assertTrue("equals", fReference0.equals(fReference1)); + assertTrue("equals", fReference1.equals(fReference2)); + assertTrue("equals", fReference0.equals(fReference2)); + } + + public void testEqualsNull() throws Exception { + assertTrue("equals", !fReference0.equals(null)); + assertTrue("equals", !fReference3.equals(null)); + } + + // ------------------------------------------------------------------------ + // hashCode + // ------------------------------------------------------------------------ + + public void testHashCode() throws Exception { + assertTrue("hashCode", fReference0.hashCode() == fReference1.hashCode()); + assertTrue("hashCode", fReference0.hashCode() != fReference3.hashCode()); + } + + public void testHashCode2() throws Exception { + TmfEventReference reference0 = new TmfEventReference(); + assertTrue("hashCode", fReference0.hashCode() != reference0.hashCode()); + assertTrue("hashCode", fReference3.hashCode() != reference0.hashCode()); + } + + // ------------------------------------------------------------------------ + // toString + // ------------------------------------------------------------------------ + + public void testToString() { + String expected1 = "[TmfEventReference(" + "null" + ")]"; + TmfEventReference reference1 = new TmfEventReference(); + assertEquals("toString", expected1, reference1.toString()); + + String expected2 = "[TmfEventReference(" + reference0.toString() + ")]"; + TmfEventReference reference2 = new TmfEventReference(reference0); + assertEquals("toString", expected2, reference2.toString()); + } + +} diff --git a/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/event/TmfEventSourceTest.java b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/event/TmfEventSourceTest.java new file mode 100644 index 0000000000..dbac78e55f --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/event/TmfEventSourceTest.java @@ -0,0 +1,144 @@ +/******************************************************************************* + * Copyright (c) 2009 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: + * Francois Chouinard - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.linuxtools.tmf.tests.event; + +import junit.framework.TestCase; + +import org.eclipse.linuxtools.tmf.event.TmfEventSource; + +/** + * TmfEventSourceTest + *

+ * Test suite for the TmfEventSource class. + */ +public class TmfEventSourceTest extends TestCase { + + // ------------------------------------------------------------------------ + // Variables + // ------------------------------------------------------------------------ + + private final Object source1 = new String("Some source"); + private final Object source2 = new String("Some other source"); + + private final TmfEventSource fSource0 = new TmfEventSource(source1); + private final TmfEventSource fSource1 = new TmfEventSource(source1); + private final TmfEventSource fSource2 = new TmfEventSource(source1); + private final TmfEventSource fSource3 = new TmfEventSource(source2); + + // ------------------------------------------------------------------------ + // Housekeeping + // ------------------------------------------------------------------------ + + /** + * @param name the test name + */ + public TmfEventSourceTest(String name) { + super(name); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + } + + // ------------------------------------------------------------------------ + // Constructors + // ------------------------------------------------------------------------ + + public void testTmfEventSourceDefault() { + TmfEventSource source = new TmfEventSource(); + assertEquals("getSourceId", null, source.getSourceId()); + } + + public void testTmfEventSource() { + TmfEventSource source = new TmfEventSource(source1); + assertSame("getSourceId", source1, source.getSourceId()); + } + + public void testTmfEventSourceCopy() { + TmfEventSource original = new TmfEventSource(source1); + TmfEventSource source = new TmfEventSource(original); + assertSame("getSourceId", source1, source.getSourceId()); + } + + public void testTmfEventSourceCopy2() { + try { + @SuppressWarnings("unused") + TmfEventSource source = new TmfEventSource(null); + fail("null copy"); + } + catch (IllegalArgumentException e) { + // Success + } + } + + // ------------------------------------------------------------------------ + // equals + // ------------------------------------------------------------------------ + + public void testEqualsReflexivity() throws Exception { + assertTrue("equals", fSource0.equals(fSource0)); + assertTrue("equals", fSource3.equals(fSource3)); + + assertTrue("equals", !fSource0.equals(fSource3)); + assertTrue("equals", !fSource3.equals(fSource0)); + } + + public void testEqualsSymmetry() throws Exception { + assertTrue("equals", fSource0.equals(fSource2)); + assertTrue("equals", fSource2.equals(fSource0)); + + assertTrue("equals", !fSource0.equals(fSource3)); + assertTrue("equals", !fSource3.equals(fSource0)); + } + + public void testEqualsTransivity() throws Exception { + assertTrue("equals", fSource0.equals(fSource1)); + assertTrue("equals", fSource1.equals(fSource2)); + assertTrue("equals", fSource0.equals(fSource2)); + } + + public void testEqualsNull() throws Exception { + assertTrue("equals", !fSource0.equals(null)); + assertTrue("equals", !fSource3.equals(null)); + } + + // ------------------------------------------------------------------------ + // hashCode + // ------------------------------------------------------------------------ + + public void testHashCode() throws Exception { + assertTrue("hashCode", fSource0.hashCode() == fSource1.hashCode()); + assertTrue("hashCode", fSource0.hashCode() != fSource3.hashCode()); + } + + // ------------------------------------------------------------------------ + // toString + // ------------------------------------------------------------------------ + + public void testToString() { + String expected1 = "[TmfEventSource(" + "null" + ")]"; + TmfEventSource nullSource = new TmfEventSource(); + assertEquals("toString", expected1, nullSource.toString()); + + String expected2 = "[TmfEventSource(" + source1.toString() + ")]"; + TmfEventSource source = new TmfEventSource(source1); + assertEquals("toString", expected2, source.toString()); + } + +} diff --git a/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/event/TmfEventTest.java b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/event/TmfEventTest.java new file mode 100644 index 0000000000..647724eaf4 --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/event/TmfEventTest.java @@ -0,0 +1,203 @@ +/******************************************************************************* + * Copyright (c) 2009 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: + * Francois Chouinard - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.linuxtools.tmf.tests.event; + +import junit.framework.TestCase; + +import org.eclipse.linuxtools.tmf.event.TmfEvent; +import org.eclipse.linuxtools.tmf.event.TmfEventContent; +import org.eclipse.linuxtools.tmf.event.TmfEventReference; +import org.eclipse.linuxtools.tmf.event.TmfEventSource; +import org.eclipse.linuxtools.tmf.event.TmfEventType; +import org.eclipse.linuxtools.tmf.event.TmfTimestamp; + +/** + * TmfEventTest + *

+ * Test suite for the TmfEvent class. + */ +public class TmfEventTest extends TestCase { + + // ------------------------------------------------------------------------ + // Variables + // ------------------------------------------------------------------------ + + private final String fTypeId = "Some type"; + private final String fLabel0 = "label1"; + private final String fLabel1 = "label2"; + private final String[] fLabels = new String[] { fLabel0, fLabel1 }; + + private final TmfTimestamp fTimestamp1 = new TmfTimestamp(12345, (byte) 2, 5); + private final TmfTimestamp fTimestamp2 = new TmfTimestamp(12350, (byte) 2, 5); + private final TmfEventSource fSource = new TmfEventSource("Source"); + private final TmfEventType fType = new TmfEventType(fTypeId, fLabels); + private final TmfEventReference fReference = new TmfEventReference("Some reference"); + + private final TmfEvent fEvent1; + private final TmfEvent fEvent2; + + private final TmfEventContent fContent1; + private final TmfEventContent fContent2; + + // ------------------------------------------------------------------------ + // Housekeeping + // ------------------------------------------------------------------------ + + /** + * @param name the test name + */ + public TmfEventTest(String name) { + super(name); + + fEvent1 = new TmfEvent(fTimestamp1, fSource, fType, fReference); + fContent1 = new TmfEventContent(fEvent1, "Some content"); + fEvent1.setContent(fContent1); + + fEvent2 = new TmfEvent(fTimestamp1, fTimestamp2, fSource, fType, fReference); + fContent2 = new TmfEventContent(fEvent2, "Some other content"); + fEvent2.setContent(fContent2); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + } + + // ------------------------------------------------------------------------ + // Constructors + // ------------------------------------------------------------------------ + + public void testTmfEvent() { + assertEquals("getTimestamp", fTimestamp1, fEvent1.getTimestamp()); + assertEquals("getOriginalTimestamp", fTimestamp1, fEvent1.getOriginalTimestamp()); + assertEquals("getSource", fSource, fEvent1.getSource()); + assertEquals("getType", fType, fEvent1.getType()); + assertEquals("getContent", fContent1, fEvent1.getContent()); + assertEquals("getReference", fReference, fEvent1.getReference()); + } + + public void testTmfEvent2() { + assertEquals("getTimestamp", fTimestamp2, fEvent2.getTimestamp()); + assertEquals("getOriginalTimestamp", fTimestamp1, fEvent2.getOriginalTimestamp()); + assertEquals("getSource", fSource, fEvent2.getSource()); + assertEquals("getType", fType, fEvent2.getType()); + assertEquals("getContent", fContent2, fEvent2.getContent()); + assertEquals("getReference", fReference, fEvent2.getReference()); + } + + public void testTmfEventCopy() { + TmfEvent event = new TmfEvent(fEvent1); + assertEquals("getTimestamp", fTimestamp1, event.getTimestamp()); + assertEquals("getOriginalTimestamp", fTimestamp1, event.getOriginalTimestamp()); + assertEquals("getSource", fSource, event.getSource()); + assertEquals("getType", fType, event.getType()); + assertEquals("getContent", fContent1, event.getContent()); + assertEquals("getReference", fReference, event.getReference()); + } + + public void testEventCopy2() throws Exception { + try { + new TmfEvent(null); + fail("null copy"); + } + catch (IllegalArgumentException e) { + // Success + } + } + + // ------------------------------------------------------------------------ + // equals + // ------------------------------------------------------------------------ + + public void testEqualsReflexivity() throws Exception { + assertTrue("equals", fEvent1.equals(fEvent1)); + assertTrue("equals", fEvent2.equals(fEvent2)); + + assertTrue("equals", !fEvent1.equals(fEvent2)); + assertTrue("equals", !fEvent2.equals(fEvent1)); + } + + public void testEqualsSymmetry() throws Exception { + TmfEvent event1 = new TmfEvent(fEvent1); + TmfEvent event2 = new TmfEvent(fEvent2); + + assertTrue("equals", event1.equals(fEvent1)); + assertTrue("equals", fEvent1.equals(event1)); + + assertTrue("equals", event2.equals(fEvent2)); + assertTrue("equals", fEvent2.equals(event2)); + } + + public void testEqualsTransivity() throws Exception { + TmfEvent event1 = new TmfEvent(fEvent1); + TmfEvent event2 = new TmfEvent(fEvent1); + TmfEvent event3 = new TmfEvent(fEvent1); + + assertTrue("equals", event1.equals(event2)); + assertTrue("equals", event2.equals(event3)); + assertTrue("equals", event1.equals(event3)); + } + + public void testEqualsNull() throws Exception { + assertTrue("equals", !fEvent1.equals(null)); + assertTrue("equals", !fEvent2.equals(null)); + } + + // ------------------------------------------------------------------------ + // hashCode + // ------------------------------------------------------------------------ + + public void testHashCode() throws Exception { + TmfEvent event1 = new TmfEvent(fEvent1); + TmfEvent event2 = new TmfEvent(fEvent2); + + assertTrue("hashCode", fEvent1.hashCode() == event1.hashCode()); + assertTrue("hashCode", fEvent2.hashCode() == event2.hashCode()); + + assertTrue("hashCode", fEvent1.hashCode() != event2.hashCode()); + assertTrue("hashCode", fEvent2.hashCode() != event1.hashCode()); + } + + // ------------------------------------------------------------------------ + // toString + // ------------------------------------------------------------------------ + + public void testToString() { + String expected1 = "[TmfEvent(" + fTimestamp1 + "," + fSource + "," + fType + "," + fContent1 + ")]"; + assertEquals("toString", expected1, fEvent1.toString()); + + String expected2 = "[TmfEvent(" + fTimestamp2 + "," + fSource + "," + fType + "," + fContent2 + ")]"; + assertEquals("toString", expected2, fEvent2.toString()); + } + + // ------------------------------------------------------------------------ + // setContent + // ------------------------------------------------------------------------ + + public void testSetContent() { + TmfEvent event = new TmfEvent(fEvent1); + assertEquals("setContent", fContent1, event.getContent()); + + event.setContent(fContent2); + assertEquals("setContent", fContent2, event.getContent()); + + event.setContent(fContent1); + assertEquals("setContent", fContent1, event.getContent()); + } + +} diff --git a/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/event/TmfEventTypeTest.java b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/event/TmfEventTypeTest.java new file mode 100644 index 0000000000..df0eecfbb7 --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/event/TmfEventTypeTest.java @@ -0,0 +1,203 @@ +/******************************************************************************* + * Copyright (c) 2009 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: + * Francois Chouinard - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.linuxtools.tmf.tests.event; + +import junit.framework.TestCase; + +import org.eclipse.linuxtools.tmf.event.TmfEventType; +import org.eclipse.linuxtools.tmf.event.TmfNoSuchFieldException; + +/** + * TmfEventTypeTest + *

+ * JUnit test suite for the TmfEventType class. + */ +public class TmfEventTypeTest extends TestCase { + + // ------------------------------------------------------------------------ + // Variables + // ------------------------------------------------------------------------ + + private final String fTypeId = "Some type"; + private final String fTypeId2 = "Some other type"; + private final String fLabel0 = "label1"; + private final String fLabel1 = "label2"; + private final String[] fLabels = new String[] { fLabel0, fLabel1 }; + private final String[] fLabels2 = new String[] { fLabel1, fLabel0 }; + + private final TmfEventType fType0 = new TmfEventType(fTypeId, fLabels); + private final TmfEventType fType1 = new TmfEventType(fTypeId, fLabels); + private final TmfEventType fType2 = new TmfEventType(fTypeId, fLabels); + private final TmfEventType fType3 = new TmfEventType(fTypeId2, fLabels2); + + // ------------------------------------------------------------------------ + // Housekeeping + // ------------------------------------------------------------------------ + + /** + * @param name the test name + */ + public TmfEventTypeTest(String name) { + super(name); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + } + + // ------------------------------------------------------------------------ + // Constructors + // ------------------------------------------------------------------------ + + public void testTmfEventTypeDefault() { + TmfEventType type = new TmfEventType(); + try { + assertEquals("getTypeId", TmfEventType.DEFAULT_TYPE_ID, type.getTypeId()); + assertEquals("getNbFields", 1, type.getNbFields()); + assertEquals("getFieldIndex", 0, type.getFieldIndex(TmfEventType.DEFAULT_LABELS[0])); + assertEquals("getLabels", TmfEventType.DEFAULT_LABELS, type.getLabels()); + assertEquals("getLabel", TmfEventType.DEFAULT_LABELS[0], type.getLabel(0)); + } catch (TmfNoSuchFieldException e) { + fail("getFieldIndex: no such field"); + } + } + + public void testTmfEventType() { + TmfEventType type = new TmfEventType(fTypeId, fLabels); + try { + assertEquals("getTypeId", fTypeId, type.getTypeId()); + assertEquals("getNbFields", fLabels.length, type.getNbFields()); + assertEquals("getFieldIndex", 0, type.getFieldIndex(fLabel0)); + assertEquals("getFieldIndex", 1, type.getFieldIndex(fLabel1)); + assertEquals("getLabels", fLabels, type.getLabels()); + assertEquals("getLabel", fLabel0, type.getLabel(0)); + assertEquals("getLabel", fLabel1, type.getLabel(1)); + } catch (TmfNoSuchFieldException e) { + fail("getFieldIndex: no such field"); + } + + try { + assertEquals("getFieldIndex", 0, type.getFieldIndex("Dummy")); + fail("getFieldIndex: inexistant field"); + } catch (TmfNoSuchFieldException e) { + // Success + } + + try { + type.getLabel(10); + fail("getLabel: inexistant field"); + } catch (TmfNoSuchFieldException e) { + // Success + } + } + + public void testTmfEventType2() { + try { + @SuppressWarnings("unused") + TmfEventType type = new TmfEventType(fTypeId, null); + fail("TmfEventType: bad constructor"); + } catch (IllegalArgumentException e) { + // Success + } + } + + public void testTmfEventType3() { + try { + @SuppressWarnings("unused") + TmfEventType type = new TmfEventType(null, fLabels); + fail("TmfEventType: bad constructor"); + } catch (IllegalArgumentException e) { + // Success + } + } + + public void testTmfEventTypeCopy() { + TmfEventType original = new TmfEventType(fTypeId, fLabels); + TmfEventType type = new TmfEventType(original); + assertEquals("getTypeId", fTypeId, type.getTypeId()); + assertEquals("getNbFields", fLabels.length, type.getNbFields()); + assertEquals("getLabels", fLabels, type.getLabels()); + } + + public void testTmfEventSourceCopy2() { + try { + @SuppressWarnings("unused") + TmfEventType type = new TmfEventType(null); + fail("null copy"); + } + catch (IllegalArgumentException e) { + // Success + } + } + + // ------------------------------------------------------------------------ + // equals + // ------------------------------------------------------------------------ + + public void testEqualsReflexivity() throws Exception { + assertTrue("equals", fType0.equals(fType0)); + assertTrue("equals", fType3.equals(fType3)); + + assertTrue("equals", !fType0.equals(fType3)); + assertTrue("equals", !fType3.equals(fType0)); + } + + public void testEqualsSymmetry() throws Exception { + assertTrue("equals", fType0.equals(fType1)); + assertTrue("equals", fType1.equals(fType0)); + + assertTrue("equals", !fType0.equals(fType3)); + assertTrue("equals", !fType3.equals(fType0)); + } + + public void testEqualsTransivity() throws Exception { + assertTrue("equals", fType0.equals(fType1)); + assertTrue("equals", fType1.equals(fType2)); + assertTrue("equals", fType0.equals(fType2)); + } + + public void testEqualsNull() throws Exception { + assertTrue("equals", !fType0.equals(null)); + assertTrue("equals", !fType3.equals(null)); + } + + // ------------------------------------------------------------------------ + // hashCode + // ------------------------------------------------------------------------ + + public void testHashCode() throws Exception { + assertTrue("hashCode", fType0.hashCode() == fType1.hashCode()); + assertTrue("hashCode", fType0.hashCode() != fType3.hashCode()); + } + + // ------------------------------------------------------------------------ + // toString + // ------------------------------------------------------------------------ + + public void testToString() { + String expected1 = "[TmfEventType:" + TmfEventType.DEFAULT_TYPE_ID + "]"; + TmfEventType type1 = new TmfEventType(); + assertEquals("toString", expected1, type1.toString()); + + String expected2 = "[TmfEventType:" + fTypeId + "]"; + TmfEventType type2 = new TmfEventType(fTypeId, fLabels); + assertEquals("toString", expected2, type2.toString()); + } + +} diff --git a/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/event/TmfTimeRangeTest.java b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/event/TmfTimeRangeTest.java new file mode 100644 index 0000000000..4efb0335c3 --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/event/TmfTimeRangeTest.java @@ -0,0 +1,222 @@ +/******************************************************************************* + * Copyright (c) 2009, 2010 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: + * Francois Chouinard - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.linuxtools.tmf.tests.event; + +import org.eclipse.linuxtools.tmf.event.TmfTimeRange; +import org.eclipse.linuxtools.tmf.event.TmfTimestamp; + +import junit.framework.TestCase; + +/** + * TmfTimeRangeTest + *

+ * Test suite for the TmfTimeRange class. + */ +public class TmfTimeRangeTest extends TestCase { + + + // ------------------------------------------------------------------------ + // Housekeeping + // ------------------------------------------------------------------------ + + public TmfTimeRangeTest(String name) { + super(name); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + } + + // ------------------------------------------------------------------------ + // Constructors + // ------------------------------------------------------------------------ + + public void testConstructor() throws Exception { + TmfTimestamp ts1 = new TmfTimestamp(12345); + TmfTimestamp ts2 = new TmfTimestamp(12350); + TmfTimeRange range = new TmfTimeRange(ts1, ts2); + assertEquals("startTime", ts1, range.getStartTime()); + assertEquals("endTime", ts2, range.getEndTime()); + } + + public void testBadConstructor() throws Exception { + try { + new TmfTimeRange(TmfTimestamp.BigBang, null); + fail("null copy"); + } + catch (IllegalArgumentException e) { + // Success + } + + try { + new TmfTimeRange(null, TmfTimestamp.BigCrunch); + fail("null copy"); + } + catch (IllegalArgumentException e) { + // Success + } + } + + public void testOpenRange1() throws Exception { + TmfTimestamp ts2 = new TmfTimestamp(12350); + TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, ts2); + assertEquals("startTime", TmfTimestamp.BigBang, range.getStartTime()); + assertEquals("endTime", ts2, range.getEndTime()); + } + + public void testOpenRange2() throws Exception { + TmfTimestamp ts1 = new TmfTimestamp(12345); + TmfTimeRange range = new TmfTimeRange(ts1, TmfTimestamp.BigCrunch); + assertEquals("startTime", ts1, range.getStartTime()); + assertEquals("endTime", TmfTimestamp.BigCrunch, range.getEndTime()); + } + + public void testOpenRange3() throws Exception { + TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch); + assertEquals("startTime", TmfTimestamp.BigBang, range.getStartTime()); + assertEquals("endTime", TmfTimestamp.BigCrunch, range.getEndTime()); + } + + public void testCopyConstructor() throws Exception { + TmfTimestamp ts1 = new TmfTimestamp(12345); + TmfTimestamp ts2 = new TmfTimestamp(12350); + TmfTimeRange range0 = new TmfTimeRange(ts1, ts2); + TmfTimeRange range1 = new TmfTimeRange(range0); + + assertEquals("startTime", ts1, range1.getStartTime()); + assertEquals("endTime", ts2, range1.getEndTime()); + + TmfTimeRange range2 = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch); + TmfTimeRange range3 = new TmfTimeRange(range2); + assertEquals("startTime", TmfTimestamp.BigBang, range3.getStartTime()); + assertEquals("endTime", TmfTimestamp.BigCrunch, range3.getEndTime()); + } + + public void testCopyConstructor2() throws Exception { + try { + new TmfTimeRange(null); + fail("null copy"); + } + catch (IllegalArgumentException e) { + // Success + } + } + + // ------------------------------------------------------------------------ + // equals + // ------------------------------------------------------------------------ + + public void testEqualsReflexivity() throws Exception { + TmfTimestamp ts1 = new TmfTimestamp(12345); + TmfTimestamp ts2 = new TmfTimestamp(12350); + TmfTimeRange range1 = new TmfTimeRange(ts1, ts2); + TmfTimeRange range2 = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch); + + assertTrue("equals", range1.equals(range1)); + assertTrue("equals", range2.equals(range2)); + + assertTrue("equals", !range1.equals(range2)); + assertTrue("equals", !range2.equals(range1)); + } + + public void testEqualsSymmetry() throws Exception { + TmfTimestamp ts1 = new TmfTimestamp(12345); + TmfTimestamp ts2 = new TmfTimestamp(12350); + TmfTimeRange range1a = new TmfTimeRange(ts1, ts2); + TmfTimeRange range1b = new TmfTimeRange(ts1, ts2); + + TmfTimeRange range2a = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch); + TmfTimeRange range2b = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch); + + assertTrue("equals", range1a.equals(range1b)); + assertTrue("equals", range1b.equals(range1a)); + + assertTrue("equals", range2a.equals(range2b)); + assertTrue("equals", range2b.equals(range2a)); + } + + public void testEqualsTransivity() throws Exception { + TmfTimestamp ts1 = new TmfTimestamp(12345); + TmfTimestamp ts2 = new TmfTimestamp(12350); + TmfTimeRange range1a = new TmfTimeRange(ts1, ts2); + TmfTimeRange range1b = new TmfTimeRange(ts1, ts2); + TmfTimeRange range1c = new TmfTimeRange(ts1, ts2); + + assertTrue("equals", range1a.equals(range1b)); + assertTrue("equals", range1b.equals(range1c)); + assertTrue("equals", range1a.equals(range1c)); + } + + public void testEqualsNull() throws Exception { + TmfTimestamp ts1 = new TmfTimestamp(12345); + TmfTimestamp ts2 = new TmfTimestamp(12350); + TmfTimeRange range1 = new TmfTimeRange(ts1, ts2); + + assertTrue("equals", !range1.equals(null)); + } + + // ------------------------------------------------------------------------ + // hashCode + // ------------------------------------------------------------------------ + + public void testHashCode() throws Exception { + TmfTimestamp ts1 = new TmfTimestamp(12345); + TmfTimestamp ts2 = new TmfTimestamp(12350); + TmfTimeRange range1 = new TmfTimeRange(ts1, ts2); + TmfTimeRange range1b = new TmfTimeRange(range1); + TmfTimeRange range2 = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch); + TmfTimeRange range2b = new TmfTimeRange(range2); + + assertTrue("hashCode", range1.hashCode() == range1b.hashCode()); + assertTrue("hashCode", range2.hashCode() == range2b.hashCode()); + + assertTrue("hashCode", range1.hashCode() != range2.hashCode()); + } + + // ------------------------------------------------------------------------ + // toString + // ------------------------------------------------------------------------ + + public void testToString() throws Exception { + TmfTimestamp ts1 = new TmfTimestamp(12345); + TmfTimestamp ts2 = new TmfTimestamp(12350); + TmfTimeRange range = new TmfTimeRange(ts1, ts2); + + String expected = "[TmfTimeRange(" + ts1 + ":" + ts2 + ")]"; + assertEquals("toString", expected, range.toString()); + } + + // ------------------------------------------------------------------------ + // contains + // ------------------------------------------------------------------------ + + public void testContains() throws Exception { + TmfTimestamp ts1 = new TmfTimestamp(12345); + TmfTimestamp ts2 = new TmfTimestamp(12350); + TmfTimeRange range = new TmfTimeRange(ts1, ts2); + + assertTrue("contains (lower bound)", range.contains(new TmfTimestamp(12345))); + assertTrue("contains (higher bound)", range.contains(new TmfTimestamp(12350))); + assertTrue("contains (within bounds)", range.contains(new TmfTimestamp(12346))); + + assertFalse("contains (low value)", range.contains(new TmfTimestamp(12340))); + assertFalse("contains (high value)", range.contains(new TmfTimestamp(12351))); + } + +} diff --git a/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/event/TmfTimestampTest.java b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/event/TmfTimestampTest.java new file mode 100644 index 0000000000..e6083b6022 --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/event/TmfTimestampTest.java @@ -0,0 +1,420 @@ +/******************************************************************************* + * Copyright (c) 2009 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: + * Francois Chouinard - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.linuxtools.tmf.tests.event; + +import junit.framework.TestCase; + +import org.eclipse.linuxtools.tmf.event.TmfTimestamp; + +/** + * TmfTimestampTest + *

+ * Test suite for the TmfTimestamp class. + */ +public class TmfTimestampTest extends TestCase { + + // ------------------------------------------------------------------------ + // Variables + // ------------------------------------------------------------------------ + + private final TmfTimestamp ts0 = new TmfTimestamp(); + private final TmfTimestamp ts1 = new TmfTimestamp(12345); + private final TmfTimestamp ts2 = new TmfTimestamp(12345, (byte) -1); + private final TmfTimestamp ts3 = new TmfTimestamp(12345, (byte) 2, 5); + + private final TmfTimestamp ts0copy = new TmfTimestamp(); + private final TmfTimestamp ts1copy = new TmfTimestamp(12345); + + private final TmfTimestamp ts0copy2 = new TmfTimestamp(); + private final TmfTimestamp ts1copy2 = new TmfTimestamp(12345); + + private final TmfTimestamp bigBang = new TmfTimestamp(TmfTimestamp.BigBang); + private final TmfTimestamp bigCrunch = new TmfTimestamp(TmfTimestamp.BigCrunch); + + // ------------------------------------------------------------------------ + // Housekeping + // ------------------------------------------------------------------------ + + /** + * @param name the test name + */ + public TmfTimestampTest(String name) { + super(name); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + } + + // ------------------------------------------------------------------------ + // Constructors + // ------------------------------------------------------------------------ + + public void testDefaultConstructor() throws Exception { + assertEquals("getValue", 0, ts0.getValue()); + assertEquals("getscale", 0, ts0.getScale()); + assertEquals("getPrecision", 0, ts0.getPrecision()); + } + + public void testSimpleConstructor() throws Exception { + assertEquals("getValue", 12345, ts1.getValue()); + assertEquals("getscale", 0, ts1.getScale()); + assertEquals("getPrecision", 0, ts1.getPrecision()); + } + + public void testSimpleConstructor2() throws Exception { + assertEquals("getValue", 12345, ts2.getValue()); + assertEquals("getscale", -1, ts2.getScale()); + assertEquals("getPrecision", 0, ts2.getPrecision()); + } + + public void testFullConstructor() throws Exception { + assertEquals("getValue", 12345, ts3.getValue()); + assertEquals("getscale", 2, ts3.getScale()); + assertEquals("getPrecision", 5, ts3.getPrecision()); + } + + public void testCopyConstructor() throws Exception { + TmfTimestamp ts0 = new TmfTimestamp(12345, (byte) 2, 5); + TmfTimestamp ts = new TmfTimestamp(ts0); + assertEquals("getValue", 12345, ts.getValue()); + assertEquals("getscale", 2, ts.getScale()); + assertEquals("getPrecision", 5, ts.getPrecision()); + } + + public void testCopyConstructor2() throws Exception { + try { + @SuppressWarnings("unused") + TmfTimestamp timestamp = new TmfTimestamp(null); + fail("null copy"); + } + catch (IllegalArgumentException e) { + // Success + } + } + + public void testCopyConstructorBigBang() throws Exception { + assertEquals("getValue", TmfTimestamp.BigBang.getValue(), bigBang.getValue()); + assertEquals("getscale", TmfTimestamp.BigBang.getScale(), bigBang.getScale()); + assertEquals("getPrecision", TmfTimestamp.BigBang.getPrecision(), bigBang.getPrecision()); + } + + public void testCopyConstructorBigCrunch() throws Exception { + assertEquals("getValue", TmfTimestamp.BigCrunch.getValue(), bigCrunch.getValue()); + assertEquals("getscale", TmfTimestamp.BigCrunch.getScale(), bigCrunch.getScale()); + assertEquals("getPrecision", TmfTimestamp.BigCrunch.getPrecision(), bigCrunch.getPrecision()); + } + + // ------------------------------------------------------------------------ + // equals + // ------------------------------------------------------------------------ + + public void testEqualsReflexivity() throws Exception { + assertTrue("equals", ts0.equals(ts0)); + assertTrue("equals", ts1.equals(ts1)); + + assertTrue("equals", !ts0.equals(ts1)); + assertTrue("equals", !ts1.equals(ts0)); + } + + public void testEqualsSymmetry() throws Exception { + assertTrue("equals", ts0.equals(ts0copy)); + assertTrue("equals", ts0copy.equals(ts0)); + + assertTrue("equals", ts1.equals(ts1copy)); + assertTrue("equals", ts1copy.equals(ts1)); + } + + public void testEqualsTransivity() throws Exception { + assertTrue("equals", ts0.equals(ts0copy)); + assertTrue("equals", ts0copy.equals(ts0copy2)); + assertTrue("equals", ts0.equals(ts0copy2)); + + assertTrue("equals", ts1.equals(ts1copy)); + assertTrue("equals", ts1copy.equals(ts1copy2)); + assertTrue("equals", ts1.equals(ts1copy2)); + } + + public void testEqualsNull() throws Exception { + assertTrue("equals", !ts0.equals(null)); + assertTrue("equals", !ts1.equals(null)); + } + + // ------------------------------------------------------------------------ + // hashCode + // ------------------------------------------------------------------------ + + public void testHashCode() throws Exception { + assertTrue("hashCode", ts0.hashCode() == ts0copy.hashCode()); + assertTrue("hashCode", ts1.hashCode() == ts1copy.hashCode()); + + assertTrue("hashCode", ts0.hashCode() != ts1.hashCode()); + } + + // ------------------------------------------------------------------------ + // toString + // ------------------------------------------------------------------------ + + public void testToString() throws Exception { + assertEquals("toString", "[TmfTimestamp(0,0,0)]", ts0.toString()); + assertEquals("toString", "[TmfTimestamp(12345,0,0)]", ts1.toString()); + assertEquals("toString", "[TmfTimestamp(12345,-1,0)]", ts2.toString()); + assertEquals("toString", "[TmfTimestamp(12345,2,5)]", ts3.toString()); + } + + // ------------------------------------------------------------------------ + // clone + // ------------------------------------------------------------------------ + + public class MyTimestamp extends TmfTimestamp { + @Override + public boolean equals(Object other) { + return super.equals(other); + } + @Override + public MyTimestamp clone() { + return (MyTimestamp) super.clone(); + } + } + + public void testClone() throws Exception { + TmfTimestamp timestamp = ts0.clone(); + assertEquals("clone", timestamp, ts0); + } + + public void testClone2() throws Exception { + MyTimestamp timestamp = new MyTimestamp(); + MyTimestamp clone = timestamp.clone(); + assertEquals("clone", clone, timestamp); + } + + // ------------------------------------------------------------------------ + // synchronize + // ------------------------------------------------------------------------ + + public void testSynchronizeOffset() throws Exception { + + TmfTimestamp ts = ts0.synchronize(0, (byte) 0); + assertEquals("getValue", 0, ts.getValue()); + assertEquals("getscale", 0, ts.getScale()); + assertEquals("getPrecision", 0, ts.getPrecision()); + + ts = ts0.synchronize(12345, (byte) 0); + assertEquals("getValue", 12345, ts.getValue()); + assertEquals("getscale", 0, ts.getScale()); + assertEquals("getPrecision", 0, ts.getPrecision()); + + ts = ts0.synchronize(10, (byte) 0); + assertEquals("getValue", 10, ts.getValue()); + assertEquals("getscale", 0, ts.getScale()); + assertEquals("getPrecision", 0, ts.getPrecision()); + + ts = ts0.synchronize(-10, (byte) 0); + assertEquals("getValue", -10, ts.getValue()); + assertEquals("getscale", 0, ts.getScale()); + assertEquals("getPrecision", 0, ts.getPrecision()); + } + + public void testSynchronizeScale() throws Exception { + + TmfTimestamp ts = ts0.synchronize(0, (byte) 10); + assertEquals("getValue", 0, ts.getValue()); + assertEquals("getscale", 10, ts.getScale()); + assertEquals("getPrecision", 0, ts.getPrecision()); + + ts = ts0.synchronize(0, (byte) -10); + assertEquals("getValue", 0, ts.getValue()); + assertEquals("getscale", -10, ts.getScale()); + assertEquals("getPrecision", 0, ts.getPrecision()); + } + + public void testSynchronizeOffsetAndScale() throws Exception { + byte SCALE = 12; + + TmfTimestamp ts = ts0.synchronize(0, SCALE); + assertEquals("getValue", 0, ts.getValue()); + assertEquals("getscale", SCALE, ts.getScale()); + assertEquals("getPrecision", 0, ts.getPrecision()); + + ts = ts0.synchronize(12345, SCALE); + assertEquals("getValue", 12345, ts.getValue()); + assertEquals("getscale", SCALE, ts.getScale()); + assertEquals("getPrecision", 0, ts.getPrecision()); + + ts = ts0.synchronize(10, SCALE); + assertEquals("getValue", 10, ts.getValue()); + assertEquals("getscale", SCALE, ts.getScale()); + assertEquals("getPrecision", 0, ts.getPrecision()); + + ts = ts0.synchronize(-10, SCALE); + assertEquals("getValue", -10, ts.getValue()); + assertEquals("getscale", SCALE, ts.getScale()); + assertEquals("getPrecision", 0, ts.getPrecision()); + } + + // ------------------------------------------------------------------------ + // getAdjustment + // ------------------------------------------------------------------------ + + public void testGetAdjustmentSameScale() throws Exception { + long delta = ts0.getAdjustment(ts0 , ts0.getScale()); + assertEquals("delta", 0, delta); + + delta = ts1.getAdjustment(ts1, ts1.getScale()); + assertEquals("delta", 0, delta); + + delta = ts0.getAdjustment(ts1, ts1.getScale()); + assertEquals("delta", 12345, delta); + + delta = ts1.getAdjustment(ts0, ts0.getScale()); + assertEquals("delta", -12345, delta); + } + + public void testGetAdjustmentDifferentScales() throws Exception { + long delta = ts0.getAdjustment(ts2, ts2.getScale()); + assertEquals("delta", 12345, delta); + + delta = ts2.getAdjustment(ts0, ts0.getScale()); + assertEquals("delta", -1234, delta); + } + + // ------------------------------------------------------------------------ + // CompareTo + // ------------------------------------------------------------------------ + + public void testCompareToSameScale() throws Exception { + TmfTimestamp ts1 = new TmfTimestamp(900, (byte) 0, 50); + TmfTimestamp ts2 = new TmfTimestamp(1000, (byte) 0, 50); + TmfTimestamp ts3 = new TmfTimestamp(1100, (byte) 0, 50); + TmfTimestamp ts4 = new TmfTimestamp(1000, (byte) 0, 75); + + assertTrue(ts1.compareTo(ts1, false) == 0); + + assertTrue("CompareTo", ts1.compareTo(ts2, false) < 0); + assertTrue("CompareTo", ts1.compareTo(ts3, false) < 0); + assertTrue("CompareTo", ts1.compareTo(ts4, false) < 0); + + assertTrue("CompareTo", ts2.compareTo(ts1, false) > 0); + assertTrue("CompareTo", ts2.compareTo(ts3, false) < 0); + assertTrue("CompareTo", ts2.compareTo(ts4, false) == 0); + + assertTrue("CompareTo", ts3.compareTo(ts1, false) > 0); + assertTrue("CompareTo", ts3.compareTo(ts2, false) > 0); + assertTrue("CompareTo", ts3.compareTo(ts4, false) > 0); + } + + public void testCompareToDifferentScale() throws Exception { + TmfTimestamp ts1 = new TmfTimestamp(9000, (byte) -1, 50); + TmfTimestamp ts2 = new TmfTimestamp(1000, (byte) 0, 50); + TmfTimestamp ts3 = new TmfTimestamp(110, (byte) 1, 50); + TmfTimestamp ts4 = new TmfTimestamp(1, (byte) 3, 75); + + assertTrue("CompareTo", ts1.compareTo(ts1, false) == 0); + + assertTrue("CompareTo", ts1.compareTo(ts2, false) < 0); + assertTrue("CompareTo", ts1.compareTo(ts3, false) < 0); + assertTrue("CompareTo", ts1.compareTo(ts4, false) < 0); + + assertTrue("CompareTo", ts2.compareTo(ts1, false) > 0); + assertTrue("CompareTo", ts2.compareTo(ts3, false) < 0); + assertTrue("CompareTo", ts2.compareTo(ts4, false) == 0); + + assertTrue("CompareTo", ts3.compareTo(ts1, false) > 0); + assertTrue("CompareTo", ts3.compareTo(ts2, false) > 0); + assertTrue("CompareTo", ts3.compareTo(ts4, false) > 0); + } + + public void testCompareToWithinPrecision() throws Exception { + TmfTimestamp ts1 = new TmfTimestamp(900, (byte) 0, 50); + TmfTimestamp ts2 = new TmfTimestamp(1000, (byte) 0, 50); + TmfTimestamp ts3 = new TmfTimestamp(1100, (byte) 0, 50); + TmfTimestamp ts4 = new TmfTimestamp(1000, (byte) 0, 75); + + assertTrue("CompareTo", ts1.compareTo(ts1, true) == 0); + + assertTrue("CompareTo", ts1.compareTo(ts2, true) == 0); + assertTrue("CompareTo", ts1.compareTo(ts3, true) < 0); + assertTrue("CompareTo", ts1.compareTo(ts4, true) == 0); + + assertTrue("CompareTo", ts2.compareTo(ts1, true) == 0); + assertTrue("CompareTo", ts2.compareTo(ts3, true) == 0); + assertTrue("CompareTo", ts2.compareTo(ts4, true) == 0); + + assertTrue("CompareTo", ts3.compareTo(ts1, true) > 0); + assertTrue("CompareTo", ts3.compareTo(ts2, true) == 0); + assertTrue("CompareTo", ts3.compareTo(ts4, true) == 0); + } + + public void testCompareToLargeScale() throws Exception { + TmfTimestamp ts1 = new TmfTimestamp(-1, (byte) 100); + TmfTimestamp ts2 = new TmfTimestamp(-1000, (byte) -100); + TmfTimestamp ts3 = new TmfTimestamp(1, (byte) 100); + TmfTimestamp ts4 = new TmfTimestamp(1000, (byte) -100); + + assertTrue("CompareTo", ts1.compareTo(ts2, false) < 0); + assertTrue("CompareTo", ts1.compareTo(ts3, false) < 0); + assertTrue("CompareTo", ts1.compareTo(ts4, false) < 0); + + assertTrue("CompareTo", ts2.compareTo(ts1, false) > 0); + assertTrue("CompareTo", ts2.compareTo(ts3, false) < 0); + assertTrue("CompareTo", ts2.compareTo(ts4, false) < 0); + + assertTrue("CompareTo", ts3.compareTo(ts1, false) > 0); + assertTrue("CompareTo", ts3.compareTo(ts2, false) > 0); + assertTrue("CompareTo", ts3.compareTo(ts4, false) > 0); + + assertTrue("CompareTo", ts4.compareTo(ts1, false) > 0); + assertTrue("CompareTo", ts4.compareTo(ts2, false) > 0); + assertTrue("CompareTo", ts4.compareTo(ts3, false) < 0); + } + + public void testCompareToBigRanges() throws Exception { + TmfTimestamp ts0a = new TmfTimestamp( 0, Byte.MAX_VALUE); + TmfTimestamp ts0b = new TmfTimestamp( 0, Byte.MIN_VALUE); + TmfTimestamp ts1 = new TmfTimestamp(-1, Byte.MAX_VALUE); + TmfTimestamp ts2 = new TmfTimestamp(-1, Byte.MIN_VALUE); + TmfTimestamp ts3 = new TmfTimestamp( 1, Byte.MAX_VALUE); + TmfTimestamp ts4 = new TmfTimestamp( 1, Byte.MIN_VALUE); + + assertEquals("CompareTo", 1, ts0a.compareTo(TmfTimestamp.BigBang, false)); + assertEquals("CompareTo", -1, ts0a.compareTo(TmfTimestamp.BigCrunch, false)); + + assertEquals("CompareTo", 1, ts0b.compareTo(TmfTimestamp.BigBang, false)); + assertEquals("CompareTo", -1, ts0b.compareTo(TmfTimestamp.BigCrunch, false)); + + assertEquals("CompareTo", 0, ts0a.compareTo(ts0b, false)); + assertEquals("CompareTo", 0, ts0b.compareTo(ts0a, false)); + + assertEquals("CompareTo", 1, ts0a.compareTo(TmfTimestamp.BigBang, false)); + assertEquals("CompareTo", -1, ts0a.compareTo(TmfTimestamp.BigCrunch, false)); + + assertEquals("CompareTo", 1, ts1.compareTo(TmfTimestamp.BigBang, false)); + assertEquals("CompareTo", -1, ts1.compareTo(TmfTimestamp.BigCrunch, false)); + + assertEquals("CompareTo", 1, ts2.compareTo(TmfTimestamp.BigBang, false)); + assertEquals("CompareTo", -1, ts2.compareTo(TmfTimestamp.BigCrunch, false)); + + assertEquals("CompareTo", 1, ts3.compareTo(TmfTimestamp.BigBang, false)); + assertEquals("CompareTo", -1, ts3.compareTo(TmfTimestamp.BigCrunch, false)); + + assertEquals("CompareTo", 1, ts4.compareTo(TmfTimestamp.BigBang, false)); + assertEquals("CompareTo", -1, ts4.compareTo(TmfTimestamp.BigCrunch, false)); + } + +} diff --git a/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/event/TmfTraceEventTest.java b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/event/TmfTraceEventTest.java new file mode 100644 index 0000000000..989f7bf518 --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/event/TmfTraceEventTest.java @@ -0,0 +1,135 @@ +/******************************************************************************* + * Copyright (c) 2009 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: + * Francois Chouinard - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.linuxtools.tmf.tests.event; + +import org.eclipse.linuxtools.tmf.event.TmfEventContent; +import org.eclipse.linuxtools.tmf.event.TmfEventReference; +import org.eclipse.linuxtools.tmf.event.TmfEventSource; +import org.eclipse.linuxtools.tmf.event.TmfEventType; +import org.eclipse.linuxtools.tmf.event.TmfTimestamp; +import org.eclipse.linuxtools.tmf.event.TmfTraceEvent; + +import junit.framework.TestCase; + +/** + * TmfTraceEventTest + *

+ * Test suite for the TmfTraceEvent class. + */ +public class TmfTraceEventTest extends TestCase { + + // ------------------------------------------------------------------------ + // Variables + // ------------------------------------------------------------------------ + + private final String fTypeId = "Some type"; + private final String fLabel0 = "label1"; + private final String fLabel1 = "label2"; + private final String[] fLabels = new String[] { fLabel0, fLabel1 }; + + private final TmfTimestamp fTimestamp1 = new TmfTimestamp(12345, (byte) 2, 5); + private final TmfTimestamp fTimestamp2 = new TmfTimestamp(12350, (byte) 2, 5); + private final TmfEventSource fSource = new TmfEventSource("Source"); + private final TmfEventType fType = new TmfEventType(fTypeId, fLabels); + private final TmfEventReference fReference = new TmfEventReference("Some reference"); + + private final TmfTraceEvent fEvent1; + private final TmfTraceEvent fEvent2; + + private final TmfEventContent fContent1; + private final TmfEventContent fContent2; + + private final String fPath = "/some/path/"; + private final String fFile = "filename"; + private final int fLine = 10; + + // ------------------------------------------------------------------------ + // Housekeeping + // ------------------------------------------------------------------------ + + /** + * @param name the test name + */ + public TmfTraceEventTest(String name) { + super(name); + + fEvent1 = new TmfTraceEvent(fTimestamp1, fSource, fType, fReference, fPath, fFile, fLine); + fContent1 = new TmfEventContent(fEvent1, "Some content"); + fEvent1.setContent(fContent1); + + fEvent2 = new TmfTraceEvent(fTimestamp1, fTimestamp2, fSource, fType, fReference, fPath, fFile, fLine); + fContent2 = new TmfEventContent(fEvent2, "Some other content"); + fEvent2.setContent(fContent2); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + } + + // ------------------------------------------------------------------------ + // Constructors + // ------------------------------------------------------------------------ + + public void testTmfTraceEvent() throws Exception { + assertEquals("getTimestamp", fTimestamp1, fEvent1.getTimestamp()); + assertEquals("getOriginalTimestamp", fTimestamp1, fEvent1.getOriginalTimestamp()); + assertEquals("getSource", fSource, fEvent1.getSource()); + assertEquals("getType", fType, fEvent1.getType()); + assertEquals("getContent", fContent1, fEvent1.getContent()); + assertEquals("getReference", fReference, fEvent1.getReference()); + assertEquals("getSourcePath", fPath, fEvent1.getSourcePath()); + assertEquals("getFileName", fFile, fEvent1.getFileName()); + assertEquals("getLineNumber", fLine, fEvent1.getLineNumber()); + } + + public void testTmfTraceEvent2() throws Exception { + assertEquals("getTimestamp", fTimestamp2, fEvent2.getTimestamp()); + assertEquals("getOriginalTimestamp", fTimestamp1, fEvent2.getOriginalTimestamp()); + assertEquals("getSource", fSource, fEvent2.getSource()); + assertEquals("getType", fType, fEvent2.getType()); + assertEquals("getContent", fContent2, fEvent2.getContent()); + assertEquals("getReference", fReference, fEvent2.getReference()); + assertEquals("getSourcePath", fPath, fEvent2.getSourcePath()); + assertEquals("getFileName", fFile, fEvent2.getFileName()); + assertEquals("getLineNumber", fLine, fEvent2.getLineNumber()); + } + + public void testTmfTraceEventCopy() throws Exception { + TmfTraceEvent event = new TmfTraceEvent(fEvent2); + assertEquals("getTimestamp", fTimestamp2, event.getTimestamp()); + assertEquals("getOriginalTimestamp", fTimestamp1, event.getOriginalTimestamp()); + assertEquals("getSource", fSource, event.getSource()); + assertEquals("getType", fType, event.getType()); + assertEquals("getContent", fContent2, event.getContent()); + assertEquals("getReference", fReference, event.getReference()); + assertEquals("getSourcePath", fPath, event.getSourcePath()); + assertEquals("getFileName", fFile, event.getFileName()); + assertEquals("getLineNumber", fLine, event.getLineNumber()); + } + + // ------------------------------------------------------------------------ + // equals + // ------------------------------------------------------------------------ + + // ------------------------------------------------------------------------ + // toString + // ------------------------------------------------------------------------ + +} + diff --git a/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/experiment/AllTests.java b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/experiment/AllTests.java new file mode 100644 index 0000000000..a285a36ade --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/experiment/AllTests.java @@ -0,0 +1,19 @@ +package org.eclipse.linuxtools.tmf.tests.experiment; + +import junit.framework.Test; +import junit.framework.TestSuite; + +import org.eclipse.linuxtools.tmf.TmfCorePlugin; + +public class AllTests { + + public static Test suite() { + TestSuite suite = new TestSuite("Test suite for " + TmfCorePlugin.PLUGIN_ID + ".experiment"); //$NON-NLS-1$); + //$JUnit-BEGIN$ + suite.addTestSuite(TmfExperimentTest.class); + suite.addTestSuite(TmfMultiTraceExperimentTest.class); + //$JUnit-END$ + return suite; + } + +} \ No newline at end of file diff --git a/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/experiment/TmfExperimentTest.java b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/experiment/TmfExperimentTest.java new file mode 100644 index 0000000000..104fddca7d --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/experiment/TmfExperimentTest.java @@ -0,0 +1,657 @@ +/******************************************************************************* + * Copyright (c) 2009, 2010 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: + * Francois Chouinard - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.linuxtools.tmf.tests.experiment; + +import java.io.File; +import java.io.IOException; +import java.net.URISyntaxException; +import java.net.URL; +import java.util.Vector; + +import junit.framework.TestCase; + +import org.eclipse.core.runtime.FileLocator; +import org.eclipse.core.runtime.Path; +import org.eclipse.linuxtools.tmf.event.TmfEvent; +import org.eclipse.linuxtools.tmf.event.TmfTimeRange; +import org.eclipse.linuxtools.tmf.event.TmfTimestamp; +import org.eclipse.linuxtools.tmf.experiment.TmfExperiment; +import org.eclipse.linuxtools.tmf.experiment.TmfExperimentContext; +import org.eclipse.linuxtools.tmf.request.TmfEventRequest; +import org.eclipse.linuxtools.tmf.tests.TmfCoreTestPlugin; +import org.eclipse.linuxtools.tmf.trace.ITmfTrace; +import org.eclipse.linuxtools.tmf.trace.TmfCheckpoint; +import org.eclipse.linuxtools.tmf.trace.TmfContext; +import org.eclipse.linuxtools.tmf.trace.TmfTraceStub; + +/** + * TmfExperimentTest + *

+ * TODO: Implement me. Please. + */ +public class TmfExperimentTest extends TestCase { + + private static final String DIRECTORY = "testfiles"; + private static final String TEST_STREAM = "A-Test-10K"; + private static final String EXPERIMENT = "MyExperiment"; + private static int NB_EVENTS = 10000; + private static int fDefaultBlockSize = 1000; + + private static ITmfTrace[] fTraces; + private static TmfExperiment fExperiment; + + private static byte SCALE = (byte) -3; + + // ------------------------------------------------------------------------ + // Housekeeping + // ------------------------------------------------------------------------ + + private ITmfTrace[] setupTrace(String path) { + if (fTraces == null) { + fTraces = new ITmfTrace[1]; + try { + URL location = FileLocator.find(TmfCoreTestPlugin.getDefault().getBundle(), new Path(path), null); + File test = new File(FileLocator.toFileURL(location).toURI()); + TmfTraceStub trace = new TmfTraceStub(test.getPath(), true); + fTraces[0] = trace; + } catch (URISyntaxException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return fTraces; + } + + private void setupExperiment() { + if (fExperiment == null) { + fExperiment = new TmfExperiment(TmfEvent.class, EXPERIMENT, fTraces); + fExperiment.indexExperiment(true); + } + } + + public TmfExperimentTest(String name) throws Exception { + super(name); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + setupTrace(DIRECTORY + File.separator + TEST_STREAM); + setupExperiment(); + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + } + + // ------------------------------------------------------------------------ + // Constructor + // ------------------------------------------------------------------------ + + public void testBasicTmfExperimentConstructor() { + assertEquals("GetId", EXPERIMENT, fExperiment.getName()); + assertEquals("GetEpoch", TmfTimestamp.Zero, fExperiment.getEpoch()); + assertEquals("GetNbEvents", NB_EVENTS, fExperiment.getNbEvents()); + + TmfTimeRange timeRange = fExperiment.getTimeRange(); + assertEquals("getStartTime", 1, timeRange.getStartTime().getValue()); + assertEquals("getEndTime", NB_EVENTS, timeRange.getEndTime().getValue()); + } + + // ------------------------------------------------------------------------ + // Verify checkpoints + // Note: seekLocation() does not reliably set the rank + // ------------------------------------------------------------------------ + + public void testValidateCheckpoints() throws Exception { + + Vector checkpoints = fExperiment.getCheckpoints(); +// int pageSize = fExperiment.getCacheSize(); + assertTrue("Checkpoints exist", checkpoints != null); + + // Validate that each checkpoint points to the right event + for (int i = 0; i < checkpoints.size(); i++) { + TmfCheckpoint checkpoint = checkpoints.get(i); + TmfExperimentContext context = fExperiment.seekLocation(checkpoint.getLocation()); + TmfEvent event = fExperiment.parseEvent(context); +// assertEquals("Event rank", context.getRank(), i * pageSize); + assertTrue("Timestamp", (checkpoint.getTimestamp().compareTo(event.getTimestamp(), false) == 0)); + } + } + + // ------------------------------------------------------------------------ + // parseEvent - make sure parseEvent doesn't update the context + // ------------------------------------------------------------------------ + + public void testParseEvent() throws Exception { + + // On lower bound, returns the first event (ts = 0) + TmfContext context = fExperiment.seekEvent(new TmfTimestamp(0, SCALE, 0)); + + TmfEvent event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + + for (int i = 1; i < 20; i++) { + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", i, event.getTimestamp().getValue()); + } + + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 20, event.getTimestamp().getValue()); + + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 20, event.getTimestamp().getValue()); + } + + // ------------------------------------------------------------------------ + // getNextEvent - updates the context + // ------------------------------------------------------------------------ + + public void testGetNextEvent() throws Exception { + + // On lower bound, returns the first event (ts = 0) + TmfContext context = fExperiment.seekEvent(new TmfTimestamp(0, SCALE, 0)); + TmfEvent event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + + for (int i = 2; i < 20; i++) { + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", i, event.getTimestamp().getValue()); + } + } + + // ------------------------------------------------------------------------ + // seekLocation + // Note: seekLocation() does not reliably set the rank + // ------------------------------------------------------------------------ + + public void testSeekLocationOnCacheBoundary() throws Exception { + + // Position trace at event rank 0 + TmfContext context = fExperiment.seekLocation(null); +// assertEquals("Event rank", 0, context.getRank()); + TmfEvent event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); +// assertEquals("Event rank", 0, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); +// assertEquals("Event rank", 1, context.getRank()); + + // Position trace at event rank 1000 + TmfContext tmpContext = fExperiment.seekEvent(new TmfTimestamp(1001, SCALE, 0)); + context = fExperiment.seekLocation(tmpContext.getLocation().clone()); +// assertEquals("Event rank", 1000, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1001, event.getTimestamp().getValue()); +// assertEquals("Event rank", 1000, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1001, event.getTimestamp().getValue()); +// assertEquals("Event rank", 1001, context.getRank()); + + // Position trace at event rank 4000 + tmpContext = fExperiment.seekEvent(new TmfTimestamp(4001, SCALE, 0)); + context = fExperiment.seekLocation(tmpContext.getLocation().clone()); +// assertEquals("Event rank", 4000, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 4001, event.getTimestamp().getValue()); +// assertEquals("Event rank", 4000, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 4001, event.getTimestamp().getValue()); +// assertEquals("Event rank", 4001, context.getRank()); + } + + public void testSeekLocationNotOnCacheBoundary() throws Exception { + + // Position trace at event rank 9 + TmfContext tmpContext = fExperiment.seekEvent(new TmfTimestamp(10, SCALE, 0)); + TmfContext context = fExperiment.seekLocation(tmpContext.getLocation().clone()); +// assertEquals("Event rank", 9, context.getRank()); + TmfEvent event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 10, event.getTimestamp().getValue()); +// assertEquals("Event rank", 9, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 10, event.getTimestamp().getValue()); +// assertEquals("Event rank", 10, context.getRank()); + + // Position trace at event rank 999 + tmpContext = fExperiment.seekEvent(new TmfTimestamp(1000, SCALE, 0)); + context = fExperiment.seekLocation(tmpContext.getLocation().clone()); +// assertEquals("Event rank", 999, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1000, event.getTimestamp().getValue()); +// assertEquals("Event rank", 999, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1000, event.getTimestamp().getValue()); +// assertEquals("Event rank", 1000, context.getRank()); + + // Position trace at event rank 1001 + tmpContext = fExperiment.seekEvent(new TmfTimestamp(1002, SCALE, 0)); + context = fExperiment.seekLocation(tmpContext.getLocation().clone()); +// assertEquals("Event rank", 1001, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1002, event.getTimestamp().getValue()); +// assertEquals("Event rank", 1001, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1002, event.getTimestamp().getValue()); +// assertEquals("Event rank", 1002, context.getRank()); + + // Position trace at event rank 4500 + tmpContext = fExperiment.seekEvent(new TmfTimestamp(4501, SCALE, 0)); + context = fExperiment.seekLocation(tmpContext.getLocation().clone()); +// assertEquals("Event rank", 4500, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 4501, event.getTimestamp().getValue()); +// assertEquals("Event rank", 4500, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 4501, event.getTimestamp().getValue()); +// assertEquals("Event rank", 4501, context.getRank()); + } + + public void testSeekLocationOutOfScope() throws Exception { + + // Position trace at beginning + TmfContext tmpContext = fExperiment.seekLocation(null); + TmfContext context = fExperiment.seekLocation(tmpContext.getLocation().clone()); +// assertEquals("Event rank", 0, context.getRank()); + TmfEvent event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); +// assertEquals("Event rank", 0, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); +// assertEquals("Event rank", 1, context.getRank()); + + // Position trace at event passed the end + tmpContext = fExperiment.seekEvent(new TmfTimestamp(NB_EVENTS + 1, SCALE, 0)); + context = fExperiment.seekLocation(tmpContext.getLocation().clone()); +// assertEquals("Event rank", NB_EVENTS, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", null, event); +// assertEquals("Event rank", NB_EVENTS, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", null, event); +// assertEquals("Event rank", NB_EVENTS, context.getRank()); + } + + // ------------------------------------------------------------------------ + // seekEvent on timestamp + // ------------------------------------------------------------------------ + + public void testSeekEventOnTimestampOnCacheBoundary() throws Exception { + + // Position trace at event rank 0 + TmfContext context = fExperiment.seekEvent(new TmfTimestamp(1, SCALE, 0)); + assertEquals("Event rank", 0, context.getRank()); + TmfEvent event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + assertEquals("Event rank", 0, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + assertEquals("Event rank", 1, context.getRank()); + + // Position trace at event rank 1000 + context = fExperiment.seekEvent(new TmfTimestamp(1001, SCALE, 0)); + assertEquals("Event rank", 1000, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1001, event.getTimestamp().getValue()); + assertEquals("Event rank", 1000, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1001, event.getTimestamp().getValue()); + assertEquals("Event rank", 1001, context.getRank()); + + // Position trace at event rank 4000 + context = fExperiment.seekEvent(new TmfTimestamp(4001, SCALE, 0)); + assertEquals("Event rank", 4000, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 4001, event.getTimestamp().getValue()); + assertEquals("Event rank", 4000, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 4001, event.getTimestamp().getValue()); + assertEquals("Event rank", 4001, context.getRank()); + } + + public void testSeekEventOnTimestampNotOnCacheBoundary() throws Exception { + + // Position trace at event rank 1 + TmfContext context = fExperiment.seekEvent(new TmfTimestamp(2, SCALE, 0)); + assertEquals("Event rank", 1, context.getRank()); + TmfEvent event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 2, event.getTimestamp().getValue()); + assertEquals("Event rank", 1, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 2, event.getTimestamp().getValue()); + assertEquals("Event rank", 2, context.getRank()); + + // Position trace at event rank 9 + context = fExperiment.seekEvent(new TmfTimestamp(10, SCALE, 0)); + assertEquals("Event rank", 9, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 10, event.getTimestamp().getValue()); + assertEquals("Event rank", 9, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 10, event.getTimestamp().getValue()); + assertEquals("Event rank", 10, context.getRank()); + + // Position trace at event rank 999 + context = fExperiment.seekEvent(new TmfTimestamp(1000, SCALE, 0)); + assertEquals("Event rank", 999, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1000, event.getTimestamp().getValue()); + assertEquals("Event rank", 999, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1000, event.getTimestamp().getValue()); + assertEquals("Event rank", 1000, context.getRank()); + + // Position trace at event rank 1001 + context = fExperiment.seekEvent(new TmfTimestamp(1002, SCALE, 0)); + assertEquals("Event rank", 1001, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1002, event.getTimestamp().getValue()); + assertEquals("Event rank", 1001, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1002, event.getTimestamp().getValue()); + assertEquals("Event rank", 1002, context.getRank()); + + // Position trace at event rank 4500 + context = fExperiment.seekEvent(new TmfTimestamp(4501, SCALE, 0)); + assertEquals("Event rank", 4500, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 4501, event.getTimestamp().getValue()); + assertEquals("Event rank", 4500, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 4501, event.getTimestamp().getValue()); + assertEquals("Event rank", 4501, context.getRank()); + } + + public void testSeekEventOnTimestampoutOfScope() throws Exception { + + // Position trace at beginning + TmfContext context = fExperiment.seekEvent(new TmfTimestamp(-1, SCALE, 0)); + assertEquals("Event rank", 0, context.getRank()); + TmfEvent event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + assertEquals("Event rank", 0, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + assertEquals("Event rank", 1, context.getRank()); + + // Position trace at event passed the end + context = fExperiment.seekEvent(new TmfTimestamp(NB_EVENTS + 1, SCALE, 0)); + assertEquals("Event rank", NB_EVENTS, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", null, event); + assertEquals("Event rank", NB_EVENTS, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", null, event); + assertEquals("Event rank", NB_EVENTS, context.getRank()); + } + + // ------------------------------------------------------------------------ + // seekEvent on rank + // ------------------------------------------------------------------------ + + public void testSeekOnRankOnCacheBoundary() throws Exception { + + // On lower bound, returns the first event (ts = 1) + TmfContext context = fExperiment.seekEvent(0); + assertEquals("Event rank", 0, context.getRank()); + TmfEvent event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + assertEquals("Event rank", 0, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + assertEquals("Event rank", 1, context.getRank()); + + // Position trace at event rank 1000 + context = fExperiment.seekEvent(1000); + assertEquals("Event rank", 1000, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1001, event.getTimestamp().getValue()); + assertEquals("Event rank", 1000, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1001, event.getTimestamp().getValue()); + assertEquals("Event rank", 1001, context.getRank()); + + // Position trace at event rank 4000 + context = fExperiment.seekEvent(4000); + assertEquals("Event rank", 4000, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 4001, event.getTimestamp().getValue()); + assertEquals("Event rank", 4000, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 4001, event.getTimestamp().getValue()); + assertEquals("Event rank", 4001, context.getRank()); + } + + public void testSeekOnRankNotOnCacheBoundary() throws Exception { + + // Position trace at event rank 9 + TmfContext context = fExperiment.seekEvent(9); + assertEquals("Event rank", 9, context.getRank()); + TmfEvent event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 10, event.getTimestamp().getValue()); + assertEquals("Event rank", 9, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 10, event.getTimestamp().getValue()); + assertEquals("Event rank", 10, context.getRank()); + + // Position trace at event rank 999 + context = fExperiment.seekEvent(999); + assertEquals("Event rank", 999, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1000, event.getTimestamp().getValue()); + assertEquals("Event rank", 999, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1000, event.getTimestamp().getValue()); + assertEquals("Event rank", 1000, context.getRank()); + + // Position trace at event rank 1001 + context = fExperiment.seekEvent(1001); + assertEquals("Event rank", 1001, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1002, event.getTimestamp().getValue()); + assertEquals("Event rank", 1001, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1002, event.getTimestamp().getValue()); + assertEquals("Event rank", 1002, context.getRank()); + + // Position trace at event rank 4500 + context = fExperiment.seekEvent(4500); + assertEquals("Event rank", 4500, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 4501, event.getTimestamp().getValue()); + assertEquals("Event rank", 4500, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 4501, event.getTimestamp().getValue()); + assertEquals("Event rank", 4501, context.getRank()); + } + + public void testSeekEventOnRankOfScope() throws Exception { + + // Position trace at beginning + TmfContext context = fExperiment.seekEvent(-1); + assertEquals("Event rank", 0, context.getRank()); + TmfEvent event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + assertEquals("Event rank", 0, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + assertEquals("Event rank", 1, context.getRank()); + + // Position trace at event passed the end + context = fExperiment.seekEvent(NB_EVENTS); + assertEquals("Event rank", NB_EVENTS, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", null, event); + assertEquals("Event rank", NB_EVENTS, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", null, event); + assertEquals("Event rank", NB_EVENTS, context.getRank()); + } + + // ------------------------------------------------------------------------ + // processRequest + // ------------------------------------------------------------------------ + + public void testProcessRequestForNbEvents() throws Exception { + final int blockSize = 100; + final int nbEvents = 1000; + final Vector requestedEvents = new Vector(); + + TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch); + final TmfEventRequest request = new TmfEventRequest(TmfEvent.class, range, nbEvents, blockSize) { + @Override + public void handleData() { + TmfEvent[] events = getData(); + for (TmfEvent e : events) { + requestedEvents.add(e); + } + } + }; + fExperiment.sendRequest(request); + request.waitForCompletion(); + + assertEquals("nbEvents", nbEvents, requestedEvents.size()); + assertTrue("isCompleted", request.isCompleted()); + assertFalse("isCancelled", request.isCancelled()); + + // Ensure that we have distinct events. + // Don't go overboard: we are not validating the stub! + for (int i = 0; i < nbEvents; i++) { + assertEquals("Distinct events", i+1, requestedEvents.get(i).getTimestamp().getValue()); + } + } + + public void testProcessRequestForNbEvents2() throws Exception { + final int blockSize = 2 * NB_EVENTS; + final int nbEvents = 1000; + final Vector requestedEvents = new Vector(); + + TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch); + final TmfEventRequest request = new TmfEventRequest(TmfEvent.class, range, nbEvents, blockSize) { + @Override + public void handleData() { + TmfEvent[] events = getData(); + for (TmfEvent e : events) { + requestedEvents.add(e); + } + } + }; + fExperiment.sendRequest(request); + request.waitForCompletion(); + + assertEquals("nbEvents", nbEvents, requestedEvents.size()); + assertTrue("isCompleted", request.isCompleted()); + assertFalse("isCancelled", request.isCancelled()); + + // Ensure that we have distinct events. + // Don't go overboard: we are not validating the stub! + for (int i = 0; i < nbEvents; i++) { + assertEquals("Distinct events", i+1, requestedEvents.get(i).getTimestamp().getValue()); + } + } + + public void testProcessRequestForAllEvents() throws Exception { + final int nbEvents = TmfEventRequest.ALL_DATA; + final int blockSize = 1; + final Vector requestedEvents = new Vector(); + long nbExpectedEvents = fExperiment.getNbEvents(); + + TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch); + final TmfEventRequest request = new TmfEventRequest(TmfEvent.class, range, nbEvents, blockSize) { + @Override + public void handleData() { + TmfEvent[] events = getData(); + for (TmfEvent e : events) { + requestedEvents.add(e); + } + } + }; + fExperiment.sendRequest(request); + request.waitForCompletion(); + + assertEquals("nbEvents", nbExpectedEvents, requestedEvents.size()); + assertTrue("isCompleted", request.isCompleted()); + assertFalse("isCancelled", request.isCancelled()); + + // Ensure that we have distinct events. + // Don't go overboard: we are not validating the stub! + for (int i = 0; i < nbExpectedEvents; i++) { + assertEquals("Distinct events", i+1, requestedEvents.get(i).getTimestamp().getValue()); + } + } + + // ------------------------------------------------------------------------ + // cancel + // ------------------------------------------------------------------------ + + public void testCancel() throws Exception { + final int nbEvents = NB_EVENTS; + final int blockSize = fDefaultBlockSize; + final Vector requestedEvents = new Vector(); + + TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch); + final TmfEventRequest request = new TmfEventRequest(TmfEvent.class, range, nbEvents, blockSize) { + @Override + public void handleData() { + TmfEvent[] events = getData(); + for (TmfEvent e : events) { + requestedEvents.add(e); + } + // Cancel request after the first chunk is received + cancel(); + } + }; + fExperiment.sendRequest(request); + request.waitForCompletion(); + + assertEquals("nbEvents", blockSize, requestedEvents.size()); + assertTrue("isCompleted", request.isCompleted()); + assertTrue("isCancelled", request.isCancelled()); + } + + // ------------------------------------------------------------------------ + // getRank + // ------------------------------------------------------------------------ + + public void testGetRank() throws Exception { + assertEquals("getRank", 0, fExperiment.getRank(new TmfTimestamp())); + assertEquals("getRank", 0, fExperiment.getRank(new TmfTimestamp( 1, (byte) -3))); + assertEquals("getRank", 10, fExperiment.getRank(new TmfTimestamp( 11, (byte) -3))); + assertEquals("getRank", 100, fExperiment.getRank(new TmfTimestamp( 101, (byte) -3))); + assertEquals("getRank", 1000, fExperiment.getRank(new TmfTimestamp(1001, (byte) -3))); + assertEquals("getRank", 2000, fExperiment.getRank(new TmfTimestamp(2001, (byte) -3))); + assertEquals("getRank", 2500, fExperiment.getRank(new TmfTimestamp(2501, (byte) -3))); + } + + // ------------------------------------------------------------------------ + // getTimestamp + // ------------------------------------------------------------------------ + + public void testGetTimestamp() throws Exception { + assertTrue("getTimestamp", fExperiment.getTimestamp( 0).equals(new TmfTimestamp( 1, (byte) -3))); + assertTrue("getTimestamp", fExperiment.getTimestamp( 10).equals(new TmfTimestamp( 11, (byte) -3))); + assertTrue("getTimestamp", fExperiment.getTimestamp( 100).equals(new TmfTimestamp( 101, (byte) -3))); + assertTrue("getTimestamp", fExperiment.getTimestamp(1000).equals(new TmfTimestamp(1001, (byte) -3))); + assertTrue("getTimestamp", fExperiment.getTimestamp(2000).equals(new TmfTimestamp(2001, (byte) -3))); + assertTrue("getTimestamp", fExperiment.getTimestamp(2500).equals(new TmfTimestamp(2501, (byte) -3))); + } + +} \ No newline at end of file diff --git a/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/experiment/TmfMultiTraceExperimentTest.java b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/experiment/TmfMultiTraceExperimentTest.java new file mode 100644 index 0000000000..0a64504b50 --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/experiment/TmfMultiTraceExperimentTest.java @@ -0,0 +1,639 @@ +/******************************************************************************* + * Copyright (c) 2009, 2010 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: + * Francois Chouinard - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.linuxtools.tmf.tests.experiment; + +import java.io.File; +import java.io.IOException; +import java.net.URISyntaxException; +import java.net.URL; +import java.util.Vector; + +import junit.framework.TestCase; + +import org.eclipse.core.runtime.FileLocator; +import org.eclipse.core.runtime.Path; +import org.eclipse.linuxtools.tmf.event.TmfEvent; +import org.eclipse.linuxtools.tmf.event.TmfTimeRange; +import org.eclipse.linuxtools.tmf.event.TmfTimestamp; +import org.eclipse.linuxtools.tmf.experiment.TmfExperiment; +import org.eclipse.linuxtools.tmf.request.TmfEventRequest; +import org.eclipse.linuxtools.tmf.tests.TmfCoreTestPlugin; +import org.eclipse.linuxtools.tmf.trace.ITmfTrace; +import org.eclipse.linuxtools.tmf.trace.TmfContext; +import org.eclipse.linuxtools.tmf.trace.TmfTraceStub; + +/** + * TmfExperimentTest + *

+ * TODO: Implement me. Please. + */ +public class TmfMultiTraceExperimentTest extends TestCase { + + private static final String DIRECTORY = "testfiles"; + private static final String TEST_STREAM1 = "O-Test-10K"; + private static final String TEST_STREAM2 = "E-Test-10K"; + private static final String EXPERIMENT = "MyExperiment"; + private static int NB_EVENTS = 20000; + private static int fDefaultBlockSize = 1000; + + private static ITmfTrace[] fTrace; + private static TmfExperiment fExperiment; + + private static byte SCALE = (byte) -3; + + // ------------------------------------------------------------------------ + // Housekeeping + // ------------------------------------------------------------------------ + + private ITmfTrace[] setupTrace(String path1, String path2) { + if (fTrace == null) { + fTrace = new ITmfTrace[2]; + try { + URL location = FileLocator.find(TmfCoreTestPlugin.getDefault().getBundle(), new Path(path1), null); + File test = new File(FileLocator.toFileURL(location).toURI()); + TmfTraceStub trace1 = new TmfTraceStub(test.getPath(), true); + fTrace[0] = trace1; + location = FileLocator.find(TmfCoreTestPlugin.getDefault().getBundle(), new Path(path2), null); + test = new File(FileLocator.toFileURL(location).toURI()); + TmfTraceStub trace2 = new TmfTraceStub(test.getPath(), true); + fTrace[1] = trace2; + } catch (URISyntaxException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return fTrace; + } + + private void setupExperiment() { + if (fExperiment == null) { + fExperiment = new TmfExperiment(TmfEvent.class, EXPERIMENT, fTrace); + fExperiment.indexExperiment(true); + } + } + + public TmfMultiTraceExperimentTest(String name) throws Exception { + super(name); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + setupTrace(DIRECTORY + File.separator + TEST_STREAM1, DIRECTORY + File.separator + TEST_STREAM2); + setupExperiment(); + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + } + + // ------------------------------------------------------------------------ + // Constructor + // ------------------------------------------------------------------------ + + public void testBasicTmfExperimentConstructor() { + assertEquals("GetId", EXPERIMENT, fExperiment.getName()); + assertEquals("GetEpoch", TmfTimestamp.Zero, fExperiment.getEpoch()); + assertEquals("GetNbEvents", NB_EVENTS, fExperiment.getNbEvents()); + + TmfTimeRange timeRange = fExperiment.getTimeRange(); + assertEquals("getStartTime", 1, timeRange.getStartTime().getValue()); + assertEquals("getEndTime", NB_EVENTS, timeRange.getEndTime().getValue()); + } + + // ------------------------------------------------------------------------ + // parseEvent - make sure parseEvent doesn't update the context + // ------------------------------------------------------------------------ + + public void testParseEvent() throws Exception { + + // On lower bound, returns the first event (ts = 0) + TmfContext context = fExperiment.seekEvent(new TmfTimestamp(0, SCALE, 0)); + + TmfEvent event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + + for (int i = 1; i < 20; i++) { + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", i, event.getTimestamp().getValue()); + } + + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 20, event.getTimestamp().getValue()); + + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 20, event.getTimestamp().getValue()); + } + + // ------------------------------------------------------------------------ + // getNextEvent - updates the context + // ------------------------------------------------------------------------ + + public void testGetNextEvent() throws Exception { + + // On lower bound, returns the first event (ts = 0) + TmfContext context = fExperiment.seekEvent(new TmfTimestamp(0, SCALE, 0)); + TmfEvent event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + + for (int i = 2; i < 20; i++) { + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", i, event.getTimestamp().getValue()); + } + } + + // ------------------------------------------------------------------------ + // seekLocation + // Note: seekLocation() does not reliably set the rank + // ------------------------------------------------------------------------ + + public void testSeekLocationOnCacheBoundary() throws Exception { + + // Position trace at event rank 0 + TmfContext context = fExperiment.seekLocation(null); +// assertEquals("Event rank", 0, context.getRank()); + TmfEvent event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); +// assertEquals("Event rank", 0, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); +// assertEquals("Event rank", 1, context.getRank()); + + // Position trace at event rank 1000 + TmfContext tmpContext = fExperiment.seekEvent(new TmfTimestamp(1001, SCALE, 0)); + context = fExperiment.seekLocation(tmpContext.getLocation().clone()); +// assertEquals("Event rank", 1000, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1001, event.getTimestamp().getValue()); +// assertEquals("Event rank", 1000, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1001, event.getTimestamp().getValue()); +// assertEquals("Event rank", 1001, context.getRank()); + + // Position trace at event rank 4000 + tmpContext = fExperiment.seekEvent(new TmfTimestamp(4001, SCALE, 0)); + context = fExperiment.seekLocation(tmpContext.getLocation().clone()); +// assertEquals("Event rank", 4000, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 4001, event.getTimestamp().getValue()); +// assertEquals("Event rank", 4000, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 4001, event.getTimestamp().getValue()); +// assertEquals("Event rank", 4001, context.getRank()); + } + + public void testSeekLocationNotOnCacheBoundary() throws Exception { + + // Position trace at event rank 9 + TmfContext tmpContext = fExperiment.seekEvent(new TmfTimestamp(10, SCALE, 0)); + TmfContext context = fExperiment.seekLocation(tmpContext.getLocation().clone()); +// assertEquals("Event rank", 9, context.getRank()); + TmfEvent event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 10, event.getTimestamp().getValue()); +// assertEquals("Event rank", 9, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 10, event.getTimestamp().getValue()); +// assertEquals("Event rank", 10, context.getRank()); + + // Position trace at event rank 999 + tmpContext = fExperiment.seekEvent(new TmfTimestamp(1000, SCALE, 0)); + context = fExperiment.seekLocation(tmpContext.getLocation().clone()); +// assertEquals("Event rank", 999, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1000, event.getTimestamp().getValue()); +// assertEquals("Event rank", 999, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1000, event.getTimestamp().getValue()); +// assertEquals("Event rank", 1000, context.getRank()); + + // Position trace at event rank 1001 + tmpContext = fExperiment.seekEvent(new TmfTimestamp(1002, SCALE, 0)); + context = fExperiment.seekLocation(tmpContext.getLocation().clone()); +// assertEquals("Event rank", 1001, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1002, event.getTimestamp().getValue()); +// assertEquals("Event rank", 1001, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1002, event.getTimestamp().getValue()); +// assertEquals("Event rank", 1002, context.getRank()); + + // Position trace at event rank 4500 + tmpContext = fExperiment.seekEvent(new TmfTimestamp(4501, SCALE, 0)); + context = fExperiment.seekLocation(tmpContext.getLocation().clone()); +// assertEquals("Event rank", 4500, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 4501, event.getTimestamp().getValue()); +// assertEquals("Event rank", 4500, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 4501, event.getTimestamp().getValue()); +// assertEquals("Event rank", 4501, context.getRank()); + } + + public void testSeekLocationOutOfScope() throws Exception { + + // Position trace at beginning + TmfContext tmpContext = fExperiment.seekLocation(null); + TmfContext context = fExperiment.seekLocation(tmpContext.getLocation().clone()); +// assertEquals("Event rank", 0, context.getRank()); + TmfEvent event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); +// assertEquals("Event rank", 0, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); +// assertEquals("Event rank", 1, context.getRank()); + + // Position trace at event passed the end + tmpContext = fExperiment.seekEvent(new TmfTimestamp(NB_EVENTS + 1, SCALE, 0)); + context = fExperiment.seekLocation(tmpContext.getLocation().clone()); +// assertEquals("Event rank", NB_EVENTS, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", null, event); +// assertEquals("Event rank", NB_EVENTS, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", null, event); +// assertEquals("Event rank", NB_EVENTS, context.getRank()); + } + + // ------------------------------------------------------------------------ + // seekEvent on timestamp + // ------------------------------------------------------------------------ + + public void testSeekEventOnTimestampOnCacheBoundary() throws Exception { + + // Position trace at event rank 0 + TmfContext context = fExperiment.seekEvent(new TmfTimestamp(1, SCALE, 0)); + assertEquals("Event rank", 0, context.getRank()); + TmfEvent event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + assertEquals("Event rank", 0, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + assertEquals("Event rank", 1, context.getRank()); + + // Position trace at event rank 1000 + context = fExperiment.seekEvent(new TmfTimestamp(1001, SCALE, 0)); + assertEquals("Event rank", 1000, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1001, event.getTimestamp().getValue()); + assertEquals("Event rank", 1000, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1001, event.getTimestamp().getValue()); + assertEquals("Event rank", 1001, context.getRank()); + + // Position trace at event rank 4000 + context = fExperiment.seekEvent(new TmfTimestamp(4001, SCALE, 0)); + assertEquals("Event rank", 4000, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 4001, event.getTimestamp().getValue()); + assertEquals("Event rank", 4000, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 4001, event.getTimestamp().getValue()); + assertEquals("Event rank", 4001, context.getRank()); + } + + public void testSeekEventOnTimestampNotOnCacheBoundary() throws Exception { + + // Position trace at event rank 1 + TmfContext context = fExperiment.seekEvent(new TmfTimestamp(2, SCALE, 0)); + assertEquals("Event rank", 1, context.getRank()); + TmfEvent event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 2, event.getTimestamp().getValue()); + assertEquals("Event rank", 1, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 2, event.getTimestamp().getValue()); + assertEquals("Event rank", 2, context.getRank()); + + // Position trace at event rank 9 + context = fExperiment.seekEvent(new TmfTimestamp(10, SCALE, 0)); + assertEquals("Event rank", 9, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 10, event.getTimestamp().getValue()); + assertEquals("Event rank", 9, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 10, event.getTimestamp().getValue()); + assertEquals("Event rank", 10, context.getRank()); + + // Position trace at event rank 999 + context = fExperiment.seekEvent(new TmfTimestamp(1000, SCALE, 0)); + assertEquals("Event rank", 999, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1000, event.getTimestamp().getValue()); + assertEquals("Event rank", 999, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1000, event.getTimestamp().getValue()); + assertEquals("Event rank", 1000, context.getRank()); + + // Position trace at event rank 1001 + context = fExperiment.seekEvent(new TmfTimestamp(1002, SCALE, 0)); + assertEquals("Event rank", 1001, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1002, event.getTimestamp().getValue()); + assertEquals("Event rank", 1001, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1002, event.getTimestamp().getValue()); + assertEquals("Event rank", 1002, context.getRank()); + + // Position trace at event rank 4500 + context = fExperiment.seekEvent(new TmfTimestamp(4501, SCALE, 0)); + assertEquals("Event rank", 4500, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 4501, event.getTimestamp().getValue()); + assertEquals("Event rank", 4500, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 4501, event.getTimestamp().getValue()); + assertEquals("Event rank", 4501, context.getRank()); + } + + public void testSeekEventOnTimestampoutOfScope() throws Exception { + + // Position trace at beginning + TmfContext context = fExperiment.seekEvent(new TmfTimestamp(-1, SCALE, 0)); + assertEquals("Event rank", 0, context.getRank()); + TmfEvent event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + assertEquals("Event rank", 0, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + assertEquals("Event rank", 1, context.getRank()); + + // Position trace at event passed the end + context = fExperiment.seekEvent(new TmfTimestamp(NB_EVENTS + 1, SCALE, 0)); + assertEquals("Event rank", NB_EVENTS, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", null, event); + assertEquals("Event rank", NB_EVENTS, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", null, event); + assertEquals("Event rank", NB_EVENTS, context.getRank()); + } + + // ------------------------------------------------------------------------ + // seekEvent on rank + // ------------------------------------------------------------------------ + + public void testSeekOnRankOnCacheBoundary() throws Exception { + + // On lower bound, returns the first event (ts = 1) + TmfContext context = fExperiment.seekEvent(0); + assertEquals("Event rank", 0, context.getRank()); + TmfEvent event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + assertEquals("Event rank", 0, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + assertEquals("Event rank", 1, context.getRank()); + + // Position trace at event rank 1000 + context = fExperiment.seekEvent(1000); + assertEquals("Event rank", 1000, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1001, event.getTimestamp().getValue()); + assertEquals("Event rank", 1000, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1001, event.getTimestamp().getValue()); + assertEquals("Event rank", 1001, context.getRank()); + + // Position trace at event rank 4000 + context = fExperiment.seekEvent(4000); + assertEquals("Event rank", 4000, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 4001, event.getTimestamp().getValue()); + assertEquals("Event rank", 4000, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 4001, event.getTimestamp().getValue()); + assertEquals("Event rank", 4001, context.getRank()); + } + + public void testSeekOnRankNotOnCacheBoundary() throws Exception { + + // Position trace at event rank 9 + TmfContext context = fExperiment.seekEvent(9); + assertEquals("Event rank", 9, context.getRank()); + TmfEvent event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 10, event.getTimestamp().getValue()); + assertEquals("Event rank", 9, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 10, event.getTimestamp().getValue()); + assertEquals("Event rank", 10, context.getRank()); + + // Position trace at event rank 999 + context = fExperiment.seekEvent(999); + assertEquals("Event rank", 999, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1000, event.getTimestamp().getValue()); + assertEquals("Event rank", 999, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1000, event.getTimestamp().getValue()); + assertEquals("Event rank", 1000, context.getRank()); + + // Position trace at event rank 1001 + context = fExperiment.seekEvent(1001); + assertEquals("Event rank", 1001, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1002, event.getTimestamp().getValue()); + assertEquals("Event rank", 1001, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1002, event.getTimestamp().getValue()); + assertEquals("Event rank", 1002, context.getRank()); + + // Position trace at event rank 4500 + context = fExperiment.seekEvent(4500); + assertEquals("Event rank", 4500, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 4501, event.getTimestamp().getValue()); + assertEquals("Event rank", 4500, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 4501, event.getTimestamp().getValue()); + assertEquals("Event rank", 4501, context.getRank()); + } + + public void testSeekEventOnRankOfScope() throws Exception { + + // Position trace at beginning + TmfContext context = fExperiment.seekEvent(-1); + assertEquals("Event rank", 0, context.getRank()); + TmfEvent event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + assertEquals("Event rank", 0, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + assertEquals("Event rank", 1, context.getRank()); + + // Position trace at event passed the end + context = fExperiment.seekEvent(NB_EVENTS); + assertEquals("Event rank", NB_EVENTS, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", null, event); + assertEquals("Event rank", NB_EVENTS, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", null, event); + assertEquals("Event rank", NB_EVENTS, context.getRank()); + } + + // ------------------------------------------------------------------------ + // processRequest + // ------------------------------------------------------------------------ + + public void testProcessRequestForNbEvents() throws Exception { + final int blockSize = 100; + final int nbEvents = 1000; + final Vector requestedEvents = new Vector(); + + TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch); + final TmfEventRequest request = new TmfEventRequest(TmfEvent.class, range, nbEvents, blockSize) { + @Override + public void handleData() { + TmfEvent[] events = getData(); + for (TmfEvent e : events) { + requestedEvents.add(e); + } + } + }; + fExperiment.sendRequest(request); + request.waitForCompletion(); + + assertEquals("nbEvents", nbEvents, requestedEvents.size()); + assertTrue("isCompleted", request.isCompleted()); + assertFalse("isCancelled", request.isCancelled()); + + // Ensure that we have distinct events. + // Don't go overboard: we are not validating the stub! + for (int i = 0; i < nbEvents; i++) { + assertEquals("Distinct events", i+1, requestedEvents.get(i).getTimestamp().getValue()); + } + } + + public void testProcessRequestForNbEvents2() throws Exception { + final int blockSize = 2 * NB_EVENTS; + final int nbEvents = 1000; + final Vector requestedEvents = new Vector(); + + TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch); + final TmfEventRequest request = new TmfEventRequest(TmfEvent.class, range, nbEvents, blockSize) { + @Override + public void handleData() { + TmfEvent[] events = getData(); + for (TmfEvent e : events) { + requestedEvents.add(e); + } + } + }; + fExperiment.sendRequest(request); + request.waitForCompletion(); + + assertEquals("nbEvents", nbEvents, requestedEvents.size()); + assertTrue("isCompleted", request.isCompleted()); + assertFalse("isCancelled", request.isCancelled()); + + // Ensure that we have distinct events. + // Don't go overboard: we are not validating the stub! + for (int i = 0; i < nbEvents; i++) { + assertEquals("Distinct events", i+1, requestedEvents.get(i).getTimestamp().getValue()); + } + } + + public void testProcessRequestForAllEvents() throws Exception { + final int nbEvents = TmfEventRequest.ALL_DATA; + final int blockSize = 1; + final Vector requestedEvents = new Vector(); + long nbExpectedEvents = fExperiment.getNbEvents(); + + TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch); + final TmfEventRequest request = new TmfEventRequest(TmfEvent.class, range, nbEvents, blockSize) { + @Override + public void handleData() { + TmfEvent[] events = getData(); + for (TmfEvent e : events) { + requestedEvents.add(e); + } + } + }; + fExperiment.sendRequest(request); + request.waitForCompletion(); + + assertEquals("nbEvents", nbExpectedEvents, requestedEvents.size()); + assertTrue("isCompleted", request.isCompleted()); + assertFalse("isCancelled", request.isCancelled()); + + // Ensure that we have distinct events. + // Don't go overboard: we are not validating the stub! + for (int i = 0; i < nbExpectedEvents; i++) { + assertEquals("Distinct events", i+1, requestedEvents.get(i).getTimestamp().getValue()); + } + } + + // ------------------------------------------------------------------------ + // cancel + // ------------------------------------------------------------------------ + + public void testCancel() throws Exception { + final int nbEvents = NB_EVENTS; + final int blockSize = fDefaultBlockSize; + final Vector requestedEvents = new Vector(); + + TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch); + final TmfEventRequest request = new TmfEventRequest(TmfEvent.class, range, nbEvents, blockSize) { + @Override + public void handleData() { + TmfEvent[] events = getData(); + for (TmfEvent e : events) { + requestedEvents.add(e); + } + // Cancel request after the first chunk is received + cancel(); + } + }; + fExperiment.sendRequest(request); + request.waitForCompletion(); + + assertEquals("nbEvents", blockSize, requestedEvents.size()); + assertTrue("isCompleted", request.isCompleted()); + assertTrue("isCancelled", request.isCancelled()); + } + + // ------------------------------------------------------------------------ + // getRank + // ------------------------------------------------------------------------ + + public void testGetRank() throws Exception { + assertEquals("getRank", 0, fExperiment.getRank(new TmfTimestamp())); + assertEquals("getRank", 0, fExperiment.getRank(new TmfTimestamp( 1, (byte) -3))); + assertEquals("getRank", 10, fExperiment.getRank(new TmfTimestamp( 11, (byte) -3))); + assertEquals("getRank", 100, fExperiment.getRank(new TmfTimestamp( 101, (byte) -3))); + assertEquals("getRank", 1000, fExperiment.getRank(new TmfTimestamp(1001, (byte) -3))); + assertEquals("getRank", 2000, fExperiment.getRank(new TmfTimestamp(2001, (byte) -3))); + assertEquals("getRank", 2500, fExperiment.getRank(new TmfTimestamp(2501, (byte) -3))); + } + + // ------------------------------------------------------------------------ + // getTimestamp + // ------------------------------------------------------------------------ + + public void testGetTimestamp() throws Exception { + assertTrue("getTimestamp", fExperiment.getTimestamp( 0).equals(new TmfTimestamp( 1, (byte) -3))); + assertTrue("getTimestamp", fExperiment.getTimestamp( 10).equals(new TmfTimestamp( 11, (byte) -3))); + assertTrue("getTimestamp", fExperiment.getTimestamp( 100).equals(new TmfTimestamp( 101, (byte) -3))); + assertTrue("getTimestamp", fExperiment.getTimestamp(1000).equals(new TmfTimestamp(1001, (byte) -3))); + assertTrue("getTimestamp", fExperiment.getTimestamp(2000).equals(new TmfTimestamp(2001, (byte) -3))); + assertTrue("getTimestamp", fExperiment.getTimestamp(2500).equals(new TmfTimestamp(2501, (byte) -3))); + } + +} \ No newline at end of file diff --git a/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/request/AllTests.java b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/request/AllTests.java new file mode 100644 index 0000000000..e578e04eb9 --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/request/AllTests.java @@ -0,0 +1,22 @@ +package org.eclipse.linuxtools.tmf.tests.request; + +import junit.framework.Test; +import junit.framework.TestSuite; + +import org.eclipse.linuxtools.tmf.TmfCorePlugin; + +public class AllTests { + + public static Test suite() { + TestSuite suite = new TestSuite("Test suite for " + TmfCorePlugin.PLUGIN_ID + ".request"); //$NON-NLS-1$); + //$JUnit-BEGIN$ + suite.addTestSuite(TmfDataRequestTest.class); + suite.addTestSuite(TmfEventRequestTest.class); + suite.addTestSuite(TmfCoalescedDataRequestTest.class); + suite.addTestSuite(TmfCoalescedEventRequestTest.class); + suite.addTestSuite(TmfRequestExecutorTest.class); + //$JUnit-END$ + return suite; + } + +} diff --git a/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/request/TmfCoalescedDataRequestTest.java b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/request/TmfCoalescedDataRequestTest.java new file mode 100644 index 0000000000..3187347c12 --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/request/TmfCoalescedDataRequestTest.java @@ -0,0 +1,412 @@ +/******************************************************************************* + * Copyright (c) 2009, 2010 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: + * Francois Chouinard - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.linuxtools.tmf.tests.request; + + +import junit.framework.TestCase; + +import org.eclipse.linuxtools.tmf.event.TmfEvent; +import org.eclipse.linuxtools.tmf.event.TmfEventReference; +import org.eclipse.linuxtools.tmf.event.TmfEventSource; +import org.eclipse.linuxtools.tmf.event.TmfEventType; +import org.eclipse.linuxtools.tmf.event.TmfTimestamp; +import org.eclipse.linuxtools.tmf.request.TmfCoalescedDataRequest; +import org.eclipse.linuxtools.tmf.request.TmfDataRequest; +import org.eclipse.linuxtools.tmf.request.TmfDataRequestStub; + +/** + * TmfCoalescedDataRequestTest + *

+ * Test suite for the TmfCoalescedDataRequest class. + */ +public class TmfCoalescedDataRequestTest extends TestCase { + + // ------------------------------------------------------------------------ + // Variables + // ------------------------------------------------------------------------ + + private static TmfCoalescedDataRequest fRequest1; + private static TmfCoalescedDataRequest fRequest2; + private static TmfCoalescedDataRequest fRequest3; + private static TmfCoalescedDataRequest fRequest4; + + private static TmfCoalescedDataRequest fRequest1b; + private static TmfCoalescedDataRequest fRequest1c; + + private static int fRequestCount; + + // ------------------------------------------------------------------------ + // Housekeeping + // ------------------------------------------------------------------------ + + public TmfCoalescedDataRequestTest(String name) { + super(name); + } + + @Override + public void setUp() throws Exception { + super.setUp(); + TmfDataRequest.reset(); + fRequest1 = new TmfCoalescedDataRequest(TmfEvent.class, 10, 100, 200); + fRequest2 = new TmfCoalescedDataRequest(TmfEvent.class, 20, 100, 200); + fRequest3 = new TmfCoalescedDataRequest(TmfEvent.class, 20, 200, 200); + fRequest4 = new TmfCoalescedDataRequest(TmfEvent.class, 20, 200, 300); + + fRequest1b = new TmfCoalescedDataRequest(TmfEvent.class, 10, 100, 200); + fRequest1c = new TmfCoalescedDataRequest(TmfEvent.class, 10, 100, 200); + + fRequestCount = fRequest1c.getRequestId() + 1; + } + + @Override + public void tearDown() throws Exception { + super.tearDown(); + } + + private TmfCoalescedDataRequest setupTestRequest(final boolean[] flags) { + + TmfCoalescedDataRequest request = new TmfCoalescedDataRequest(TmfEvent.class, 10, 100, 200) { + @Override + public void handleCompleted() { + super.handleCompleted(); + flags[0] = true; + } + @Override + public void handleSuccess() { + super.handleSuccess(); + flags[1] = true; + } + @Override + public void handleFailure() { + super.handleFailure(); + flags[2] = true; + } + @Override + public void handleCancel() { + super.handleCancel(); + flags[3] = true; + } + }; + return request; + } + + // ------------------------------------------------------------------------ + // Constructors + // ------------------------------------------------------------------------ + + public void testTmfCoalescedDataRequest() { + TmfCoalescedDataRequest request = new TmfCoalescedDataRequest(TmfEvent.class); + + assertEquals("getRequestId", fRequestCount++, request.getRequestId()); + assertEquals("getDataType", TmfEvent.class, request.getDataType()); + + assertEquals("getIndex", 0, request.getIndex()); + assertEquals("getNbRequestedEvents", TmfDataRequest.ALL_DATA, request.getNbRequested()); + assertEquals("getBlockize", TmfDataRequest.DEFAULT_BLOCK_SIZE, request.getBlockize()); + + assertFalse("isCompleted", request.isCompleted()); + assertFalse("isFailed", request.isFailed()); + assertFalse("isCancelled", request.isCancelled()); + + assertEquals("getNbRead", 0, request.getNbRead()); + } + + public void testTmfCoalescedDataRequestIndex() { + TmfCoalescedDataRequest request = new TmfCoalescedDataRequest(TmfEvent.class, 10); + + assertEquals("getRequestId", fRequestCount++, request.getRequestId()); + assertEquals("getDataType", TmfEvent.class, request.getDataType()); + + assertEquals("getIndex", 10, request.getIndex()); + assertEquals("getNbRequestedEvents", TmfDataRequest.ALL_DATA, request.getNbRequested()); + assertEquals("getBlockize", TmfDataRequest.DEFAULT_BLOCK_SIZE, request.getBlockize()); + + assertFalse("isCompleted", request.isCompleted()); + assertFalse("isFailed", request.isFailed()); + assertFalse("isCancelled", request.isCancelled()); + + assertEquals("getNbRead", 0, request.getNbRead()); + } + + public void testTmfCoalescedDataRequestIndexNbRequested() { + TmfCoalescedDataRequest request = new TmfCoalescedDataRequest(TmfEvent.class, 10, 100); + + assertEquals("getRequestId", fRequestCount++, request.getRequestId()); + assertEquals("getDataType", TmfEvent.class, request.getDataType()); + + assertEquals("getIndex", 10, request.getIndex()); + assertEquals("getNbRequestedEvents", 100, request.getNbRequested()); + assertEquals("getBlockize", TmfDataRequest.DEFAULT_BLOCK_SIZE, request.getBlockize()); + + assertFalse("isCompleted", request.isCompleted()); + assertFalse("isFailed", request.isFailed()); + assertFalse("isCancelled", request.isCancelled()); + + assertEquals("getNbRead", 0, request.getNbRead()); + } + + public void testTmfCoalescedDataRequestIndexNbEventsBlocksize() { + TmfCoalescedDataRequest request = new TmfCoalescedDataRequest(TmfEvent.class, 10, 100, 200); + + assertEquals("getRequestId", fRequestCount++, request.getRequestId()); + assertEquals("getDataType", TmfEvent.class, request.getDataType()); + + assertEquals("getIndex", 10, request.getIndex()); + assertEquals("getNbRequestedEvents", 100, request.getNbRequested()); + assertEquals("getBlockize", 200, request.getBlockize()); + + assertFalse("isCompleted", request.isCompleted()); + assertFalse("isFailed", request.isFailed()); + assertFalse("isCancelled", request.isCancelled()); + + assertEquals("getNbRead", 0, request.getNbRead()); + } + + // ------------------------------------------------------------------------ + // equals + // ------------------------------------------------------------------------ + + public void testEqualsReflexivity() throws Exception { + assertTrue("equals", fRequest1.equals(fRequest1)); + assertTrue("equals", fRequest2.equals(fRequest2)); + + assertFalse("equals", fRequest1.equals(fRequest2)); + assertFalse("equals", fRequest2.equals(fRequest1)); + } + + public void testEqualsSymmetry() throws Exception { + assertTrue("equals", fRequest1.equals(fRequest1b)); + assertTrue("equals", fRequest1b.equals(fRequest1)); + + assertFalse("equals", fRequest1.equals(fRequest3)); + assertFalse("equals", fRequest2.equals(fRequest3)); + assertFalse("equals", fRequest3.equals(fRequest1)); + assertFalse("equals", fRequest3.equals(fRequest2)); + } + + public void testEqualsTransivity() throws Exception { + assertTrue("equals", fRequest1.equals(fRequest1b)); + assertTrue("equals", fRequest1b.equals(fRequest1c)); + assertTrue("equals", fRequest1.equals(fRequest1c)); + } + + public void testEqualsNull() throws Exception { + assertFalse("equals", fRequest1.equals(null)); + assertFalse("equals", fRequest2.equals(null)); + } + + // ------------------------------------------------------------------------ + // hashCode + // ------------------------------------------------------------------------ + + public void testHashCode() throws Exception { + assertTrue("hashCode", fRequest1.hashCode() == fRequest1.hashCode()); + assertTrue("hashCode", fRequest2.hashCode() == fRequest2.hashCode()); + assertTrue("hashCode", fRequest1.hashCode() != fRequest2.hashCode()); + } + + // ------------------------------------------------------------------------ + // toString + // ------------------------------------------------------------------------ + + public void testToString() { + String expected1 = "[TmfCoalescedDataRequest(0,TmfEvent,10,100,200)]"; + String expected2 = "[TmfCoalescedDataRequest(1,TmfEvent,20,100,200)]"; + String expected3 = "[TmfCoalescedDataRequest(2,TmfEvent,20,200,200)]"; + String expected4 = "[TmfCoalescedDataRequest(3,TmfEvent,20,200,300)]"; + + assertEquals("toString", expected1, fRequest1.toString()); + assertEquals("toString", expected2, fRequest2.toString()); + assertEquals("toString", expected3, fRequest3.toString()); + assertEquals("toString", expected4, fRequest4.toString()); + } + + // ------------------------------------------------------------------------ + // isCompatible + // ------------------------------------------------------------------------ + + public void testIsCompatible() { + TmfCoalescedDataRequest coalescedRequest = new TmfCoalescedDataRequest(TmfEvent.class, 10, 100, 200); + TmfDataRequest request1 = new TmfDataRequestStub(TmfEvent.class, 10, 100, 200); + TmfDataRequest request2 = new TmfDataRequestStub(TmfEvent.class, 11, 100, 200); + TmfDataRequest request3 = new TmfDataRequestStub(TmfEvent.class, 10, 101, 200); + TmfDataRequest request4 = new TmfDataRequestStub(TmfEvent.class, 10, 100, 201); + + assertTrue ("isCompatible", coalescedRequest.isCompatible(request1)); + assertFalse("isCompatible", coalescedRequest.isCompatible(request2)); + assertFalse("isCompatible", coalescedRequest.isCompatible(request3)); + assertFalse("isCompatible", coalescedRequest.isCompatible(request4)); + } + + // ------------------------------------------------------------------------ + // setData/getData + // ------------------------------------------------------------------------ + + public void testSetData() { + + TmfCoalescedDataRequest coalescedRequest = new TmfCoalescedDataRequest(TmfEvent.class, 10, 100, 200); + TmfDataRequest request1 = new TmfDataRequestStub(TmfEvent.class, 10, 100, 200); + TmfDataRequest request2 = new TmfDataRequestStub(TmfEvent.class, 10, 100, 200); + coalescedRequest.addRequest(request1); + coalescedRequest.addRequest(request2); + + // Initialize the data + int nbEvents = 10; + TmfEvent[] events = new TmfEvent[nbEvents]; + for (int i = 0; i < nbEvents; i++) { + events[i] = new TmfEvent(new TmfTimestamp(i), new TmfEventSource(), + new TmfEventType(), new TmfEventReference()); + } + + coalescedRequest.setData(events); + coalescedRequest.handleData(); + + // Validate the coalescing request + assertEquals("setData", nbEvents, coalescedRequest.getNbRead()); + TmfEvent[] eventsRead1 = coalescedRequest.getData(); + assertEquals("getData", nbEvents, eventsRead1.length); + for (int i = 0; i < nbEvents; i++) { + assertEquals("getData", i, eventsRead1[i].getTimestamp().getValue()); + } + + // Validate the first coalesced request + assertEquals("setData", nbEvents, request1.getNbRead()); + TmfEvent[] eventsRead2 = request1.getData(); + assertEquals("getData", nbEvents, eventsRead2.length); + for (int i = 0; i < nbEvents; i++) { + assertEquals("getData", i, eventsRead2[i].getTimestamp().getValue()); + } + + // Validate the second coalesced request + assertEquals("setData", nbEvents, request2.getNbRead()); + TmfEvent[] eventsRead3 = request2.getData(); + assertEquals("getData", nbEvents, eventsRead3.length); + for (int i = 0; i < nbEvents; i++) { + assertEquals("getData", i, eventsRead3[i].getTimestamp().getValue()); + } + } + + // ------------------------------------------------------------------------ + // done + // ------------------------------------------------------------------------ + + public void testDone() { + + // Test request + final boolean[] crFlags = new boolean[4]; + TmfCoalescedDataRequest request = setupTestRequest(crFlags); + TmfDataRequest subRequest1 = new TmfDataRequestStub(TmfEvent.class, 10, 100, 200); + TmfDataRequest subRequest2 = new TmfDataRequestStub(TmfEvent.class, 10, 100, 200); + request.addRequest(subRequest1); + request.addRequest(subRequest2); + + request.done(); + + // Validate the coalescing request + assertTrue ("isCompleted", request.isCompleted()); + assertFalse("isFailed", request.isFailed()); + assertFalse("isCancelled", request.isCancelled()); + + assertTrue ("handleCompleted", crFlags[0]); + assertTrue ("handleSuccess", crFlags[1]); + assertFalse("handleFailure", crFlags[2]); + assertFalse("handleCancel", crFlags[3]); + + // Validate the first coalesced request + assertTrue ("isCompleted", subRequest1.isCompleted()); + assertFalse("isFailed", subRequest1.isFailed()); + assertFalse("isCancelled", subRequest1.isCancelled()); + + // Validate the second coalesced request + assertTrue ("isCompleted", subRequest2.isCompleted()); + assertFalse("isFailed", subRequest2.isFailed()); + assertFalse("isCancelled", subRequest2.isCancelled()); + } + + // ------------------------------------------------------------------------ + // fail + // ------------------------------------------------------------------------ + + public void testFail() { + + final boolean[] crFlags = new boolean[4]; + TmfCoalescedDataRequest request = setupTestRequest(crFlags); + TmfDataRequest subRequest1 = new TmfDataRequestStub(TmfEvent.class, 10, 100, 200); + TmfDataRequest subRequest2 = new TmfDataRequestStub(TmfEvent.class, 10, 100, 200); + request.addRequest(subRequest1); + request.addRequest(subRequest2); + + request.fail(); + + // Validate the coalescing request + assertTrue ("isCompleted", request.isCompleted()); + assertTrue ("isFailed", request.isFailed()); + assertFalse("isCancelled", request.isCancelled()); + + assertTrue ("handleCompleted", crFlags[0]); + assertFalse("handleSuccess", crFlags[1]); + assertTrue ("handleFailure", crFlags[2]); + assertFalse("handleCancel", crFlags[3]); + + // Validate the first coalesced request + assertTrue ("isCompleted", subRequest1.isCompleted()); + assertTrue ("isFailed", subRequest1.isFailed()); + assertFalse("isCancelled", subRequest1.isCancelled()); + + // Validate the second coalesced request + assertTrue ("isCompleted", subRequest2.isCompleted()); + assertTrue ("isFailed", subRequest2.isFailed()); + assertFalse("isCancelled", subRequest2.isCancelled()); + } + + // ------------------------------------------------------------------------ + // cancel + // ------------------------------------------------------------------------ + + public void testCancel() { + + final boolean[] crFlags = new boolean[4]; + TmfCoalescedDataRequest request = setupTestRequest(crFlags); + TmfDataRequest subRequest1 = new TmfDataRequestStub(TmfEvent.class, 10, 100, 200); + TmfDataRequest subRequest2 = new TmfDataRequestStub(TmfEvent.class, 10, 100, 200); + request.addRequest(subRequest1); + request.addRequest(subRequest2); + + request.cancel(); + + // Validate the coalescing request + assertTrue ("isCompleted", request.isCompleted()); + assertFalse("isFailed", request.isFailed()); + assertTrue ("isCancelled", request.isCancelled()); + + assertTrue ("handleCompleted", crFlags[0]); + assertFalse("handleSuccess", crFlags[1]); + assertFalse("handleFailure", crFlags[2]); + assertTrue ("handleCancel", crFlags[3]); + + // Validate the first coalesced request + assertTrue ("isCompleted", subRequest1.isCompleted()); + assertFalse("isFailed", subRequest1.isFailed()); + assertTrue ("isCancelled", subRequest1.isCancelled()); + + // Validate the second coalesced request + assertTrue ("isCompleted", subRequest2.isCompleted()); + assertFalse("isFailed", subRequest2.isFailed()); + assertTrue ("isCancelled", subRequest2.isCancelled()); + } + + // ------------------------------------------------------------------------ + // waitForCompletion + // ------------------------------------------------------------------------ + +} diff --git a/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/request/TmfCoalescedEventRequestTest.java b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/request/TmfCoalescedEventRequestTest.java new file mode 100644 index 0000000000..0b0bd714dd --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/request/TmfCoalescedEventRequestTest.java @@ -0,0 +1,620 @@ +/******************************************************************************* + * Copyright (c) 2009, 2010 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: + * Francois Chouinard - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.linuxtools.tmf.tests.request; + +import java.io.File; +import java.io.IOException; +import java.net.URISyntaxException; +import java.net.URL; +import java.util.Vector; + +import junit.framework.TestCase; + +import org.eclipse.core.runtime.FileLocator; +import org.eclipse.core.runtime.Path; +import org.eclipse.linuxtools.tmf.component.ITmfDataProvider; +import org.eclipse.linuxtools.tmf.component.TmfProviderManager; +import org.eclipse.linuxtools.tmf.event.TmfEvent; +import org.eclipse.linuxtools.tmf.event.TmfEventReference; +import org.eclipse.linuxtools.tmf.event.TmfEventSource; +import org.eclipse.linuxtools.tmf.event.TmfEventType; +import org.eclipse.linuxtools.tmf.event.TmfTimeRange; +import org.eclipse.linuxtools.tmf.event.TmfTimestamp; +import org.eclipse.linuxtools.tmf.request.TmfCoalescedDataRequest; +import org.eclipse.linuxtools.tmf.request.TmfCoalescedEventRequest; +import org.eclipse.linuxtools.tmf.request.TmfDataRequest; +import org.eclipse.linuxtools.tmf.request.TmfDataRequestStub; +import org.eclipse.linuxtools.tmf.request.TmfEventRequest; +import org.eclipse.linuxtools.tmf.request.TmfEventRequestStub; +import org.eclipse.linuxtools.tmf.signal.TmfSignal; +import org.eclipse.linuxtools.tmf.signal.TmfSignalHandler; +import org.eclipse.linuxtools.tmf.signal.TmfSignalManager; +import org.eclipse.linuxtools.tmf.tests.TmfCoreTestPlugin; +import org.eclipse.linuxtools.tmf.trace.TmfTraceStub; + +/** + * TmfCoalescedEventRequestTest + *

+ * Test suite for the TmfCoalescedEventRequest class. + */ +public class TmfCoalescedEventRequestTest extends TestCase { + + // ------------------------------------------------------------------------ + // Variables + // ------------------------------------------------------------------------ + + private static TmfTimeRange range1 = new TmfTimeRange(TmfTimeRange.Eternity); + private static TmfTimeRange range2 = new TmfTimeRange(new TmfTimestamp(), TmfTimestamp.BigCrunch); + + private static TmfCoalescedEventRequest fRequest1; + private static TmfCoalescedEventRequest fRequest2; + private static TmfCoalescedEventRequest fRequest3; + private static TmfCoalescedEventRequest fRequest4; + + private static TmfCoalescedEventRequest fRequest1b; + private static TmfCoalescedEventRequest fRequest1c; + + private static int fRequestCount; + + // ------------------------------------------------------------------------ + // Housekeeping + // ------------------------------------------------------------------------ + + public TmfCoalescedEventRequestTest(String name) { + super(name); + } + + @Override + public void setUp() throws Exception { + super.setUp(); + TmfEventRequest.reset(); + fRequest1 = new TmfCoalescedEventRequest(TmfEvent.class, range1, 100, 200); + fRequest2 = new TmfCoalescedEventRequest(TmfEvent.class, range2, 100, 200); + fRequest3 = new TmfCoalescedEventRequest(TmfEvent.class, range2, 200, 200); + fRequest4 = new TmfCoalescedEventRequest(TmfEvent.class, range2, 200, 300); + + fRequest1b = new TmfCoalescedEventRequest(TmfEvent.class, range1, 100, 200); + fRequest1c = new TmfCoalescedEventRequest(TmfEvent.class, range1, 100, 200); + + fRequestCount = fRequest1c.getRequestId() + 1; + } + + @Override + public void tearDown() throws Exception { + super.tearDown(); + } + + private TmfCoalescedEventRequest setupTestRequest(final boolean[] flags) { + + TmfCoalescedEventRequest request = new TmfCoalescedEventRequest(TmfEvent.class, range1, 100, 200) { + @Override + public void handleCompleted() { + super.handleCompleted(); + flags[0] = true; + } + @Override + public void handleSuccess() { + super.handleSuccess(); + flags[1] = true; + } + @Override + public void handleFailure() { + super.handleFailure(); + flags[2] = true; + } + @Override + public void handleCancel() { + super.handleCancel(); + flags[3] = true; + } + }; + return request; + } + + // ------------------------------------------------------------------------ + // Constructors + // ------------------------------------------------------------------------ + + public void testTmfCoalescedEventRequest() { + TmfCoalescedEventRequest request = new TmfCoalescedEventRequest(TmfEvent.class); + + assertEquals("getRequestId", fRequestCount++, request.getRequestId()); + assertEquals("getDataType", TmfEvent.class, request.getDataType()); + + assertEquals("getRange", range1, request.getRange()); + assertEquals("getNbRequestedEvents", TmfEventRequest.ALL_DATA, request.getNbRequested()); + assertEquals("getBlockize", TmfEventRequest.DEFAULT_BLOCK_SIZE, request.getBlockize()); + + assertFalse("isCompleted", request.isCompleted()); + assertFalse("isFailed", request.isFailed()); + assertFalse("isCancelled", request.isCancelled()); + + assertEquals("getNbRead", 0, request.getNbRead()); + } + + public void testTmfCoalescedEventRequestIndex() { + TmfCoalescedEventRequest request = new TmfCoalescedEventRequest(TmfEvent.class, range1); + + assertEquals("getRequestId", fRequestCount++, request.getRequestId()); + assertEquals("getDataType", TmfEvent.class, request.getDataType()); + + assertEquals("getRange", range1, request.getRange()); + assertEquals("getNbRequestedEvents", TmfEventRequest.ALL_DATA, request.getNbRequested()); + assertEquals("getBlockize", TmfEventRequest.DEFAULT_BLOCK_SIZE, request.getBlockize()); + + assertFalse("isCompleted", request.isCompleted()); + assertFalse("isFailed", request.isFailed()); + assertFalse("isCancelled", request.isCancelled()); + + assertEquals("getNbRead", 0, request.getNbRead()); + } + + public void testTmfCoalescedEventRequestIndexNbRequested() { + TmfCoalescedEventRequest request = new TmfCoalescedEventRequest(TmfEvent.class, range1, 100); + + assertEquals("getRequestId", fRequestCount++, request.getRequestId()); + assertEquals("getDataType", TmfEvent.class, request.getDataType()); + + assertEquals("getRange", range1, request.getRange()); + assertEquals("getNbRequestedEvents", 100, request.getNbRequested()); + assertEquals("getBlockize", TmfEventRequest.DEFAULT_BLOCK_SIZE, request.getBlockize()); + + assertFalse("isCompleted", request.isCompleted()); + assertFalse("isFailed", request.isFailed()); + assertFalse("isCancelled", request.isCancelled()); + + assertEquals("getNbRead", 0, request.getNbRead()); + } + + public void testTmfCoalescedEventRequestIndexNbEventsBlocksize() { + TmfCoalescedEventRequest request = new TmfCoalescedEventRequest(TmfEvent.class, range1, 100, 200); + + assertEquals("getRequestId", fRequestCount++, request.getRequestId()); + assertEquals("getDataType", TmfEvent.class, request.getDataType()); + + assertEquals("getRange", range1, request.getRange()); + assertEquals("getNbRequestedEvents", 100, request.getNbRequested()); + assertEquals("getBlockize", 200, request.getBlockize()); + + assertFalse("isCompleted", request.isCompleted()); + assertFalse("isFailed", request.isFailed()); + assertFalse("isCancelled", request.isCancelled()); + + assertEquals("getNbRead", 0, request.getNbRead()); + } + + // ------------------------------------------------------------------------ + // equals + // ------------------------------------------------------------------------ + + public void testEqualsReflexivity() throws Exception { + assertTrue("equals", fRequest1.equals(fRequest1)); + assertTrue("equals", fRequest2.equals(fRequest2)); + + assertFalse("equals", fRequest1.equals(fRequest2)); + assertFalse("equals", fRequest2.equals(fRequest1)); + } + + public void testEqualsSymmetry() throws Exception { + assertTrue("equals", fRequest1.equals(fRequest1b)); + assertTrue("equals", fRequest1b.equals(fRequest1)); + + assertFalse("equals", fRequest1.equals(fRequest3)); + assertFalse("equals", fRequest2.equals(fRequest3)); + assertFalse("equals", fRequest3.equals(fRequest1)); + assertFalse("equals", fRequest3.equals(fRequest2)); + } + + public void testEqualsTransivity() throws Exception { + assertTrue("equals", fRequest1.equals(fRequest1b)); + assertTrue("equals", fRequest1b.equals(fRequest1c)); + assertTrue("equals", fRequest1.equals(fRequest1c)); + } + + public void testEqualsNull() throws Exception { + assertFalse("equals", fRequest1.equals(null)); + assertFalse("equals", fRequest2.equals(null)); + } + + public void testEqualsSuper() throws Exception { + TmfCoalescedDataRequest dataRequest1 = new TmfCoalescedDataRequest( + fRequest1.getDataType(), fRequest1.getIndex(), fRequest1.getNbRequested(), fRequest1.getBlockize()); + TmfCoalescedDataRequest dataRequest2 = new TmfCoalescedDataRequest( + fRequest1.getDataType(), fRequest1.getIndex(), fRequest1.getNbRequested(), fRequest1.getBlockize()); + TmfCoalescedDataRequest dataRequest3 = new TmfCoalescedDataRequest( + fRequest3.getDataType(), fRequest3.getIndex(), fRequest3.getNbRequested(), fRequest3.getBlockize()); + + assertTrue("equals", fRequest1.equals(dataRequest2)); + assertTrue("equals", fRequest2.equals(dataRequest1)); + assertFalse("equals", fRequest1.equals(dataRequest3)); + assertFalse("equals", fRequest3.equals(dataRequest1)); + } + + // ------------------------------------------------------------------------ + // hashCode + // ------------------------------------------------------------------------ + + public void testHashCode() throws Exception { + assertTrue("hashCode", fRequest1.hashCode() == fRequest1.hashCode()); + assertTrue("hashCode", fRequest2.hashCode() == fRequest2.hashCode()); + assertTrue("hashCode", fRequest1.hashCode() != fRequest2.hashCode()); + } + + // ------------------------------------------------------------------------ + // toString + // ------------------------------------------------------------------------ + + public void testToString() { + String expected1 = "[TmfCoalescedEventRequest(0,TmfEvent," + range1 + ",100,200)]"; + String expected2 = "[TmfCoalescedEventRequest(1,TmfEvent," + range2 + ",100,200)]"; + String expected3 = "[TmfCoalescedEventRequest(2,TmfEvent," + range2 + ",200,200)]"; + String expected4 = "[TmfCoalescedEventRequest(3,TmfEvent," + range2 + ",200,300)]"; + + assertEquals("toString", expected1, fRequest1.toString()); + assertEquals("toString", expected2, fRequest2.toString()); + assertEquals("toString", expected3, fRequest3.toString()); + assertEquals("toString", expected4, fRequest4.toString()); + } + + // ------------------------------------------------------------------------ + // isCompatible + // ------------------------------------------------------------------------ + + public void testIsCompatible() { + TmfCoalescedEventRequest coalescedRequest = new TmfCoalescedEventRequest(TmfEvent.class, range1, 100, 200); + TmfEventRequest request1 = new TmfEventRequestStub(TmfEvent.class, range1, 100, 200); + TmfEventRequest request2 = new TmfEventRequestStub(TmfEvent.class, range2, 100, 200); + TmfEventRequest request3 = new TmfEventRequestStub(TmfEvent.class, range1, 101, 200); + TmfEventRequest request4 = new TmfEventRequestStub(TmfEvent.class, range1, 100, 201); + TmfDataRequest request5 = new TmfDataRequestStub (TmfEvent.class, 10, 100, 201); + + assertTrue ("isCompatible", coalescedRequest.isCompatible(request1)); + assertFalse("isCompatible", coalescedRequest.isCompatible(request2)); + assertFalse("isCompatible", coalescedRequest.isCompatible(request3)); + assertFalse("isCompatible", coalescedRequest.isCompatible(request4)); + assertFalse("isCompatible", coalescedRequest.isCompatible(request5)); + } + + // ------------------------------------------------------------------------ + // setData/getData + // ------------------------------------------------------------------------ + + public void testSetData() { + + TmfCoalescedEventRequest coalescedRequest = new TmfCoalescedEventRequest(TmfEvent.class, range1, 100, 200); + TmfEventRequest request1 = new TmfEventRequestStub(TmfEvent.class, range1, 100, 200); + TmfEventRequest request2 = new TmfEventRequestStub(TmfEvent.class, range1, 100, 200); + coalescedRequest.addRequest(request1); + coalescedRequest.addRequest(request2); + + // Initialize the data + int nbEvents = 10; + TmfEvent[] events = new TmfEvent[nbEvents]; + for (int i = 0; i < nbEvents; i++) { + events[i] = new TmfEvent(new TmfTimestamp(i), new TmfEventSource(), + new TmfEventType(), new TmfEventReference()); + } + + coalescedRequest.setData(events); + coalescedRequest.handleData(); + + // Validate the coalescing request + assertEquals("setData", nbEvents, coalescedRequest.getNbRead()); + TmfEvent[] eventsRead1 = coalescedRequest.getData(); + assertEquals("getData", nbEvents, eventsRead1.length); + for (int i = 0; i < nbEvents; i++) { + assertEquals("getData", i, eventsRead1[i].getTimestamp().getValue()); + } + + // Validate the first coalesced request + assertEquals("setData", nbEvents, request1.getNbRead()); + TmfEvent[] eventsRead2 = request1.getData(); + assertEquals("getData", nbEvents, eventsRead2.length); + for (int i = 0; i < nbEvents; i++) { + assertEquals("getData", i, eventsRead2[i].getTimestamp().getValue()); + } + + // Validate the second coalesced request + assertEquals("setData", nbEvents, request2.getNbRead()); + TmfEvent[] eventsRead3 = request2.getData(); + assertEquals("getData", nbEvents, eventsRead3.length); + for (int i = 0; i < nbEvents; i++) { + assertEquals("getData", i, eventsRead3[i].getTimestamp().getValue()); + } + } + + // ------------------------------------------------------------------------ + // done + // ------------------------------------------------------------------------ + + public void testDone() { + + // Test request + final boolean[] crFlags = new boolean[4]; + TmfCoalescedEventRequest request = setupTestRequest(crFlags); + TmfEventRequest subRequest1 = new TmfEventRequestStub(TmfEvent.class, range1, 100, 200); + TmfEventRequest subRequest2 = new TmfEventRequestStub(TmfEvent.class, range1, 100, 200); + request.addRequest(subRequest1); + request.addRequest(subRequest2); + + request.done(); + + // Validate the coalescing request + assertTrue ("isCompleted", request.isCompleted()); + assertFalse("isFailed", request.isFailed()); + assertFalse("isCancelled", request.isCancelled()); + + assertTrue ("handleCompleted", crFlags[0]); + assertTrue ("handleSuccess", crFlags[1]); + assertFalse("handleFailure", crFlags[2]); + assertFalse("handleCancel", crFlags[3]); + + // Validate the first coalesced request + assertTrue ("isCompleted", subRequest1.isCompleted()); + assertFalse("isFailed", subRequest1.isFailed()); + assertFalse("isCancelled", subRequest1.isCancelled()); + + // Validate the second coalesced request + assertTrue ("isCompleted", subRequest2.isCompleted()); + assertFalse("isFailed", subRequest2.isFailed()); + assertFalse("isCancelled", subRequest2.isCancelled()); + } + + // ------------------------------------------------------------------------ + // fail + // ------------------------------------------------------------------------ + + public void testFail() { + + final boolean[] crFlags = new boolean[4]; + TmfCoalescedEventRequest request = setupTestRequest(crFlags); + TmfEventRequest subRequest1 = new TmfEventRequestStub(TmfEvent.class, range1, 100, 200); + TmfEventRequest subRequest2 = new TmfEventRequestStub(TmfEvent.class, range1, 100, 200); + request.addRequest(subRequest1); + request.addRequest(subRequest2); + + request.fail(); + + // Validate the coalescing request + assertTrue ("isCompleted", request.isCompleted()); + assertTrue ("isFailed", request.isFailed()); + assertFalse("isCancelled", request.isCancelled()); + + assertTrue ("handleCompleted", crFlags[0]); + assertFalse("handleSuccess", crFlags[1]); + assertTrue ("handleFailure", crFlags[2]); + assertFalse("handleCancel", crFlags[3]); + + // Validate the first coalesced request + assertTrue ("isCompleted", subRequest1.isCompleted()); + assertTrue ("isFailed", subRequest1.isFailed()); + assertFalse("isCancelled", subRequest1.isCancelled()); + + // Validate the second coalesced request + assertTrue ("isCompleted", subRequest2.isCompleted()); + assertTrue ("isFailed", subRequest2.isFailed()); + assertFalse("isCancelled", subRequest2.isCancelled()); + } + + // ------------------------------------------------------------------------ + // cancel + // ------------------------------------------------------------------------ + + public void testCancel() { + + final boolean[] crFlags = new boolean[4]; + TmfCoalescedEventRequest request = setupTestRequest(crFlags); + TmfEventRequest subRequest1 = new TmfEventRequestStub(TmfEvent.class, range1, 100, 200); + TmfEventRequest subRequest2 = new TmfEventRequestStub(TmfEvent.class, range1, 100, 200); + request.addRequest(subRequest1); + request.addRequest(subRequest2); + + request.cancel(); + + // Validate the coalescing request + assertTrue ("isCompleted", request.isCompleted()); + assertFalse("isFailed", request.isFailed()); + assertTrue ("isCancelled", request.isCancelled()); + + assertTrue ("handleCompleted", crFlags[0]); + assertFalse("handleSuccess", crFlags[1]); + assertFalse("handleFailure", crFlags[2]); + assertTrue ("handleCancel", crFlags[3]); + + // Validate the first coalesced request + assertTrue ("isCompleted", subRequest1.isCompleted()); + assertFalse("isFailed", subRequest1.isFailed()); + assertTrue ("isCancelled", subRequest1.isCancelled()); + + // Validate the second coalesced request + assertTrue ("isCompleted", subRequest2.isCompleted()); + assertFalse("isFailed", subRequest2.isFailed()); + assertTrue ("isCancelled", subRequest2.isCancelled()); + } + + // ------------------------------------------------------------------------ + // waitForCompletion + // ------------------------------------------------------------------------ + + // ------------------------------------------------------------------------ + // Coalescing + // ------------------------------------------------------------------------ + + private static final String DIRECTORY = "testfiles"; + private static final String TEST_STREAM = "A-Test-10K"; + private static final int NB_EVENTS = 10000; + private static final int BLOCK_SIZE = 100; + + // Initialize the test trace + private static 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); + } catch (URISyntaxException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return fTrace; + } + + Vector requestedEvents1; + Vector requestedEvents2; + Vector requestedEvents3; + + TmfEventRequest request1; + TmfEventRequest request2; + TmfEventRequest request3; + + ITmfDataProvider[] providers; + + private class TmfTestTriggerSignal extends TmfSignal { + public final boolean forceCancel; + public TmfTestTriggerSignal(Object source, boolean cancel) { + super(source); + forceCancel = cancel; + + } + } + + @SuppressWarnings("unchecked") + @TmfSignalHandler + public void trigger(final TmfTestTriggerSignal signal) { + + TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch); + + requestedEvents1 = new Vector(); + request1 = new TmfEventRequest(TmfEvent.class, range, NB_EVENTS, BLOCK_SIZE) { + @Override + public void handleData() { + if (!isCompleted()) { + TmfEvent[] events = getData(); + for (TmfEvent e : events) { + requestedEvents1.add(e); + } + if (signal.forceCancel) + cancel(); + } + } + }; + + requestedEvents2 = new Vector(); + request2 = new TmfEventRequest(TmfEvent.class, range, NB_EVENTS, BLOCK_SIZE) { + @Override + public void handleData() { + if (!isCompleted()) { + TmfEvent[] events = getData(); + for (TmfEvent e : events) { + requestedEvents2.add(e); + } + } + } + }; + + requestedEvents3 = new Vector(); + request3 = new TmfEventRequest(TmfEvent.class, range, NB_EVENTS, BLOCK_SIZE) { + @Override + public void handleData() { + if (!isCompleted()) { + TmfEvent[] events = getData(); + for (TmfEvent e : events) { + requestedEvents3.add(e); + } + } + } + }; + + providers = (ITmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TmfTraceStub.class); + providers[0].sendRequest(request1); + providers[0].sendRequest(request2); + providers[0].sendRequest(request3); + } + + public void testCoalescedRequest() throws Exception { + + fTrace = setupTrace(DIRECTORY + File.separator + TEST_STREAM); + + TmfSignalManager.register(this); + TmfTestTriggerSignal signal = new TmfTestTriggerSignal(this, false); + TmfSignalManager.dispatchSignal(signal); + + request1.waitForCompletion(); + request2.waitForCompletion(); + request3.waitForCompletion(); + + assertEquals("Request1: nbEvents", NB_EVENTS, requestedEvents1.size()); + assertTrue ("Request1: isCompleted", request1.isCompleted()); + assertFalse ("Request1: isCancelled", request1.isCancelled()); + + assertEquals("Request2: nbEvents", NB_EVENTS, requestedEvents2.size()); + assertTrue ("Request2: isCompleted", request2.isCompleted()); + assertFalse ("Request2: isCancelled", request2.isCancelled()); + + assertEquals("Request3: nbEvents", NB_EVENTS, requestedEvents3.size()); + assertTrue ("Request3: isCompleted", request3.isCompleted()); + assertFalse ("Request3: isCancelled", request3.isCancelled()); + + // Ensure that we have distinct events. + // Don't go overboard: we are not validating the stub! + for (int i = 0; i < NB_EVENTS; i++) { + assertEquals("Distinct events", i+1, requestedEvents1.get(i).getTimestamp().getValue()); + assertEquals("Distinct events", i+1, requestedEvents2.get(i).getTimestamp().getValue()); + assertEquals("Distinct events", i+1, requestedEvents3.get(i).getTimestamp().getValue()); + } + + TmfSignalManager.deregister(this); + fTrace.dispose(); + fTrace = null; + } + + public void testCancelCoalescedRequest() throws Exception { + + fTrace = setupTrace(DIRECTORY + File.separator + TEST_STREAM); + + TmfSignalManager.register(this); + TmfTestTriggerSignal signal = new TmfTestTriggerSignal(this, true); + TmfSignalManager.dispatchSignal(signal); + + request1.waitForCompletion(); + request2.waitForCompletion(); + request3.waitForCompletion(); + + assertEquals("Request1: nbEvents", BLOCK_SIZE, requestedEvents1.size()); + assertTrue ("Request1: isCompleted", request1.isCompleted()); + assertTrue ("Request1: isCancelled", request1.isCancelled()); + + assertEquals("Request2: nbEvents", NB_EVENTS, requestedEvents2.size()); + assertTrue ("Request2: isCompleted", request2.isCompleted()); + assertFalse ("Request2: isCancelled", request2.isCancelled()); + + assertEquals("Request3: nbEvents", NB_EVENTS, requestedEvents3.size()); + assertTrue ("Request3: isCompleted", request3.isCompleted()); + assertFalse ("Request3: isCancelled", request3.isCancelled()); + + // Ensure that we have distinct events. + // Don't go overboard: we are not validating the stub! + for (int i = 0; i < NB_EVENTS; i++) { + assertEquals("Distinct events", i+1, requestedEvents2.get(i).getTimestamp().getValue()); + assertEquals("Distinct events", i+1, requestedEvents3.get(i).getTimestamp().getValue()); + } + + TmfSignalManager.deregister(this); + fTrace.dispose(); + fTrace = null; + } + +} diff --git a/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/request/TmfDataRequestTest.java b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/request/TmfDataRequestTest.java new file mode 100644 index 0000000000..33c332598d --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/request/TmfDataRequestTest.java @@ -0,0 +1,317 @@ +/******************************************************************************* + * Copyright (c) 2009, 2010 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: + * Francois Chouinard - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.linuxtools.tmf.tests.request; + +import junit.framework.TestCase; + +import org.eclipse.linuxtools.tmf.event.TmfEvent; +import org.eclipse.linuxtools.tmf.event.TmfEventReference; +import org.eclipse.linuxtools.tmf.event.TmfEventSource; +import org.eclipse.linuxtools.tmf.event.TmfEventType; +import org.eclipse.linuxtools.tmf.event.TmfTimestamp; +import org.eclipse.linuxtools.tmf.request.TmfDataRequest; +import org.eclipse.linuxtools.tmf.request.TmfDataRequestStub; + +/** + * TmfDataRequestTest + *

+ * Test suite for the TmfDataRequest class. + */ +public class TmfDataRequestTest extends TestCase { + + // ------------------------------------------------------------------------ + // Variables + // ------------------------------------------------------------------------ + + private static TmfDataRequest fRequest1; + private static TmfDataRequest fRequest1b; + private static TmfDataRequest fRequest1c; + private static TmfDataRequest fRequest2; + private static TmfDataRequest fRequest3; + private static TmfDataRequest fRequest4; + + private static int fRequestCount; + + // ------------------------------------------------------------------------ + // Housekeeping + // ------------------------------------------------------------------------ + + public TmfDataRequestTest(String name) { + super(name); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + TmfDataRequest.reset(); + fRequest1 = new TmfDataRequestStub(TmfEvent.class, 10, 100, 200); + fRequest2 = new TmfDataRequestStub(TmfEvent.class, 20, 100, 200); + fRequest3 = new TmfDataRequestStub(TmfEvent.class, 20, 200, 200); + fRequest4 = new TmfDataRequestStub(TmfEvent.class, 20, 200, 300); + fRequest1b = new TmfDataRequestStub(TmfEvent.class, 10, 100, 200); + fRequest1c = new TmfDataRequestStub(TmfEvent.class, 10, 100, 200); + fRequestCount = fRequest1c.getRequestId() + 1; + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + } + + private TmfDataRequest setupTestRequest(final boolean[] flags) { + + TmfDataRequest request = new TmfDataRequestStub(TmfEvent.class, 10, 100, 200) { + @Override + public void handleCompleted() { + super.handleCompleted(); + flags[0] = true; + } + @Override + public void handleSuccess() { + super.handleSuccess(); + flags[1] = true; + } + @Override + public void handleFailure() { + super.handleFailure(); + flags[2] = true; + } + @Override + public void handleCancel() { + super.handleCancel(); + flags[3] = true; + } + }; + return request; + } + + // ------------------------------------------------------------------------ + // Constructors + // ------------------------------------------------------------------------ + + public void testTmfDataRequest() { + TmfDataRequest request = new TmfDataRequestStub(TmfEvent.class); + + assertEquals("getRequestId", fRequestCount++, request.getRequestId()); + assertEquals("getDataType", TmfEvent.class, request.getDataType()); + + assertEquals("getIndex", 0, request.getIndex()); + assertEquals("getNbRequestedEvents", TmfDataRequest.ALL_DATA, request.getNbRequested()); + assertEquals("getBlockize", TmfDataRequest.DEFAULT_BLOCK_SIZE, request.getBlockize()); + + assertFalse("isCompleted", request.isCompleted()); + assertFalse("isFailed", request.isFailed()); + assertFalse("isCancelled", request.isCancelled()); + + assertEquals("getNbRead", 0, request.getNbRead()); + } + + public void testTmfDataRequestIndex() { + TmfDataRequest request = new TmfDataRequestStub(TmfEvent.class, 10); + + assertEquals("getRequestId", fRequestCount++, request.getRequestId()); + assertEquals("getDataType", TmfEvent.class, request.getDataType()); + + assertEquals("getIndex", 10, request.getIndex()); + assertEquals("getNbRequestedEvents", TmfDataRequest.ALL_DATA, request.getNbRequested()); + assertEquals("getBlockize", TmfDataRequest.DEFAULT_BLOCK_SIZE, request.getBlockize()); + + assertFalse("isCompleted", request.isCompleted()); + assertFalse("isFailed", request.isFailed()); + assertFalse("isCancelled", request.isCancelled()); + + assertEquals("getNbRead", 0, request.getNbRead()); + } + + public void testTmfDataRequestIndexNbRequested() { + TmfDataRequest request = new TmfDataRequestStub(TmfEvent.class, 10, 100); + + assertEquals("getRequestId", fRequestCount++, request.getRequestId()); + assertEquals("getDataType", TmfEvent.class, request.getDataType()); + + assertEquals("getIndex", 10, request.getIndex()); + assertEquals("getNbRequestedEvents", 100, request.getNbRequested()); + assertEquals("getBlockize", TmfDataRequest.DEFAULT_BLOCK_SIZE, request.getBlockize()); + + assertFalse("isCompleted", request.isCompleted()); + assertFalse("isFailed", request.isFailed()); + assertFalse("isCancelled", request.isCancelled()); + + assertEquals("getNbRead", 0, request.getNbRead()); + } + + public void testTmfDataRequestIndexNbEventsBlocksize() { + TmfDataRequest request = new TmfDataRequestStub(TmfEvent.class, 10, 100, 200); + + assertEquals("getRequestId", fRequestCount++, request.getRequestId()); + assertEquals("getDataType", TmfEvent.class, request.getDataType()); + + assertEquals("getIndex", 10, request.getIndex()); + assertEquals("getNbRequestedEvents", 100, request.getNbRequested()); + assertEquals("getBlockize", 200, request.getBlockize()); + + assertFalse("isCompleted", request.isCompleted()); + assertFalse("isFailed", request.isFailed()); + assertFalse("isCancelled", request.isCancelled()); + + assertEquals("getNbRead", 0, request.getNbRead()); + } + + // ------------------------------------------------------------------------ + // equals + // ------------------------------------------------------------------------ + + public void testEqualsReflexivity() throws Exception { + assertTrue("equals", fRequest1.equals(fRequest1)); + assertTrue("equals", fRequest2.equals(fRequest2)); + + assertFalse("equals", fRequest1.equals(fRequest2)); + assertFalse("equals", fRequest2.equals(fRequest1)); + } + + public void testEqualsSymmetry() throws Exception { + assertTrue("equals", fRequest1.equals(fRequest1b)); + assertTrue("equals", fRequest1b.equals(fRequest1)); + + assertFalse("equals", fRequest1.equals(fRequest3)); + assertFalse("equals", fRequest2.equals(fRequest3)); + assertFalse("equals", fRequest3.equals(fRequest1)); + assertFalse("equals", fRequest3.equals(fRequest2)); + } + + public void testEqualsTransivity() throws Exception { + assertTrue("equals", fRequest1.equals(fRequest1b)); + assertTrue("equals", fRequest1b.equals(fRequest1c)); + assertTrue("equals", fRequest1.equals(fRequest1c)); + } + + public void testEqualsNull() throws Exception { + assertFalse("equals", fRequest1.equals(null)); + assertFalse("equals", fRequest2.equals(null)); + } + + // ------------------------------------------------------------------------ + // hashCode + // ------------------------------------------------------------------------ + + public void testHashCode() throws Exception { + assertTrue("hashCode", fRequest1.hashCode() == fRequest1.hashCode()); + assertTrue("hashCode", fRequest2.hashCode() == fRequest2.hashCode()); + assertTrue("hashCode", fRequest1.hashCode() != fRequest2.hashCode()); + } + + // ------------------------------------------------------------------------ + // toString + // ------------------------------------------------------------------------ + + public void testToString() { + String expected1 = "[TmfDataRequest(0,TmfEvent,10,100,200)]"; + String expected2 = "[TmfDataRequest(1,TmfEvent,20,100,200)]"; + String expected3 = "[TmfDataRequest(2,TmfEvent,20,200,200)]"; + String expected4 = "[TmfDataRequest(3,TmfEvent,20,200,300)]"; + + assertEquals("toString", expected1, fRequest1.toString()); + assertEquals("toString", expected2, fRequest2.toString()); + assertEquals("toString", expected3, fRequest3.toString()); + assertEquals("toString", expected4, fRequest4.toString()); + } + + // ------------------------------------------------------------------------ + // setData/getData + // ------------------------------------------------------------------------ + + public void testSetData() { + // Initialize the data + int nbEvents = 10; + TmfEvent[] events = new TmfEvent[nbEvents]; + for (int i = 0; i < nbEvents; i++) { + events[i] = new TmfEvent(new TmfTimestamp(i), new TmfEventSource(), + new TmfEventType(), new TmfEventReference()); + } + + fRequest1.setData(events); + assertEquals("setData", nbEvents, fRequest1.getNbRead()); + + TmfEvent[] eventsRead = fRequest1.getData(); + assertEquals("getData", nbEvents, eventsRead.length); + + for (int i = 0; i < nbEvents; i++) { + assertEquals("getData", i, eventsRead[i].getTimestamp().getValue()); + } + } + + // ------------------------------------------------------------------------ + // done + // ------------------------------------------------------------------------ + + public void testDone() { + + final boolean[] flags = new boolean[4]; + TmfDataRequest request = setupTestRequest(flags); + 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]); + } + + // ------------------------------------------------------------------------ + // fail + // ------------------------------------------------------------------------ + + public void testFail() { + + final boolean[] flags = new boolean[4]; + TmfDataRequest request = setupTestRequest(flags); + request.fail(); + + assertTrue ("isCompleted", request.isCompleted()); + assertTrue ("isFailed", request.isFailed()); + assertFalse("isCancelled", request.isCancelled()); + + assertTrue ("handleCompleted", flags[0]); + assertFalse("handleSuccess", flags[1]); + assertTrue ("handleFailure", flags[2]); + assertFalse("handleCancel", flags[3]); + } + + // ------------------------------------------------------------------------ + // cancel + // ------------------------------------------------------------------------ + + public void testCancel() { + + final boolean[] flags = new boolean[4]; + TmfDataRequest request = setupTestRequest(flags); + request.cancel(); + + 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]); + } + + // ------------------------------------------------------------------------ + // waitForCompletion + // ------------------------------------------------------------------------ + +} \ No newline at end of file diff --git a/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/request/TmfEventRequestTest.java b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/request/TmfEventRequestTest.java new file mode 100644 index 0000000000..189bd32ad5 --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/request/TmfEventRequestTest.java @@ -0,0 +1,337 @@ +/******************************************************************************* + * Copyright (c) 2009, 2010 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: + * Francois Chouinard - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.linuxtools.tmf.tests.request; + +import junit.framework.TestCase; + +import org.eclipse.linuxtools.tmf.event.TmfEvent; +import org.eclipse.linuxtools.tmf.event.TmfEventReference; +import org.eclipse.linuxtools.tmf.event.TmfEventSource; +import org.eclipse.linuxtools.tmf.event.TmfEventType; +import org.eclipse.linuxtools.tmf.event.TmfTimeRange; +import org.eclipse.linuxtools.tmf.event.TmfTimestamp; +import org.eclipse.linuxtools.tmf.request.TmfDataRequest; +import org.eclipse.linuxtools.tmf.request.TmfEventRequest; +import org.eclipse.linuxtools.tmf.request.TmfEventRequestStub; + +/** + * TmfEventRequestTest + *

+ * Test suite for the TmfEventRequest class. + */ +public class TmfEventRequestTest extends TestCase { + + // ------------------------------------------------------------------------ + // Variables + // ------------------------------------------------------------------------ + + private static TmfTimeRange range1 = new TmfTimeRange(TmfTimeRange.Eternity); + private static TmfTimeRange range2 = new TmfTimeRange(new TmfTimestamp(), TmfTimestamp.BigCrunch); + + private static TmfEventRequest fRequest1; + private static TmfEventRequest fRequest1b; + private static TmfEventRequest fRequest1c; + private static TmfEventRequest fRequest2; + private static TmfEventRequest fRequest3; + private static TmfEventRequest fRequest4; + + private static int fRequestCount; + + // ------------------------------------------------------------------------ + // Housekeeping + // ------------------------------------------------------------------------ + + public TmfEventRequestTest(String name) { + super(name); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + TmfDataRequest.reset(); + fRequest1 = new TmfEventRequestStub(TmfEvent.class, range1, 100, 200); + fRequest2 = new TmfEventRequestStub(TmfEvent.class, range2, 100, 200); + fRequest3 = new TmfEventRequestStub(TmfEvent.class, range2, 200, 200); + fRequest4 = new TmfEventRequestStub(TmfEvent.class, range2, 200, 300); + fRequest1b = new TmfEventRequestStub(TmfEvent.class, range1, 100, 200); + fRequest1c = new TmfEventRequestStub(TmfEvent.class, range1, 100, 200); + fRequestCount = fRequest1c.getRequestId() + 1; + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + } + + private TmfEventRequest setupTestRequest(final boolean[] flags) { + + TmfEventRequest request = new TmfEventRequestStub(TmfEvent.class, new TmfTimeRange(TmfTimeRange.Eternity), 100, 200) { + @Override + public void handleCompleted() { + super.handleCompleted(); + flags[0] = true; + } + @Override + public void handleSuccess() { + super.handleSuccess(); + flags[1] = true; + } + @Override + public void handleFailure() { + super.handleFailure(); + flags[2] = true; + } + @Override + public void handleCancel() { + super.handleCancel(); + flags[3] = true; + } + }; + return request; + } + + // ------------------------------------------------------------------------ + // Constructors + // ------------------------------------------------------------------------ + + public void testTmfEventRequest() { + TmfEventRequest request = new TmfEventRequestStub(TmfEvent.class); + + assertEquals("getRequestId", fRequestCount++, request.getRequestId()); + assertEquals("getDataType", TmfEvent.class, request.getDataType()); + + assertEquals("StartTime", TmfTimestamp.BigBang, request.getRange().getStartTime()); + assertEquals("EndTime", TmfTimestamp.BigCrunch, request.getRange().getEndTime()); + + assertEquals("getIndex", 0, request.getIndex()); + assertEquals("getNbRequestedEvents", TmfDataRequest.ALL_DATA, request.getNbRequested()); + assertEquals("getBlockize", TmfDataRequest.DEFAULT_BLOCK_SIZE, request.getBlockize()); + + assertFalse("isCompleted", request.isCompleted()); + assertFalse("isFailed", request.isFailed()); + assertFalse("isCancelled", request.isCancelled()); + + assertEquals("getNbRead", 0, request.getNbRead()); + } + + public void testTmfEventRequestTimeRange() { + TmfTimeRange range = new TmfTimeRange(new TmfTimestamp(), TmfTimestamp.BigCrunch); + TmfEventRequest request = new TmfEventRequestStub(TmfEvent.class, range); + + assertEquals("getRequestId", fRequestCount++, request.getRequestId()); + assertEquals("getDataType", TmfEvent.class, request.getDataType()); + + assertEquals("StartTime", new TmfTimestamp(), request.getRange().getStartTime()); + assertEquals("EndTime", TmfTimestamp.BigCrunch, request.getRange().getEndTime()); + + assertEquals("getIndex", 0, request.getIndex()); + assertEquals("getNbRequestedEvents", TmfDataRequest.ALL_DATA, request.getNbRequested()); + assertEquals("getBlockize", TmfDataRequest.DEFAULT_BLOCK_SIZE, request.getBlockize()); + + assertFalse("isCompleted", request.isCompleted()); + assertFalse("isFailed", request.isFailed()); + assertFalse("isCancelled", request.isCancelled()); + + assertEquals("getNbRead", 0, request.getNbRead()); + } + + public void testTmfEventRequestTimeRangeNbRequested() { + TmfTimeRange range = new TmfTimeRange(new TmfTimestamp(), TmfTimestamp.BigCrunch); + TmfEventRequest request = new TmfEventRequestStub(TmfEvent.class, range, 100); + + assertEquals("getRequestId", fRequestCount++, request.getRequestId()); + assertEquals("getDataType", TmfEvent.class, request.getDataType()); + + assertEquals("StartTime", new TmfTimestamp(), request.getRange().getStartTime()); + assertEquals("EndTime", TmfTimestamp.BigCrunch, request.getRange().getEndTime()); + + assertEquals("getIndex", 0, request.getIndex()); + assertEquals("getNbRequestedEvents", 100, request.getNbRequested()); + assertEquals("getBlockize", TmfDataRequest.DEFAULT_BLOCK_SIZE, request.getBlockize()); + + assertFalse("isCompleted", request.isCompleted()); + assertFalse("isFailed", request.isFailed()); + assertFalse("isCancelled", request.isCancelled()); + + assertEquals("getNbRead", 0, request.getNbRead()); + } + + public void testTmfEventRequestTimeRangeNbRequestedBlocksize() { + TmfTimeRange range = new TmfTimeRange(new TmfTimestamp(), TmfTimestamp.BigCrunch); + TmfEventRequest request = new TmfEventRequestStub(TmfEvent.class, range, 100, 200); + + assertEquals("getRequestId", fRequestCount++, request.getRequestId()); + assertEquals("getDataType", TmfEvent.class, request.getDataType()); + + assertEquals("StartTime", new TmfTimestamp(), request.getRange().getStartTime()); + assertEquals("EndTime", TmfTimestamp.BigCrunch, request.getRange().getEndTime()); + + assertEquals("getIndex", 0, request.getIndex()); + assertEquals("getNbRequestedEvents", 100, request.getNbRequested()); + assertEquals("getBlockize", 200, request.getBlockize()); + + assertFalse("isCompleted", request.isCompleted()); + assertFalse("isFailed", request.isFailed()); + assertFalse("isCancelled", request.isCancelled()); + + assertEquals("getNbRead", 0, request.getNbRead()); + } + + // ------------------------------------------------------------------------ + // equals + // ------------------------------------------------------------------------ + + public void testEqualsReflexivity() throws Exception { + assertTrue("equals", fRequest1.equals(fRequest1)); + assertTrue("equals", fRequest2.equals(fRequest2)); + + assertFalse("equals", fRequest1.equals(fRequest2)); + assertFalse("equals", fRequest2.equals(fRequest1)); + } + + public void testEqualsSymmetry() throws Exception { + assertTrue("equals", fRequest1.equals(fRequest1b)); + assertTrue("equals", fRequest1b.equals(fRequest1)); + + assertFalse("equals", fRequest1.equals(fRequest3)); + assertFalse("equals", fRequest2.equals(fRequest3)); + assertFalse("equals", fRequest3.equals(fRequest1)); + assertFalse("equals", fRequest3.equals(fRequest2)); + } + + public void testEqualsTransivity() throws Exception { + assertTrue("equals", fRequest1.equals(fRequest1b)); + assertTrue("equals", fRequest1b.equals(fRequest1c)); + assertTrue("equals", fRequest1.equals(fRequest1c)); + } + + public void testEqualsNull() throws Exception { + assertFalse("equals", fRequest1.equals(null)); + assertFalse("equals", fRequest2.equals(null)); + } + + // ------------------------------------------------------------------------ + // hashCode + // ------------------------------------------------------------------------ + + public void testHashCode() throws Exception { + assertTrue("hashCode", fRequest1.hashCode() == fRequest1.hashCode()); + assertTrue("hashCode", fRequest2.hashCode() == fRequest2.hashCode()); + assertTrue("hashCode", fRequest1.hashCode() != fRequest2.hashCode()); + } + + // ------------------------------------------------------------------------ + // toString + // ------------------------------------------------------------------------ + + public void testToString() { + String expected1 = "[TmfEventRequest(0,TmfEvent," + range1 + ",100,200)]"; + String expected2 = "[TmfEventRequest(1,TmfEvent," + range2 + ",100,200)]"; + String expected3 = "[TmfEventRequest(2,TmfEvent," + range2 + ",200,200)]"; + String expected4 = "[TmfEventRequest(3,TmfEvent," + range2 + ",200,300)]"; + + assertEquals("toString", expected1, fRequest1.toString()); + assertEquals("toString", expected2, fRequest2.toString()); + assertEquals("toString", expected3, fRequest3.toString()); + assertEquals("toString", expected4, fRequest4.toString()); + } + + // ------------------------------------------------------------------------ + // setData/getData + // ------------------------------------------------------------------------ + + public void testSetData() { + // Initialize the data + int nbEvents = 10; + TmfEvent[] events = new TmfEvent[nbEvents]; + for (int i = 0; i < nbEvents; i++) { + events[i] = new TmfEvent(new TmfTimestamp(i), new TmfEventSource(), + new TmfEventType(), new TmfEventReference()); + } + + fRequest1.setData(events); + assertEquals("setData", nbEvents, fRequest1.getNbRead()); + + TmfEvent[] eventsRead = fRequest1.getData(); + assertEquals("getData", nbEvents, eventsRead.length); + + for (int i = 0; i < nbEvents; i++) { + assertEquals("getData", i, eventsRead[i].getTimestamp().getValue()); + } + } + + // ------------------------------------------------------------------------ + // done + // ------------------------------------------------------------------------ + + public void testDone() { + + final boolean[] flags = new boolean[4]; + TmfEventRequest request = setupTestRequest(flags); + 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]); + } + + // ------------------------------------------------------------------------ + // fail + // ------------------------------------------------------------------------ + + public void testFail() { + + final boolean[] flags = new boolean[4]; + TmfEventRequest request = setupTestRequest(flags); + request.fail(); + + assertTrue ("isCompleted", request.isCompleted()); + assertTrue ("isFailed", request.isFailed()); + assertFalse("isCancelled", request.isCancelled()); + + assertTrue ("handleCompleted", flags[0]); + assertFalse("handleSuccess", flags[1]); + assertTrue ("handleFailure", flags[2]); + assertFalse("handleCancel", flags[3]); + } + + // ------------------------------------------------------------------------ + // cancel + // ------------------------------------------------------------------------ + + public void testCancel() { + + final boolean[] flags = new boolean[4]; + TmfEventRequest request = setupTestRequest(flags); + request.cancel(); + + 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]); + } + + // ------------------------------------------------------------------------ + // waitForCompletion + // ------------------------------------------------------------------------ + +} \ No newline at end of file diff --git a/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/request/TmfRequestExecutorTest.java b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/request/TmfRequestExecutorTest.java new file mode 100644 index 0000000000..003db950c5 --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/request/TmfRequestExecutorTest.java @@ -0,0 +1,116 @@ +/******************************************************************************* + * Copyright (c) 2009, 2010 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: + * Francois Chouinard - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.linuxtools.tmf.tests.request; + +import java.util.concurrent.Executors; + +import junit.framework.TestCase; + +import org.eclipse.linuxtools.tmf.request.TmfRequestExecutor; + +/** + * TmfRequestExecutorTest + * + * Test suite for the TmfRequestExecutor class. + */ +public class TmfRequestExecutorTest extends TestCase { + + // ------------------------------------------------------------------------ + // Variables + // ------------------------------------------------------------------------ + + // ------------------------------------------------------------------------ + // Housekeeping + // ------------------------------------------------------------------------ + + /** + * @param name the test name + */ + public TmfRequestExecutorTest(String name) { + super(name); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + } + + // ------------------------------------------------------------------------ + // Constructors + // ------------------------------------------------------------------------ + + /** + * Test method for {@link org.eclipse.linuxtools.tmf.request.TmfRequestExecutor#TmfRequestExecutor()}. + */ + public void testTmfRequestExecutor() { + TmfRequestExecutor executor = new TmfRequestExecutor(); + assertEquals("nbPendingRequests", 0, executor.getNbPendingRequests()); + assertFalse("isShutdown", executor.isShutdown()); + assertFalse("isTerminated", executor.isTerminated()); + } + + /** + * Test method for {@link org.eclipse.linuxtools.tmf.request.TmfRequestExecutor#TmfRequestExecutor(java.util.concurrent.ExecutorService)}. + */ + public void testTmfRequestExecutorExecutorService() { + TmfRequestExecutor executor = new TmfRequestExecutor(Executors.newCachedThreadPool()); + assertEquals("nbPendingRequests", 0, executor.getNbPendingRequests()); + assertFalse("isShutdown", executor.isShutdown()); + assertFalse("isTerminated", executor.isTerminated()); + } + + /** + * Test method for {@link org.eclipse.linuxtools.tmf.request.TmfRequestExecutor#stop()}. + */ + public void testStop() { + TmfRequestExecutor executor = new TmfRequestExecutor(); + executor.stop(); + assertEquals("nbPendingRequests", 0, executor.getNbPendingRequests()); + assertTrue("isShutdown", executor.isShutdown()); + assertTrue("isTerminated", executor.isTerminated()); + } + + // ------------------------------------------------------------------------ + // execute + // ------------------------------------------------------------------------ + + /** + * Test method for {@link org.eclipse.linuxtools.tmf.request.TmfRequestExecutor#execute(java.lang.Runnable)}. + */ + public void testExecute() { +// fail("Not yet implemented"); + } + + // ------------------------------------------------------------------------ + // toString + // ------------------------------------------------------------------------ + + /** + * Test method for {@link org.eclipse.linuxtools.tmf.request.TmfRequestExecutor#toString()}. + */ + public void testToString() { +// TmfRequestExecutor executor1 = new TmfRequestExecutor(); +// String expected1 = "[TmfRequestExecutor(DelegatedExecutorService)]"; +// assertEquals("toString", expected1, executor1.toString()); +// +// TmfRequestExecutor executor2 = new TmfRequestExecutor(Executors.newCachedThreadPool()); +// String expected2 = "[TmfRequestExecutor(ThreadPoolExecutor)]"; +// assertEquals("toString", expected2, executor2.toString()); + } + +} diff --git a/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/trace/AllTests.java b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/trace/AllTests.java new file mode 100644 index 0000000000..f228496b0b --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/trace/AllTests.java @@ -0,0 +1,21 @@ +package org.eclipse.linuxtools.tmf.tests.trace; + +import junit.framework.Test; +import junit.framework.TestSuite; + +import org.eclipse.linuxtools.tmf.TmfCorePlugin; + +public class AllTests { + + public static Test suite() { + TestSuite suite = new TestSuite("Test suite for " + TmfCorePlugin.PLUGIN_ID + ".trace"); //$NON-NLS-1$); + //$JUnit-BEGIN$ + suite.addTestSuite(TmfLocationTest.class); + suite.addTestSuite(TmfCheckpointTest.class); + suite.addTestSuite(TmfContextTest.class); + suite.addTestSuite(TmfTraceTest.class); + //$JUnit-END$ + return suite; + } + +} \ No newline at end of file diff --git a/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/trace/TmfCheckpointTest.java b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/trace/TmfCheckpointTest.java new file mode 100644 index 0000000000..7ab0dcabbb --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/trace/TmfCheckpointTest.java @@ -0,0 +1,182 @@ +/******************************************************************************* + * Copyright (c) 2009, 2010 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: + * Francois Chouinard - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.linuxtools.tmf.tests.trace; + +import junit.framework.TestCase; + +import org.eclipse.linuxtools.tmf.event.TmfTimestamp; +import org.eclipse.linuxtools.tmf.trace.TmfCheckpoint; +import org.eclipse.linuxtools.tmf.trace.TmfLocation; + +/** + * TmfCheckpointTest + *

+ * Test suite for the TmfCheckpoint class. + */ +public class TmfCheckpointTest extends TestCase { + + // ------------------------------------------------------------------------ + // Variables + // ------------------------------------------------------------------------ + + TmfTimestamp fTimestamp1 = new TmfTimestamp(); + TmfTimestamp fTimestamp2 = TmfTimestamp.BigBang; + TmfTimestamp fTimestamp3 = TmfTimestamp.BigCrunch; + + Long aLong1 = 12345L; + Long aLong2 = 23456L; + Long aLong3 = 34567L; + TmfLocation fLocation1 = new TmfLocation(aLong1); + TmfLocation fLocation2 = new TmfLocation(aLong2); + TmfLocation fLocation3 = new TmfLocation(aLong3); + + TmfCheckpoint fCheckpoint1 = new TmfCheckpoint(fTimestamp1, fLocation1); + TmfCheckpoint fCheckpoint2 = new TmfCheckpoint(fTimestamp2, fLocation2); + TmfCheckpoint fCheckpoint3 = new TmfCheckpoint(fTimestamp3, fLocation3); + + // ------------------------------------------------------------------------ + // Housekeeping + // ------------------------------------------------------------------------ + + /** + * @param name the test name + */ + public TmfCheckpointTest(String name) { + super(name); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + } + + // ------------------------------------------------------------------------ + // Constructors + // ------------------------------------------------------------------------ + + public void testTmfCheckpoint() { + assertEquals("TmfCheckpoint", fTimestamp1, fCheckpoint1.getTimestamp()); + assertEquals("TmfCheckpoint", fLocation1, fCheckpoint1.getLocation()); + } + + public void testTmfLocationCopy() { + TmfCheckpoint checkpoint = new TmfCheckpoint(fCheckpoint1); + + assertEquals("TmfCheckpoint", fTimestamp1, checkpoint.getTimestamp()); + assertEquals("TmfCheckpoint", fLocation1, checkpoint.getLocation()); + } + + public void testTmfLocationCopy2() throws Exception { + try { + new TmfCheckpoint(null); + fail("null copy"); + } + catch (IllegalArgumentException e) { + // Success + } + } + + // ------------------------------------------------------------------------ + // equals + // ------------------------------------------------------------------------ + + public void testEqualsReflexivity() throws Exception { + assertTrue("equals", fCheckpoint1.equals(fCheckpoint1)); + assertTrue("equals", fCheckpoint2.equals(fCheckpoint2)); + + assertTrue("equals", !fCheckpoint1.equals(fCheckpoint2)); + assertTrue("equals", !fCheckpoint2.equals(fCheckpoint1)); + } + + public void testEqualsSymmetry() throws Exception { + TmfCheckpoint checkpoint1 = new TmfCheckpoint(fCheckpoint1); + TmfCheckpoint checkpoint2 = new TmfCheckpoint(fCheckpoint2); + + assertTrue("equals", checkpoint1.equals(fCheckpoint1)); + assertTrue("equals", fCheckpoint1.equals(checkpoint1)); + + assertTrue("equals", checkpoint2.equals(fCheckpoint2)); + assertTrue("equals", fCheckpoint2.equals(checkpoint2)); + } + + public void testEqualsTransivity() throws Exception { + TmfCheckpoint checkpoint1 = new TmfCheckpoint(fCheckpoint1); + TmfCheckpoint checkpoint2 = new TmfCheckpoint(checkpoint1); + TmfCheckpoint checkpoint3 = new TmfCheckpoint(checkpoint2); + + assertTrue("equals", checkpoint1.equals(checkpoint2)); + assertTrue("equals", checkpoint2.equals(checkpoint3)); + assertTrue("equals", checkpoint1.equals(checkpoint3)); + } + + public void testEqualsNull() throws Exception { + assertTrue("equals", !fCheckpoint1.equals(null)); + assertTrue("equals", !fCheckpoint2.equals(null)); + } + + // ------------------------------------------------------------------------ + // hashCode + // ------------------------------------------------------------------------ + + public void testHashCode() throws Exception { + TmfCheckpoint checkpoint1 = new TmfCheckpoint(fCheckpoint1); + TmfCheckpoint checkpoint2 = new TmfCheckpoint(fCheckpoint2); + + assertTrue("hashCode", fCheckpoint1.hashCode() == checkpoint1.hashCode()); + assertTrue("hashCode", fCheckpoint2.hashCode() == checkpoint2.hashCode()); + + assertTrue("hashCode", fCheckpoint1.hashCode() != checkpoint2.hashCode()); + assertTrue("hashCode", fCheckpoint2.hashCode() != checkpoint1.hashCode()); + } + + // ------------------------------------------------------------------------ + // toString + // ------------------------------------------------------------------------ + + public void testToString() { + String expected1 = "[TmfCheckpoint(" + fCheckpoint1.getTimestamp() + "," + + fCheckpoint1.getLocation() + ")]"; + String expected2 = "[TmfCheckpoint(" + fCheckpoint2.getTimestamp() + "," + + fCheckpoint2.getLocation() + ")]"; + String expected3 = "[TmfCheckpoint(" + fCheckpoint3.getTimestamp() + "," + + fCheckpoint3.getLocation() + ")]"; + + assertEquals("toString", expected1, fCheckpoint1.toString()); + assertEquals("toString", expected2, fCheckpoint2.toString()); + assertEquals("toString", expected3, fCheckpoint3.toString()); + } + + // ------------------------------------------------------------------------ + // compareTo + // ------------------------------------------------------------------------ + + public void testCompareTo() { + assertEquals("compareTo", 0, fCheckpoint1.compareTo(fCheckpoint1)); + assertEquals("compareTo", 1, fCheckpoint1.compareTo(fCheckpoint2)); + assertEquals("compareTo", -1, fCheckpoint1.compareTo(fCheckpoint3)); + + assertEquals("compareTo", -1, fCheckpoint2.compareTo(fCheckpoint1)); + assertEquals("compareTo", 0, fCheckpoint2.compareTo(fCheckpoint2)); + assertEquals("compareTo", -1, fCheckpoint2.compareTo(fCheckpoint3)); + + assertEquals("compareTo", 1, fCheckpoint3.compareTo(fCheckpoint1)); + assertEquals("compareTo", 1, fCheckpoint3.compareTo(fCheckpoint2)); + assertEquals("compareTo", 0, fCheckpoint3.compareTo(fCheckpoint3)); + } + +} diff --git a/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/trace/TmfContextTest.java b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/trace/TmfContextTest.java new file mode 100644 index 0000000000..54550ed484 --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/trace/TmfContextTest.java @@ -0,0 +1,236 @@ +/******************************************************************************* + * Copyright (c) 2009, 2010 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: + * Francois Chouinard - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.linuxtools.tmf.tests.trace; + +import junit.framework.TestCase; + +import org.eclipse.linuxtools.tmf.event.TmfTimestamp; +import org.eclipse.linuxtools.tmf.trace.TmfContext; +import org.eclipse.linuxtools.tmf.trace.TmfLocation; + +/** + * TmfContextTest + *

+ * Test suite for the TmfContext class. + */ +public class TmfContextTest extends TestCase { + + // ------------------------------------------------------------------------ + // Variables + // ------------------------------------------------------------------------ + + final String aString = "some location"; + final Long aLong = 12345L; + final TmfTimestamp aTimestamp = new TmfTimestamp(); + + final TmfLocation fLocation1 = new TmfLocation(aString); + final TmfLocation fLocation2 = new TmfLocation(aLong); + final TmfLocation fLocation3 = new TmfLocation(aTimestamp); + + final long fRank1 = 1; + final long fRank2 = 2; + final long fRank3 = 3; + + final TmfContext fContext1 = new TmfContext(fLocation1, fRank1); + final TmfContext fContext2 = new TmfContext(fLocation2, fRank2); + final TmfContext fContext3 = new TmfContext(fLocation3, fRank3); + + // ------------------------------------------------------------------------ + // Housekeeping + // ------------------------------------------------------------------------ + + /** + * @param name the test name + */ + public TmfContextTest(String name) { + super(name); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + } + + // ------------------------------------------------------------------------ + // Constructors + // ------------------------------------------------------------------------ + + public void testTmfContextDefault() { + TmfContext context = new TmfContext(); + assertEquals("getLocation", null, context.getLocation()); + assertEquals("getRank", 0, context.getRank()); + } + + public void testTmfContextNoRank() { + TmfContext context1 = new TmfContext(fLocation1); + TmfContext context2 = new TmfContext(fLocation2); + TmfContext context3 = new TmfContext(fLocation3); + + assertEquals("getLocation", fLocation1, context1.getLocation()); + assertEquals("getLocation", fLocation2, context2.getLocation()); + assertEquals("getLocation", fLocation3, context3.getLocation()); + + assertEquals("getRank", 0, context1.getRank()); + assertEquals("getRank", 0, context2.getRank()); + assertEquals("getRank", 0, context3.getRank()); + } + + public void testTmfContext() { + assertEquals("getLocation", fLocation1, fContext1.getLocation()); + assertEquals("getLocation", fLocation2, fContext2.getLocation()); + assertEquals("getLocation", fLocation3, fContext3.getLocation()); + + assertEquals("getRank", fRank1, fContext1.getRank()); + assertEquals("getRank", fRank2, fContext2.getRank()); + assertEquals("getRank", fRank3, fContext3.getRank()); + } + + public void testTmfContextCopy() { + TmfContext context1 = new TmfContext(fContext1); + TmfContext context2 = new TmfContext(fContext2); + TmfContext context3 = new TmfContext(fContext3); + + assertEquals("getLocation", fLocation1, context1.getLocation()); + assertEquals("getLocation", fLocation2, context2.getLocation()); + assertEquals("getLocation", fLocation3, context3.getLocation()); + + assertEquals("getRank", fRank1, context1.getRank()); + assertEquals("getRank", fRank2, context2.getRank()); + assertEquals("getRank", fRank3, context3.getRank()); + } + + // ------------------------------------------------------------------------ + // equals + // ------------------------------------------------------------------------ + + public void testEqualsReflexivity() throws Exception { + assertTrue("equals", fContext1.equals(fContext1)); + assertTrue("equals", fContext2.equals(fContext2)); + + assertTrue("equals", !fContext1.equals(fContext2)); + assertTrue("equals", !fContext2.equals(fContext1)); + } + + public void testEqualsSymmetry() throws Exception { + TmfContext context1 = new TmfContext(fContext1); + TmfContext context2 = new TmfContext(fContext2); + + assertTrue("equals", context1.equals(fContext1)); + assertTrue("equals", fContext1.equals(context1)); + + assertTrue("equals", context2.equals(fContext2)); + assertTrue("equals", fContext2.equals(context2)); + } + + public void testEqualsTransivity() throws Exception { + TmfContext context1 = new TmfContext(fContext1); + TmfContext context2 = new TmfContext(context1); + TmfContext context3 = new TmfContext(context2); + + assertTrue("equals", context1.equals(context2)); + assertTrue("equals", context2.equals(context3)); + assertTrue("equals", context1.equals(context3)); + } + + public void testEqualsNull() throws Exception { + assertTrue("equals", !fContext1.equals(null)); + assertTrue("equals", !fContext2.equals(null)); + } + + // ------------------------------------------------------------------------ + // hashCode + // ------------------------------------------------------------------------ + + public void testHashCode() throws Exception { + TmfContext context1 = new TmfContext(fContext1); + TmfContext context2 = new TmfContext(fContext2); + + assertTrue("hashCode", fContext1.hashCode() == context1.hashCode()); + assertTrue("hashCode", fContext2.hashCode() == context2.hashCode()); + + assertTrue("hashCode", fContext1.hashCode() != context2.hashCode()); + assertTrue("hashCode", fContext2.hashCode() != context1.hashCode()); + } + + // ------------------------------------------------------------------------ + // toString + // ------------------------------------------------------------------------ + + public void testToString() { + String expected1 = "[TmfContext(" + fLocation1 + "," + 1 + ")]"; + String expected2 = "[TmfContext(" + fLocation2 + "," + 2 + ")]"; + String expected3 = "[TmfContext(" + fLocation3 + "," + 3 + ")]"; + + assertEquals("toString", expected1, fContext1.toString()); + assertEquals("toString", expected2, fContext2.toString()); + assertEquals("toString", expected3, fContext3.toString()); + } + + // ------------------------------------------------------------------------ + // clone + // ------------------------------------------------------------------------ + + public void testClone() { + try { + TmfContext context1 = fContext1.clone(); + TmfContext context2 = fContext2.clone(); + TmfContext context3 = fContext3.clone(); + + assertEquals("clone", context1, fContext1); + assertEquals("clone", context2, fContext2); + assertEquals("clone", context3, fContext3); + } + catch (InternalError e) { + fail("clone()"); + } + } + + // ------------------------------------------------------------------------ + // setLocation, setRank, updateRank + // ------------------------------------------------------------------------ + + public void testSetLocation() { + TmfContext context1 = new TmfContext(fContext1); + context1.setLocation(fContext2.getLocation()); + + assertEquals("getLocation", fLocation2, context1.getLocation()); + assertEquals("getRank", 1, context1.getRank()); + } + + public void testSetRank() { + TmfContext context1 = new TmfContext(fContext1); + context1.setRank(fContext2.getRank()); + + assertEquals("getLocation", fLocation1, context1.getLocation()); + assertEquals("getRank", fRank2, context1.getRank()); + } + + public void testUpdatetRank() { + TmfContext context1 = new TmfContext(fContext1); + + context1.updateRank(0); + assertEquals("getRank", fRank1, context1.getRank()); + + context1.updateRank(-1); + assertEquals("getRank", fRank1 - 1, context1.getRank()); + + context1.updateRank(2); + assertEquals("getRank", fRank1 + 1, context1.getRank()); + } + +} diff --git a/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/trace/TmfExperimentTest.java b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/trace/TmfExperimentTest.java new file mode 100644 index 0000000000..e9a2711c0f --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/trace/TmfExperimentTest.java @@ -0,0 +1,657 @@ +/******************************************************************************* + * Copyright (c) 2009, 2010 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: + * Francois Chouinard - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.linuxtools.tmf.tests.trace; + +import java.io.File; +import java.io.IOException; +import java.net.URISyntaxException; +import java.net.URL; +import java.util.Vector; + +import junit.framework.TestCase; + +import org.eclipse.core.runtime.FileLocator; +import org.eclipse.core.runtime.Path; +import org.eclipse.linuxtools.tmf.event.TmfEvent; +import org.eclipse.linuxtools.tmf.event.TmfTimeRange; +import org.eclipse.linuxtools.tmf.event.TmfTimestamp; +import org.eclipse.linuxtools.tmf.experiment.TmfExperiment; +import org.eclipse.linuxtools.tmf.experiment.TmfExperimentContext; +import org.eclipse.linuxtools.tmf.request.TmfEventRequest; +import org.eclipse.linuxtools.tmf.tests.TmfCoreTestPlugin; +import org.eclipse.linuxtools.tmf.trace.ITmfTrace; +import org.eclipse.linuxtools.tmf.trace.TmfCheckpoint; +import org.eclipse.linuxtools.tmf.trace.TmfContext; +import org.eclipse.linuxtools.tmf.trace.TmfTraceStub; + +/** + * TmfExperimentTest + *

+ * TODO: Implement me. Please. + */ +public class TmfExperimentTest extends TestCase { + + private static final String DIRECTORY = "testfiles"; + private static final String TEST_STREAM = "A-Test-10K"; + private static final String EXPERIMENT = "MyExperiment"; + private static int NB_EVENTS = 10000; + private static int fDefaultBlockSize = 1000; + + private static ITmfTrace[] fTraces; + private static TmfExperiment fExperiment; + + private static byte SCALE = (byte) -3; + + // ------------------------------------------------------------------------ + // Housekeeping + // ------------------------------------------------------------------------ + + private ITmfTrace[] setupTrace(String path) { + if (fTraces == null) { + fTraces = new ITmfTrace[1]; + try { + URL location = FileLocator.find(TmfCoreTestPlugin.getDefault().getBundle(), new Path(path), null); + File test = new File(FileLocator.toFileURL(location).toURI()); + TmfTraceStub trace = new TmfTraceStub(test.getPath(), true); + fTraces[0] = trace; + } catch (URISyntaxException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return fTraces; + } + + private void setupExperiment() { + if (fExperiment == null) { + fExperiment = new TmfExperiment(TmfEvent.class, EXPERIMENT, fTraces); + fExperiment.indexExperiment(true); + } + } + + public TmfExperimentTest(String name) throws Exception { + super(name); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + setupTrace(DIRECTORY + File.separator + TEST_STREAM); + setupExperiment(); + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + } + + // ------------------------------------------------------------------------ + // Constructor + // ------------------------------------------------------------------------ + + public void testBasicTmfExperimentConstructor() { + assertEquals("GetId", EXPERIMENT, fExperiment.getName()); + assertEquals("GetEpoch", TmfTimestamp.Zero, fExperiment.getEpoch()); + assertEquals("GetNbEvents", NB_EVENTS, fExperiment.getNbEvents()); + + TmfTimeRange timeRange = fExperiment.getTimeRange(); + assertEquals("getStartTime", 1, timeRange.getStartTime().getValue()); + assertEquals("getEndTime", NB_EVENTS, timeRange.getEndTime().getValue()); + } + + // ------------------------------------------------------------------------ + // Verify checkpoints + // Note: seekLocation() does not reliably set the rank + // ------------------------------------------------------------------------ + + public void testValidateCheckpoints() throws Exception { + + Vector checkpoints = fExperiment.getCheckpoints(); +// int pageSize = fExperiment.getCacheSize(); + assertTrue("Checkpoints exist", checkpoints != null); + + // Validate that each checkpoint points to the right event + for (int i = 0; i < checkpoints.size(); i++) { + TmfCheckpoint checkpoint = checkpoints.get(i); + TmfExperimentContext context = fExperiment.seekLocation(checkpoint.getLocation()); + TmfEvent event = fExperiment.parseEvent(context); +// assertEquals("Event rank", context.getRank(), i * pageSize); + assertTrue("Timestamp", (checkpoint.getTimestamp().compareTo(event.getTimestamp(), false) == 0)); + } + } + + // ------------------------------------------------------------------------ + // parseEvent - make sure parseEvent doesn't update the context + // ------------------------------------------------------------------------ + + public void testParseEvent() throws Exception { + + // On lower bound, returns the first event (ts = 0) + TmfContext context = fExperiment.seekEvent(new TmfTimestamp(0, SCALE, 0)); + + TmfEvent event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + + for (int i = 1; i < 20; i++) { + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", i, event.getTimestamp().getValue()); + } + + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 20, event.getTimestamp().getValue()); + + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 20, event.getTimestamp().getValue()); + } + + // ------------------------------------------------------------------------ + // getNextEvent - updates the context + // ------------------------------------------------------------------------ + + public void testGetNextEvent() throws Exception { + + // On lower bound, returns the first event (ts = 0) + TmfContext context = fExperiment.seekEvent(new TmfTimestamp(0, SCALE, 0)); + TmfEvent event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + + for (int i = 2; i < 20; i++) { + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", i, event.getTimestamp().getValue()); + } + } + + // ------------------------------------------------------------------------ + // seekLocation + // Note: seekLocation() does not reliably set the rank + // ------------------------------------------------------------------------ + + public void testSeekLocationOnCacheBoundary() throws Exception { + + // Position trace at event rank 0 + TmfContext context = fExperiment.seekLocation(null); +// assertEquals("Event rank", 0, context.getRank()); + TmfEvent event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); +// assertEquals("Event rank", 0, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); +// assertEquals("Event rank", 1, context.getRank()); + + // Position trace at event rank 1000 + TmfContext tmpContext = fExperiment.seekEvent(new TmfTimestamp(1001, SCALE, 0)); + context = fExperiment.seekLocation(tmpContext.getLocation().clone()); +// assertEquals("Event rank", 1000, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1001, event.getTimestamp().getValue()); +// assertEquals("Event rank", 1000, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1001, event.getTimestamp().getValue()); +// assertEquals("Event rank", 1001, context.getRank()); + + // Position trace at event rank 4000 + tmpContext = fExperiment.seekEvent(new TmfTimestamp(4001, SCALE, 0)); + context = fExperiment.seekLocation(tmpContext.getLocation().clone()); +// assertEquals("Event rank", 4000, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 4001, event.getTimestamp().getValue()); +// assertEquals("Event rank", 4000, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 4001, event.getTimestamp().getValue()); +// assertEquals("Event rank", 4001, context.getRank()); + } + + public void testSeekLocationNotOnCacheBoundary() throws Exception { + + // Position trace at event rank 9 + TmfContext tmpContext = fExperiment.seekEvent(new TmfTimestamp(10, SCALE, 0)); + TmfContext context = fExperiment.seekLocation(tmpContext.getLocation().clone()); +// assertEquals("Event rank", 9, context.getRank()); + TmfEvent event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 10, event.getTimestamp().getValue()); +// assertEquals("Event rank", 9, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 10, event.getTimestamp().getValue()); +// assertEquals("Event rank", 10, context.getRank()); + + // Position trace at event rank 999 + tmpContext = fExperiment.seekEvent(new TmfTimestamp(1000, SCALE, 0)); + context = fExperiment.seekLocation(tmpContext.getLocation().clone()); +// assertEquals("Event rank", 999, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1000, event.getTimestamp().getValue()); +// assertEquals("Event rank", 999, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1000, event.getTimestamp().getValue()); +// assertEquals("Event rank", 1000, context.getRank()); + + // Position trace at event rank 1001 + tmpContext = fExperiment.seekEvent(new TmfTimestamp(1002, SCALE, 0)); + context = fExperiment.seekLocation(tmpContext.getLocation().clone()); +// assertEquals("Event rank", 1001, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1002, event.getTimestamp().getValue()); +// assertEquals("Event rank", 1001, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1002, event.getTimestamp().getValue()); +// assertEquals("Event rank", 1002, context.getRank()); + + // Position trace at event rank 4500 + tmpContext = fExperiment.seekEvent(new TmfTimestamp(4501, SCALE, 0)); + context = fExperiment.seekLocation(tmpContext.getLocation().clone()); +// assertEquals("Event rank", 4500, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 4501, event.getTimestamp().getValue()); +// assertEquals("Event rank", 4500, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 4501, event.getTimestamp().getValue()); +// assertEquals("Event rank", 4501, context.getRank()); + } + + public void testSeekLocationOutOfScope() throws Exception { + + // Position trace at beginning + TmfContext tmpContext = fExperiment.seekLocation(null); + TmfContext context = fExperiment.seekLocation(tmpContext.getLocation().clone()); +// assertEquals("Event rank", 0, context.getRank()); + TmfEvent event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); +// assertEquals("Event rank", 0, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); +// assertEquals("Event rank", 1, context.getRank()); + + // Position trace at event passed the end + tmpContext = fExperiment.seekEvent(new TmfTimestamp(NB_EVENTS + 1, SCALE, 0)); + context = fExperiment.seekLocation(tmpContext.getLocation().clone()); +// assertEquals("Event rank", NB_EVENTS, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", null, event); +// assertEquals("Event rank", NB_EVENTS, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", null, event); +// assertEquals("Event rank", NB_EVENTS, context.getRank()); + } + + // ------------------------------------------------------------------------ + // seekEvent on timestamp + // ------------------------------------------------------------------------ + + public void testSeekEventOnTimestampOnCacheBoundary() throws Exception { + + // Position trace at event rank 0 + TmfContext context = fExperiment.seekEvent(new TmfTimestamp(1, SCALE, 0)); + assertEquals("Event rank", 0, context.getRank()); + TmfEvent event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + assertEquals("Event rank", 0, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + assertEquals("Event rank", 1, context.getRank()); + + // Position trace at event rank 1000 + context = fExperiment.seekEvent(new TmfTimestamp(1001, SCALE, 0)); + assertEquals("Event rank", 1000, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1001, event.getTimestamp().getValue()); + assertEquals("Event rank", 1000, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1001, event.getTimestamp().getValue()); + assertEquals("Event rank", 1001, context.getRank()); + + // Position trace at event rank 4000 + context = fExperiment.seekEvent(new TmfTimestamp(4001, SCALE, 0)); + assertEquals("Event rank", 4000, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 4001, event.getTimestamp().getValue()); + assertEquals("Event rank", 4000, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 4001, event.getTimestamp().getValue()); + assertEquals("Event rank", 4001, context.getRank()); + } + + public void testSeekEventOnTimestampNotOnCacheBoundary() throws Exception { + + // Position trace at event rank 1 + TmfContext context = fExperiment.seekEvent(new TmfTimestamp(2, SCALE, 0)); + assertEquals("Event rank", 1, context.getRank()); + TmfEvent event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 2, event.getTimestamp().getValue()); + assertEquals("Event rank", 1, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 2, event.getTimestamp().getValue()); + assertEquals("Event rank", 2, context.getRank()); + + // Position trace at event rank 9 + context = fExperiment.seekEvent(new TmfTimestamp(10, SCALE, 0)); + assertEquals("Event rank", 9, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 10, event.getTimestamp().getValue()); + assertEquals("Event rank", 9, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 10, event.getTimestamp().getValue()); + assertEquals("Event rank", 10, context.getRank()); + + // Position trace at event rank 999 + context = fExperiment.seekEvent(new TmfTimestamp(1000, SCALE, 0)); + assertEquals("Event rank", 999, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1000, event.getTimestamp().getValue()); + assertEquals("Event rank", 999, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1000, event.getTimestamp().getValue()); + assertEquals("Event rank", 1000, context.getRank()); + + // Position trace at event rank 1001 + context = fExperiment.seekEvent(new TmfTimestamp(1002, SCALE, 0)); + assertEquals("Event rank", 1001, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1002, event.getTimestamp().getValue()); + assertEquals("Event rank", 1001, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1002, event.getTimestamp().getValue()); + assertEquals("Event rank", 1002, context.getRank()); + + // Position trace at event rank 4500 + context = fExperiment.seekEvent(new TmfTimestamp(4501, SCALE, 0)); + assertEquals("Event rank", 4500, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 4501, event.getTimestamp().getValue()); + assertEquals("Event rank", 4500, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 4501, event.getTimestamp().getValue()); + assertEquals("Event rank", 4501, context.getRank()); + } + + public void testSeekEventOnTimestampoutOfScope() throws Exception { + + // Position trace at beginning + TmfContext context = fExperiment.seekEvent(new TmfTimestamp(-1, SCALE, 0)); + assertEquals("Event rank", 0, context.getRank()); + TmfEvent event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + assertEquals("Event rank", 0, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + assertEquals("Event rank", 1, context.getRank()); + + // Position trace at event passed the end + context = fExperiment.seekEvent(new TmfTimestamp(NB_EVENTS + 1, SCALE, 0)); + assertEquals("Event rank", NB_EVENTS, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", null, event); + assertEquals("Event rank", NB_EVENTS, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", null, event); + assertEquals("Event rank", NB_EVENTS, context.getRank()); + } + + // ------------------------------------------------------------------------ + // seekEvent on rank + // ------------------------------------------------------------------------ + + public void testSeekOnRankOnCacheBoundary() throws Exception { + + // On lower bound, returns the first event (ts = 1) + TmfContext context = fExperiment.seekEvent(0); + assertEquals("Event rank", 0, context.getRank()); + TmfEvent event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + assertEquals("Event rank", 0, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + assertEquals("Event rank", 1, context.getRank()); + + // Position trace at event rank 1000 + context = fExperiment.seekEvent(1000); + assertEquals("Event rank", 1000, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1001, event.getTimestamp().getValue()); + assertEquals("Event rank", 1000, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1001, event.getTimestamp().getValue()); + assertEquals("Event rank", 1001, context.getRank()); + + // Position trace at event rank 4000 + context = fExperiment.seekEvent(4000); + assertEquals("Event rank", 4000, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 4001, event.getTimestamp().getValue()); + assertEquals("Event rank", 4000, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 4001, event.getTimestamp().getValue()); + assertEquals("Event rank", 4001, context.getRank()); + } + + public void testSeekOnRankNotOnCacheBoundary() throws Exception { + + // Position trace at event rank 9 + TmfContext context = fExperiment.seekEvent(9); + assertEquals("Event rank", 9, context.getRank()); + TmfEvent event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 10, event.getTimestamp().getValue()); + assertEquals("Event rank", 9, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 10, event.getTimestamp().getValue()); + assertEquals("Event rank", 10, context.getRank()); + + // Position trace at event rank 999 + context = fExperiment.seekEvent(999); + assertEquals("Event rank", 999, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1000, event.getTimestamp().getValue()); + assertEquals("Event rank", 999, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1000, event.getTimestamp().getValue()); + assertEquals("Event rank", 1000, context.getRank()); + + // Position trace at event rank 1001 + context = fExperiment.seekEvent(1001); + assertEquals("Event rank", 1001, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1002, event.getTimestamp().getValue()); + assertEquals("Event rank", 1001, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1002, event.getTimestamp().getValue()); + assertEquals("Event rank", 1002, context.getRank()); + + // Position trace at event rank 4500 + context = fExperiment.seekEvent(4500); + assertEquals("Event rank", 4500, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 4501, event.getTimestamp().getValue()); + assertEquals("Event rank", 4500, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 4501, event.getTimestamp().getValue()); + assertEquals("Event rank", 4501, context.getRank()); + } + + public void testSeekEventOnRankOfScope() throws Exception { + + // Position trace at beginning + TmfContext context = fExperiment.seekEvent(-1); + assertEquals("Event rank", 0, context.getRank()); + TmfEvent event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + assertEquals("Event rank", 0, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + assertEquals("Event rank", 1, context.getRank()); + + // Position trace at event passed the end + context = fExperiment.seekEvent(NB_EVENTS); + assertEquals("Event rank", NB_EVENTS, context.getRank()); + event = fExperiment.parseEvent(context); + assertEquals("Event timestamp", null, event); + assertEquals("Event rank", NB_EVENTS, context.getRank()); + event = fExperiment.getNextEvent(context); + assertEquals("Event timestamp", null, event); + assertEquals("Event rank", NB_EVENTS, context.getRank()); + } + + // ------------------------------------------------------------------------ + // processRequest + // ------------------------------------------------------------------------ + + public void testProcessRequestForNbEvents() throws Exception { + final int blockSize = 100; + final int nbEvents = 1000; + final Vector requestedEvents = new Vector(); + + TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch); + final TmfEventRequest request = new TmfEventRequest(TmfEvent.class, range, nbEvents, blockSize) { + @Override + public void handleData() { + TmfEvent[] events = getData(); + for (TmfEvent e : events) { + requestedEvents.add(e); + } + } + }; + fExperiment.sendRequest(request); + request.waitForCompletion(); + + assertEquals("nbEvents", nbEvents, requestedEvents.size()); + assertTrue("isCompleted", request.isCompleted()); + assertFalse("isCancelled", request.isCancelled()); + + // Ensure that we have distinct events. + // Don't go overboard: we are not validating the stub! + for (int i = 0; i < nbEvents; i++) { + assertEquals("Distinct events", i+1, requestedEvents.get(i).getTimestamp().getValue()); + } + } + + public void testProcessRequestForNbEvents2() throws Exception { + final int blockSize = 2 * NB_EVENTS; + final int nbEvents = 1000; + final Vector requestedEvents = new Vector(); + + TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch); + final TmfEventRequest request = new TmfEventRequest(TmfEvent.class, range, nbEvents, blockSize) { + @Override + public void handleData() { + TmfEvent[] events = getData(); + for (TmfEvent e : events) { + requestedEvents.add(e); + } + } + }; + fExperiment.sendRequest(request); + request.waitForCompletion(); + + assertEquals("nbEvents", nbEvents, requestedEvents.size()); + assertTrue("isCompleted", request.isCompleted()); + assertFalse("isCancelled", request.isCancelled()); + + // Ensure that we have distinct events. + // Don't go overboard: we are not validating the stub! + for (int i = 0; i < nbEvents; i++) { + assertEquals("Distinct events", i+1, requestedEvents.get(i).getTimestamp().getValue()); + } + } + + public void testProcessRequestForAllEvents() throws Exception { + final int nbEvents = TmfEventRequest.ALL_DATA; + final int blockSize = 1; + final Vector requestedEvents = new Vector(); + long nbExpectedEvents = fExperiment.getNbEvents(); + + TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch); + final TmfEventRequest request = new TmfEventRequest(TmfEvent.class, range, nbEvents, blockSize) { + @Override + public void handleData() { + TmfEvent[] events = getData(); + for (TmfEvent e : events) { + requestedEvents.add(e); + } + } + }; + fExperiment.sendRequest(request); + request.waitForCompletion(); + + assertEquals("nbEvents", nbExpectedEvents, requestedEvents.size()); + assertTrue("isCompleted", request.isCompleted()); + assertFalse("isCancelled", request.isCancelled()); + + // Ensure that we have distinct events. + // Don't go overboard: we are not validating the stub! + for (int i = 0; i < nbExpectedEvents; i++) { + assertEquals("Distinct events", i+1, requestedEvents.get(i).getTimestamp().getValue()); + } + } + + // ------------------------------------------------------------------------ + // cancel + // ------------------------------------------------------------------------ + + public void testCancel() throws Exception { + final int nbEvents = NB_EVENTS; + final int blockSize = fDefaultBlockSize; + final Vector requestedEvents = new Vector(); + + TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch); + final TmfEventRequest request = new TmfEventRequest(TmfEvent.class, range, nbEvents, blockSize) { + @Override + public void handleData() { + TmfEvent[] events = getData(); + for (TmfEvent e : events) { + requestedEvents.add(e); + } + // Cancel request after the first chunk is received + cancel(); + } + }; + fExperiment.sendRequest(request); + request.waitForCompletion(); + + assertEquals("nbEvents", blockSize, requestedEvents.size()); + assertTrue("isCompleted", request.isCompleted()); + assertTrue("isCancelled", request.isCancelled()); + } + + // ------------------------------------------------------------------------ + // getRank + // ------------------------------------------------------------------------ + + public void testGetRank() throws Exception { + assertEquals("getRank", 0, fExperiment.getRank(new TmfTimestamp())); + assertEquals("getRank", 0, fExperiment.getRank(new TmfTimestamp( 1, (byte) -3))); + assertEquals("getRank", 10, fExperiment.getRank(new TmfTimestamp( 11, (byte) -3))); + assertEquals("getRank", 100, fExperiment.getRank(new TmfTimestamp( 101, (byte) -3))); + assertEquals("getRank", 1000, fExperiment.getRank(new TmfTimestamp(1001, (byte) -3))); + assertEquals("getRank", 2000, fExperiment.getRank(new TmfTimestamp(2001, (byte) -3))); + assertEquals("getRank", 2500, fExperiment.getRank(new TmfTimestamp(2501, (byte) -3))); + } + + // ------------------------------------------------------------------------ + // getTimestamp + // ------------------------------------------------------------------------ + + public void testGetTimestamp() throws Exception { + assertTrue("getTimestamp", fExperiment.getTimestamp( 0).equals(new TmfTimestamp( 1, (byte) -3))); + assertTrue("getTimestamp", fExperiment.getTimestamp( 10).equals(new TmfTimestamp( 11, (byte) -3))); + assertTrue("getTimestamp", fExperiment.getTimestamp( 100).equals(new TmfTimestamp( 101, (byte) -3))); + assertTrue("getTimestamp", fExperiment.getTimestamp(1000).equals(new TmfTimestamp(1001, (byte) -3))); + assertTrue("getTimestamp", fExperiment.getTimestamp(2000).equals(new TmfTimestamp(2001, (byte) -3))); + assertTrue("getTimestamp", fExperiment.getTimestamp(2500).equals(new TmfTimestamp(2501, (byte) -3))); + } + +} \ No newline at end of file diff --git a/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/trace/TmfLocationTest.java b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/trace/TmfLocationTest.java new file mode 100644 index 0000000000..e95cd25953 --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/trace/TmfLocationTest.java @@ -0,0 +1,262 @@ +/******************************************************************************* + * Copyright (c) 2009, 2010 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: + * Francois Chouinard - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.linuxtools.tmf.tests.trace; + +import junit.framework.TestCase; + +import org.eclipse.linuxtools.tmf.event.TmfTimestamp; +import org.eclipse.linuxtools.tmf.trace.TmfLocation; + +/** + * TmfLocationTest + *

+ * Test suite for the TmfLocation class. + */ +public class TmfLocationTest extends TestCase { + + // ------------------------------------------------------------------------ + // Variables + // ------------------------------------------------------------------------ + + String aString = "some location"; + Long aLong = 12345L; + TmfTimestamp aTimestamp = new TmfTimestamp(); + + TmfLocation fLocation1; + TmfLocation fLocation2; + TmfLocation fLocation3; + + // ------------------------------------------------------------------------ + // Housekeeping + // ------------------------------------------------------------------------ + + /** + * @param name the test name + */ + public TmfLocationTest(String name) { + super(name); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + fLocation1 = new TmfLocation(aString); + fLocation2 = new TmfLocation(aLong); + fLocation3 = new TmfLocation(aTimestamp); + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + } + + // ------------------------------------------------------------------------ + // Constructors + // ------------------------------------------------------------------------ + + public void testTmfLocation() { + assertEquals("TmfLocation", aString, fLocation1.getLocation()); + assertEquals("TmfLocation", aLong, fLocation2.getLocation()); + assertEquals("TmfLocation", aTimestamp, fLocation3.getLocation()); + } + + public void testTmfLocationCopy() { + TmfLocation location1 = new TmfLocation(fLocation1); + TmfLocation location2 = new TmfLocation(fLocation2); + TmfLocation location3 = new TmfLocation(fLocation3); + + assertEquals("TmfLocation", aString, location1.getLocation()); + assertEquals("TmfLocation", aLong, location2.getLocation()); + assertEquals("TmfLocation", aTimestamp, location3.getLocation()); + } + + public void testTmfLocationCopy2() throws Exception { + try { + new TmfLocation(null); + fail("null copy"); + } + catch (IllegalArgumentException e) { + // Success + } + } + + // ------------------------------------------------------------------------ + // setLocation + // ------------------------------------------------------------------------ + + public void testSetLocation() { + String aString2 = "some other location"; + Long aLong2 = 1234567L; + TmfTimestamp aTimestamp2 = TmfTimestamp.BigBang; + + fLocation1.setLocation(aString2); + fLocation2.setLocation(aLong2); + fLocation3.setLocation(aTimestamp2); + + assertEquals("TmfLocation", aString2, fLocation1.getLocation()); + assertEquals("TmfLocation", aLong2, fLocation2.getLocation()); + assertEquals("TmfLocation", aTimestamp2, fLocation3.getLocation()); + } + + // ------------------------------------------------------------------------ + // toEquals + // ------------------------------------------------------------------------ + + public void testEqualsReflexivity() throws Exception { + assertTrue("equals", fLocation1.equals(fLocation1)); + assertTrue("equals", fLocation2.equals(fLocation2)); + + assertTrue("equals", !fLocation1.equals(fLocation2)); + assertTrue("equals", !fLocation2.equals(fLocation1)); + } + + public void testEqualsSymmetry() throws Exception { + TmfLocation location1 = new TmfLocation(aString); + TmfLocation location2 = new TmfLocation(aLong); + + assertTrue("equals", location1.equals(fLocation1)); + assertTrue("equals", fLocation1.equals(location1)); + + assertTrue("equals", location2.equals(fLocation2)); + assertTrue("equals", fLocation2.equals(location2)); + } + + public void testEqualsTransivity() throws Exception { + TmfLocation location1 = new TmfLocation(aString); + TmfLocation location2 = new TmfLocation(aString); + TmfLocation location3 = new TmfLocation(aString); + + assertTrue("equals", location1.equals(location2)); + assertTrue("equals", location2.equals(location3)); + assertTrue("equals", location1.equals(location3)); + } + + public void testEqualsNull() throws Exception { + assertTrue("equals", !fLocation1.equals(null)); + assertTrue("equals", !fLocation1.equals(null)); + } + + // ------------------------------------------------------------------------ + // hashCode + // ------------------------------------------------------------------------ + + public void testHashCode() throws Exception { + TmfLocation location1 = new TmfLocation(aString); + TmfLocation location2 = new TmfLocation(aLong); + + assertTrue("hashCode", fLocation1.hashCode() == location1.hashCode()); + assertTrue("hashCode", fLocation2.hashCode() == location2.hashCode()); + + assertTrue("hashCode", fLocation1.hashCode() != location2.hashCode()); + assertTrue("hashCode", fLocation2.hashCode() != location1.hashCode()); + } + + // ------------------------------------------------------------------------ + // toString + // ------------------------------------------------------------------------ + + public void testToString() { + String aString = "some location"; + Long aLong = 12345L; + TmfTimestamp aTimestamp = new TmfTimestamp(); + + TmfLocation location1 = new TmfLocation(aString); + TmfLocation location2 = new TmfLocation(aLong); + TmfLocation location3 = new TmfLocation(aTimestamp); + + assertEquals("TmfLocation", aString.toString(), location1.toString()); + assertEquals("TmfLocation", aLong.toString(), location2.toString()); + assertEquals("TmfLocation", aTimestamp.toString(), location3.toString()); + } + + // ------------------------------------------------------------------------ + // clone + // ------------------------------------------------------------------------ + + public void testClone() { + try { + TmfLocation location1 = fLocation1.clone(); + TmfLocation location2 = fLocation2.clone(); + TmfLocation location3 = fLocation3.clone(); + + assertEquals("TmfLocation", aString.toString(), location1.toString()); + assertEquals("TmfLocation", aLong.toString(), location2.toString()); + assertEquals("TmfLocation", aTimestamp.toString(), location3.toString()); + } + catch (InternalError e) { + fail("clone()"); + } + } + + public class MyCloneableClass implements Cloneable { + private String fName; + public MyCloneableClass(String name) { + fName = name; + } + @Override + public String toString() { + return fName; + } + @Override + public MyCloneableClass clone() { + MyCloneableClass clone = null; + try { + clone = (MyCloneableClass) super.clone(); + clone.fName = fName; + } catch (CloneNotSupportedException e) { + } + return clone; + } + } + + public void testCloneCloneable() { + try { + MyCloneableClass myClass = new MyCloneableClass("myClass"); + TmfLocation myLocation = new TmfLocation(myClass); + TmfLocation location4 = myLocation.clone(); + + assertEquals("TmfLocation", myClass.toString(), location4.toString()); + } + catch (InternalError e) { + fail("clone()"); + } + } + + public class MyUnCloneableClass { + private String fName; + public MyUnCloneableClass(String name) { + fName = name; + } + @Override + public String toString() { + return fName; + } + @Override + public Object clone() throws CloneNotSupportedException { + throw new CloneNotSupportedException(); + } + } + + public void testCloneUnCloneable() { + try { + MyUnCloneableClass myClass = new MyUnCloneableClass("myClass"); + TmfLocation myLocation = new TmfLocation(myClass); + myLocation.clone(); + fail("clone()"); + } + catch (InternalError e) { + // Success + } + } + +} diff --git a/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/trace/TmfTraceTest.java b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/trace/TmfTraceTest.java new file mode 100644 index 0000000000..f5b51aab43 --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/src/org/eclipse/linuxtools/tmf/tests/trace/TmfTraceTest.java @@ -0,0 +1,699 @@ +/******************************************************************************* + * Copyright (c) 2009, 2010 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: + * Francois Chouinard - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.linuxtools.tmf.tests.trace; + +import java.io.File; +import java.io.IOException; +import java.net.URISyntaxException; +import java.net.URL; +import java.util.Vector; + +import junit.framework.TestCase; + +import org.eclipse.core.runtime.FileLocator; +import org.eclipse.core.runtime.Path; +import org.eclipse.linuxtools.tmf.component.ITmfDataProvider; +import org.eclipse.linuxtools.tmf.component.TmfProviderManager; +import org.eclipse.linuxtools.tmf.event.TmfEvent; +import org.eclipse.linuxtools.tmf.event.TmfTimeRange; +import org.eclipse.linuxtools.tmf.event.TmfTimestamp; +import org.eclipse.linuxtools.tmf.request.TmfEventRequest; +import org.eclipse.linuxtools.tmf.tests.TmfCoreTestPlugin; +import org.eclipse.linuxtools.tmf.trace.ITmfContext; +import org.eclipse.linuxtools.tmf.trace.TmfCheckpoint; +import org.eclipse.linuxtools.tmf.trace.TmfContext; +import org.eclipse.linuxtools.tmf.trace.TmfTrace; +import org.eclipse.linuxtools.tmf.trace.TmfTraceStub; + +/** + * TmfTraceTest + *

+ * Test suite for the TmfTrace class. + */ +public class TmfTraceTest extends TestCase { + + // ------------------------------------------------------------------------ + // Variables + // ------------------------------------------------------------------------ + + private static final String DIRECTORY = "testfiles"; + private static final String TEST_STREAM = "A-Test-10K"; + private static final int BLOCK_SIZE = 500; + private static final int NB_EVENTS = 10000; + private static TmfTraceStub fTrace = null; + + private static byte SCALE = (byte) -3; + + // ------------------------------------------------------------------------ + // Housekeeping + // ------------------------------------------------------------------------ + + public TmfTraceTest(String name) throws Exception { + super(name); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + fTrace = setupTrace(DIRECTORY + File.separator + TEST_STREAM); + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + fTrace.dispose(); + fTrace = null; + } + + // ------------------------------------------------------------------------ + // Helper functions + // ------------------------------------------------------------------------ + + private 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(), BLOCK_SIZE, false); + fTrace.indexTrace(true); + } catch (URISyntaxException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return fTrace; + } + + // ------------------------------------------------------------------------ + // Constructors + // ------------------------------------------------------------------------ + + public void testTmfTraceDefault() throws Exception { + TmfTraceStub trace = null; + File testfile = null; + try { + URL location = FileLocator.find(TmfCoreTestPlugin.getDefault().getBundle(), new Path(DIRECTORY + File.separator + TEST_STREAM), null); + testfile = new File(FileLocator.toFileURL(location).toURI()); + trace = new TmfTraceStub(testfile.getPath()); + } catch (URISyntaxException e) { + fail("URISyntaxException"); + } catch (IOException e) { + fail("IOException"); + } + assertTrue ("Open trace", trace != null); + assertEquals("getType", TmfEvent.class, trace.getType()); + assertEquals("getPath", testfile.getPath(), trace.getPath()); + assertEquals("getName", TEST_STREAM, trace.getName()); + assertEquals("getCacheSize", TmfTrace.DEFAULT_CACHE_SIZE, trace.getCacheSize()); + } + + public void testTmfTraceDefaultCacheSize() throws Exception { + TmfTraceStub trace = null; + File testfile = null; + try { + URL location = FileLocator.find(TmfCoreTestPlugin.getDefault().getBundle(), new Path(DIRECTORY + File.separator + TEST_STREAM), null); + testfile = new File(FileLocator.toFileURL(location).toURI()); + trace = new TmfTraceStub(testfile.getPath(), 0); + } catch (URISyntaxException e) { + fail("URISyntaxException"); + } catch (IOException e) { + fail("IOException"); + } + assertTrue ("Open trace", trace != null); + assertEquals("getType", TmfEvent.class, trace.getType()); + assertEquals("getPath", testfile.getPath(), trace.getPath()); + assertEquals("getName", TEST_STREAM, trace.getName()); + assertEquals("getCacheSize", TmfTrace.DEFAULT_CACHE_SIZE, trace.getCacheSize()); + } + + public void testTmfTrace() throws Exception { + assertEquals("getType", TmfEvent.class, fTrace.getType()); + assertEquals("getName", TEST_STREAM, fTrace.getName()); + assertEquals("getCacheSize", BLOCK_SIZE, fTrace.getCacheSize()); + } + + public void testClone() throws Exception { + TmfTraceStub trace = fTrace.clone(); + assertEquals("getType", TmfEvent.class, trace.getType()); + assertEquals("getPath", fTrace.getPath(), trace.getPath()); + assertEquals("getName", TEST_STREAM, trace.getName()); + assertEquals("getCacheSize", BLOCK_SIZE, trace.getCacheSize()); + assertEquals("getTimeRange", fTrace.getTimeRange(), trace.getTimeRange()); + } + + // ------------------------------------------------------------------------ + // Get/Set time range + // ------------------------------------------------------------------------ + + public void testSetTimeRange() throws Exception { + TmfTraceStub trace = fTrace.clone(); + + assertEquals("getRange-start", 1, trace.getTimeRange().getStartTime().getValue()); + assertEquals("getRange-end", NB_EVENTS, trace.getTimeRange().getEndTime().getValue()); + assertEquals("getStartTime", 1, trace.getStartTime().getValue()); + assertEquals("getEndTime", NB_EVENTS, trace.getEndTime().getValue()); + + trace.setTimeRange(new TmfTimeRange(new TmfTimestamp(100), new TmfTimestamp(200))); + assertEquals("setTimeRange", 100, trace.getTimeRange().getStartTime().getValue()); + assertEquals("setTimeRange", 200, trace.getTimeRange().getEndTime().getValue()); + assertEquals("setTimeRange", 100, trace.getStartTime().getValue()); + assertEquals("setTimeRange", 200, trace.getEndTime().getValue()); + } + + public void testSetStartTime() throws Exception { + TmfTraceStub trace = fTrace.clone(); + + assertEquals("getRange-start", 1, trace.getTimeRange().getStartTime().getValue()); + assertEquals("getRange-end", NB_EVENTS, trace.getTimeRange().getEndTime().getValue()); + assertEquals("getStartTime", 1, trace.getStartTime().getValue()); + assertEquals("getEndTime", NB_EVENTS, trace.getEndTime().getValue()); + + trace.setStartTime(new TmfTimestamp(100)); + assertEquals("setStartTime", 100, trace.getTimeRange().getStartTime().getValue()); + assertEquals("setStartTime", NB_EVENTS, trace.getTimeRange().getEndTime().getValue()); + assertEquals("setStartTime", 100, trace.getStartTime().getValue()); + assertEquals("setStartTime", NB_EVENTS, trace.getEndTime().getValue()); + } + + public void testSetEndTime() throws Exception { + TmfTraceStub trace = fTrace.clone(); + + assertEquals("getRange-start", 1, trace.getTimeRange().getStartTime().getValue()); + assertEquals("getRange-end", NB_EVENTS, trace.getTimeRange().getEndTime().getValue()); + assertEquals("getStartTime", 1, trace.getStartTime().getValue()); + assertEquals("getEndTime", NB_EVENTS, trace.getEndTime().getValue()); + + trace.setEndTime(new TmfTimestamp(100)); + assertEquals("setEndTime", 1, trace.getTimeRange().getStartTime().getValue()); + assertEquals("setEndTime", 100, trace.getTimeRange().getEndTime().getValue()); + assertEquals("setEndTime", 1, trace.getStartTime().getValue()); + assertEquals("setEndTime", 100, trace.getEndTime().getValue()); + } + + // ------------------------------------------------------------------------ + // Verify checkpoints + // ------------------------------------------------------------------------ + + public void testTmfTraceIndexing() throws Exception { + assertEquals("getCacheSize", BLOCK_SIZE, fTrace.getCacheSize()); + assertEquals("getTraceSize", NB_EVENTS, fTrace.getNbEvents()); + assertEquals("getRange-start", 1, fTrace.getTimeRange().getStartTime().getValue()); + assertEquals("getRange-end", NB_EVENTS, fTrace.getTimeRange().getEndTime().getValue()); + assertEquals("getStartTime", 1, fTrace.getStartTime().getValue()); + assertEquals("getEndTime", NB_EVENTS, fTrace.getEndTime().getValue()); + + Vector checkpoints = fTrace.getCheckpoints(); + int pageSize = fTrace.getCacheSize(); + assertTrue("Checkpoints exist", checkpoints != null); + + // Validate that each checkpoint points to the right event + for (int i = 0; i < checkpoints.size(); i++) { + TmfCheckpoint checkpoint = checkpoints.get(i); + TmfContext context = new TmfContext(checkpoint.getLocation(), i * pageSize); + TmfEvent event = fTrace.parseEvent(context); + assertTrue(context.getRank() == i * pageSize); + assertTrue((checkpoint.getTimestamp().compareTo(event.getTimestamp(), false) == 0)); + } + } + + // ------------------------------------------------------------------------ + // parseEvent - make sure parseEvent doesn't update the context + // ------------------------------------------------------------------------ + + public void testParseEvent() throws Exception { + + // On lower bound, returns the first event (ts = 0) + TmfContext context = fTrace.seekEvent(new TmfTimestamp(0, SCALE, 0)); + + TmfEvent event = fTrace.parseEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + + event = fTrace.parseEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + + event = fTrace.parseEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + + for (int i = 1; i < 20; i++) { + event = fTrace.getNextEvent(context); + assertEquals("Event timestamp", i, event.getTimestamp().getValue()); + } + + event = fTrace.parseEvent(context); + assertEquals("Event timestamp", 20, event.getTimestamp().getValue()); + + event = fTrace.parseEvent(context); + assertEquals("Event timestamp", 20, event.getTimestamp().getValue()); + } + + // ------------------------------------------------------------------------ + // getNextEvent - updates the context + // ------------------------------------------------------------------------ + + public void testGetNextEvent() throws Exception { + + // On lower bound, returns the first event (ts = 0) + TmfContext context = fTrace.seekEvent(new TmfTimestamp(0, SCALE, 0)); + TmfEvent event = fTrace.getNextEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + + for (int i = 2; i < 20; i++) { + event = fTrace.getNextEvent(context); + assertEquals("Event timestamp", i, event.getTimestamp().getValue()); + } + } + + // ------------------------------------------------------------------------ + // seekLocation + // Note: seekLocation() does not reliably set the rank + // ------------------------------------------------------------------------ + + public void testSeekLocationOnCacheBoundary() throws Exception { + + // Position trace at event rank 0 + TmfContext context = fTrace.seekLocation(null); + assertEquals("Event rank", 0, context.getRank()); + TmfEvent event = fTrace.parseEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + assertEquals("Event rank", 0, context.getRank()); + event = fTrace.getNextEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + assertEquals("Event rank", 1, context.getRank()); + + // Position trace at event rank 1000 + TmfContext tmpContext = fTrace.seekEvent(new TmfTimestamp(1001, SCALE, 0)); + context = fTrace.seekLocation(tmpContext.getLocation().clone()); + assertEquals("Event rank", ITmfContext.UNKNOWN_RANK, context.getRank()); + event = fTrace.parseEvent(context); + assertEquals("Event timestamp", 1001, event.getTimestamp().getValue()); + assertEquals("Event rank", ITmfContext.UNKNOWN_RANK, context.getRank()); + event = fTrace.getNextEvent(context); + assertEquals("Event timestamp", 1001, event.getTimestamp().getValue()); + assertEquals("Event rank", ITmfContext.UNKNOWN_RANK, context.getRank()); + + // Position trace at event rank 4000 + tmpContext = fTrace.seekEvent(new TmfTimestamp(4001, SCALE, 0)); + context = fTrace.seekLocation(tmpContext.getLocation().clone()); + assertEquals("Event rank", ITmfContext.UNKNOWN_RANK, context.getRank()); + event = fTrace.parseEvent(context); + assertEquals("Event timestamp", 4001, event.getTimestamp().getValue()); + assertEquals("Event rank", ITmfContext.UNKNOWN_RANK, context.getRank()); + event = fTrace.getNextEvent(context); + assertEquals("Event timestamp", 4001, event.getTimestamp().getValue()); + assertEquals("Event rank", ITmfContext.UNKNOWN_RANK, context.getRank()); + } + + public void testSeekLocationNotOnCacheBoundary() throws Exception { + + // Position trace at event rank 9 + TmfContext tmpContext = fTrace.seekEvent(new TmfTimestamp(10, SCALE, 0)); + TmfContext context = fTrace.seekLocation(tmpContext.getLocation().clone()); + assertEquals("Event rank", ITmfContext.UNKNOWN_RANK, context.getRank()); + TmfEvent event = fTrace.parseEvent(context); + assertEquals("Event timestamp", 10, event.getTimestamp().getValue()); + assertEquals("Event rank", ITmfContext.UNKNOWN_RANK, context.getRank()); + event = fTrace.getNextEvent(context); + assertEquals("Event timestamp", 10, event.getTimestamp().getValue()); + assertEquals("Event rank", ITmfContext.UNKNOWN_RANK, context.getRank()); + + // Position trace at event rank 999 + tmpContext = fTrace.seekEvent(new TmfTimestamp(1000, SCALE, 0)); + context = fTrace.seekLocation(tmpContext.getLocation().clone()); + assertEquals("Event rank", ITmfContext.UNKNOWN_RANK, context.getRank()); + event = fTrace.parseEvent(context); + assertEquals("Event timestamp", 1000, event.getTimestamp().getValue()); + assertEquals("Event rank", ITmfContext.UNKNOWN_RANK, context.getRank()); + event = fTrace.getNextEvent(context); + assertEquals("Event timestamp", 1000, event.getTimestamp().getValue()); + assertEquals("Event rank", ITmfContext.UNKNOWN_RANK, context.getRank()); + + // Position trace at event rank 1001 + tmpContext = fTrace.seekEvent(new TmfTimestamp(1002, SCALE, 0)); + context = fTrace.seekLocation(tmpContext.getLocation().clone()); + assertEquals("Event rank", ITmfContext.UNKNOWN_RANK, context.getRank()); + event = fTrace.parseEvent(context); + assertEquals("Event timestamp", 1002, event.getTimestamp().getValue()); + assertEquals("Event rank", ITmfContext.UNKNOWN_RANK, context.getRank()); + event = fTrace.getNextEvent(context); + assertEquals("Event timestamp", 1002, event.getTimestamp().getValue()); + assertEquals("Event rank", ITmfContext.UNKNOWN_RANK, context.getRank()); + + // Position trace at event rank 4500 + tmpContext = fTrace.seekEvent(new TmfTimestamp(4501, SCALE, 0)); + context = fTrace.seekLocation(tmpContext.getLocation().clone()); + assertEquals("Event rank", ITmfContext.UNKNOWN_RANK, context.getRank()); + event = fTrace.parseEvent(context); + assertEquals("Event timestamp", 4501, event.getTimestamp().getValue()); + assertEquals("Event rank", ITmfContext.UNKNOWN_RANK, context.getRank()); + event = fTrace.getNextEvent(context); + assertEquals("Event timestamp", 4501, event.getTimestamp().getValue()); + assertEquals("Event rank", ITmfContext.UNKNOWN_RANK, context.getRank()); + } + + public void testSeekLocationOutOfScope() throws Exception { + + // Position trace at beginning + TmfContext tmpContext = fTrace.seekLocation(null); + TmfContext context = fTrace.seekLocation(tmpContext.getLocation().clone()); + assertEquals("Event rank", ITmfContext.UNKNOWN_RANK, context.getRank()); + TmfEvent event = fTrace.parseEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + assertEquals("Event rank", ITmfContext.UNKNOWN_RANK, context.getRank()); + event = fTrace.getNextEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + assertEquals("Event rank", ITmfContext.UNKNOWN_RANK, context.getRank()); + + // Position trace at event passed the end + tmpContext = fTrace.seekEvent(new TmfTimestamp(NB_EVENTS + 1, SCALE, 0)); + context = fTrace.seekLocation(tmpContext.getLocation().clone()); + assertEquals("Event rank", ITmfContext.UNKNOWN_RANK, context.getRank()); + event = fTrace.parseEvent(context); + assertEquals("Event timestamp", null, event); + assertEquals("Event rank", ITmfContext.UNKNOWN_RANK, context.getRank()); + event = fTrace.getNextEvent(context); + assertEquals("Event timestamp", null, event); + assertEquals("Event rank", ITmfContext.UNKNOWN_RANK, context.getRank()); + } + + // ------------------------------------------------------------------------ + // seekEvent on timestamp + // ------------------------------------------------------------------------ + + public void testSeekEventOnTimestampOnCacheBoundary() throws Exception { + + // Position trace at event rank 0 + TmfContext context = fTrace.seekEvent(new TmfTimestamp(1, SCALE, 0)); + assertEquals("Event rank", 0, context.getRank()); + TmfEvent event = fTrace.parseEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + assertEquals("Event rank", 0, context.getRank()); + event = fTrace.getNextEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + assertEquals("Event rank", 1, context.getRank()); + + // Position trace at event rank 1000 + context = fTrace.seekEvent(new TmfTimestamp(1001, SCALE, 0)); + assertEquals("Event rank", 1000, context.getRank()); + event = fTrace.parseEvent(context); + assertEquals("Event timestamp", 1001, event.getTimestamp().getValue()); + assertEquals("Event rank", 1000, context.getRank()); + event = fTrace.getNextEvent(context); + assertEquals("Event timestamp", 1001, event.getTimestamp().getValue()); + assertEquals("Event rank", 1001, context.getRank()); + + // Position trace at event rank 4000 + context = fTrace.seekEvent(new TmfTimestamp(4001, SCALE, 0)); + assertEquals("Event rank", 4000, context.getRank()); + event = fTrace.parseEvent(context); + assertEquals("Event timestamp", 4001, event.getTimestamp().getValue()); + assertEquals("Event rank", 4000, context.getRank()); + event = fTrace.getNextEvent(context); + assertEquals("Event timestamp", 4001, event.getTimestamp().getValue()); + assertEquals("Event rank", 4001, context.getRank()); + } + + public void testSeekEventOnTimestampNotOnCacheBoundary() throws Exception { + + // Position trace at event rank 1 + TmfContext context = fTrace.seekEvent(new TmfTimestamp(2, SCALE, 0)); + assertEquals("Event rank", 1, context.getRank()); + TmfEvent event = fTrace.parseEvent(context); + assertEquals("Event timestamp", 2, event.getTimestamp().getValue()); + assertEquals("Event rank", 1, context.getRank()); + event = fTrace.getNextEvent(context); + assertEquals("Event timestamp", 2, event.getTimestamp().getValue()); + assertEquals("Event rank", 2, context.getRank()); + + // Position trace at event rank 9 + context = fTrace.seekEvent(new TmfTimestamp(10, SCALE, 0)); + assertEquals("Event rank", 9, context.getRank()); + event = fTrace.parseEvent(context); + assertEquals("Event timestamp", 10, event.getTimestamp().getValue()); + assertEquals("Event rank", 9, context.getRank()); + event = fTrace.getNextEvent(context); + assertEquals("Event timestamp", 10, event.getTimestamp().getValue()); + assertEquals("Event rank", 10, context.getRank()); + + // Position trace at event rank 999 + context = fTrace.seekEvent(new TmfTimestamp(1000, SCALE, 0)); + assertEquals("Event rank", 999, context.getRank()); + event = fTrace.parseEvent(context); + assertEquals("Event timestamp", 1000, event.getTimestamp().getValue()); + assertEquals("Event rank", 999, context.getRank()); + event = fTrace.getNextEvent(context); + assertEquals("Event timestamp", 1000, event.getTimestamp().getValue()); + assertEquals("Event rank", 1000, context.getRank()); + + // Position trace at event rank 1001 + context = fTrace.seekEvent(new TmfTimestamp(1002, SCALE, 0)); + assertEquals("Event rank", 1001, context.getRank()); + event = fTrace.parseEvent(context); + assertEquals("Event timestamp", 1002, event.getTimestamp().getValue()); + assertEquals("Event rank", 1001, context.getRank()); + event = fTrace.getNextEvent(context); + assertEquals("Event timestamp", 1002, event.getTimestamp().getValue()); + assertEquals("Event rank", 1002, context.getRank()); + + // Position trace at event rank 4500 + context = fTrace.seekEvent(new TmfTimestamp(4501, SCALE, 0)); + assertEquals("Event rank", 4500, context.getRank()); + event = fTrace.parseEvent(context); + assertEquals("Event timestamp", 4501, event.getTimestamp().getValue()); + assertEquals("Event rank", 4500, context.getRank()); + event = fTrace.getNextEvent(context); + assertEquals("Event timestamp", 4501, event.getTimestamp().getValue()); + assertEquals("Event rank", 4501, context.getRank()); + } + + public void testSeekEventOnTimestampOutOfScope() throws Exception { + + // Position trace at beginning + TmfContext context = fTrace.seekEvent(new TmfTimestamp(-1, SCALE, 0)); + assertEquals("Event rank", 0, context.getRank()); + TmfEvent event = fTrace.parseEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + assertEquals("Event rank", 0, context.getRank()); + event = fTrace.getNextEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + assertEquals("Event rank", 1, context.getRank()); + + // Position trace at event passed the end + context = fTrace.seekEvent(new TmfTimestamp(NB_EVENTS + 1, SCALE, 0)); + assertEquals("Event rank", NB_EVENTS, context.getRank()); + event = fTrace.parseEvent(context); + assertEquals("Event timestamp", null, event); + assertEquals("Event rank", NB_EVENTS, context.getRank()); + event = fTrace.getNextEvent(context); + assertEquals("Event timestamp", null, event); + assertEquals("Event rank", NB_EVENTS, context.getRank()); + } + + // ------------------------------------------------------------------------ + // seekEvent on rank + // ------------------------------------------------------------------------ + + public void testSeekOnRankOnCacheBoundary() throws Exception { + + // On lower bound, returns the first event (ts = 1) + TmfContext context = fTrace.seekEvent(0); + assertEquals("Event rank", 0, context.getRank()); + TmfEvent event = fTrace.parseEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + assertEquals("Event rank", 0, context.getRank()); + event = fTrace.getNextEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + assertEquals("Event rank", 1, context.getRank()); + + // Position trace at event rank 1000 + context = fTrace.seekEvent(1000); + assertEquals("Event rank", 1000, context.getRank()); + event = fTrace.parseEvent(context); + assertEquals("Event timestamp", 1001, event.getTimestamp().getValue()); + assertEquals("Event rank", 1000, context.getRank()); + event = fTrace.getNextEvent(context); + assertEquals("Event timestamp", 1001, event.getTimestamp().getValue()); + assertEquals("Event rank", 1001, context.getRank()); + + // Position trace at event rank 4000 + context = fTrace.seekEvent(4000); + assertEquals("Event rank", 4000, context.getRank()); + event = fTrace.parseEvent(context); + assertEquals("Event timestamp", 4001, event.getTimestamp().getValue()); + assertEquals("Event rank", 4000, context.getRank()); + event = fTrace.getNextEvent(context); + assertEquals("Event timestamp", 4001, event.getTimestamp().getValue()); + assertEquals("Event rank", 4001, context.getRank()); + } + + public void testSeekOnRankNotOnCacheBoundary() throws Exception { + + // Position trace at event rank 9 + TmfContext context = fTrace.seekEvent(9); + assertEquals("Event rank", 9, context.getRank()); + TmfEvent event = fTrace.parseEvent(context); + assertEquals("Event timestamp", 10, event.getTimestamp().getValue()); + assertEquals("Event rank", 9, context.getRank()); + event = fTrace.getNextEvent(context); + assertEquals("Event timestamp", 10, event.getTimestamp().getValue()); + assertEquals("Event rank", 10, context.getRank()); + + // Position trace at event rank 999 + context = fTrace.seekEvent(999); + assertEquals("Event rank", 999, context.getRank()); + event = fTrace.parseEvent(context); + assertEquals("Event timestamp", 1000, event.getTimestamp().getValue()); + assertEquals("Event rank", 999, context.getRank()); + event = fTrace.getNextEvent(context); + assertEquals("Event timestamp", 1000, event.getTimestamp().getValue()); + assertEquals("Event rank", 1000, context.getRank()); + + // Position trace at event rank 1001 + context = fTrace.seekEvent(1001); + assertEquals("Event rank", 1001, context.getRank()); + event = fTrace.parseEvent(context); + assertEquals("Event timestamp", 1002, event.getTimestamp().getValue()); + assertEquals("Event rank", 1001, context.getRank()); + event = fTrace.getNextEvent(context); + assertEquals("Event timestamp", 1002, event.getTimestamp().getValue()); + assertEquals("Event rank", 1002, context.getRank()); + + // Position trace at event rank 4500 + context = fTrace.seekEvent(4500); + assertEquals("Event rank", 4500, context.getRank()); + event = fTrace.parseEvent(context); + assertEquals("Event timestamp", 4501, event.getTimestamp().getValue()); + assertEquals("Event rank", 4500, context.getRank()); + event = fTrace.getNextEvent(context); + assertEquals("Event timestamp", 4501, event.getTimestamp().getValue()); + assertEquals("Event rank", 4501, context.getRank()); + } + + public void testSeekEventOnRankOfScope() throws Exception { + + // Position trace at beginning + TmfContext context = fTrace.seekEvent(-1); + assertEquals("Event rank", 0, context.getRank()); + TmfEvent event = fTrace.parseEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + assertEquals("Event rank", 0, context.getRank()); + event = fTrace.getNextEvent(context); + assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); + assertEquals("Event rank", 1, context.getRank()); + + // Position trace at event passed the end + context = fTrace.seekEvent(NB_EVENTS); + assertEquals("Event rank", NB_EVENTS, context.getRank()); + event = fTrace.parseEvent(context); + assertEquals("Event timestamp", null, event); + assertEquals("Event rank", NB_EVENTS, context.getRank()); + event = fTrace.getNextEvent(context); + assertEquals("Event timestamp", null, event); + assertEquals("Event rank", NB_EVENTS, context.getRank()); + } + + // ------------------------------------------------------------------------ + // processRequest + // ------------------------------------------------------------------------ + + @SuppressWarnings("unchecked") + public void testProcessRequestForNbEvents() throws Exception { + final int BLOCK_SIZE = 100; + final int NB_EVENTS = 1000; + final Vector requestedEvents = new Vector(); + + TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch); + final TmfEventRequest request = new TmfEventRequest(TmfEvent.class, range, NB_EVENTS, BLOCK_SIZE) { + @Override + public void handleData() { + TmfEvent[] events = getData(); + for (TmfEvent e : events) { + requestedEvents.add(e); + } + } + }; + ITmfDataProvider[] providers = (ITmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TmfTraceStub.class); + providers[0].sendRequest(request); + request.waitForCompletion(); + + assertEquals("nbEvents", NB_EVENTS, requestedEvents.size()); + assertTrue("isCompleted", request.isCompleted()); + assertFalse("isCancelled", request.isCancelled()); + + // Ensure that we have distinct events. + // Don't go overboard: we are not validating the stub! + for (int i = 0; i < NB_EVENTS; i++) { + assertEquals("Distinct events", i+1, requestedEvents.get(i).getTimestamp().getValue()); + } + } + + @SuppressWarnings("unchecked") + public void testProcessRequestForAllEvents() throws Exception { + final int BLOCK_SIZE = 1; + final Vector requestedEvents = new Vector(); + + TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch); + final TmfEventRequest request = new TmfEventRequest(TmfEvent.class, range, NB_EVENTS, BLOCK_SIZE) { + @Override + public void handleData() { + TmfEvent[] events = getData(); + for (TmfEvent e : events) { + requestedEvents.add(e); + } + } + }; + ITmfDataProvider[] providers = (ITmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TmfTraceStub.class); + providers[0].sendRequest(request); + request.waitForCompletion(); + + assertEquals("nbEvents", NB_EVENTS, requestedEvents.size()); + assertTrue("isCompleted", request.isCompleted()); + assertFalse("isCancelled", request.isCancelled()); + + // Ensure that we have distinct events. + // Don't go overboard: we are not validating the stub! + for (int i = 0; i < NB_EVENTS; i++) { + assertEquals("Distinct events", i+1, requestedEvents.get(i).getTimestamp().getValue()); + } + } + + // ------------------------------------------------------------------------ + // cancel + // ------------------------------------------------------------------------ + + @SuppressWarnings("unchecked") + public void testCancel() throws Exception { + final Vector requestedEvents = new Vector(); + + TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch); + final TmfEventRequest request = new TmfEventRequest(TmfEvent.class, range, NB_EVENTS, NB_EVENTS) { + @Override + public void handleData() { + TmfEvent[] events = getData(); + for (TmfEvent e : events) { + requestedEvents.add(e); + } + // Cancel request after the first chunk is received + cancel(); + } + }; + ITmfDataProvider[] providers = (ITmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TmfTraceStub.class); + providers[0].sendRequest(request); + request.waitForCompletion(); + + assertEquals("nbEvents", NB_EVENTS, requestedEvents.size()); + assertTrue("isCompleted", request.isCompleted()); + assertTrue("isCancelled", request.isCancelled()); + } + +} \ No newline at end of file diff --git a/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/CreateTestFiles.java b/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/CreateTestFiles.java new file mode 100644 index 0000000000..d2d66abccb --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/CreateTestFiles.java @@ -0,0 +1,111 @@ +/******************************************************************************* + * Copyright (c) 2009 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: + * Francois Chouinard - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.linuxtools.tmf; + +import java.io.BufferedOutputStream; +import java.io.DataOutputStream; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.Random; + +/** + * CreateTestFiles + *

+ * Create a number of event test files of various lengths. + *

+ * Events have the following format: + *

    + *
  • [timestamp] [source] [type] [ref] [field]* + *
  • There are NB_SOURCES sources and NB_TYPES types. + *
  • The number of fields (0 .. NB_TYPES-1) depends on the event type. + *
+ */ +public class CreateTestFiles { + + // ======================================================================== + // Constants + // ======================================================================== + + private static final String DIRECTORY = "testfiles"; +// private static final String FILE_NAMES[] = { "Test-10", "Test-1K", "Test-10K", "Test-100K" }; +// private static final int FILE_SIZES[] = { 10 , 1000 , 10000 , 100000 }; + private static final String FILE_NAMES[] = { "Test-10K" }; + private static final int FILE_SIZES[] = { 10000 }; + + private static final int NB_SOURCES = 15; + private static final int NB_TYPES = 7; + + // ======================================================================== + // Constructors + // ======================================================================== + + /** + * @param args + */ + public static void main(String[] args) { + + try { + System.out.println("Creating test files in directory: " + new File(".").getCanonicalPath() + File.separator + DIRECTORY); + } catch (IOException e) { + e.printStackTrace(); + } + + for (int i = 0; i < FILE_SIZES.length; i++) { + try { + createTestFile("testfiles" + File.separator + "O-" + FILE_NAMES[i], FILE_SIZES[i], true, true); + createTestFile("testfiles" + File.separator + "E-" + FILE_NAMES[i], FILE_SIZES[i], true, false); + createTestFile("testfiles" + File.separator + "R-" + FILE_NAMES[i], FILE_SIZES[i], false, false); + } catch (Exception e) { + } + } + + System.out.println("Done."); + } + + // ======================================================================== + // Operators + // ======================================================================== + + /** + * @param file + * @param size + * @param monotonic + * @throws FileNotFoundException + * @throws IOException + */ + private static void createTestFile(String file, int size, boolean monotonic, boolean odd) throws FileNotFoundException, IOException { + DataOutputStream out; + System.out.println("Creating " + file); + out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(file))); + + Random generator = new Random(19580427 + size); + long ts = (monotonic && odd) ? -1 : 0; + for (int i = 0; i < size; i++) { + ts += monotonic ? 2 : generator.nextInt(10); + int sourceIndex = i % NB_SOURCES; + int typeIndex = i % NB_TYPES; + out.writeLong(ts); // Timestamp + out.writeUTF("Source-" + sourceIndex); // Source + out.writeUTF("Type-" + typeIndex); // Type + out.writeInt(i + 1); // Reference (event #) + for (int j = 0; j < typeIndex; j++) { + out.writeUTF("Field-" + sourceIndex + "-" + j); + } + } + out.flush(); + out.close(); + } + +} diff --git a/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/component/TmfClientStub.java b/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/component/TmfClientStub.java new file mode 100644 index 0000000000..58e4ae4f18 --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/component/TmfClientStub.java @@ -0,0 +1,41 @@ +/******************************************************************************* + * Copyright (c) 2009, 2010 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: + * Francois Chouinard - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.linuxtools.tmf.component; + +import org.eclipse.linuxtools.tmf.event.TmfSyntheticEventStub; + +/** + * TmfClientStub + *

+ * TODO: Implement me. Please. + */ +public class TmfClientStub extends TmfComponent { + + private TmfDataProvider[] fProviders; + + public TmfClientStub() { + super("TmfClientStub"); + } + + @SuppressWarnings("unchecked") + public void findProvider() { + fProviders = (TmfDataProvider[]) TmfProviderManager.getProviders(TmfSyntheticEventStub.class, TmfSyntheticEventProviderStub.class); +// TmfEventRequest request; + System.out.println(fProviders.length); + } + + public void triggeRequest() { +// TmfEventRequest request; + } + +} diff --git a/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/component/TmfDataProviderStub.java b/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/component/TmfDataProviderStub.java new file mode 100644 index 0000000000..a93e01ed3f --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/component/TmfDataProviderStub.java @@ -0,0 +1,79 @@ +/******************************************************************************* + * Copyright (c) 2009, 2010 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: + * Francois Chouinard - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.linuxtools.tmf.component; + +import java.io.File; +import java.io.IOException; +import java.net.URISyntaxException; +import java.net.URL; + +import org.eclipse.core.runtime.FileLocator; +import org.eclipse.core.runtime.Path; +import org.eclipse.linuxtools.tmf.event.TmfData; +import org.eclipse.linuxtools.tmf.request.ITmfDataRequest; +import org.eclipse.linuxtools.tmf.request.ITmfEventRequest; +import org.eclipse.linuxtools.tmf.tests.TmfCoreTestPlugin; +import org.eclipse.linuxtools.tmf.trace.ITmfContext; +import org.eclipse.linuxtools.tmf.trace.TmfTraceStub; + +/** + * TmfDataProviderStub + *

+ * TODO: Implement me. Please. + */ +public class TmfDataProviderStub extends TmfDataProvider { + + private static final String DIRECTORY = "testfiles"; + private static final String TEST_STREAM = "M-Test-10K"; + + private TmfTraceStub fTrace; + + public TmfDataProviderStub(String path) throws IOException { + super("TmfDataProviderStub", TmfData.class); + URL location = FileLocator.find(TmfCoreTestPlugin.getDefault().getBundle(), new Path(path), null); + try { + File test = new File(FileLocator.toFileURL(location).toURI()); + fTrace = new TmfTraceStub(test.getPath(), true); + } catch (URISyntaxException e) { + e.printStackTrace(); + } + } + + public TmfDataProviderStub() throws IOException { + this(DIRECTORY + File.separator + TEST_STREAM); + } + + // ------------------------------------------------------------------------ + // TmfProvider + // ------------------------------------------------------------------------ + + @Override + public ITmfContext armRequest(ITmfDataRequest request) { + if (request instanceof ITmfEventRequest) { + ITmfContext context = fTrace.seekEvent(((ITmfEventRequest) request).getRange().getStartTime()); + return context; + } + return null; + } + + @Override + public TmfData getNext(ITmfContext context) { + return fTrace.getNext(context); + } + + @Override + public boolean isCompleted(ITmfDataRequest request, TmfData data, int nbRead) { + return false; + } + +} diff --git a/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/component/TmfEventProviderStub.java b/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/component/TmfEventProviderStub.java new file mode 100644 index 0000000000..0c7c937742 --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/component/TmfEventProviderStub.java @@ -0,0 +1,80 @@ +/******************************************************************************* + * Copyright (c) 2009, 2010 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: + * Francois Chouinard - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.linuxtools.tmf.component; + +import java.io.File; +import java.io.IOException; +import java.net.URISyntaxException; +import java.net.URL; + +import org.eclipse.core.runtime.FileLocator; +import org.eclipse.core.runtime.Path; +import org.eclipse.linuxtools.tmf.event.TmfEvent; +import org.eclipse.linuxtools.tmf.request.ITmfDataRequest; +import org.eclipse.linuxtools.tmf.request.ITmfEventRequest; +import org.eclipse.linuxtools.tmf.tests.TmfCoreTestPlugin; +import org.eclipse.linuxtools.tmf.trace.ITmfContext; +import org.eclipse.linuxtools.tmf.trace.TmfTraceStub; + +/** + * TmfEventProviderStub + *

+ * TODO: Implement me. Please. + */ +public class TmfEventProviderStub extends TmfEventProvider { + + private static final String DIRECTORY = "testfiles"; + private static final String TEST_STREAM = "A-Test-10K"; + + private TmfTraceStub fTrace; + + public TmfEventProviderStub(String path) throws IOException { + super(path, TmfEvent.class); + URL location = FileLocator.find(TmfCoreTestPlugin.getDefault().getBundle(), new Path(path), null); + try { + File test = new File(FileLocator.toFileURL(location).toURI()); + fTrace = new TmfTraceStub(test.getPath(), true); + } catch (URISyntaxException e) { + e.printStackTrace(); + } + } + + public TmfEventProviderStub() throws IOException { + this(DIRECTORY + File.separator + TEST_STREAM); + } + + @Override + public void dispose() { + fTrace.dispose(); + super.dispose(); + } + + // ------------------------------------------------------------------------ + // TmfEventProvider + // ------------------------------------------------------------------------ + + @Override + public ITmfContext armRequest(ITmfDataRequest request) { + if (request instanceof ITmfEventRequest) { + ITmfContext context = fTrace.seekEvent(((ITmfEventRequest) request).getRange().getStartTime()); + return context; + } + return null; + } + + @Override + public TmfEvent getNext(ITmfContext context) { + return fTrace.getNext(context); + } + +} \ No newline at end of file diff --git a/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/component/TmfSyntheticEventProviderStub.java b/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/component/TmfSyntheticEventProviderStub.java new file mode 100644 index 0000000000..6f2f65bd3b --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/component/TmfSyntheticEventProviderStub.java @@ -0,0 +1,80 @@ +/******************************************************************************* + * Copyright (c) 2009, 2010 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: + * Francois Chouinard - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.linuxtools.tmf.component; + +import org.eclipse.linuxtools.tmf.event.TmfEvent; +import org.eclipse.linuxtools.tmf.event.TmfSyntheticEventStub; +import org.eclipse.linuxtools.tmf.event.TmfTimeRange; +import org.eclipse.linuxtools.tmf.request.ITmfDataRequest; +import org.eclipse.linuxtools.tmf.request.ITmfEventRequest; +import org.eclipse.linuxtools.tmf.request.TmfEventRequest; +import org.eclipse.linuxtools.tmf.trace.ITmfContext; +import org.eclipse.linuxtools.tmf.trace.TmfContext; + +/** + * TmfSyntheticEventProviderStub + *

+ * TODO: Implement me. Please. + */ +public class TmfSyntheticEventProviderStub extends TmfEventProvider { + + public static final int BLOCK_SIZE = 100; + public static final int NB_EVENTS = 1000; + + public TmfSyntheticEventProviderStub() { + super("TmfSyntheticEventProviderStub", TmfSyntheticEventStub.class); + } + + @SuppressWarnings("unchecked") + @Override + public ITmfContext armRequest(final ITmfDataRequest request) { + + // Get the TmfSyntheticEventStub provider + ITmfDataProvider[] eventProviders = (ITmfDataProvider[]) TmfProviderManager.getProviders(TmfEvent.class, TmfEventProviderStub.class); + ITmfDataProvider provider = eventProviders[0]; + + // make sure we have the right type of request + if (!(request instanceof ITmfEventRequest)) { + request.cancel(); + return null; + } + + TmfEventRequest eventRequest = (TmfEventRequest) request; + TmfTimeRange range = eventRequest.getRange(); + final TmfEventRequest subRequest = + new TmfEventRequest(TmfEvent.class, range, NB_EVENTS, BLOCK_SIZE) { + @Override + public void handleData() { + TmfEvent[] events = getData(); + if (events.length > 0) { + for (TmfEvent e : events) { + handleIncomingData(e); + } + } else { + request.done(); + } + } + }; + provider.sendRequest(subRequest); // , false); + + // Return a dummy context + return new TmfContext(); + } + + // Queue 2 synthetic events per base event + private void handleIncomingData(TmfEvent e) { + queueResult(new TmfSyntheticEventStub(e)); + queueResult(new TmfSyntheticEventStub(e)); + } + +} diff --git a/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/event/TmfEventContentStub.java b/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/event/TmfEventContentStub.java new file mode 100644 index 0000000000..91dc38af1c --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/event/TmfEventContentStub.java @@ -0,0 +1,59 @@ +/******************************************************************************* + * Copyright (c) 2009 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: + * Francois Chouinard - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.linuxtools.tmf.event; + +/** + * TmfEventContentStub + *

+ * TODO: Implement me. Please. + */ +public class TmfEventContentStub extends TmfEventContent { + + public TmfEventContentStub(TmfEvent parent, Object content) { + super(parent, content); + } + + public TmfEventContentStub(TmfEventContentStub other) { + super(other); + } + + @Override + protected void parseContent() { + Object field1 = new Integer(1); + Object field2 = new Integer(-10); + Object field3 = new Boolean(true); + Object field4 = new String("some string"); + Object field5 = new TmfTimestamp(1, (byte) 2, 3); + fFields = new Object[] { field1, field2, field3, field4, field5 }; + } + + @Override + public TmfEventContent clone() { + TmfEventContentStub content = new TmfEventContentStub(this); + content.fRawContent = "Some content"; + content.fFields = null; + return content; + } + +// @Override +// public String toString() { +// Object[] fields = getFields(); +// StringBuilder result = new StringBuilder("[TmfEventContent("); +// for (int i = 0; i < fields.length; i++) { +// if (i > 0) result.append(","); +// result.append(fields[i]); +// } +// result.append(")]"); +// return result.toString(); +// } +} diff --git a/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/event/TmfEventTypeStub.java b/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/event/TmfEventTypeStub.java new file mode 100644 index 0000000000..e36cb348f6 --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/event/TmfEventTypeStub.java @@ -0,0 +1,28 @@ +/******************************************************************************* + * Copyright (c) 2009 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: + * Francois Chouinard - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.linuxtools.tmf.event; + +/** + * TmfEventTypeStub + *

+ * TODO: Implement me. Please. + */ +public class TmfEventTypeStub extends TmfEventType { + + public TmfEventTypeStub() { + super( + "TmfEventTypeStub", + new String[] { "Field1", "Field2", "Field3", "Field4", "Field5" } + ); + } +} diff --git a/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/event/TmfSyntheticEventStub.java b/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/event/TmfSyntheticEventStub.java new file mode 100644 index 0000000000..7254f35fc3 --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/event/TmfSyntheticEventStub.java @@ -0,0 +1,30 @@ +/******************************************************************************* + * Copyright (c) 2009, 2010 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: + * Francois Chouinard - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.linuxtools.tmf.event; + +/** + * TmfSyntheticEventStub + *

+ * TODO: Implement me. Please. + */ +public class TmfSyntheticEventStub extends TmfEvent { + + + public TmfSyntheticEventStub(TmfEvent event) { + super(event); + } + public TmfSyntheticEventStub(TmfSyntheticEventStub other) { + super(other); + } + +} diff --git a/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/request/TmfDataRequestStub.java b/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/request/TmfDataRequestStub.java new file mode 100644 index 0000000000..f5630a4596 --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/request/TmfDataRequestStub.java @@ -0,0 +1,60 @@ +/******************************************************************************* + * Copyright (c) 2009, 2010 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: + * Francois Chouinard - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.linuxtools.tmf.request; + +import org.eclipse.linuxtools.tmf.event.TmfData; + +/** + * TmfDataRequestStub + *

+ * TODO: Implement me. Please. + */ +public class TmfDataRequestStub extends TmfDataRequest { + + /** + * Default constructor + */ + public TmfDataRequestStub(Class dataType) { + super(dataType); + } + + /** + * @param nbRequested + */ + public TmfDataRequestStub(Class dataType, int index) { + super(dataType, index); + } + + /** + * @param index + * @param nbRequested + */ + public TmfDataRequestStub(Class dataType, int index, int nbRequested) { + super(dataType, index, nbRequested); + } + + /** + * @param index + * @param nbRequested + * @param blockSize + */ + public TmfDataRequestStub(Class dataType, int index, int nbRequested, int blockSize) { + super(dataType, index, nbRequested, blockSize); + } + + @Override + public void handleData() { + // TODO Auto-generated method stub + } + +} diff --git a/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/request/TmfEventRequestStub.java b/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/request/TmfEventRequestStub.java new file mode 100644 index 0000000000..4c7f74dae7 --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/request/TmfEventRequestStub.java @@ -0,0 +1,60 @@ +/******************************************************************************* + * Copyright (c) 2009, 2010 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: + * Francois Chouinard - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.linuxtools.tmf.request; + +import org.eclipse.linuxtools.tmf.event.TmfEvent; +import org.eclipse.linuxtools.tmf.event.TmfTimeRange; + +/** + * TmfEventRequestStub + *

+ * TODO: Implement me. Please. + */ +public class TmfEventRequestStub extends TmfEventRequest { + + /** + * @param range + */ + public TmfEventRequestStub(Class dataType) { + super(dataType); + } + + /** + * @param range + */ + public TmfEventRequestStub(Class dataType, TmfTimeRange range) { + super(dataType, range); + } + + /** + * @param range + * @param nbRequested + */ + public TmfEventRequestStub(Class dataType, TmfTimeRange range, int nbRequested) { + super(dataType, range, nbRequested); + } + + /** + * @param range + * @param nbRequested + * @param blockSize Size of the largest blocks expected + */ + public TmfEventRequestStub(Class dataType, TmfTimeRange range, int nbRequested, int blockSize) { + super(dataType, range, nbRequested, blockSize); + } + + @Override + public void handleData() { + // TODO Auto-generated method stub + } +} diff --git a/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/trace/TmfEventParserStub.java b/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/trace/TmfEventParserStub.java new file mode 100644 index 0000000000..259604aff4 --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/trace/TmfEventParserStub.java @@ -0,0 +1,116 @@ +/******************************************************************************* + * Copyright (c) 2009 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: + * Francois Chouinard - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.linuxtools.tmf.trace; + +import java.io.EOFException; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.util.Vector; + +import org.eclipse.linuxtools.tmf.event.TmfEvent; +import org.eclipse.linuxtools.tmf.event.TmfEventContent; +import org.eclipse.linuxtools.tmf.event.TmfEventReference; +import org.eclipse.linuxtools.tmf.event.TmfEventSource; +import org.eclipse.linuxtools.tmf.event.TmfEventType; +import org.eclipse.linuxtools.tmf.event.TmfTimestamp; +import org.eclipse.linuxtools.tmf.parser.ITmfEventParser; + +/** + * TmfEventParserStub + *

+ * TODO: Implement me. Please. + */ +public class TmfEventParserStub implements ITmfEventParser { + + // ------------------------------------------------------------------------ + // Attributes + // ------------------------------------------------------------------------ + + private final int NB_TYPES = 10; + private final TmfEventType[] fTypes; + + // ------------------------------------------------------------------------ + // Constructors + // ------------------------------------------------------------------------ + + public TmfEventParserStub() { + fTypes = new TmfEventType[NB_TYPES]; + for (int i = 0; i < NB_TYPES; i++) { + Vector format = new Vector(); + for (int j = 1; j <= i; j++) { + format.add(new String("Fmt-" + i + "-Fld-" + j)); + } + String[] fields = new String[i]; + fTypes[i] = new TmfEventType("Type-" + i, format.toArray(fields)); + } + } + + // ------------------------------------------------------------------------ + // Operators + // ------------------------------------------------------------------------ + + static final String typePrefix = "Type-"; + @SuppressWarnings("unchecked") + public TmfEvent parseNextEvent(ITmfTrace eventStream, TmfContext context) throws IOException { + + if (! (eventStream instanceof TmfTraceStub)) { + return null; + } + + // Highly inefficient... + RandomAccessFile stream = ((TmfTraceStub) eventStream).getStream(); + String name = eventStream.getName(); + name = name.substring(name.lastIndexOf('/') + 1); + + synchronized(stream) { + long location = 0; + if (context != null) + location = ((TmfLocation) (context.getLocation())).getLocation(); + stream.seek(location); + + try { + long ts = stream.readLong(); + String source = stream.readUTF(); + String type = stream.readUTF(); + @SuppressWarnings("unused") + int reference = stream.readInt(); + int typeIndex = Integer.parseInt(type.substring(typePrefix.length())); + String[] fields = new String[typeIndex]; + for (int i = 0; i < typeIndex; i++) { + fields[i] = stream.readUTF(); + } + + String content = "["; + if (typeIndex > 0) { + content += fields[0]; + } + for (int i = 1; i < typeIndex; i++) { + content += ", " + fields[i]; + } + content += "]"; + + TmfEvent event = new TmfEvent( + new TmfTimestamp(ts, (byte) -3, 0), // millisecs + new TmfEventSource(source), + fTypes[typeIndex], + new TmfEventReference(name)); + TmfEventContent cnt = new TmfEventContent(event, content); + event.setContent(cnt); + return event; + } catch (EOFException e) { + } + } + return null; + } + +} \ No newline at end of file diff --git a/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/trace/TmfTraceStub.java b/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/trace/TmfTraceStub.java new file mode 100644 index 0000000000..36ed9454cb --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/stubs/org/eclipse/linuxtools/tmf/trace/TmfTraceStub.java @@ -0,0 +1,193 @@ +/******************************************************************************* + * Copyright (c) 2009, 2010 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: + * Francois Chouinard - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.linuxtools.tmf.trace; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.RandomAccessFile; + +import org.eclipse.linuxtools.tmf.event.TmfEvent; +import org.eclipse.linuxtools.tmf.event.TmfTimeRange; +import org.eclipse.linuxtools.tmf.event.TmfTimestamp; +import org.eclipse.linuxtools.tmf.parser.ITmfEventParser; + +/** + * TmfTraceStub + *

+ * Dummy test trace. Use in conjunction with TmfEventParserStub. + */ +public class TmfTraceStub extends TmfTrace { + + // ------------------------------------------------------------------------ + // Attributes + // ------------------------------------------------------------------------ + + // The actual stream + private RandomAccessFile fTrace; + + // The associated event parser + private ITmfEventParser fParser; + + // ------------------------------------------------------------------------ + // Constructors + // ------------------------------------------------------------------------ + + /** + * @param filename + * @throws FileNotFoundException + */ + public TmfTraceStub(String filename) throws FileNotFoundException { + super("TmfTraceStub", TmfEvent.class, filename); + fTrace = new RandomAccessFile(filename, "r"); + fParser = new TmfEventParserStub(); + } + + /** + * @param filename + * @param cacheSize + * @throws FileNotFoundException + */ + public TmfTraceStub(String filename, int cacheSize) throws FileNotFoundException { + this(filename, cacheSize, false); + } + + /** + * @param filename + * @param waitForCompletion + * @throws FileNotFoundException + */ + public TmfTraceStub(String filename, boolean waitForCompletion) throws FileNotFoundException { + this(filename, DEFAULT_CACHE_SIZE, waitForCompletion); + } + + /** + * @param filename + * @param cacheSize + * @param waitForCompletion + * @throws FileNotFoundException + */ + public TmfTraceStub(String filename, int cacheSize, boolean waitForCompletion) throws FileNotFoundException { + super(filename, TmfEvent.class, filename, cacheSize); + fTrace = new RandomAccessFile(filename, "r"); + fParser = new TmfEventParserStub(); + } + +// /** +// * @param other +// */ +// public TmfTraceStub(TmfTraceStub other) { +// this(filename, DEFAULT_CACHE_SIZE, waitForCompletion); +// } + + /** + */ + @Override + public TmfTraceStub clone() { + TmfTraceStub clone = null; + try { + clone = (TmfTraceStub) super.clone(); + clone.fTrace = new RandomAccessFile(getName(), "r"); + clone.fParser = new TmfEventParserStub(); + } catch (CloneNotSupportedException e) { + } catch (FileNotFoundException e) { + } + return clone; + } + + public ITmfTrace createTraceCopy() { + ITmfTrace returnedValue = null; + try { + returnedValue = new TmfTraceStub(this.getName()); + } + catch (FileNotFoundException e) { +// e.printStackTrace(); + } + return returnedValue; + } + + // ------------------------------------------------------------------------ + // Accessors + // ------------------------------------------------------------------------ + + public RandomAccessFile getStream() { + return fTrace; + } + + // ------------------------------------------------------------------------ + // Operators + // ------------------------------------------------------------------------ + + @Override + @SuppressWarnings("unchecked") + public TmfContext seekLocation(ITmfLocation location) { + try { + synchronized(fTrace) { + // Position the trace at the requested location and + // returns the corresponding context + long loc = 0; + long rank = 0; + if (location != null) { + loc = ((TmfLocation) location).getLocation(); + rank = ITmfContext.UNKNOWN_RANK; + } + if (loc != fTrace.getFilePointer()) { + fTrace.seek(loc); + } + TmfContext context = new TmfContext(getCurrentLocation(), rank); + return context; + } + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + @Override + public TmfLocation getCurrentLocation() { + try { + return new TmfLocation(fTrace.getFilePointer()); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + @Override + public TmfEvent parseEvent(TmfContext context) { + try { + // paserNextEvent updates the context + TmfEvent event = fParser.parseNextEvent(this, context); + return event; + } + catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + @Override + public void setTimeRange(TmfTimeRange range) { + super.setTimeRange(range); + } + + @Override + public void setStartTime(TmfTimestamp startTime) { + super.setStartTime(startTime); + } + + @Override + public void setEndTime(TmfTimestamp endTime) { + super.setEndTime(endTime); + } + +} \ No newline at end of file diff --git a/org.eclipse.linuxtools.tmf.tests/test.xml b/org.eclipse.linuxtools.tmf.tests/test.xml new file mode 100644 index 0000000000..f440907dd3 --- /dev/null +++ b/org.eclipse.linuxtools.tmf.tests/test.xml @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/org.eclipse.linuxtools.tmf.tests/testfiles/A-Test-10K b/org.eclipse.linuxtools.tmf.tests/testfiles/A-Test-10K new file mode 100644 index 0000000000000000000000000000000000000000..cfb674ae469009dc87787d536b65e154371d5584 GIT binary patch literal 643257 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%0D*hMC1JO1i~waYP4Acj^0z zY1$IjC+GsVM1fnXs*D*R&=X8qs@vgr$vIf zBIW&4TuPa0RJ;b_%{;TRMd_Ugu8ioQ*)IJIGOJjhmd@Y|br3mKj0lBilv00X4H8IS)0`eL^CdV_I zrwj)PW8MsCrxuAE(QM)V(B(tkU>7zLAis+!JF8z!!yIG&+3*&CZW_N$3$D+79 zyJvpc!wc!881BJBHL|wO@Uo|C2(19_$--7>t2|dsd%2wa3f^9n_s?%B<%(%>Hu>8pOR<>P zn1e>UVCIVHKBG00C7)qV;T%x&R`mRNZw!nQC(LtkK z`nh5{-1?+k;0`Zv-}6^8DsbOpcl{A=GI&I+i@`+h2q!@f!o^j?xm(w4SJdyJL zNiL;KGACJyPz&NoD0K>TiROyw`xYhN!uNed2hDfs=ZfhE)+g!$_k#j=vcD2kfjgPq z_2;;W;wfH8W(DpP7PbcGrsmXG6Vr&?sSZ&)zSu5DF{ecWXNlfvmY6Kc$mKld^vK~q zAydui|+& z3)R-LQf8ZTTtoAO^Bfko!dvB;YtD5!4HC+8Des@-Qp!kko|Wir%0D*hMDs% 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%0D*hM5N~ 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


IB#*ER%qKjk1hyKQ?2U5j_6nyE{X`)*h8 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�{YfP!s{?ITSS85Y5;fo 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%0Al1rIabn@m3-S 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⪙H+S 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 yTI*wUfxAJBo}Xe~qW)BgagDrD&Z literal 0 HcmV?d00001 -- 2.34.1