All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jboss.cdi.tck.impl.testng.SingleTestClassMethodInterceptor Maven / Gradle / Ivy

There is a newer version: 2.0.5.SP1
Show newest version
/*
 * JBoss, Home of Professional Open Source
 * Copyright 2010, Red Hat Inc., and individual contributors as indicated
 * by the @authors tag. See the copyright.txt in the distribution for a
 * full listing of individual contributors.
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */
package org.jboss.cdi.tck.impl.testng;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.jboss.cdi.tck.api.InSequence;
import org.testng.IMethodInstance;
import org.testng.IMethodInterceptor;
import org.testng.ITestContext;

/**
 * This {@link IMethodInterceptor} fixes one or the other problem with CDI TCK test suite execution:
 * 
    *
  1. Run tests from single test class - it seems that Maven Surefire plugin is not able to run single test that is located outside src/test dir. If test class * system property is set all test methods that don't belong to specified test class are excluded.
  2. *
  3. Avoid randomly mixed test method execution - causing test archive deployments collisions. If test class system property is not set group test methods by * test class.
  4. *
      * * @author Stuart Douglas * @author Martin Kouba */ public class SingleTestClassMethodInterceptor implements IMethodInterceptor { private final class MethodComparator implements Comparator { @Override public int compare(IMethodInstance o1, IMethodInstance o2) { int result = o1.getMethod().getTestClass().getName().compareTo(o2.getMethod().getTestClass().getName()); if (result == 0) { InSequence inSequence1 = o1.getMethod().getConstructorOrMethod().getMethod().getAnnotation(InSequence.class); int o1Priority = inSequence1 != null ? inSequence1.value() : 0; InSequence inSequence2 = o2.getMethod().getConstructorOrMethod().getMethod().getAnnotation(InSequence.class); int o2Priority = inSequence2 != null ? inSequence2.value() : 0; return Integer.compare(o2Priority, o1Priority); } return result; } } public static final String TEST_CLASS_PROPERTY = "tckTest"; private final Logger logger = Logger.getLogger(SingleTestClassMethodInterceptor.class.getName()); @Override public List intercept(List methods, ITestContext context) { if (methods == null || methods.isEmpty()) { return methods; } logger.log(Level.INFO, "Intercepting... [methods: {0}, testRun: {1}, suiteName: {2}]", new Object[] { methods.size(), context.getName(), context.getSuite().getName() }); long start = System.currentTimeMillis(); String testString = System.getProperty(TEST_CLASS_PROPERTY); // Run the test suite - group test methods by class name if (testString == null || testString.isEmpty()) { Collections.sort(methods, new MethodComparator()); logger.log(Level.INFO, "tckTest not set [time: {0} ms]", System.currentTimeMillis() - start); return methods; } // Run the tests of each test class with the specified name (there might be more of them) // or its specific methods List methodsToRun = new ArrayList(); String testClass = null; Set testMethodsSet = new HashSet(); if (testString.contains("#")) { testClass = testString.split("#")[0]; String[] testMethod = testString.split("#")[1].split("\\+"); testMethodsSet.addAll(Arrays.asList(testMethod)); } else { testClass = testString; } if (testClass.contains(".")) { for (IMethodInstance method : methods) { if (method.getMethod().getTestClass().getName().equals(testClass)) { if ((testMethodsSet.isEmpty()) || (testMethodsSet.contains(method.getMethod().getMethodName()))) { methodsToRun.add(method); } } } } else { for (IMethodInstance method : methods) { if (method.getMethod().getTestClass().getName().endsWith("." + testClass)) { if ((testMethodsSet.isEmpty()) || (testMethodsSet.contains(method.getMethod().getMethodName()))) { methodsToRun.add(method); } } } } Collections.sort(methodsToRun, new MethodComparator()); logger.log(Level.INFO, "tckTest set to {0} [methods: {1}, time: {2} ms]", new Object[] { testClass, methodsToRun.size(), System.currentTimeMillis() - start }); return methodsToRun; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy