1 /*
2  * Copyright (C) 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.android.compatibility.common.tradefed.util;
17 
18 import com.android.tradefed.config.Option;
19 import com.android.tradefed.config.Option.Importance;
20 
21 import junit.framework.TestCase;
22 
23 import java.util.ArrayList;
24 import java.util.Arrays;
25 import java.util.List;
26 import java.util.Set;
27 
28 /**
29  * Unit tests for {@link OptionHelper}
30  */
31 public class OptionHelperTest extends TestCase {
32 
33     private static final String TEST_CLASS = "test-class";
34     private static final String TEST_CLASS_SHORTNAME = "c";
35     private static final String TEST_FILTER = "test-filter";
36     private static final String TEST_LOGPATH = "test-logpath";
37     private static final String TEST_NAME = "test-name";
38     private static final String TEST_SUITE = "test-suite";
39     private static final String TEST_SUITE_SHORTNAME = "s";
40 
41     @Option(name = TEST_CLASS,
42             shortName = 'c',
43             importance = Importance.ALWAYS)
44     private String mTestClass = null;
45 
46     @Option(name = TEST_NAME,
47             importance = Importance.ALWAYS)
48     private String mTestName = null;
49 
50     @Option(name = TEST_SUITE,
51             shortName = 's',
52             importance = Importance.ALWAYS)
53     private String mTestSuite = null;
54 
55     @Option(name = TEST_FILTER,
56             importance = Importance.ALWAYS)
57     private List<String> mFilters = new ArrayList<>();
58 
59     @Option(name = TEST_LOGPATH,
60             importance = Importance.ALWAYS)
61     private String mLogPath = null;
62 
testGetOptionNames()63     public void testGetOptionNames() throws Exception {
64         Set<String> optionNames = OptionHelper.getOptionNames(this);
65         List<String> expectedNames = Arrays.asList(TEST_CLASS, TEST_NAME, TEST_SUITE,
66                 TEST_LOGPATH);
67         assertEquals("Missing option names", true, optionNames.containsAll(expectedNames));
68         assertEquals("Expected five elements", 5, optionNames.size());
69     }
70 
testGetOptionShortNames()71     public void testGetOptionShortNames() throws Exception {
72         Set<String> optionShortNames = OptionHelper.getOptionShortNames(this);
73         List<String> expectedShortNames = Arrays.asList(TEST_CLASS_SHORTNAME, TEST_SUITE_SHORTNAME);
74         assertEquals("Missing option shortnames", true,
75             optionShortNames.containsAll(expectedShortNames));
76         assertEquals("Expected two elements", 2, optionShortNames.size());
77     }
78 
testGetValidCliArgs()79     public void testGetValidCliArgs() throws Exception {
80         String fakeTestClass = "FooTestCases";
81         String fakeTestMethod = "android.foo.footestsuite.RealTest#testSuperReal";
82         List<String> noValidNames = new ArrayList<String>();
83         List<String> validSubset = Arrays.asList("--" + TEST_CLASS, "fooclass",
84             "-" + TEST_SUITE_SHORTNAME, "foosuite");
85         List<String> allValidNames = Arrays.asList("--" + TEST_CLASS, "fooclass",
86             "-" + TEST_SUITE_SHORTNAME, "foosuite:foo-key=fooval", "--" + TEST_NAME, "footest",
87             "--" + TEST_LOGPATH, "path/to/log-directory/");
88 
89         List<String> validQuoteSubset = Arrays.asList("-" + TEST_CLASS_SHORTNAME, fakeTestClass,
90             "--" + TEST_NAME, fakeTestMethod, "--" + TEST_FILTER, fakeTestClass + " "
91             + fakeTestMethod);
92         String[] inputArray = {"foocts ", "-", TEST_CLASS_SHORTNAME, " ", fakeTestClass, " \"--",
93             TEST_NAME, "=", fakeTestMethod, "\" -z \"FAKE1 FAKE2\" --", TEST_FILTER, " \"",
94             fakeTestClass, " ", fakeTestMethod + "\""};
95         String inputString = String.join("", inputArray);
96 
97         assertEquals("Expected no valid names", noValidNames,
98             OptionHelper.getValidCliArgs("test --foo -b", this));
99         assertEquals("Expected one long name and one short name", validSubset,
100             OptionHelper.getValidCliArgs("test --" + TEST_CLASS + " fooclass -b fake"
101                 + " -s foosuite", this));
102         assertEquals("Expected two long names and one short name", allValidNames,
103             OptionHelper.getValidCliArgs("test --" + TEST_CLASS + " fooclass -b fake"
104                 + " -s foosuite:foo-key=fooval --" + TEST_NAME + " footest --" + TEST_LOGPATH
105                 + " path/to/log-directory/", this));
106         assertEquals("Expected matching arrays", validQuoteSubset,
107             OptionHelper.getValidCliArgs(inputString, this));
108     }
109 
testGetValidCliArgs_surroundingQuotes()110     public void testGetValidCliArgs_surroundingQuotes() throws Exception {
111       List<String> expectedTokens = Arrays.asList("--" + TEST_FILTER, "a b c");
112       String[] inputArray = {"\"--", TEST_FILTER, "=a b c\""};
113       String inputString = String.join("", inputArray);
114 
115       assertEquals("Expected matching arrays", expectedTokens,
116           OptionHelper.getValidCliArgs(inputString, this));
117 
118     }
119 
120 }
121