test/jdk/jdk/jfr/api/event/TestExtends.java
changeset 50113 caf115bb98ad
child 51214 67736b4846a0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/jdk/jfr/api/event/TestExtends.java	Tue May 15 20:24:34 2018 +0200
@@ -0,0 +1,187 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package jdk.jfr.api.event;
+
+import jdk.jfr.Event;
+import jdk.jfr.EventType;
+import jdk.jfr.Recording;
+import jdk.jfr.ValueDescriptor;
+import jdk.jfr.consumer.RecordedEvent;
+import jdk.test.lib.Asserts;
+import jdk.test.lib.jfr.Events;
+
+/*
+ * @test
+ * @summary Test with event class inheritance
+ * @key jfr
+ * @library /test/lib
+ * @run main/othervm jdk.jfr.api.event.TestExtends
+ */
+
+public class TestExtends {
+
+    private static final int DEFAULT_FIELD_COUNT = 4;
+
+    @SuppressWarnings("unused")
+    private static class GrandpaEvent extends Event {
+        public int gPublicField = 4;
+        protected int gProtectedField = 3;
+        private int gPrivateField = 2;
+        int gDefaultField = 1;
+        private int hiddenField = 4711;
+    }
+
+    @SuppressWarnings("unused")
+    private static class ParentEvent extends GrandpaEvent {
+        public int pPublicField = 40;
+        protected int pProtectedField = 30;
+        private int pPrivateField = 20;
+        int pDefaultField = 10;
+        private boolean hiddenField = true;
+    }
+
+    @SuppressWarnings("unused")
+    private static class MeEvent extends ParentEvent {
+        public int mPublicField = 400;
+        protected int mProtectedField = 300;
+        private int mPrivateField = 200;
+        int mDefaultField = 100;
+        private String hiddenField = "Hidden";
+    }
+
+    public static void main(String[] args) throws Exception {
+        Recording r = new Recording();
+        r.enable(GrandpaEvent.class).withoutStackTrace();
+        r.enable(ParentEvent.class).withStackTrace();
+        r.enable(MeEvent.class).withoutStackTrace();
+        r.start();
+
+        GrandpaEvent g = new GrandpaEvent();
+        g.commit();
+
+        ParentEvent p = new ParentEvent();
+        p.commit();
+
+        MeEvent m = new MeEvent();
+        m.commit();
+
+        r.stop();
+        for (RecordedEvent re : Events.fromRecording(r)) {
+            System.out.println(re);
+        }
+        // Grandpa
+        EventType grandpaType = EventType.getEventType(GrandpaEvent.class);
+        verifyField(grandpaType, "gPublicField");
+        verifyField(grandpaType, "gProtectedField");
+        verifyField(grandpaType, "gPrivateField");
+        verifyField(grandpaType, "gDefaultField");
+        verifyField(grandpaType, "hiddenField");
+        verifyFieldCount(grandpaType, 5);
+
+        // Parent
+        EventType parentType = EventType.getEventType(ParentEvent.class);
+        verifyField(parentType, "gPublicField");
+        verifyField(parentType, "gProtectedField");
+        verifyField(parentType, "gDefaultField");
+        verifyField(parentType, "pPublicField");
+        verifyField(parentType, "pProtectedField");
+        verifyField(parentType, "pPrivateField");
+        verifyField(parentType, "pDefaultField");
+        verifyField(parentType, "hiddenField");
+        verifyFieldCount(parentType, 8);
+
+        // Me
+        EventType meType = EventType.getEventType(MeEvent.class);
+        verifyField(meType, "gPublicField");
+        verifyField(meType, "gProtectedField");
+        verifyField(meType, "gDefaultField");
+        verifyField(meType, "pPublicField");
+        verifyField(meType, "pProtectedField");
+        verifyField(meType, "pDefaultField");
+        verifyField(meType, "mPublicField");
+        verifyField(meType, "mProtectedField");
+        verifyField(meType, "mPrivateField");
+        verifyField(meType, "mDefaultField");
+        verifyField(meType, "hiddenField");
+        verifyFieldCount(meType, 11);
+
+        for (RecordedEvent re : Events.fromRecording(r)) {
+            System.out.println(re);
+        }
+
+        RecordedEvent grandpa = findEvent(r, GrandpaEvent.class.getName());
+        Asserts.assertEquals(grandpa.getValue("gPublicField"), 4);
+        Asserts.assertEquals(grandpa.getValue("gProtectedField"), 3);
+        Asserts.assertEquals(grandpa.getValue("gPrivateField"), 2);
+        Asserts.assertEquals(grandpa.getValue("gDefaultField"), 1);
+        Asserts.assertEquals(grandpa.getValue("hiddenField"), 4711);
+
+        RecordedEvent parent = findEvent(r, ParentEvent.class.getName());
+        Asserts.assertEquals(parent.getValue("gPublicField"), 4);
+        Asserts.assertEquals(parent.getValue("gProtectedField"), 3);
+        Asserts.assertEquals(parent.getValue("gDefaultField"), 1);
+        Asserts.assertEquals(parent.getValue("pPublicField"), 40);
+        Asserts.assertEquals(parent.getValue("pProtectedField"), 30);
+        Asserts.assertEquals(parent.getValue("pPrivateField"), 20);
+        Asserts.assertEquals(parent.getValue("pDefaultField"), 10);
+        Asserts.assertEquals(parent.getValue("hiddenField"), true);
+
+        RecordedEvent me = findEvent(r, MeEvent.class.getName());
+        Asserts.assertEquals(me.getValue("gPublicField"), 4);
+        Asserts.assertEquals(me.getValue("gProtectedField"), 3);
+        Asserts.assertEquals(me.getValue("gDefaultField"), 1);
+        Asserts.assertEquals(me.getValue("pPublicField"), 40);
+        Asserts.assertEquals(me.getValue("pProtectedField"), 30);
+        Asserts.assertEquals(me.getValue("pDefaultField"), 10);
+        Asserts.assertEquals(me.getValue("mPublicField"), 400);
+        Asserts.assertEquals(me.getValue("mProtectedField"), 300);
+        Asserts.assertEquals(me.getValue("mPrivateField"), 200);
+        Asserts.assertEquals(me.getValue("mDefaultField"), 100);
+        Asserts.assertEquals(me.getValue("hiddenField"), "Hidden");
+    }
+
+    private static RecordedEvent findEvent(Recording r, String name) throws Exception {
+        for (RecordedEvent re : Events.fromRecording(r)) {
+            if (re.getEventType().getName().equals(name)) {
+                return re;
+            }
+        }
+        throw new Exception("Event type hierarchy exist, but missing event " + name + " from recording");
+    }
+
+    private static void verifyFieldCount(EventType t, int count) throws Exception {
+        if (t.getFields().size() != count + DEFAULT_FIELD_COUNT) {
+            throw new Exception("Incorrect number of fields " + count);
+        }
+    }
+
+    private static void verifyField(EventType t, String name) throws Exception {
+        ValueDescriptor d = t.getField(name);
+        if (d == null) {
+            throw new Exception("Missing field " + name + " in event " + t.getName());
+        }
+    }
+}