1/*
2 * Copyright 2018 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
17package com.android.tools.build.jetifier.processor.transform.proguard
18
19import org.junit.Test
20
21class ProGuardTypesMapperTest {
22
23    @Test fun proGuard_typeMapper_wildcard_simple() {
24        ProGuardTester()
25            .testThatGivenType("*")
26            .getsRewrittenTo("*")
27    }
28
29    @Test fun proGuard_typeMapper_wildcard_double() {
30        ProGuardTester()
31            .testThatGivenType("**")
32            .getsRewrittenTo("**")
33    }
34
35    @Test fun proGuard_typeMapper_wildcard_composed() {
36        ProGuardTester()
37            .testThatGivenType("**/*")
38            .getsRewrittenTo("**/*")
39    }
40
41    @Test fun proGuard_typeMapper_wildcard_viaMap() {
42        ProGuardTester()
43            .forGivenPrefixes(
44                "support/"
45            )
46            .forGivenProGuardMap(
47                "support/v7/*" to "test/v7/*"
48            )
49            .testThatGivenType("support.v7.*")
50            .getsRewrittenTo("test.v7.*")
51    }
52
53    @Test fun proGuard_typeMapper_wildcard_viaMap2() {
54        ProGuardTester()
55            .forGivenPrefixes(
56                "support/"
57            )
58            .forGivenProGuardMap(
59                "support/v7/**" to "test/v7/**"
60            )
61            .testThatGivenType("support.v7.**")
62            .getsRewrittenTo("test.v7.**")
63    }
64
65    @Test fun proGuard_typeMapper_wildcard_viaTypesMap() {
66        ProGuardTester()
67            .forGivenPrefixes(
68                "support/"
69            )
70            .forGivenTypesMap(
71                "support/v7/Activity" to "test/v7/Activity"
72            )
73            .testThatGivenType("support.v7.Activity")
74            .getsRewrittenTo("test.v7.Activity")
75    }
76
77    @Test fun proGuard_typeMapper_wildcard_notFoundInMap() {
78        ProGuardTester()
79            .forGivenPrefixes(
80                "support/"
81            )
82            .forGivenProGuardMap(
83                "support/**" to "test/**"
84            )
85            .testThatGivenType("keep.me.**")
86            .getsRewrittenTo("keep.me.**")
87    }
88
89    @Test fun proGuard_typeMapper_differentPrefix_stillRewritten() {
90        ProGuardTester()
91            .forGivenPrefixes(
92                "support/"
93            )
94            .forGivenTypesMap(
95                "hello/Activity" to "test/Activity"
96            )
97            .testThatGivenType("hello.Activity")
98            .getsRewrittenTo("test.Activity")
99    }
100
101    @Test fun proGuard_typeMapper_differentPrefix_wildcard_getsRewritten() {
102        ProGuardTester()
103            .forGivenPrefixes(
104                "support/"
105            )
106            .forGivenProGuardMap(
107                "hello/**" to "test/**"
108            )
109            .testThatGivenType("hello.**")
110            .getsRewrittenTo("test.**")
111    }
112
113    @Test fun proGuard_typeMapper_innerClass() {
114        ProGuardTester()
115            .forGivenPrefixes(
116                "support/"
117            )
118            .forGivenTypesMap(
119                "support/Activity" to "test/Activity"
120            )
121            .testThatGivenType("support.Activity\$InnerClass")
122            .getsRewrittenTo("test.Activity\$InnerClass")
123    }
124
125    @Test fun proGuard_typeMapper_innerWithStar() {
126        ProGuardTester()
127            .forGivenPrefixes(
128                "support/"
129            )
130            .forGivenTypesMap(
131                "support/Activity" to "test/Activity"
132            )
133            .testThatGivenType("support.Activity\$*")
134            .getsRewrittenTo("test.Activity\$*")
135    }
136
137    @Test fun proGuard_typeMapper_innerWithDoubleStar() {
138        ProGuardTester()
139            .forGivenPrefixes(
140                "support/"
141            )
142            .forGivenTypesMap(
143                "support/Activity" to "test/Activity"
144            )
145            .testThatGivenType("support.Activity\$**")
146            .getsRewrittenTo("test.Activity\$**")
147    }
148
149    @Test fun proGuard_typeMapper_innerClass_wildcard() {
150        ProGuardTester()
151            .forGivenPrefixes(
152                "support/"
153            )
154            .forGivenProGuardMap(
155                "**R\$Attrs" to "**R2\$Attrs"
156            )
157            .testThatGivenType("**R\$Attrs")
158            .getsRewrittenTo("**R2\$Attrs")
159    }
160
161    @Test fun proGuard_argsMapper_tripleDots() {
162        ProGuardTester()
163            .testThatGivenArguments("...")
164            .getRewrittenTo("...")
165    }
166
167    @Test fun proGuard_argsMapper_wildcard() {
168        ProGuardTester()
169            .testThatGivenArguments("*")
170            .getRewrittenTo("*")
171    }
172
173    @Test fun proGuard_argsMapper_wildcards() {
174        ProGuardTester()
175            .testThatGivenArguments("**, **")
176            .getRewrittenTo("**, **")
177    }
178
179    @Test fun proGuard_argsMapper_viaMaps() {
180        ProGuardTester()
181            .forGivenPrefixes(
182                "support/"
183            )
184            .forGivenTypesMap(
185                "support/Activity" to "test/Activity"
186            )
187            .forGivenProGuardMap(
188                "support/v7/**" to "test/v7/**"
189            )
190            .testThatGivenArguments("support.Activity, support.v7.**, keep.Me")
191            .getRewrittenTo("test.Activity, test.v7.**, keep.Me")
192    }
193
194    @Test fun proGuard_argsMapper_viaMaps_spaces() {
195        ProGuardTester()
196            .forGivenPrefixes(
197                "support/"
198            )
199            .forGivenTypesMap(
200                "support/Activity" to "test/Activity"
201            )
202            .forGivenProGuardMap(
203                "support/v7/**" to "test/v7/**"
204            )
205            .testThatGivenArguments(" support.Activity , \t support.v7.**,  keep.Me ")
206            .getRewrittenTo("test.Activity, test.v7.**, keep.Me")
207    }
208
209    @Test fun proGuard_shouldIgnore() {
210        ProGuardTester()
211            .forGivenPrefixes(
212                "support/"
213            )
214            .forGivenRules(
215                "support/v7/Activity" to "ignore"
216            )
217            .testThatGivenType("support.v7.Activity")
218            .getsRewrittenTo("support.v7.Activity")
219    }
220
221    @Test fun proGuard_shouldIgnore_withWildcard() {
222        ProGuardTester()
223            .forGivenPrefixes(
224                "support/"
225            )
226            .forGivenRules(
227                "support/v7/(.*)" to "ignore"
228            )
229            .testThatGivenType("support.v7.**")
230            .getsRewrittenTo("support.v7.**")
231    }
232
233    @Test(expected = AssertionError::class)
234    fun proGuard_shouldNotIgnore() {
235        ProGuardTester()
236            .forGivenPrefixes(
237                "support/"
238            )
239            .forGivenRules(
240                "support/v7/Activity" to "ignoreInPreprocessor"
241            )
242            .testThatGivenType("support.v7.Activity")
243            .getsRewrittenTo("support.v7.Activity")
244    }
245
246    @Test fun proGuard_solver_wildcard_shouldRewrite() {
247        ProGuardTester()
248            .forGivenPrefixes(
249                "support/"
250            )
251            .forGivenTypesMap(
252                "support/v7/preference/Preference" to "test/preference/Preference",
253                "support/v4/preference/PreferenceDialog" to "test/preference/PreferenceDialog",
254                "support/v4/preference/SomethingElse" to "test/preference/SomethingElse",
255                "support/v7/Random" to "test/Random"
256            )
257            .testThatGivenType("support.v?.preference.**")
258            .getsRewrittenTo("test.preference.**")
259    }
260
261    @Test fun proGuard_solver_wildcard2_shouldRewrite() {
262        ProGuardTester()
263            .forGivenPrefixes(
264                "support/"
265            )
266            .forGivenTypesMap(
267                "support/v7/preference/Preference" to "test/preference/Preference",
268                "support/v4/preference/SomethingElse" to "test/preference/SomethingElse",
269                "support/v7/Random" to "test/Random"
270            )
271            .testThatGivenType("support.*.preference.**")
272            .getsRewrittenTo("test.preference.**")
273    }
274
275    @Test fun proGuard_solver_wildcard3_shouldRewrite() {
276        ProGuardTester()
277            .forGivenPrefixes(
278                "support/"
279            )
280            .forGivenTypesMap(
281                "support/v7/preference/Preference" to "test/preference/Preference",
282                "support/v4/preference/SomethingElse" to "test/preference/SomethingElse",
283                "support/v4/preference/internal/Something" to "test/preference/internal/Something",
284                "support/v7/Random" to "test/Random"
285            )
286            .testThatGivenType("support.*.preference.**")
287            .getsRewrittenTo("test.preference.**")
288    }
289
290    @Test fun proGuard_solver_wildcard4_shouldRewrite() {
291        ProGuardTester()
292            .forGivenPrefixes(
293                "support/"
294            )
295            .forGivenTypesMap(
296                "support/v7/preference/Preference" to "test/preference/Preference",
297                "support/v4/preference/PreferenceDialog" to "test/preference/PreferenceDialog",
298                "support/v7/Random" to "test2/Random"
299            )
300            .testThatGivenType("support.**")
301            .getsRewrittenTo("test.**", "test2.**")
302    }
303
304    @Test fun proGuard_solver_wildcard_needToMapPartOfClass_shouldRewrite() {
305        ProGuardTester()
306            .forGivenPrefixes(
307                "support/"
308            )
309            .forGivenTypesMap(
310                "support/v7/preference/Preference" to "test/preference/Preference",
311                "support/v4/preference/PreferenceDialog" to "test/preference/PreferenceDialog",
312                "support/v4/preference/SomethingElse" to "test/preference/SomethingElse"
313            )
314            .testThatGivenType("support.v7.preference.Preference*")
315            .getsRewrittenTo("test.preference.Preference*")
316    }
317
318    @Test fun proGuard_solver_wildcard_oneToOne_shouldRewrite() {
319        ProGuardTester()
320            .forGivenPrefixes(
321                "support/"
322            )
323            .forGivenTypesMap(
324                "support/v7/preference/Preference" to "test/preference/Preference",
325                "support/v4/preference/PreferenceDialog" to "test/preference/PreferenceDialog"
326            )
327            .testThatGivenType("support.v?.preference.Preference")
328            .getsRewrittenTo("test.preference.Preference")
329    }
330
331    @Test fun proGuard_solver_wildcard_oneToOneStar_shouldRewrite() {
332        ProGuardTester()
333            .forGivenPrefixes(
334                "support/"
335            )
336            .forGivenTypesMap(
337                "support/v7/preference/Preference" to "test/preference/Preference"
338            )
339            .testThatGivenType("support.v?.preference.Preference*")
340            .getsRewrittenTo("test.preference.Preference*")
341    }
342}