summaryrefslogtreecommitdiffstats
path: root/application/src/test/java/com/yahoo/application/container/jersey/JerseyTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'application/src/test/java/com/yahoo/application/container/jersey/JerseyTest.java')
-rw-r--r--application/src/test/java/com/yahoo/application/container/jersey/JerseyTest.java193
1 files changed, 193 insertions, 0 deletions
diff --git a/application/src/test/java/com/yahoo/application/container/jersey/JerseyTest.java b/application/src/test/java/com/yahoo/application/container/jersey/JerseyTest.java
new file mode 100644
index 00000000000..e85bd6ba4d9
--- /dev/null
+++ b/application/src/test/java/com/yahoo/application/container/jersey/JerseyTest.java
@@ -0,0 +1,193 @@
+// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.application.container.jersey;
+
+import com.yahoo.application.Networking;
+import com.yahoo.application.container.JDisc;
+import com.yahoo.application.container.JDiscTest;
+import com.yahoo.application.container.jersey.resources.TestResource;
+import com.yahoo.application.container.jersey.resources.nestedpackage1.NestedTestResource1;
+import com.yahoo.application.container.jersey.resources.nestedpackage2.NestedTestResource2;
+import com.yahoo.container.test.jars.jersey.resources.TestResourceBase;
+import com.yahoo.osgi.maven.ProjectBundleClassPaths;
+import com.yahoo.osgi.maven.ProjectBundleClassPaths.BundleClasspathMapping;
+import org.apache.commons.io.IOUtils;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.util.EntityUtils;
+import org.junit.Test;
+
+import javax.ws.rs.core.UriBuilder;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import static java.util.Collections.emptyList;
+import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * @author Tony Vaagenes
+ * @author ovirtanen
+ */
+public class JerseyTest {
+ private final Path testJar = Paths.get("target/test-jars/jersey-resources.jar");
+ private final String testClassesDirectory = "target/test-classes";
+ private final String bundleSymbolicName = "myBundle";
+
+ private static final Set<Class<? extends TestResourceBase>> classPathResources;
+ private static final Set<Class<? extends TestResourceBase>> jarFileResources;
+
+ static {
+ classPathResources = new HashSet<>();
+ classPathResources.add(TestResource.class);
+ classPathResources.add(NestedTestResource1.class);
+ classPathResources.add(NestedTestResource2.class);
+
+ jarFileResources = new HashSet<>();
+ jarFileResources.add(com.yahoo.container.test.jars.jersey.resources.TestResource.class);
+ jarFileResources.add(com.yahoo.container.test.jars.jersey.resources.nestedpackage1.NestedTestResource1.class);
+ jarFileResources.add(com.yahoo.container.test.jars.jersey.resources.nestedpackage2.NestedTestResource2.class);
+ }
+
+ @Test
+ public void jersey_resources_on_classpath_can_be_invoked_from_application() throws Exception {
+ saveMainBundleClassPathMappings(testClassesDirectory);
+
+ with_jersey_resources(emptyList(), httpGetter -> assertResourcesResponds(classPathResources, httpGetter));
+ }
+
+ @Test
+ public void jersey_resources_in_provided_dependencies_can_be_invoked_from_application() throws Exception {
+ BundleClasspathMapping providedDependency = new BundleClasspathMapping(bundleSymbolicName,
+ Arrays.asList(testClassesDirectory));
+
+ save(new ProjectBundleClassPaths(new BundleClasspathMapping("main", emptyList()),
+ Arrays.asList(providedDependency)));
+ with_jersey_resources(emptyList(), httpGetter -> assertResourcesResponds(classPathResources, httpGetter));
+ }
+
+ @Test
+ public void jersey_resource_on_classpath_can_be_filtered_using_packages() throws Exception {
+ saveMainBundleClassPathMappings(testClassesDirectory);
+
+ with_jersey_resources(Arrays.asList("com.yahoo.application.container.jersey.resources",
+ "com.yahoo.application.container.jersey.resources.nestedpackage1"), httpGetter -> {
+ Class<NestedTestResource2> nestedResource2 = NestedTestResource2.class;
+ assertDoesNotRespond(nestedResource2, httpGetter);
+ assertResourcesResponds(copySetExcept(classPathResources, nestedResource2), httpGetter);
+ });
+ }
+
+ @Test
+ public void jersey_resource_in_jar_can_be_invoked_from_application() throws Exception {
+ saveMainBundleJarClassPathMappings(testJar);
+
+ with_jersey_resources(emptyList(), httpGetter -> assertResourcesResponds(jarFileResources, httpGetter));
+ }
+
+ @Test
+ public void jersey_resource_in_jar_can_be_filtered_using_packages() throws Exception {
+ saveMainBundleJarClassPathMappings(testJar);
+
+ with_jersey_resources(Arrays.asList("com.yahoo.container.test.jars.jersey.resources",
+ "com.yahoo.container.test.jars.jersey.resources.nestedpackage1"), httpGetter -> {
+ Class<com.yahoo.container.test.jars.jersey.resources.nestedpackage2.NestedTestResource2> nestedResource2 = com.yahoo.container.test.jars.jersey.resources.nestedpackage2.NestedTestResource2.class;
+
+ assertDoesNotRespond(nestedResource2, httpGetter);
+ assertResourcesResponds(copySetExcept(jarFileResources, nestedResource2), httpGetter);
+ });
+ }
+
+ private static <T> Set<T> copySetExcept(Set<T> in, T except) {
+ Set<T> ret = new HashSet<>(in);
+ ret.remove(except);
+ return ret;
+ }
+
+ private interface ThrowingConsumer<T> {
+ public void accept(T arg) throws Exception;
+ }
+
+ private interface HttpGetter {
+ public HttpResponse get(String path) throws Exception;
+ }
+
+ @SuppressWarnings("try") // jdisc unused inside try-with-resources
+ private void with_jersey_resources(List<String> packagesToScan, ThrowingConsumer<HttpGetter> f) throws Exception {
+ StringBuffer packageElements = new StringBuffer();
+ for (String p : packagesToScan) {
+ packageElements.append("<package>");
+ packageElements.append(p);
+ packageElements.append("</package>");
+ }
+
+ try (JDisc jdisc = JDisc.fromServicesXml(
+ "<services>" + //
+ "<jdisc version=\"1.0\" id=\"default\" jetty=\"true\">" + //
+ "<rest-api path=\"rest-api\" jersey2=\"true\">" + //
+ "<components bundle=\"" + bundleSymbolicName + "\">" + //
+ packageElements + //
+ "</components>" + //
+ "</rest-api>" + //
+ "<http>" + //
+ "<server id=\"mainServer\" port=\"0\" />" + //
+ "</http>" + //
+ "</jdisc>" + //
+ "</services>", //
+ Networking.enable)) {
+ final int port = JDiscTest.getListenPort();
+ f.accept(path -> {
+ String p = path.startsWith("/") ? path.substring(1) : path;
+ CloseableHttpClient client = HttpClientBuilder.create().build();
+ return client.execute(new HttpGet("http://localhost:" + port + "/rest-api/" + p));
+ });
+ }
+ }
+
+ public void assertResourcesResponds(Collection<Class<? extends TestResourceBase>> resourceClasses,
+ HttpGetter httpGetter) throws Exception {
+ for (Class<? extends TestResourceBase> resource : resourceClasses) {
+ HttpResponse response = httpGetter.get(path(resource));
+ assertThat("Failed sending response to " + resource, response.getStatusLine().getStatusCode(), is(200));
+
+ String content = IOUtils.toString(response.getEntity().getContent());
+ assertThat(content, is(TestResourceBase.content(resource)));
+ }
+ }
+
+ public void assertDoesNotRespond(Class<? extends TestResourceBase> resourceClass, HttpGetter httpGetter)
+ throws Exception {
+ HttpResponse response = httpGetter.get(path(resourceClass));
+ assertThat(response.getStatusLine().getStatusCode(), is(404));
+ EntityUtils.consume(response.getEntity());
+ }
+
+ public void saveMainBundleJarClassPathMappings(Path jarFile) throws Exception {
+ assertTrue("Couldn't find file " + jarFile + ", please remember to run mvn process-test-resources first.",
+ Files.isRegularFile(jarFile));
+ saveMainBundleClassPathMappings(jarFile.toAbsolutePath().toString());
+ }
+
+ public void saveMainBundleClassPathMappings(String classPathElement) throws Exception {
+ BundleClasspathMapping mainBundleClassPathMappings = new BundleClasspathMapping(bundleSymbolicName,
+ Arrays.asList(classPathElement));
+ save(new ProjectBundleClassPaths(mainBundleClassPathMappings, emptyList()));
+ }
+
+ public void save(ProjectBundleClassPaths projectBundleClassPaths) throws Exception {
+ Path path = Paths.get(testClassesDirectory).resolve(ProjectBundleClassPaths.CLASSPATH_MAPPINGS_FILENAME);
+ ProjectBundleClassPaths.save(path, projectBundleClassPaths);
+ }
+
+ public String path(Class<?> resourceClass) {
+ return UriBuilder.fromResource(resourceClass).build().toString();
+ }
+}