/* * This file is part of the LibreOffice project. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * This file incorporates work covered by the following license notice: * * 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 . */ package base; import helper.APIDescGetter; import helper.AppProvider; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.InputStreamReader; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import lib.MultiMethodTest; import lib.TestCase; import lib.TestEnvironment; import lib.TestParameters; import lib.TestResult; import share.DescEntry; import share.DescGetter; import share.LogWriter; import stats.OutProducerFactory; import stats.Summarizer; import util.DynamicClassLoader; import com.sun.star.lang.XMultiServiceFactory; /** * * this class handles tests written in java and running on a fat Office */ public class java_fat implements TestBase { private boolean logging = true; private DynamicClassLoader m_aDynamicClassLoader = null; private lib.TestParameters m_aParams; private AppProvider m_aOffice; public boolean executeTest(lib.TestParameters _aParams) throws Exception { m_aParams = _aParams; m_aDynamicClassLoader = new DynamicClassLoader(); DescGetter dg = new APIDescGetter(); String job = (String) m_aParams.get("TestJob"); String ExclusionFile = (String) m_aParams.get("ExclusionList"); ArrayList exclusions = null; boolean retValue = true; boolean isDebug = m_aParams.getBool("DebugIsActive"); logging = m_aParams.getBool("LoggingIsActive"); boolean keepdocument = m_aParams.getBool("KeepDocument"); boolean newOffice = m_aParams .getBool(util.PropertyName.NEW_OFFICE_INSTANCE); if (keepdocument) { System.setProperty("KeepDocument", "true"); } if (ExclusionFile != null) { exclusions = getExclusionList(ExclusionFile, isDebug); } String sDescriptionPath = (String) m_aParams.get("DescriptionPath"); DescEntry[] entries = dg.getDescriptionFor(job, sDescriptionPath, isDebug); if (entries == null) { System.out.println("Couldn't get Description for Job: " + job); return false; } m_aOffice = startOffice(m_aParams); boolean firstRun = true; // Run through all entries (e.g. sw.SwXBookmark.*) for (int l = 0; l < entries.length; l++) { DescEntry entry = entries[l]; if (entry == null) { continue; } if (entry.hasErrorMsg) { System.out.println(entries[l].ErrorMsg); retValue = false; continue; } if (!firstRun && newOffice) { if (!m_aOffice.closeExistingOffice(m_aParams, true)) { m_aOffice.disposeManager(m_aParams); } startOffice(m_aParams); } firstRun = false; XMultiServiceFactory msf = m_aParams.getMSF(); if (msf == null) { retValue = false; continue; } // get some helper classes Summarizer sumIt = new Summarizer(); TestCase tCase = getTestCase(entry); if (tCase == null) { continue; } util.utils.pause(2000); System.out.println("Creating: " + entry.entryName); LogWriter log = (LogWriter) m_aDynamicClassLoader .getInstance((String) m_aParams.get("LogWriter")); log.initialize(entry, logging); entry.UserDefinedParams = m_aParams; tCase.setLogWriter((PrintWriter) log); tCase.initializeTestCase(m_aParams); TestEnvironment tEnv = getTestEnvironment(tCase, entry); if (tEnv == null) { continue; } for (int j = 0; j < entry.SubEntryCount; j++) { DescEntry aSubEntry = entry.SubEntries[j]; final boolean bIsToTest = aSubEntry.isToTest; if (!bIsToTest) { Summarizer.summarizeDown(aSubEntry, "not part of the job"); continue; } final String sLongEntryName = aSubEntry.longName; if ((exclusions != null) && (exclusions.contains(sLongEntryName))) { Summarizer.summarizeDown(aSubEntry, "known issue"); continue; } // this will shown in test itself LogWriter ifclog = (LogWriter) m_aDynamicClassLoader .getInstance((String) m_aParams.get("LogWriter")); ifclog.initialize(aSubEntry, logging); aSubEntry.UserDefinedParams = m_aParams; aSubEntry.Logger = ifclog; if (tEnv.isDisposed()) { closeExistingOffice(); tEnv = getEnv(entry, m_aParams); tCase = tEnv.getTestCase(); } lib.TestResult res = null; // run the interface test twice if it failed. int countInterfaceTestRun = 0; boolean finished = false; while (!finished) { try { countInterfaceTestRun++; finished = true; res = executeInterfaceTest(aSubEntry, tEnv, m_aParams); } catch (IllegalArgumentException iae) { System.out.println("Couldn't load class " + aSubEntry.entryName + ":"); iae.printStackTrace(System.out); Summarizer.summarizeDown(aSubEntry, iae.getMessage()); } catch (java.lang.NoClassDefFoundError iae) { System.out.println("Couldn't load class " + aSubEntry.entryName + ":"); iae.printStackTrace(System.out); Summarizer.summarizeDown(aSubEntry, iae.getMessage()); } catch (java.lang.RuntimeException e) { closeExistingOffice(); tEnv = getEnv(entry, m_aParams); tCase = tEnv.getTestCase(); if (countInterfaceTestRun < 2) { finished = false; } else { Summarizer.summarizeDown(aSubEntry, e.toString() + ".FAILED"); } } } setState(aSubEntry, res); sumIt.summarizeUp(aSubEntry); LogWriter sumIfc = OutProducerFactory .createOutProducer(m_aParams); aSubEntry.UserDefinedParams = m_aParams; sumIfc.initialize(aSubEntry, logging); sumIfc.summary(aSubEntry); } try { if (!keepdocument) { tCase.cleanupTestCase(m_aParams); } } catch (Exception e) { System.err.println("couldn't cleanup:" + e.toString()); } catch (java.lang.NoClassDefFoundError e) { System.err.println("couldn't cleanup:" + e.toString()); } sumIt.summarizeUp(entry); LogWriter sumObj = OutProducerFactory.createOutProducer(m_aParams); sumObj.initialize(entry, logging); sumObj.summary(entry); } if (entries.length > 0) { System.out.println(); int counter = 0; System.out .println("Failures that appeared during scenario execution:"); for (int i = 0; i < entries.length; i++) { final String sState = entries[i].State; if (!sState.endsWith("OK")) { System.out.println("\t " + entries[i].longName); counter++; } } System.out.println(counter + " of " + entries.length + " tests failed"); if (counter != 0) { retValue = false; } } closeExistingOffice(); return retValue; } private TestEnvironment getTestEnvironment(TestCase tCase, DescEntry entry) { TestEnvironment tEnv = null; try { tEnv = tCase.getTestEnvironment(m_aParams); } catch (Exception e) { System.out.println("Exception while creating " + tCase.getObjectName()); System.out.println("Message " + e.getMessage()); e.printStackTrace(); tEnv = null; } catch (java.lang.UnsatisfiedLinkError e) { System.out.println("Exception while creating " + tCase.getObjectName()); System.out.println("Message " + e.getMessage()); tEnv = null; } catch (java.lang.NoClassDefFoundError e) { System.out.println("Exception while creating " + tCase.getObjectName()); System.out.println("Message " + e.getMessage()); tEnv = null; } if (tEnv == null) { Summarizer.summarizeDown(entry, "Couldn't create " + tCase.getObjectName()); LogWriter sumObj = OutProducerFactory.createOutProducer(m_aParams); entry.UserDefinedParams = m_aParams; sumObj.initialize(entry, logging); sumObj.summary(entry); } return tEnv; } private TestCase getTestCase(DescEntry _aEntry) { TestCase tCase = null; try { tCase = (TestCase) m_aDynamicClassLoader.getInstance("mod._" + _aEntry.entryName); } catch (java.lang.IllegalArgumentException ie) { _aEntry.ErrorMsg = ie.getMessage(); _aEntry.hasErrorMsg = true; } catch (java.lang.NoClassDefFoundError ie) { _aEntry.ErrorMsg = ie.getMessage(); _aEntry.hasErrorMsg = true; } if (tCase == null) { Summarizer.summarizeDown(_aEntry, _aEntry.ErrorMsg); LogWriter sumObj = OutProducerFactory.createOutProducer(m_aParams); _aEntry.UserDefinedParams = m_aParams; sumObj.initialize(_aEntry, logging); sumObj.summary(_aEntry); } return tCase; } private void setState(DescEntry aSubEntry, lib.TestResult res) { if (res != null) { for (int k = 0; k < aSubEntry.SubEntryCount; k++) { DescEntry aSubSubEntry = aSubEntry.SubEntries[k]; if (res.hasMethod(aSubSubEntry.entryName)) { aSubSubEntry.State = res.getStatusFor( aSubSubEntry.entryName).toString(); } } } } private TestEnvironment getEnv(DescEntry entry, TestParameters param) throws Exception { TestCase tCase = null; try { tCase = (TestCase) m_aDynamicClassLoader.getInstance("mod._" + entry.entryName); } catch (java.lang.IllegalArgumentException ie) { entry.ErrorMsg = ie.getMessage(); entry.hasErrorMsg = true; } catch (java.lang.NoClassDefFoundError ie) { entry.ErrorMsg = ie.getMessage(); entry.hasErrorMsg = true; } System.out.println("Creating: " + entry.entryName); entry.UserDefinedParams = param; LogWriter log = (LogWriter) m_aDynamicClassLoader .getInstance((String) param.get("LogWriter")); log.initialize(entry, logging); tCase.setLogWriter((PrintWriter) log); try { tCase.initializeTestCase(param); TestEnvironment tEnv = tCase.getTestEnvironment(param); if (tEnv == null) { throw new Exception("Could not get env for '" + entry.entryName + "'"); } return tEnv; } catch (com.sun.star.lang.DisposedException de) { System.out.println("Office disposed"); closeExistingOffice(); throw de; } catch (Exception e) { System.out.println(e.getMessage()); closeExistingOffice(); entry.ErrorMsg = e.getMessage(); entry.hasErrorMsg = true; throw e; } } private void closeExistingOffice() { helper.ProcessHandler ph = (helper.ProcessHandler) m_aParams .get("AppProvider"); if (ph != null) { m_aOffice.closeExistingOffice(m_aParams, true); util.utils.pause(5000); } } private ArrayList getExclusionList(String url, boolean debug) { ArrayList entryList = new ArrayList(); String line = "#"; BufferedReader exclusion = null; try { InputStreamReader reader = new InputStreamReader(new FileInputStream(url), "UTF-8"); exclusion = new BufferedReader(reader); } catch (java.io.UnsupportedEncodingException uee) { if (debug) { System.out.println("Couldn't decode file " + url); } return entryList; } catch (java.io.FileNotFoundException fnfe) { if (debug) { System.out.println("Couldn't find file " + url); } return entryList; } try { while (line != null) { try { if (!line.startsWith("#") && (line.length() > 1)) { entryList.add(line.trim()); } line = exclusion.readLine(); } catch (java.io.IOException ioe) { if (debug) { System.out .println("Exception while reading exclusion list"); } return entryList; } } } finally { try { exclusion.close(); } catch (java.io.IOException ioe) { } } return entryList; } private TestResult executeInterfaceTest(DescEntry entry, TestEnvironment tEnv, TestParameters param) throws IllegalArgumentException, java.lang.NoClassDefFoundError { MultiMethodTest ifc = (MultiMethodTest) m_aDynamicClassLoader .getInstance(entry.entryName); return ifc.run(entry, tEnv, param); } private AppProvider startOffice(lib.TestParameters param) throws UnsupportedEncodingException { if (m_aDynamicClassLoader == null) { m_aDynamicClassLoader = new DynamicClassLoader(); } String officeProviderName = (String) param.get("OfficeProvider"); AppProvider office = (AppProvider) m_aDynamicClassLoader .getInstance(officeProviderName); if (office == null) { System.out.println("ERROR: Wrong parameter 'OfficeProvider', " + " it cannot be instantiated."); System.exit(-1); } XMultiServiceFactory msf = (XMultiServiceFactory) office .getManager(param); if (msf != null) { param.put("ServiceFactory", msf); } return office; } }