jdk/test/java/util/logging/FileHandlerLongLimit.java
author dfuchs
Wed, 25 Feb 2015 18:41:07 +0100
changeset 29117 7956b5dc0eac
parent 27191 45a3002de56f
child 30046 cf2c86e1819e
permissions -rw-r--r--
8072645: java.util.logging should use java.time to get more precise time stamps Summary: j.u.logging uses j.t.Instant to store LogRecord time stamps. XMLFormatter format is updated to allow for a new optional <nanos> element containing a nano second adjustment. SimpleFormatter passes a ZonedDateTime object to String.format. LogRecord getMillis/setMillis are deprecated, replaced by getInstant/setInstant. Reviewed-by: scolebourne, plevart, rriggs Contributed-by: daniel.fuchs@oracle.com, peter.levart@gmail.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
27191
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
     1
/*
29117
7956b5dc0eac 8072645: java.util.logging should use java.time to get more precise time stamps
dfuchs
parents: 27191
diff changeset
     2
 * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
27191
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
     4
 *
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
     7
 * published by the Free Software Foundation.
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
     8
 *
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    13
 * accompanied this code).
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    14
 *
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    18
 *
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    21
 * questions.
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    22
 */
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    23
import java.io.ByteArrayInputStream;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    24
import java.io.ByteArrayOutputStream;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    25
import java.io.FilePermission;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    26
import java.io.IOException;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    27
import java.io.OutputStream;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    28
import java.lang.reflect.Field;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    29
import java.nio.file.Files;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    30
import java.nio.file.Paths;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    31
import java.security.CodeSource;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    32
import java.security.Permission;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    33
import java.security.PermissionCollection;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    34
import java.security.Permissions;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    35
import java.security.Policy;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    36
import java.security.ProtectionDomain;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    37
import java.util.Arrays;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    38
import java.util.Collections;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    39
import java.util.Enumeration;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    40
import java.util.List;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    41
import java.util.Properties;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    42
import java.util.UUID;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    43
import java.util.concurrent.Callable;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    44
import java.util.concurrent.atomic.AtomicBoolean;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    45
import java.util.logging.FileHandler;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    46
import java.util.logging.Level;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    47
import java.util.logging.LogManager;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    48
import java.util.logging.LogRecord;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    49
import java.util.logging.LoggingPermission;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    50
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    51
/**
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    52
 * @test
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    53
 * @bug 8059767
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    54
 * @summary tests that FileHandler can accept a long limit.
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    55
 * @run main/othervm FileHandlerLongLimit UNSECURE
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    56
 * @run main/othervm FileHandlerLongLimit SECURE
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    57
 * @author danielfuchs
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    58
 */
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    59
public class FileHandlerLongLimit {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    60
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    61
    /**
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    62
     * We will test handling of limit and overflow of MeteredStream.written in
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    63
     * two configurations.
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    64
     * UNSECURE: No security manager.
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    65
     * SECURE: With the security manager present - and the required
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    66
     *         permissions granted.
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    67
     */
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    68
    public static enum TestCase {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    69
        UNSECURE, SECURE;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    70
        public void run(Properties propertyFile) throws Exception {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    71
            System.out.println("Running test case: " + name());
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    72
            Configure.setUp(this, propertyFile);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    73
            test(this.name() + " " + propertyFile.getProperty("test.name"), propertyFile,
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    74
                    Long.parseLong(propertyFile.getProperty(FileHandler.class.getName()+".limit")));
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    75
        }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    76
    }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    77
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    78
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    79
    private static final String PREFIX =
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    80
            "FileHandler-" + UUID.randomUUID() + ".log";
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    81
    private static final String userDir = System.getProperty("user.dir", ".");
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    82
    private static final boolean userDirWritable = Files.isWritable(Paths.get(userDir));
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    83
    private static final Field limitField;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    84
    private static final Field meterField;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    85
    private static final Field writtenField;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    86
    private static final Field outField;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    87
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    88
    private static final List<Properties> properties;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    89
    static {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    90
        Properties props1 = new Properties();
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    91
        Properties props2 = new Properties();
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    92
        Properties props3 = new Properties();
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    93
        props1.setProperty("test.name", "with limit=Integer.MAX_VALUE");
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    94
        props1.setProperty(FileHandler.class.getName() + ".pattern", PREFIX);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    95
        props1.setProperty(FileHandler.class.getName() + ".limit", String.valueOf(Integer.MAX_VALUE));
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    96
        props2.setProperty("test.name", "with limit=Integer.MAX_VALUE*4");
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    97
        props2.setProperty(FileHandler.class.getName() + ".pattern", PREFIX);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    98
        props2.setProperty(FileHandler.class.getName() + ".limit", String.valueOf(((long)Integer.MAX_VALUE)*4));
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
    99
        props3.setProperty("test.name", "with limit=Long.MAX_VALUE - 1024");
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   100
        props3.setProperty(FileHandler.class.getName() + ".pattern", PREFIX);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   101
        props3.setProperty(FileHandler.class.getName() + ".limit", String.valueOf(Long.MAX_VALUE - 1024));
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   102
        properties = Collections.unmodifiableList(Arrays.asList(
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   103
                    props1,
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   104
                    props2,
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   105
                    props3));
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   106
        try {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   107
            Class<?> metteredStreamClass = Class.forName(FileHandler.class.getName()+"$MeteredStream");
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   108
            limitField = FileHandler.class.getDeclaredField("limit");
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   109
            limitField.setAccessible(true);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   110
            meterField = FileHandler.class.getDeclaredField("meter");
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   111
            meterField.setAccessible(true);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   112
            writtenField = metteredStreamClass.getDeclaredField("written");
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   113
            writtenField.setAccessible(true);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   114
            outField = metteredStreamClass.getDeclaredField("out");
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   115
            outField.setAccessible(true);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   116
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   117
        } catch (NoSuchFieldException | ClassNotFoundException x) {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   118
            throw new ExceptionInInitializerError(x);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   119
         }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   120
    }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   121
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   122
    private static class TestOutputStream extends OutputStream {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   123
        final OutputStream delegate;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   124
        TestOutputStream(OutputStream delegate) {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   125
            this.delegate = delegate;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   126
        }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   127
        @Override
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   128
        public void write(int b) throws IOException {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   129
            // do nothing - we only pretend to write something...
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   130
        }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   131
        @Override
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   132
        public void close() throws IOException {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   133
            delegate.close();
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   134
        }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   135
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   136
        @Override
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   137
        public void flush() throws IOException {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   138
            delegate.flush();
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   139
        }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   140
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   141
    }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   142
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   143
    public static void main(String... args) throws Exception {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   144
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   145
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   146
        if (args == null || args.length == 0) {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   147
            args = new String[] {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   148
                TestCase.UNSECURE.name(),
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   149
                TestCase.SECURE.name(),
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   150
            };
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   151
        }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   152
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   153
        try {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   154
            for (String testName : args) {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   155
                for (Properties propertyFile : properties) {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   156
                    TestCase test = TestCase.valueOf(testName);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   157
                    test.run(propertyFile);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   158
                }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   159
            }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   160
        } finally {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   161
            if (userDirWritable) {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   162
                Configure.doPrivileged(() -> {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   163
                    // cleanup - delete files that have been created
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   164
                    try {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   165
                        Files.list(Paths.get(userDir))
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   166
                            .filter((f) -> f.toString().contains(PREFIX))
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   167
                            .forEach((f) -> {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   168
                                try {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   169
                                    System.out.println("deleting " + f);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   170
                                    Files.delete(f);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   171
                                } catch(Throwable t) {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   172
                                    System.err.println("Failed to delete " + f + ": " + t);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   173
                                }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   174
                            });
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   175
                    } catch(Throwable t) {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   176
                        System.err.println("Cleanup failed to list files: " + t);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   177
                        t.printStackTrace();
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   178
                    }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   179
                });
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   180
            }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   181
        }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   182
    }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   183
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   184
    static class Configure {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   185
        static Policy policy = null;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   186
        static final AtomicBoolean allowAll = new AtomicBoolean(false);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   187
        static void setUp(TestCase test, Properties propertyFile) {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   188
            switch (test) {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   189
                case SECURE:
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   190
                    if (policy == null && System.getSecurityManager() != null) {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   191
                        throw new IllegalStateException("SecurityManager already set");
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   192
                    } else if (policy == null) {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   193
                        policy = new SimplePolicy(TestCase.SECURE, allowAll);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   194
                        Policy.setPolicy(policy);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   195
                        System.setSecurityManager(new SecurityManager());
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   196
                    }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   197
                    if (System.getSecurityManager() == null) {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   198
                        throw new IllegalStateException("No SecurityManager.");
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   199
                    }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   200
                    if (policy == null) {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   201
                        throw new IllegalStateException("policy not configured");
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   202
                    }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   203
                    break;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   204
                case UNSECURE:
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   205
                    if (System.getSecurityManager() != null) {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   206
                        throw new IllegalStateException("SecurityManager already set");
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   207
                    }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   208
                    break;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   209
                default:
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   210
                    new InternalError("No such testcase: " + test);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   211
            }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   212
            doPrivileged(() -> {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   213
                try {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   214
                    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   215
                    propertyFile.store(bytes, propertyFile.getProperty("test.name"));
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   216
                    ByteArrayInputStream bais = new ByteArrayInputStream(bytes.toByteArray());
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   217
                    LogManager.getLogManager().readConfiguration(bais);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   218
                } catch (IOException ex) {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   219
                    throw new RuntimeException(ex);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   220
                }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   221
            });
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   222
        }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   223
        static void doPrivileged(Runnable run) {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   224
            allowAll.set(true);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   225
            try {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   226
                run.run();
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   227
            } finally {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   228
                allowAll.set(false);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   229
            }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   230
        }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   231
        static <T> T callPrivileged(Callable<T> call) throws Exception {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   232
            allowAll.set(true);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   233
            try {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   234
                return call.call();
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   235
            } finally {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   236
                allowAll.set(false);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   237
            }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   238
        }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   239
    }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   240
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   241
    @FunctionalInterface
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   242
    public static interface FileHandlerSupplier {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   243
        public FileHandler test() throws Exception;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   244
    }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   245
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   246
    private static void checkException(Class<? extends Exception> type, FileHandlerSupplier test) {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   247
        Throwable t = null;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   248
        FileHandler f = null;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   249
        try {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   250
            f = test.test();
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   251
        } catch (Throwable x) {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   252
            t = x;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   253
        }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   254
        try {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   255
            if (type != null && t == null) {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   256
                throw new RuntimeException("Expected " + type.getName() + " not thrown");
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   257
            } else if (type != null && t != null) {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   258
                if (type.isInstance(t)) {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   259
                    System.out.println("Recieved expected exception: " + t);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   260
                } else {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   261
                    throw new RuntimeException("Exception type mismatch: "
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   262
                        + type.getName() + " expected, "
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   263
                        + t.getClass().getName() + " received.", t);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   264
                }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   265
            } else if (t != null) {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   266
                throw new RuntimeException("Unexpected exception received: " + t, t);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   267
            }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   268
        } finally {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   269
            if (f != null) {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   270
                // f should always be null when an exception is expected,
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   271
                // but in case the test doesn't behave as expected we will
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   272
                // want to close f.
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   273
                try { f.close(); } catch (Throwable x) {};
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   274
            }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   275
        }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   276
    }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   277
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   278
    static final class TestAssertException extends RuntimeException {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   279
        TestAssertException(String msg) {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   280
            super(msg);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   281
        }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   282
    }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   283
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   284
    private static void assertEquals(long expected, long received, String msg) {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   285
        if (expected != received) {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   286
            throw new TestAssertException("Unexpected result for " + msg
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   287
                    + ".\n\texpected: " + expected
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   288
                    +  "\n\tactual:   " + received);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   289
        } else {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   290
            System.out.println("Got expected " + msg + ": " + received);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   291
        }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   292
    }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   293
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   294
    private static long getLimit(FileHandler handler) throws Exception {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   295
        return Configure.callPrivileged((Callable<Long>)() -> {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   296
            return limitField.getLong(handler);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   297
        });
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   298
    }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   299
    private static OutputStream getMeteredOutput(FileHandler handler) throws Exception {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   300
        return Configure.callPrivileged((Callable<OutputStream>)() -> {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   301
            final OutputStream metered = OutputStream.class.cast(meterField.get(handler));
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   302
            return metered;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   303
        });
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   304
    }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   305
    private static TestOutputStream setTestOutputStream(OutputStream metered) throws Exception {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   306
        return Configure.callPrivileged((Callable<TestOutputStream>)() -> {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   307
            outField.set(metered, new TestOutputStream(OutputStream.class.cast(outField.get(metered))));
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   308
            return TestOutputStream.class.cast(outField.get(metered));
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   309
        });
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   310
    }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   311
    private static long getWritten(OutputStream metered) throws Exception {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   312
        return Configure.callPrivileged((Callable<Long>)() -> {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   313
            return writtenField.getLong(metered);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   314
        });
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   315
    }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   316
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   317
    private static long setWritten(OutputStream metered, long newValue) throws Exception {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   318
        return Configure.callPrivileged((Callable<Long>)() -> {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   319
            writtenField.setLong(metered, newValue);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   320
            return writtenField.getLong(metered);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   321
        });
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   322
    }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   323
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   324
    public static FileHandler testFileHandlerLimit(FileHandlerSupplier supplier,
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   325
            long limit) throws Exception {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   326
        Configure.doPrivileged(() -> {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   327
            try {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   328
                Files.deleteIfExists(Paths.get(PREFIX));
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   329
            } catch (IOException x) {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   330
                throw new RuntimeException(x);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   331
            }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   332
        });
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   333
        final FileHandler fh = supplier.test();
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   334
        try {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   335
            // verify we have the expected limit
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   336
            assertEquals(limit, getLimit(fh), "limit");
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   337
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   338
            // get the metered output stream
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   339
            OutputStream metered = getMeteredOutput(fh);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   340
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   341
            // we don't want to actually write to the file, so let's
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   342
            // redirect the metered to our own TestOutputStream.
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   343
            setTestOutputStream(metered);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   344
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   345
            // check that fh.meter.written is 0
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   346
            assertEquals(0, getWritten(metered), "written");
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   347
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   348
            // now we're going to publish a series of log records
29117
7956b5dc0eac 8072645: java.util.logging should use java.time to get more precise time stamps
dfuchs
parents: 27191
diff changeset
   349
            // we're using the same log record over and over to make
7956b5dc0eac 8072645: java.util.logging should use java.time to get more precise time stamps
dfuchs
parents: 27191
diff changeset
   350
            // sure we get the same amount of bytes.
27191
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   351
            String msg = "this is at least 10 chars long";
29117
7956b5dc0eac 8072645: java.util.logging should use java.time to get more precise time stamps
dfuchs
parents: 27191
diff changeset
   352
            LogRecord record = new LogRecord(Level.SEVERE, msg);
7956b5dc0eac 8072645: java.util.logging should use java.time to get more precise time stamps
dfuchs
parents: 27191
diff changeset
   353
            fh.publish(record);
27191
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   354
            fh.flush();
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   355
            long w = getWritten(metered);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   356
            long offset = getWritten(metered);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   357
            System.out.println("first offset is:  " + offset);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   358
29117
7956b5dc0eac 8072645: java.util.logging should use java.time to get more precise time stamps
dfuchs
parents: 27191
diff changeset
   359
            fh.publish(record);
27191
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   360
            fh.flush();
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   361
            offset = getWritten(metered) - w;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   362
            w = getWritten(metered);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   363
            System.out.println("second offset is: " + offset);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   364
29117
7956b5dc0eac 8072645: java.util.logging should use java.time to get more precise time stamps
dfuchs
parents: 27191
diff changeset
   365
            fh.publish(record);
27191
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   366
            fh.flush();
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   367
            offset = getWritten(metered) - w;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   368
            w = getWritten(metered);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   369
            System.out.println("third offset is:  " + offset);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   370
29117
7956b5dc0eac 8072645: java.util.logging should use java.time to get more precise time stamps
dfuchs
parents: 27191
diff changeset
   371
            fh.publish(record);
27191
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   372
            fh.flush();
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   373
            offset = getWritten(metered) - w;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   374
            System.out.println("fourth offset is: " + offset);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   375
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   376
            // Now set fh.meter.written to something close to the limit,
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   377
            // so that we can trigger log file rotation.
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   378
            assertEquals(limit-2*offset+10, setWritten(metered, limit-2*offset+10), "written");
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   379
            w = getWritten(metered);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   380
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   381
            // publish one more log record. we should still be just beneath
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   382
            // the limit
29117
7956b5dc0eac 8072645: java.util.logging should use java.time to get more precise time stamps
dfuchs
parents: 27191
diff changeset
   383
            fh.publish(record);
27191
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   384
            fh.flush();
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   385
            assertEquals(w+offset, getWritten(metered), "written");
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   386
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   387
            // check that fh still has the same MeteredStream - indicating
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   388
            // that the file hasn't rotated.
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   389
            if (getMeteredOutput(fh) != metered) {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   390
                throw new RuntimeException("Log should not have rotated");
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   391
            }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   392
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   393
            // Now publish two log record. The spec is a bit vague about when
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   394
            // exactly the log will be rotated - it could happen just after
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   395
            // writing the first log record or just before writing the next
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   396
            // one. We publich two - so we're sure that the log must have
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   397
            // rotated.
29117
7956b5dc0eac 8072645: java.util.logging should use java.time to get more precise time stamps
dfuchs
parents: 27191
diff changeset
   398
            fh.publish(record);
27191
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   399
            fh.flush();
29117
7956b5dc0eac 8072645: java.util.logging should use java.time to get more precise time stamps
dfuchs
parents: 27191
diff changeset
   400
            fh.publish(record);
27191
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   401
            fh.flush();
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   402
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   403
            // Check that fh.meter is a different instance of MeteredStream.
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   404
            if (getMeteredOutput(fh) == metered) {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   405
                throw new RuntimeException("Log should have rotated");
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   406
            }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   407
            // success!
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   408
            return fh;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   409
        } catch (Error | Exception x) {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   410
            // if we get an exception we need to close fh.
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   411
            // if we don't get an exception, fh will be closed by the caller.
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   412
            // (and that's why we dont use try-with-resources/finally here).
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   413
            try { fh.close(); } catch(Throwable t) {t.printStackTrace();}
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   414
            throw x;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   415
        }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   416
    }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   417
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   418
    public static void test(String name, Properties props, long limit) throws Exception {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   419
        System.out.println("Testing: " + name);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   420
        Class<? extends Exception> expectedException = null;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   421
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   422
        if (userDirWritable || expectedException != null) {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   423
            // These calls will create files in user.dir.
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   424
            // The file name contain a random UUID (PREFIX) which identifies them
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   425
            // and allow us to remove them cleanly at the end (see finally block
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   426
            // in main()).
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   427
            checkException(expectedException, () -> new FileHandler());
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   428
            checkException(expectedException, () -> {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   429
                final FileHandler fh = new FileHandler();
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   430
                assertEquals(limit, getLimit(fh), "limit");
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   431
                return fh;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   432
            });
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   433
            checkException(expectedException, () -> testFileHandlerLimit(
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   434
                    () -> new FileHandler(),
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   435
                    limit));
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   436
            checkException(expectedException, () -> testFileHandlerLimit(
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   437
                    () -> new FileHandler(PREFIX, Long.MAX_VALUE, 1, true),
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   438
                    Long.MAX_VALUE));
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   439
        }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   440
    }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   441
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   442
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   443
    final static class PermissionsBuilder {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   444
        final Permissions perms;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   445
        public PermissionsBuilder() {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   446
            this(new Permissions());
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   447
        }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   448
        public PermissionsBuilder(Permissions perms) {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   449
            this.perms = perms;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   450
        }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   451
        public PermissionsBuilder add(Permission p) {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   452
            perms.add(p);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   453
            return this;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   454
        }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   455
        public PermissionsBuilder addAll(PermissionCollection col) {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   456
            if (col != null) {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   457
                for (Enumeration<Permission> e = col.elements(); e.hasMoreElements(); ) {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   458
                    perms.add(e.nextElement());
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   459
                }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   460
            }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   461
            return this;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   462
        }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   463
        public Permissions toPermissions() {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   464
            final PermissionsBuilder builder = new PermissionsBuilder();
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   465
            builder.addAll(perms);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   466
            return builder.perms;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   467
        }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   468
    }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   469
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   470
    public static class SimplePolicy extends Policy {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   471
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   472
        final Permissions permissions;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   473
        final Permissions allPermissions;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   474
        final AtomicBoolean allowAll;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   475
        public SimplePolicy(TestCase test, AtomicBoolean allowAll) {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   476
            this.allowAll = allowAll;
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   477
            permissions = new Permissions();
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   478
            permissions.add(new LoggingPermission("control", null));
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   479
            permissions.add(new FilePermission(PREFIX+".lck", "read,write,delete"));
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   480
            permissions.add(new FilePermission(PREFIX, "read,write"));
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   481
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   482
            // these are used for configuring the test itself...
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   483
            allPermissions = new Permissions();
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   484
            allPermissions.add(new java.security.AllPermission());
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   485
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   486
        }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   487
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   488
        @Override
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   489
        public boolean implies(ProtectionDomain domain, Permission permission) {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   490
            if (allowAll.get()) return allPermissions.implies(permission);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   491
            return permissions.implies(permission);
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   492
        }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   493
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   494
        @Override
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   495
        public PermissionCollection getPermissions(CodeSource codesource) {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   496
            return new PermissionsBuilder().addAll(allowAll.get()
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   497
                    ? allPermissions : permissions).toPermissions();
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   498
        }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   499
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   500
        @Override
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   501
        public PermissionCollection getPermissions(ProtectionDomain domain) {
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   502
            return new PermissionsBuilder().addAll(allowAll.get()
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   503
                    ? allPermissions : permissions).toPermissions();
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   504
        }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   505
    }
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   506
45a3002de56f 8059767: FileHandler should allow 'long' limits and handle overflow of MeteredStream.written.
dfuchs
parents:
diff changeset
   507
}