1 /*
   2  * Copyright (c) 2013, 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 import java.io.ByteArrayInputStream;
  25 import java.io.IOException;
  26 import java.io.InputStream;
  27 
  28 import javax.sound.sampled.AudioSystem;
  29 import javax.sound.sampled.UnsupportedAudioFileException;
  30 import javax.sound.sampled.spi.AudioFileReader;
  31 
  32 import static java.util.ServiceLoader.load;
  33 
  34 /**
  35  * @test
  36  * @bug 7058662 7058666 7058672 8130305
  37  * @author Sergey Bylokhov
  38  */
  39 public final class ReadersExceptions {
  40 
  41     // empty channels
  42     static byte[] wrongAIFFCh =
  43             {0x46, 0x4f, 0x52, 0x4d, // AiffFileFormat.AIFF_MAGIC
  44              0, 0, 0, 0, // length
  45              0, 0, 0, 0, // iffType
  46              0x43, 0x4f, 0x4d, 0x4d, // chunkName
  47              0, 0, 0, 100, // chunkLen
  48              0, 0, // channels
  49              0, 0, 0, 0, //
  50              0, 10  // sampleSize
  51                     , 0, 0, 0, 0};
  52     // empty sampleSize
  53     static byte[] wrongAIFFSSL =
  54             {0x46, 0x4f, 0x52, 0x4d, //AiffFileFormat.AIFF_MAGIC
  55              0, 0, 0, 0, // length
  56              0, 0, 0, 0, // iffType
  57              0x43, 0x4f, 0x4d, 0x4d, // chunkName
  58              0, 0, 0, 100, // chunkLen
  59              0, 10, // channels
  60              0, 0, 0, 0, //
  61              0, 0  // sampleSize
  62                     , 0, 0, 0, 0};
  63     // big sampleSize
  64     static byte[] wrongAIFFSSH =
  65             {0x46, 0x4f, 0x52, 0x4d, //AiffFileFormat.AIFF_MAGIC
  66              0, 0, 0, 0, // length
  67              0, 0, 0, 0, // iffType
  68              0x43, 0x4f, 0x4d, 0x4d, // chunkName
  69              0, 0, 0, 100, // chunkLen
  70              0, 10, // channels
  71              0, 0, 0, 0, //
  72              0, 33  // sampleSize
  73                     , 0, 0, 0, 0};
  74     // empty channels
  75     static byte[] wrongAUCh =
  76             {0x2e, 0x73, 0x6e, 0x64,//AiffFileFormat.AU_SUN_MAGIC
  77              0, 0, 0, 0, // headerSize
  78              0, 0, 0, 0, // dataSize
  79              0, 0, 0, 1, // encoding_local AuFileFormat.AU_ULAW_8
  80              0, 0, 0, 0, // sampleRate
  81              0, 0, 0, 0 // channels
  82             };
  83     // empty channels
  84     static byte[] wrongWAVCh =
  85             {0x52, 0x49, 0x46, 0x46, // WaveFileFormat.RIFF_MAGIC
  86              1, 1, 1, 1, // fileLength
  87              0x57, 0x41, 0x56, 0x45, //  waveMagic
  88              0x66, 0x6d, 0x74, 0x20, // FMT_MAGIC
  89              3, 0, 0, 0, // length
  90              1, 0, // wav_type  WAVE_FORMAT_PCM
  91              0, 0, // channels
  92              0, 0, 0, 0, // sampleRate
  93              0, 0, 0, 0, // avgBytesPerSec
  94              0, 0, // blockAlign
  95              1, 0, // sampleSizeInBits
  96              0x64, 0x61, 0x74, 0x61, // WaveFileFormat.DATA_MAGIC
  97              0, 0, 0, 0, // dataLength
  98             };
  99     // empty sampleSizeInBits
 100     static byte[] wrongWAVSSB =
 101             {0x52, 0x49, 0x46, 0x46, // WaveFileFormat.RIFF_MAGIC
 102              1, 1, 1, 1, // fileLength
 103              0x57, 0x41, 0x56, 0x45, //  waveMagic
 104              0x66, 0x6d, 0x74, 0x20, // FMT_MAGIC
 105              3, 0, 0, 0, // length
 106              1, 0, // wav_type  WAVE_FORMAT_PCM
 107              1, 0, // channels
 108              0, 0, 0, 0, // sampleRate
 109              0, 0, 0, 0, // avgBytesPerSec
 110              0, 0, // blockAlign
 111              0, 0, // sampleSizeInBits
 112              0x64, 0x61, 0x74, 0x61, // WaveFileFormat.DATA_MAGIC
 113              0, 0, 0, 0, // dataLength
 114             };
 115 
 116     static byte[][] data = {wrongAIFFCh, wrongAIFFSSL, wrongAIFFSSH, wrongAUCh,
 117                             wrongWAVCh, wrongWAVSSB};
 118 
 119     public static void main(final String[] args) throws IOException {
 120         for (final byte[] bytes : data) {
 121             testAS(bytes);
 122             testAFR(bytes);
 123         }
 124     }
 125 
 126     private static void testAS(final byte[] buffer) throws IOException {
 127         // AudioSystem API
 128         final InputStream is = new ByteArrayInputStream(buffer);
 129         try {
 130             AudioSystem.getAudioFileFormat(is);
 131         } catch (UnsupportedAudioFileException ignored) {
 132             // Expected.
 133             return;
 134         }
 135         throw new RuntimeException("Test Failed");
 136     }
 137 
 138     private static void testAFR(final byte[] buffer) throws IOException {
 139         // AudioFileReader API
 140         final InputStream is = new ByteArrayInputStream(buffer);
 141         for (final AudioFileReader afr : load(AudioFileReader.class)) {
 142             for (int i = 0; i < 10; ++i) {
 143                 try {
 144                     afr.getAudioFileFormat(is);
 145                     throw new RuntimeException("UAFE expected");
 146                 } catch (final UnsupportedAudioFileException ignored) {
 147                     // Expected.
 148                 }
 149             }
 150         }
 151     }
 152 }