1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. 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 package org.apache.harmony.luni.tests.java.lang; 18 19 import java.io.File; 20 import java.io.InputStream; 21 import java.net.URL; 22 import java.net.URLClassLoader; 23 24 import tests.support.resource.Support_Resources; 25 26 public class PackageTest extends junit.framework.TestCase { 27 28 private File resources; 29 30 private String resPath; 31 32 Package getTestPackage(String resourceJar, String className) 33 throws Exception { 34 Support_Resources.copyFile(resources, "Package", resourceJar); 35 URL resourceURL = new URL("file:/" + resPath + "/Package/" 36 + resourceJar); 37 38 URLClassLoader ucl = new URLClassLoader(new URL[] { resourceURL }, null); 39 return Class.forName(className, true, ucl).getPackage(); 40 } 41 42 @Override 43 protected void setUp() { 44 resources = Support_Resources.createTempFolder(); 45 resPath = resources.toString(); 46 if (resPath.charAt(0) == '/' || resPath.charAt(0) == '\\') 47 resPath = resPath.substring(1); 48 } 49 50 /** 51 * There is a newer version of this class with some actual tests but since 52 * the class is not implemented they all fail. For now use the stub test 53 * methods. 54 */ 55 56 /** 57 * @tests java.lang.Package#getImplementationVendor() 58 * @tests java.lang.Package#getImplementationVersion() 59 * @tests java.lang.Package#getSpecificationTitle() 60 * @tests java.lang.Package#getSpecificationVendor() 61 * @tests java.lang.Package#getSpecificationVersion() 62 * @tests java.lang.Package#getImplementationTitle() 63 */ 64 public void test_helper_Attributes() throws Exception { 65 66 Package p = getTestPackage("hyts_all_attributes.jar", "p.C"); 67 assertEquals( 68 "Package getImplementationTitle returns a wrong string (1)", 69 "p Implementation-Title", p.getImplementationTitle()); 70 assertEquals( 71 "Package getImplementationVendor returns a wrong string (1)", 72 "p Implementation-Vendor", p.getImplementationVendor()); 73 assertEquals( 74 "Package getImplementationVersion returns a wrong string (1)", 75 "2.2.2", p.getImplementationVersion()); 76 assertEquals( 77 "Package getSpecificationTitle returns a wrong string (1)", 78 "p Specification-Title", p.getSpecificationTitle()); 79 assertEquals( 80 "Package getSpecificationVendor returns a wrong string (1)", 81 "p Specification-Vendor", p.getSpecificationVendor()); 82 assertEquals( 83 "Package getSpecificationVersion returns a wrong string (1)", 84 "2.2.2", p.getSpecificationVersion()); 85 86 // No entry for the package 87 Package p2 = getTestPackage("hyts_no_entry.jar", "p.C"); 88 assertEquals( 89 "Package getImplementationTitle returns a wrong string (2)", 90 "MF Implementation-Title", p2.getImplementationTitle()); 91 assertEquals( 92 "Package getImplementationVendor returns a wrong string (2)", 93 "MF Implementation-Vendor", p2.getImplementationVendor()); 94 assertEquals( 95 "Package getImplementationVersion returns a wrong string (2)", 96 "5.3.b1", p2.getImplementationVersion()); 97 assertEquals( 98 "Package getSpecificationTitle returns a wrong string (2)", 99 "MF Specification-Title", p2.getSpecificationTitle()); 100 assertEquals( 101 "Package getSpecificationVendor returns a wrong string (2)", 102 "MF Specification-Vendor", p2.getSpecificationVendor()); 103 assertEquals( 104 "Package getSpecificationVersion returns a wrong string (2)", 105 "1.2.3", p2.getSpecificationVersion()); 106 107 // No attributes in the package entry 108 Package p3 = getTestPackage("hyts_no_attributes.jar", "p.C"); 109 assertEquals( 110 "Package getImplementationTitle returns a wrong string (3)", 111 "MF Implementation-Title", p3.getImplementationTitle()); 112 assertEquals( 113 "Package getImplementationVendor returns a wrong string (3)", 114 "MF Implementation-Vendor", p3.getImplementationVendor()); 115 assertEquals( 116 "Package getImplementationVersion returns a wrong string (3)", 117 "5.3.b1", p3.getImplementationVersion()); 118 assertEquals( 119 "Package getSpecificationTitle returns a wrong string (3)", 120 "MF Specification-Title", p3.getSpecificationTitle()); 121 assertEquals( 122 "Package getSpecificationVendor returns a wrong string (3)", 123 "MF Specification-Vendor", p3.getSpecificationVendor()); 124 assertEquals( 125 "Package getSpecificationVersion returns a wrong string (3)", 126 "1.2.3", p3.getSpecificationVersion()); 127 128 // Some attributes in the package entry 129 Package p4 = getTestPackage("hyts_some_attributes.jar", "p.C"); 130 assertEquals( 131 "Package getImplementationTitle returns a wrong string (4)", 132 "p Implementation-Title", p4.getImplementationTitle()); 133 assertEquals( 134 "Package getImplementationVendor returns a wrong string (4)", 135 "MF Implementation-Vendor", p4.getImplementationVendor()); 136 assertEquals( 137 "Package getImplementationVersion returns a wrong string (4)", 138 "2.2.2", p4.getImplementationVersion()); 139 assertEquals( 140 "Package getSpecificationTitle returns a wrong string (4)", 141 "MF Specification-Title", p4.getSpecificationTitle()); 142 assertEquals( 143 "Package getSpecificationVendor returns a wrong string (4)", 144 "p Specification-Vendor", p4.getSpecificationVendor()); 145 assertEquals( 146 "Package getSpecificationVersion returns a wrong string (4)", 147 "2.2.2", p4.getSpecificationVersion()); 148 149 // subdirectory Package 150 Package p5 = getTestPackage("hyts_pq.jar", "p.q.C"); 151 assertEquals( 152 "Package getImplementationTitle returns a wrong string (5)", 153 "p Implementation-Title", p5.getImplementationTitle()); 154 assertEquals( 155 "Package getImplementationVendor returns a wrong string (5)", 156 "p Implementation-Vendor", p5.getImplementationVendor()); 157 assertEquals( 158 "Package getImplementationVersion returns a wrong string (5)", 159 "1.1.3", p5.getImplementationVersion()); 160 assertEquals( 161 "Package getSpecificationTitle returns a wrong string (5)", 162 "p Specification-Title", p5.getSpecificationTitle()); 163 assertEquals( 164 "Package getSpecificationVendor returns a wrong string (5)", 165 "p Specification-Vendor", p5.getSpecificationVendor()); 166 assertEquals( 167 "Package getSpecificationVersion returns a wrong string (5)", 168 "2.2.0.0.0.0.0.0.0.0.0", p5.getSpecificationVersion()); 169 } 170 171 /** 172 * @tests java.lang.Package#getName() 173 */ 174 public void test_getName() throws Exception { 175 Package p = getTestPackage("hyts_pq.jar", "p.q.C"); 176 assertEquals("Package getName returns a wrong string", "p.q", p 177 .getName()); 178 } 179 180 /** 181 * @tests java.lang.Package#getPackage(java.lang.String) 182 */ 183 public void test_getPackageLjava_lang_String() { 184 assertSame("Package getPackage failed for java.lang", Package 185 .getPackage("java.lang"), Package.getPackage("java.lang")); 186 187 assertSame("Package getPackage failed for java.lang", Package 188 .getPackage("java.lang"), Object.class.getPackage()); 189 } 190 191 /** 192 * @tests java.lang.Package#getPackages() 193 */ 194 public void test_getPackages() throws Exception { 195 Package[] pckgs = Package.getPackages(); 196 boolean found = false; 197 for (int i = 0; i < pckgs.length; i++) { 198 if (pckgs[i].getName().equals("java.util")) { 199 found = true; 200 break; 201 } 202 } 203 assertTrue("Package getPackages failed to retrieve a package", found); 204 } 205 206 /** 207 * @tests java.lang.Package#hashCode() 208 */ 209 public void test_hashCode() { 210 Package p1 = Package.getPackage("java.lang"); 211 if (p1 != null) { 212 assertEquals(p1.hashCode(), "java.lang".hashCode()); 213 } 214 } 215 216 /** 217 * @tests java.lang.Package#isCompatibleWith(java.lang.String) 218 */ 219 public void test_isCompatibleWithLjava_lang_String() throws Exception { 220 Package p = getTestPackage("hyts_c.jar", "p.C"); 221 222 assertTrue("Package isCompatibleWith fails with lower version", p 223 .isCompatibleWith("2.1.9.9")); 224 assertTrue("Package isCompatibleWith fails with same version (1)", p 225 .isCompatibleWith("2.2.0")); 226 assertTrue("Package isCompatibleWith fails with same version (2)", p 227 .isCompatibleWith("2.2")); 228 assertFalse("Package isCompatibleWith fails with higher version", p 229 .isCompatibleWith("2.2.0.0.1")); 230 try { 231 p.isCompatibleWith(null); 232 fail("Null version is illegal"); 233 } catch (NumberFormatException ok) { 234 } catch (NullPointerException compatible) { 235 /* 236 * RI throws NPE instead of NFE... 237 */ 238 } 239 240 try { 241 p.isCompatibleWith(""); 242 fail("Empty version is illegal"); 243 } catch (NumberFormatException ok) {} 244 try { 245 p.isCompatibleWith("."); 246 fail("'.' version is illegal"); 247 } catch (NumberFormatException ok) {} 248 try { 249 p.isCompatibleWith("1.2."); 250 fail("'1.2.' version is illegal"); 251 } catch (NumberFormatException ok) {} 252 try { 253 p.isCompatibleWith(".9"); 254 fail("'.9' version is illegal"); 255 } catch (NumberFormatException ok) {} 256 try { 257 p.isCompatibleWith("2.4..5"); 258 fail("'2.4..5' version is illegal"); 259 } catch (NumberFormatException ok) {} 260 try { 261 p.isCompatibleWith("20.-4"); 262 fail("'20.-4' version is illegal"); 263 } catch (NumberFormatException ok) {} 264 } 265 266 /** 267 * @tests java.lang.Package#isSealed() 268 */ 269 public void test_isSealed() throws Exception { 270 Package p = getTestPackage("hyts_pq.jar", "p.q.C"); 271 assertTrue("Package isSealed returns wrong boolean", p.isSealed()); 272 } 273 274 /** 275 * @tests java.lang.Package#isSealed(java.net.URL) 276 */ 277 public void test_isSealedLjava_net_URL() throws Exception { 278 Package p = getTestPackage("hyts_c.jar", "p.C"); 279 assertFalse("Package isSealed returns wrong boolean (1)", p 280 .isSealed(new URL("file:/" + resPath + "/"))); 281 assertTrue("Package isSealed returns wrong boolean (2)", p 282 .isSealed(new URL("file:/" + resPath + "/Package/hyts_c.jar"))); 283 } 284 285 /** 286 * @tests java.lang.Package#toString() 287 */ 288 public void test_toString() throws Exception { 289 Package p = getTestPackage("hyts_c.jar", "p.C"); 290 assertTrue("Package toString returns wrong string", p.toString() 291 .length() > 0); 292 } 293 294 public void test_SealedPackage_forName() throws Exception { 295 Support_Resources.copyFile(resources, "Package", "hyts_c.jar"); 296 Support_Resources.copyFile(resources, "Package", "hyts_d.jar"); 297 Support_Resources.copyFile(resources, "Package", "hyts_d1.jar"); 298 Support_Resources.copyFile(resources, "Package", "hyts_d2.jar"); 299 300 URL resourceURL1 = new URL("file:/" + resPath + "/Package/hyts_c.jar"); 301 URL resourceURL2 = new URL("file:/" + resPath + "/Package/hyts_d.jar"); 302 URL resourceURL3 = new URL("file:/" + resPath + "/Package/hyts_d1.jar"); 303 URL resourceURL4 = new URL("file:/" + resPath + "/Package/hyts_d2.jar"); 304 URL resourceURL5 = new URL("file:/" + resPath + "/"); 305 306 URLClassLoader uclClassLoader; 307 // load from the sealed jar, then an unsealed jar with no manifest 308 uclClassLoader = new java.net.URLClassLoader(new URL[] { resourceURL1, 309 resourceURL2 }, null); 310 Class.forName("p.C", true, uclClassLoader); 311 try { 312 Class.forName("p.D", true, uclClassLoader); 313 fail("should throw SecurityException"); 314 } catch (SecurityException e) { 315 // Expected 316 } 317 318 // setup for next test 319 Support_Resources.copyFile(resources, "p", ""); 320 InputStream in = uclClassLoader.getResourceAsStream("p/D.class"); 321 Support_Resources.copyLocalFileTo(new File(resources.toString(), 322 "p/D.class"), in); 323 324 // load from a sealed jar, then the directory 325 uclClassLoader = new java.net.URLClassLoader(new URL[] { resourceURL1, 326 resourceURL5 }, null); 327 Class.forName("p.C", true, uclClassLoader); 328 try { 329 Class.forName("p.D", true, uclClassLoader); 330 fail("should throw SecurityException"); 331 } catch (SecurityException e) { 332 // Expected 333 } 334 335 // load from a directory, then the sealed jar 336 uclClassLoader = new java.net.URLClassLoader(new URL[] { resourceURL1, 337 resourceURL5 }, null); 338 Class.forName("p.D", true, uclClassLoader); 339 try { 340 Class.forName("p.C", true, uclClassLoader); 341 fail("should throw SecurityException"); 342 } catch (SecurityException e) { 343 // Expected 344 } 345 346 // load from an unsealed jar with no manifest, then the sealed jar 347 uclClassLoader = new java.net.URLClassLoader(new URL[] { resourceURL1, 348 resourceURL2 }, null); 349 Class.forName("p.D", true, uclClassLoader); 350 try { 351 Class.forName("p.C", true, uclClassLoader); 352 fail("should throw SecurityException"); 353 } catch (SecurityException e) { 354 // Expected 355 } 356 357 // load from an unsealed jar with a manifest, then the sealed jar 358 uclClassLoader = new java.net.URLClassLoader(new URL[] { resourceURL1, 359 resourceURL3 }, null); 360 Class.forName("p.C", true, uclClassLoader); 361 try { 362 Class.forName("p.D", true, uclClassLoader); 363 fail("should throw SecurityException"); 364 } catch (SecurityException e) { 365 // Expected 366 } 367 368 // load from an sealed jar, then the unsealed jar with a manifest 369 uclClassLoader = new java.net.URLClassLoader(new URL[] { resourceURL1, 370 resourceURL3 }, null); 371 Class.forName("p.D", true, uclClassLoader); 372 try { 373 Class.forName("p.C", true, uclClassLoader); 374 fail("should throw SecurityException"); 375 } catch (SecurityException e) { 376 // Expected 377 } 378 379 // load from the sealed jar, then another sealed jar 380 uclClassLoader = new java.net.URLClassLoader(new URL[] { resourceURL1, 381 resourceURL4 }, null); 382 Class.forName("p.C", true, uclClassLoader); 383 try { 384 Class.forName("p.D", true, uclClassLoader); 385 fail("should throw SecurityException"); 386 } catch (SecurityException e) { 387 // Expected 388 } 389 } 390 } 391