xref: /trunk/test/testgui/source/bvt/gui/FileExport.java (revision 2f57578e8e7e0ab07c12c28c88d12852edcc3a46)
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 package bvt.gui;
26 
27 import static org.openoffice.test.common.Testspace.*;
28 import static testlib.gui.AppTool.*;
29 import static testlib.gui.UIMap.*;
30 
31 import java.io.*;
32 import java.util.ArrayList;
33 import java.util.Arrays;
34 import java.util.List;
35 import java.util.ListIterator;
36 import java.util.concurrent.TimeoutException;
37 import java.io.File;
38 import java.io.FileNotFoundException;
39 import java.io.IOException;
40 import java.io.Reader;
41 import java.io.InputStreamReader;
42 import java.lang.RuntimeException;
43 
44 import org.junit.After;
45 import org.junit.AfterClass;
46 import org.junit.Before;
47 import org.junit.BeforeClass;
48 import org.junit.Rule;
49 import org.junit.Test;
50 import org.openoffice.test.common.Condition;
51 import org.openoffice.test.common.DataSheet;
52 import org.openoffice.test.common.FileUtil;
53 import org.openoffice.test.common.Logger;
54 import org.openoffice.test.common.Testspace;
55 import org.openoffice.test.vcl.widgets.VclDialog;
56 
57 /**
58  *
59  */
60 class TestType {
61 
62     public TestType(boolean doc, boolean spread, boolean slide) {
63         documentT = doc;
64         spreadsheetT = spread;
65         slideT = slide;
66     }
67 
68     public boolean documentT;
69     public boolean spreadsheetT;
70     public boolean slideT;
71 };
72 
73 class ContinuePoint {
74     public String path;
75     public int i;
76 
77     ContinuePoint() {
78         path = "";
79         i = 0;
80     }
81 }
82 
83 public class FileExport {
84     // for example
85     // the path is "D:\\aoo\\utaoo\\testspace\\ooxmlsamples"
86     String samplespath = "";// a dir
87     String outpath = ""; // a dir
88     static double timeout = 100;
89     static double interval = 0.1;
90     double sleeptime = 1;
91     boolean bContinue = false;// if failed,next execute from the continue point
92     TestType atest = new TestType(true, true, true);// doc,spreadsheet,slide
93     ContinuePoint thepoint = null;
94     BufferedWriter fwContinue = null;
95     String testedlogfile = "";
96 
97     private static DataSheet result;
98     private String scenario = null;
99     private File sourceFile = null;
100 
101     public static final VclDialog passwdDlg = dialog("");
102 
103     public List<String> recursionfiles(File path, List<String> resultFileName) {
104         File[] files = path.listFiles();
105         if (files == null)
106             return resultFileName;
107         for (File f : files) {
108             if (f.isDirectory()) {// a path
109                 if (!f.isHidden() && !f.getName().startsWith(".")) {
110                     sampledirs.add(f.getPath());
111                     recursionfiles(f, resultFileName);
112                 }
113             } else {// a file
114                 if (!f.isHidden() && !f.getName().startsWith(".")) {
115                     String apath = f.getPath();
116 
117                     int sepIndex = apath.indexOf("\\");
118                     String userpath = apath.substring(sepIndex);
119                     String newpath = outpath + userpath;
120 
121                     File file = new File(newpath);
122                     File parent = file.getParentFile();
123                     if (parent != null && !parent.exists()) {
124                         parent.mkdirs();
125                     }
126                     resultFileName.add(f.getPath());
127                 }
128             }
129         }
130         return resultFileName;
131     }
132 
133     private String getrealoutpath(String p) {
134         String apath = p;
135 
136         int sepIndex = apath.indexOf("\\");
137         int sepIndexLast = apath.lastIndexOf("\\");
138         String userpath = apath.substring(sepIndex, sepIndexLast);
139         String newpath = outpath + userpath;
140         File tempFolderFile = new File(newpath);
141         if (!tempFolderFile.exists()) {
142             tempFolderFile.mkdirs();
143         }
144         return newpath;
145     }
146 
147     private List<String> samplelist = null;
148     private List<String> sampledirs = null;
149 
150     @Rule
151     public Logger log = Logger.getLogger(this);
152 
153     @BeforeClass
154     public static void beforeClass() {
155         app.clean();
156     }
157 
158     @AfterClass
159     public static void afterClass() {
160         app.stop();
161     }
162 
163     @Before
164     public void before() {
165 
166     }
167 
168     @After
169     public void after() throws Exception {
170         app.stop();
171     }
172 
173     void getcontinuepoint() {
174 
175         if (bContinue == false) {
176             thepoint.path = "";
177             thepoint.i = 0;
178             return;
179         }
180         File ftestedlog = new File(testedlogfile);
181         Reader reader = null;
182         try {
183             reader = new InputStreamReader(new FileInputStream(ftestedlog));
184         } catch (FileNotFoundException e1) {
185             // TODO Auto-generated catch block
186             e1.printStackTrace();
187         }
188 
189         BufferedReader br = new BufferedReader(reader);
190 
191         String line = null;
192         int countline = 0;
193         int m = 0;
194         try {
195             if ((line = br.readLine()) != null) {
196                 if (countline == 0) {
197                     thepoint.path = line;
198                 } else {
199 
200                     m = Integer.parseInt(line);
201                     if (m > 0)
202                         thepoint.i = m;
203                 }
204             }
205         } catch (NumberFormatException e1) {
206             // TODO Auto-generated catch block
207             e1.printStackTrace();
208         } catch (IOException e1) {
209             // TODO Auto-generated catch block
210             e1.printStackTrace();
211         }
212     }
213 
214     /**
215      * Test Open/SaveAs ooxml file by Aoo
216      *
217      * @throws Exception
218      */
219     @Test
220     public void testSaveAs() throws Exception {
221         samplelist = new ArrayList<String>();
222         sampledirs = new ArrayList<String>();
223         thepoint = new ContinuePoint();
224         File spacepath = Testspace.getFile("output");// ..\\testspace\\output
225         String absspath = spacepath.getAbsolutePath();
226         int n = absspath.indexOf("testgui");
227         String abspre = absspath.substring(0, n);
228 
229         result = new DataSheet(getFile("outputlog/"
230                 + FileExport.class.getName() + ".xml"));
231         result.addRow("data", "File Path", "File Size", "Scenario",
232                 "Exported File Path", "Exported File Size", "Result", "Error");
233 
234         testedlogfile = abspre + "testgui\\cases_tested.txt";
235         samplespath = "samples";
236 
237         if (outpath.length() == 0) {
238             File workspacepath = Testspace.getFile("output");// ..\\testspace\\output
239             outpath = workspacepath.getAbsolutePath();
240 
241             // outpath = "D:\\AOOautomation\\Docs sample files\\out";
242         }
243 
244         if (bContinue)
245             getcontinuepoint();
246 
247         File samplesDir = Testspace.getFile(samplespath);
248         recursionfiles(samplesDir, samplelist);
249         ListIterator<String> it = sampledirs.listIterator();
250 
251         boolean bstartfromthis = false;
252         while (it.hasNext()) {
253 
254             String str = (String) it.next();
255             if (!bContinue) {
256                 File afiledir = new File(str);
257                 dotest(afiledir);
258             } else {
259                 File file = new File(thepoint.path);
260                 File parent = file.getParentFile();
261                 if (parent != null) {
262                     String pathbegin = parent.getAbsolutePath();
263                     if (pathbegin.equalsIgnoreCase(str)) {
264                         bstartfromthis = true;
265 
266                     }
267                 }
268                 if (bstartfromthis == true) {
269                     File afiledir = new File(str);
270                     dotest(afiledir);
271                 }
272             }
273         }
274     }
275 
276     public void dotest(File samplesDir) throws Exception {
277         FilenameFilter testFilter = new FilenameFilter() {
278             public boolean accept(File file, String name) {
279                 if (name.endsWith(".doc") || name.endsWith(".docx")
280                         || name.endsWith(".dot") || name.endsWith(".xls")
281                         || name.endsWith(".xlsx") || name.endsWith(".ods")
282                         || name.endsWith(".ppt") || name.endsWith(".pptx")
283                         || name.endsWith(".odp")) {
284                     // filters files
285                     return true;
286                 } else {
287                     return false;
288                 }
289             }
290         };
291         File[] files = samplesDir.listFiles(testFilter);
292         Arrays.sort(files);
293         int nfiles = files.length;
294         if (nfiles == 0)
295             return;
296 
297         int i = thepoint.i;
298         for (; i < nfiles; i++) {
299             File afile = files[i];
300             String path = afile.getAbsolutePath();
301 
302             String extName = FileUtil.getFileExtName(path).toLowerCase();
303             boolean bShouldTest = false;
304             if (extName.equals("doc") || extName.equals("docx")
305                     || extName.equals("odt")) {
306                 bShouldTest = true;
307                 if (atest.documentT == false)
308                     continue;
309             }
310             if (extName.equals("ppt") || extName.equals("pptx")
311                     || extName.equals("odp")) {
312                 bShouldTest = true;
313                 if (atest.slideT == false)
314                     continue;
315             }
316             if (extName.equals("xls") || extName.equals("xlsx")
317                     || extName.equals("ods")) {
318                 bShouldTest = true;
319                 if (atest.spreadsheetT == false)
320                     continue;
321             }
322             if (!bShouldTest)
323                 continue;
324             String exportname = "aoo_" + afile.getName();
325 
326             sourceFile = new File(path);
327 
328             app.stop();
329             app.start();
330 
331             if(!Open(path)){
332                 continue;
333             }
334 
335             String newpath = getrealoutpath(path);
336 
337             // do testing
338             if (!savetosameformat(exportname, newpath)) {
339                 continue;
340             }
341 
342             if(!Open(path)) {
343                 continue;
344 
345             }
346             if (!savetodiffformat(exportname, newpath)) {
347                 continue;
348             }
349 
350             if(!Open(path)) {
351                 continue;
352 
353             }
354 
355             if (!savetopdfformat(exportname, newpath)) {
356                 continue;
357             }
358         }
359     }
360 
361     private boolean Open(String path) throws Exception {
362         try {
363             open(path);
364             if (!app.exists())
365                 throw new RuntimeException();
366             HandleBlockers(false);
367             if(statusBar.exists(timeout))
368                 statusBar.waitForEnabled(timeout, interval);
369             else
370                 throw new TimeoutException("time out");
371             HandleBlockers(false);
372             if (!app.exists())
373                 throw new RuntimeException();
374             return true;
375         } catch (Exception e) {
376             try {
377                 String reason = e.getMessage();
378                 if (reason == null || reason.isEmpty())
379                     reason = "Opening";
380                 result.addRow("data", sourceFile.getCanonicalPath(),
381                         sourceFile.length(), scenario, "", "", "Fail", reason);
382             } catch (IOException e1) {
383                 // TODO Auto-generated catch block
384                 e1.printStackTrace();
385             }
386             return false;
387         }
388     }
389 
390     private boolean savetosameformat(String file, String outpath) {
391         try {
392             File reportDir = Testspace.getFile(outpath);
393 
394             String extName = FileUtil.getFileExtName(file).toLowerCase();
395 
396             boolean formatchanged = false;
397             if (extName.equals("docx")) {
398                 extName = "doc";
399                 formatchanged = true;
400             } else if (extName.equals("pptx")) {
401                 extName = "ppt";
402                 formatchanged = true;
403             } else if (extName.equals("xlsx")) {
404                 extName = "xls";
405                 formatchanged = true;
406             }
407 
408             scenario = FileUtil.getFileExtName(file).toLowerCase() + " to " + extName;
409 
410             int dotIndex = file.lastIndexOf(".");
411             String pre = file.substring(0, dotIndex + 1);
412             String newfile = pre + extName;
413 
414             String saveTo = reportDir + "\\" + file;
415             if (formatchanged)
416                 saveTo = reportDir + "\\" + newfile;
417             // Save the text document
418             deleteFile(saveTo);
419             SaveAs(saveTo);
420             Close();
421             if(!Open(saveTo))
422                 return false;
423 
424             String exception = "";
425             String resultflag = "";
426             try {
427                 Close();
428                 resultflag = "Pass";
429             } catch (Exception e) {
430                 exception = e.getMessage();
431                 resultflag = "Fail";
432             }
433 
434             File targetFile = new File(saveTo);
435             result.addRow("data", sourceFile.getCanonicalPath(),
436                     sourceFile.length(), scenario, saveTo, targetFile.length(),
437                     resultflag, exception);
438 
439             return true;
440         } catch (Exception e) {
441             try {
442                 String exception = e.getMessage();
443                 if (exception == null || exception.isEmpty())
444                     exception = "Saving to the same format";
445                 result.addRow("data", sourceFile.getCanonicalPath(),
446                         sourceFile.length(), scenario, "", "", "Fail", exception);
447             } catch (IOException e1) {
448                 // TODO Auto-generated catch block
449                 e1.printStackTrace();
450             }
451 
452             return false;
453         }
454     }
455 
456     private boolean savetodiffformat(String file, String outpath) {
457         try {
458             File reportDir = Testspace.getFile(outpath);
459 
460             String extName = FileUtil.getFileExtName(file).toLowerCase();
461 
462             String targetExtName = null;
463 
464             if (extName.equals("doc") || extName.equals("docx"))
465                 targetExtName = "odt";
466             else if (extName.equals("ppt") || extName.equals("pptx"))
467                 targetExtName = "odp";
468             else if (extName.equals("xls") || extName.equals("xlsx"))
469                 targetExtName = "ods";
470             else if (extName.equals("odt"))
471                 targetExtName = "doc";
472             else if (extName.equals("odp"))
473                 targetExtName = "ppt";
474             else if (extName.equals("ods"))
475                 targetExtName = "xls";
476 
477             scenario = extName + " to " + targetExtName;
478 
479             int dotIndex = file.lastIndexOf(".");
480             String pre = file.substring(0, dotIndex + 1);
481             String saveTo = reportDir + "\\" + pre + targetExtName;
482             deleteFile(saveTo);
483             // long base = System.currentTimeMillis();
484             SaveAs(saveTo);
485             Close();
486             if(!Open(saveTo))
487                 return false;
488 
489             String exception = "";
490             String resultflag = "";
491             try {
492                 Close();
493                 resultflag = "Pass";
494             } catch (Exception e) {
495                 exception = e.getMessage();
496                 resultflag = "Fail";
497             }
498 
499             File targetFile = new File(saveTo);
500             result.addRow("data", sourceFile.getCanonicalPath(),
501                     sourceFile.length(), scenario, saveTo, targetFile.length(),
502                     resultflag, exception);
503 
504             return true;
505         } catch (Exception e) {
506             try {
507                 String exception = e.getMessage();
508                 if (exception == null || exception.isEmpty())
509                     exception = "Saving to a different format";
510                 result.addRow("data", sourceFile.getCanonicalPath(),
511                         sourceFile.length(), scenario, "", "", "Fail", exception);
512             } catch (IOException e1) {
513                 // TODO Auto-generated catch block
514                 e1.printStackTrace();
515             }
516 
517             return false;
518         }
519 
520     }
521 
522     private void Close() throws Exception {
523         close();
524         HandleBlockers(false);
525     }
526 
527     public static void HandleBlockers(final boolean Positive) throws Exception {
528         new Condition() {
529             @Override
530             public boolean value() {
531                 while (activeMsgBox.exists()) {
532 
533                     String context = activeMsgBox.getMessage();
534                     if (context.toLowerCase().indexOf("has been modified") >= 0
535                             && context.toLowerCase().indexOf(
536                                     "do you want to save your changes") >= 0)
537                         throw new RuntimeException("A wrong dirty flag");
538                     if (context.toLowerCase().indexOf("read-error") >= 0)
539                         throw new RuntimeException("Read Error");
540                     if (context.toLowerCase().indexOf("does not exist") >= 0)
541                         throw new RuntimeException("File not exist");
542 
543                     try {
544                         if (Positive)
545                             activeMsgBox.ok();
546                         else
547                             activeMsgBox.no();
548                     } catch (Exception e) {
549                         try {
550                             if (Positive)
551                                 activeMsgBox.yes();
552                             else
553                                 activeMsgBox.no();
554                         } catch (Exception e1) {
555                             try {
556                                 activeMsgBox.doDefault();
557                             } catch (Exception e2) {
558                                 try {
559                                     activeMsgBox.ok();
560                                 } catch (Exception e3) {
561                                     activeMsgBox.yes();
562                                 }
563                             }
564                         }
565                     }
566                 }
567                 if (passwdDlg.exists()) {
568                     String caption = passwdDlg.getCaption();
569                     if (caption.toLowerCase().indexOf(
570                             "enter password to open file") >= 0)
571                         throw new RuntimeException("A password protected file");
572                     if (caption.toLowerCase().indexOf("properties") >= 0)
573                         throw new RuntimeException("An unsupported format");
574                     if (SupportedFormats(caption))
575                         throw new RuntimeException("An unreadable file");
576                 }
577                 return true;
578             }
579 
580         }.test(timeout, interval);
581     }
582 
583     private static boolean SupportedFormats(String filename) {
584         if (filename.endsWith(".doc") || filename.endsWith(".docx")
585                 || filename.endsWith(".dot") || filename.endsWith(".xls")
586                 || filename.endsWith(".xlsx") || filename.endsWith(".ods")
587                 || filename.endsWith(".ppt") || filename.endsWith(".pptx")
588                 || filename.endsWith(".odp")) {
589             return true;
590         } else {
591             return false;
592         }
593     }
594 
595     private void SaveAs(String newfile) throws Exception {
596         saveAs(newfile);
597         HandleBlockers(true);
598         if(statusBar.exists(timeout))
599             statusBar.waitForEnabled(timeout, interval);
600         else
601             throw new TimeoutException("time out");
602     }
603 
604     private boolean savetopdfformat(String file, String outpath) {
605         try {
606             File reportDir = Testspace.getFile(outpath);
607             String extName = "pdf";
608 
609             int dotIndex = file.lastIndexOf(".");
610             String pre = file.substring(0, dotIndex + 1);
611             String newfile = pre + extName;
612 
613             scenario = FileUtil.getFileExtName(file).toLowerCase() + " to pdf";
614 
615             String saveTo = reportDir + "\\" + newfile;
616             // Save the text document
617             app.dispatch(".uno:ExportToPDF");
618             pdfGeneralPage.ok();
619 
620             submitSaveDlg(saveTo);
621             HandleBlockers(true);
622 
623             if(statusBar.exists(timeout))
624                 statusBar.waitForEnabled(timeout, interval);
625             else
626                 throw new TimeoutException("time out");
627 
628             String outcome = "Pass";
629             try {
630                 Close();
631             } catch (Exception e) {
632                 if (!e.getMessage().matches("A wrong dirty flag"))
633                     outcome = e.getMessage();
634                 else
635                     throw e;
636             }
637 
638 
639             File targetFile = new File(saveTo);
640             result.addRow("data", sourceFile.getCanonicalPath(),
641                     sourceFile.length(), scenario, saveTo, targetFile.length(),
642                     outcome);
643 
644             return true;
645         } catch (Exception e) {
646             try {
647                 String reason = e.getMessage();
648                 if (reason == null || reason.isEmpty())
649                     reason = "Exporting to pdf format";
650                 result.addRow("data", sourceFile.getCanonicalPath(),
651                         sourceFile.length(), scenario, "", "", "Fail", reason);
652             } catch (IOException e1) {
653                 // TODO Auto-generated catch block
654                 e1.printStackTrace();
655             }
656 
657             return false;
658         }
659     }
660 
661 }
662