package org.marketcetera.marketdata.provider;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.EnumSet;
import java.util.Set;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.marketcetera.core.LoggerConfiguration;
import org.marketcetera.core.publisher.ISubscriber;
import org.marketcetera.marketdata.*;
import org.marketcetera.marketdata.core.Messages;
import org.marketcetera.marketdata.core.ProviderStatus;
import org.marketcetera.marketdata.core.manager.MarketDataProviderNotAvailable;
import org.marketcetera.marketdata.core.manager.MarketDataRequestFailed;
import org.marketcetera.marketdata.core.provider.AbstractMarketDataProvider;
import org.marketcetera.marketdata.core.provider.MarketDataProviderStartFailed;
import org.marketcetera.marketdata.core.request.MarketDataRequestAtom;
import org.marketcetera.marketdata.core.request.MarketDataRequestToken;
import org.marketcetera.module.ExpectedFailure;
/* $License$ */
/**
* Tests {@link AbstractMarketDataProvider}.
*
* @author <a href="mailto:colin@marketcetera.com">Colin DuPlantis</a>
* @version $Id: AbstractMarketDataProviderTest.java 16901 2014-05-11 16:14:11Z colin $
* @since 2.4.0
*/
public class AbstractMarketDataProviderTest
{
/**
* Run once before all tests.
*
* @throws Exception if an unexpected error occurs
*/
@BeforeClass
public static void once()
throws Exception
{
LoggerConfiguration.logSetup();
}
/**
* Run before each test.
*
* @throws Exception if an unexpected error occurs
*/
@Before
public void setup()
throws Exception
{
provider = new MockMarketDataProvider();
provider.start();
}
/**
* Tests {@link AbstractMarketDataProvider#start()} and {@link AbstractMarketDataProvider#stop()}.
*
* @throws Exception if an unexpected error occurs
*/
@Test
public void testStartStop()
throws Exception
{
assertTrue(provider.isRunning());
assertEquals(ProviderStatus.AVAILABLE,
provider.getProviderStatus());
provider.start();
assertTrue(provider.isRunning());
assertEquals(ProviderStatus.AVAILABLE,
provider.getProviderStatus());
provider.stop();
assertFalse(provider.isRunning());
assertEquals(ProviderStatus.OFFLINE,
provider.getProviderStatus());
provider.stop();
assertFalse(provider.isRunning());
assertEquals(ProviderStatus.OFFLINE,
provider.getProviderStatus());
// pathological cases
NullPointerException exception = new NullPointerException("this exception is expected");
provider.setExceptionOnStart(exception);
new ExpectedFailure<MarketDataProviderStartFailed>() {
@Override
protected void run()
throws Exception
{
provider.start();
}
};
assertFalse(provider.isRunning());
assertEquals(ProviderStatus.ERROR,
provider.getProviderStatus());
provider.reset();
provider.start();
assertTrue(provider.isRunning());
assertEquals(ProviderStatus.AVAILABLE,
provider.getProviderStatus());
provider.setExceptionOnStop(exception);
provider.stop();
assertFalse(provider.isRunning());
assertEquals(ProviderStatus.ERROR,
provider.getProviderStatus());
}
/**
* Tests {@link AbstractMarketDataProvider#requestMarketData(org.marketcetera.marketdata.core.request.MarketDataRequestToken)}.
*
* @throws Exception if an unexpected error occurs
*/
@Test
public void testRequestMarketData()
throws Exception
{
provider.stop();
assertFalse(provider.isRunning());
new ExpectedFailure<MarketDataProviderNotAvailable>() {
@Override
protected void run()
throws Exception
{
provider.requestMarketData(generateRequestToken());
}
};
provider.start();
assertTrue(provider.getRequestedAtoms().isEmpty());
final MarketDataRequest request = generateRequest(new String[] { "METC" },
EnumSet.of(Content.TOP_OF_BOOK));
provider.requestMarketData(generateRequestToken(request));
assertEquals(1,
provider.getRequestedAtoms().size());
MarketDataRequestAtom requestedAtom = provider.getRequestedAtoms().get(0);
assertEquals(Content.TOP_OF_BOOK,
requestedAtom.getContent());
assertEquals("METC",
requestedAtom.getSymbol());
// make a request for an unsupported capability
provider.stop();
provider.start();
provider.reset();
provider.setCapabilities(EnumSet.of(Capability.LATEST_TICK));
new ExpectedFailure<MarketDataRequestFailed>(Messages.UNSUPPORTED_MARKETDATA_CONTENT,
Content.TOP_OF_BOOK,
provider.getCapabilities().toString()) {
@Override
protected void run()
throws Exception
{
provider.requestMarketData(generateRequestToken(request));
}
};
assertTrue(provider.getRequestedAtoms().isEmpty());
// make a request for multiple atoms with different content
final MarketDataRequest multiContentRequest = generateRequest(new String[] { "METC" },
EnumSet.of(Content.LATEST_TICK,Content.TOP_OF_BOOK));
assertTrue(provider.getCapabilities().contains(Capability.LATEST_TICK));
assertFalse(provider.getCapabilities().contains(Capability.TOP_OF_BOOK));
assertTrue(provider.getRequestedAtoms().isEmpty());
assertFalse(provider.getCanceledAtoms().isEmpty());
new ExpectedFailure<MarketDataRequestFailed>(Messages.UNSUPPORTED_MARKETDATA_CONTENT,
Content.TOP_OF_BOOK,
provider.getCapabilities().toString()) {
@Override
protected void run()
throws Exception
{
provider.requestMarketData(generateRequestToken(multiContentRequest));
}
};
assertEquals(0,
provider.getRequestedAtoms().size());
assertEquals(3,
provider.getCanceledAtoms().size());
// assertSame(provider.getRequestedAtoms().get(0),
// provider.getCanceledAtoms().get(0));
}
private MarketDataRequest generateRequest(String[] inSymbols,
Set<Content> inContent)
{
MarketDataRequestBuilder requestBuilder = MarketDataRequestBuilder.newRequest();
return requestBuilder.withSymbols(inSymbols)
.withContent(inContent).create();
}
private MarketDataRequest generateRequest()
{
return generateRequest(new String[] { "AAPL","GOOG","METC" },
EnumSet.of(Content.TOP_OF_BOOK,Content.LATEST_TICK));
}
private MarketDataRequestToken generateRequestToken()
{
return generateRequestToken(new ISubscriber() {
@Override
public void publishTo(Object inData)
{
}
@Override
public boolean isInteresting(Object inData)
{
return true;
}
});
}
private MarketDataRequestToken generateRequestToken(MarketDataRequest inRequest)
{
return generateRequestToken(inRequest,
new ISubscriber() {
@Override
public void publishTo(Object inData)
{
}
@Override
public boolean isInteresting(Object inData)
{
return true;
}
});
}
private MarketDataRequestToken generateRequestToken(ISubscriber inSubscriber)
{
return generateRequestToken(generateRequest(),
inSubscriber);
}
private MarketDataRequestToken generateRequestToken(MarketDataRequest inRequest,
ISubscriber inSubscriber)
{
MarketDataRequestToken token = mock(MarketDataRequestToken.class);
when(token.getId()).thenReturn(System.nanoTime());
when(token.getRequest()).thenReturn(inRequest);
when(token.getSubscriber()).thenReturn(inSubscriber);
return token;
}
/**
* test market data provider
*/
private MockMarketDataProvider provider;
}