/*
* Copyright 2014 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.api.internal.tasks.testing.processors;
import org.gradle.api.internal.tasks.testing.DefaultTestOutputEvent;
import org.gradle.api.internal.tasks.testing.TestResultProcessor;
import org.gradle.api.logging.StandardOutputListener;
import org.gradle.api.tasks.testing.TestOutputEvent;
class TestOutputRedirector {
private final StandardOutputRedirector redirector;
Forwarder outForwarder;
Forwarder errForwarder;
TestOutputRedirector(TestResultProcessor processor, StandardOutputRedirector redirector) {
this.redirector = redirector;
this.outForwarder = new Forwarder(processor, TestOutputEvent.Destination.StdOut);
this.errForwarder = new Forwarder(processor, TestOutputEvent.Destination.StdErr);
}
void startRedirecting() {
assert outForwarder.outputOwner != null;
assert errForwarder.outputOwner != null;
redirector.redirectStandardOutputTo(outForwarder);
redirector.redirectStandardErrorTo(errForwarder);
redirector.start();
}
void stopRedirecting() {
redirector.stop();
}
void setOutputOwner(Object testId) {
assert testId != null;
if (System.out != null) {
System.out.flush();
}
if (System.err != null) {
System.err.flush();
}
outForwarder.outputOwner = testId;
errForwarder.outputOwner = testId;
}
static class Forwarder implements StandardOutputListener {
final TestResultProcessor processor;
final TestOutputEvent.Destination dest;
Object outputOwner;
public Forwarder(TestResultProcessor processor, TestOutputEvent.Destination dest) {
this.processor = processor;
this.dest = dest;
}
@Override
public void onOutput(CharSequence output) {
if (outputOwner == null) {
throw new RuntimeException("Unable send output event from test executor. Please report this problem. Destination: " + dest + ", event: " + output.toString());
}
processor.output(outputOwner, new DefaultTestOutputEvent(dest, output.toString()));
}
}
}