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