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