Lorenzo Colitti | 7421a01 | 2013-08-20 22:51:24 +0900 | [diff] [blame] | 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 | |
| 17 | package com.android.server; |
| 18 | |
Luke Huang | 909b31a | 2019-03-16 21:21:16 +0800 | [diff] [blame] | 19 | import static org.mockito.Mockito.doNothing; |
Lorenzo Colitti | 7421a01 | 2013-08-20 22:51:24 +0900 | [diff] [blame] | 20 | import static org.mockito.Mockito.doReturn; |
| 21 | import static org.mockito.Mockito.mock; |
| 22 | import static org.mockito.Mockito.reset; |
| 23 | import static org.mockito.Mockito.timeout; |
| 24 | import static org.mockito.Mockito.verify; |
| 25 | import static org.mockito.Mockito.verifyNoMoreInteractions; |
| 26 | |
Luke Huang | 909b31a | 2019-03-16 21:21:16 +0800 | [diff] [blame] | 27 | import android.annotation.NonNull; |
Lorenzo Colitti | a086800 | 2017-07-11 02:29:28 +0900 | [diff] [blame] | 28 | import android.content.Context; |
| 29 | import android.net.INetd; |
Luke Huang | 909b31a | 2019-03-16 21:21:16 +0800 | [diff] [blame] | 30 | import android.net.INetdUnsolicitedEventListener; |
Lorenzo Colitti | a086800 | 2017-07-11 02:29:28 +0900 | [diff] [blame] | 31 | import android.net.LinkAddress; |
Lorenzo Colitti | a086800 | 2017-07-11 02:29:28 +0900 | [diff] [blame] | 32 | import android.os.BatteryStats; |
| 33 | import android.os.Binder; |
| 34 | import android.os.IBinder; |
Lorenzo Colitti | a086800 | 2017-07-11 02:29:28 +0900 | [diff] [blame] | 35 | import android.test.suitebuilder.annotation.SmallTest; |
| 36 | |
Brett Chabot | 1ae2aa6 | 2019-03-04 14:14:56 -0800 | [diff] [blame] | 37 | import androidx.test.runner.AndroidJUnit4; |
| 38 | |
Lorenzo Colitti | a086800 | 2017-07-11 02:29:28 +0900 | [diff] [blame] | 39 | import com.android.internal.app.IBatteryStats; |
| 40 | import com.android.server.NetworkManagementService.SystemServices; |
| 41 | import com.android.server.net.BaseNetworkObserver; |
| 42 | |
Lorenzo Colitti | a086800 | 2017-07-11 02:29:28 +0900 | [diff] [blame] | 43 | import org.junit.After; |
| 44 | import org.junit.Before; |
| 45 | import org.junit.Test; |
| 46 | import org.junit.runner.RunWith; |
Luke Huang | 909b31a | 2019-03-16 21:21:16 +0800 | [diff] [blame] | 47 | import org.mockito.ArgumentCaptor; |
| 48 | import org.mockito.Captor; |
Lorenzo Colitti | a086800 | 2017-07-11 02:29:28 +0900 | [diff] [blame] | 49 | import org.mockito.Mock; |
| 50 | import org.mockito.MockitoAnnotations; |
| 51 | |
Lorenzo Colitti | 7421a01 | 2013-08-20 22:51:24 +0900 | [diff] [blame] | 52 | /** |
| 53 | * Tests for {@link NetworkManagementService}. |
| 54 | */ |
Lorenzo Colitti | a086800 | 2017-07-11 02:29:28 +0900 | [diff] [blame] | 55 | @RunWith(AndroidJUnit4.class) |
| 56 | @SmallTest |
| 57 | public class NetworkManagementServiceTest { |
Lorenzo Colitti | 7421a01 | 2013-08-20 22:51:24 +0900 | [diff] [blame] | 58 | |
Lorenzo Colitti | 7421a01 | 2013-08-20 22:51:24 +0900 | [diff] [blame] | 59 | private NetworkManagementService mNMService; |
Lorenzo Colitti | 7421a01 | 2013-08-20 22:51:24 +0900 | [diff] [blame] | 60 | |
Lorenzo Colitti | a086800 | 2017-07-11 02:29:28 +0900 | [diff] [blame] | 61 | @Mock private Context mContext; |
| 62 | @Mock private IBatteryStats.Stub mBatteryStatsService; |
| 63 | @Mock private INetd.Stub mNetdService; |
| 64 | |
Luke Huang | 909b31a | 2019-03-16 21:21:16 +0800 | [diff] [blame] | 65 | @NonNull |
| 66 | @Captor |
| 67 | private ArgumentCaptor<INetdUnsolicitedEventListener> mUnsolListenerCaptor; |
| 68 | |
Lorenzo Colitti | a086800 | 2017-07-11 02:29:28 +0900 | [diff] [blame] | 69 | private final SystemServices mServices = new SystemServices() { |
| 70 | @Override |
| 71 | public IBinder getService(String name) { |
| 72 | switch (name) { |
| 73 | case BatteryStats.SERVICE_NAME: |
| 74 | return mBatteryStatsService; |
| 75 | default: |
| 76 | throw new UnsupportedOperationException("Unknown service " + name); |
| 77 | } |
| 78 | } |
| 79 | @Override |
| 80 | public void registerLocalService(NetworkManagementInternal nmi) { |
| 81 | } |
| 82 | @Override |
| 83 | public INetd getNetd() { |
| 84 | return mNetdService; |
| 85 | } |
| 86 | }; |
| 87 | |
| 88 | @Before |
Lorenzo Colitti | 7421a01 | 2013-08-20 22:51:24 +0900 | [diff] [blame] | 89 | public void setUp() throws Exception { |
Lorenzo Colitti | a086800 | 2017-07-11 02:29:28 +0900 | [diff] [blame] | 90 | MockitoAnnotations.initMocks(this); |
Luke Huang | 909b31a | 2019-03-16 21:21:16 +0800 | [diff] [blame] | 91 | doNothing().when(mNetdService) |
| 92 | .registerUnsolicitedEventListener(mUnsolListenerCaptor.capture()); |
Lorenzo Colitti | 7421a01 | 2013-08-20 22:51:24 +0900 | [diff] [blame] | 93 | // Start the service and wait until it connects to our socket. |
Luke Huang | 909b31a | 2019-03-16 21:21:16 +0800 | [diff] [blame] | 94 | mNMService = NetworkManagementService.create(mContext, mServices); |
Lorenzo Colitti | 7421a01 | 2013-08-20 22:51:24 +0900 | [diff] [blame] | 95 | } |
| 96 | |
Lorenzo Colitti | a086800 | 2017-07-11 02:29:28 +0900 | [diff] [blame] | 97 | @After |
Lorenzo Colitti | 7421a01 | 2013-08-20 22:51:24 +0900 | [diff] [blame] | 98 | public void tearDown() throws Exception { |
Hugo Benichi | e93c569 | 2018-01-29 14:00:44 +0900 | [diff] [blame] | 99 | mNMService.shutdown(); |
Lorenzo Colitti | 7421a01 | 2013-08-20 22:51:24 +0900 | [diff] [blame] | 100 | } |
| 101 | |
| 102 | private static <T> T expectSoon(T mock) { |
Lorenzo Colitti | a086800 | 2017-07-11 02:29:28 +0900 | [diff] [blame] | 103 | return verify(mock, timeout(200)); |
Lorenzo Colitti | 7421a01 | 2013-08-20 22:51:24 +0900 | [diff] [blame] | 104 | } |
| 105 | |
| 106 | /** |
| 107 | * Tests that network observers work properly. |
| 108 | */ |
Lorenzo Colitti | a086800 | 2017-07-11 02:29:28 +0900 | [diff] [blame] | 109 | @Test |
Lorenzo Colitti | 7421a01 | 2013-08-20 22:51:24 +0900 | [diff] [blame] | 110 | public void testNetworkObservers() throws Exception { |
| 111 | BaseNetworkObserver observer = mock(BaseNetworkObserver.class); |
| 112 | doReturn(new Binder()).when(observer).asBinder(); // Used by registerObserver. |
| 113 | mNMService.registerObserver(observer); |
| 114 | |
| 115 | // Forget everything that happened to the mock so far, so we can explicitly verify |
| 116 | // everything that happens and does not happen to it from now on. |
Lorenzo Colitti | 7421a01 | 2013-08-20 22:51:24 +0900 | [diff] [blame] | 117 | |
Luke Huang | 909b31a | 2019-03-16 21:21:16 +0800 | [diff] [blame] | 118 | INetdUnsolicitedEventListener unsolListener = mUnsolListenerCaptor.getValue(); |
| 119 | reset(observer); |
| 120 | // Now call unsolListener methods and ensure that the observer methods are |
| 121 | // called. After every method we expect a callback soon after; to ensure that |
Lorenzo Colitti | 7421a01 | 2013-08-20 22:51:24 +0900 | [diff] [blame] | 122 | // invalid messages don't cause any callbacks, we call verifyNoMoreInteractions at the end. |
| 123 | |
| 124 | /** |
| 125 | * Interface changes. |
| 126 | */ |
Luke Huang | 909b31a | 2019-03-16 21:21:16 +0800 | [diff] [blame] | 127 | unsolListener.onInterfaceAdded("rmnet12"); |
Lorenzo Colitti | 7421a01 | 2013-08-20 22:51:24 +0900 | [diff] [blame] | 128 | expectSoon(observer).interfaceAdded("rmnet12"); |
| 129 | |
Luke Huang | 909b31a | 2019-03-16 21:21:16 +0800 | [diff] [blame] | 130 | unsolListener.onInterfaceRemoved("eth1"); |
Lorenzo Colitti | 7421a01 | 2013-08-20 22:51:24 +0900 | [diff] [blame] | 131 | expectSoon(observer).interfaceRemoved("eth1"); |
| 132 | |
Luke Huang | 909b31a | 2019-03-16 21:21:16 +0800 | [diff] [blame] | 133 | unsolListener.onInterfaceChanged("clat4", true); |
Lorenzo Colitti | 7421a01 | 2013-08-20 22:51:24 +0900 | [diff] [blame] | 134 | expectSoon(observer).interfaceStatusChanged("clat4", true); |
| 135 | |
Luke Huang | 909b31a | 2019-03-16 21:21:16 +0800 | [diff] [blame] | 136 | unsolListener.onInterfaceLinkStateChanged("rmnet0", false); |
Lorenzo Colitti | 7421a01 | 2013-08-20 22:51:24 +0900 | [diff] [blame] | 137 | expectSoon(observer).interfaceLinkStateChanged("rmnet0", false); |
| 138 | |
Lorenzo Colitti | 7421a01 | 2013-08-20 22:51:24 +0900 | [diff] [blame] | 139 | /** |
| 140 | * Bandwidth control events. |
| 141 | */ |
Luke Huang | 909b31a | 2019-03-16 21:21:16 +0800 | [diff] [blame] | 142 | unsolListener.onQuotaLimitReached("data", "rmnet_usb0"); |
Lorenzo Colitti | 7421a01 | 2013-08-20 22:51:24 +0900 | [diff] [blame] | 143 | expectSoon(observer).limitReached("data", "rmnet_usb0"); |
| 144 | |
Lorenzo Colitti | 7421a01 | 2013-08-20 22:51:24 +0900 | [diff] [blame] | 145 | /** |
| 146 | * Interface class activity. |
| 147 | */ |
Luke Huang | 909b31a | 2019-03-16 21:21:16 +0800 | [diff] [blame] | 148 | unsolListener.onInterfaceClassActivityChanged(true, 1, 1234, 0); |
Lorenzo Colitti | a086800 | 2017-07-11 02:29:28 +0900 | [diff] [blame] | 149 | expectSoon(observer).interfaceClassDataActivityChanged("1", true, 1234); |
Ashish Sharma | a3f828b | 2014-03-18 16:38:58 -0700 | [diff] [blame] | 150 | |
Luke Huang | 909b31a | 2019-03-16 21:21:16 +0800 | [diff] [blame] | 151 | unsolListener.onInterfaceClassActivityChanged(false, 9, 5678, 0); |
Lorenzo Colitti | a086800 | 2017-07-11 02:29:28 +0900 | [diff] [blame] | 152 | expectSoon(observer).interfaceClassDataActivityChanged("9", false, 5678); |
Lorenzo Colitti | 7421a01 | 2013-08-20 22:51:24 +0900 | [diff] [blame] | 153 | |
Luke Huang | 909b31a | 2019-03-16 21:21:16 +0800 | [diff] [blame] | 154 | unsolListener.onInterfaceClassActivityChanged(false, 9, 4321, 0); |
Lorenzo Colitti | a086800 | 2017-07-11 02:29:28 +0900 | [diff] [blame] | 155 | expectSoon(observer).interfaceClassDataActivityChanged("9", false, 4321); |
Lorenzo Colitti | 7421a01 | 2013-08-20 22:51:24 +0900 | [diff] [blame] | 156 | |
Lorenzo Colitti | 7421a01 | 2013-08-20 22:51:24 +0900 | [diff] [blame] | 157 | /** |
| 158 | * IP address changes. |
| 159 | */ |
Luke Huang | 909b31a | 2019-03-16 21:21:16 +0800 | [diff] [blame] | 160 | unsolListener.onInterfaceAddressUpdated("fe80::1/64", "wlan0", 128, 253); |
Lorenzo Colitti | 6448394 | 2013-11-15 18:43:52 +0900 | [diff] [blame] | 161 | expectSoon(observer).addressUpdated("wlan0", new LinkAddress("fe80::1/64", 128, 253)); |
Lorenzo Colitti | 7421a01 | 2013-08-20 22:51:24 +0900 | [diff] [blame] | 162 | |
Luke Huang | 909b31a | 2019-03-16 21:21:16 +0800 | [diff] [blame] | 163 | unsolListener.onInterfaceAddressRemoved("fe80::1/64", "wlan0", 128, 253); |
Lorenzo Colitti | 6448394 | 2013-11-15 18:43:52 +0900 | [diff] [blame] | 164 | expectSoon(observer).addressRemoved("wlan0", new LinkAddress("fe80::1/64", 128, 253)); |
Lorenzo Colitti | 7421a01 | 2013-08-20 22:51:24 +0900 | [diff] [blame] | 165 | |
Luke Huang | 909b31a | 2019-03-16 21:21:16 +0800 | [diff] [blame] | 166 | unsolListener.onInterfaceAddressRemoved("2001:db8::1/64", "wlan0", 1, 0); |
Lorenzo Colitti | 6448394 | 2013-11-15 18:43:52 +0900 | [diff] [blame] | 167 | expectSoon(observer).addressRemoved("wlan0", new LinkAddress("2001:db8::1/64", 1, 0)); |
Lorenzo Colitti | 7421a01 | 2013-08-20 22:51:24 +0900 | [diff] [blame] | 168 | |
Lorenzo Colitti | 5ae4a53 | 2013-10-31 11:59:46 +0900 | [diff] [blame] | 169 | /** |
| 170 | * DNS information broadcasts. |
| 171 | */ |
Luke Huang | 909b31a | 2019-03-16 21:21:16 +0800 | [diff] [blame] | 172 | unsolListener.onInterfaceDnsServerInfo("rmnet_usb0", 3600, new String[]{"2001:db8::1"}); |
Lorenzo Colitti | 5ae4a53 | 2013-10-31 11:59:46 +0900 | [diff] [blame] | 173 | expectSoon(observer).interfaceDnsServerInfo("rmnet_usb0", 3600, |
| 174 | new String[]{"2001:db8::1"}); |
| 175 | |
Luke Huang | 909b31a | 2019-03-16 21:21:16 +0800 | [diff] [blame] | 176 | unsolListener.onInterfaceDnsServerInfo("wlan0", 14400, |
| 177 | new String[]{"2001:db8::1", "2001:db8::2"}); |
Lorenzo Colitti | 5ae4a53 | 2013-10-31 11:59:46 +0900 | [diff] [blame] | 178 | expectSoon(observer).interfaceDnsServerInfo("wlan0", 14400, |
| 179 | new String[]{"2001:db8::1", "2001:db8::2"}); |
| 180 | |
| 181 | // We don't check for negative lifetimes, only for parse errors. |
Luke Huang | 909b31a | 2019-03-16 21:21:16 +0800 | [diff] [blame] | 182 | unsolListener.onInterfaceDnsServerInfo("wlan0", -3600, new String[]{"::1"}); |
Lorenzo Colitti | 5ae4a53 | 2013-10-31 11:59:46 +0900 | [diff] [blame] | 183 | expectSoon(observer).interfaceDnsServerInfo("wlan0", -3600, |
| 184 | new String[]{"::1"}); |
| 185 | |
Lorenzo Colitti | 5ae4a53 | 2013-10-31 11:59:46 +0900 | [diff] [blame] | 186 | // No syntax checking on the addresses. |
Luke Huang | 909b31a | 2019-03-16 21:21:16 +0800 | [diff] [blame] | 187 | unsolListener.onInterfaceDnsServerInfo("wlan0", 600, |
| 188 | new String[]{"", "::", "", "foo", "::1"}); |
Lorenzo Colitti | 5ae4a53 | 2013-10-31 11:59:46 +0900 | [diff] [blame] | 189 | expectSoon(observer).interfaceDnsServerInfo("wlan0", 600, |
| 190 | new String[]{"", "::", "", "foo", "::1"}); |
| 191 | |
Lorenzo Colitti | 7421a01 | 2013-08-20 22:51:24 +0900 | [diff] [blame] | 192 | // Make sure nothing else was called. |
| 193 | verifyNoMoreInteractions(observer); |
| 194 | } |
| 195 | } |