1a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania/* 2a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania * Copyright (C) 2009 The Android Open Source Project 3a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania * 4a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania * Licensed under the Apache License, Version 2.0 (the "License"); 5a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania * you may not use this file except in compliance with the License. 6a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania * You may obtain a copy of the License at 7a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania * 8a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania * http://www.apache.org/licenses/LICENSE-2.0 9a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania * 10a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania * Unless required by applicable law or agreed to in writing, software 11a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania * distributed under the License is distributed on an "AS IS" BASIS, 12a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania * See the License for the specific language governing permissions and 14a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania * limitations under the License. 15a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania */ 16a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania 17a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Cataniapackage com.android.mediaframeworktest.unit; 18a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Cataniaimport android.media.Metadata; 19a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Cataniaimport android.os.Parcel; 20a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Cataniaimport android.test.AndroidTestCase; 21a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Cataniaimport android.test.suitebuilder.annotation.SmallTest; 22a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Cataniaimport android.util.Log; 23a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania 24cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Cataniaimport java.util.Calendar; 25cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Cataniaimport java.util.Date; 26cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania 27a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania/* 28a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania * Check the Java layer that parses serialized metadata in Parcel 29a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania * works as expected. 30a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania * 31a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania */ 32a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania 33a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Cataniapublic class MediaPlayerMetadataParserTest extends AndroidTestCase { 34a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania private static final String TAG = "MediaPlayerMetadataTest"; 35a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania private static final int kMarker = 0x4d455441; // 'M' 'E' 'T' 'A' 36a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania private static final int kHeaderSize = 8; 37a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania 38a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania private Metadata mMetadata = null; 39a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania private Parcel mParcel = null; 40a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania 41a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania @Override 42a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania protected void setUp() throws Exception { 43a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania super.setUp(); 44a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania mMetadata = new Metadata(); 45a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania mParcel = Parcel.obtain(); 46a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania 47a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania resetParcel(); 48a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania } 49a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania 50a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania // Check parsing of the parcel fails. Make sure the parser rewind 51a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania // the parcel properly. 52a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania private void assertParseFail() throws Exception { 53a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania mParcel.setDataPosition(0); 54a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania assertFalse(mMetadata.parse(mParcel)); 55a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania assertEquals(0, mParcel.dataPosition()); 56a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania } 57a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania 58c39173be3237be9f39d2b57bb38249126e183c53niko // Check parsing of the parcel is successful. 59a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania private void assertParse() throws Exception { 60a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania mParcel.setDataPosition(0); 61a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania assertTrue(mMetadata.parse(mParcel)); 62a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania } 63a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania 64a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania // Write the number of bytes from the start of the parcel to the 65a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania // current position at the beginning of the parcel (offset 0). 66a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania private void adjustSize() { 67a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania adjustSize(0); 68a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania } 69a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania 70a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania // Write the number of bytes from the offset to the current 71a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania // position at position pointed by offset. 72a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania private void adjustSize(int offset) { 73a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania final int pos = mParcel.dataPosition(); 74a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania 75a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania mParcel.setDataPosition(offset); 76a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania mParcel.writeInt(pos - offset); 77a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania mParcel.setDataPosition(pos); 78a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania } 79a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania 80a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania // Rewind the parcel and insert the header. 81a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania private void resetParcel() { 82a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania mParcel.setDataPosition(0); 83a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania // Most tests will use a properly formed parcel with a size 84a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania // and the meta marker so we add them by default. 85a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania mParcel.writeInt(-1); // Placeholder for the size 86a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania mParcel.writeInt(kMarker); 87a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania } 88a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania 89a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania // ---------------------------------------------------------------------- 90a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania // START OF THE TESTS 91a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania 92a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania 93a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania // There should be at least 8 bytes in the parcel, 4 for the size 94a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania // and 4 for the 'M' 'E' 'T' 'A' marker. 95a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania @SmallTest 96a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania public void testMissingSizeAndMarker() throws Exception { 97a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania for (int i = 0; i < kHeaderSize; ++i) { 98a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania mParcel.setDataPosition(0); 99a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania mParcel.setDataSize(i); 100a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania 101a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania assertEquals(i, mParcel.dataAvail()); 102a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania assertParseFail(); 103a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania } 104a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania } 105a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania 106a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania // There should be at least 'size' bytes in the parcel. 107a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania @SmallTest 108a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania public void testMissingData() throws Exception { 109a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania final int size = 20; 110a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania 111a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania mParcel.writeInt(size); 112a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania mParcel.setDataSize(size - 1); 113a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania assertParseFail(); 114a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania } 115a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania 116a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania // Empty parcel is fine 117a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania @SmallTest 118a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania public void testEmptyIsOk() throws Exception { 119a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania adjustSize(); 120a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania assertParse(); 121a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania } 122a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania 123cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania // ---------------------------------------------------------------------- 124a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania // RECORDS 125cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania // ---------------------------------------------------------------------- 126a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania 127a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania // A record header should be at least 12 bytes long 128a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania @SmallTest 129a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania public void testRecordMissingId() throws Exception { 130a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania mParcel.writeInt(13); // record length 131a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania // misses metadata id and metadata type. 132a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania adjustSize(); 133a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania assertParseFail(); 134a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania } 135a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania 136a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania @SmallTest 137a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania public void testRecordMissingType() throws Exception { 138a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania mParcel.writeInt(13); // record length lies 139a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania mParcel.writeInt(Metadata.TITLE); 140a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania // misses metadata type 141a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania adjustSize(); 142a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania assertParseFail(); 143a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania } 144a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania 145a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania @SmallTest 146a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania public void testRecordWithZeroPayload() throws Exception { 147a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania mParcel.writeInt(0); 148a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania adjustSize(); 149a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania assertParseFail(); 150a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania } 151a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania 152a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania // A record cannot be empty. 153a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania @SmallTest 154a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania public void testRecordMissingPayload() throws Exception { 155a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania mParcel.writeInt(12); 156a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania mParcel.writeInt(Metadata.TITLE); 157a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania mParcel.writeInt(Metadata.STRING_VAL); 158a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania // misses payload 159a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania adjustSize(); 160a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania assertParseFail(); 161a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania } 162a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania 163a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania // Check records can be found. 164a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania @SmallTest 165a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania public void testRecordsFound() throws Exception { 166a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania writeStringRecord(Metadata.TITLE, "a title"); 167a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania writeStringRecord(Metadata.GENRE, "comedy"); 168a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania writeStringRecord(Metadata.firstCustomId(), "custom"); 169a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania adjustSize(); 170a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania assertParse(); 171a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania assertTrue(mMetadata.has(Metadata.TITLE)); 172a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania assertTrue(mMetadata.has(Metadata.GENRE)); 173a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania assertTrue(mMetadata.has(Metadata.firstCustomId())); 174a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania assertFalse(mMetadata.has(Metadata.DRM_CRIPPLED)); 175a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania assertEquals(3, mMetadata.keySet().size()); 176a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania } 177a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania 178a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania // Detects bad metadata type 179a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania @SmallTest 180a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania public void testBadMetadataType() throws Exception { 181a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania final int start = mParcel.dataPosition(); 182a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania mParcel.writeInt(-1); // Placeholder for the length 183a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania mParcel.writeInt(Metadata.TITLE); 184a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania mParcel.writeInt(0); // Invalid type. 185a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania mParcel.writeString("dummy"); 186a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania adjustSize(start); 187a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania 188a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania adjustSize(); 189a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania assertParseFail(); 190a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania } 191a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania 192a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania // Check a Metadata instance can be reused, i.e the parse method 193a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania // wipes out the existing states/keys. 194a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania @SmallTest 195a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania public void testParseClearState() throws Exception { 196a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania writeStringRecord(Metadata.TITLE, "a title"); 197a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania writeStringRecord(Metadata.GENRE, "comedy"); 198a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania writeStringRecord(Metadata.firstCustomId(), "custom"); 199a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania adjustSize(); 200a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania assertParse(); 201a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania 202a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania resetParcel(); 203a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania writeStringRecord(Metadata.MIME_TYPE, "audio/mpg"); 204a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania adjustSize(); 205a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania assertParse(); 206a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania 207a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania // Only the mime type metadata should be present. 208a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania assertEquals(1, mMetadata.keySet().size()); 209a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania assertTrue(mMetadata.has(Metadata.MIME_TYPE)); 210a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania 211a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania assertFalse(mMetadata.has(Metadata.TITLE)); 212a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania assertFalse(mMetadata.has(Metadata.GENRE)); 213a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania assertFalse(mMetadata.has(Metadata.firstCustomId())); 214a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania } 215cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania 216cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania // ---------------------------------------------------------------------- 217cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania // GETTERS 218cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania // ---------------------------------------------------------------------- 219cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania 220cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania // getString 221cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania @SmallTest 222cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania public void testGetString() throws Exception { 223cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania writeStringRecord(Metadata.TITLE, "a title"); 224cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania writeStringRecord(Metadata.GENRE, "comedy"); 225cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania adjustSize(); 226cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania assertParse(); 227cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania 228cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania assertEquals("a title", mMetadata.getString(Metadata.TITLE)); 229cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania assertEquals("comedy", mMetadata.getString(Metadata.GENRE)); 230cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania } 231cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania 232cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania // get an empty string. 233cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania @SmallTest 234cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania public void testGetEmptyString() throws Exception { 235cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania writeStringRecord(Metadata.TITLE, ""); 236cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania adjustSize(); 237cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania assertParse(); 238cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania 239cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania assertEquals("", mMetadata.getString(Metadata.TITLE)); 240cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania } 241cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania 242cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania // get a string when a NULL value was in the parcel 243cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania @SmallTest 244cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania public void testGetNullString() throws Exception { 245cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania writeStringRecord(Metadata.TITLE, null); 246cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania adjustSize(); 247cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania assertParse(); 248cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania 249cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania assertEquals(null, mMetadata.getString(Metadata.TITLE)); 250cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania } 251cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania 252cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania // get a string when an integer is actually present 253cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania @SmallTest 254cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania public void testWrongType() throws Exception { 255cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania writeIntRecord(Metadata.DURATION, 5); 256cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania adjustSize(); 257cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania assertParse(); 258cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania 259cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania try { 260cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania mMetadata.getString(Metadata.DURATION); 261cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania } catch (IllegalStateException ise) { 262cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania return; 263cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania } 264cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania fail("Exception was not thrown"); 265cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania } 266cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania 267cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania // getInt 268cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania @SmallTest 269cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania public void testGetInt() throws Exception { 270cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania writeIntRecord(Metadata.CD_TRACK_NUM, 1); 271cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania adjustSize(); 272cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania assertParse(); 273cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania 274cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania assertEquals(1, mMetadata.getInt(Metadata.CD_TRACK_NUM)); 275cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania } 276cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania 277cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania // getBoolean 278cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania @SmallTest 279cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania public void testGetBoolean() throws Exception { 2801e1b13e62e38d6efc7cef4b496b3119bd45ee2c2Gloria Wang writeBooleanRecord(Metadata.PAUSE_AVAILABLE, true); 2811e1b13e62e38d6efc7cef4b496b3119bd45ee2c2Gloria Wang writeBooleanRecord(Metadata.SEEK_AVAILABLE, true); 2821e1b13e62e38d6efc7cef4b496b3119bd45ee2c2Gloria Wang writeBooleanRecord(Metadata.SEEK_BACKWARD_AVAILABLE, true); 2831e1b13e62e38d6efc7cef4b496b3119bd45ee2c2Gloria Wang writeBooleanRecord(Metadata.SEEK_FORWARD_AVAILABLE, true); 284cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania adjustSize(); 285cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania assertParse(); 286cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania 2871e1b13e62e38d6efc7cef4b496b3119bd45ee2c2Gloria Wang assertEquals(true, mMetadata.getBoolean(Metadata.PAUSE_AVAILABLE)); 2881e1b13e62e38d6efc7cef4b496b3119bd45ee2c2Gloria Wang assertEquals(true, mMetadata.getBoolean(Metadata.SEEK_AVAILABLE)); 2891e1b13e62e38d6efc7cef4b496b3119bd45ee2c2Gloria Wang assertEquals(true, mMetadata.getBoolean(Metadata.SEEK_BACKWARD_AVAILABLE)); 2901e1b13e62e38d6efc7cef4b496b3119bd45ee2c2Gloria Wang assertEquals(true, mMetadata.getBoolean(Metadata.SEEK_FORWARD_AVAILABLE)); 291cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania } 292cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania 293cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania // getLong 294cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania @SmallTest 295cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania public void testGetLong() throws Exception { 296cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania writeLongRecord(Metadata.DURATION, 1L); 297cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania adjustSize(); 298cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania assertParse(); 299cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania 300cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania assertEquals(1L, mMetadata.getLong(Metadata.DURATION)); 301cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania } 302cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania 303cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania // getDouble 304cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania @SmallTest 305cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania public void testGetDouble() throws Exception { 306cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania writeDoubleRecord(Metadata.VIDEO_FRAME_RATE, 29.97); 307cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania adjustSize(); 308cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania assertParse(); 309cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania 310cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania assertEquals(29.97, mMetadata.getDouble(Metadata.VIDEO_FRAME_RATE)); 311cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania } 312cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania 313cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania // getByteArray 314cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania @SmallTest 315cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania public void testGetByteArray() throws Exception { 316cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania byte data[] = new byte[]{1,2,3,4,5}; 317cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania 318cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania writeByteArrayRecord(Metadata.ALBUM_ART, data); 319cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania adjustSize(); 320cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania assertParse(); 321cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania 322cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania byte res[] = mMetadata.getByteArray(Metadata.ALBUM_ART); 323cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania for (int i = 0; i < data.length; ++i) { 324cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania assertEquals(data[i], res[i]); 325cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania } 326cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania } 327cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania 328cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania // getDate 329cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania @SmallTest 330cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania public void testGetDate() throws Exception { 331cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania writeDateRecord(Metadata.DATE, 0, "PST"); 332cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania adjustSize(); 333cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania assertParse(); 334cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania 335cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania assertEquals(new Date(0), mMetadata.getDate(Metadata.DATE)); 336cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania } 337cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania 338cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania // ---------------------------------------------------------------------- 339cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania // HELPERS TO APPEND RECORDS 340cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania // ---------------------------------------------------------------------- 341cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania 342cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania // Insert a string record at the current position. 343cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania private void writeStringRecord(int metadataId, String val) { 344cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania final int start = mParcel.dataPosition(); 345cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania mParcel.writeInt(-1); // Placeholder for the length 346cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania mParcel.writeInt(metadataId); 347cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania mParcel.writeInt(Metadata.STRING_VAL); 348cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania mParcel.writeString(val); 349cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania adjustSize(start); 350cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania } 351cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania 352cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania // Insert an int record at the current position. 353cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania private void writeIntRecord(int metadataId, int val) { 354cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania final int start = mParcel.dataPosition(); 355cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania mParcel.writeInt(-1); // Placeholder for the length 356cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania mParcel.writeInt(metadataId); 357cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania mParcel.writeInt(Metadata.INTEGER_VAL); 358cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania mParcel.writeInt(val); 359cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania adjustSize(start); 360cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania } 361cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania 362cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania // Insert a boolean record at the current position. 363cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania private void writeBooleanRecord(int metadataId, boolean val) { 364cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania final int start = mParcel.dataPosition(); 365cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania mParcel.writeInt(-1); // Placeholder for the length 366cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania mParcel.writeInt(metadataId); 367cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania mParcel.writeInt(Metadata.BOOLEAN_VAL); 368cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania mParcel.writeInt(val ? 1 : 0); 369cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania adjustSize(start); 370cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania } 371cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania 372cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania // Insert a Long record at the current position. 373cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania private void writeLongRecord(int metadataId, long val) { 374cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania final int start = mParcel.dataPosition(); 375cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania mParcel.writeInt(-1); // Placeholder for the length 376cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania mParcel.writeInt(metadataId); 377cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania mParcel.writeInt(Metadata.LONG_VAL); 378cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania mParcel.writeLong(val); 379cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania adjustSize(start); 380cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania } 381cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania 382cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania // Insert a Double record at the current position. 383cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania private void writeDoubleRecord(int metadataId, double val) { 384cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania final int start = mParcel.dataPosition(); 385cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania mParcel.writeInt(-1); // Placeholder for the length 386cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania mParcel.writeInt(metadataId); 387cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania mParcel.writeInt(Metadata.DOUBLE_VAL); 388cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania mParcel.writeDouble(val); 389cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania adjustSize(start); 390cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania } 391cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania 392cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania // Insert a ByteArray record at the current position. 393cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania private void writeByteArrayRecord(int metadataId, byte[] val) { 394cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania final int start = mParcel.dataPosition(); 395cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania mParcel.writeInt(-1); // Placeholder for the length 396cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania mParcel.writeInt(metadataId); 397cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania mParcel.writeInt(Metadata.BYTE_ARRAY_VAL); 398cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania mParcel.writeByteArray(val); 399cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania adjustSize(start); 400cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania } 401cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania 402cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania // Insert a Date record at the current position. 403cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania private void writeDateRecord(int metadataId, long time, String tz) { 404cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania final int start = mParcel.dataPosition(); 405cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania mParcel.writeInt(-1); // Placeholder for the length 406cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania mParcel.writeInt(metadataId); 407cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania mParcel.writeInt(Metadata.DATE_VAL); 408cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania mParcel.writeLong(time); 409cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania mParcel.writeString(tz); 410cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania adjustSize(start); 411cb2e00eedce99b30faf5f238136a00bc5448c5f2Nicolas Catania } 412a5ccb22a3ddb342fe3f7e5493095c6e6dceda60bNicolas Catania} 413