1 /*
   2  * Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 package jdk.jfr.api.recorder;
  26 
  27 import java.util.concurrent.CountDownLatch;
  28 
  29 import jdk.jfr.FlightRecorder;
  30 import jdk.jfr.FlightRecorderListener;
  31 import jdk.jfr.Recording;
  32 import jdk.jfr.RecordingState;
  33 
  34 /*
  35  * @test TestRecorderListener
  36  *
  37  * @key jfr
  38  * @run main/othervm jdk.jfr.api.recorder.TestRecorderListener
  39  */
  40 public class TestRecorderListener {
  41 
  42     static class Listener implements FlightRecorderListener {
  43 
  44         private final CountDownLatch latch = new CountDownLatch(1);
  45         private final RecordingState waitFor;
  46 
  47         public Listener(RecordingState state) {
  48             waitFor = state;
  49         }
  50 
  51         @Override
  52         public void recordingStateChanged(Recording recording) {
  53             System.out.println("Listener: recording=" + recording.getName() + " state=" + recording.getState());
  54             RecordingState rs = recording.getState();
  55             if (rs == waitFor) {
  56                 latch.countDown();
  57             }
  58         }
  59 
  60         public void waitFor() throws InterruptedException {
  61             latch.await();
  62         }
  63     }
  64 
  65     public static void main(String... args) throws Exception {
  66         Listener recordingListener = new Listener(RecordingState.RUNNING);
  67         FlightRecorder.addListener(recordingListener);
  68 
  69         Listener stoppedListener = new Listener(RecordingState.STOPPED);
  70         FlightRecorder.addListener(stoppedListener);
  71 
  72         Listener finishedListener = new Listener(RecordingState.CLOSED);
  73         FlightRecorder.addListener(finishedListener);
  74 
  75         Recording recording = new Recording();
  76         if (recording.getState() != RecordingState.NEW) {
  77             recording.close();
  78             throw new Exception("New recording should be in NEW state");
  79         }
  80 
  81         recording.start();
  82         recordingListener.waitFor();
  83 
  84         recording.stop();
  85         stoppedListener.waitFor();
  86 
  87         recording.close();
  88         finishedListener.waitFor();
  89 
  90         testDefaultrecordingStateChangedListener();
  91 
  92     }
  93 
  94     private static class DummyListener implements FlightRecorderListener {
  95 
  96     }
  97 
  98     private static void testDefaultrecordingStateChangedListener() {
  99         FlightRecorder.addListener(new DummyListener());
 100         Recording recording = new Recording();
 101         recording.start();
 102         recording.stop();
 103         recording.close();
 104     }
 105 }