blob: 05102460b90bbc81f70d4853e699977c1cddee76 [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 convwatch;
// imports
import java.util.ArrayList;
import java.io.File;
import java.io.FileFilter;
import convwatch.EnhancedComplexTestCase;
import com.sun.star.lang.XMultiServiceFactory;
import convwatch.ConvWatchException;
import convwatch.DirectoryHelper;
import convwatch.GraphicalTestArguments;
import convwatch.HTMLOutputter;
import helper.OfficeProvider;
import helper.OfficeWatcher;
import helper.OSHelper;
import convwatch.PerformanceContainer;
/**
* The following Complex Test will test
* an already created document and it's postscript output (by an older office version)
* with a new office version.
* This test use Ghostscript for the jpeg export and graphically compare tools from ImageMagick.
* Read the manual for more information.
*
* this is only the starter program
* more is found in qadevOOo/runner/convwatch/*
*/
public class ConvWatchStarter extends EnhancedComplexTestCase
{
// The first of the mandatory functions:
/**
* Return the name of the test.
* In this case it is the actual name of the service.
* @return The tested service.
*/
// public String getTestObjectName() {
// return "ConvWatch runner";
// }
// The second of the mandatory functions: return all test methods as an
// array. There is only one test function in this example.
/**
* Return all test methods.
* @return The test methods.
*/
public String[] getTestMethodNames() {
return new String[]{"compareGraphicalDiffs"};
}
String m_sInputPath = "";
String m_sReferencePath = "";
String m_sOutputPath = "";
String m_sDiffPath = null;
private void initMember()
{
// MUST PARAMETER
// INPUTFILE ----------
String sINPATH = (String)param.get( PropertyName.DOC_COMPARATOR_INPUT_PATH );
boolean bQuit = false;
if (sINPATH == null || sINPATH.length() == 0)
{
log.println("Please set input path (path to documents) " + PropertyName.DOC_COMPARATOR_INPUT_PATH + "=path.");
bQuit = true;
}
else
{
log.println("found " + PropertyName.DOC_COMPARATOR_INPUT_PATH + " " + sINPATH);
m_sInputPath = sINPATH;
}
// REFERENCE_PATH ----------
String sREF = (String)param.get( PropertyName.DOC_COMPARATOR_REFERENCE_PATH );
if (sREF == null || sREF.length() == 0)
{
// log.println("Please set reference file (path to good documents) REFERENCEFILE=path.");
log.println("Assumtion, reference directory and input directory are the same.");
m_sReferencePath = m_sInputPath;
}
else
{
log.println("found " + PropertyName.DOC_COMPARATOR_REFERENCE_PATH + " " + sREF);
m_sReferencePath = sREF;
}
// OUTPUT_PATH ----------
String sOUT = (String)param.get( PropertyName.DOC_COMPARATOR_OUTPUT_PATH );
if (sOUT == null || sOUT.length() == 0)
{
log.println("Please set output path (path to a temp directory) " + PropertyName.DOC_COMPARATOR_OUTPUT_PATH + "=path.");
bQuit = true;
}
else
{
log.println("found " + PropertyName.DOC_COMPARATOR_OUTPUT_PATH + " " + sOUT);
m_sOutputPath = sOUT;
}
if (bQuit == true)
{
// log.println("must quit.");
assure("Must quit", false);
}
// DIFF_PATH ----------
String sDIFF = (String)param.get( PropertyName.DOC_COMPARATOR_DIFF_PATH );
if (sDIFF == null || sDIFF.length() == 0)
{
}
else
{
log.println("found " + PropertyName.DOC_COMPARATOR_DIFF_PATH + " " + sDIFF);
m_sDiffPath = sDIFF;
}
if (m_sInputPath.startsWith("file:") ||
m_sReferencePath.startsWith("file:") ||
m_sOutputPath.startsWith("file:"))
{
assure("We can't handle file: URL right, use system path instead.", false);
}
}
/**
*
* @return a List of software which must accessable as an external executable
*/
protected Object[] mustInstalledSoftware()
{
ArrayList aList = new ArrayList();
// Tools from ImageMagick
if (! OSHelper.isWindows())
{
aList.add( "composite -version" );
aList.add( "identify -version" );
// Ghostscript
aList.add( "gs -version" );
}
else
{
aList.add( "composite.exe -version" );
aList.add( "identify.exe -version" );
// Ghostscript
aList.add( "gswin32c.exe -version" );
}
return aList.toArray();
}
/**
* The test method itself.
* Don't try to call it from outside, it is started only from qadevOOo runner
*/
/* protected */
public void compareGraphicalDiffs()
{
GlobalLogWriter.set(log);
String sDBConnection = (String)param.get( PropertyName.DB_CONNECTION_STRING );
// check if all need software is installed and accessable
checkEnvironment(mustInstalledSoftware());
GraphicalTestArguments aGTA = getGraphicalTestArguments();
if (aGTA == null)
{
assure("Must quit", false);
}
if (aGTA.cancelRequest())
{
return;
}
initMember();
aGTA.allowStore();
String sBuildID = aGTA.getBuildID();
log.println("Current Office has buildid: " + sBuildID);
// LLA: sample code, how to access all parameters
// for (Enumeration e = param.keys() ; e.hasMoreElements() ;)
// {
// System.out.println(e.nextElement());
// }
String fs = System.getProperty("file.separator");
String sHTMLName = "index.html";
File aInputPathTest = new File(m_sInputPath);
if (!aInputPathTest.isDirectory())
{
int n = m_sInputPath.lastIndexOf(fs);
sHTMLName = m_sInputPath.substring(n + 1);
sHTMLName += ".html";
}
HTMLOutputter HTMLoutput = HTMLOutputter.create(m_sOutputPath, sHTMLName, "", "");
HTMLoutput.header( m_sOutputPath );
HTMLoutput.indexSection( m_sOutputPath );
LISTOutputter LISToutput = LISTOutputter.create(m_sOutputPath, "allfiles.txt");
DB.init(aGTA.getDBInfoString() + "," + sDBConnection);
File aInputPath = new File(m_sInputPath);
if (aInputPath.isDirectory())
{
// check a whole directory
// a whole directory
FileFilter aFileFilter = FileHelper.getFileFilter();
Object[] aList = DirectoryHelper.traverse(m_sInputPath, aFileFilter, aGTA.includeSubDirectories());
if (aList.length == 0)
{
log.println("Nothing to do, there are no document files found.");
}
else
{
for (int i=0;i<aList.length;i++)
{
String sEntry = (String)aList[i];
log.println("- next file is: ------------------------------");
log.println(sEntry);
String sNewSubDir = FileHelper.removeFirstDirectorysAndBasenameFrom(sEntry, m_sInputPath);
String sNewReferencePath = m_sReferencePath;
String sNewOutputPath = m_sOutputPath;
String sNewDiffPath = m_sDiffPath;
if (sNewSubDir.length() > 0)
{
if (sNewReferencePath != null)
sNewReferencePath = sNewReferencePath + fs + sNewSubDir;
// String sNameNoSuffix = FileHelper.getNameNoSuffix(FileHelper.getBasename(sEntry));
// sNewReferenceFile = sNewReferencePath + fs + sNameNoSuffix + ".prn";
sNewOutputPath = sNewOutputPath + fs + sNewSubDir;
if (sNewDiffPath != null)
sNewDiffPath = sNewDiffPath + fs + sNewSubDir;
}
// NameHelper aNameContainer = new NameHelper(m_sOutputPath, sNewSubDir, FileHelper.getBasename(sEntry));
// aNameContainer.print();
if (aGTA.checkIfUsableDocumentType(sEntry))
{
runGDCWithStatus(HTMLoutput, LISToutput, sEntry, sNewOutputPath, sNewReferencePath, sNewDiffPath, sNewSubDir);
}
if (aGTA.cancelRequest())
{
break;
}
}
}
}
else
{
// check exact name
if (aGTA.checkIfUsableDocumentType(m_sInputPath))
{
runGDCWithStatus(HTMLoutput, LISToutput, m_sInputPath, m_sOutputPath, m_sReferencePath, m_sDiffPath, "");
}
}
LISToutput.close();
HTMLoutput.close();
log.println("The file '" + HTMLoutput.getFilename() + "' shows a html based status.");
DB.writeHTMLFile(HTMLoutput.getFilename());
}
// -----------------------------------------------------------------------------
void runGDCWithStatus(HTMLOutputter _aHTMLoutput, LISTOutputter _aLISToutput, String _sInputFile, String _sOutputPath, String _sReferencePath, String _sDiffPath, String _sNewSubDir )
{
// start a fresh Office
GraphicalTestArguments aGTA = getGraphicalTestArguments();
OfficeProvider aProvider = null;
// SimpleFileSemaphore aSemaphore = new SimpleFileSemaphore();
if (aGTA.shouldOfficeStart())
{
// if (OSHelper.isWindows())
// {
// aSemaphore.P(aSemaphore.getSemaphoreFile());
// }
aGTA.getPerformance().startTime(PerformanceContainer.OfficeStart);
aProvider = new OfficeProvider();
XMultiServiceFactory xMSF = (XMultiServiceFactory) aProvider.getManager(param);
param.put("ServiceFactory", xMSF);
aGTA.getPerformance().stopTime(PerformanceContainer.OfficeStart);
long nStartTime = aGTA.getPerformance().getTime(PerformanceContainer.OfficeStart);
aGTA = getGraphicalTestArguments(); // get new TestArguments
aGTA.getPerformance().setTime(PerformanceContainer.OfficeStart, nStartTime);
}
// Watcher Object is need in log object to give a simple way to say if a running office is alive.
// As long as a log comes, it pings the Watcher and says the office is alive, if not an
// internal counter increase and at a given point (300 seconds) the office is killed.
GlobalLogWriter.get().println("Set office watcher");
OfficeWatcher aWatcher = (OfficeWatcher)param.get("Watcher");
GlobalLogWriter.get().setWatcher(aWatcher);
// initializeWatcher(param);
String sStatusRunThrough = "";
String sStatusMessage = "";
try
{
DB.destination_start();
// better was:
// load document
// create postscript from document
// check file
GraphicalDifferenceCheck.checkOneFile(_sInputFile, _sOutputPath, _sReferencePath, _sDiffPath, aGTA);
sStatusRunThrough = "PASSED, OK";
DB.destination_finished();
}
catch(ConvWatchCancelException e)
{
assure(e.getMessage(), false, true);
sStatusRunThrough = "CANCELLED, FAILED";
sStatusMessage = e.getMessage();
DB.destination_failed(sStatusRunThrough, sStatusMessage);
}
catch(ConvWatchException e)
{
assure(e.getMessage(), false, true);
sStatusMessage = e.getMessage();
sStatusRunThrough = "PASSED, FAILED";
DB.destination_failed(sStatusRunThrough, sStatusMessage);
}
catch(com.sun.star.lang.DisposedException e)
{
assure(e.getMessage(), false, true);
sStatusMessage = e.getMessage();
sStatusRunThrough = "FAILED, FAILED";
DB.destination_failed(sStatusRunThrough, sStatusMessage);
}
GlobalLogWriter.get().println("Watcher count is: " + aWatcher.getPing());
// Office shutdown
if (aProvider != null)
{
aProvider.closeExistingOffice(param, true);
// if (OSHelper.isWindows())
// {
// aSemaphore.V(aSemaphore.getSemaphoreFile());
// aSemaphore.sleep(2);
// // wait some time maybe an other process will take the semaphore
// // I know, this is absolutly dirty, but the whole convwatch is dirty and need a big cleanup.
// }
}
// -------------------- Status --------------------
String fs = System.getProperty("file.separator");
String sBasename = FileHelper.getBasename(_sInputFile);
String sFilenameNoSuffix = FileHelper.getNameNoSuffix(sBasename);
// -------------------- List of all files -----------------
String sListFile;
if (_sNewSubDir.length() > 0)
{
sListFile = _sNewSubDir + fs + sFilenameNoSuffix + ".ini";
}
else
{
sListFile = sFilenameNoSuffix + ".ini";
}
_aLISToutput.writeValue(sListFile);
// -------------------- HTML --------------------
String sLink;
String sLinkDD;
String sLinkName;
String sLinkDDName;
String sHTMLPrefix = aGTA.getHTMLOutputPrefix();
GlobalLogWriter.get().println("----------------------------------------------------------------------");
GlobalLogWriter.get().println(" OutputPath: " + _sOutputPath);
GlobalLogWriter.get().println(" NewPath: " + _sNewSubDir);
GlobalLogWriter.get().println("----------------------------------------------------------------------");
// if (_sNewSubDir.length() > 0)
// {
// sLink = sHTMLPrefix /* + "/cw.php?inifile=" */ + _sOutputPath + fs + _sNewSubDir + fs + sFilenameNoSuffix + ".ini";
// sLinkDD = sHTMLPrefix /* + "/cw.php?inifile=" */ + _sOutputPath + fs + _sNewSubDir + fs + "DiffDiff_" + sFilenameNoSuffix + ".ini";
// }
// else
// {
sLink = sHTMLPrefix /* + "/cw.php?inifile=" */ + _sOutputPath + fs + sFilenameNoSuffix + ".ini";
// sLinkDD = sHTMLPrefix /* + "/cw.php?inifile=" */ + _sOutputPath + fs + _sNewSubDir + fs + "DiffDiff_" + sFilenameNoSuffix + ".ini";
sLinkDD = sHTMLPrefix /* + "/cw.php?inifile=" */ + _sOutputPath + fs + "DiffDiff_" + sFilenameNoSuffix + ".ini";
// }
sLinkName = sFilenameNoSuffix;
sLinkDDName = sFilenameNoSuffix + " (DiffDiff)";
if (_sDiffPath != null && _sDiffPath.length() > 0)
{
_aHTMLoutput.indexLine( sLinkDD, sLinkDDName, sLink, sLinkName, sStatusRunThrough, sStatusMessage );
}
else
{
_aHTMLoutput.indexLine( sLink, sLinkName, "", "", sStatusRunThrough, sStatusMessage );
}
}
}