blob: 8a53236fd035e7b0d233bc0fd2daf7179120e8cc [file] [log] [blame]
/*
* 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.shell;
import static org.junit.Assert.assertTrue;
import static org.junit.Assume.assumeTrue;
import com.facebook.buck.testutil.integration.DebuggableTemporaryFolder;
import com.facebook.buck.testutil.integration.ProjectWorkspace;
import com.facebook.buck.testutil.integration.ProjectWorkspace.ProcessResult;
import com.facebook.buck.testutil.integration.TestDataHelper;
import com.facebook.buck.util.environment.Platform;
import org.junit.Rule;
import org.junit.Test;
import java.io.IOException;
public class GenruleFailingCommandIntegrationTest {
@Rule
public DebuggableTemporaryFolder temporaryFolder = new DebuggableTemporaryFolder();
// When these tests fail, the failures contain buck output that is easy to confuse with the output
// of the instance of buck that's running the test. This prepends each line with "> ".
private String quoteOutput(String output) {
output = output.trim();
output = "> " + output;
output = output.replace("\n", "\n> ");
return output;
}
@Test
public void testIfCommandExitsZeroThenGenruleFails() throws IOException {
assumeTrue("This genrule uses the 'bash' argument, which is not supported on Windows. ",
Platform.detect() != Platform.WINDOWS);
ProjectWorkspace workspace = TestDataHelper.createProjectWorkspaceForScenario(
this, "genrule_failing_command", temporaryFolder);
workspace.setUp();
ProcessResult buildResult = workspace.runBuckCommand("build", "//:fail", "--verbose", "10");
buildResult.assertFailure();
/* We want to make sure we failed for the right reason. The expected should contain something
* like the following:
*
* BUILD FAILED: //:fail failed with exit code 1:
* (cd /tmp/junit12345/buck-out/gen/fail__srcs && /bin/bash -e -c 'false; echo >&2 hi')
*
* We should match all that, except for the specific temp dir.
*/
// "(?s)" enables multiline matching for ".*". Parens have to be escaped.
String outputPattern =
"(?s).*BUILD FAILED: //:fail failed with exit code 1:\n" +
"\\(cd [-_ \\d\\w/]*/buck-out/gen/fail__srcs && /bin/bash -e -c 'false; echo >&2 hi'\\).*";
assertTrue(
"Unexpected output:\n" + quoteOutput(buildResult.getStderr()),
buildResult.getStderr().matches(outputPattern));
}
}