summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorByteHamster <ByteHamster@users.noreply.github.com>2021-02-17 17:35:50 +0100
committerGitHub <noreply@github.com>2021-02-17 17:35:50 +0100
commit986a62de75ad7290e36c9fe7eb79dbde646673fc (patch)
tree54354f86c5faf607c9c4bb071de67b9b313aa5ef
parent1c9f017a7e15fd21671c76f05d9c22eb43e34a41 (diff)
parent12e22849e69e3cadab44872b8a06e58e6a77142c (diff)
downloadAntennaPod-986a62de75ad7290e36c9fe7eb79dbde646673fc.zip
Merge pull request #4945 from ByteHamster/more-parser-tests
Added more id3 parser tests
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/id3reader/ID3Reader.java9
-rw-r--r--core/src/test/java/de/danoeh/antennapod/core/util/id3reader/Id3ReaderTest.java65
2 files changed, 66 insertions, 8 deletions
diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/id3reader/ID3Reader.java b/core/src/main/java/de/danoeh/antennapod/core/util/id3reader/ID3Reader.java
index 18cbb1dbf..17313ca14 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/util/id3reader/ID3Reader.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/util/id3reader/ID3Reader.java
@@ -180,14 +180,13 @@ public class ID3Reader {
private String readEncodedString2(Charset charset, int max) throws IOException {
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
int bytesRead = 0;
- while (bytesRead < max) {
+ while (bytesRead + 1 < max) {
byte c1 = readByte();
- bytesRead++;
- if (c1 == 0) {
+ byte c2 = readByte();
+ if (c1 == 0 && c2 == 0) {
break;
}
- byte c2 = readByte();
- bytesRead++;
+ bytesRead += 2;
bytes.write(c1);
bytes.write(c2);
}
diff --git a/core/src/test/java/de/danoeh/antennapod/core/util/id3reader/Id3ReaderTest.java b/core/src/test/java/de/danoeh/antennapod/core/util/id3reader/Id3ReaderTest.java
index 53e338416..584141b83 100644
--- a/core/src/test/java/de/danoeh/antennapod/core/util/id3reader/Id3ReaderTest.java
+++ b/core/src/test/java/de/danoeh/antennapod/core/util/id3reader/Id3ReaderTest.java
@@ -11,6 +11,7 @@ import java.io.IOException;
import java.nio.charset.StandardCharsets;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
public class Id3ReaderTest {
@@ -27,16 +28,74 @@ public class Id3ReaderTest {
}
@Test
- public void testReadUtf16WithBom() throws IOException {
+ public void testReadMultipleStrings() throws IOException {
+ byte[] data = {
+ ID3Reader.ENCODING_ISO,
+ 'F', 'o', 'o',
+ 0, // Null-terminated
+ ID3Reader.ENCODING_ISO,
+ 'B', 'a', 'r',
+ 0 // Null-terminated
+ };
+ CountingInputStream inputStream = new CountingInputStream(new ByteArrayInputStream(data));
+ ID3Reader reader = new ID3Reader(inputStream);
+ assertEquals("Foo", reader.readEncodingAndString(1000));
+ assertEquals("Bar", reader.readEncodingAndString(1000));
+ }
+
+ @Test
+ public void testReadingLimit() throws IOException {
+ byte[] data = {
+ ID3Reader.ENCODING_ISO,
+ 'A', 'B', 'C', 'D'
+ };
+ CountingInputStream inputStream = new CountingInputStream(new ByteArrayInputStream(data));
+ ID3Reader reader = new ID3Reader(inputStream);
+ assertEquals("ABC", reader.readEncodingAndString(4)); // Includes encoding
+ assertEquals('D', reader.readByte());
+ }
+
+ @Test
+ public void testReadUtf16RespectsBom() throws IOException {
byte[] data = {
ID3Reader.ENCODING_UTF16_WITH_BOM,
- (byte) 0xff, (byte) 0xfe, // BOM
+ (byte) 0xff, (byte) 0xfe, // BOM: Little-endian
'A', 0, 'B', 0, 'C', 0,
0, 0, // Null-terminated
+ ID3Reader.ENCODING_UTF16_WITH_BOM,
+ (byte) 0xfe, (byte) 0xff, // BOM: Big-endian
+ 0, 'D', 0, 'E', 0, 'F',
+ 0, 0, // Null-terminated
+ };
+ CountingInputStream inputStream = new CountingInputStream(new ByteArrayInputStream(data));
+ ID3Reader reader = new ID3Reader(inputStream);
+ assertEquals("ABC", reader.readEncodingAndString(1000));
+ assertEquals("DEF", reader.readEncodingAndString(1000));
+ }
+
+ @Test
+ public void testReadUtf16NullPrefix() throws IOException {
+ byte[] data = {
+ ID3Reader.ENCODING_UTF16_WITH_BOM,
+ (byte) 0xff, (byte) 0xfe, // BOM
+ 0x00, 0x01, // Latin Capital Letter A with macron (Ā)
+ 0, 0, // Null-terminated
};
CountingInputStream inputStream = new CountingInputStream(new ByteArrayInputStream(data));
String string = new ID3Reader(inputStream).readEncodingAndString(1000);
- assertEquals("ABC", string);
+ assertEquals("Ā", string);
+ }
+
+ @Test
+ public void testReadingLimitUtf16() throws IOException {
+ byte[] data = {
+ ID3Reader.ENCODING_UTF16_WITHOUT_BOM,
+ 'A', 0, 'B', 0, 'C', 0, 'D', 0
+ };
+ CountingInputStream inputStream = new CountingInputStream(new ByteArrayInputStream(data));
+ ID3Reader reader = new ID3Reader(inputStream);
+ reader.readEncodingAndString(6); // Includes encoding, produces broken string
+ assertTrue("Should respect limit even if it breaks a symbol", reader.getPosition() <= 6);
}
@Test