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