2409N/A/*
3909N/A * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved.
2409N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
2409N/A *
2409N/A * This code is free software; you can redistribute it and/or modify it
2409N/A * under the terms of the GNU General Public License version 2 only, as
2409N/A * published by the Free Software Foundation.
2409N/A *
2409N/A * This code is distributed in the hope that it will be useful, but WITHOUT
2409N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
2409N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
2409N/A * version 2 for more details (a copy is included in the LICENSE file that
2409N/A * accompanied this code).
2409N/A *
2409N/A * You should have received a copy of the GNU General Public License version
2409N/A * 2 along with this work; if not, write to the Free Software Foundation,
2409N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
2409N/A *
2685N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2685N/A * or visit www.oracle.com if you need additional information or have any
2685N/A * questions.
2409N/A */
2409N/A
2409N/A/* @test
2409N/A * @bug 4691425
2409N/A * @summary Test the read and write of GZIPInput/OutputStream, including
2409N/A * concatenated .gz inputstream
2409N/A */
2409N/A
2409N/Aimport java.io.*;
2409N/Aimport java.util.*;
2409N/Aimport java.util.zip.*;
2409N/A
2409N/Apublic class GZIPInputStreamRead {
2409N/A public static void main(String[] args) throws Throwable {
2409N/A Random rnd = new Random();
2409N/A for (int i = 1; i < 100; i++) {
2409N/A int members = rnd.nextInt(10) + 1;
2409N/A
2409N/A ByteArrayOutputStream srcBAOS = new ByteArrayOutputStream();
2409N/A ByteArrayOutputStream dstBAOS = new ByteArrayOutputStream();
2409N/A for (int j = 0; j < members; j++) {
2409N/A byte[] src = new byte[rnd.nextInt(8192) + 1];
2409N/A rnd.nextBytes(src);
2409N/A srcBAOS.write(src);
2409N/A
3656N/A try (GZIPOutputStream gzos = new GZIPOutputStream(dstBAOS)) {
3656N/A gzos.write(src);
3656N/A }
2409N/A }
2409N/A byte[] srcBytes = srcBAOS.toByteArray();
2409N/A byte[] dstBytes = dstBAOS.toByteArray();
2409N/A // try different size of buffer to read the
2409N/A // GZIPInputStream
2409N/A /* just for fun when running manually
2409N/A for (int j = 1; j < 10; j++) {
2409N/A test(srcBytes, dstBytes, j);
2409N/A }
2409N/A */
2409N/A for (int j = 0; j < 10; j++) {
2409N/A int readBufSZ = rnd.nextInt(2048) + 1;
2409N/A test(srcBytes,
2409N/A dstBytes,
2409N/A readBufSZ,
2409N/A 512); // the defualt buffer size
2409N/A test(srcBytes,
2409N/A dstBytes,
2409N/A readBufSZ,
2409N/A rnd.nextInt(4096) + 1);
2409N/A }
2409N/A }
2409N/A }
2409N/A
2409N/A private static void test(byte[] src, byte[] dst,
2409N/A int readBufSize, int gzisBufSize)
2409N/A throws Throwable
2409N/A {
3656N/A try (ByteArrayInputStream bais = new ByteArrayInputStream(dst);
3656N/A GZIPInputStream gzis = new GZIPInputStream(bais, gzisBufSize))
3656N/A {
3656N/A byte[] result = new byte[src.length + 10];
3656N/A byte[] buf = new byte[readBufSize];
3656N/A int n = 0;
3656N/A int off = 0;
2409N/A
3656N/A while ((n = gzis.read(buf, 0, buf.length)) != -1) {
3656N/A System.arraycopy(buf, 0, result, off, n);
3656N/A off += n;
3656N/A // no range check, if overflow, let it fail
3656N/A }
3656N/A if (off != src.length || gzis.available() != 0 ||
3656N/A !Arrays.equals(src, Arrays.copyOf(result, off))) {
3656N/A throw new RuntimeException(
3656N/A "GZIPInputStream reading failed! " +
3656N/A ", src.len=" + src.length +
3656N/A ", read=" + off);
3656N/A }
2409N/A }
2409N/A }
2409N/A}