| /************************************************************** |
| * |
| * 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 pvt.uno; |
| |
| import static org.openoffice.test.common.Testspace.*; |
| |
| import java.io.File; |
| |
| import org.junit.After; |
| import org.junit.AfterClass; |
| import org.junit.Before; |
| import org.junit.BeforeClass; |
| import org.junit.Rule; |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| import org.openoffice.test.OpenOffice; |
| import org.openoffice.test.common.DataSheet; |
| import org.openoffice.test.common.FileProvider; |
| import org.openoffice.test.common.FileProvider.FileFilter; |
| import org.openoffice.test.common.FileProvider.FileRepeat; |
| import org.openoffice.test.common.FileProvider.FileRepos; |
| import org.openoffice.test.common.FileUtil; |
| import org.openoffice.test.common.Logger; |
| 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.lang.XComponent; |
| import com.sun.star.uno.UnoRuntime; |
| import com.sun.star.util.XCloseable; |
| |
| |
| @RunWith(FileProvider.class) |
| public class Conversion { |
| |
| @Rule |
| public Logger log = Logger.getLogger(this); |
| |
| @FileRepos |
| public static String repos = System.getProperty("conversion.repos", getDataPath("uno")); |
| @FileFilter |
| public static String filter = System.getProperty("conversion.filter", |
| "-f .*(doc|dot|odt|ott)$ writer_pdf_Export pdf " |
| + "-f .*(xls|xlt|ods|ots)$ calc_pdf_Export pdf " |
| + "-f .*(ppt|ppt|odp|otp)$ impress_pdf_Export pdf " |
| + "-f .*(doc|dot|docx|docm|dotx|dotm)$ writer8 odt " |
| + "-f .*(xls|xlt|xlsx|xltx|xlsm|xltm)$ calc8 ods " |
| + "-f .*(ppt|pot|pptx|pptm|potm|potx)$ impress8 odp " |
| + "-f .*(odt|ott)$ 'MS Word 97' doc " |
| + "-f .*(ods|ots)$ 'MS Excel 97' xls " |
| + "-f .*(odp|otp)$ 'MS PowerPoint 97' ppt"); |
| |
| @FileRepeat |
| public static int repeat = Integer.parseInt(System.getProperty("conversion.repeat", "8")); |
| |
| public static String clean = System.getProperty("conversion.clean", "file"); |
| |
| public static int nLevelInfo = Integer.parseInt(System.getProperty("conversion.limitationcheck", "0")); // Level info: starts from 1, 0 means no need for limitation check |
| |
| public static long nSleep = Long.parseLong(System.getProperty("conversion.sleep", "0")); // Sleep before loadComponentFromURL and storeToURL, millisecond |
| |
| private static OpenOffice aoo = new OpenOffice(); |
| |
| private static UnoApp app = null; |
| |
| private static DataSheet result; |
| |
| private static int counter = -1; |
| |
| @BeforeClass |
| public static void beforeClass() throws Exception { |
| aoo.setUnoUrl(OpenOffice.DEFAULT_UNO_URL); |
| aoo.addArgs("-invisible", "-conversionmode", "-hidemenu", "-nofirststartwizard", "-headless", "-enableautomation"); |
| app = new UnoApp(aoo); |
| Testspace.prepareDataFile("limit_cfg.ini", aoo.getHome().toString()+"/program"); // Move limitation check file to installation dir |
| result = new DataSheet(getFile("output/" + Conversion.class.getName()+ ".xml")); |
| result.addRow("data", "File","Scenario", "No", "Time Consumed After Closing","Time Consumed After Saving","Time Consumed After Loading", "File Size", "Exported File Size"); |
| } |
| |
| @AfterClass |
| public static void afterClass() throws Exception { |
| app.close(); |
| } |
| |
| private String sourcePath = null; |
| private String targetFilterName = null; |
| private String targetExtName = null; |
| |
| private File sourceFile = null; |
| private File targetFile = null; |
| private String sourceFileUrl = null; |
| private String targetFileUrl = null; |
| |
| private String scenario = null; |
| private String sourceFileId = null; |
| private long loadTime = -1; |
| private long saveTime = -1; |
| private long closeTime = -1; |
| |
| public Conversion(String sourcePath, String targetFilterName, String targetExtName) { |
| super(); |
| this.sourcePath = sourcePath; |
| this.targetFilterName = targetFilterName; |
| this.targetExtName = targetExtName; |
| counter++; |
| } |
| |
| @Before |
| public void before() throws Exception { |
| sourceFile = new File(sourcePath); |
| sourceFileUrl = FileUtil.getUrl(this.sourceFile); |
| targetFile = getFile("classtemp/" + sourceFile.getName()+ "." + targetExtName); |
| targetFileUrl = FileUtil.getUrl(this.targetFile); |
| |
| scenario = FileUtil.getFileExtName(sourceFile.getName()).toLowerCase() + " to " + FileUtil.getFileExtName(targetFile.getName()).toLowerCase(); |
| String pathSource = sourceFile.getCanonicalPath().replace("\\", "/"); |
| String pathRepos = new File(repos).getCanonicalPath().replace("\\", "/") + "/"; |
| sourceFileId = pathSource.replace(pathRepos, ""); |
| log.info("Start [File: " + sourceFileId + "] [Size: " + (sourceFile.length() / 1024) + "KB] [Scenario: " + scenario + "]"); |
| app.start(); |
| } |
| |
| @After |
| public void after() throws Exception{ |
| result.addRow("data", sourceFileId, scenario, counter % repeat , closeTime, saveTime, loadTime, sourceFile.length(), targetFile.length()); |
| log.info("Result [After Closing: " + closeTime + "] [After Saving: " + saveTime + "] [After Loading: " + loadTime + "]"); |
| if (closeTime < 0) { |
| app.close(); |
| } else if ("file".equalsIgnoreCase(clean) && counter % repeat == 0) { |
| app.close(); |
| } |
| } |
| |
| private PropertyValue propertyValue(String name, Object value) { |
| PropertyValue p = new PropertyValue(); |
| p.Name = name; |
| p.Value= value; |
| return p; |
| } |
| |
| |
| @Test(timeout=10 * 60000) |
| public void testConversion() throws Exception { |
| try { |
| if (nSleep > 0) |
| Thread.sleep(nSleep); |
| long start = System.currentTimeMillis(); |
| XComponent doc = app.loadDocumentFromURL(sourceFileUrl, |
| propertyValue("Hidden", true), |
| propertyValue("ReadOnly", true), |
| propertyValue("AsyncMode", false), |
| propertyValue("MacroExecutionMode", MacroExecMode.NEVER_EXECUTE), |
| propertyValue("LimitationCheckLevel", nLevelInfo)); |
| |
| loadTime = System.currentTimeMillis() - start; |
| |
| if (nSleep > 0) |
| Thread.sleep(nSleep); |
| app.saveDocumentToURL(doc, targetFileUrl, |
| propertyValue( "FilterName", targetFilterName), |
| propertyValue( "Overwrite", true)); |
| saveTime = System.currentTimeMillis() - start - nSleep; |
| XCloseable xCloseable = (XCloseable) UnoRuntime.queryInterface(XCloseable.class, doc); |
| xCloseable.close(true); |
| closeTime = System.currentTimeMillis() - start - nSleep; |
| } catch (com.sun.star.task.ErrorCodeIOException e){ |
| int errCode = e.ErrCode; |
| if( 296 == errCode ) { // limitation check file |
| loadTime = -2; |
| saveTime = -2; |
| closeTime = -2; |
| } |
| |
| if( 3878 == errCode ) { // file is corrupt |
| loadTime = -3; |
| saveTime = -3; |
| closeTime = -3; |
| } |
| |
| throw e; |
| } |
| } |
| } |