blob: 7fb9fa8a57907e279146f661e59f6bd61d212377 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011 Anton Gorenkov
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Anton Gorenkov - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.testsrunner.internal.qttest;
import java.io.IOException;
import java.io.InputStream;
import java.text.MessageFormat;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.eclipse.cdt.testsrunner.launcher.ITestsRunnerProvider;
import org.eclipse.cdt.testsrunner.model.ITestModelUpdater;
import org.eclipse.cdt.testsrunner.model.TestingException;
import org.xml.sax.SAXException;
/**
* The Tests Runner provider plug-in to run tests with Qt Test library.
*
* Configures the test module to output in XML format, parses the output and
* provides the data for the Tests Runner Plug-in.
*/
public class QtTestsRunnerProvider implements ITestsRunnerProvider {
/**
* Checks whether the specified path is "special" one ("initTestCase" or
* "cleanupTestCase").
*
* @param testPath test path to check
* @return true if the path is special and false otherwise
*/
private boolean isSpecialTestPath(String[] testPath) {
// Root test suite should not be explicitly specified for rerun
if (testPath.length <= 1) {
return true;
}
// "initTestCase" & "cleanupTestCase" are special test case names and they should be skipped too
String testName = testPath[testPath.length-1];
return testName.equals("initTestCase") || testName.equals("cleanupTestCase"); //$NON-NLS-1$ //$NON-NLS-2$
}
/**
* Returns the count of not "special" test paths.
*
* @param testPaths test paths array
* @return the count
* @see isSpecialTestPath()
*/
private int getNonSpecialTestsCount(String[][] testPaths) {
int result = 0;
for (int i = 0; i < testPaths.length; i++) {
String[] testPath = testPaths[i];
result += isSpecialTestPath(testPath) ? 0 : 1;
}
return result;
}
@Override
public String[] getAdditionalLaunchParameters(String[][] testPaths) throws TestingException {
final String[] qtParameters = {
"-xml", //$NON-NLS-1$
"-flush", //$NON-NLS-1$
};
String[] result = qtParameters;
if (testPaths != null) {
int testPathsLength = getNonSpecialTestsCount(testPaths);
// If there are only special test cases specified
if ((testPathsLength == 0) != (testPaths.length == 0)) {
throw new TestingException(QtTestsRunnerMessages.QtTestsRunner_no_test_cases_to_rerun);
}
// Build tests filter
if (testPathsLength >= 1) {
result = new String[qtParameters.length + testPathsLength];
System.arraycopy(qtParameters, 0, result, 0, qtParameters.length);
int resultIdx = qtParameters.length;
for (int i = 0; i < testPaths.length; i++) {
String[] testPath = testPaths[i];
if (!isSpecialTestPath(testPath)) {
result[resultIdx] = testPath[testPath.length-1];
resultIdx++;
}
}
}
}
return result;
}
/**
* Construct the error message from prefix and detailed description.
*
* @param prefix prefix
* @param description detailed description
* @return the full message
*/
private String getErrorText(String prefix, String description) {
return MessageFormat.format(QtTestsRunnerMessages.QtTestsRunner_error_format, prefix, description);
}
@Override
public void run(ITestModelUpdater modelUpdater, InputStream inputStream) throws TestingException {
try {
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
sp.parse(inputStream, new QtXmlLogHandler(modelUpdater));
} catch (IOException e) {
throw new TestingException(getErrorText(QtTestsRunnerMessages.QtTestsRunner_io_error_prefix, e.getLocalizedMessage()));
} catch (ParserConfigurationException e) {
throw new TestingException(getErrorText(QtTestsRunnerMessages.QtTestsRunner_xml_error_prefix, e.getLocalizedMessage()));
} catch (SAXException e) {
throw new TestingException(getErrorText(QtTestsRunnerMessages.QtTestsRunner_xml_error_prefix, e.getLocalizedMessage()));
}
}
}