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.InvalidMidiDataException;
25 import javax.sound.midi.MidiDevice;
26 import javax.sound.midi.MidiSystem;
27 import javax.sound.midi.MidiUnavailableException;
28 import javax.sound.midi.Receiver;
29 import javax.sound.midi.Sequencer;
30 import javax.sound.midi.ShortMessage;
31 import javax.sound.midi.Synthesizer;
32 
33 /**
34  * @test
35  * @bug 4616517
36  * @summary Receiver.send() does not work properly
37  */
38 public class ClosedReceiver {
39 
main(String[] args)40     public static void main(String[] args) throws Exception {
41         out("#4616517: Receiver.send() does not work properly");
42         if (!isMidiInstalled()) {
43             out("Soundcard does not exist or sound drivers not installed!");
44             out("This test requires sound drivers for execution.");
45             return;
46         }
47 
48         boolean passed = true;
49 
50         passed &= testReceiverSend();
51         passed &= testClosedReceivers();
52         if (passed) {
53             out("Test PASSED.");
54         } else {
55             throw new Exception("Test FAILED.");
56         }
57     }
58 
59     /**
60      * Execute Receiver.send() and expect that there is no exception.
61      */
testReceiverSend()62     private static boolean testReceiverSend() {
63         boolean result = true;
64 
65         Receiver receiver;
66         ShortMessage shMsg = new ShortMessage();
67 
68         try {
69             receiver = MidiSystem.getReceiver();
70             shMsg.setMessage(ShortMessage.NOTE_ON, 0,60, 93);
71             try {
72                 receiver.send( shMsg, -1 );
73             } catch(IllegalStateException ilEx) {
74                 ilEx.printStackTrace(System.out);
75                 out("IllegalStateException was thrown incorrectly!");
76                 result = false;
77             }
78             receiver.close();
79         } catch(MidiUnavailableException e) {
80             out("Midi unavailable, cannot test.");
81         } catch(InvalidMidiDataException ine) {
82             out("InvalidMidiDataException, cannot test.");
83         }
84         return result;
85     }
86 
testClosedReceivers()87     private static boolean testClosedReceivers() {
88         boolean result = true;
89         Receiver receiver;
90         Synthesizer synt = null;
91 
92         // test Synthesizer's Receiver
93         try {
94             synt = MidiSystem.getSynthesizer();
95             synt.open();
96         } catch(MidiUnavailableException e) {
97             out("Midi unavailable, cannot test.");
98             return result;
99         }
100         try {
101             receiver = synt.getReceiver();
102         } catch (MidiUnavailableException e) {
103             out("unable to get Receiver from synthesizer, cannot test.");
104             return result;
105         }
106         result &= testClosedReceiver(receiver);
107         synt.close();
108 
109         // test all MidiDevices' Receivers
110 
111         MidiDevice.Info[] devices = MidiSystem.getMidiDeviceInfo();
112         for (int i = 0; i < devices.length; i++) {
113             try {
114                 MidiDevice device = MidiSystem.getMidiDevice(devices[i]);
115                 if (device.getMaxReceivers() != 0) {
116                     receiver = device.getReceiver();
117                     result &= testClosedReceiver(receiver);
118                 }
119             } catch (Exception e) {
120                 out(e);
121                 out("cannot test.");
122                 return result;
123             }
124         }
125         return result;
126     }
127 
128     /**
129      * Execute send() on a closed Receivers and expect IllegalStateException.
130      */
testClosedReceiver(Receiver receiver)131     private static boolean testClosedReceiver(Receiver receiver) {
132         boolean result = true;
133         out("testing Receiver: " + receiver);
134         ShortMessage shMsg = new ShortMessage();
135         try {
136             shMsg.setMessage(ShortMessage.NOTE_ON, 0,60, 93);
137         } catch(InvalidMidiDataException e) {
138             out(e);
139             out("unable to construct ShortMessage, cannot test.");
140             return result;
141         }
142 
143         // begin of test
144         receiver.close();
145         try {
146             receiver.send( shMsg, -1 );
147             out("IllegalStateException was not thrown "
148                 + "on Receiver.send()!");
149             result = false;
150         } catch(IllegalStateException e) {
151             out("IllegalStateException was thrown. Ok.");
152         }
153         return result;
154     }
155 
out(Throwable t)156     private static void out(Throwable t) {
157         t.printStackTrace(System.out);
158     }
159 
out(String message)160     private static void out(String message) {
161         System.out.println(message);
162     }
163 
164     /**
165      * Returns true if at least one MIDI (port) device is correctly installed on
166      * the system.
167      */
isMidiInstalled()168     private static boolean isMidiInstalled() {
169         boolean result = false;
170         MidiDevice.Info[] devices = MidiSystem.getMidiDeviceInfo();
171         for (int i = 0; i < devices.length; i++) {
172             try {
173                 MidiDevice device = MidiSystem.getMidiDevice(devices[i]);
174                 result = !(device instanceof Sequencer)
175                         && !(device instanceof Synthesizer);
176             } catch (Exception e1) {
177                 System.err.println(e1);
178             }
179             if (result)
180                 break;
181         }
182         return result;
183     }
184 }
185