/******************************************************************************* * Copyright (c) 2017 É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.internal.provisional.datastore.core.historytree.overlapping; import static org.junit.Assert.assertEquals; import java.io.File; import java.io.IOException; import org.eclipse.tracecompass.internal.provisional.datastore.core.historytree.AbstractHistoryTreeTestBase; import org.eclipse.tracecompass.internal.provisional.datastore.core.historytree.HtTestUtils; import org.eclipse.tracecompass.internal.provisional.datastore.core.interval.IHTInterval; import org.junit.Test; /** * Test the overlapping history tree. This base class keeps the parameter such * that any tree implementing the overlapping history tree can extend this test * method * * @author Geneviève Bastien * @param <E> * Type of interval * @param <N> * Type of nodes in the tree */ public abstract class AbstractOverlappingHistoryTreeTestBase<E extends IHTInterval, N extends OverlappingNode<E>> extends AbstractHistoryTreeTestBase<E, N> { @Override protected abstract AbstractOverlappingHistoryTree<E, N> createHistoryTree(File stateHistoryFile, int blockSize, int maxChildren, int providerVersion, long treeStart) throws IOException; @Override protected abstract AbstractOverlappingHistoryTree<E, N> createHistoryTree( File existingStateFile, int expectedProviderVersion) throws IOException; /** * Test that the children start and end times are as expected */ @Test public void testChildrenTimes() { AbstractOverlappingHistoryTree<E, N> ht = (AbstractOverlappingHistoryTree<E, N>) setupSmallTree(); /* Fill a first node */ OverlappingNode<E> node = ht.getLatestLeaf(); long time = fillValues(ht, node.getNodeFreeSpace(), 1); /* Add elements that should add a sibling to the node */ assertEquals(1, ht.getNodeCount()); assertEquals(1, ht.getDepth()); ht.insert(createInterval(time, time + 1)); assertEquals(3, ht.getNodeCount()); assertEquals(2, ht.getDepth()); // The first node should have been closed, so let's check that the // parent has the right start and end end time OverlappingNode<E> parent = ht.getLatestNode(0); assertEquals(time, node.getNodeEnd()); assertEquals(time, parent.getChildEnd(0)); assertEquals(node.getNodeStart(), parent.getChildStart(0)); /* Fill the latest leaf node (2nd child) */ node = ht.getLatestLeaf(); time += 1; time = fillValues(ht, node.getNodeFreeSpace(), time); /* * Add an element that should add another sibling to the previous nodes */ ht.insert(createInterval(time, time + 1)); assertEquals(4, ht.getNodeCount()); assertEquals(2, ht.getDepth()); // The second node should have been closed, so let's check that the // parent has the right start and end time assertEquals(time, node.getNodeEnd()); assertEquals(time, parent.getChildEnd(1)); assertEquals(node.getNodeStart(), parent.getChildStart(1)); /* Fill the latest leaf node (3rd and last child) */ node = ht.getLatestLeaf(); time += 1; time = fillValues(ht, node.getNodeFreeSpace(), time); /* The new node created here should generate a new branch */ ht.insert(createInterval(time, time + 1)); assertEquals(7, ht.getNodeCount()); assertEquals(3, ht.getDepth()); // The third node and previous parent should have been closed, so let's // check that the parent has the right start and end time assertEquals(time, node.getNodeEnd()); assertEquals(time, parent.getChildEnd(2)); assertEquals(node.getNodeStart(), parent.getChildStart(2)); // Now verify the higher level node = parent; parent = ht.getLatestNode(0); assertEquals(time, node.getNodeEnd()); assertEquals(time, parent.getChildEnd(0)); // Assert the integrity of the tree ht.closeTree(ht.getTreeEnd()); time = ht.getTreeEnd(); /* The tree is closed, the last branch should have their end time set */ // leaf level assertEquals(time, ht.getLatestNode(2).getNodeEnd()); // Second level assertEquals(time, ht.getLatestNode(1).getNodeEnd()); assertEquals(time, ht.getLatestNode(1).getChildEnd(0)); // Head level assertEquals(time, parent.getNodeEnd()); assertEquals(time, parent.getChildEnd(1)); HtTestUtils.assertTreeIntegrity(ht); } }