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.AfterClass;
38 import org.junit.BeforeClass;
39 import org.junit.Rule;
40 import org.junit.Test;
41 import org.junit.rules.TestName;
42 import org.openoffice.test.OpenOffice;
43 import org.openoffice.test.common.Condition;
44 import org.openoffice.test.common.DataSheet;
45 import org.openoffice.test.common.GraphicsUtil;
46 import org.openoffice.test.common.Logger;
47 import org.openoffice.test.common.SystemUtil;
48 
49 
50 public class Benchmark {
51 	@Rule
52 	public Logger log = Logger.getLogger(this);
53 
54 	@Rule
55 	public TestName testname = new TestName();
56 
57 	private static DataSheet result;
58 
59 	private static final double INTERVAL = 0.1;
60 
61 	public Benchmark() {
62 
63 	}
64 
65 	@BeforeClass
66 	public static void beforeClass() throws Exception {
67 		result = new DataSheet(getFile("output/pvt_gui_benchmark.xml"), "benckmark");
68 		OpenOffice.killAll();
69 		result.addRow("Scenario", "No", "Consumed Time", "Memory(VSZ)", "Memory(RSS)", "Handles(Windows Only)");
70 	}
71 
72 	@AfterClass
73 	public static void afterClass() throws Exception {
74 		app.close();
75 	}
76 
77 	private HashMap<String, Object> getPerfData() {
78 		HashMap<String, Object> proccessInfo = SystemUtil.findProcess(".*(soffice\\.bin|soffice\\.exe .*-env).*");
79 		String pid = (String) proccessInfo.get("pid");
80 		return SystemUtil.getProcessPerfData(pid);
81 	}
82 
83 	private void addRecord(int i, long start, long end) {
84 		HashMap<String, Object>  perf = getPerfData();
85 		result.addRow(testname.getMethodName(), i, (end - start), perf.get("vsz"), perf.get("rss"), perf.get("handles"));
86 	}
87 
88 	@Test
89 	public void coolStartup() throws Exception {
90 		aoo.kill();
91 		aoo.cleanUserInstallation();
92 		aoo.start();
93 		long start = System.currentTimeMillis();
94 		startcenter.waitForExistence(120, INTERVAL);
95 		long end = System.currentTimeMillis();
96 		sleep(2);
97 		addRecord(0, start, end);
98 		app.close();
99 	}
100 
101 	@Test
102 	public void warmStartup() throws Exception {
103 		for (int i = 0; i < 8; i++) {
104 			aoo.kill();//make sure app is closed
105 			aoo.start();
106 			long start = System.currentTimeMillis();
107 			startcenter.waitForExistence(120, INTERVAL);
108 			long end = System.currentTimeMillis();
109 			sleep(2);
110 			addRecord(i, start, end);
111 			app.close();
112 		}
113 	}
114 
115 	@Test
116 	public void newTextDocument() {
117 		for (int i = 0; i < 8; i++) {
118 			aoo.kill();//make sure app is closed
119 			aoo.start();
120 			startCenterWriterButton.waitForExistence(120, 1);
121 			sleep(2);
122 			startCenterWriterButton.click(0.5, 0.5);
123 			long start = System.currentTimeMillis();
124 			writer.waitForExistence(60, INTERVAL);
125 			long end = System.currentTimeMillis();
126 			sleep(2);
127 			addRecord(i, start, end);
128 			app.close();
129 		}
130 	}
131 
132 	@Test
133 	public void newSpreadsheet() {
134 		for (int i = 0; i < 8; i++) {
135 			aoo.kill();//make sure app is closed
136 			aoo.start();
137 			startCenterCalcButton.waitForExistence(120, 1);
138 			sleep(2);
139 			startCenterCalcButton.click(0.5, 0.5);
140 			long start = System.currentTimeMillis();
141 			calc.waitForExistence(60, INTERVAL);
142 			long end = System.currentTimeMillis();
143 			sleep(2);
144 			addRecord(i, start, end);
145 			app.close();
146 		}
147 	}
148 
149 	@Test
150 	public void newPresentation() {
151 		for (int i = 0; i < 8; i++) {
152 			aoo.kill();//make sure app is closed
153 			aoo.start();
154 			startCenterImpressButton.waitForExistence(120, 1);
155 			sleep(2);
156 			startCenterImpressButton.click(0.5, 0.5);
157 			sleep(1);
158 			presentationWizard.click(0.9, 0.95);
159 			long start = System.currentTimeMillis();
160 			impress.waitForExistence(60, INTERVAL);
161 			long end = System.currentTimeMillis();
162 			sleep(2);
163 			addRecord(i, start, end);
164 			app.close();
165 		}
166 	}
167 
168 	@Test
169 	public void loadFinishPlainODT() {
170 		loadFinish("pvt/plain_200p.odt", "Page 1 / 23[0-9]{1}");
171 	}
172 
173 	@Test
174 	public void loadFinishPlainDOC() {
175 		loadFinish("pvt/plain_50p.doc", "Page i / 5[0-9]{1}");
176 	}
177 
178 	@Test
179 	public void loadFinishPlainDOCX() {
180 		loadFinish("pvt/plain_200p.docx", "Page 1 / 19[0-9]{1}");
181 	}
182 
183 	@Test
184 	public void loadFinishPlainODS() {
185 		loadFinish("pvt/plain_11s.ods", "Sheet 1 / 11");
186 	}
187 
188 	@Test
189 	public void loadFinishPlainXLS() {
190 		loadFinish("pvt/plain_11s.xls", "Sheet 1 / 11");
191 	}
192 
193 	@Test
194 	public void loadFinishPlainXLSX() {
195 		loadFinish("pvt/plain_11s.xlsx", "Sheet 1 / 11");
196 	}
197 
198 	@Test
199 	public void loadFinishPlainODP() {
200 		loadFinish("pvt/plain_200p.odp", "Slide 1 / 200");
201 	}
202 
203 	@Test
204 	public void loadFinishPlainPPT() {
205 		loadFinish("pvt/plain_200p.ppt", "Slide 1 / 200");
206 	}
207 
208 	@Test
209 	public void loadFinishPlainPPTX() {
210 		loadFinish("pvt/plain_200p.pptx", "Slide 1 / 200");
211 	}
212 
213 	@Test
214 	public void loadFinishComplexDOC() {
215 		loadFinish("pvt/complex_300p.doc", "Page 1 / 3[0-9]{2}");
216 	}
217 
218 	@Test
219 	public void loadFinishComplexODT() {
220 		loadFinish("pvt/complex_800p.odt", "Page 1 / 8[0-9]{2}");
221 	}
222 
223 	@Test
224 	public void loadFinishComplexXLS() {
225 		loadFinish("pvt/sc_complex_13sh_4kcell.xls", "Sheet 2 / 13");
226 	}
227 
228 	@Test
229 	public void loadFinishComplexODS() {
230 		loadFinish("pvt/sc_complex_13sh_4kcell_new_odf1.2.ods", "Sheet 6 / 13");
231 	}
232 
233 
234 	@Test
235 	public void loadFinishComplexODP() {
236 		loadFinish("pvt/sd_complex_51p_odf1.2.odp", "Slide 1 / 51");
237 	}
238 
239 	@Test
240 	public void loadFinishComplexPPT() {
241 		loadFinish("pvt/sd_complex_51p.ppt", "Slide 1 / 51");
242 	}
243 
244 	public void loadFinish(String file, final String indicator) {
245 		final int openIndicatorIndex = file.matches(".*\\.(odp|ppt|pptx)$") ? 4 : 0;
246 		String path = prepareData(file);
247 		aoo.kill();
248 		app.start();
249 		startcenter.waitForExistence(10, 1);
250 		sleep(2); // Give some seconds to AOO relax. We want data more stable.
251 		for (int i = 0; i < 8; i++) {
252 			app.dispatch(".uno:Open");
253 			filePickerPath.setText(path);
254 			sleep(2);
255 			filePickerOpen.click(0.5, 0.5);
256 			long start = System.currentTimeMillis();
257 			new Condition() {
258 				@Override
259 				public boolean value() {
260 					try {
261 						String text = statusBar.getItemText(openIndicatorIndex);
262 						return text.matches(indicator);
263 					} catch (Exception e) {
264 						return false;
265 					}
266 				}
267 
268 			}.waitForTrue("", 120, INTERVAL);
269 			long end = System.currentTimeMillis();
270 			sleep(2);
271 			addRecord(i, start, end);
272 			discard();
273 		}
274 
275 		app.close();
276 	}
277 
278 	@Test
279 	public void savePlainDOC() {
280 		save("pvt/plain_50p.doc", "Page i / 5[0-9]{1}");
281 	}
282 
283 	@Test
284 	public void savePlainODT() {
285 		save("pvt/plain_200p.odt", "Page 1 / 23[0-9]{1}");
286 	}
287 
288 	@Test
289 	public void saveComplexDOC() {
290 		save("pvt/complex_300p.doc", "Page 1 / 3[0-9]{2}");
291 	}
292 
293 	@Test
294 	public void saveComplexODT() {
295 		save("pvt/complex_800p.odt", "Page 1 / 8[0-9]{2}");
296 	}
297 
298 	@Test
299 	public void savePlainXLS() {
300 		save("pvt/plain_11s.xls", "Sheet 1 / 11");
301 	}
302 
303 	@Test
304 	public void savePlainODS() {
305 		save("pvt/plain_11s.ods", "Sheet 1 / 11");
306 	}
307 
308 	@Test
309 	public void saveComplexXLS() {
310 		save("pvt/sc_complex_13sh_4kcell.xls", "Sheet 2 / 13");
311 	}
312 
313 	@Test
314 	public void saveComplexODS() {
315 		save("pvt/sc_complex_13sh_4kcell_new_odf1.2.ods", "Sheet 6 / 13");
316 	}
317 
318 	@Test
319 	public void savePlainODP() {
320 		save("pvt/plain_200p.odp", "Slide 1 / 200");
321 	}
322 
323 	@Test
324 	public void savePlainPPT() {
325 		save("pvt/plain_200p.ppt", "Slide 1 / 200");
326 	}
327 
328 	@Test
329 	public void saveComplexODP() {
330 		save("pvt/sd_complex_51p_odf1.2.odp", "Slide 1 / 51");
331 	}
332 
333 	@Test
334 	public void saveComplexPPT() {
335 		save("pvt/sd_complex_51p.ppt", "Slide 1 / 51");
336 	}
337 
338 	public void save(String file, final String openIndicator) {
339 		boolean alienFormat = file.matches(".*\\.(doc|xls|ppt|docx|xlsx|pptx)$");
340 		final int openIndicatorIndex = file.matches(".*\\.(odp|ppt|pptx)$") ? 4 : 0;
341 		final int saveIndicatorIndex = file.matches(".*\\.(odt|doc|docx)$") ? 5 : file.matches(".*\\.(ods|xls|xlsx)$") ? 4 : 2;
342 		aoo.kill();
343 		app.start();
344 		String picture = prepareData("image/red_64x64.bmp");
345 		for (int i = 0; i < 8; i++) {
346 			String dir = "temp/file" + i;
347 			getFile(dir).mkdirs();
348 			open(prepareData(file, dir));
349 			new Condition() {
350 				@Override
351 				public boolean value() {
352 					try {
353 						String text = statusBar.getItemText(openIndicatorIndex);
354 						return text.matches(openIndicator);
355 					} catch (Exception e) {
356 						return false;
357 					}
358 				}
359 
360 			}.waitForTrue("", 120, 1);
361 			sleep(2);
362 			insertPicture(picture);
363 			sleep(3);
364 			assertEquals("File is modified", "*", statusBar.getItemText(saveIndicatorIndex));
365 			app.dispatch(".uno:Save");
366 			if (alienFormat) {
367 				alienFormatDlg.waitForExistence(3, 1);
368 				sleep(1);
369 				typeKeys("<enter>");
370 			}
371 
372 			long start = System.currentTimeMillis();
373 			new Condition() {
374 				@Override
375 				public boolean value() {
376 					try {
377 						String text = statusBar.getItemText(saveIndicatorIndex);
378 						return " ".equals(text);
379 					} catch (Exception e) {
380 						return false;
381 					}
382 				}
383 
384 			}.waitForTrue("", 120, INTERVAL);
385 			long end = System.currentTimeMillis();
386 			sleep(2);
387 			addRecord(i, start, end);
388 			close();
389 		}
390 
391 		app.close();
392 	}
393 
394 	@Test
395 	public void slideShow() {
396 		aoo.kill();
397 		app.start();
398 		String path = prepareData("pvt/sd_slideshow.odp");
399 		final Rectangle rect = GraphicsUtil.getScreenRectangle();
400 		// when slide show is running, top-center area will be filled with green
401 		rect.setRect(rect.getCenterX(), 2, 2, 2);
402 		for (int i = 0; i < 8; i++) {
403 			open(path);
404 			impress.waitForExistence(60, 1);
405 			sleep(2);
406 			assertFalse("Slideshow control exists", slideShow.exists());
407 			assertFalse("Slideshow is not started", GraphicsUtil.isFilledWith(0xFF00FF00, rect));
408 			typeKeys("<F5>");
409 			long start = System.currentTimeMillis();
410 			new Condition() {
411 				@Override
412 				public boolean value() {
413 					return GraphicsUtil.isFilledWith(0xFF00FF00, rect);
414 				}
415 
416 			}.waitForTrue("", 120, INTERVAL);
417 			long end = System.currentTimeMillis();
418 			sleep(2);
419 			addRecord(i, start, end);
420 			slideShow.typeKeys("<esc>");
421 			sleep(2);
422 			close();
423 		}
424 		app.close();
425 	}
426 }
427