blob: 56dcede3ea0f7893480cc272d9e9c94dcea70ea7 [file] [log] [blame]
/**************************************************************
*
* 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 base;
import com.sun.star.lang.XMultiServiceFactory;
import helper.APIDescGetter;
import helper.AppProvider;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.PrintWriter;
import java.util.Vector;
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;
/**
*
* this class handles tests written in java and running on a fat Office
*/
public class java_fat implements TestBase
{
private static boolean m_isDebug = false;
private static boolean keepdocument = false;
private static boolean logging = true;
private static boolean newOffice = false;
private DynamicClassLoader m_aDynamicClassLoader = null;
private lib.TestParameters m_aParams;
private AppProvider m_aOffice;
public boolean executeTest(lib.TestParameters _aParams)
{
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");
Vector exclusions = null;
boolean retValue = true;
m_isDebug = m_aParams.getBool("DebugIsActive");
logging = m_aParams.getBool("LoggingIsActive");
keepdocument = m_aParams.getBool("KeepDocument");
newOffice = m_aParams.getBool(util.PropertyName.NEW_OFFICE_INSTANCE);
if (keepdocument)
{
System.setProperty("KeepDocument", "true");
}
if (ExclusionFile != null)
{
exclusions = getExclusionList(ExclusionFile, m_isDebug);
}
//get Job-Descriptions
// System.out.println("Getting Descriptions for Job: " + job);
String sDescriptionPath = (String) m_aParams.get("DescriptionPath");
DescEntry[] entries = dg.getDescriptionFor(job, sDescriptionPath, m_isDebug);
// System.out.println();
if (entries == null)
{
System.out.println("Couldn't get Description for Job: " + job);
return false;
}
// String officeProviderName = (String) m_aParams.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);
// }
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 = (XMultiServiceFactory) 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;
}
// if (m_isDebug)
// {
// System.out.println("sleeping 2 seconds..");
// }
util.utils.shortWait(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;
}
final String sObjectName = tCase.getObjectName();
// System.out.println(sObjectName + " recreated ");
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 sEntryName = aSubEntry.entryName;
final String sLongEntryName = aSubEntry.longName;
if ((exclusions != null) && (exclusions.contains(sLongEntryName)))
{
Summarizer.summarizeDown(aSubEntry, "known issue");
continue;
}
// System.out.println("running: '" + sLongEntryName + "' testcode: [" + sEntryName + "]");
// 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 == null) || tEnv.isDisposed())
{
closeExistingOffice();
tEnv = getEnv(entry, m_aParams);
tCase = tEnv.getTestCase();
}
// MultiMethodTest ifc = null;
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);
System.out.println("**** " + iae.getMessage() + " ****");
Summarizer.summarizeDown(aSubEntry, iae.getMessage());
}
catch (java.lang.NoClassDefFoundError iae)
{
System.out.println("Couldn't load class " + aSubEntry.entryName);
System.out.println("**** " + iae.getMessage() + " ****");
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)
{
// if (m_aDynamicClassLoader == null)
// m_aDynamicClassLoader = new DynamicClassLoader();
// String officeProviderName = (String) m_aParams.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(
// m_aParams);
//
// if (msf == null) {
// return null;
// }
//
// m_aParams.put("ServiceFactory", msf);
// AppProvider office = startOffice(m_aParams);
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);
return tCase.getTestEnvironment(param);
}
catch (com.sun.star.lang.DisposedException de)
{
System.out.println("Office disposed");
closeExistingOffice();
throw de;
}
catch (lib.StatusException 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.shortWait(5000);
}
}
// private void shortWait(int millis)
// {
// try
// {
// Thread.sleep(millis);
// }
// catch (java.lang.InterruptedException ie)
// {
// }
// }
private Vector getExclusionList(String url, boolean debug)
{
Vector entryList = new Vector();
String line = "#";
BufferedReader exclusion = null;
try
{
exclusion = new BufferedReader(new FileReader(url));
}
catch (java.io.FileNotFoundException fnfe)
{
if (debug)
{
System.out.println("Couldn't find file " + url);
}
return entryList;
}
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;
}
}
try
{
exclusion.close();
}
catch (java.io.IOException ioe)
{
if (debug)
{
System.out.println("Couldn't close file " + url);
}
return entryList;
}
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)
{
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;
}
}