/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.engine.marketdata;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertNull;
import java.util.Collections;
import org.mockito.Mockito;
import org.mockito.internal.verification.VerificationModeFactory;
import org.testng.annotations.Test;
import com.opengamma.engine.ComputationTargetSpecification;
import com.opengamma.engine.value.ValueProperties;
import com.opengamma.engine.value.ValuePropertyNames;
import com.opengamma.engine.value.ValueRequirement;
import com.opengamma.engine.value.ValueSpecification;
import com.opengamma.id.UniqueId;
import com.opengamma.util.test.TestGroup;
/**
* Tests {@link MarketDataProviderWithOverride}
*/
@Test(groups = TestGroup.UNIT)
public class MarketDataProviderWithOverrideTest {
public void testSubscriptionFailure() throws InterruptedException {
final MarketDataInjectorImpl overrideInjector = new MarketDataInjectorImpl();
final MockMarketDataProvider p1 = new MockMarketDataProvider("p1", false, 1);
final MarketDataProviderWithOverride provider = new MarketDataProviderWithOverride(p1, overrideInjector);
final MarketDataListener listener = mock(MarketDataListener.class);
provider.addListener(listener);
final ValueSpecification spec = getSpecification(1);
provider.subscribe(spec);
p1.awaitSubscriptionResponses();
verify(listener).subscriptionFailed(spec, "p1");
verify(listener, VerificationModeFactory.noMoreInteractions()).subscriptionFailed(Mockito.<ValueSpecification>anyObject(), Mockito.anyString());
}
public void testSubscriptionSuccess() throws InterruptedException {
final MarketDataInjectorImpl overrideInjector = new MarketDataInjectorImpl();
final MockMarketDataProvider p1 = new MockMarketDataProvider("p1", true, 1);
final MarketDataProviderWithOverride provider = new MarketDataProviderWithOverride(p1, overrideInjector);
final MarketDataListener listener = mock(MarketDataListener.class);
provider.addListener(listener);
final ValueSpecification spec = getSpecification(1);
provider.subscribe(spec);
p1.awaitSubscriptionResponses();
verify(listener).subscriptionsSucceeded(Collections.singleton(spec));
verify(listener, VerificationModeFactory.noMoreInteractions()).subscriptionsSucceeded(Collections.singleton(Mockito.<ValueSpecification>anyObject()));
p1.valuesChanged(Collections.singleton(spec));
verify(listener, VerificationModeFactory.times(1)).valuesChanged(Collections.singleton(spec));
}
public void testSnapshotWithOverrides() throws InterruptedException {
final ValueSpecification spec1 = getSpecification(1);
final ValueSpecification spec2 = getSpecification(2);
final MarketDataInjectorImpl overrideInjector = new MarketDataInjectorImpl();
overrideInjector.addValue(spec1, "value1");
final MockMarketDataProvider underlyingProvider = new MockMarketDataProvider("p2", true, 1);
underlyingProvider.put(spec2, "value2");
final MarketDataProviderWithOverride provider = new MarketDataProviderWithOverride(underlyingProvider, overrideInjector);
final MarketDataSnapshot snapshot = provider.snapshot(null);
assertEquals(1, underlyingProvider.getAndResetSnapshotCount());
assertEquals("value1", snapshot.query(spec1));
assertEquals(0, underlyingProvider.getAndResetQueryCount());
assertEquals("value2", snapshot.query(spec2));
assertEquals(1, underlyingProvider.getAndResetQueryCount());
final ValueSpecification spec3 = getSpecification(3);
assertNull(snapshot.query(spec3));
assertEquals(1, underlyingProvider.getAndResetQueryCount());
assertEquals("value1", snapshot.query(spec1));
}
public void testSnapshotNoOverrides() throws InterruptedException {
final ValueSpecification spec1 = getSpecification(1);
final MarketDataInjectorImpl overrideInjector = new MarketDataInjectorImpl();
final MockMarketDataProvider underlyingProvider = new MockMarketDataProvider("p2", true, 1);
underlyingProvider.put(spec1, "value2");
final MarketDataProviderWithOverride provider = new MarketDataProviderWithOverride(underlyingProvider, overrideInjector);
final MarketDataSnapshot snapshot = provider.snapshot(null);
assertEquals(1, underlyingProvider.getAndResetSnapshotCount());
assertEquals("value2", snapshot.query(spec1));
assertEquals(1, underlyingProvider.getAndResetQueryCount());
}
public void testSnapshotWithAlgorithmOverrides() throws InterruptedException {
final ValueSpecification spec1 = getSpecification(1);
final MarketDataInjectorImpl overrideInjector = new MarketDataInjectorImpl();
overrideInjector.addValue(spec1, new OverrideOperation() {
@Override
public Object apply(final ValueRequirement requirement, final Object original) {
assertEquals("Value-1", requirement.getValueName());
assertEquals("value2", original);
return "value1";
}
});
final MockMarketDataProvider underlyingProvider = new MockMarketDataProvider("p2", true, 1);
underlyingProvider.put(spec1, "value2");
final MarketDataProviderWithOverride provider = new MarketDataProviderWithOverride(underlyingProvider, overrideInjector);
final MarketDataSnapshot snapshot = provider.snapshot(null);
assertEquals(1, underlyingProvider.getAndResetSnapshotCount());
// p1 should override the value in p2, but p2 was queried for the operation
assertEquals("value1", snapshot.query(spec1));
assertEquals(1, underlyingProvider.getAndResetQueryCount());
}
private ValueSpecification getSpecification(final int number) {
return new ValueSpecification("Value-" + number, ComputationTargetSpecification.of(UniqueId.of("Scheme", "Target")), ValueProperties.with(ValuePropertyNames.FUNCTION, "MarketData").get());
}
}