ss: Add a unit tests for history tree integrity check
authorGeneviève Bastien <gbastien+lttng@versatic.net>
Mon, 18 Apr 2016 16:25:31 +0000 (12:25 -0400)
committerAlexandre Montplaisir <alexmonthy@efficios.com>
Fri, 22 Jul 2016 23:18:47 +0000 (19:18 -0400)
Change-Id: I38f18b243925a711a472636daf78e16f965c4588
Signed-off-by: Geneviève Bastien <gbastien+lttng@versatic.net>
Reviewed-on: https://git.eclipse.org/r/70891
Reviewed-by: Alexandre Montplaisir <alexmonthy@efficios.com>
Tested-by: Alexandre Montplaisir <alexmonthy@efficios.com>
Reviewed-by: Hudson CI
statesystem/org.eclipse.tracecompass.statesystem.core.tests/src/org/eclipse/tracecompass/statesystem/core/tests/backend/historytree/HistoryTreeWithBackendTest.java [new file with mode: 0644]
statesystem/org.eclipse.tracecompass.statesystem.core.tests/stubs/org/eclipse/tracecompass/statesystem/core/tests/stubs/backend/HistoryTreeBackendStub.java

diff --git a/statesystem/org.eclipse.tracecompass.statesystem.core.tests/src/org/eclipse/tracecompass/statesystem/core/tests/backend/historytree/HistoryTreeWithBackendTest.java b/statesystem/org.eclipse.tracecompass.statesystem.core.tests/src/org/eclipse/tracecompass/statesystem/core/tests/backend/historytree/HistoryTreeWithBackendTest.java
new file mode 100644 (file)
index 0000000..27f57ff
--- /dev/null
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * Copyright (c) 2016 École Polytechnique de Montréal
+ *
+ * All rights reserved. This program and the accompanying materials are
+ * made available under the terms of the Eclipse Public License v1.0 which
+ * accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *******************************************************************************/
+
+package org.eclipse.tracecompass.statesystem.core.tests.backend.historytree;
+
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.eclipse.tracecompass.common.core.NonNullUtils;
+import org.eclipse.tracecompass.internal.statesystem.core.backend.historytree.HTInterval;
+import org.eclipse.tracecompass.internal.statesystem.core.backend.historytree.HTNode;
+import org.eclipse.tracecompass.internal.statesystem.core.backend.historytree.HistoryTree;
+import org.eclipse.tracecompass.internal.statesystem.core.backend.historytree.HistoryTreeBackend;
+import org.eclipse.tracecompass.statesystem.core.statevalue.TmfStateValue;
+import org.eclipse.tracecompass.statesystem.core.tests.stubs.backend.HistoryTreeBackendStub;
+import org.junit.Test;
+
+/**
+ * Test the {@link HistoryTreeBackend}-specific behavior and its interactions
+ * with the {@link HistoryTree} class
+ *
+ * @author Geneviève Bastien
+ */
+public class HistoryTreeWithBackendTest {
+
+    /** State system ID */
+    private static final String SSID = "test";
+    /** Provider version */
+    private static final int PROVIDER_VERSION = 0;
+
+    /** Default maximum number of children nodes */
+    private static final int MAX_CHILDREN = 3;
+    /** Default block size */
+    private static final int BLOCK_SIZE = 4096;
+
+    /**
+     * Test the behavior of the history tree after at least a depth of 3
+     */
+    @Test
+    public void testFillNodes() {
+        try {
+            // Test case parameters
+            final int nbAttr = 5;
+            final int depthToRead = 3;
+
+            long startTime = 1;
+            File historyTreeFile = NonNullUtils.checkNotNull(File.createTempFile("HistoryTreeBackendTest", ".ht"));
+            HistoryTreeBackendStub backend = new HistoryTreeBackendStub(SSID, historyTreeFile, PROVIDER_VERSION, startTime, BLOCK_SIZE, MAX_CHILDREN);
+
+            int duration = nbAttr;
+            int quarkTest = nbAttr;
+            long time = startTime + duration;
+
+            HTInterval interval = new HTInterval(startTime, time, quarkTest, TmfStateValue.newValueLong(time));
+            // Insert a first interval for the test attribute
+            backend.insertPastState(interval.getStartTime(), interval.getEndTime(), interval.getAttribute(), interval.getStateValue());
+
+            /*
+             * insert cascading intervals to fill 2 levels of history
+             * tree, so that we start another branch
+             */
+            while (backend.getHistoryTree().getDepth() < depthToRead) {
+                backend.insertPastState(
+                        Math.max(startTime, time - duration),
+                        time - 1,
+                        (int) time % nbAttr,
+                        TmfStateValue.newValueLong(time));
+                time++;
+            }
+
+            // entirely fill the latest leaf with cascading intervals
+            HTNode latestLeaf = backend.getHistoryTree().getLatestLeaf();
+            /*
+             * Add an interval while there is still room for it or make sure the
+             * node does not get written on disk in the meantime.
+             */
+            while (interval.getSizeOnDisk() <= latestLeaf.getNodeFreeSpace() || latestLeaf.isOnDisk()) {
+                backend.insertPastState(
+                        Math.max(startTime, time - duration),
+                        time - 1,
+                        (int) time % nbAttr,
+                        TmfStateValue.newValueLong(time));
+                time++;
+            }
+
+            // Add an interval that does not fit in latest leaf, but starts
+            // before the current branch
+            backend.insertPastState(interval.getEndTime() + 1, time, quarkTest, TmfStateValue.newValueLong(time));
+
+            backend.getHistoryTree().assertIntegrity();
+
+        } catch (IOException e) {
+            fail(e.getMessage());
+        }
+    }
+
+}
index 1f5366761c063d9db1cbcddd8b4f9555d110bd2b..4405a55e29ef9059df79dde302d78b4d816ce0b2 100644 (file)
@@ -85,4 +85,13 @@ public class HistoryTreeBackendStub extends HistoryTreeBackend {
         return new HistoryTreeStub(existingStateFile, providerVersion);
     }
 
+    /**
+     * Get the History Tree built by this backend.
+     *
+     * @return The history tree
+     */
+    public HistoryTreeStub getHistoryTree() {
+        return (HistoryTreeStub) super.getSHT();
+    }
+
 }
This page took 0.026303 seconds and 5 git commands to generate.