package org.gcube.common.clients; import static java.util.concurrent.TimeUnit.*; import static org.junit.Assert.*; import static org.mockito.Matchers.*; import static org.mockito.Mockito.*; import java.io.StringWriter; import java.net.URI; import java.util.concurrent.TimeUnit; import javax.xml.transform.stream.StreamResult; import javax.xml.ws.wsaddressing.W3CEndpointReference; import org.gcube.common.clients.builders.AbstractBuilder; import org.gcube.common.clients.builders.AbstractStatefulBuilder; import org.gcube.common.clients.builders.AbstractStatelessBuilder; import org.gcube.common.clients.builders.AddressingUtils; import org.gcube.common.clients.builders.StatefulBuilderAPI; import org.gcube.common.clients.builders.StatelessBuilderAPI; import org.gcube.common.clients.cache.DefaultEndpointCache; import org.gcube.common.clients.cache.EndpointCache; import org.gcube.common.clients.config.DiscoveryConfig; import org.gcube.common.clients.config.EndpointConfig; import org.gcube.common.clients.config.Property; import org.gcube.common.clients.config.ProxyConfig; import org.gcube.common.clients.delegates.DirectDelegate; import org.gcube.common.clients.delegates.DiscoveryDelegate; import org.gcube.common.clients.delegates.ProxyDelegate; import org.gcube.common.clients.delegates.ProxyPlugin; import org.gcube.common.clients.queries.Query; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.invocation.InvocationOnMock; import org.mockito.runners.MockitoJUnitRunner; import org.mockito.stubbing.Answer; @RunWith(MockitoJUnitRunner.class) public class BuildersTest { @Mock ProxyPlugin plugin; @Mock(name="some cache") EndpointCache cache; @Mock(name="sample query") Query query; URI uriAddress = URI.create("http://foobar.org"); Property testProp = new Property("name","value"); StatelessBuilderAPI.Builder statelessBuilder; StatefulBuilderAPI.Builder statefulBuilder; //we build these proxies that give access to delegate so that we can make assertions class SampleProxy { ProxyDelegate delegate; public SampleProxy(ProxyDelegate delegate) { this.delegate=delegate; } } class SampleStatelessBuilder extends AbstractStatelessBuilder { public SampleStatelessBuilder(EndpointCache cache,Query query, Property...properties) { super(plugin, cache, query,properties); } @Override protected W3CEndpointReference convertAddress(W3CEndpointReference address) { return address; } @Override protected String contextPath() { return "/context/path/"; } }; class SampleStatefulBuilder extends AbstractStatefulBuilder { public SampleStatefulBuilder(EndpointCache cache, Property...properties) { super(plugin,cache,properties); } @Override protected W3CEndpointReference convertAddress(W3CEndpointReference address) { return address; } @Override protected String contextPath() { return "/context/path/"; } }; @Before @SuppressWarnings("all") public void setup() throws Exception { when(plugin.name()).thenReturn("someservice"); when(plugin.namespace()).thenReturn("http://acme.org"); when(plugin.newProxy(any(ProxyDelegate.class))).thenAnswer(new Answer() { public SampleProxy answer(InvocationOnMock invocation) throws Throwable { return new SampleProxy((ProxyDelegate) invocation.getArguments()[0]); } }); } @Test public void buildersBuildStatelessDirectProxy() { statelessBuilder = new SampleStatelessBuilder(cache,query); SampleProxy proxy = statelessBuilder.at(uriAddress).build(); ProxyDelegate delegate = proxy.delegate; assertTrue(delegate instanceof DirectDelegate); ProxyConfig config = delegate.config(); assertEquals(AbstractBuilder.defaultTimeout, config.timeout()); assertEquals(plugin, config.plugin()); assertTrue(config instanceof EndpointConfig); @SuppressWarnings("unchecked") EndpointConfig econfig = (EndpointConfig) config; StringWriter w1 = new StringWriter(); StringWriter w2 = new StringWriter(); AddressingUtils.address("/context/path/",plugin.name(),uriAddress).writeTo(new StreamResult(w1)); econfig.address().writeTo(new StreamResult(w2)); assertEquals(w1.toString(),w2.toString()); } @Test public void buildersBuildStatefulDirectProxy() throws Exception { //with new timeout default statefulBuilder = new SampleStatefulBuilder(cache,Property.timeout(15,SECONDS)); //with client-driven timeout SampleProxy proxy = statefulBuilder.at("key",uriAddress.toURL()).with(Property.timeout(20,SECONDS)).build(); ProxyDelegate delegate = proxy.delegate; assertTrue(delegate instanceof DirectDelegate); ProxyConfig config = delegate.config(); //client-driven timeout wins assertEquals((int)TimeUnit.SECONDS.toMillis(20), config.timeout()); assertEquals(plugin, config.plugin()); assertTrue(config instanceof EndpointConfig); @SuppressWarnings("unchecked") EndpointConfig econfig = (EndpointConfig) config; StringWriter w1 = new StringWriter(); StringWriter w2 = new StringWriter(); AddressingUtils.address("/context/path/",plugin.name(),plugin.namespace(),"key",uriAddress).writeTo(new StreamResult(w1)); econfig.address().writeTo(new StreamResult(w2)); System.out.println(w2.toString()); assertEquals(w1.toString(),w2.toString()); } @Test public void buildersBuildStatelessDiscoveryProxy() throws Exception { EndpointCache newCache = new DefaultEndpointCache(); statelessBuilder = new SampleStatelessBuilder(newCache,query,Property.timeout(15,SECONDS),testProp); SampleProxy proxy = statelessBuilder.build(); ProxyDelegate delegate = proxy.delegate; assertTrue(delegate instanceof DiscoveryDelegate); ProxyConfig config = delegate.config(); assertEquals(TimeUnit.SECONDS.toMillis(15), config.timeout()); assertTrue(config.hasProperty("name")); assertEquals(config.property("name",String.class),"value"); assertEquals(plugin, config.plugin()); assertTrue(config instanceof DiscoveryConfig); @SuppressWarnings("unchecked") DiscoveryConfig dconfig = (DiscoveryConfig) config; assertEquals(newCache, dconfig.cache()); assertEquals(query, dconfig.query()); } @Test public void buildersBuildStatefulDiscoveryProxy() { statefulBuilder = new SampleStatefulBuilder(cache); SampleProxy proxy = statefulBuilder.matching(query).with(testProp).withTimeout(15,SECONDS).build(); ProxyDelegate delegate = proxy.delegate; assertTrue(delegate instanceof DiscoveryDelegate); ProxyConfig config = delegate.config(); assertEquals(TimeUnit.SECONDS.toMillis(15), config.timeout()); assertTrue(config.hasProperty(testProp.name())); assertEquals(config.property(testProp.name(),Object.class),testProp.value()); assertEquals(plugin, config.plugin()); assertTrue(config instanceof DiscoveryConfig); @SuppressWarnings("unchecked") DiscoveryConfig dconfig = (DiscoveryConfig) config; assertEquals(query, dconfig.query()); } }