# HG changeset patch # User egahlin # Date 1572451346 -3600 # Node ID abeb87af766ebd985eb131b12b615accc4f15862 # Parent 83c307e006307dd3f494bdd60fbd2236902ba2b2 Make TestSetEndTime more stable diff -r 83c307e00630 -r abeb87af766e test/jdk/jdk/jfr/api/consumer/recordingstream/TestSetEndTime.java --- a/test/jdk/jdk/jfr/api/consumer/recordingstream/TestSetEndTime.java Wed Oct 30 11:38:40 2019 +0100 +++ b/test/jdk/jdk/jfr/api/consumer/recordingstream/TestSetEndTime.java Wed Oct 30 17:02:26 2019 +0100 @@ -56,7 +56,8 @@ @Name("Mark") @StackTrace(false) public final static class Mark extends Event { - public boolean before; + public boolean include; + public int id; } public static void main(String... args) throws Exception { @@ -98,68 +99,77 @@ } static void testEventStream() throws InterruptedException, IOException, Exception { - try (Recording r = new Recording()) { - r.setFlushInterval(Duration.ofSeconds(1)); - r.start(); - Mark event1 = new Mark(); - event1.begin(); // start time - event1.before = true; - advanceClock(); - event1.commit(); + while (true) { + try (Recording r = new Recording()) { + r.start(); + + Mark event1 = new Mark(); + event1.id = 1; + event1.include = false; + event1.commit(); // start time + + nap(); + + Mark event2 = new Mark(); + event2.id = 2; + event2.include = true; + event2.commit(); + + nap(); - Mark event2 = new Mark(); - event2.begin(); // end time - advanceClock(); - Thread.sleep(100); - event2.before = false; - event2.commit(); + Mark event3 = new Mark(); + event3.id = 3; + event3.include = false; + event3.commit(); // end time - Path p = Paths.get("recording.jfr"); - r.dump(p); - Instant start = null; - Instant end = null; - for (RecordedEvent e : RecordingFile.readAllEvents(p)) { - if (e.getBoolean("before")) { - start = e.getStartTime(); - System.out.println("Start: " + start); + Path p = Paths.get("recording.jfr"); + r.dump(p); + Instant start = null; + Instant end = null; + System.out.println("Find start and end time as instants:"); + for (RecordedEvent e : RecordingFile.readAllEvents(p)) { + if (e.getInt("id") == 1) { + start = e.getEndTime(); + System.out.println("Start : " + start); + } + if (e.getInt("id") == 2) { + Instant middle = e.getEndTime(); + System.out.println("Middle : " + middle); + } + if (e.getInt("id") == 3) { + end = e.getEndTime(); + System.out.println("End : " + end); + } } - if (!e.getBoolean("before")) { - end = e.getStartTime(); - System.out.println("End : " + end); - } - } - System.out.println("==================="); - AtomicBoolean error = new AtomicBoolean(true); - try (EventStream d = EventStream.openRepository()) { - d.setStartTime(start); - d.setEndTime(end); - d.onEvent(e -> { - System.out.println(e); - System.out.println("Event:"); - System.out.println(e.getStartTime()); - System.out.println(e.getEndTime()); - System.out.println(e.getBoolean("before")); - System.out.println(); - boolean before = e.getBoolean("before"); - if (before) { - error.set(false); - } else { - error.set(true); + System.out.println(); + System.out.println("Opening stream between " + start + " and " + end); + AtomicBoolean success = new AtomicBoolean(false); + AtomicInteger eventsCount = new AtomicInteger(); + try (EventStream d = EventStream.openRepository()) { + d.setStartTime(start.plusNanos(1)); + // Stream should close when end is reached + d.setEndTime(end.minusNanos(1)); + d.onEvent(e -> { + eventsCount.incrementAndGet(); + boolean include = e.getBoolean("include"); + System.out.println("Event " + e.getEndTime() + " include=" + include); + if (include) { + success.set(true); + } + }); + d.start(); + if (eventsCount.get() == 1 && success.get()) { + return; } - }); - d.start(); - if (error.get()) { - throw new Exception("Found unexpected event!"); } } } + } - private static void advanceClock() { - // Wait for some clock movement with - // java.time clock resolution. - Instant now = Instant.now(); - while (Instant.now().equals(now)) { - } + private static void nap() throws InterruptedException { + // Ensure we advance at least 1 ns with fast time + Thread.sleep(1); } + }