1 /*
2  * Copyright (C) 2019 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 
17 package com.android.protolog.tool
18 
19 import org.junit.Assert.assertEquals
20 import org.junit.Test
21 
22 class CommandOptionsTest {
23     companion object {
24         val TEST_JAVA_SRC = listOf(
25                 "frameworks/base/services/core/java/com/android/server/wm/" +
26                         "AccessibilityController.java",
27                 "frameworks/base/services/core/java/com/android/server/wm/ActivityDisplay.java",
28                 "frameworks/base/services/core/java/com/android/server/wm/" +
29                         "ActivityMetricsLaunchObserver.java"
30         )
31         private const val TEST_PROTOLOG_CLASS = "com.android.server.wm.ProtoLog"
32         private const val TEST_PROTOLOGIMPL_CLASS = "com.android.server.wm.ProtoLogImpl"
33         private const val TEST_PROTOLOGCACHE_CLASS = "com.android.server.wm.ProtoLog\$Cache"
34         private const val TEST_PROTOLOGGROUP_CLASS = "com.android.internal.protolog.ProtoLogGroup"
35         private const val TEST_PROTOLOGGROUP_JAR = "out/soong/.intermediates/frameworks/base/" +
36                 "services/core/services.core.wm.protologgroups/android_common/javac/" +
37                 "services.core.wm.protologgroups.jar"
38         private const val TEST_SRC_JAR = "out/soong/.temp/sbox175955373/" +
39                 "services.core.wm.protolog.srcjar"
40         private const val TEST_VIEWER_JSON = "out/soong/.temp/sbox175955373/" +
41                 "services.core.wm.protolog.json"
42         private const val TEST_LOG = "./test_log.pb"
43     }
44 
45     @Test(expected = InvalidCommandException::class)
46     fun noCommand() {
47         CommandOptions(arrayOf())
48     }
49 
50     @Test(expected = InvalidCommandException::class)
51     fun invalidCommand() {
52         val testLine = "invalid"
53         CommandOptions(testLine.split(' ').toTypedArray())
54     }
55 
56     @Test
57     fun transformClasses() {
58         val testLine = "transform-protolog-calls --protolog-class $TEST_PROTOLOG_CLASS " +
59                 "--protolog-impl-class $TEST_PROTOLOGIMPL_CLASS " +
60                 "--protolog-cache-class $TEST_PROTOLOGCACHE_CLASS " +
61                 "--loggroups-class $TEST_PROTOLOGGROUP_CLASS " +
62                 "--loggroups-jar $TEST_PROTOLOGGROUP_JAR " +
63                 "--output-srcjar $TEST_SRC_JAR ${TEST_JAVA_SRC.joinToString(" ")}"
64         val cmd = CommandOptions(testLine.split(' ').toTypedArray())
65         assertEquals(CommandOptions.TRANSFORM_CALLS_CMD, cmd.command)
66         assertEquals(TEST_PROTOLOG_CLASS, cmd.protoLogClassNameArg)
67         assertEquals(TEST_PROTOLOGIMPL_CLASS, cmd.protoLogImplClassNameArg)
68         assertEquals(TEST_PROTOLOGGROUP_CLASS, cmd.protoLogGroupsClassNameArg)
69         assertEquals(TEST_PROTOLOGGROUP_JAR, cmd.protoLogGroupsJarArg)
70         assertEquals(TEST_SRC_JAR, cmd.outputSourceJarArg)
71         assertEquals(TEST_JAVA_SRC, cmd.javaSourceArgs)
72     }
73 
74     @Test(expected = InvalidCommandException::class)
75     fun transformClasses_noProtoLogClass() {
76         val testLine = "transform-protolog-calls " +
77                 "--protolog-impl-class $TEST_PROTOLOGIMPL_CLASS " +
78                 "--protolog-cache-class $TEST_PROTOLOGCACHE_CLASS " +
79                 "--loggroups-class $TEST_PROTOLOGGROUP_CLASS " +
80                 "--loggroups-jar $TEST_PROTOLOGGROUP_JAR " +
81                 "--output-srcjar $TEST_SRC_JAR ${TEST_JAVA_SRC.joinToString(" ")}"
82         CommandOptions(testLine.split(' ').toTypedArray())
83     }
84 
85     @Test(expected = InvalidCommandException::class)
86     fun transformClasses_noProtoLogImplClass() {
87         val testLine = "transform-protolog-calls --protolog-class $TEST_PROTOLOG_CLASS " +
88                 "--protolog-cache-class $TEST_PROTOLOGCACHE_CLASS " +
89                 "--loggroups-class $TEST_PROTOLOGGROUP_CLASS " +
90                 "--loggroups-jar $TEST_PROTOLOGGROUP_JAR " +
91                 "--output-srcjar $TEST_SRC_JAR ${TEST_JAVA_SRC.joinToString(" ")}"
92         CommandOptions(testLine.split(' ').toTypedArray())
93     }
94 
95     @Test(expected = InvalidCommandException::class)
96     fun transformClasses_noProtoLogCacheClass() {
97         val testLine = "transform-protolog-calls --protolog-class $TEST_PROTOLOG_CLASS " +
98                 "--protolog-impl-class $TEST_PROTOLOGIMPL_CLASS " +
99                 "--loggroups-class $TEST_PROTOLOGGROUP_CLASS " +
100                 "--loggroups-jar $TEST_PROTOLOGGROUP_JAR " +
101                 "--output-srcjar $TEST_SRC_JAR ${TEST_JAVA_SRC.joinToString(" ")}"
102         CommandOptions(testLine.split(' ').toTypedArray())
103     }
104 
105     @Test(expected = InvalidCommandException::class)
106     fun transformClasses_noProtoLogGroupClass() {
107         val testLine = "transform-protolog-calls --protolog-class $TEST_PROTOLOG_CLASS " +
108                 "--protolog-impl-class $TEST_PROTOLOGIMPL_CLASS " +
109                 "--protolog-cache-class $TEST_PROTOLOGCACHE_CLASS " +
110                 "--loggroups-jar $TEST_PROTOLOGGROUP_JAR " +
111                 "--output-srcjar $TEST_SRC_JAR ${TEST_JAVA_SRC.joinToString(" ")}"
112         CommandOptions(testLine.split(' ').toTypedArray())
113     }
114 
115     @Test(expected = InvalidCommandException::class)
116     fun transformClasses_noProtoLogGroupJar() {
117         val testLine = "transform-protolog-calls --protolog-class $TEST_PROTOLOG_CLASS " +
118                 "--protolog-impl-class $TEST_PROTOLOGIMPL_CLASS " +
119                 "--protolog-cache-class $TEST_PROTOLOGCACHE_CLASS " +
120                 "--loggroups-class $TEST_PROTOLOGGROUP_CLASS " +
121                 "--output-srcjar $TEST_SRC_JAR ${TEST_JAVA_SRC.joinToString(" ")}"
122         CommandOptions(testLine.split(' ').toTypedArray())
123     }
124 
125     @Test(expected = InvalidCommandException::class)
126     fun transformClasses_noOutJar() {
127         val testLine = "transform-protolog-calls --protolog-class $TEST_PROTOLOG_CLASS " +
128                 "--protolog-impl-class $TEST_PROTOLOGIMPL_CLASS " +
129                 "--protolog-cache-class $TEST_PROTOLOGCACHE_CLASS " +
130                 "--loggroups-class $TEST_PROTOLOGGROUP_CLASS " +
131                 "--loggroups-jar $TEST_PROTOLOGGROUP_JAR " +
132                 TEST_JAVA_SRC.joinToString(" ")
133         CommandOptions(testLine.split(' ').toTypedArray())
134     }
135 
136     @Test(expected = InvalidCommandException::class)
137     fun transformClasses_noJavaInput() {
138         val testLine = "transform-protolog-calls --protolog-class $TEST_PROTOLOG_CLASS " +
139                 "--protolog-impl-class $TEST_PROTOLOGIMPL_CLASS " +
140                 "--protolog-cache-class $TEST_PROTOLOGCACHE_CLASS " +
141                 "--loggroups-class $TEST_PROTOLOGGROUP_CLASS " +
142                 "--loggroups-jar $TEST_PROTOLOGGROUP_JAR " +
143                 "--output-srcjar $TEST_SRC_JAR"
144         CommandOptions(testLine.split(' ').toTypedArray())
145     }
146 
147     @Test(expected = InvalidCommandException::class)
148     fun transformClasses_invalidProtoLogClass() {
149         val testLine = "transform-protolog-calls --protolog-class invalid " +
150                 "--protolog-impl-class $TEST_PROTOLOGIMPL_CLASS " +
151                 "--protolog-cache-class $TEST_PROTOLOGCACHE_CLASS " +
152                 "--loggroups-class $TEST_PROTOLOGGROUP_CLASS " +
153                 "--loggroups-jar $TEST_PROTOLOGGROUP_JAR " +
154                 "--output-srcjar $TEST_SRC_JAR ${TEST_JAVA_SRC.joinToString(" ")}"
155         CommandOptions(testLine.split(' ').toTypedArray())
156     }
157 
158     @Test(expected = InvalidCommandException::class)
159     fun transformClasses_invalidProtoLogImplClass() {
160         val testLine = "transform-protolog-calls --protolog-class $TEST_PROTOLOG_CLASS " +
161                 "--protolog-impl-class invalid " +
162                 "--protolog-cache-class $TEST_PROTOLOGCACHE_CLASS " +
163                 "--loggroups-class $TEST_PROTOLOGGROUP_CLASS " +
164                 "--loggroups-jar $TEST_PROTOLOGGROUP_JAR " +
165                 "--output-srcjar $TEST_SRC_JAR ${TEST_JAVA_SRC.joinToString(" ")}"
166         CommandOptions(testLine.split(' ').toTypedArray())
167     }
168 
169     @Test(expected = InvalidCommandException::class)
170     fun transformClasses_invalidProtoLogCacheClass() {
171         val testLine = "transform-protolog-calls --protolog-class $TEST_PROTOLOG_CLASS " +
172                 "--protolog-impl-class $TEST_PROTOLOGIMPL_CLASS " +
173                 "--protolog-cache-class invalid " +
174                 "--loggroups-class $TEST_PROTOLOGGROUP_CLASS " +
175                 "--loggroups-jar $TEST_PROTOLOGGROUP_JAR " +
176                 "--output-srcjar $TEST_SRC_JAR ${TEST_JAVA_SRC.joinToString(" ")}"
177         CommandOptions(testLine.split(' ').toTypedArray())
178     }
179 
180     @Test(expected = InvalidCommandException::class)
181     fun transformClasses_invalidProtoLogGroupClass() {
182         val testLine = "transform-protolog-calls --protolog-class $TEST_PROTOLOG_CLASS " +
183                 "--protolog-impl-class $TEST_PROTOLOGIMPL_CLASS " +
184                 "--protolog-cache-class $TEST_PROTOLOGCACHE_CLASS " +
185                 "--loggroups-class invalid " +
186                 "--loggroups-jar $TEST_PROTOLOGGROUP_JAR " +
187                 "--output-srcjar $TEST_SRC_JAR ${TEST_JAVA_SRC.joinToString(" ")}"
188         CommandOptions(testLine.split(' ').toTypedArray())
189     }
190 
191     @Test(expected = InvalidCommandException::class)
192     fun transformClasses_invalidProtoLogGroupJar() {
193         val testLine = "transform-protolog-calls --protolog-class $TEST_PROTOLOG_CLASS " +
194                 "--protolog-impl-class $TEST_PROTOLOGIMPL_CLASS " +
195                 "--protolog-cache-class $TEST_PROTOLOGCACHE_CLASS " +
196                 "--loggroups-class $TEST_PROTOLOGGROUP_CLASS " +
197                 "--loggroups-jar invalid.txt " +
198                 "--output-srcjar $TEST_SRC_JAR ${TEST_JAVA_SRC.joinToString(" ")}"
199         CommandOptions(testLine.split(' ').toTypedArray())
200     }
201 
202     @Test(expected = InvalidCommandException::class)
203     fun transformClasses_invalidOutJar() {
204         val testLine = "transform-protolog-calls --protolog-class $TEST_PROTOLOG_CLASS " +
205                 "--protolog-impl-class $TEST_PROTOLOGIMPL_CLASS " +
206                 "--protolog-cache-class $TEST_PROTOLOGCACHE_CLASS " +
207                 "--loggroups-class $TEST_PROTOLOGGROUP_CLASS " +
208                 "--loggroups-jar $TEST_PROTOLOGGROUP_JAR " +
209                 "--output-srcjar invalid.db ${TEST_JAVA_SRC.joinToString(" ")}"
210         CommandOptions(testLine.split(' ').toTypedArray())
211     }
212 
213     @Test(expected = InvalidCommandException::class)
214     fun transformClasses_invalidJavaInput() {
215         val testLine = "transform-protolog-calls --protolog-class $TEST_PROTOLOG_CLASS " +
216                 "--protolog-impl-class $TEST_PROTOLOGIMPL_CLASS " +
217                 "--protolog-cache-class $TEST_PROTOLOGCACHE_CLASS " +
218                 "--loggroups-class $TEST_PROTOLOGGROUP_CLASS " +
219                 "--loggroups-jar $TEST_PROTOLOGGROUP_JAR " +
220                 "--output-srcjar $TEST_SRC_JAR invalid.py"
221         CommandOptions(testLine.split(' ').toTypedArray())
222     }
223 
224     @Test(expected = InvalidCommandException::class)
225     fun transformClasses_unknownParam() {
226         val testLine = "transform-protolog-calls --protolog-class $TEST_PROTOLOG_CLASS " +
227                 "--unknown test --protolog-impl-class $TEST_PROTOLOGIMPL_CLASS " +
228                 "--protolog-cache-class $TEST_PROTOLOGCACHE_CLASS " +
229                 "--loggroups-class $TEST_PROTOLOGGROUP_CLASS " +
230                 "--loggroups-jar $TEST_PROTOLOGGROUP_JAR " +
231                 "--output-srcjar $TEST_SRC_JAR ${TEST_JAVA_SRC.joinToString(" ")}"
232         CommandOptions(testLine.split(' ').toTypedArray())
233     }
234 
235     @Test(expected = InvalidCommandException::class)
236     fun transformClasses_noValue() {
237         val testLine = "transform-protolog-calls --protolog-class $TEST_PROTOLOG_CLASS " +
238                 "--protolog-impl-class " +
239                 "--protolog-cache-class $TEST_PROTOLOGCACHE_CLASS " +
240                 "--loggroups-class $TEST_PROTOLOGGROUP_CLASS " +
241                 "--loggroups-jar $TEST_PROTOLOGGROUP_JAR " +
242                 "--output-srcjar $TEST_SRC_JAR ${TEST_JAVA_SRC.joinToString(" ")}"
243         CommandOptions(testLine.split(' ').toTypedArray())
244     }
245 
246     @Test
247     fun generateConfig() {
248         val testLine = "generate-viewer-config --protolog-class $TEST_PROTOLOG_CLASS " +
249                 "--loggroups-class $TEST_PROTOLOGGROUP_CLASS " +
250                 "--loggroups-jar $TEST_PROTOLOGGROUP_JAR " +
251                 "--viewer-conf $TEST_VIEWER_JSON ${TEST_JAVA_SRC.joinToString(" ")}"
252         val cmd = CommandOptions(testLine.split(' ').toTypedArray())
253         assertEquals(CommandOptions.GENERATE_CONFIG_CMD, cmd.command)
254         assertEquals(TEST_PROTOLOG_CLASS, cmd.protoLogClassNameArg)
255         assertEquals(TEST_PROTOLOGGROUP_CLASS, cmd.protoLogGroupsClassNameArg)
256         assertEquals(TEST_PROTOLOGGROUP_JAR, cmd.protoLogGroupsJarArg)
257         assertEquals(TEST_VIEWER_JSON, cmd.viewerConfigJsonArg)
258         assertEquals(TEST_JAVA_SRC, cmd.javaSourceArgs)
259     }
260 
261     @Test(expected = InvalidCommandException::class)
262     fun generateConfig_noViewerConfig() {
263         val testLine = "generate-viewer-config --protolog-class $TEST_PROTOLOG_CLASS " +
264                 "--loggroups-class $TEST_PROTOLOGGROUP_CLASS " +
265                 "--loggroups-jar $TEST_PROTOLOGGROUP_JAR " +
266                 TEST_JAVA_SRC.joinToString(" ")
267         CommandOptions(testLine.split(' ').toTypedArray())
268     }
269 
270     @Test(expected = InvalidCommandException::class)
271     fun generateConfig_invalidViewerConfig() {
272         val testLine = "generate-viewer-config --protolog-class $TEST_PROTOLOG_CLASS " +
273                 "--loggroups-class $TEST_PROTOLOGGROUP_CLASS " +
274                 "--loggroups-jar $TEST_PROTOLOGGROUP_JAR " +
275                 "--viewer-conf invalid.yaml ${TEST_JAVA_SRC.joinToString(" ")}"
276         CommandOptions(testLine.split(' ').toTypedArray())
277     }
278 
279     @Test
280     fun readLog() {
281         val testLine = "read-log --viewer-conf $TEST_VIEWER_JSON $TEST_LOG"
282         val cmd = CommandOptions(testLine.split(' ').toTypedArray())
283         assertEquals(CommandOptions.READ_LOG_CMD, cmd.command)
284         assertEquals(TEST_VIEWER_JSON, cmd.viewerConfigJsonArg)
285         assertEquals(TEST_LOG, cmd.logProtofileArg)
286     }
287 }
288