/* * Copyright 2002-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springframework.tests; import java.util.Collections; import java.util.EnumSet; import java.util.HashSet; import java.util.Set; import org.springframework.util.StringUtils; import static java.lang.String.*; /** * A test group used to limit when certain tests are run. * * @see Assume#group(TestGroup) * @author Phillip Webb * @author Chris Beams * @author Sam Brannen */ public enum TestGroup { /** * Tests that take a considerable amount of time to run. Any test lasting longer than * 500ms should be considered a candidate in order to avoid making the overall test * suite too slow to run during the normal development cycle. */ LONG_RUNNING, /** * Performance-related tests that may fail unpredictably based on CPU profile and load. * Any test using {@link Thread#sleep}, {@link Object#wait}, Spring's * {@code StopWatch}, etc. should be considered a candidate as their successful * execution is likely to be based on events occurring within a given time window. */ PERFORMANCE, /** * Tests requiring the presence of jmxremote_optional.jar in jre/lib/ext in order to * avoid "Unsupported protocol: jmxmp" errors. */ JMXMP, /** * Tests that should only be run on the continuous integration server. */ CI; /** * Parse the specified comma separated string of groups. * @param value the comma separated string of groups * @return a set of groups * @throws IllegalArgumentException if any specified group name is not a * valid {@link TestGroup} */ public static Set<TestGroup> parse(String value) throws IllegalArgumentException { if (!StringUtils.hasText(value)) { return Collections.emptySet(); } String originalValue = value; value = value.trim(); if ("ALL".equalsIgnoreCase(value)) { return EnumSet.allOf(TestGroup.class); } if (value.toUpperCase().startsWith("ALL-")) { Set<TestGroup> groups = EnumSet.allOf(TestGroup.class); groups.removeAll(parseGroups(originalValue, value.substring(4))); return groups; } return parseGroups(originalValue, value); } private static Set<TestGroup> parseGroups(String originalValue, String value) throws IllegalArgumentException { Set<TestGroup> groups = new HashSet<>(); for (String group : value.split(",")) { try { groups.add(valueOf(group.trim().toUpperCase())); } catch (IllegalArgumentException ex) { throw new IllegalArgumentException(format( "Unable to find test group '%s' when parsing testGroups value: '%s'. " + "Available groups include: [%s]", group.trim(), originalValue, StringUtils.arrayToCommaDelimitedString(TestGroup.values()))); } } return groups; } }