/* * Copyright 2010 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.gradle.util; import org.apache.commons.io.output.NullOutputStream; import org.apache.commons.io.output.TeeOutputStream; import org.junit.rules.MethodRule; import org.junit.runners.model.FrameworkMethod; import org.junit.runners.model.Statement; import java.io.ByteArrayOutputStream; import java.io.FilterOutputStream; import java.io.OutputStream; import java.io.PrintStream; /** * A Junit rule which replaces stdout and stderr with mocks for the duration of the test, and restores them at the end * of the test. */ public class RedirectStdOutAndErr implements MethodRule { private PrintStream originalStdOut; private PrintStream originalStdErr; private ByteArrayOutputStream stdoutContent = new ByteArrayOutputStream(); private ByteArrayOutputStream stderrContent = new ByteArrayOutputStream(); private RedirectingOutputStream stdOutRouter = new RedirectingOutputStream(new NullOutputStream()); private RedirectingOutputStream stdErrRouter = new RedirectingOutputStream(new NullOutputStream()); private PrintStream stdOutPrintStream = new PrintStream(new TeeOutputStream(stdoutContent, stdOutRouter)); private PrintStream stdErrPrintStream = new PrintStream(new TeeOutputStream(stderrContent, stdErrRouter)); public Statement apply(final Statement base, FrameworkMethod method, Object target) { return new Statement() { @Override public void evaluate() throws Throwable { originalStdOut = System.out; originalStdErr = System.err; stdOutRouter.setOut(originalStdOut); stdErrRouter.setOut(originalStdErr); try { System.setOut(stdOutPrintStream); System.setErr(stdErrPrintStream); base.evaluate(); } finally { System.setOut(originalStdOut); System.setErr(originalStdErr); stdOutRouter = null; stdErrRouter = null; stdOutPrintStream = null; stdErrPrintStream = null; stdoutContent = null; stderrContent = null; } } }; } public PrintStream getStdOutPrintStream() { return stdOutPrintStream; } public PrintStream getStdErrPrintStream() { return stdErrPrintStream; } public String getStdErr() { return stderrContent.toString(); } public String getStdOut() { return stdoutContent.toString(); } private static class RedirectingOutputStream extends FilterOutputStream { RedirectingOutputStream(OutputStream out) { super(out); } void setOut(OutputStream out) { this.out = out; } } }