Home | History | Annotate | Download | only in jar
      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.tests.java.util.jar;
     18 
     19 import java.io.ByteArrayInputStream;
     20 import java.io.ByteArrayOutputStream;
     21 import java.io.File;
     22 import java.io.IOException;
     23 import java.io.InputStream;
     24 import java.net.URL;
     25 import java.util.Map;
     26 import java.util.jar.Attributes;
     27 import java.util.jar.JarFile;
     28 import java.util.jar.Manifest;
     29 
     30 import junit.framework.TestCase;
     31 
     32 import tests.support.resource.Support_Resources;
     33 
     34 public class ManifestTest extends TestCase {
     35 
     36     private final String JAR_NAME = "hyts_patch.jar";
     37 
     38     private final String ATT_JAR_NAME = "hyts_att.jar";
     39 
     40     private final String ATT_ENTRY_NAME = "HasAttributes.txt";
     41 
     42     private final String ATT_ATT_NAME = "MyAttribute";
     43 
     44     private final String MANIFEST_NAME = "manifest/hyts_MANIFEST.MF";
     45 
     46     private static final String MANIFEST_CONTENTS = "Manifest-Version: 1.0\nBundle-Name: ClientSupport\nBundle-Description: Provides SessionService, AuthenticationService. Extends RegistryService.\nBundle-Activator: com.ibm.ive.eccomm.client.support.ClientSupportActivator\nImport-Package: com.ibm.ive.eccomm.client.services.log,\n com.ibm.ive.eccomm.client.services.registry,\n com.ibm.ive.eccomm.service.registry; specification-version=1.0.0,\n com.ibm.ive.eccomm.service.session; specification-version=1.0.0,\n com.ibm.ive.eccomm.service.framework; specification-version=1.2.0,\n org.osgi.framework; specification-version=1.0.0,\n org.osgi.service.log; specification-version=1.0.0,\n com.ibm.ive.eccomm.flash; specification-version=1.2.0,\n com.ibm.ive.eccomm.client.xml,\n com.ibm.ive.eccomm.client.http.common,\n com.ibm.ive.eccomm.client.http.client\nImport-Service: org.osgi.service.log.LogReaderService\n org.osgi.service.log.LogService,\n com.ibm.ive.eccomm.service.registry.RegistryService\nExport-Package: com.ibm.ive.eccomm.client.services.authentication; specification-version=1.0.0,\n com.ibm.ive.eccomm.service.authentication; specification-version=1.0.0,\n com.ibm.ive.eccomm.common; specification-version=1.0.0,\n com.ibm.ive.eccomm.client.services.registry.store; specification-version=1.0.0\nExport-Service: com.ibm.ive.eccomm.service.authentication.AuthenticationService,\n com.ibm.ive.eccomm.service.session.SessionService\nBundle-Vendor: IBM\nBundle-Version: 1.2.0\n";
     47 
     48     private static final String MANIFEST_CONTENTS_1 = "Manifest-Version: 2.0\nBundle-Name: ClientSupport\nBundle-Description: Provides SessionService, AuthenticationService. Extends RegistryService.\nBundle-Activator: com.ibm.ive.eccomm.client.support.ClientSupportActivator\nImport-Package: com.ibm.ive.eccomm.client.services.log,\n com.ibm.ive.eccomm.client.services.registry,\n com.ibm.ive.eccomm.service.registry; specification-version=2.0.0,\n com.ibm.ive.eccomm.service.session; specification-version=2.0.0,\n com.ibm.ive.eccomm.service.framework; specification-version=2.1.0,\n org.osgi.framework; specification-version=2.0.0,\n org.osgi.service.log; specification-version=2.0.0,\n com.ibm.ive.eccomm.flash; specification-version=2.2.0,\n com.ibm.ive.eccomm.client.xml,\n com.ibm.ive.eccomm.client.http.common,\n com.ibm.ive.eccomm.client.http.client\nImport-Service: org.osgi.service.log.LogReaderService\n org.osgi.service.log.LogService,\n com.ibm.ive.eccomm.service.registry.RegistryService\nExport-Package: com.ibm.ive.eccomm.client.services.authentication; specification-version=1.0.0,\n com.ibm.ive.eccomm.service.authentication; specification-version=1.0.0,\n com.ibm.ive.eccomm.common; specification-version=1.0.0,\n com.ibm.ive.eccomm.client.services.registry.store; specification-version=1.0.0\nExport-Service: com.ibm.ive.eccomm.service.authentication.AuthenticationService,\n com.ibm.ive.eccomm.service.session.SessionService\nBundle-Vendor: IBM\nBundle-Version: 1.2.0\n";
     49 
     50     private static final String MANIFEST_CONTENTS_2 = "Manifest-Version: 1.0\nName: value\n \n"; // Note penultimate line is single space
     51 
     52     private File resources;
     53 
     54     @Override
     55     protected void setUp() {
     56         resources = Support_Resources.createTempFolder();
     57     }
     58 
     59     private Manifest getManifest(String fileName) {
     60         try {
     61             Support_Resources.copyFile(resources, null, fileName);
     62             JarFile jarFile = new JarFile(new File(resources, fileName));
     63             Manifest m = jarFile.getManifest();
     64             jarFile.close();
     65             return m;
     66         } catch (Exception e) {
     67             fail("Exception during setup: " + e.toString());
     68             return null;
     69         }
     70     }
     71 
     72     /**
     73      * java.util.jar.Manifest#Manifest()
     74      */
     75     public void testConstructor() {
     76         // Test for method java.util.jar.Manifest()
     77         Manifest emptyManifest = new Manifest();
     78         assertTrue("Should have no entries", emptyManifest.getEntries()
     79                 .isEmpty());
     80         assertTrue("Should have no main attributes", emptyManifest
     81                 .getMainAttributes().isEmpty());
     82     }
     83 
     84     /**
     85      * java.util.jar.Manifest#Manifest(java.util.jar.Manifest)
     86      */
     87     public void testCopyingConstructor() throws IOException {
     88         Manifest firstManifest = new Manifest(new ByteArrayInputStream(
     89                 MANIFEST_CONTENTS.getBytes("ISO-8859-1")));
     90         Manifest secondManifest = new Manifest(firstManifest);
     91         assertEquals(firstManifest, secondManifest);
     92     }
     93 
     94     private void assertAttribute(Attributes attr, String name, String value) {
     95         assertEquals("Incorrect " + name, value, attr.getValue(name));
     96     }
     97 
     98     private void checkManifest(Manifest manifest) {
     99         Attributes main = manifest.getMainAttributes();
    100         assertAttribute(main, "Bundle-Name", "ClientSupport");
    101         assertAttribute(main, "Bundle-Description",
    102                 "Provides SessionService, AuthenticationService. Extends RegistryService.");
    103         assertAttribute(main, "Bundle-Activator",
    104                 "com.ibm.ive.eccomm.client.support.ClientSupportActivator");
    105         assertAttribute(
    106                 main,
    107                 "Import-Package",
    108                 "com.ibm.ive.eccomm.client.services.log,com.ibm.ive.eccomm.client.services.registry,com.ibm.ive.eccomm.service.registry; specification-version=1.0.0,com.ibm.ive.eccomm.service.session; specification-version=1.0.0,com.ibm.ive.eccomm.service.framework; specification-version=1.2.0,org.osgi.framework; specification-version=1.0.0,org.osgi.service.log; specification-version=1.0.0,com.ibm.ive.eccomm.flash; specification-version=1.2.0,com.ibm.ive.eccomm.client.xml,com.ibm.ive.eccomm.client.http.common,com.ibm.ive.eccomm.client.http.client");
    109         assertAttribute(
    110                 main,
    111                 "Import-Service",
    112                 "org.osgi.service.log.LogReaderServiceorg.osgi.service.log.LogService,com.ibm.ive.eccomm.service.registry.RegistryService");
    113         assertAttribute(
    114                 main,
    115                 "Export-Package",
    116                 "com.ibm.ive.eccomm.client.services.authentication; specification-version=1.0.0,com.ibm.ive.eccomm.service.authentication; specification-version=1.0.0,com.ibm.ive.eccomm.common; specification-version=1.0.0,com.ibm.ive.eccomm.client.services.registry.store; specification-version=1.0.0");
    117         assertAttribute(
    118                 main,
    119                 "Export-Service",
    120                 "com.ibm.ive.eccomm.service.authentication.AuthenticationService,com.ibm.ive.eccomm.service.session.SessionService");
    121         assertAttribute(main, "Bundle-Vendor", "IBM");
    122         assertAttribute(main, "Bundle-Version", "1.2.0");
    123     }
    124 
    125     /**
    126      * java.util.jar.Manifest#Manifest(java.io.InputStream)
    127      */
    128     public void testStreamConstructor() throws IOException {
    129         Manifest m = getManifest(ATT_JAR_NAME);
    130         ByteArrayOutputStream baos = new ByteArrayOutputStream();
    131         m.write(baos);
    132         InputStream is = new ByteArrayInputStream(baos.toByteArray());
    133         Manifest mCopy = new Manifest(is);
    134         assertEquals(m, mCopy);
    135 
    136         Manifest manifest = new Manifest(new ByteArrayInputStream(
    137                 MANIFEST_CONTENTS.getBytes("ISO-8859-1")));
    138         checkManifest(manifest);
    139 
    140         // regression test for HARMONY-5424
    141         String manifestContent = "Manifest-Version: 1.0\nCreated-By: Apache\nPackage: \nBuild-Jdk: 1.4.1_01\n\n"
    142                 + "Name: \nSpecification-Title: foo\nSpecification-Version: 1.0\nSpecification-Vendor: \n"
    143                 + "Implementation-Title: \nImplementation-Version: 1.0\nImplementation-Vendor: \n\n";
    144         ByteArrayInputStream bis = new ByteArrayInputStream(manifestContent
    145                 .getBytes("ISO-8859-1"));
    146 
    147 
    148         Manifest mf = new Manifest(bis);
    149         assertEquals("Should be 4 main attributes", 4, mf.getMainAttributes()
    150                 .size());
    151 
    152         Map<String, Attributes> entries = mf.getEntries();
    153         assertEquals("Should be one named entry", 1, entries.size());
    154 
    155         Attributes namedEntryAttributes = (Attributes) (entries.get(""));
    156         assertEquals("Should be 6 named entry attributes", 6,
    157                 namedEntryAttributes.size());
    158 
    159         // Regression test for HARMONY-6669
    160         new Manifest(new ByteArrayInputStream(
    161                 MANIFEST_CONTENTS_2.getBytes("ISO-8859-1")));
    162     }
    163 
    164     /**
    165      * java.util.jar.Manifest#clear()
    166      */
    167     public void testClear() {
    168         Manifest m = getManifest(ATT_JAR_NAME);
    169         m.clear();
    170         assertTrue("Should have no entries", m.getEntries().isEmpty());
    171         assertTrue("Should have no main attributes", m.getMainAttributes()
    172                 .isEmpty());
    173     }
    174 
    175     /**
    176      * java.util.jar.Manifest#clone()
    177      */
    178     public void testClone() {
    179         Manifest m = getManifest(JAR_NAME);
    180         assertEquals(m, m.clone());
    181     }
    182 
    183     /**
    184      * java.util.jar.Manifest#equals(java.lang.Object)
    185      */
    186     public void testEquals() throws IOException {
    187         Manifest firstManifest = new Manifest(new ByteArrayInputStream(
    188                 MANIFEST_CONTENTS.getBytes("ISO-8859-1")));
    189         Manifest secondManifest = new Manifest(new ByteArrayInputStream(
    190                 MANIFEST_CONTENTS.getBytes("ISO-8859-1")));
    191 
    192         assertEquals(firstManifest, secondManifest);
    193 
    194         Manifest thirdManifest = new Manifest(new ByteArrayInputStream(
    195                 MANIFEST_CONTENTS_1.getBytes("ISO-8859-1")));
    196         assertNotSame(firstManifest, thirdManifest);
    197 
    198         firstManifest = null;
    199         assertFalse(secondManifest.equals(firstManifest));
    200         assertFalse(secondManifest.equals(new String("abc"))); //non Manifest Object
    201     }
    202 
    203     /**
    204      * java.util.jar.Manifest#hashCode()
    205      */
    206     public void testHashCode() {
    207         Manifest m = getManifest(JAR_NAME);
    208         assertEquals(m.hashCode(), m.clone().hashCode());
    209     }
    210 
    211     /**
    212      * java.util.jar.Manifest#getAttributes(java.lang.String)
    213      */
    214     public void testGetAttributes() {
    215         Manifest m = getManifest(ATT_JAR_NAME);
    216         assertNull("Should not exist", m.getAttributes("Doesn't Exist"));
    217         assertEquals("Should exist", "OK", m.getAttributes(ATT_ENTRY_NAME).get(
    218                 new Attributes.Name(ATT_ATT_NAME)));
    219     }
    220 
    221     /**
    222      * java.util.jar.Manifest#getEntries()
    223      */
    224     public void testGetEntries() {
    225         Manifest m = getManifest(ATT_JAR_NAME);
    226         Map<String, Attributes> myMap = m.getEntries();
    227         assertNull("Shouldn't exist", myMap.get("Doesn't exist"));
    228         assertEquals("Should exist", "OK", myMap.get(ATT_ENTRY_NAME).get(
    229                 new Attributes.Name(ATT_ATT_NAME)));
    230     }
    231 
    232     /**
    233      * java.util.jar.Manifest#getMainAttributes()
    234      */
    235     public void testGetMainAttributes() {
    236         Manifest m = getManifest(JAR_NAME);
    237         Attributes a = m.getMainAttributes();
    238         assertEquals("Manifest_Version should return 1.0", "1.0", a
    239                 .get(Attributes.Name.MANIFEST_VERSION));
    240     }
    241 
    242     /**
    243      * {@link java.util.jar.Manifest#write(java.io.OutputStream)
    244      */
    245     public void testWrite() throws IOException {
    246         ByteArrayOutputStream baos = new ByteArrayOutputStream();
    247         Manifest m = getManifest(JAR_NAME);
    248         // maximum allowed length is 72 for a header, colon and a following
    249         // space
    250         StringBuffer headerName = new StringBuffer(71);
    251         headerName.append("Manifest-");
    252         while (headerName.length() < 70) {
    253             headerName.append("0");
    254         }
    255         m.getMainAttributes().put(new Attributes.Name(headerName.toString()),
    256                 "Value");
    257         m.write(baos); // ok
    258     }
    259 
    260     /**
    261      * Ensures compatibility with manifests produced by gcc.
    262      *
    263      * @see <a
    264      *      href="http://issues.apache.org/jira/browse/HARMONY-5662">HARMONY-5662</a>
    265      */
    266     public void testNul() throws IOException {
    267         String manifestContent =
    268                 "Manifest-Version: 1.0\nCreated-By: nasty gcc tool\n\n\0";
    269 
    270         byte[] bytes = manifestContent.getBytes("ISO-8859-1");
    271         new Manifest(new ByteArrayInputStream(bytes)); // the last NUL is ok
    272 
    273         bytes[bytes.length - 1] = 26;
    274         new Manifest(new ByteArrayInputStream(bytes)); // the last EOF is ok
    275 
    276         bytes[bytes.length - 1] = 'A'; // the last line ignored
    277         new Manifest(new ByteArrayInputStream(bytes));
    278 
    279         bytes[2] = 0; // NUL char in Manifest
    280         try {
    281             new Manifest(new ByteArrayInputStream(bytes));
    282             fail("IOException expected");
    283         } catch (IOException e) {
    284             // desired
    285         }
    286     }
    287 
    288     public void testDecoding() throws IOException {
    289         Manifest m = getManifest(ATT_JAR_NAME);
    290         final byte[] bVendor = new byte[] { (byte) 0xd0, (byte) 0x9C,
    291                 (byte) 0xd0, (byte) 0xb8, (byte) 0xd0, (byte) 0xbb,
    292                 (byte) 0xd0, (byte) 0xb0, (byte) 0xd1, (byte) 0x8f, ' ',
    293                 (byte) 0xd0, (byte) 0xb4, (byte) 0xd0, (byte) 0xbe,
    294                 (byte) 0xd1, (byte) 0x87, (byte) 0xd1, (byte) 0x83,
    295                 (byte) 0xd0, (byte) 0xbd, (byte) 0xd1, (byte) 0x8C,
    296                 (byte) 0xd0, (byte) 0xba, (byte) 0xd0, (byte) 0xb0, ' ',
    297                 (byte) 0xd0, (byte) 0x9C, (byte) 0xd0, (byte) 0xb0,
    298                 (byte) 0xd1, (byte) 0x88, (byte) 0xd0, (byte) 0xb0 };
    299 
    300         final byte[] bSpec = new byte[] { (byte) 0xe1, (byte) 0x88,
    301                 (byte) 0xb0, (byte) 0xe1, (byte) 0x88, (byte) 0x8b,
    302                 (byte) 0xe1, (byte) 0x88, (byte) 0x9d, ' ', (byte) 0xe1,
    303                 (byte) 0x9a, (byte) 0xa0, (byte) 0xe1, (byte) 0x9a,
    304                 (byte) 0xb1, (byte) 0xe1, (byte) 0x9b, (byte) 0x81,
    305                 (byte) 0xe1, (byte) 0x9a, (byte) 0xa6, ' ', (byte) 0xd8,
    306                 (byte) 0xb3, (byte) 0xd9, (byte) 0x84, (byte) 0xd8,
    307                 (byte) 0xa7, (byte) 0xd9, (byte) 0x85, ' ', (byte) 0xd8,
    308                 (byte) 0xb9, (byte) 0xd8, (byte) 0xb3, (byte) 0xd9,
    309                 (byte) 0x84, (byte) 0xd8, (byte) 0xa7, (byte) 0xd9,
    310                 (byte) 0x85, (byte) 0xd8, (byte) 0xa9, ' ', (byte) 0xdc,
    311                 (byte) 0xab, (byte) 0xdc, (byte) 0xa0, (byte) 0xdc,
    312                 (byte) 0xa1, (byte) 0xdc, (byte) 0x90, ' ', (byte) 0xe0,
    313                 (byte) 0xa6, (byte) 0xb6, (byte) 0xe0, (byte) 0xa6,
    314                 (byte) 0xbe, (byte) 0xe0, (byte) 0xa6, (byte) 0xa8,
    315                 (byte) 0xe0, (byte) 0xa7, (byte) 0x8d, (byte) 0xe0,
    316                 (byte) 0xa6, (byte) 0xa4, (byte) 0xe0, (byte) 0xa6,
    317                 (byte) 0xbf, ' ', (byte) 0xd0, (byte) 0xa0, (byte) 0xd0,
    318                 (byte) 0xb5, (byte) 0xd0, (byte) 0xba, (byte) 0xd1,
    319                 (byte) 0x8a, (byte) 0xd0, (byte) 0xb5, (byte) 0xd0,
    320                 (byte) 0xbb, ' ', (byte) 0xd0, (byte) 0x9c, (byte) 0xd0,
    321                 (byte) 0xb8, (byte) 0xd1, (byte) 0x80, ' ', (byte) 0xe0,
    322                 (byte) 0xa6, (byte) 0xb6, (byte) 0xe0, (byte) 0xa6,
    323                 (byte) 0xbe, (byte) 0xe0, (byte) 0xa6, (byte) 0xa8,
    324                 (byte) 0xe0, (byte) 0xa7, (byte) 0x8d, (byte) 0xe0,
    325                 (byte) 0xa6, (byte) 0xa4, (byte) 0xe0, (byte) 0xa6,
    326                 (byte) 0xbf, ' ', (byte) 0xe0, (byte) 0xbd, (byte) 0x9e,
    327                 (byte) 0xe0, (byte) 0xbd, (byte) 0xb2, (byte) 0xe0,
    328                 (byte) 0xbc, (byte) 0x8b, (byte) 0xe0, (byte) 0xbd,
    329                 (byte) 0x96, (byte) 0xe0, (byte) 0xbd, (byte) 0x91,
    330                 (byte) 0xe0, (byte) 0xbd, (byte) 0xba, ' ', (byte) 0xd0,
    331                 (byte) 0x9c, (byte) 0xd0, (byte) 0xb0, (byte) 0xd1,
    332                 (byte) 0x88, (byte) 0xd0, (byte) 0xb0, (byte) 0xd1,
    333                 (byte) 0x80, ' ', (byte) 0xe1, (byte) 0x8f, (byte) 0x99,
    334                 (byte) 0xe1, (byte) 0x8e, (byte) 0xaf, (byte) 0xe1,
    335                 (byte) 0x8f, (byte) 0xb1, ' ', (byte) 0xcf, (byte) 0xa8,
    336                 (byte) 0xce, (byte) 0xb9, (byte) 0xcf, (byte) 0x81,
    337                 (byte) 0xce, (byte) 0xb7, (byte) 0xce, (byte) 0xbd,
    338                 (byte) 0xce, (byte) 0xb7, ' ', (byte) 0xde, (byte) 0x90,
    339                 (byte) 0xde, (byte) 0xaa, (byte) 0xde, (byte) 0x85,
    340                 (byte) 0xde, (byte) 0xa6, ' ', (byte) 0xe0, (byte) 0xbd,
    341                 (byte) 0x82, (byte) 0xe0, (byte) 0xbd, (byte) 0x9e,
    342                 (byte) 0xe0, (byte) 0xbd, (byte) 0xb2, (byte) 0xe0,
    343                 (byte) 0xbc, (byte) 0x8b, (byte) 0xe0, (byte) 0xbd,
    344                 (byte) 0x96, (byte) 0xe0, (byte) 0xbd, (byte) 0x91,
    345                 (byte) 0xe0, (byte) 0xbd, (byte) 0xba, ' ', (byte) 0xce,
    346                 (byte) 0x95, (byte) 0xce, (byte) 0xb9, (byte) 0xcf,
    347                 (byte) 0x81, (byte) 0xce, (byte) 0xae, (byte) 0xce,
    348                 (byte) 0xbd, (byte) 0xce, (byte) 0xb7, ' ', (byte) 0xd8,
    349                 (byte) 0xb5, (byte) 0xd9, (byte) 0x84, (byte) 0xd8,
    350                 (byte) 0xad, ' ', (byte) 0xe0, (byte) 0xaa, (byte) 0xb6,
    351                 (byte) 0xe0, (byte) 0xaa, (byte) 0xbe, (byte) 0xe0,
    352                 (byte) 0xaa, (byte) 0x82, (byte) 0xe0, (byte) 0xaa,
    353                 (byte) 0xa4, (byte) 0xe0, (byte) 0xaa, (byte) 0xbf, ' ',
    354                 (byte) 0xe5, (byte) 0xb9, (byte) 0xb3, (byte) 0xe5,
    355                 (byte) 0x92, (byte) 0x8c, ' ', (byte) 0xd7, (byte) 0xa9,
    356                 (byte) 0xd7, (byte) 0x9c, (byte) 0xd7, (byte) 0x95,
    357                 (byte) 0xd7, (byte) 0x9d, ' ', (byte) 0xd7, (byte) 0xa4,
    358                 (byte) 0xd7, (byte) 0xa8, (byte) 0xd7, (byte) 0x99,
    359                 (byte) 0xd7, (byte) 0x93, (byte) 0xd7, (byte) 0x9f, ' ',
    360                 (byte) 0xe5, (byte) 0x92, (byte) 0x8c, (byte) 0xe5,
    361                 (byte) 0xb9, (byte) 0xb3, ' ', (byte) 0xe5, (byte) 0x92,
    362                 (byte) 0x8c, (byte) 0xe5, (byte) 0xb9, (byte) 0xb3, ' ',
    363                 (byte) 0xd8, (byte) 0xaa, (byte) 0xd9, (byte) 0x89,
    364                 (byte) 0xd9, (byte) 0x86, (byte) 0xda, (byte) 0x86,
    365                 (byte) 0xd9, (byte) 0x84, (byte) 0xd9, (byte) 0x89,
    366                 (byte) 0xd9, (byte) 0x82, ' ', (byte) 0xe0, (byte) 0xae,
    367                 (byte) 0x85, (byte) 0xe0, (byte) 0xae, (byte) 0xae,
    368                 (byte) 0xe0, (byte) 0xaf, (byte) 0x88, (byte) 0xe0,
    369                 (byte) 0xae, (byte) 0xa4, (byte) 0xe0, (byte) 0xae,
    370                 (byte) 0xbf, ' ', (byte) 0xe0, (byte) 0xb0, (byte) 0xb6,
    371                 (byte) 0xe0, (byte) 0xb0, (byte) 0xbe, (byte) 0xe0,
    372                 (byte) 0xb0, (byte) 0x82, (byte) 0xe0, (byte) 0xb0,
    373                 (byte) 0xa4, (byte) 0xe0, (byte) 0xb0, (byte) 0xbf, ' ',
    374                 (byte) 0xe0, (byte) 0xb8, (byte) 0xaa, (byte) 0xe0,
    375                 (byte) 0xb8, (byte) 0xb1, (byte) 0xe0, (byte) 0xb8,
    376                 (byte) 0x99, (byte) 0xe0, (byte) 0xb8, (byte) 0x95,
    377                 (byte) 0xe0, (byte) 0xb8, (byte) 0xb4, (byte) 0xe0,
    378                 (byte) 0xb8, (byte) 0xa0, (byte) 0xe0, (byte) 0xb8,
    379                 (byte) 0xb2, (byte) 0xe0, (byte) 0xb8, (byte) 0x9e, ' ',
    380                 (byte) 0xe1, (byte) 0x88, (byte) 0xb0, (byte) 0xe1,
    381                 (byte) 0x88, (byte) 0x8b, (byte) 0xe1, (byte) 0x88,
    382                 (byte) 0x9d, ' ', (byte) 0xe0, (byte) 0xb7, (byte) 0x83,
    383                 (byte) 0xe0, (byte) 0xb7, (byte) 0x8f, (byte) 0xe0,
    384                 (byte) 0xb6, (byte) 0xb8, (byte) 0xe0, (byte) 0xb6,
    385                 (byte) 0xba, ' ', (byte) 0xe0, (byte) 0xa4, (byte) 0xb6,
    386                 (byte) 0xe0, (byte) 0xa4, (byte) 0xbe, (byte) 0xe0,
    387                 (byte) 0xa4, (byte) 0xa8, (byte) 0xe0, (byte) 0xa5,
    388                 (byte) 0x8d, (byte) 0xe0, (byte) 0xa4, (byte) 0xa4,
    389                 (byte) 0xe0, (byte) 0xa4, (byte) 0xbf, (byte) 0xe0,
    390                 (byte) 0xa4, (byte) 0x83, ' ', (byte) 0xe1, (byte) 0x83,
    391                 (byte) 0x9b, (byte) 0xe1, (byte) 0x83, (byte) 0xa8,
    392                 (byte) 0xe1, (byte) 0x83, (byte) 0x95, (byte) 0xe1,
    393                 (byte) 0x83, (byte) 0x98, (byte) 0xe1, (byte) 0x83,
    394                 (byte) 0x93, (byte) 0xe1, (byte) 0x83, (byte) 0x9d,
    395                 (byte) 0xe1, (byte) 0x83, (byte) 0x91, (byte) 0xe1,
    396                 (byte) 0x83, (byte) 0x90 };
    397         // TODO Cannot make the following word work, encoder changes needed
    398         // (byte) 0xed, (byte) 0xa0, (byte) 0x80,
    399         // (byte) 0xed, (byte) 0xbc, (byte) 0xb2, (byte) 0xed,
    400         // (byte) 0xa0, (byte) 0x80, (byte) 0xed, (byte) 0xbc,
    401         // (byte) 0xb0, (byte) 0xed, (byte) 0xa0, (byte) 0x80,
    402         // (byte) 0xed, (byte) 0xbd, (byte) 0x85, (byte) 0xed,
    403         // (byte) 0xa0, (byte) 0x80, (byte) 0xed, (byte) 0xbc,
    404         // (byte) 0xb0, (byte) 0xed, (byte) 0xa0, (byte) 0x80,
    405         // (byte) 0xed, (byte) 0xbc, (byte) 0xb9, (byte) 0xed,
    406         // (byte) 0xa0, (byte) 0x80, (byte) 0xed, (byte) 0xbc,
    407         // (byte) 0xb8, (byte) 0xed, (byte) 0xa0, (byte) 0x80,
    408         // (byte) 0xed, (byte) 0xbc, (byte) 0xb9, ' '
    409 
    410         final String vendor = new String(bVendor, "UTF-8");
    411         final String spec = new String(bSpec, "UTF-8");
    412         m.getMainAttributes()
    413                 .put(Attributes.Name.IMPLEMENTATION_VENDOR, vendor);
    414         m.getAttributes(ATT_ENTRY_NAME).put(
    415                 Attributes.Name.IMPLEMENTATION_VENDOR, vendor);
    416         m.getEntries().get(ATT_ENTRY_NAME).put(
    417                 Attributes.Name.SPECIFICATION_TITLE, spec);
    418 
    419         ByteArrayOutputStream baos = new ByteArrayOutputStream();
    420         m.write(baos);
    421         m = new Manifest(new ByteArrayInputStream(baos.toByteArray()));
    422 
    423         assertEquals(vendor, m.getMainAttributes().get(
    424                 Attributes.Name.IMPLEMENTATION_VENDOR));
    425         assertEquals(vendor, m.getEntries().get(ATT_ENTRY_NAME).get(
    426                 Attributes.Name.IMPLEMENTATION_VENDOR));
    427         assertEquals(spec, m.getAttributes(ATT_ENTRY_NAME).get(
    428                 Attributes.Name.SPECIFICATION_TITLE));
    429     }
    430 
    431     /**
    432      * {@link java.util.jar.Manifest#read(java.io.InputStream)
    433      */
    434     public void testRead() {
    435         // Regression for HARMONY-89
    436         InputStream is = new InputStreamImpl();
    437         try {
    438             new Manifest().read(is);
    439             fail("IOException expected");
    440         } catch (IOException e) {
    441             // desired
    442         }
    443     }
    444 
    445     // helper class
    446     private class InputStreamImpl extends InputStream {
    447         public InputStreamImpl() {
    448             super();
    449         }
    450 
    451         @Override
    452         public int read() {
    453             return 0;
    454         }
    455     }
    456 }
    457