196a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius/*
296a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius * Copyright (C) 2017 The Android Open Source Project
396a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius *
496a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius * Licensed under the Apache License, Version 2.0 (the "License");
596a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius * you may not use this file except in compliance with the License.
696a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius * You may obtain a copy of the License at
796a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius *
896a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius *      http://www.apache.org/licenses/LICENSE-2.0
996a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius *
1096a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius * Unless required by applicable law or agreed to in writing, software
1196a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius * distributed under the License is distributed on an "AS IS" BASIS,
1296a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1396a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius * See the License for the specific language governing permissions and
1496a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius * limitations under the License.
1596a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius */
1696a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius
1796a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Piuspackage com.android.server.wifi;
1896a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius
1996a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Piusimport static org.mockito.Mockito.*;
2096a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Piusimport static org.mockito.MockitoAnnotations.*;
2196a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius
227f2a1e30dd5d14320ffc7b185ac25fdb79fe52b0Etan Cohenimport android.support.test.filters.SmallTest;
2396a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius
2496a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Piusimport org.junit.Before;
2596a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Piusimport org.junit.Test;
2696a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Piusimport org.mockito.Mock;
2796a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius
2896a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius/**
2996a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius * Unit tests for {@link com.android.server.wifi.SelfRecovery}.
3096a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius */
3196a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius@SmallTest
3296a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Piuspublic class SelfRecoveryTest {
3396a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius    SelfRecovery mSelfRecovery;
3496a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius    @Mock WifiController mWifiController;
35e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne    @Mock Clock mClock;
3696a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius
3796a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius    @Before
3896a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius    public void setUp() throws Exception {
3996a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius        initMocks(this);
40e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne        mSelfRecovery = new SelfRecovery(mWifiController, mClock);
4196a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius    }
4296a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius
4396a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius    /**
4496a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius     * Verifies that invocations of {@link SelfRecovery#trigger(int)} with valid reasons will send
4596a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius     * the restart message to {@link WifiController}.
4696a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius     */
4796a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius    @Test
4896a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius    public void testValidTriggerReasonsSendMessageToWifiController() {
4996a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius        mSelfRecovery.trigger(SelfRecovery.REASON_LAST_RESORT_WATCHDOG);
504e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein        verify(mWifiController).sendMessage(eq(WifiController.CMD_RECOVERY_RESTART_WIFI), anyInt());
5196a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius        reset(mWifiController);
5296a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius
53e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne        when(mClock.getElapsedSinceBootMillis())
54e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne                .thenReturn(SelfRecovery.MAX_RESTARTS_TIME_WINDOW_MILLIS + 1);
5526e5eb3545a8d67c66e546f4ce413c0611573cfbRoshan Pius        mSelfRecovery.trigger(SelfRecovery.REASON_WIFINATIVE_FAILURE);
564e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein        verify(mWifiController).sendMessage(eq(WifiController.CMD_RECOVERY_RESTART_WIFI), anyInt());
5796a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius        reset(mWifiController);
5896a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius    }
5996a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius
6096a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius    /**
6196a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius     * Verifies that invocations of {@link SelfRecovery#trigger(int)} with invalid reasons will not
6296a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius     * send the restart message to {@link WifiController}.
6396a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius     */
6496a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius    @Test
6596a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius    public void testInvalidTriggerReasonsDoesNotSendMessageToWifiController() {
6696a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius        mSelfRecovery.trigger(-1);
67a5a83f137409921fe95dc01214a0307838b8508cxshu        verify(mWifiController, never()).sendMessage(anyInt(), anyString());
6896a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius
6996a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius        mSelfRecovery.trigger(8);
70a5a83f137409921fe95dc01214a0307838b8508cxshu        verify(mWifiController, never()).sendMessage(anyInt(), anyString());
7196a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius    }
72e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne
73e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne    /**
744e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein     * Verifies that a STA interface down event will trigger WifiController to disable wifi.
754e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein     */
764e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein    @Test
774e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein    public void testStaIfaceDownDisablesWifi() {
784e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein        mSelfRecovery.trigger(SelfRecovery.REASON_STA_IFACE_DOWN);
794e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein        verify(mWifiController).sendMessage(eq(WifiController.CMD_RECOVERY_DISABLE_WIFI));
804e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein    }
814e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein
824e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein    /**
83e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne     * Verifies that invocations of {@link SelfRecovery#trigger(int)} for REASON_HAL_CRASH &
84e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne     * REASON_WIFICOND_CRASH are limited to {@link SelfRecovery#MAX_RESTARTS_IN_TIME_WINDOW} in a
85e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne     * {@link SelfRecovery#MAX_RESTARTS_TIME_WINDOW_MILLIS} millisecond time window.
86e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne     */
87e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne    @Test
88e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne    public void testTimeWindowLimiting_typicalUse() {
89e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne        when(mClock.getElapsedSinceBootMillis()).thenReturn(0L);
90e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne        // Fill up the SelfRecovery's restart time window buffer, ensure all the restart triggers
91e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne        // aren't ignored
92e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne        for (int i = 0; i < SelfRecovery.MAX_RESTARTS_IN_TIME_WINDOW / 2; i++) {
9326e5eb3545a8d67c66e546f4ce413c0611573cfbRoshan Pius            mSelfRecovery.trigger(SelfRecovery.REASON_WIFINATIVE_FAILURE);
944e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein            verify(mWifiController).sendMessage(eq(WifiController.CMD_RECOVERY_RESTART_WIFI),
954e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein                                                anyInt());
96e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne            reset(mWifiController);
97e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne
9826e5eb3545a8d67c66e546f4ce413c0611573cfbRoshan Pius            mSelfRecovery.trigger(SelfRecovery.REASON_WIFINATIVE_FAILURE);
994e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein            verify(mWifiController).sendMessage(eq(WifiController.CMD_RECOVERY_RESTART_WIFI),
1004e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein                                                anyInt());
101e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne            reset(mWifiController);
102e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne        }
103e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne        if ((SelfRecovery.MAX_RESTARTS_IN_TIME_WINDOW % 2) == 1) {
10426e5eb3545a8d67c66e546f4ce413c0611573cfbRoshan Pius            mSelfRecovery.trigger(SelfRecovery.REASON_WIFINATIVE_FAILURE);
1054e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein            verify(mWifiController).sendMessage(eq(WifiController.CMD_RECOVERY_RESTART_WIFI),
1064e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein                                                anyInt());
107e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne            reset(mWifiController);
108e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne        }
109e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne
110f5cb5bac214538854dcb0a552fb984926950ba7fRebecca Silberstein        // Verify that further attempts to trigger restarts disable wifi
11126e5eb3545a8d67c66e546f4ce413c0611573cfbRoshan Pius        mSelfRecovery.trigger(SelfRecovery.REASON_WIFINATIVE_FAILURE);
1124e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein        verify(mWifiController, never()).sendMessage(eq(WifiController.CMD_RECOVERY_RESTART_WIFI),
113a5a83f137409921fe95dc01214a0307838b8508cxshu                anyString());
114f5cb5bac214538854dcb0a552fb984926950ba7fRebecca Silberstein        verify(mWifiController).sendMessage(eq(WifiController.CMD_RECOVERY_DISABLE_WIFI));
115e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne        reset(mWifiController);
116e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne
11726e5eb3545a8d67c66e546f4ce413c0611573cfbRoshan Pius        mSelfRecovery.trigger(SelfRecovery.REASON_WIFINATIVE_FAILURE);
1184e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein        verify(mWifiController, never()).sendMessage(eq(WifiController.CMD_RECOVERY_RESTART_WIFI),
119a5a83f137409921fe95dc01214a0307838b8508cxshu                anyString());
120f5cb5bac214538854dcb0a552fb984926950ba7fRebecca Silberstein        verify(mWifiController).sendMessage(eq(WifiController.CMD_RECOVERY_DISABLE_WIFI));
121e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne        reset(mWifiController);
122e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne
123e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne        // Verify L.R.Watchdog can still restart things (It has its own complex limiter)
124e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne        mSelfRecovery.trigger(SelfRecovery.REASON_LAST_RESORT_WATCHDOG);
1254e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein        verify(mWifiController).sendMessage(eq(WifiController.CMD_RECOVERY_RESTART_WIFI),
1264e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein                                            anyInt());
1274e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein        reset(mWifiController);
1284e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein
1294e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein        // Verify Sta Interface Down will still disable wifi
1304e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein        mSelfRecovery.trigger(SelfRecovery.REASON_STA_IFACE_DOWN);
1314e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein        verify(mWifiController).sendMessage(eq(WifiController.CMD_RECOVERY_DISABLE_WIFI));
132e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne        reset(mWifiController);
133e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne
134e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne        // now TRAVEL FORWARDS IN TIME and ensure that more restarts can occur
135e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne        when(mClock.getElapsedSinceBootMillis())
136e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne                .thenReturn(SelfRecovery.MAX_RESTARTS_TIME_WINDOW_MILLIS + 1);
137e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne        mSelfRecovery.trigger(SelfRecovery.REASON_LAST_RESORT_WATCHDOG);
1384e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein        verify(mWifiController).sendMessage(eq(WifiController.CMD_RECOVERY_RESTART_WIFI), anyInt());
139e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne        reset(mWifiController);
140e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne
141e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne        when(mClock.getElapsedSinceBootMillis())
142e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne                .thenReturn(SelfRecovery.MAX_RESTARTS_TIME_WINDOW_MILLIS + 1);
14326e5eb3545a8d67c66e546f4ce413c0611573cfbRoshan Pius        mSelfRecovery.trigger(SelfRecovery.REASON_WIFINATIVE_FAILURE);
1444e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein        verify(mWifiController).sendMessage(eq(WifiController.CMD_RECOVERY_RESTART_WIFI), anyInt());
145e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne        reset(mWifiController);
146e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne    }
147e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne
148e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne    /**
149e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne     * Verifies that invocations of {@link SelfRecovery#trigger(int)} for
150e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne     * REASON_LAST_RESORT_WATCHDOG are NOT limited to
151e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne     * {@link SelfRecovery#MAX_RESTARTS_IN_TIME_WINDOW} in a
152e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne     * {@link SelfRecovery#MAX_RESTARTS_TIME_WINDOW_MILLIS} millisecond time window.
153e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne     */
154e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne    @Test
155e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne    public void testTimeWindowLimiting_lastResortWatchdog_noEffect() {
156e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne        for (int i = 0; i < SelfRecovery.MAX_RESTARTS_IN_TIME_WINDOW * 2; i++) {
157e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne            // Verify L.R.Watchdog can still restart things (It has it's own complex limiter)
158e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne            mSelfRecovery.trigger(SelfRecovery.REASON_LAST_RESORT_WATCHDOG);
1594e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein            verify(mWifiController).sendMessage(eq(WifiController.CMD_RECOVERY_RESTART_WIFI),
1604e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein                                                anyInt());
1614e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein            reset(mWifiController);
1624e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein        }
1634e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein    }
1644e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein
1654e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein    /**
1664e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein     * Verifies that invocations of {@link SelfRecovery#trigger(int)} for
1674e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein     * REASON_STA_IFACE_DOWN are NOT limited to
1684e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein     * {@link SelfRecovery#MAX_RESTARTS_IN_TIME_WINDOW} in a
1694e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein     * {@link SelfRecovery#MAX_RESTARTS_TIME_WINDOW_MILLIS} millisecond time window.
1704e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein     */
1714e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein    @Test
1724e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein    public void testTimeWindowLimiting_staIfaceDown_noEffect() {
1734e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein        for (int i = 0; i < SelfRecovery.MAX_RESTARTS_IN_TIME_WINDOW * 2; i++) {
1744e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein            mSelfRecovery.trigger(SelfRecovery.REASON_STA_IFACE_DOWN);
1754e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein            verify(mWifiController).sendMessage(eq(WifiController.CMD_RECOVERY_DISABLE_WIFI));
1764e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein            verify(mWifiController, never())
1774e1c7af3e5b47bc8f53e92aa25047c5ca03238ceRebecca Silberstein                    .sendMessage(eq(WifiController.CMD_RECOVERY_RESTART_WIFI), anyInt());
178e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne            reset(mWifiController);
179e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne        }
180e8cf3b95869b71ff4719b037f79d74b74d2a2fc3Glen Kuhne    }
18196a9dbeb3a622e44c13ff7be8decf36d06ff7dbbRoshan Pius}
182