blob: 19216b3503d20f73e0031d0d7ac4f3905115b11b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016, 2018 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
*
* Contributors:
* Matthew Khouzam - Initial API and implementation
*******************************************************************************/
package org.eclipse.tracecompass.analysis.os.linux.ui.swtbot.tests.latency;
import static org.eclipse.swtbot.swt.finder.SWTBotAssert.assertVisible;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.IOException;
import java.lang.reflect.Field;
import org.apache.commons.io.FileUtils;
import org.apache.log4j.ConsoleAppender;
import org.apache.log4j.Logger;
import org.apache.log4j.SimpleLayout;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot;
import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotView;
import org.eclipse.swtbot.swt.finder.exceptions.WidgetNotFoundException;
import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
import org.eclipse.swtbot.swt.finder.junit.SWTBotJunit4ClassRunner;
import org.eclipse.swtbot.swt.finder.matchers.WidgetOfType;
import org.eclipse.swtbot.swt.finder.results.Result;
import org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences;
import org.eclipse.swtbot.swt.finder.widgets.AbstractSWTBotControl;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotTable;
import org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore.density.AbstractSegmentStoreDensityView;
import org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore.table.AbstractSegmentStoreTableViewer;
import org.eclipse.tracecompass.internal.analysis.os.linux.ui.views.latency.SystemCallLatencyDensityView;
import org.eclipse.tracecompass.testtraces.ctf.CtfTestTrace;
import org.eclipse.tracecompass.tmf.ui.swtbot.tests.shared.ConditionHelpers;
import org.eclipse.tracecompass.tmf.ui.swtbot.tests.shared.SWTBotUtils;
import org.eclipse.tracecompass.tmf.ui.tests.shared.WaitUtils;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IViewReference;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.swtchart.Chart;
import org.swtchart.Range;
/**
* Tests of the density view
*
* @author Matthew Khouzam
*/
@RunWith(SWTBotJunit4ClassRunner.class)
public class SystemCallLatencyDensityViewTest {
private static final String TRACE_TYPE = "org.eclipse.linuxtools.lttng2.kernel.tracetype";
private static final String PROJECT_NAME = "test";
private static final String VIEW_ID = SystemCallLatencyDensityView.ID;
/** The Log4j logger instance. */
private static final Logger fLogger = Logger.getRootLogger();
private AbstractSegmentStoreDensityView fDensityView;
private AbstractSegmentStoreTableViewer fDensityViewer;
private Chart fDensityChart;
private static SWTWorkbenchBot fBot;
/**
* Things to setup
*/
@BeforeClass
public static void beforeClass() {
SWTBotUtils.initialize();
Thread.currentThread().setName("SWTBotTest");
/* set up for swtbot */
SWTBotPreferences.TIMEOUT = 20000; /* 20 second timeout */
SWTBotPreferences.KEYBOARD_LAYOUT = "EN_US";
fLogger.removeAllAppenders();
fLogger.addAppender(new ConsoleAppender(new SimpleLayout(), ConsoleAppender.SYSTEM_OUT));
fBot = new SWTWorkbenchBot();
/* Finish waiting for eclipse to load */
WaitUtils.waitForJobs();
}
/**
* Clean up
*/
@AfterClass
public static void afterClass() {
fLogger.removeAllAppenders();
}
/**
* Opens a latency table
*
* @throws SecurityException
* If a security manager is present and any the wrong class is
* loaded or the class loader is not the same as its ancestor's
* loader.
*
* @throws NoSuchFieldException
* Field not available
* @throws IllegalAccessException
* Field is inaccessible
* @throws IllegalArgumentException
* the object is not the correct class type
*
*
*/
@Before
public void createDensityViewer() throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
/*
* Open latency view
*/
SWTBotUtils.openView(VIEW_ID);
SWTBotView viewBot = fBot.viewById(VIEW_ID);
final IViewReference viewReference = viewBot.getViewReference();
IViewPart viewPart = UIThreadRunnable.syncExec(new Result<IViewPart>() {
@Override
public IViewPart run() {
return viewReference.getView(true);
}
});
assertNotNull(viewPart);
if (!(viewPart instanceof SystemCallLatencyDensityView)) {
fail("Could not instanciate view");
}
fDensityView = (SystemCallLatencyDensityView) viewPart;
/*
* Use reflection to access the table viewer
*/
final Field field = AbstractSegmentStoreDensityView.class.getDeclaredField("fTableViewer");
field.setAccessible(true);
fDensityViewer = (AbstractSegmentStoreTableViewer) field.get(fDensityView);
fDensityChart = viewBot.bot().widget(WidgetOfType.widgetOfType(Chart.class));
assertNotNull(fDensityViewer);
}
/**
* Closes the view
*/
@After
public void closeDensityViewer() {
SWTBotUtils.closeViewById(VIEW_ID, fBot);
}
/**
* Test with an actual trace, this is more of an integration test than a
* unit test. This test is a slow one too. If some analyses are not well
* configured, this test will also generates null pointer exceptions. These
* will be logged.
*
* @throws IOException
* trace not found?
* @throws SecurityException
* If a security manager is present and any the wrong class is
* loaded or the class loader is not the same as its ancestor's
* loader.
*
* @throws NoSuchFieldException
* Field not available
* @throws IllegalAccessException
* Field is inaccessible
* @throws IllegalArgumentException
* the object is not the correct class type
*
*/
@Test
public void testWithTrace() throws IOException, NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
String tracePath = FileUtils.toFile(FileLocator.toFileURL(CtfTestTrace.ARM_64_BIT_HEADER.getTraceURL())).getAbsolutePath();
SWTWorkbenchBot bot = new SWTWorkbenchBot();
SWTBotUtils.closeViewById(VIEW_ID, fBot);
SWTBotUtils.createProject(PROJECT_NAME);
SWTBotUtils.openTrace(PROJECT_NAME, tracePath, TRACE_TYPE);
WaitUtils.waitForJobs();
createDensityViewer();
WaitUtils.waitForJobs();
SWTBotTable tableBot = new SWTBotTable(fDensityViewer.getTableViewer().getTable());
bot.waitUntil(ConditionHelpers.isTableCellFilled(tableBot, "1,600", 0, 2));
tableBot.header("Duration").click();
bot.waitUntil(ConditionHelpers.isTableCellFilled(tableBot, "1,600", 0, 2));
tableBot.header("Duration").click();
bot.waitUntil(ConditionHelpers.isTableCellFilled(tableBot, "1,001,046,400", 0, 2));
final Chart densityChart = fDensityChart;
assertNotNull(densityChart);
bot.waitUntil(ConditionHelpers.numberOfSeries(densityChart, 1));
SWTBotChart chartBot = new SWTBotChart(densityChart);
assertVisible(chartBot);
assertEquals("", chartBot.getToolTipText());
final Range range = densityChart.getAxisSet().getXAxes()[0].getRange();
assertTrue(0 > range.lower);
assertTrue(1001046400 < range.upper);
bot.closeAllEditors();
SWTBotUtils.deleteProject(PROJECT_NAME, bot);
}
private static class SWTBotChart extends AbstractSWTBotControl<Chart> {
public SWTBotChart(Chart w) throws WidgetNotFoundException {
super(w);
}
}
}