/******************************************************************************* * Copyright (c) 2009 IBM Corporation and others. * 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.ui.tests.performance; import java.util.Enumeration; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import org.osgi.framework.BundleContext; /** * Only includes tests that match filter. Filter is specified in the Java system variable * <code>org.eclipse.ui.tests.filter</code>. The expected filter format is: * <pre> * test_class_name[#test_name] * </pre> * where both test_class_name and test_name can be a regular expression. * <p> * For instance: * <pre> * OpenCloseEditorTest#testOpenAndCloseEditors:perf_outline() * </pre> * The variable can be specified as a VM argument for the Eclipse launcher: * <pre> * "-Dorg.eclipse.ui.tests.filter=OpenCloseEditorTest#testOpenAndCloseEditors:perf_outline()" * </pre> * or * <pre> * "-Dorg.eclipse.ui.tests.filter=OpenCloseEditorTest#testOpenAndCloseEditors.*" * </pre> * </p> * @since 3.5 */ public class FilteredTestSuite extends TestSuite { static final public String FILTER_TEST_NAME = "org.eclipse.ui.tests.filter"; private String filterTestClassName; private String filterTestName; public FilteredTestSuite() { BundleContext context = UIPerformancePlugin.getDefault().getContext(); if (context == null) { // most likely run in a wrong launch mode System.err.println("UIPerformanceTestSuite was unable to retirieve bundle context; test filtering is disabled"); return; } String filterString = context.getProperty(FILTER_TEST_NAME); if (filterString == null) return; if (filterString.endsWith("()")) filterString = filterString.substring(0, filterString.length() - 2); // Expected format: filterTestClassName#filterTestName int methodSeparator = filterString.indexOf('#'); if (methodSeparator != -1) { if (methodSeparator == 0) filterTestClassName = null; else filterTestClassName = filterString.substring(0, methodSeparator); if (methodSeparator + 1 < filterString.length()) filterTestName = filterString.substring(methodSeparator + 1); else filterTestName = null; } else { filterTestClassName = filterString; filterTestName = null; } } @Override public void addTest(Test test) { if ((filterTestClassName != null) || (filterTestName != null)) { if (test instanceof TestSuite) { addFilteredTestSuite((TestSuite)test); return; } else if (test instanceof TestCase) { addFilteredTestCase((TestCase)test); return; } } // default processing: no filter or unknown test type super.addTest(test); } private void addFilteredTestSuite(TestSuite testSuite) { for(Enumeration allTests = testSuite.tests(); allTests.hasMoreElements(); ) { Object subTest = allTests.nextElement(); if (subTest instanceof TestSuite) { addFilteredTestSuite((TestSuite)subTest); continue; } if (!(subTest instanceof TestCase)) continue; if (filterTestClassName != null) { Class testClass = subTest.getClass(); String subTestQualName = testClass.getName(); // qualified class name if (subTestQualName == null) subTestQualName = ""; int index = subTestQualName.lastIndexOf('.'); String subTestName = ""; // short class name if ((index != -1) && ((index +1) < subTestQualName.length())) subTestName = subTestQualName.substring(index+1); if (!subTestName.matches(filterTestClassName) && !subTestQualName.matches(filterTestClassName)) continue; } addFilteredTestCase((TestCase)subTest); } } private void addFilteredTestCase(TestCase testCase) { if (filterTestName == null) { super.addTest(testCase); return; } String testCaseName = testCase.getName(); if (testCaseName == null) return; if (testCaseName.matches(filterTestName)) super.addTest(testCase); } }