Home | History | Annotate | Download | only in lang
      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