1#!/usr/bin/env python3
2#
3# Copyright (C) 2020 The Android Open Source Project
4#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9#      http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16#
17
18import unittest
19import os
20from create_project import *
21
22class TestNewDirectory(unittest.TestCase):
23
24    def test_package_name(self):
25        package = generate_package_name("androidx.foo", "foo")
26        self.assertEqual("androidx.foo", package)
27
28        package = generate_package_name("androidx.foo", "foo-bar")
29        self.assertEqual("androidx.foo.bar", package)
30
31        package = generate_package_name("androidx.foo.bar", "bar")
32        self.assertEqual("androidx.foo.bar", package)
33
34        package = generate_package_name("androidx.foo.bar", "bar-qux")
35        self.assertEqual("androidx.foo.bar.qux", package)
36
37    def test_name_correctness(self):
38        self.assertFalse(validate_name("foo", "bar"))
39        self.assertFalse(validate_name("foo", "foo"))
40        self.assertFalse(validate_name("androidx.foo", "bar"))
41        self.assertFalse(validate_name("androidx.foo", "bar-qux"))
42        self.assertFalse(validate_name("androidx.foo.bar", "foo"))
43        self.assertTrue(validate_name("androidx.foo", "foo"))
44        self.assertTrue(validate_name("androidx.foo", "foo-bar"))
45        self.assertTrue(validate_name("androidx.foo.bar", "bar"))
46        self.assertTrue(validate_name("androidx.foo.bar", "bar-qux"))
47
48    def test_full_directory_name(self):
49        full_fp = get_full_artifact_path("androidx.foo", "foo")
50        self.assertTrue(full_fp.endswith("frameworks/support/foo/foo"))
51
52        full_fp = get_full_artifact_path("androidx.foo", "foo-bar")
53        self.assertTrue(full_fp.endswith("frameworks/support/foo/foo-bar"))
54
55        full_fp = get_full_artifact_path("androidx.foo.bar", "bar")
56        self.assertTrue(full_fp.endswith("frameworks/support/foo/bar/bar"))
57
58        full_fp = get_full_artifact_path("androidx.foo.bar", "bar-qux")
59        self.assertTrue(full_fp.endswith("frameworks/support/foo/bar/bar-qux"))
60
61    def test_get_package_documentation_file_dir(self):
62        package_info_dir_fp = get_package_documentation_file_dir("androidx.foo", "foo")
63        frameworks_support_fp = os.path.abspath(os.path.join(os.getcwd(), '..', '..'))
64        self.assertEqual(frameworks_support_fp + "/foo/foo/src/main/java/androidx/foo", package_info_dir_fp)
65
66        package_info_dir_fp = get_package_documentation_file_dir("androidx.foo", "foo-bar")
67        self.assertEqual(frameworks_support_fp + "/foo/foo-bar/src/main/java/androidx/foo", package_info_dir_fp)
68
69        package_info_dir_fp = get_package_documentation_file_dir("androidx.foo.bar", "bar")
70        self.assertEqual(frameworks_support_fp + "/foo/bar/bar/src/main/java/androidx/foo/bar", package_info_dir_fp)
71
72        package_info_dir_fp = get_package_documentation_file_dir("androidx.foo.bar", "bar-qux")
73        self.assertEqual(frameworks_support_fp + "/foo/bar/bar-qux/src/main/java/androidx/foo/bar", package_info_dir_fp)
74
75        package_info_dir_fp = get_package_documentation_file_dir("androidx.compose.bar", "bar-qux")
76        self.assertEqual(frameworks_support_fp + "/compose/bar/bar-qux/src/commonMain/kotlin/androidx/compose/bar",
77                         package_info_dir_fp)
78
79        package_info_dir_fp = get_package_documentation_file_dir("androidx.foo.compose", "compose-qux")
80        self.assertEqual(frameworks_support_fp + "/foo/compose/compose-qux/src/commonMain/kotlin/androidx/foo/compose",
81                         package_info_dir_fp)
82
83    def test_get_package_documentation_filename(self):
84        frameworks_support_fp = os.path.abspath(os.path.join(os.getcwd(), '..', '..'))
85
86        package_info_dir_filename = get_package_documentation_filename("androidx.foo", "foo", ProjectType.KOTLIN)
87        self.assertEqual("androidx-foo-foo-documentation.md", package_info_dir_filename)
88
89        package_info_dir_filename = get_package_documentation_filename("androidx.foo", "foo", ProjectType.NATIVE)
90        self.assertEqual("androidx-foo-foo-documentation.md", package_info_dir_filename)
91
92        package_info_dir_filename = get_package_documentation_filename("androidx.foo", "foo-bar", ProjectType.KOTLIN)
93        self.assertEqual("androidx-foo-foo-bar-documentation.md", package_info_dir_filename)
94
95        package_info_dir_filename = get_package_documentation_filename("androidx.foo.bar", "bar", ProjectType.KOTLIN)
96        self.assertEqual("androidx-foo-bar-bar-documentation.md", package_info_dir_filename)
97
98        package_info_dir_filename = get_package_documentation_filename("androidx.foo.bar", "bar-qux", ProjectType.KOTLIN)
99        self.assertEqual("androidx-foo-bar-bar-qux-documentation.md", package_info_dir_filename)
100
101        package_info_dir_filename = get_package_documentation_filename("androidx.foo", "foo", ProjectType.JAVA)
102        self.assertEqual("package-info.java", package_info_dir_filename)
103
104        package_info_dir_filename = get_package_documentation_filename("androidx.foo", "foo-bar", ProjectType.JAVA)
105        self.assertEqual("package-info.java", package_info_dir_filename)
106
107        package_info_dir_filename = get_package_documentation_filename("androidx.foo.bar", "bar", ProjectType.JAVA)
108        self.assertEqual("package-info.java", package_info_dir_filename)
109
110        package_info_dir_filename = get_package_documentation_filename("androidx.foo.bar", "bar-qux", ProjectType.JAVA)
111        self.assertEqual("package-info.java", package_info_dir_filename)
112
113    def test_group_id_directory_name(self):
114        full_fp = get_group_id_path("androidx.foo")
115        self.assertTrue(full_fp.endswith("frameworks/support/foo"))
116
117        full_fp = get_group_id_path("androidx.foo")
118        self.assertTrue(full_fp.endswith("frameworks/support/foo"))
119
120        full_fp = get_group_id_path("androidx.foo.bar")
121        self.assertTrue(full_fp.endswith("frameworks/support/foo/bar"))
122
123        full_fp = get_group_id_path("androidx.foo.bar")
124        self.assertTrue(full_fp.endswith("frameworks/support/foo/bar"))
125
126
127class TestSettingsGradle(unittest.TestCase):
128
129    def test_settings_gradle_line(self):
130        line = get_new_settings_gradle_line("androidx.foo", "foo")
131        self.assertEqual("includeProject(\":foo:foo\", [BuildType.MAIN])\n", line)
132
133        line = get_new_settings_gradle_line("androidx.foo", "foo-bar")
134        self.assertEqual("includeProject(\":foo:foo-bar\", [BuildType.MAIN])\n", line)
135
136        line = get_new_settings_gradle_line("androidx.foo.bar", "bar")
137        self.assertEqual("includeProject(\":foo:bar:bar\", [BuildType.MAIN])\n", line)
138
139        line = get_new_settings_gradle_line("androidx.foo.bar", "bar-qux")
140        self.assertEqual("includeProject(\":foo:bar:bar-qux\", [BuildType.MAIN])\n", line)
141
142        line = get_new_settings_gradle_line("androidx.compose", "compose-foo")
143        self.assertEqual("includeProject(\":compose:compose-foo\", [BuildType.COMPOSE])\n", line)
144
145        line = get_new_settings_gradle_line("androidx.compose.foo", "foo-bar")
146        self.assertEqual("includeProject(\":compose:foo:foo-bar\", [BuildType.COMPOSE])\n", line)
147
148        line = get_new_settings_gradle_line("androidx.foo.bar", "bar-compose")
149        self.assertEqual("includeProject(\":foo:bar:bar-compose\", [BuildType.COMPOSE])\n", line)
150
151    def test_gradle_project_coordinates(self):
152        coordinates = get_gradle_project_coordinates("androidx.foo", "foo")
153        self.assertEqual(":foo:foo", coordinates)
154
155        coordinates = get_gradle_project_coordinates("androidx.foo", "foo-bar")
156        self.assertEqual(":foo:foo-bar", coordinates)
157
158        coordinates = get_gradle_project_coordinates("androidx.foo.bar", "bar")
159        self.assertEqual(":foo:bar:bar", coordinates)
160
161        coordinates = get_gradle_project_coordinates("androidx.foo.bar", "bar-qux")
162        self.assertEqual(":foo:bar:bar-qux", coordinates)
163
164class TestBuildGradle(unittest.TestCase):
165    def test_correct_library_type_is_returned(self):
166        library_type = get_library_type("foo-samples")
167        self.assertEqual("SAMPLES", library_type)
168
169        library_type = get_library_type("foo-compiler")
170        self.assertEqual("ANNOTATION_PROCESSOR", library_type)
171
172        library_type = get_library_type("foo-lint")
173        self.assertEqual("LINT", library_type)
174
175        library_type = get_library_type("foo-inspection")
176        self.assertEqual("IDE_PLUGIN", library_type)
177
178        library_type = get_library_type("foo")
179        self.assertEqual("PUBLISHED_LIBRARY", library_type)
180
181        library_type = get_library_type("foo-inspect")
182        self.assertEqual("PUBLISHED_LIBRARY", library_type)
183
184        library_type = get_library_type("foocomp")
185        self.assertEqual("PUBLISHED_LIBRARY", library_type)
186
187        library_type = get_library_type("foo-bar")
188        self.assertEqual("PUBLISHED_LIBRARY", library_type)
189
190
191class TestDocsTipOfTree(unittest.TestCase):
192
193    def test_docs_tip_of_tree_build_grade_line(self):
194        line = get_new_docs_tip_of_tree_build_grade_line("androidx.foo", "foo")
195        self.assertEqual("    docs(project(\":foo:foo\"))\n", line)
196
197        line = get_new_docs_tip_of_tree_build_grade_line("androidx.foo", "foo-bar")
198        self.assertEqual("    docs(project(\":foo:foo-bar\"))\n", line)
199
200        line = get_new_docs_tip_of_tree_build_grade_line("androidx.foo.bar", "bar")
201        self.assertEqual("    docs(project(\":foo:bar:bar\"))\n", line)
202
203        line = get_new_docs_tip_of_tree_build_grade_line("androidx.foo.bar", "bar-qux")
204        self.assertEqual("    docs(project(\":foo:bar:bar-qux\"))\n", line)
205
206        line = get_new_docs_tip_of_tree_build_grade_line("androidx.foo", "foo-samples")
207        self.assertEqual("    samples(project(\":foo:foo-samples\"))\n", line)
208
209        line = get_new_docs_tip_of_tree_build_grade_line("androidx.foo.bar", "bar-qux-samples")
210        self.assertEqual("    samples(project(\":foo:bar:bar-qux-samples\"))\n", line)
211
212class TestReplacements(unittest.TestCase):
213
214    def test_version_macro(self):
215        macro = get_group_id_version_macro("androidx.foo")
216        self.assertEqual("FOO", macro)
217
218        macro = get_group_id_version_macro("androidx.foo.bar")
219        self.assertEqual("FOO_BAR", macro)
220
221        macro = get_group_id_version_macro("androidx.compose.bar")
222        self.assertEqual("BAR", macro)
223
224        macro = get_group_id_version_macro("androidx.compose.foo.bar")
225        self.assertEqual("FOO_BAR", macro)
226
227        macro = get_group_id_version_macro("androidx.compose")
228        self.assertEqual("COMPOSE", macro)
229
230    def test_sed(self):
231        out_dir = "./out"
232        test_file = out_dir + "/temp.txt"
233        test_file_contents = "a\nb\nc"
234        if not os.path.exists(out_dir):
235            os.makedirs(out_dir)
236        with open(test_file,"w") as f:
237           f.write("a\nb\nc")
238        sed("a", "d", test_file)
239
240        # write back the file
241        with open(test_file) as f:
242           file_contents = f.read()
243        self.assertEqual("d\nb\nc", file_contents)
244        rm(out_dir)
245
246    def test_mv_dir_within_same_dir(self):
247        src_out_dir = "./src_out"
248        test_src_file = src_out_dir + "/temp.txt"
249        test_file_contents = "a\nb\nc"
250        if not os.path.exists(src_out_dir):
251            os.makedirs(src_out_dir)
252        with open(test_src_file,"w") as f:
253           f.write("a\nb\nc")
254
255        dst_out_dir = "./dst_out"
256        mv_dir(src_out_dir, dst_out_dir)
257        # write back the file
258        with open(dst_out_dir + "/temp.txt") as f:
259           file_contents = f.read()
260        self.assertEqual("a\nb\nc", file_contents)
261        rm(src_out_dir)
262        rm(dst_out_dir)
263
264    def test_mv_dir_to_different_dir(self):
265        src_out_dir = "./src_out_2"
266        test_src_file = src_out_dir + "/temp.txt"
267        test_file_contents = "a\nb\nc"
268        if not os.path.exists(src_out_dir):
269            os.makedirs(src_out_dir)
270        with open(test_src_file,"w") as f:
271           f.write("a\nb\nc")
272
273        dst_out_dir_parent = "./dst_out_2"
274        dst_out_dir = dst_out_dir_parent + "/hello/world"
275        mv_dir(src_out_dir, dst_out_dir)
276        # write back the file
277        with open(dst_out_dir + "/temp.txt") as f:
278           file_contents = f.read()
279        self.assertEqual("a\nb\nc", file_contents)
280        rm(src_out_dir)
281        rm(dst_out_dir_parent)
282
283    def test_rename_file_within_same_dir(self):
284        test_src_file = "./temp.txt"
285        test_file_contents = "a\nb\nc"
286        with open(test_src_file,"w") as f:
287           f.write("a\nb\nc")
288
289        test_dst_file = "./temp_out.txt"
290        rename_file(test_src_file, test_dst_file)
291        # read back the file
292        with open(test_dst_file) as f:
293           file_contents = f.read()
294        self.assertEqual("a\nb\nc", file_contents)
295        rm(test_dst_file)
296
297    def test_remove_line(self):
298        out_dir = "./out"
299        test_file = out_dir + "/temp.txt"
300        test_file_contents = "a\nb\nc"
301        if not os.path.exists(out_dir):
302            os.makedirs(out_dir)
303
304        with open(test_file,"w") as f:
305           f.write("a\nb\nc")
306        remove_line("b", test_file)
307        # read back the file and check
308        with open(test_file) as f:
309           file_contents = f.read()
310        self.assertEqual("a\nc", file_contents)
311
312        with open(test_file,"w") as f:
313           f.write("abc\ndef\nghi")
314        remove_line("c", test_file)
315        # read back the file and check
316        with open(test_file) as f:
317           file_contents = f.read()
318        self.assertEqual("def\nghi", file_contents)
319
320        # Clean up
321        rm(out_dir)
322
323
324class TestLibraryGroupKt(unittest.TestCase):
325
326    def test_library_group_atomicity_is_correctly_determined(self):
327        self.assertFalse(is_group_id_atomic("androidx.core"))
328        self.assertFalse(is_group_id_atomic("androidx.foo"))
329        self.assertFalse(is_group_id_atomic(""))
330        self.assertFalse(is_group_id_atomic("androidx.compose.foo"))
331        self.assertTrue(is_group_id_atomic("androidx.cardview"))
332        self.assertTrue(is_group_id_atomic("androidx.tracing"))
333        self.assertTrue(is_group_id_atomic("androidx.compose.foundation"))
334
335
336if __name__ == '__main__':
337    unittest.main()