1/*
2 * Copyright (c) 2007, 2015, 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/* @test
25 @summary Test SF2SoundbankReader getSoundbank(InputStream) method using
26     very bad InputStream which can only read 1 byte at time
27 @modules java.desktop/com.sun.media.sound
28 */
29
30import java.io.BufferedInputStream;
31import java.io.File;
32import java.io.FileInputStream;
33import java.io.IOException;
34import java.io.InputStream;
35
36import javax.sound.midi.Patch;
37import javax.sound.midi.Soundbank;
38
39import com.sun.media.sound.SF2SoundbankReader;
40
41public class TestGetSoundbankInputStream2 {
42
43    private static class BadInputStream extends InputStream
44    {
45
46        InputStream is;
47
48        public BadInputStream(InputStream is)
49        {
50            this.is = is;
51        }
52
53        public int read() throws IOException {
54            return is.read();
55        }
56
57        public int read(byte[] b, int off, int len) throws IOException {
58            if(len > 1) len = 1;
59            return is.read(b, off, len);
60        }
61
62        public int read(byte[] b) throws IOException {
63            return read(b, 0, b.length);
64        }
65
66        public long skip(long n) throws IOException {
67            if(n > 1) n = 1;
68            return is.skip(n);
69        }
70
71        public int available() throws IOException {
72            int avail = is.available();
73            if(avail > 1) avail = 1;
74            return avail;
75        }
76
77        public void close() throws IOException {
78            is.close();
79        }
80
81        public synchronized void mark(int readlimit) {
82            is.mark(readlimit);
83        }
84
85        public boolean markSupported() {
86            return is.markSupported();
87        }
88
89        public synchronized void reset() throws IOException {
90            is.reset();
91        }
92
93    }
94
95    private static void assertTrue(boolean value) throws Exception
96    {
97        if(!value)
98            throw new RuntimeException("assertTrue fails!");
99    }
100
101    public static void main(String[] args) throws Exception {
102        File file = new File(System.getProperty("test.src", "."), "ding.sf2");
103        FileInputStream fis = new FileInputStream(file);
104        BufferedInputStream bis = new BufferedInputStream(fis);
105        try
106        {
107            InputStream badis = new BadInputStream(bis);
108            Soundbank sf2 = new SF2SoundbankReader().getSoundbank(badis);
109            assertTrue(sf2.getInstruments().length == 1);
110            Patch patch = sf2.getInstruments()[0].getPatch();
111            assertTrue(patch.getProgram() == 0);
112            assertTrue(patch.getBank() == 0);
113        }
114        finally
115        {
116            bis.close();
117        }
118    }
119}
120