jdk/test/java/lang/invoke/lambda/LambdaClassLoaderSerialization.java
author mhaupt
Fri, 22 Apr 2016 13:36:22 +0200
changeset 37602 3a9532bbd89e
parent 24036 16da2a111dd3
child 45180 636b3e3f9976
permissions -rw-r--r--
8152667: MHs.iteratedLoop(...) throws unexpected WMTE, disallows Iterator subclasses, generates inconsistent loop result type Reviewed-by: redestad
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
16034
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
     1
/*
24036
16da2a111dd3 8039438: Some tests depend on internal API sun.misc.IOUtils
shurailine
parents: 16034
diff changeset
     2
 * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved.
16034
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
     4
 *
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
     7
 * published by the Free Software Foundation.
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
     8
 *
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    13
 * accompanied this code).
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    14
 *
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    18
 *
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    21
 * questions.
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    22
 */
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    23
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    24
/*
24036
16da2a111dd3 8039438: Some tests depend on internal API sun.misc.IOUtils
shurailine
parents: 16034
diff changeset
    25
 * @test
16da2a111dd3 8039438: Some tests depend on internal API sun.misc.IOUtils
shurailine
parents: 16034
diff changeset
    26
 * @bug 8004970
16da2a111dd3 8039438: Some tests depend on internal API sun.misc.IOUtils
shurailine
parents: 16034
diff changeset
    27
 * @summary Lambda serialization in the presence of class loaders
16da2a111dd3 8039438: Some tests depend on internal API sun.misc.IOUtils
shurailine
parents: 16034
diff changeset
    28
 * @library /lib/testlibrary
16da2a111dd3 8039438: Some tests depend on internal API sun.misc.IOUtils
shurailine
parents: 16034
diff changeset
    29
 * @build jdk.testlibrary.IOUtils
16da2a111dd3 8039438: Some tests depend on internal API sun.misc.IOUtils
shurailine
parents: 16034
diff changeset
    30
 * @run main LambdaClassLoaderSerialization
16da2a111dd3 8039438: Some tests depend on internal API sun.misc.IOUtils
shurailine
parents: 16034
diff changeset
    31
 * @author Peter Levart
16da2a111dd3 8039438: Some tests depend on internal API sun.misc.IOUtils
shurailine
parents: 16034
diff changeset
    32
 */
16034
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    33
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    34
import java.io.ByteArrayInputStream;
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    35
import java.io.ByteArrayOutputStream;
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    36
import java.io.IOException;
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    37
import java.io.InputStream;
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    38
import java.io.ObjectInputStream;
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    39
import java.io.ObjectOutputStream;
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    40
import java.io.Serializable;
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    41
import java.util.Arrays;
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    42
24036
16da2a111dd3 8039438: Some tests depend on internal API sun.misc.IOUtils
shurailine
parents: 16034
diff changeset
    43
import jdk.testlibrary.IOUtils;
16da2a111dd3 8039438: Some tests depend on internal API sun.misc.IOUtils
shurailine
parents: 16034
diff changeset
    44
16034
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    45
public class LambdaClassLoaderSerialization {
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    46
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    47
    public interface SerializableRunnable extends Runnable, Serializable {}
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    48
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    49
    public static class MyCode implements SerializableRunnable {
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    50
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    51
        private byte[] serialize(Object o) {
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    52
            ByteArrayOutputStream baos;
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    53
            try (
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    54
                ObjectOutputStream oos =
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    55
                    new ObjectOutputStream(baos = new ByteArrayOutputStream())
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    56
            ) {
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    57
                oos.writeObject(o);
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    58
            }
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    59
            catch (IOException e) {
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    60
                throw new RuntimeException(e);
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    61
            }
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    62
            return baos.toByteArray();
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    63
        }
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    64
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    65
        private <T> T deserialize(byte[] bytes) {
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    66
            try (
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    67
                ObjectInputStream ois =
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    68
                    new ObjectInputStream(new ByteArrayInputStream(bytes))
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    69
            ) {
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    70
                return (T) ois.readObject();
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    71
            }
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    72
            catch (IOException | ClassNotFoundException e) {
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    73
                throw new RuntimeException(e);
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    74
            }
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    75
        }
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    76
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    77
        @Override
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    78
        public void run() {
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    79
            System.out.println("                this: " + this);
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    80
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    81
            SerializableRunnable deSerializedThis = deserialize(serialize(this));
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    82
            System.out.println("    deSerializedThis: " + deSerializedThis);
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    83
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    84
            SerializableRunnable runnable = () -> {System.out.println("HELLO");};
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    85
            System.out.println("            runnable: " + runnable);
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    86
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    87
            SerializableRunnable deSerializedRunnable = deserialize(serialize(runnable));
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    88
            System.out.println("deSerializedRunnable: " + deSerializedRunnable);
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    89
        }
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    90
    }
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    91
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    92
    public static void main(String[] args) throws Exception {
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    93
        ClassLoader myCl = new MyClassLoader(
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    94
            LambdaClassLoaderSerialization.class.getClassLoader()
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    95
        );
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    96
        Class<?> myCodeClass = Class.forName(
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    97
            LambdaClassLoaderSerialization.class.getName() + "$MyCode",
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    98
            true,
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
    99
            myCl
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
   100
        );
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
   101
        Runnable myCode = (Runnable) myCodeClass.newInstance();
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
   102
        myCode.run();
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
   103
    }
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
   104
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
   105
    static class MyClassLoader extends ClassLoader {
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
   106
        MyClassLoader(ClassLoader parent) {
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
   107
            super(parent);
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
   108
        }
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
   109
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
   110
        @Override
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
   111
        protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
   112
            if (name.indexOf('.') < 0) {
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
   113
                synchronized (getClassLoadingLock(name)) {
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
   114
                    Class<?> c = findLoadedClass(name);
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
   115
                    if (c == null) {
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
   116
                        c = findClass(name);
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
   117
                    }
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
   118
                    if (resolve) {
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
   119
                        resolveClass(c);
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
   120
                    }
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
   121
                    return c;
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
   122
                }
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
   123
            } else {
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
   124
                return super.loadClass(name, resolve);
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
   125
            }
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
   126
        }
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
   127
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
   128
        @Override
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
   129
        protected Class<?> findClass(String name) throws ClassNotFoundException {
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
   130
            String path = name.replace('.', '/').concat(".class");
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
   131
            try (InputStream is = getResourceAsStream(path)) {
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
   132
                if (is != null) {
24036
16da2a111dd3 8039438: Some tests depend on internal API sun.misc.IOUtils
shurailine
parents: 16034
diff changeset
   133
                    byte[] bytes = IOUtils.readFully(is);
16034
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
   134
                    return defineClass(name, bytes, 0, bytes.length);
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
   135
                } else {
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
   136
                    throw new ClassNotFoundException(name);
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
   137
                }
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
   138
            }
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
   139
            catch (IOException e) {
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
   140
                throw new ClassNotFoundException(name, e);
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
   141
            }
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
   142
        }
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
   143
    }
cb5fbea1ecec 8008770: SerializedLambda incorrect class loader for lambda deserializing class
rfield
parents:
diff changeset
   144
}