// Copyright 2010 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.nio.file.FileSystems; import java.nio.file.Path; import java.util.Properties; import javax.annotation.Nullable; /** * Configuration for the JUnit4 test runner. */ class JUnit4Config { // VisibleForTesting static final String JUNIT_API_VERSION_PROPERTY = "com.google.testing.junit.runner.apiVersion"; // VisibleForTesting static final String SHOULD_INSTALL_SECURITY_MANAGER_PROPERTY = "com.google.testing.junit.runner.shouldInstallTestSecurityManager"; private final String testIncludeFilterRegexp; private final String testExcludeFilterRegexp; @Nullable private final Path xmlOutputPath; private final String junitApiVersion; private final boolean shouldInstallSecurityManager; private static final String XML_OUTPUT_FILE_ENV_VAR = "XML_OUTPUT_FILE"; public JUnit4Config( String testIncludeFilterRegexp, String testExcludeFilterRegexp, @Nullable Path outputXmlFilePath) { this( testIncludeFilterRegexp, testExcludeFilterRegexp, outputXmlFilePath, System.getProperties()); } public JUnit4Config(String testIncludeFilterRegexp, String testExcludeFilterRegexp) { this(testIncludeFilterRegexp, testExcludeFilterRegexp, null, System.getProperties()); } // VisibleForTesting JUnit4Config( String testIncludeFilterRegexp, String testExcludeFilterRegexp, @Nullable Path xmlOutputPath, Properties systemProperties) { this.testIncludeFilterRegexp = testIncludeFilterRegexp; this.testExcludeFilterRegexp = testExcludeFilterRegexp; this.xmlOutputPath = xmlOutputPath; junitApiVersion = systemProperties.getProperty(JUNIT_API_VERSION_PROPERTY, "1").trim(); shouldInstallSecurityManager = installSecurityManager(systemProperties); } private static boolean installSecurityManager(Properties systemProperties) { String securityManager = systemProperties.getProperty("java.security.manager"); if (securityManager != null) { return false; // Don't install over the specified security manager } return Boolean.valueOf( systemProperties.getProperty(SHOULD_INSTALL_SECURITY_MANAGER_PROPERTY, "true")); } /** * @return Whether the test security manager should be installed */ public boolean shouldInstallSecurityManager() { return shouldInstallSecurityManager; } /** * Returns the XML output path, or null if not specified. */ @Nullable public Path getXmlOutputPath() { if (xmlOutputPath == null) { String envXmlOutputPath = System.getenv(XML_OUTPUT_FILE_ENV_VAR); return envXmlOutputPath == null ? null : FileSystems.getDefault().getPath(envXmlOutputPath); } return xmlOutputPath; } /** * Gets the version of the JUnit Runner that the test is expecting. * Some features may be enabled or disabled based on this value. * * @return api version * @throws IllegalStateException if the API version is unsupported. */ public int getJUnitRunnerApiVersion() { int apiVersion = 0; try { apiVersion = Integer.parseInt(junitApiVersion); } catch (NumberFormatException e) { // ignore; handled below } if (apiVersion != 1) { throw new IllegalStateException( "Unsupported JUnit Runner API version " + JUNIT_API_VERSION_PROPERTY + "=" + junitApiVersion + " (must be \\\"1\\\")"); } return apiVersion; } /** * Returns a regular expression representing an inclusive filter. * Only test descriptions that match this regular expression should be run. */ public String getTestIncludeFilterRegexp() { return testIncludeFilterRegexp; } /** * Returns a regular expression representing an exclusive filter. * Test descriptions that match this regular expression should not be run. */ public String getTestExcludeFilterRegexp() { return testExcludeFilterRegexp; } }