/** * 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.curator.x.discovery.server.jetty_jersey; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.GenericType; import com.sun.jersey.api.client.WebResource; import com.sun.jersey.api.client.config.ClientConfig; import com.sun.jersey.api.client.config.DefaultClientConfig; import com.sun.jersey.api.core.DefaultResourceConfig; import com.sun.jersey.spi.container.servlet.ServletContainer; import org.apache.curator.test.InstanceSpec; import org.apache.curator.x.discovery.ServiceInstance; import org.apache.curator.x.discovery.ServiceType; import org.apache.curator.x.discovery.server.contexts.StringDiscoveryContext; import org.apache.curator.x.discovery.server.entity.JsonServiceInstanceMarshaller; import org.apache.curator.x.discovery.server.entity.JsonServiceInstancesMarshaller; import org.apache.curator.x.discovery.server.entity.JsonServiceNamesMarshaller; import org.apache.curator.x.discovery.server.entity.ServiceInstances; import org.apache.curator.x.discovery.server.entity.ServiceNames; import org.apache.curator.x.discovery.server.mocks.MockServiceDiscovery; import org.apache.curator.x.discovery.strategies.RandomStrategy; import org.mortbay.jetty.Server; import org.mortbay.jetty.servlet.Context; import org.mortbay.jetty.servlet.ServletHolder; import org.testng.Assert; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import javax.ws.rs.core.Application; import javax.ws.rs.core.MediaType; import java.util.Set; public class TestStringsWithJersey { private Server server; private JsonServiceNamesMarshaller serviceNamesMarshaller; private JsonServiceInstanceMarshaller<String> serviceInstanceMarshaller; private JsonServiceInstancesMarshaller<String> serviceInstancesMarshaller; private StringDiscoveryContext context; private int port; @BeforeMethod public void setup() throws Exception { context = new StringDiscoveryContext(new MockServiceDiscovery<String>(), new RandomStrategy<String>(), 1000); serviceNamesMarshaller = new JsonServiceNamesMarshaller(); serviceInstanceMarshaller = new JsonServiceInstanceMarshaller<String>(context); serviceInstancesMarshaller = new JsonServiceInstancesMarshaller<String>(context); Application application = new DefaultResourceConfig() { @Override public Set<Class<?>> getClasses() { Set<Class<?>> classes = Sets.newHashSet(); classes.add(StringDiscoveryResource.class); return classes; } @Override public Set<Object> getSingletons() { Set<Object> singletons = Sets.newHashSet(); singletons.add(context); singletons.add(serviceNamesMarshaller); singletons.add(serviceInstanceMarshaller); singletons.add(serviceInstancesMarshaller); return singletons; } }; ServletContainer container = new ServletContainer(application); port = InstanceSpec.getRandomPort(); server = new Server(port); Context root = new Context(server, "/", Context.SESSIONS); root.addServlet(new ServletHolder(container), "/*"); server.start(); } @AfterMethod public void teardown() throws Exception { server.stop(); server.join(); } @Test public void testRegisterService() throws Exception { ServiceInstance<String> service = ServiceInstance.<String>builder() .name("test") .payload("From Test") .serviceType(ServiceType.STATIC) .build(); ClientConfig config = new DefaultClientConfig() { @Override public Set<Object> getSingletons() { Set<Object> singletons = Sets.newHashSet(); singletons.add(context); singletons.add(serviceNamesMarshaller); singletons.add(serviceInstanceMarshaller); singletons.add(serviceInstancesMarshaller); return singletons; } }; Client client = Client.create(config); WebResource resource = client.resource("http://localhost:" + port); resource.path("/v1/service/test/" + service.getId()).type(MediaType.APPLICATION_JSON_TYPE).put(service); ServiceNames names = resource.path("/v1/service").get(ServiceNames.class); Assert.assertEquals(names.getNames(), Lists.newArrayList("test")); GenericType<ServiceInstances<String>> type = new GenericType<ServiceInstances<String>>(){}; ServiceInstances<String> instances = resource.path("/v1/service/test").get(type); Assert.assertEquals(instances.getServices().size(), 1); Assert.assertEquals(instances.getServices().get(0), service); // Retrieve a single instance GenericType<ServiceInstance<String>> singleInstanceType = new GenericType<ServiceInstance<String>>(){}; ServiceInstance<String> instance = resource.path("/v1/service/test/" + service.getId()).get(singleInstanceType); Assert.assertEquals(instance, service); } @Test public void testEmptyServiceNames() { ClientConfig config = new DefaultClientConfig() { @Override public Set<Object> getSingletons() { Set<Object> singletons = Sets.newHashSet(); singletons.add(context); singletons.add(serviceNamesMarshaller); singletons.add(serviceInstanceMarshaller); singletons.add(serviceInstancesMarshaller); return singletons; } }; Client client = Client.create(config); WebResource resource = client.resource("http://localhost:" + port); ServiceNames names = resource.path("/v1/service").get(ServiceNames.class); Assert.assertEquals(names.getNames(), Lists.<String>newArrayList()); } }