package org.lilyproject.container.jetty; import static java.lang.System.setProperty; import static java.util.Arrays.asList; import static org.fest.assertions.Assertions.assertThat; import static org.fest.assertions.MapAssert.entry; import java.io.File; import java.io.IOException; import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.ClientResponse; import org.apache.commons.io.FileUtils; import org.codehaus.jettison.json.JSONObject; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import org.lilyproject.lilyservertestfw.LilyProxy; import org.lilyproject.runtime.module.javaservice.JavaServiceManager; import org.lilyproject.servletregistry.api.ServletRegistry; import org.lilyproject.util.test.TestHomeUtil; import org.springframework.core.io.ClassPathResource; public class JettyIntegrationTest { private static LilyProxy proxy; private static final String[] confLoadBeforeWiringFiles = {}; private static final String[] confLoadAtEndWiringFiles = {"/plugins/load-at-end/lily-jetty-test.xml"}; private static File tmpDir; @BeforeClass public static void setup() throws Exception{ configureLily(); startLily(); } public static void configureLily() throws Exception{ tmpDir = TestHomeUtil.createTestHome("lily-jetty-container-test-"); File customConfDir = setupConfDirectory(tmpDir); File customSetupDir = setupPluginsDirectory(tmpDir); setupSSLkeystore(tmpDir); setProperty("lily.plugin.dir", customSetupDir.getAbsolutePath()); setProperty("lily.conf.customdir", customConfDir.getAbsolutePath()); } public static void startLily() throws Exception { proxy = new LilyProxy(); proxy.start(); } @AfterClass() public static void cleanUp() throws Exception{ try{ proxy.stop(); } finally { FileUtils.deleteDirectory(tmpDir); } } protected static void setupSSLkeystore(File tmpDir) throws IOException { ClassPathResource resource = new ClassPathResource("/ssl/keystore"); File keystore = new File(tmpDir, "keystore"); FileUtils.copyInputStreamToFile(resource.getInputStream(), keystore); System.setProperty(CustomJettyLauncher.LILY_SSL_KEYSTORE, keystore.getAbsolutePath()); System.setProperty("javax.net.ssl.trustStore", keystore.getAbsolutePath()); System.setProperty("javax.net.ssl.trustStorePassword", "changeit"); } protected static File setupConfDirectory(File tmpDir) throws Exception{ File confDir = new File(tmpDir, "conf"); File lilyConfDir = new File(confDir, "lily"); FileUtils.deleteDirectory(lilyConfDir); FileUtils.forceMkdir(lilyConfDir); setupSingleConfigFile(confDir, "jetty", "jetty", "/conf/jetty-with-ssl.xml"); return confDir; } protected static File setupPluginsDirectory(File tmpDir) throws Exception { File pluginDir = new File(tmpDir, "plugins"); FileUtils.deleteDirectory(pluginDir); FileUtils.forceMkdir(pluginDir); setupSinglePluginDirectory(pluginDir, "load-before-repository", confLoadBeforeWiringFiles); setupSinglePluginDirectory(pluginDir, "load-at-end", confLoadAtEndWiringFiles); return pluginDir; } private static void setupSinglePluginDirectory(File pluginDir, String pluginSubDir, String[] xmlFilePaths) throws Exception { File pDir = new File(pluginDir, pluginSubDir); FileUtils.forceMkdir(pDir); for (String xmlFilePath : xmlFilePaths) { ClassPathResource resource = new ClassPathResource(xmlFilePath); String fileName = new File(xmlFilePath).getName(); FileUtils.copyInputStreamToFile(resource.getInputStream() ,new File(pDir, fileName)); } } private static void setupSingleConfigFile(File configDir, String moduleId, String configName, String resourceName) throws IOException { File moduleDir = new File(configDir, moduleId); moduleDir.mkdirs(); ClassPathResource resource = new ClassPathResource(resourceName); FileUtils.copyInputStreamToFile(resource.getInputStream() ,new File(moduleDir, configName + ".xml")); } @Test public void testFilterIsLoaded() throws Exception { JavaServiceManager serviceManager = proxy.getLilyServerProxy().getLilyServerTestingUtility().getRuntime().getJavaServiceManager(); ServletRegistry service = (ServletRegistry) serviceManager.getService(ServletRegistry.class); assertThat(service.getFilterEntries()).hasSize(1); } @Test public void testRestApiPassesFilter() throws Exception { Client client = new Client(); ClientResponse response = client.resource("http://localhost:12060/repository/schema/recordType") .header("X-NGDATA-TEST", "example-data").get(ClientResponse.class); JSONObject object = response.getEntity(JSONObject.class); assertThat(object).isNotNull(); assertThat(object.keys()).contains("results"); assertThat(response.getHeaders()).includes(entry("X-NGDATA-TEST", asList("example-data"))); } @Test public void testHttpsIsReady() throws Exception { Client client = new Client(); JSONObject object = client.resource("https://localhost:12443/repository/schema/recordType").get(JSONObject.class); assertThat(object).isNotNull(); assertThat(object.keys()).contains("results"); } }