/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.bbg;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertSame;
import static org.testng.Assert.fail;
import java.util.concurrent.atomic.AtomicReference;
import org.mockito.Mockito;
import org.testng.annotations.Test;
import com.bloomberglp.blpapi.EventHandler;
import com.bloomberglp.blpapi.Session;
import com.bloomberglp.blpapi.SessionOptions;
import com.opengamma.livedata.ConnectionUnavailableException;
import com.opengamma.util.test.TestGroup;
/**
* Tests {@link SessionProvider}
*/
@Test(groups = TestGroup.UNIT)
public class SessionProviderTest {
private SessionOptions sessionOptions() {
final SessionOptions options = new SessionOptions();
options.setServerHost("invalid-host-name");
return options;
}
private void assertSessionFailure(final SessionProvider provider, final String message) {
try {
provider.getSession();
fail();
} catch (ConnectionUnavailableException e) {
assertEquals(e.getMessage(), message);
}
}
public void testLifecycle() {
final BloombergConnector connector = new BloombergConnector("Test", sessionOptions());
try {
final SessionProvider a = new SessionProvider(connector, "Test");
assertSessionFailure(a, "Session provider has not been started");
a.start();
assertSessionFailure(a, "Failed to open session");
assertSessionFailure(a, "No Bloomberg connection is available");
a.stop();
assertSessionFailure(a, "Session provider has not been started");
} finally {
connector.close();
}
}
public void testAvailabilityNotifications() throws Exception {
final AtomicReference<Session> session = new AtomicReference<Session>();
final BloombergConnector connector = new BloombergConnector("Test", sessionOptions()) {
@Override
public Session createOpenSession() {
return session.get();
}
@Override
public Session createOpenSession(EventHandler eventHandler) {
return createOpenSession();
}
};
try {
final SessionProvider a = new SessionProvider(connector, "A");
final SessionProvider b = new SessionProvider(connector, "B");
a.start();
b.start();
// Initial failure - can't connect
assertSessionFailure(a, "Bloomberg service failed to start: A");
assertSessionFailure(b, "Bloomberg service failed to start: B");
// Cached failure - still can't connect
assertSessionFailure(a, "No Bloomberg connection is available");
assertSessionFailure(b, "No Bloomberg connection is available");
// Force A to reconnect (successfully)
final Session sessionImpl = Mockito.mock(Session.class);
Mockito.when(sessionImpl.openService(Mockito.anyString())).thenReturn(true);
session.set(sessionImpl);
a.stop();
a.start();
assertSame(a.getSession(), session.get());
// Cached failures is now cleared for B
assertSame(b.getSession(), session.get());
} finally {
connector.close();
}
}
}