1d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski/*
2d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski * Copyright (C) 2017 The Android Open Source Project
3d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski *
4d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski * Licensed under the Apache License, Version 2.0 (the "License");
5d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski * you may not use this file except in compliance with the License.
6d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski * You may obtain a copy of the License at
7d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski *
8d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski *      http://www.apache.org/licenses/LICENSE-2.0
9d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski *
10d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski * Unless required by applicable law or agreed to in writing, software
11d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski * distributed under the License is distributed on an "AS IS" BASIS,
12d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski * See the License for the specific language governing permissions and
14d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski * limitations under the License.
15d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski */
16163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Piuspackage com.android.server.wifi.p2p;
17d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
18d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowskiimport static org.junit.Assert.*;
19d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowskiimport static org.mockito.Matchers.*;
20d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowskiimport static org.mockito.Mockito.doAnswer;
21d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowskiimport static org.mockito.Mockito.mock;
22d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowskiimport static org.mockito.Mockito.never;
23d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowskiimport static org.mockito.Mockito.times;
24d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowskiimport static org.mockito.Mockito.verify;
25d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
26d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowskiimport android.app.test.MockAnswerUtil.AnswerWithArguments;
27d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowskiimport android.hardware.wifi.supplicant.V1_0.ISupplicantP2pIfaceCallback;
28d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowskiimport android.hardware.wifi.supplicant.V1_0.WpsConfigMethods;
29d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowskiimport android.net.wifi.WpsInfo;
30d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowskiimport android.net.wifi.p2p.WifiP2pConfig;
31d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowskiimport android.net.wifi.p2p.WifiP2pDevice;
32d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowskiimport android.net.wifi.p2p.WifiP2pGroup;
337f7b374b3e75a929ab0d46426daf9a5e92c2d85bRoshan Piusimport android.net.wifi.p2p.WifiP2pProvDiscEvent;
34c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhneimport android.net.wifi.p2p.nsd.WifiP2pServiceResponse;
35d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
367e9eafab778c3920732a965ca9a0b330c6c676d6Glen Kuhneimport com.android.server.wifi.util.NativeUtil;
377e9eafab778c3920732a965ca9a0b330c6c676d6Glen Kuhne
38d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowskiimport org.junit.Assert.*;
39d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowskiimport org.junit.Before;
40d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowskiimport org.junit.Test;
417f7b374b3e75a929ab0d46426daf9a5e92c2d85bRoshan Piusimport org.mockito.ArgumentCaptor;
42d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowskiimport org.mockito.MockitoAnnotations;
43d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
44d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowskiimport java.util.ArrayList;
45d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowskiimport java.util.HashSet;
46c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhneimport java.util.List;
47c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne
48d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
49d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski/**
50d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski * Unit tests for SupplicantP2pIfaceCallback
51d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski */
52d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowskipublic class SupplicantP2pIfaceCallbackTest {
53d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    private static final String TAG = "SupplicantP2pIfaceCallbackTest";
54d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
55d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    private String mIface = "test_p2p0";
56163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius    private WifiP2pMonitor mMonitor;
57d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    private SupplicantP2pIfaceCallback mDut;
58d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
59d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    private byte[] mDeviceAddressInvalid1 = { 0x00 };
60d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    private byte[] mDeviceAddressInvalid2 = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66 };
61d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    private byte[] mDeviceAddress1Bytes = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55 };
62d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    private String mDeviceAddress1String = "00:11:22:33:44:55";
63d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    private byte[] mDeviceAddress2Bytes = { 0x01, 0x12, 0x23, 0x34, 0x45, 0x56 };
64d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    private String mDeviceAddress2String = "01:12:23:34:45:56";
65d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    private byte[] mDeviceInfoBytes = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 };
667f7b374b3e75a929ab0d46426daf9a5e92c2d85bRoshan Pius    private static final byte[] DEVICE_ADDRESS = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 };
67d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
68d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    private class SupplicantP2pIfaceCallbackSpy extends SupplicantP2pIfaceCallback {
69163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        SupplicantP2pIfaceCallbackSpy(String iface, WifiP2pMonitor monitor) {
70d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski            super(iface, monitor);
71d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        }
72d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    }
73d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
74d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    @Before
75d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    public void setUp() throws Exception {
76d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        MockitoAnnotations.initMocks(this);
77163f9765f9e4c3f868b1e0d630b6adeaa115fb4aRoshan Pius        mMonitor = mock(WifiP2pMonitor.class);
78d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        mDut = new SupplicantP2pIfaceCallbackSpy(mIface, mMonitor);
79d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    }
80d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
81d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    /**
82d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski     * Sunny day scenario for onDeviceFound call.
83d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski     */
84d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    @Test
85d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    public void testOnDeviceFound_success() throws Exception {
865bf1c66cfc5099801abe53fd54cef661740b24b5Glen Kuhne        byte[] fakePrimaryDeviceTypeBytes = { 0x00, 0x01, 0x02, -1, 0x04, 0x05, 0x06, 0x07 };
875bf1c66cfc5099801abe53fd54cef661740b24b5Glen Kuhne        String fakePrimaryDeviceTypeString = "1-02FF0405-1543";
88d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        String fakeDeviceName = "test device name";
89d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        short fakeConfigMethods = 0x1234;
90d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        byte fakeCapabilities = 123;
91d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        int fakeGroupCapabilities = 456;
92d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
93d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        doAnswer(new AnswerWithArguments() {
94d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski            public void answer(String iface, WifiP2pDevice device) {
95d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                // NOTE: mDeviceAddress1Bytes seems to be ignored by
96d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                // legacy implementation of WifiP2pDevice.
97d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                assertEquals(iface, mIface);
98d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                assertEquals(device.deviceName, fakeDeviceName);
99d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                assertEquals(device.primaryDeviceType, fakePrimaryDeviceTypeString);
100d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                assertEquals(device.deviceCapability, fakeCapabilities);
101d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                assertEquals(device.groupCapability, fakeGroupCapabilities);
102d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                assertEquals(device.wpsConfigMethodsSupported, fakeConfigMethods);
103d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                assertEquals(device.deviceAddress, mDeviceAddress2String);
104d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                assertEquals(device.status, WifiP2pDevice.AVAILABLE);
105d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski            }
106d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        })
107d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        .when(mMonitor).broadcastP2pDeviceFound(
108d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                anyString(), any(WifiP2pDevice.class));
109d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
110d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        mDut.onDeviceFound(
111d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                mDeviceAddress1Bytes, mDeviceAddress2Bytes,
112d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                fakePrimaryDeviceTypeBytes,
113d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                fakeDeviceName, fakeConfigMethods,
114d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                fakeCapabilities, fakeGroupCapabilities,
115d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                mDeviceInfoBytes);
116d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
117d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        mDut.onDeviceFound(
118d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                mDeviceAddress1Bytes, mDeviceAddress2Bytes,
119d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                fakePrimaryDeviceTypeBytes,
120d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                fakeDeviceName, fakeConfigMethods,
121d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                fakeCapabilities, fakeGroupCapabilities,
122d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                null);
123d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
124d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        // Make sure we issued a broadcast each time.
125d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        verify(mMonitor, times(2)).broadcastP2pDeviceFound(
126d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                anyString(), any(WifiP2pDevice.class));
127d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    }
128d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
129d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    /**
130d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski     * Failing scenarios for onDeviceFound call.
131d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski     */
132d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    @Test
133d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    public void testOnDeviceFound_invalidArguments() throws Exception {
1345bf1c66cfc5099801abe53fd54cef661740b24b5Glen Kuhne        byte[] fakePrimaryDeviceTypeBytes = { 0x0, 0x01, 0x02, -1, 0x04, 0x05, 0x06, 0x07 };
1355bf1c66cfc5099801abe53fd54cef661740b24b5Glen Kuhne        String fakePrimaryDeviceTypeString = "1-02FF0405-1543";
136d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        String fakeDeviceName = "test device name";
137d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        short fakeConfigMethods = 0x1234;
138d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        byte fakeCapabilities = 123;
139d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        int fakeGroupCapabilities = 456;
140d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
141d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        mDut.onDeviceFound(
142d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                mDeviceAddress2Bytes, null,
143d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                fakePrimaryDeviceTypeBytes,
144d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                fakeDeviceName, fakeConfigMethods,
145d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                fakeCapabilities, fakeGroupCapabilities,
146d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                mDeviceInfoBytes);
147d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        verify(mMonitor, never()).broadcastP2pDeviceFound(
148d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                anyString(), any(WifiP2pDevice.class));
149d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
150d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
151d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        mDut.onDeviceFound(
152d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                mDeviceAddress1Bytes, mDeviceAddress2Bytes,
153d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                null,
154d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                fakeDeviceName, fakeConfigMethods,
155d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                fakeCapabilities, fakeGroupCapabilities,
156d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                mDeviceInfoBytes);
157d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        verify(mMonitor, never()).broadcastP2pDeviceFound(
158d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                anyString(), any(WifiP2pDevice.class));
159d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
160d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
161d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        mDut.onDeviceFound(
162d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                mDeviceAddress1Bytes, mDeviceAddress2Bytes,
163d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                fakePrimaryDeviceTypeBytes,
164d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                null, fakeConfigMethods,
165d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                fakeCapabilities, fakeGroupCapabilities,
166d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                mDeviceInfoBytes);
167d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        verify(mMonitor, never()).broadcastP2pDeviceFound(
168d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                anyString(), any(WifiP2pDevice.class));
169d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
170d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
171d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        mDut.onDeviceFound(
172d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                mDeviceAddress1Bytes, mDeviceAddressInvalid1,
173d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                fakePrimaryDeviceTypeBytes,
174d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                null, fakeConfigMethods,
175d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                fakeCapabilities, fakeGroupCapabilities,
176d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                mDeviceInfoBytes);
177d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        verify(mMonitor, never()).broadcastP2pDeviceFound(
178d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                anyString(), any(WifiP2pDevice.class));
179d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
180d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
181d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        mDut.onDeviceFound(
182d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                mDeviceAddress1Bytes, mDeviceAddressInvalid2,
183d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                fakePrimaryDeviceTypeBytes,
184d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                null, fakeConfigMethods,
185d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                fakeCapabilities, fakeGroupCapabilities,
186d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                mDeviceInfoBytes);
187d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        verify(mMonitor, never()).broadcastP2pDeviceFound(
188d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                anyString(), any(WifiP2pDevice.class));
189d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    }
190d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
191d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    /**
192d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski     * Sunny day scenario for onDeviceLost call.
193d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski     */
194d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    @Test
195d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    public void testOnDeviceLost_success() throws Exception {
196d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        doAnswer(new AnswerWithArguments() {
197d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski            public void answer(String iface, WifiP2pDevice device) {
198d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                assertEquals(iface, mIface);
199d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                assertEquals(device.deviceAddress, mDeviceAddress1String);
200d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                assertEquals(device.status, WifiP2pDevice.UNAVAILABLE);
201d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski            }
202d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        })
203d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        .when(mMonitor).broadcastP2pDeviceLost(
204d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                anyString(), any(WifiP2pDevice.class));
205d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
206d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        mDut.onDeviceLost(mDeviceAddress1Bytes);
207d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
208d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        // Make sure we issued a broadcast each time.
209d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        verify(mMonitor, times(1)).broadcastP2pDeviceLost(
210d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                anyString(), any(WifiP2pDevice.class));
211d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    }
212d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
213d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    /**
214d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski     * Failing scenarios for onDeviceLost call.
215d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski     */
216d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    @Test
217d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    public void testOnDeviceLost_invalidArguments() throws Exception {
218d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        mDut.onDeviceLost(null);
219d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        verify(mMonitor, never()).broadcastP2pDeviceLost(
220d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                anyString(), any(WifiP2pDevice.class));
221d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
222d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        mDut.onDeviceLost(mDeviceAddressInvalid1);
223d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        verify(mMonitor, never()).broadcastP2pDeviceLost(
224d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                anyString(), any(WifiP2pDevice.class));
225d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
226d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        mDut.onDeviceLost(mDeviceAddressInvalid2);
227d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        verify(mMonitor, never()).broadcastP2pDeviceLost(
228d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                anyString(), any(WifiP2pDevice.class));
229d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    }
230d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
231d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    /**
232d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski     * Sunny day scenario for onGoNegotiationRequest call.
233d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski     */
234d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    @Test
235d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    public void testOnGoNegotiationRequest_success() throws Exception {
236d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        HashSet<Integer> setups = new HashSet<Integer>();
237d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
238d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        doAnswer(new AnswerWithArguments() {
239d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski            public void answer(String iface, WifiP2pConfig config) {
240d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                assertEquals(iface, mIface);
241d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                assertNotNull(config.wps);
242d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                setups.add(config.wps.setup);
243d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                assertEquals(config.deviceAddress, mDeviceAddress1String);
244d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski            }
245d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        })
246d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        .when(mMonitor).broadcastP2pGoNegotiationRequest(
247d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                anyString(), any(WifiP2pConfig.class));
248d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
249d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        mDut.onGoNegotiationRequest(mDeviceAddress1Bytes,
250d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                (short)ISupplicantP2pIfaceCallback.WpsDevPasswordId.USER_SPECIFIED);
251d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        assertTrue(setups.contains(WpsInfo.DISPLAY));
252d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
253d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        mDut.onGoNegotiationRequest(mDeviceAddress1Bytes,
254d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                (short)ISupplicantP2pIfaceCallback.WpsDevPasswordId.PUSHBUTTON);
255d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        assertTrue(setups.contains(WpsInfo.PBC));
256d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
257d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        mDut.onGoNegotiationRequest(mDeviceAddress1Bytes,
258d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                (short)ISupplicantP2pIfaceCallback.WpsDevPasswordId.REGISTRAR_SPECIFIED);
259d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        assertTrue(setups.contains(WpsInfo.KEYPAD));
260d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
261d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        // Invalid should default to PBC
262d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        setups.clear();
263d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        mDut.onGoNegotiationRequest(mDeviceAddress1Bytes, (short)0xffff);
264d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        assertTrue(setups.contains(WpsInfo.PBC));
265d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    }
266d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
267d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    /**
268d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski     * Failing scenarios for onGoNegotiationRequest call.
269d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski     */
270d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    @Test
271d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    public void testOnGoNegotiationRequest_invalidArguments() throws Exception {
272d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        mDut.onGoNegotiationRequest(null, (short)0);
273d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        verify(mMonitor, never()).broadcastP2pDeviceLost(
274d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                anyString(), any(WifiP2pDevice.class));
275d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
276d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        mDut.onGoNegotiationRequest(mDeviceAddressInvalid1, (short)0);
277d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        verify(mMonitor, never()).broadcastP2pDeviceLost(
278d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                anyString(), any(WifiP2pDevice.class));
279d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
280d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        mDut.onGoNegotiationRequest(mDeviceAddressInvalid2, (short)0);
281d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        verify(mMonitor, never()).broadcastP2pDeviceLost(
282d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                anyString(), any(WifiP2pDevice.class));
283d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    }
284d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
285d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    /**
286d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski     * Sunny day scenario for onGroupStarted call.
287d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski     */
288d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    @Test
289d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    public void testOnGroupStarted_success() throws Exception {
290d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        String fakeName = "group name";
291d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        String fakePassphrase = "secret";
292d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        ArrayList<Byte> fakeSsidBytesList = new ArrayList<Byte>() {{
293d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski            add((byte)0x30);
294d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski            add((byte)0x31);
295d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski            add((byte)0x32);
296d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski            add((byte)0x33);
297d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        }};
298d5a56317c4697aab6fc8c277ba33dbce6542db79Roshan Pius        String fakeSsidString = "0123";
299d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        HashSet<String> passwords = new HashSet<String>();
300d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
301d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        doAnswer(new AnswerWithArguments() {
302d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski            public void answer(String iface, WifiP2pGroup group) {
303d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                assertEquals(iface, mIface);
304d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                assertNotNull(group.getOwner());
305d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                assertEquals(group.getOwner().deviceAddress, mDeviceAddress1String);
306d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                assertEquals(group.getNetworkId(), WifiP2pGroup.PERSISTENT_NET_ID);
307d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                passwords.add(group.getPassphrase());
308d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                assertEquals(group.getInterface(), fakeName);
309d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                assertEquals(group.getNetworkName(), fakeSsidString);
310d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski            }
311d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        })
312d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        .when(mMonitor).broadcastP2pGroupStarted(
313d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                anyString(), any(WifiP2pGroup.class));
314d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
315d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        mDut.onGroupStarted(
316d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                fakeName, true, fakeSsidBytesList, 1, null, fakePassphrase,
317d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                mDeviceAddress1Bytes, true);
318d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        assertTrue(passwords.contains(fakePassphrase));
319d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
320d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        mDut.onGroupStarted(
321d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                fakeName, true, fakeSsidBytesList, 1, null, null,
322d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                mDeviceAddress1Bytes, true);
323d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        assertTrue(passwords.contains(null));
324d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
325d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        verify(mMonitor, times(2)).broadcastP2pGroupStarted(
326d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                anyString(), any(WifiP2pGroup.class));
327d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    }
328d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
329d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    /**
330d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski     * Failing scenarios for onGroupStarted call.
331d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski     */
332d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    @Test
333d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    public void testOnGroupStarted_invalidArguments() throws Exception {
334d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        String fakeName = "group name";
335d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        String fakePassphrase = "secret";
336d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        ArrayList<Byte> fakeSsidBytesList = new ArrayList<Byte>() {{
337d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski            add((byte)0x30);
338d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski            add((byte)0x31);
339d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski            add((byte)0x32);
340d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski            add((byte)0x33);
341d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        }};
342d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        String fakeSsidString = "0123";
343d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
344d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        mDut.onGroupStarted(
345d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                null, true, fakeSsidBytesList, 1, null, fakePassphrase,
346d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                mDeviceAddress1Bytes, true);
347d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        verify(mMonitor, never()).broadcastP2pGroupStarted(
348d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                anyString(), any(WifiP2pGroup.class));
349d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
350d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        mDut.onGroupStarted(
351d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                fakeName, true, null, 1, null, fakePassphrase,
352d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                mDeviceAddress1Bytes, true);
353d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        verify(mMonitor, never()).broadcastP2pGroupStarted(
354d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                anyString(), any(WifiP2pGroup.class));
355d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
356d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        mDut.onGroupStarted(
357d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                fakeName, true, fakeSsidBytesList, 1, null, fakePassphrase,
358d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                null, true);
359d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski        verify(mMonitor, never()).broadcastP2pGroupStarted(
360d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski                anyString(), any(WifiP2pGroup.class));
361d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski    }
362d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski
3637f7b374b3e75a929ab0d46426daf9a5e92c2d85bRoshan Pius    /**
364c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne     * Test provision discovery callback.
3657f7b374b3e75a929ab0d46426daf9a5e92c2d85bRoshan Pius     */
3667f7b374b3e75a929ab0d46426daf9a5e92c2d85bRoshan Pius    @Test
367c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne    public void testOnProvisionDiscoveryCompleted() throws Exception {
3687f7b374b3e75a929ab0d46426daf9a5e92c2d85bRoshan Pius        byte[] p2pDeviceAddr = DEVICE_ADDRESS;
3697f7b374b3e75a929ab0d46426daf9a5e92c2d85bRoshan Pius        boolean isRequest = false;
3707f7b374b3e75a929ab0d46426daf9a5e92c2d85bRoshan Pius        byte status = ISupplicantP2pIfaceCallback.P2pProvDiscStatusCode.SUCCESS;
3717f7b374b3e75a929ab0d46426daf9a5e92c2d85bRoshan Pius        short configMethods = WpsConfigMethods.DISPLAY;
3727f7b374b3e75a929ab0d46426daf9a5e92c2d85bRoshan Pius        String generatedPin = "12345678";
3737f7b374b3e75a929ab0d46426daf9a5e92c2d85bRoshan Pius
3747f7b374b3e75a929ab0d46426daf9a5e92c2d85bRoshan Pius        ArgumentCaptor<WifiP2pProvDiscEvent> discEventCaptor =
3757f7b374b3e75a929ab0d46426daf9a5e92c2d85bRoshan Pius                ArgumentCaptor.forClass(WifiP2pProvDiscEvent.class);
3767f7b374b3e75a929ab0d46426daf9a5e92c2d85bRoshan Pius        mDut.onProvisionDiscoveryCompleted(
3777f7b374b3e75a929ab0d46426daf9a5e92c2d85bRoshan Pius                p2pDeviceAddr, isRequest, status, configMethods, generatedPin);
3785a843c0d793abf48de2c77e0b1a54fded88bb018Glen Kuhne        verify(mMonitor).broadcastP2pProvisionDiscoveryEnterPin(
3795a843c0d793abf48de2c77e0b1a54fded88bb018Glen Kuhne                anyString(), discEventCaptor.capture());
3805a843c0d793abf48de2c77e0b1a54fded88bb018Glen Kuhne        assertEquals(WifiP2pProvDiscEvent.ENTER_PIN, discEventCaptor.getValue().event);
3815a843c0d793abf48de2c77e0b1a54fded88bb018Glen Kuhne
3825a843c0d793abf48de2c77e0b1a54fded88bb018Glen Kuhne        configMethods = WpsConfigMethods.KEYPAD;
3835a843c0d793abf48de2c77e0b1a54fded88bb018Glen Kuhne        mDut.onProvisionDiscoveryCompleted(
3845a843c0d793abf48de2c77e0b1a54fded88bb018Glen Kuhne                p2pDeviceAddr, isRequest, status, configMethods, generatedPin);
3857f7b374b3e75a929ab0d46426daf9a5e92c2d85bRoshan Pius        verify(mMonitor).broadcastP2pProvisionDiscoveryShowPin(
3867f7b374b3e75a929ab0d46426daf9a5e92c2d85bRoshan Pius                anyString(), discEventCaptor.capture());
3877f7b374b3e75a929ab0d46426daf9a5e92c2d85bRoshan Pius        assertEquals(WifiP2pProvDiscEvent.SHOW_PIN, discEventCaptor.getValue().event);
3887f7b374b3e75a929ab0d46426daf9a5e92c2d85bRoshan Pius        assertEquals(generatedPin, discEventCaptor.getValue().pin);
3897f7b374b3e75a929ab0d46426daf9a5e92c2d85bRoshan Pius
3905a843c0d793abf48de2c77e0b1a54fded88bb018Glen Kuhne        isRequest = true;
3917f7b374b3e75a929ab0d46426daf9a5e92c2d85bRoshan Pius        configMethods = WpsConfigMethods.KEYPAD;
3927f7b374b3e75a929ab0d46426daf9a5e92c2d85bRoshan Pius        mDut.onProvisionDiscoveryCompleted(
3937f7b374b3e75a929ab0d46426daf9a5e92c2d85bRoshan Pius                p2pDeviceAddr, isRequest, status, configMethods, generatedPin);
3945a843c0d793abf48de2c77e0b1a54fded88bb018Glen Kuhne        verify(mMonitor, times(2)).broadcastP2pProvisionDiscoveryEnterPin(
3957f7b374b3e75a929ab0d46426daf9a5e92c2d85bRoshan Pius                anyString(), discEventCaptor.capture());
3967f7b374b3e75a929ab0d46426daf9a5e92c2d85bRoshan Pius        assertEquals(WifiP2pProvDiscEvent.ENTER_PIN, discEventCaptor.getValue().event);
3977f7b374b3e75a929ab0d46426daf9a5e92c2d85bRoshan Pius
3985a843c0d793abf48de2c77e0b1a54fded88bb018Glen Kuhne        configMethods = WpsConfigMethods.DISPLAY;
3995a843c0d793abf48de2c77e0b1a54fded88bb018Glen Kuhne        mDut.onProvisionDiscoveryCompleted(
4005a843c0d793abf48de2c77e0b1a54fded88bb018Glen Kuhne                p2pDeviceAddr, isRequest, status, configMethods, generatedPin);
4015a843c0d793abf48de2c77e0b1a54fded88bb018Glen Kuhne        verify(mMonitor, times(2)).broadcastP2pProvisionDiscoveryShowPin(
4025a843c0d793abf48de2c77e0b1a54fded88bb018Glen Kuhne                anyString(), discEventCaptor.capture());
4035a843c0d793abf48de2c77e0b1a54fded88bb018Glen Kuhne        assertEquals(WifiP2pProvDiscEvent.SHOW_PIN, discEventCaptor.getValue().event);
4045a843c0d793abf48de2c77e0b1a54fded88bb018Glen Kuhne        assertEquals(generatedPin, discEventCaptor.getValue().pin);
4055a843c0d793abf48de2c77e0b1a54fded88bb018Glen Kuhne
4065a843c0d793abf48de2c77e0b1a54fded88bb018Glen Kuhne        isRequest = false;
4077f7b374b3e75a929ab0d46426daf9a5e92c2d85bRoshan Pius        configMethods = WpsConfigMethods.PUSHBUTTON;
4087f7b374b3e75a929ab0d46426daf9a5e92c2d85bRoshan Pius        mDut.onProvisionDiscoveryCompleted(
4097f7b374b3e75a929ab0d46426daf9a5e92c2d85bRoshan Pius                p2pDeviceAddr, isRequest, status, configMethods, generatedPin);
4107f7b374b3e75a929ab0d46426daf9a5e92c2d85bRoshan Pius        verify(mMonitor).broadcastP2pProvisionDiscoveryPbcResponse(
4117f7b374b3e75a929ab0d46426daf9a5e92c2d85bRoshan Pius                anyString(), discEventCaptor.capture());
4127f7b374b3e75a929ab0d46426daf9a5e92c2d85bRoshan Pius        assertEquals(WifiP2pProvDiscEvent.PBC_RSP, discEventCaptor.getValue().event);
4137f7b374b3e75a929ab0d46426daf9a5e92c2d85bRoshan Pius
4147f7b374b3e75a929ab0d46426daf9a5e92c2d85bRoshan Pius        isRequest = true;
4157f7b374b3e75a929ab0d46426daf9a5e92c2d85bRoshan Pius        mDut.onProvisionDiscoveryCompleted(
4167f7b374b3e75a929ab0d46426daf9a5e92c2d85bRoshan Pius                p2pDeviceAddr, isRequest, status, configMethods, generatedPin);
4177f7b374b3e75a929ab0d46426daf9a5e92c2d85bRoshan Pius        verify(mMonitor).broadcastP2pProvisionDiscoveryPbcRequest(
4187f7b374b3e75a929ab0d46426daf9a5e92c2d85bRoshan Pius                anyString(), discEventCaptor.capture());
4197f7b374b3e75a929ab0d46426daf9a5e92c2d85bRoshan Pius        assertEquals(WifiP2pProvDiscEvent.PBC_REQ, discEventCaptor.getValue().event);
4207f7b374b3e75a929ab0d46426daf9a5e92c2d85bRoshan Pius    }
4217e9eafab778c3920732a965ca9a0b330c6c676d6Glen Kuhne
4227e9eafab778c3920732a965ca9a0b330c6c676d6Glen Kuhne    /**
4237e9eafab778c3920732a965ca9a0b330c6c676d6Glen Kuhne     * Test staAuth with device address, should trigger ApStaConnected broadcast
4247e9eafab778c3920732a965ca9a0b330c6c676d6Glen Kuhne     */
4257e9eafab778c3920732a965ca9a0b330c6c676d6Glen Kuhne    @Test
4267e9eafab778c3920732a965ca9a0b330c6c676d6Glen Kuhne    public void testStaAuth_success() {
4277e9eafab778c3920732a965ca9a0b330c6c676d6Glen Kuhne        // Trigger onStaAuthorized callback, ensure wifimonitor broadcast is sent with WifiP2pDevice
4287e9eafab778c3920732a965ca9a0b330c6c676d6Glen Kuhne        // using the p2pDeviceAddress
4297e9eafab778c3920732a965ca9a0b330c6c676d6Glen Kuhne        ArgumentCaptor<WifiP2pDevice> p2pDeviceCaptor =
4307e9eafab778c3920732a965ca9a0b330c6c676d6Glen Kuhne                ArgumentCaptor.forClass(WifiP2pDevice.class);
4317e9eafab778c3920732a965ca9a0b330c6c676d6Glen Kuhne        mDut.onStaAuthorized(mDeviceAddress1Bytes, mDeviceAddress2Bytes);
4327e9eafab778c3920732a965ca9a0b330c6c676d6Glen Kuhne        verify(mMonitor).broadcastP2pApStaConnected(any(String.class), p2pDeviceCaptor.capture());
4337e9eafab778c3920732a965ca9a0b330c6c676d6Glen Kuhne        assertEquals(mDeviceAddress2String, p2pDeviceCaptor.getValue().deviceAddress);
4347e9eafab778c3920732a965ca9a0b330c6c676d6Glen Kuhne    }
4357e9eafab778c3920732a965ca9a0b330c6c676d6Glen Kuhne
4367e9eafab778c3920732a965ca9a0b330c6c676d6Glen Kuhne    /**
4377e9eafab778c3920732a965ca9a0b330c6c676d6Glen Kuhne     * Test staAuth without device address, should trigger ApStaConnected broadcast using srcAddress
4387e9eafab778c3920732a965ca9a0b330c6c676d6Glen Kuhne     */
4397e9eafab778c3920732a965ca9a0b330c6c676d6Glen Kuhne    @Test
4407e9eafab778c3920732a965ca9a0b330c6c676d6Glen Kuhne    public void testStaAuth_noDeviceAddress_success() {
4417e9eafab778c3920732a965ca9a0b330c6c676d6Glen Kuhne        // Trigger onStaAuthorized callback, using a zero'd p2pDeviceAddress, ensure wifimonitor
4427e9eafab778c3920732a965ca9a0b330c6c676d6Glen Kuhne        // broadcast is sent with WifiP2pDevice using the srcAddress
4437e9eafab778c3920732a965ca9a0b330c6c676d6Glen Kuhne        ArgumentCaptor<WifiP2pDevice> p2pDeviceCaptor =
4447e9eafab778c3920732a965ca9a0b330c6c676d6Glen Kuhne                ArgumentCaptor.forClass(WifiP2pDevice.class);
4457e9eafab778c3920732a965ca9a0b330c6c676d6Glen Kuhne        mDut.onStaAuthorized(mDeviceAddress1Bytes, NativeUtil.ANY_MAC_BYTES);
4467e9eafab778c3920732a965ca9a0b330c6c676d6Glen Kuhne        verify(mMonitor).broadcastP2pApStaConnected(any(String.class), p2pDeviceCaptor.capture());
4477e9eafab778c3920732a965ca9a0b330c6c676d6Glen Kuhne        assertEquals(mDeviceAddress1String, p2pDeviceCaptor.getValue().deviceAddress);
4487e9eafab778c3920732a965ca9a0b330c6c676d6Glen Kuhne    }
449c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne
450c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne    // TLVS hex data encoded as a hex string.
451c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne    // Taken directly from an observed supplicant service response event
452c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne    private static final String SERV_DISC_RESP_TLVS = "1d00010100076578616d706c650b5f6166706f766572"
453c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne            + "746370c00c001001001e000101000b5f6166706f766572746370c00c000c01074578616d706c65c0273c"
454c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne            + "00010100096d797072696e746572045f697070c00c00100109747874766572733d311a70646c3d617070"
455c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne            + "6c69636174696f6e2f706f73747363726970741900010100045f697070c00c000c01094d795072696e74"
456c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne            + "6572c0275f000201000a757569643a36383539646564652d383537342d353961622d393333322d313233"
457c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne            + "3435363738393031313a3a75726e3a736368656d61732d75706e702d6f72673a736572766963653a436f"
458c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne            + "6e6e656374696f6e4d616e616765723a3159000201000a757569643a36383539646564652d383537342d"
459c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne            + "353961622d393333322d3132333435363738393031313a3a75726e3a736368656d61732d75706e702d6f"
460c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne            + "72673a736572766963653a41565472616e73706f72743a315a000201000a757569643a36383539646564"
461c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne            + "652d383537342d353961622d393333322d3132333435363738393031313a3a75726e3a736368656d6173"
462c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne            + "2d75706e702d6f72673a6465766963653a4d6564696152656e64657265723a313e000201000a75756964"
463c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne            + "3a36383539646564652d383537342d353961622d393333322d3132333435363738393031313a3a75706e"
464c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne            + "703a726f6f746465766963652d000201000a757569643a36383539646564652d383537342d353961622d"
465c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne            + "393333322d313233343536373839303131";
466c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne
467c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne    /**
468c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne     * Pretty basic onServiceDiscoveryResponse callback test.
469c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne     * Mocks the callback event, passing some observed real data to it, and ensures that it returns
470c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne     * a non-null WifiP2pServiceResponse list.
471c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne     */
472c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne    @Test
473c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne    public void testOnServiceDiscoveryResponseCompleted_success() throws Exception {
474c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne        ArrayList<Byte> tlvs = NativeUtil.byteArrayToArrayList(hexStr2Bin(SERV_DISC_RESP_TLVS));
475c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne        ArgumentCaptor<List<WifiP2pServiceResponse>> respListCaptor =
476c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne                ArgumentCaptor.forClass(List.class);
477c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne        mDut.onServiceDiscoveryResponse(
478c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne                mDeviceAddress1Bytes,
479c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne                (short) 10 /* unused updateIndicator value */,
480c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne                tlvs);
481c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne        verify(mMonitor).broadcastP2pServiceDiscoveryResponse(anyString(),
482c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne                respListCaptor.capture());
483c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne        assertNotNull(respListCaptor.getValue());
484c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne    }
485c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne
486c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne    /**
487c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne     * Converts hex string to byte array.
488c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne     *
489c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne     * @param hex hex string. if invalid, return null.
490c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne     * @return binary data.
491c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne     */
492c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne    private static byte[] hexStr2Bin(String hex) {
493c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne        int sz = hex.length() / 2;
494c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne        byte[] b = new byte[hex.length() / 2];
495c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne        for (int i = 0; i < sz; i++) {
496c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne            try {
497c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne                b[i] = (byte) Integer.parseInt(hex.substring(i * 2, i * 2 + 2), 16);
498c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne            } catch (Exception e) {
499c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne                return null;
500c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne            }
501c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne        }
502c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne        return b;
503c5f4b2597df6284d35d2f3af8fb35f72e140c5a7Glen Kuhne    }
504d3c761e72a5f89c81bd74889a9fec663adcc491eTomasz Wiszkowski}
505