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