package rtt.core.manager.data;
import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;
import rtt.core.archive.input.Input;
import rtt.core.archive.testsuite.Testcase;
import rtt.core.archive.testsuite.Testsuite;
import rtt.core.archive.testsuite.Testsuites;
import rtt.core.loader.ArchiveLoader;
import rtt.core.loader.fetching.SimpleFileFetching;
import rtt.core.manager.Manager.TestCaseMode;
import rtt.core.manager.data.history.InputManager;
import rtt.core.utils.RTTLogging;
public class TestsuiteManager extends AbstractDataManager<Testsuites> {
public enum TestcaseStatus {
NEW, UPDATE, NONE, ERROR;
}
public TestsuiteManager(ArchiveLoader loader) {
super(loader, new SimpleFileFetching("tsuite.xml", ""));
}
@Override
public Testsuites doLoad() throws Exception {
return unmarshall(Testsuites.class);
}
@Override
public void doSave(Testsuites data) {
marshall(Testsuites.class, data);
}
public boolean addTestsuite(final String suiteName) {
List<Testsuite> suiteList = data.getTestsuite();
for (Testsuite testsuite : suiteList) {
if (testsuite.getName().equals(suiteName)) {
if (testsuite.isDeleted()) {
RTTLogging.trace("Testsuite '" + suiteName
+ "' was tagged as deleted.");
testsuite.setDeleted(false);
return true;
}
RTTLogging.info("Testsuite '" + suiteName
+ "' is already existing.");
return false;
}
}
Testsuite newTestsuite = new Testsuite();
newTestsuite.setName(suiteName);
return data.getTestsuite().add(newTestsuite);
}
public boolean removeTestsuite(String suiteName) {
Testsuite suite = getTestsuite(suiteName, false);
if (suite != null) {
RTTLogging.trace("Testsuite '" + suiteName
+ "' will be tagged as deleted.");
suite.setDeleted(true);
return true;
}
return false;
}
public Testsuite getTestsuite(String name, boolean getDeleted) {
for (Testsuite suite : data.getTestsuite()) {
if (suite.getName().equals(name) && suite.isDeleted() == false) {
return suite;
}
}
return null;
}
public List<Testsuite> getTestsuites(boolean getDeleted) {
if (getDeleted) {
return data.getTestsuite();
}
List<Testsuite> suites = new ArrayList<Testsuite>();
for (Testsuite testsuite : data.getTestsuite()) {
if (testsuite.isDeleted() == false) {
suites.add(testsuite);
}
}
return suites;
}
public static String getCaseName(File testFile) {
return testFile.getName().substring(0,
testFile.getName().lastIndexOf('.'));
}
public TestcaseStatus addTestcase(String suiteName, File testFile,
TestCaseMode mode) throws Exception {
if (!testFile.exists()) {
throw new RuntimeException("Try to add test, but '"
+ testFile.getAbsolutePath() + "' does not exist.");
}
String caseName = getCaseName(testFile);
Testsuite suite = getTestsuite(suiteName, true);
if (suite == null) {
return TestcaseStatus.ERROR;
}
Testcase testcase = getTestcase(suiteName, caseName, true);
TestcaseStatus resultStatus = TestcaseStatus.ERROR;
boolean force = false;
int nextInputVersion = -1;
if (testcase == null) {
// add a new test case
testcase = new Testcase();
testcase.setName(caseName);
nextInputVersion = 1;
suite.getTestcase().add(testcase);
resultStatus = TestcaseStatus.NEW;
} else {
// test case already existed.
resultStatus = TestcaseStatus.UPDATE;
nextInputVersion = testcase.getInputID() + 1;
if (testcase.isDeleted()) {
testcase.setDeleted(false);
// move to last position in list
suite.getTestcase().remove(testcase);
suite.getTestcase().add(testcase);
force = true;
resultStatus = TestcaseStatus.NEW;
} else if (mode == TestCaseMode.SKIP) {
// test case existed and wasn't deleted.
RTTLogging.info("Testcase '" + caseName + "' in testsuite '"
+ suiteName + "' already existed.");
return TestcaseStatus.NONE;
}
}
InputManager inputManager = new InputManager(loader, suiteName,
caseName);
Input input = new Input();
input.setValue(InputManager.getContent(new FileInputStream(testFile)));
if (inputManager.addInput(input, force) == true) {
inputManager.save();
testcase.setInputID(nextInputVersion);
} else {
resultStatus = TestcaseStatus.NONE;
}
return resultStatus;
}
public boolean removeTestcase(String suiteName, String caseName) {
Testcase testcase = getTestcase(suiteName, caseName, true);
if (testcase != null) {
testcase.setDeleted(true);
return true;
}
return false;
}
public Testcase getTestcase(String suiteName, String caseName,
boolean getDeleted) {
Testsuite suite = getTestsuite(suiteName, getDeleted);
if (suite != null) {
for (Testcase testcase : suite.getTestcase()) {
if (testcase.getName().equals(caseName)) {
if (testcase.isDeleted()) {
if (getDeleted) {
return testcase;
} else {
return null;
}
}
return testcase;
}
}
}
return null;
}
public List<Testcase> getTestcases(String suiteName, boolean deleted) {
Testsuite suite = getTestsuite(suiteName, deleted);
if (suite != null) {
if (deleted) {
return suite.getTestcase();
} else {
List<Testcase> result = new ArrayList<Testcase>();
for (Testcase testcase : suite.getTestcase()) {
if (testcase.isDeleted() == false) {
result.add(testcase);
}
}
return result;
}
}
return null;
}
public void print() {
List<Testsuite> suites = getTestsuites(false);
RTTLogging.info("Number of suites: " + suites.size());
for (Testsuite suite : suites) {
RTTLogging.info("Test suite '" + suite.getName() + "':");
for (Testcase tcase : suite.getTestcase()) {
RTTLogging.info("\tTest case '" + tcase.getName() + "'");
}
}
}
@Override
protected Testsuites getEmptyData() {
return new Testsuites();
}
}