test/jdk/java/io/Serializable/serialFilter/SerialFilterTest.java
author rriggs
Fri, 11 Oct 2019 13:11:56 -0400
changeset 58565 baa5969ecf34
parent 47423 4fc2a4a29f3d
permissions -rw-r--r--
8231427: Warning cleanup in tests of java.io.Serializable Reviewed-by: darcy, lancea
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
     1
/*
58565
baa5969ecf34 8231427: Warning cleanup in tests of java.io.Serializable
rriggs
parents: 47423
diff changeset
     2
 * Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved.
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
     4
 *
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
     7
 * published by the Free Software Foundation.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
     8
 *
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    13
 * accompanied this code).
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    14
 *
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    18
 *
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    21
 * questions.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    22
 */
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    23
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    24
import java.io.ByteArrayInputStream;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    25
import java.io.ByteArrayOutputStream;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    26
import java.io.EOFException;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    27
import java.io.IOException;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    28
import java.io.InvalidClassException;
44756
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
    29
import java.io.ObjectInputFilter;
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    30
import java.io.ObjectInputStream;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    31
import java.io.ObjectOutputStream;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    32
import java.io.Serializable;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    33
import java.lang.invoke.SerializedLambda;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    34
import java.lang.reflect.Constructor;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    35
import java.lang.reflect.InvocationTargetException;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    36
import java.lang.reflect.Proxy;
44756
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
    37
import java.util.ArrayList;
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    38
import java.util.Arrays;
47423
4fc2a4a29f3d 8174109: Better queuing priorities
smarks
parents: 47216
diff changeset
    39
import java.util.Collections;
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    40
import java.util.HashSet;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    41
import java.util.Hashtable;
44756
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
    42
import java.util.List;
47423
4fc2a4a29f3d 8174109: Better queuing priorities
smarks
parents: 47216
diff changeset
    43
import java.util.Map;
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    44
import java.util.concurrent.atomic.LongAdder;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    45
41888
dc533ef5583a 8169055: [TESTBUG] java/io/Serializable/serialFilter/ tests have undeclared dependency on java.compiler module
rriggs
parents: 41230
diff changeset
    46
import javax.net.ssl.SSLEngineResult;
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    47
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    48
import org.testng.Assert;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    49
import org.testng.annotations.Test;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    50
import org.testng.annotations.DataProvider;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    51
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    52
/* @test
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    53
 * @build SerialFilterTest
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    54
 * @run testng/othervm  SerialFilterTest
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    55
 *
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    56
 * @summary Test ObjectInputFilters
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    57
 */
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    58
@Test
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    59
public class SerialFilterTest implements Serializable {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    60
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    61
    private static final long serialVersionUID = -6999613679881262446L;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    62
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    63
    /**
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    64
     * Enable three arg lambda.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    65
     * @param <T> The pattern
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    66
     * @param <U> The test object
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    67
     * @param <V> Boolean for if the filter should allow or reject
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    68
     */
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    69
    interface TriConsumer< T, U, V> {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    70
        void accept(T t, U u, V v);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    71
    }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    72
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    73
    /**
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    74
     * Misc object to use that should always be accepted.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    75
     */
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    76
    private static final Object otherObject = Integer.valueOf(0);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    77
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    78
    /**
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    79
     * DataProvider for the individual patterns to test.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    80
     * Expand the patterns into cases for each of the Std and Compatibility APIs.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    81
     * @return an array of arrays of the parameters including factories
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    82
     */
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    83
    @DataProvider(name="Patterns")
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    84
    static Object[][] patterns() {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    85
        Object[][] patterns = new Object[][]{
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    86
                {"java.util.Hashtable"},
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    87
                {"java.util.Hash*"},
41888
dc533ef5583a 8169055: [TESTBUG] java/io/Serializable/serialFilter/ tests have undeclared dependency on java.compiler module
rriggs
parents: 41230
diff changeset
    88
                {"javax.net.ssl.*"},
dc533ef5583a 8169055: [TESTBUG] java/io/Serializable/serialFilter/ tests have undeclared dependency on java.compiler module
rriggs
parents: 41230
diff changeset
    89
                {"javax.net.**"},
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    90
                {"*"},
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    91
                {"maxarray=47"},
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    92
                {"maxdepth=5"},
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    93
                {"maxrefs=10"},
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    94
                {"maxbytes=100"},
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    95
                {"maxbytes=72"},
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    96
                {"maxbytes=+1024"},
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    97
                {"java.base/java.util.Hashtable"},
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    98
        };
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
    99
        return patterns;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   100
    }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   101
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   102
    @DataProvider(name="InvalidPatterns")
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   103
    static Object[][] invalidPatterns() {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   104
        return new Object [][] {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   105
                {".*"},
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   106
                {".**"},
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   107
                {"!"},
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   108
                {"/java.util.Hashtable"},
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   109
                {"java.base/"},
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   110
                {"/"},
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   111
        };
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   112
    }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   113
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   114
    @DataProvider(name="Limits")
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   115
    static Object[][] limits() {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   116
        // The numbers are arbitrary > 1
42446
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 41888
diff changeset
   117
        return new Object[][] {
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 41888
diff changeset
   118
                {"maxrefs", 1},     // 0 is tested as n-1
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   119
                {"maxrefs", 10},
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   120
                {"maxdepth", 5},
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   121
                {"maxbytes", 100},
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   122
                {"maxarray", 16},
42446
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 41888
diff changeset
   123
                {"maxbytes", Long.MAX_VALUE},
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 41888
diff changeset
   124
        };
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 41888
diff changeset
   125
    }
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 41888
diff changeset
   126
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 41888
diff changeset
   127
    @DataProvider(name="InvalidLimits")
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 41888
diff changeset
   128
    static Object[][] invalidLimits() {
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 41888
diff changeset
   129
        return new Object[][] {
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 41888
diff changeset
   130
                {"maxrefs=-1"},
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 41888
diff changeset
   131
                {"maxdepth=-1"},
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 41888
diff changeset
   132
                {"maxbytes=-1"},
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 41888
diff changeset
   133
                {"maxarray=-1"},
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 41888
diff changeset
   134
                {"xyz=0"},
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 41888
diff changeset
   135
                {"xyz=-1"},
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 41888
diff changeset
   136
                {"maxrefs=0xabc"},
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 41888
diff changeset
   137
                {"maxrefs=abc"},
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 41888
diff changeset
   138
                {"maxrefs="},
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 41888
diff changeset
   139
                {"maxrefs=+"},
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 41888
diff changeset
   140
                {"maxbytes=-1"},
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 41888
diff changeset
   141
                {"maxbytes=9223372036854775808"},
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 41888
diff changeset
   142
                {"maxbytes=-9223372036854775807"},
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   143
        };
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   144
    }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   145
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   146
    /**
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   147
     * DataProvider of individual objects. Used to check the information
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   148
     * available to the filter.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   149
     * @return  Arrays of parameters with objects
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   150
     */
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   151
    @DataProvider(name="Objects")
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   152
    static Object[][] objects() {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   153
        byte[] byteArray = new byte[0];
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   154
        Object[] objArray = new Object[7];
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   155
        objArray[objArray.length - 1] = objArray;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   156
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   157
        Class<?> serClass = null;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   158
        String className = "java.util.concurrent.atomic.LongAdder$SerializationProxy";
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   159
        try {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   160
            serClass = Class.forName(className);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   161
        } catch (Exception e) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   162
            Assert.fail("missing class: " + className, e);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   163
        }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   164
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   165
        Class<?>[] interfaces = {Runnable.class};
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   166
        Runnable proxy = (Runnable) Proxy.newProxyInstance(null,
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   167
                interfaces, (p, m, args) -> p);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   168
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   169
        Runnable runnable = (Runnable & Serializable) SerialFilterTest::noop;
47423
4fc2a4a29f3d 8174109: Better queuing priorities
smarks
parents: 47216
diff changeset
   170
4fc2a4a29f3d 8174109: Better queuing priorities
smarks
parents: 47216
diff changeset
   171
        List<Class<?>> classList = new ArrayList<>();
4fc2a4a29f3d 8174109: Better queuing priorities
smarks
parents: 47216
diff changeset
   172
        classList.add(HashSet.class);
4fc2a4a29f3d 8174109: Better queuing priorities
smarks
parents: 47216
diff changeset
   173
        classList.addAll(Collections.nCopies(21, Map.Entry[].class));
4fc2a4a29f3d 8174109: Better queuing priorities
smarks
parents: 47216
diff changeset
   174
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   175
        Object[][] objects = {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   176
                { null, 0, -1, 0, 0, 0,
44756
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   177
                        Arrays.asList()},        // no callback, no values
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   178
                { objArray, 3, 7, 9, 2, 55,
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   179
                        Arrays.asList(objArray.getClass(), objArray.getClass())},
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   180
                { Object[].class, 1, -1, 1, 1, 38,
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   181
                        Arrays.asList(Object[].class)},
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   182
                { new SerialFilterTest(), 1, -1, 1, 1, 35,
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   183
                        Arrays.asList(SerialFilterTest.class)},
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   184
                { new LongAdder(), 2, -1, 2, 1, 93,
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   185
                        Arrays.asList(serClass, LongAdder.class)},
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   186
                { new byte[14], 2, 14, 2, 1, 27,
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   187
                        Arrays.asList(byteArray.getClass(), byteArray.getClass())},
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   188
                { runnable, 13, 0, 13, 2, 514,
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   189
                        Arrays.asList(java.lang.invoke.SerializedLambda.class,
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   190
                                objArray.getClass(),
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   191
                                objArray.getClass(),
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   192
                                SerialFilterTest.class,
44756
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   193
                                java.lang.invoke.SerializedLambda.class)},
47423
4fc2a4a29f3d 8174109: Better queuing priorities
smarks
parents: 47216
diff changeset
   194
                { deepHashSet(10), 69, 4, 50, 11, 619, classList },
44756
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   195
                { proxy.getClass(), 3, -1, 2, 2, 112,
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   196
                        Arrays.asList(Runnable.class,
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   197
                                java.lang.reflect.Proxy.class,
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   198
                                java.lang.reflect.Proxy.class)},
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   199
                { new F(), 6, -1, 6, 6, 202,
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   200
                        Arrays.asList(F.class, E.class, D.class,
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   201
                                C.class, B.class, A.class)},
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   202
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   203
        };
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   204
        return objects;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   205
    }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   206
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   207
    @DataProvider(name="Arrays")
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   208
    static Object[][] arrays() {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   209
        return new Object[][]{
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   210
                {new Object[16], 16},
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   211
                {new boolean[16], 16},
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   212
                {new byte[16], 16},
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   213
                {new char[16], 16},
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   214
                {new int[16], 16},
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   215
                {new long[16], 16},
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   216
                {new short[16], 16},
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   217
                {new float[16], 16},
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   218
                {new double[16], 16},
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   219
        };
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   220
    }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   221
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   222
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   223
    /**
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   224
     * Test each object and verify the classes identified by the filter,
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   225
     * the count of calls to the filter, the max array size, max refs, max depth,
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   226
     * max bytes.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   227
     * This test ignores/is not dependent on the global filter settings.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   228
     *
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   229
     * @param object a Serializable object
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   230
     * @param count the expected count of calls to the filter
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   231
     * @param maxArray the maximum array size
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   232
     * @param maxRefs the maximum references
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   233
     * @param maxDepth the maximum depth
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   234
     * @param maxBytes the maximum stream size
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   235
     * @param classes  the expected (unique) classes
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   236
     * @throws IOException
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   237
     */
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   238
    @Test(dataProvider="Objects")
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   239
    public static void t1(Object object,
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   240
                          long count, long maxArray, long maxRefs, long maxDepth, long maxBytes,
44756
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   241
                          List<Class<?>> classes) throws IOException {
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   242
        byte[] bytes = writeObjects(object);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   243
        Validator validator = new Validator();
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   244
        validate(bytes, validator);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   245
        System.out.printf("v: %s%n", validator);
44756
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   246
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   247
        Assert.assertEquals(validator.count, count, "callback count wrong");
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   248
        Assert.assertEquals(validator.classes, classes, "classes mismatch");
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   249
        Assert.assertEquals(validator.maxArray, maxArray, "maxArray mismatch");
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   250
        Assert.assertEquals(validator.maxRefs, maxRefs, "maxRefs wrong");
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   251
        Assert.assertEquals(validator.maxDepth, maxDepth, "depth wrong");
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   252
        Assert.assertEquals(validator.maxBytes, maxBytes, "maxBytes wrong");
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   253
    }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   254
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   255
    /**
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   256
     * Test each pattern with an appropriate object.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   257
     * A filter is created from the pattern and used to serialize and
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   258
     * deserialize a generated object with both the positive and negative case.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   259
     * This test ignores/is not dependent on the global filter settings.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   260
     *
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   261
     * @param pattern a pattern
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   262
     */
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   263
    @Test(dataProvider="Patterns")
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   264
    static void testPatterns(String pattern) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   265
        evalPattern(pattern, (p, o, neg) -> testPatterns(p, o, neg));
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   266
    }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   267
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   268
    /**
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   269
     * Test that the filter on a OIS can be set only on a fresh OIS,
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   270
     * before deserializing any objects.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   271
     * This test is agnostic the global filter being set or not.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   272
     */
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   273
    @Test
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   274
    static void nonResettableFilter() {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   275
        Validator validator1 = new Validator();
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   276
        Validator validator2 = new Validator();
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   277
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   278
        try {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   279
            byte[] bytes = writeObjects("text1");    // an object
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   280
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   281
            try (ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   282
                 ObjectInputStream ois = new ObjectInputStream(bais)) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   283
                // Check the initial filter is the global filter; may be null
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   284
                ObjectInputFilter global = ObjectInputFilter.Config.getSerialFilter();
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   285
                ObjectInputFilter initial = ois.getObjectInputFilter();
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   286
                Assert.assertEquals(global, initial, "initial filter should be the global filter");
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   287
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   288
                // Check if it can be set to null
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   289
                ois.setObjectInputFilter(null);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   290
                ObjectInputFilter filter = ois.getObjectInputFilter();
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   291
                Assert.assertNull(filter, "set to null should be null");
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   292
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   293
                ois.setObjectInputFilter(validator1);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   294
                Object o = ois.readObject();
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   295
                try {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   296
                    ois.setObjectInputFilter(validator2);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   297
                    Assert.fail("Should not be able to set filter twice");
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   298
                } catch (IllegalStateException ise) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   299
                    // success, the exception was expected
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   300
                }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   301
            } catch (EOFException eof) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   302
                Assert.fail("Should not reach end-of-file", eof);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   303
            } catch (ClassNotFoundException cnf) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   304
                Assert.fail("Deserializing", cnf);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   305
            }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   306
        } catch (IOException ex) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   307
            Assert.fail("Unexpected IOException", ex);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   308
        }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   309
    }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   310
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   311
    /**
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   312
     * Test that if an Objects readReadResolve method returns an array
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   313
     * that the callback to the filter includes the proper array length.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   314
     * @throws IOException if an error occurs
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   315
     */
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   316
    @Test(dataProvider="Arrays")
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   317
    static void testReadResolveToArray(Object array, int length) throws IOException {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   318
        ReadResolveToArray object = new ReadResolveToArray(array, length);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   319
        byte[] bytes = writeObjects(object);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   320
        Object o = validate(bytes, object);    // the object is its own filter
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   321
        Assert.assertEquals(o.getClass(), array.getClass(), "Filter not called with the array");
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   322
    }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   323
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   324
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   325
    /**
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   326
     * Test repeated limits use the last value.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   327
     * Construct a filter with the limit and the limit repeated -1.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   328
     * Invoke the filter with the limit to make sure it is rejected.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   329
     * Invoke the filter with the limit -1 to make sure it is accepted.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   330
     * @param name the name of the limit to test
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   331
     * @param value a test value
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   332
     */
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   333
    @Test(dataProvider="Limits")
42446
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 41888
diff changeset
   334
    static void testLimits(String name, long value) {
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   335
        Class<?> arrayClass = new int[0].getClass();
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   336
        String pattern = String.format("%s=%d;%s=%d", name, value, name, value - 1);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   337
        ObjectInputFilter filter = ObjectInputFilter.Config.createFilter(pattern);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   338
        Assert.assertEquals(
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   339
                filter.checkInput(new FilterValues(arrayClass, value, value, value, value)),
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   340
                ObjectInputFilter.Status.REJECTED,
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   341
                "last limit value not used: " + filter);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   342
        Assert.assertEquals(
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   343
                filter.checkInput(new FilterValues(arrayClass, value-1, value-1, value-1, value-1)),
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   344
                ObjectInputFilter.Status.UNDECIDED,
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   345
                "last limit value not used: " + filter);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   346
    }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   347
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   348
    /**
42446
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 41888
diff changeset
   349
     * Test invalid limits.
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 41888
diff changeset
   350
     * Construct a filter with the limit, it should throw IllegalArgumentException.
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 41888
diff changeset
   351
     * @param pattern a pattern to test
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 41888
diff changeset
   352
     */
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 41888
diff changeset
   353
    @Test(dataProvider="InvalidLimits", expectedExceptions=java.lang.IllegalArgumentException.class)
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 41888
diff changeset
   354
    static void testInvalidLimits(String pattern) {
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 41888
diff changeset
   355
        try {
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 41888
diff changeset
   356
            ObjectInputFilter filter = ObjectInputFilter.Config.createFilter(pattern);
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 41888
diff changeset
   357
        } catch (IllegalArgumentException iae) {
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 41888
diff changeset
   358
            System.out.printf("    success exception: %s%n", iae);
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 41888
diff changeset
   359
            throw iae;
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 41888
diff changeset
   360
        }
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 41888
diff changeset
   361
    }
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 41888
diff changeset
   362
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 41888
diff changeset
   363
    /**
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   364
     * Test that returning null from a filter causes deserialization to fail.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   365
     */
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   366
    @Test(expectedExceptions=InvalidClassException.class)
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   367
    static void testNullStatus() throws IOException {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   368
        byte[] bytes = writeObjects(0); // an Integer
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   369
        try {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   370
            Object o = validate(bytes, new ObjectInputFilter() {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   371
                public ObjectInputFilter.Status checkInput(ObjectInputFilter.FilterInfo f) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   372
                    return null;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   373
                }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   374
            });
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   375
        } catch (InvalidClassException ice) {
42446
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 41888
diff changeset
   376
            System.out.printf("    success exception: %s%n", ice);
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   377
            throw ice;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   378
        }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   379
    }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   380
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   381
    /**
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   382
     * Verify that malformed patterns throw IAE.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   383
     * @param pattern pattern from the data source
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   384
     */
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   385
    @Test(dataProvider="InvalidPatterns", expectedExceptions=IllegalArgumentException.class)
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   386
    static void testInvalidPatterns(String pattern) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   387
        try {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   388
            ObjectInputFilter.Config.createFilter(pattern);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   389
        } catch (IllegalArgumentException iae) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   390
            System.out.printf("    success exception: %s%n", iae);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   391
            throw iae;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   392
        }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   393
    }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   394
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   395
    /**
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   396
     * Test that Config.create returns null if the argument does not contain any patterns or limits.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   397
     */
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   398
    @Test()
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   399
    static void testEmptyPattern() {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   400
        ObjectInputFilter filter = ObjectInputFilter.Config.createFilter("");
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   401
        Assert.assertNull(filter, "empty pattern did not return null");
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   402
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   403
        filter = ObjectInputFilter.Config.createFilter(";;;;");
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   404
        Assert.assertNull(filter, "pattern with only delimiters did not return null");
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   405
    }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   406
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   407
    /**
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   408
     * Read objects from the serialized stream, validated with the filter.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   409
     *
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   410
     * @param bytes a byte array to read objects from
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   411
     * @param filter the ObjectInputFilter
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   412
     * @return the object deserialized if any
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   413
     * @throws IOException can be thrown
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   414
     */
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   415
    static Object validate(byte[] bytes,
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   416
                         ObjectInputFilter filter) throws IOException {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   417
        try (ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   418
             ObjectInputStream ois = new ObjectInputStream(bais)) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   419
            ois.setObjectInputFilter(filter);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   420
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   421
            Object o = ois.readObject();
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   422
            return o;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   423
        } catch (EOFException eof) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   424
            // normal completion
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   425
        } catch (ClassNotFoundException cnf) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   426
            Assert.fail("Deserializing", cnf);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   427
        }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   428
        return null;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   429
    }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   430
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   431
    /**
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   432
     * Write objects and return a byte array with the bytes.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   433
     *
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   434
     * @param objects zero or more objects to serialize
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   435
     * @return the byte array of the serialized objects
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   436
     * @throws IOException if an exception occurs
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   437
     */
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   438
    static byte[] writeObjects(Object... objects)  throws IOException {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   439
        byte[] bytes;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   440
        try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   441
             ObjectOutputStream oos = new ObjectOutputStream(baos)) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   442
            for (Object o : objects) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   443
                oos.writeObject(o);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   444
            }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   445
            bytes = baos.toByteArray();
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   446
        }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   447
        return bytes;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   448
    }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   449
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   450
    /**
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   451
     * A filter that accumulates information about the checkInput callbacks
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   452
     * that can be checked after readObject completes.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   453
     */
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   454
    static class Validator implements ObjectInputFilter {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   455
        long count;          // Count of calls to checkInput
44756
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   456
        List<Class<?>> classes = new ArrayList<>();
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   457
        long maxArray = -1;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   458
        long maxRefs;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   459
        long maxDepth;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   460
        long maxBytes;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   461
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   462
        Validator() {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   463
        }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   464
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   465
        @Override
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   466
        public ObjectInputFilter.Status checkInput(FilterInfo filter) {
44756
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   467
            Class<?> serialClass = filter.serialClass();
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   468
            System.out.printf("     checkInput: class: %s, arrayLen: %d, refs: %d, depth: %d, bytes; %d%n",
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   469
                    serialClass, filter.arrayLength(), filter.references(),
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   470
                    filter.depth(), filter.streamBytes());
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   471
            count++;
44756
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   472
            if (serialClass != null) {
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   473
                if (serialClass.getName().contains("$$Lambda$")) {
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   474
                    // TBD: proper identification of serialized Lambdas?
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   475
                    // Fold the serialized Lambda into the SerializedLambda type
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   476
                    classes.add(SerializedLambda.class);
44756
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   477
                } else if (Proxy.isProxyClass(serialClass)) {
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   478
                    classes.add(Proxy.class);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   479
                } else {
44756
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   480
                    classes.add(serialClass);
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   481
                }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   482
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   483
            }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   484
            this.maxArray = Math.max(this.maxArray, filter.arrayLength());
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   485
            this.maxRefs = Math.max(this.maxRefs, filter.references());
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   486
            this.maxDepth = Math.max(this.maxDepth, filter.depth());
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   487
            this.maxBytes = Math.max(this.maxBytes, filter.streamBytes());
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   488
            return ObjectInputFilter.Status.UNDECIDED;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   489
        }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   490
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   491
        public String toString(){
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   492
            return "count: " + count
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   493
                    + ", classes: " + classes.toString()
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   494
                    + ", maxArray: " + maxArray
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   495
                    + ", maxRefs: " + maxRefs
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   496
                    + ", maxDepth: " + maxDepth
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   497
                    + ", maxBytes: " + maxBytes;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   498
        }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   499
    }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   500
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   501
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   502
    /**
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   503
     * Create a filter from a pattern and API factory, then serialize and
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   504
     * deserialize an object and check allowed or reject.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   505
     *
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   506
     * @param pattern the pattern
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   507
     * @param object the test object
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   508
     * @param allowed the expected result from ObjectInputStream (exception or not)
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   509
     */
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   510
    static void testPatterns(String pattern, Object object, boolean allowed) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   511
        try {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   512
            byte[] bytes = SerialFilterTest.writeObjects(object);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   513
            ObjectInputFilter filter = ObjectInputFilter.Config.createFilter(pattern);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   514
            validate(bytes, filter);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   515
            Assert.assertTrue(allowed, "filter should have thrown an exception");
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   516
        } catch (IllegalArgumentException iae) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   517
            Assert.fail("bad format pattern", iae);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   518
        } catch (InvalidClassException ice) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   519
            Assert.assertFalse(allowed, "filter should not have thrown an exception: " + ice);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   520
        } catch (IOException ioe) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   521
            Assert.fail("Unexpected IOException", ioe);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   522
        }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   523
    }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   524
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   525
    /**
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   526
     * For a filter pattern, generate and apply a test object to the action.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   527
     * @param pattern a pattern
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   528
     * @param action an action to perform on positive and negative cases
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   529
     */
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   530
    static void evalPattern(String pattern, TriConsumer<String, Object, Boolean> action) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   531
        Object o = genTestObject(pattern, true);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   532
        Assert.assertNotNull(o, "success generation failed");
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   533
        action.accept(pattern, o, true);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   534
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   535
        // Test the negative pattern
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   536
        o = genTestObject(pattern, false);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   537
        Assert.assertNotNull(o, "fail generation failed");
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   538
        String negPattern = pattern.contains("=") ? pattern : "!" + pattern;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   539
        action.accept(negPattern, o, false);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   540
    }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   541
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   542
    /**
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   543
     * Generate a test object based on the pattern.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   544
     * Handles each of the forms of the pattern, wildcards,
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   545
     * class name, various limit forms.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   546
     * @param pattern a pattern
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   547
     * @param allowed a boolean indicating to generate the allowed or disallowed case
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   548
     * @return an object or {@code null} to indicate no suitable object could be generated
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   549
     */
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   550
    static Object genTestObject(String pattern, boolean allowed) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   551
        if (pattern.contains("=")) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   552
            return genTestLimit(pattern, allowed);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   553
        } else if (pattern.endsWith("*")) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   554
            return genTestObjectWildcard(pattern, allowed);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   555
        } else {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   556
            // class
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   557
            // isolate module name, if any
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   558
            int poffset = 0;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   559
            int soffset = pattern.indexOf('/', poffset);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   560
            String module = null;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   561
            if (soffset >= 0) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   562
                poffset = soffset + 1;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   563
                module = pattern.substring(0, soffset);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   564
            }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   565
            try {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   566
                Class<?> clazz = Class.forName(pattern.substring(poffset));
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   567
                Constructor<?> cons = clazz.getConstructor();
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   568
                return cons.newInstance();
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   569
            } catch (ClassNotFoundException ex) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   570
                Assert.fail("no such class available: " + pattern);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   571
            } catch (InvocationTargetException
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   572
                    | NoSuchMethodException
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   573
                    | InstantiationException
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   574
                    | IllegalAccessException ex1) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   575
                Assert.fail("newInstance: " + ex1);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   576
            }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   577
        }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   578
        return null;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   579
    }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   580
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   581
    /**
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   582
     * Generate an object to be used with the various wildcard pattern forms.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   583
     * Explicitly supports only specific package wildcards with specific objects.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   584
     * @param pattern a wildcard pattern ending in "*"
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   585
     * @param allowed a boolean indicating to generate the allowed or disallowed case
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   586
     * @return an object within or outside the wildcard
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   587
     */
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   588
    static Object genTestObjectWildcard(String pattern, boolean allowed) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   589
        if (pattern.endsWith(".**")) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   590
            // package hierarchy wildcard
41888
dc533ef5583a 8169055: [TESTBUG] java/io/Serializable/serialFilter/ tests have undeclared dependency on java.compiler module
rriggs
parents: 41230
diff changeset
   591
            if (pattern.startsWith("javax.net.")) {
dc533ef5583a 8169055: [TESTBUG] java/io/Serializable/serialFilter/ tests have undeclared dependency on java.compiler module
rriggs
parents: 41230
diff changeset
   592
                return SSLEngineResult.Status.BUFFER_OVERFLOW;
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   593
            }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   594
            if (pattern.startsWith("java.")) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   595
                return 4;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   596
            }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   597
            if (pattern.startsWith("javax.")) {
41888
dc533ef5583a 8169055: [TESTBUG] java/io/Serializable/serialFilter/ tests have undeclared dependency on java.compiler module
rriggs
parents: 41230
diff changeset
   598
                return SSLEngineResult.Status.BUFFER_UNDERFLOW;
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   599
            }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   600
            return otherObject;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   601
        } else if (pattern.endsWith(".*")) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   602
            // package wildcard
41888
dc533ef5583a 8169055: [TESTBUG] java/io/Serializable/serialFilter/ tests have undeclared dependency on java.compiler module
rriggs
parents: 41230
diff changeset
   603
            if (pattern.startsWith("javax.net.ssl")) {
dc533ef5583a 8169055: [TESTBUG] java/io/Serializable/serialFilter/ tests have undeclared dependency on java.compiler module
rriggs
parents: 41230
diff changeset
   604
                return SSLEngineResult.Status.BUFFER_UNDERFLOW;
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   605
            }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   606
        } else {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   607
            // class wildcard
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   608
            if (pattern.equals("*")) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   609
                return otherObject; // any object will do
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   610
            }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   611
            if (pattern.startsWith("java.util.Hash")) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   612
                return new Hashtable<String, String>();
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   613
            }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   614
        }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   615
        Assert.fail("Object could not be generated for pattern: "
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   616
                + pattern
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   617
                + ", allowed: " + allowed);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   618
        return null;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   619
    }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   620
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   621
    /**
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   622
     * Generate a limit test object for the pattern.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   623
     * For positive cases, the object exactly hits the limit.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   624
     * For negative cases, the object is 1 greater than the limit
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   625
     * @param pattern the pattern, containing "=" and a maxXXX keyword
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   626
     * @param allowed a boolean indicating to generate the allowed or disallowed case
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   627
     * @return a sitable object
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   628
     */
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   629
    static Object genTestLimit(String pattern, boolean allowed) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   630
        int ndx = pattern.indexOf('=');
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   631
        Assert.assertNotEquals(ndx, -1, "missing value in limit");
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   632
        long value = Long.parseUnsignedLong(pattern.substring(ndx+1));
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   633
        if (pattern.startsWith("maxdepth=")) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   634
            // Return an object with the requested depth (or 1 greater)
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   635
            long depth = allowed ? value : value + 1;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   636
            Object[] array = new Object[1];
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   637
            for (int i = 1; i < depth; i++) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   638
                Object[] n = new Object[1];
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   639
                n[0] = array;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   640
                array = n;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   641
            }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   642
            return array;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   643
        } else if (pattern.startsWith("maxbytes=")) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   644
            // Return a byte array that when written to OOS creates
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   645
            // a stream of exactly the size requested.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   646
            return genMaxBytesObject(allowed, value);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   647
        } else if (pattern.startsWith("maxrefs=")) {
44756
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   648
            // 4 references to classes in addition to the array contents
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   649
            Object[] array = new Object[allowed ? (int)value - 4 : (int)value - 3];
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   650
            for (int i = 0; i < array.length; i++) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   651
                array[i] = otherObject;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   652
            }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   653
            return array;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   654
        } else if (pattern.startsWith("maxarray=")) {
42446
397681315009 8170291: Unpredictable results of j.i.ObjectInputFilter::createFilter
rriggs
parents: 41888
diff changeset
   655
                return allowed ? new int[(int)value] : new int[(int)value+1];
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   656
        }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   657
        Assert.fail("Object could not be generated for pattern: "
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   658
                + pattern
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   659
                + ", allowed: " + allowed);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   660
        return null;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   661
    }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   662
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   663
    /**
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   664
     * Generate an an object that will be serialized to some number of bytes.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   665
     * Or 1 greater if allowed is false.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   666
     * It returns a two element Object array holding a byte array sized
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   667
     * to achieve the desired total size.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   668
     * @param allowed true if the stream should be allowed at that size,
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   669
     *                false if the stream should be larger
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   670
     * @param maxBytes the number of bytes desired in the stream;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   671
     *                 should not be less than 72 (due to protocol overhead).
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   672
     * @return a object that will be serialized to the length requested
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   673
     */
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   674
    private static Object genMaxBytesObject(boolean allowed, long maxBytes) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   675
        Object[] holder = new Object[2];
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   676
        long desiredSize = allowed ? maxBytes : maxBytes + 1;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   677
        long actualSize = desiredSize;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   678
        long byteSize = desiredSize - 72;  // estimate needed array size
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   679
        do {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   680
            byteSize += (desiredSize - actualSize);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   681
            byte[] a = new byte[(int)byteSize];
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   682
            holder[0] = a;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   683
            holder[1] = a;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   684
            try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   685
                 ObjectOutputStream os = new ObjectOutputStream(baos)) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   686
                os.writeObject(holder);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   687
                os.flush();
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   688
                actualSize = baos.size();
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   689
            } catch (IOException ie) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   690
                Assert.fail("exception generating stream", ie);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   691
            }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   692
        } while (actualSize != desiredSize);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   693
        return holder;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   694
    }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   695
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   696
    /**
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   697
     * Returns a HashSet of a requested depth.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   698
     * @param depth the depth
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   699
     * @return a HashSet of HashSets...
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   700
     */
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   701
    static HashSet<Object> deepHashSet(int depth) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   702
        HashSet<Object> hashSet = new HashSet<>();
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   703
        HashSet<Object> s1 = hashSet;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   704
        HashSet<Object> s2 = new HashSet<>();
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   705
        for (int i = 0; i < depth; i++ ) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   706
            HashSet<Object> t1 = new HashSet<>();
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   707
            HashSet<Object> t2 = new HashSet<>();
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   708
            // make t1 not equal to t2
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   709
            t1.add("by Jimminy");
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   710
            s1.add(t1);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   711
            s1.add(t2);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   712
            s2.add(t1);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   713
            s2.add(t2);
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   714
            s1 = t1;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   715
            s2 = t2;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   716
        }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   717
        return hashSet;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   718
    }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   719
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   720
    /**
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   721
     * Simple method to use with Serialized Lambda.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   722
     */
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   723
    private static void noop() {}
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   724
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   725
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   726
    /**
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   727
     * Class that returns an array from readResolve and also implements
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   728
     * the ObjectInputFilter to check that it has the expected length.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   729
     */
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   730
    static class ReadResolveToArray implements Serializable, ObjectInputFilter {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   731
        private static final long serialVersionUID = 123456789L;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   732
58565
baa5969ecf34 8231427: Warning cleanup in tests of java.io.Serializable
rriggs
parents: 47423
diff changeset
   733
        @SuppressWarnings("serial") /* Incorrect declarations are being tested */
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   734
        private final Object array;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   735
        private final int length;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   736
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   737
        ReadResolveToArray(Object array, int length) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   738
            this.array = array;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   739
            this.length = length;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   740
        }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   741
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   742
        Object readResolve() {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   743
            return array;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   744
        }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   745
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   746
        @Override
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   747
        public ObjectInputFilter.Status checkInput(FilterInfo filter) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   748
            if (ReadResolveToArray.class.isAssignableFrom(filter.serialClass())) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   749
                return ObjectInputFilter.Status.ALLOWED;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   750
            }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   751
            if (filter.serialClass() != array.getClass() ||
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   752
                    (filter.arrayLength() >= 0 && filter.arrayLength() != length)) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   753
                return ObjectInputFilter.Status.REJECTED;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   754
            }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   755
            return ObjectInputFilter.Status.UNDECIDED;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   756
        }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   757
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   758
    }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   759
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   760
    /**
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   761
     * Hold a snapshot of values to be passed to an ObjectInputFilter.
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   762
     */
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   763
    static class FilterValues implements ObjectInputFilter.FilterInfo {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   764
        private final Class<?> clazz;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   765
        private final long arrayLength;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   766
        private final long depth;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   767
        private final long references;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   768
        private final long streamBytes;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   769
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   770
        public FilterValues(Class<?> clazz, long arrayLength, long depth, long references, long streamBytes) {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   771
            this.clazz = clazz;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   772
            this.arrayLength = arrayLength;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   773
            this.depth = depth;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   774
            this.references = references;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   775
            this.streamBytes = streamBytes;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   776
        }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   777
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   778
        @Override
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   779
        public Class<?> serialClass() {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   780
            return clazz;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   781
        }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   782
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   783
        public long arrayLength() {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   784
            return arrayLength;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   785
        }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   786
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   787
        public long depth() {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   788
            return depth;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   789
        }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   790
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   791
        public long references() {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   792
            return references;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   793
        }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   794
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   795
        public long streamBytes() {
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   796
            return streamBytes;
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   797
        }
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   798
    }
44756
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   799
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   800
    // Deeper superclass hierarchy
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   801
    static class A implements Serializable {
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   802
        private static final long serialVersionUID = 1L;
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   803
    };
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   804
    static class B extends A {
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   805
        private static final long serialVersionUID = 2L;
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   806
    }
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   807
    static class C extends B {
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   808
        private static final long serialVersionUID = 3L;
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   809
    }
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   810
    static class D extends C {
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   811
        private static final long serialVersionUID = 4L;
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   812
    }
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   813
    static class E extends D {
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   814
        private static final long serialVersionUID = 5L;
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   815
    }
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   816
    static class F extends E {
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   817
        private static final long serialVersionUID = 6L;
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   818
    }
b887cb49e622 8172299: Improve class processing
rriggs
parents: 42446
diff changeset
   819
41230
0a8c1ba2b6fb 8155760: Implement Serialization Filtering
rriggs
parents:
diff changeset
   820
}