/*
* Copyright (c) 2003, 2016, 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
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import javax.sound.midi.MidiDevice;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.MidiUnavailableException;
import javax.sound.midi.Receiver;
import javax.sound.midi.Sequencer;
import javax.sound.midi.Synthesizer;
import javax.sound.midi.Transmitter;
/**
* @test
* @key sound
* @bug 4616517
* @summary Receiver.send() does not work properly. Tests open/close behaviour
* of MidiDevices. For this test, it is essential that the MidiDevice
* picked from the list of devices (MidiSystem.getMidiDeviceInfo()) is
* the same as the one used by
* MidiSystem.getReceiver()/getTransmitter(). To achieve this, default
* provider properties for Receivers/Transmitters are used.
*/
public class OpenClose {
private static boolean isTestExecuted;
private static boolean isTestPassed;
public static void main(String[] args) throws Exception {
boolean failed = false ;
out("#4616517: Receiver.send() does not work properly" );
if (!isMidiInstalled()) {
out("Soundcard does not exist or sound drivers not installed!" );
out("This test requires sound drivers for execution." );
return ;
}
MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo();
MidiDevice outDevice = null ;
MidiDevice inDevice = null ;
for (int i = 0; i < infos.length; i++) {
MidiDevice device = MidiSystem.getMidiDevice(infos[i]);
if (! (device instanceof Synthesizer) &&
! (device instanceof Sequencer)) {
if (device.getMaxReceivers() != 0) {
outDevice = device;
}
if (device.getMaxTransmitters() != 0) {
inDevice = device;
}
}
}
if (outDevice != null ) {
// set the default provider properties
System.setProperty(Receiver.class .getName(),
"#" + outDevice.getDeviceInfo().getName());
}
if (inDevice != null ) {
System.setProperty(Transmitter.class .getName(),
"#" + inDevice.getDeviceInfo().getName());
}
out("Using MIDI OUT Device: " + outDevice);
out("Using MIDI IN Device: " + inDevice);
isTestExecuted = false ;
if (outDevice != null ) {
isTestExecuted = true ;
TestHelper testHelper = new ReceiverTestHelper(outDevice);
try {
doTest("Receiver" , testHelper);
failed |= testHelper.hasFailed();
} catch (Exception e) {
out("Exception occured, cannot test!" );
isTestExecuted = false ;
}
}
if (inDevice != null ) {
isTestExecuted = true ;
TestHelper testHelper = new TransmitterTestHelper(inDevice);
try {
doTest("Transmitter" , testHelper);
failed |= testHelper.hasFailed();
} catch (Exception e) {
out("Exception occured, cannot test!" );
isTestExecuted = false ;
}
}
isTestPassed = ! failed;
if (isTestExecuted) {
if (isTestPassed) {
out("Test PASSED." );
} else {
throw new Exception("Test FAILED." );
}
} else {
out("Test NOT FAILED" );
}
}
private static void doTest(String type,
TestHelper testHelper) throws Exception {
/* Case 1:
- MidiDevice.open()
- MidiDevice.close()
*/
out("checking " + type + " case 1..." );
testHelper.checkClosed();
testHelper.openDevice();
testHelper.checkOpen();
testHelper.closeDevice();
testHelper.checkClosed();
out("...OK" );
/* Case 2a:
- MidiSystem.get[Receiver|Transmitter]()
- [Receiver|Transmitter].close()
*/
out("checking " + type + " case 2a..." );
testHelper.checkClosed();
testHelper.fetchObjectMidiSystem();
testHelper.checkOpen();
testHelper.closeObjectMidiSystem();
testHelper.checkClosed();
out("...OK" );
/* Case 2b:
- MidiDevice.get[Receiver|Transmitter]()
- [Receiver|Transmitter].close()
*/
out("checking " + type + " case 2b..." );
testHelper.checkClosed();
testHelper.fetchObjectDevice();
testHelper.checkClosed();
testHelper.closeObjectDevice();
testHelper.checkClosed();
out("...OK" );
/* Case 3a:
- MidiSystem.get[Receiver|Transmitter]()
- MidiDevice.open()
- MidiDevice.close()
- [Receiver|Transmitter].close()
*/
out("checking " + type + " case 3a..." );
testHelper.checkClosed();
testHelper.fetchObjectMidiSystem();
testHelper.checkOpen();
testHelper.openDevice();
testHelper.checkOpen();
testHelper.closeDevice();
testHelper.checkClosed();
testHelper.closeObjectMidiSystem();
testHelper.checkClosed();
out("...OK" );
/* Case 3b:
- MidiDevice.get[Receiver|Transmitter]()
- MidiDevice.open()
- MidiDevice.close()
- [Receiver|Transmitter].close()
*/
out("checking " + type + " case 3b..." );
testHelper.checkClosed();
testHelper.fetchObjectDevice();
testHelper.checkClosed();
testHelper.openDevice();
testHelper.checkOpen();
testHelper.closeDevice();
testHelper.checkClosed();
testHelper.closeObjectDevice();
testHelper.checkClosed();
out("...OK" );
/* Case 4a:
- MidiSystem.get[Receiver|Transmitter]()
- MidiDevice.open()
- [Receiver|Transmitter].close()
- MidiDevice.close()
*/
out("checking " + type + " case 4a..." );
testHelper.checkClosed();
testHelper.fetchObjectMidiSystem();
testHelper.checkOpen();
testHelper.openDevice();
testHelper.checkOpen();
testHelper.closeObjectMidiSystem();
testHelper.checkOpen();
testHelper.closeDevice();
testHelper.checkClosed();
out("...OK" );
/* Case 4b:
- MidiDevice.get[Receiver|Transmitter]()
- MidiDevice.open()
- [Receiver|Transmitter].close()
- MidiDevice.close()
*/
out("checking " + type + " case 4b..." );
testHelper.checkClosed();
testHelper.fetchObjectDevice();
testHelper.checkClosed();
testHelper.openDevice();
testHelper.checkOpen();
testHelper.closeObjectDevice();
testHelper.checkOpen();
testHelper.closeDevice();
testHelper.checkClosed();
out("...OK" );
/* Case 5a:
- MidiDevice.open()
- MidiSystem.get[Receiver|Transmitter]()
- MidiDevice.close()
- [Receiver|Transmitter].close()
*/
out("checking " + type + " case 5a..." );
testHelper.checkClosed();
testHelper.openDevice();
testHelper.checkOpen();
testHelper.fetchObjectMidiSystem();
testHelper.checkOpen();
testHelper.closeDevice();
testHelper.checkClosed();
testHelper.closeObjectMidiSystem();
testHelper.checkClosed();
out("...OK" );
/* Case 5b:
- MidiDevice.open()
- MidiDevice.get[Receiver|Transmitter]()
- MidiDevice.close()
- [Receiver|Transmitter].close()
*/
out("checking " + type + " case 5b..." );
testHelper.checkClosed();
testHelper.openDevice();
testHelper.checkOpen();
testHelper.fetchObjectDevice();
testHelper.checkOpen();
testHelper.closeDevice();
testHelper.checkClosed();
testHelper.closeObjectDevice();
testHelper.checkClosed();
out("...OK" );
/* Case 6a:
- MidiDevice.open()
- MidiSystem.get[Receiver|Transmitter]()
- [Receiver|Transmitter].close()
- MidiDevice.close()
*/
out("checking " + type + " case 6a..." );
testHelper.checkClosed();
testHelper.openDevice();
testHelper.checkOpen();
testHelper.fetchObjectMidiSystem();
testHelper.checkOpen();
testHelper.closeObjectMidiSystem();
testHelper.checkOpen();
testHelper.closeDevice();
testHelper.checkClosed();
out("...OK" );
/* Case 6b:
- MidiDevice.open()
- MidiDevice.get[Receiver|Transmitter]()
- [Receiver|Transmitter].close()
- MidiDevice.close()
*/
out("checking " + type + " case 6b..." );
testHelper.checkClosed();
testHelper.openDevice();
testHelper.checkOpen();
testHelper.fetchObjectDevice();
testHelper.checkOpen();
testHelper.closeObjectDevice();
testHelper.checkOpen();
testHelper.closeDevice();
testHelper.checkClosed();
out("...OK" );
/* Case 7:
- MidiSystem.get[Receiver|Transmitter]() // 1
- MidiDevice.get[Receiver|Transmitter]() // 2
- [Receiver|Transmitter].close() // 2
- [Receiver|Transmitter].close() // 1
*/
out("checking " + type + " case 7..." );
testHelper.checkClosed();
testHelper.fetchObjectMidiSystem();
testHelper.checkOpen();
testHelper.fetchObjectDevice();
testHelper.checkOpen();
testHelper.closeObjectDevice();
testHelper.checkOpen();
testHelper.closeObjectMidiSystem();
testHelper.checkClosed();
out("...OK" );
/* Case 8:
- MidiSystem.get[Receiver|Transmitter]() // 1
- MidiDevice.get[Receiver|Transmitter]() // 2
- [Receiver|Transmitter].close() // 1
- [Receiver|Transmitter].close() // 2
*/
out("checking " + type + " case 8..." );
testHelper.checkClosed();
testHelper.fetchObjectMidiSystem();
testHelper.checkOpen();
testHelper.fetchObjectDevice();
testHelper.checkOpen();
testHelper.closeObjectMidiSystem();
testHelper.checkClosed();
testHelper.closeObjectDevice();
testHelper.checkClosed();
out("...OK" );
/* Case 9:
- MidiDevice.get[Receiver|Transmitter]() // 2
- MidiSystem.get[Receiver|Transmitter]() // 1
- [Receiver|Transmitter].close() // 2
- [Receiver|Transmitter].close() // 1
*/
out("checking " + type + " case 9..." );
testHelper.checkClosed();
testHelper.fetchObjectDevice();
testHelper.checkClosed();
testHelper.fetchObjectMidiSystem();
testHelper.checkOpen();
testHelper.closeObjectDevice();
testHelper.checkOpen();
testHelper.closeObjectMidiSystem();
testHelper.checkClosed();
out("...OK" );
/* Case 10:
- MidiDevice.get[Receiver|Transmitter]() // 2
- MidiSystem.get[Receiver|Transmitter]() // 1
- [Receiver|Transmitter].close() // 1
- [Receiver|Transmitter].close() // 2
*/
out("checking " + type + " case 10..." );
testHelper.checkClosed();
testHelper.fetchObjectDevice();
testHelper.checkClosed();
testHelper.fetchObjectMidiSystem();
testHelper.checkOpen();
testHelper.closeObjectMidiSystem();
testHelper.checkClosed();
testHelper.closeObjectDevice();
testHelper.checkClosed();
out("...OK" );
/* Case N - 1:
- 10 x MidiSystem.get[Receiver|Transmitter]()
- 10 x [Receiver|Transmitter].close()
*/
out("checking " + type + " case N - 1..." );
TestHelper[] testHelpers = new TestHelper[10];
for (int i = 0; i < 10; i++) {
testHelpers[i] = (TestHelper) testHelper.clone();
}
testHelper.checkClosed();
for (int i = 0; i < 10; i++) {
testHelpers[i].fetchObjectMidiSystem();
testHelper.checkOpen();
}
for (int i = 0; i < 9; i++) {
testHelpers[i].closeObjectMidiSystem();
testHelper.checkOpen();
}
testHelpers[9].closeObjectMidiSystem();
testHelper.checkClosed();
out("...OK" );
}
private static void out(String message) {
System.out.println(message);
}
private static abstract class TestHelper implements Cloneable {
private MidiDevice device;
private boolean failed;
protected TestHelper(MidiDevice device) {
this .device = device;
failed = false ;
}
protected MidiDevice getDevice() {
return device;
}
public boolean hasFailed() {
return failed;
}
public void openDevice() throws MidiUnavailableException {
getDevice().open();
}
public void closeDevice() {
getDevice().close();
}
public void checkOpen(){
checkOpen(getDevice(), true );
}
public void checkClosed(){
checkOpen(getDevice(), false );
}
private void checkOpen(MidiDevice device, boolean desiredState) {
if (device.isOpen() != desiredState) {
out("device should be " +
getStateString(desiredState) + ", but isn't!" );
failed = true ;
}
}
private String getStateString(boolean state) {
return state ? "open" : "closed" ;
}
public abstract void fetchObjectMidiSystem() throws MidiUnavailableException;
public abstract void fetchObjectDevice() throws MidiUnavailableException;
public abstract void closeObjectMidiSystem();
public abstract void closeObjectDevice();
public Object clone() {
try {
return super .clone();
} catch (CloneNotSupportedException e) {
return null ;
}
}
}
private static class ReceiverTestHelper extends TestHelper {
private Receiver receiverMidiSystem;
private Receiver receiverDevice;
public ReceiverTestHelper(MidiDevice device) {
super (device);
}
public void fetchObjectMidiSystem() throws MidiUnavailableException {
receiverMidiSystem = MidiSystem.getReceiver();
}
public void fetchObjectDevice() throws MidiUnavailableException {
receiverDevice = getDevice().getReceiver();
}
public void closeObjectMidiSystem() {
receiverMidiSystem.close();
}
public void closeObjectDevice() {
receiverDevice.close();
}
}
private static class TransmitterTestHelper extends TestHelper {
private Transmitter transmitterMidiSystem;
private Transmitter transmitterDevice;
public TransmitterTestHelper(MidiDevice device) {
super (device);
}
public void fetchObjectMidiSystem() throws MidiUnavailableException {
transmitterMidiSystem = MidiSystem.getTransmitter();
}
public void fetchObjectDevice() throws MidiUnavailableException {
transmitterDevice = getDevice().getTransmitter();
}
public void closeObjectMidiSystem() {
transmitterMidiSystem.close();
}
public void closeObjectDevice() {
transmitterDevice.close();
}
}
/**
* Returns true if at least one MIDI (port) device is correctly installed on
* the system.
*/
public static boolean isMidiInstalled() {
boolean result = false ;
MidiDevice.Info[] devices = MidiSystem.getMidiDeviceInfo();
for (int i = 0; i < devices.length; i++) {
try {
MidiDevice device = MidiSystem.getMidiDevice(devices[i]);
result = ! (device instanceof Sequencer) && ! (device instanceof Synthesizer);
} catch (Exception e1) {
System.err.println(e1);
}
if (result)
break ;
}
return result;
}
}
Messung V0.5 C=96 H=97 G=96
¤ Dauer der Verarbeitung: 0.5 Sekunden
¤
*© Formatika GbR, Deutschland