• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2023 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.shared;
18 
19 import static android.net.ConnectivitySettingsManager.PRIVATE_DNS_MODE_OFF;
20 import static android.net.ConnectivitySettingsManager.PRIVATE_DNS_MODE_OPPORTUNISTIC;
21 import static android.net.ConnectivitySettingsManager.PRIVATE_DNS_MODE_PROVIDER_HOSTNAME;
22 
23 import static org.junit.Assert.assertArrayEquals;
24 import static org.junit.Assert.assertEquals;
25 
26 import android.net.PrivateDnsConfigParcel;
27 
28 import org.junit.Test;
29 import org.junit.runner.RunWith;
30 import org.junit.runners.JUnit4;
31 
32 import java.net.InetAddress;
33 
34 @RunWith(JUnit4.class)
35 public final class PrivateDnsConfigTest {
36     private static final int OFF_MODE = PRIVATE_DNS_MODE_OFF;
37     private static final int OPPORTUNISTIC_MODE = PRIVATE_DNS_MODE_OPPORTUNISTIC;
38     private static final int STRICT_MODE = PRIVATE_DNS_MODE_PROVIDER_HOSTNAME;
39 
40     private static final InetAddress[] TEST_ADDRS = new InetAddress[] {
41         InetAddress.parseNumericAddress("1.2.3.4"),
42         InetAddress.parseNumericAddress("2001:db8::2"),
43     };
44 
toStringArray(InetAddress[] ips)45     private String[] toStringArray(InetAddress[] ips) {
46         String[] out = new String[ips.length];
47         int i = 0;
48         for (InetAddress ip : ips) {
49             out[i++] = ip.getHostAddress();
50         }
51         return out;
52     }
53 
assertPrivateDnsConfigEquals(PrivateDnsConfig a, PrivateDnsConfig b)54     private void assertPrivateDnsConfigEquals(PrivateDnsConfig a, PrivateDnsConfig b) {
55         assertEquals(a.mode, b.mode);
56         assertEquals(a.hostname, b.hostname);
57         assertArrayEquals(a.ips, b.ips);
58         assertEquals(a.dohName, b.dohName);
59         assertArrayEquals(a.dohIps, b.dohIps);
60         assertEquals(a.dohPath, b.dohPath);
61         assertEquals(a.dohPort, b.dohPort);
62     }
63 
assertParcelEquals(PrivateDnsConfig cfg, PrivateDnsConfigParcel parcel)64     private void assertParcelEquals(PrivateDnsConfig cfg, PrivateDnsConfigParcel parcel) {
65         assertEquals(parcel.privateDnsMode, cfg.mode);
66         assertEquals(parcel.hostname, cfg.hostname);
67         assertArrayEquals(parcel.ips, toStringArray(cfg.ips));
68         assertEquals(parcel.dohName, cfg.dohName);
69         assertEquals(parcel.dohPath, cfg.dohPath);
70         assertEquals(parcel.dohPort, cfg.dohPort);
71         assertArrayEquals(parcel.dohIps, toStringArray(cfg.dohIps));
72     }
73 
74     // Tests both toParcel() and fromParcel() together.
testPrivateDnsConfigConversion(PrivateDnsConfig cfg)75     private void testPrivateDnsConfigConversion(PrivateDnsConfig cfg) {
76         final PrivateDnsConfigParcel parcel = cfg.toParcel();
77         assertParcelEquals(cfg, parcel);
78 
79         final PrivateDnsConfig convertedCfg = PrivateDnsConfig.fromParcel(parcel);
80         assertPrivateDnsConfigEquals(cfg, convertedCfg);
81     }
82 
83     // Tests that a PrivateDnsConfig and a PrivateDnsConfig that is converted from
84     // PrivateDnsConfigParcel are equal.
85     @Test
testParcelableConversion()86     public void testParcelableConversion() {
87         // Test the constructor: PrivateDnsConfig()
88         testPrivateDnsConfigConversion(new PrivateDnsConfig());
89 
90         // Test the constructor: PrivateDnsConfig(boolean useTls)
91         testPrivateDnsConfigConversion(new PrivateDnsConfig(true));
92         testPrivateDnsConfigConversion(new PrivateDnsConfig(false));
93 
94         // Test the constructor: PrivateDnsConfig(String hostname, InetAddress[] ips)
95         testPrivateDnsConfigConversion(new PrivateDnsConfig(null, null));
96         testPrivateDnsConfigConversion(new PrivateDnsConfig(null, TEST_ADDRS));
97         testPrivateDnsConfigConversion(new PrivateDnsConfig("dns.com", null));
98         testPrivateDnsConfigConversion(new PrivateDnsConfig("dns.com", TEST_ADDRS));
99 
100         // Test the constructor:
101         // PrivateDnsConfig(int mode, String hostname, InetAddress[] ips,
102         //                  String dohName, InetAddress[] dohIps, String dohPath, int dohPort)
103         for (int mode : new int[] { OFF_MODE, OPPORTUNISTIC_MODE, STRICT_MODE }) {
104             testPrivateDnsConfigConversion(new PrivateDnsConfig(mode, null, null,
105                     null, null, null, -1));
106             testPrivateDnsConfigConversion(new PrivateDnsConfig(mode, "dns.com", null,
107                     null, null, null, -1));
108             testPrivateDnsConfigConversion(new PrivateDnsConfig(mode, "dns.com", TEST_ADDRS,
109                     null, null, null, -1));
110             testPrivateDnsConfigConversion(new PrivateDnsConfig(mode, "dns.com", TEST_ADDRS,
111                     "doh.com", null, null, -1));
112             testPrivateDnsConfigConversion(new PrivateDnsConfig(mode, "dns.com", TEST_ADDRS,
113                     "doh.com", TEST_ADDRS, null, -1));
114             testPrivateDnsConfigConversion(new PrivateDnsConfig(mode, "dns.com", TEST_ADDRS,
115                     "doh.com", TEST_ADDRS, "dohpath=/some-path{?dns}", -1));
116             testPrivateDnsConfigConversion(new PrivateDnsConfig(mode, "dns.com", TEST_ADDRS,
117                     "doh.com", TEST_ADDRS, "dohpath=/some-path{?dns}", 443));
118         }
119     }
120 
121     @Test
testIpAddressArrayIsCopied()122     public void testIpAddressArrayIsCopied() {
123         final InetAddress ip = InetAddress.parseNumericAddress("1.2.3.4");
124         final InetAddress[] ipArray = new InetAddress[] { ip };
125         final PrivateDnsConfig cfg = new PrivateDnsConfig(OPPORTUNISTIC_MODE, null /* hostname */,
126                 ipArray /* ips */, null /* dohName */, ipArray /* dohIps */, null /* dohPath */,
127                 -1 /* dohPort */);
128 
129         ipArray[0] = InetAddress.parseNumericAddress("2001:db8::2");
130         assertArrayEquals(new InetAddress[] { ip }, cfg.ips);
131         assertArrayEquals(new InetAddress[] { ip }, cfg.dohIps);
132     }
133 }
134