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