/*******************************************************************************
* Copyright (c) 2013 Red Hat, Inc.
* 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
*
* Contributors:
* Camilo Bernal <cabernal@redhat.com> - Initial Implementation.
*******************************************************************************/
package org.eclipse.linuxtools.internal.perf.tests;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.linuxtools.internal.perf.StatComparisonData;
import org.eclipse.linuxtools.internal.perf.model.PMStatEntry;
import org.junit.Before;
import org.junit.Test;
public class StatsComparisonTest {
private PMStatEntry statEntry;
private PMStatEntry statEntry2;
private PMStatEntry statEntry3;
private PMStatEntry statEntry4;
private static final String STAT_RES = "resources/stat-data/";
@Before
public void setUp() {
String event = "event";
String units = "unit";
float samples = 1;
float metrics = 2;
float deviation = 3;
float scaling = 4;
statEntry = new PMStatEntry(samples, event, metrics, units, deviation,
scaling);
statEntry2 = new PMStatEntry(samples, event, metrics, units, deviation,
scaling);
statEntry3 = new PMStatEntry(samples++, event, metrics++, units,
deviation++, scaling);
statEntry4 = new PMStatEntry(samples--, "event2", metrics--, units,
deviation--, scaling);
}
@Test
public void testPMStatEntryGetters() {
assertEquals("event", statEntry.getEvent());
assertEquals("unit", statEntry.getUnits());
assertEquals(1, statEntry.getSamples(), 0);
assertEquals(2, statEntry.getMetrics(), 0);
assertEquals(3, statEntry.getDeviation(), 0);
assertEquals(4, statEntry.getScaling(), 0);
}
@Test
public void testPMStatEntryEquality() {
assertTrue(statEntry.equalEvents(statEntry3));
assertFalse(statEntry.equalEvents(statEntry4));
assertTrue(statEntry.equals(statEntry2));
}
@Test
public void testPMStatEntryArray() {
String[] expectedList = new String[] {
String.valueOf(statEntry.getSamples()), statEntry.getEvent(),
String.valueOf(statEntry.getFormattedMetrics()), statEntry.getUnits(),
String.valueOf(statEntry.getFormattedDeviation()) };
String[] actualList = statEntry.toStringArray();
// test string array representation
assertArrayEquals(expectedList, actualList);
}
@Test
public void testPMStatEntryComparison() {
String expectedEvent = "event";
String expectedUnits = "unit";
float expectedSamples = statEntry.getSamples() - statEntry2.getSamples();
float expectedMetrics = statEntry.getMetrics() - statEntry2.getMetrics();
float expectedDeviation = statEntry.getDeviation() + statEntry2.getDeviation();
float expectedScaling = statEntry.getScaling() + statEntry2.getScaling();
PMStatEntry expectedDiff = new PMStatEntry(expectedSamples,
expectedEvent, expectedMetrics, expectedUnits,
expectedDeviation, expectedScaling);
PMStatEntry actualDiff = statEntry.compare(statEntry2);
// test stat entry comparison
assertEquals(expectedDiff,actualDiff);
}
@Test
public void testStatDataComparisonFieldGetters() {
IPath oldStatData = Path.fromOSString(STAT_RES + "perf_old.stat");
IPath newStatData = Path.fromOSString(STAT_RES + "perf_new.stat");
String dataTitle = "title";
StatComparisonData diffData = new StatComparisonData(dataTitle,
oldStatData, newStatData);
assertEquals(dataTitle, diffData.getTitle());
assertEquals("", diffData.getPerfData());
assertNotNull(diffData.getDataID());
assertEquals(oldStatData.toOSString(), diffData.getOldDataPath());
assertEquals(newStatData.toOSString(), diffData.getNewDataPath());
assertEquals(oldStatData.toOSString() + diffData.getDataID(),diffData.getOldDataID());
assertEquals(newStatData.toOSString() + diffData.getDataID(),diffData.getNewDataID());
}
@Test
public void testStatDataComparison() {
IPath oldStatData = Path.fromOSString(STAT_RES + "perf_old.stat");
IPath newStatData = Path.fromOSString(STAT_RES + "perf_new.stat");
StatComparisonData diffData = new StatComparisonData("title",
oldStatData, newStatData);
// expected comparison list
ArrayList<PMStatEntry> expectedDiff = new ArrayList<>();
expectedDiff.add(new PMStatEntry((float) -4.0, "cpu-clock",
(float) 0.0, null, (float) 0.54, (float) 0.0));
expectedDiff.add(new PMStatEntry((float) -2000.0, "page-faults",
(float) -0.31, "M/sec", (float) 0.02, (float) 0.0));
expectedDiff.add(new PMStatEntry((float) 0.0, "context-switches",
(float) -0.13, "K/sec", (float) 36.34, (float) 0.0));
expectedDiff.add(new PMStatEntry((float) -1000.0, "minor-faults",
(float) -0.3, "M/sec", (float) 0.02, (float) 0.0));
expectedDiff.add(new PMStatEntry((float) 0.0, "major-faults",
(float) 0.0, "K/sec", (float) 0.0, (float) 0.0));
expectedDiff.add(new PMStatEntry((float) -0.008,
"seconds time elapsed", (float) 0.0, null, (float) 0.92,
(float) 0.0));
ArrayList<PMStatEntry> actualDiff = diffData.getComparisonStats();
assertFalse(actualDiff.isEmpty());
for (PMStatEntry expectedEntry : expectedDiff) {
assertTrue(actualDiff.contains(expectedEntry));
}
}
@Test
public void testStatComparisonResult() throws IOException {
IPath oldStatData = Path.fromOSString(STAT_RES + "perf_old.stat");
IPath newStatData = Path.fromOSString(STAT_RES + "perf_new.stat");
IPath diffStatData = Path.fromOSString(STAT_RES + "perf_diff.stat");
try (BufferedReader diffDataReader = new BufferedReader(new FileReader(
diffStatData.toFile()))) {
StatComparisonData diffData = new StatComparisonData("title",
oldStatData, newStatData);
diffData.runComparison();
String actualResult = diffData.getPerfData();
String[] actualResultLines = actualResult.split("\n");
String curLine;
for (int i = 0; i < actualResultLines.length; i++) {
curLine = diffDataReader.readLine();
/**
* Elapsed seconds are usually very close to zero, and thus
* prone to some small formatting differences across systems.
* Total time entry items are checked more thoroughly to avoid
* test failures.
*/
if (curLine.contains(PMStatEntry.TIME)) {
String expectedEntry = curLine.trim();
String actualEntry = actualResultLines[i].trim();
String expectedSamples = expectedEntry.substring(0,
expectedEntry.indexOf(" "));
String expectedRest = expectedEntry.substring(expectedEntry
.indexOf(" ") + 1);
String actualSamples = actualEntry.substring(0,
actualEntry.indexOf(" "));
String actualRest = actualEntry.substring(actualEntry
.indexOf(" ") + 1);
assertEquals(StatComparisonData.toFloat(actualSamples),
StatComparisonData.toFloat(expectedSamples), 0);
assertEquals(actualRest, expectedRest);
} else {
assertEquals(actualResultLines[i], curLine);
}
}
}
}
}