1c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang/*
2c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang * Copyright (C) 2016 The Android Open Source Project
3c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang *
4c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang * Licensed under the Apache License, Version 2.0 (the "License");
5c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang * you may not use this file except in compliance with the License.
6c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang * You may obtain a copy of the License at
7c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang *
8c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang *      http://www.apache.org/licenses/LICENSE-2.0
9c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang *
10c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang * Unless required by applicable law or agreed to in writing, software
11c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang * distributed under the License is distributed on an "AS IS" BASIS,
12c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang * See the License for the specific language governing permissions and
14c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang * limitations under the License.
15c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang */
16c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang
17a8367288377cbaed6371256ca837b7aa22280706Mitchell Willspackage android.net.wifi;
18c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang
19c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wangimport static org.junit.Assert.assertEquals;
20c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wangimport static org.mockito.Matchers.anyString;
21c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wangimport static org.mockito.Matchers.eq;
22c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wangimport static org.mockito.Mockito.atLeastOnce;
23c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wangimport static org.mockito.Mockito.mock;
24c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wangimport static org.mockito.Mockito.validateMockitoUsage;
25c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wangimport static org.mockito.Mockito.verify;
26c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wangimport static org.mockito.Mockito.when;
27c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang
28c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wangimport android.content.Context;
29c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wangimport android.net.wifi.WifiScanner.BssidInfo;
30c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wangimport android.net.wifi.WifiScanner.BssidListener;
31c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wangimport android.os.Handler;
32c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wangimport android.os.Message;
33c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wangimport android.test.suitebuilder.annotation.SmallTest;
34c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang
35a8367288377cbaed6371256ca837b7aa22280706Mitchell Willsimport com.android.server.wifi.BidirectionalAsyncChannelServer;
36a8367288377cbaed6371256ca837b7aa22280706Mitchell Willsimport com.android.server.wifi.MockLooper;
37a8367288377cbaed6371256ca837b7aa22280706Mitchell Wills
38c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wangimport org.junit.After;
39c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wangimport org.junit.Before;
40c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wangimport org.junit.Test;
41c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wangimport org.mockito.ArgumentCaptor;
42c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wangimport org.mockito.Mock;
43c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wangimport org.mockito.MockitoAnnotations;
44c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang
45c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang/**
46a8367288377cbaed6371256ca837b7aa22280706Mitchell Wills * Unit tests for {@link android.net.wifi.WifiScanner}.
47c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang */
48c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang@SmallTest
49c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wangpublic class WifiScannerTest {
50c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang    @Mock
51c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang    private Context mContext;
52c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang    @Mock
53c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang    private IWifiScanner mService;
54c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang    @Mock
55c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang    private BssidListener mBssidListener;
56c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang
57c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang    private WifiScanner mWifiScanner;
58c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang    private MockLooper mLooper;
59c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang    private Handler mHandler;
60c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang
61c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang    /**
62c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang     * Setup before tests.
63c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang     */
64c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang    @Before
65c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang    public void setUp() throws Exception {
66c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang        MockitoAnnotations.initMocks(this);
67c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang        mLooper = new MockLooper();
68c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang        mHandler = mock(Handler.class);
69c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang        BidirectionalAsyncChannelServer server = new BidirectionalAsyncChannelServer(
70c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang                mContext, mLooper.getLooper(), mHandler);
71c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang        when(mService.getMessenger()).thenReturn(server.getMessenger());
725ccc0a429dfea8ef452f8f63454b013983eb87feMitchell Wills        mWifiScanner = new WifiScanner(mContext, mService, mLooper.getLooper());
73c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang        mLooper.dispatchAll();
74c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang    }
75c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang
76c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang    /**
77c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang     * Clean up after tests.
78c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang     */
79c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang    @After
80c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang    public void cleanup() {
81c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang        validateMockitoUsage();
82c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang    }
83c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang
84c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang    private void verifySetHotlistMessage(Handler handler) {
85c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang        ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class);
86c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang        verify(handler, atLeastOnce()).handleMessage(messageCaptor.capture());
87c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang        assertEquals("message.what is not CMD_SET_HOTLIST",
88c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang                WifiScanner.CMD_SET_HOTLIST,
89c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang                messageCaptor.getValue().what);
90c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang    }
91c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang
92c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang    /**
93c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang     * Test duplicate listeners for bssid tracking.
94c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang     */
95c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang    @Test
96c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang    public void testStartTrackingBssidsDuplicateListeners() throws Exception {
97c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang        BssidInfo[] bssids = new BssidInfo[] {
98c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang                new BssidInfo()
99c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang        };
100c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang
101c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang        // First start tracking succeeds.
102c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang        mWifiScanner.startTrackingBssids(bssids, -100, mBssidListener);
103c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang        mLooper.dispatchAll();
104c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang        verifySetHotlistMessage(mHandler);
105c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang
106c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang        // Second start tracking should fail.
107c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang        mWifiScanner.startTrackingBssids(bssids, -100, mBssidListener);
108c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang        mLooper.dispatchAll();
109c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang        verify(mBssidListener).onFailure(eq(WifiScanner.REASON_DUPLICATE_REQEUST), anyString());
110c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang    }
111c3b22ef2e6bbccd048e1012160b75d14353ab894Wei Wang}
112