package it.com.atlassian.labs.speakeasy.proxy;
import com.atlassian.pageobjects.TestedProduct;
import com.atlassian.pageobjects.page.HomePage;
import com.atlassian.pageobjects.page.LoginPage;
import com.atlassian.webdriver.pageobjects.WebDriverTester;
import it.com.atlassian.labs.speakeasy.OwnerOfTestedProduct;
import it.com.atlassian.labs.speakeasy.SpeakeasyUserPage;
import org.apache.commons.io.IOUtils;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.AbstractHandler;
import org.json.JSONException;
import org.junit.*;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.ServerSocket;
import static com.google.common.collect.Lists.newArrayList;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
/**
*
*/
public class TestProxy
{
private static TestedProduct<?> product = OwnerOfTestedProduct.INSTANCE;
private static Server server;
private static String applinkId;
private static ApplinksRest rest;
@Before
public void login()
{
product.visit(LoginPage.class).loginAsSysAdmin(HomePage.class);
}
@After
public void logout()
{
((WebDriverTester) product.getTester()).getDriver().manage().deleteAllCookies();
}
@BeforeClass
public static void startServer() throws Exception
{
Handler handler = new AbstractHandler()
{
public void handle(String target, Request req, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{
String body = IOUtils.toString(req.getInputStream());
response.setContentType("text/plain");
response.setStatus(HttpServletResponse.SC_OK);
response.getWriter().print("Hello " + body + " on " + req.getPathInfo());
req.setHandled(true);
}
};
server = new Server(pickFreePort());
server.setHandler(handler);
server.start();
rest = product.getPageBinder().bind(ApplinksRest.class);
applinkId = rest.addGenericApplicationLink("local", "http://localhost:" + server.getConnectors()[0].getPort());
}
@AfterClass
public static void stopServer() throws Exception
{
server.stop();
rest.removeApplicationLink(applinkId);
}
@Test
public void testProxy() throws IOException, JSONException
{
SpeakeasyProxy proxy = product.getPageBinder().bind(SpeakeasyProxy.class);
String result = proxy.proxyPost("local", "/foo", "bob");
assertEquals("Hello bob on /foo", result);
}
@Test
public void testApplinkLists() throws IOException, JSONException
{
ApplinksTab tab = product.visit(SpeakeasyUserPage.class)
.viewApplinksTab();
assertTrue(tab.getApplinkNames().contains("local"));
}
private static int pickFreePort()
{
ServerSocket socket = null;
try
{
socket = new ServerSocket(0);
return socket.getLocalPort();
}
catch (IOException e)
{
throw new RuntimeException("Error opening socket", e);
}
finally
{
if (socket != null)
{
try
{
socket.close();
}
catch (IOException e)
{
throw new RuntimeException("Error closing socket", e);
}
}
}
}
}