/* 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.config; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.protobuf.Descriptors; import org.arbeitspferde.groningen.exceptions.InvalidConfigurationException; import org.arbeitspferde.groningen.experimentdb.jvmflags.JvmFlag; import org.arbeitspferde.groningen.proto.GroningenConfigProto.ProgramConfiguration.JvmSearchSpace; import org.arbeitspferde.groningen.proto.GroningenConfigProto.ProgramConfiguration.JvmSearchSpace.Int64Range; import junit.framework.TestCase; /** * Tests for ProtoBufSearchSpaceBundle. */ public class ProtoBufSearchSpaceBundleTest extends TestCase { public void testConstructionForDefaultWithNoRequireAll() throws Exception { JvmSearchSpace searchSpace = JvmSearchSpace.newBuilder() .addGcMode(JvmSearchSpace.GcMode.USE_CONC_MARK_SWEEP) .build(); ProtoBufSearchSpaceBundle bundle = new ProtoBufSearchSpaceBundle(searchSpace, false); assertEquals("new ratio floor", JvmFlag.NEW_RATIO.getMinimum(), bundle.getSearchSpace(JvmFlag.NEW_RATIO).getFloor()); assertEquals("new ratio ceiling", JvmFlag.NEW_RATIO.getMaximum(), bundle.getSearchSpace(JvmFlag.NEW_RATIO).getCeiling()); assertEquals("new ratio step size", JvmFlag.NEW_RATIO.getStepSize(), bundle.getSearchSpace(JvmFlag.NEW_RATIO).getStepSize()); assertEquals("pacing floor", 0L, bundle.getSearchSpace(JvmFlag.CMS_INCREMENTAL_PACING).getFloor()); assertEquals("pacing ceiling", 1L, bundle.getSearchSpace(JvmFlag.CMS_INCREMENTAL_PACING).getCeiling()); assertEquals("pacing step size", 1L, bundle.getSearchSpace(JvmFlag.CMS_INCREMENTAL_PACING).getStepSize()); } public void testConstructionInt64RangesWithRangesAndNoRequireAll() throws Exception { JvmSearchSpace searchSpace = JvmSearchSpace.newBuilder() .addGcMode(JvmSearchSpace.GcMode.USE_CONC_MARK_SWEEP) .setGcTimeRatio(JvmSearchSpace.Int64Range.newBuilder() .setFloor(0L) .setCeiling(100L) .setStepSize(10L) .build()) .setTenuredGenerationSizeIncrement(JvmSearchSpace.Int64Range.newBuilder() .setFloor(3L) .setCeiling(99L) .setStepSize(3L) .build()) .build(); ProtoBufSearchSpaceBundle bundle = new ProtoBufSearchSpaceBundle(searchSpace, false); assertEquals("gc ratio floor", searchSpace.getGcTimeRatio().getFloor(), bundle.getSearchSpace(JvmFlag.GC_TIME_RATIO).getFloor()); assertEquals("gc ratio ceiling", searchSpace.getGcTimeRatio().getCeiling(), bundle.getSearchSpace(JvmFlag.GC_TIME_RATIO).getCeiling()); assertEquals("gc ratio step size", searchSpace.getGcTimeRatio().getStepSize(), bundle.getSearchSpace(JvmFlag.GC_TIME_RATIO).getStepSize()); assertEquals("tenured floor", searchSpace.getTenuredGenerationSizeIncrement().getFloor(), bundle.getSearchSpace(JvmFlag.TENURED_GENERATION_SIZE_INCREMENT).getFloor()); assertEquals("tenured ceiling", searchSpace.getTenuredGenerationSizeIncrement().getCeiling(), bundle.getSearchSpace( JvmFlag.TENURED_GENERATION_SIZE_INCREMENT).getCeiling()); assertEquals("tenured step size", searchSpace.getTenuredGenerationSizeIncrement().getStepSize(), bundle.getSearchSpace( JvmFlag.TENURED_GENERATION_SIZE_INCREMENT).getStepSize()); assertEquals("default new ratio floor", JvmFlag.NEW_RATIO.getMinimum(), bundle.getSearchSpace(JvmFlag.NEW_RATIO).getFloor()); assertEquals("default new ratio ceiling", JvmFlag.NEW_RATIO.getMaximum(), bundle.getSearchSpace(JvmFlag.NEW_RATIO).getCeiling()); assertEquals("default new ratio step size", JvmFlag.NEW_RATIO.getStepSize(), bundle.getSearchSpace(JvmFlag.NEW_RATIO).getStepSize()); } public void testConstructionInt64RangesWithValueAndNoRequireAll() throws Exception { JvmSearchSpace searchSpace = JvmSearchSpace.newBuilder() .addGcMode(JvmSearchSpace.GcMode.USE_CONC_MARK_SWEEP) .setGcTimeRatio(JvmSearchSpace.Int64Range.newBuilder() .setValue(50L) .build()) .build(); ProtoBufSearchSpaceBundle bundle = new ProtoBufSearchSpaceBundle(searchSpace, false); assertEquals("gc ratio floor", searchSpace.getGcTimeRatio().getValue(), bundle.getSearchSpace(JvmFlag.GC_TIME_RATIO).getFloor()); assertEquals("gc ratio ceiling", searchSpace.getGcTimeRatio().getValue(), bundle.getSearchSpace(JvmFlag.GC_TIME_RATIO).getCeiling()); assertEquals("gc ratio step size", 0L, bundle.getSearchSpace(JvmFlag.GC_TIME_RATIO).getStepSize()); } public void testConstructionBooleanWithValueAndNoRequireAll() throws Exception { JvmSearchSpace searchSpace = JvmSearchSpace.newBuilder() .addGcMode(JvmSearchSpace.GcMode.USE_CONC_MARK_SWEEP) .setCmsIncrementalPacing(false) .build(); ProtoBufSearchSpaceBundle bundle = new ProtoBufSearchSpaceBundle(searchSpace, false); assertEquals("pacing floor", 0L, bundle.getSearchSpace(JvmFlag.CMS_INCREMENTAL_PACING).getFloor()); assertEquals("pacing ceiling", 0L, bundle.getSearchSpace(JvmFlag.CMS_INCREMENTAL_PACING).getCeiling()); assertEquals("pacing step size", 0L, bundle.getSearchSpace(JvmFlag.CMS_INCREMENTAL_PACING).getStepSize()); } /* * TODO(team): Data-driven testing is difficult to debug and somewhat dangerous. Consider * rewriting this with hardcoded definitions to ensure conformance. */ public void testConstructionWithRequireAll() throws Exception { ImmutableMap<JvmFlag, Descriptors.FieldDescriptor> argToProtoFieldMap = ImmutableMap.<JvmFlag, Descriptors.FieldDescriptor>builder() .put(JvmFlag.ADAPTIVE_SIZE_DECREMENT_SCALE_FACTOR, JvmSearchSpace.getDescriptor().findFieldByNumber( JvmSearchSpace.ADAPTIVE_SIZE_DECREMENT_SCALE_FACTOR_FIELD_NUMBER)) .put(JvmFlag.CMS_EXP_AVG_FACTOR, JvmSearchSpace.getDescriptor().findFieldByNumber( JvmSearchSpace.CMS_EXP_AVG_FACTOR_FIELD_NUMBER)) .put(JvmFlag.CMS_INCREMENTAL_DUTY_CYCLE, JvmSearchSpace.getDescriptor().findFieldByNumber( JvmSearchSpace.CMS_INCREMENTAL_DUTY_CYCLE_FIELD_NUMBER)) .put(JvmFlag.CMS_INCREMENTAL_DUTY_CYCLE_MIN, JvmSearchSpace.getDescriptor().findFieldByNumber( JvmSearchSpace.CMS_INCREMENTAL_DUTY_CYCLE_MIN_FIELD_NUMBER)) .put(JvmFlag.CMS_INCREMENTAL_OFFSET, JvmSearchSpace.getDescriptor().findFieldByNumber( JvmSearchSpace.CMS_INCREMENTAL_OFFSET_FIELD_NUMBER)) .put(JvmFlag.CMS_INCREMENTAL_SAFETY_FACTOR, JvmSearchSpace.getDescriptor().findFieldByNumber( JvmSearchSpace.CMS_INCREMENTAL_SAFETY_FACTOR_FIELD_NUMBER)) .put(JvmFlag.CMS_INITIATING_OCCUPANCY_FRACTION, JvmSearchSpace.getDescriptor().findFieldByNumber( JvmSearchSpace.CMS_INITIATING_OCCUPANCY_FRACTION_FIELD_NUMBER)) .put(JvmFlag.GC_TIME_RATIO, JvmSearchSpace.getDescriptor().findFieldByNumber( JvmSearchSpace.GC_TIME_RATIO_FIELD_NUMBER)) .put(JvmFlag.MAX_GC_PAUSE_MILLIS, JvmSearchSpace.getDescriptor().findFieldByNumber( JvmSearchSpace.MAX_GC_PAUSE_MILLIS_FIELD_NUMBER)) .put(JvmFlag.MAX_HEAP_FREE_RATIO, JvmSearchSpace.getDescriptor().findFieldByNumber( JvmSearchSpace.MAX_HEAP_FREE_RATIO_FIELD_NUMBER)) .put(JvmFlag.MIN_HEAP_FREE_RATIO, JvmSearchSpace.getDescriptor().findFieldByNumber( JvmSearchSpace.MIN_HEAP_FREE_RATIO_FIELD_NUMBER)) .put(JvmFlag.NEW_RATIO, JvmSearchSpace.getDescriptor().findFieldByNumber( JvmSearchSpace.NEW_RATIO_FIELD_NUMBER)) .put(JvmFlag.NEW_SIZE, JvmSearchSpace.getDescriptor().findFieldByNumber( JvmSearchSpace.NEW_SIZE_FIELD_NUMBER)) .put(JvmFlag.MAX_NEW_SIZE, JvmSearchSpace.getDescriptor().findFieldByNumber( JvmSearchSpace.MAX_NEW_SIZE_FIELD_NUMBER)) .put(JvmFlag.PARALLEL_GC_THREADS, JvmSearchSpace.getDescriptor().findFieldByNumber( JvmSearchSpace.PARALLEL_GC_THREADS_FIELD_NUMBER)) .put(JvmFlag.SURVIVOR_RATIO, JvmSearchSpace.getDescriptor().findFieldByNumber( JvmSearchSpace.SURVIVOR_RATIO_FIELD_NUMBER)) .put(JvmFlag.TENURED_GENERATION_SIZE_INCREMENT, JvmSearchSpace.getDescriptor().findFieldByNumber( JvmSearchSpace.TENURED_GENERATION_SIZE_INCREMENT_FIELD_NUMBER)) .put(JvmFlag.YOUNG_GENERATION_SIZE_INCREMENT, JvmSearchSpace.getDescriptor().findFieldByNumber( JvmSearchSpace.YOUNG_GENERATION_SIZE_INCREMENT_FIELD_NUMBER)) .put(JvmFlag.SOFT_REF_LRU_POLICY_MS_PER_MB, JvmSearchSpace.getDescriptor().findFieldByNumber( JvmSearchSpace.SOFT_REF_LRU_POLICY_MS_PER_MB_FIELD_NUMBER)) .put(JvmFlag.CMS_INCREMENTAL_MODE, JvmSearchSpace.getDescriptor().findFieldByNumber( JvmSearchSpace.CMS_INCREMENTAL_MODE_FIELD_NUMBER)) .put(JvmFlag.CMS_INCREMENTAL_PACING, JvmSearchSpace.getDescriptor().findFieldByNumber( JvmSearchSpace.CMS_INCREMENTAL_PACING_FIELD_NUMBER)) .put(JvmFlag.USE_CMS_INITIATING_OCCUPANCY_ONLY, JvmSearchSpace.getDescriptor().findFieldByNumber( JvmSearchSpace.USE_CMS_INITIATING_OCCUPANCY_ONLY_FIELD_NUMBER)) .put(JvmFlag.USE_CONC_MARK_SWEEP_GC, JvmSearchSpace.getDescriptor().findFieldByNumber( JvmSearchSpace.GC_MODE_FIELD_NUMBER)) .put(JvmFlag.USE_PARALLEL_GC, JvmSearchSpace.getDescriptor().findFieldByNumber( JvmSearchSpace.GC_MODE_FIELD_NUMBER)) .put(JvmFlag.USE_PARALLEL_OLD_GC, JvmSearchSpace.getDescriptor().findFieldByNumber( JvmSearchSpace.GC_MODE_FIELD_NUMBER)) .put(JvmFlag.USE_SERIAL_GC, JvmSearchSpace.getDescriptor().findFieldByNumber( JvmSearchSpace.GC_MODE_FIELD_NUMBER)) .put(JvmFlag.HEAP_SIZE, JvmSearchSpace.getDescriptor().findFieldByNumber( JvmSearchSpace.HEAP_SIZE_FIELD_NUMBER)) .build(); ImmutableList<JvmFlag> boolCmdLineArguments = ImmutableList.<JvmFlag>builder() .add(JvmFlag.CMS_INCREMENTAL_MODE) .add(JvmFlag.CMS_INCREMENTAL_PACING) .add(JvmFlag.USE_CMS_INITIATING_OCCUPANCY_ONLY) .build(); ImmutableMap<JvmFlag, JvmSearchSpace.GcMode> gcModeMap = ImmutableMap.<JvmFlag, JvmSearchSpace.GcMode>builder() .put(JvmFlag.USE_CONC_MARK_SWEEP_GC, JvmSearchSpace.GcMode.USE_CONC_MARK_SWEEP) .put(JvmFlag.USE_PARALLEL_GC, JvmSearchSpace.GcMode.USE_PARALLEL) .put(JvmFlag.USE_PARALLEL_OLD_GC, JvmSearchSpace.GcMode.USE_PARALLEL_OLD) .put(JvmFlag.USE_SERIAL_GC, JvmSearchSpace.GcMode.USE_SERIAL) .build(); // all CommandLineArguments start at 0 and go to higher than 2 - this is a little brittle // though JvmSearchSpace.Int64Range intRange = Int64Range.newBuilder() .setFloor(1L) .setCeiling(2L) .setStepSize(1L) .build(); for (JvmFlag missingArg : JvmFlag.values()) { // skip gc mode skip we need to omit them all if (gcModeMap.containsKey(missingArg)) { continue; } JvmSearchSpace.Builder searchSpaceBuilder = JvmSearchSpace.newBuilder(); for (JvmFlag arg : JvmFlag.values()) { if (arg == missingArg) { continue; } if (gcModeMap.containsKey(arg)) { searchSpaceBuilder.addGcMode(gcModeMap.get(arg)); } else if (boolCmdLineArguments.contains(arg)) { searchSpaceBuilder.setField(argToProtoFieldMap.get(arg), Boolean.TRUE); } else { searchSpaceBuilder.setField(argToProtoFieldMap.get(arg), intRange); } } try { ProtoBufSearchSpaceBundle bundle = new ProtoBufSearchSpaceBundle(searchSpaceBuilder.build(), true); fail("failed to throw for " + missingArg.name()); } catch (InvalidConfigurationException expected) { // leaving out a parameter setting should generate an error } } } }