test/jdk/jdk/jfr/api/event/dynamic/TestEventFactory.java
author mgronlun
Wed, 30 Oct 2019 19:43:52 +0100
changeset 58863 c16ac7a2eba4
parent 51214 67736b4846a0
permissions -rw-r--r--
8226511: Implement JFR Event Streaming Reviewed-by: egahlin, mseledtsov, mgronlun Contributed-by: erik.gahlin@oracle.com, mikhailo.seledtsov@oracle.com, markus.gronlund@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     1
/*
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     2
 * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     4
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    10
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    15
 * accompanied this code).
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    16
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    20
 *
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    23
 * questions.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    24
 */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    25
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    26
package jdk.jfr.api.event.dynamic;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    27
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    28
import java.io.IOException;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    29
import java.lang.annotation.ElementType;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    30
import java.lang.annotation.Retention;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    31
import java.lang.annotation.RetentionPolicy;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    32
import java.lang.annotation.Target;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    33
import java.util.ArrayList;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    34
import java.util.Collections;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    35
import java.util.Comparator;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    36
import java.util.HashMap;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    37
import java.util.List;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    38
import java.util.Map;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    39
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    40
import jdk.jfr.AnnotationElement;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    41
import jdk.jfr.Event;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    42
import jdk.jfr.EventFactory;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    43
import jdk.jfr.EventType;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    44
import jdk.jfr.MetadataDefinition;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    45
import jdk.jfr.Recording;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    46
import jdk.jfr.ValueDescriptor;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    47
import jdk.jfr.consumer.RecordedClass;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    48
import jdk.jfr.consumer.RecordedEvent;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    49
import jdk.jfr.consumer.RecordedThread;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    50
import jdk.jfr.consumer.RecordingFile;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    51
import jdk.test.lib.Asserts;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    52
import jdk.test.lib.jfr.EventTypePrototype;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    53
import jdk.test.lib.jfr.Events;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    54
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    55
51214
67736b4846a0 8207830: [aix] disable jfr in build and tests
goetz
parents: 50113
diff changeset
    56
/**
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    57
 * @test
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    58
 * @key jfr
51214
67736b4846a0 8207830: [aix] disable jfr in build and tests
goetz
parents: 50113
diff changeset
    59
 * @requires vm.hasJFR
50113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    60
 * @library /test/lib
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    61
 * @run main/othervm jdk.jfr.api.event.dynamic.TestEventFactory
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    62
 */
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    63
public class TestEventFactory {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    64
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    65
    @MetadataDefinition
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    66
    @Retention(RetentionPolicy.RUNTIME)
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    67
    @Target({ ElementType.FIELD, ElementType.TYPE })
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    68
    public @interface TestAnnotation {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    69
        String value();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    70
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    71
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    72
    public final static Map<String, Object> EVENT_VALUES = new HashMap<>();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    73
    public final static EventTypePrototype EVENT_TYPE_SHOULD_NOT_COMMIT;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    74
    public final static EventTypePrototype EVENT_TYPE_SHOULD_COMMIT;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    75
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    76
    // keep alive to prevent event metadata getting GC.
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    77
    public static EventFactory ef1;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    78
    public static EventFactory ef2;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    79
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    80
    static {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    81
        EVENT_VALUES.put("intField", Integer.MAX_VALUE);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    82
        EVENT_VALUES.put("longField", Long.MAX_VALUE);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    83
        EVENT_VALUES.put("byteField", (byte) 5);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    84
        EVENT_VALUES.put("charField", (char) 'H');
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    85
        EVENT_VALUES.put("shortField", (short) 56);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    86
        EVENT_VALUES.put("booleanField", true);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    87
        EVENT_VALUES.put("floatField", 4711.0f);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    88
        EVENT_VALUES.put("doubleField", 3.141);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    89
        EVENT_VALUES.put("classField", String.class);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    90
        EVENT_VALUES.put("stringField", "Yeah!");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    91
        EVENT_VALUES.put("threadField", Thread.currentThread());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    92
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    93
        EVENT_TYPE_SHOULD_NOT_COMMIT = makeEventType("com.test.ShouldNotCommit");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    94
        EVENT_TYPE_SHOULD_COMMIT = makeEventType("com.test.ShouldCommit");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    95
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    96
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    97
    public static void main(String[] args) throws Throwable {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    98
        Recording r = new Recording();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
    99
        r.enable(EVENT_TYPE_SHOULD_COMMIT.getName()).withoutStackTrace();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   100
        r.enable(EVENT_TYPE_SHOULD_NOT_COMMIT.getName()).withoutStackTrace();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   101
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   102
        // Commit before start, should not be included
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   103
        ef1 = EventFactory.create(EVENT_TYPE_SHOULD_NOT_COMMIT.getAnnotations(), EVENT_TYPE_SHOULD_NOT_COMMIT.getFields());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   104
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   105
        Event event1 = ef1.newEvent();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   106
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   107
        setEventValues(event1, ef1, EVENT_TYPE_SHOULD_NOT_COMMIT);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   108
        event1.commit();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   109
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   110
        r.start();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   111
        // Commit after start, should be included
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   112
        ef2 = EventFactory.create(EVENT_TYPE_SHOULD_COMMIT.getAnnotations(),  EVENT_TYPE_SHOULD_COMMIT.getFields());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   113
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   114
        Event event2 = ef2.newEvent();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   115
        setEventValues(event2, ef2, EVENT_TYPE_SHOULD_COMMIT);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   116
        event2.commit();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   117
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   118
        r.stop();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   119
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   120
        RecordingFile es = Events.copyTo(r);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   121
        EventType e1 = findEventType(es.readEventTypes(), EVENT_TYPE_SHOULD_NOT_COMMIT.getName());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   122
        assertEquals(e1, ef1.getEventType());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   123
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   124
        EventType e2 = findEventType(es.readEventTypes(), EVENT_TYPE_SHOULD_COMMIT.getName());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   125
        assertEquals(e2, ef2.getEventType());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   126
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   127
        verifyEvent(es);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   128
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   129
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   130
    private static EventType findEventType(List<EventType> es, String name) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   131
        for (EventType t : es) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   132
            if (t.getName().equals(name)) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   133
                return t;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   134
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   135
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   136
        throw new AssertionError("Could not find expected event type " + name);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   137
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   138
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   139
    private static void assertEquals(EventType e1, EventType expected) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   140
        Asserts.assertEquals(e1.getName(), expected.getName());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   141
        Asserts.assertEquals(e1.getDescription(), expected.getDescription());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   142
        Asserts.assertEquals(e1.getLabel(), expected.getLabel());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   143
        assertValueDescriptorEquals(e1.getFields(), expected.getFields());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   144
        assertAnnotationEquals(e1.getAnnotationElements(), expected.getAnnotationElements());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   145
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   146
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   147
    private static void assertValueDescriptorEquals(List<ValueDescriptor> values, List<ValueDescriptor> expected) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   148
        if (values.isEmpty() && expected.isEmpty()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   149
            return;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   150
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   151
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   152
        Map<String, ValueDescriptor> valueMap = new HashMap<>();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   153
        for (ValueDescriptor v : values) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   154
            valueMap.put(v.getName(), v);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   155
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   156
        for (ValueDescriptor f : expected) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   157
            ValueDescriptor v = valueMap.remove(f.getName());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   158
            if (v == null) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   159
                throw new AssertionError("Expected value descriptor " + f.getName() + " not found");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   160
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   161
            assertEquals(v, f);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   162
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   163
        if (!valueMap.isEmpty()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   164
            throw new AssertionError("More fields than expected");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   165
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   166
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   167
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   168
    private static void assertEquals(ValueDescriptor v1, ValueDescriptor expected) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   169
        Asserts.assertEquals(v1.getName(), expected.getName());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   170
        Asserts.assertEquals(v1.getTypeName(), expected.getTypeName());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   171
        assertAnnotationEquals(v1.getAnnotationElements(), expected.getAnnotationElements());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   172
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   173
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   174
    private static void assertAnnotationEquals(List<AnnotationElement> annotations, List<AnnotationElement> expected) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   175
        annotations = new ArrayList<>(annotations); // make mutable
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   176
        expected = new ArrayList<>(expected); // make mutable
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   177
        class AnnotationTypeComparator implements Comparator<AnnotationElement> {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   178
            @Override
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   179
            public int compare(AnnotationElement a, AnnotationElement b) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   180
                return a.getTypeName().compareTo(b.getTypeName());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   181
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   182
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   183
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   184
        if (annotations.isEmpty() && expected.isEmpty()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   185
            return;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   186
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   187
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   188
        if (annotations.size() != expected.size()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   189
            System.out.println("Was:");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   190
            for(AnnotationElement ae: annotations) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   191
                System.out.println(ae.getTypeName());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   192
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   193
            System.out.println("Expected:");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   194
            for(AnnotationElement ae: expected) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   195
                System.out.println(ae.getTypeName());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   196
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   197
            throw new AssertionError("Wrong number of annotations");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   198
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   199
        Collections.sort(expected, new AnnotationTypeComparator());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   200
        Collections.sort(annotations, new AnnotationTypeComparator());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   201
        for (int i = 0; i < expected.size(); i++) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   202
            assertEquals(annotations.get(i), expected.get(i));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   203
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   204
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   205
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   206
    private static void assertEquals(AnnotationElement a1, AnnotationElement expected) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   207
        Asserts.assertEquals(a1.getTypeName(), expected.getTypeName());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   208
        // Don't recurse into annotation
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   209
        assertValueDescriptorEquals(a1.getValueDescriptors(), expected.getValueDescriptors());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   210
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   211
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   212
    private static void verifyEvent(RecordingFile rf) throws IOException {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   213
        if (!rf.hasMoreEvents()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   214
            throw new AssertionError("Expected one dynamic event");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   215
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   216
        verifyValues(rf.readEvent());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   217
        if (rf.hasMoreEvents()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   218
            throw new AssertionError("Expected one dynamic event");
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   219
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   220
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   221
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   222
    private static void setEventValues(Event event, EventFactory f, EventTypePrototype eventTypeProto) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   223
        for (Map.Entry<String, Object> entry : EVENT_VALUES.entrySet()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   224
            int index = eventTypeProto.getFieldIndex(entry.getKey());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   225
            event.set(index, entry.getValue());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   226
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   227
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   228
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   229
    private static void verifyValues(RecordedEvent event) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   230
        for (Map.Entry<String, Object> entry : EVENT_VALUES.entrySet()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   231
            String fieldName = entry.getKey();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   232
            Object value = event.getValue(fieldName);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   233
            Object expected = EVENT_VALUES.get(fieldName);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   234
            if (expected instanceof Class) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   235
                value = ((RecordedClass) value).getName();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   236
                expected = ((Class<?>) expected).getName();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   237
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   238
            if (expected instanceof Thread) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   239
                value = ((RecordedThread) value).getJavaName();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   240
                expected = ((Thread) expected).getName();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   241
            }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   242
            Asserts.assertEQ(value, expected);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   243
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   244
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   245
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   246
    private static EventTypePrototype makeEventType(String eventName) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   247
        EventTypePrototype prototype = new EventTypePrototype(eventName);
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   248
        prototype.addAnnotation(new AnnotationElement(TestAnnotation.class, "type"));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   249
        for (Map.Entry<String, Object> entry : EVENT_VALUES.entrySet()) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   250
            Class<?> type = makePrimitive(entry.getValue().getClass());
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   251
            String fieldName = entry.getKey();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   252
            prototype.addField(new ValueDescriptor(type, fieldName));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   253
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   254
        // add an annotated field
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   255
        List<AnnotationElement> annos = new ArrayList<>();
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   256
        annos.add(new AnnotationElement(TestAnnotation.class, "field"));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   257
        prototype.addField( new ValueDescriptor(int.class, "annotatedField", annos));
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   258
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   259
        return prototype;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   260
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   261
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   262
    private static Class<?> makePrimitive(Class<? extends Object> clazz) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   263
        if (clazz == Integer.class) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   264
            return int.class;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   265
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   266
        if (clazz == Long.class) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   267
            return long.class;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   268
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   269
        if (clazz == Double.class) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   270
            return double.class;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   271
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   272
        if (clazz == Float.class) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   273
            return float.class;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   274
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   275
        if (clazz == Short.class) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   276
            return short.class;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   277
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   278
        if (clazz == Character.class) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   279
            return char.class;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   280
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   281
        if (clazz == Byte.class) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   282
            return byte.class;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   283
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   284
        if (clazz == Boolean.class) {
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   285
            return boolean.class;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   286
        }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   287
        return clazz;
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   288
    }
caf115bb98ad 8199712: Flight Recorder
egahlin
parents:
diff changeset
   289
}