emul/compact/src/test/java/org/apidesign/bck2brwsr/compact/tck/ZipArchive.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Thu, 07 Feb 2013 12:58:12 +0100
branchemul
changeset 694 0d277415ed02
permissions -rw-r--r--
Rebasing the Inflater support on jzlib which, unlike GNU ClassPath, has correct implementation of Huffman code. Making the implementation more easily testable by turning Inflater and ZipInputStream into pure delegates. Current implementation is going to need proper long support.
jaroslav@694
     1
/**
jaroslav@694
     2
 * Back 2 Browser Bytecode Translator
jaroslav@694
     3
 * Copyright (C) 2012 Jaroslav Tulach <jaroslav.tulach@apidesign.org>
jaroslav@694
     4
 *
jaroslav@694
     5
 * This program is free software: you can redistribute it and/or modify
jaroslav@694
     6
 * it under the terms of the GNU General Public License as published by
jaroslav@694
     7
 * the Free Software Foundation, version 2 of the License.
jaroslav@694
     8
 *
jaroslav@694
     9
 * This program is distributed in the hope that it will be useful,
jaroslav@694
    10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
jaroslav@694
    11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
jaroslav@694
    12
 * GNU General Public License for more details.
jaroslav@694
    13
 *
jaroslav@694
    14
 * You should have received a copy of the GNU General Public License
jaroslav@694
    15
 * along with this program. Look for COPYING file in the top folder.
jaroslav@694
    16
 * If not, see http://opensource.org/licenses/GPL-2.0.
jaroslav@694
    17
 */
jaroslav@694
    18
package org.apidesign.bck2brwsr.compact.tck;
jaroslav@694
    19
jaroslav@694
    20
import java.io.ByteArrayOutputStream;
jaroslav@694
    21
import java.io.IOException;
jaroslav@694
    22
import java.io.InputStream;
jaroslav@694
    23
import java.util.Arrays;
jaroslav@694
    24
import java.util.LinkedHashMap;
jaroslav@694
    25
import java.util.Map;
jaroslav@694
    26
import java.util.Objects;
jaroslav@694
    27
import java.util.zip.ZipEntry;
jaroslav@694
    28
import org.apidesign.bck2brwsr.emul.zip.ZipInputStream;
jaroslav@694
    29
jaroslav@694
    30
/**
jaroslav@694
    31
 *
jaroslav@694
    32
 * @author Jaroslav Tulach <jtulach@netbeans.org>
jaroslav@694
    33
 */
jaroslav@694
    34
final class ZipArchive {
jaroslav@694
    35
    private final Map<String, byte[]> entries = new LinkedHashMap<>();
jaroslav@694
    36
jaroslav@694
    37
    public static ZipArchive createZip(InputStream is) throws IOException {
jaroslav@694
    38
        ZipArchive a = new ZipArchive();
jaroslav@694
    39
        readZip(is, a);
jaroslav@694
    40
        return a;
jaroslav@694
    41
    }
jaroslav@694
    42
jaroslav@694
    43
    public static ZipArchive createReal(InputStream is) throws IOException {
jaroslav@694
    44
        ZipArchive a = new ZipArchive();
jaroslav@694
    45
        realZip(is, a);
jaroslav@694
    46
        return a;
jaroslav@694
    47
    }
jaroslav@694
    48
jaroslav@694
    49
    /**
jaroslav@694
    50
     * Registers entry name and data
jaroslav@694
    51
     */
jaroslav@694
    52
    final void register(String entry, InputStream is) throws IOException {
jaroslav@694
    53
        ByteArrayOutputStream os = new ByteArrayOutputStream();
jaroslav@694
    54
        for (;;) {
jaroslav@694
    55
            int ch = is.read();
jaroslav@694
    56
            if (ch == -1) {
jaroslav@694
    57
                break;
jaroslav@694
    58
            }
jaroslav@694
    59
            os.write(ch);
jaroslav@694
    60
        }
jaroslav@694
    61
        os.close();
jaroslav@694
    62
        entries.put(entry, os.toByteArray());
jaroslav@694
    63
    }
jaroslav@694
    64
jaroslav@694
    65
    @Override
jaroslav@694
    66
    public int hashCode() {
jaroslav@694
    67
        return entries.hashCode();
jaroslav@694
    68
    }
jaroslav@694
    69
jaroslav@694
    70
    @Override
jaroslav@694
    71
    public boolean equals(Object obj) {
jaroslav@694
    72
        if (obj == null) {
jaroslav@694
    73
            return false;
jaroslav@694
    74
        }
jaroslav@694
    75
        if (getClass() != obj.getClass()) {
jaroslav@694
    76
            return false;
jaroslav@694
    77
        }
jaroslav@694
    78
        final ZipArchive other = (ZipArchive) obj;
jaroslav@694
    79
        if (!Objects.deepEquals(this.entries, other.entries)) {
jaroslav@694
    80
            return false;
jaroslav@694
    81
        }
jaroslav@694
    82
        return true;
jaroslav@694
    83
    }
jaroslav@694
    84
jaroslav@694
    85
    @Override
jaroslav@694
    86
    public String toString() {
jaroslav@694
    87
        StringBuilder sb = new StringBuilder();
jaroslav@694
    88
        for (Map.Entry<String, byte[]> en : entries.entrySet()) {
jaroslav@694
    89
            String string = en.getKey();
jaroslav@694
    90
            byte[] bs = en.getValue();
jaroslav@694
    91
            sb.append(string).append(" = ").append(Arrays.toString(bs)).append("\n");
jaroslav@694
    92
        }
jaroslav@694
    93
        return sb.toString();
jaroslav@694
    94
    }
jaroslav@694
    95
jaroslav@694
    96
    public void assertEquals(ZipArchive zip, String msg) {
jaroslav@694
    97
        boolean ok = true;
jaroslav@694
    98
        StringBuilder sb = new StringBuilder();
jaroslav@694
    99
        sb.append(msg);
jaroslav@694
   100
        for (Map.Entry<String, byte[]> en : entries.entrySet()) {
jaroslav@694
   101
            String string = en.getKey();
jaroslav@694
   102
            byte[] bs = en.getValue();
jaroslav@694
   103
            byte[] other = zip.entries.get(string);
jaroslav@694
   104
            sb.append("\n");
jaroslav@694
   105
            if (other == null) {
jaroslav@694
   106
                sb.append("EXTRA ").append(string).append(" = ").append(Arrays.toString(bs));
jaroslav@694
   107
                ok = false;
jaroslav@694
   108
                continue;
jaroslav@694
   109
            }
jaroslav@694
   110
            if (Arrays.equals(bs, other)) {
jaroslav@694
   111
                sb.append("OK    ").append(string);
jaroslav@694
   112
                continue;
jaroslav@694
   113
            } else {
jaroslav@694
   114
                sb.append("DIFF  ").append(string).append(" = ").append(Arrays.toString(bs)).append("\n");
jaroslav@694
   115
                sb.append("    TO").append(string).append(" = ").append(Arrays.toString(other)).append("\n");
jaroslav@694
   116
                ok = false;
jaroslav@694
   117
                continue;
jaroslav@694
   118
            }
jaroslav@694
   119
        }
jaroslav@694
   120
        for (Map.Entry<String, byte[]> entry : zip.entries.entrySet()) {
jaroslav@694
   121
            String string = entry.getKey();
jaroslav@694
   122
            if (entries.get(string) == null) {
jaroslav@694
   123
                sb.append("MISS  ").append(string).append(" = ").append(Arrays.toString(entry.getValue()));
jaroslav@694
   124
                ok = false;
jaroslav@694
   125
            }
jaroslav@694
   126
        }
jaroslav@694
   127
        if (!ok) {
jaroslav@694
   128
            assert false : sb.toString();
jaroslav@694
   129
        }
jaroslav@694
   130
    }
jaroslav@694
   131
jaroslav@694
   132
    public static void readZip(InputStream is, ZipArchive data) throws IOException {
jaroslav@694
   133
        ZipInputStream zip = new org.apidesign.bck2brwsr.emul.zip.ZipInputStream(is);
jaroslav@694
   134
        for (;;) {
jaroslav@694
   135
            ZipEntry en = zip.getNextEntry();
jaroslav@694
   136
            if (en == null) {
jaroslav@694
   137
                return;
jaroslav@694
   138
            }
jaroslav@694
   139
            data.register(en.getName(), zip);
jaroslav@694
   140
        }
jaroslav@694
   141
    }
jaroslav@694
   142
jaroslav@694
   143
    public static void realZip(InputStream is, ZipArchive data) throws IOException {
jaroslav@694
   144
        java.util.zip.ZipInputStream zip = new java.util.zip.ZipInputStream(is);
jaroslav@694
   145
        for (;;) {
jaroslav@694
   146
            ZipEntry en = zip.getNextEntry();
jaroslav@694
   147
            if (en == null) {
jaroslav@694
   148
                return;
jaroslav@694
   149
            }
jaroslav@694
   150
            data.register(en.getName(), zip);
jaroslav@694
   151
        }
jaroslav@694
   152
    }
jaroslav@694
   153
    
jaroslav@694
   154
}