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

Backport-of: c640fe42c2b5e6668a2a875678be44443942c868
  • Loading branch information
GoeLin committed Sep 16, 2022
1 parent ed29cbb commit fec638f
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
@@ -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

1 comment on commit fec638f

@openjdk-notifier
Copy link

Choose a reason for hiding this comment

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

Please sign in to comment.