blob: 1e86eba478bf230173ae3d51175925f229a45254 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.knox.gateway.jersey;
import org.apache.knox.gateway.config.GatewayConfig;
import org.apache.knox.gateway.deploy.DeploymentContext;
import org.apache.knox.gateway.deploy.ProviderDeploymentContributor;
import org.apache.knox.gateway.descriptor.FilterDescriptor;
import org.apache.knox.gateway.descriptor.FilterParamDescriptor;
import org.apache.knox.gateway.descriptor.GatewayDescriptor;
import org.apache.knox.gateway.descriptor.GatewayDescriptorFactory;
import org.apache.knox.gateway.descriptor.ResourceDescriptor;
import org.apache.knox.gateway.topology.Provider;
import org.apache.knox.gateway.topology.Service;
import org.apache.knox.gateway.topology.Topology;
import org.easymock.EasyMock;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.jboss.shrinkwrap.descriptor.api.webapp30.WebAppDescriptor;
import org.junit.Test;
import java.util.Iterator;
import java.util.List;
import java.util.ServiceLoader;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.fail;
public class JerseyDeploymentContributorTest {
@Test
public void testServiceLoader() throws Exception {
ServiceLoader loader = ServiceLoader.load( ProviderDeploymentContributor.class );
Iterator iterator = loader.iterator();
assertThat( "Service iterator empty.", iterator.hasNext() );
while( iterator.hasNext() ) {
Object object = iterator.next();
if( object instanceof JerseyDispatchDeploymentContributor ) {
return;
}
}
fail( "Failed to find " + JerseyDispatchDeploymentContributor.class.getName() + " via service loader." );
}
@Test
public void testDeploymentContributors() throws Exception {
JerseyDispatchDeploymentContributor providerContributor = new JerseyDispatchDeploymentContributor();
assertThat( providerContributor.getRole(), is( "pivot" ) );
assertThat( providerContributor.getName(), is( "jersey" ) );
MockJerseyService serviceContributor = new MockJerseyService();
WebArchive webArchive = ShrinkWrap.create( WebArchive.class, "test-archive" );
Topology topology = new Topology();
topology.setName( "test-topology" );
Provider provider = new Provider();
provider.setRole( "pivot" );
provider.setName( "jersey" );
provider.setEnabled( true );
topology.addProvider( provider );
GatewayDescriptor descriptor = GatewayDescriptorFactory.create();
DeploymentContext context = EasyMock.createNiceMock( DeploymentContext.class );
EasyMock.expect( context.getWebArchive() ).andReturn( webArchive ).anyTimes();
EasyMock.expect( context.getTopology() ).andReturn( topology ).anyTimes();
EasyMock.expect( context.getGatewayDescriptor() ).andReturn( descriptor ).anyTimes();
context.contributeFilter(
EasyMock.isA( Service.class ),
EasyMock.isA( ResourceDescriptor.class ),
EasyMock.isA( String.class ),
EasyMock.isA( String.class ),
EasyMock.isA( List.class ) );
EasyMock.expectLastCall().andDelegateTo(
new MockDeploymentContext( context, providerContributor, provider ) ).anyTimes();
EasyMock.replay( context );
// Just make sure they don't blow up.
providerContributor.initializeContribution( context );
serviceContributor.initializeContribution( context );
Service service = new Service();
service.setRole( "test-service-role" );
service.setName( "test-service-name" );
service.addUrl( "http://test-service-host:777/test-service-path" );
// This should end up calling providerContributor.contributeFilter
serviceContributor.contributeService( context, service );
ResourceDescriptor resource = context.getGatewayDescriptor().resources().get( 0 );
// Just make sure they don't blow up.
serviceContributor.finalizeContribution( context );
providerContributor.finalizeContribution( context );
/*
GatewayDescriptorFactory.store( descriptor, "xml", new PrintWriter( System.out ) );
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<gateway>
<resource>
<role>test-service-role</role>
<pattern>test-service/?**</pattern>
<filter>
<role>dispatch</role>
<name>jersey</name>
<class>org.glassfish.jersey.servlet.ServletContainer</class>
<param>
<name>jersey.config.server.provider.packages</name>
<value>test-package-1;test-package-2</value>
</param>
</filter>
</resource>
<resource>
<role>test-service-role</role>
<pattern>test-service/**?**</pattern>
<filter>
<role>dispatch</role>
<name>jersey</name>
<class>org.glassfish.jersey.servlet.ServletContainer</class>
<param>
<name>jersey.config.server.provider.packages</name>
<value>test-package-1;test-package-2</value>
</param>
</filter>
</resource>
</gateway>
*/
List<ResourceDescriptor> resources = context.getGatewayDescriptor().resources();
assertThat( resources.size(), is( 2 ) );
resource = resources.get( 0 );
assertThat( resource.role(), is( "test-service-role" ) );
assertThat( resource.pattern(), is( "test-service/?**" ) );
List<FilterDescriptor> filters = resource.filters();
assertThat( filters.size(), is( 1 ) );
FilterDescriptor filter = filters.get( 0 );
assertThat( filter.role(), is( "pivot") );
assertThat( filter.name(), is( "jersey" ) );
assertThat( filter.impl(), is( "org.glassfish.jersey.servlet.ServletContainer" ) );
List<FilterParamDescriptor> params = filter.params();
assertThat( params.size(), is( 1 ) );
FilterParamDescriptor param = params.get( 0 );
assertThat( param.name(), is( "jersey.config.server.provider.packages" ) );
assertThat( param.value(), is( "test-package-1;test-package-2" ) );
resource = resources.get( 1 );
assertThat( resource.role(), is( "test-service-role" ) );
assertThat( resource.pattern(), is( "test-service/**?**" ) );
filters = resource.filters();
assertThat( filters.size(), is( 1 ) );
filter = filters.get( 0 );
assertThat( filter.role(), is( "pivot") );
assertThat( filter.name(), is( "jersey" ) );
assertThat( filter.impl(), is( "org.glassfish.jersey.servlet.ServletContainer" ) );
params = filter.params();
assertThat( params.size(), is( 1 ) );
param = params.get( 0 );
assertThat( param.name(), is( "jersey.config.server.provider.packages" ) );
assertThat( param.value(), is( "test-package-1;test-package-2" ) );
}
private static class MockJerseyService extends JerseyServiceDeploymentContributorBase {
@Override
protected String[] getPatterns() {
return new String[]{ "test-service/?**", "test-service/**?**" };
}
@Override
protected String[] getPackages() {
return new String[]{ "test-package-1", "test-package-2" };
}
@Override
public String getRole() {
return "test-service-role";
}
@Override
public String getName() {
return "test-service-name";
}
}
private static class MockDeploymentContext implements DeploymentContext {
DeploymentContext context;
ProviderDeploymentContributor providerContributor;
Provider provider;
MockDeploymentContext(
DeploymentContext context,
ProviderDeploymentContributor providerContributor,
Provider provider ) {
this.context = context;
this.providerContributor = providerContributor;
this.provider = provider;
}
@Override
public GatewayConfig getGatewayConfig() {
return null;
}
@Override
public Topology getTopology() {
return null;
}
@Override
public WebArchive getWebArchive() {
return null;
}
@Override
public WebAppDescriptor getWebAppDescriptor() {
return null;
}
@Override
public GatewayDescriptor getGatewayDescriptor() {
return null;
}
@Override
public void contributeFilter( Service service, ResourceDescriptor resource, String role, String name, List<FilterParamDescriptor> params ) {
providerContributor.contributeFilter( context, provider, service, resource, params );
}
@Override
public void addDescriptor( String name, Object descriptor ) {
}
@Override
public <T> T getDescriptor( String name ) {
return null;
}
}
}