X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=statesystem%2Forg.eclipse.tracecompass.statesystem.core.tests%2Fsrc%2Forg%2Feclipse%2Ftracecompass%2Fstatesystem%2Fcore%2Ftests%2Fbackend%2FHistoryTreeTest.java;fp=statesystem%2Forg.eclipse.tracecompass.statesystem.core.tests%2Fsrc%2Forg%2Feclipse%2Ftracecompass%2Fstatesystem%2Fcore%2Ftests%2Fbackend%2FHistoryTreeTest.java;h=0000000000000000000000000000000000000000;hb=51004941ab54e6a586ef09020f2622951f56115d;hp=053a4e712ca3fa14b6429c1b013f4c997569fa58;hpb=3b5dc7454742f030b12b2d1f4345d6716c91e5dd;p=deliverable%2Ftracecompass.git diff --git a/statesystem/org.eclipse.tracecompass.statesystem.core.tests/src/org/eclipse/tracecompass/statesystem/core/tests/backend/HistoryTreeTest.java b/statesystem/org.eclipse.tracecompass.statesystem.core.tests/src/org/eclipse/tracecompass/statesystem/core/tests/backend/HistoryTreeTest.java deleted file mode 100644 index 053a4e712c..0000000000 --- a/statesystem/org.eclipse.tracecompass.statesystem.core.tests/src/org/eclipse/tracecompass/statesystem/core/tests/backend/HistoryTreeTest.java +++ /dev/null @@ -1,312 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015 É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; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.fail; - -import java.io.File; -import java.io.IOException; -import java.nio.channels.ClosedChannelException; -import java.util.List; - -import org.eclipse.jdt.annotation.NonNull; -import org.eclipse.tracecompass.internal.statesystem.core.backend.historytree.HTConfig; -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.statesystem.core.statevalue.TmfStateValue; -import org.eclipse.tracecompass.statesystem.core.tests.stubs.backend.HistoryTreeStub; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; - -/** - * Tests the history tree - * - * @author Geneviève Bastien - */ -public class HistoryTreeTest { - - /* Minimal allowed blocksize */ - private static final int BLOCK_SIZE = HistoryTree.TREE_HEADER_SIZE; - /* The extra size used by long and double values */ - private static final int LONG_DOUBLE_SIZE = 8; - /* The number of extra characters to store a string interval */ - private static final int STRING_PADDING = 2; - - /* String with 23 characters, interval in file will be 25 bytes long */ - private static final String TEST_STRING = "abcdefghifklmnopqrstuvw"; - private static final @NonNull TmfStateValue STRING_VALUE = TmfStateValue.newValueString(TEST_STRING); - private static final @NonNull TmfStateValue LONG_VALUE = TmfStateValue.newValueLong(10L); - private static final @NonNull TmfStateValue INT_VALUE = TmfStateValue.newValueInt(1); - - private File fTempFile; - - /** - * Create the temporary file for this history tree - */ - @Before - public void setupTest() { - try { - fTempFile = File.createTempFile("tmpStateSystem", null); - } catch (IOException e) { - fail(e.getMessage()); - } - } - - /** - * Delete the temporary history tree file after the test - */ - @After - public void cleanup() { - fTempFile.delete(); - } - - /** - * Setup a history tree. - * - * @param maxChildren - * The max number of children per node in the tree (tree config - * option) - */ - private HistoryTreeStub setupSmallTree(int maxChildren) { - HistoryTreeStub ht = null; - try { - File newFile = fTempFile; - assertNotNull(newFile); - HTConfig config = new HTConfig(newFile, - BLOCK_SIZE, - maxChildren, /* Number of children */ - 1, /* Provider version */ - 1); /* Start time */ - ht = new HistoryTreeStub(config); - - } catch (IOException e) { - fail(e.getMessage()); - } - - assertNotNull(ht); - return ht; - } - - /** - * Setup a history tree with config MAX_CHILDREN = 3. - */ - private HistoryTreeStub setupSmallTree() { - return setupSmallTree(3); - } - - private static long fillValues(HistoryTree ht, @NonNull TmfStateValue value, int nbValues, long start) { - for (int i = 0; i < nbValues; i++) { - ht.insertInterval(new HTInterval(start + i, start + i + 1, 1, value)); - } - return start + nbValues; - } - - /** - * Insert intervals in the tree to fill the current leaf node to capacity, - * without exceeding it. - * - * This guarantees that the following insertion will create new nodes. - * - * @param ht - * The history tree in which to insert - * @return Start time of the current leaf node. Future insertions should be - * greater than or equal to this to make sure the intervals go in - * the leaf node. - */ - private static long fillNextLeafNode(HistoryTreeStub ht, long leafNodeStart) { - int prevCount = ht.getNodeCount(); - int prevDepth = ht.getDepth(); - - /* Fill the following leaf node */ - HTNode node = ht.getLatestLeaf(); - int nodeFreeSpace = node.getNodeFreeSpace(); - int nbIntervals = nodeFreeSpace / (HTInterval.DATA_ENTRY_SIZE + TEST_STRING.length() + STRING_PADDING); - long ret = fillValues(ht, STRING_VALUE, nbIntervals, leafNodeStart); - - /* Make sure we haven't changed the depth or node count */ - assertEquals(prevCount, ht.getNodeCount()); - assertEquals(prevDepth, ht.getDepth()); - - return ret; - } - - /** - * Test that nodes are filled - * - * It fills nodes with sequential intervals from one attribute only, so that - * leafs should be filled. - */ - @Test - public void testSequentialFill() { - HistoryTreeStub ht = setupSmallTree(); - - HTNode node = ht.getLatestLeaf(); - assertEquals(0, node.getNodeUsagePercent()); - - /* Add null intervals up to ~10% */ - int nodeFreeSpace = node.getNodeFreeSpace(); - int nbIntervals = nodeFreeSpace / 10 / HTInterval.DATA_ENTRY_SIZE; - long start = fillValues(ht, TmfStateValue.nullValue(), nbIntervals, 1); - assertEquals(nodeFreeSpace - nbIntervals * HTInterval.DATA_ENTRY_SIZE, node.getNodeFreeSpace()); - - /* Add integer intervals up to ~20% */ - nodeFreeSpace = node.getNodeFreeSpace(); - nbIntervals = nodeFreeSpace / 10 / HTInterval.DATA_ENTRY_SIZE; - start = fillValues(ht, INT_VALUE, nbIntervals, start); - assertEquals(nodeFreeSpace - nbIntervals * HTInterval.DATA_ENTRY_SIZE, node.getNodeFreeSpace()); - - /* Add long intervals up to ~30% */ - nodeFreeSpace = node.getNodeFreeSpace(); - nbIntervals = nodeFreeSpace / 10 / (HTInterval.DATA_ENTRY_SIZE + LONG_DOUBLE_SIZE); - start = fillValues(ht, LONG_VALUE, nbIntervals, start); - assertEquals(nodeFreeSpace - nbIntervals * (HTInterval.DATA_ENTRY_SIZE + LONG_DOUBLE_SIZE), node.getNodeFreeSpace()); - - /* Add string intervals up to ~40% */ - nodeFreeSpace = node.getNodeFreeSpace(); - nbIntervals = nodeFreeSpace / 10 / (HTInterval.DATA_ENTRY_SIZE + TEST_STRING.length() + STRING_PADDING); - start = fillValues(ht, STRING_VALUE, nbIntervals, start); - assertEquals(nodeFreeSpace - nbIntervals * (HTInterval.DATA_ENTRY_SIZE + TEST_STRING.length() + STRING_PADDING), node.getNodeFreeSpace()); - - } - - /** - * Test the addition of new nodes to the tree and make sure the tree is - * built with the right structure - */ - @Test - public void testDepth() { - HistoryTreeStub ht = setupSmallTree(); - - /* Fill a first node */ - HTNode node = ht.getLatestLeaf(); - int nodeFreeSpace = node.getNodeFreeSpace(); - int nbIntervals = nodeFreeSpace / (HTInterval.DATA_ENTRY_SIZE + TEST_STRING.length() + STRING_PADDING); - long start = fillValues(ht, STRING_VALUE, nbIntervals, 1); - - /* Add intervals that should add a sibling to the node */ - assertEquals(1, ht.getNodeCount()); - assertEquals(1, ht.getDepth()); - start = fillValues(ht, STRING_VALUE, 1, start); - assertEquals(3, ht.getNodeCount()); - assertEquals(2, ht.getDepth()); - - /* Fill the latest leaf node (2nd child) */ - node = ht.getLatestLeaf(); - nodeFreeSpace = node.getNodeFreeSpace(); - nbIntervals = nodeFreeSpace / (HTInterval.DATA_ENTRY_SIZE + TEST_STRING.length() + STRING_PADDING); - start = fillValues(ht, STRING_VALUE, nbIntervals, start); - - /* - * Add an interval that should add another sibling to the previous nodes - */ - start = fillValues(ht, STRING_VALUE, 1, start); - assertEquals(4, ht.getNodeCount()); - assertEquals(2, ht.getDepth()); - - /* Fill the latest leaf node (3rd and last child) */ - node = ht.getLatestLeaf(); - nodeFreeSpace = node.getNodeFreeSpace(); - nbIntervals = nodeFreeSpace / (HTInterval.DATA_ENTRY_SIZE + TEST_STRING.length() + STRING_PADDING); - start = fillValues(ht, STRING_VALUE, nbIntervals, start); - - /* The new node created here should generate a new branch */ - start = fillValues(ht, STRING_VALUE, 1, start); - assertEquals(7, ht.getNodeCount()); - assertEquals(3, ht.getDepth()); - } - - /** - * Make sure the node sequence numbers and parent pointers are set correctly - * when new nodes are created. - * - *

- * We are building a tree whose node sequence numbers will look like this at - * the end: - *

- * - *
-     *     3
-     *    / \
-     *   1   4
-     *  / \   \
-     * 0   2   5
-     * 
- * - *

- * However while building, the parent pointers may be different. - *

- * - * @throws ClosedChannelException - * If the test fails - */ - @Test - public void testNodeSequenceNumbers() throws ClosedChannelException { - /* Represents the start time of the current leaf node */ - long start = 1; - - HistoryTreeStub ht = setupSmallTree(2); - start = fillNextLeafNode(ht, start); - - List branch = ht.getLatestBranch(); - assertEquals(1, branch.size()); - assertEquals( 0, branch.get(0).getSequenceNumber()); - assertEquals(-1, branch.get(0).getParentSequenceNumber()); - - /* Create a new branch */ - start = fillValues(ht, STRING_VALUE, 1, start); - start = fillNextLeafNode(ht, start); - assertEquals(3, ht.getNodeCount()); - assertEquals(2, ht.getDepth()); - - /* Make sure the first node's parent was updated */ - HTNode node = ht.readNode(0); - assertEquals(0, node.getSequenceNumber()); - assertEquals(1, node.getParentSequenceNumber()); - - /* Make sure the new branch is alright */ - branch = ht.getLatestBranch(); - assertEquals(2, branch.size()); - assertEquals( 1, branch.get(0).getSequenceNumber()); - assertEquals(-1, branch.get(0).getParentSequenceNumber()); - assertEquals( 2, branch.get(1).getSequenceNumber()); - assertEquals( 1, branch.get(1).getParentSequenceNumber()); - - /* Create a third branch */ - start = fillValues(ht, STRING_VALUE, 1, start); - start = fillNextLeafNode(ht, start); - assertEquals(6, ht.getNodeCount()); - assertEquals(3, ht.getDepth()); - - /* Make sure all previous nodes are still correct */ - node = ht.readNode(0); - assertEquals(0, node.getSequenceNumber()); - assertEquals(1, node.getParentSequenceNumber()); - node = ht.readNode(1); - assertEquals(1, node.getSequenceNumber()); - assertEquals(3, node.getParentSequenceNumber()); - node = ht.readNode(2); - assertEquals(2, node.getSequenceNumber()); - assertEquals(1, node.getParentSequenceNumber()); - - /* Verify the contents of the new latest branch */ - branch = ht.getLatestBranch(); - assertEquals(3, branch.size()); - assertEquals( 3, branch.get(0).getSequenceNumber()); - assertEquals(-1, branch.get(0).getParentSequenceNumber()); - assertEquals( 4, branch.get(1).getSequenceNumber()); - assertEquals( 3, branch.get(1).getParentSequenceNumber()); - assertEquals( 5, branch.get(2).getSequenceNumber()); - assertEquals( 4, branch.get(2).getParentSequenceNumber()); - } -}