Skip to content

Commit

Permalink
7188098: TEST_BUG: closed/javax/sound/midi/Synthesizer/Receiver/bug61…
Browse files Browse the repository at this point in the history
…86488.java fails

Reviewed-by: serb
  • Loading branch information
lawrence-andrew authored and mrserb committed Sep 5, 2021
1 parent cec6c06 commit c640fe4
Showing 1 changed file with 160 additions and 29 deletions.
189 changes: 160 additions & 29 deletions test/jdk/javax/sound/midi/Synthesizer/Receiver/bug6186488.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2005, 2021, 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
Expand All @@ -21,52 +21,183 @@
* questions.
*/

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import java.lang.reflect.InvocationTargetException;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

import javax.sound.midi.MidiDevice;
import javax.sound.midi.MidiMessage;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.MidiUnavailableException;
import javax.swing.JDialog;
import javax.swing.SwingUtilities;
import javax.swing.JTextArea;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.Timer;
import javax.swing.JPanel;
import javax.swing.WindowConstants;

/**
/*
* @test
* @bug 6186488
* @summary Tests that software Java Syntesizer processed
* non-ShortMessage-derived messages
* @run main/manual=yesno bug6186488
* @run main/manual bug6186488
*/
public class bug6186488 {
public static void main(String[] args) throws Exception {
MidiDevice/*Synthesizer*/ synth = null;
private static final CountDownLatch countDownLatch = new CountDownLatch(1);
private static final int testTimeout = 300000;
private static volatile String testFailureMsg;
private static volatile boolean testPassed;
private static volatile boolean testFinished;

public static void main(String[] args) throws InterruptedException, InvocationTargetException {
SwingUtilities.invokeAndWait(() -> createAndShowTestDialog());
try {
synth = MidiSystem.getSynthesizer();
//synth = MidiSystem.getMidiDevice(infos[0]);
if (!countDownLatch.await(testTimeout, TimeUnit.MILLISECONDS)) {
throw new RuntimeException(String.format("Test timeout '%d ms' elapsed.", testTimeout));
}
if (!testPassed) {
String failureMsg = testFailureMsg;
if ((failureMsg != null) && (!failureMsg.trim().isEmpty())) {
throw new RuntimeException(failureMsg);
} else {
throw new RuntimeException("Test failed.");
}
}
} catch (InterruptedException ie) {
throw new RuntimeException(ie);
} finally {
testFinished = true;
}
}

private static void pass() {
testPassed = true;
countDownLatch.countDown();
}

private static void fail(String failureMsg) {
testFailureMsg = failureMsg;
testPassed = false;
countDownLatch.countDown();
}

private static String convertMillisToTimeStr(int millis) {
if (millis < 0) {
return "00:00:00";
}
int hours = millis / 3600000;
int minutes = (millis - hours * 3600000) / 60000;
int seconds = (millis - hours * 3600000 - minutes * 60000) / 1000;
return String.format("%02d:%02d:%02d", hours, minutes, seconds);
}

private static void createAndShowTestDialog() {
String testInstruction = "This test verify that software Java Syntesizer processed non-ShortMessage-derived messages.\n" +
"Close all other programs that may use the sound card.\n" +
"Make sure that the speakers are connected and the volume is up.\n" +
"Click on 'Start Test' button. If you listen a sound then test pass else test fail.";

final JDialog dialog = new JDialog();
dialog.setTitle("Test Sound");
dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
dialog.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
dialog.dispose();
fail("Main dialog was closed.");
}
});

final JLabel testTimeoutLabel = new JLabel(String.format("Test timeout: %s", convertMillisToTimeStr(testTimeout)));
final long startTime = System.currentTimeMillis();
final Timer timer = new Timer(0, null);
timer.setDelay(1000);
timer.addActionListener((e) -> {
int leftTime = testTimeout - (int) (System.currentTimeMillis() - startTime);
if ((leftTime < 0) || testFinished) {
timer.stop();
dialog.dispose();
}
testTimeoutLabel.setText(String.format("Test timeout: %s", convertMillisToTimeStr(leftTime)));
});
timer.start();

JTextArea textArea = new JTextArea(testInstruction);
textArea.setEditable(false);

final JButton startTestButton = new JButton("Start Test");
final JButton passButton = new JButton("PASS");
final JButton failButton = new JButton("FAIL");
startTestButton.addActionListener((e) -> {
new Thread(() -> {
try {
doTest();

SwingUtilities.invokeLater(() -> {
passButton.setEnabled(true);
failButton.setEnabled(true);
});
} catch (Throwable t) {
t.printStackTrace();
dialog.dispose();
fail("Exception occurred in a thread executing the test.");
}
}).start();
});
passButton.setEnabled(false);
passButton.addActionListener((e) -> {
dialog.dispose();
pass();
});
failButton.setEnabled(false);
failButton.addActionListener((e) -> {
dialog.dispose();
fail("Expected that sound will be heard but did not hear sound");
});

JPanel mainPanel = new JPanel(new BorderLayout());
JPanel labelPanel = new JPanel(new FlowLayout());
labelPanel.add(testTimeoutLabel);
mainPanel.add(labelPanel, BorderLayout.NORTH);
mainPanel.add(textArea, BorderLayout.CENTER);
JPanel buttonPanel = new JPanel(new FlowLayout());
buttonPanel.add(startTestButton);
buttonPanel.add(passButton);
buttonPanel.add(failButton);
mainPanel.add(buttonPanel, BorderLayout.SOUTH);
dialog.add(mainPanel);
dialog.pack();
dialog.setVisible(true);
}

public static void waitForSynToOpen(MidiDevice synth) throws InterruptedException {
int count = 0;
do {
if (synth.isOpen()) {
System.out.println("synth is opened");
return;
}
TimeUnit.SECONDS.sleep(1);
} while( ++count >= 5);
throw new RuntimeException(synth + " did not open even after 5 seconds");
}

private static void doTest() throws MidiUnavailableException, InterruptedException {
try (MidiDevice synth = MidiSystem.getSynthesizer()) {
System.out.println("Synthesizer: " + synth.getDeviceInfo());
synth.open();
waitForSynToOpen(synth);
MidiMessage msg = new GenericMidiMessage(0x90, 0x3C, 0x40);
//ShortMessage msg = new ShortMessage();
//msg.setMessage(0x90, 0x3C, 0x40);

synth.getReceiver().send(msg, 0);
Thread.sleep(2000);

} catch (Exception ex) {
ex.printStackTrace();
throw ex;
} finally {
if (synth != null && synth.isOpen())
synth.close();
}
System.out.print("Did you heard a note? (enter 'y' or 'n') ");
int result = System.in.read();
System.in.skip(1000);
if (result == 'y' || result == 'Y')
{
System.out.println("Test passed sucessfully.");
}
else
{
System.out.println("Test FAILED.");
throw new RuntimeException("Test failed.");
}
}

Expand Down

5 comments on commit c640fe4

@openjdk-notifier
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@GoeLin
Copy link
Member

@GoeLin GoeLin commented on c640fe4 Sep 15, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

/backport jdk17u-dev

@openjdk
Copy link

@openjdk openjdk bot commented on c640fe4 Sep 15, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@GoeLin the backport was successfully created on the branch GoeLin-backport-c640fe42 in my personal fork of openjdk/jdk17u-dev. To create a pull request with this backport targeting openjdk/jdk17u-dev:master, just click the following link:

➡️ Create pull request

The title of the pull request is automatically filled in correctly and below you find a suggestion for the pull request body:

Hi all,

This pull request contains a backport of commit c640fe42 from the openjdk/jdk repository.

The commit being backported was authored by lawrence.andrews on 5 Sep 2021 and was reviewed by Sergey Bylokhov.

Thanks!

If you need to update the source branch of the pull then run the following commands in a local clone of your personal fork of openjdk/jdk17u-dev:

$ git fetch https://github.com/openjdk-bots/jdk17u-dev GoeLin-backport-c640fe42:GoeLin-backport-c640fe42
$ git checkout GoeLin-backport-c640fe42
# make changes
$ git add paths/to/changed/files
$ git commit --message 'Describe additional changes made'
$ git push https://github.com/openjdk-bots/jdk17u-dev GoeLin-backport-c640fe42

@mrserb
Copy link
Member

@mrserb mrserb commented on c640fe4 Jun 9, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

/backport jdk8u-dev

@openjdk
Copy link

@openjdk openjdk bot commented on c640fe4 Jun 9, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@mrserb the backport was successfully created on the branch backport-mrserb-c640fe42-master in my personal fork of openjdk/jdk8u-dev. To create a pull request with this backport targeting openjdk/jdk8u-dev:master, just click the following link:

➡️ Create pull request

The title of the pull request is automatically filled in correctly and below you find a suggestion for the pull request body:

Hi all,

This pull request contains a backport of commit c640fe42 from the openjdk/jdk repository.

The commit being backported was authored by lawrence.andrews on 5 Sep 2021 and was reviewed by Sergey Bylokhov.

Thanks!

If you need to update the source branch of the pull then run the following commands in a local clone of your personal fork of openjdk/jdk8u-dev:

$ git fetch https://github.com/openjdk-bots/jdk8u-dev.git backport-mrserb-c640fe42-master:backport-mrserb-c640fe42-master
$ git checkout backport-mrserb-c640fe42-master
# make changes
$ git add paths/to/changed/files
$ git commit --message 'Describe additional changes made'
$ git push https://github.com/openjdk-bots/jdk8u-dev.git backport-mrserb-c640fe42-master

Please sign in to comment.