| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| */ |
| package fvt.uno.ffc; |
| |
| import java.io.File; |
| import java.io.FilenameFilter; |
| import java.util.HashMap; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.logging.Level; |
| |
| import junit.framework.Assert; |
| |
| import org.junit.After; |
| import org.junit.Before; |
| import org.junit.BeforeClass; |
| import org.junit.Ignore; |
| import org.junit.Rule; |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| import org.openoffice.test.OpenOffice; |
| import org.openoffice.test.common.FileProvider; |
| import org.openoffice.test.common.FileProvider.FileRepos; |
| import org.openoffice.test.common.FileUtil; |
| import org.openoffice.test.common.Logger; |
| import org.openoffice.test.common.SystemUtil; |
| import org.openoffice.test.common.Testspace; |
| import org.openoffice.test.uno.UnoApp; |
| |
| import com.sun.star.beans.PropertyValue; |
| import com.sun.star.document.MacroExecMode; |
| import com.sun.star.frame.XComponentLoader; |
| import com.sun.star.frame.XStorable; |
| import com.sun.star.io.IOException; |
| import com.sun.star.lang.IllegalArgumentException; |
| import com.sun.star.lang.XComponent; |
| import com.sun.star.uno.UnoRuntime; |
| /** |
| * Pls place a suite file in directory "suite" which is same level with test uno. like below |
| * -suite |
| * -testuno |
| * The suite file content is like this format |
| * ftp://user:password@192.168.0.1/public/sample/testsample.doc |
| * .. |
| * .. |
| * ftp://user:password@192.168.0.1/public/sample/testsample2.doc |
| *This script is used to test FFC by UNO API |
| *It cover below scenario: |
| *MS2003/2010 format->ODF format |
| *New Saved ODF Format file -> MS 2003 Format |
| *New Saved ODF Format file -> PDF |
| * |
| */ |
| @RunWith(FileProvider.class) |
| public class FFCTest { |
| @Rule |
| public Logger log = Logger.getLogger(this, false); |
| |
| |
| private static UnoApp app = null; |
| private static Map<String, String> filterMap = new HashMap<String, String>(); |
| @FileRepos |
| public static String suiteDir = "../suite/"; |
| private String fileURL = ""; |
| private String operateFilePath = ""; |
| private static Map<String, String> formatMap = new HashMap<String, String>(); |
| private static File testSpaceFile = Testspace.getFile(); |
| private boolean isSucceed = false; |
| private static String tempFolder = testSpaceFile.getAbsolutePath() + File.separator + "temp"; |
| |
| private static String failedFilesDir = "output/failedSampleFiles/"; |
| private String runedScenarios = ""; |
| |
| public FFCTest(String url) { |
| this.fileURL = url; |
| } |
| |
| @BeforeClass |
| public static void init() { |
| initMap(); |
| File failedDirec = Testspace.getFile(failedFilesDir); |
| FileUtil.deleteFile(failedDirec); |
| //Disable automation |
| |
| OpenOffice defaultOpenOffice = new OpenOffice(); |
| defaultOpenOffice.addArgs("-nofirststartwizard", "-norestore", "-quickstart=no"); |
| defaultOpenOffice.setUnoUrl(OpenOffice.DEFAULT_UNO_URL); |
| defaultOpenOffice.addArgs("-invisible", "-conversionmode", "-headless", "-hidemenu"); |
| app = new UnoApp(defaultOpenOffice); |
| |
| |
| failedDirec.mkdirs(); |
| |
| } |
| |
| @Before |
| public void setUp() throws Exception { |
| operateFilePath = Testspace.prepareData(fileURL); |
| |
| runedScenarios = ""; |
| app.start(); |
| } |
| @After |
| public void tearDown() throws Exception { |
| if (!isSucceed) { |
| FileUtil.copyFile(operateFilePath, Testspace.getFile(failedFilesDir).getAbsolutePath()); |
| FileUtil.appendStringToFile( Testspace.getFile(failedFilesDir + File.separator + "failedFiles.files").getAbsolutePath(), fileURL +"\r\n"); |
| String failedMessage = fileURL +"\r\n" + runedScenarios; |
| FileUtil.appendStringToFile( Testspace.getFile(failedFilesDir + File.separator + "failedFiles_scenarios.files").getAbsolutePath(), failedMessage); |
| app.close(); |
| SystemUtil.killProcess("WerFault.*"); |
| SystemUtil.sleep(2); |
| SystemUtil.killProcess("EQNEDT32.*"); |
| //WerFault.exe |
| //EQNEDT32.EXE |
| } |
| } |
| |
| |
| |
| @Test(timeout=1000*60*10) |
| @Ignore |
| public void exportTest() throws Exception { |
| //MS Office Format ->ODF |
| boolean flag = false; |
| |
| String saveAsODF = exportAsODF(operateFilePath); |
| System.out.println("MS ->ODF finished"); |
| runedScenarios = "MS ->ODF finished" + "\r\n"; |
| //ODF->MS |
| String savedMSFilePath = exportAsODF(saveAsODF); |
| File savedMSFile = new File(savedMSFilePath); |
| Assert.assertTrue("FFC Test for file : "+ savedMSFilePath, savedMSFile.exists()); |
| |
| System.out.println("ODF->MS Finished"); |
| |
| runedScenarios = runedScenarios + "ODF->MS Finished" + "\r\n"; |
| //Export ODF->PDF |
| exportAsPDF(saveAsODF); |
| System.out.println("ODF->PDF Finished"); |
| runedScenarios = runedScenarios + "ODF->PDF Finished" + "\r\n"; |
| flag = true; |
| Assert.assertTrue("FFC Test for file : "+ operateFilePath, flag); |
| isSucceed = true; |
| } |
| private String getSuffix(String file) { |
| String lowerCaseName = file.toLowerCase(); |
| String suffix = lowerCaseName.substring(lowerCaseName.lastIndexOf(".")); |
| return suffix; |
| } |
| /** |
| * return the Export ODF file path |
| * @throws IOException |
| * @throws IllegalArgumentException |
| */ |
| private String exportAsODF(String testFile) throws IOException, IllegalArgumentException { |
| XComponent document = loadSampleFile(testFile); |
| try { |
| Thread.sleep(2000); |
| } catch (InterruptedException e) { |
| e.printStackTrace(); |
| } |
| String suffix = getSuffix(testFile); |
| String filterName = filterMap.get(suffix); |
| PropertyValue[] lProperties = null; |
| lProperties = new PropertyValue[3]; |
| lProperties[0] = new PropertyValue(); |
| lProperties[0].Name = "FilterName"; |
| lProperties[0].Value = filterName; |
| lProperties[1] = new PropertyValue(); |
| lProperties[1].Name = "Overwrite"; |
| lProperties[1].Value = Boolean.TRUE; |
| lProperties[2] = new PropertyValue(); |
| lProperties[2].Name = "AsyncMode"; |
| lProperties[2].Value = new Boolean(false); |
| |
| XStorable store = (XStorable) UnoRuntime.queryInterface(XStorable.class, document); |
| File file = new File(testFile); |
| String fileName = file.getName(); |
| String saveAsFilePath = file.getParentFile().getAbsolutePath() + File.separator + fileName + "." + formatMap.get(suffix);//TODO |
| store.storeAsURL(Testspace.getUrl(saveAsFilePath), lProperties); |
| try { |
| Thread.sleep(3000); |
| } catch (InterruptedException e) { |
| e.printStackTrace(); |
| } |
| app.closeDocument(document); |
| try { |
| Thread.sleep(2000); |
| } catch (InterruptedException e) { |
| e.printStackTrace(); |
| } |
| return saveAsFilePath; |
| } |
| |
| private void exportAsPDF(String testFilePath) throws Exception { |
| XComponent xComponent = loadSampleFile(testFilePath); |
| XStorable xStorable = (XStorable) UnoRuntime.queryInterface( |
| XStorable.class, xComponent); |
| |
| PropertyValue[] aMediaDescriptor = new PropertyValue[1]; |
| aMediaDescriptor[0] = new PropertyValue(); |
| aMediaDescriptor[0].Name = "FilterName"; |
| aMediaDescriptor[0].Value = "writer_pdf_Export"; |
| File file = new File(testFilePath); |
| String fileName = file.getName(); |
| String saveAsFilePath = file.getParentFile().getAbsolutePath() + File.separator + fileName + ".pdf" ; |
| // export to pdf |
| xStorable.storeToURL(Testspace.getUrl(saveAsFilePath), aMediaDescriptor); |
| try { |
| Thread.sleep(5000); |
| } catch (InterruptedException e) { |
| e.printStackTrace(); |
| } |
| // close this document |
| app.closeDocument(xComponent); |
| File pdfFile = new File(saveAsFilePath); |
| Assert.assertTrue("Verify sample file " + testFilePath + " export to pdf!", pdfFile.exists()); |
| } |
| |
| public static void initMap() { |
| filterMap.put(".doc", "writer8"); |
| filterMap.put(".docx", "writer8"); |
| filterMap.put(".odt", "MS Word 97"); |
| filterMap.put(".ppt", "impress8"); |
| filterMap.put(".pptx", "impress8"); |
| filterMap.put(".odp", "MS PowerPoint 97"); |
| filterMap.put(".xls", "calc8"); |
| filterMap.put(".xlsx", "calc8"); |
| filterMap.put(".ods", "MS Excel 97"); |
| |
| formatMap.put(".doc", "odt"); |
| formatMap.put(".docx", "odt"); |
| formatMap.put(".odt", "doc"); |
| |
| formatMap.put(".ppt", "odp"); |
| formatMap.put(".pptx", "odp"); |
| formatMap.put(".odp", "ppt"); |
| |
| formatMap.put(".xls", "ods"); |
| formatMap.put(".xlsx", "ods"); |
| formatMap.put(".ods", "xls"); |
| } |
| private XComponent loadSampleFile(String filePath) throws IOException, IllegalArgumentException { |
| if (!"".equals(filePath)) { |
| PropertyValue[] loadProps = null; |
| if (filePath.endsWith("x")) {//ooxml sample file |
| loadProps = new PropertyValue[4]; |
| loadProps[0] = new PropertyValue(); |
| loadProps[0].Name = "Hidden"; |
| loadProps[0].Value = Boolean.TRUE; |
| loadProps[1] = new PropertyValue(); |
| loadProps[1].Name = "FilterName"; |
| String filePathLowCase = filePath.toLowerCase(); |
| if(filePathLowCase.endsWith("docx")) { |
| loadProps[1].Value = "MS Word 2007 XML"; |
| } |
| if(filePathLowCase.endsWith("pptx")){ |
| loadProps[1].Value = "MS PowerPoint 2007 XML"; |
| } |
| if(filePathLowCase.endsWith("xlsx")) { |
| loadProps[1].Value = "MS Excel 2007 XML"; |
| } |
| loadProps[2] = new PropertyValue(); |
| loadProps[2].Name = "ReadOnly"; |
| loadProps[2].Value = true; |
| loadProps[3] = new PropertyValue(); |
| loadProps[3].Name = "MacroExecutionMode"; |
| loadProps[3].Value = MacroExecMode.NEVER_EXECUTE; |
| } else { |
| loadProps = new PropertyValue[3]; |
| loadProps[0] = new PropertyValue(); |
| loadProps[0].Name = "Hidden"; |
| loadProps[0].Value = Boolean.TRUE; |
| loadProps[1] = new PropertyValue(); |
| loadProps[1].Name = "ReadOnly"; |
| loadProps[1].Value = Boolean.TRUE; |
| loadProps[2] = new PropertyValue(); |
| loadProps[2].Name = "AsyncMode"; |
| loadProps[2].Value = new Boolean(false); |
| } |
| |
| String urlPath = Testspace.getUrl(filePath); |
| XComponentLoader componentLoader = (XComponentLoader) UnoRuntime.queryInterface(XComponentLoader.class, app.getDesktop()); |
| return componentLoader.loadComponentFromURL(urlPath, "_blank", 0, loadProps); |
| } |
| return null; |
| } |
| /** |
| * the url is like this format: |
| * ftp://user:password@192.168.0.1/public/sample/testsample.doc |
| * @param url |
| * @return |
| */ |
| public String downloadFile(String url) { |
| File urlFile = new File( new File(url.replaceAll("%20", " ")).getName()); |
| |
| File tempFolderFile = new File(tempFolder); |
| if (!tempFolderFile.exists()) { |
| tempFolderFile.mkdir(); |
| } |
| String testFile = testSpaceFile.getAbsolutePath() + File.separator + "temp" + File.separator + urlFile.getName(); |
| FileUtil.download(url, new File(testFile)); |
| return testFile; |
| } |
| |
| |
| |
| } |