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