timing: Have the segment store view use lazy iterables
[deliverable/tracecompass.git] / analysis / org.eclipse.tracecompass.analysis.timing.ui.swtbot.tests / src / org / eclipse / tracecompass / analysis / timing / ui / swtbot / tests / callgraph / CallGraphDensityViewTest.java
CommitLineData
b1d4e193
MK
1/*******************************************************************************
2 * Copyright (c) 2016 Ericsson
3 *
4 * All rights reserved. This program and the accompanying materials are made
5 * available under the terms of the Eclipse Public License v1.0 which
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
8 *******************************************************************************/
9
10package org.eclipse.tracecompass.analysis.timing.ui.swtbot.tests.callgraph;
11
12import static org.junit.Assert.assertEquals;
13import static org.junit.Assert.assertNotNull;
14import static org.junit.Assert.assertTrue;
15import static org.junit.Assert.fail;
16
17import java.util.List;
18import java.util.concurrent.CountDownLatch;
19import java.util.concurrent.TimeUnit;
20
21import org.apache.log4j.ConsoleAppender;
22import org.apache.log4j.Logger;
23import org.apache.log4j.SimpleLayout;
24import org.eclipse.jdt.annotation.NonNull;
25import org.eclipse.jdt.annotation.Nullable;
26import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot;
27import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotView;
28import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable;
1ee63dfc 29import org.eclipse.swtbot.swt.finder.junit.SWTBotJunit4ClassRunner;
b1d4e193
MK
30import org.eclipse.swtbot.swt.finder.results.Result;
31import org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences;
32import org.eclipse.swtbot.swt.finder.widgets.SWTBotCanvas;
33import org.eclipse.swtbot.swt.finder.widgets.SWTBotTable;
34import org.eclipse.tracecompass.analysis.timing.core.segmentstore.ISegmentStoreProvider;
edcd1f39
GB
35import org.eclipse.tracecompass.analysis.timing.core.statistics.IStatistics;
36import org.eclipse.tracecompass.analysis.timing.core.statistics.Statistics;
b1d4e193
MK
37import org.eclipse.tracecompass.analysis.timing.core.tests.flamegraph.AggregationTreeTest;
38import org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore.density.AbstractSegmentStoreDensityViewer;
39import org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore.density.ISegmentStoreDensityViewerDataListener;
40import org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore.table.AbstractSegmentStoreTableViewer;
41import org.eclipse.tracecompass.internal.analysis.timing.ui.callgraph.CallGraphDensityView;
b1d4e193
MK
42import org.eclipse.tracecompass.segmentstore.core.ISegment;
43import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimeRange;
44import org.eclipse.tracecompass.tmf.ui.swtbot.tests.shared.SWTBotUtils;
45import org.eclipse.tracecompass.tmf.ui.tests.shared.WaitUtils;
46import org.eclipse.ui.IViewPart;
47import org.junit.After;
48import org.junit.Assert;
49import org.junit.Before;
50import org.junit.BeforeClass;
1ee63dfc 51import org.junit.runner.RunWith;
b1d4e193
MK
52import org.swtchart.ISeries;
53
54/**
55 * Test the call graph density view, known as the Function Density view. The
56 * density view can change its data with respect to screen resolution, so
57 * descriptive statistics are used to check validity. This is one of the rare
58 * occasions that the error in the
59 * {@link Assert#assertEquals(double, double, double)} is actually quite useful
60 *
61 * @author Matthew Khouzam
62 */
1ee63dfc 63@RunWith(SWTBotJunit4ClassRunner.class)
b1d4e193
MK
64public class CallGraphDensityViewTest extends AggregationTreeTest {
65
66 private static final String CALLGRAPHDENSITY_ID = CallGraphDensityView.ID;
67
68 private final @NonNull ISegmentStoreDensityViewerDataListener fSyncListener = new ISegmentStoreDensityViewerDataListener() {
fc409c43 69 @Deprecated
b1d4e193
MK
70 @Override
71 public void dataChanged(List<ISegment> newData) {
72 fLatch.countDown();
73 }
74
fc409c43 75 @Deprecated
b1d4e193
MK
76 @Override
77 public void dataSelectionChanged(@Nullable List<@NonNull ISegment> newSelectionData) {
78 // do nothing
79 }
80
fc409c43
GB
81 @Override
82 public void viewDataChanged(@NonNull Iterable<? extends @NonNull ISegment> newData) {
83 fLatch.countDown();
84 }
85
86 @Override
87 public void selectedDataChanged(@Nullable Iterable<? extends @NonNull ISegment> newSelectionData) {
88 // do nothing
89 }
90
b1d4e193
MK
91 };
92 private SWTWorkbenchBot fBot;
93 private SWTBotView fView;
94 private CallGraphDensityView fFuncDensityView;
95 private SWTBotTable fTableBot;
96 private SWTBotCanvas fDensityBot;
97 private AbstractSegmentStoreDensityViewer fDensityViewer;
98 private AbstractSegmentStoreTableViewer fTableViewer;
99 private CountDownLatch fLatch;
100
101 /** The Log4j logger instance. */
102 private static final Logger fLogger = Logger.getRootLogger();
103
104 /**
105 * Initialization
106 */
107 @BeforeClass
108 public static void beforeClass() {
109
110 SWTBotUtils.initialize();
111 Thread.currentThread().setName("SWTBotTest");
112 /* set up for swtbot */
113 SWTBotPreferences.TIMEOUT = 20000; /* 20 second timeout */
114 SWTBotPreferences.KEYBOARD_LAYOUT = "EN_US";
115 fLogger.removeAllAppenders();
116 fLogger.addAppender(new ConsoleAppender(new SimpleLayout(), ConsoleAppender.SYSTEM_OUT));
117 SWTWorkbenchBot bot = new SWTWorkbenchBot();
118 SWTBotUtils.closeView("welcome", bot);
119 /* Switch perspectives */
120 SWTBotUtils.switchToTracingPerspective();
121 /* Finish waiting for eclipse to load */
122 WaitUtils.waitForJobs();
123 }
124
125 /**
126 * Setup for the test
127 */
128 @Before
129 public void before() {
130 fBot = new SWTWorkbenchBot();
131 SWTBotUtils.openView(CALLGRAPHDENSITY_ID);
132 SWTBotView view = fBot.viewById(CALLGRAPHDENSITY_ID);
133 assertNotNull(view);
134 fView = view;
135 CallGraphDensityView funcDensityView = UIThreadRunnable.syncExec((Result<CallGraphDensityView>) () -> {
136 IViewPart viewRef = fView.getViewReference().getView(true);
137 return (viewRef instanceof CallGraphDensityView) ? (CallGraphDensityView) viewRef : null;
138 });
139 assertNotNull(funcDensityView);
140 fTableBot = fView.bot().table();
141 assertNotNull(fTableBot);
142 fDensityBot = fView.bot().canvas();
143 assertNotNull(fDensityBot);
144 fDensityViewer = funcDensityView.getDensityViewer();
145 assertNotNull(fDensityViewer);
146 fLatch = new CountDownLatch(1);
147 fDensityViewer.removeDataListener(fSyncListener);
148 fDensityViewer.addDataListener(fSyncListener);
149 fTableViewer = funcDensityView.getTableViewer();
150 assertNotNull(fTableViewer);
151 SWTBotUtils.maximize(funcDensityView);
152 fFuncDensityView = funcDensityView;
153 }
154
155 /**
156 * Reset
157 */
158 @After
159 public void after() {
160 CallGraphDensityView funcDensityView = fFuncDensityView;
161 assertNotNull(funcDensityView);
162 SWTBotUtils.maximize(funcDensityView);
163
164 }
165
166 @Override
167 public void emptyStateSystemTest() {
168 super.emptyStateSystemTest();
169 loadData();
170 assertEquals(0, fTableBot.rowCount());
171 ISeries series = getSeries();
172 assertNotNull(series);
173 }
174
175 @Override
176 public void cascadeTest() {
177 super.cascadeTest();
178 loadData();
179 assertEquals(3, fTableBot.rowCount());
180 ISeries series = getSeries();
edcd1f39 181 IStatistics<@NonNull Long> sss = getDescriptiveStatistics(series);
b1d4e193 182 assertEquals(3.0, sss.getTotal(), 0.0);
edcd1f39 183 assertEquals(0.02, sss.getMean(), 0.02); // low mean
b1d4e193
MK
184 }
185
186 @Override
187 public void mergeFirstLevelCalleesTest() {
188 super.mergeFirstLevelCalleesTest();
189 loadData();
190 assertEquals(5, fTableBot.rowCount());
191 ISeries series = getSeries();
edcd1f39 192 IStatistics<@NonNull Long> sss = getDescriptiveStatistics(series);
b1d4e193 193 assertEquals(5.0, sss.getTotal(), 0.0);
edcd1f39 194 assertEquals(0.02, sss.getMean(), 0.03); // low mean
b1d4e193
MK
195 }
196
197 @Override
198 public void multiFunctionRootsSecondTest() {
199 super.multiFunctionRootsSecondTest();
200 loadData();
201 assertEquals(4, fTableBot.rowCount());
202 ISeries series = getSeries();
edcd1f39 203 IStatistics<@NonNull Long> sss = getDescriptiveStatistics(series);
b1d4e193 204 assertEquals(4.0, sss.getTotal(), 0.0);
edcd1f39 205 assertEquals(0.02, sss.getMean(), 0.02); // low mean
b1d4e193
MK
206 }
207
208 @Override
209 public void mergeSecondLevelCalleesTest() {
210 super.mergeSecondLevelCalleesTest();
211 loadData();
212 assertEquals(8, fTableBot.rowCount());
213 ISeries series = getSeries();
214 double[] ySeries = series.getYSeries();
215 assertNotNull(ySeries);
edcd1f39 216 IStatistics<@NonNull Long> sss = getDescriptiveStatistics(series);
b1d4e193 217 assertEquals(8.0, sss.getTotal(), 0.0);
edcd1f39 218 assertEquals(0.06, sss.getMean(), 0.02); // average mean
b1d4e193
MK
219 }
220
221 @Override
222 public void multiFunctionRootsTest() {
223 super.multiFunctionRootsTest();
224 loadData();
225 assertEquals(4, fTableBot.rowCount());
226 ISeries series = getSeries();
227 double[] ySeries = series.getYSeries();
228 assertNotNull(ySeries);
edcd1f39 229 IStatistics<@NonNull Long> sss = getDescriptiveStatistics(series);
b1d4e193 230 assertEquals(4.0, sss.getTotal(), 0.0);
edcd1f39 231 assertEquals(0.02, sss.getMean(), 0.02); // low mean
b1d4e193
MK
232 }
233
234 @Override
235 public void treeTest() {
236 super.treeTest();
237 loadData();
238 assertEquals(4, fTableBot.rowCount());
239 ISeries series = getSeries();
240 double[] ySeries = series.getYSeries();
241 assertNotNull(ySeries);
edcd1f39 242 IStatistics<@NonNull Long> sss = getDescriptiveStatistics(series);
b1d4e193 243 assertEquals(4.0, sss.getTotal(), 0.0);
edcd1f39 244 assertEquals(0.02, sss.getMean(), 0.02); // low mean
b1d4e193
MK
245 }
246
247 @Override
248 public void largeTest() {
249 super.largeTest();
250 loadData();
251 assertEquals(1000, fTableBot.rowCount());
252 ISeries series = getSeries();
253 double[] ySeries = series.getYSeries();
254 assertNotNull(ySeries);
edcd1f39 255 IStatistics<@NonNull Long> sss = getDescriptiveStatistics(series);
b1d4e193 256 assertEquals(1000.0, sss.getTotal(), 0.0);
edcd1f39 257 assertEquals(8, sss.getMean(), 1); // high mean
b1d4e193
MK
258 }
259
260 private ISeries getSeries() {
261 AbstractSegmentStoreDensityViewer densityViewer = fDensityViewer;
262 assertNotNull(densityViewer);
263 ISeries[] serieses = densityViewer.getControl().getSeriesSet().getSeries();
264 assertNotNull(serieses);
265 assertTrue(serieses.length > 0);
266 ISeries series = serieses[0];
267 assertNotNull(series);
268 return series;
269 }
270
271 private void loadData() {
272 final ISegmentStoreProvider cga = getCga();
273 UIThreadRunnable.syncExec(() -> {
274 fTableViewer.setData(cga);
275 fDensityViewer.setSegmentProvider(cga);
276 fDensityViewer.updateWithRange(TmfTimeRange.ETERNITY);
277 fDensityViewer.refresh();
278 });
279 if (cga != null) {
280 try {
281 /*
282 * timeout of the test
283 */
284 assertTrue(fLatch.await(20, TimeUnit.SECONDS));
285 } catch (InterruptedException e) {
286 fail(e.getMessage());
287 }
288 }
289
290 }
291
edcd1f39 292 private static IStatistics<@NonNull Long> getDescriptiveStatistics(ISeries series) {
b1d4e193
MK
293 double[] ySeries = series.getYSeries();
294 assertNotNull(ySeries);
edcd1f39 295 IStatistics<@NonNull Long> stats = new Statistics<>();
b1d4e193 296 for (double item : ySeries) {
edcd1f39 297 stats.update((long) (item - 1.0));
b1d4e193 298 }
edcd1f39 299 return stats;
b1d4e193
MK
300 }
301
302}
This page took 0.039245 seconds and 5 git commands to generate.