From f7d3415976823ae74b390fbcc7ae9b06e972f9d1 Mon Sep 17 00:00:00 2001
From: Nils Christian Ehmke <nie@informatik.uni-kiel.de>
Date: Tue, 16 Dec 2014 17:00:01 +0100
Subject: [PATCH] Added some tests

---
 build.gradle                                  |   8 +-
 .../stages/RecordSimplificatorTest.java       |  50 +++++++
 .../stages/TraceReconstructorTest.java        | 136 ++++++++++++++++++
 3 files changed, 191 insertions(+), 3 deletions(-)
 create mode 100644 src/test/java/kieker/gui/model/importer/stages/RecordSimplificatorTest.java
 create mode 100644 src/test/java/kieker/gui/model/importer/stages/TraceReconstructorTest.java

diff --git a/build.gradle b/build.gradle
index d82708b1..762d7fe2 100644
--- a/build.gradle
+++ b/build.gradle
@@ -32,9 +32,11 @@ dependencies {
 	linuxX64Runtime 'org.eclipse.swt:org.eclipse.swt.gtk.linux.x86_64:4.4'
 	
 	compile 'net.sourceforge.teetime:teetime:1.0-SNAPSHOT'
-  compile 'net.sourceforge.teetime-stages:teetime-stages:1.0-SNAPSHOT'
-  compile 'net.kieker-monitoring:kieker:1.11-SNAPSHOT'
-  compile 'org.eclipse:jface:3.2.1-M20060908-1000'
+	compile 'net.sourceforge.teetime-stages:teetime-stages:1.0-SNAPSHOT'
+	compile 'net.kieker-monitoring:kieker:1.11-SNAPSHOT'
+	compile 'org.eclipse:jface:3.2.1-M20060908-1000'
+  
+	testCompile 'org.hamcrest:hamcrest-core:1.3'
 }
 
 // Add the provided-scoped dependencies to the classpaths
diff --git a/src/test/java/kieker/gui/model/importer/stages/RecordSimplificatorTest.java b/src/test/java/kieker/gui/model/importer/stages/RecordSimplificatorTest.java
new file mode 100644
index 00000000..8277b753
--- /dev/null
+++ b/src/test/java/kieker/gui/model/importer/stages/RecordSimplificatorTest.java
@@ -0,0 +1,50 @@
+package kieker.gui.model.importer.stages;
+
+import static org.hamcrest.Matchers.hasSize;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import kieker.common.record.flow.trace.operation.BeforeOperationEvent;
+import kieker.gui.model.domain.Record;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import teetime.framework.pipe.IPipeFactory;
+import teetime.framework.pipe.SingleElementPipeFactory;
+import teetime.stage.CollectorSink;
+
+public class RecordSimplificatorTest {
+
+	private List<Record> recordCollectorList;
+	private RecordSimplificator simplificatorUnderTest;
+	private CollectorSink<Record> recordCollector;
+
+	@Before
+	public void initializeRecordSimplificator() {
+		this.recordCollectorList = new ArrayList<>();
+
+		this.simplificatorUnderTest = new RecordSimplificator();
+		this.recordCollector = new CollectorSink<>(this.recordCollectorList);
+
+		final IPipeFactory pipeFactory = new SingleElementPipeFactory();
+		pipeFactory.create(this.simplificatorUnderTest.getOutputPort(), this.recordCollector.getInputPort());
+	}
+
+	@Test
+	public void simplificationShouldPreserveContent() {
+		final BeforeOperationEvent record = new BeforeOperationEvent(1, 2, 3, "Bookstore()", "Bookstore");
+		this.simplificatorUnderTest.execute(record);
+
+		assertThat(this.recordCollectorList, hasSize(1));
+
+		final Record simplifiedRecord = this.recordCollectorList.get(0);
+		assertThat(simplifiedRecord.getType(), is(record.getClass().getCanonicalName()));
+		assertThat(simplifiedRecord.getRepresentation(), is(record.toString()));
+		assertThat(simplifiedRecord.getTimestamp(), is(record.getLoggingTimestamp()));
+	}
+
+}
diff --git a/src/test/java/kieker/gui/model/importer/stages/TraceReconstructorTest.java b/src/test/java/kieker/gui/model/importer/stages/TraceReconstructorTest.java
new file mode 100644
index 00000000..a008e929
--- /dev/null
+++ b/src/test/java/kieker/gui/model/importer/stages/TraceReconstructorTest.java
@@ -0,0 +1,136 @@
+package kieker.gui.model.importer.stages;
+
+import static org.hamcrest.Matchers.hasSize;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import kieker.common.record.flow.IFlowRecord;
+import kieker.common.record.flow.trace.TraceMetadata;
+import kieker.common.record.flow.trace.operation.AfterOperationEvent;
+import kieker.common.record.flow.trace.operation.AfterOperationFailedEvent;
+import kieker.common.record.flow.trace.operation.BeforeOperationEvent;
+import kieker.gui.model.domain.Execution;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import teetime.framework.pipe.IPipeFactory;
+import teetime.framework.pipe.SingleElementPipeFactory;
+import teetime.stage.CollectorSink;
+
+public class TraceReconstructorTest {
+
+	private List<Execution> traceCollectorList;
+	private TraceReconstructor reconstructorUnderTest;
+	private CollectorSink<Execution> traceCollector;
+
+	@Before
+	public void initializeTraceReconstructor() {
+		this.traceCollectorList = new ArrayList<>();
+
+		this.reconstructorUnderTest = new TraceReconstructor();
+		this.traceCollector = new CollectorSink<>(this.traceCollectorList);
+
+		final IPipeFactory pipeFactory = new SingleElementPipeFactory();
+		pipeFactory.create(this.reconstructorUnderTest.getOutputPort(), this.traceCollector.getInputPort());
+	}
+
+	@Test
+	public void reconstructionOfSingleTraceShouldWork() {
+		final IFlowRecord[] records = new IFlowRecord[9];
+
+		records[0] = new TraceMetadata(1, 1, TraceMetadata.NO_SESSION_ID, TraceMetadata.NO_HOSTNAME, TraceMetadata.NO_PARENT_TRACEID, TraceMetadata.NO_PARENT_ORDER_INDEX);
+		records[1] = new BeforeOperationEvent(1, 1, 1, "main()", "Main");
+		records[2] = new BeforeOperationEvent(1, 1, 1, "Bookstore()", "Bookstore");
+		records[3] = new AfterOperationEvent(1, 1, 1, "Bookstore()", "Bookstore");
+		records[4] = new BeforeOperationEvent(1, 1, 1, "Catalog()", "Catalog");
+		records[5] = new BeforeOperationEvent(1, 1, 1, "CRM()", "CRM");
+		records[6] = new AfterOperationEvent(1, 1, 1, "CRM()", "CRM");
+		records[7] = new AfterOperationEvent(1, 1, 1, "Catalog()", "Catalog");
+		records[8] = new AfterOperationEvent(1, 1, 1, "main()", "Main");
+
+		for (final IFlowRecord record : records) {
+			this.reconstructorUnderTest.execute(record);
+		}
+		assertThat(this.traceCollectorList, hasSize(1));
+
+		final Execution trace = this.traceCollectorList.get(0);
+		assertThat(trace.getOperation(), is("main()"));
+		assertThat(trace.getChildren(), hasSize(2));
+		assertThat(trace.getChildren().get(0).getOperation(), is("Bookstore()"));
+		assertThat(trace.getChildren().get(1).getOperation(), is("Catalog()"));
+		assertThat(trace.getChildren().get(1).getChildren(), hasSize(1));
+		assertThat(trace.getChildren().get(1).getChildren().get(0).getOperation(), is("CRM()"));
+	}
+
+	@Test
+	public void reconstructionOfInterleavedTracesShouldWork() {
+		final IFlowRecord[] records = new IFlowRecord[9];
+
+		records[0] = new TraceMetadata(1, 1, TraceMetadata.NO_SESSION_ID, TraceMetadata.NO_HOSTNAME, TraceMetadata.NO_PARENT_TRACEID, TraceMetadata.NO_PARENT_ORDER_INDEX);
+		records[1] = new BeforeOperationEvent(1, 1, 1, "main()", "Main");
+		records[2] = new TraceMetadata(2, 1, TraceMetadata.NO_SESSION_ID, TraceMetadata.NO_HOSTNAME, TraceMetadata.NO_PARENT_TRACEID, TraceMetadata.NO_PARENT_ORDER_INDEX);
+		records[3] = new BeforeOperationEvent(1, 2, 1, "Bookstore()", "Bookstore");
+		records[4] = new AfterOperationEvent(1, 1, 1, "main()", "Main");
+		records[5] = new AfterOperationEvent(1, 2, 1, "Bookstore()", "Bookstore");
+
+		for (final IFlowRecord record : records) {
+			this.reconstructorUnderTest.execute(record);
+		}
+		assertThat(this.traceCollectorList, hasSize(2));
+
+		final Execution fstTrace = this.traceCollectorList.get(0);
+		final Execution sndTrace = this.traceCollectorList.get(1);
+
+		assertThat(fstTrace.getOperation(), is("main()"));
+		assertThat(sndTrace.getOperation(), is("Bookstore()"));
+	}
+
+	@Test
+	public void reconstructionOfCompleteFailedTraceShouldWork() {
+		final IFlowRecord[] records = new IFlowRecord[9];
+
+		records[0] = new TraceMetadata(1, 1, TraceMetadata.NO_SESSION_ID, TraceMetadata.NO_HOSTNAME, TraceMetadata.NO_PARENT_TRACEID, TraceMetadata.NO_PARENT_ORDER_INDEX);
+		records[1] = new BeforeOperationEvent(1, 1, 1, "main()", "Main");
+		records[2] = new BeforeOperationEvent(1, 1, 1, "Bookstore()", "Bookstore");
+		records[3] = new AfterOperationFailedEvent(1, 1, 1, "Bookstore()", "Bookstore", "NullPointerException");
+		records[8] = new AfterOperationFailedEvent(1, 1, 1, "main()", "Main", "IllegalArgumentException");
+
+		for (final IFlowRecord record : records) {
+			this.reconstructorUnderTest.execute(record);
+		}
+		assertThat(this.traceCollectorList, hasSize(1));
+
+		final Execution trace = this.traceCollectorList.get(0);
+		assertThat(trace.isFailed(), is(true));
+		assertThat(trace.getFailedCause(), is("IllegalArgumentException"));
+		assertThat(trace.getChildren().get(0).isFailed(), is(true));
+		assertThat(trace.getChildren().get(0).getFailedCause(), is("NullPointerException"));
+	}
+
+	@Test
+	public void reconstructionOfPartialFailedTraceShouldWork() {
+		final IFlowRecord[] records = new IFlowRecord[9];
+
+		records[0] = new TraceMetadata(1, 1, TraceMetadata.NO_SESSION_ID, TraceMetadata.NO_HOSTNAME, TraceMetadata.NO_PARENT_TRACEID, TraceMetadata.NO_PARENT_ORDER_INDEX);
+		records[1] = new BeforeOperationEvent(1, 1, 1, "main()", "Main");
+		records[2] = new BeforeOperationEvent(1, 1, 1, "Bookstore()", "Bookstore");
+		records[3] = new AfterOperationFailedEvent(1, 1, 1, "Bookstore()", "Bookstore", "NullPointerException");
+		records[8] = new AfterOperationEvent(1, 1, 1, "main()", "Main");
+
+		for (final IFlowRecord record : records) {
+			this.reconstructorUnderTest.execute(record);
+		}
+		assertThat(this.traceCollectorList, hasSize(1));
+
+		final Execution trace = this.traceCollectorList.get(0);
+		assertThat(trace.isFailed(), is(false));
+		assertThat(trace.containsFailure(), is(true));
+		assertThat(trace.getChildren().get(0).isFailed(), is(true));
+		assertThat(trace.getChildren().get(0).getFailedCause(), is("NullPointerException"));
+	}
+
+}
-- 
GitLab