Path: blob/master/test/jdk/javax/sound/midi/Devices/OpenClose.java
41152 views
/*1* Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*/2223import javax.sound.midi.MidiDevice;24import javax.sound.midi.MidiSystem;25import javax.sound.midi.MidiUnavailableException;26import javax.sound.midi.Receiver;27import javax.sound.midi.Sequencer;28import javax.sound.midi.Synthesizer;29import javax.sound.midi.Transmitter;3031/**32* @test33* @bug 461651734* @summary Receiver.send() does not work properly. Tests open/close behaviour35* of MidiDevices. For this test, it is essential that the MidiDevice36* picked from the list of devices (MidiSystem.getMidiDeviceInfo()) is37* the same as the one used by38* MidiSystem.getReceiver()/getTransmitter(). To achieve this, default39* provider properties for Receivers/Transmitters are used.40*/41public class OpenClose {4243private static boolean isTestExecuted;44private static boolean isTestPassed;4546public static void main(String[] args) throws Exception {47boolean failed = false;48out("#4616517: Receiver.send() does not work properly");49if (!isMidiInstalled()) {50out("Soundcard does not exist or sound drivers not installed!");51out("This test requires sound drivers for execution.");52return;53}54MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo();55MidiDevice outDevice = null;56MidiDevice inDevice = null;57for (int i = 0; i < infos.length; i++) {58MidiDevice device = MidiSystem.getMidiDevice(infos[i]);59if (! (device instanceof Synthesizer) &&60! (device instanceof Sequencer)) {61if (device.getMaxReceivers() != 0) {62outDevice = device;63}64if (device.getMaxTransmitters() != 0) {65inDevice = device;66}67}68}69if (outDevice != null) {70// set the default provider properties71System.setProperty(Receiver.class.getName(),72"#" + outDevice.getDeviceInfo().getName());73}74if (inDevice != null) {75System.setProperty(Transmitter.class.getName(),76"#" + inDevice.getDeviceInfo().getName());77}78out("Using MIDI OUT Device: " + outDevice);79out("Using MIDI IN Device: " + inDevice);8081isTestExecuted = false;82if (outDevice != null) {83isTestExecuted = true;84TestHelper testHelper = new ReceiverTestHelper(outDevice);85try {86doTest("Receiver", testHelper);87failed |= testHelper.hasFailed();88} catch (Exception e) {89out("Exception occured, cannot test!");90isTestExecuted = false;91}92}9394if (inDevice != null) {95isTestExecuted = true;96TestHelper testHelper = new TransmitterTestHelper(inDevice);97try {98doTest("Transmitter", testHelper);99failed |= testHelper.hasFailed();100} catch (Exception e) {101out("Exception occured, cannot test!");102isTestExecuted = false;103}104}105106isTestPassed = ! failed;107108if (isTestExecuted) {109if (isTestPassed) {110out("Test PASSED.");111} else {112throw new Exception("Test FAILED.");113}114} else {115out("Test NOT FAILED");116}117}118119private static void doTest(String type,120TestHelper testHelper) throws Exception {121/* Case 1:122- MidiDevice.open()123- MidiDevice.close()124*/125out("checking " + type + " case 1...");126testHelper.checkClosed();127128testHelper.openDevice();129testHelper.checkOpen();130131testHelper.closeDevice();132testHelper.checkClosed();133134out("...OK");135136/* Case 2a:137- MidiSystem.get[Receiver|Transmitter]()138- [Receiver|Transmitter].close()139*/140out("checking " + type + " case 2a...");141testHelper.checkClosed();142143testHelper.fetchObjectMidiSystem();144testHelper.checkOpen();145146testHelper.closeObjectMidiSystem();147testHelper.checkClosed();148149out("...OK");150151/* Case 2b:152- MidiDevice.get[Receiver|Transmitter]()153- [Receiver|Transmitter].close()154*/155out("checking " + type + " case 2b...");156testHelper.checkClosed();157158testHelper.fetchObjectDevice();159testHelper.checkClosed();160161testHelper.closeObjectDevice();162testHelper.checkClosed();163164out("...OK");165166/* Case 3a:167- MidiSystem.get[Receiver|Transmitter]()168- MidiDevice.open()169- MidiDevice.close()170- [Receiver|Transmitter].close()171*/172out("checking " + type + " case 3a...");173testHelper.checkClosed();174175testHelper.fetchObjectMidiSystem();176testHelper.checkOpen();177178testHelper.openDevice();179testHelper.checkOpen();180181testHelper.closeDevice();182testHelper.checkClosed();183184testHelper.closeObjectMidiSystem();185testHelper.checkClosed();186187out("...OK");188189/* Case 3b:190- MidiDevice.get[Receiver|Transmitter]()191- MidiDevice.open()192- MidiDevice.close()193- [Receiver|Transmitter].close()194*/195out("checking " + type + " case 3b...");196testHelper.checkClosed();197198testHelper.fetchObjectDevice();199testHelper.checkClosed();200201testHelper.openDevice();202testHelper.checkOpen();203204testHelper.closeDevice();205testHelper.checkClosed();206207testHelper.closeObjectDevice();208testHelper.checkClosed();209210out("...OK");211212/* Case 4a:213- MidiSystem.get[Receiver|Transmitter]()214- MidiDevice.open()215- [Receiver|Transmitter].close()216- MidiDevice.close()217*/218out("checking " + type + " case 4a...");219testHelper.checkClosed();220221testHelper.fetchObjectMidiSystem();222testHelper.checkOpen();223224testHelper.openDevice();225testHelper.checkOpen();226227testHelper.closeObjectMidiSystem();228testHelper.checkOpen();229230testHelper.closeDevice();231testHelper.checkClosed();232233out("...OK");234235/* Case 4b:236- MidiDevice.get[Receiver|Transmitter]()237- MidiDevice.open()238- [Receiver|Transmitter].close()239- MidiDevice.close()240*/241out("checking " + type + " case 4b...");242testHelper.checkClosed();243244testHelper.fetchObjectDevice();245testHelper.checkClosed();246247testHelper.openDevice();248testHelper.checkOpen();249250testHelper.closeObjectDevice();251testHelper.checkOpen();252253testHelper.closeDevice();254testHelper.checkClosed();255256out("...OK");257258/* Case 5a:259- MidiDevice.open()260- MidiSystem.get[Receiver|Transmitter]()261- MidiDevice.close()262- [Receiver|Transmitter].close()263*/264out("checking " + type + " case 5a...");265testHelper.checkClosed();266267testHelper.openDevice();268testHelper.checkOpen();269270testHelper.fetchObjectMidiSystem();271testHelper.checkOpen();272273testHelper.closeDevice();274testHelper.checkClosed();275276testHelper.closeObjectMidiSystem();277testHelper.checkClosed();278279out("...OK");280281/* Case 5b:282- MidiDevice.open()283- MidiDevice.get[Receiver|Transmitter]()284- MidiDevice.close()285- [Receiver|Transmitter].close()286*/287out("checking " + type + " case 5b...");288testHelper.checkClosed();289290testHelper.openDevice();291testHelper.checkOpen();292293testHelper.fetchObjectDevice();294testHelper.checkOpen();295296testHelper.closeDevice();297testHelper.checkClosed();298299testHelper.closeObjectDevice();300testHelper.checkClosed();301302out("...OK");303304/* Case 6a:305- MidiDevice.open()306- MidiSystem.get[Receiver|Transmitter]()307- [Receiver|Transmitter].close()308- MidiDevice.close()309*/310out("checking " + type + " case 6a...");311testHelper.checkClosed();312313testHelper.openDevice();314testHelper.checkOpen();315316testHelper.fetchObjectMidiSystem();317testHelper.checkOpen();318319testHelper.closeObjectMidiSystem();320testHelper.checkOpen();321322testHelper.closeDevice();323testHelper.checkClosed();324325out("...OK");326327/* Case 6b:328- MidiDevice.open()329- MidiDevice.get[Receiver|Transmitter]()330- [Receiver|Transmitter].close()331- MidiDevice.close()332*/333out("checking " + type + " case 6b...");334testHelper.checkClosed();335336testHelper.openDevice();337testHelper.checkOpen();338339testHelper.fetchObjectDevice();340testHelper.checkOpen();341342testHelper.closeObjectDevice();343testHelper.checkOpen();344345testHelper.closeDevice();346testHelper.checkClosed();347348out("...OK");349350/* Case 7:351- MidiSystem.get[Receiver|Transmitter]() // 1352- MidiDevice.get[Receiver|Transmitter]() // 2353- [Receiver|Transmitter].close() // 2354- [Receiver|Transmitter].close() // 1355*/356out("checking " + type + " case 7...");357testHelper.checkClosed();358359testHelper.fetchObjectMidiSystem();360testHelper.checkOpen();361362testHelper.fetchObjectDevice();363testHelper.checkOpen();364365testHelper.closeObjectDevice();366testHelper.checkOpen();367368testHelper.closeObjectMidiSystem();369testHelper.checkClosed();370371out("...OK");372373/* Case 8:374- MidiSystem.get[Receiver|Transmitter]() // 1375- MidiDevice.get[Receiver|Transmitter]() // 2376- [Receiver|Transmitter].close() // 1377- [Receiver|Transmitter].close() // 2378*/379out("checking " + type + " case 8...");380testHelper.checkClosed();381382testHelper.fetchObjectMidiSystem();383testHelper.checkOpen();384385testHelper.fetchObjectDevice();386testHelper.checkOpen();387388testHelper.closeObjectMidiSystem();389testHelper.checkClosed();390391testHelper.closeObjectDevice();392testHelper.checkClosed();393394out("...OK");395396/* Case 9:397- MidiDevice.get[Receiver|Transmitter]() // 2398- MidiSystem.get[Receiver|Transmitter]() // 1399- [Receiver|Transmitter].close() // 2400- [Receiver|Transmitter].close() // 1401*/402out("checking " + type + " case 9...");403testHelper.checkClosed();404405testHelper.fetchObjectDevice();406testHelper.checkClosed();407408testHelper.fetchObjectMidiSystem();409testHelper.checkOpen();410411testHelper.closeObjectDevice();412testHelper.checkOpen();413414testHelper.closeObjectMidiSystem();415testHelper.checkClosed();416417out("...OK");418419/* Case 10:420- MidiDevice.get[Receiver|Transmitter]() // 2421- MidiSystem.get[Receiver|Transmitter]() // 1422- [Receiver|Transmitter].close() // 1423- [Receiver|Transmitter].close() // 2424*/425out("checking " + type + " case 10...");426testHelper.checkClosed();427428testHelper.fetchObjectDevice();429testHelper.checkClosed();430431testHelper.fetchObjectMidiSystem();432testHelper.checkOpen();433434testHelper.closeObjectMidiSystem();435testHelper.checkClosed();436437testHelper.closeObjectDevice();438testHelper.checkClosed();439440out("...OK");441442/* Case N - 1:443- 10 x MidiSystem.get[Receiver|Transmitter]()444- 10 x [Receiver|Transmitter].close()445*/446out("checking " + type + " case N - 1...");447TestHelper[] testHelpers = new TestHelper[10];448for (int i = 0; i < 10; i++) {449testHelpers[i] = (TestHelper) testHelper.clone();450}451testHelper.checkClosed();452453for (int i = 0; i < 10; i++) {454testHelpers[i].fetchObjectMidiSystem();455testHelper.checkOpen();456}457458459for (int i = 0; i < 9; i++) {460testHelpers[i].closeObjectMidiSystem();461testHelper.checkOpen();462}463464testHelpers[9].closeObjectMidiSystem();465testHelper.checkClosed();466467out("...OK");468}469470private static void out(String message) {471System.out.println(message);472}473474private static abstract class TestHelper implements Cloneable {475private MidiDevice device;476private boolean failed;477478protected TestHelper(MidiDevice device) {479this.device = device;480failed = false;481}482483protected MidiDevice getDevice() {484return device;485}486487public boolean hasFailed() {488return failed;489}490491public void openDevice() throws MidiUnavailableException {492getDevice().open();493}494495public void closeDevice() {496getDevice().close();497}498499public void checkOpen(){500checkOpen(getDevice(), true);501}502503public void checkClosed(){504checkOpen(getDevice(), false);505}506507private void checkOpen(MidiDevice device, boolean desiredState) {508if (device.isOpen() != desiredState) {509out("device should be " +510getStateString(desiredState) + ", but isn't!");511failed = true;512}513}514515516private String getStateString(boolean state) {517return state ? "open" : "closed";518}519520521public abstract void fetchObjectMidiSystem() throws MidiUnavailableException;522public abstract void fetchObjectDevice() throws MidiUnavailableException;523public abstract void closeObjectMidiSystem();524public abstract void closeObjectDevice();525526public Object clone() {527try {528return super.clone();529} catch (CloneNotSupportedException e) {530return null;531}532}533}534535private static class ReceiverTestHelper extends TestHelper {536private Receiver receiverMidiSystem;537private Receiver receiverDevice;538539public ReceiverTestHelper(MidiDevice device) {540super(device);541}542543public void fetchObjectMidiSystem() throws MidiUnavailableException {544receiverMidiSystem = MidiSystem.getReceiver();545}546547548public void fetchObjectDevice() throws MidiUnavailableException {549receiverDevice = getDevice().getReceiver();550}551552553public void closeObjectMidiSystem() {554receiverMidiSystem.close();555}556557558public void closeObjectDevice() {559receiverDevice.close();560}561}562563private static class TransmitterTestHelper extends TestHelper {564private Transmitter transmitterMidiSystem;565private Transmitter transmitterDevice;566567public TransmitterTestHelper(MidiDevice device) {568super(device);569}570571public void fetchObjectMidiSystem() throws MidiUnavailableException {572transmitterMidiSystem = MidiSystem.getTransmitter();573}574575576public void fetchObjectDevice() throws MidiUnavailableException {577transmitterDevice = getDevice().getTransmitter();578}579580581public void closeObjectMidiSystem() {582transmitterMidiSystem.close();583}584585586public void closeObjectDevice() {587transmitterDevice.close();588}589}590591/**592* Returns true if at least one MIDI (port) device is correctly installed on593* the system.594*/595public static boolean isMidiInstalled() {596boolean result = false;597MidiDevice.Info[] devices = MidiSystem.getMidiDeviceInfo();598for (int i = 0; i < devices.length; i++) {599try {600MidiDevice device = MidiSystem.getMidiDevice(devices[i]);601result = ! (device instanceof Sequencer) && ! (device instanceof Synthesizer);602} catch (Exception e1) {603System.err.println(e1);604}605if (result)606break;607}608return result;609}610}611612613