jaroslav@694: /** jaroslav@694: * Back 2 Browser Bytecode Translator jaroslav@694: * Copyright (C) 2012 Jaroslav Tulach jaroslav@694: * jaroslav@694: * This program is free software: you can redistribute it and/or modify jaroslav@694: * it under the terms of the GNU General Public License as published by jaroslav@694: * the Free Software Foundation, version 2 of the License. jaroslav@694: * jaroslav@694: * This program is distributed in the hope that it will be useful, jaroslav@694: * but WITHOUT ANY WARRANTY; without even the implied warranty of jaroslav@694: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the jaroslav@694: * GNU General Public License for more details. jaroslav@694: * jaroslav@694: * You should have received a copy of the GNU General Public License jaroslav@694: * along with this program. Look for COPYING file in the top folder. jaroslav@694: * If not, see http://opensource.org/licenses/GPL-2.0. jaroslav@694: */ jaroslav@694: package org.apidesign.bck2brwsr.compact.tck; jaroslav@694: jaroslav@694: import java.io.ByteArrayOutputStream; jaroslav@694: import java.io.IOException; jaroslav@694: import java.io.InputStream; jaroslav@694: import java.util.Arrays; jaroslav@694: import java.util.LinkedHashMap; jaroslav@694: import java.util.Map; jaroslav@694: import java.util.Objects; jaroslav@694: import java.util.zip.ZipEntry; jaroslav@694: import org.apidesign.bck2brwsr.emul.zip.ZipInputStream; jaroslav@694: jaroslav@694: /** jaroslav@694: * jaroslav@694: * @author Jaroslav Tulach jaroslav@694: */ jaroslav@694: final class ZipArchive { jaroslav@694: private final Map entries = new LinkedHashMap<>(); jaroslav@694: jaroslav@694: public static ZipArchive createZip(InputStream is) throws IOException { jaroslav@694: ZipArchive a = new ZipArchive(); jaroslav@694: readZip(is, a); jaroslav@694: return a; jaroslav@694: } jaroslav@694: jaroslav@694: public static ZipArchive createReal(InputStream is) throws IOException { jaroslav@694: ZipArchive a = new ZipArchive(); jaroslav@694: realZip(is, a); jaroslav@694: return a; jaroslav@694: } jaroslav@694: jaroslav@694: /** jaroslav@694: * Registers entry name and data jaroslav@694: */ jaroslav@694: final void register(String entry, InputStream is) throws IOException { jaroslav@694: ByteArrayOutputStream os = new ByteArrayOutputStream(); jaroslav@694: for (;;) { jaroslav@694: int ch = is.read(); jaroslav@694: if (ch == -1) { jaroslav@694: break; jaroslav@694: } jaroslav@694: os.write(ch); jaroslav@694: } jaroslav@694: os.close(); jaroslav@694: entries.put(entry, os.toByteArray()); jaroslav@694: } jaroslav@694: jaroslav@694: @Override jaroslav@694: public int hashCode() { jaroslav@694: return entries.hashCode(); jaroslav@694: } jaroslav@694: jaroslav@694: @Override jaroslav@694: public boolean equals(Object obj) { jaroslav@694: if (obj == null) { jaroslav@694: return false; jaroslav@694: } jaroslav@694: if (getClass() != obj.getClass()) { jaroslav@694: return false; jaroslav@694: } jaroslav@694: final ZipArchive other = (ZipArchive) obj; jaroslav@694: if (!Objects.deepEquals(this.entries, other.entries)) { jaroslav@694: return false; jaroslav@694: } jaroslav@694: return true; jaroslav@694: } jaroslav@694: jaroslav@694: @Override jaroslav@694: public String toString() { jaroslav@694: StringBuilder sb = new StringBuilder(); jaroslav@694: for (Map.Entry en : entries.entrySet()) { jaroslav@694: String string = en.getKey(); jaroslav@694: byte[] bs = en.getValue(); jaroslav@694: sb.append(string).append(" = ").append(Arrays.toString(bs)).append("\n"); jaroslav@694: } jaroslav@694: return sb.toString(); jaroslav@694: } jaroslav@694: jaroslav@694: public void assertEquals(ZipArchive zip, String msg) { jaroslav@694: boolean ok = true; jaroslav@694: StringBuilder sb = new StringBuilder(); jaroslav@694: sb.append(msg); jaroslav@694: for (Map.Entry en : entries.entrySet()) { jaroslav@694: String string = en.getKey(); jaroslav@694: byte[] bs = en.getValue(); jaroslav@694: byte[] other = zip.entries.get(string); jaroslav@694: sb.append("\n"); jaroslav@694: if (other == null) { jaroslav@694: sb.append("EXTRA ").append(string).append(" = ").append(Arrays.toString(bs)); jaroslav@694: ok = false; jaroslav@694: continue; jaroslav@694: } jaroslav@694: if (Arrays.equals(bs, other)) { jaroslav@694: sb.append("OK ").append(string); jaroslav@694: continue; jaroslav@694: } else { jaroslav@694: sb.append("DIFF ").append(string).append(" = ").append(Arrays.toString(bs)).append("\n"); jaroslav@694: sb.append(" TO").append(string).append(" = ").append(Arrays.toString(other)).append("\n"); jaroslav@694: ok = false; jaroslav@694: continue; jaroslav@694: } jaroslav@694: } jaroslav@694: for (Map.Entry entry : zip.entries.entrySet()) { jaroslav@694: String string = entry.getKey(); jaroslav@694: if (entries.get(string) == null) { jaroslav@694: sb.append("MISS ").append(string).append(" = ").append(Arrays.toString(entry.getValue())); jaroslav@694: ok = false; jaroslav@694: } jaroslav@694: } jaroslav@694: if (!ok) { jaroslav@694: assert false : sb.toString(); jaroslav@694: } jaroslav@694: } jaroslav@694: jaroslav@694: public static void readZip(InputStream is, ZipArchive data) throws IOException { jaroslav@694: ZipInputStream zip = new org.apidesign.bck2brwsr.emul.zip.ZipInputStream(is); jaroslav@694: for (;;) { jaroslav@694: ZipEntry en = zip.getNextEntry(); jaroslav@694: if (en == null) { jaroslav@694: return; jaroslav@694: } jaroslav@694: data.register(en.getName(), zip); jaroslav@694: } jaroslav@694: } jaroslav@694: jaroslav@694: public static void realZip(InputStream is, ZipArchive data) throws IOException { jaroslav@694: java.util.zip.ZipInputStream zip = new java.util.zip.ZipInputStream(is); jaroslav@694: for (;;) { jaroslav@694: ZipEntry en = zip.getNextEntry(); jaroslav@694: if (en == null) { jaroslav@694: return; jaroslav@694: } jaroslav@694: data.register(en.getName(), zip); jaroslav@694: } jaroslav@694: } jaroslav@694: jaroslav@694: }