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