1 /*
<lambda>null2  * Copyright (C) 2022 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.net.testutils
18 
19 import android.net.DnsResolver.CLASS_IN
20 import android.net.DnsResolver.TYPE_A
21 import android.net.DnsResolver.TYPE_AAAA
22 import androidx.test.filters.SmallTest
23 import com.android.net.module.util.DnsPacket
24 import com.android.testutils.DnsAnswerProvider
25 import libcore.net.InetAddressUtils
26 import org.junit.Test
27 import org.junit.runner.RunWith
28 import org.junit.runners.JUnit4
29 import kotlin.test.assertEquals
30 
31 @RunWith(JUnit4::class)
32 @SmallTest
33 class DnsAnswerProviderTest {
34     val ansProvider = DnsAnswerProvider()
35 
36     private fun listOfAddresses(vararg addresses: String) =
37         addresses.map { address -> InetAddressUtils.parseNumericAddress(address) }
38 
39     @Test
40     fun testIpv4Answers() {
41         val record1 = getTestDnsRecord("www.google.com", "1.2.3.4")
42         val record2 = getTestDnsRecord("www.google.com", "5.6.7.8")
43 
44         // Verifies that empty response is returned before mocking.
45         assertEquals(emptyList(), ansProvider.getAnswer("www.google.com", TYPE_A))
46 
47         // Verifies that single response can be returned correctly.
48         ansProvider.setAnswer("www.google.com", listOfAddresses("1.2.3.4"))
49         assertEquals(listOf(record1), ansProvider.getAnswer("www.google.com", TYPE_A))
50 
51         // Verifies that multiple responses can be returned correctly.
52         ansProvider.setAnswer("www.google.com", listOfAddresses("1.2.3.4", "5.6.7.8"))
53         assertEquals(listOf(record1, record2), ansProvider.getAnswer("www.google.com", TYPE_A))
54 
55         // Verifies that null response is returned if queried with wrong type or wrong name.
56         assertEquals(emptyList(), ansProvider.getAnswer("www.google.com", TYPE_AAAA))
57         assertEquals(emptyList(), ansProvider.getAnswer("www.android.com", TYPE_A))
58 
59         // Verifies that the answers for different entry has no effect to the testing one.
60         ansProvider.setAnswer("www.example.com", listOfAddresses("8.8.8.8"))
61         assertEquals(listOf(record1, record2), ansProvider.getAnswer("www.google.com", TYPE_A))
62 
63         // Verifies that the responses can be cleared.
64         ansProvider.clearAnswer("www.google.com")
65         assertEquals(emptyList(), ansProvider.getAnswer("www.google.com", TYPE_A))
66     }
67 
68     @Test
69     fun testIpv4v6Answers() {
70         val record1 = getTestDnsRecord("www.google.com", "2001:db8::1")
71         val record2 = getTestDnsRecord("www.google.com", "2001:db8::2")
72         val record3 = getTestDnsRecord("www.google.com", "2001:db8::4")
73         val v4Record1 = getTestDnsRecord("www.google.com", "1.2.3.4")
74 
75         // Verifies that null response is returned before mocking
76         assertEquals(emptyList(), ansProvider.getAnswer("www.google.com", TYPE_AAAA))
77 
78         ansProvider.setAnswer("www.google.com", listOfAddresses("2001:db8::1", "2001:db8::2"))
79         assertEquals(listOf(record1, record2), ansProvider.getAnswer("www.google.com", TYPE_AAAA))
80 
81         // Verifies that the answers for different entry has no effect to the testing one.
82         ansProvider.setAnswer("www.example.com", listOfAddresses("2001:db8::3"))
83         assertEquals(listOf(record1, record2), ansProvider.getAnswer("www.google.com", TYPE_AAAA))
84 
85         // Verifies that null response is returned if queried with wrong type or wrong name.
86         assertEquals(emptyList(), ansProvider.getAnswer("www.google.com", TYPE_A))
87         assertEquals(emptyList(), ansProvider.getAnswer("www.android.com", TYPE_AAAA))
88 
89         // Verifies that the responses can be replaced. And different types can be mixed.
90         ansProvider.setAnswer("www.google.com", listOfAddresses("2001:db8::4", "1.2.3.4"))
91         assertEquals(listOf(record3), ansProvider.getAnswer("www.google.com", TYPE_AAAA))
92         assertEquals(listOf(v4Record1), ansProvider.getAnswer("www.google.com", TYPE_A))
93 
94         // Verifies that the responses can be cleared.
95         ansProvider.clearAnswer("www.google.com")
96         assertEquals(emptyList(), ansProvider.getAnswer("www.google.com", TYPE_AAAA))
97     }
98 
99     private fun getTestDnsRecord(dName: String, address: String) =
100             DnsPacket.DnsRecord.makeAOrAAAARecord(DnsPacket.ANSECTION, dName, CLASS_IN, 5 /* ttl */,
101                     InetAddressUtils.parseNumericAddress(address))
102 }