blob: ddaf48729be0a1617f35497babeec2c4c64e22a1 [file] [log] [blame]
// Copyright 2011 The Bazel Authors. All Rights Reserved.
//
// 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 com.google.testing.junit.runner.junit4;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.annotation.Nullable;
/**
* Simple options parser for JUnit 4.
*
* <p>
* For the options "test_filter" and "test_exclude_filter", this class properly handles arguments in
* either the form "--test_filter=foo" or "--test_filter foo".
*/
class JUnit4Options {
public static final String TEST_INCLUDE_FILTER_OPTION = "--test_filter";
public static final String TEST_EXCLUDE_FILTER_OPTION = "--test_exclude_filter";
// This gets passed in by the build system.
private static final String TESTBRIDGE_TEST_ONLY = "TESTBRIDGE_TEST_ONLY";
/**
* Parses the given array of arguments and returns a JUnit4Options
* object representing the parsed arguments.
*/
static JUnit4Options parse(Map<String, String> envVars, List<String> args) {
List<String> unparsedArgs = new ArrayList<>();
Map<String, String> optionsMap = new HashMap<>();
optionsMap.put(TEST_INCLUDE_FILTER_OPTION, null);
optionsMap.put(TEST_EXCLUDE_FILTER_OPTION, null);
for (Iterator<String> it = args.iterator(); it.hasNext();) {
String arg = it.next();
int indexOfEquals = arg.indexOf("=");
if (indexOfEquals > 0) {
String optionName = arg.substring(0, indexOfEquals);
if (optionsMap.containsKey(optionName)) {
optionsMap.put(optionName, arg.substring(indexOfEquals + 1));
continue;
}
} else if (optionsMap.containsKey(arg)) {
// next argument is the regexp
if (!it.hasNext()) {
throw new RuntimeException("No filter expression specified after " + arg);
}
optionsMap.put(arg, it.next());
continue;
}
unparsedArgs.add(arg);
}
// If TESTBRIDGE_TEST_ONLY is set in the environment, forward it to the
// --test_filter flag.
String testFilter = envVars.get(TESTBRIDGE_TEST_ONLY);
if (testFilter != null && optionsMap.get(TEST_INCLUDE_FILTER_OPTION) == null) {
optionsMap.put(TEST_INCLUDE_FILTER_OPTION, testFilter);
}
return new JUnit4Options(optionsMap.get(TEST_INCLUDE_FILTER_OPTION),
optionsMap.get(TEST_EXCLUDE_FILTER_OPTION),
unparsedArgs.toArray(new String[0]));
}
private final String testIncludeFilter;
private final String testExcludeFilter;
private final String[] unparsedArgs;
// VisibleForTesting
JUnit4Options(@Nullable String testIncludeFilter, @Nullable String testExcludeFilter,
String[] unparsedArgs) {
this.testIncludeFilter = testIncludeFilter;
this.testExcludeFilter = testExcludeFilter;
this.unparsedArgs = unparsedArgs;
}
/**
* Returns the value of the test_filter option, or <code>null</code> if
* it was not specified.
*/
String getTestIncludeFilter() {
return testIncludeFilter;
}
/**
* Returns the value of the test_exclude_filter option, or <code>null</code> if
* it was not specified.
*/
String getTestExcludeFilter() {
return testExcludeFilter;
}
/**
* Returns an array of the arguments that did not match any known option.
*/
String[] getUnparsedArgs() {
return unparsedArgs;
}
}