1 /*
   2  * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 /* @test
  25  * @bug 4217676
  26  * @summary Ensure that object streams support serialization of long strings
  27  *          (strings whose UTF representation > 64k in length)
  28  */
  29 
  30 import java.io.*;
  31 import java.util.*;
  32 
  33 public class LongString {
  34     public static void main(String[] args) throws Exception {
  35         Random rand = new Random(System.currentTimeMillis());
  36         ByteArrayOutputStream bout;
  37         ByteArrayInputStream bin;
  38         ObjectOutputStream oout;
  39         ObjectInputStream oin;
  40         FileInputStream fin;
  41         File mesgf;
  42 
  43         // generate a long random string
  44         StringBuffer sbuf = new StringBuffer();
  45         for (int i = 0; i < 100000; i++)
  46             sbuf.append((char) rand.nextInt(Character.MAX_VALUE + 1));
  47         String str = sbuf.toString();
  48 
  49         // write and read long string
  50         bout = new ByteArrayOutputStream();
  51         oout = new ObjectOutputStream(bout);
  52         oout.writeObject(str);
  53         oout.flush();
  54         bin = new ByteArrayInputStream(bout.toByteArray());
  55         oin = new ObjectInputStream(bin);
  56         String strcopy = (String) oin.readObject();
  57         if (! str.equals(strcopy))
  58             throw new Error("deserialized long string not equal to original");
  59 
  60         // test backwards compatibility
  61         String mesg = "Message in golden file";
  62         bout = new ByteArrayOutputStream();
  63         oout = new ObjectOutputStream(bout);
  64         oout.writeObject(mesg);
  65         oout.flush();
  66         byte[] buf1 = bout.toByteArray();
  67 
  68         mesgf = new File(System.getProperty("test.src", "."), "mesg.ser");
  69         fin = new FileInputStream(mesgf);
  70         bout = new ByteArrayOutputStream();
  71         try {
  72             while (fin.available() > 0)
  73                 bout.write(fin.read());
  74         } finally {
  75             fin.close();
  76         }
  77         byte[] buf2 = bout.toByteArray();
  78 
  79         if (! Arrays.equals(buf1, buf2))
  80             throw new Error("incompatible string format (write)");
  81 
  82         fin = new FileInputStream(mesgf);
  83         try {
  84             oin = new ObjectInputStream(fin);
  85             String mesgcopy = (String) oin.readObject();
  86             if (! mesg.equals(mesgcopy))
  87                 throw new Error("incompatible string format (read)");
  88         } finally {
  89             fin.close();
  90         }
  91     }
  92 }