/*
* Copyright 2014, The Sporting Exchange Limited
*
* 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.
*/
package com.betfair.cougar.core.impl.ev;
import com.betfair.cougar.api.ContainerContext;
import com.betfair.cougar.api.Service;
import com.betfair.cougar.core.api.ServiceDefinition;
import com.betfair.cougar.core.api.ServiceVersion;
import com.betfair.cougar.core.api.ev.*;
import com.betfair.cougar.core.api.security.IdentityResolverFactory;
import com.betfair.cougar.core.impl.CougarInternalOperations;
import com.betfair.cougar.util.configuration.PropertyConfigurer;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.event.ContextRefreshedEvent;
import static com.betfair.cougar.core.impl.ev.BaseExecutionVenue.DefinedExecutable;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
/**
* Test case for ServiceRegisterableExecutionVenue
*/
public class ServiceRegisterableExecutionVenueTest {
private OperationKey op1Key = new OperationKey(new ServiceVersion("v1.0"), "Service1", "Operation1");
private OperationKey op2Key = new OperationKey(new ServiceVersion("v1.0"), "Service1", "Operation2");
private OperationKey fooOp1Key = new OperationKey(op1Key, "foo");
private OperationKey fooOp2Key = new OperationKey(op2Key, "foo");
private OperationKey barOp1Key = new OperationKey(op1Key, "bar");
private OperationKey barOp2Key = new OperationKey(op2Key, "bar");
private OperationKey internalOp1Key = new OperationKey(op1Key, CougarInternalOperations.COUGAR_IN_PROCESS_NAMESPACE);
private OperationKey internalOp2Key = new OperationKey(op2Key, CougarInternalOperations.COUGAR_IN_PROCESS_NAMESPACE);
private OperationDefinition op1Def = new SimpleOperationDefinition(op1Key, null, null);
private OperationDefinition op2Def = new SimpleOperationDefinition(op2Key, null, null);
private ServiceDefinition serviceDef = new ServiceDefinition() {
@Override
public OperationDefinition[] getOperationDefinitions() {
return new OperationDefinition[] {op1Def, op2Def};
}
@Override
public String getServiceName() {
return "Service1";
}
@Override
public ServiceVersion getServiceVersion() {
return new ServiceVersion("v1.0");
}
};
private ServiceRegisterableExecutionVenue ev;
private IdentityResolverFactory fact;
private ServiceLogManager manager;
private ServiceLogManagerFactory managerFactory;
private ExecutableResolver resolver;
private ApplicationContext appContext;
private Service service;
private IdentityResolverFactory identityResolverFactory;
@Before
public void before() {
managerFactory = mock(ServiceLogManagerFactory.class);
resolver = mock(ExecutableResolver.class);
ev = new ServiceRegisterableExecutionVenue();
ev.setServiceLogManagerFactory(managerFactory);
appContext = mock(ApplicationContext.class);
service = mock(Service.class);
manager = mock(ServiceLogManager.class);
when(managerFactory.create(anyString(), anyString(), any(ServiceVersion.class))).thenReturn(manager);
identityResolverFactory = new IdentityResolverFactory();
ev.setIdentityResolverFactory(identityResolverFactory);
}
@Test
public void testRegisterService() {
ev.registerService(serviceDef, service, resolver);
//Verify that the OperationDefinition has been registered with the EV
assertEquals(op1Def, ev.getOperationDefinition(op1Key));
assertEquals(op2Def, ev.getOperationDefinition(op2Key));
// verify that the internal in process namespace has also been registered
assertEquals(op1Def, ev.getOperationDefinition(internalOp1Key));
assertEquals(op2Def, ev.getOperationDefinition(internalOp2Key));
assertNull(ev.getOperationDefinition(fooOp1Key));
assertNull(ev.getOperationDefinition(fooOp2Key));
assertNull(ev.getOperationDefinition(barOp1Key));
assertNull(ev.getOperationDefinition(barOp2Key));
}
@Test
public void testRegisterServiceWithNamespace() {
ev.registerService("foo", serviceDef, service, resolver);
//Verify that the OperationDefinition has been registered with the EV under the namespace
assertNull(ev.getOperationDefinition(op1Key));
assertNull(ev.getOperationDefinition(op2Key));
// internal in-process namespace should only be registered for a service with the default namespace
assertNull(ev.getOperationDefinition(internalOp1Key));
assertNull(ev.getOperationDefinition(internalOp2Key));
assertEquals(op1Def, ev.getOperationDefinition(fooOp1Key));
assertEquals(op2Def, ev.getOperationDefinition(fooOp2Key));
assertNull(ev.getOperationDefinition(barOp1Key));
assertNull(ev.getOperationDefinition(barOp2Key));
}
@Test
public void testRegisterServiceTwoDifferentNamespaces() {
ev.registerService("foo", serviceDef, service, resolver);
ev.registerService("bar", serviceDef, service, resolver);
assertNull(ev.getOperationDefinition(op1Key));
assertNull(ev.getOperationDefinition(op2Key));
// internal in-process namespace should only be registered for a service with the default namespace
assertNull(ev.getOperationDefinition(internalOp1Key));
assertNull(ev.getOperationDefinition(internalOp2Key));
assertEquals(op1Def, ev.getOperationDefinition(fooOp1Key));
assertEquals(op2Def, ev.getOperationDefinition(fooOp2Key));
assertEquals(op1Def, ev.getOperationDefinition(barOp1Key));
assertEquals(op2Def, ev.getOperationDefinition(barOp2Key));
}
@Test
public void testRegisterServiceNamespaceAndNot() {
ev.registerService("foo", serviceDef, service, resolver);
ev.registerService(serviceDef, service, resolver);
assertEquals(op1Def, ev.getOperationDefinition(op1Key));
assertEquals(op2Def, ev.getOperationDefinition(op2Key));
// verify that the internal in process namespace has also been registered
assertEquals(op1Def, ev.getOperationDefinition(internalOp1Key));
assertEquals(op2Def, ev.getOperationDefinition(internalOp2Key));
assertEquals(op1Def, ev.getOperationDefinition(fooOp1Key));
assertEquals(op2Def, ev.getOperationDefinition(fooOp2Key));
assertNull(ev.getOperationDefinition(barOp1Key));
assertNull(ev.getOperationDefinition(barOp2Key));
}
@Test
public void testRegisterServiceTwiceWithSameNamespace() {
ev.registerService("foo", serviceDef, service, resolver);
try {
ev.registerService("foo", serviceDef, service, resolver);
fail();
} catch (IllegalArgumentException e) {
// OK
}
}
@Test
public void testOnApplicationEvent() {
ev.registerService(serviceDef, service, resolver);
//raise the event
ev.onApplicationEvent(new ContextRefreshedEvent(appContext));
verify(service).init(any(ContainerContext.class));
}
@Test
public void timeoutSet() {
PropertyConfigurer.getAllLoadedProperties().put("timeout.foo:Service1/v1.0/Operation1","1000");
PropertyConfigurer.getAllLoadedProperties().put("timeout.Service1/v1.0/Operation2","100");
ev.registerService("foo", serviceDef, service, resolver);
ev.registerService(serviceDef, service, resolver);
DefinedExecutable fooOp1De = ev.getDefinedExecutable(fooOp1Key);
assertEquals(1000, fooOp1De.getMaxExecutionTime());
DefinedExecutable op2De = ev.getDefinedExecutable(op2Key);
assertEquals(100, op2De.getMaxExecutionTime());
}
}