1/*
2 * Copyright (C) 2016 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 */
16package com.android.server.wifi;
17
18import static org.junit.Assert.assertEquals;
19import static org.junit.Assert.assertTrue;
20import static org.mockito.Mockito.*;
21
22import android.content.BroadcastReceiver;
23import android.content.Context;
24import android.content.Intent;
25import android.content.IntentFilter;
26import android.net.wifi.SupplicantState;
27import android.net.wifi.WifiManager;
28import android.net.wifi.WifiSsid;
29import android.os.Handler;
30import android.os.Message;
31import android.os.test.TestLooper;
32
33import com.android.internal.app.IBatteryStats;
34
35import org.junit.Before;
36import org.junit.Test;
37import org.mockito.Mock;
38import org.mockito.MockitoAnnotations;
39/**
40 * Unit tests for {@link android.net.wifi.SupplicantStateTracker}.
41 */
42public class SupplicantStateTrackerTest {
43
44    private static final String TAG = "SupplicantStateTrackerTest";
45    private static final String   sSSID = "\"GoogleGuest\"";
46    private static final WifiSsid sWifiSsid = WifiSsid.createFromAsciiEncoded(sSSID);
47    private static final String   sBSSID = "01:02:03:04:05:06";
48
49    private @Mock WifiConfigManager mWcm;
50    private @Mock Context mContext;
51    private Handler mHandler;
52    private SupplicantStateTracker mSupplicantStateTracker;
53    private TestLooper mLooper;
54    private FrameworkFacade mFacade;
55
56    private FrameworkFacade getFrameworkFacade() {
57        FrameworkFacade facade = mock(FrameworkFacade.class);
58        IBatteryStats batteryStatsService = mock(IBatteryStats.class);
59        when(facade.getBatteryService()).thenReturn(batteryStatsService);
60        return facade;
61    }
62
63    private Message getSupplicantStateChangeMessage(int networkId, WifiSsid wifiSsid,
64            String bssid, SupplicantState newSupplicantState) {
65        return Message.obtain(null, WifiMonitor.SUPPLICANT_STATE_CHANGE_EVENT, 0, 0,
66                new StateChangeResult(networkId, wifiSsid, bssid, newSupplicantState));
67
68    }
69
70    @Before
71    public void setUp() {
72        mLooper = new TestLooper();
73        mHandler = new Handler(mLooper.getLooper());
74        MockitoAnnotations.initMocks(this);
75        mFacade = getFrameworkFacade();
76        mSupplicantStateTracker = new SupplicantStateTracker(mContext, mWcm, mFacade, mHandler);
77    }
78
79    /**
80     * This test verifies that the SupplicantStateTracker sends a broadcast intent upon receiving
81     * a message when supplicant state changes
82     */
83    @Test
84    public void testSupplicantStateChangeIntent() {
85        BroadcastReceiver wifiBroadcastReceiver = new BroadcastReceiver() {
86            @Override
87            public void onReceive(Context context, Intent intent) {
88                String action = intent.getAction();
89                assertTrue(action.equals(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION));
90                SupplicantState recvdState =
91                        (SupplicantState) intent.getExtra(WifiManager.EXTRA_NEW_STATE, -1);
92                assertEquals(SupplicantState.SCANNING, recvdState);
93            }
94        };
95        IntentFilter mIntentFilter = new IntentFilter();
96        mIntentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
97        mContext.registerReceiver(wifiBroadcastReceiver, mIntentFilter);
98        mSupplicantStateTracker.sendMessage(getSupplicantStateChangeMessage(0, sWifiSsid,
99                sBSSID, SupplicantState.SCANNING));
100    }
101
102    /**
103     * This test verifies that the current auth status is sent in the Broadcast intent
104     */
105    @Test
106    public void testAuthPassInSupplicantStateChangeIntent() {
107        BroadcastReceiver wifiBroadcastReceiver = new BroadcastReceiver() {
108            @Override
109            public void onReceive(Context context, Intent intent) {
110                String action = intent.getAction();
111                assertTrue(action.equals(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION));
112                SupplicantState recvdState =
113                        (SupplicantState) intent.getExtra(WifiManager.EXTRA_NEW_STATE, -1);
114                assertEquals(SupplicantState.AUTHENTICATING, recvdState);
115                boolean authStatus =
116                        (boolean) intent.getExtra(WifiManager.EXTRA_SUPPLICANT_ERROR, -1);
117                assertEquals(authStatus, true);
118            }
119        };
120        IntentFilter mIntentFilter = new IntentFilter();
121        mIntentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
122        mContext.registerReceiver(wifiBroadcastReceiver, mIntentFilter);
123        mSupplicantStateTracker.sendMessage(getSupplicantStateChangeMessage(0, sWifiSsid,
124                sBSSID, SupplicantState.AUTHENTICATING));
125        mSupplicantStateTracker.sendMessage(WifiMonitor.AUTHENTICATION_FAILURE_EVENT);
126    }
127
128    /**
129     * This test verifies that the current auth status is sent in the Broadcast intent
130     */
131    @Test
132    public void testAuthFailedInSupplicantStateChangeIntent() {
133        BroadcastReceiver wifiBroadcastReceiver = new BroadcastReceiver() {
134            @Override
135            public void onReceive(Context context, Intent intent) {
136                String action = intent.getAction();
137                assertTrue(action.equals(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION));
138                SupplicantState recvdState =
139                        (SupplicantState) intent.getExtra(WifiManager.EXTRA_NEW_STATE, -1);
140                assertEquals(SupplicantState.AUTHENTICATING, recvdState);
141                boolean authStatus =
142                        (boolean) intent.getExtra(WifiManager.EXTRA_SUPPLICANT_ERROR, -1);
143                assertEquals(authStatus, false);
144            }
145        };
146        IntentFilter mIntentFilter = new IntentFilter();
147        mIntentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
148        mContext.registerReceiver(wifiBroadcastReceiver, mIntentFilter);
149        mSupplicantStateTracker.sendMessage(WifiMonitor.AUTHENTICATION_FAILURE_EVENT);
150        mSupplicantStateTracker.sendMessage(getSupplicantStateChangeMessage(0, sWifiSsid,
151                sBSSID, SupplicantState.AUTHENTICATING));
152    }
153
154    /**
155     * This test verifies the correct reasonCode for auth failure is sent in Broadcast
156     * intent.
157     */
158    @Test
159    public void testReasonCodeInSupplicantStateChangeIntent() {
160        BroadcastReceiver wifiBroadcastReceiver = new BroadcastReceiver() {
161            @Override
162            public void onReceive(Context context, Intent intent) {
163                String action = intent.getAction();
164                assertTrue(action.equals(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION));
165                SupplicantState recvdState =
166                        (SupplicantState) intent.getExtra(WifiManager.EXTRA_NEW_STATE, -1);
167                assertEquals(SupplicantState.AUTHENTICATING, recvdState);
168                boolean authStatus =
169                        (boolean) intent.getExtra(WifiManager.EXTRA_SUPPLICANT_ERROR, -1);
170                assertEquals(authStatus, false);
171                int reasonCode = (int)
172                        intent.getExtra(WifiManager.EXTRA_SUPPLICANT_ERROR_REASON, -1);
173                assertEquals(reasonCode, WifiManager.ERROR_AUTH_FAILURE_WRONG_PSWD);
174            }
175        };
176        IntentFilter mIntentFilter = new IntentFilter();
177        mIntentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
178        mContext.registerReceiver(wifiBroadcastReceiver, mIntentFilter);
179        mSupplicantStateTracker.sendMessage(WifiMonitor.AUTHENTICATION_FAILURE_EVENT,
180                WifiManager.ERROR_AUTH_FAILURE_WRONG_PSWD, -1);
181        mSupplicantStateTracker.sendMessage(getSupplicantStateChangeMessage(0, sWifiSsid,
182                sBSSID, SupplicantState.AUTHENTICATING));
183    }
184}
185