--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2016 Ericsson
+ *
+ * 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.analysis.os.linux.ui.swtbot.tests.memoryusage;
+
+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.util.DoubleSummaryStatistics;
+
+import org.apache.log4j.ConsoleAppender;
+import org.apache.log4j.Logger;
+import org.apache.log4j.SimpleLayout;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.jdt.annotation.NonNull;
+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.tracecompass.internal.analysis.os.linux.ui.views.kernelmemoryusage.KernelMemoryUsageView;
+import org.eclipse.tracecompass.testtraces.ctf.CtfTestTrace;
+import org.eclipse.tracecompass.tmf.core.signal.TmfSignalManager;
+import org.eclipse.tracecompass.tmf.core.signal.TmfWindowRangeUpdatedSignal;
+import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimeRange;
+import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimestamp;
+import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager;
+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.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.swtchart.Chart;
+import org.swtchart.ILineSeries;
+import org.swtchart.ISeries;
+import org.swtchart.ISeriesSet;
+import org.swtchart.Range;
+
+/**
+ * Test for the kernel memory usage view
+ *
+ * @author Matthew Khouzam
+ */
+@RunWith(SWTBotJunit4ClassRunner.class)
+public class KernelMemoryUsageTest {
+
+ 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 = KernelMemoryUsageView.ID;
+
+ /** The Log4j logger instance. */
+ private static final Logger fLogger = Logger.getRootLogger();
+ private Chart fChart;
+ private KernelMemoryUsageView fKernelMemoryUsageView = null;
+
+ /**
+ * 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));
+ SWTWorkbenchBot bot = new SWTWorkbenchBot();
+ SWTBotUtils.closeView("welcome", bot);
+ /* Switch perspectives */
+ SWTBotUtils.switchToTracingPerspective();
+ /* Finish waiting for eclipse to load */
+ WaitUtils.waitForJobs();
+
+ }
+
+ /**
+ * Opens a line chart
+ *
+ * @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 IllegalArgumentException
+ * the object is not the correct class type
+ */
+ @Before
+ public void setupView() throws SecurityException, IllegalArgumentException {
+ SWTBotUtils.openView(VIEW_ID);
+ SWTWorkbenchBot bot = new SWTWorkbenchBot();
+ SWTBotView viewBot = bot.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 KernelMemoryUsageView)) {
+ fail("Could not instanciate view");
+ }
+ fKernelMemoryUsageView = (KernelMemoryUsageView) viewPart;
+ fChart = viewBot.bot().widget(WidgetOfType.widgetOfType(Chart.class));
+ assertNotNull(fChart);
+ }
+
+ /**
+ * Closes the view
+ */
+ @After
+ public void closeView() {
+ final SWTWorkbenchBot swtWorkbenchBot = new SWTWorkbenchBot();
+ SWTBotView viewBot = swtWorkbenchBot.viewById(VIEW_ID);
+ viewBot.close();
+ }
+
+ /**
+ * 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 IllegalArgumentException
+ * the object is not the correct class type
+ */
+ @Test
+ public void testWithTrace() throws IOException, SecurityException, IllegalArgumentException {
+
+ // create a project and open the view
+ String tracePath = FileLocator.toFileURL(CtfTestTrace.ARM_64_BIT_HEADER.getTraceURL()).getPath();
+ // Update the time range to a range where there is no data intersecting
+ // the bounds
+ long rangeStart = 1412670961274443542L;
+ long rangeEnd = 1412670961298823940L;
+ SWTWorkbenchBot bot = new SWTWorkbenchBot();
+ SWTBotView view = bot.viewById(VIEW_ID);
+ view.close();
+ bot.waitUntil(ConditionHelpers.ViewIsClosed(view));
+ SWTBotUtils.createProject(PROJECT_NAME);
+ SWTBotUtils.openTrace(PROJECT_NAME, tracePath, TRACE_TYPE);
+ WaitUtils.waitForJobs();
+ setupView();
+ WaitUtils.waitForJobs();
+
+ final Chart chart = fChart;
+ assertNotNull(chart);
+ bot.waitUntil(ConditionHelpers.numberOfSeries(chart, 1));
+
+ // test the initial state of the newly opened view
+ SWTBotChart chartBot = new SWTBotChart(chart);
+ assertVisible(chartBot);
+ assertEquals("", chartBot.getToolTipText());
+ @NonNull
+ TmfTimeRange traceWindowRange = TmfTraceManager.getInstance().getCurrentTraceContext().getWindowRange();
+ assertEquals("Unexpected trace window range", 100000000, traceWindowRange.getEndTime().getValue() - traceWindowRange.getStartTime().getValue());
+ Range range = chart.getAxisSet().getXAxes()[0].getRange();
+ assertEquals("Unexpected X-axis range", 100000000, range.upper - range.lower, 0);
+ ISeriesSet seriesSet = fChart.getSeriesSet();
+ assertNotNull(seriesSet);
+ ISeries[] series = seriesSet.getSeries();
+ assertNotNull(series);
+
+ TmfTimeRange windowRange = new TmfTimeRange(TmfTimestamp.fromNanos(rangeStart), TmfTimestamp.fromNanos(rangeEnd));
+ TmfSignalManager.dispatchSignal(new TmfWindowRangeUpdatedSignal(this, windowRange));
+
+ bot.waitUntil(ConditionHelpers.xyViewerIsReadyCondition(fKernelMemoryUsageView.getChartViewer()));
+
+ range = chart.getAxisSet().getXAxes()[0].getRange();
+ assertEquals(rangeEnd - rangeStart, range.upper - range.lower, 0);
+
+ // Test the data in the chart
+
+ // Verify that the chart has 1 series
+ assertEquals(1, series.length);
+ // Verify that each series is a ILineSeries
+ for (int i = 0; i < series.length; i++) {
+ assertTrue(series[i] instanceof ILineSeries);
+ }
+ // Verify the data with statistical data
+ DoubleSummaryStatistics stats = new DoubleSummaryStatistics();
+ for (double data : series[0].getYSeries()) {
+ stats.accept(data);
+ }
+ assertEquals(839684, stats.getMin(), 1.0);
+ assertEquals(929796, stats.getMax(), 1.0);
+ // average can have some variance depending on sampling
+ assertEquals(870849.823129, stats.getAverage(), 1000.0);
+ bot.closeAllEditors();
+ SWTBotUtils.deleteProject(PROJECT_NAME, bot);
+ }
+
+ private static class SWTBotChart extends AbstractSWTBotControl<Chart> {
+ public SWTBotChart(Chart w) throws WidgetNotFoundException {
+ super(w);
+ }
+ }
+
+}