1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 /**
23  *
24  */
25 
26 package pvt.gui;
27 
28 import static org.junit.Assert.*;
29 import static org.openoffice.test.common.Testspace.*;
30 import static org.openoffice.test.vcl.Tester.*;
31 import static testlib.gui.AppTool.*;
32 import static testlib.gui.UIMap.*;
33 
34 import java.awt.Rectangle;
35 import java.util.HashMap;
36 
37 import org.junit.After;
38 import org.junit.AfterClass;
39 import org.junit.Before;
40 import org.junit.BeforeClass;
41 import org.junit.Rule;
42 import org.junit.Test;
43 import org.junit.rules.TestName;
44 import org.openoffice.test.OpenOffice;
45 import org.openoffice.test.common.Condition;
46 import org.openoffice.test.common.DataSheet;
47 import org.openoffice.test.common.GraphicsUtil;
48 import org.openoffice.test.common.Logger;
49 
50 
51 public class Benchmark {
52 	@Rule
53 	public Logger log = Logger.getLogger(this);
54 
55 	@Rule
56 	public TestName testname = new TestName();
57 
58 	private static DataSheet result;
59 
60 	private static final double INTERVAL = 0.1;
61 
62 	private static int repeat = 8;
63 
64 	private int i  = 0;
65 
66 	public Benchmark() {
67 
68 	}
69 
70 	@BeforeClass
71 	public static void beforeClass() throws Exception {
72 		OpenOffice.killAll();
73 		result = new DataSheet(getFile("output/" + Benchmark.class.getName() + ".xml"));
74 		result.addRow("data", "Scenario", "No", "Consumed Time", "Memory(VSZ)", "Memory(RSS)", "Handles(Windows Only)");
75 	}
76 
77 	@AfterClass
78 	public static void afterClass() throws Exception {
79 		app.stop();
80 	}
81 
82 	@Before
83 	public void before() {
84 		app.start(true);
85 		app.quit();
86 	}
87 
88 	@After
89 	public void after() {
90 		if (i < repeat)
91 			result.addRow("data", testname.getMethodName(), i, "err", "err", "err", "err", "err");
92 	}
93 
94 	private void addRecord(long start, long end) {
95 		sleep(2);
96 		HashMap<String, Object>  perf = aoo.getPerfData();
97 		result.addRow("data", testname.getMethodName(), i, (end - start), perf.get("vsz"), perf.get("rss"), perf.get("handles"));
98 	}
99 
100 	@Test
101 	public void coolStartup() throws Exception {
102 		for (i = 0; i < repeat; i++) {
103 			aoo.cleanUserInstallation();
104 			assertFalse("User profile exists", aoo.getUserInstallation().exists());
105 			aoo.start();
106 			long start = System.currentTimeMillis();
107 			startcenter.waitForExistence(120, INTERVAL);
108 			long end = System.currentTimeMillis();
109 			addRecord(start, end);
110 			app.quit();
111 		}
112 
113 	}
114 
115 	@Test
116 	public void warmStartup() throws Exception {
117 		for (i = 0; i < repeat; i++) {
118 			assertTrue("User profile exists", aoo.getUserInstallation().exists());
119 			aoo.start();
120 			long start = System.currentTimeMillis();
121 			startcenter.waitForExistence(120, INTERVAL);
122 			long end = System.currentTimeMillis();
123 			addRecord(start, end);
124 			app.quit();
125 		}
126 
127 	}
128 
129 	@Test
130 	public void newTextDocument() {
131 		for (i = 0; i < repeat; i++) {
132 			app.start();
133 			startCenterWriterButton.click(0.5, 0.5);
134 			long start = System.currentTimeMillis();
135 			writer.waitForExistence(60, INTERVAL);
136 			long end = System.currentTimeMillis();
137 			addRecord(start, end);
138 			app.quit();
139 		}
140 
141 	}
142 
143 	@Test
144 	public void newSpreadsheet() {
145 		for (i = 0; i < repeat; i++) {
146 			app.start();
147 			startCenterCalcButton.click(0.5, 0.5);
148 			long start = System.currentTimeMillis();
149 			calc.waitForExistence(60, INTERVAL);
150 			long end = System.currentTimeMillis();
151 			addRecord(start, end);
152 			app.quit();
153 		}
154 
155 	}
156 
157 	@Test
158 	public void newPresentation() {
159 		for (i = 0; i < repeat; i++) {
160 			app.start();
161 			startCenterImpressButton.click(0.5, 0.5);
162 			presentationWizard.click(0.9, 0.95);
163 			long start = System.currentTimeMillis();
164 			impress.waitForExistence(60, INTERVAL);
165 			long end = System.currentTimeMillis();
166 			addRecord(start, end);
167 			app.quit();
168 		}
169 
170 	}
171 
172 	@Test
173 	public void slideShow() {
174 		String path = prepareData("pvt/slideshow.odp");
175 		final Rectangle rect = GraphicsUtil.getScreenRectangle();
176 		// when slide show is running, top-center area will be filled with green
177 		rect.setRect(rect.getCenterX(), 2, 2, 2);
178 		for (i = 0; i < repeat; i++) {
179 			app.start();
180 			open(path);
181 			impress.waitForExistence(60, 1);
182 			sleep(2);
183 			assertFalse("Slideshow control exists", slideShow.exists());
184 			assertFalse("Slideshow is not started", GraphicsUtil.isFilledWith(0xFF00FF00, rect));
185 			typeKeys("<F5>");
186 			long start = System.currentTimeMillis();
187 			new Condition() {
188 				@Override
189 				public boolean value() {
190 					return GraphicsUtil.isFilledWith(0xFF00FF00, rect);
191 				}
192 
193 			}.waitForTrue("", 120, INTERVAL);
194 			long end = System.currentTimeMillis();
195 			addRecord(start, end);
196 			slideShow.typeKeys("<esc>");
197 			sleep(2);
198 			app.quit();
199 		}
200 
201 	}
202 
203 	@Test
204 	public void loadFinishPlainODT() {
205 		loadFinish("pvt/plain_200p.odt", "Page 1 / 23[0-9]{1}");
206 	}
207 
208 	@Test
209 	public void loadFinishPlainDOC() {
210 		loadFinish("pvt/plain_50p.doc", "Page i / 5[0-9]{1}");
211 	}
212 
213 	@Test
214 	public void loadFinishPlainDOCX() {
215 		loadFinish("pvt/plain_200p.docx", "Page 1 / 1[8-9]{1}[0-9]{1}");
216 	}
217 
218 	@Test
219 	public void loadFinishPlainODS() {
220 		loadFinish("pvt/plain_11s.ods", "Sheet 1 / 11");
221 	}
222 
223 	@Test
224 	public void loadFinishPlainXLS() {
225 		loadFinish("pvt/plain_11s.xls", "Sheet 1 / 11");
226 	}
227 
228 	@Test
229 	public void loadFinishPlainXLSX() {
230 		loadFinish("pvt/plain_11s.xlsx", "Sheet 1 / 11");
231 	}
232 
233 	@Test
234 	public void loadFinishPlainODP() {
235 		loadFinish("pvt/plain_200p.odp", "Slide 1 / 200");
236 	}
237 
238 	@Test
239 	public void loadFinishPlainPPT() {
240 		loadFinish("pvt/plain_200p.ppt", "Slide 1 / 200");
241 	}
242 
243 	@Test
244 	public void loadFinishPlainPPTX() {
245 		loadFinish("pvt/plain_200p.pptx", "Slide 1 / 200");
246 	}
247 
248 	@Test
249 	public void loadFinishComplexDOC() {
250 		loadFinish("pvt/complex_300p.doc", "Page 1 / 3[0-9]{2}");
251 	}
252 
253 	@Test
254 	public void loadFinishComplexDOCX() {
255 		loadFinish("pvt/complex_400p.docx", "Page 1 / 3[2-9]{2}");
256 	}
257 
258 	@Test
259 	public void loadFinishComplexODT() {
260 		loadFinish("pvt/complex_800p.odt", "Page 1 / 8[0-9]{2}");
261 	}
262 
263 	@Test
264 	public void loadFinishComplexODS() {
265 		loadFinish("pvt/complex_19s.ods", "Sheet 8 / 19");
266 	}
267 
268 	@Test
269 	public void loadFinishComplexXLS() {
270 		loadFinish("pvt/complex_29s.xls", "Sheet 2 / 29");
271 	}
272 
273 	@Test
274 	public void loadFinishComplexXLSX() {
275 		loadFinish("pvt/complex_29s.xlsx", "Sheet 29 / 29");
276 	}
277 
278 	@Test
279 	public void loadFinishComplexODP() {
280 		loadFinish("pvt/complex_150p.odp", "Slide 1 / 150");
281 	}
282 
283 	@Test
284 	public void loadFinishComplexPPT() {
285 		loadFinish("pvt/complex_100p.ppt", "Slide 1 / 100");
286 	}
287 
288 	@Test
289 	public void loadFinishComplexPPTX() {
290 		loadFinish("pvt/complex_100p.pptx", "Slide 1 / 100");
291 	}
292 
293 	public void loadFinish(String file, final String indicator) {
294 		final int openIndicatorIndex = file.matches(".*\\.(odp|ppt|pptx)$") ? 4 : 0;
295 		String path = prepareData(file);
296 		for (i = 0; i < repeat; i++) {
297 			app.start();
298 			app.dispatch(".uno:Open");
299 			filePickerPath.setText(path);
300 			sleep(1);
301 			filePickerOpen.click(0.5, 0.5);
302 			long start = System.currentTimeMillis();
303 			new Condition() {
304 				@Override
305 				public boolean value() {
306 					try {
307 						String text = statusBar.getItemText(openIndicatorIndex);
308 						return text.matches(indicator);
309 					} catch (Exception e) {
310 						return false;
311 					}
312 				}
313 
314 			}.waitForTrue("", 120, INTERVAL);
315 			long end = System.currentTimeMillis();
316 			addRecord(start, end);
317 			discard();
318 			app.quit();
319 		}
320 
321 	}
322 
323 	@Test
324 	public void savePlainODT() {
325 		save("pvt/plain_200p.odt", "Page 1 / 23[0-9]{1}");
326 	}
327 
328 	@Test
329 	public void savePlainDOC() {
330 		save("pvt/plain_50p.doc", "Page i / 5[0-9]{1}");
331 	}
332 
333 	@Test
334 	public void savePlainODS() {
335 		save("pvt/plain_11s.ods", "Sheet 1 / 11");
336 	}
337 
338 	@Test
339 	public void savePlainXLS() {
340 		save("pvt/plain_11s.xls", "Sheet 1 / 11");
341 	}
342 
343 	@Test
344 	public void savePlainODP() {
345 		save("pvt/plain_200p.odp", "Slide 1 / 200");
346 	}
347 
348 	@Test
349 	public void savePlainPPT() {
350 		save("pvt/plain_200p.ppt", "Slide 1 / 200");
351 	}
352 
353 	@Test
354 	public void saveComplexODT() {
355 		save("pvt/complex_800p.odt", "Page 1 / 8[0-9]{2}");
356 	}
357 
358 	@Test
359 	public void saveComplexDOC() {
360 		save("pvt/complex_300p.doc", "Page 1 / 3[0-9]{2}");
361 	}
362 
363 	@Test
364 	public void saveComplexODS() {
365 		save("pvt/complex_19s.ods", "Sheet 8 / 19");
366 	}
367 
368 	@Test
369 	public void saveComplexXLS() {
370 		save("pvt/complex_29s.xls", "Sheet 2 / 29");
371 	}
372 
373 	@Test
374 	public void saveComplexODP() {
375 		save("pvt/complex_150p.odp", "Slide 1 / 150");
376 	}
377 
378 	@Test
379 	public void saveComplexPPT() {
380 		save("pvt/complex_100p.ppt", "Slide 1 / 100");
381 	}
382 
383 	public void save(String file, final String openIndicator) {
384 		boolean alienFormat = file.matches(".*\\.(doc|xls|ppt|docx|xlsx|pptx)$");
385 		final int openIndicatorIndex = file.matches(".*\\.(odp|ppt|pptx)$") ? 4 : 0;
386 		final int saveIndicatorIndex = file.matches(".*\\.(odt|doc|docx)$") ? 5 : file.matches(".*\\.(ods|xls|xlsx)$") ? 4 : 2;
387 		String picture = prepareData("image/red_64x64.bmp");
388 		for (i = 0; i < repeat; i++) {
389 			String dir = "temp/file" + i;
390 			getFile(dir).mkdirs();
391 			app.start();
392 			open(prepareData(file, dir));
393 			new Condition() {
394 				@Override
395 				public boolean value() {
396 					try {
397 						String text = statusBar.getItemText(openIndicatorIndex);
398 						return text.matches(openIndicator);
399 					} catch (Exception e) {
400 						return false;
401 					}
402 				}
403 
404 			}.waitForTrue("", 120, 1);
405 			sleep(2);
406 			insertPicture(picture);
407 			sleep(5);
408 			assertEquals("File is modified", "*", statusBar.getItemText(saveIndicatorIndex));
409 			app.dispatch(".uno:Save");
410 			if (alienFormat) {
411 				alienFormatDlg.waitForExistence(3, 1);
412 				sleep(1);
413 				typeKeys("<enter>");
414 			}
415 
416 			long start = System.currentTimeMillis();
417 			new Condition() {
418 				@Override
419 				public boolean value() {
420 					try {
421 						String text = statusBar.getItemText(saveIndicatorIndex);
422 						return " ".equals(text);
423 					} catch (Exception e) {
424 						return false;
425 					}
426 				}
427 
428 			}.waitForTrue("", 120, INTERVAL);
429 			long end = System.currentTimeMillis();
430 			addRecord(start, end);
431 			close();
432 			app.stop();
433 		}
434 
435 	}
436 }
437