/* Copyright 2013 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.eventlog;
import com.google.common.collect.Lists;
import org.arbeitspferde.groningen.common.ClockedExperimentDbTestCaseBase;
import org.arbeitspferde.groningen.config.GroningenConfig;
import org.arbeitspferde.groningen.experimentdb.Experiment;
import org.arbeitspferde.groningen.experimentdb.PauseTime;
import org.arbeitspferde.groningen.experimentdb.ResourceMetric;
import org.arbeitspferde.groningen.experimentdb.SubjectStateBridge;
import org.arbeitspferde.groningen.proto.Event;
import org.arbeitspferde.groningen.proto.GroningenConfigProto.ProgramConfiguration;
import org.arbeitspferde.groningen.proto.Params.GroningenParamsOrBuilder;
import org.arbeitspferde.groningen.subject.Subject;
import org.easymock.EasyMock;
/**
* Tests for @{link SubjectEventProtoLogger}.
*/
public class SubjectEventProtoLoggerTest extends ClockedExperimentDbTestCaseBase {
private static final long START_TIME = 1000L;
/** The object instance we are testing. */
private SubjectEventProtoLogger protoLogger;
private EventLoggerService mockEventLoggerService;
private SafeProtoLogger<Event.EventEntry> mockEventLogger;
private String servingAddress;
private Experiment mockExperiment;
private GroningenConfig mockGroningenConfig;
@Override
protected void setUp() throws Exception {
super.setUp();
mockEventLoggerService = EasyMock.createMock(EventLoggerService.class);
mockEventLogger = EasyMock.createMock(SafeProtoLogger.class);
mockExperiment = EasyMock.createMock(Experiment.class);
mockGroningenConfig = EasyMock.createMock(GroningenConfig.class);
servingAddress = "myservingaddress:31337";
protoLogger = new SubjectEventProtoLogger(clock, mockEventLoggerService,
servingAddress, START_TIME, metricExporter);
}
/**
* Check that logSubjectInExperiment works without exception.
*
* TODO(team): Make less fragile.
* TODO(team): Validate Protocol Buffer emissions.
*/
public void testLogSubjectInExperiment_withValidSubject() throws Exception {
final SubjectStateBridge mockSubject = EasyMock.createMock(SubjectStateBridge.class);
final PauseTime mockSubjectPauseTime = EasyMock.createMock(PauseTime.class);
final ResourceMetric mockSubjectResourceMetric = EasyMock.createMock(ResourceMetric.class);
final GroningenParamsOrBuilder mockGroningenParams =
EasyMock.createMock(GroningenParamsOrBuilder.class);
final ProgramConfiguration programConfiguration =
ProgramConfiguration.newBuilder().buildPartial();
final Subject mockSubjectAssociatedSubject = EasyMock.createMock(Subject.class);
final long expId = 19042L;
final int subjectAIndex = 14;
final String subjectServingAddress = "some/network:address";
final double latencyWeight = 2D;
final double latencyScore = 4D;
final double thruputWeight = 0D;
final double thruputScore = 8D;
final double memWeight = 5D;
final double memScore = 10D;
final Boolean subjectIsInvalid = Boolean.FALSE;
final double subjectFitness = 10.0;
/* logSubjectInExperiment */
EasyMock.expect(mockEventLoggerService.getLogger()).andReturn(mockEventLogger);
EasyMock.expect(mockExperiment.getIdOfObject()).andReturn(expId);
/* composeEvent */
EasyMock.expect(mockSubject.getPauseTime()).andReturn(mockSubjectPauseTime);
EasyMock.expect(mockSubject.getResourceMetric()).andReturn(mockSubjectResourceMetric);
EasyMock.expect(mockGroningenConfig.getParamBlock()).andReturn(mockGroningenParams);
EasyMock.expect(mockGroningenParams.getLatencyWeight()).andReturn(latencyWeight).atLeastOnce();
EasyMock.expect(mockGroningenParams.getThroughputWeight()).andReturn(thruputWeight)
.atLeastOnce();
EasyMock.expect(mockGroningenParams.getMemoryWeight()).andReturn(memWeight).atLeastOnce();
EasyMock.expect(mockSubjectPauseTime.computeScore(PauseTime.ScoreType.LATENCY))
.andReturn(latencyScore);
EasyMock.expect(mockSubjectPauseTime.computeScore(PauseTime.ScoreType.THROUGHPUT))
.andReturn(thruputScore);
EasyMock.expect(mockSubjectResourceMetric.computeScore(ResourceMetric.ScoreType.MEMORY))
.andReturn(memScore);
EasyMock.expect(mockSubject.getAssociatedSubject()).andReturn(mockSubjectAssociatedSubject)
.atLeastOnce();
EasyMock.expect(mockSubjectAssociatedSubject.getServingAddress())
.andReturn(subjectServingAddress).atLeastOnce();
EasyMock.expect(mockSubject.isInvalid()).andReturn(subjectIsInvalid);
EasyMock.expect(mockGroningenConfig.getProtoConfig()).andReturn(programConfiguration);
EasyMock.expect(mockSubject.getPauseTime()).andReturn(mockSubjectPauseTime);
EasyMock.expect(mockSubjectPauseTime.getPauseDurations()).andReturn(Lists.newArrayList(1D));
/* back in logSubjectInExperiment */
mockEventLogger.logProtoEntry(EasyMock.isA(Event.EventEntry.class));
EasyMock.expectLastCall();
EasyMock.replay(mockExperiment);
EasyMock.replay(mockSubject);
EasyMock.replay(mockSubjectPauseTime);
EasyMock.replay(mockSubjectResourceMetric);
EasyMock.replay(mockGroningenConfig);
EasyMock.replay(mockGroningenParams);
EasyMock.replay(mockSubjectAssociatedSubject);
EasyMock.replay(mockEventLoggerService);
EasyMock.replay(mockEventLogger);
protoLogger.logSubjectInExperiment(mockGroningenConfig, mockExperiment, mockSubject);
EasyMock.verify(mockEventLoggerService);
EasyMock.verify(mockExperiment);
EasyMock.verify(mockSubject);
EasyMock.verify(mockSubjectPauseTime);
EasyMock.verify(mockSubjectResourceMetric);
EasyMock.verify(mockGroningenConfig);
EasyMock.verify(mockGroningenParams);
EasyMock.verify(mockSubjectAssociatedSubject);
EasyMock.verify(mockEventLoggerService);
EasyMock.verify(mockEventLogger);
}
public void testLogSubjectInExperiment_withUnvalidateSubject() throws Exception {
final SubjectStateBridge mockSubject = EasyMock.createMock(SubjectStateBridge.class);
final PauseTime mockSubjectPauseTime = EasyMock.createMock(PauseTime.class);
final ResourceMetric mockSubjectResourceMetric = EasyMock.createMock(ResourceMetric.class);
final GroningenParamsOrBuilder mockGroningenParams =
EasyMock.createMock(GroningenParamsOrBuilder.class);
final ProgramConfiguration programConfiguration =
ProgramConfiguration.newBuilder().buildPartial();
final Subject mockSubjectAssociatedSubject = EasyMock.createMock(Subject.class);
final long expId = 142L;
final int subjectAIndex = 1;
final String subjectServingAddress = "some/network:address";
final double latencyWeight = 2D;
final double latencyScore = 8D;
final double thruputWeight = 0D;
final double thruputScore = 2D;
final double memWeight = 5D;
final double memScore = 20D;
final Boolean subjectIsInvalid = null;
final double subjectFitness = 0D;
/* logSubjectInExperiment */
EasyMock.expect(mockEventLoggerService.getLogger()).andReturn(mockEventLogger);
EasyMock.expect(mockExperiment.getIdOfObject()).andReturn(expId);
/* composeEvent */
EasyMock.expect(mockSubject.getPauseTime()).andReturn(mockSubjectPauseTime);
EasyMock.expect(mockSubject.getResourceMetric()).andReturn(mockSubjectResourceMetric);
EasyMock.expect(mockGroningenConfig.getParamBlock()).andReturn(mockGroningenParams);
EasyMock.expect(mockGroningenParams.getLatencyWeight()).andReturn(latencyWeight).atLeastOnce();
EasyMock.expect(mockGroningenParams.getThroughputWeight()).andReturn(thruputWeight)
.atLeastOnce();
EasyMock.expect(mockGroningenParams.getMemoryWeight()).andReturn(memWeight).atLeastOnce();
EasyMock.expect(mockSubjectPauseTime.computeScore(PauseTime.ScoreType.LATENCY))
.andReturn(latencyScore);
EasyMock.expect(mockSubjectPauseTime.computeScore(PauseTime.ScoreType.THROUGHPUT))
.andReturn(thruputScore);
EasyMock.expect(mockSubjectResourceMetric.computeScore(ResourceMetric.ScoreType.MEMORY))
.andReturn(memScore);
EasyMock.expect(mockSubject.getAssociatedSubject()).andReturn(mockSubjectAssociatedSubject)
.atLeastOnce();
EasyMock.expect(mockSubjectAssociatedSubject.getServingAddress())
.andReturn(subjectServingAddress).atLeastOnce();
EasyMock.expect(mockSubject.isInvalid()).andReturn(subjectIsInvalid);
EasyMock.expect(mockGroningenConfig.getProtoConfig()).andReturn(programConfiguration);
EasyMock.expect(mockSubject.getPauseTime()).andReturn(mockSubjectPauseTime);
EasyMock.expect(mockSubjectPauseTime.getPauseDurations()).andReturn(Lists.newArrayList(1D));
/* back in logSubjectInExperiment */
mockEventLogger.logProtoEntry(EasyMock.isA(Event.EventEntry.class));
EasyMock.expectLastCall();
EasyMock.replay(mockExperiment);
EasyMock.replay(mockSubject);
EasyMock.replay(mockSubjectPauseTime);
EasyMock.replay(mockSubjectResourceMetric);
EasyMock.replay(mockGroningenConfig);
EasyMock.replay(mockGroningenParams);
EasyMock.replay(mockSubjectAssociatedSubject);
EasyMock.replay(mockEventLoggerService);
EasyMock.replay(mockEventLogger);
protoLogger.logSubjectInExperiment(mockGroningenConfig, mockExperiment, mockSubject);
EasyMock.verify(mockEventLoggerService);
EasyMock.verify(mockExperiment);
EasyMock.verify(mockSubject);
EasyMock.verify(mockSubjectPauseTime);
EasyMock.verify(mockSubjectResourceMetric);
EasyMock.verify(mockGroningenConfig);
EasyMock.verify(mockGroningenParams);
EasyMock.verify(mockSubjectAssociatedSubject);
EasyMock.verify(mockEventLoggerService);
EasyMock.verify(mockEventLogger);
}
}