1
package org.jaudiotagger.audio.ogg;
3
import junit.framework.TestCase;
4
import org.jaudiotagger.AbstractTestCase;
5
import org.jaudiotagger.audio.AudioFile;
6
import org.jaudiotagger.audio.AudioFileIO;
7
import org.jaudiotagger.audio.ogg.util.OggPageHeader;
8
import org.jaudiotagger.tag.vorbiscomment.VorbisCommentFieldKey;
9
import org.jaudiotagger.tag.vorbiscomment.VorbisCommentTag;
12
import java.io.RandomAccessFile;
17
public class OggVorbisHeaderTest extends TestCase
22
* Testing reading of vorbis audio header info
24
public void testReadFile()
26
Exception exceptionCaught = null;
29
File testFile = AbstractTestCase.copyAudioToTmp("test.ogg", new File("testReadFile.ogg"));
30
AudioFile f = AudioFileIO.read(testFile);
32
//assertEquals("192",f.getAudioHeader().getBitRate());
33
//assertEquals("Ogg Vorbis v1",f.getAudioHeader().getEncodingType());
34
//assertEquals("2",f.getAudioHeader().getChannels());
35
//assertEquals("44100",f.getAudioHeader().getSampleRate());
38
assertTrue(f.getTag() instanceof VorbisCommentTag);
47
assertNull(exceptionCaught);
51
* Testing reading of vorbis audio header info
53
* TODO, need to replace with file that is not copyrighted
55
public void testReadPaddedFile()
57
Exception exceptionCaught = null;
60
File orig = new File("testdata", "test2.ogg");
66
File testFile = AbstractTestCase.copyAudioToTmp("test2.ogg", new File("test2.ogg"));
67
AudioFile f = AudioFileIO.read(testFile);
69
f.getTag().setAlbum("bbbbbbb");
72
//assertEquals("192",f.getAudioHeader().getBitRate());
73
//assertEquals("Ogg Vorbis v1",f.getAudioHeader().getEncodingType());
74
//assertEquals("2",f.getAudioHeader().getChannels());
75
//assertEquals("44100",f.getAudioHeader().getSampleRate());
77
//assertTrue(f.getTag() instanceof VorbisCommentTag);
86
assertNull(exceptionCaught);
90
* Test simple write to file, comment and setup header just spread over one page before and afterwards
92
public void testWriteFile()
94
Exception exceptionCaught = null;
97
File testFile = AbstractTestCase.copyAudioToTmp("test.ogg", new File("testWriteTagToFile.ogg"));
98
AudioFile f = AudioFileIO.read(testFile);
100
//Size of VorbisComment should increase
101
assertTrue(f.getTag() instanceof VorbisCommentTag);
102
f.getTag().setAlbum("bbbbbbb");
105
f = AudioFileIO.read(testFile);
106
assertTrue(f.getTag() instanceof VorbisCommentTag);
107
assertEquals("bbbbbbb", f.getTag().getFirstAlbum());
109
OggFileReader ofr = new OggFileReader();
110
OggPageHeader oph = ofr.readOggPageHeader(new RandomAccessFile(testFile, "r"), 0);
111
assertEquals(30, oph.getPageLength());
112
assertEquals(0, oph.getPageSequence());
113
assertEquals(559748870, oph.getSerialNumber());
114
assertEquals(-2111591604, oph.getCheckSum());
116
oph = ofr.readOggPageHeader(new RandomAccessFile(testFile, "r"), 1);
117
assertEquals(3745, oph.getPageLength());
118
assertEquals(1, oph.getPageSequence());
119
assertEquals(559748870, oph.getSerialNumber());
120
assertEquals(233133993, oph.getCheckSum());
129
assertNull(exceptionCaught);
133
* Test writing to file where previoslu comment was spread over many pages, now only over one so the sequence nos
134
* for all subsequent pages have to be redone with checksums
136
public void testWritePreviouslyLargeFile()
138
Exception exceptionCaught = null;
141
File testFile = AbstractTestCase.copyAudioToTmp("testlargeimage.ogg", new File("testWritePreviouslyLargeFile.ogg"));
142
AudioFile f = AudioFileIO.read(testFile);
144
//Size of VorbisComment should decrease just setting a nonsical but muuch smaller value for image
145
assertTrue(f.getTag() instanceof VorbisCommentTag);
146
VorbisCommentTag vorbisTag = (VorbisCommentTag) f.getTag();
147
vorbisTag.set(vorbisTag.createTagField(VorbisCommentFieldKey.COVERART, "ccc"));
150
f = AudioFileIO.read(testFile);
151
assertTrue(f.getTag() instanceof VorbisCommentTag);
153
OggFileReader ofr = new OggFileReader();
154
OggPageHeader oph = ofr.readOggPageHeader(new RandomAccessFile(testFile, "r"), 0);
155
assertEquals(30, oph.getPageLength());
156
assertEquals(0, oph.getPageSequence());
157
assertEquals(559748870, oph.getSerialNumber());
158
assertEquals(-2111591604, oph.getCheckSum());
159
assertEquals(2, oph.getHeaderType());
161
oph = ofr.readOggPageHeader(new RandomAccessFile(testFile, "r"), 1);
162
assertEquals(3783, oph.getPageLength());
163
assertEquals(1, oph.getPageSequence());
164
assertEquals(559748870, oph.getSerialNumber());
165
assertEquals(1677220898, oph.getCheckSum());
166
assertEquals(0, oph.getHeaderType());
169
oph = ofr.readOggPageHeader(new RandomAccessFile(testFile, "r"), 2);
170
assertEquals(4156, oph.getPageLength());
171
assertEquals(2, oph.getPageSequence());
172
assertEquals(559748870, oph.getSerialNumber());
173
assertEquals(1176378771, oph.getCheckSum());
174
assertEquals(0, oph.getHeaderType());
183
assertNull(exceptionCaught);
187
* Testing writing multi page comment header (existing header is multipage)
189
public void testLargeWriteFile()
191
Exception exceptionCaught = null;
194
File testFile = AbstractTestCase.copyAudioToTmp("testlargeimage.ogg", new File("testLargeWriteFile.ogg"));
195
AudioFile f = AudioFileIO.read(testFile);
197
//Size of VorbisComment should increase
198
assertTrue(f.getTag() instanceof VorbisCommentTag);
199
f.getTag().setAlbum("bbbbbbb");
202
f = AudioFileIO.read(testFile);
203
assertTrue(f.getTag() instanceof VorbisCommentTag);
204
assertEquals("bbbbbbb", f.getTag().getFirstAlbum());
206
OggFileReader ofr = new OggFileReader();
207
OggPageHeader oph = ofr.readOggPageHeader(new RandomAccessFile(testFile, "r"), 0);
208
assertEquals(30, oph.getPageLength());
209
assertEquals(0, oph.getPageSequence());
210
assertEquals(559748870, oph.getSerialNumber());
211
assertEquals(-2111591604, oph.getCheckSum());
212
assertEquals(2, oph.getHeaderType());
214
oph = ofr.readOggPageHeader(new RandomAccessFile(testFile, "r"), 1);
215
assertEquals(65025, oph.getPageLength());
216
assertEquals(1, oph.getPageSequence());
217
assertEquals(559748870, oph.getSerialNumber());
218
assertEquals(-1172108515, oph.getCheckSum());
219
assertEquals(0, oph.getHeaderType());
226
assertNull(exceptionCaught);
230
* Testing writing multi page comment header where the setup header has to be split because there is not enough
231
* room on the last Comment header Page
233
public void testLargeWriteFileWithSplitSetupHeader()
235
Exception exceptionCaught = null;
239
File testFile = AbstractTestCase.copyAudioToTmp("testlargeimage.ogg", new File("testAwkwardSizeWriteFile.ogg"));
240
AudioFile f = AudioFileIO.read(testFile);
242
//Size of VorbisComment should increase and to a level that the setupheader cant fit completely
243
//in last page pf comment header so has to be split over two pages
244
assertTrue(f.getTag() instanceof VorbisCommentTag);
245
StringBuffer sb = new StringBuffer();
246
for (int i = 0; i < 24000; i++)
250
f.getTag().setAlbum("bbbbbbb");
251
f.getTag().setTitle(sb.toString());
254
f = AudioFileIO.read(testFile);
255
assertTrue(f.getTag() instanceof VorbisCommentTag);
256
assertEquals("bbbbbbb", f.getTag().getFirstAlbum());
257
assertEquals(sb.toString(), f.getTag().getFirstTitle());
259
//Identification Header type oggFlag =2
260
OggFileReader ofr = new OggFileReader();
261
OggPageHeader oph = ofr.readOggPageHeader(new RandomAccessFile(testFile, "r"), 0);
262
assertEquals(30, oph.getPageLength());
263
assertEquals(0, oph.getPageSequence());
264
assertEquals(559748870, oph.getSerialNumber());
265
assertEquals(-2111591604, oph.getCheckSum());
266
assertEquals(2, oph.getHeaderType());
268
//Start of Comment Header, ogg Flag =0
269
oph = ofr.readOggPageHeader(new RandomAccessFile(testFile, "r"), 1);
270
assertEquals(65025, oph.getPageLength());
271
assertEquals(1, oph.getPageSequence());
272
assertEquals(559748870, oph.getSerialNumber());
273
assertEquals(2037809131, oph.getCheckSum());
274
assertEquals(0, oph.getHeaderType());
276
//Continuing Comment Header, ogg Flag = 1
277
oph = ofr.readOggPageHeader(new RandomAccessFile(testFile, "r"), 2);
278
assertEquals(1, oph.getHeaderType());
280
//Addtional checking that audio is also readable
281
RandomAccessFile raf = new RandomAccessFile(testFile, "r");
282
OggPageHeader lastPageHeader = null;
283
while (raf.getFilePointer() < raf.length())
285
OggPageHeader pageHeader = OggPageHeader.read(raf);
286
int packetLengthTotal = 0;
287
for (OggPageHeader.PacketStartAndLength packetAndStartLength : pageHeader.getPacketList())
289
packetLengthTotal += packetAndStartLength.getLength();
291
assertEquals(pageHeader.getPageLength(), packetLengthTotal);
292
if (lastPageHeader != null)
294
assertEquals(lastPageHeader.getPageSequence() + 1, pageHeader.getPageSequence());
296
raf.seek(raf.getFilePointer() + pageHeader.getPageLength());
298
lastPageHeader = pageHeader;
300
assertEquals(raf.length(), raf.getFilePointer());
308
assertNull(exceptionCaught);
309
assertEquals(26, count);