/* 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.validator;
import com.google.common.collect.Lists;
import org.arbeitspferde.groningen.common.ClockedExperimentDbTestCaseBase;
import org.arbeitspferde.groningen.config.GroningenConfig;
import org.arbeitspferde.groningen.experimentdb.CommandLine;
import org.arbeitspferde.groningen.experimentdb.Experiment;
import org.arbeitspferde.groningen.experimentdb.ExperimentDb;
import org.arbeitspferde.groningen.experimentdb.PauseTime;
import org.arbeitspferde.groningen.experimentdb.ResourceMetric;
import org.arbeitspferde.groningen.experimentdb.SubjectRestart;
import org.arbeitspferde.groningen.experimentdb.SubjectStateBridge;
import org.arbeitspferde.groningen.proto.GroningenConfigProto.ProgramConfiguration;
import org.arbeitspferde.groningen.subject.Subject;
import org.easymock.EasyMock;
import java.util.List;
/**
* The test for {@link Validator}.
*/
public class ValidatorTest extends ClockedExperimentDbTestCaseBase {
/** The object instance we are testing. */
private Validator validator;
private GroningenConfig mockGroningenConfig;
@Override
protected void setUp() throws Exception {
super.setUp();
experimentDb = EasyMock.createMock(ExperimentDb.class);
mockGroningenConfig = EasyMock.createMock(GroningenConfig.class);
validator = new Validator(clock, monitor, experimentDb, mockGroningenConfig, metricExporter);
}
/**
* Check that profiledRun works without exception.
*
* TODO(team): Make less fragile.
* TODO(team): Validate Protocol Buffer emissions.
*/
public void testProfiledRun() throws Exception {
final Experiment mockExperiment = EasyMock.createMock(Experiment.class);
final SubjectStateBridge mockSubjectA = EasyMock.createMock(SubjectStateBridge.class);
final SubjectStateBridge mockSubjectB = EasyMock.createMock(SubjectStateBridge.class);
final List<SubjectStateBridge> subjects = Lists.newArrayList();
final PauseTime mockSubjectAPauseTime = EasyMock.createMock(PauseTime.class);
final ResourceMetric mockSubjectAResourceMetric = EasyMock.createMock(ResourceMetric.class);
final PauseTime mockSubjectBPauseTime = EasyMock.createMock(PauseTime.class);
final ResourceMetric mockSubjectBResourceMetric = EasyMock.createMock(ResourceMetric.class);
final SubjectRestart mockSubjectASubjectRestart = EasyMock.createMock(SubjectRestart.class);
final SubjectRestart mockSubjectBSubjectRestart = EasyMock.createMock(SubjectRestart.class);
final CommandLine mockSubjectACommandLine = EasyMock.createMock(CommandLine.class);
final CommandLine mockSubjectBCommandLine = EasyMock.createMock(CommandLine.class);
final Subject mockSubjectAAssociatedSubject = EasyMock.createMock(Subject.class);
final Subject mockSubjectBAssociatedSubject = EasyMock.createMock(Subject.class);
final ProgramConfiguration programConfiguration =
ProgramConfiguration.newBuilder().buildPartial();
subjects.add(mockSubjectA);
subjects.add(mockSubjectB);
/* profiledRun */
EasyMock.expect(experimentDb.getLastExperiment()).andReturn(mockExperiment);
EasyMock.expect(mockExperiment.getSubjects()).andReturn(subjects);
EasyMock.expect(mockSubjectA.getPauseTime()).andReturn(mockSubjectAPauseTime);
EasyMock.expect(mockSubjectA.getResourceMetric()).andReturn(mockSubjectAResourceMetric);
/* validate */
EasyMock.expect(mockSubjectA.getAssociatedSubject()).andReturn(mockSubjectAAssociatedSubject)
.atLeastOnce();
EasyMock.expect(mockSubjectAAssociatedSubject.isDefault()).andReturn(false);
EasyMock.expect(mockSubjectA.getSubjectRestart()).andReturn(mockSubjectASubjectRestart);
EasyMock.expect(mockSubjectA.getIdOfObject()).andReturn(1L);
EasyMock.expect(mockSubjectAAssociatedSubject.getServingAddress()).andReturn("/path/to/foo")
.atLeastOnce();
EasyMock.expect(mockSubjectASubjectRestart.restartThresholdCrossed(mockGroningenConfig))
.andReturn(false);
EasyMock.expect(mockSubjectASubjectRestart.didNotRun()).andReturn(false);
EasyMock.expect(mockSubjectA.getCommandLine()).andReturn(mockSubjectACommandLine);
EasyMock.expect(mockSubjectA.getCommandLineStrings()).andReturn(Lists.newArrayList("foo"));
EasyMock.expect(mockSubjectACommandLine.toArgumentString()).andReturn("foo");
EasyMock.expect(mockSubjectA.wasRemoved()).andReturn(false);
/* profiledRun A again */
mockSubjectA.markValid();
EasyMock.expectLastCall();
/* second time through loop */
EasyMock.expect(mockSubjectB.getPauseTime()).andReturn(mockSubjectBPauseTime);
EasyMock.expect(mockSubjectB.getResourceMetric()).andReturn(mockSubjectBResourceMetric);
/* validate B */
EasyMock.expect(mockSubjectB.getAssociatedSubject()).andReturn(mockSubjectBAssociatedSubject)
.atLeastOnce();
EasyMock.expect(mockSubjectBAssociatedSubject.isDefault()).andReturn(false);
EasyMock.expect(mockSubjectB.getSubjectRestart()).andReturn(mockSubjectBSubjectRestart);
EasyMock.expect(mockSubjectB.getIdOfObject()).andReturn(1L);
EasyMock.expect(mockSubjectBAssociatedSubject.getServingAddress()).andReturn("/path/to/foo")
.atLeastOnce();
EasyMock.expect(mockSubjectBSubjectRestart.restartThresholdCrossed(mockGroningenConfig))
.andReturn(false);
EasyMock.expect(mockSubjectBSubjectRestart.didNotRun()).andReturn(false);
EasyMock.expect(mockSubjectB.getCommandLine()).andReturn(mockSubjectBCommandLine);
EasyMock.expect(mockSubjectB.getCommandLineStrings()).andReturn(Lists.newArrayList("bar"));
EasyMock.expect(mockSubjectBCommandLine.toArgumentString()).andReturn("baz");
EasyMock.expect(mockSubjectB.wasRemoved()).andReturn(false);
/* profiledRun for B again */
mockSubjectB.markInvalid();
EasyMock.expectLastCall();
mockSubjectBPauseTime.invalidate();
EasyMock.expectLastCall();
mockSubjectBResourceMetric.invalidate();
EasyMock.expectLastCall();
EasyMock.replay(experimentDb);
EasyMock.replay(mockExperiment);
EasyMock.replay(mockSubjectA);
EasyMock.replay(mockSubjectB);
EasyMock.replay(mockSubjectAAssociatedSubject);
EasyMock.replay(mockSubjectBAssociatedSubject);
EasyMock.replay(mockSubjectAPauseTime);
EasyMock.replay(mockSubjectBPauseTime);
EasyMock.replay(mockSubjectAResourceMetric);
EasyMock.replay(mockSubjectBResourceMetric);
EasyMock.replay(mockSubjectASubjectRestart);
EasyMock.replay(mockSubjectBSubjectRestart);
EasyMock.replay(mockSubjectACommandLine);
EasyMock.replay(mockSubjectBCommandLine);
EasyMock.replay(mockGroningenConfig);
validator.profiledRun(mockGroningenConfig);
EasyMock.verify(experimentDb);
EasyMock.verify(mockExperiment);
EasyMock.verify(mockSubjectA);
EasyMock.verify(mockSubjectB);
EasyMock.verify(mockSubjectAAssociatedSubject);
EasyMock.verify(mockSubjectBAssociatedSubject);
EasyMock.verify(mockSubjectAPauseTime);
EasyMock.verify(mockSubjectBPauseTime);
EasyMock.verify(mockSubjectAResourceMetric);
EasyMock.verify(mockSubjectBResourceMetric);
EasyMock.verify(mockSubjectASubjectRestart);
EasyMock.verify(mockSubjectBSubjectRestart);
EasyMock.verify(mockSubjectACommandLine);
EasyMock.verify(mockSubjectBCommandLine);
EasyMock.verify(mockGroningenConfig);
}
}