/*
* #%L
* Locator Service :: REST
* %%
* Copyright (C) 2011 - 2012 Talend Inc.
* %%
* Licensed 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.
* #L%
*/
package org.talend.esb.locator.service.rest;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.expectLastCall;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
import static org.junit.Assert.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Response.Status;
import javax.xml.namespace.QName;
import javax.xml.transform.dom.DOMResult;
import javax.xml.ws.wsaddressing.W3CEndpointReference;
import javax.xml.ws.wsaddressing.W3CEndpointReferenceBuilder;
import org.easymock.EasyMock;
import org.easymock.EasyMockSupport;
import org.easymock.IArgumentMatcher;
import org.junit.Before;
import org.junit.Test;
import org.talend.schemas.esb.locator._2011._11.BindingType;
import org.talend.schemas.esb.locator.rest._2011._11.EndpointReferenceList;
import org.talend.schemas.esb.locator.rest._2011._11.EntryType;
import org.talend.schemas.esb.locator.rest._2011._11.RegisterEndpointRequest;
import org.talend.schemas.esb.locator._2011._11.TransportType;
import org.talend.esb.locator.service.rest.LocatorRestServiceImpl;
import org.talend.esb.servicelocator.client.Endpoint;
import org.talend.esb.servicelocator.client.EndpointNotFoundException;
import org.talend.esb.servicelocator.client.SLEndpoint;
import org.talend.esb.servicelocator.client.SLPropertiesImpl;
import org.talend.esb.servicelocator.client.ServiceLocator;
import org.talend.esb.servicelocator.client.ServiceLocatorException;
import org.talend.esb.servicelocator.client.WrongArgumentException;
import org.talend.esb.servicelocator.client.internal.EndpointTransformerImpl;
import org.w3c.dom.Document;
public class LocatorRestServiceTest extends EasyMockSupport {
private ServiceLocator sl;
private static QName SERVICE_NAME;
private final static String ENDPOINTURL = "http://Service";
private final static String QNAME_PREFIX1 = "http://services.talend.org/TestService";
private final static String QNAME_LOCALPART1 = "TestServiceProvider";
private List<String> names;
private LocatorRestServiceImpl lps;
private SLEndpoint endpoint;
@Before
public void setup() {
sl = createMock(ServiceLocator.class);
names = new ArrayList<String>();
SERVICE_NAME = new QName(QNAME_PREFIX1, QNAME_LOCALPART1);
names = new ArrayList<String>();
lps = new LocatorRestServiceImpl();
lps.setLocatorClient(sl);
lps.setLocatorEndpoints("localhost:2181");
lps.setConnectionTimeout(5000);
lps.setSessionTimeout(5000);
endpoint = createMock(SLEndpoint.class);
}
@Test
public void disconnectLocator() throws InterruptedException, ServiceLocatorException {
sl.disconnect();
EasyMock.expectLastCall();
replayAll();
lps.disconnectLocator();
}
@Test
public void lookUpEndpointTest() throws ServiceLocatorException,
InterruptedException {
names.clear();
names.add(ENDPOINTURL);
expect(sl.lookup(SERVICE_NAME)).andStubReturn(names);
expect(sl.getEndpoint(SERVICE_NAME, ENDPOINTURL)).andStubReturn(
endpoint);
expect(endpoint.getProperties()).andStubReturn(
SLPropertiesImpl.EMPTY_PROPERTIES);
replayAll();
W3CEndpointReference endpointRef, expectedRef;
W3CEndpointReferenceBuilder builder = new W3CEndpointReferenceBuilder();
//builder.serviceName(SERVICE_NAME);
builder.address(ENDPOINTURL);
expectedRef = builder.build();
endpointRef = lps.lookupEndpoint(SERVICE_NAME.toString(),
new ArrayList<String>());
assertTrue(endpointRef.toString().equals(expectedRef.toString()));
}
@Test
public void lookUpEndpointWithReturnProps() throws ServiceLocatorException, InterruptedException {
names.clear();
names.add(ENDPOINTURL);
SLPropertiesImpl slPropertiesImpl = new SLPropertiesImpl();
List<String> list = new ArrayList<String>();
slPropertiesImpl.addProperty("test", list);
expect(sl.lookup(SERVICE_NAME)).andStubReturn(names);
expect(sl.getEndpoint(SERVICE_NAME, ENDPOINTURL)).andStubReturn(
endpoint);
expect(endpoint.getProperties()).andStubReturn(slPropertiesImpl);
replayAll();
W3CEndpointReference endpointRef, expectedRef;
W3CEndpointReferenceBuilder builder = new W3CEndpointReferenceBuilder();
// builder.serviceName(SERVICE_NAME);
builder.address(ENDPOINTURL);
EndpointTransformerImpl transformer = new EndpointTransformerImpl();
DOMResult result = new DOMResult();
transformer.writePropertiesTo(slPropertiesImpl, result);
Document docResult = (Document) result.getNode();
builder.metadata(docResult.getDocumentElement());
expectedRef = builder.build();
endpointRef = lps.lookupEndpoint(SERVICE_NAME.toString(), new ArrayList<String>());
assertTrue(endpointRef.toString().equals(expectedRef.toString()));
}
@Test(expected = WebApplicationException.class)
public void lookUpEndpointExpectedLocatorException() throws ServiceLocatorException,
InterruptedException {
names.clear();
names.add(ENDPOINTURL);
expect(sl.lookup(SERVICE_NAME)).andStubThrow(new ServiceLocatorException("test"));
replayAll();
lps.lookupEndpoint(SERVICE_NAME.toString(), new ArrayList<String>());
}
@Test(expected = WebApplicationException.class)
public void lookUpEndpointExpectedInterruptedException() throws ServiceLocatorException,
InterruptedException {
names.clear();
names.add(ENDPOINTURL);
expect(sl.lookup(SERVICE_NAME)).andStubThrow(new InterruptedException("test"));
replayAll();
lps.lookupEndpoint(SERVICE_NAME.toString(), new ArrayList<String>());
}
@Test
public void lookUpEndpointTestNotFound() throws ServiceLocatorException,
InterruptedException {
names.clear();
names.add(ENDPOINTURL);
expect(sl.lookup(SERVICE_NAME)).andStubReturn(null);
replayAll();
try {
lps.lookupEndpoint(SERVICE_NAME.toString(), new ArrayList<String>());
} catch (WebApplicationException ex) {
assertTrue(ex.getResponse().getStatus() == 404);
}
}
@Test
public void lookUpEndpoints() throws ServiceLocatorException,
InterruptedException {
names.clear();
names.add(ENDPOINTURL);
expect(sl.lookup(SERVICE_NAME)).andStubReturn(names);
expect(sl.getEndpoint(SERVICE_NAME, ENDPOINTURL)).andStubReturn(
endpoint);
expect(endpoint.getProperties()).andStubReturn(
SLPropertiesImpl.EMPTY_PROPERTIES);
replayAll();
W3CEndpointReference expectedRef;
W3CEndpointReferenceBuilder builder = new W3CEndpointReferenceBuilder();
//builder.serviceName(SERVICE_NAME);
builder.address(ENDPOINTURL);
expectedRef = builder.build();
EndpointReferenceList erlt = lps.lookupEndpoints(
SERVICE_NAME.toString(), new ArrayList<String>());
if (erlt.getEndpointReference().get(0).equals(expectedRef))
fail();
}
@Test(expected = WebApplicationException.class)
public void lookUpEndpointsExpectedLocatorException() throws ServiceLocatorException,
InterruptedException {
names.clear();
names.add(ENDPOINTURL);
expect(sl.lookup(SERVICE_NAME)).andStubThrow(new ServiceLocatorException("test"));
replayAll();
lps.lookupEndpoints(SERVICE_NAME.toString(), new ArrayList<String>());
}
@Test(expected = WebApplicationException.class)
public void lookUpEndpointsExpectedInterruptedException() throws ServiceLocatorException,
InterruptedException {
names.clear();
names.add(ENDPOINTURL);
expect(sl.lookup(SERVICE_NAME)).andStubThrow(new InterruptedException("test"));
replayAll();
lps.lookupEndpoints(SERVICE_NAME.toString(), new ArrayList<String>());
}
@Test
public void lookUpEndpointsNotFound() throws ServiceLocatorException,
InterruptedException {
names.clear();
names.add(ENDPOINTURL);
expect(sl.lookup(SERVICE_NAME)).andStubReturn(null);
replayAll();
try {
lps.lookupEndpoints(SERVICE_NAME.toString(),
new ArrayList<String>());
} catch (WebApplicationException ex) {
if (ex.getResponse().getStatus() != 404)
fail();
}
}
@Test
public void unregisterEndpoint() throws ServiceLocatorException,
InterruptedException {
sl.unregister(SERVICE_NAME, ENDPOINTURL);
EasyMock.expectLastCall();
replayAll();
try {
lps.unregisterEndpoint(SERVICE_NAME.toString(), ENDPOINTURL);
} catch (WebApplicationException ex) {
fail();
}
}
@Test(expected = WebApplicationException.class)
public void unregisterEndpointExpectedLocatorException() throws ServiceLocatorException,
InterruptedException {
sl.unregister(SERVICE_NAME, ENDPOINTURL);
EasyMock.expectLastCall().andStubThrow(new ServiceLocatorException("test"));
replayAll();
lps.unregisterEndpoint(SERVICE_NAME.toString(), ENDPOINTURL);
}
@Test(expected = WebApplicationException.class)
public void unregisterEndpointExpectedInterruptedException() throws ServiceLocatorException,
InterruptedException {
sl.unregister(SERVICE_NAME, ENDPOINTURL);
EasyMock.expectLastCall().andStubThrow(new InterruptedException("test"));
replayAll();
lps.unregisterEndpoint(SERVICE_NAME.toString(), ENDPOINTURL);
}
@Test
public void registerEndpoint() throws ServiceLocatorException,
InterruptedException {
sl.register(endpoint(), EasyMock.eq(true));
EasyMock.expectLastCall();
replayAll();
RegisterEndpointRequest req = new RegisterEndpointRequest();
req.setEndpointURL(ENDPOINTURL);
req.setServiceName(SERVICE_NAME.toString());
lps.registerEndpoint(req);
}
@Test
public void registerEndpointWithProps() throws ServiceLocatorException,
InterruptedException {
sl.register(endpoint(), EasyMock.eq(true));
EasyMock.expectLastCall();
replayAll();
RegisterEndpointRequest req = new RegisterEndpointRequest();
EntryType entryType = new EntryType();
entryType.setKey("test");
entryType.getValue().add("test");
req.getEntryType().add(entryType);
req.setEndpointURL(ENDPOINTURL);
req.setServiceName(SERVICE_NAME.toString());
lps.registerEndpoint(req);
}
@Test(expected = WebApplicationException.class)
public void registerEndpointExpectedLocatorException() throws ServiceLocatorException,
InterruptedException {
sl.register(endpoint(), EasyMock.eq(true));
EasyMock.expectLastCall().andStubThrow(new ServiceLocatorException("test"));
replayAll();
RegisterEndpointRequest req = new RegisterEndpointRequest();
EntryType entryType = new EntryType();
entryType.setKey("test");
entryType.getValue().add("test");
req.getEntryType().add(entryType);
req.setEndpointURL(ENDPOINTURL);
req.setServiceName(SERVICE_NAME.toString());
lps.registerEndpoint(req);
}
@Test(expected = WebApplicationException.class)
public void registerEndpointExpectedInterruptedException() throws ServiceLocatorException,
InterruptedException {
sl.register(endpoint(), EasyMock.eq(true));
EasyMock.expectLastCall().andStubThrow(new InterruptedException("test"));
replayAll();
RegisterEndpointRequest req = new RegisterEndpointRequest();
EntryType entryType = new EntryType();
entryType.setKey("test");
entryType.getValue().add("test");
req.getEntryType().add(entryType);
req.setEndpointURL(ENDPOINTURL);
req.setServiceName(SERVICE_NAME.toString());
lps.registerEndpoint(req);
}
@Test
public void registerEndpointWithOptParam() throws ServiceLocatorException,
InterruptedException {
sl.register(endpoint(), EasyMock.eq(true));
EasyMock.expectLastCall();
replayAll();
RegisterEndpointRequest req = new RegisterEndpointRequest();
req.setEndpointURL(ENDPOINTURL);
req.setServiceName(SERVICE_NAME.toString());
req.setBinding(BindingType.JAXRS);
req.setTransport(TransportType.HTTPS);
lps.registerEndpoint(req);
}
@Test
public void updateEndpointExpiringTime() throws Exception {
final int ttl = 95;
sl.updateTimetolive(SERVICE_NAME, ENDPOINTURL, ttl);
replay(sl);
lps.updateTimetolive(SERVICE_NAME.toString(), ENDPOINTURL, ttl);
verify(sl);
}
@Test
public void updateEndpointExpiringTimeMissingEndpoint() throws Exception {
final int ttl = 95;
sl.updateTimetolive(SERVICE_NAME, ENDPOINTURL, ttl);
expectLastCall().andThrow(new EndpointNotFoundException());
replay(sl);
try {
lps.updateTimetolive(SERVICE_NAME.toString(), ENDPOINTURL, ttl);
fail();
} catch (WebApplicationException e) {
assertEquals(Status.NOT_FOUND.getStatusCode(), e.getResponse().getStatus());
// pass
}
verify(sl);
}
@Test
public void updateEndpointExpiringTimeWrongTime() throws Exception {
final int ttl = 95;
sl.updateTimetolive(SERVICE_NAME, ENDPOINTURL, ttl);
expectLastCall().andThrow(new WrongArgumentException());
replay(sl);
try {
lps.updateTimetolive(SERVICE_NAME.toString(), ENDPOINTURL, ttl);
fail();
} catch (WebApplicationException e) {
assertEquals(Status.BAD_REQUEST.getStatusCode(), e.getResponse().getStatus());
// pass
}
verify(sl);
}
public static Endpoint endpoint() {
EasyMock.reportMatcher(new simpleEndpointMatcher());
return null;
}
public static class simpleEndpointMatcher implements IArgumentMatcher {
@Override
public boolean matches(Object argument) {
if (argument != null && argument instanceof Endpoint) {
Endpoint result = (Endpoint) argument;
if (!ENDPOINTURL.equals(result.getAddress()))
return false;
if (!SERVICE_NAME.equals(result.getServiceName()))
return false;
}
return true;
}
@Override
public void appendTo(StringBuffer buffer) {
}
}
}