/* You may freely copy, distribute, modify and use this class as long as the original author attribution remains intact. See message below. Copyright (C) 2005 Christian Pesch. All Rights Reserved. */ package slash.metamusic.mp3; import slash.metamusic.mp3.sections.*; import slash.metamusic.test.AbstractFileTest; import slash.metamusic.util.ArrayHelper; import slash.metamusic.util.InputOutput; import slash.metamusic.util.URLLoader; import javax.activation.MimeType; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.Arrays; /** * Tests for the MP3File parser */ public class MP3FileTest extends AbstractFileTest { public MP3FileTest(String name) { super(name); } private void checkMP3Properties(MP3File mp3) { assertEquals(true, mp3.isMP3()); assertEquals(256000, mp3.getBitRate()); assertEquals(48000, mp3.getSampleFrequency()); assertEquals(1, mp3.getSeconds()); } private void setID3WithoutGenreAndCount(ID3MetaData mp3) { mp3.setArtist("Artist"); mp3.setComment("Comment"); mp3.setAlbum("Album"); mp3.setTrack("Track"); mp3.setIndex(42); mp3.setYear(2001); } private void setID3(MP3File mp3) { setID3WithoutGenreAndCount(mp3); mp3.setGenre(new ID3Genre("Freestyle")); mp3.setCount(84); mp3.setSeconds(14); } private void checkID3WithoutGenreAndCommentAndCount(MP3File mp3) { assertEquals(768, ((MP3Properties) mp3.getProperties()).getFrameSize()); assertEquals(21, ((MP3Properties) mp3.getProperties()).getFrames()); checkMP3Properties(mp3); assertEquals("Artist", mp3.getArtist()); assertEquals("Album", mp3.getAlbum()); assertEquals("Track", mp3.getTrack()); assertEquals(42, mp3.getIndex()); assertEquals(2001, mp3.getYear()); } private void checkID3(MP3File mp3) { checkID3WithoutGenreAndCommentAndCount(mp3); assertEquals("Comment", mp3.getComment()); assertEquals(119, mp3.getGenre().getId()); assertEquals(new ID3Genre(ID3Genre.getGenreName(119)), mp3.getGenre()); assertEquals(new ID3Genre(ID3Genre.getGenreId("Freestyle")), mp3.getGenre()); } private MP3File checkID3WithoutCount(File tempFile) throws IOException { MP3File mp3 = new MP3File(); assertTrue(mp3.read(tempFile)); assertEquals(tempFile.length(), mp3.getFileSize()); checkID3(mp3); return mp3; } private MP3File checkID3(File tempFile) throws IOException { MP3File mp3 = new MP3File(); assertTrue(mp3.read(tempFile)); assertEquals(tempFile.length(), mp3.getFileSize()); checkID3(mp3); assertEquals(84, mp3.getCount()); return mp3; } private void checkNoID3(MP3File mp3) { assertEquals(false, mp3.isID3v1()); assertEquals(false, mp3.isID3v1dot1()); assertEquals(false, mp3.isID3v2()); assertEquals(tempFile.getName().substring(0, tempFile.getName().length() - 4), mp3.getArtist()); assertEquals(null, mp3.getAlbum()); assertEquals(null, mp3.getTrack()); assertEquals(null, mp3.getComment()); assertEquals(-1, mp3.getIndex()); assertEquals(0, mp3.getHead().getReadSize()); assertEquals(0, mp3.getHead().getContentSize()); assertEquals(0, mp3.getHead().getFrameSize()); assertEquals(0, mp3.getHead().getHeaderSize()); assertEquals(0, mp3.getHead().getWriteSize()); assertEquals(0, mp3.getTail().getReadSize()); assertEquals(0, mp3.getTail().getContentSize()); assertEquals(0, mp3.getTail().getWriteSize()); } public void testReadNoID3() throws IOException { File src = new File(PATH_TO_TEST_MP3_FILES + "noid3.mp3"); copyToTempFile(src); MP3File mp3 = new MP3File(); assertTrue(mp3.read(tempFile)); log.fine("testReadNoID3#mp3 " + mp3); assertEquals(src.length(), mp3.getFileSize()); assertEquals(0, mp3.getProperties().getReadSize()); checkMP3Properties(mp3); assertEquals(-1, mp3.getCount()); checkNoID3(mp3); } public void testRiffPrefix() throws IOException { File src = new File(AbstractFileTest.PATH_TO_TEST_MP3_FILES + "riffprefix.mp3"); copyToTempFile(src); MP3File mp3 = new MP3File(); assertTrue(mp3.read(tempFile)); log.fine("testRiffPrefix#mp3 " + mp3); assertEquals(src.length(), mp3.getFileSize()); assertEquals(487, mp3.getProperties().getReadSize()); checkMP3Properties(mp3); assertEquals(-1, mp3.getCount()); checkNoID3(mp3); } public void testReadOgg() throws IOException { File src = new File(AbstractFileTest.PATH_TO_TEST_MP3_FILES + "sound.ogg"); copyToTempFile(src); MP3File mp3 = new MP3File(); assertTrue(mp3.read(tempFile)); log.fine("testReadOgg#mp3 " + mp3); assertEquals(src.length(), mp3.getFileSize()); assertEquals(false, mp3.isMP3()); assertEquals(true, mp3.isOgg()); } public void testReadWav() throws IOException { File src = new File(AbstractFileTest.PATH_TO_TEST_MP3_FILES + "sound.wav"); copyToTempFile(src); MP3File mp3 = new MP3File(); assertTrue(mp3.read(tempFile)); log.fine("testReadWav#mp3 " + mp3); assertEquals(src.length(), mp3.getFileSize()); assertEquals(false, mp3.isMP3()); assertEquals(true, mp3.isWAV()); assertEquals(352800, mp3.getBitRate()); assertEquals(22050, mp3.getSampleFrequency()); assertEquals(false, mp3.isVBR()); assertEquals(8, mp3.getSeconds()); } public void testReadMP3() throws IOException { File src = new File(AbstractFileTest.PATH_TO_TEST_MP3_FILES + "sound.mp3"); copyToTempFile(src); MP3File mp3 = new MP3File(); assertTrue(mp3.read(tempFile)); log.fine("testReadMP3#mp3 " + mp3); assertEquals(src.length(), mp3.getFileSize()); assertEquals(true, mp3.isMP3()); assertEquals(false, mp3.isWAV()); assertEquals(false, mp3.isOgg()); assertEquals(32000, mp3.getBitRate()); assertEquals(22050, mp3.getSampleFrequency()); assertEquals(false, mp3.isVBR()); assertEquals(9, mp3.getSeconds()); } public void testReadWithID3v1() throws IOException { File src = new File(AbstractFileTest.PATH_TO_TEST_MP3_FILES + "withid3v1.mp3"); copyToTempFile(src); MP3File mp3 = checkID3WithoutCount(tempFile); assertEquals(true, mp3.isID3v1()); assertEquals(true, mp3.isID3v1dot1()); assertEquals(false, mp3.isID3v2()); } public void testReadWithID3v2() throws IOException { File src = new File(AbstractFileTest.PATH_TO_TEST_MP3_FILES + "withid3v2.mp3"); copyToTempFile(src); MP3File mp3 = checkID3(tempFile); assertEquals(false, mp3.isID3v1()); assertEquals(false, mp3.isID3v1dot1()); assertEquals(true, mp3.isID3v2()); } public void testReadWithID3v1and2() throws IOException { File src = new File(AbstractFileTest.PATH_TO_TEST_MP3_FILES + "withid3v1and2.mp3"); copyToTempFile(src); MP3File mp3 = checkID3(tempFile); assertEquals(true, mp3.isID3v1()); assertEquals(true, mp3.isID3v1dot1()); assertEquals(true, mp3.isID3v2()); } public void testWriteNoID3() throws IOException { File src = new File(AbstractFileTest.PATH_TO_TEST_MP3_FILES + "noid3.mp3"); copyToTempFile(src); MP3File mp3 = new MP3File(); assertTrue(mp3.read(src)); mp3.setID3v1(false); mp3.setID3v2(false); log.fine("testWriteNoID3#mp3 " + mp3); mp3.write(tempFile); assertTrue(mp3.read(tempFile)); assertEquals(src.length(), mp3.getFileSize()); assertEquals(0, mp3.getProperties().getReadSize()); checkMP3Properties(mp3); assertEquals(-1, mp3.getCount()); checkNoID3(mp3); } public void testWriteRiffPrefix() throws IOException { File src = new File(AbstractFileTest.PATH_TO_TEST_MP3_FILES + "riffprefix.mp3"); copyToTempFile(src); MP3File mp3 = new MP3File(); assertTrue(mp3.read(src)); mp3.setID3v1(false); mp3.setID3v2(false); long riffPrefixSize = mp3.getProperties().getReadSize() - mp3.getHead().getReadSize(); log.fine("testWriteRiffPrefix#mp3 " + mp3); mp3.write(tempFile); assertTrue(mp3.read(tempFile)); assertEquals(src.length() - riffPrefixSize, mp3.getFileSize()); assertEquals(0, mp3.getProperties().getReadSize()); checkMP3Properties(mp3); assertEquals(-1, mp3.getCount()); checkNoID3(mp3); } public void testWriteID3v1() throws IOException { File src = new File(AbstractFileTest.PATH_TO_TEST_MP3_FILES + "noid3.mp3"); copyToTempFile(src); MP3File mp3 = new MP3File(); mp3.setID3v1(true); mp3.setID3v2(false); setID3(mp3); mp3.write(tempFile); mp3 = checkID3WithoutCount(tempFile); assertEquals(true, mp3.isID3v1()); assertEquals(true, mp3.isID3v1dot1()); assertEquals(false, mp3.isID3v2()); assertEquals(0, mp3.getHead().getReadSize()); assertEquals(0, mp3.getHead().getContentSize()); assertEquals(0, mp3.getHead().getFrameSize()); assertEquals(0, mp3.getHead().getWriteSize()); assertEquals(0, mp3.getProperties().getReadSize()); assertEquals(ID3v1Tail.ID3V1_SIZE, mp3.getTail().getReadSize()); assertEquals(ID3v1Tail.ID3V1_SIZE, mp3.getTail().getWriteSize()); assertEquals(-1, mp3.getCount()); } private static final int headReadSize = 137; private static final int headContentSize = 57; private static final int headFrameSize = 10; public void testWriteID3v2ThreeDotZero() throws IOException { File src = new File(AbstractFileTest.PATH_TO_TEST_MP3_FILES + "noid3.mp3"); copyToTempFile(src); MP3File mp3 = new MP3File(); mp3.setID3v1(false); mp3.setID3v2(true); setID3(mp3); int frameCount = 7; log.fine("testWriteID3v2ThreeDotZero#mp3 " + mp3); mp3.write(tempFile); File dest = new File(tempFile.getParentFile(), "writeID3v2ThreeDotZero.mp3"); tempFile.renameTo(dest); tempFile = dest; mp3 = checkID3(tempFile); assertEquals(false, mp3.isID3v1()); assertEquals(false, mp3.isID3v1dot1()); assertEquals(true, mp3.isID3v2()); assertEquals(new ID3v2Version(3, 0), mp3.getHead().getVersion()); assertEquals(src.length() + mp3.getHead().getWriteSize() + mp3.getTail().getWriteSize(), mp3.getFile().length()); assertEquals(MP3FileTest.headReadSize, mp3.getHead().getReadSize()); assertEquals(MP3FileTest.headContentSize, mp3.getHead().getContentSize()); long frameSize = mp3.getHead().getFrameSize(); assertEquals(mp3.getHead().getContentSize() + headFrameSize * frameCount, frameSize); long headerSize = mp3.getHead().getHeaderSize(); long writeSize = headerSize + (64 - headerSize % 64) + 64; assertEquals(writeSize, mp3.getHead().getWriteSize()); assertEquals(writeSize - headerSize, mp3.getProperties().getReadSize()); assertEquals(0, mp3.getTail().getReadSize()); assertEquals(0, mp3.getTail().getWriteSize()); } private static final int obsoleteHeadReadSize = 109; private static final int obsoleteHeadFrameSize = 6; public void testWriteID3v2TwoDotZero() throws IOException { File src = new File(AbstractFileTest.PATH_TO_TEST_MP3_FILES + "noid3.mp3"); copyToTempFile(src); MP3File mp3 = new MP3File(); mp3.setID3v1(false); mp3.setID3v2(true); mp3.getHead().setVersion(new ID3v2Version(2, 0)); setID3(mp3); int frameCount = 7; log.fine("testWriteID3v2TwoDotZero#mp3 " + mp3); mp3.write(tempFile); File dest = new File(tempFile.getParentFile(), "writeID3v2TwoDotZero.mp3"); tempFile.renameTo(dest); tempFile = dest; mp3 = checkID3(tempFile); assertEquals(false, mp3.isID3v1()); assertEquals(false, mp3.isID3v1dot1()); assertEquals(true, mp3.isID3v2()); assertEquals(new ID3v2Version(2, 0), mp3.getHead().getVersion()); assertEquals(src.length() + mp3.getHead().getWriteSize() + mp3.getTail().getWriteSize(), mp3.getFile().length()); assertEquals(obsoleteHeadReadSize, mp3.getHead().getReadSize()); assertEquals(headContentSize, mp3.getHead().getContentSize()); long frameSize = mp3.getHead().getFrameSize(); assertEquals(mp3.getHead().getContentSize() + obsoleteHeadFrameSize * frameCount, frameSize); long headerSize = mp3.getHead().getHeaderSize(); long writeSize = headerSize + (64 - headerSize % 64) + 64; assertEquals(writeSize, mp3.getHead().getWriteSize()); assertEquals(writeSize - headerSize, mp3.getProperties().getReadSize()); assertEquals(0, mp3.getTail().getReadSize()); assertEquals(0, mp3.getTail().getWriteSize()); } public void testWriteMetaMusicComment() throws IOException { File src = new File(AbstractFileTest.PATH_TO_TEST_MP3_FILES + "noid3.mp3"); copyToTempFile(src); MP3File mp3 = new MP3File(); mp3.setID3v1(true); mp3.setID3v2(true); setID3(mp3); ID3v2Frame frame = mp3.getHead().addID3v2Frame("TCON"); frame.setText("Freestyle"); mp3.setMetaMusicComment(); mp3.write(tempFile); File dest = new File(tempFile.getParentFile(), "writeComment.mp3"); tempFile.renameTo(dest); tempFile = dest; mp3 = new MP3File(); mp3.read(tempFile); checkID3WithoutGenreAndCommentAndCount(mp3); assertEquals(true, mp3.isID3v1()); assertEquals(true, mp3.isID3v1dot1()); assertEquals(true, mp3.isID3v2()); ID3v2Frame comm = mp3.getHead().getFrame("COMM", "Written", "English"); assertNotNull(comm); assertTrue(comm.getTextContent().startsWith("Written by MetaMusic on")); assertEquals("English", comm.getLanguage()); assertEquals("Written", comm.getDescription()); assertTrue(mp3.getTail().getComment().startsWith("MetaMusic on")); ID3Genre genre = new ID3Genre("Freestyle"); ID3v2Frame tcon = mp3.getHead().getFrame("TCON"); assertEquals(genre.getFormattedName(), tcon.getStringContent()); assertEquals(84, mp3.getCount()); } public void testWriteGenre() throws IOException { File src = new File(AbstractFileTest.PATH_TO_TEST_MP3_FILES + "noid3.mp3"); copyToTempFile(src); MP3File mp3 = new MP3File(); mp3.setID3v1(false); mp3.setID3v2(true); setID3WithoutGenreAndCount(mp3); String genreName = "DoesNotExist"; mp3.setGenre(new ID3Genre(genreName)); assertEquals(genreName, mp3.getGenre().getName()); assertEquals(genreName, mp3.getGenre().getFormattedName()); assertEquals(-1, mp3.getGenre().getId()); assertFalse(mp3.getGenre().isWellKnown()); mp3.write(tempFile); File dest = new File(tempFile.getParentFile(), "writeGenre.mp3"); tempFile.renameTo(dest); tempFile = dest; mp3 = new MP3File(); mp3.read(tempFile); checkID3WithoutGenreAndCommentAndCount(mp3); assertEquals(genreName, mp3.getGenre().getName()); assertEquals(genreName, mp3.getGenre().getFormattedName()); assertEquals(-1, mp3.getGenre().getId()); assertFalse(mp3.getGenre().isWellKnown()); } public void testWriteFileTwice() throws IOException { File src = new File(AbstractFileTest.PATH_TO_TEST_MP3_FILES + "noid3.mp3"); copyToTempFile(src); long originalFileSize = src.length(); MP3File mp3 = new MP3File(); assertTrue(mp3.read(tempFile)); mp3.setID3v1(true); mp3.setID3v2(true); setID3(mp3); int frameCount = 7; log.fine("Writing mp3 " + mp3); mp3.write(); assertEquals(originalFileSize + mp3.getHead().getWriteSize() + mp3.getTail().getWriteSize(), mp3.getFile().length()); assertEquals(0, mp3.getHead().getReadSize()); assertEquals(headContentSize, mp3.getHead().getContentSize()); long frameSize = mp3.getHead().getFrameSize(); assertEquals(mp3.getHead().getContentSize() + headFrameSize * frameCount, frameSize); long headerSize = mp3.getHead().getHeaderSize(); long writeSize = headerSize + (64 - headerSize % 64) + 64; assertEquals(writeSize, mp3.getHead().getWriteSize()); assertEquals(0, mp3.getProperties().getReadSize()); assertEquals(0, mp3.getTail().getReadSize()); assertEquals(ID3v1Tail.ID3V1_SIZE, mp3.getTail().getWriteSize()); mp3 = checkID3(tempFile); assertEquals(true, mp3.isID3v1()); assertEquals(true, mp3.isID3v1dot1()); assertEquals(true, mp3.isID3v2()); assertEquals(originalFileSize + mp3.getHead().getWriteSize() + mp3.getTail().getWriteSize(), mp3.getFile().length()); assertEquals(headReadSize, mp3.getHead().getReadSize()); assertEquals(headContentSize, mp3.getHead().getContentSize()); frameSize = mp3.getHead().getFrameSize(); assertEquals(mp3.getHead().getContentSize() + headFrameSize * frameCount, frameSize); headerSize = mp3.getHead().getHeaderSize(); writeSize = headerSize + (64 - headerSize % 64) + 64; assertEquals(writeSize, mp3.getHead().getWriteSize()); assertEquals(writeSize - headerSize, mp3.getProperties().getReadSize()); assertEquals(ID3v1Tail.ID3V1_SIZE, mp3.getTail().getReadSize()); assertEquals(ID3v1Tail.ID3V1_SIZE, mp3.getTail().getWriteSize()); log.fine("Writing mp3 again " + mp3); mp3.write(); mp3 = checkID3(tempFile); assertEquals(true, mp3.isID3v1()); assertEquals(true, mp3.isID3v1dot1()); assertEquals(true, mp3.isID3v2()); assertEquals(originalFileSize + mp3.getHead().getWriteSize() + mp3.getTail().getWriteSize(), mp3.getFile().length()); assertEquals(headReadSize, mp3.getHead().getReadSize()); assertEquals(headContentSize, mp3.getHead().getContentSize()); frameSize = mp3.getHead().getFrameSize(); assertEquals(mp3.getHead().getContentSize() + headFrameSize * frameCount, frameSize); headerSize = mp3.getHead().getHeaderSize(); writeSize = headerSize + (64 - headerSize % 64) + 64; assertEquals(writeSize, mp3.getHead().getWriteSize()); assertEquals(writeSize - headerSize, mp3.getProperties().getReadSize()); assertEquals(ID3v1Tail.ID3V1_SIZE, mp3.getTail().getReadSize()); assertEquals(ID3v1Tail.ID3V1_SIZE, mp3.getTail().getWriteSize()); } public void testWriteID3v1ThenID3v2() throws IOException { File src = new File(AbstractFileTest.PATH_TO_TEST_MP3_FILES + "noid3.mp3"); copyToTempFile(src); MP3File mp3 = new MP3File(); assertTrue(mp3.read(tempFile)); mp3.setID3v1(true); setID3(mp3); mp3.write(); mp3 = checkID3WithoutCount(tempFile); assertEquals(true, mp3.isID3v1()); assertEquals(true, mp3.isID3v1dot1()); assertEquals(false, mp3.isID3v2()); assertEquals(-1, mp3.getCount()); mp3.setID3v2(true); mp3.write(); mp3 = checkID3WithoutCount(tempFile); assertEquals(true, mp3.isID3v1()); assertEquals(true, mp3.isID3v1dot1()); assertEquals(true, mp3.isID3v2()); assertEquals(-1, mp3.getCount()); } public void testWriteID3v2ThenID3v1() throws IOException { File src = new File(AbstractFileTest.PATH_TO_TEST_MP3_FILES + "noid3.mp3"); copyToTempFile(src); MP3File mp3 = new MP3File(); assertTrue(mp3.read(tempFile)); mp3.setID3v2(true); setID3(mp3); mp3.write(); mp3 = checkID3(tempFile); assertEquals(false, mp3.isID3v1()); assertEquals(true, mp3.isID3v2()); mp3.setID3v1(true); mp3.write(); mp3 = checkID3(tempFile); assertEquals(true, mp3.isID3v1()); assertEquals(true, mp3.isID3v1dot1()); assertEquals(true, mp3.isID3v2()); } public void testWriteID3FileName() throws IOException { File src = new File(AbstractFileTest.PATH_TO_TEST_MP3_FILES + "noid3.mp3"); copyToTempFile(src); MP3File mp3 = new MP3File(); setID3(mp3); String oldFileName = tempFile.getName(); String oldPathName = tempFile.getParentFile().getAbsolutePath(); mp3.rename(tempFile); tempFile = mp3.getFile(); String newFileName = tempFile.getName(); assertFalse(oldFileName.equals(newFileName)); assertEquals(oldPathName, tempFile.getParentFile().getAbsolutePath()); mp3.move(mp3.getFile()); tempFile = mp3.getFile(); String newPathName = tempFile.getParentFile().getAbsolutePath(); assertFalse(oldPathName.equals(newPathName)); assertEquals(newFileName, tempFile.getName()); assertTrue(mp3.read(tempFile)); assertEquals(false, mp3.isID3v1()); assertEquals(false, mp3.isID3v1dot1()); assertEquals(false, mp3.isID3v2()); assertEquals(tempFile.length(), src.length()); assertEquals(mp3.getFile().getName(), mp3.getFileName().getFileName()); assertEquals(-1, mp3.getCount()); } public void testWriteID3WithImage() throws Exception { File src = new File(AbstractFileTest.PATH_TO_TEST_MP3_FILES + "noid3.mp3"); copyToTempFile(src); MP3File mp3 = new MP3File(); mp3.setID3v1(false); mp3.setID3v2(true); setID3(mp3); ID3v2Frame frame = new ID3v2Frame("APIC"); MimeType mimeType = new MimeType("image/gif"); byte[] pictureData = URLLoader.getContents(new File(AbstractFileTest.PATH_TO_TEST_IMAGE_FILES + "dontpanic.gif")); frame.findSection(BytesSection.class).setBytes(pictureData); frame.findSection(MimeTypeSection.class).setMimeType(mimeType); frame.findSection(DescriptionSection.class).setDescription("Description"); PictureType pictureType = PictureType.getPictureType(0x07); frame.findSection(PictureTypeSection.class).setPictureType(pictureType); mp3.getHead().add(frame); mp3.write(tempFile); File dest = new File(tempFile.getParentFile(), "writeID3WithImage.mp3"); tempFile.renameTo(dest); tempFile = dest; mp3 = checkID3(tempFile); assertEquals(false, mp3.isID3v1()); assertEquals(false, mp3.isID3v1dot1()); assertEquals(true, mp3.isID3v2()); frame = mp3.getHead().getFrame("APIC"); assertEquals(mimeType.toString(), frame.findSection(MimeTypeSection.class).getMimeType().toString()); assertEquals("Description", frame.findSection(DescriptionSection.class).getDescription()); assertEquals(pictureType.getCode(), frame.findSection(PictureTypeSection.class).getPictureType().getCode()); assertTrue(Arrays.equals(pictureData, frame.getByteContent())); } public void testID3v30BeforeV20Header() throws IOException { ID3v2Header v20 = new ID3v2Header(); v20.setVersion(new ID3v2Version(2, 0)); setID3WithoutGenreAndCount(v20); byte[] v20Bytes = v20.getBytes(); File src = new File(AbstractFileTest.PATH_TO_TEST_MP3_FILES + "noid3.mp3"); ID3v2Header v30 = new ID3v2Header(); setID3WithoutGenreAndCount(v30); byte[] v30Bytes = v30.getBytes(); assertFalse(ArrayHelper.equals(v20Bytes, v30Bytes)); tempFile = File.createTempFile("filetest", ".mp3"); FileInputStream in = new FileInputStream(src); FileOutputStream out = new FileOutputStream(tempFile); out.write(v30Bytes); out.write(v20Bytes); InputOutput inputOutput = new InputOutput(in, out); inputOutput.start(); inputOutput.close(); assertEquals(v30Bytes.length + v20Bytes.length + src.length(), tempFile.length()); MP3File mp3 = MP3File.readValidFile(tempFile); assertEquals(275, mp3.getProperties().getReadSize()); // TODO search for second ID3 head } public void testMigrateID3v20HeaderToV30() throws Exception { ID3v2Version version = new ID3v2Version(2, 0); File src = new File(AbstractFileTest.PATH_TO_TEST_MP3_FILES + "noid3.mp3"); copyToTempFile(src); MP3File mp3 = new MP3File(); mp3.setID3v1(false); mp3.setID3v2(true); mp3.getHead().setVersion(version); setID3(mp3); ID3v2Frame frame = new ID3v2Frame("PIC"); assertEquals(version, frame.getVersion()); MimeType mimeType = new MimeType("image/jpg"); byte[] pictureData = URLLoader.getContents(new File(AbstractFileTest.PATH_TO_TEST_IMAGE_FILES + "dontpanic.jpg")); frame.findSection(BytesSection.class).setBytes(pictureData); frame.findSection(MimeTypeSection.class).setMimeType(mimeType); frame.findSection(DescriptionSection.class).setDescription("Description"); assertNull(frame.findSection(PictureTypeSection.class)); mp3.getHead().add(frame); mp3.write(tempFile); File dest = new File(tempFile.getParentFile(), "ID3v2TwoDotZero.mp3"); tempFile.renameTo(dest); tempFile = dest; mp3 = checkID3(tempFile); assertEquals(false, mp3.isID3v1()); assertEquals(false, mp3.isID3v1dot1()); assertEquals(true, mp3.isID3v2()); assertEquals(version, mp3.getHead().getVersion()); frame = mp3.getHead().getFrame("PIC"); assertEquals(mimeType.toString(), frame.findSection(MimeTypeSection.class).getMimeType().toString()); assertEquals("Description", frame.findSection(DescriptionSection.class).getDescription()); assertNull(frame.findSection(PictureTypeSection.class)); assertTrue(Arrays.equals(pictureData, frame.getByteContent())); mp3.getHead().migrateToVersion(new ID3v2Version(3, 0)); mp3.write(tempFile); dest = new File(tempFile.getParentFile(), "ID3v2ThreeDotZero.mp3"); tempFile.renameTo(dest); tempFile = dest; mp3 = checkID3(tempFile); assertEquals(false, mp3.isID3v1()); assertEquals(false, mp3.isID3v1dot1()); assertEquals(true, mp3.isID3v2()); assertEquals(new ID3v2Version(3, 0), mp3.getHead().getVersion()); frame = mp3.getHead().getFrame("APIC"); assertEquals(mimeType.toString(), frame.findSection(MimeTypeSection.class).getMimeType().toString()); assertEquals("Description", frame.findSection(DescriptionSection.class).getDescription()); assertEquals(PictureType.DEFAULT_PICTURE_TYPE, frame.findSection(PictureTypeSection.class).getPictureType()); assertTrue(Arrays.equals(pictureData, frame.getByteContent())); } }