test/jdk/java/util/zip/ZipFile/TestCleaner.java
author sherman
Mon, 11 Dec 2017 11:45:02 -0800
changeset 48238 9f225d4387e2
child 50417 aad24ac930ee
permissions -rw-r--r--
8185582: Update Zip implementation to use Cleaner, not finalizers Reviewed-by: plevart, rriggs, mchung
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
48238
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
     1
/*
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
     2
 * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
     4
 *
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
     7
 * published by the Free Software Foundation.
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
     8
 *
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    13
 * accompanied this code).
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    14
 *
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    18
 *
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    21
 * questions.
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    22
 */
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    23
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    24
/* @test
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    25
 * @bug 8185582
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    26
 * @modules java.base/java.util.zip:open
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    27
 * @summary Check the resources of Inflater, Deflater and ZipFile are always
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    28
 *          cleaned/released when the instance is not unreachable
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    29
 */
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    30
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    31
import java.io.*;
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    32
import java.lang.reflect.*;
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    33
import java.util.*;
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    34
import java.util.concurrent.CountDownLatch;
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    35
import java.util.concurrent.TimeUnit;
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    36
import java.util.zip.*;
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    37
import static java.nio.charset.StandardCharsets.US_ASCII;
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    38
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    39
public class TestCleaner {
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    40
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    41
    public static void main(String[] args) throws Throwable {
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    42
        testDeInflater();
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    43
        testZipFile();
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    44
    }
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    45
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    46
    private static long addrOf(Object obj) {
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    47
        try {
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    48
            Field addr = obj.getClass().getDeclaredField("address");
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    49
            if (!addr.trySetAccessible()) {
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    50
                return -1;
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    51
            }
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    52
            return addr.getLong(obj);
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    53
        } catch (Exception x) {
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    54
            return -1;
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    55
        }
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    56
    }
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    57
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    58
    private static class SubclassedInflater extends Inflater {
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    59
        CountDownLatch endCountDown;
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    60
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    61
        SubclassedInflater(CountDownLatch endCountDown) {
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    62
            this.endCountDown = endCountDown;
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    63
        }
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    64
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    65
        @Override
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    66
        public void end() {
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    67
            super.end();
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    68
            endCountDown.countDown();
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    69
        }
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    70
    }
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    71
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    72
    private static class SubclassedDeflater extends Deflater {
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    73
        CountDownLatch endCountDown;
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    74
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    75
        SubclassedDeflater(CountDownLatch endCountDown) {
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    76
            this.endCountDown = endCountDown;
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    77
        }
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    78
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    79
        @Override
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    80
        public void end() {
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    81
            super.end();
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    82
            endCountDown.countDown();
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    83
        }
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    84
    }
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    85
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    86
    // verify the "native resource" of In/Deflater has been cleaned
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    87
    private static void testDeInflater() throws Throwable {
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    88
        Field zsRefDef = Deflater.class.getDeclaredField("zsRef");
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    89
        Field zsRefInf = Inflater.class.getDeclaredField("zsRef");
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    90
        if (!zsRefDef.trySetAccessible() || !zsRefInf.trySetAccessible()) {
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    91
            throw new RuntimeException("'zsRef' is not accesible");
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    92
        }
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    93
        if (addrOf(zsRefDef.get(new Deflater())) == -1 ||
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    94
            addrOf(zsRefInf.get(new Inflater())) == -1) {
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    95
            throw new RuntimeException("'addr' is not accesible");
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    96
        }
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    97
        List<Object> list = new ArrayList<>();
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    98
        byte[] buf1 = new byte[1024];
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
    99
        byte[] buf2 = new byte[1024];
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   100
        for (int i = 0; i < 10; i++) {
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   101
            var def = new Deflater();
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   102
            list.add(zsRefDef.get(def));
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   103
            def.setInput("hello".getBytes());
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   104
            def.finish();
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   105
            int n = def.deflate(buf1);
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   106
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   107
            var inf = new Inflater();
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   108
            list.add(zsRefInf.get(inf));
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   109
            inf.setInput(buf1, 0, n);
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   110
            n = inf.inflate(buf2);
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   111
            if (!"hello".equals(new String(buf2, 0, n))) {
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   112
                throw new RuntimeException("compression/decompression failed");
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   113
            }
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   114
        }
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   115
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   116
        int n = 10;
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   117
        long cnt = list.size();
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   118
        while (n-- > 0 && cnt != 0) {
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   119
            Thread.sleep(100);
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   120
            System.gc();
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   121
            cnt = list.stream().filter(o -> addrOf(o) != 0).count();
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   122
        }
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   123
        if (cnt != 0)
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   124
            throw new RuntimeException("cleaner failed to clean : " + cnt);
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   125
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   126
        // test subclassed Deflater/Inflater, for behavioral compatibility.
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   127
        // should be removed if the finalize() method is finally removed.
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   128
        var endCountDown = new CountDownLatch(20);
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   129
        for (int i = 0; i < 10; i++) {
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   130
            var def = new SubclassedDeflater(endCountDown);
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   131
            def.setInput("hello".getBytes());
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   132
            def.finish();
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   133
            n = def.deflate(buf1);
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   134
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   135
            var inf = new SubclassedInflater(endCountDown);
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   136
            inf.setInput(buf1, 0, n);
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   137
            n = inf.inflate(buf2);
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   138
            if (!"hello".equals(new String(buf2, 0, n))) {
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   139
                throw new RuntimeException("compression/decompression failed");
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   140
            }
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   141
        }
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   142
        while (!endCountDown.await(10, TimeUnit.MILLISECONDS)) {
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   143
            System.gc();
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   144
        }
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   145
        if (endCountDown.getCount() != 0)
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   146
            throw new RuntimeException("finalizer failed to clean : " +
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   147
                endCountDown.getCount());
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   148
    }
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   149
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   150
    private static class SubclassedZipFile extends ZipFile {
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   151
        CountDownLatch closeCountDown;
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   152
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   153
        SubclassedZipFile(File f, CountDownLatch closeCountDown)
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   154
            throws IOException {
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   155
            super(f);
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   156
            this.closeCountDown = closeCountDown;
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   157
        }
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   158
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   159
        @Override
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   160
        public void close() throws IOException {
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   161
            closeCountDown.countDown();
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   162
            super.close();
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   163
        }
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   164
    }
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   165
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   166
    private static void testZipFile() throws Throwable {
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   167
        File dir = new File(System.getProperty("test.dir", "."));
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   168
        File zip = File.createTempFile("testzf", "zip", dir);
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   169
        Object zsrc = null;
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   170
        try {
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   171
            try (var fos = new FileOutputStream(zip);
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   172
                 var zos = new ZipOutputStream(fos)) {
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   173
                zos.putNextEntry(new ZipEntry("hello"));
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   174
                zos.write("hello".getBytes(US_ASCII));
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   175
                zos.closeEntry();
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   176
            }
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   177
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   178
            var zf = new ZipFile(zip);
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   179
            var es = zf.entries();
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   180
            while (es.hasMoreElements()) {
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   181
                zf.getInputStream(es.nextElement()).read();
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   182
            }
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   183
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   184
            Field fieldRes = ZipFile.class.getDeclaredField("res");
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   185
            if (!fieldRes.trySetAccessible()) {
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   186
                throw new RuntimeException("'ZipFile.res' is not accesible");
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   187
            }
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   188
            Object zfRes = fieldRes.get(zf);
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   189
            if (zfRes == null) {
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   190
                throw new RuntimeException("'ZipFile.res' is null");
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   191
            }
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   192
            Field fieldZsrc = zfRes.getClass().getDeclaredField("zsrc");
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   193
            if (!fieldZsrc.trySetAccessible()) {
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   194
                throw new RuntimeException("'ZipFile.zsrc' is not accesible");
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   195
            }
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   196
            zsrc = fieldZsrc.get(zfRes);
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   197
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   198
        } finally {
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   199
            zip.delete();
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   200
        }
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   201
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   202
        if (zsrc != null) {
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   203
            Field zfileField = zsrc.getClass().getDeclaredField("zfile");
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   204
            if (!zfileField.trySetAccessible()) {
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   205
                throw new RuntimeException("'ZipFile.Source.zfile' is not accesible");
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   206
            }
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   207
            //System.out.println("zffile: " +  zfileField.get(zsrc));
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   208
            int n = 10;
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   209
            while (n-- > 0 && zfileField.get(zsrc) != null) {
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   210
                System.out.println("waiting gc ... " + n);
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   211
                System.gc();
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   212
                Thread.sleep(100);
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   213
            }
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   214
            if (zfileField.get(zsrc) != null) {
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   215
                throw new RuntimeException("cleaner failed to clean zipfile.");
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   216
            }
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   217
        }
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   218
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   219
        // test subclassed ZipFile, for behavioral compatibility.
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   220
        // should be removed if the finalize() method is finally removed.
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   221
        var closeCountDown = new CountDownLatch(1);
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   222
        try {
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   223
            try (var fos = new FileOutputStream(zip);
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   224
                 var zos = new ZipOutputStream(fos)) {
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   225
                zos.putNextEntry(new ZipEntry("hello"));
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   226
                zos.write("hello".getBytes(US_ASCII));
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   227
                zos.closeEntry();
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   228
            }
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   229
            var zf = new SubclassedZipFile(zip, closeCountDown);
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   230
            var es = zf.entries();
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   231
            while (es.hasMoreElements()) {
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   232
                zf.getInputStream(es.nextElement()).read();
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   233
            }
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   234
            es = null;
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   235
            zf = null;
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   236
        } finally {
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   237
            zip.delete();
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   238
        }
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   239
        while (!closeCountDown.await(10, TimeUnit.MILLISECONDS)) {
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   240
            System.gc();
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   241
        }
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   242
        if (closeCountDown.getCount() != 0)
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   243
            throw new RuntimeException("finalizer failed to clean : " +
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   244
                closeCountDown.getCount());
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   245
    }
9f225d4387e2 8185582: Update Zip implementation to use Cleaner, not finalizers
sherman
parents:
diff changeset
   246
}