NetworkManagementServiceTest.java revision a3f828ba3079408543091a4ccd6c11896ec4e0c7
1/* 2 * Copyright (C) 2012 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 17package com.android.server; 18 19import android.content.Context; 20import android.net.LinkAddress; 21import android.net.LocalSocket; 22import android.net.LocalServerSocket; 23import android.os.Binder; 24import android.test.AndroidTestCase; 25import android.test.suitebuilder.annotation.LargeTest; 26import com.android.server.net.BaseNetworkObserver; 27 28import static org.mockito.Mockito.doReturn; 29import static org.mockito.Mockito.mock; 30import static org.mockito.Mockito.reset; 31import static org.mockito.Mockito.timeout; 32import static org.mockito.Mockito.verify; 33import static org.mockito.Mockito.verifyNoMoreInteractions; 34 35import java.io.IOException; 36import java.io.OutputStream; 37 38/** 39 * Tests for {@link NetworkManagementService}. 40 */ 41@LargeTest 42public class NetworkManagementServiceTest extends AndroidTestCase { 43 44 private static final String SOCKET_NAME = "__test__NetworkManagementServiceTest"; 45 private NetworkManagementService mNMService; 46 private LocalServerSocket mServerSocket; 47 private LocalSocket mSocket; 48 private OutputStream mOutputStream; 49 50 @Override 51 public void setUp() throws Exception { 52 super.setUp(); 53 // TODO: make this unnecessary. runtest might already make it unnecessary. 54 System.setProperty("dexmaker.dexcache", getContext().getCacheDir().toString()); 55 56 // Set up a sheltered test environment. 57 BroadcastInterceptingContext context = new BroadcastInterceptingContext(getContext()); 58 mServerSocket = new LocalServerSocket(SOCKET_NAME); 59 60 // Start the service and wait until it connects to our socket. 61 mNMService = NetworkManagementService.create(context, SOCKET_NAME); 62 mSocket = mServerSocket.accept(); 63 mOutputStream = mSocket.getOutputStream(); 64 } 65 66 @Override 67 public void tearDown() throws Exception { 68 if (mSocket != null) mSocket.close(); 69 if (mServerSocket != null) mServerSocket.close(); 70 super.tearDown(); 71 } 72 73 /** 74 * Sends a message on the netd socket and gives the events some time to make it back. 75 */ 76 private void sendMessage(String message) throws IOException { 77 // Strings are null-terminated, so add "\0" at the end. 78 mOutputStream.write((message + "\0").getBytes()); 79 } 80 81 private static <T> T expectSoon(T mock) { 82 return verify(mock, timeout(100)); 83 } 84 85 /** 86 * Tests that network observers work properly. 87 */ 88 public void testNetworkObservers() throws Exception { 89 BaseNetworkObserver observer = mock(BaseNetworkObserver.class); 90 doReturn(new Binder()).when(observer).asBinder(); // Used by registerObserver. 91 mNMService.registerObserver(observer); 92 93 // Forget everything that happened to the mock so far, so we can explicitly verify 94 // everything that happens and does not happen to it from now on. 95 reset(observer); 96 97 // Now send NetworkManagementService messages and ensure that the observer methods are 98 // called. After every valid message we expect a callback soon after; to ensure that 99 // invalid messages don't cause any callbacks, we call verifyNoMoreInteractions at the end. 100 101 /** 102 * Interface changes. 103 */ 104 sendMessage("600 Iface added rmnet12"); 105 expectSoon(observer).interfaceAdded("rmnet12"); 106 107 sendMessage("600 Iface removed eth1"); 108 expectSoon(observer).interfaceRemoved("eth1"); 109 110 sendMessage("607 Iface removed eth1"); 111 // Invalid code. 112 113 sendMessage("600 Iface borked lo down"); 114 // Invalid event. 115 116 sendMessage("600 Iface changed clat4 up again"); 117 // Extra tokens. 118 119 sendMessage("600 Iface changed clat4 up"); 120 expectSoon(observer).interfaceStatusChanged("clat4", true); 121 122 sendMessage("600 Iface linkstate rmnet0 down"); 123 expectSoon(observer).interfaceLinkStateChanged("rmnet0", false); 124 125 sendMessage("600 IFACE linkstate clat4 up"); 126 // Invalid group. 127 128 /** 129 * Bandwidth control events. 130 */ 131 sendMessage("601 limit alert data rmnet_usb0"); 132 expectSoon(observer).limitReached("data", "rmnet_usb0"); 133 134 sendMessage("601 invalid alert data rmnet0"); 135 // Invalid group. 136 137 sendMessage("601 limit increased data rmnet0"); 138 // Invalid event. 139 140 141 /** 142 * Interface class activity. 143 */ 144 145 sendMessage("613 IfaceClass active rmnet0"); 146 expectSoon(observer).interfaceClassDataActivityChanged("rmnet0", true, 0); 147 148 sendMessage("613 IfaceClass active rmnet0 1234"); 149 expectSoon(observer).interfaceClassDataActivityChanged("rmnet0", true, 1234); 150 151 sendMessage("613 IfaceClass idle eth0"); 152 expectSoon(observer).interfaceClassDataActivityChanged("eth0", false, 0); 153 154 sendMessage("613 IfaceClass idle eth0 1234"); 155 expectSoon(observer).interfaceClassDataActivityChanged("eth0", false, 1234); 156 157 sendMessage("613 IfaceClass reallyactive rmnet0 1234"); 158 expectSoon(observer).interfaceClassDataActivityChanged("rmnet0", false, 1234); 159 160 sendMessage("613 InterfaceClass reallyactive rmnet0"); 161 // Invalid group. 162 163 164 /** 165 * IP address changes. 166 */ 167 sendMessage("614 Address updated fe80::1/64 wlan0 128 253"); 168 expectSoon(observer).addressUpdated("wlan0", new LinkAddress("fe80::1/64", 128, 253)); 169 170 // There is no "added", so we take this as "removed". 171 sendMessage("614 Address added fe80::1/64 wlan0 128 253"); 172 expectSoon(observer).addressRemoved("wlan0", new LinkAddress("fe80::1/64", 128, 253)); 173 174 sendMessage("614 Address removed 2001:db8::1/64 wlan0 1 0"); 175 expectSoon(observer).addressRemoved("wlan0", new LinkAddress("2001:db8::1/64", 1, 0)); 176 177 sendMessage("614 Address removed 2001:db8::1/64 wlan0 1"); 178 // Not enough arguments. 179 180 sendMessage("666 Address removed 2001:db8::1/64 wlan0 1 0"); 181 // Invalid code. 182 183 184 /** 185 * DNS information broadcasts. 186 */ 187 sendMessage("615 DnsInfo servers rmnet_usb0 3600 2001:db8::1"); 188 expectSoon(observer).interfaceDnsServerInfo("rmnet_usb0", 3600, 189 new String[]{"2001:db8::1"}); 190 191 sendMessage("615 DnsInfo servers wlan0 14400 2001:db8::1,2001:db8::2"); 192 expectSoon(observer).interfaceDnsServerInfo("wlan0", 14400, 193 new String[]{"2001:db8::1", "2001:db8::2"}); 194 195 // We don't check for negative lifetimes, only for parse errors. 196 sendMessage("615 DnsInfo servers wlan0 -3600 ::1"); 197 expectSoon(observer).interfaceDnsServerInfo("wlan0", -3600, 198 new String[]{"::1"}); 199 200 sendMessage("615 DnsInfo servers wlan0 SIXHUNDRED ::1"); 201 // Non-numeric lifetime. 202 203 sendMessage("615 DnsInfo servers wlan0 2001:db8::1"); 204 // Missing lifetime. 205 206 sendMessage("615 DnsInfo servers wlan0 3600"); 207 // No servers. 208 209 sendMessage("615 DnsInfo servers 3600 wlan0 2001:db8::1,2001:db8::2"); 210 // Non-numeric lifetime. 211 212 sendMessage("615 DnsInfo wlan0 7200 2001:db8::1,2001:db8::2"); 213 // Invalid tokens. 214 215 sendMessage("666 DnsInfo servers wlan0 5400 2001:db8::1"); 216 // Invalid code. 217 218 // No syntax checking on the addresses. 219 sendMessage("615 DnsInfo servers wlan0 600 ,::,,foo,::1,"); 220 expectSoon(observer).interfaceDnsServerInfo("wlan0", 600, 221 new String[]{"", "::", "", "foo", "::1"}); 222 223 // Make sure nothing else was called. 224 verifyNoMoreInteractions(observer); 225 } 226} 227