diff options
Diffstat (limited to 'MdnsOffloadManagerService/tests/src/com/android/tv/mdnsoffloadmanager/MdnsPacketParserTest.java')
-rw-r--r-- | MdnsOffloadManagerService/tests/src/com/android/tv/mdnsoffloadmanager/MdnsPacketParserTest.java | 283 |
1 files changed, 283 insertions, 0 deletions
diff --git a/MdnsOffloadManagerService/tests/src/com/android/tv/mdnsoffloadmanager/MdnsPacketParserTest.java b/MdnsOffloadManagerService/tests/src/com/android/tv/mdnsoffloadmanager/MdnsPacketParserTest.java new file mode 100644 index 0000000..cf6b4af --- /dev/null +++ b/MdnsOffloadManagerService/tests/src/com/android/tv/mdnsoffloadmanager/MdnsPacketParserTest.java @@ -0,0 +1,283 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.tv.mdnsoffloadmanager; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThrows; + +import androidx.test.filters.SmallTest; +import org.junit.Test; + +import java.util.Arrays; +import java.util.List; + +import device.google.atv.mdns_offload.IMdnsOffload.MdnsProtocolData.MatchCriteria; + +@SmallTest +public class MdnsPacketParserTest { + + @Test + public void testExtractFullNameFromSingleLabel() { + byte[] array = new byte[]{'x', 'x', 'x', 3, 'a', 't', 'v', 0}; + String fullName = MdnsPacketParser.extractFullName(array, 3); + assertEquals("atv.", fullName); + } + + @Test + public void testExtractFullNameFromPointer() { + byte[] array = new byte[]{3, 'i', 's', 'o', 0, (byte) 0xC0, 0x00}; + String fullName = MdnsPacketParser.extractFullName(array, 5); + assertEquals("iso.", fullName); + } + + @Test + public void testExtractFullNameFromMultiLabel() { + byte[] array = new byte[]{'x', 'x', 'x', 3, 'a', 't', 'v', 3, 'g', 't', 'v', 0}; + String fullName = MdnsPacketParser.extractFullName(array, 3); + assertEquals("atv.gtv.", fullName); + } + + @Test + public void testExtractFullNameFromLabelPointer() { + byte[] array = new byte[]{3, 'i', 's', 'o', 0,// + 3, 'a', 't', 'v', 3, 'g', 't', 'v', (byte) 0xC0, 0x00}; + String fullName = MdnsPacketParser.extractFullName(array, 9); + assertEquals("gtv.iso.", fullName); + } + + @Test + public void testExtractFullNameFromLabelDualPointerLongOffset() { + byte[] array = new byte[]{3, 'i', 's', 'o', 0,// + 3, 'a', 't', 'v', 3, 'g', 't', 'v', (byte) 0xC0, 0x64}; + + //Add the string 4http at offset 0x64 and back to pointer 0x00 + byte[] longArray = Arrays.copyOf(array, 120); + longArray[0x64] = 4; + longArray[0x64 + 1] = 'h'; + longArray[0x64 + 2] = 't'; + longArray[0x64 + 3] = 't'; + longArray[0x64 + 4] = 'p'; + longArray[0x64 + 5] = (byte) 0xC0; + longArray[0x64 + 6] = 0x00; + + String fullName = MdnsPacketParser.extractFullName(longArray, 9); + assertEquals("gtv.http.iso.", fullName); + } + + @Test + public void testExtractFullNameBadPointer() { + byte[] array = new byte[]{3, 'i', 's', 'o', 0, (byte) 0xC0, 0x20}; + assertThrows( + "Setting cursor on negative offset is not allowed.", + IllegalArgumentException.class, + () -> MdnsPacketParser.extractFullName(array, -10) + ); + } + + @Test + public void testExtractFullNameLabelTooLong() { + byte[] longArray = new byte[70]; + Arrays.fill(longArray, (byte) 'a'); + // Labels maximum allowed size is 64 so this fall in the unknown categorie of + // pointer 01xxxxxx or 10xxxxxx + longArray[0] = 65; + longArray[66] = 0x00; // ther array is [65, 65 times 'a', 0x00] + + assertThrows( + "mDNS response packet is badly formed. Not enough data.", + IllegalArgumentException.class, + () -> MdnsPacketParser.extractFullName(longArray, 0) + ); + } + + @Test + public void testExtractMatchCriteriaFailureQueryCount() { + //1 query, 2 answers, 0 authority, 0 additional. + byte[] array = new byte[]{0, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 0}; + assertThrows( + "mDNS response packet contains data that is not answers", + IllegalArgumentException.class, + () -> MdnsPacketParser.extractMatchCriteria(array) + ); + } + + @Test + public void testExtractMatchCriteriaFailureAuthorityCount() { + //0 query, 2 answers, 2 authority, 0 additional. + byte[] array = new byte[]{0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0}; + assertThrows( + "mDNS response packet contains data that is not answers", + IllegalArgumentException.class, + () -> MdnsPacketParser.extractMatchCriteria(array) + ); + } + + @Test + public void testExtractMatchCriteriaFailureAdditionalCount() { + //0 query, 2 answers, 0 authority, 3 additional. + byte[] array = new byte[]{0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3}; + assertThrows( + "mDNS response packet contains data that is not answers", + IllegalArgumentException.class, + () -> MdnsPacketParser.extractMatchCriteria(array) + ); + } + + @Test + public void testExtractMatchCriteriaSuccessOneAnswerLabel() { + byte[] array = new byte[]{ + 0, 0, 0, 0,//Id , Flags + 0, 0, 0, 1, 0, 0, 0, 0,// Header section. 1 answer. + //Data 1 + 3, 'a', 't', 'v', 0x00, //atv. + 0x00, 0x01, //type A + (byte) 0x80, 0x01,//cache flush: True, class: in + 0, 0, 0, 5,// TTL 5sec + 0, 4, // Data with size 4 + 100, 80, 40, 20 //ip: 100.80.40.20 + }; + + List<MatchCriteria> criteria = MdnsPacketParser.extractMatchCriteria(array); + + assertEquals(1, criteria.size()); + + MatchCriteria result = criteria.get(0); + assertEquals(12, result.nameOffset); + assertEquals(1, result.type); + } + + @Test + public void testExtractMatchCriteriaSuccessTwoAnswersPointers() { + byte[] array = new byte[]{ + 0, 0, 0, 0,//Id , Flags + 0, 0, 0, 2, 0, 0, 0, 0,// Header section. 2 answers. + //Data 1 + 3, 'a', 't', 'v', 0x00, //atv. + 0x00, 0x01, //type A + (byte) 0x80, 0x01,//cache flush: True, class: in + 0, 0, 0, 5,// TTL 5sec + 0, 4, // Data with size 4 + 100, 80, 40, 20, //ip: 100.80.40.20 + //Data 2 + 3, 'g', 't', 'v', (byte) 0b11000000, 12, //gtv.[ptr->]atv. + 0x00, 16, //type TXT + (byte) 0x80, 0x01,//cache flush: True, class: in + 0, 0, 0, 5,// TTL 5sec + 0, 3, // Data with size 3 + 'i', 's', 'o' // "iso" + }; + + List<MatchCriteria> criteria = MdnsPacketParser.extractMatchCriteria(array); + + assertEquals(2, criteria.size()); + + MatchCriteria result0 = criteria.get(0); + assertEquals(12, result0.nameOffset); + assertEquals(1, result0.type); + + MatchCriteria result1 = criteria.get(1); + assertEquals(31, result1.nameOffset); + assertEquals(16, result1.type); + } + + @Test + public void testExtractFullName() { + byte[] array = new byte[]{ + 0, 0, 0, 0,//Id , Flags + 0, 0, 0, 2, 0, 0, 0, 0,// Header section. 2 answers. + //Data 1 + 3, 'a', 't', 'v', 0x00, //atv. + 0x00, 0x01, //type A + (byte) 0x80, 0x01,//cache flush: True, class: in + 0, 0, 0, 5,// TTL 5sec + 0, 4, // Data with size 4 + 100, 80, 40, 20, //ip: 100.80.40.20 + //Data 2 + 3, 'g', 't', 'v', (byte) 0b11000000, 12, //gtv.[ptr->]atv. + 0x00, 16, //type TXT + (byte) 0x80, 0x01,//cache flush: True, class: in + 0, 0, 0, 5,// TTL 5sec + 0, 3, // Data with size 3 + 'i', 's', 'o' // "iso" + }; + + List<MatchCriteria> criteria = MdnsPacketParser.extractMatchCriteria(array); + assertEquals(2, criteria.size()); + String name0 = MdnsPacketParser.extractFullName(array, criteria.get(0).nameOffset); + assertEquals("atv.", name0); + String name1 = MdnsPacketParser.extractFullName(array, criteria.get(1).nameOffset); + assertEquals("gtv.atv.", name1); + } + + @Test + public void testNegativeByteToUint8() { + byte[] array = new byte[]{ + 0, 0, 0, 0,//Id , Flags + 0, 0, 0, 3, 0, 0, 0, 0,// Header section. 2 answers. + //Data 1 + 3, 'a', 't', 'v', 0x00, //atv. + 0x00, 0x01, //type A + (byte) 0x80, 0x01,//cache flush: True, class: in + 0, 0, 0, 5,// TTL 5sec + 0, 4, // Data with size 4 + 100, 80, 40, 20, //ip: 100.80.40.20 + //Data 2 + 3, 'g', 't', 'v', (byte) 0b11000000, 12, //gtv.[ptr->]atv. + 0x00, 16, //type TXT + (byte) 0x80, 0x01,//cache flush: True, class: in + 0, 0, 0, 5,// TTL 5sec + 0, (byte) 130, // Data with size 130 > 127 + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + //Data 3 + 4, 'f', 'a', 'i', 'l', 0x00, //fail. + 0x00, 0x01, //type A + (byte) 0x80, 0x01,//cache flush: True, class: in + 0, 0, 0, 5,// TTL 5sec + 0, 4, // Data with size 4 + 100, 80, 40, 20, //ip: 100.80.40.20 + }; + + List<MatchCriteria> criteria = MdnsPacketParser.extractMatchCriteria(array); + assertEquals(3, criteria.size()); + String name2 = MdnsPacketParser.extractFullName(array, criteria.get(2).nameOffset); + assertEquals("fail.", name2); + } + + @Test + public void testExtractMatchCriteriaFailureTooMuchData() { + byte[] array = new byte[]{ + 0, 0, 0, 0,//Id , Flags + 0, 0, 0, 1, 0, 0, 0, 0,// Header section. 2 answers. + //Data 1 + 3, 'a', 't', 'v', 0x00, //atv. + 0x00, 0x01, //type A + (byte) 0x80, 0x01,//cache flush: True, class: in + 0, 0, 0, 5,// TTL 5sec + 0, 4, // Data with size 4 + 100, 80, 40, 20, //ip: 100.80.40.20 + //extra data. + 'e','x','t','r','a' + }; + + assertThrows( + "mDNS response packet is badly formed. Too much data.", + IllegalArgumentException.class, + () -> MdnsPacketParser.extractMatchCriteria(array) + ); + } + +}
\ No newline at end of file |