/** * Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.core.security.impl; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.testng.AssertJUnit.assertEquals; import java.util.Collections; import org.mockito.stubbing.OngoingStubbing; import org.testng.annotations.Test; import org.threeten.bp.Instant; import org.threeten.bp.LocalDate; import org.threeten.bp.ZoneOffset; import com.opengamma.DataNotFoundException; import com.opengamma.core.security.Security; import com.opengamma.core.security.SecurityLink; import com.opengamma.core.security.SecuritySource; import com.opengamma.id.ExternalId; import com.opengamma.id.ExternalIdBundle; import com.opengamma.id.ObjectId; import com.opengamma.id.UniqueId; import com.opengamma.id.VersionCorrection; import com.opengamma.util.test.TestGroup; /** * Test {@link SimpleSecurityResolver}. */ @Test(groups = TestGroup.UNIT) public class SimpleSecurityResolverTest { private static final ObjectId UNKNOWN_OID = ObjectId.of("Unknown", "Unknown"); private static final UniqueId UNKNOWN_UID = UniqueId.of("Unknown", "Unknown", "Unknown"); private static final ExternalIdBundle UNKNOWN_BUNDLE = ExternalIdBundle.of(ExternalId.of("Unknown", "Unknown")); private final ObjectId _objectId; private final ExternalId _securityExternalId; private final ExternalIdBundle _intersectingExternalIdBundle; private final Security _securityV1; private final Security _securityV2; private final Instant _securityV2ValidFrom; private final Instant _now = Instant.now(); private final SecuritySource _securitySource; @SuppressWarnings({"unchecked", "rawtypes" }) public SimpleSecurityResolverTest() { _securityExternalId = ExternalId.of("Scheme1", "Value1"); ExternalIdBundle externalIdBundle = ExternalIdBundle.of(_securityExternalId, ExternalId.of("Scheme2", "Value2")); _intersectingExternalIdBundle = ExternalIdBundle.of(_securityExternalId, ExternalId.of("Scheme3", "Value3")); _objectId = ObjectId.of("Sec", "a"); _securityV1 = new SimpleSecurity(_objectId.atVersion("1"), externalIdBundle, "Type", "Security V1"); _securityV2 = new SimpleSecurity(_objectId.atVersion("2"), externalIdBundle, "Type", "Security V2"); _securityV2ValidFrom = LocalDate.of(2011, 01, 01).atStartOfDay(ZoneOffset.UTC).toInstant(); _securitySource = mock(SecuritySource.class); // By unique ID when(_securitySource.get(_securityV1.getUniqueId())).thenReturn(_securityV1); when(_securitySource.get(_securityV2.getUniqueId())).thenReturn(_securityV2); when(_securitySource.get(UNKNOWN_UID)).thenThrow(new DataNotFoundException("")); // By object ID and version-correction when(_securitySource.get(_objectId, VersionCorrection.of(_securityV2ValidFrom.minusMillis(1), _now))).thenReturn(_securityV1); when(_securitySource.get(_objectId, VersionCorrection.of(_securityV2ValidFrom, _now))).thenReturn(_securityV2); when(_securitySource.get(UNKNOWN_OID, VersionCorrection.of(Instant.ofEpochMilli(123), Instant.ofEpochMilli(123)))).thenThrow(new DataNotFoundException("")); // By external ID bundle and version-correction ((OngoingStubbing) when(_securitySource.get(ExternalIdBundle.of(_securityExternalId), VersionCorrection.of(_securityV2ValidFrom, _now)))).thenReturn(Collections.singleton(_securityV2)); ((OngoingStubbing) when(_securitySource.get(_intersectingExternalIdBundle, VersionCorrection.of(_securityV2ValidFrom, _now)))).thenReturn(Collections.singleton(_securityV2)); ((OngoingStubbing) when(_securitySource.get(_intersectingExternalIdBundle, VersionCorrection.of(_securityV2ValidFrom.minusMillis(1), _now)))).thenReturn(Collections.singleton(_securityV1)); when(_securitySource.get(UNKNOWN_BUNDLE)).thenThrow(new DataNotFoundException("")); } //------------------------------------------------------------------------- @Test(expectedExceptions = IllegalArgumentException.class) public void test_constructor_nullSecuritySource() { new SimpleSecurityResolver((SecuritySource) null, VersionCorrection.LATEST); } @Test(expectedExceptions = IllegalArgumentException.class) public void test_constructor_nullVersionCorrection() { new SimpleSecurityResolver(_securitySource, (VersionCorrection) null); } //------------------------------------------------------------------------- @Test @SuppressWarnings("deprecation") public void testResolveLinkWithObjectId() { SimpleSecurityResolver resolver = new SimpleSecurityResolver(_securitySource, VersionCorrection.of(_securityV2ValidFrom, _now)); SecurityLink link = new SimpleSecurityLink(_objectId); Security resolvedSecurity = resolver.resolve(link); assertEquals(_securityV2, resolvedSecurity); } @Test(expectedExceptions = DataNotFoundException.class) @SuppressWarnings("deprecation") public void testResolveLinkWithUnknownObjectId() { VersionCorrection vc = VersionCorrection.of(Instant.ofEpochMilli(123), Instant.ofEpochMilli(123)); SimpleSecurityResolver resolver = new SimpleSecurityResolver(_securitySource, vc); SecurityLink link = new SimpleSecurityLink(UNKNOWN_OID); resolver.resolve(link); } @Test public void testResolveLinkWithExternalIdBundle() { SimpleSecurityResolver resolver = new SimpleSecurityResolver(_securitySource, VersionCorrection.of(_securityV2ValidFrom, _now)); SecurityLink link = new SimpleSecurityLink(_securityExternalId); Security resolvedSecurity = resolver.resolve(link); assertEquals(_securityV2, resolvedSecurity); link = new SimpleSecurityLink(ExternalIdBundle.of(_intersectingExternalIdBundle)); resolvedSecurity = resolver.resolve(link); assertEquals(_securityV2, resolvedSecurity); } @Test(expectedExceptions = DataNotFoundException.class) public void testResolveLinkWithUnknownExternalIdBundle() { SimpleSecurityResolver resolver = new SimpleSecurityResolver(_securitySource, VersionCorrection.of(Instant.ofEpochMilli(123), Instant.ofEpochMilli(123))); SecurityLink link = new SimpleSecurityLink(ExternalId.of("Unknown", "Unknown")); resolver.resolve(link); } @Test(expectedExceptions = DataNotFoundException.class) public void testResolveEmptyLink() { SimpleSecurityResolver resolver = new SimpleSecurityResolver(_securitySource, VersionCorrection.of(Instant.ofEpochMilli(123), Instant.ofEpochMilli(123))); SecurityLink link = new SimpleSecurityLink(); resolver.resolve(link); } //------------------------------------------------------------------------- @Test public void testGetSecurityByUniqueId() { SimpleSecurityResolver resolver = new SimpleSecurityResolver(_securitySource, VersionCorrection.of(_securityV2ValidFrom.minusMillis(1), _now)); Security security = resolver.getSecurity(_securityV1.getUniqueId()); assertEquals(_securityV1, security); // Should still return security even if not valid for the version-correction of resolver resolver = new SimpleSecurityResolver(_securitySource, VersionCorrection.of(_securityV2ValidFrom, _now)); security = resolver.getSecurity(_securityV1.getUniqueId()); assertEquals(_securityV1, security); } @Test(expectedExceptions = DataNotFoundException.class) public void testGetSecurityByUnknownUniqueId() { SimpleSecurityResolver resolver = new SimpleSecurityResolver(_securitySource, VersionCorrection.of(_securityV2ValidFrom, _now)); resolver.getSecurity(UNKNOWN_UID); } //------------------------------------------------------------------------- @Test public void testGetSecurityByObjectId() { SimpleSecurityResolver resolver = new SimpleSecurityResolver(_securitySource, VersionCorrection.of(_securityV2ValidFrom.minusMillis(1), _now)); Security security = resolver.getSecurity(_objectId); assertEquals(_securityV1, security); resolver = new SimpleSecurityResolver(_securitySource, VersionCorrection.of(_securityV2ValidFrom, _now)); security = resolver.getSecurity(_objectId); assertEquals(_securityV2, security); } @Test(expectedExceptions = DataNotFoundException.class) public void testGetSecurityByUnknownObjectId() { VersionCorrection vc = VersionCorrection.of(Instant.ofEpochMilli(123), Instant.ofEpochMilli(123)); SimpleSecurityResolver resolver = new SimpleSecurityResolver(_securitySource, vc); resolver.getSecurity(UNKNOWN_OID); } //------------------------------------------------------------------------- @Test public void testGetSecurityByExternalIdBundle() { SimpleSecurityResolver resolver = new SimpleSecurityResolver(_securitySource, VersionCorrection.of(_securityV2ValidFrom.minusMillis(1), _now)); Security security = resolver.getSecurity(_intersectingExternalIdBundle); assertEquals(_securityV1, security); resolver = new SimpleSecurityResolver(_securitySource, VersionCorrection.of(_securityV2ValidFrom, _now)); security = resolver.getSecurity(_intersectingExternalIdBundle); assertEquals(_securityV2, security); } @Test(expectedExceptions = DataNotFoundException.class) public void testGetSecurityByUnknownExternalIdBundle() { SimpleSecurityResolver resolver = new SimpleSecurityResolver(_securitySource, VersionCorrection.of(_securityV2ValidFrom, _now)); resolver.getSecurity(UNKNOWN_BUNDLE); } }