1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *     http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.tika.parser.mp3;
18  
19  import java.io.ByteArrayInputStream;
20  import java.io.InputStream;
21  
22  import junit.framework.TestCase;
23  
24  import org.apache.tika.metadata.Metadata;
25  import org.apache.tika.parser.AutoDetectParser;
26  import org.apache.tika.parser.Parser;
27  import org.apache.tika.sax.BodyContentHandler;
28  import org.xml.sax.ContentHandler;
29  
30  /**
31   * Test case for parsing mp3 files.
32   */
33  public class Mp3ParserTest extends TestCase {
34  
35      /**
36       * Test that with only ID3v1 tags, we get some information out   
37       */
38      public void testMp3ParsingID3v1() throws Exception {
39          Parser parser = new AutoDetectParser(); // Should auto-detect!
40          ContentHandler handler = new BodyContentHandler();
41          Metadata metadata = new Metadata();
42  
43          InputStream stream = Mp3ParserTest.class.getResourceAsStream(
44                  "/test-documents/testMP3id3v1.mp3");
45          try {
46              parser.parse(stream, handler, metadata);
47          } finally {
48              stream.close();
49          }
50  
51          assertEquals("audio/mpeg", metadata.get(Metadata.CONTENT_TYPE));
52          assertEquals("Test Title", metadata.get(Metadata.TITLE));
53          assertEquals("Test Artist", metadata.get(Metadata.AUTHOR));
54  
55          String content = handler.toString();
56          assertTrue(content.contains("Test Title"));
57          assertTrue(content.contains("Test Artist"));
58          assertTrue(content.contains("Test Album"));
59          assertTrue(content.contains("2008"));
60          assertTrue(content.contains("Test Comment"));
61          assertTrue(content.contains("Rock"));
62          
63          assertEquals("MPEG 3 Layer III Version 1", metadata.get("version"));
64          assertEquals("44100", metadata.get("samplerate"));
65          assertEquals("2", metadata.get("channels"));
66      }
67  
68      /**
69       * Test that with only ID3v2 tags, we get the full
70       *  set of information out.
71       */
72      public void testMp3ParsingID3v2() throws Exception {
73          Parser parser = new AutoDetectParser(); // Should auto-detect!
74          ContentHandler handler = new BodyContentHandler();
75          Metadata metadata = new Metadata();
76  
77          InputStream stream = Mp3ParserTest.class.getResourceAsStream(
78                  "/test-documents/testMP3id3v2.mp3");
79          try {
80              parser.parse(stream, handler, metadata);
81          } finally {
82              stream.close();
83          }
84  
85          assertEquals("audio/mpeg", metadata.get(Metadata.CONTENT_TYPE));
86          assertEquals("Test Title", metadata.get(Metadata.TITLE));
87          assertEquals("Test Artist", metadata.get(Metadata.AUTHOR));
88  
89          String content = handler.toString();
90          assertTrue(content.contains("Test Title"));
91          assertTrue(content.contains("Test Artist"));
92          assertTrue(content.contains("Test Album"));
93          assertTrue(content.contains("2008"));
94          assertTrue(content.contains("Test Comment"));
95          assertTrue(content.contains("Rock"));
96          
97          assertEquals("MPEG 3 Layer III Version 1", metadata.get("version"));
98          assertEquals("44100", metadata.get("samplerate"));
99          assertEquals("2", metadata.get("channels"));
100     }
101 
102     /**
103      * Test that with both id3v2 and id3v1, we prefer the
104      *  details from id3v2
105      */
106     public void testMp3ParsingID3v1v2() throws Exception {
107         Parser parser = new AutoDetectParser(); // Should auto-detect!
108         ContentHandler handler = new BodyContentHandler();
109         Metadata metadata = new Metadata();
110 
111         InputStream stream = Mp3ParserTest.class.getResourceAsStream(
112                 "/test-documents/testMP3id3v1_v2.mp3");
113         try {
114             parser.parse(stream, handler, metadata);
115         } finally {
116             stream.close();
117         }
118 
119         assertEquals("audio/mpeg", metadata.get(Metadata.CONTENT_TYPE));
120         assertEquals("Test Title", metadata.get(Metadata.TITLE));
121         assertEquals("Test Artist", metadata.get(Metadata.AUTHOR));
122 
123         String content = handler.toString();
124         assertTrue(content.contains("Test Title"));
125         assertTrue(content.contains("Test Artist"));
126         assertTrue(content.contains("Test Album"));
127         assertTrue(content.contains("2008"));
128         assertTrue(content.contains("Test Comment"));
129         assertTrue(content.contains("Rock"));
130         
131         assertEquals("MPEG 3 Layer III Version 1", metadata.get("version"));
132         assertEquals("44100", metadata.get("samplerate"));
133         assertEquals("2", metadata.get("channels"));
134     }
135 
136     public void testID3v2Frame() throws Exception {
137        byte[] empty = new byte[] {
138              0x49, 0x44, 0x33, 3, 1, 0,
139              0, 0, 0, 0
140        };
141        
142        assertEquals(11, ID3v2Frame.getInt(new byte[] {0,0,0,0x0b}));
143        assertEquals(257, ID3v2Frame.getInt(new byte[] {0,0,1,1}));
144        
145        ID3v2Frame f = (ID3v2Frame)
146             ID3v2Frame.createFrameIfPresent(new ByteArrayInputStream(empty));
147        assertEquals(3, f.getMajorVersion());
148        assertEquals(1, f.getMinorVersion());
149        assertEquals(0, f.getFlags());
150        assertEquals(0, f.getLength());
151        assertEquals(0, f.getData().length);
152     }
153 }