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