/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.engine.view.worker;
import static org.testng.Assert.assertEquals;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.LinkedList;
import java.util.List;
import org.mockito.Mockito;
import org.testng.annotations.Test;
import org.threeten.bp.Instant;
import com.opengamma.engine.marketdata.spec.MarketData;
import com.opengamma.engine.view.ViewDefinition;
import com.opengamma.engine.view.execution.ArbitraryViewCycleExecutionSequence;
import com.opengamma.engine.view.execution.ExecutionOptions;
import com.opengamma.engine.view.execution.InfiniteViewCycleExecutionSequence;
import com.opengamma.engine.view.execution.ViewCycleExecutionOptions;
import com.opengamma.engine.view.execution.ViewCycleExecutionSequence;
import com.opengamma.engine.view.execution.ViewExecutionFlags;
import com.opengamma.engine.view.execution.ViewExecutionOptions;
import com.opengamma.util.test.TestGroup;
/**
* Tests the {@link SequencePartitioningViewProcessWorkerFactory} class
*/
@Test(groups = TestGroup.UNIT)
public class SequencePartitioningViewProcessWorkerFactoryTest {
private class ViewProcessWorkerFactoryMock implements ViewProcessWorkerFactory {
private final List<ViewExecutionOptions> _executionOptions = new LinkedList<ViewExecutionOptions>();
@Override
public ViewProcessWorker createWorker(ViewProcessWorkerContext context, ViewExecutionOptions executionOptions, ViewDefinition viewDefinition) {
_executionOptions.add(executionOptions);
return Mockito.mock(ViewProcessWorker.class);
}
}
private SequencePartitioningViewProcessWorkerFactory createFactory(final ViewProcessWorkerFactory underlying) {
final StaticSequencePartitioningViewProcessWorkerFactory test = new StaticSequencePartitioningViewProcessWorkerFactory(underlying);
test.setSaturation(4);
test.setMinimumCycles(8);
test.setMaximumCycles(32);
return test;
}
public void testPassthrough() {
final ViewProcessWorkerFactoryMock underlying = new ViewProcessWorkerFactoryMock();
final SequencePartitioningViewProcessWorkerFactory test = createFactory(underlying);
final ViewExecutionOptions options = ExecutionOptions.infinite(MarketData.live());
test.createWorker(Mockito.mock(ViewProcessWorkerContext.class), options, Mockito.mock(ViewDefinition.class));
assertEquals(underlying._executionOptions.size(), 1);
assertEquals(underlying._executionOptions.get(0), options);
}
public void testShortSequence() {
final ViewProcessWorkerFactoryMock underlying = new ViewProcessWorkerFactoryMock();
final SequencePartitioningViewProcessWorkerFactory test = createFactory(underlying);
final Instant t = Instant.now();
final ViewCycleExecutionSequence sequence = ArbitraryViewCycleExecutionSequence.of(t, t.plusSeconds(1), t.plusSeconds(2));
final ViewExecutionOptions options = ExecutionOptions.of(sequence, EnumSet.of(ViewExecutionFlags.RUN_AS_FAST_AS_POSSIBLE));
test.createWorker(Mockito.mock(ViewProcessWorkerContext.class), options, Mockito.mock(ViewDefinition.class));
assertEquals(underlying._executionOptions.size(), 1);
assertEquals(underlying._executionOptions.get(0), options);
}
public void testSequence() {
final ViewProcessWorkerFactoryMock underlying = new ViewProcessWorkerFactoryMock();
final SequencePartitioningViewProcessWorkerFactory test = createFactory(underlying);
final Instant t = Instant.now();
final List<ViewCycleExecutionOptions> cycles = new ArrayList<ViewCycleExecutionOptions>(20);
for (int i = 0; i < 20; i++) {
cycles.add(ViewCycleExecutionOptions.builder().setValuationTime(t.plusSeconds(i)).create());
}
final ViewCycleExecutionSequence sequence = new ArbitraryViewCycleExecutionSequence(cycles);
final ViewExecutionOptions options = ExecutionOptions.of(sequence, EnumSet.of(ViewExecutionFlags.RUN_AS_FAST_AS_POSSIBLE));
test.createWorker(Mockito.mock(ViewProcessWorkerContext.class), options, Mockito.mock(ViewDefinition.class));
assertEquals(underlying._executionOptions.size(), 3);
for (ViewExecutionOptions spawned : underlying._executionOptions) {
assertEquals(spawned.getDefaultExecutionOptions(), options.getDefaultExecutionOptions());
assertEquals(spawned.getFlags(), options.getFlags());
assertEquals(spawned.getMaxSuccessiveDeltaCycles(), options.getMaxSuccessiveDeltaCycles());
}
assertEquals(underlying._executionOptions.get(0).getExecutionSequence().estimateRemaining(), 8);
assertEquals(underlying._executionOptions.get(1).getExecutionSequence().estimateRemaining(), 8);
assertEquals(underlying._executionOptions.get(2).getExecutionSequence().estimateRemaining(), 4);
}
public void testInfiniteSequence() {
final ViewProcessWorkerFactoryMock underlying = new ViewProcessWorkerFactoryMock();
final SequencePartitioningViewProcessWorkerFactory test = createFactory(underlying);
final ViewCycleExecutionSequence sequence = new InfiniteViewCycleExecutionSequence();
final ViewExecutionOptions options = ExecutionOptions.of(sequence, EnumSet.of(ViewExecutionFlags.RUN_AS_FAST_AS_POSSIBLE));
test.createWorker(Mockito.mock(ViewProcessWorkerContext.class), options, Mockito.mock(ViewDefinition.class));
assertEquals(underlying._executionOptions.size(), 4);
for (ViewExecutionOptions spawned : underlying._executionOptions) {
assertEquals(spawned.getDefaultExecutionOptions(), options.getDefaultExecutionOptions());
assertEquals(spawned.getFlags(), options.getFlags());
assertEquals(spawned.getMaxSuccessiveDeltaCycles(), options.getMaxSuccessiveDeltaCycles());
assertEquals(spawned.getExecutionSequence().estimateRemaining(), 32);
}
}
}