/*
* Copyright 2012-present Facebook, Inc.
*
* 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.facebook.buck.testutil;
import com.google.common.base.Joiner;
import java.util.regex.Pattern;
import javax.annotation.Nullable;
import org.hamcrest.Matcher;
/**
* Utility class to provide helper methods for matching buck command line output lines in junit test
* cases.
*/
public class OutputHelper {
/** Utility class: do not instantiate. */
private OutputHelper() {}
/**
* Regex for matching buck output time format. Based on time format definition from {@link
* com.facebook.buck.util.TimeFormat}
*/
public static final String BUCK_TIME_OUTPUT_FORMAT = "<?\\d+m?s";
/**
* Generates a regular expression that should match a buck test output line in following format:
*
* <pre>{@code
* PASS <100ms 1 Passed 0 Skipped 0 Failed com.example.PassingTest
* }</pre>
*
* @param status string representing expected output status ("PASS", "FAIL", etc.)
* @param passedCount expected number of tests passed, or null if any number is acceptable
* @param skippedCount expected number of tests skipped, or null if any number is acceptable
* @param failedCount expected number of tests failed, or null if any number is acceptable
* @param testClassName class name that is expected on the buck output line
* @return a regular expression that should match a buck test output line
*/
public static String createBuckTestOutputLineRegex(
String status,
@Nullable Integer passedCount,
@Nullable Integer skippedCount,
@Nullable Integer failedCount,
String testClassName) {
String passedPattern = (passedCount == null) ? "\\d+" : String.valueOf(passedCount);
String skippedPattern = (skippedCount == null) ? "\\d+" : String.valueOf(skippedCount);
String failedPattern = (failedCount == null) ? "\\d+" : String.valueOf(failedCount);
String line =
Joiner.on("\\s+")
.join(
Pattern.quote(status),
BUCK_TIME_OUTPUT_FORMAT,
passedPattern,
"Passed",
skippedPattern,
"Skipped",
failedPattern,
"Failed",
Pattern.quote(testClassName));
return "(?m)^" + line + "$";
}
/**
* Generates a regular expression that should match a buck test output line in following format:
*
* <pre>{@code
* PASS <100ms 1 Passed 0 Skipped 0 Failed com.example.PassingTest
* }</pre>
*
* @param status string representing expected output status ("PASS", "FAIL", etc.)
* @param passedCount expected number of tests passed, or null if any number is acceptable
* @param skippedCount expected number of tests skipped, or null if any number is acceptable
* @param failedCount expected number of tests failed, or null if any number is acceptable
* @param testClassName class name that is expected on the buck output line
* @return a regular expression that should match a buck test output line
*/
public static Matcher<CharSequence> containsBuckTestOutputLine(
String status,
@Nullable Integer passedCount,
@Nullable Integer skippedCount,
@Nullable Integer failedCount,
String testClassName) {
return RegexMatcher.containsRegex(
createBuckTestOutputLineRegex(
status, passedCount, skippedCount, failedCount, testClassName));
}
}