/* Copyright 2012 Google, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.arbeitspferde.groningen;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Key;
import com.google.inject.Provider;
import com.google.inject.name.Names;
import org.arbeitspferde.groningen.common.BlockScope;
import org.arbeitspferde.groningen.common.SystemAdapter;
import org.arbeitspferde.groningen.config.ConfigManager;
import org.arbeitspferde.groningen.config.GroningenConfig;
import org.arbeitspferde.groningen.config.PipelineIterationScoped;
import org.arbeitspferde.groningen.config.PipelineScoped;
import org.arbeitspferde.groningen.config.StubConfigManager;
import org.arbeitspferde.groningen.display.DisplayMediator;
import org.arbeitspferde.groningen.display.Displayable;
import org.arbeitspferde.groningen.display.MonitorGroningen;
import org.arbeitspferde.groningen.eventlog.EventLoggerService;
import org.arbeitspferde.groningen.eventlog.SafeProtoLoggerFactory;
import org.arbeitspferde.groningen.experimentdb.ExperimentDb;
import org.arbeitspferde.groningen.externalprocess.ProcessInvoker;
import org.arbeitspferde.groningen.generator.Generator;
import org.arbeitspferde.groningen.open.OpenModule;
import org.arbeitspferde.groningen.proto.Params.GroningenParams;
import org.arbeitspferde.groningen.proto.Params.GroningenParamsOrBuilder;
import org.arbeitspferde.groningen.subject.SubjectInterrogator;
import org.arbeitspferde.groningen.utility.Clock;
import junit.framework.TestCase;
import org.easymock.EasyMock;
import java.util.Timer;
/**
* Tests for {@link BaseModule}.
*/
public class BaseModuleTest extends TestCase {
private Injector injector;
private BlockScope pipelineScope;
private BlockScope pipelineIterationScope;
private PipelineId pipelineId;
private GroningenConfig stubConfig;
@Override
public void setUp() {
final String[] args = new String[] {};
injector = Guice.createInjector(new OpenModule(), new BaseModule(args),
new GroningenConfigParamsModule(), new ServicesModule());
pipelineScope = injector.getInstance(Key.get(BlockScope.class,
Names.named(PipelineScoped.SCOPE_NAME)));
pipelineIterationScope = injector.getInstance(Key.get(BlockScope.class,
Names.named(PipelineIterationScoped.SCOPE_NAME)));
pipelineId = new PipelineId("pipelineId");
stubConfig = new StubConfigManager.StubConfig() {
@Override
public GroningenParamsOrBuilder getParamBlock() {
return GroningenParams.getDefaultInstance().toBuilder();
}
};
}
public void testInjectorProvision() {
assertNotNull(injector);
}
public void testInjector_ProvisionClock() {
final Clock clock = injector.getInstance(Clock.class);
assertNotNull(clock);
}
public void testInjector_ProvisionClockAsSingleton() {
final Clock clock1 = injector.getInstance(Clock.class);
final Clock clock2 = injector.getInstance(Clock.class);
assertEquals(clock1, clock2);
}
public void testInjector_ProvisionProcessInvoker() {
pipelineScope.enter();
try {
pipelineScope.seed(PipelineId.class, pipelineId);
pipelineIterationScope.enter();
GroningenConfigParamsModule.nailConfigToScope(stubConfig, pipelineIterationScope);
try {
final ProcessInvoker processInvoker = injector.getInstance(ProcessInvoker.class);
assertNotNull(processInvoker);
} finally {
pipelineIterationScope.exit();
}
} finally {
pipelineScope.exit();
}
}
public void testInjector_ProvisionDisplayMediator() {
pipelineScope.enter();
try {
pipelineScope.seed(PipelineId.class, pipelineId);
final DisplayMediator displayMediator = injector.getInstance(DisplayMediator.class);
assertNotNull(displayMediator);
} finally {
pipelineScope.exit();
}
}
public void testInjector_ProvisionDisplayable() {
pipelineScope.enter();
try {
pipelineScope.seed(PipelineId.class, pipelineId);
final Displayable displayable = injector.getInstance(Displayable.class);
assertNotNull(displayable);
} finally {
pipelineScope.exit();
}
}
public void testInjector_ProvisionMonitor() {
pipelineScope.enter();
try {
pipelineScope.seed(PipelineId.class, pipelineId);
final MonitorGroningen monitor = injector.getInstance(MonitorGroningen.class);
assertNotNull(monitor);
} finally {
pipelineScope.exit();
}
}
public void testInjector_ProvisionMonitorAndDisplayableAsPerPipelineObjects() {
pipelineScope.enter();
try {
pipelineScope.seed(PipelineId.class, pipelineId);
final MonitorGroningen monitor = injector.getInstance(MonitorGroningen.class);
final Displayable displayable = injector.getInstance(Displayable.class);
assertSame(monitor, displayable);
} finally {
pipelineScope.exit();
}
}
public void testInjector_ProvisionExperimentDb() {
pipelineScope.enter();
try {
pipelineScope.seed(PipelineId.class, pipelineId);
final ExperimentDb experimentDb = injector.getInstance(ExperimentDb.class);
assertNotNull(experimentDb);
} finally {
pipelineScope.exit();
}
}
public void testInjector_ProvisionGenerator() {
pipelineScope.enter();
try {
pipelineScope.seed(PipelineId.class, pipelineId);
pipelineIterationScope.enter();
GroningenConfigParamsModule.nailConfigToScope(stubConfig, pipelineIterationScope);
try {
final Generator generator = injector.getInstance(Generator.class);
assertNotNull(generator);
} finally {
pipelineIterationScope.exit();
}
} finally {
pipelineScope.exit();
}
}
public void testInjector_ProvisionSubjectInterrogator() {
pipelineScope.enter();
try {
pipelineScope.seed(PipelineId.class, pipelineId);
pipelineIterationScope.enter();
GroningenConfigParamsModule.nailConfigToScope(stubConfig, pipelineIterationScope);
try {
final SubjectInterrogator subjectInterrogator =
injector.getInstance(SubjectInterrogator.class);
assertNotNull(subjectInterrogator);
} finally {
pipelineIterationScope.exit();
}
} finally {
pipelineScope.exit();
}
}
public void testInjector_ProvisionSystemAdapter() {
final SystemAdapter systemAdapter = injector.getInstance(SystemAdapter.class);
assertNotNull(systemAdapter);
}
public void testInjector_ProvisionSafeProtoLoggerFactory() {
final SafeProtoLoggerFactory safeProtoLoggerFactory =
injector.getInstance(SafeProtoLoggerFactory.class);
assertNotNull(safeProtoLoggerFactory);
}
public void testInjector_ProvisionEventLoggerService() {
final EventLoggerService eventLoggerService = injector.getInstance(EventLoggerService.class);
assertNotNull(eventLoggerService);
}
public void testInjector_ProvisionDaemonTimerProvider() {
final Provider<Timer> daemonTimerProvider = injector.getProvider(Timer.class);
assertNotNull(daemonTimerProvider);
}
public void testInjector_DaemonTimerProvider_ProvisionsTimer() {
final Provider<Timer> daemonTimerProvider = injector.getProvider(Timer.class);
assertNotNull(daemonTimerProvider.get());
}
public void testInjector_DaemonTimerProvider_ProvisionsUniqueTimers() {
final Provider<Timer> daemonTimerProvider = injector.getProvider(Timer.class);
final Timer first = daemonTimerProvider.get();
final Timer second = daemonTimerProvider.get();
assertNotSame(first, second);
}
public void testInjector_ProvisionPipelineIdGenerator() {
final PipelineIdGenerator pipelineIdGenerator =
injector.getInstance(PipelineIdGenerator.class);
assertNotNull(pipelineIdGenerator);
}
public void testInjector_ProvisionPipeline() {
final ConfigManager mockConfigManager =
EasyMock.createNiceMock(ConfigManager.class);
final PipelineSynchronizer mockSynchronizer =
EasyMock.createNiceMock(PipelineSynchronizer.class);
final PipelineStageInfo mockPipelineStageInfo =
EasyMock.createNiceMock(PipelineStageInfo.class);
EasyMock.replay(mockConfigManager);
EasyMock.replay(mockSynchronizer);
pipelineScope.enter();
try {
pipelineScope.seed(PipelineId.class, pipelineId);
pipelineScope.seed(ConfigManager.class, mockConfigManager);
pipelineScope.seed(PipelineSynchronizer.class, mockSynchronizer);
pipelineScope.seed(PipelineStageInfo.class, mockPipelineStageInfo);
assertNotNull(injector.getInstance(Pipeline.class));
} finally {
pipelineScope.exit();
}
}
public void testInjector_ProvisionConfigManagerProvider() {
final Provider<ConfigManager> configManagerProvider = injector.getProvider(ConfigManager.class);
assertNotNull(configManagerProvider);
}
public void testInjector_ProduceStartTime() {
final Long startTime = injector.getInstance(Key.get(Long.class, Names.named("startTime")));
assertNotNull(startTime);
}
public void testInjector_ProvisionArgs() {
final String[] args = injector.getInstance(String[].class);
assertNotNull(args);
}
public void testInjector_ProducePipelineStageInfoInScopes() {
PipelineStageInfo pipelineStageInfo = new PipelineStageInfo();
pipelineScope.enter();
try {
pipelineScope.seed(PipelineStageInfo.class, pipelineStageInfo);
final PipelineStageInfo pipelineScopedInfo = injector.getInstance(PipelineStageInfo.class);
pipelineIterationScope.enter();
try {
final PipelineStageInfo pipelineIterationScopedInfo =
injector.getInstance(PipelineStageInfo.class);
assertNotNull(pipelineScopedInfo);
assertEquals(pipelineScopedInfo, pipelineIterationScopedInfo);
} finally {
pipelineIterationScope.exit();
}
} finally {
pipelineScope.exit();
}
}
}