1e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin/* 2e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin * Copyright (C) 2011 Google Inc. 3e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin * 4e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 5e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin * in compliance with the License. You may obtain a copy of the License at 6e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin * 7e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin * http://www.apache.org/licenses/LICENSE-2.0 8e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin * 9e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin * Unless required by applicable law or agreed to in writing, software distributed under the License 10e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 11e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin * or implied. See the License for the specific language governing permissions and limitations under 12e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin * the License. 13e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin */ 14e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin 15e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffinpackage com.google.caliper.options; 16e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin 17e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffinimport static java.util.concurrent.TimeUnit.SECONDS; 18e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffinimport static org.junit.Assert.assertEquals; 19e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffinimport static org.junit.Assert.assertFalse; 20e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffinimport static org.junit.Assert.assertNull; 21e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffinimport static org.junit.Assert.assertTrue; 22e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffinimport static org.junit.Assert.fail; 23e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin 24e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffinimport com.google.caliper.util.DisplayUsageException; 25e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffinimport com.google.caliper.util.InvalidCommandException; 26e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffinimport com.google.caliper.util.ShortDuration; 27e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffinimport com.google.common.collect.ImmutableMap; 28e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffinimport com.google.common.collect.ImmutableSet; 29e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffinimport com.google.common.collect.ImmutableSetMultimap; 30e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffinimport com.google.common.collect.Iterables; 31e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffinimport com.google.common.io.Files; 32e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin 33e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffinimport org.junit.After; 34e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffinimport org.junit.Before; 35e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffinimport org.junit.Test; 36e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffinimport org.junit.runner.RunWith; 37e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffinimport org.junit.runners.JUnit4; 38e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin 39e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffinimport java.io.File; 40e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffinimport java.io.IOException; 41e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin 42e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin@RunWith(JUnit4.class) 43e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin 44e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffinpublic class ParsedOptionsTest { 45e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin private File tempDir; 46e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin 47e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin @Before public void setUp() throws IOException { 48e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin tempDir = Files.createTempDir(); 49e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin makeTestVmTree(tempDir); 50e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin } 51e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin 52e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin @After public void tearDown() throws IOException { 53e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin if (tempDir != null) { 54e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin Runtime.getRuntime().exec(new String[] {"rm", "-rf", tempDir.getCanonicalPath()}); 55e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin } 56e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin } 57e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin 58e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin private static void makeTestVmTree(File baseDir) throws IOException { 59e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin File bin = new File(baseDir, "testVm/bin"); 60e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin bin.mkdirs(); 61e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin File java = new File(bin, "java"); 62e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin Files.touch(java); 63e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin } 64e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin 65e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin @Test public void testNoOptions_RequireBenchmarkClassName() { 66e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin try { 67e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin ParsedOptions.from(new String[] {}, true); 68e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin fail(); 69e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin } catch (InvalidCommandException expected) { 70e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin assertEquals("No benchmark class specified", expected.getMessage()); 71e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin } 72e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin } 73e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin 74e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin @Test public void testTooManyArguments_RequireBenchmarkClassName() { 75e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin try { 76e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin ParsedOptions.from(new String[] {"a", "b"}, true); 77e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin fail(); 78e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin } catch (InvalidCommandException expected) { 79e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin assertEquals("Extra stuff, expected only class name: [a, b]", expected.getMessage()); 80e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin } 81e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin } 82e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin 83e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin @Test public void testTooManyArguments_DoNotRequireBenchmarkClassName() { 84e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin try { 85e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin ParsedOptions.from(new String[] {"a", "b"}, false); 86e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin fail(); 87e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin } catch (InvalidCommandException expected) { 88e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin assertEquals("Extra stuff, did not expect non-option arguments: [a, b]", 89e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin expected.getMessage()); 90e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin } 91e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin } 92e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin 93e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin @Test public void testHelp() throws InvalidCommandException { 94e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin try { 95e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin ParsedOptions.from(new String[] {"--help"}, true); 96e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin fail(); 97e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin } catch (DisplayUsageException expected) { 98e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin } 99e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin } 100e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin 101e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin @Test public void testDefaults_RequireBenchmarkClassName() throws InvalidCommandException { 102e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin CaliperOptions options = ParsedOptions.from(new String[] {CLASS_NAME}, true); 103e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin 104e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin assertEquals(CLASS_NAME, options.benchmarkClassName()); 105e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin checkDefaults(options); 106e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin } 107e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin 108e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin @Test public void testDefaults_DoNotRequireBenchmarkClassName() throws InvalidCommandException { 109e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin CaliperOptions options = ParsedOptions.from(new String[] {}, false); 110e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin 111e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin assertNull(options.benchmarkClassName()); 112e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin checkDefaults(options); 113e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin } 114e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin 115e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin private void checkDefaults(CaliperOptions options) { 116e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin assertTrue(options.benchmarkMethodNames().isEmpty()); 117e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin assertFalse(options.dryRun()); 118e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin ImmutableSet<String> expectedInstruments = new ImmutableSet.Builder<String>() 119e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin .add("allocation") 120e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin .add("runtime") 121e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin .build(); 122e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin assertEquals(expectedInstruments, options.instrumentNames()); 123e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin assertEquals(1, options.trialsPerScenario()); 124e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin assertTrue(options.userParameters().isEmpty()); 125e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin assertFalse(options.printConfiguration()); 126e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin assertTrue(options.vmArguments().isEmpty()); 127e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin assertEquals(0, options.vmNames().size()); 128e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin } 129e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin 130e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin @Test public void testKitchenSink() throws InvalidCommandException { 131e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin String[] args = { 132e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin "--benchmark=foo;bar;qux", 133e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin "--instrument=testInstrument", 134e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin "--directory=/path/to/some/dir", 135e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin "--trials=2", 136e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin "--time-limit=15s", 137e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin "-Dx=a;b;c", 138e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin "-Dy=b;d", 139e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin "-Csome.property=value", 140e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin "-Csome.other.property=other-value", 141e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin "--print-config", 142e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin "-JmemoryMax=-Xmx32m;-Xmx64m", 143e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin "--vm=testVm", 144e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin "--delimiter=;", 145e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin CLASS_NAME, 146e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin }; 147e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin CaliperOptions options = ParsedOptions.from(args, true); 148e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin 149e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin assertEquals(CLASS_NAME, options.benchmarkClassName()); 150e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin assertEquals(ImmutableSet.of("foo", "bar", "qux"), options.benchmarkMethodNames()); 151e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin assertFalse(options.dryRun()); 152e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin assertEquals(ImmutableSet.of("testInstrument"), options.instrumentNames()); 153e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin assertEquals(new File("/path/to/some/dir"), options.caliperDirectory()); 154e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin assertEquals(2, options.trialsPerScenario()); 155e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin assertEquals(ShortDuration.of(15, SECONDS), options.timeLimit()); 156e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin assertEquals(ImmutableSetMultimap.of("x", "a", "x", "b", "x", "c", "y", "b", "y", "d"), 157e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin options.userParameters()); 158e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin assertEquals(ImmutableMap.of("some.property", "value", "some.other.property", "other-value"), 159e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin options.configProperties()); 160e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin assertTrue(options.printConfiguration()); 161e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin assertEquals(ImmutableSetMultimap.of("memoryMax", "-Xmx32m", "memoryMax", "-Xmx64m"), 162e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin options.vmArguments()); 163e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin 164e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin String vmName = Iterables.getOnlyElement(options.vmNames()); 165e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin assertEquals("testVm", vmName); 166e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin } 167e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin 168e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin public static class FakeBenchmark {} 169e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin 170e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin private static final String CLASS_NAME = FakeBenchmark.class.getName(); 171e236301e5fc778bffe1748ed80d7936e6c807012Paul Duffin} 172