jdk/test/javax/sound/midi/Devices/OpenClose.java
changeset 41905 e8e5df013c6e
equal deleted inserted replaced
41904:524d908e49ea 41905:e8e5df013c6e
       
     1 /*
       
     2  * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
       
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
       
     4  *
       
     5  * This code is free software; you can redistribute it and/or modify it
       
     6  * under the terms of the GNU General Public License version 2 only, as
       
     7  * published by the Free Software Foundation.
       
     8  *
       
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
       
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
       
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
       
    12  * version 2 for more details (a copy is included in the LICENSE file that
       
    13  * accompanied this code).
       
    14  *
       
    15  * You should have received a copy of the GNU General Public License version
       
    16  * 2 along with this work; if not, write to the Free Software Foundation,
       
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
       
    18  *
       
    19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
       
    20  * or visit www.oracle.com if you need additional information or have any
       
    21  * questions.
       
    22  */
       
    23 
       
    24 import javax.sound.midi.MidiDevice;
       
    25 import javax.sound.midi.MidiSystem;
       
    26 import javax.sound.midi.MidiUnavailableException;
       
    27 import javax.sound.midi.Receiver;
       
    28 import javax.sound.midi.Sequencer;
       
    29 import javax.sound.midi.Synthesizer;
       
    30 import javax.sound.midi.Transmitter;
       
    31 
       
    32 /**
       
    33  * @test
       
    34  * @bug 4616517
       
    35  * @summary Receiver.send() does not work properly. Tests open/close behaviour
       
    36  *          of MidiDevices. For this test, it is essential that the MidiDevice
       
    37  *          picked from the list of devices (MidiSystem.getMidiDeviceInfo()) is
       
    38  *          the same as the one used by
       
    39  *          MidiSystem.getReceiver()/getTransmitter(). To achieve this, default
       
    40  *          provider properties for Receivers/Transmitters are used.
       
    41  */
       
    42 public class OpenClose {
       
    43 
       
    44     private static boolean isTestExecuted;
       
    45     private static boolean isTestPassed;
       
    46 
       
    47     public static void main(String[] args) throws Exception {
       
    48         boolean failed = false;
       
    49         out("#4616517: Receiver.send() does not work properly");
       
    50         if (!isMidiInstalled()) {
       
    51             out("Soundcard does not exist or sound drivers not installed!");
       
    52             out("This test requires sound drivers for execution.");
       
    53             return;
       
    54         }
       
    55         MidiDevice.Info[] infos = MidiSystem.getMidiDeviceInfo();
       
    56         MidiDevice outDevice = null;
       
    57         MidiDevice inDevice = null;
       
    58         for (int i = 0; i < infos.length; i++) {
       
    59             MidiDevice device = MidiSystem.getMidiDevice(infos[i]);
       
    60             if (! (device instanceof Synthesizer) &&
       
    61                 ! (device instanceof Sequencer)) {
       
    62                 if (device.getMaxReceivers() != 0) {
       
    63                     outDevice = device;
       
    64                 }
       
    65                 if (device.getMaxTransmitters() != 0) {
       
    66                     inDevice = device;
       
    67                 }
       
    68             }
       
    69         }
       
    70         if (outDevice != null) {
       
    71             // set the default provider properties
       
    72             System.setProperty(Receiver.class.getName(),
       
    73                                "#" + outDevice.getDeviceInfo().getName());
       
    74         }
       
    75         if (inDevice != null) {
       
    76             System.setProperty(Transmitter.class.getName(),
       
    77                                "#" + inDevice.getDeviceInfo().getName());
       
    78         }
       
    79         out("Using MIDI OUT Device: " + outDevice);
       
    80         out("Using MIDI IN Device: " + inDevice);
       
    81 
       
    82         isTestExecuted = false;
       
    83         if (outDevice != null) {
       
    84             isTestExecuted = true;
       
    85             TestHelper testHelper = new ReceiverTestHelper(outDevice);
       
    86             try {
       
    87                 doTest("Receiver", testHelper);
       
    88                 failed |= testHelper.hasFailed();
       
    89             } catch (Exception e) {
       
    90                 out("Exception occured, cannot test!");
       
    91                 isTestExecuted = false;
       
    92             }
       
    93         }
       
    94 
       
    95         if (inDevice != null) {
       
    96             isTestExecuted = true;
       
    97             TestHelper testHelper = new TransmitterTestHelper(inDevice);
       
    98             try {
       
    99                 doTest("Transmitter", testHelper);
       
   100                 failed |= testHelper.hasFailed();
       
   101             } catch (Exception e) {
       
   102                 out("Exception occured, cannot test!");
       
   103                 isTestExecuted = false;
       
   104             }
       
   105         }
       
   106 
       
   107         isTestPassed = ! failed;
       
   108 
       
   109         if (isTestExecuted) {
       
   110             if (isTestPassed) {
       
   111                 out("Test PASSED.");
       
   112             } else {
       
   113                 throw new Exception("Test FAILED.");
       
   114             }
       
   115         } else {
       
   116             out("Test NOT FAILED");
       
   117         }
       
   118     }
       
   119 
       
   120     private static void doTest(String type,
       
   121                                TestHelper testHelper) throws Exception {
       
   122         /* Case 1:
       
   123            - MidiDevice.open()
       
   124            - MidiDevice.close()
       
   125         */
       
   126         out("checking " + type + " case 1...");
       
   127         testHelper.checkClosed();
       
   128 
       
   129         testHelper.openDevice();
       
   130         testHelper.checkOpen();
       
   131 
       
   132         testHelper.closeDevice();
       
   133         testHelper.checkClosed();
       
   134 
       
   135         out("...OK");
       
   136 
       
   137         /* Case 2a:
       
   138            - MidiSystem.get[Receiver|Transmitter]()
       
   139            - [Receiver|Transmitter].close()
       
   140         */
       
   141         out("checking " + type + " case 2a...");
       
   142         testHelper.checkClosed();
       
   143 
       
   144         testHelper.fetchObjectMidiSystem();
       
   145         testHelper.checkOpen();
       
   146 
       
   147         testHelper.closeObjectMidiSystem();
       
   148         testHelper.checkClosed();
       
   149 
       
   150         out("...OK");
       
   151 
       
   152         /* Case 2b:
       
   153            - MidiDevice.get[Receiver|Transmitter]()
       
   154            - [Receiver|Transmitter].close()
       
   155         */
       
   156         out("checking " + type + " case 2b...");
       
   157         testHelper.checkClosed();
       
   158 
       
   159         testHelper.fetchObjectDevice();
       
   160         testHelper.checkClosed();
       
   161 
       
   162         testHelper.closeObjectDevice();
       
   163         testHelper.checkClosed();
       
   164 
       
   165         out("...OK");
       
   166 
       
   167         /* Case 3a:
       
   168            - MidiSystem.get[Receiver|Transmitter]()
       
   169            - MidiDevice.open()
       
   170            - MidiDevice.close()
       
   171            - [Receiver|Transmitter].close()
       
   172         */
       
   173         out("checking " + type + " case 3a...");
       
   174         testHelper.checkClosed();
       
   175 
       
   176         testHelper.fetchObjectMidiSystem();
       
   177         testHelper.checkOpen();
       
   178 
       
   179         testHelper.openDevice();
       
   180         testHelper.checkOpen();
       
   181 
       
   182         testHelper.closeDevice();
       
   183         testHelper.checkClosed();
       
   184 
       
   185         testHelper.closeObjectMidiSystem();
       
   186         testHelper.checkClosed();
       
   187 
       
   188         out("...OK");
       
   189 
       
   190         /* Case 3b:
       
   191            - MidiDevice.get[Receiver|Transmitter]()
       
   192            - MidiDevice.open()
       
   193            - MidiDevice.close()
       
   194            - [Receiver|Transmitter].close()
       
   195         */
       
   196         out("checking " + type + " case 3b...");
       
   197         testHelper.checkClosed();
       
   198 
       
   199         testHelper.fetchObjectDevice();
       
   200         testHelper.checkClosed();
       
   201 
       
   202         testHelper.openDevice();
       
   203         testHelper.checkOpen();
       
   204 
       
   205         testHelper.closeDevice();
       
   206         testHelper.checkClosed();
       
   207 
       
   208         testHelper.closeObjectDevice();
       
   209         testHelper.checkClosed();
       
   210 
       
   211         out("...OK");
       
   212 
       
   213         /* Case 4a:
       
   214            - MidiSystem.get[Receiver|Transmitter]()
       
   215            - MidiDevice.open()
       
   216            - [Receiver|Transmitter].close()
       
   217            - MidiDevice.close()
       
   218         */
       
   219         out("checking " + type + " case 4a...");
       
   220         testHelper.checkClosed();
       
   221 
       
   222         testHelper.fetchObjectMidiSystem();
       
   223         testHelper.checkOpen();
       
   224 
       
   225         testHelper.openDevice();
       
   226         testHelper.checkOpen();
       
   227 
       
   228         testHelper.closeObjectMidiSystem();
       
   229         testHelper.checkOpen();
       
   230 
       
   231         testHelper.closeDevice();
       
   232         testHelper.checkClosed();
       
   233 
       
   234         out("...OK");
       
   235 
       
   236         /* Case 4b:
       
   237            - MidiDevice.get[Receiver|Transmitter]()
       
   238            - MidiDevice.open()
       
   239            - [Receiver|Transmitter].close()
       
   240            - MidiDevice.close()
       
   241         */
       
   242         out("checking " + type + " case 4b...");
       
   243         testHelper.checkClosed();
       
   244 
       
   245         testHelper.fetchObjectDevice();
       
   246         testHelper.checkClosed();
       
   247 
       
   248         testHelper.openDevice();
       
   249         testHelper.checkOpen();
       
   250 
       
   251         testHelper.closeObjectDevice();
       
   252         testHelper.checkOpen();
       
   253 
       
   254         testHelper.closeDevice();
       
   255         testHelper.checkClosed();
       
   256 
       
   257         out("...OK");
       
   258 
       
   259         /* Case 5a:
       
   260            - MidiDevice.open()
       
   261            - MidiSystem.get[Receiver|Transmitter]()
       
   262            - MidiDevice.close()
       
   263            - [Receiver|Transmitter].close()
       
   264         */
       
   265         out("checking " + type + " case 5a...");
       
   266         testHelper.checkClosed();
       
   267 
       
   268         testHelper.openDevice();
       
   269         testHelper.checkOpen();
       
   270 
       
   271         testHelper.fetchObjectMidiSystem();
       
   272         testHelper.checkOpen();
       
   273 
       
   274         testHelper.closeDevice();
       
   275         testHelper.checkClosed();
       
   276 
       
   277         testHelper.closeObjectMidiSystem();
       
   278         testHelper.checkClosed();
       
   279 
       
   280         out("...OK");
       
   281 
       
   282         /* Case 5b:
       
   283            - MidiDevice.open()
       
   284            - MidiDevice.get[Receiver|Transmitter]()
       
   285            - MidiDevice.close()
       
   286            - [Receiver|Transmitter].close()
       
   287         */
       
   288         out("checking " + type + " case 5b...");
       
   289         testHelper.checkClosed();
       
   290 
       
   291         testHelper.openDevice();
       
   292         testHelper.checkOpen();
       
   293 
       
   294         testHelper.fetchObjectDevice();
       
   295         testHelper.checkOpen();
       
   296 
       
   297         testHelper.closeDevice();
       
   298         testHelper.checkClosed();
       
   299 
       
   300         testHelper.closeObjectDevice();
       
   301         testHelper.checkClosed();
       
   302 
       
   303         out("...OK");
       
   304 
       
   305         /* Case 6a:
       
   306            - MidiDevice.open()
       
   307            - MidiSystem.get[Receiver|Transmitter]()
       
   308            - [Receiver|Transmitter].close()
       
   309            - MidiDevice.close()
       
   310         */
       
   311         out("checking " + type + " case 6a...");
       
   312         testHelper.checkClosed();
       
   313 
       
   314         testHelper.openDevice();
       
   315         testHelper.checkOpen();
       
   316 
       
   317         testHelper.fetchObjectMidiSystem();
       
   318         testHelper.checkOpen();
       
   319 
       
   320         testHelper.closeObjectMidiSystem();
       
   321         testHelper.checkOpen();
       
   322 
       
   323         testHelper.closeDevice();
       
   324         testHelper.checkClosed();
       
   325 
       
   326         out("...OK");
       
   327 
       
   328         /* Case 6b:
       
   329            - MidiDevice.open()
       
   330            - MidiDevice.get[Receiver|Transmitter]()
       
   331            - [Receiver|Transmitter].close()
       
   332            - MidiDevice.close()
       
   333         */
       
   334         out("checking " + type + " case 6b...");
       
   335         testHelper.checkClosed();
       
   336 
       
   337         testHelper.openDevice();
       
   338         testHelper.checkOpen();
       
   339 
       
   340         testHelper.fetchObjectDevice();
       
   341         testHelper.checkOpen();
       
   342 
       
   343         testHelper.closeObjectDevice();
       
   344         testHelper.checkOpen();
       
   345 
       
   346         testHelper.closeDevice();
       
   347         testHelper.checkClosed();
       
   348 
       
   349         out("...OK");
       
   350 
       
   351         /* Case 7:
       
   352            - MidiSystem.get[Receiver|Transmitter]() // 1
       
   353            - MidiDevice.get[Receiver|Transmitter]() // 2
       
   354            - [Receiver|Transmitter].close() // 2
       
   355            - [Receiver|Transmitter].close() // 1
       
   356         */
       
   357         out("checking " + type + " case 7...");
       
   358         testHelper.checkClosed();
       
   359 
       
   360         testHelper.fetchObjectMidiSystem();
       
   361         testHelper.checkOpen();
       
   362 
       
   363         testHelper.fetchObjectDevice();
       
   364         testHelper.checkOpen();
       
   365 
       
   366         testHelper.closeObjectDevice();
       
   367         testHelper.checkOpen();
       
   368 
       
   369         testHelper.closeObjectMidiSystem();
       
   370         testHelper.checkClosed();
       
   371 
       
   372         out("...OK");
       
   373 
       
   374         /* Case 8:
       
   375            - MidiSystem.get[Receiver|Transmitter]() // 1
       
   376            - MidiDevice.get[Receiver|Transmitter]() // 2
       
   377            - [Receiver|Transmitter].close() // 1
       
   378            - [Receiver|Transmitter].close() // 2
       
   379         */
       
   380         out("checking " + type + " case 8...");
       
   381         testHelper.checkClosed();
       
   382 
       
   383         testHelper.fetchObjectMidiSystem();
       
   384         testHelper.checkOpen();
       
   385 
       
   386         testHelper.fetchObjectDevice();
       
   387         testHelper.checkOpen();
       
   388 
       
   389         testHelper.closeObjectMidiSystem();
       
   390         testHelper.checkClosed();
       
   391 
       
   392         testHelper.closeObjectDevice();
       
   393         testHelper.checkClosed();
       
   394 
       
   395         out("...OK");
       
   396 
       
   397         /* Case 9:
       
   398            - MidiDevice.get[Receiver|Transmitter]() // 2
       
   399            - MidiSystem.get[Receiver|Transmitter]() // 1
       
   400            - [Receiver|Transmitter].close() // 2
       
   401            - [Receiver|Transmitter].close() // 1
       
   402         */
       
   403         out("checking " + type + " case 9...");
       
   404         testHelper.checkClosed();
       
   405 
       
   406         testHelper.fetchObjectDevice();
       
   407         testHelper.checkClosed();
       
   408 
       
   409         testHelper.fetchObjectMidiSystem();
       
   410         testHelper.checkOpen();
       
   411 
       
   412         testHelper.closeObjectDevice();
       
   413         testHelper.checkOpen();
       
   414 
       
   415         testHelper.closeObjectMidiSystem();
       
   416         testHelper.checkClosed();
       
   417 
       
   418         out("...OK");
       
   419 
       
   420         /* Case 10:
       
   421            - MidiDevice.get[Receiver|Transmitter]() // 2
       
   422            - MidiSystem.get[Receiver|Transmitter]() // 1
       
   423            - [Receiver|Transmitter].close() // 1
       
   424            - [Receiver|Transmitter].close() // 2
       
   425         */
       
   426         out("checking " + type + " case 10...");
       
   427         testHelper.checkClosed();
       
   428 
       
   429         testHelper.fetchObjectDevice();
       
   430         testHelper.checkClosed();
       
   431 
       
   432         testHelper.fetchObjectMidiSystem();
       
   433         testHelper.checkOpen();
       
   434 
       
   435         testHelper.closeObjectMidiSystem();
       
   436         testHelper.checkClosed();
       
   437 
       
   438         testHelper.closeObjectDevice();
       
   439         testHelper.checkClosed();
       
   440 
       
   441         out("...OK");
       
   442 
       
   443         /* Case N - 1:
       
   444            - 10 x MidiSystem.get[Receiver|Transmitter]()
       
   445            - 10 x [Receiver|Transmitter].close()
       
   446         */
       
   447         out("checking " + type + " case N - 1...");
       
   448         TestHelper[] testHelpers = new TestHelper[10];
       
   449         for (int i = 0; i < 10; i++) {
       
   450             testHelpers[i] = (TestHelper) testHelper.clone();
       
   451         }
       
   452         testHelper.checkClosed();
       
   453 
       
   454         for (int i = 0; i < 10; i++) {
       
   455             testHelpers[i].fetchObjectMidiSystem();
       
   456             testHelper.checkOpen();
       
   457         }
       
   458 
       
   459 
       
   460         for (int i = 0; i < 9; i++) {
       
   461             testHelpers[i].closeObjectMidiSystem();
       
   462             testHelper.checkOpen();
       
   463         }
       
   464 
       
   465         testHelpers[9].closeObjectMidiSystem();
       
   466         testHelper.checkClosed();
       
   467 
       
   468         out("...OK");
       
   469     }
       
   470 
       
   471     private static void out(String message) {
       
   472         System.out.println(message);
       
   473     }
       
   474 
       
   475     private static abstract class TestHelper implements Cloneable {
       
   476         private MidiDevice device;
       
   477         private boolean failed;
       
   478 
       
   479         protected TestHelper(MidiDevice device) {
       
   480             this.device = device;
       
   481             failed = false;
       
   482         }
       
   483 
       
   484         protected MidiDevice getDevice() {
       
   485             return device;
       
   486         }
       
   487 
       
   488         public boolean hasFailed() {
       
   489             return failed;
       
   490         }
       
   491 
       
   492         public void openDevice() throws MidiUnavailableException {
       
   493             getDevice().open();
       
   494         }
       
   495 
       
   496         public void closeDevice() {
       
   497             getDevice().close();
       
   498         }
       
   499 
       
   500         public void checkOpen(){
       
   501             checkOpen(getDevice(), true);
       
   502         }
       
   503 
       
   504         public void checkClosed(){
       
   505             checkOpen(getDevice(), false);
       
   506         }
       
   507 
       
   508         private void checkOpen(MidiDevice device, boolean desiredState) {
       
   509             if (device.isOpen() != desiredState) {
       
   510                 out("device should be " +
       
   511                                     getStateString(desiredState) + ", but isn't!");
       
   512                 failed = true;
       
   513             }
       
   514         }
       
   515 
       
   516 
       
   517         private String getStateString(boolean state) {
       
   518             return state ? "open" : "closed";
       
   519         }
       
   520 
       
   521 
       
   522         public abstract void fetchObjectMidiSystem() throws MidiUnavailableException;
       
   523         public abstract void fetchObjectDevice() throws MidiUnavailableException;
       
   524         public abstract void closeObjectMidiSystem();
       
   525         public abstract void closeObjectDevice();
       
   526 
       
   527         public Object clone() {
       
   528             try {
       
   529                 return super.clone();
       
   530             } catch (CloneNotSupportedException e) {
       
   531                 return null;
       
   532             }
       
   533         }
       
   534     }
       
   535 
       
   536     private static class ReceiverTestHelper extends TestHelper {
       
   537         private Receiver receiverMidiSystem;
       
   538         private Receiver receiverDevice;
       
   539 
       
   540         public ReceiverTestHelper(MidiDevice device) {
       
   541             super(device);
       
   542         }
       
   543 
       
   544         public void fetchObjectMidiSystem() throws MidiUnavailableException {
       
   545             receiverMidiSystem = MidiSystem.getReceiver();
       
   546         }
       
   547 
       
   548 
       
   549         public void fetchObjectDevice() throws MidiUnavailableException {
       
   550             receiverDevice = getDevice().getReceiver();
       
   551         }
       
   552 
       
   553 
       
   554         public void closeObjectMidiSystem() {
       
   555             receiverMidiSystem.close();
       
   556         }
       
   557 
       
   558 
       
   559         public void closeObjectDevice() {
       
   560             receiverDevice.close();
       
   561         }
       
   562     }
       
   563 
       
   564     private static class TransmitterTestHelper extends TestHelper {
       
   565         private Transmitter transmitterMidiSystem;
       
   566         private Transmitter transmitterDevice;
       
   567 
       
   568         public TransmitterTestHelper(MidiDevice device) {
       
   569             super(device);
       
   570         }
       
   571 
       
   572         public void fetchObjectMidiSystem() throws MidiUnavailableException {
       
   573             transmitterMidiSystem = MidiSystem.getTransmitter();
       
   574         }
       
   575 
       
   576 
       
   577         public void fetchObjectDevice() throws MidiUnavailableException {
       
   578             transmitterDevice = getDevice().getTransmitter();
       
   579         }
       
   580 
       
   581 
       
   582         public void closeObjectMidiSystem() {
       
   583             transmitterMidiSystem.close();
       
   584         }
       
   585 
       
   586 
       
   587         public void closeObjectDevice() {
       
   588             transmitterDevice.close();
       
   589         }
       
   590     }
       
   591 
       
   592     /**
       
   593      * Returns true if at least one MIDI (port) device is correctly installed on
       
   594      * the system.
       
   595      */
       
   596     public static boolean isMidiInstalled() {
       
   597         boolean result = false;
       
   598         MidiDevice.Info[] devices = MidiSystem.getMidiDeviceInfo();
       
   599         for (int i = 0; i < devices.length; i++) {
       
   600             try {
       
   601                 MidiDevice device = MidiSystem.getMidiDevice(devices[i]);
       
   602                 result = ! (device instanceof Sequencer) && ! (device instanceof Synthesizer);
       
   603             } catch (Exception e1) {
       
   604                 System.err.println(e1);
       
   605             }
       
   606             if (result)
       
   607                 break;
       
   608         }
       
   609         return result;
       
   610     }
       
   611 }