1#!/usr/bin/python3 -B
2
3# Copyright 2021 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"""Tests for common_util."""
17
18from typing import List
19import unittest
20
21# pylint: disable=g-multiple-import
22from common_util import (
23    LIBCORE_DIR,
24    OpenjdkFinder,
25    OjluniFinder,
26)
27
28from git import Repo
29
30
31class OjluniFinderTest(unittest.TestCase):
32
33  LIST_OJLUNI_PATHS = [
34      'ojluni/src/main/java/java/lang/String.java',
35      'ojluni/src/main/java/java/lang/StringBuilder.java',
36      'ojluni/src/main/java/java/lang/package-info.java',
37      'ojluni/src/main/java/java/math/BigInteger.java',
38      'ojluni/src/test/java/math/BigInteger/BigIntegerTest.java',
39      'ojluni/src/main/native/System.c',
40  ]
41
42  def setUp(self):
43    super().setUp()
44    self.ojluni_finder = OjluniFinder(self.LIST_OJLUNI_PATHS)
45
46  def test_translate_from_class_name_to_ojluni_path(self):
47    # Translates a package
48    self.assert_class_to_path(
49        'java.lang.NullPointerException',
50        'ojluni/src/main/java/java/lang/NullPointerException.java')
51    self.assert_class_to_path(
52        'TopPackage.SubPackage.ClassA',
53        'ojluni/src/main/java/TopPackage/SubPackage/ClassA.java')
54
55    # Translates a test package
56    self.assert_class_to_path(
57        'test.java.lang.NullPointerException',
58        'ojluni/src/test/java/lang/NullPointerException.java')
59    self.assert_class_to_path(
60        'test.TopPackage.SubPackage.ClassA',
61        'ojluni/src/test/TopPackage/SubPackage/ClassA.java')
62
63    # Translates a path
64    self.assert_class_to_path(
65        'ojluni/src/main/java/java/lang/NullPointerException.java',
66        'ojluni/src/main/java/java/lang/NullPointerException.java')
67
68    # Test edge cases
69    self.assert_class_to_path('a', 'ojluni/src/main/java/a.java')
70    self.assert_class_to_path('test.a', 'ojluni/src/test/a.java')
71
72  def assert_class_to_path(self, classname: str, expected_path: str):
73    translated_path = OjluniFinder.translate_from_class_name_to_ojluni_path(
74        classname)
75    self.assertEqual(translated_path, expected_path)
76
77  def test_ojluni_match_path_prefix(self):
78    # directory path ending with / or not has different results
79    self.assert_match_ojluni_path('ojluni/src/main/java/java', [
80        'ojluni/src/main/java/java/',
81    ])
82    self.assert_match_ojluni_path('ojluni/src/main/java/java/', [
83        'ojluni/src/main/java/java/lang/',
84        'ojluni/src/main/java/java/math/',
85    ])
86
87    self.assert_match_ojluni_path('ojluni/src/main/java/java/lang/', [
88        'ojluni/src/main/java/java/lang/String.java',
89        'ojluni/src/main/java/java/lang/StringBuilder.java',
90        'ojluni/src/main/java/java/lang/package-info.java',
91    ])
92    self.assert_match_ojluni_path('ojluni/src/main/java/java/lang/String', [
93        'ojluni/src/main/java/java/lang/String.java',
94        'ojluni/src/main/java/java/lang/StringBuilder.java',
95    ])
96    self.assert_match_ojluni_path('ojluni/src/main/java/java/lang/StringB', [
97        'ojluni/src/main/java/java/lang/StringBuilder.java',
98    ])
99    self.assert_match_ojluni_path('ojluni/src/main/java/java/math/', [
100        'ojluni/src/main/java/java/math/BigInteger.java',
101    ])
102
103    self.assert_match_ojluni_path('ojluni/src/test/java/math/BigInteger/', [
104        'ojluni/src/test/java/math/BigInteger/BigIntegerTest.java',
105    ])
106    self.assert_match_ojluni_path('ojluni/src/test/java/math/BigInteger/', [
107        'ojluni/src/test/java/math/BigInteger/BigIntegerTest.java',
108    ])
109
110  def assert_match_ojluni_path(self, path_prefix: str, expected: List[str]):
111    result = self.ojluni_finder.match_path_prefix(path_prefix)
112    self.assertEqual(set(expected), result)
113
114  def test_ojluni_match_classname_prefix(self):
115    # directory path ending with / or not has different results
116    self.assert_match_ojluni_classname('java', ['java.'])
117    self.assert_match_ojluni_classname('java.', [
118        'java.lang.',
119        'java.math.',
120    ])
121
122    self.assert_match_ojluni_classname('java.lang.', [
123        'java.lang.String',
124        'java.lang.StringBuilder',
125        'java.lang.package-info',
126    ])
127    self.assert_match_ojluni_classname('java.lang.String', [
128        'java.lang.String',
129        'java.lang.StringBuilder',
130    ])
131    self.assert_match_ojluni_classname('java.lang.StringB', [
132        'java.lang.StringBuilder',
133    ])
134
135    self.assert_match_ojluni_classname('java.math.', [
136        'java.math.BigInteger',
137    ])
138    self.assert_match_ojluni_classname('java.math.BigInteger', [
139        'java.math.BigInteger',
140    ])
141    self.assert_match_ojluni_classname('test.java.math.BigInteger.', [
142        'test.java.math.BigInteger.BigIntegerTest',
143    ])
144
145  def assert_match_ojluni_classname(self, path_prefix: str,
146                                    expected: List[str]):
147    result = self.ojluni_finder.match_classname_prefix(path_prefix)
148    self.assertEqual(set(expected), set(result))
149
150
151class OpenJdkFinderTest(unittest.TestCase):
152
153  def setUp(self):
154    super().setUp()
155    self.repo = Repo(LIBCORE_DIR.as_posix())
156    commit = self.repo.commit('jdk11u/jdk-11.0.13-ga')
157    self.finder = OpenjdkFinder(commit)
158
159  def tearDown(self):
160    super().tearDown()
161    self.repo.close()
162
163  def test_translate_src_path_to_ojluni_path(self):
164    self.assertEqual(
165        'ojluni/src/main/java/java/lang/String.java',
166        OpenjdkFinder.translate_src_path_to_ojluni_path(
167            'src/java.base/share/classes/java/lang/String.java'))
168    self.assertEqual(
169        'ojluni/src/test/java/math/BigInteger/BigIntegerTest.java',
170        OpenjdkFinder.translate_src_path_to_ojluni_path(
171            'test/jdk/java/math/BigInteger/BigIntegerTest.java'))
172
173  def test_find_src_path_from_classname(self):
174    self.assertEqual(
175        'src/java.base/share/classes/java/lang/String.java',
176        self.finder.find_src_path_from_classname('java.lang.String'))
177    self.assertEqual(
178        'test/jdk/java/math/BigInteger/BigIntegerTest.java',
179        self.finder.find_src_path_from_classname(
180            'java.math.BigInteger.BigIntegerTest'))
181
182  def test_find_src_path_from_ojluni_path(self):
183    self.assertEqual(
184        'src/java.base/share/classes/java/lang/String.java',
185        self.finder.find_src_path_from_ojluni_path(
186            'ojluni/src/main/java/java/lang/String.java'))
187    self.assertEqual(
188        'test/jdk/java/math/BigInteger/BigIntegerTest.java',
189        self.finder.find_src_path_from_ojluni_path(
190            'ojluni/src/test/java/math/BigInteger/BigIntegerTest.java'))
191    self.assertEqual(
192        'src/java.base/unix/classes/sun/nio/fs/UnixPath.java',
193        self.finder.find_src_path_from_ojluni_path(
194            'ojluni/src/main/java/sun/nio/fs/UnixPath.java'))
195    self.assertEqual(
196        'src/java.sql/share/classes/java/sql/Array.java',
197        self.finder.find_src_path_from_ojluni_path(
198            'ojluni/src/main/java/java/sql/Array.java'))
199    self.assertEqual(
200        'src/java.logging/share/classes/java/util/logging/Formatter.java',
201        self.finder.find_src_path_from_ojluni_path(
202            'ojluni/src/main/java/java/util/logging/Formatter.java'))
203
204  def test_match_path_prefix(self):
205    self.assert_match_path_prefix([
206        'src/java.base/share/classes/java/',
207        'src/java.base/share/classes/javax/',
208    ], 'src/java.base/share/classes/java')
209    self.assert_match_path_prefix([
210        'src/java.base/share/classes/java/io/',
211        'src/java.base/share/classes/java/lang/',
212        'src/java.base/share/classes/java/math/',
213        'src/java.base/share/classes/java/net/',
214        'src/java.base/share/classes/java/nio/',
215        'src/java.base/share/classes/java/security/',
216        'src/java.base/share/classes/java/text/',
217        'src/java.base/share/classes/java/time/',
218        'src/java.base/share/classes/java/util/',
219    ], 'src/java.base/share/classes/java/')
220    self.assert_match_path_prefix([
221        'src/java.base/share/classes/java/lang/StringBuffer.java',
222        'src/java.base/share/classes/java/lang/StringIndexOutOfBoundsException.java',
223        'src/java.base/share/classes/java/lang/StringUTF16.java',
224        'src/java.base/share/classes/java/lang/String.java',
225        'src/java.base/share/classes/java/lang/StringConcatHelper.java',
226        'src/java.base/share/classes/java/lang/StringLatin1.java',
227        'src/java.base/share/classes/java/lang/StringBuilder.java',
228        'src/java.base/share/classes/java/lang/StringCoding.java',
229    ], 'src/java.base/share/classes/java/lang/String')
230    self.assert_match_path_prefix([
231        'test/jdk/java/math/BigInteger/BigIntegerTest.java',
232    ], 'test/jdk/java/math/BigInteger/BigInteger')
233
234  def assert_match_path_prefix(self, expected: List[str], prefix: str):
235    result = self.finder.match_path_prefix(prefix)
236    self.assertEqual(set(expected), set(result))
237
238  def test_match_classname_prefix(self):
239    self.assert_match_classname_prefix([
240        'java.',
241        'javax.',
242    ], 'java')
243    self.assert_match_classname_prefix([
244        'java.rmi.',
245        'java.math.',
246        'java.beans.',
247        'java.security.',
248        'java.util.',
249        'java.io.',
250        'java.lang.',
251        'java.nio.',
252        'java.awt.',
253        'java.sql.',
254        'java.text.',
255        'java.time.',
256        'java.net.',
257    ], 'java.')
258    self.assert_match_classname_prefix(
259        [
260            'java.math.BigInteger',
261            'java.math.BigInteger.',  # test package
262        ],
263        'java.math.BigInteger')
264    self.assert_match_classname_prefix([
265        'java.math.BigInteger.PrimitiveConversionTests',
266        'java.math.BigInteger.CompareToTests',
267        'java.math.BigInteger.UnicodeConstructor',
268        'java.math.BigInteger.BigIntegerTest',
269        'java.math.BigInteger.TestValueExact',
270        'java.math.BigInteger.StringConstructorOverflow',
271        'java.math.BigInteger.ExtremeShiftingTests',
272        'java.math.BigInteger.DivisionOverflow',
273        'java.math.BigInteger.OperatorNpeTests',
274        'java.math.BigInteger.ModPow65537',
275        'java.math.BigInteger.LargeValueExceptions',
276        'java.math.BigInteger.ProbablePrime',
277        'java.math.BigInteger.BitLengthOverflow',
278        'java.math.BigInteger.StringConstructor',
279        'java.math.BigInteger.PrimeTest',
280        'java.math.BigInteger.ModPow',
281        'java.math.BigInteger.ModInvTime',
282        'java.math.BigInteger.DoubleValueOverflow',
283        'java.math.BigInteger.SymmetricRangeTests',
284        'java.math.BigInteger.ModPowPowersof2',
285    ], 'java.math.BigInteger.')
286
287  def assert_match_classname_prefix(self, expected: List[str], prefix: str):
288    result = self.finder.match_classname_prefix(prefix)
289    self.assertEqual(set(expected), set(result))
290
291
292if __name__ == '__main__':
293  unittest.main()
294