blob: 52d4a6fca0b7e80ae431b92a1f579c5627250914 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License 2.0 which
* accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*******************************************************************************/
package org.eclipse.tracecompass.analysis.os.linux.ui.tests.view.controlflow;
import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.swt.SWT;
import org.eclipse.tracecompass.internal.analysis.os.linux.core.threadstatus.ThreadEntryModel;
import org.eclipse.tracecompass.internal.analysis.os.linux.ui.views.controlflow.ControlFlowColumnComparators;
import org.eclipse.tracecompass.internal.analysis.os.linux.ui.views.controlflow.IControlFlowEntryComparator;
import org.eclipse.tracecompass.tmf.ui.views.timegraph.ITimeGraphEntryComparator;
import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.model.ITimeGraphEntry;
import org.eclipse.tracecompass.tmf.ui.widgets.timegraph.model.TimeGraphEntry;
import org.junit.Test;
/**
* Test cases for verifying the ControlFlowEntry comparators used in the Control Flow View.
*
* @author Bernd Hufmann
*
*/
public class ControlFlowEntryComparatorTest {
private static final @NonNull String TRACE1_NAME = "/synctraces/scp_dest";
private static final @NonNull String TRACE2_NAME = "/synctraces/scp_src";
private static final @NonNull String TRACE3_NAME = "/debuginfo-test-app4";
private static final @NonNull String TRACE_EXEC_NAME1 = "AAA";
private static final @NonNull String TRACE_EXEC_NAME2 = "BBB";
private static final @NonNull String TRACE_EXEC_NAME3 = "CCC";
private static final int TRACE_TID1 = 1;
private static final int TRACE_TID2 = 2;
private static final int TRACE_TID3 = 3;
private static final int TRACE_PTID1 = 1;
private static final int TRACE_PTID2 = 2;
private static final int TRACE_PTID3 = 3;
private static final int TRACE_START_TIME1 = 1;
private static final int TRACE_START_TIME2 = 2;
private static final int TRACE_START_TIME3 = 3;
private static final int TRACE_END_TIME = 4;
/**
* Test {@link IControlFlowEntryComparator#PROCESS_NAME_COMPARATOR}
*/
@Test
public void execNameComparatorTest() {
TimeGraphEntry trace1Entry1 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID1, TRACE_PTID1, TRACE_START_TIME1, TRACE_END_TIME);
TimeGraphEntry trace1Entry2 = generateCFVEntry(0, TRACE_EXEC_NAME2, TRACE_TID1, TRACE_PTID1, TRACE_START_TIME1, TRACE_END_TIME);
TimeGraphEntry trace1Entry3 = generateCFVEntry(0, TRACE_EXEC_NAME3, TRACE_TID1, TRACE_PTID1, TRACE_START_TIME1, TRACE_END_TIME);
List<TimeGraphEntry> testVec = Arrays.asList(trace1Entry2, trace1Entry3, trace1Entry1);
List<TimeGraphEntry> expected = Arrays.asList(trace1Entry1, trace1Entry2, trace1Entry3);
Collections.sort(testVec, IControlFlowEntryComparator.PROCESS_NAME_COMPARATOR);
assertEquals(expected, testVec);
}
/**
* Test {@link IControlFlowEntryComparator#TID_COMPARATOR}
*/
@Test
public void tidComparatorTest() {
TimeGraphEntry trace1Entry1 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID1, TRACE_PTID1, TRACE_START_TIME1, TRACE_END_TIME);
TimeGraphEntry trace1Entry2 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID2, TRACE_PTID1, TRACE_START_TIME1, TRACE_END_TIME);
TimeGraphEntry trace1Entry3 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID3, TRACE_PTID1, TRACE_START_TIME1, TRACE_END_TIME);
List<TimeGraphEntry> testVec = Arrays.asList(trace1Entry2, trace1Entry3, trace1Entry1);
List<TimeGraphEntry> expected = Arrays.asList(trace1Entry1, trace1Entry2, trace1Entry3);
Collections.sort(testVec, IControlFlowEntryComparator.TID_COMPARATOR);
assertEquals(expected, testVec);
}
/**
* Helper function to make entries to test. As they are only looking up the
* tid, that is the only parameter that needs to be passed.
*
* @param tid
* the TID to lookup
* @param traceEndTime
* @param traceStartTime1
* @param tracePtid1
* @param traceTid1
* @param traceExecName1
* @return a {@link TimeGraphEntry} with the correct tid.
*/
private static TimeGraphEntry generateCFVEntry(int id, @NonNull String execName, int tid, int ptid, int startTime, int endTime) {
return new TimeGraphEntry(new ThreadEntryModel(0, -1, Collections.singletonList(execName), startTime, endTime, tid, ptid, -1));
}
/**
* Test {@link IControlFlowEntryComparator#PTID_COMPARATOR}
*/
@Test
public void ptidComparatorTest() {
TimeGraphEntry trace1Entry1 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID1, TRACE_PTID1, TRACE_START_TIME1, TRACE_END_TIME);
TimeGraphEntry trace1Entry2 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID1, TRACE_PTID2, TRACE_START_TIME1, TRACE_END_TIME);
TimeGraphEntry trace1Entry3 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID1, TRACE_PTID3, TRACE_START_TIME1, TRACE_END_TIME);
List<TimeGraphEntry> testVec = Arrays.asList(trace1Entry2, trace1Entry3, trace1Entry1);
List<TimeGraphEntry> expected = Arrays.asList(trace1Entry1, trace1Entry2, trace1Entry3);
Collections.sort(testVec, IControlFlowEntryComparator.PTID_COMPARATOR);
assertEquals(expected, testVec);
}
/**
* Test {@link IControlFlowEntryComparator#BIRTH_TIME_COMPARATOR}
*/
@Test
public void birthTimeComparatorTest() {
TimeGraphEntry trace1Entry1 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID1, TRACE_PTID1, TRACE_START_TIME1, TRACE_END_TIME);
TimeGraphEntry trace1Entry2 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID1, TRACE_PTID1, TRACE_START_TIME2, TRACE_END_TIME);
TimeGraphEntry trace1Entry3 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID1, TRACE_PTID1, TRACE_START_TIME3, TRACE_END_TIME);
List<TimeGraphEntry> testVec = Arrays.asList(trace1Entry2, trace1Entry3, trace1Entry1);
List<TimeGraphEntry> expected = Arrays.asList(trace1Entry1, trace1Entry2, trace1Entry3);
Collections.sort(testVec, IControlFlowEntryComparator.BIRTH_TIME_COMPARATOR);
assertEquals(expected, testVec);
}
/**
* Test {@link ControlFlowColumnComparators#PROCESS_NAME_COLUMN_COMPARATOR}
*/
@Test
public void execNameColumnComparatorTest() {
TimeGraphEntry trace1Entry = new TimeGraphEntry(TRACE1_NAME, TRACE_START_TIME1, TRACE_END_TIME);
TimeGraphEntry trace2Entry = new TimeGraphEntry(TRACE2_NAME, TRACE_START_TIME2, TRACE_END_TIME);
TimeGraphEntry trace3Entry = new TimeGraphEntry(TRACE3_NAME, TRACE_START_TIME3, TRACE_END_TIME);
List<TimeGraphEntry> testVec = Arrays.asList(trace1Entry, trace2Entry, trace3Entry);
List<TimeGraphEntry> expectedDown = Arrays.asList(trace3Entry, trace1Entry, trace2Entry);
List<TimeGraphEntry> expectedUp = Arrays.asList(trace2Entry, trace1Entry, trace3Entry);
runTest(ControlFlowColumnComparators.PROCESS_NAME_COLUMN_COMPARATOR, testVec, expectedDown, expectedUp);
TimeGraphEntry trace1Entry1 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID1, TRACE_PTID1, TRACE_START_TIME1, TRACE_END_TIME);
TimeGraphEntry trace1Entry2 = generateCFVEntry(0, TRACE_EXEC_NAME2, TRACE_TID1, TRACE_PTID1, TRACE_START_TIME1, TRACE_END_TIME);
TimeGraphEntry trace1Entry3 = generateCFVEntry(0, TRACE_EXEC_NAME3, TRACE_TID1, TRACE_PTID1, TRACE_START_TIME1, TRACE_END_TIME);
testVec = Arrays.asList(trace1Entry2, trace1Entry3, trace1Entry1);
expectedDown = Arrays.asList(trace1Entry1, trace1Entry2, trace1Entry3);
expectedUp = Arrays.asList(trace1Entry3, trace1Entry2, trace1Entry1);
runTest(ControlFlowColumnComparators.PROCESS_NAME_COLUMN_COMPARATOR, testVec, expectedDown, expectedUp);
}
/**
* Test {@link ControlFlowColumnComparators#PROCESS_NAME_COLUMN_COMPARATOR}
*
* Note, that when the exec name is the same: The order that is birth time,
* TID and PTID. Note that for secondary comparators the sort direction is
* not changed.
*/
@Test
public void execNameSecondaryTimeColumnComparatorTest() {
TimeGraphEntry trace1Entry1 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID1, TRACE_PTID1, TRACE_START_TIME1, TRACE_END_TIME);
TimeGraphEntry trace1Entry2 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID1, TRACE_PTID1, TRACE_START_TIME2, TRACE_END_TIME);
TimeGraphEntry trace1Entry3 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID1, TRACE_PTID1, TRACE_START_TIME3, TRACE_END_TIME);
List<TimeGraphEntry> testVec = Arrays.asList(trace1Entry2, trace1Entry3, trace1Entry1);
List<TimeGraphEntry> expectedDown = Arrays.asList(trace1Entry1, trace1Entry2, trace1Entry3);
List<TimeGraphEntry> expectedUp = Arrays.asList(trace1Entry1, trace1Entry2, trace1Entry3);
runTest(ControlFlowColumnComparators.PROCESS_NAME_COLUMN_COMPARATOR, testVec, expectedDown, expectedUp);
trace1Entry1 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID1, TRACE_PTID1, TRACE_START_TIME1, TRACE_END_TIME);
trace1Entry2 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID2, TRACE_PTID1, TRACE_START_TIME1, TRACE_END_TIME);
trace1Entry3 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID3, TRACE_PTID1, TRACE_START_TIME1, TRACE_END_TIME);
testVec = Arrays.asList(trace1Entry2, trace1Entry3, trace1Entry1);
expectedDown = Arrays.asList(trace1Entry1, trace1Entry2, trace1Entry3);
expectedUp = Arrays.asList(trace1Entry1, trace1Entry2, trace1Entry3);
runTest(ControlFlowColumnComparators.PROCESS_NAME_COLUMN_COMPARATOR, testVec, expectedDown, expectedUp);
trace1Entry1 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID1, TRACE_PTID1, TRACE_START_TIME1, TRACE_END_TIME);
trace1Entry2 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID1, TRACE_PTID2, TRACE_START_TIME1, TRACE_END_TIME);
trace1Entry3 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID1, TRACE_PTID3, TRACE_START_TIME1, TRACE_END_TIME);
testVec = Arrays.asList(trace1Entry2, trace1Entry3, trace1Entry1);
expectedDown = Arrays.asList(trace1Entry1, trace1Entry2, trace1Entry3);
expectedUp = Arrays.asList(trace1Entry1, trace1Entry2, trace1Entry3);
runTest(ControlFlowColumnComparators.PROCESS_NAME_COLUMN_COMPARATOR, testVec, expectedDown, expectedUp);
}
/**
* Test {@link ControlFlowColumnComparators#TID_COLUMN_COMPARATOR}
*/
@Test
public void tidColumnComparatorTest() {
TimeGraphEntry trace1Entry = new TimeGraphEntry(TRACE1_NAME, TRACE_START_TIME1, TRACE_END_TIME);
TimeGraphEntry trace2Entry = new TimeGraphEntry(TRACE2_NAME, TRACE_START_TIME2, TRACE_END_TIME);
TimeGraphEntry trace3Entry = new TimeGraphEntry(TRACE3_NAME, TRACE_START_TIME3, TRACE_END_TIME);
List<TimeGraphEntry> testVec = Arrays.asList(trace1Entry, trace2Entry, trace3Entry);
List<TimeGraphEntry> expectedDown = Arrays.asList(trace1Entry, trace2Entry, trace3Entry);
List<TimeGraphEntry> expectedUp = Arrays.asList(trace1Entry, trace2Entry, trace3Entry);
runTest(ControlFlowColumnComparators.TID_COLUMN_COMPARATOR, testVec, expectedDown, expectedUp);
TimeGraphEntry trace1Entry1 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID1, TRACE_PTID1, TRACE_START_TIME1, TRACE_END_TIME);
TimeGraphEntry trace1Entry2 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID2, TRACE_PTID1, TRACE_START_TIME1, TRACE_END_TIME);
TimeGraphEntry trace1Entry3 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID3, TRACE_PTID1, TRACE_START_TIME1, TRACE_END_TIME);
testVec = Arrays.asList(trace1Entry2, trace1Entry3, trace1Entry1);
expectedDown = Arrays.asList(trace1Entry1, trace1Entry2, trace1Entry3);
expectedUp = Arrays.asList(trace1Entry3, trace1Entry2, trace1Entry1);
runTest(ControlFlowColumnComparators.TID_COLUMN_COMPARATOR, testVec, expectedDown, expectedUp);
}
/**
* Test {@link ControlFlowColumnComparators#TID_COLUMN_COMPARATOR}
*
* Note, that when TID is the same: The order for for that is birth
* time, process name and PTID. Note that for secondary comparators the
* sort direction is not changed.
*/
@Test
public void tidSecondaryTimeColumnComparatorTest() {
TimeGraphEntry trace1Entry1 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID1, TRACE_PTID1, TRACE_START_TIME1, TRACE_END_TIME);
TimeGraphEntry trace1Entry2 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID1, TRACE_PTID1, TRACE_START_TIME2, TRACE_END_TIME);
TimeGraphEntry trace1Entry3 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID1, TRACE_PTID1, TRACE_START_TIME3, TRACE_END_TIME);
List<TimeGraphEntry> testVec = Arrays.asList(trace1Entry2, trace1Entry3, trace1Entry1);
List<TimeGraphEntry> expectedDown = Arrays.asList(trace1Entry1, trace1Entry2, trace1Entry3);
List<TimeGraphEntry> expectedUp = Arrays.asList(trace1Entry1, trace1Entry2, trace1Entry3);
runTest(ControlFlowColumnComparators.TID_COLUMN_COMPARATOR, testVec, expectedDown, expectedUp);
trace1Entry1 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID1, TRACE_PTID1, TRACE_START_TIME1, TRACE_END_TIME);
trace1Entry2 = generateCFVEntry(0, TRACE_EXEC_NAME2, TRACE_TID1, TRACE_PTID1, TRACE_START_TIME1, TRACE_END_TIME);
trace1Entry3 = generateCFVEntry(0, TRACE_EXEC_NAME3, TRACE_TID1, TRACE_PTID1, TRACE_START_TIME1, TRACE_END_TIME);
testVec = Arrays.asList(trace1Entry2, trace1Entry3, trace1Entry1);
expectedDown = Arrays.asList(trace1Entry1, trace1Entry2, trace1Entry3);
expectedUp = Arrays.asList(trace1Entry1, trace1Entry2, trace1Entry3);
runTest(ControlFlowColumnComparators.TID_COLUMN_COMPARATOR, testVec, expectedDown, expectedUp);
trace1Entry1 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID1, TRACE_PTID1, TRACE_START_TIME1, TRACE_END_TIME);
trace1Entry2 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID1, TRACE_PTID2, TRACE_START_TIME1, TRACE_END_TIME);
trace1Entry3 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID1, TRACE_PTID3, TRACE_START_TIME1, TRACE_END_TIME);
testVec = Arrays.asList(trace1Entry2, trace1Entry3, trace1Entry1);
expectedDown = Arrays.asList(trace1Entry1, trace1Entry2, trace1Entry3);
expectedUp = Arrays.asList(trace1Entry1, trace1Entry2, trace1Entry3);
runTest(ControlFlowColumnComparators.TID_COLUMN_COMPARATOR, testVec, expectedDown, expectedUp);
}
/**
* Test {@link ControlFlowColumnComparators#PTID_COLUMN_COMPARATOR}
*/
@Test
public void ptidColumnComparatorTest() {
TimeGraphEntry trace1Entry = new TimeGraphEntry(TRACE1_NAME, TRACE_START_TIME1, TRACE_END_TIME);
TimeGraphEntry trace2Entry = new TimeGraphEntry(TRACE2_NAME, TRACE_START_TIME2, TRACE_END_TIME);
TimeGraphEntry trace3Entry = new TimeGraphEntry(TRACE3_NAME, TRACE_START_TIME3, TRACE_END_TIME);
List<TimeGraphEntry> testVec = Arrays.asList(trace1Entry, trace2Entry, trace3Entry);
List<TimeGraphEntry> expectedDown = Arrays.asList(trace1Entry, trace2Entry, trace3Entry);
List<TimeGraphEntry> expectedUp = Arrays.asList(trace1Entry, trace2Entry, trace3Entry);
runTest(ControlFlowColumnComparators.PTID_COLUMN_COMPARATOR, testVec, expectedDown, expectedUp);
TimeGraphEntry trace1Entry1 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID1, TRACE_PTID1, TRACE_START_TIME1, TRACE_END_TIME);
TimeGraphEntry trace1Entry2 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID1, TRACE_PTID2, TRACE_START_TIME1, TRACE_END_TIME);
TimeGraphEntry trace1Entry3 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID1, TRACE_PTID3, TRACE_START_TIME1, TRACE_END_TIME);
testVec = Arrays.asList(trace1Entry2, trace1Entry3, trace1Entry1);
expectedDown = Arrays.asList(trace1Entry1, trace1Entry2, trace1Entry3);
expectedUp = Arrays.asList(trace1Entry3, trace1Entry2, trace1Entry1);
runTest(ControlFlowColumnComparators.PTID_COLUMN_COMPARATOR, testVec, expectedDown, expectedUp);
}
/**
* Test {@link ControlFlowColumnComparators#PTID_COLUMN_COMPARATOR}
*
* Note, that when PTID is the same: The order for that is birth time,
* process name and TID. Note that for secondary comparators the sort
* direction is not changed.
*/
@Test
public void ptidSecondaryTimeColumnComparatorTest() {
TimeGraphEntry trace1Entry1 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID1, TRACE_PTID1, TRACE_START_TIME1, TRACE_END_TIME);
TimeGraphEntry trace1Entry2 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID1, TRACE_PTID1, TRACE_START_TIME2, TRACE_END_TIME);
TimeGraphEntry trace1Entry3 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID1, TRACE_PTID1, TRACE_START_TIME3, TRACE_END_TIME);
List<TimeGraphEntry> testVec = Arrays.asList(trace1Entry2, trace1Entry3, trace1Entry1);
List<TimeGraphEntry> expectedDown = Arrays.asList(trace1Entry1, trace1Entry2, trace1Entry3);
List<TimeGraphEntry> expectedUp = Arrays.asList(trace1Entry1, trace1Entry2, trace1Entry3);
runTest(ControlFlowColumnComparators.PTID_COLUMN_COMPARATOR, testVec, expectedDown, expectedUp);
trace1Entry1 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID1, TRACE_PTID1, TRACE_START_TIME1, TRACE_END_TIME);
trace1Entry2 = generateCFVEntry(0, TRACE_EXEC_NAME2, TRACE_TID1, TRACE_PTID1, TRACE_START_TIME1, TRACE_END_TIME);
trace1Entry3 = generateCFVEntry(0, TRACE_EXEC_NAME3, TRACE_TID1, TRACE_PTID1, TRACE_START_TIME1, TRACE_END_TIME);
testVec = Arrays.asList(trace1Entry2, trace1Entry3, trace1Entry1);
expectedDown = Arrays.asList(trace1Entry1, trace1Entry2, trace1Entry3);
expectedUp = Arrays.asList(trace1Entry1, trace1Entry2, trace1Entry3);
runTest(ControlFlowColumnComparators.PTID_COLUMN_COMPARATOR, testVec, expectedDown, expectedUp);
trace1Entry1 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID1, TRACE_PTID1, TRACE_START_TIME1, TRACE_END_TIME);
trace1Entry2 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID2, TRACE_PTID1, TRACE_START_TIME1, TRACE_END_TIME);
trace1Entry3 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID3, TRACE_PTID1, TRACE_START_TIME1, TRACE_END_TIME);
testVec = Arrays.asList(trace1Entry2, trace1Entry3, trace1Entry1);
expectedDown = Arrays.asList(trace1Entry1, trace1Entry2, trace1Entry3);
expectedUp = Arrays.asList(trace1Entry1, trace1Entry2, trace1Entry3);
runTest(ControlFlowColumnComparators.PTID_COLUMN_COMPARATOR, testVec, expectedDown, expectedUp);
}
/**
* Test {@link ControlFlowColumnComparators#BIRTH_TIME_COLUMN_COMPARATOR}
*/
@Test
public void birthTimeColumnComparatorTest() {
TimeGraphEntry trace1Entry = new TimeGraphEntry(TRACE1_NAME, TRACE_START_TIME1, TRACE_END_TIME);
TimeGraphEntry trace2Entry = new TimeGraphEntry(TRACE2_NAME, TRACE_START_TIME2, TRACE_END_TIME);
TimeGraphEntry trace3Entry = new TimeGraphEntry(TRACE3_NAME, TRACE_START_TIME3, TRACE_END_TIME);
List<TimeGraphEntry> testVec = Arrays.asList(trace1Entry, trace2Entry, trace3Entry);
List<TimeGraphEntry> expectedDown = Arrays.asList(trace1Entry, trace2Entry, trace3Entry);
List<TimeGraphEntry> expectedUp = Arrays.asList(trace3Entry, trace2Entry, trace1Entry);
runTest(ControlFlowColumnComparators.BIRTH_TIME_COLUMN_COMPARATOR, testVec, expectedDown, expectedUp);
TimeGraphEntry trace1Entry1 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID1, TRACE_PTID1, TRACE_START_TIME1, TRACE_END_TIME);
TimeGraphEntry trace1Entry2 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID1, TRACE_PTID1, TRACE_START_TIME2, TRACE_END_TIME);
TimeGraphEntry trace1Entry3 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID1, TRACE_PTID1, TRACE_START_TIME3, TRACE_END_TIME);
testVec = Arrays.asList(trace1Entry2, trace1Entry3, trace1Entry1);
expectedDown = Arrays.asList(trace1Entry1, trace1Entry2, trace1Entry3);
expectedUp = Arrays.asList(trace1Entry3, trace1Entry2, trace1Entry1);
runTest(ControlFlowColumnComparators.BIRTH_TIME_COLUMN_COMPARATOR, testVec, expectedDown, expectedUp);
}
/**
* Test {@link ControlFlowColumnComparators#BIRTH_TIME_COLUMN_COMPARATOR}
*
* Note, that when when birth time is the same: The order for that is
* process name, TID and PTID. Note that for secondary comparators the
* sort direction is not changed.
*/
@Test
public void birthTimeSecondaryTimeColumnComparatorTest() {
TimeGraphEntry trace1Entry1 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID1, TRACE_PTID1, TRACE_START_TIME1, TRACE_END_TIME);
TimeGraphEntry trace1Entry2 = generateCFVEntry(0, TRACE_EXEC_NAME2, TRACE_TID1, TRACE_PTID1, TRACE_START_TIME1, TRACE_END_TIME);
TimeGraphEntry trace1Entry3 = generateCFVEntry(0, TRACE_EXEC_NAME3, TRACE_TID1, TRACE_PTID1, TRACE_START_TIME1, TRACE_END_TIME);
List<TimeGraphEntry> testVec = Arrays.asList(trace1Entry2, trace1Entry3, trace1Entry1);
List<TimeGraphEntry> expectedDown = Arrays.asList(trace1Entry1, trace1Entry2, trace1Entry3);
List<TimeGraphEntry> expectedUp = Arrays.asList(trace1Entry1, trace1Entry2, trace1Entry3);
runTest(ControlFlowColumnComparators.BIRTH_TIME_COLUMN_COMPARATOR, testVec, expectedDown, expectedUp);
trace1Entry1 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID1, TRACE_PTID1, TRACE_START_TIME1, TRACE_END_TIME);
trace1Entry2 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID2, TRACE_PTID1, TRACE_START_TIME1, TRACE_END_TIME);
trace1Entry3 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID2, TRACE_PTID1, TRACE_START_TIME1, TRACE_END_TIME);
testVec = Arrays.asList(trace1Entry2, trace1Entry3, trace1Entry1);
expectedDown = Arrays.asList(trace1Entry1, trace1Entry2, trace1Entry3);
expectedUp = Arrays.asList(trace1Entry1, trace1Entry2, trace1Entry3);
runTest(ControlFlowColumnComparators.BIRTH_TIME_COLUMN_COMPARATOR, testVec, expectedDown, expectedUp);
trace1Entry1 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID1, TRACE_PTID1, TRACE_START_TIME1, TRACE_END_TIME);
trace1Entry2 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID1, TRACE_PTID2, TRACE_START_TIME1, TRACE_END_TIME);
trace1Entry3 = generateCFVEntry(0, TRACE_EXEC_NAME1, TRACE_TID1, TRACE_PTID3, TRACE_START_TIME1, TRACE_END_TIME);
testVec = Arrays.asList(trace1Entry2, trace1Entry3, trace1Entry1);
expectedDown = Arrays.asList(trace1Entry1, trace1Entry2, trace1Entry3);
expectedUp = Arrays.asList(trace1Entry1, trace1Entry2, trace1Entry3);
runTest(ControlFlowColumnComparators.BIRTH_TIME_COLUMN_COMPARATOR, testVec, expectedDown, expectedUp);
}
private static void runTest(ITimeGraphEntryComparator comparator, List<TimeGraphEntry> testVec, List<TimeGraphEntry> expectedDown, List<TimeGraphEntry> expectedUp) {
comparator.setDirection(SWT.DOWN);
Collections.sort(testVec, comparator);
assertEquals(expectedDown, testVec);
comparator.setDirection(SWT.UP);
Comparator<ITimeGraphEntry> reverseComp = comparator;
reverseComp = Collections.reverseOrder(reverseComp);
Collections.sort(testVec, reverseComp);
assertEquals(expectedUp, testVec);
}
}