/* * Copyright 2013 Guidewire Software, Inc. */ package gw.test.remote; import gw.test.servlet.RemoteTestServlet; import gw.test.TestEnvironment; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; public class RemoteForwardingTestEnvironment extends ForwardingTestEnvironment { private final String _remoteURL; public RemoteForwardingTestEnvironment(String remoteURL) { this(remoteURL, null, null); } public RemoteForwardingTestEnvironment(String remoteURL, String wrappedTestEnvironmentName, String wrappedTestEnvironmentArgs) { this(remoteURL, null, wrappedTestEnvironmentName, wrappedTestEnvironmentArgs, false); } public RemoteForwardingTestEnvironment(String remoteURL, TestEnvironment wrappedTestEnvironment) { super(wrappedTestEnvironment, false); _remoteURL = remoteURL; } private RemoteForwardingTestEnvironment(String remoteURL, TestEnvironment wrappedTestEnvironment, String wrappedTestEnvironmentName, String wrappedTestEnvironmentArgs, boolean initializeTypeSystemLocally) { super(wrappedTestEnvironment, wrappedTestEnvironmentName, wrappedTestEnvironmentArgs, initializeTypeSystemLocally); _remoteURL = remoteURL; } @Override public String getRemoteURL() { return _remoteURL; } @Override public void beforeTestSuite() { Thread systemOutThread = new OutputRedirectThread(_remoteURL, RemoteTestServlet.REDIRECT_SYSTEM_OUT_COMMAND) { @Override void write(byte[] buf, int off, int len) { System.out.write(buf, off, len); } }; Thread systemErrThread = new OutputRedirectThread(_remoteURL, RemoteTestServlet.REDIRECT_SYSTEM_ERR_COMMAND) { @Override void write(byte[] buf, int off, int len) { System.err.write(buf, off, len); } }; systemOutThread.setDaemon(true); systemErrThread.setDaemon(true); systemOutThread.start(); systemErrThread.start(); } @Override public void afterTestSuite() { super.afterTestSuite(); RemoteTestClass.makeRemoteRequest(_remoteURL, RemoteTestServlet.STOP_REDIRECTING_OUTPUT_COMMAND); } private abstract static class OutputRedirectThread extends Thread { private String _remoteURL; private String _command; protected OutputRedirectThread(String remoteURL, String command) { _remoteURL = remoteURL; _command = command; } @Override public void run() { try { URL url = new URL(_remoteURL + "/" + _command); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); InputStream is = connection.getInputStream(); byte[] buffer = new byte[16384]; while (true) { int numRead = is.read(buffer, 0, 16384); if (numRead <= 0) { break; } else { write(buffer, 0, numRead); } } } catch (MalformedURLException e) { throw new RuntimeException(e); } catch (IOException e) { throw new RuntimeException(e); } } abstract void write(byte buf[], int off, int len); } }