1 /* 2 * Copyright (C) 2018 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 com.android.server.net; 18 19 import static org.junit.Assert.assertEquals; 20 import static org.junit.Assert.assertNotNull; 21 import static org.junit.Assert.fail; 22 23 import android.net.IpConfiguration; 24 import android.net.IpConfiguration.IpAssignment; 25 import android.net.IpConfiguration.ProxySettings; 26 import android.net.LinkAddress; 27 import android.net.NetworkUtils; 28 import android.net.ProxyInfo; 29 import android.net.StaticIpConfiguration; 30 import android.support.test.runner.AndroidJUnit4; 31 import android.util.ArrayMap; 32 33 import org.junit.Test; 34 import org.junit.runner.RunWith; 35 36 import java.io.ByteArrayInputStream; 37 import java.io.ByteArrayOutputStream; 38 import java.io.DataOutputStream; 39 import java.io.IOException; 40 import java.io.InputStream; 41 42 /** 43 * Unit tests for {@link IpConfigStore} 44 */ 45 @RunWith(AndroidJUnit4.class) 46 public class IpConfigStoreTest { 47 48 @Test 49 public void backwardCompatibility2to3() throws IOException { 50 final int KEY_CONFIG = 17; 51 ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); 52 DataOutputStream outputStream = new DataOutputStream(byteStream); 53 54 IpConfiguration expectedConfig = new IpConfiguration(IpAssignment.DHCP, 55 ProxySettings.NONE, null, null); 56 57 // Emulate writing to old format. 58 writeDhcpConfigV2(outputStream, KEY_CONFIG, expectedConfig); 59 60 InputStream in = new ByteArrayInputStream(byteStream.toByteArray()); 61 ArrayMap<String, IpConfiguration> configurations = IpConfigStore.readIpConfigurations(in); 62 63 assertNotNull(configurations); 64 assertEquals(1, configurations.size()); 65 IpConfiguration actualConfig = configurations.get(String.valueOf(KEY_CONFIG)); 66 assertNotNull(actualConfig); 67 assertEquals(expectedConfig, actualConfig); 68 } 69 70 @Test 71 public void staticIpMultiNetworks() throws Exception { 72 final String IFACE_1 = "eth0"; 73 final String IFACE_2 = "eth1"; 74 final String IP_ADDR_1 = "192.168.1.10/24"; 75 final String IP_ADDR_2 = "192.168.1.20/24"; 76 final String DNS_IP_ADDR_1 = "1.2.3.4"; 77 final String DNS_IP_ADDR_2 = "5.6.7.8"; 78 79 StaticIpConfiguration staticIpConfiguration = new StaticIpConfiguration(); 80 staticIpConfiguration.ipAddress = new LinkAddress(IP_ADDR_1); 81 staticIpConfiguration.dnsServers.add(NetworkUtils.numericToInetAddress(DNS_IP_ADDR_1)); 82 staticIpConfiguration.dnsServers.add(NetworkUtils.numericToInetAddress(DNS_IP_ADDR_2)); 83 84 ProxyInfo proxyInfo = new ProxyInfo("10.10.10.10", 88, "host1,host2"); 85 86 IpConfiguration expectedConfig1 = new IpConfiguration(IpAssignment.STATIC, 87 ProxySettings.STATIC, staticIpConfiguration, proxyInfo); 88 IpConfiguration expectedConfig2 = new IpConfiguration(expectedConfig1); 89 expectedConfig2.getStaticIpConfiguration().ipAddress = new LinkAddress(IP_ADDR_2); 90 91 ArrayMap<String, IpConfiguration> expectedNetworks = new ArrayMap<>(); 92 expectedNetworks.put(IFACE_1, expectedConfig1); 93 expectedNetworks.put(IFACE_2, expectedConfig2); 94 95 MockedDelayedDiskWrite writer = new MockedDelayedDiskWrite(); 96 IpConfigStore store = new IpConfigStore(writer); 97 store.writeIpConfigurations("file/path/not/used/", expectedNetworks); 98 99 InputStream in = new ByteArrayInputStream(writer.byteStream.toByteArray()); 100 ArrayMap<String, IpConfiguration> actualNetworks = IpConfigStore.readIpConfigurations(in); 101 assertNotNull(actualNetworks); 102 assertEquals(2, actualNetworks.size()); 103 assertEquals(expectedNetworks.get(IFACE_1), actualNetworks.get(IFACE_1)); 104 assertEquals(expectedNetworks.get(IFACE_2), actualNetworks.get(IFACE_2)); 105 } 106 107 // This is simplified snapshot of code that was used to store values in V2 format (key as int). 108 private static void writeDhcpConfigV2(DataOutputStream out, int configKey, 109 IpConfiguration config) throws IOException { 110 out.writeInt(2); // VERSION 2 111 switch (config.ipAssignment) { 112 case DHCP: 113 out.writeUTF("ipAssignment"); 114 out.writeUTF(config.ipAssignment.toString()); 115 break; 116 default: 117 fail("Not supported in test environment"); 118 } 119 120 out.writeUTF("id"); 121 out.writeInt(configKey); 122 out.writeUTF("eos"); 123 } 124 125 /** Synchronously writes into given byte steam */ 126 private static class MockedDelayedDiskWrite extends DelayedDiskWrite { 127 final ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); 128 129 @Override 130 public void write(String filePath, Writer w) { 131 DataOutputStream outputStream = new DataOutputStream(byteStream); 132 133 try { 134 w.onWriteCalled(outputStream); 135 } catch (IOException e) { 136 fail(); 137 } 138 } 139 } 140 } 141