Commit | Line | Data |
---|---|---|
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 | ||
10 | package org.eclipse.tracecompass.analysis.timing.ui.swtbot.tests.callgraph; | |
11 | ||
12 | import static org.junit.Assert.assertEquals; | |
13 | import static org.junit.Assert.assertNotNull; | |
14 | import static org.junit.Assert.assertTrue; | |
15 | import static org.junit.Assert.fail; | |
16 | ||
17 | import java.util.List; | |
18 | import java.util.concurrent.CountDownLatch; | |
19 | import java.util.concurrent.TimeUnit; | |
20 | ||
21 | import org.apache.log4j.ConsoleAppender; | |
22 | import org.apache.log4j.Logger; | |
23 | import org.apache.log4j.SimpleLayout; | |
24 | import org.eclipse.jdt.annotation.NonNull; | |
25 | import org.eclipse.jdt.annotation.Nullable; | |
26 | import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot; | |
27 | import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotView; | |
28 | import org.eclipse.swtbot.swt.finder.finders.UIThreadRunnable; | |
1ee63dfc | 29 | import org.eclipse.swtbot.swt.finder.junit.SWTBotJunit4ClassRunner; |
b1d4e193 MK |
30 | import org.eclipse.swtbot.swt.finder.results.Result; |
31 | import org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences; | |
32 | import org.eclipse.swtbot.swt.finder.widgets.SWTBotCanvas; | |
33 | import org.eclipse.swtbot.swt.finder.widgets.SWTBotTable; | |
34 | import org.eclipse.tracecompass.analysis.timing.core.segmentstore.ISegmentStoreProvider; | |
edcd1f39 GB |
35 | import org.eclipse.tracecompass.analysis.timing.core.statistics.IStatistics; |
36 | import org.eclipse.tracecompass.analysis.timing.core.statistics.Statistics; | |
b1d4e193 MK |
37 | import org.eclipse.tracecompass.analysis.timing.core.tests.flamegraph.AggregationTreeTest; |
38 | import org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore.density.AbstractSegmentStoreDensityViewer; | |
39 | import org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore.density.ISegmentStoreDensityViewerDataListener; | |
40 | import org.eclipse.tracecompass.analysis.timing.ui.views.segmentstore.table.AbstractSegmentStoreTableViewer; | |
41 | import org.eclipse.tracecompass.internal.analysis.timing.ui.callgraph.CallGraphDensityView; | |
b1d4e193 MK |
42 | import org.eclipse.tracecompass.segmentstore.core.ISegment; |
43 | import org.eclipse.tracecompass.tmf.core.timestamp.TmfTimeRange; | |
44 | import org.eclipse.tracecompass.tmf.ui.swtbot.tests.shared.SWTBotUtils; | |
45 | import org.eclipse.tracecompass.tmf.ui.tests.shared.WaitUtils; | |
46 | import org.eclipse.ui.IViewPart; | |
47 | import org.junit.After; | |
48 | import org.junit.Assert; | |
49 | import org.junit.Before; | |
50 | import org.junit.BeforeClass; | |
1ee63dfc | 51 | import org.junit.runner.RunWith; |
b1d4e193 MK |
52 | import 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 |
64 | public 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 | } |