package com.google.jstestdriver.idea;
import com.google.gson.Gson;
import com.google.inject.Inject;
import com.google.inject.name.Named;
import com.google.jstestdriver.*;
import com.google.jstestdriver.browser.BrowserPanicException;
import com.google.jstestdriver.idea.execution.tree.TestResultProtocolMessage;
import com.google.jstestdriver.model.NullPathPrefix;
import com.google.jstestdriver.output.TestResultListener;
import java.io.File;
import java.io.IOException;
import java.io.ObjectOutput;
import java.util.Collection;
/**
* Informs IDE about test's status changes.
*/
public class TestRunnerResponseStreamFactory implements ResponseStreamFactory {
private static final ResponseStream NULL_RESPONSE_STREAM = new ResponseStream() {
@Override
public void stream(Response response) {}
@Override
public void finish() {}
};
private final ObjectOutput testResultProtocolMessageOutput;
private final TestResultListener testResultListener;
private final File jstdConfigFile;
@Inject
public TestRunnerResponseStreamFactory(
@Named("testResultProtocolMessageOutput") ObjectOutput testResultProtocolMessageOutput,
@Named("jstdConfigFile") File jstdConfigFile,
TestResultListener testResultListener) {
this.jstdConfigFile = jstdConfigFile;
this.testResultProtocolMessageOutput = testResultProtocolMessageOutput;
this.testResultListener = testResultListener;
}
@Override
public ResponseStream getRunTestsActionResponseStream(String browserId) {
final TestResultGenerator testResultGenerator = new TestResultGenerator(new FailureParser(new NullPathPrefix()));
final Gson gson = new Gson();
return new ResponseStream() {
@Override
public void stream(Response response) {
Collection<TestResult> testResults = testResultGenerator.getTestResults(response);
for (TestResult testResult : testResults) {
writeTestResultProtocolMessage(TestResultProtocolMessage.fromTestResult(jstdConfigFile, testResult));
switch(response.getResponseType()) {
case TEST_RESULT:
testResultListener.onTestComplete(testResult);
break;
case FILE_LOAD_RESULT:
LoadedFiles files = gson.fromJson(response.getResponse(),
response.getGsonType());
for (FileResult result : files.getLoadedFiles()) {
testResultListener.onFileLoad(response.getBrowser().toString(), result);
}
break;
case BROWSER_PANIC:
BrowserPanic panic = gson.fromJson(response.getResponse(), response.getGsonType());
throw new BrowserPanicException(panic.getBrowserInfo(), panic.getCause());
}
}
}
@Override
public void finish() {
testResultListener.finish();
}
};
}
@Override
public ResponseStream getDryRunActionResponseStream() {
final Gson gson = new Gson();
return new ResponseStream() {
@Override
public void stream(Response response) {
if (response.getResponseType() == Response.ResponseType.FILE_LOAD_RESULT) {
// TODO process it?
// new Gson().fromJson(response.getResponse(), LoadedFiles.class);
return; // for now, don't send back to IDEA
}
BrowserInfo browser = response.getBrowser();
DryRunInfo dryRunInfo = gson.fromJson(response.getResponse(), DryRunInfo.class);
for (String testName : dryRunInfo.getTestNames()) {
writeTestResultProtocolMessage(TestResultProtocolMessage.fromDryRun(jstdConfigFile, testName, browser));
}
}
@Override
public void finish() {
}
};
}
@Override
public ResponseStream getEvalActionResponseStream() {
return NULL_RESPONSE_STREAM;
}
@Override
public ResponseStream getResetActionResponseStream() {
return NULL_RESPONSE_STREAM;
}
private void writeTestResultProtocolMessage(TestResultProtocolMessage message) {
try {
synchronized (testResultProtocolMessageOutput) {
testResultProtocolMessageOutput.writeObject(message);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}