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