/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.engine.view.worker.cache; import static org.testng.AssertJUnit.assertNotSame; import static org.testng.AssertJUnit.assertSame; import java.util.concurrent.locks.Lock; import org.mockito.Mockito; import org.testng.annotations.Test; import org.threeten.bp.Instant; import com.opengamma.engine.marketdata.availability.MarketDataAvailabilityProvider; import com.opengamma.engine.view.ViewDefinition; import com.opengamma.id.UniqueId; import com.opengamma.id.VersionCorrection; import com.opengamma.util.test.TestGroup; import com.opengamma.util.tuple.Pair; /** * Tests the {@link ViewExecutionCacheLock} class. */ @Test(groups = TestGroup.UNIT) public class ViewExecutionCacheLockTest { private ViewDefinition viewDefinition() { return new ViewDefinition(UniqueId.of("View", "123"), "Test 1", "User"); } private MarketDataAvailabilityProvider marketDataProvider(final String key) { final MarketDataAvailabilityProvider mock = Mockito.mock(MarketDataAvailabilityProvider.class); Mockito.when(mock.getAvailabilityHintKey()).thenReturn(key); return mock; } public void testBroadLock() { final ViewExecutionCacheLock locks1 = new ViewExecutionCacheLock(); final ViewExecutionCacheLock locks2 = new ViewExecutionCacheLock(); final ViewExecutionCacheKey keyA = ViewExecutionCacheKey.of(viewDefinition(), marketDataProvider("A"), null); final ViewExecutionCacheKey keyB = ViewExecutionCacheKey.of(viewDefinition(), marketDataProvider("B"), null); final Lock lockA1 = locks1.get(keyA); final Lock lockB1 = locks1.get(keyB); final Lock lockA2 = locks2.get(keyA); final Lock lockB2 = locks2.get(keyB); assertNotSame(lockA1, lockB1); assertNotSame(lockA2, lockB2); assertNotSame(lockA1, lockA2); assertNotSame(lockB1, lockB2); assertSame(locks1.get(keyA), lockA1); assertSame(locks1.get(keyB), lockB1); } public void testFinerLock() { final ViewExecutionCacheLock locks = new ViewExecutionCacheLock(); final ViewExecutionCacheKey keyA = ViewExecutionCacheKey.of(viewDefinition(), marketDataProvider("A"), null); final ViewExecutionCacheKey keyB = ViewExecutionCacheKey.of(viewDefinition(), marketDataProvider("B"), null); final Instant valuationTimeA = Instant.now(); final Instant valuationTimeB = valuationTimeA.plusSeconds(100); final VersionCorrection resolverVersionCorrectionA = VersionCorrection.of(valuationTimeA.minusSeconds(1), valuationTimeA.minusSeconds(2)); final VersionCorrection resolverVersionCorrectionB = VersionCorrection.of(valuationTimeA.minusSeconds(3), valuationTimeA.minusSeconds(3)); @SuppressWarnings("unchecked") final Pair<Lock, Lock>[] ls = new Pair[] {locks.get(keyA, valuationTimeA, resolverVersionCorrectionA), locks.get(keyA, valuationTimeA, resolverVersionCorrectionB), locks.get(keyA, valuationTimeB, resolverVersionCorrectionA), locks.get(keyA, valuationTimeB, resolverVersionCorrectionB), locks.get(keyB, valuationTimeA, resolverVersionCorrectionA), locks.get(keyB, valuationTimeA, resolverVersionCorrectionB), locks.get(keyB, valuationTimeB, resolverVersionCorrectionA), locks.get(keyB, valuationTimeB, resolverVersionCorrectionB) }; for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { if ((i < 4) == (j < 4)) { assertSame(ls[j].getFirst(), ls[i].getFirst()); } else { assertNotSame(ls[j].getFirst(), ls[i].getFirst()); } if (i != j) { assertNotSame(ls[j].getSecond(), ls[i].getSecond()); } } } assertSame(locks.get(keyA, valuationTimeA, resolverVersionCorrectionB).getSecond(), ls[1].getSecond()); } }