1 /* 2 * Copyright (c) 2008, 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 6334003 6440786 26 * @summary Test ability to write and read zip files that have no entries. 27 * @author Dave Bristor 28 */ 29 30 import java.io.*; 31 import java.util.*; 32 import java.util.zip.*; 33 34 public class TestEmptyZip { 35 public static void realMain(String[] args) throws Throwable { 36 String zipName = "foo.zip"; 37 File f = new File(System.getProperty("test.scratch", "."), zipName); 38 if (f.exists() && !f.delete()) { 39 throw new Exception("failed to delete " + zipName); 40 } 41 42 f.createNewFile(); 43 try { 44 // Verify 0-length file cannot be read 45 checkCannotRead(f); 46 47 // Verify non-zip file cannot be read 48 OutputStream out = new FileOutputStream(f); 49 try { 50 out.write("class Foo { }".getBytes()); 51 } finally { 52 out.close(); 53 } 54 checkCannotRead(f); 55 56 } finally { 57 f.delete(); 58 } 59 60 // Verify 0-entries file can be written 61 write(f); 62 63 // Verify 0-entries file can be read 64 readFile(f); 65 readStream(f); 66 67 f.delete(); 68 } 69 70 static void checkCannotRead(File f) throws IOException { 71 try { 72 new ZipFile(f).close(); 73 fail(); 74 } catch (ZipException ze) { 75 if (f.length() == 0) { 76 check(ze.getMessage().contains("zip file is empty")); 77 } else { 78 pass(); 79 } 80 } 81 ZipInputStream zis = null; 82 try { 83 zis = new ZipInputStream(new FileInputStream(f)); 84 ZipEntry ze = zis.getNextEntry(); 85 check(ze == null); 86 } catch (IOException ex) { 87 unexpected(ex); 88 } finally { 89 if (zis != null) zis.close(); 90 } 91 } 92 93 static void write(File f) throws Exception { 94 ZipOutputStream zos = null; 95 try { 96 zos = new ZipOutputStream(new FileOutputStream(f)); 97 zos.finish(); 98 zos.close(); 99 pass(); 100 } catch (Exception ex) { 101 unexpected(ex); 102 } finally { 103 if (zos != null) { 104 zos.close(); 105 } 106 } 107 } 108 109 static void readFile(File f) throws Exception { 110 ZipFile zf = null; 111 try { 112 zf = new ZipFile(f); 113 114 Enumeration e = zf.entries(); 115 while (e.hasMoreElements()) { 116 ZipEntry entry = (ZipEntry) e.nextElement(); 117 fail(); 118 } 119 zf.close(); 120 pass(); 121 } catch (Exception ex) { 122 unexpected(ex); 123 } finally { 124 if (zf != null) { 125 zf.close(); 126 } 127 } 128 } 129 130 static void readStream(File f) throws Exception { 131 ZipInputStream zis = null; 132 try { 133 zis = new ZipInputStream(new FileInputStream(f)); 134 ZipEntry ze = zis.getNextEntry(); 135 check(ze == null); 136 byte[] buf = new byte[1024]; 137 check(zis.read(buf, 0, 1024) == -1); 138 } finally { 139 if (zis != null) { 140 zis.close(); 141 } 142 } 143 } 144 145 //--------------------- Infrastructure --------------------------- 146 static volatile int passed = 0, failed = 0; 147 static boolean pass() {passed++; return true;} 148 static boolean fail() {failed++; Thread.dumpStack(); return false;} 149 static boolean fail(String msg) {System.out.println(msg); return fail();} 150 static void unexpected(Throwable t) {failed++; t.printStackTrace();} 151 static boolean check(boolean cond) {if (cond) pass(); else fail(); return cond;} 152 static boolean equal(Object x, Object y) { 153 if (x == null ? y == null : x.equals(y)) return pass(); 154 else return fail(x + " not equal to " + y);} 155 public static void main(String[] args) throws Throwable { 156 try {realMain(args);} catch (Throwable t) {unexpected(t);} 157 System.out.println("\nPassed = " + passed + " failed = " + failed); 158 if (failed > 0) throw new AssertionError("Some tests failed");} 159 }