/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.engine.exec;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicLong;
import org.mockito.Mockito;
import org.testng.annotations.Test;
import org.threeten.bp.Instant;
import com.opengamma.engine.calcnode.Capability;
import com.opengamma.engine.calcnode.JobDispatcher;
import com.opengamma.engine.calcnode.PlatformCapabilities;
import com.opengamma.engine.calcnode.stats.TotallingNodeStatisticsGatherer;
import com.opengamma.engine.exec.stats.TotallingGraphStatisticsGathererProvider;
import com.opengamma.util.test.TestGroup;
/**
* Tests the {@link MultipleNodeExecutorTuner} class.
*/
@Test(groups = TestGroup.UNIT)
public class MultipleNodeExecutorTunerTest {
public void testJobDispatcher() {
final MultipleNodeExecutorFactory factory = Mockito.mock(MultipleNodeExecutorFactory.class);
final MultipleNodeExecutorTuner tuner = new MultipleNodeExecutorTuner(factory);
final JobDispatcher dispatcher = Mockito.mock(JobDispatcher.class);
final Map<String, Collection<Capability>> capabilities = new HashMap<String, Collection<Capability>>();
Mockito.when(dispatcher.getAllCapabilities()).thenReturn(capabilities);
tuner.setJobDispatcher(dispatcher);
tuner.run();
Mockito.verifyZeroInteractions(factory);
capabilities.put("A", Arrays.asList(Capability.instanceOf("Foo")));
capabilities.put("B", Arrays.asList(Capability.instanceOf("Bar")));
tuner.run();
Mockito.verifyZeroInteractions(factory);
capabilities.put("A", Arrays.asList(Capability.instanceOf("Foo"), Capability.parameterInstanceOf(PlatformCapabilities.NODE_COUNT, 10d)));
capabilities.put("B", Arrays.asList(Capability.instanceOf("Bar"), Capability.parameterInstanceOf(PlatformCapabilities.NODE_COUNT, 4d)));
tuner.run();
Mockito.verify(factory, Mockito.times(1)).setMaximumConcurrency(7);
Mockito.verify(factory, Mockito.times(1)).invalidateCache();
Mockito.when(factory.getMaximumConcurrency()).thenReturn(7);
tuner.run();
Mockito.verify(factory, Mockito.times(1)).setMaximumConcurrency(7);
Mockito.verify(factory, Mockito.times(1)).invalidateCache();
}
public void testStatisticsDecayRate() {
final MultipleNodeExecutorTuner tuner = new MultipleNodeExecutorTuner(Mockito.mock(MultipleNodeExecutorFactory.class));
assertEquals(tuner.getStatisticsDecayRate(), 0.1d);
tuner.setStatisticsDecayRate(0.9d);
assertEquals(tuner.getStatisticsDecayRate(), 0.9d);
}
public void testStatisticsKeepAlive() {
final MultipleNodeExecutorTuner tuner = new MultipleNodeExecutorTuner(Mockito.mock(MultipleNodeExecutorFactory.class));
assertEquals(tuner.getStatisticsKeepAlive(), 300);
tuner.setStatisticsKeepAlive(60);
assertEquals(tuner.getStatisticsKeepAlive(), 60);
}
public void testGraphExecutionStatistics() {
final MultipleNodeExecutorFactory factory = Mockito.mock(MultipleNodeExecutorFactory.class);
final MultipleNodeExecutorTuner tuner = new MultipleNodeExecutorTuner(factory);
final AtomicLong age = new AtomicLong();
final TotallingGraphStatisticsGathererProvider stats = new TotallingGraphStatisticsGathererProvider() {
@Override
public void dropStatisticsBefore(final Instant limit) {
assertEquals(age.getAndSet(Instant.now().getEpochSecond() - limit.getEpochSecond()), 0);
}
};
tuner.setGraphExecutionStatistics(stats);
tuner.run();
assertTrue(age.get() >= 300);
}
public void testJobDispatchStatistics() {
final MultipleNodeExecutorFactory factory = Mockito.mock(MultipleNodeExecutorFactory.class);
final MultipleNodeExecutorTuner tuner = new MultipleNodeExecutorTuner(factory);
final AtomicLong age = new AtomicLong();
final TotallingNodeStatisticsGatherer stats = new TotallingNodeStatisticsGatherer() {
@Override
public void dropStatisticsBefore(final Instant limit) {
assertEquals(age.getAndSet(Instant.now().getEpochSecond() - limit.getEpochSecond()), 0);
}
};
tuner.setJobDispatchStatistics(stats);
tuner.run();
assertTrue(age.get() >= 300);
}
}