cors test

Signed-off-by: Raymond Auge <rotty3000@apache.org>
diff --git a/jax-rs.itests/itest.bndrun b/jax-rs.itests/itest.bndrun
index 9aa3231..b73a8bc 100644
--- a/jax-rs.itests/itest.bndrun
+++ b/jax-rs.itests/itest.bndrun
@@ -48,6 +48,7 @@
 	org.apache.aries.spifly.auto.providers=com.sun.*
 
 -runbundles: \
+	assertj-core;version='[3.17.2,3.17.3)',\
 	com.fasterxml.woodstox.woodstox-core;version='[6.2.3,6.2.4)',\
 	com.sun.xml.bind.jaxb-osgi;version='[2.3.3,2.3.4)',\
 	jakarta.xml.bind-api;version='[2.3.3,2.3.4)',\
@@ -57,6 +58,7 @@
 	org.apache.cxf.cxf-core;version='[3.4.2,3.4.3)',\
 	org.apache.cxf.cxf-rt-frontend-jaxrs;version='[3.4.2,3.4.3)',\
 	org.apache.cxf.cxf-rt-rs-client;version='[3.4.2,3.4.3)',\
+	org.apache.cxf.cxf-rt-rs-security-cors;version='[3.4.2,3.4.3)',\
 	org.apache.cxf.cxf-rt-rs-sse;version='[3.4.2,3.4.3)',\
 	org.apache.cxf.cxf-rt-security;version='[3.4.2,3.4.3)',\
 	org.apache.cxf.cxf-rt-transports-http;version='[3.4.2,3.4.3)',\
@@ -68,12 +70,11 @@
 	org.apache.felix.http.servlet-api;version='[1.1.2,1.1.3)',\
 	org.apache.geronimo.specs.geronimo-annotation_1.3_spec;version='[1.3.0,1.3.1)',\
 	org.apache.geronimo.specs.geronimo-jaxrs_2.1_spec;version='[1.1.0,1.1.1)',\
+	org.apache.servicemix.bundles.junit;version='[4.13.0,4.13.1)',\
 	org.apache.ws.xmlschema.core;version='[2.2.5,2.2.6)',\
 	org.osgi.service.jaxrs;version='[1.0.0,1.0.1)',\
 	org.osgi.util.function;version='[1.1.0,1.1.1)',\
 	org.osgi.util.promise;version='[1.1.1,1.1.2)',\
-	osgi.enroute.hamcrest.wrapper;version='[1.3.0,1.3.1)',\
-	osgi.enroute.junit.wrapper;version='[4.12.0,4.12.1)',\
 	stax2-api;version='[4.2.1,4.2.2)'
 
 -runstartlevel: \
diff --git a/jax-rs.itests/pom.xml b/jax-rs.itests/pom.xml
index 58d2dcd..5b29791 100644
--- a/jax-rs.itests/pom.xml
+++ b/jax-rs.itests/pom.xml
@@ -96,5 +96,30 @@
             <groupId>org.osgi</groupId>
             <artifactId>osgi.enroute.hamcrest.wrapper</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.test.assertj.framework</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.test.junit4</artifactId>
+            <scope>compile</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.cxf</groupId>
+            <artifactId>cxf-rt-rs-security-cors</artifactId>
+            <version>${cxf.version}</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.apache.cxf</groupId>
+                    <artifactId>cxf-core</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.apache.cxf</groupId>
+                    <artifactId>cxf-rt-frontend-jaxrs</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
     </dependencies>
 </project>
diff --git a/jax-rs.itests/src/main/java/test/CorsTest.java b/jax-rs.itests/src/main/java/test/CorsTest.java
new file mode 100644
index 0000000..3905051
--- /dev/null
+++ b/jax-rs.itests/src/main/java/test/CorsTest.java
@@ -0,0 +1,117 @@
+package test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.data.MapEntry.entry;
+import static org.osgi.service.jaxrs.whiteboard.JaxrsWhiteboardConstants.JAX_RS_APPLICATION_SELECT;
+import static org.osgi.service.jaxrs.whiteboard.JaxrsWhiteboardConstants.JAX_RS_NAME;
+
+import java.util.Collections;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import javax.ws.rs.client.WebTarget;
+import javax.ws.rs.container.ContainerRequestContext;
+import javax.ws.rs.container.ContainerRequestFilter;
+import javax.ws.rs.container.ContainerResponseContext;
+import javax.ws.rs.container.ContainerResponseFilter;
+import javax.ws.rs.core.Response;
+
+import org.apache.cxf.rs.security.cors.CrossOriginResourceSharingFilter;
+import org.junit.Test;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.PrototypeServiceFactory;
+import org.osgi.framework.ServiceRegistration;
+
+import test.types.TestAddon;
+import test.types.TestApplication;
+import test.types.TestHelper;
+
+public class CorsTest extends TestHelper {
+
+    @Test
+    public void basicCors() throws Exception {
+        AtomicBoolean calledFilterBefore = new AtomicBoolean();
+        AtomicBoolean calledFilterAfter = new AtomicBoolean();
+
+        registerExtension(
+            new String[] {
+                ContainerRequestFilter.class.getName(),
+                ContainerResponseFilter.class.getName()},
+            new PrototypeServiceFactory<Object>() {
+                @Override
+                public Object getService(
+                    Bundle bundle, ServiceRegistration<Object> registration) {
+                    return new CrossOriginResourceSharingFilter() {
+
+                        @Override
+                        public void filter(
+                            ContainerRequestContext requestContext,
+                            ContainerResponseContext responseContext) {
+
+                            super.filter(requestContext, responseContext);
+                            calledFilterAfter.set(true);
+                        }
+                        @Override
+                        public void filter(ContainerRequestContext context) {
+                            super.filter(context);
+                            calledFilterBefore.set(true);
+                        }
+                    };
+                }
+                @Override
+                public void ungetService(
+                    Bundle bundle, ServiceRegistration<Object> registration,
+                    Object service) {
+                }
+            },
+            "FOO",
+            JAX_RS_NAME, CrossOriginResourceSharingFilter.class.getSimpleName());
+
+        registerAddon(
+            new TestAddon(),
+            JAX_RS_APPLICATION_SELECT, String.format("(%s=%s)", JAX_RS_NAME, "FOO"));
+
+        registerApplication(
+            new TestApplication(),
+            JAX_RS_NAME, "FOO");
+
+        WebTarget target = createDefaultTarget();
+
+        try {
+            System.setProperty("sun.net.http.allowRestrictedHeaders", "true");
+
+            Response response = target.path(
+                "/test-application"
+            ).path(
+                "/test"
+            ).request().header(
+                "Origin", "http://foo.com"
+            ).get();
+
+            String result = response.readEntity(String.class);
+
+            assertThat(result).isEqualTo("Hello test");
+
+            assertThat(calledFilterBefore).isTrue();
+            assertThat(calledFilterAfter).isTrue();
+
+            assertThat(response.getStatus()).isEqualTo(200);
+
+            assertThat(calledFilterBefore).isTrue();
+            assertThat(calledFilterAfter).isTrue();
+
+            assertThat(response.getStringHeaders()).contains(
+                entry(
+                    "Access-Control-Allow-Origin",
+                    Collections.singletonList("*")
+                )
+            );
+        }
+        catch (Exception e) {
+            e.printStackTrace();
+        }
+        finally {
+            System.setProperty("sun.net.http.allowRestrictedHeaders", "flase");
+        }
+    }
+
+}
diff --git a/jax-rs.itests/src/main/java/test/types/TestHelper.java b/jax-rs.itests/src/main/java/test/types/TestHelper.java
index 7dc069f..f3da5d6 100644
--- a/jax-rs.itests/src/main/java/test/types/TestHelper.java
+++ b/jax-rs.itests/src/main/java/test/types/TestHelper.java
@@ -416,6 +416,28 @@
         return serviceRegistration;
     }
 
+    protected ServiceRegistration<?> registerExtension(
+        String[] serviceTypes, Object extension, String name, Object... keyValues) {
+
+        Hashtable<String, Object> properties = new Hashtable<>();
+
+        properties.put(JAX_RS_EXTENSION, true);
+        properties.put(JAX_RS_NAME, name);
+        properties.putIfAbsent(
+            JAX_RS_APPLICATION_SELECT, "(osgi.jaxrs.name=*)");
+
+        for (int i = 0; i < keyValues.length; i = i + 2) {
+            properties.put(keyValues[i].toString(), keyValues[i + 1]);
+        }
+
+        ServiceRegistration<?> serviceRegistration =
+            bundleContext.registerService(serviceTypes, extension, properties);
+
+        _registrations.add(serviceRegistration);
+
+        return serviceRegistration;
+    }
+
     protected ServiceRegistration<?> registerInvalidExtension(
         String name, Object... keyValues) {
 
diff --git a/pom.xml b/pom.xml
index 674bdc7..e8b4615 100644
--- a/pom.xml
+++ b/pom.xml
@@ -319,6 +319,16 @@
             </dependency>
             <dependency>
                 <groupId>org.osgi</groupId>
+                <artifactId>org.osgi.test.assertj.framework</artifactId>
+                <version>0.10.0</version>
+            </dependency>
+            <dependency>
+                <groupId>org.osgi</groupId>
+                <artifactId>org.osgi.test.junit4</artifactId>
+                <version>0.10.0</version>
+            </dependency>
+            <dependency>
+                <groupId>org.osgi</groupId>
                 <artifactId>osgi.enroute.junit.wrapper</artifactId>
                 <version>4.12.0</version>
             </dependency>