diff -r f1112f777ce9 -r 96906a986c3b testdev/ite/src/com.nokia.testfw.core/src/com/nokia/testfw/core/model/result/TestRunResult.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/testdev/ite/src/com.nokia.testfw.core/src/com/nokia/testfw/core/model/result/TestRunResult.java Tue Mar 30 14:39:29 2010 +0800 @@ -0,0 +1,342 @@ +/* + * Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * This component and the accompanying materials are made available + * under the terms of "Eclipse Public License v1.0" + * which accompanies this distribution, and is available + * at the URL "http://www.eclipse.org/legal/epl-v10.html". + * + * Initial Contributors: + * Nokia Corporation - initial contribution. + * + * Contributors: + * + * Description: + * + */ +package com.nokia.testfw.core.model.result; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.Set; + +import org.eclipse.core.runtime.IStatus; + +import com.nokia.testfw.core.StfPlugin; +import com.nokia.testfw.core.model.result.TestResult.TestStatus; + +/** + * Result for one test run. It has summary counters and detail result for each + * test case. + *

+ * + * This result will be updated during test execution. + * + *

+ * + */ +public class TestRunResult { + int testCount = 0; + int passedTestCount = 0; + int failedTestCount = 0; + int skippedTestCount = 0; + + LinkedHashMap root; + ArrayList listeners; + + public TestRunResult() { + root = new LinkedHashMap(); + listeners = new ArrayList(); + } + + public int getTestCount() { + return testCount; + } + + public int getPassedTestCount() { + return passedTestCount; + } + + public int getfailedTestCount() { + return failedTestCount; + } + + public int getSkippedTestCount() { + return skippedTestCount; + } + + /** + * add a suite to the result. + * + * @param suiteName + * @return + */ + public synchronized TestSuiteResult addTestSuite(String suiteName) { + String[] suites = suiteName.split("\\."); + + TestResult testResult; + TestSuiteResult parentSuite = null; + for (String suite : suites) { + if (parentSuite == null) { + testResult = root.get(new TestSuiteResult(suite) + .getUniqueName()); + } else { + testResult = parentSuite.getChild(suite); + } + if ((testResult == null) + || !(testResult instanceof TestSuiteResult)) { + testResult = new TestSuiteResult(suite); + if (parentSuite == null) { + root.put(testResult.getUniqueName(), testResult); + } else { + parentSuite.addTestResult(testResult); + } + } + parentSuite = (TestSuiteResult) testResult; + } + + return parentSuite; + } + + /** + * add a test case to the result + * + * @param suiteName + * , maybe null if no associated suite + * @param caseName + * , test case name + * @return + */ + public synchronized TestCaseResult addTestCase(String suiteName, + String caseName) { + TestCaseResult result = new TestCaseResult(caseName); + if (suiteName == null) { + // top level result + root.put(result.getUniqueName(), result); + } else { + TestSuiteResult suite = addTestSuite(suiteName); + suite.addTestResult(result); + } + testCount++; + for (TestResultListener listener : listeners) { + listener.addTestCase(result); + } + return result; + } + + /** + * add a suite to the result. + * + * @param suiteName + * @return + */ + public TestSuiteResult getTestSuite(String suiteName) { + String[] suites = suiteName.split("\\."); + + TestResult testResult; + TestSuiteResult parentSuite = null; + for (String suite : suites) { + if (parentSuite == null) { + testResult = root.get(new TestSuiteResult(suite) + .getUniqueName()); + } else { + testResult = parentSuite.getChild(suite); + } + if ((testResult != null) && (testResult instanceof TestSuiteResult)) { + parentSuite = (TestSuiteResult) testResult; + } else { + return null; + } + } + + return parentSuite; + } + + private TestCaseResult getTestCaseResult(String suiteName, String caseName) { + if (suiteName == null) { + return (TestCaseResult) root.get((new TestCaseResult(caseName)) + .getUniqueName()); + } else { + TestSuiteResult suite = getTestSuite(suiteName); + if (suite != null) { + TestResult result = suite.getChild(caseName); + if (result instanceof TestCaseResult) { + return (TestCaseResult) result; + } + } + return null; + } + } + + /** + * update test case status and execution time. notify all listener about the + * test case state change + * + * @param suiteName + * , test suite name + * @param caseName + * , test case name + * @param status + * , the test case status + * @param time + * , will be ignored if set to -1 + * @see TestStatus + * @see TestResultListener + */ + public synchronized TestCaseResult updateCaseStatus(String suiteName, + String caseName, TestStatus status, double time) { + TestCaseResult result = getTestCaseResult(suiteName, caseName); + if (result != null) { + updateCaseStatus(result, status, time); + } else { + StringBuilder sb = new StringBuilder("unknown test case: "); + if (suiteName != null) { + sb.append(suiteName).append("."); + } + sb.append(caseName); + StfPlugin.log(IStatus.ERROR, sb.toString()); + } + return result; + } + + /** + * update test case status and execution time. notify all listener about the + * test case state change + * + * @param result + * , test case result + * @param status + * , the test case status + * @param time + * , will be ignored if set to -1 + * @see TestStatus + * @see TestResultListener + */ + public synchronized TestCaseResult updateCaseStatus(TestCaseResult result, + TestStatus status, double time) { + result.setStatus(status); + if (time >= 0) { + result.setTime(time); + } + switch (status) { + case SUCCESS: + passedTestCount++; + break; + case FAILURE: + failedTestCount++; + break; + case SKIP: + skippedTestCount++; + break; + case STARTED: + break; + default: + StfPlugin.log(IStatus.ERROR, "unknown teststatus:" + status); + } + updateSuiteResult(result, status); + for (TestResultListener listener : listeners) { + listener.testCaseStateChange(result, status); + } + return result; + } + + private void updateSuiteResult(TestResult result, TestStatus status) { + TestSuiteResult suite = result.iParent; + if (suite == null) { + return; + } + if (status == TestStatus.STARTED) { + if (suite.getStatus() == TestStatus.NOTSTART) { + suite.setStatus(TestStatus.STARTED); + } + } else if (status == TestStatus.FAILURE) { + suite.setStatus(status); + } else if (status == TestStatus.SKIP) { + if (suite.getStatus() != TestStatus.FAILURE) { + suite.setStatus(status); + } + } else if (status == TestStatus.SUCCESS) { + // set the suite to pass only all cases passed + boolean suitePassed = true; + for (TestResult test : suite.getChildren()) { + if (test.getStatus() != TestStatus.SUCCESS) { + suitePassed = false; + break; + } + }// end of for + if (suitePassed) { + suite.setStatus(TestStatus.SUCCESS); + } + } + updateSuiteResult(suite, suite.getStatus()); + } + + /** + * add a new test result listener + * + * @param listener + * , the listener + */ + public void addResultListener(TestResultListener listener) { + listeners.add(listener); + } + + /** + * remove a test listener from the result + * + * @param listener + * , the listener to remove + */ + public void removeResultListener(TestResultListener listener) { + listeners.remove(listener); + } + + /** + * notify all listeners that test has started + * + * @see TestResultListener + */ + public void testStarted() { + for (TestResultListener listener : listeners) { + listener.testStarted(); + } + } + + /** + * notify all listeners the test has finished. + * + * @see TestResultListener + */ + public void testFinished() { + for (TestResultListener listener : listeners) { + listener.testFinished(); + } + } + + public TestResult[] getResults() { + return root.values().toArray(new TestResult[0]); + } + + public Set getFailedResults() { + return gatherFailedTestCaseResult(root.values()); + } + + private Set gatherFailedTestCaseResult( + Collection results) { + Set failedCaseSet = new HashSet(); + for (TestResult result : results) { + if (result instanceof TestCaseResult) { + if (result.getStatus() == TestStatus.FAILURE) { + failedCaseSet.add((TestCaseResult) result); + } + } else { + failedCaseSet + .addAll(gatherFailedTestCaseResult(((TestSuiteResult) result) + .getChildren())); + } + } + return failedCaseSet; + } +}