test/jdk/javax/sound/sampled/spi/AudioFileReader/AudioInputStreamClose.java
author serb
Thu, 23 Nov 2017 23:05:52 -0800
changeset 47973 d5774c36c605
permissions -rw-r--r--
8191384: WaveFloatFileReader never closes the data stream Reviewed-by: amenkov
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
47973
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
     1
/*
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
     2
 * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
     4
 *
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
     7
 * published by the Free Software Foundation.
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
     8
 *
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    13
 * accompanied this code).
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    14
 *
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    18
 *
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    21
 * questions.
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    22
 */
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    23
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    24
import java.io.BufferedInputStream;
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    25
import java.io.ByteArrayInputStream;
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    26
import java.io.ByteArrayOutputStream;
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    27
import java.io.IOException;
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    28
import java.io.InputStream;
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    29
import java.util.ArrayList;
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    30
import java.util.List;
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    31
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    32
import javax.sound.sampled.AudioFileFormat;
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    33
import javax.sound.sampled.AudioFormat;
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    34
import javax.sound.sampled.AudioInputStream;
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    35
import javax.sound.sampled.UnsupportedAudioFileException;
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    36
import javax.sound.sampled.spi.AudioFileReader;
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    37
import javax.sound.sampled.spi.AudioFileWriter;
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    38
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    39
import static java.util.ServiceLoader.load;
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    40
import static javax.sound.sampled.AudioFileFormat.Type.AIFC;
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    41
import static javax.sound.sampled.AudioFileFormat.Type.AIFF;
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    42
import static javax.sound.sampled.AudioFileFormat.Type.AU;
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    43
import static javax.sound.sampled.AudioFileFormat.Type.SND;
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    44
import static javax.sound.sampled.AudioFileFormat.Type.WAVE;
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    45
import static javax.sound.sampled.AudioSystem.NOT_SPECIFIED;
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    46
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    47
/**
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    48
 * @test
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    49
 * @bug 8191384
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    50
 * @summary the stream returned by AudioFileReader should close its data stream
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    51
 */
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    52
public final class AudioInputStreamClose {
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    53
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    54
    static final class StreamWrapper extends BufferedInputStream {
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    55
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    56
        private boolean open = true;
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    57
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    58
        StreamWrapper(final InputStream in) {
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    59
            super(in);
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    60
        }
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    61
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    62
        @Override
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    63
        public void close() throws IOException {
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    64
            super.close();
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    65
            open = false;
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    66
        }
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    67
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    68
        boolean isOpen() {
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    69
            return open;
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    70
        }
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    71
    }
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    72
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    73
    /**
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    74
     * We will try to use all formats, in this case all our providers will be
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    75
     * covered by supported/unsupported formats.
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    76
     */
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    77
    private static final List<AudioFormat> formats = new ArrayList<>(23000);
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    78
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    79
    private static final AudioFormat.Encoding[] encodings = {
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    80
            AudioFormat.Encoding.ALAW, AudioFormat.Encoding.ULAW,
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    81
            AudioFormat.Encoding.PCM_SIGNED, AudioFormat.Encoding.PCM_UNSIGNED,
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    82
            AudioFormat.Encoding.PCM_FLOAT, new AudioFormat.Encoding("Test")
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    83
    };
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    84
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    85
    private static final int[] sampleBits = {1, 4, 8, 11, 16, 20, 24, 32};
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    86
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    87
    private static final int[] channels = {1, 2, 3, 4, 5};
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    88
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    89
    private static final AudioFileFormat.Type[] types = {
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    90
            WAVE, AU, AIFF, AIFC, SND,
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    91
            new AudioFileFormat.Type("TestName", "TestExt")
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    92
    };
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    93
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    94
    private static final int FRAME_LENGTH = 10;
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    95
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    96
    static {
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    97
        for (final int sampleSize : sampleBits) {
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    98
            for (final int channel : channels) {
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
    99
                for (final AudioFormat.Encoding enc : encodings) {
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   100
                    final int frameSize = ((sampleSize + 7) / 8) * channel;
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   101
                    formats.add(new AudioFormat(enc, 44100, sampleSize, channel,
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   102
                                                frameSize, 44100, true));
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   103
                    formats.add(new AudioFormat(enc, 44100, sampleSize, channel,
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   104
                                                frameSize, 44100, false));
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   105
                }
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   106
            }
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   107
        }
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   108
    }
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   109
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   110
    public static void main(final String[] args) throws IOException {
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   111
        for (final AudioFileWriter afw : load(AudioFileWriter.class)) {
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   112
            for (final AudioFileReader afr : load(AudioFileReader.class)) {
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   113
                for (final AudioFileFormat.Type type : types) {
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   114
                    for (final AudioFormat from : formats) {
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   115
                        test(afw, afr, type, getStream(from, true));
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   116
                        test(afw, afr, type, getStream(from, false));
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   117
                    }
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   118
                }
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   119
            }
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   120
        }
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   121
    }
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   122
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   123
    /**
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   124
     * Writes and reads the data to/from the stream.
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   125
     */
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   126
    private static void test(final AudioFileWriter afw,
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   127
                             final AudioFileReader afr,
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   128
                             final AudioFileFormat.Type type,
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   129
                             final AudioInputStream ais)
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   130
            throws IOException {
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   131
        try {
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   132
            final ByteArrayOutputStream out = new ByteArrayOutputStream();
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   133
            afw.write(ais, type, out);
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   134
            final InputStream input = new ByteArrayInputStream(out.toByteArray());
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   135
            final StreamWrapper wrapper = new StreamWrapper(input);
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   136
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   137
            // the wrapper should be closed as well
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   138
            afr.getAudioInputStream(wrapper).close();
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   139
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   140
            if (wrapper.isOpen()) {
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   141
                System.err.println("Writer = " + afw);
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   142
                System.err.println("Reader = " + afr);
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   143
                throw new RuntimeException("Stream was not closed");
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   144
            }
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   145
        } catch (IOException | IllegalArgumentException |
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   146
                UnsupportedAudioFileException ignored) {
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   147
        }
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   148
    }
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   149
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   150
    private static AudioInputStream getStream(final AudioFormat format,
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   151
                                              final boolean frameLength) {
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   152
        final int dataSize = FRAME_LENGTH * format.getFrameSize();
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   153
        byte[] buf = new byte[dataSize];
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   154
        final InputStream in = new ByteArrayInputStream(buf);
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   155
        if (frameLength) {
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   156
            return new AudioInputStream(in, format, FRAME_LENGTH);
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   157
        } else {
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   158
            return new AudioInputStream(in, format, NOT_SPECIFIED);
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   159
        }
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   160
    }
d5774c36c605 8191384: WaveFloatFileReader never closes the data stream
serb
parents:
diff changeset
   161
}