blob: 9a7a3a3a1a9d0861feb10ea8feb6e800f5c0a051 [file] [log] [blame]
/*
* Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.server.wifi.p2p;
import static android.net.NetworkInfo.DetailedState.CONNECTING;
import static android.net.NetworkInfo.DetailedState.FAILED;
import static android.net.NetworkInfo.DetailedState.IDLE;
import static android.net.wifi.WifiManager.EXTRA_PARAM_KEY_ATTRIBUTION_SOURCE;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
import static com.android.net.module.util.Inet4AddressUtils.inet4AddressToIntHTL;
import static com.android.server.wifi.WifiSettingsConfigStore.WIFI_P2P_DEVICE_ADDRESS;
import static com.android.server.wifi.WifiSettingsConfigStore.WIFI_P2P_DEVICE_NAME;
import static com.android.server.wifi.WifiSettingsConfigStore.WIFI_P2P_PENDING_FACTORY_RESET;
import static com.android.server.wifi.WifiSettingsConfigStore.WIFI_VERBOSE_LOGGING_ENABLED;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertThrows;
import static org.junit.Assert.assertTrue;
import static org.junit.Assume.assumeFalse;
import static org.junit.Assume.assumeTrue;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyLong;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.eq;
import static org.mockito.Matchers.isNull;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.lenient;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.annotation.Nullable;
import android.app.AlarmManager;
import android.app.AlertDialog;
import android.app.BroadcastOptions;
import android.app.test.MockAnswerUtil;
import android.app.test.MockAnswerUtil.AnswerWithArguments;
import android.content.AttributionSource;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.location.LocationManager;
import android.net.ConnectivityManager;
import android.net.InetAddresses;
import android.net.MacAddress;
import android.net.NetworkInfo;
import android.net.TetheringInterface;
import android.net.TetheringManager;
import android.net.wifi.CoexUnsafeChannel;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiScanner;
import android.net.wifi.WpsInfo;
import android.net.wifi.p2p.WifiP2pConfig;
import android.net.wifi.p2p.WifiP2pDevice;
import android.net.wifi.p2p.WifiP2pDeviceList;
import android.net.wifi.p2p.WifiP2pGroup;
import android.net.wifi.p2p.WifiP2pGroupList;
import android.net.wifi.p2p.WifiP2pInfo;
import android.net.wifi.p2p.WifiP2pManager;
import android.net.wifi.p2p.WifiP2pProvDiscEvent;
import android.net.wifi.p2p.WifiP2pWfdInfo;
import android.net.wifi.p2p.nsd.WifiP2pServiceInfo;
import android.net.wifi.p2p.nsd.WifiP2pServiceRequest;
import android.os.Binder;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
import android.os.Messenger;
import android.os.Process;
import android.os.UserHandle;
import android.os.UserManager;
import android.os.WorkSource;
import android.os.test.TestLooper;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.ArraySet;
import android.view.Display;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.TextView;
import androidx.test.filters.SmallTest;
import com.android.internal.util.AsyncChannel;
import com.android.internal.util.State;
import com.android.internal.util.StateMachine;
import com.android.modules.utils.build.SdkLevel;
import com.android.server.wifi.Clock;
import com.android.server.wifi.DeviceConfigFacade;
import com.android.server.wifi.FakeWifiLog;
import com.android.server.wifi.FrameworkFacade;
import com.android.server.wifi.HalDeviceManager;
import com.android.server.wifi.InterfaceConflictManager;
import com.android.server.wifi.WifiBaseTest;
import com.android.server.wifi.WifiDialogManager;
import com.android.server.wifi.WifiGlobals;
import com.android.server.wifi.WifiInjector;
import com.android.server.wifi.WifiSettingsConfigStore;
import com.android.server.wifi.coex.CoexManager;
import com.android.server.wifi.proto.nano.WifiMetricsProto;
import com.android.server.wifi.proto.nano.WifiMetricsProto.P2pConnectionEvent;
import com.android.server.wifi.util.LastCallerInfoManager;
import com.android.server.wifi.util.NetdWrapper;
import com.android.server.wifi.util.StringUtil;
import com.android.server.wifi.util.WaitingState;
import com.android.server.wifi.util.WifiPermissionsUtil;
import com.android.server.wifi.util.WifiPermissionsWrapper;
import com.android.wifi.resources.R;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.ArgumentMatcher;
import org.mockito.InOrder;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.MockitoSession;
import org.mockito.Spy;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.concurrent.Executor;
/**
* Unit test harness for WifiP2pServiceImpl.
*/
@SmallTest
public class WifiP2pServiceImplTest extends WifiBaseTest {
private static final String TAG = "WifiP2pServiceImplTest";
private static final String IFACE_NAME_P2P = "mockP2p0";
private static final String P2P_GO_IP = "192.168.49.1";
private static final long STATE_CHANGE_WAITING_TIME = 1000;
private static final String thisDeviceMac = "11:22:33:44:55:66";
private static final String thisDeviceName = "thisDeviceName";
private static final String ANONYMIZED_DEVICE_ADDRESS = "02:00:00:00:00:00";
private static final String TEST_PACKAGE_NAME = "com.p2p.test";
private static final String TEST_ANDROID_ID = "314Deadbeef";
private static final String[] TEST_REQUIRED_PERMISSIONS_T =
new String[] {
android.Manifest.permission.NEARBY_WIFI_DEVICES,
android.Manifest.permission.ACCESS_WIFI_STATE
};
private static final String[] TEST_EXCLUDED_PERMISSIONS_T =
new String[] {
android.Manifest.permission.ACCESS_FINE_LOCATION
};
private static final int TEST_GROUP_FREQUENCY = 5180;
private static final int P2P_INVITATION_RECEIVED_TIMEOUT_MS = 5180;
private static final int P2P_PEER_AUTH_TIMEOUT_MS = 1000;
private static final int P2P_EXT_LISTEN_PERIOD_MS = 250;
private static final int P2P_EXT_LISTEN_INTERVAL_MS = 450;
private ArgumentCaptor<BroadcastReceiver> mBcastRxCaptor = ArgumentCaptor.forClass(
BroadcastReceiver.class);
private ArgumentCaptor<WorkSource> mWsCaptor = ArgumentCaptor.forClass(WorkSource.class);
private Binder mClient1;
private Binder mClient2;
private BroadcastReceiver mLocationModeReceiver;
private BroadcastReceiver mWifiStateChangedReceiver;
private BroadcastReceiver mTetherStateReceiver;
private BroadcastReceiver mUserRestrictionReceiver;
private Handler mClientHandler;
private Messenger mP2pStateMachineMessenger;
private Messenger mClientMessenger;
private WifiP2pServiceImpl mWifiP2pServiceImpl;
private TestLooper mClientHanderLooper;
private TestLooper mLooper;
private MacAddress mTestWifiP2pPeerAddress;
private WifiP2pConfig mTestWifiP2pPeerConfig;
private WifiP2pConfig mTestWifiP2pFastConnectionConfig;
private WifiP2pConfig mTestWifiP2pJoinExistingGroupConfig;
private WifiP2pGroup mTestWifiP2pNewPersistentGoGroup;
private WifiP2pGroup mTestWifiP2pGroup;
private WifiP2pDevice mTestWifiP2pDevice;
private WifiP2pGroupList mGroups = new WifiP2pGroupList(null, null);
private WifiP2pDevice mTestThisDevice;
private ArgumentCaptor<Message> mMessageCaptor = ArgumentCaptor.forClass(Message.class);
private MockitoSession mStaticMockSession = null;
private Bundle mAttribution = new Bundle();
private ArgumentCaptor<TetheringManager.TetheringEventCallback> mTetheringEventCallbackCaptor =
ArgumentCaptor.forClass(TetheringManager.TetheringEventCallback.class);
private TetheringManager.TetheringEventCallback mTetheringEventCallback;
@Mock Bundle mBundle;
@Mock Context mContext;
@Mock FrameworkFacade mFrameworkFacade;
@Mock HandlerThread mHandlerThread;
@Mock NetdWrapper mNetdWrapper;
@Mock PackageManager mPackageManager;
@Mock Resources mResources;
@Mock Configuration mConfiguration;
@Mock NetworkInterface mP2pNetworkInterface;
@Mock WifiInjector mWifiInjector;
@Mock BroadcastOptions mBroadcastOptions;
@Mock WifiManager mMockWifiManager;
@Mock WifiPermissionsUtil mWifiPermissionsUtil;
@Mock WifiSettingsConfigStore mWifiSettingsConfigStore;
@Mock WifiPermissionsWrapper mWifiPermissionsWrapper;
@Mock WifiP2pNative mWifiNative;
@Mock WifiP2pServiceInfo mTestWifiP2pServiceInfo;
@Mock WifiP2pServiceRequest mTestWifiP2pServiceRequest;
@Mock UserManager mUserManager;
@Mock WifiP2pMetrics mWifiP2pMetrics;
@Mock WifiManager mWifiManager;
@Mock WifiInfo mWifiInfo;
@Mock CoexManager mCoexManager;
@Spy FakeWifiLog mLog;
@Spy MockWifiP2pMonitor mWifiMonitor;
@Mock WifiGlobals mWifiGlobals;
@Mock AlarmManager mAlarmManager;
@Mock WifiDialogManager mWifiDialogManager;
@Mock WifiDialogManager.DialogHandle mDialogHandle;
@Mock InterfaceConflictManager mInterfaceConflictManager;
@Mock Clock mClock;
@Mock LayoutInflater mLayoutInflater;
@Mock View mView;
@Mock AlertDialog.Builder mAlertDialogBuilder;
@Mock AlertDialog mAlertDialog;
@Mock AsyncChannel mAsyncChannel;
@Mock LastCallerInfoManager mLastCallerInfoManager;
CoexManager.CoexListener mCoexListener;
@Mock DeviceConfigFacade mDeviceConfigFacade;
@Mock TetheringManager mTetheringManager;
private void generatorTestData() {
mTestWifiP2pGroup = new WifiP2pGroup();
mTestWifiP2pGroup.setNetworkName("TestGroupName");
mTestWifiP2pDevice = spy(new WifiP2pDevice());
mTestWifiP2pDevice.deviceName = "TestDeviceName";
mTestWifiP2pDevice.deviceAddress = "aa:bb:cc:dd:ee:ff";
mTestWifiP2pPeerAddress = MacAddress.fromString(mTestWifiP2pDevice.deviceAddress);
// for general connect command
mTestWifiP2pPeerConfig = new WifiP2pConfig();
mTestWifiP2pPeerConfig.deviceAddress = mTestWifiP2pDevice.deviceAddress;
// for config with join existing group flag set to true
mTestWifiP2pJoinExistingGroupConfig = new WifiP2pConfig.Builder()
.setDeviceAddress(MacAddress.fromString((mTestWifiP2pDevice.deviceAddress)))
.setJoinExistingGroup(true)
.build();
// for fast-connection connect command
mTestWifiP2pFastConnectionConfig = new WifiP2pConfig.Builder()
.setNetworkName("DIRECT-XY-HELLO")
.setPassphrase("DEADBEEF")
.build();
// for general group started event
mTestWifiP2pNewPersistentGoGroup = new WifiP2pGroup();
mTestWifiP2pNewPersistentGoGroup.setNetworkId(WifiP2pGroup.NETWORK_ID_PERSISTENT);
mTestWifiP2pNewPersistentGoGroup.setNetworkName("DIRECT-xy-NEW");
mTestWifiP2pNewPersistentGoGroup.setOwner(new WifiP2pDevice(thisDeviceMac));
mTestWifiP2pNewPersistentGoGroup.setIsGroupOwner(true);
mTestWifiP2pNewPersistentGoGroup.setInterface(IFACE_NAME_P2P);
mGroups.clear();
WifiP2pGroup group1 = new WifiP2pGroup();
group1.setNetworkId(0);
group1.setNetworkName(mTestWifiP2pGroup.getNetworkName());
group1.setOwner(mTestWifiP2pDevice);
group1.setIsGroupOwner(false);
mGroups.add(group1);
WifiP2pGroup group2 = new WifiP2pGroup();
group2.setNetworkId(1);
group2.setNetworkName("DIRECT-ab-Hello");
group2.setOwner(new WifiP2pDevice("12:34:56:78:90:ab"));
group2.setIsGroupOwner(false);
mGroups.add(group2);
WifiP2pGroup group3 = new WifiP2pGroup();
group3.setNetworkId(2);
group3.setNetworkName("DIRECT-cd-OWNER");
group3.setOwner(new WifiP2pDevice(thisDeviceMac));
group3.setIsGroupOwner(true);
mGroups.add(group3);
mTestThisDevice = new WifiP2pDevice();
mTestThisDevice.deviceName = thisDeviceName;
mTestThisDevice.deviceAddress = thisDeviceMac;
mTestThisDevice.primaryDeviceType = "10-0050F204-5";
}
/**
* Simulate Location Mode change: Changes the location manager return values and dispatches a
* broadcast.
*
* @param isLocationModeEnabled whether the location mode is enabled.,
*/
private void simulateLocationModeChange(boolean isLocationModeEnabled) {
when(mWifiPermissionsUtil.isLocationModeEnabled()).thenReturn(isLocationModeEnabled);
Intent intent = new Intent(LocationManager.MODE_CHANGED_ACTION);
mLocationModeReceiver.onReceive(mContext, intent);
}
/**
* Simulate Wi-Fi state change: broadcast state change and modify the API return value.
*
* @param isWifiOn whether the wifi mode is enabled.
*/
private void simulateWifiStateChange(boolean isWifiOn) {
when(mMockWifiManager.getWifiState()).thenReturn(
isWifiOn ? WifiManager.WIFI_STATE_ENABLED : WifiManager.WIFI_STATE_DISABLED);
Intent intent = new Intent(WifiManager.WIFI_STATE_CHANGED_ACTION);
intent.putExtra(WifiManager.EXTRA_WIFI_STATE,
isWifiOn ? WifiManager.WIFI_STATE_ENABLED : WifiManager.WIFI_STATE_DISABLED);
mWifiStateChangedReceiver.onReceive(mContext, intent);
}
/**
* Simulate DISALLOW_WIFI_DIRECT user restriction change.
*
* @param isWifiDirectDisallowed whether user restriction is set.
*/
private void simulateUserRestrictionChange(boolean isWifiDirectDisallowed) {
when(mBundle.getBoolean(UserManager.DISALLOW_WIFI_DIRECT))
.thenReturn(isWifiDirectDisallowed);
Intent intent = new Intent(UserManager.ACTION_USER_RESTRICTIONS_CHANGED);
mUserRestrictionReceiver.onReceive(mContext, intent);
}
/**
* Simulate tethering flow is completed
*/
private void simulateTetherReady() throws Exception {
if (!SdkLevel.isAtLeastS()) {
ArrayList<String> availableList = new ArrayList<>();
ArrayList<String> localOnlyList = new ArrayList<>();
localOnlyList.add(IFACE_NAME_P2P);
ArrayList<String> tetherList = new ArrayList<>();
ArrayList<String> erroredList = new ArrayList<>();
Intent intent = new Intent(TetheringManager.ACTION_TETHER_STATE_CHANGED);
intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);
intent.putStringArrayListExtra(TetheringManager.EXTRA_AVAILABLE_TETHER, availableList);
intent.putStringArrayListExtra(TetheringManager.EXTRA_ACTIVE_LOCAL_ONLY, localOnlyList);
intent.putStringArrayListExtra(TetheringManager.EXTRA_ACTIVE_TETHER, tetherList);
intent.putStringArrayListExtra(TetheringManager.EXTRA_ERRORED_TETHER, erroredList);
mTetherStateReceiver.onReceive(mContext, intent);
mLooper.dispatchAll();
} else {
mTetheringEventCallback.onLocalOnlyInterfacesChanged(Collections.unmodifiableSet(
(new ArraySet(new TetheringInterface[]{
new TetheringInterface(TetheringManager.TETHERING_WIFI_P2P,
IFACE_NAME_P2P)}))));
mLooper.dispatchAll();
}
}
/**
* Mock send WifiP2pManager.UPDATE_CHANNEL_INFO
*
* @param pkgName package name used for p2p channel init
* @param featureId The feature in the package
* @param binder client binder used for p2p channel init
* @param replyMessenger for checking replied message.
*/
private void sendChannelInfoUpdateMsg(String pkgName, @Nullable String featureId,
Binder binder, Messenger replyMessenger) throws Exception {
Message msg = Message.obtain();
msg.what = WifiP2pManager.UPDATE_CHANNEL_INFO;
Bundle bundle = new Bundle();
bundle.putString(WifiP2pManager.CALLING_PACKAGE, pkgName);
bundle.putString(WifiP2pManager.CALLING_FEATURE_ID, featureId);
bundle.putBinder(WifiP2pManager.CALLING_BINDER, binder);
if (SdkLevel.isAtLeastS()) {
msg.obj = new AttributionSource(1000, TEST_PACKAGE_NAME, null);
}
msg.getData().putBundle(WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE, bundle);
msg.replyTo = replyMessenger;
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
}
/**
* Mock send WifiP2pManager.ADD_LOCAL_SERVICE with mTestWifiP2pServiceInfo
*
* @param replyMessenger for checking replied message.
*/
private void sendAddLocalServiceMsg(Messenger replyMessenger) throws Exception {
Message msg = Message.obtain();
Bundle extras = new Bundle();
extras.putParcelable(WifiP2pManager.EXTRA_PARAM_KEY_SERVICE_INFO, mTestWifiP2pServiceInfo);
msg.what = WifiP2pManager.ADD_LOCAL_SERVICE;
if (SdkLevel.isAtLeastS()) {
msg.obj = new AttributionSource(1000, TEST_PACKAGE_NAME, null);
}
msg.getData().putBundle(WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE, extras);
msg.replyTo = replyMessenger;
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
}
/**
* Mock send WifiP2pManager.CONNECT with ConfigValidAsGroup
*
* @param replyMessenger for checking replied message.
*/
private void sendConnectMsgWithConfigValidAsGroup(Messenger replyMessenger) throws Exception {
sendConnectMsg(replyMessenger, mTestWifiP2pFastConnectionConfig);
}
/**
* Mock send WifiP2pManager.CREATE_GROUP with ConfigValidAsGroup
*
* @param replyMessenger for checking replied message.
*/
private void sendCreateGroupMsgWithConfigValidAsGroup(Messenger replyMessenger)
throws Exception {
sendCreateGroupMsg(replyMessenger, 0, mTestWifiP2pFastConnectionConfig);
}
/**
* Mock send WifiP2pManager.DISCOVER_PEERS
*
* @param replyMessenger for checking replied message.
*/
private void sendDiscoverPeersMsg(Messenger replyMessenger) throws Exception {
sendDiscoverPeersMsg(
replyMessenger, WifiP2pManager.WIFI_P2P_SCAN_FULL,
WifiP2pManager.WIFI_P2P_SCAN_FREQ_UNSPECIFIED);
}
/**
* Mock send WifiP2pManager.DISCOVER_PEERS
*
* @param replyMessenger for checking replied message.
* @param type indicates what channels to scan.
* @param frequencyMhz is the frequency to be scanned.
*/
private void sendDiscoverPeersMsg(
Messenger replyMessenger, @WifiP2pManager.WifiP2pScanType int type,
int frequencyMhz) throws Exception {
Message msg = Message.obtain();
Bundle extras = new Bundle();
extras.putInt(WifiP2pManager.EXTRA_PARAM_KEY_PEER_DISCOVERY_FREQ, frequencyMhz);
msg.what = WifiP2pManager.DISCOVER_PEERS;
msg.arg1 = type;
if (SdkLevel.isAtLeastS()) {
msg.obj = new AttributionSource(1000, TEST_PACKAGE_NAME, null);
}
msg.getData().putBundle(WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE, extras);
msg.replyTo = replyMessenger;
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
}
/**
* Mock send WifiP2pManager.ADD_SERVICE_REQUEST with mocked mTestWifiP2pServiceRequest
*
* @param replyMessenger for checking replied message.
*/
private void sendAddServiceRequestMsg(Messenger replyMessenger) throws Exception {
Message msg = Message.obtain();
msg.what = WifiP2pManager.ADD_SERVICE_REQUEST;
msg.replyTo = replyMessenger;
msg.obj = mTestWifiP2pServiceRequest;
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
}
/**
* Mock send WifiP2pManager.DISCOVER_SERVICES
*
* @param replyMessenger for checking replied message.
*/
private void sendDiscoverServiceMsg(Messenger replyMessenger) throws Exception {
Message msg = Message.obtain();
Bundle extras = new Bundle();
msg.what = WifiP2pManager.DISCOVER_SERVICES;
if (SdkLevel.isAtLeastS()) {
msg.obj = new AttributionSource(1000, TEST_PACKAGE_NAME, null);
}
msg.getData().putBundle(WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE, extras);
msg.replyTo = replyMessenger;
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
}
/**
* Mock send WifiP2pManager.REQUEST_PEERS
*
* @param replyMessenger for checking replied message.
*/
private void sendRequestPeersMsg(Messenger replyMessenger) throws Exception {
Message msg = Message.obtain();
Bundle extras = new Bundle();
msg.what = WifiP2pManager.REQUEST_PEERS;
if (SdkLevel.isAtLeastS()) {
msg.obj = new AttributionSource(1000, TEST_PACKAGE_NAME, null);
}
msg.getData().putBundle(WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE, extras);
msg.replyTo = replyMessenger;
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
}
private void sendNegotiationRequestEvent(WifiP2pConfig config) throws Exception {
Message msg = Message.obtain();
msg.what = WifiP2pMonitor.P2P_GO_NEGOTIATION_REQUEST_EVENT;
msg.obj = config;
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
}
/**
* Mock send WifiP2pManager.REQUEST_GROUP_INFO
*
* @param replyMessenger for checking replied message.
*/
private void sendRequestGroupInfoMsg(Messenger replyMessenger) throws Exception {
Message msg = Message.obtain();
Bundle extras = new Bundle();
msg.what = WifiP2pManager.REQUEST_GROUP_INFO;
if (SdkLevel.isAtLeastS()) {
msg.obj = new AttributionSource(1000, TEST_PACKAGE_NAME, null);
}
msg.getData().putBundle(WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE, extras);
msg.replyTo = replyMessenger;
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
}
/**
* Mock send WifiP2pManager.DELETE_PERSISTENT_GROUP.
*
* @param replyMessenger for checking replied message.
* @param netId is the network id of the p2p group.
*/
private void sendDeletePersistentGroupMsg(Messenger replyMessenger,
int netId) throws Exception {
Message msg = Message.obtain();
msg.what = WifiP2pManager.DELETE_PERSISTENT_GROUP;
msg.arg1 = netId;
msg.replyTo = replyMessenger;
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
}
/**
* Send WifiP2pMonitor.P2P_GROUP_STARTED_EVENT.
*
* @param group the started group.
*/
private void sendGroupStartedMsg(WifiP2pGroup group) throws Exception {
if (group.getNetworkId() == WifiP2pGroup.NETWORK_ID_PERSISTENT) {
mGroups.add(group);
}
Message msg = Message.obtain();
msg.what = WifiP2pMonitor.P2P_GROUP_STARTED_EVENT;
msg.obj = group;
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
}
/**
* Send WifiP2pMonitor.P2P_GROUP_REMOVED_EVENT.
*/
private void sendGroupRemovedMsg() throws Exception {
Message msg = Message.obtain();
msg.what = WifiP2pMonitor.P2P_GROUP_REMOVED_EVENT;
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
}
/**
* Send WifiP2pMonitor.P2P_DEVICE_FOUND_EVENT.
*
* @param device the found device.
*/
private void sendDeviceFoundEventMsg(WifiP2pDevice device) throws Exception {
Message msg = Message.obtain();
msg.what = WifiP2pMonitor.P2P_DEVICE_FOUND_EVENT;
msg.obj = device;
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
}
/**
* Send WifiP2pMonitor.P2P_INVITATION_RESULT_EVENT.
*
* @param status invitation result.
*/
private void sendInvitationResultMsg(
WifiP2pServiceImpl.P2pStatus status) throws Exception {
Message msg = Message.obtain();
msg.what = WifiP2pMonitor.P2P_INVITATION_RESULT_EVENT;
msg.obj = status;
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
}
/**
* Mock send WifiP2pManager.SET_CHANNEL
*
* @param replyMessenger for checking replied message.
* @param p2pChannels stores the listen and operating channels.
*/
private void sendSetChannelMsg(Messenger replyMessenger,
Bundle p2pChannels) throws Exception {
Message msg = Message.obtain();
msg.what = WifiP2pManager.SET_CHANNEL;
msg.replyTo = replyMessenger;
msg.obj = p2pChannels;
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
}
/**
* Mock send WifiP2pManager.START_WPS
*
* @param replyMessenger for checking replied message.
* @param wps is the WPS configuration.
*/
private void sendStartWpsMsg(Messenger replyMessenger, WpsInfo wps) throws Exception {
Message msg = Message.obtain();
msg.what = WifiP2pManager.START_WPS;
msg.replyTo = replyMessenger;
msg.obj = wps;
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
}
/**
* Mock send WifiP2pManager.SET_DEVICE_NAME
*
* @param replyMessenger for checking replied message.
* @param dev is the P2p device configuration.
*/
private void sendSetDeviceNameMsg(
Messenger replyMessenger, WifiP2pDevice dev) throws Exception {
Message msg = Message.obtain();
msg.what = WifiP2pManager.SET_DEVICE_NAME;
msg.replyTo = replyMessenger;
msg.obj = dev;
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
}
/**
* Mock send WifiP2pManager.SET_WFD_INFO
*
* @param replyMessenger for checking replied message.
* @param wfdInfo is the P2p device's wfd information.
*/
private void sendSetWfdInfoMsg(
Messenger replyMessenger, WifiP2pWfdInfo wfdInfo) throws Exception {
Message msg = Message.obtain();
msg.what = WifiP2pManager.SET_WFD_INFO;
msg.replyTo = replyMessenger;
msg.obj = wfdInfo;
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
}
/**
* Mock send WifiP2pManager.SET_ONGOING_PEER_CONFIG
*
* @param replyMessenger for checking replied message.
* @param config used for change an ongoing peer connection.
*/
private void sendSetOngoingPeerConfigMsg(
Messenger replyMessenger, WifiP2pConfig config) throws Exception {
Message msg = Message.obtain();
msg.what = WifiP2pManager.SET_ONGOING_PEER_CONFIG;
msg.replyTo = replyMessenger;
msg.obj = config;
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
}
/**
* Mock send WifiP2pManager.REMOVE_LOCAL_SERVICE.
*
* @param replyMessenger for checking replied message.
* @param servInfo is the local service information.
*/
private void sendRemoveLocalServiceMsg(Messenger replyMessenger,
WifiP2pServiceInfo servInfo) throws Exception {
Message msg = Message.obtain();
msg.what = WifiP2pManager.REMOVE_LOCAL_SERVICE;
msg.obj = servInfo;
msg.replyTo = replyMessenger;
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
}
/**
* Mock send WifiP2pManager.REMOVE_SERVICE_REQUEST.
*
* @param replyMessenger for checking replied message.
* @param req is the service discovery request.
*/
private void sendRemoveServiceRequestMsg(Messenger replyMessenger,
WifiP2pServiceRequest req) throws Exception {
Message msg = Message.obtain();
msg.what = WifiP2pManager.REMOVE_SERVICE_REQUEST;
msg.obj = req;
msg.replyTo = replyMessenger;
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
}
/**
* Send Connect API msg.
*
* @param replyMessenger for checking replied message.
* @param config options as described in {@link WifiP2pConfig} class.
*/
private void sendConnectMsg(Messenger replyMessenger,
WifiP2pConfig config) throws Exception {
Message msg = Message.obtain();
Bundle extras = new Bundle();
extras.putParcelable(WifiP2pManager.EXTRA_PARAM_KEY_CONFIG, config);
msg.what = WifiP2pManager.CONNECT;
if (SdkLevel.isAtLeastS()) {
msg.obj = new AttributionSource(1000, TEST_PACKAGE_NAME, null);
}
msg.getData().putBundle(WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE, extras);
msg.replyTo = replyMessenger;
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
}
/**
* Send Set Ongoing Peer Config API msg.
*
* @param replyMessenger for checking replied message.
* @param config options as described in {@link WifiP2pConfig} class.
*/
private void sendSetOngoingPeerMsg(Messenger replyMessenger,
WifiP2pConfig config) throws Exception {
Message msg = Message.obtain();
msg.what = WifiP2pManager.SET_ONGOING_PEER_CONFIG;
msg.obj = config;
msg.replyTo = replyMessenger;
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
}
/**
* Send CreateGroup API msg.
*
* @param replyMessenger for checking replied message.
* @param config options as described in {@link WifiP2pConfig} class.
*/
private void sendCreateGroupMsg(Messenger replyMessenger,
int netId,
WifiP2pConfig config) throws Exception {
Message msg = Message.obtain();
Bundle extras = new Bundle();
extras.putParcelable(WifiP2pManager.EXTRA_PARAM_KEY_CONFIG, config);
msg.what = WifiP2pManager.CREATE_GROUP;
msg.arg1 = netId;
if (SdkLevel.isAtLeastS()) {
msg.obj = new AttributionSource(1000, TEST_PACKAGE_NAME, null);
}
msg.getData().putBundle(WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE, extras);
msg.replyTo = replyMessenger;
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
}
/**
* Send SetVendorElements API msg.
*
* @param replyMessenger For checking replied message.
* @param ies The list of information elements.
*/
private void sendSetVendorElementsMsg(Messenger replyMessenger,
ArrayList<ScanResult.InformationElement> ies) throws Exception {
Message msg = Message.obtain();
Bundle extras = new Bundle();
extras.putParcelableArrayList(WifiP2pManager.EXTRA_PARAM_KEY_INFORMATION_ELEMENT_LIST,
ies);
msg.what = WifiP2pManager.SET_VENDOR_ELEMENTS;
if (SdkLevel.isAtLeastS()) {
msg.obj = mContext.getAttributionSource();
}
msg.getData().putBundle(WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE, extras);
msg.replyTo = replyMessenger;
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
}
/**
* Send AddExternalApprover API msg.
*
* @param replyMessenger For checking replied message.
* @param devAddr the peer address.
* @param binder the application binder.
*/
private void sendAddExternalApproverMsg(Messenger replyMessenger,
MacAddress devAddr, Binder binder) throws Exception {
Message msg = Message.obtain();
Bundle extras = new Bundle();
if (null != devAddr) {
extras.putParcelable(WifiP2pManager.EXTRA_PARAM_KEY_PEER_ADDRESS, devAddr);
}
if (null != binder) {
extras.putBinder(WifiP2pManager.CALLING_BINDER, binder);
}
msg.what = WifiP2pManager.ADD_EXTERNAL_APPROVER;
if (SdkLevel.isAtLeastS()) {
msg.obj = new AttributionSource(1000, TEST_PACKAGE_NAME, null);
}
msg.getData().putBundle(WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE, extras);
msg.replyTo = replyMessenger;
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
}
/**
* Send RemoveExternalApprover API msg.
*
* @param replyMessenger For checking replied message.
* @param devAddr the peer address.
*/
private void sendRemoveExternalApproverMsg(Messenger replyMessenger,
MacAddress devAddr, Binder binder) throws Exception {
Message msg = Message.obtain();
Bundle extras = new Bundle();
if (null != devAddr) {
extras.putParcelable(WifiP2pManager.EXTRA_PARAM_KEY_PEER_ADDRESS, devAddr);
}
if (null != binder) {
extras.putBinder(WifiP2pManager.CALLING_BINDER, binder);
}
msg.what = WifiP2pManager.REMOVE_EXTERNAL_APPROVER;
if (SdkLevel.isAtLeastS()) {
msg.obj = new AttributionSource(1000, TEST_PACKAGE_NAME, null);
}
msg.getData().putBundle(WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE, extras);
msg.replyTo = replyMessenger;
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
}
/**
* Send SetConnectionRequestResult API msg.
*
* @param replyMessenger For checking replied message.
* @param devAddr the peer address.
* @param result the decision for the incoming request.
*/
private void sendSetConnectionRequestResultMsg(Messenger replyMessenger,
MacAddress devAddr, int result, Binder binder) throws Exception {
Message msg = Message.obtain();
Bundle extras = new Bundle();
if (null != devAddr) {
extras.putParcelable(WifiP2pManager.EXTRA_PARAM_KEY_PEER_ADDRESS, devAddr);
}
if (null != binder) {
extras.putBinder(WifiP2pManager.CALLING_BINDER, binder);
}
msg.what = WifiP2pManager.SET_CONNECTION_REQUEST_RESULT;
if (SdkLevel.isAtLeastS()) {
msg.obj = new AttributionSource(1000, TEST_PACKAGE_NAME, null);
}
msg.getData().putBundle(WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE, extras);
msg.arg1 = result;
msg.replyTo = replyMessenger;
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
}
/**
* Send P2P_GO_NEGOTIATION_FAILURE_EVENT
*
* @param replyMessenger For checking replied message.
* @param status the P2pStatus.
*/
private void sendGoNegotiationFailureEvent(Messenger replyMessenger,
WifiP2pServiceImpl.P2pStatus status) throws Exception {
Message msg = Message.obtain();
msg.what = WifiP2pMonitor.P2P_GO_NEGOTIATION_FAILURE_EVENT;
msg.obj = status;
msg.replyTo = replyMessenger;
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
}
/**
* Send AsyncChannel.CMD_CHANNEL_HALF_CONNECTED
*
* @param replyMessenger For checking replied message.
* @param channel AsyncChannel of the connection
*/
private void sendChannelHalfConnectedEvent(Messenger replyMessenger, AsyncChannel channel)
throws Exception {
Message msg = Message.obtain();
msg.what = AsyncChannel.CMD_CHANNEL_HALF_CONNECTED;
msg.arg1 = AsyncChannel.STATUS_SUCCESSFUL;
msg.obj = channel;
msg.replyTo = replyMessenger;
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
}
private void sendOngoingPeerConfig(Messenger replyMessenger, AsyncChannel channel)
throws Exception {
Message msg = Message.obtain();
msg.what = WifiP2pManager.SET_ONGOING_PEER_CONFIG;
msg.arg1 = AsyncChannel.STATUS_SUCCESSFUL;
msg.obj = channel;
msg.replyTo = replyMessenger;
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
}
/**
* Send simple API msg.
*
* Mock the API msg without arguments.
*
* @param replyMessenger for checking replied message.
*/
private void sendSimpleMsg(Messenger replyMessenger,
int what) throws Exception {
Message msg = Message.obtain();
Bundle extras = new Bundle();
msg.what = what;
if (SdkLevel.isAtLeastS()) {
msg.obj = new AttributionSource(1000, TEST_PACKAGE_NAME, null);
}
msg.getData().putBundle(WifiP2pManager.EXTRA_PARAM_KEY_BUNDLE, extras);
if (replyMessenger != null) {
msg.replyTo = replyMessenger;
}
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
}
/**
* Send simple API msg.
*
* Mock the API msg with objects.
*
* @param replyMessenger for checking replied message.
*/
private void sendSimpleMsg(Messenger replyMessenger,
int what, Object obj) throws Exception {
Message msg = Message.obtain();
msg.what = what;
msg.obj = obj;
if (replyMessenger != null) {
msg.replyTo = replyMessenger;
}
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
}
private void setTargetSdkGreaterThanT() {
if (SdkLevel.isAtLeastT()) {
when(mWifiPermissionsUtil.isTargetSdkLessThan(any(),
eq(Build.VERSION_CODES.TIRAMISU), anyInt())).thenReturn(false);
}
}
/**
* Send simple API msg.
*
* Mock the API msg with int arg.
*
* @param replyMessenger for checking replied message.
*/
private void sendSimpleMsg(Messenger replyMessenger,
int what, int arg1) throws Exception {
Message msg = Message.obtain();
msg.what = what;
msg.arg1 = arg1;
if (replyMessenger != null) {
msg.replyTo = replyMessenger;
}
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
}
/**
* Send simple API msg.
*
* Mock the API msg with int arg.
*
* @param replyMessenger for checking replied message.
*/
private void sendSimpleMsg(Messenger replyMessenger,
int what, int arg1, Object obj) throws Exception {
Message msg = Message.obtain();
msg.what = what;
msg.arg1 = arg1;
msg.obj = obj;
if (replyMessenger != null) {
msg.replyTo = replyMessenger;
}
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
}
/** This helper is for no client info tests only. */
private void forceP2pEnabledWithoutClientInfo() throws Exception {
simulateWifiStateChange(true);
simulateLocationModeChange(true);
mWifiP2pServiceImpl.getMessenger(mClient1, TEST_PACKAGE_NAME, null);
// send a command to force P2P enabled.
sendSimpleMsg(mClientMessenger, WifiP2pManager.PING);
}
/**
* force P2p State enter InactiveState to start others unit test
*
* @param clientBinder client binder to use for p2p channel init
*/
private void forceP2pEnabled(Binder clientBinder) throws Exception {
simulateWifiStateChange(true);
simulateLocationModeChange(true);
checkIsP2pInitWhenClientConnected(true, clientBinder,
new WorkSource(clientBinder.getCallingUid(), TEST_PACKAGE_NAME));
verify(mTetheringManager).registerTetheringEventCallback(any(Executor.class),
mTetheringEventCallbackCaptor.capture());
mTetheringEventCallback = mTetheringEventCallbackCaptor.getValue();
verify(mContext).sendBroadcastWithMultiplePermissions(
argThat(new WifiP2pServiceImplTest
.P2pConnectionChangedIntentMatcherForNetworkState(IDLE)), any());
verify(mContext, never()).sendBroadcastWithMultiplePermissions(
argThat(new WifiP2pServiceImplTest
.P2pConnectionChangedIntentMatcherForNetworkState(FAILED)), any());
if (SdkLevel.isAtLeastT()) {
verify(mContext).sendBroadcast(
argThat(new WifiP2pServiceImplTest
.P2pConnectionChangedIntentMatcherForNetworkState(IDLE)), any(), any());
verify(mBroadcastOptions, atLeastOnce())
.setRequireAllOfPermissions(TEST_REQUIRED_PERMISSIONS_T);
verify(mBroadcastOptions, atLeastOnce())
.setRequireNoneOfPermissions(TEST_EXCLUDED_PERMISSIONS_T);
}
}
private void simulateInitChannel(Binder clientBinder, Bundle bundle) throws Exception {
mWifiP2pServiceImpl.getMessenger(clientBinder, TEST_PACKAGE_NAME, bundle);
sendChannelInfoUpdateMsg(TEST_PACKAGE_NAME, "testFeature", clientBinder, mClientMessenger);
}
private void simulateInitChannel(Binder clientBinder) throws Exception {
simulateInitChannel(clientBinder, null);
}
/**
* Check is P2p init as expected when client connected
*
* @param expectInit set true if p2p init should succeed as expected, set false when
* expected init should not happen
* @param expectReplace set true if p2p worksource replace should succeed as expected, set false
* when replace should not happen
* @param clientBinder client binder to use for p2p channel init
* @param expectedRequestorWs Expected merged requestorWs
*/
private void checkIsP2pInitWhenClientConnected(boolean expectInit,
Binder clientBinder, WorkSource expectedRequestorWs)
throws Exception {
simulateInitChannel(clientBinder);
if (expectInit) {
// send a command to force P2P enabled.
sendSimpleMsg(mClientMessenger, WifiP2pManager.PING);
}
mLooper.dispatchAll();
reset(mClientHandler);
if (expectInit) {
verify(mWifiNative).setupInterface(any(), any(), eq(expectedRequestorWs));
verify(mNetdWrapper).setInterfaceUp(anyString());
verify(mWifiMonitor, atLeastOnce()).registerHandler(anyString(), anyInt(), any());
// Verify timer is scheduled
verify(mAlarmManager, times(2)).setExact(anyInt(), anyLong(),
eq(mWifiP2pServiceImpl.P2P_IDLE_SHUTDOWN_MESSAGE_TIMEOUT_TAG), any(), any());
} else {
verify(mWifiNative, never()).setupInterface(any(), any(), any());
verify(mNetdWrapper, never()).setInterfaceUp(anyString());
verify(mWifiMonitor, never()).registerHandler(anyString(), anyInt(), any());
}
}
/**
* Check is P2p teardown as expected when client disconnected
*
* @param expectTearDown set true if p2p teardown should succeed as expected,
* set false when expected teardown should not happen
* @param expectReplace set true if p2p worksource replace should succeed as expected, set false
* when replace should not happen
* @param clientBinder client binder to use for p2p channel init
* @param expectedRequestorWs Expected merged requestorWs
*/
private void checkIsP2pTearDownWhenClientDisconnected(
boolean expectTearDown,
Binder clientBinder, WorkSource expectedRequestorWs) throws Exception {
mWifiP2pServiceImpl.close(clientBinder);
mLooper.dispatchAll();
if (expectTearDown) {
verify(mWifiNative).teardownInterface();
verify(mWifiMonitor).stopMonitoring(anyString());
} else {
verify(mWifiNative, never()).teardownInterface();
verify(mWifiMonitor, never()).stopMonitoring(anyString());
}
}
private void verifyDeviceChangedBroadcastIntent(Intent intent) {
WifiP2pDevice device = intent.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_DEVICE);
assertEquals(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION, intent.getAction());
assertEquals(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT, intent.getFlags());
assertEquals(mTestThisDevice.deviceName, device.deviceName);
if (!TextUtils.isEmpty(mTestThisDevice.deviceAddress)) {
assertEquals(ANONYMIZED_DEVICE_ADDRESS, device.deviceAddress);
} else {
assertEquals(mTestThisDevice.deviceAddress, device.deviceAddress);
}
assertEquals(mTestThisDevice.primaryDeviceType, device.primaryDeviceType);
assertEquals(mTestThisDevice.secondaryDeviceType, device.secondaryDeviceType);
assertEquals(mTestThisDevice.wpsConfigMethodsSupported, device.wpsConfigMethodsSupported);
assertEquals(mTestThisDevice.deviceCapability, device.deviceCapability);
assertEquals(mTestThisDevice.groupCapability, device.groupCapability);
assertEquals(mTestThisDevice.status, device.status);
if (mTestThisDevice.wfdInfo != null) {
assertEquals(mTestThisDevice.wfdInfo.isEnabled(),
device.wfdInfo.isEnabled());
assertEquals(mTestThisDevice.wfdInfo.getDeviceInfoHex(),
device.wfdInfo.getDeviceInfoHex());
assertEquals(mTestThisDevice.wfdInfo.getControlPort(),
device.wfdInfo.getControlPort());
assertEquals(mTestThisDevice.wfdInfo.getMaxThroughput(),
device.wfdInfo.getMaxThroughput());
} else {
assertEquals(mTestThisDevice.wfdInfo, device.wfdInfo);
}
}
/**
* Check the broadcast of WIFI_P2P_THIS_DEVICE_CHANGED_ACTION is sent as expected.
*/
private void checkSendThisDeviceChangedBroadcast() {
ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
String[] permission_gold;
if (mWifiPermissionsUtil.isLocationModeEnabled()) {
permission_gold = new String[]{
android.Manifest.permission.ACCESS_FINE_LOCATION,
android.Manifest.permission.ACCESS_WIFI_STATE};
} else {
permission_gold = new String[]{
android.Manifest.permission.ACCESS_FINE_LOCATION,
android.Manifest.permission.ACCESS_WIFI_STATE,
android.Manifest.permission.NETWORK_SETTINGS};
}
ArgumentCaptor<String []> permissionCaptor = ArgumentCaptor.forClass(String[].class);
verify(mContext, atLeastOnce()).sendBroadcastWithMultiplePermissions(
intentCaptor.capture(), permissionCaptor.capture());
String [] permission = permissionCaptor.getValue();
Arrays.sort(permission);
Arrays.sort(permission_gold);
assertEquals(permission_gold, permission);
verifyDeviceChangedBroadcastIntent(intentCaptor.getValue());
if (SdkLevel.isAtLeastT()) {
// verify the same broadcast is also sent to apps with NEARBY_WIFI_DEVICES permission
// but without ACCESS_FINE_LOCATION.
verify(mContext, atLeastOnce()).sendBroadcast(
intentCaptor.capture(), any(), any());
verify(mBroadcastOptions, atLeastOnce())
.setRequireAllOfPermissions(TEST_REQUIRED_PERMISSIONS_T);
if (mWifiPermissionsUtil.isLocationModeEnabled()) {
verify(mBroadcastOptions, atLeastOnce())
.setRequireNoneOfPermissions(TEST_EXCLUDED_PERMISSIONS_T);
}
verifyDeviceChangedBroadcastIntent(intentCaptor.getValue());
}
}
/**
* Check the broadcast of ACTION_WIFI_P2P_PERSISTENT_GROUPS_CHANGED is sent as expected.
*/
private void checkSendP2pPersistentGroupsChangedBroadcast() {
ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
verify(mContext, atLeastOnce()).sendStickyBroadcastAsUser(
intentCaptor.capture(), eq(UserHandle.ALL));
Intent intent = intentCaptor.getValue();
assertEquals(WifiP2pManager.ACTION_WIFI_P2P_PERSISTENT_GROUPS_CHANGED, intent.getAction());
assertEquals(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT, intent.getFlags());
}
private class P2pConnectionChangedIntentMatcherForNetworkState
implements ArgumentMatcher<Intent> {
private final NetworkInfo.DetailedState mState;
P2pConnectionChangedIntentMatcherForNetworkState(NetworkInfo.DetailedState state) {
mState = state;
}
@Override
public boolean matches(Intent intent) {
if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION != intent.getAction()) {
return false;
}
if (mState == null) {
return true;
}
NetworkInfo networkInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
return networkInfo.getDetailedState() == mState;
}
}
private class P2pStateChangedIntentMatcher implements ArgumentMatcher<Intent> {
private final int mState;
P2pStateChangedIntentMatcher(int state) {
mState = state;
}
@Override
public boolean matches(Intent intent) {
if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION != intent.getAction()) {
return false;
}
return mState == intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE,
WifiP2pManager.WIFI_P2P_STATE_DISABLED);
}
}
/**
* Set up the instance of WifiP2pServiceImpl for testing.
*
* @param supported defines the p2p is supported or not in this instance.
*/
private void setUpWifiP2pServiceImpl(boolean supported) throws Exception {
reset(mContext, mFrameworkFacade, mHandlerThread, mPackageManager, mResources,
mWifiInjector, mWifiNative);
generatorTestData();
mClientHanderLooper = new TestLooper();
mClientHandler = spy(new Handler(mClientHanderLooper.getLooper()));
mClientMessenger = new Messenger(mClientHandler);
mLooper = new TestLooper();
when(mContext.getSystemService(Context.ALARM_SERVICE))
.thenReturn(mAlarmManager);
when(mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE))
.thenReturn(mLayoutInflater);
when(mContext.getPackageManager()).thenReturn(mPackageManager);
when(mContext.getResources()).thenReturn(mResources);
when(mContext.getSystemService(WifiManager.class)).thenReturn(mWifiManager);
if (SdkLevel.isAtLeastS()) {
when(mContext.getAttributionSource()).thenReturn(
new AttributionSource(1000, TEST_PACKAGE_NAME, null));
}
when(mContext.getOpPackageName()).thenReturn("android");
when(mContext.getAttributionTag()).thenReturn("feature");
when(mWifiManager.getConnectionInfo()).thenReturn(mWifiInfo);
when(mWifiGlobals.isP2pMacRandomizationSupported()).thenReturn(false);
when(mWifiSettingsConfigStore.get(eq(WIFI_P2P_DEVICE_ADDRESS))).thenReturn(thisDeviceMac);
when(mWifiSettingsConfigStore.get(eq(WIFI_P2P_DEVICE_NAME))).thenReturn(thisDeviceName);
when(mWifiSettingsConfigStore.get(eq(WIFI_P2P_PENDING_FACTORY_RESET))).thenReturn(false);
when(mHandlerThread.getLooper()).thenReturn(mLooper.getLooper());
if (supported) {
when(mPackageManager.hasSystemFeature(eq(PackageManager.FEATURE_WIFI_DIRECT)))
.thenReturn(true);
} else {
when(mPackageManager.hasSystemFeature(eq(PackageManager.FEATURE_WIFI_DIRECT)))
.thenReturn(false);
}
when(mResources.getString(R.string.config_wifi_p2p_device_type))
.thenReturn("10-0050F204-5");
when(mResources.getInteger(R.integer.config_p2pInvitationReceivedDialogTimeoutMs))
.thenReturn(P2P_INVITATION_RECEIVED_TIMEOUT_MS);
when(mResources.getInteger(R.integer.config_wifiP2pJoinRequestAuthorizingTimeoutMs))
.thenReturn(P2P_PEER_AUTH_TIMEOUT_MS);
when(mResources.getInteger(R.integer.config_wifiP2pExtListenPeriodMs))
.thenReturn(P2P_EXT_LISTEN_PERIOD_MS);
when(mResources.getInteger(R.integer.config_wifiP2pExtListenIntervalMs))
.thenReturn(P2P_EXT_LISTEN_INTERVAL_MS);
when(mResources.getBoolean(R.bool
.config_p2pWaitForPeerInviteOnInviteStatusInfoUnavailable)).thenReturn(false);
when(mResources.getBoolean(R.bool
.config_wifiP2pGoIpAddressAllocationInEapolFrames)).thenReturn(false);
when(mResources.getConfiguration()).thenReturn(mConfiguration);
when(mWifiInjector.getFrameworkFacade()).thenReturn(mFrameworkFacade);
when(mWifiInjector.getUserManager()).thenReturn(mUserManager);
when(mWifiInjector.getWifiP2pMetrics()).thenReturn(mWifiP2pMetrics);
when(mWifiInjector.getWifiP2pMonitor()).thenReturn(mWifiMonitor);
when(mWifiInjector.getWifiP2pNative()).thenReturn(mWifiNative);
when(mWifiInjector.getWifiP2pServiceHandlerThread()).thenReturn(mHandlerThread);
when(mWifiInjector.getWifiPermissionsUtil()).thenReturn(mWifiPermissionsUtil);
when(mWifiInjector.getSettingsConfigStore()).thenReturn(mWifiSettingsConfigStore);
when(mWifiInjector.getCoexManager()).thenReturn(mCoexManager);
when(mWifiInjector.getWifiGlobals()).thenReturn(mWifiGlobals);
when(mWifiInjector.makeBroadcastOptions()).thenReturn(mBroadcastOptions);
when(mWifiInjector.getWifiDialogManager()).thenReturn(mWifiDialogManager);
when(mWifiInjector.getLastCallerInfoManager()).thenReturn(mLastCallerInfoManager);
when(mWifiDialogManager.createP2pInvitationReceivedDialog(any(), anyBoolean(), any(),
anyInt(), any(), any())).thenReturn(mDialogHandle);
when(mWifiDialogManager.createP2pInvitationSentDialog(any(), any(), anyInt()))
.thenReturn(mDialogHandle);
when(mWifiInjector.getClock()).thenReturn(mClock);
when(mWifiInjector.getInterfaceConflictManager()).thenReturn(mInterfaceConflictManager);
// enable all permissions, disable specific permissions in tests
when(mWifiPermissionsUtil.checkNetworkSettingsPermission(anyInt())).thenReturn(true);
when(mWifiPermissionsUtil.checkNetworkStackPermission(anyInt())).thenReturn(true);
when(mWifiPermissionsUtil.checkReadWifiCredentialPermission(anyInt())).thenReturn(true);
when(mWifiPermissionsUtil.checkConfigOverridePermission(anyInt())).thenReturn(true);
when(mWifiPermissionsUtil.checkCanAccessWifiDirect(anyString(), anyString(), anyInt(),
anyBoolean())).thenReturn(true);
when(mInterfaceConflictManager.manageInterfaceConflictForStateMachine(any(), any(), any(),
any(), any(), eq(HalDeviceManager.HDM_CREATE_IFACE_P2P), any(), anyBoolean()))
.thenReturn(InterfaceConflictManager.ICM_EXECUTE_COMMAND);
// Mock target SDK to less than T by default to keep existing tests working.
if (SdkLevel.isAtLeastT()) {
when(mWifiPermissionsUtil.checkNearbyDevicesPermission(any(), anyBoolean(), any()))
.thenReturn(true);
when(mWifiPermissionsUtil.isTargetSdkLessThan(any(),
eq(Build.VERSION_CODES.TIRAMISU), anyInt())).thenReturn(true);
}
when(mWifiNative.setupInterface(any(), any(), any())).thenReturn(IFACE_NAME_P2P);
when(mWifiNative.p2pGetDeviceAddress()).thenReturn(thisDeviceMac);
when(mUserManager.getUserRestrictions()).thenReturn(mBundle);
when(mFrameworkFacade.makeAlertDialogBuilder(any())).thenReturn(mAlertDialogBuilder);
when(mAlertDialogBuilder.setTitle(any())).thenReturn(mAlertDialogBuilder);
when(mAlertDialogBuilder.setView(any())).thenReturn(mAlertDialogBuilder);
when(mAlertDialogBuilder.setMessage(any())).thenReturn(mAlertDialogBuilder);
when(mAlertDialogBuilder.setPositiveButton(any(), any())).thenReturn(mAlertDialogBuilder);
when(mAlertDialogBuilder.setNegativeButton(any(), any())).thenReturn(mAlertDialogBuilder);
when(mAlertDialogBuilder.setOnCancelListener(any())).thenReturn(mAlertDialogBuilder);
when(mAlertDialogBuilder.setPositiveButton(any(), any())).thenReturn(mAlertDialogBuilder);
when(mAlertDialogBuilder.create()).thenReturn(mAlertDialog);
when(mAlertDialog.getWindow()).thenReturn(mock(Window.class));
if (SdkLevel.isAtLeastT()) {
when(mBundle.getBoolean(UserManager.DISALLOW_WIFI_DIRECT)).thenReturn(false);
}
doAnswer(new AnswerWithArguments() {
public boolean answer(WifiP2pGroupList groups) {
groups.clear();
for (WifiP2pGroup group : mGroups.getGroupList()) {
groups.add(group);
}
return true;
}
}).when(mWifiNative).p2pListNetworks(any(WifiP2pGroupList.class));
doAnswer(new AnswerWithArguments() {
public boolean answer(int netId) {
mGroups.remove(netId);
return true;
}
}).when(mWifiNative).removeP2pNetwork(anyInt());
when(mWifiNative.setVendorElements(any())).thenReturn(true);
when(mWifiSettingsConfigStore.get(eq(WIFI_VERBOSE_LOGGING_ENABLED))).thenReturn(true);
doAnswer(new AnswerWithArguments() {
public void answer(CoexManager.CoexListener listener) {
mCoexListener = listener;
}
}).when(mCoexManager).registerCoexListener(any(CoexManager.CoexListener.class));
when(mCoexManager.getCoexRestrictions()).thenReturn(0);
when(mCoexManager.getCoexUnsafeChannels()).thenReturn(Collections.emptyList());
when(mWifiInjector.getDeviceConfigFacade()).thenReturn(mDeviceConfigFacade);
when(mDeviceConfigFacade.isP2pFailureBugreportEnabled()).thenReturn(false);
when(mContext.getSystemService(TetheringManager.class)).thenReturn(mTetheringManager);
mWifiP2pServiceImpl = new WifiP2pServiceImpl(mContext, mWifiInjector);
if (supported) {
// register these event:
// * WifiManager.WIFI_STATE_CHANGED_ACTION -- always
// * LocationManager.MODE_CHANGED_ACTION -- always
// * TetheringManager.ACTION_TETHER_STATE_CHANGED -- < S
// * UserManager.ACTION_USER_RESTRICTIONS_CHANGED -- >= T
if (SdkLevel.isAtLeastT()) {
verify(mContext, times(3)).registerReceiver(mBcastRxCaptor.capture(),
any(IntentFilter.class));
mUserRestrictionReceiver = mBcastRxCaptor.getAllValues().get(2);
} else if (SdkLevel.isAtLeastS()) {
verify(mContext, times(2)).registerReceiver(mBcastRxCaptor.capture(),
any(IntentFilter.class));
} else {
verify(mContext, times(3)).registerReceiver(mBcastRxCaptor.capture(),
any(IntentFilter.class));
mTetherStateReceiver = mBcastRxCaptor.getAllValues().get(2);
}
mWifiStateChangedReceiver = mBcastRxCaptor.getAllValues().get(0);
mLocationModeReceiver = mBcastRxCaptor.getAllValues().get(1);
}
verify(mWifiPermissionsUtil, never()).isLocationModeEnabled();
verify(mContext, never()).sendBroadcastMultiplePermissions(any(Intent.class), any());
verify(mContext, never()).sendBroadcast(any(Intent.class), anyString(), any(Bundle.class));
mWifiP2pServiceImpl.mNetdWrapper = mNetdWrapper;
mP2pStateMachineMessenger = mWifiP2pServiceImpl.getP2pStateMachineMessenger();
}
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
mStaticMockSession = mockitoSession()
.mockStatic(NetworkInterface.class)
.mockStatic(Process.class)
.startMocking();
lenient().when(NetworkInterface.getByName(eq(IFACE_NAME_P2P)))
.thenReturn(mP2pNetworkInterface);
when(mLayoutInflater.cloneInContext(any())).thenReturn(mLayoutInflater);
when(mLayoutInflater.inflate(anyInt(), any())).thenReturn(mView);
when(mLayoutInflater.inflate(anyInt(), any(), anyBoolean())).thenReturn(mView);
when(mView.findViewById(eq(R.id.name))).thenReturn(mock(TextView.class));
when(mView.findViewById(eq(R.id.value))).thenReturn(mock(TextView.class));
when(mView.findViewById(eq(R.id.info))).thenReturn(mock(ViewGroup.class));
ArrayList<InetAddress> p2pInetAddresses = new ArrayList<>();
p2pInetAddresses.add(InetAddresses.parseNumericAddress(P2P_GO_IP));
when(mP2pNetworkInterface.getInetAddresses())
.thenReturn(Collections.enumeration(p2pInetAddresses));
setUpWifiP2pServiceImpl(true);
mClient1 = new Binder();
mClient2 = new Binder();
when(mContext.createContextAsUser(any(), anyInt())).thenReturn(mContext);
mWifiP2pServiceImpl.handleBootCompleted();
}
@After
public void cleanUp() throws Exception {
mStaticMockSession.finishMocking();
}
/**
* Send P2P statemachine internal message.
*/
private void sendP2pStateMachineMessage(int what) throws Exception {
Message msg = Message.obtain();
msg.what = what;
mP2pStateMachineMessenger.send(Message.obtain(msg));
mLooper.dispatchAll();
}
/**
* Mock enter Disabled state.
*/
private void mockEnterDisabledState() throws Exception {
sendP2pStateMachineMessage(WifiP2pMonitor.SUP_DISCONNECTION_EVENT);
}
/**
* Mock enter GroupNegotiation state.
*/
private void mockEnterGroupNegotiationState() throws Exception {
sendCreateGroupMsg(mClientMessenger, WifiP2pGroup.NETWORK_ID_TEMPORARY, null);
}
/**
* Mock enter ProvisionDiscovery state.
*/
private void mockEnterProvisionDiscoveryState() throws Exception {
mockPeersList();
sendConnectMsg(mClientMessenger, mTestWifiP2pPeerConfig);
}
private void mockEnterProvisionDiscoveryState(WifiP2pConfig p2pConfig) throws Exception {
mockPeersList();
sendConnectMsg(mClientMessenger, p2pConfig);
}
/**
* Mock enter Group created state.
*/
private void mockEnterGroupCreatedState() throws Exception {
forceP2pEnabled(mClient1);
WifiP2pGroup group = new WifiP2pGroup();
group.setNetworkId(WifiP2pGroup.NETWORK_ID_PERSISTENT);
group.setNetworkName("DIRECT-xy-NEW");
group.setOwner(new WifiP2pDevice("thisDeviceMac"));
group.setIsGroupOwner(true);
group.setInterface(IFACE_NAME_P2P);
sendGroupStartedMsg(group);
simulateTetherReady();
}
/**
* Mock enter the user authorizing negotiation request state.
*/
private void mockEnterUserAuthorizingNegotiationRequestState(int wpsType) throws Exception {
mockPeersList();
// Enter UserAuthorizingNegotiationRequestState
WifiP2pConfig config = new WifiP2pConfig();
config.deviceAddress = mTestWifiP2pDevice.deviceAddress;
config.wps = new WpsInfo();
config.wps.setup = wpsType;
sendNegotiationRequestEvent(config);
}
/**
* Mock WifiP2pServiceImpl.mPeers.
*/
private void mockPeersList() throws Exception {
sendDeviceFoundEventMsg(mTestWifiP2pDevice);
}
/**
* Verify that p2p init / teardown whn a client connects / disconnects
* with wifi enabled
*/
@Test
public void testP2pInitWhenClientConnectWithWifiEnabled() throws Exception {
simulateWifiStateChange(true);
checkIsP2pInitWhenClientConnected(true, mClient1,
new WorkSource(mClient1.getCallingUid(), TEST_PACKAGE_NAME));
checkIsP2pTearDownWhenClientDisconnected(true, mClient1, null);
}
/**
* Verify that p2p doesn't init when a client connects / disconnects
* with wifi disabled
*/
@Test
public void testP2pDoesntInitWhenClientConnectWithWifiDisabled()
throws Exception {
simulateWifiStateChange(false);
checkIsP2pInitWhenClientConnected(false, mClient1,
new WorkSource(mClient1.getCallingUid(), TEST_PACKAGE_NAME));
checkIsP2pTearDownWhenClientDisconnected(false, mClient1, null);
}
/**
* Verify device status is reset to UNAVAILABLE on P2P disabled.
*/
@Test
public void testP2pDeviceUnavailableOnP2pDisabled() throws Exception {
setTargetSdkGreaterThanT();
forceP2pEnabled(mClient1);
simulateWifiStateChange(false);
mLooper.dispatchAll();
// Device status is AVAILABLE
sendChannelInfoUpdateMsg("testPkg1", "testFeature", mClient1, mClientMessenger);
sendSimpleMsg(mClientMessenger, WifiP2pManager.REQUEST_DEVICE_INFO);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
assertEquals(WifiP2pManager.RESPONSE_DEVICE_INFO, mMessageCaptor.getValue().what);
assertEquals(WifiP2pDevice.AVAILABLE,
((WifiP2pDevice) mMessageCaptor.getValue().obj).status);
// Force to back disable state
mockEnterDisabledState();
// Device status is UNAVAILABLE
sendSimpleMsg(mClientMessenger, WifiP2pManager.REQUEST_DEVICE_INFO);
verify(mClientHandler, times(2)).sendMessage(mMessageCaptor.capture());
assertEquals(WifiP2pManager.RESPONSE_DEVICE_INFO, mMessageCaptor.getValue().what);
assertEquals(WifiP2pDevice.UNAVAILABLE,
((WifiP2pDevice) mMessageCaptor.getValue().obj).status);
}
/**
* Verify that p2p init / teardown when wifi off / on
* with a client connected
*/
@Test
public void checkIsP2pInitForWifiChanges() throws Exception {
forceP2pEnabled(mClient1);
simulateWifiStateChange(false);
mLooper.dispatchAll();
verify(mWifiNative).teardownInterface();
verify(mWifiMonitor).stopMonitoring(anyString());
// Force to back disable state for next test
mockEnterDisabledState();
// wifi off / on won't initialize the p2p interface.
simulateWifiStateChange(true);
mLooper.dispatchAll();
verify(mWifiNative, times(1)).setupInterface(any(), any(), any());
verify(mNetdWrapper, times(1)).setInterfaceUp(anyString());
verify(mWifiMonitor, atLeastOnce()).registerHandler(anyString(), anyInt(), any());
// Lazy initialization is done once receiving a command.
sendSimpleMsg(mClientMessenger, WifiP2pManager.DISCOVER_PEERS);
verify(mWifiNative, times(2)).setupInterface(any(), any(), any());
verify(mNetdWrapper, times(2)).setInterfaceUp(anyString());
}
/**
* Verify that p2p will teardown /won't init when DISALLOW_WIFI_DIRECT user restriction is set
*/
@Test
public void checkIsP2pInitForUserRestrictionChanges() throws Exception {
assumeTrue(SdkLevel.isAtLeastT());
forceP2pEnabled(mClient1);
// p2p interface disabled when user restriction is set
when(mBundle.getBoolean(UserManager.DISALLOW_WIFI_DIRECT)).thenReturn(true);
Intent intent = new Intent(UserManager.ACTION_USER_RESTRICTIONS_CHANGED);
mUserRestrictionReceiver.onReceive(mContext, intent);
mLooper.dispatchAll();
verify(mWifiNative).teardownInterface();
verify(mWifiMonitor).stopMonitoring(anyString());
// Force to back disable state for next test
mockEnterDisabledState();
// p2p interface won't initialize when user restriction is set
sendSimpleMsg(mClientMessenger, WifiP2pManager.DISCOVER_PEERS);
verify(mWifiNative, times(1)).setupInterface(any(), any(), any());
verify(mNetdWrapper, times(1)).setInterfaceUp(anyString());
}
/**
* Verify WIFI_P2P_STATE_CHANGED_ACTION broadcast sent when p2p availability changes
*/
@Test
public void checkP2pStateChangedBroadcast() throws Exception {
assumeTrue(SdkLevel.isAtLeastT());
InOrder inOrder = inOrder(mContext);
forceP2pEnabled(mClient1);
inOrder.verify(mContext).sendStickyBroadcastAsUser(argThat(
new WifiP2pServiceImplTest.P2pStateChangedIntentMatcher(
WifiP2pManager.WIFI_P2P_STATE_ENABLED)), any());
// disabled broadcast sent when user restriction is set
simulateUserRestrictionChange(true);
mLooper.dispatchAll();
inOrder.verify(mContext).sendStickyBroadcastAsUser(argThat(
new WifiP2pServiceImplTest.P2pStateChangedIntentMatcher(
WifiP2pManager.WIFI_P2P_STATE_DISABLED)), any());
// no disabled broadcast sent when Wi-Fi is disabled since broadcast already sent
simulateWifiStateChange(false);
mLooper.dispatchAll();
inOrder.verify(mContext, never()).sendStickyBroadcastAsUser(argThat(
new WifiP2pServiceImplTest.P2pStateChangedIntentMatcher(
WifiP2pManager.WIFI_P2P_STATE_DISABLED)), any());
// no enabled broadcast sent when user restriction is removed since Wi-Fi is still disabled
simulateUserRestrictionChange(false);
mLooper.dispatchAll();
inOrder.verify(mContext, never()).sendStickyBroadcastAsUser(argThat(
new WifiP2pServiceImplTest.P2pStateChangedIntentMatcher(
WifiP2pManager.WIFI_P2P_STATE_ENABLED)), any());
// enabled broadcast sent when Wi-Fi is enabled
simulateWifiStateChange(true);
mLooper.dispatchAll();
inOrder.verify(mContext).sendStickyBroadcastAsUser(argThat(
new WifiP2pServiceImplTest.P2pStateChangedIntentMatcher(
WifiP2pManager.WIFI_P2P_STATE_ENABLED)), any());
}
/**
* Verify p2p init / teardown when two clients connect / disconnect
*/
@Test
public void checkIsP2pInitForTwoClientsConnection() throws Exception {
forceP2pEnabled(mClient1);
WorkSource expectedRequestorWs =
new WorkSource(mClient1.getCallingUid(), TEST_PACKAGE_NAME);
reset(mWifiNative);
reset(mNetdWrapper);
reset(mWifiMonitor);
// P2pInit check count should keep in once, same as one client connected case.
checkIsP2pInitWhenClientConnected(false, mClient2, expectedRequestorWs);
checkIsP2pTearDownWhenClientDisconnected(false, mClient2,
new WorkSource(mClient1.getCallingUid(), TEST_PACKAGE_NAME));
checkIsP2pTearDownWhenClientDisconnected(true, mClient1, null);
}
/**
* Verify WifiP2pManager.ADD_LOCAL_SERVICE_FAILED is returned when a caller
* uses abnormal way to send WifiP2pManager.ADD_LOCAL_SERVICE (i.e no channel info updated).
*/
@Test
public void testAddLocalServiceFailureWhenNoChannelUpdated() throws Exception {
forceP2pEnabledWithoutClientInfo();
sendAddLocalServiceMsg(mClientMessenger);
verify(mWifiNative, never()).p2pServiceAdd(any());
assertTrue(mClientHandler.hasMessages(WifiP2pManager.ADD_LOCAL_SERVICE_FAILED));
}
/**
* Verify WifiP2pManager.ADD_LOCAL_SERVICE_FAILED is returned when a caller
* uses wrong package name to initialize a channel.
*/
@Test
public void testAddLocalServiceFailureWhenChannelUpdateWrongPkgName() throws Exception {
forceP2pEnabledWithoutClientInfo();
doThrow(new SecurityException("P2p unit test"))
.when(mWifiPermissionsUtil).checkPackage(anyInt(), anyString());
sendChannelInfoUpdateMsg("wrongpkg", "testFeature", mClient1, mClientMessenger);
sendAddLocalServiceMsg(mClientMessenger);
assertTrue(mClientHandler.hasMessages(WifiP2pManager.ADD_LOCAL_SERVICE_FAILED));
verify(mWifiNative, never()).p2pServiceAdd(any());
}
/**
* Verify WifiP2pManager.ADD_LOCAL_SERVICE_FAILED is returned when a caller
* without proper permission attmepts to send WifiP2pManager.ADD_LOCAL_SERVICE.
*/
@Test
public void testAddLocalServiceFailureWhenCallerPermissionDenied() throws Exception {
setTargetSdkGreaterThanT();
forceP2pEnabled(mClient1);
doNothing().when(mWifiPermissionsUtil).checkPackage(anyInt(), anyString());
if (SdkLevel.isAtLeastT()) {
when(mWifiPermissionsUtil.checkNearbyDevicesPermission(any(), anyBoolean(), any()))
.thenReturn(false);
} else {
when(mWifiPermissionsUtil.checkCanAccessWifiDirect(any(), any(), anyInt(),
anyBoolean())).thenReturn(false);
}
sendAddLocalServiceMsg(mClientMessenger);
assertTrue(mClientHandler.hasMessages(WifiP2pManager.ADD_LOCAL_SERVICE_FAILED));
verify(mWifiNative, never()).p2pServiceAdd(any());
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(
eq(TEST_PACKAGE_NAME), eq("testFeature"), anyInt(), eq(false));
}
}
private void verifyAddLocalService() throws Exception {
doNothing().when(mWifiPermissionsUtil).checkPackage(anyInt(), anyString());
when(mWifiNative.p2pServiceAdd(any())).thenReturn(true);
sendAddLocalServiceMsg(mClientMessenger);
verify(mWifiNative).p2pServiceAdd(any());
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(
eq(TEST_PACKAGE_NAME), eq("testFeature"), anyInt(), eq(false));
}
assertTrue(mClientHandler.hasMessages(WifiP2pManager.ADD_LOCAL_SERVICE_SUCCEEDED));
}
/**
* Verify the caller with proper permission sends WifiP2pManager.ADD_LOCAL_SERVICE.
*/
@Test
public void testAddLocalServiceSuccess() throws Exception {
setTargetSdkGreaterThanT();
forceP2pEnabled(mClient1);
verifyAddLocalService();
}
/**
* Verify WifiP2pManager.ADD_LOCAL_SERVICE_FAILED is returned when native call failure.
*/
@Test
public void testAddLocalServiceFailureWhenNativeCallFailure() throws Exception {
setTargetSdkGreaterThanT();
forceP2pEnabled(mClient1);
doNothing().when(mWifiPermissionsUtil).checkPackage(anyInt(), anyString());
when(mWifiNative.p2pServiceAdd(any())).thenReturn(false);
sendAddLocalServiceMsg(mClientMessenger);
verify(mWifiNative).p2pServiceAdd(any());
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(
eq(TEST_PACKAGE_NAME), eq("testFeature"), anyInt(), eq(false));
}
assertTrue(mClientHandler.hasMessages(WifiP2pManager.ADD_LOCAL_SERVICE_FAILED));
}
/**
* Verify WifiP2pManager.CONNECT_FAILED is returned when a caller
* uses abnormal way to send WifiP2pManager.CONNECT (i.e no channel info updated).
*/
@Test
public void testConnectWithConfigValidAsGroupFailureWhenNoChannelUpdated() throws Exception {
forceP2pEnabledWithoutClientInfo();
sendConnectMsgWithConfigValidAsGroup(mClientMessenger);
assertTrue(mClientHandler.hasMessages(WifiP2pManager.CONNECT_FAILED));
verify(mWifiNative, never()).p2pGroupAdd(any(), anyBoolean());
}
/**
* Verify WifiP2pManager.CONNECT_FAILED is returned when a caller
* uses wrong package name to initialize a channel.
*/
@Test
public void testConnectWithConfigValidAsGroupFailureWhenChannelUpdateWrongPkgName()
throws Exception {
forceP2pEnabledWithoutClientInfo();
doThrow(new SecurityException("P2p unit test"))
.when(mWifiPermissionsUtil).checkPackage(anyInt(), anyString());
sendChannelInfoUpdateMsg("wrongpkg", "testFeature", mClient1, mClientMessenger);
sendConnectMsgWithConfigValidAsGroup(mClientMessenger);
assertTrue(mClientHandler.hasMessages(WifiP2pManager.CONNECT_FAILED));
verify(mWifiNative, never()).p2pGroupAdd(any(), anyBoolean());
}
/**
* Verify WifiP2pManager.CONNECT_FAILED is returned when a caller
* without proper permission attmepts to send WifiP2pManager.CONNECT.
*/
@Test
public void testConnectWithConfigValidAsGroupFailureWhenPermissionDenied() throws Exception {
setTargetSdkGreaterThanT();
forceP2pEnabled(mClient1);
doNothing().when(mWifiPermissionsUtil).checkPackage(anyInt(), anyString());
if (SdkLevel.isAtLeastT()) {
when(mWifiPermissionsUtil.checkNearbyDevicesPermission(any(), anyBoolean(), any()))
.thenReturn(false);
} else {
when(mWifiPermissionsUtil.checkCanAccessWifiDirect(any(), any(), anyInt(),
anyBoolean())).thenReturn(false);
}
sendConnectMsgWithConfigValidAsGroup(mClientMessenger);
assertTrue(mClientHandler.hasMessages(WifiP2pManager.CONNECT_FAILED));
verify(mWifiNative, never()).p2pGroupAdd(any(), anyBoolean());
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(eq(TEST_PACKAGE_NAME),
eq("testFeature"), anyInt(), eq(false));
}
}
/**
* Verify the caller with proper permission sends WifiP2pManager.CONNECT.
*/
@Test
public void testConnectWithConfigValidAsGroupSuccess() throws Exception {
setTargetSdkGreaterThanT();
forceP2pEnabled(mClient1);
when(mWifiNative.p2pGroupAdd(any(), eq(true))).thenReturn(true);
sendConnectMsgWithConfigValidAsGroup(mClientMessenger);
verify(mWifiNative).p2pGroupAdd(any(), eq(true));
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(eq(TEST_PACKAGE_NAME),
eq("testFeature"), anyInt(), eq(false));
}
assertTrue(mClientHandler.hasMessages(WifiP2pManager.CONNECT_SUCCEEDED));
}
/**
* Verify WifiP2pManager.CONNECT_FAILED is returned when native call failure.
*/
@Test
public void testConnectWithConfigValidAsGroupFailureWhenNativeCallFailure() throws Exception {
setTargetSdkGreaterThanT();
forceP2pEnabled(mClient1);
when(mWifiNative.p2pGroupAdd(any(), eq(true))).thenReturn(false);
sendConnectMsgWithConfigValidAsGroup(mClientMessenger);
verify(mWifiNative).p2pGroupAdd(any(), eq(true));
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(eq(TEST_PACKAGE_NAME),
eq("testFeature"), anyInt(), eq(false));
}
assertTrue(mClientHandler.hasMessages(WifiP2pManager.CONNECT_FAILED));
}
/**
* Verify WifiP2pManager.CREATE_GROUP_FAILED is returned when a caller
* uses abnormal way to send WifiP2pManager.CREATE_GROUP (i.e no channel info updated).
*/
@Test
public void testCreateGroupWithConfigValidAsGroupFailureWhenNoChannelUpdated()
throws Exception {
forceP2pEnabledWithoutClientInfo();
sendCreateGroupMsgWithConfigValidAsGroup(mClientMessenger);
assertTrue(mClientHandler.hasMessages(WifiP2pManager.CREATE_GROUP_FAILED));
verify(mWifiNative, never()).p2pGroupAdd(anyBoolean());
verify(mWifiNative, never()).p2pGroupAdd(any(), anyBoolean());
}
/**
* Verify WifiP2pManager.CREATE_GROUP_FAILED is returned with null object when a caller
* uses wrong package name to initialize a channel.
*/
@Test
public void testCreateGroupWithConfigValidAsGroupFailureWhenChannelUpdateWrongPkgName()
throws Exception {
forceP2pEnabledWithoutClientInfo();
doThrow(new SecurityException("P2p unit test"))
.when(mWifiPermissionsUtil).checkPackage(anyInt(), anyString());
sendChannelInfoUpdateMsg("wrongpkg", "testFeature", mClient1, mClientMessenger);
sendCreateGroupMsgWithConfigValidAsGroup(mClientMessenger);
assertTrue(mClientHandler.hasMessages(WifiP2pManager.CREATE_GROUP_FAILED));
verify(mWifiNative, never()).p2pGroupAdd(anyBoolean());
verify(mWifiNative, never()).p2pGroupAdd(any(), anyBoolean());
}
/**
* Verify WifiP2pManager.CREATE_GROUP_FAILED is returned when a caller
* without proper permission attmepts to send WifiP2pManager.CREATE_GROUP.
*/
@Test
public void testCreateGroupWithConfigValidAsGroupFailureWhenPermissionDenied()
throws Exception {
setTargetSdkGreaterThanT();
forceP2pEnabled(mClient1);
doNothing().when(mWifiPermissionsUtil).checkPackage(anyInt(), anyString());
if (SdkLevel.isAtLeastT()) {
when(mWifiPermissionsUtil.checkNearbyDevicesPermission(any(), anyBoolean(), any()))
.thenReturn(false);
} else {
when(mWifiPermissionsUtil.checkCanAccessWifiDirect(any(), any(), anyInt(),
anyBoolean())).thenReturn(false);
}
sendCreateGroupMsgWithConfigValidAsGroup(mClientMessenger);
assertTrue(mClientHandler.hasMessages(WifiP2pManager.CREATE_GROUP_FAILED));
verify(mWifiNative, never()).p2pGroupAdd(anyBoolean());
verify(mWifiNative, never()).p2pGroupAdd(any(), anyBoolean());
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(eq(TEST_PACKAGE_NAME),
eq("testFeature"), anyInt(), eq(false));
}
}
/**
* Verify the caller with proper permission sends WifiP2pManager.CREATE_GROUP.
*/
@Test
public void testCreateGroupWithConfigValidAsGroupSuccess() throws Exception {
setTargetSdkGreaterThanT();
forceP2pEnabled(mClient1);
when(mWifiNative.p2pGroupAdd(any(), eq(false))).thenReturn(true);
sendCreateGroupMsgWithConfigValidAsGroup(mClientMessenger);
verify(mWifiNative).p2pGroupAdd(any(), eq(false));
assertTrue(mClientHandler.hasMessages(WifiP2pManager.CREATE_GROUP_SUCCEEDED));
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
verify(mContext).sendBroadcastWithMultiplePermissions(
argThat(new WifiP2pServiceImplTest
.P2pConnectionChangedIntentMatcherForNetworkState(CONNECTING)), any());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(
eq(TEST_PACKAGE_NAME), eq("testFeature"), anyInt(), eq(false));
verify(mContext, never()).sendBroadcastWithMultiplePermissions(
argThat(new WifiP2pServiceImplTest
.P2pConnectionChangedIntentMatcherForNetworkState(CONNECTING)), any());
}
}
/**
* Verify WifiP2pManager.CREATE_GROUP_FAILED is returned when native call failure.
*/
@Test
public void testCreateGroupWithConfigValidAsGroupFailureWhenNativeCallFailure()
throws Exception {
setTargetSdkGreaterThanT();
forceP2pEnabled(mClient1);
when(mWifiNative.p2pGroupAdd(any(), eq(false))).thenReturn(false);
sendCreateGroupMsgWithConfigValidAsGroup(mClientMessenger);
verify(mWifiNative).p2pGroupAdd(any(), eq(false));
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(eq(TEST_PACKAGE_NAME),
eq("testFeature"), anyInt(), eq(false));
}
assertTrue(mClientHandler.hasMessages(WifiP2pManager.CREATE_GROUP_FAILED));
verify(mWifiP2pMetrics).endConnectionEvent(eq(P2pConnectionEvent.CLF_CREATE_GROUP_FAILED));
}
/**
* Verify WifiP2pManager.DISCOVER_PEERS_FAILED is returned when a caller
* uses abnormal way to send WifiP2pManager.REQUEST_PEERS (i.e no channel info updated).
*/
@Test
public void testDiscoverPeersFailureWhenNoChannelUpdated() throws Exception {
forceP2pEnabledWithoutClientInfo();
sendDiscoverPeersMsg(mClientMessenger);
verify(mWifiNative, never()).p2pFind(anyInt());
assertTrue(mClientHandler.hasMessages(WifiP2pManager.DISCOVER_PEERS_FAILED));
}
/**
* Verify WifiP2pManager.DISCOVER_PEERS_FAILED is returned when a caller
* uses wrong package name to initialize a channel.
*/
@Test
public void testDiscoverPeersFailureWhenChannelUpdateWrongPkgName() throws Exception {
forceP2pEnabledWithoutClientInfo();
doThrow(new SecurityException("P2p unit test"))
.when(mWifiPermissionsUtil).checkPackage(anyInt(), anyString());
sendChannelInfoUpdateMsg("wrongpkg", "testFeature", mClient1, mClientMessenger);
sendDiscoverPeersMsg(mClientMessenger);
verify(mWifiNative, never()).p2pFind(anyInt());
assertTrue(mClientHandler.hasMessages(WifiP2pManager.DISCOVER_PEERS_FAILED));
}
/**
* Verify WifiP2pManager.DISCOVER_PEERS_FAILED is returned with null object when a caller
* without proper permission attmepts to send WifiP2pManager.DISCOVER_PEERS.
*/
@Test
public void testDiscoverPeersFailureWhenPermissionDenied() throws Exception {
setTargetSdkGreaterThanT();
forceP2pEnabled(mClient1);
doNothing().when(mWifiPermissionsUtil).checkPackage(anyInt(), anyString());
if (SdkLevel.isAtLeastT()) {
when(mWifiPermissionsUtil.checkNearbyDevicesPermission(any(), anyBoolean(), any()))
.thenReturn(false);
} else {
when(mWifiPermissionsUtil.checkCanAccessWifiDirect(any(), any(), anyInt(),
anyBoolean())).thenReturn(false);
}
sendDiscoverPeersMsg(mClientMessenger);
verify(mWifiNative, never()).p2pFind(anyInt());
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(eq(TEST_PACKAGE_NAME),
eq("testFeature"), anyInt(), eq(true));
}
assertTrue(mClientHandler.hasMessages(WifiP2pManager.DISCOVER_PEERS_FAILED));
}
/**
* Verify WifiP2pManager.DISCOVER_PEERS_FAILED is returned with null object when a caller
* attmepts to send WifiP2pManager.DISCOVER_PEERS and location mode is disabled.
*/
@Test
public void testDiscoverPeersFailureWhenLocationModeDisabled() throws Exception {
forceP2pEnabled(mClient1);
simulateLocationModeChange(false);
doNothing().when(mWifiPermissionsUtil).checkPackage(anyInt(), anyString());
when(mWifiPermissionsUtil.checkCanAccessWifiDirect(anyString(), anyString(), anyInt(),
eq(false))).thenReturn(true);
when(mWifiPermissionsUtil.checkCanAccessWifiDirect(anyString(), anyString(), anyInt(),
eq(true))).thenReturn(false);
sendDiscoverPeersMsg(mClientMessenger);
verify(mWifiNative, never()).p2pFind(anyInt());
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(eq(TEST_PACKAGE_NAME),
eq("testFeature"), anyInt(), eq(true));
assertTrue(mClientHandler.hasMessages(WifiP2pManager.DISCOVER_PEERS_FAILED));
}
/**
* Verify the caller with proper permission sends WifiP2pManager.DISCOVER_PEERS
* with scan type, WIFI_P2P_SCAN_FULL.
*/
@Test
public void testDiscoverPeersFullSuccess() throws Exception {
setTargetSdkGreaterThanT();
forceP2pEnabled(mClient1);
when(mWifiNative.p2pFind(anyInt())).thenReturn(true);
sendDiscoverPeersMsg(mClientMessenger);
verify(mWifiNative).p2pFind(anyInt());
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(eq(TEST_PACKAGE_NAME),
eq("testFeature"), anyInt(), eq(true));
}
assertTrue(mClientHandler.hasMessages(WifiP2pManager.DISCOVER_PEERS_SUCCEEDED));
verify(mLastCallerInfoManager).put(eq(WifiManager.API_P2P_DISCOVER_PEERS), anyInt(),
anyInt(), anyInt(), anyString(), eq(true));
}
/**
* Verify the caller with proper permission sends WifiP2pManager.DISCOVER_PEERS
* with scan type, WIFI_P2P_SCAN_SOCIAL.
*/
@Test
public void testDiscoverPeersSocialSuccess() throws Exception {
setTargetSdkGreaterThanT();
when(mWifiNative.getSupportedFeatures()).thenReturn(
WifiP2pManager.FEATURE_FLEXIBLE_DISCOVERY);
forceP2pEnabled(mClient1);
when(mWifiNative.p2pFind(anyInt(), anyInt(), anyInt())).thenReturn(true);
sendDiscoverPeersMsg(
mClientMessenger, WifiP2pManager.WIFI_P2P_SCAN_SOCIAL,
WifiP2pManager.WIFI_P2P_SCAN_FREQ_UNSPECIFIED);
verify(mWifiNative).p2pFind(
eq(WifiP2pManager.WIFI_P2P_SCAN_SOCIAL),
eq(WifiP2pManager.WIFI_P2P_SCAN_FREQ_UNSPECIFIED), anyInt());
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(eq(TEST_PACKAGE_NAME),
eq("testFeature"), anyInt(), eq(true));
}
assertTrue(mClientHandler.hasMessages(WifiP2pManager.DISCOVER_PEERS_SUCCEEDED));
}
/**
* Verify the caller with proper permission sends WifiP2pManager.DISCOVER_PEERS
* with scan type, WIFI_P2P_SCAN_SINGLE_FREQ.
*/
@Test
public void testDiscoverPeersSpecificFrequencySuccess() throws Exception {
setTargetSdkGreaterThanT();
when(mWifiNative.getSupportedFeatures()).thenReturn(
WifiP2pManager.FEATURE_FLEXIBLE_DISCOVERY);
forceP2pEnabled(mClient1);
when(mWifiNative.p2pFind(anyInt(), anyInt(), anyInt())).thenReturn(true);
int freq = 2412;
sendDiscoverPeersMsg(
mClientMessenger, WifiP2pManager.WIFI_P2P_SCAN_SINGLE_FREQ, freq);
verify(mWifiNative).p2pFind(
eq(WifiP2pManager.WIFI_P2P_SCAN_SINGLE_FREQ), eq(freq), anyInt());
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(eq(TEST_PACKAGE_NAME),
eq("testFeature"), anyInt(), eq(true));
}
assertTrue(mClientHandler.hasMessages(WifiP2pManager.DISCOVER_PEERS_SUCCEEDED));
}
/**
* Verify WifiP2pManager.DISCOVER_PEERS_FAILED is returned when native call failure.
*/
@Test
public void testDiscoverPeersFailureWhenNativeCallFailure() throws Exception {
setTargetSdkGreaterThanT();
forceP2pEnabled(mClient1);
when(mWifiNative.p2pFind(anyInt())).thenReturn(false);
sendDiscoverPeersMsg(mClientMessenger);
verify(mWifiNative).p2pFind(anyInt());
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(eq(TEST_PACKAGE_NAME),
eq("testFeature"), anyInt(), eq(true));
}
assertTrue(mClientHandler.hasMessages(WifiP2pManager.DISCOVER_PEERS_FAILED));
}
/**
* Verify WifiP2pManager.DISCOVER_SERVICES_FAILED is returned when a caller
* uses abnormal way to send WifiP2pManager.DISCOVER_SERVICES (i.e no channel info updated).
*/
@Test
public void testDiscoverServicesFailureWhenNoChannelUpdated() throws Exception {
when(mWifiNative.p2pServDiscReq(anyString(), anyString())).thenReturn("mServiceDiscReqId");
forceP2pEnabledWithoutClientInfo();
sendAddServiceRequestMsg(mClientMessenger);
sendDiscoverServiceMsg(mClientMessenger);
verify(mWifiNative, never()).p2pServDiscReq(anyString(), anyString());
verify(mWifiNative, never()).p2pFind(anyInt());
assertTrue(mClientHandler.hasMessages(WifiP2pManager.DISCOVER_SERVICES_FAILED));
}
/**
* Verify WifiP2pManager.DISCOVER_SERVICES_FAILED is returned when a caller
* uses wrong package name to initialize a channel.
*/
@Test
public void testDiscoverServicesFailureWhenChannelUpdateWrongPkgName() throws Exception {
when(mWifiNative.p2pServDiscReq(anyString(), anyString())).thenReturn("mServiceDiscReqId");
forceP2pEnabledWithoutClientInfo();
doThrow(new SecurityException("P2p unit test"))
.when(mWifiPermissionsUtil).checkPackage(anyInt(), anyString());
sendChannelInfoUpdateMsg("wrongpkg", "testFeature", mClient1, mClientMessenger);
sendAddServiceRequestMsg(mClientMessenger);
sendDiscoverServiceMsg(mClientMessenger);
verify(mWifiNative, never()).p2pServDiscReq(anyString(), anyString());
verify(mWifiNative, never()).p2pFind(anyInt());
assertTrue(mClientHandler.hasMessages(WifiP2pManager.DISCOVER_SERVICES_FAILED));
}
/**
* Verify WifiP2pManager.DISCOVER_SERVICES_FAILED is returned when a caller
* without proper permission attmepts to send WifiP2pManager.DISCOVER_SERVICES.
*/
@Test
public void testDiscoverServicesFailureWhenPermissionDenied() throws Exception {
setTargetSdkGreaterThanT();
when(mWifiNative.p2pServDiscReq(anyString(), anyString()))
.thenReturn("mServiceDiscReqId");
forceP2pEnabled(mClient1);
doNothing().when(mWifiPermissionsUtil).checkPackage(anyInt(), anyString());
if (SdkLevel.isAtLeastT()) {
when(mWifiPermissionsUtil.checkNearbyDevicesPermission(any(), anyBoolean(), any()))
.thenReturn(false);
} else {
when(mWifiPermissionsUtil.checkCanAccessWifiDirect(any(), any(), anyInt(),
anyBoolean())).thenReturn(false);
}
sendAddServiceRequestMsg(mClientMessenger);
sendDiscoverServiceMsg(mClientMessenger);
verify(mWifiNative, never()).p2pServDiscReq(anyString(), anyString());
verify(mWifiNative, never()).p2pFind(anyInt(), anyInt(), anyInt());
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(eq(TEST_PACKAGE_NAME),
eq("testFeature"), anyInt(), eq(true));
}
assertTrue(mClientHandler.hasMessages(WifiP2pManager.DISCOVER_SERVICES_FAILED));
}
/**
* Verify WifiP2pManager.DISCOVER_SERVICES_FAILED is returned when a caller
* attmepts to send WifiP2pManager.DISCOVER_SERVICES and location mode is disabled.
*/
@Test
public void testDiscoverServicesFailureWhenLocationModeDisabled() throws Exception {
when(mWifiNative.p2pServDiscReq(anyString(), anyString()))
.thenReturn("mServiceDiscReqId");
forceP2pEnabled(mClient1);
simulateLocationModeChange(false);
doNothing().when(mWifiPermissionsUtil).checkPackage(anyInt(), anyString());
when(mWifiPermissionsUtil.checkCanAccessWifiDirect(anyString(), anyString(), anyInt(),
eq(false))).thenReturn(true);
when(mWifiPermissionsUtil.checkCanAccessWifiDirect(anyString(), anyString(), anyInt(),
eq(true))).thenReturn(false);
sendAddServiceRequestMsg(mClientMessenger);
sendDiscoverServiceMsg(mClientMessenger);
verify(mWifiNative, never()).p2pServDiscReq(anyString(), anyString());
verify(mWifiNative, never()).p2pFind(anyInt(), anyInt(), anyInt());
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(eq(TEST_PACKAGE_NAME),
eq("testFeature"), anyInt(), eq(true));
assertTrue(mClientHandler.hasMessages(WifiP2pManager.DISCOVER_SERVICES_FAILED));
}
/**
* Verify the caller with proper permission sends WifiP2pManager.DISCOVER_SERVICES.
*/
@Test
public void testDiscoverServicesSuccess() throws Exception {
setTargetSdkGreaterThanT();
when(mWifiNative.p2pServDiscReq(anyString(), anyString()))
.thenReturn("mServiceDiscReqId");
when(mWifiNative.p2pFind(anyInt())).thenReturn(true);
forceP2pEnabled(mClient1);
sendAddServiceRequestMsg(mClientMessenger);
sendDiscoverServiceMsg(mClientMessenger);
verify(mWifiNative).p2pServDiscReq(anyString(), anyString());
verify(mWifiNative, atLeastOnce()).p2pFind(anyInt());
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(eq(TEST_PACKAGE_NAME),
eq("testFeature"), anyInt(), eq(true));
}
assertTrue(mClientHandler.hasMessages(WifiP2pManager.DISCOVER_SERVICES_SUCCEEDED));
}
/**
* Verify WifiP2pManager.DISCOVER_SERVICES_FAILED is returned when add service failure.
*/
@Test
public void testDiscoverServicesFailureWhenAddServiceRequestFailure() throws Exception {
setTargetSdkGreaterThanT();
when(mWifiNative.p2pServDiscReq(anyString(), anyString())).thenReturn(null);
forceP2pEnabled(mClient1);
sendAddServiceRequestMsg(mClientMessenger);
sendDiscoverServiceMsg(mClientMessenger);
verify(mWifiNative).p2pServDiscReq(anyString(), anyString());
verify(mWifiNative, never()).p2pFind(anyInt(), anyInt(), anyInt());
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(eq(TEST_PACKAGE_NAME),
eq("testFeature"), anyInt(), eq(true));
}
assertTrue(mClientHandler.hasMessages(WifiP2pManager.DISCOVER_SERVICES_FAILED));
}
/**
* Verify WifiP2pManager.DISCOVER_SERVICES_FAILED is returned when native call failure.
*/
@Test
public void testDiscoverServicesFailureWhenNativeCallFailure() throws Exception {
setTargetSdkGreaterThanT();
when(mWifiNative.p2pServDiscReq(anyString(), anyString()))
.thenReturn("mServiceDiscReqId");
when(mWifiNative.p2pFind(anyInt())).thenReturn(false);
forceP2pEnabled(mClient1);
sendAddServiceRequestMsg(mClientMessenger);
sendDiscoverServiceMsg(mClientMessenger);
verify(mWifiNative).p2pServDiscReq(anyString(), anyString());
verify(mWifiNative).p2pFind(anyInt());
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(eq(TEST_PACKAGE_NAME),
eq("testFeature"), anyInt(), eq(true));
}
assertTrue(mClientHandler.hasMessages(WifiP2pManager.DISCOVER_SERVICES_FAILED));
}
/**
* Verify WifiP2pManager.RESPONSE_PEERS is returned with null object when a caller
* uses abnormal way to send WifiP2pManager.REQUEST_PEERS (i.e no channel info updated).
*/
@Test
public void testRequestPeersFailureWhenNoChannelUpdated() throws Exception {
forceP2pEnabledWithoutClientInfo();
mockPeersList();
sendRequestPeersMsg(mClientMessenger);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
WifiP2pDeviceList peers = (WifiP2pDeviceList) mMessageCaptor.getValue().obj;
assertEquals(WifiP2pManager.RESPONSE_PEERS, mMessageCaptor.getValue().what);
assertNull(peers.get(mTestWifiP2pDevice.deviceAddress));
}
/**
* Verify WifiP2pManager.RESPONSE_PEERS is returned with null object when a caller
* uses wrong package name to initialize a channel.
*/
@Test
public void testRequestPeersFailureWhenChannelUpdateWrongPkgName() throws Exception {
forceP2pEnabledWithoutClientInfo();
mockPeersList();
doThrow(new SecurityException("P2p unit test"))
.when(mWifiPermissionsUtil).checkPackage(anyInt(), anyString());
sendChannelInfoUpdateMsg("wrongpkg", "testFeature", mClient1, mClientMessenger);
sendRequestPeersMsg(mClientMessenger);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
WifiP2pDeviceList peers = (WifiP2pDeviceList) mMessageCaptor.getValue().obj;
assertEquals(WifiP2pManager.RESPONSE_PEERS, mMessageCaptor.getValue().what);
assertNull(peers.get(mTestWifiP2pDevice.deviceAddress));
}
/**
* Verify WifiP2pManager.RESPONSE_PEERS is returned with null object when a caller
* without proper permission attmepts to send WifiP2pManager.REQUEST_PEERS.
*/
@Test
public void testRequestPeersFailureWhenPermissionDenied() throws Exception {
setTargetSdkGreaterThanT();
forceP2pEnabled(mClient1);
mockPeersList();
doNothing().when(mWifiPermissionsUtil).checkPackage(anyInt(), anyString());
if (SdkLevel.isAtLeastT()) {
when(mWifiPermissionsUtil.checkNearbyDevicesPermission(any(), anyBoolean(), any()))
.thenReturn(false);
} else {
when(mWifiPermissionsUtil.checkCanAccessWifiDirect(any(), any(), anyInt(),
anyBoolean())).thenReturn(false);
}
sendRequestPeersMsg(mClientMessenger);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(eq(TEST_PACKAGE_NAME),
eq("testFeature"), anyInt(), eq(true));
}
WifiP2pDeviceList peers = (WifiP2pDeviceList) mMessageCaptor.getValue().obj;
assertEquals(WifiP2pManager.RESPONSE_PEERS, mMessageCaptor.getValue().what);
assertNull(peers.get(mTestWifiP2pDevice.deviceAddress));
}
/**
* Verify WifiP2pManager.RESPONSE_PEERS is returned with null object when a caller
* attmepts to send WifiP2pManager.REQUEST_PEERS and location mode is disabled.
*/
@Test
public void testRequestPeersFailureWhenLocationModeDisabled() throws Exception {
forceP2pEnabled(mClient1);
simulateLocationModeChange(false);
mockPeersList();
doNothing().when(mWifiPermissionsUtil).checkPackage(anyInt(), anyString());
when(mWifiPermissionsUtil.checkCanAccessWifiDirect(anyString(), anyString(), anyInt(),
eq(false))).thenReturn(true);
when(mWifiPermissionsUtil.checkCanAccessWifiDirect(anyString(), anyString(), anyInt(),
eq(true))).thenReturn(false);
sendRequestPeersMsg(mClientMessenger);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(eq(TEST_PACKAGE_NAME),
eq("testFeature"), anyInt(), eq(true));
WifiP2pDeviceList peers = (WifiP2pDeviceList) mMessageCaptor.getValue().obj;
assertEquals(WifiP2pManager.RESPONSE_PEERS, mMessageCaptor.getValue().what);
assertNull(peers.get(mTestWifiP2pDevice.deviceAddress));
}
/**
* Verify WifiP2pManager.RESPONSE_PEERS is returned with expect object when a caller
* with proper permission to send WifiP2pManager.REQUEST_PEERS.
*/
@Test
public void testRequestPeersSuccess() throws Exception {
setTargetSdkGreaterThanT();
forceP2pEnabled(mClient1);
mockPeersList();
sendRequestPeersMsg(mClientMessenger);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(eq(TEST_PACKAGE_NAME),
eq("testFeature"), anyInt(), eq(true));
}
WifiP2pDeviceList peers = (WifiP2pDeviceList) mMessageCaptor.getValue().obj;
assertEquals(WifiP2pManager.RESPONSE_PEERS, mMessageCaptor.getValue().what);
assertNotEquals(null, peers.get(mTestWifiP2pDevice.deviceAddress));
}
/**
* Verify WifiP2pManager.RESPONSE_GROUP_INFO is returned with null object when a caller
* uses abnormal way to send WifiP2pManager.REQUEST_GROUP_INFO (i.e no channel info updated).
*/
@Test
public void testRequestGroupInfoFailureWhenNoChannelUpdated() throws Exception {
forceP2pEnabledWithoutClientInfo();
reset(mClientHandler);
sendGroupStartedMsg(mTestWifiP2pGroup);
sendRequestGroupInfoMsg(mClientMessenger);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
assertEquals(WifiP2pManager.RESPONSE_GROUP_INFO, mMessageCaptor.getValue().what);
assertNull(mMessageCaptor.getValue().obj);
}
/**
* Verify WifiP2pManager.RESPONSE_GROUP_INFO is returned with null object when a caller
* uses wrong package name to initialize a channel.
*/
@Test
public void testRequestGroupInfoFailureWhenChannelUpdateWrongPkgName() throws Exception {
assumeTrue(SdkLevel.isAtLeastT());
when(mWifiPermissionsUtil.isTargetSdkLessThan(any(), anyInt(), anyInt()))
.thenReturn(false);
forceP2pEnabled(mClient1);
sendGroupStartedMsg(mTestWifiP2pGroup);
simulateTetherReady();
doThrow(new SecurityException("P2p unit test"))
.when(mWifiPermissionsUtil).checkPackage(anyInt(), anyString());
sendRequestGroupInfoMsg(mClientMessenger);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
assertEquals(WifiP2pManager.RESPONSE_GROUP_INFO, mMessageCaptor.getValue().what);
assertNull(mMessageCaptor.getValue().obj);
}
/**
* Verify WifiP2pManager.RESPONSE_GROUP_INFO is returned with null object when a caller
* without proper permission attempts to send WifiP2pManager.REQUEST_GROUP_INFO.
*/
@Test
public void testRequestGroupInfoFailureWhenPermissionDenied() throws Exception {
setTargetSdkGreaterThanT();
forceP2pEnabled(mClient1);
sendGroupStartedMsg(mTestWifiP2pGroup);
simulateTetherReady();
doNothing().when(mWifiPermissionsUtil).checkPackage(anyInt(), anyString());
if (SdkLevel.isAtLeastT()) {
when(mWifiPermissionsUtil.checkNearbyDevicesPermission(any(), anyBoolean(), any()))
.thenReturn(false);
} else {
when(mWifiPermissionsUtil.checkCanAccessWifiDirect(any(), any(), anyInt(),
anyBoolean())).thenReturn(false);
}
sendRequestGroupInfoMsg(mClientMessenger);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(eq(TEST_PACKAGE_NAME),
eq("testFeature"), anyInt(), eq(false));
}
assertEquals(WifiP2pManager.RESPONSE_GROUP_INFO, mMessageCaptor.getValue().what);
assertNull(mMessageCaptor.getValue().obj);
}
/**
* Verify WifiP2pManager.RESPONSE_GROUP_INFO is returned with expect object when a caller
* with proper permission.
*/
@Test
public void testRequestGroupInfoSuccess() throws Exception {
setTargetSdkGreaterThanT();
mTestWifiP2pGroup.setOwner(mTestThisDevice);
forceP2pEnabled(mClient1);
sendGroupStartedMsg(mTestWifiP2pGroup);
simulateTetherReady();
when(mWifiPermissionsUtil.checkLocalMacAddressPermission(anyInt())).thenReturn(false);
sendRequestGroupInfoMsg(mClientMessenger);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(eq(TEST_PACKAGE_NAME),
eq("testFeature"), anyInt(), eq(false));
}
assertEquals(WifiP2pManager.RESPONSE_GROUP_INFO, mMessageCaptor.getValue().what);
WifiP2pGroup wifiP2pGroup = (WifiP2pGroup) mMessageCaptor.getValue().obj;
assertEquals(mTestWifiP2pGroup.getNetworkName(), wifiP2pGroup.getNetworkName());
// Ensure that our own MAC address is anonymized if we're the group owner.
assertEquals(ANONYMIZED_DEVICE_ADDRESS, wifiP2pGroup.getOwner().deviceAddress);
}
/**
* Verify WifiP2pManager.RESPONSE_GROUP_INFO does not anonymize this device's MAC address when
* requested by an app with the LOCAL_MAC_ADDRESS permission.
*/
@Test
public void testRequestGroupInfoIncludesMacForNetworkSettingsApp() throws Exception {
setTargetSdkGreaterThanT();
mTestWifiP2pGroup.setOwner(mTestThisDevice);
forceP2pEnabled(mClient1);
sendGroupStartedMsg(mTestWifiP2pGroup);
simulateTetherReady();
when(mWifiPermissionsUtil.checkLocalMacAddressPermission(anyInt())).thenReturn(true);
sendRequestGroupInfoMsg(mClientMessenger);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(eq(TEST_PACKAGE_NAME),
eq("testFeature"), anyInt(), eq(false));
}
assertEquals(WifiP2pManager.RESPONSE_GROUP_INFO, mMessageCaptor.getValue().what);
WifiP2pGroup wifiP2pGroup = (WifiP2pGroup) mMessageCaptor.getValue().obj;
assertEquals(thisDeviceMac, wifiP2pGroup.getOwner().deviceAddress);
}
/**
* Verify WifiP2pManager.START_LISTEN_FAILED is returned when a caller
* without proper permission attempts to send WifiP2pManager.START_LISTEN.
*/
@Test
public void testStartListenFailureWhenPermissionDenied() throws Exception {
when(mWifiPermissionsUtil.checkCanAccessWifiDirect(anyString(), anyString(), anyInt(),
anyBoolean())).thenReturn(false);
forceP2pEnabled(mClient1);
sendSimpleMsg(mClientMessenger, WifiP2pManager.START_LISTEN);
assertTrue(mClientHandler.hasMessages(WifiP2pManager.START_LISTEN_FAILED));
// p2pFlush should be invoked once in forceP2pEnabled.
verify(mWifiNative).p2pFlush();
verify(mWifiNative, never()).p2pStopFind();
verify(mWifiNative, never()).p2pExtListen(anyBoolean(), anyInt(), anyInt());
}
/**
* Verify WifiP2pManager.START_LISTEN_FAILED is returned when native call failure.
*/
@Test
public void testStartListenFailureWhenNativeCallFailure() throws Exception {
setTargetSdkGreaterThanT();
when(mWifiNative.p2pExtListen(eq(true), anyInt(), anyInt())).thenReturn(false);
forceP2pEnabled(mClient1);
sendSimpleMsg(mClientMessenger, WifiP2pManager.START_LISTEN);
// p2pFlush should be invoked once in forceP2pEnabled.
verify(mWifiNative).p2pFlush();
verify(mWifiNative).p2pStopFind();
verify(mWifiNative).p2pExtListen(eq(true), eq(P2P_EXT_LISTEN_PERIOD_MS),
eq(P2P_EXT_LISTEN_INTERVAL_MS));
assertTrue(mClientHandler.hasMessages(WifiP2pManager.START_LISTEN_FAILED));
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(eq(TEST_PACKAGE_NAME),
eq("testFeature"), anyInt(), eq(true));
}
}
/**
* Verify the caller with proper permission sends WifiP2pManager.START_LISTEN.
*/
@Test
public void testStartListenSuccess() throws Exception {
setTargetSdkGreaterThanT();
when(mWifiNative.p2pExtListen(eq(true), anyInt(), anyInt())).thenReturn(true);
forceP2pEnabled(mClient1);
sendSimpleMsg(mClientMessenger, WifiP2pManager.START_LISTEN);
// p2pFlush should be invoked once in forceP2pEnabled.
verify(mWifiNative).p2pFlush();
verify(mWifiNative).p2pStopFind();
verify(mWifiNative).p2pExtListen(eq(true), eq(P2P_EXT_LISTEN_PERIOD_MS),
eq(P2P_EXT_LISTEN_INTERVAL_MS));
assertTrue(mClientHandler.hasMessages(WifiP2pManager.START_LISTEN_SUCCEEDED));
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(eq(TEST_PACKAGE_NAME),
eq("testFeature"), anyInt(), eq(true));
}
}
/**
* Verify the caller with proper permission sends WifiP2pManager.START_LISTEN.
*/
@Test
public void testStartListenSuccessWithGroup() throws Exception {
setTargetSdkGreaterThanT();
when(mWifiNative.p2pExtListen(eq(true), anyInt(), anyInt())).thenReturn(true);
mockEnterGroupCreatedState();
sendSimpleMsg(mClientMessenger, WifiP2pManager.START_LISTEN);
// p2pFlush should be invoked once in forceP2pEnabled.
verify(mWifiNative).p2pFlush();
verify(mWifiNative).p2pStopFind();
verify(mWifiNative).p2pExtListen(eq(true), eq(P2P_EXT_LISTEN_PERIOD_MS),
eq(P2P_EXT_LISTEN_INTERVAL_MS));
assertTrue(mClientHandler.hasMessages(WifiP2pManager.START_LISTEN_SUCCEEDED));
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(eq(TEST_PACKAGE_NAME),
eq("testFeature"), anyInt(), eq(true));
}
verify(mLastCallerInfoManager).put(eq(WifiManager.API_P2P_START_LISTENING), anyInt(),
anyInt(), anyInt(), anyString(), eq(true));
}
@Test
public void testStartListenAndSetChannelFailureWithDefaultStateHandling() throws Exception {
setTargetSdkGreaterThanT();
when(mInterfaceConflictManager.manageInterfaceConflictForStateMachine(any(), any(), any(),
any(), any(), eq(HalDeviceManager.HDM_CREATE_IFACE_P2P), any(), anyBoolean()))
.thenReturn(InterfaceConflictManager.ICM_ABORT_COMMAND);
mockEnterDisabledState();
sendSimpleMsg(mClientMessenger, WifiP2pManager.START_LISTEN);
verify(mWifiNative, never()).setupInterface(any(), any(), any());
assertTrue(mClientHandler.hasMessages(WifiP2pManager.START_LISTEN_FAILED));
mockEnterDisabledState();
sendSimpleMsg(mClientMessenger, WifiP2pManager.SET_CHANNEL);
verify(mWifiNative, never()).setupInterface(any(), any(), any());
assertTrue(mClientHandler.hasMessages(WifiP2pManager.SET_CHANNEL_FAILED));
}
/**
* Verify WifiP2pManager.STOP_LISTEN_FAILED is returned when native call failure.
*/
@Test
public void testStopListenFailureWhenNativeCallFailure() throws Exception {
when(mWifiNative.p2pExtListen(eq(false), anyInt(), anyInt())).thenReturn(false);
forceP2pEnabled(mClient1);
sendSimpleMsg(mClientMessenger, WifiP2pManager.STOP_LISTEN);
verify(mWifiNative).p2pStopFind();
verify(mWifiNative).p2pExtListen(eq(false), anyInt(), anyInt());
assertTrue(mClientHandler.hasMessages(WifiP2pManager.STOP_LISTEN_FAILED));
}
/**
* Verify the caller with proper permission sends WifiP2pManager.STOP_LISTEN.
*/
@Test
public void testStopListenSuccess() throws Exception {
when(mWifiNative.p2pExtListen(eq(false), anyInt(), anyInt())).thenReturn(true);
forceP2pEnabled(mClient1);
sendSimpleMsg(mClientMessenger, WifiP2pManager.STOP_LISTEN);
verify(mWifiNative).p2pStopFind();
verify(mWifiNative).p2pExtListen(eq(false), anyInt(), anyInt());
assertTrue(mClientHandler.hasMessages(WifiP2pManager.STOP_LISTEN_SUCCEEDED));
verify(mLastCallerInfoManager).put(eq(WifiManager.API_P2P_STOP_LISTENING), anyInt(),
anyInt(), anyInt(), anyString(), eq(true));
}
/** Verify the p2p randomized MAC feature is enabled if OEM supports it. */
@Test
public void testP2pRandomMacWithOemSupport() throws Exception {
when(mWifiGlobals.isP2pMacRandomizationSupported()).thenReturn(true);
forceP2pEnabled(mClient1);
verify(mWifiNative, never()).setMacRandomization(eq(false));
verify(mWifiNative).setMacRandomization(eq(true));
}
/** Verify the p2p randomized MAC feature is disabled if OEM does not support it. */
@Test
public void testP2pRandomMacWithoutOemSupport() throws Exception {
when(mWifiGlobals.isP2pMacRandomizationSupported()).thenReturn(false);
forceP2pEnabled(mClient1);
verify(mWifiNative, never()).setMacRandomization(eq(true));
verify(mWifiNative).setMacRandomization(eq(false));
}
/**
* Verify the caller sends WifiP2pManager.DELETE_PERSISTENT_GROUP.
*/
@Test
public void testDeletePersistentGroupSuccess() throws Exception {
// Move to enabled state
forceP2pEnabled(mClient1);
sendDeletePersistentGroupMsg(mClientMessenger, WifiP2pGroup.NETWORK_ID_PERSISTENT);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.DELETE_PERSISTENT_GROUP_SUCCEEDED, message.what);
}
/**
* Verify that respond with DELETE_PERSISTENT_GROUP_FAILED
* when caller sends DELETE_PERSISTENT_GROUP and p2p is disabled.
*/
@Test
public void testDeletePersistentGroupFailureWhenP2pDisabled() throws Exception {
sendDeletePersistentGroupMsg(mClientMessenger, WifiP2pGroup.NETWORK_ID_PERSISTENT);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.DELETE_PERSISTENT_GROUP_FAILED, message.what);
assertEquals(WifiP2pManager.BUSY, message.arg1);
}
/**
* Verify that respond with DELETE_PERSISTENT_GROUP_FAILED
* when caller sends DELETE_PERSISTENT_GROUP and p2p is unsupported.
*/
@Test
public void testDeletePersistentGroupFailureWhenP2pUnsupported() throws Exception {
setUpWifiP2pServiceImpl(false);
sendDeletePersistentGroupMsg(mClientMessenger, WifiP2pGroup.NETWORK_ID_PERSISTENT);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.DELETE_PERSISTENT_GROUP_FAILED, message.what);
assertEquals(WifiP2pManager.P2P_UNSUPPORTED, message.arg1);
}
/**
* Verify that respond with DELETE_PERSISTENT_GROUP_FAILED
* when caller sends DELETE_PERSISTENT_GROUP and doesn't have the necessary permissions.
*/
@Test
public void testDeletePersistentGroupFailureWhenNoPermissions() throws Exception {
// Move to enabled state
forceP2pEnabled(mClient1);
// no permissions held
when(mWifiPermissionsUtil.checkNetworkSettingsPermission(anyInt())).thenReturn(false);
when(mWifiPermissionsUtil.checkNetworkStackPermission(anyInt())).thenReturn(false);
when(mWifiPermissionsUtil.checkConfigOverridePermission(anyInt())).thenReturn(false);
sendDeletePersistentGroupMsg(mClientMessenger, WifiP2pGroup.NETWORK_ID_PERSISTENT);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.DELETE_PERSISTENT_GROUP_FAILED, message.what);
assertEquals(WifiP2pManager.ERROR, message.arg1);
}
/**
* Verify the peer scan counter is increased while receiving WifiP2pManager.DISCOVER_PEERS at
* P2pEnabledState.
*/
@Test
public void testPeerScanMetricWhenSendDiscoverPeers() throws Exception {
setTargetSdkGreaterThanT();
forceP2pEnabled(mClient1);
when(mWifiNative.p2pFind(anyInt())).thenReturn(true);
sendDiscoverPeersMsg(mClientMessenger);
verify(mWifiP2pMetrics).incrementPeerScans();
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(eq(TEST_PACKAGE_NAME),
eq("testFeature"), anyInt(), eq(true));
}
}
/**
* Verify the service scan counter is increased while receiving
* WifiP2pManager.DISCOVER_SERVICES at P2pEnabledState.
*/
@Test
public void testServiceScanMetricWhenSendDiscoverServices() throws Exception {
setTargetSdkGreaterThanT();
when(mWifiNative.p2pServDiscReq(anyString(), anyString()))
.thenReturn("mServiceDiscReqId");
when(mWifiNative.p2pFind(anyInt())).thenReturn(true);
forceP2pEnabled(mClient1);
sendAddServiceRequestMsg(mClientMessenger);
sendDiscoverServiceMsg(mClientMessenger);
verify(mWifiP2pMetrics).incrementServiceScans();
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(eq(TEST_PACKAGE_NAME),
eq("testFeature"), anyInt(), eq(true));
}
}
/**
* Verify the persistent group counter is updated while receiving
* WifiP2pManager.FACTORY_RESET.
*/
@Test
public void testPersistentGroupMetricWhenSendFactoryReset() throws Exception {
forceP2pEnabled(mClient1);
// permissions for factory reset
when(mWifiPermissionsUtil.checkNetworkSettingsPermission(anyInt()))
.thenReturn(true);
when(mUserManager.hasUserRestrictionForUser(eq(UserManager.DISALLOW_NETWORK_RESET), any()))
.thenReturn(false);
when(mUserManager.hasUserRestrictionForUser(eq(UserManager.DISALLOW_CONFIG_WIFI), any()))
.thenReturn(false);
ArgumentCaptor<WifiP2pGroupList> groupsCaptor =
ArgumentCaptor.forClass(WifiP2pGroupList.class);
verify(mWifiP2pMetrics).updatePersistentGroup(groupsCaptor.capture());
assertEquals(3, groupsCaptor.getValue().getGroupList().size());
sendSimpleMsg(mClientMessenger, WifiP2pManager.FACTORY_RESET);
verify(mWifiP2pMetrics, times(2)).updatePersistentGroup(groupsCaptor.capture());
// the captured object is the same object, just get the latest one is ok.
assertEquals(0, groupsCaptor.getValue().getGroupList().size());
}
/**
* Verify the persistent group counter is updated while receiving
* WifiP2pMonitor.P2P_GROUP_STARTED_EVENT.
*/
@Test
public void testPersistentGroupMetricWhenSendP2pGroupStartedEvent() throws Exception {
forceP2pEnabled(mClient1);
ArgumentCaptor<WifiP2pGroupList> groupsCaptor =
ArgumentCaptor.forClass(WifiP2pGroupList.class);
verify(mWifiP2pMetrics).updatePersistentGroup(groupsCaptor.capture());
assertEquals(3, groupsCaptor.getValue().getGroupList().size());
sendGroupStartedMsg(mTestWifiP2pNewPersistentGoGroup);
simulateTetherReady();
verify(mWifiP2pMetrics, times(2)).updatePersistentGroup(groupsCaptor.capture());
// the captured object is the same object, just get the latest one is ok.
assertEquals(4, groupsCaptor.getValue().getGroupList().size());
}
/**
* Verify the persistent group counter is updated while receiving
* WifiP2pManager.DELETE_PERSISTENT_GROUP.
*/
@Test
public void testPersistentGroupMetricWhenSendDeletePersistentGroup() throws Exception {
forceP2pEnabled(mClient1);
ArgumentCaptor<WifiP2pGroupList> groupsCaptor =
ArgumentCaptor.forClass(WifiP2pGroupList.class);
verify(mWifiP2pMetrics).updatePersistentGroup(groupsCaptor.capture());
assertEquals(3, groupsCaptor.getValue().getGroupList().size());
sendDeletePersistentGroupMsg(mClientMessenger, 0);
verify(mWifiP2pMetrics, times(2)).updatePersistentGroup(groupsCaptor.capture());
// the captured object is the same object, just get the latest one is ok.
assertEquals(2, groupsCaptor.getValue().getGroupList().size());
}
/**
* Verify the group event.
*/
@Test
public void testGroupEventMetric() throws Exception {
forceP2pEnabled(mClient1);
sendGroupStartedMsg(mTestWifiP2pNewPersistentGoGroup);
simulateTetherReady();
ArgumentCaptor<WifiP2pGroup> groupCaptor =
ArgumentCaptor.forClass(WifiP2pGroup.class);
verify(mWifiP2pMetrics).startGroupEvent(groupCaptor.capture());
WifiP2pGroup groupCaptured = groupCaptor.getValue();
assertEquals(mTestWifiP2pNewPersistentGoGroup.toString(), groupCaptured.toString());
sendGroupRemovedMsg();
verify(mWifiP2pMetrics).endGroupEvent();
}
/**
* Verify the connection event for a fresh connection.
*/
@Test
public void testStartFreshConnectionEventWhenSendConnect() throws Exception {
setTargetSdkGreaterThanT();
forceP2pEnabled(mClient1);
mockPeersList();
sendConnectMsg(mClientMessenger, mTestWifiP2pPeerConfig);
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(eq(TEST_PACKAGE_NAME),
eq("testFeature"), anyInt(), eq(false));
}
ArgumentCaptor<WifiP2pConfig> configCaptor =
ArgumentCaptor.forClass(WifiP2pConfig.class);
verify(mWifiP2pMetrics).startConnectionEvent(
eq(P2pConnectionEvent.CONNECTION_FRESH),
configCaptor.capture(),
eq(WifiMetricsProto.GroupEvent.GROUP_UNKNOWN),
eq(mClient1.getCallingUid()));
assertEquals(mTestWifiP2pPeerConfig.toString(), configCaptor.getValue().toString());
verify(mLastCallerInfoManager).put(eq(WifiManager.API_P2P_CONNECT), anyInt(),
anyInt(), anyInt(), anyString(), eq(true));
}
/**
* Verify the connection event for a reinvoked connection.
*/
@Test
public void testStartReinvokeConnectionEventWhenSendConnect() throws Exception {
setTargetSdkGreaterThanT();
forceP2pEnabled(mClient1);
when(mWifiNative.p2pGroupAdd(anyInt()))
.thenReturn(true);
when(mTestWifiP2pDevice.isGroupOwner()).thenReturn(true);
when(mWifiNative.p2pGetSsid(eq(mTestWifiP2pDevice.deviceAddress)))
.thenReturn(mTestWifiP2pGroup.getNetworkName());
mockPeersList();
sendConnectMsg(mClientMessenger, mTestWifiP2pPeerConfig);
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(eq(TEST_PACKAGE_NAME),
eq("testFeature"), anyInt(), eq(false));
}
ArgumentCaptor<WifiP2pConfig> configCaptor =
ArgumentCaptor.forClass(WifiP2pConfig.class);
verify(mWifiP2pMetrics).startConnectionEvent(
eq(P2pConnectionEvent.CONNECTION_REINVOKE),
configCaptor.capture(),
eq(WifiMetricsProto.GroupEvent.GROUP_UNKNOWN),
eq(mClient1.getCallingUid()));
assertEquals(mTestWifiP2pPeerConfig.toString(), configCaptor.getValue().toString());
}
/**
* Verify the connection event for a reinvoked connection via
* createGroup API.
*
* If there is a persistent group whose owner is this deivce, this would be
* a reinvoked group.
*/
@Test
public void testStartReinvokeConnectionEventWhenCreateGroup()
throws Exception {
setTargetSdkGreaterThanT();
forceP2pEnabled(mClient1);
sendCreateGroupMsg(mClientMessenger, WifiP2pGroup.NETWORK_ID_PERSISTENT, null);
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(
eq(TEST_PACKAGE_NAME), eq("testFeature"), anyInt(), eq(false));
}
verify(mWifiP2pMetrics).startConnectionEvent(
eq(P2pConnectionEvent.CONNECTION_REINVOKE),
eq(null),
eq(WifiMetricsProto.GroupEvent.GROUP_OWNER),
eq(mClient1.getCallingUid()));
verify(mLastCallerInfoManager).put(eq(WifiManager.API_P2P_CREATE_GROUP), anyInt(),
anyInt(), anyInt(), anyString(), eq(true));
}
/**
* Verify the connection event for a local connection while setting
* netId to {@link WifiP2pGroup#NETWORK_ID_PERSISTENT}.
*/
@Test
public void testStartLocalConnectionWhenCreateGroup() throws Exception {
mGroups.clear();
setTargetSdkGreaterThanT();
forceP2pEnabled(mClient1);
sendCreateGroupMsg(mClientMessenger, WifiP2pGroup.NETWORK_ID_PERSISTENT, null);
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(
eq(TEST_PACKAGE_NAME), eq("testFeature"), anyInt(), eq(false));
}
verify(mWifiP2pMetrics).startConnectionEvent(
eq(P2pConnectionEvent.CONNECTION_LOCAL),
eq(null),
eq(WifiMetricsProto.GroupEvent.GROUP_OWNER),
eq(mClient1.getCallingUid()));
}
/**
* Verify the connection event for a local connection while setting the
* netId to {@link WifiP2pGroup#NETWORK_ID_TEMPORARY}.
*/
@Test
public void testStartLocalConnectionEventWhenCreateTemporaryGroup() throws Exception {
setTargetSdkGreaterThanT();
forceP2pEnabled(mClient1);
sendCreateGroupMsg(mClientMessenger, WifiP2pGroup.NETWORK_ID_TEMPORARY, null);
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(
eq(TEST_PACKAGE_NAME), eq("testFeature"), anyInt(), eq(false));
}
verify(mWifiP2pMetrics).startConnectionEvent(
eq(P2pConnectionEvent.CONNECTION_LOCAL),
eq(null),
eq(WifiMetricsProto.GroupEvent.GROUP_OWNER),
eq(mClient1.getCallingUid()));
}
/**
* Verify the connection event for a fast connection via
* connect with config.
*/
@Test
public void testStartFastConnectionEventWhenSendConnectWithConfig()
throws Exception {
setTargetSdkGreaterThanT();
forceP2pEnabled(mClient1);
when(mWifiNative.p2pGroupAdd(any(), eq(true))).thenReturn(true);
sendConnectMsg(mClientMessenger, mTestWifiP2pFastConnectionConfig);
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(eq(TEST_PACKAGE_NAME),
eq("testFeature"), anyInt(), eq(false));
}
ArgumentCaptor<WifiP2pConfig> configCaptor =
ArgumentCaptor.forClass(WifiP2pConfig.class);
verify(mWifiP2pMetrics).startConnectionEvent(
eq(P2pConnectionEvent.CONNECTION_FAST),
configCaptor.capture(),
eq(WifiMetricsProto.GroupEvent.GROUP_CLIENT),
eq(mClient1.getCallingUid()));
assertEquals(mTestWifiP2pFastConnectionConfig.toString(),
configCaptor.getValue().toString());
}
/**
* Verify the connection event for a fast connection via
* createGroup API with config.
*/
@Test
public void testStartFastConnectionEventWhenCreateGroupWithConfig()
throws Exception {
setTargetSdkGreaterThanT();
forceP2pEnabled(mClient1);
sendCreateGroupMsg(mClientMessenger, 0, mTestWifiP2pFastConnectionConfig);
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(
eq(TEST_PACKAGE_NAME), eq("testFeature"), anyInt(), eq(false));
}
ArgumentCaptor<WifiP2pConfig> configCaptor =
ArgumentCaptor.forClass(WifiP2pConfig.class);
verify(mWifiP2pMetrics).startConnectionEvent(
eq(P2pConnectionEvent.CONNECTION_FAST),
configCaptor.capture(),
eq(WifiMetricsProto.GroupEvent.GROUP_OWNER),
eq(mClient1.getCallingUid()));
assertEquals(mTestWifiP2pFastConnectionConfig.toString(),
configCaptor.getValue().toString());
verify(mLastCallerInfoManager).put(eq(WifiManager.API_P2P_CREATE_GROUP_P2P_CONFIG),
anyInt(), anyInt(), anyInt(), anyString(), eq(true));
}
/**
* Verify the connection event ends while the group is formed.
*/
@Test
public void testEndConnectionEventWhenGroupFormed() throws Exception {
forceP2pEnabled(mClient1);
WifiP2pGroup group = new WifiP2pGroup();
group.setNetworkId(WifiP2pGroup.NETWORK_ID_PERSISTENT);
group.setNetworkName("DIRECT-xy-NEW");
group.setOwner(new WifiP2pDevice("thisDeviceMac"));
group.setIsGroupOwner(true);
group.setInterface(IFACE_NAME_P2P);
sendGroupStartedMsg(group);
simulateTetherReady();
verify(mWifiP2pMetrics).endConnectionEvent(
eq(P2pConnectionEvent.CLF_NONE));
}
/**
* Verify the connection event ends due to timeout.
*/
@Test
public void testEndConnectionEventWhenTimeout() throws Exception {
setTargetSdkGreaterThanT();
forceP2pEnabled(mClient1);
when(mWifiNative.p2pGroupAdd(anyBoolean())).thenReturn(true);
mockEnterGroupNegotiationState();
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(
eq(TEST_PACKAGE_NAME), eq("testFeature"), anyInt(), eq(false));
}
mLooper.moveTimeForward(120 * 1000 * 2);
mLooper.dispatchAll();
verify(mWifiP2pMetrics).endConnectionEvent(
eq(P2pConnectionEvent.CLF_TIMEOUT));
}
/**
* Verify accepting the frequency conflict dialog will send a disconnect wifi request.
*/
@Test
public void testAcceptFrequencyConflictDialogSendsDisconnectWifiRequest() throws Exception {
forceP2pEnabled(mClient1);
when(mWifiNative.p2pGroupAdd(anyBoolean())).thenReturn(true);
AsyncChannel wifiChannel = mAsyncChannel;
sendChannelHalfConnectedEvent(mClientMessenger, wifiChannel);
WifiDialogManager.DialogHandle dialogHandle = mock(WifiDialogManager.DialogHandle.class);
when(mWifiDialogManager.createSimpleDialog(
any(), any(), any(), any(), any(), any(), any())).thenReturn(dialogHandle);
ArgumentCaptor<WifiDialogManager.SimpleDialogCallback> callbackCaptor =
ArgumentCaptor.forClass(WifiDialogManager.SimpleDialogCallback.class);
mockEnterGroupNegotiationState();
mockPeersList();
sendSetOngoingPeerConfigMsg(mClientMessenger, mTestWifiP2pPeerConfig);
mLooper.dispatchAll();
sendGoNegotiationFailureEvent(mClientMessenger,
WifiP2pServiceImpl.P2pStatus.NO_COMMON_CHANNEL);
if (!SdkLevel.isAtLeastT()) {
verify(mAlertDialog).show();
ArgumentCaptor<DialogInterface.OnClickListener> clickListener = ArgumentCaptor.forClass(
DialogInterface.OnClickListener.class);
verify(mAlertDialogBuilder).setPositiveButton(any(), clickListener.capture());
clickListener.getValue().onClick(mAlertDialog, DialogInterface.BUTTON_POSITIVE);
} else {
verify(mWifiDialogManager).createSimpleDialog(
any(), any(), any(), any(), any(), callbackCaptor.capture(), any());
verify(dialogHandle).launchDialog();
callbackCaptor.getValue().onPositiveButtonClicked();
}
mLooper.dispatchAll();
verify(wifiChannel).sendMessage(WifiP2pServiceImpl.DISCONNECT_WIFI_REQUEST, 1);
}
/**
* Verify DISCONNECT_WIFI_REQUEST is cleared when cancelConnect() is called.
*/
@Test
public void testClearDisconnectWifiRequestOnCallCancelConnect() throws Exception {
// accept the frequency conflict dialog to start next try.
testAcceptFrequencyConflictDialogSendsDisconnectWifiRequest();
reset(mAsyncChannel);
sendSimpleMsg(mClientMessenger, WifiP2pManager.CANCEL_CONNECT);
verify(mAsyncChannel).sendMessage(WifiP2pServiceImpl.DISCONNECT_WIFI_REQUEST, 0);
verify(mLastCallerInfoManager).put(eq(WifiManager.API_P2P_CANCEL_CONNECT), anyInt(),
anyInt(), anyInt(), anyString(), eq(true));
}
/**
* Verify DISCONNECT_WIFI_REQUEST is cleared when group formation fails.
*/
@Test
public void testClearDisconnectWifiRequestWhenGroupFormationFails() throws Exception {
// accept the frequency conflict dialog to start next try.
testAcceptFrequencyConflictDialogSendsDisconnectWifiRequest();
reset(mAsyncChannel);
// Send a reject to trigger handleGroupCreationFailure().
sendSimpleMsg(mClientMessenger, WifiP2pServiceImpl.DROP_WIFI_USER_REJECT);
verify(mAsyncChannel).sendMessage(WifiP2pServiceImpl.DISCONNECT_WIFI_REQUEST, 0);
}
/**
* Verify declining the frequency conflict dialog will end the P2P connection event.
*/
@Test
public void testDeclineFrequencyConflictDialogEndsP2pConnectionEvent() throws Exception {
forceP2pEnabled(mClient1);
when(mWifiNative.p2pGroupAdd(anyBoolean())).thenReturn(true);
AsyncChannel wifiChannel = mock(AsyncChannel.class);
sendChannelHalfConnectedEvent(mClientMessenger, wifiChannel);
WifiDialogManager.DialogHandle dialogHandle = mock(WifiDialogManager.DialogHandle.class);
when(mWifiDialogManager.createSimpleDialog(
any(), any(), any(), any(), any(), any(), any())).thenReturn(dialogHandle);
ArgumentCaptor<WifiDialogManager.SimpleDialogCallback> callbackCaptor =
ArgumentCaptor.forClass(WifiDialogManager.SimpleDialogCallback.class);
mockEnterGroupNegotiationState();
mockPeersList();
sendSetOngoingPeerConfigMsg(mClientMessenger, mTestWifiP2pPeerConfig);
mLooper.dispatchAll();
sendGoNegotiationFailureEvent(mClientMessenger,
WifiP2pServiceImpl.P2pStatus.NO_COMMON_CHANNEL);
if (!SdkLevel.isAtLeastT()) {
verify(mAlertDialog).show();
ArgumentCaptor<DialogInterface.OnClickListener> clickListener = ArgumentCaptor.forClass(
DialogInterface.OnClickListener.class);
verify(mAlertDialogBuilder).setNegativeButton(any(), clickListener.capture());
clickListener.getValue().onClick(mAlertDialog, DialogInterface.BUTTON_NEGATIVE);
} else {
verify(mWifiDialogManager).createSimpleDialog(
any(), any(), any(), any(), any(), callbackCaptor.capture(), any());
verify(dialogHandle).launchDialog();
callbackCaptor.getValue().onNegativeButtonClicked();
}
mLooper.dispatchAll();
verify(mWifiP2pMetrics).endConnectionEvent(P2pConnectionEvent.CLF_USER_REJECT);
}
/**
* Verify the frequency conflict dialog is dismissed when the frequency conflict state exits.
*/
@Test
public void testFrequencyConflictDialogDismissedOnStateExit() throws Exception {
forceP2pEnabled(mClient1);
when(mWifiNative.p2pGroupAdd(anyBoolean())).thenReturn(true);
AsyncChannel wifiChannel = mock(AsyncChannel.class);
sendChannelHalfConnectedEvent(mClientMessenger, wifiChannel);
WifiDialogManager.DialogHandle dialogHandle = mock(WifiDialogManager.DialogHandle.class);
when(mWifiDialogManager.createSimpleDialog(
any(), any(), any(), any(), any(), any(), any())).thenReturn(dialogHandle);
ArgumentCaptor<WifiDialogManager.SimpleDialogCallback> callbackCaptor =
ArgumentCaptor.forClass(WifiDialogManager.SimpleDialogCallback.class);
mockEnterGroupNegotiationState();
mockPeersList();
sendSetOngoingPeerConfigMsg(mClientMessenger, mTestWifiP2pPeerConfig);
mLooper.dispatchAll();
sendGoNegotiationFailureEvent(mClientMessenger,
WifiP2pServiceImpl.P2pStatus.NO_COMMON_CHANNEL);
WifiP2pGroup group = new WifiP2pGroup();
group.setNetworkId(WifiP2pGroup.NETWORK_ID_PERSISTENT);
group.setNetworkName("DIRECT-xy-NEW");
group.setOwner(new WifiP2pDevice("thisDeviceMac"));
group.setIsGroupOwner(true);
group.setInterface(IFACE_NAME_P2P);
sendGroupStartedMsg(group);
if (!SdkLevel.isAtLeastT()) {
verify(mAlertDialog).show();
verify(mAlertDialog).dismiss();
} else {
verify(mWifiDialogManager).createSimpleDialog(
any(), any(), any(), any(), any(), callbackCaptor.capture(), any());
verify(dialogHandle).launchDialog();
verify(dialogHandle).dismissDialog();
}
}
/**
* Verify the connection event ends due to the cancellation.
*/
@Test
public void testEndConnectionEventWhenCancel() throws Exception {
setTargetSdkGreaterThanT();
forceP2pEnabled(mClient1);
when(mWifiNative.p2pGroupAdd(anyBoolean())).thenReturn(true);
mockEnterGroupNegotiationState();
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(
eq(TEST_PACKAGE_NAME), eq("testFeature"), anyInt(), eq(false));
}
sendSimpleMsg(mClientMessenger, WifiP2pManager.CANCEL_CONNECT);
verify(mWifiP2pMetrics).endConnectionEvent(
eq(P2pConnectionEvent.CLF_CANCEL));
}
/**
* Verify the connection event ends due to the provision discovery failure.
*/
@Test
public void testEndConnectionEventWhenProvDiscFailure() throws Exception {
setTargetSdkGreaterThanT();
forceP2pEnabled(mClient1);
when(mWifiNative.p2pGroupAdd(anyBoolean())).thenReturn(true);
mockEnterProvisionDiscoveryState();
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(
eq(TEST_PACKAGE_NAME), eq("testFeature"), anyInt(), eq(false));
}
WifiP2pProvDiscEvent pdEvent = new WifiP2pProvDiscEvent();
pdEvent.device.deviceAddress = mTestWifiP2pPeerConfig.deviceAddress;
sendSimpleMsg(null, WifiP2pMonitor.P2P_PROV_DISC_FAILURE_EVENT,
WifiP2pMonitor.PROV_DISC_STATUS_UNKNOWN, pdEvent);
verify(mWifiP2pMetrics).endConnectionEvent(
eq(P2pConnectionEvent.CLF_PROV_DISC_FAIL));
}
/**
* Verify the connection event ends due to the group removal.
*/
@Test
public void testEndConnectionEventWhenGroupRemoval() throws Exception {
setTargetSdkGreaterThanT();
forceP2pEnabled(mClient1);
when(mWifiNative.p2pGroupAdd(anyBoolean())).thenReturn(true);
mockEnterGroupNegotiationState();
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(
eq(TEST_PACKAGE_NAME), eq("testFeature"), anyInt(), eq(false));
}
sendSimpleMsg(null, WifiP2pMonitor.P2P_GROUP_REMOVED_EVENT);
verify(mContext).sendBroadcastWithMultiplePermissions(
argThat(new WifiP2pServiceImplTest
.P2pConnectionChangedIntentMatcherForNetworkState(FAILED)), any());
if (SdkLevel.isAtLeastT()) {
verify(mContext).sendBroadcast(
argThat(new WifiP2pServiceImplTest
.P2pConnectionChangedIntentMatcherForNetworkState(FAILED)), any(),
any());
verify(mBroadcastOptions, atLeastOnce())
.setRequireAllOfPermissions(TEST_REQUIRED_PERMISSIONS_T);
verify(mBroadcastOptions, atLeastOnce())
.setRequireNoneOfPermissions(TEST_EXCLUDED_PERMISSIONS_T);
}
verify(mWifiP2pMetrics).endConnectionEvent(eq(P2pConnectionEvent.CLF_GROUP_REMOVED));
}
@Test
public void testStartP2pLocationOn() throws Exception {
assumeTrue(SdkLevel.isAtLeastT());
simulateLocationModeChange(true);
simulateWifiStateChange(true);
checkIsP2pInitWhenClientConnected(true, mClient1,
new WorkSource(mClient1.getCallingUid(), TEST_PACKAGE_NAME));
verify(mBroadcastOptions, atLeastOnce())
.setRequireAllOfPermissions(TEST_REQUIRED_PERMISSIONS_T);
verify(mBroadcastOptions, atLeastOnce())
.setRequireNoneOfPermissions(TEST_EXCLUDED_PERMISSIONS_T);
}
@Test
public void testStartP2pLocationOff() throws Exception {
assumeTrue(SdkLevel.isAtLeastT());
simulateLocationModeChange(false);
simulateWifiStateChange(true);
checkIsP2pInitWhenClientConnected(true, mClient1,
new WorkSource(mClient1.getCallingUid(), TEST_PACKAGE_NAME));
verify(mBroadcastOptions, atLeastOnce())
.setRequireAllOfPermissions(TEST_REQUIRED_PERMISSIONS_T);
verify(mBroadcastOptions, never()).setRequireNoneOfPermissions(TEST_EXCLUDED_PERMISSIONS_T);
}
/**
* Verify the connection event ends due to the invitation failure.
*/
@Test
public void testEndConnectionEventWhenInvitationFailure() throws Exception {
setTargetSdkGreaterThanT();
forceP2pEnabled(mClient1);
when(mWifiNative.p2pGroupAdd(anyBoolean())).thenReturn(true);
mockEnterGroupNegotiationState();
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(
eq(TEST_PACKAGE_NAME), eq("testFeature"), anyInt(), eq(false));
}
sendInvitationResultMsg(WifiP2pServiceImpl.P2pStatus.UNKNOWN);
verify(mWifiP2pMetrics).endConnectionEvent(
eq(P2pConnectionEvent.CLF_INVITATION_FAIL));
}
/**
* Verify WifiP2pManager.RESPONSE_DEVICE_INFO is returned with null object when a caller
* without proper permission attempts.
*/
@Test
public void testRequestDeviceInfoFailureWhenPermissionDenied() throws Exception {
setTargetSdkGreaterThanT();
forceP2pEnabled(mClient1);
doNothing().when(mWifiPermissionsUtil).checkPackage(anyInt(), anyString());
if (SdkLevel.isAtLeastT()) {
when(mWifiPermissionsUtil.checkNearbyDevicesPermission(any(), anyBoolean(), any()))
.thenReturn(false);
} else {
when(mWifiPermissionsUtil.checkCanAccessWifiDirect(any(), any(), anyInt(),
anyBoolean())).thenReturn(false);
}
sendSimpleMsg(mClientMessenger, WifiP2pManager.REQUEST_DEVICE_INFO);
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(
eq(TEST_PACKAGE_NAME), eq("testFeature"), anyInt(), eq(false));
}
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
assertEquals(WifiP2pManager.RESPONSE_DEVICE_INFO, mMessageCaptor.getValue().what);
assertNull(mMessageCaptor.getValue().obj);
}
/**
* Verify WifiP2pManager.RESPONSE_DEVICE_INFO is returned with expect object when a caller
* with proper permission attempts in p2p enabled state.
*/
@Test
public void testRequestDeviceInfoSuccessWhenP2pEnabled() throws Exception {
setTargetSdkGreaterThanT();
forceP2pEnabled(mClient1);
sendSimpleMsg(mClientMessenger, WifiP2pManager.REQUEST_DEVICE_INFO);
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(
eq(TEST_PACKAGE_NAME), eq("testFeature"), anyInt(), eq(false));
}
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
assertEquals(WifiP2pManager.RESPONSE_DEVICE_INFO, mMessageCaptor.getValue().what);
WifiP2pDevice wifiP2pDevice = (WifiP2pDevice) mMessageCaptor.getValue().obj;
assertEquals(ANONYMIZED_DEVICE_ADDRESS, wifiP2pDevice.deviceAddress);
assertEquals(thisDeviceName, wifiP2pDevice.deviceName);
}
/**
* Verify WifiP2pManager.RESPONSE_DEVICE_INFO is returned with empty object when a caller
* with proper permission attempts in p2p disabled state.
*/
@Test
public void testRequestDeviceInfoReturnEmptyWifiP2pDeviceWhenP2pDisabled() throws Exception {
setTargetSdkGreaterThanT();
simulateInitChannel(mClient1);
sendSimpleMsg(mClientMessenger, WifiP2pManager.REQUEST_DEVICE_INFO);
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(
eq(TEST_PACKAGE_NAME), eq("testFeature"), anyInt(), eq(false));
}
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
assertEquals(WifiP2pManager.RESPONSE_DEVICE_INFO, mMessageCaptor.getValue().what);
WifiP2pDevice wifiP2pDevice = (WifiP2pDevice) mMessageCaptor.getValue().obj;
assertEquals(ANONYMIZED_DEVICE_ADDRESS, wifiP2pDevice.deviceAddress);
assertEquals(thisDeviceName, wifiP2pDevice.deviceName);
}
/**
* Verify WifiP2pManager.RESPONSE_DEVICE_INFO returns an object with the actual device MAC when
* the caller holds the LOCAL_MAC_ADDRESS permission.
*/
@Test
public void testRequestDeviceInfoReturnsActualMacForNetworkSettingsApp() throws Exception {
setTargetSdkGreaterThanT();
forceP2pEnabled(mClient1);
when(mWifiPermissionsUtil.checkLocalMacAddressPermission(anyInt())).thenReturn(true);
sendSimpleMsg(mClientMessenger, WifiP2pManager.REQUEST_DEVICE_INFO);
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(
eq(TEST_PACKAGE_NAME), eq("testFeature"), anyInt(), eq(false));
}
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
assertEquals(WifiP2pManager.RESPONSE_DEVICE_INFO, mMessageCaptor.getValue().what);
WifiP2pDevice wifiP2pDevice = (WifiP2pDevice) mMessageCaptor.getValue().obj;
assertEquals(thisDeviceMac, wifiP2pDevice.deviceAddress);
assertEquals(thisDeviceName, wifiP2pDevice.deviceName);
}
/**
* Verify WifiP2pManager.REQUEST_DEVICE_INFO won't enable P2P when
* P2P MAC randomization is disabled and P2P device address exists.
*/
@Test
public void testRequestDeviceInfoNotSetUpInterfaceWhenDeviceAddressExists() throws Exception {
when(mWifiGlobals.isP2pMacRandomizationSupported()).thenReturn(false);
setTargetSdkGreaterThanT();
// Entering P2pEnabledState will populate the device address to the mThisDevice.
forceP2pEnabled(mClient1);
when(mWifiPermissionsUtil.checkLocalMacAddressPermission(anyInt())).thenReturn(true);
// The interface is set up for getting the device address.
verify(mWifiNative).setupInterface(any(), any(), any());
// Go back to P2pDisabledState.
sendP2pStateMachineMessage(WifiP2pServiceImpl.DISABLE_P2P);
sendP2pStateMachineMessage(WifiP2pMonitor.SUP_DISCONNECTION_EVENT);
mLooper.dispatchAll();
sendSimpleMsg(mClientMessenger, WifiP2pManager.REQUEST_DEVICE_INFO);
// Still 1 time, no additional interface setup.
verify(mWifiNative).setupInterface(any(), any(), any());
}
/**
* Verify WifiP2pManager.REQUEST_DEVICE_INFO enable P2P when
* P2P MAC randomization is enabled and P2P device address exists.
*/
@Test
public void testRequestDeviceInfoSetUpInterfaceWhenRandomMacEnabled() throws Exception {
when(mWifiGlobals.isP2pMacRandomizationSupported()).thenReturn(true);
setTargetSdkGreaterThanT();
// Entering P2pEnabledState will populate the device address to the mThisDevice.
forceP2pEnabled(mClient1);
when(mWifiPermissionsUtil.checkLocalMacAddressPermission(anyInt())).thenReturn(true);
// The interface is set up for getting the device address.
verify(mWifiNative).setupInterface(any(), any(), any());
// Go back to P2pDisabledState.
sendP2pStateMachineMessage(WifiP2pServiceImpl.DISABLE_P2P);
sendP2pStateMachineMessage(WifiP2pMonitor.SUP_DISCONNECTION_EVENT);
mLooper.dispatchAll();
sendSimpleMsg(mClientMessenger, WifiP2pManager.REQUEST_DEVICE_INFO);
// REQUEST_DEVICE_INFO results in the second setup.
verify(mWifiNative, times(2)).setupInterface(any(), any(), any());
}
private String verifyCustomizeDefaultDeviceName(String expectedName, boolean isRandomPostfix)
throws Exception {
forceP2pEnabled(mClient1);
when(mWifiPermissionsUtil.checkLocalMacAddressPermission(anyInt())).thenReturn(true);
sendSimpleMsg(mClientMessenger, WifiP2pManager.REQUEST_DEVICE_INFO);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
assertEquals(WifiP2pManager.RESPONSE_DEVICE_INFO, mMessageCaptor.getValue().what);
WifiP2pDevice wifiP2pDevice = (WifiP2pDevice) mMessageCaptor.getValue().obj;
if (isRandomPostfix) {
assertEquals(expectedName,
wifiP2pDevice.deviceName.substring(0, expectedName.length()));
} else {
assertEquals(expectedName, wifiP2pDevice.deviceName);
}
return wifiP2pDevice.deviceName;
}
private void setupDefaultDeviceNameCustomization(
String prefix, int postfixDigit) {
when(mWifiSettingsConfigStore.get(eq(WIFI_P2P_DEVICE_NAME))).thenReturn(null);
when(mFrameworkFacade.getSecureStringSetting(any(), eq(Settings.Secure.ANDROID_ID)))
.thenReturn(TEST_ANDROID_ID);
when(mWifiGlobals.getWifiP2pDeviceNamePrefix()).thenReturn(prefix);
when(mWifiGlobals.getWifiP2pDeviceNamePostfixNumDigits()).thenReturn(postfixDigit);
}
/** Verify that the default device name is customized by overlay on S or older. */
@Test
public void testCustomizeDefaultDeviceNameOnSorOlder() throws Exception {
assumeFalse(SdkLevel.isAtLeastT());
setupDefaultDeviceNameCustomization("Niceboat-", -1);
verifyCustomizeDefaultDeviceName("Niceboat-" + TEST_ANDROID_ID.substring(0, 4), false);
}
/** Verify that the default device name is customized by overlay. */
@Test
public void testCustomizeDefaultDeviceName() throws Exception {
assumeTrue(SdkLevel.isAtLeastT());
setupDefaultDeviceNameCustomization("Niceboat-", -1);
verifyCustomizeDefaultDeviceName("Niceboat-", true);
}
/** Verify that the prefix fallback to Android_ if the prefix is too long. */
@Test
public void testCustomizeDefaultDeviceNameTooLongPrefix() throws Exception {
setupDefaultDeviceNameCustomization(
StringUtil.generateRandomNumberString(
WifiP2pServiceImpl.DEVICE_NAME_PREFIX_LENGTH_MAX + 1), 4);
verifyCustomizeDefaultDeviceName(WifiP2pServiceImpl.DEFAULT_DEVICE_NAME_PREFIX, true);
}
/** Verify that the prefix fallback to Android_ if the prefix is empty. */
@Test
public void testCustomizeDefaultDeviceNameEmptyPrefix() throws Exception {
setupDefaultDeviceNameCustomization("", 6);
verifyCustomizeDefaultDeviceName(WifiP2pServiceImpl.DEFAULT_DEVICE_NAME_PREFIX, true);
}
/** Verify that the postfix fallbacks to 4-digit ANDROID_ID if the length is smaller than 4. */
@Test
public void testCustomizeDefaultDeviceNamePostfixTooShortOnSorOlder() throws Exception {
assumeFalse(SdkLevel.isAtLeastT());
setupDefaultDeviceNameCustomization("Prefix",
WifiP2pServiceImpl.DEVICE_NAME_POSTFIX_LENGTH_MIN - 1);
verifyCustomizeDefaultDeviceName("Prefix" + TEST_ANDROID_ID.substring(0, 4), true);
}
/** Verify that the postfix fallbacks to 4-digit ANDROID_ID if the length is smaller than 4. */
@Test
public void testCustomizeDefaultDeviceNamePostfixTooShort() throws Exception {
assumeTrue(SdkLevel.isAtLeastT());
setupDefaultDeviceNameCustomization("Prefix",
WifiP2pServiceImpl.DEVICE_NAME_POSTFIX_LENGTH_MIN - 1);
verifyCustomizeDefaultDeviceName("Prefix", true);
}
/** Verify that the postfix fallbacks to 4-digit ANDROID_ID if the length is 0.*/
@Test
public void testCustomizeDefaultDeviceNamePostfixIsZeroLengthOnSorOlder() throws Exception {
assumeFalse(SdkLevel.isAtLeastT());
setupDefaultDeviceNameCustomization("Prefix", 0);
verifyCustomizeDefaultDeviceName("Prefix" + TEST_ANDROID_ID.substring(0, 4), true);
}
/** Verify that the postfix fallbacks to 4-digit ANDROID_ID if the length is 0.*/
@Test
public void testCustomizeDefaultDeviceNamePostfixIsZeroLength() throws Exception {
assumeTrue(SdkLevel.isAtLeastT());
setupDefaultDeviceNameCustomization("Prefix", 0);
verifyCustomizeDefaultDeviceName("Prefix", true);
}
/** Verify that the digit length exceeds the remaining bytes. */
@Test
public void testCustomizeDefaultDeviceNameWithFewerRemainingBytes() throws Exception {
int postfixLength = 6;
String prefix = StringUtil.generateRandomNumberString(
WifiP2pServiceImpl.DEVICE_NAME_LENGTH_MAX - postfixLength + 1);
setupDefaultDeviceNameCustomization(prefix, postfixLength);
verifyCustomizeDefaultDeviceName(prefix, true);
}
/** Verify that the default device name is customized by overlay
* when saved one is an empty string. */
@Test
public void testCustomizeDefaultDeviceNameWithEmptySavedNameOnSorOlder() throws Exception {
assumeFalse(SdkLevel.isAtLeastT());
setupDefaultDeviceNameCustomization("Niceboat-", -1);
when(mWifiSettingsConfigStore.get(eq(WIFI_P2P_DEVICE_NAME))).thenReturn("");
verifyCustomizeDefaultDeviceName("Niceboat-" + TEST_ANDROID_ID.substring(0, 4), false);
}
/** Verify that the default device name is customized by overlay
* when saved one is an empty string. */
@Test
public void testCustomizeDefaultDeviceNameWithEmptySavedName() throws Exception {
assumeTrue(SdkLevel.isAtLeastT());
setupDefaultDeviceNameCustomization("Niceboat-", -1);
when(mWifiSettingsConfigStore.get(eq(WIFI_P2P_DEVICE_NAME))).thenReturn("");
verifyCustomizeDefaultDeviceName("Niceboat-", true);
}
/** Verify that the default device name is preserved in a period. */
@Test
public void testCustomizeDefaultDeviceNameIsPreserved() throws Exception {
when(mClock.getElapsedSinceBootMillis()).thenReturn(0L);
setupDefaultDeviceNameCustomization("Niceboat-", 4);
String defaultDeviceName = verifyCustomizeDefaultDeviceName("Niceboat-", true);
// re-init P2P, and the default name should be the same.
mockEnterDisabledState();
sendP2pStateMachineMessage(WifiP2pServiceImpl.ENABLE_P2P);
ArgumentCaptor<Message> msgCaptor = ArgumentCaptor.forClass(Message.class);
sendSimpleMsg(mClientMessenger, WifiP2pManager.REQUEST_DEVICE_INFO);
verify(mClientHandler, times(2)).sendMessage(msgCaptor.capture());
assertEquals(WifiP2pManager.RESPONSE_DEVICE_INFO, msgCaptor.getValue().what);
WifiP2pDevice wifiP2pDevice = (WifiP2pDevice) msgCaptor.getAllValues().get(1).obj;
assertEquals(defaultDeviceName, wifiP2pDevice.deviceName);
// After the default name expires, the default name should be changed.
when(mClock.getElapsedSinceBootMillis()).thenReturn(
WifiP2pServiceImpl.DEFAULT_DEVICE_NAME_LIFE_TIME_MILLIS);
mockEnterDisabledState();
// Activate this client
sendSimpleMsg(mClientMessenger, WifiP2pManager.DISCOVER_PEERS);
sendP2pStateMachineMessage(WifiP2pServiceImpl.ENABLE_P2P);
msgCaptor = ArgumentCaptor.forClass(Message.class);
sendSimpleMsg(mClientMessenger, WifiP2pManager.REQUEST_DEVICE_INFO);
verify(mClientHandler, times(4)).sendMessage(msgCaptor.capture());
assertEquals(WifiP2pManager.RESPONSE_DEVICE_INFO, msgCaptor.getValue().what);
wifiP2pDevice = (WifiP2pDevice) msgCaptor.getAllValues().get(3).obj;
assertNotEquals(defaultDeviceName, wifiP2pDevice.deviceName);
}
/**
* Verify the caller sends WifiP2pManager.STOP_DISCOVERY.
*/
@Test
public void testStopDiscoverySuccess() throws Exception {
when(mWifiNative.p2pStopFind()).thenReturn(true);
forceP2pEnabled(mClient1);
sendSimpleMsg(mClientMessenger, WifiP2pManager.STOP_DISCOVERY);
verify(mWifiNative).p2pStopFind();
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.STOP_DISCOVERY_SUCCEEDED, message.what);
verify(mLastCallerInfoManager).put(eq(WifiManager.API_P2P_STOP_PEER_DISCOVERY), anyInt(),
anyInt(), anyInt(), anyString(), eq(true));
}
/**
* Verify WifiP2pManager.STOP_DISCOVERY_FAILED is returned when native call failure.
*/
@Test
public void testStopDiscoveryFailureWhenNativeCallFailure() throws Exception {
when(mWifiNative.p2pStopFind()).thenReturn(false);
forceP2pEnabled(mClient1);
sendSimpleMsg(mClientMessenger, WifiP2pManager.STOP_DISCOVERY);
verify(mWifiNative).p2pStopFind();
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.STOP_DISCOVERY_FAILED, message.what);
assertEquals(WifiP2pManager.ERROR, message.arg1);
}
/**
* Verify WifiP2pManager.STOP_DISCOVERY_FAILED is returned when p2p is disabled.
*/
@Test
public void testStopDiscoveryFailureWhenP2pDisabled() throws Exception {
sendSimpleMsg(mClientMessenger, WifiP2pManager.STOP_DISCOVERY);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.STOP_DISCOVERY_FAILED, message.what);
assertEquals(WifiP2pManager.BUSY, message.arg1);
}
/**
* Verify WifiP2pManager.STOP_DISCOVERY_FAILED is returned when p2p is unsupported.
*/
@Test
public void testStopDiscoveryFailureWhenP2pUnsupported() throws Exception {
setUpWifiP2pServiceImpl(false);
sendSimpleMsg(mClientMessenger, WifiP2pManager.STOP_DISCOVERY);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.STOP_DISCOVERY_FAILED, message.what);
assertEquals(WifiP2pManager.P2P_UNSUPPORTED, message.arg1);
}
/**
* Verify WifiP2pManager.STOP_DISCOVERY_FAILED is returned when creating group.
*/
@Test
public void testStopDiscoveryFailureWhenCreatingGroup() throws Exception {
// Move to group creating state
testConnectWithConfigValidAsGroupSuccess();
sendSimpleMsg(mClientMessenger, WifiP2pManager.STOP_DISCOVERY);
verify(mClientHandler, atLeastOnce()).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.STOP_DISCOVERY_FAILED, message.what);
assertEquals(WifiP2pManager.BUSY, message.arg1);
}
/**
* Verify WifiP2pManager.START_LISTEN_FAILED is returned when creating group.
*/
@Test
public void testStartListenFailureWhenCreatingGroup() throws Exception {
// Move to group creating state
testConnectWithConfigValidAsGroupSuccess();
sendSimpleMsg(mClientMessenger, WifiP2pManager.START_LISTEN);
verify(mClientHandler, atLeastOnce()).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.START_LISTEN_FAILED, message.what);
assertEquals(WifiP2pManager.BUSY, message.arg1);
}
/**
* Verify WifiP2pManager.STOP_LISTEN_SUCCEEDED is returned when native call to stop listen
* succeed in creating group.
*/
@Test
public void testStopListenSuccessWhenNativeCallSucceedInCreatingGroup() throws Exception {
when(mWifiNative.p2pExtListen(eq(false), anyInt(), anyInt())).thenReturn(true);
// Move to group creating state
testConnectWithConfigValidAsGroupSuccess();
sendSimpleMsg(mClientMessenger, WifiP2pManager.STOP_LISTEN);
verify(mClientHandler, atLeastOnce()).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.STOP_LISTEN_SUCCEEDED, message.what);
}
/**
* Verify WifiP2pManager.STOP_LISTEN_FAILED is returned when native call to stop listen
* fail in creating group.
*/
@Test
public void testStopListenFailureWhenNativeCallFailInCreatingGroup() throws Exception {
when(mWifiNative.p2pExtListen(eq(false), anyInt(), anyInt())).thenReturn(false);
// Move to group creating state
testConnectWithConfigValidAsGroupSuccess();
sendSimpleMsg(mClientMessenger, WifiP2pManager.STOP_LISTEN);
verify(mClientHandler, atLeastOnce()).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.STOP_LISTEN_FAILED, message.what);
}
/**
* Verify the caller sends WifiP2pManager.CANCEL_CONNECT.
*/
@Test
public void testCancelConnectSuccess() throws Exception {
// Move to group creating state
testConnectWithConfigValidAsGroupSuccess();
sendSimpleMsg(mClientMessenger, WifiP2pManager.CANCEL_CONNECT);
verify(mClientHandler, atLeastOnce()).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.CANCEL_CONNECT_SUCCEEDED, message.what);
}
/**
* Verify WifiP2pManager.CANCEL_CONNECT_FAILED is returned when p2p is inactive.
*/
@Test
public void testCancelConnectFailureWhenP2pInactive() throws Exception {
// Move to inactive state
forceP2pEnabled(mClient1);
sendSimpleMsg(mClientMessenger, WifiP2pManager.CANCEL_CONNECT);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.CANCEL_CONNECT_FAILED, message.what);
assertEquals(WifiP2pManager.BUSY, message.arg1);
}
/**
* Verify WifiP2pManager.CANCEL_CONNECT_FAILED is returned when p2p is disabled.
*/
@Test
public void testCancelConnectFailureWhenP2pDisabled() throws Exception {
sendSimpleMsg(mClientMessenger, WifiP2pManager.CANCEL_CONNECT);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.CANCEL_CONNECT_FAILED, message.what);
assertEquals(WifiP2pManager.BUSY, message.arg1);
}
/**
* Verify WifiP2pManager.CANCEL_CONNECT_FAILED is returned when p2p is unsupported.
*/
@Test
public void testCancelConnectFailureWhenP2pUnsupported() throws Exception {
setUpWifiP2pServiceImpl(false);
sendSimpleMsg(mClientMessenger, WifiP2pManager.CANCEL_CONNECT);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.CANCEL_CONNECT_FAILED, message.what);
assertEquals(WifiP2pManager.P2P_UNSUPPORTED, message.arg1);
}
/**
* Verify the caller sends WifiP2pManager.REMOVE_GROUP.
*/
@Test
public void testRemoveGroupSuccess() throws Exception {
mockEnterGroupCreatedState();
when(mWifiNative.p2pGroupRemove(eq(IFACE_NAME_P2P))).thenReturn(true);
sendSimpleMsg(mClientMessenger, WifiP2pManager.REMOVE_GROUP);
verify(mWifiNative).p2pGroupRemove(eq(IFACE_NAME_P2P));
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.REMOVE_GROUP_SUCCEEDED, message.what);
verify(mLastCallerInfoManager).put(eq(WifiManager.API_P2P_REMOVE_GROUP), anyInt(),
anyInt(), anyInt(), anyString(), eq(true));
}
/**
* Verify WifiP2pManager.REMOVE_GROUP_FAILED is returned when native call failure.
*/
@Test
public void testRemoveGroupFailureWhenNativeCallFailure() throws Exception {
mockEnterGroupCreatedState();
when(mWifiNative.p2pGroupRemove(eq(IFACE_NAME_P2P))).thenReturn(false);
sendSimpleMsg(mClientMessenger, WifiP2pManager.REMOVE_GROUP);
verify(mWifiNative).p2pGroupRemove(eq(IFACE_NAME_P2P));
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.REMOVE_GROUP_FAILED, message.what);
assertEquals(WifiP2pManager.ERROR, message.arg1);
}
/**
* Verify WifiP2pManager.REMOVE_GROUP_FAILED is returned when p2p is creating group.
*/
@Test
public void testRemoveGroupFailureWhenP2pCreatingGroup() throws Exception {
// Move to group creating state
testConnectWithConfigValidAsGroupSuccess();
sendSimpleMsg(mClientMessenger, WifiP2pManager.REMOVE_GROUP);
verify(mClientHandler, atLeastOnce()).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.REMOVE_GROUP_FAILED, message.what);
assertEquals(WifiP2pManager.BUSY, message.arg1);
}
/**
* Verify WifiP2pManager.REMOVE_GROUP_FAILED is returned when p2p is inactive.
*/
@Test
public void testRemoveGroupFailureWhenP2pInactive() throws Exception {
// Move to inactive state
forceP2pEnabled(mClient1);
sendSimpleMsg(mClientMessenger, WifiP2pManager.REMOVE_GROUP);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.REMOVE_GROUP_FAILED, message.what);
assertEquals(WifiP2pManager.BUSY, message.arg1);
}
/**
* Verify WifiP2pManager.REMOVE_GROUP_FAILED is returned when p2p is disabled.
*/
@Test
public void testRemoveGroupFailureWhenP2pDisabled() throws Exception {
sendSimpleMsg(mClientMessenger, WifiP2pManager.REMOVE_GROUP);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.REMOVE_GROUP_FAILED, message.what);
assertEquals(WifiP2pManager.BUSY, message.arg1);
}
/**
* Verify WifiP2pManager.REMOVE_GROUP_FAILED is returned when p2p is unsupported.
*/
@Test
public void testRemoveGroupFailureWhenP2pUnsupported() throws Exception {
setUpWifiP2pServiceImpl(false);
sendSimpleMsg(mClientMessenger, WifiP2pManager.REMOVE_GROUP);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.REMOVE_GROUP_FAILED, message.what);
assertEquals(WifiP2pManager.P2P_UNSUPPORTED, message.arg1);
}
/**
* Verify the caller sends WifiP2pManager.SET_CHANNEL.
*/
@Test
public void testSetChannelSuccess() throws Exception {
// Move to enabled state
forceP2pEnabled(mClient1);
Bundle p2pChannels = new Bundle();
p2pChannels.putInt("lc", 1);
p2pChannels.putInt("oc", 2);
when(mWifiNative.p2pSetListenChannel(anyInt())).thenReturn(true);
when(mWifiNative.p2pSetOperatingChannel(anyInt(), any())).thenReturn(true);
sendSetChannelMsg(mClientMessenger, p2pChannels);
verify(mWifiNative).p2pSetListenChannel(eq(1));
verify(mWifiNative).p2pSetOperatingChannel(eq(2), any());
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.SET_CHANNEL_SUCCEEDED, message.what);
verify(mLastCallerInfoManager).put(eq(WifiManager.API_P2P_SET_CHANNELS), anyInt(),
anyInt(), anyInt(), anyString(), eq(true));
}
/**
* Verify WifiP2pManager.SET_CHANNEL_FAILED is returned when native call failure.
*/
@Test
public void testSetChannelFailureWhenNativeCallSetListenChannelFailure() throws Exception {
// Move to enabled state
forceP2pEnabled(mClient1);
Bundle p2pChannels = new Bundle();
p2pChannels.putInt("lc", 1);
p2pChannels.putInt("oc", 2);
when(mWifiNative.p2pSetListenChannel(anyInt())).thenReturn(false);
when(mWifiNative.p2pSetOperatingChannel(anyInt(), any())).thenReturn(true);
sendSetChannelMsg(mClientMessenger, p2pChannels);
verify(mWifiNative).p2pSetListenChannel(eq(1));
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.SET_CHANNEL_FAILED, message.what);
}
/**
* Verify WifiP2pManager.SET_CHANNEL_FAILED is returned when native call failure.
*/
@Test
public void testSetChannelFailureWhenNativeCallSetOperatingChannelFailure() throws Exception {
// Move to enabled state
forceP2pEnabled(mClient1);
Bundle p2pChannels = new Bundle();
p2pChannels.putInt("lc", 1);
p2pChannels.putInt("oc", 2);
when(mWifiNative.p2pSetListenChannel(anyInt())).thenReturn(true);
when(mWifiNative.p2pSetOperatingChannel(anyInt(), any())).thenReturn(false);
sendSetChannelMsg(mClientMessenger, p2pChannels);
verify(mWifiNative).p2pSetListenChannel(eq(1));
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.SET_CHANNEL_FAILED, message.what);
}
/**
* Verify WifiP2pManager.SET_CHANNEL_FAILED is returned when no permissions are held.
*/
@Test
public void testSetChannelFailureWhenNoPermissions() throws Exception {
// Move to enabled state
forceP2pEnabled(mClient1);
// no permissions held
when(mWifiPermissionsUtil.checkNetworkSettingsPermission(anyInt())).thenReturn(false);
when(mWifiPermissionsUtil.checkNetworkStackPermission(anyInt())).thenReturn(false);
when(mWifiPermissionsUtil.checkConfigOverridePermission(anyInt())).thenReturn(false);
Bundle p2pChannels = new Bundle();
p2pChannels.putInt("lc", 1);
p2pChannels.putInt("oc", 2);
sendSetChannelMsg(mClientMessenger, p2pChannels);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.SET_CHANNEL_FAILED, message.what);
assertEquals(WifiP2pManager.ERROR, message.arg1);
}
/**
* Verify p2pSetListenChannel doesn't been called when message contain null object.
*/
@Test
public void testSetChannelFailureWhenObjectIsNull() throws Exception {
when(mWifiNative.p2pSetListenChannel(anyInt())).thenReturn(true);
when(mWifiNative.p2pSetOperatingChannel(anyInt(), any())).thenReturn(true);
// Move to enabled state
forceP2pEnabled(mClient1);
when(mWifiNative.p2pSetListenChannel(anyInt())).thenReturn(false);
when(mWifiNative.p2pSetOperatingChannel(anyInt(), any())).thenReturn(true);
sendSetChannelMsg(mClientMessenger, null);
// Should be called only once on entering P2pEnabledState.
verify(mWifiNative, times(1)).p2pSetListenChannel(anyInt());
verify(mWifiNative, times(1)).p2pSetOperatingChannel(anyInt(), any());
}
/**
* Verify the caller sends WifiP2pManager.START_WPS with push button configuration.
*/
@Test
public void testStartWpsWithPbcSuccess() throws Exception {
mockEnterGroupCreatedState();
when(mWifiNative.startWpsPbc(anyString(), any())).thenReturn(true);
WpsInfo wps = new WpsInfo();
wps.setup = WpsInfo.PBC;
sendStartWpsMsg(mClientMessenger, wps);
verify(mWifiNative).startWpsPbc(eq(IFACE_NAME_P2P), isNull());
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.START_WPS_SUCCEEDED, message.what);
}
/**
* Verify the caller sends WifiP2pManager.START_WPS with pin display.
*/
@Test
public void testStartWpsWithPinDisplaySuccess() throws Exception {
// TODO(hsiuchangchen): This test item is related to UI.
}
/**
* Verify the caller sends WifiP2pManager.START_WPS with pin keypad.
*/
@Test
public void testStartWpsWithPinKeypadSuccess() throws Exception {
mockEnterGroupCreatedState();
when(mWifiNative.startWpsPinKeypad(anyString(), anyString())).thenReturn(true);
WpsInfo wps = new WpsInfo();
wps.setup = WpsInfo.KEYPAD;
wps.pin = "1234";
sendStartWpsMsg(mClientMessenger, wps);
verify(mWifiNative).startWpsPinKeypad(eq(IFACE_NAME_P2P), eq("1234"));
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.START_WPS_SUCCEEDED, message.what);
}
/**
* Verify WifiP2pManager.START_WPS_FAILED is returned when message contain null object.
*/
@Test
public void testStartWpsFailureWhenObjectIsNull() throws Exception {
mockEnterGroupCreatedState();
WpsInfo wps = null;
sendStartWpsMsg(mClientMessenger, wps);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.START_WPS_FAILED, message.what);
}
/**
* Verify WifiP2pManager.START_WPS_FAILED is returned when native call failure with
* push button configuration.
*/
@Test
public void testStartWpsWithPbcFailureWhenNativeCallFailure() throws Exception {
mockEnterGroupCreatedState();
when(mWifiNative.startWpsPbc(anyString(), any())).thenReturn(false);
WpsInfo wps = new WpsInfo();
wps.setup = WpsInfo.PBC;
sendStartWpsMsg(mClientMessenger, wps);
verify(mWifiNative).startWpsPbc(eq(IFACE_NAME_P2P), isNull());
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.START_WPS_FAILED, message.what);
}
/**
* Verify WifiP2pManager.START_WPS_FAILED is returned when native call failure with
* pin display.
*/
@Test
public void testStartWpsWithPinDisplayFailureWhenNativeCallFailure() throws Exception {
mockEnterGroupCreatedState();
when(mWifiNative.startWpsPinDisplay(anyString(), any())).thenReturn("abcd");
WpsInfo wps = new WpsInfo();
wps.setup = WpsInfo.DISPLAY;
sendStartWpsMsg(mClientMessenger, wps);
verify(mWifiNative).startWpsPinDisplay(eq(IFACE_NAME_P2P), isNull());
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.START_WPS_FAILED, message.what);
}
/**
* Verify WifiP2pManager.START_WPS_FAILED is returned when native call failure with
* pin keypad.
*/
@Test
public void testStartWpsWithPinKeypadFailureWhenNativeCallFailure() throws Exception {
mockEnterGroupCreatedState();
when(mWifiNative.startWpsPinKeypad(anyString(), anyString())).thenReturn(false);
WpsInfo wps = new WpsInfo();
wps.setup = WpsInfo.KEYPAD;
wps.pin = "1234";
sendStartWpsMsg(mClientMessenger, wps);
verify(mWifiNative).startWpsPinKeypad(eq(IFACE_NAME_P2P), eq("1234"));
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.START_WPS_FAILED, message.what);
}
/**
* Verify WifiP2pManager.START_WPS_FAILED is returned when p2p is inactive.
*/
@Test
public void testStartWpsFailureWhenP2pInactive() throws Exception {
// Move to inactive state
forceP2pEnabled(mClient1);
WpsInfo wps = new WpsInfo();
sendStartWpsMsg(mClientMessenger, wps);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.START_WPS_FAILED, message.what);
assertEquals(WifiP2pManager.BUSY, message.arg1);
}
/**
* Verify WifiP2pManager.START_WPS_FAILED is returned when p2p is disabled.
*/
@Test
public void testStartWpsFailureWhenP2pDisabled() throws Exception {
WpsInfo wps = new WpsInfo();
sendStartWpsMsg(mClientMessenger, wps);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.START_WPS_FAILED, message.what);
assertEquals(WifiP2pManager.BUSY, message.arg1);
}
/**
* Verify WifiP2pManager.START_WPS_FAILED is returned when p2p is unsupported.
*/
@Test
public void testStartWpsFailureWhenP2pUnsupported() throws Exception {
setUpWifiP2pServiceImpl(false);
WpsInfo wps = new WpsInfo();
sendStartWpsMsg(mClientMessenger, wps);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.START_WPS_FAILED, message.what);
assertEquals(WifiP2pManager.P2P_UNSUPPORTED, message.arg1);
}
/**
* Verify the caller sends WifiP2pManager.SET_DEVICE_NAME.
*/
@Test
public void testSetDeviceNameSuccess() throws Exception {
// Move to enabled state
forceP2pEnabled(mClient1);
mTestThisDevice.status = mTestThisDevice.AVAILABLE;
mTestThisDevice.deviceName = "another-name";
when(mWifiNative.setDeviceName(anyString())).thenReturn(true);
when(mWifiNative.setP2pSsidPostfix(anyString())).thenReturn(true);
sendSetDeviceNameMsg(mClientMessenger, mTestThisDevice);
verify(mWifiNative).setDeviceName(eq(mTestThisDevice.deviceName));
verify(mWifiNative).setP2pSsidPostfix(eq("-" + mTestThisDevice.deviceName));
verify(mWifiSettingsConfigStore).put(
eq(WIFI_P2P_DEVICE_NAME), eq(mTestThisDevice.deviceName));
checkSendThisDeviceChangedBroadcast();
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.SET_DEVICE_NAME_SUCCEEDED, message.what);
}
/**
* Verify the caller sends WifiP2pManager.SET_DEVICE_NAME with a name
* whose length exceeds 22.
*/
@Test
public void testSetDeviceNameFailureWithANameLongerThanMaxPostfixLength() throws Exception {
// Move to enabled state
forceP2pEnabled(mClient1);
mTestThisDevice.status = mTestThisDevice.AVAILABLE;
mTestThisDevice.deviceName = "12345678901234567890123";
when(mWifiNative.setDeviceName(anyString())).thenReturn(true);
when(mWifiNative.setP2pSsidPostfix(anyString())).thenReturn(true);
sendSetDeviceNameMsg(mClientMessenger, mTestThisDevice);
verify(mWifiNative).setDeviceName(eq(mTestThisDevice.deviceName));
verify(mWifiNative).setP2pSsidPostfix(
eq("-" + mTestThisDevice.deviceName.substring(
0, WifiP2pServiceImpl.GROUP_NAME_POSTFIX_LENGTH_MAX)));
verify(mWifiSettingsConfigStore).put(
eq(WIFI_P2P_DEVICE_NAME), eq(mTestThisDevice.deviceName));
checkSendThisDeviceChangedBroadcast();
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.SET_DEVICE_NAME_SUCCEEDED, message.what);
}
/**
* Verify the caller sends WifiP2pManager.SET_DEVICE_NAME with a multilingual
* string whose length exceeds 22.
*/
@Test
public void testSetDeviceNameFailureWithANameLongerThanMaxPostfixLengthForMultiByteCharacter()
throws Exception {
// Move to enabled state
forceP2pEnabled(mClient1);
mTestThisDevice.status = mTestThisDevice.AVAILABLE;
// 3-byte for each character, it occupies 24 bytes.
mTestThisDevice.deviceName = "한국어키보드보드";
when(mWifiNative.setDeviceName(anyString())).thenReturn(true);
when(mWifiNative.setP2pSsidPostfix(anyString())).thenReturn(true);
sendSetDeviceNameMsg(mClientMessenger, mTestThisDevice);
verify(mWifiNative).setDeviceName(eq(mTestThisDevice.deviceName));
// As the last character is a multi-byte character, the last
// character should be truncated completely.
verify(mWifiNative).setP2pSsidPostfix(eq("-한국어키보드보"));
verify(mWifiSettingsConfigStore).put(
eq(WIFI_P2P_DEVICE_NAME), eq(mTestThisDevice.deviceName));
checkSendThisDeviceChangedBroadcast();
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.SET_DEVICE_NAME_SUCCEEDED, message.what);
}
/**
* Verify the caller sends WifiP2pManager.SET_DEVICE_NAME with a string
* longer than the maximum length.
*/
@Test
public void testSetDeviceNameFailureWithNameExceedMaximumLength() throws Exception {
when(mWifiGlobals.isP2pMacRandomizationSupported()).thenReturn(true);
// Move to enabled state
forceP2pEnabled(mClient1);
mTestThisDevice.status = mTestThisDevice.AVAILABLE;
// clear the one called on entering P2pEnabledState.
reset(mWifiNative);
mTestThisDevice.deviceName = "123456789012345678901234567890123";
when(mWifiNative.setDeviceName(anyString())).thenReturn(true);
when(mWifiNative.setP2pSsidPostfix(anyString())).thenReturn(true);
sendSetDeviceNameMsg(mClientMessenger, mTestThisDevice);
verify(mWifiNative, never()).setDeviceName(any());
verify(mWifiNative, never()).setP2pSsidPostfix(any());
verify(mWifiSettingsConfigStore, never()).put(any(), any());
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.SET_DEVICE_NAME_FAILED, message.what);
}
/**
* Verify the caller sends WifiP2pManager.SET_DEVICE_NAME with a multilingual string
* longer than the maximum length.
*/
@Test
public void testSetDeviceNameFailureWithMultilingualNameExceedMaximumLength() throws Exception {
when(mWifiGlobals.isP2pMacRandomizationSupported()).thenReturn(true);
// Move to enabled state
forceP2pEnabled(mClient1);
mTestThisDevice.status = mTestThisDevice.AVAILABLE;
// clear the one called on entering P2pEnabledState.
reset(mWifiNative);
// 3-byte for each character, it occupies 33 bytes.
mTestThisDevice.deviceName = "한국어키보드보드한국어";
when(mWifiNative.setDeviceName(anyString())).thenReturn(true);
when(mWifiNative.setP2pSsidPostfix(anyString())).thenReturn(true);
sendSetDeviceNameMsg(mClientMessenger, mTestThisDevice);
verify(mWifiNative, never()).setDeviceName(any());
verify(mWifiNative, never()).setP2pSsidPostfix(any());
verify(mWifiSettingsConfigStore, never()).put(any(), any());
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.SET_DEVICE_NAME_FAILED, message.what);
}
/**
* Verify the caller sends WifiP2pManager.SET_DEVICE_NAME with an empty name.
*/
@Test
public void testSetDeviceNameFailureWithEmptyName() throws Exception {
when(mWifiGlobals.isP2pMacRandomizationSupported()).thenReturn(true);
// Move to enabled state
forceP2pEnabled(mClient1);
mTestThisDevice.status = mTestThisDevice.AVAILABLE;
// clear the one called on entering P2pEnabledState.
reset(mWifiNative);
mTestThisDevice.deviceName = "";
when(mWifiNative.setDeviceName(anyString())).thenReturn(true);
sendSetDeviceNameMsg(mClientMessenger, mTestThisDevice);
verify(mWifiNative, never()).setDeviceName(any());
verify(mWifiSettingsConfigStore, never()).put(any(), any());
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.SET_DEVICE_NAME_FAILED, message.what);
assertEquals(WifiP2pManager.ERROR, message.arg1);
}
/**
* Verify WifiP2pManager.SET_DEVICE_NAME_FAILED is returned when native call failed.
*/
@Test
public void testSetDeviceNameFailureWhenNativeCallFailure() throws Exception {
// Move to enabled state
forceP2pEnabled(mClient1);
// clear the one called on entering P2pEnabledState.
reset(mWifiNative);
when(mWifiNative.setP2pSsidPostfix(anyString())).thenReturn(true);
when(mWifiNative.setDeviceName(anyString())).thenReturn(false);
sendSetDeviceNameMsg(mClientMessenger, mTestThisDevice);
verify(mWifiNative).setDeviceName(eq(mTestThisDevice.deviceName));
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.SET_DEVICE_NAME_FAILED, message.what);
assertEquals(WifiP2pManager.ERROR, message.arg1);
}
/**
* Verify WifiP2pManager.SET_DEVICE_NAME_FAILED is returned when p2p device is null.
*/
@Test
public void testSetDeviceNameFailureWhenDeviceIsNull() throws Exception {
// Move to enabled state
forceP2pEnabled(mClient1);
sendSetDeviceNameMsg(mClientMessenger, null);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.SET_DEVICE_NAME_FAILED, message.what);
assertEquals(WifiP2pManager.ERROR, message.arg1);
}
/**
* Verify WifiP2pManager.SET_DEVICE_NAME_FAILED is returned when p2p device's name is null.
*/
@Test
public void testSetDeviceNameFailureWhenDeviceNameIsNull() throws Exception {
// Move to enabled state
forceP2pEnabled(mClient1);
mTestThisDevice.deviceName = null;
sendSetDeviceNameMsg(mClientMessenger, mTestThisDevice);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.SET_DEVICE_NAME_FAILED, message.what);
assertEquals(WifiP2pManager.ERROR, message.arg1);
}
/**
* Verify WifiP2pManager.SET_DEVICE_NAME_FAILED is returned when p2p is disabled.
*/
@Test
public void testSetDeviceNameFailureWhenP2pDisabled() throws Exception {
sendSetDeviceNameMsg(mClientMessenger, mTestThisDevice);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.SET_DEVICE_NAME_FAILED, message.what);
assertEquals(WifiP2pManager.BUSY, message.arg1);
}
/**
* Verify WifiP2pManager.SET_DEVICE_NAME_FAILED is returned when p2p is unsupported.
*/
@Test
public void testSetDeviceNameFailureWhenP2pUnsupported() throws Exception {
setUpWifiP2pServiceImpl(false);
sendSetDeviceNameMsg(mClientMessenger, mTestThisDevice);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.SET_DEVICE_NAME_FAILED, message.what);
assertEquals(WifiP2pManager.P2P_UNSUPPORTED, message.arg1);
}
/**
* Verify WifiP2pManager.SET_DEVICE_NAME_FAILED is returned when no permissions are held.
*/
@Test
public void testSetDeviceNameFailureWhenNoPermissions() throws Exception {
// Move to enabled state
forceP2pEnabled(mClient1);
// no permissions held
when(mWifiPermissionsUtil.checkNetworkSettingsPermission(anyInt())).thenReturn(false);
when(mWifiPermissionsUtil.checkNetworkStackPermission(anyInt())).thenReturn(false);
when(mWifiPermissionsUtil.checkConfigOverridePermission(anyInt())).thenReturn(false);
sendSetDeviceNameMsg(mClientMessenger, null);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.SET_DEVICE_NAME_FAILED, message.what);
assertEquals(WifiP2pManager.ERROR, message.arg1);
}
@Test
public void testRestoreDeviceNameAndMacWhenMacRandomizationNotSupported() throws Exception {
simulateWifiStateChange(true);
simulateInitChannel(mClient1);
sendSimpleMsg(mClientMessenger, WifiP2pManager.REQUEST_DEVICE_INFO);
verify(mWifiNative, never()).setupInterface(any(), any(), any());
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
assertEquals(WifiP2pManager.RESPONSE_DEVICE_INFO, mMessageCaptor.getValue().what);
WifiP2pDevice wifiP2pDevice = (WifiP2pDevice) mMessageCaptor.getValue().obj;
//maybeEraseOwnDeviceAddress
assertEquals(ANONYMIZED_DEVICE_ADDRESS, wifiP2pDevice.deviceAddress);
assertEquals(thisDeviceName, wifiP2pDevice.deviceName);
}
/**
* Verify the caller sends WifiP2pManager.SET_WFD_INFO with wfd enabled.
*/
@Test
public void testSetWfdInfoSuccessWithWfdEnabled() throws Exception {
// Move to enabled state
forceP2pEnabled(mClient1);
mTestThisDevice.status = mTestThisDevice.AVAILABLE;
mTestThisDevice.wfdInfo = new WifiP2pWfdInfo();
mTestThisDevice.wfdInfo.setEnabled(true);
when(mWifiInjector.getWifiPermissionsWrapper()).thenReturn(mWifiPermissionsWrapper);
when(mWifiPermissionsWrapper.getUidPermission(anyString(), anyInt()))
.thenReturn(PackageManager.PERMISSION_GRANTED);
when(mWifiNative.setWfdEnable(anyBoolean())).thenReturn(true);
when(mWifiNative.setWfdDeviceInfo(anyString())).thenReturn(true);
sendSetWfdInfoMsg(mClientMessenger, mTestThisDevice.wfdInfo);
verify(mWifiInjector).getWifiPermissionsWrapper();
verify(mWifiPermissionsWrapper).getUidPermission(
eq(android.Manifest.permission.CONFIGURE_WIFI_DISPLAY), anyInt());
verify(mWifiNative).setWfdEnable(eq(true));
verify(mWifiNative).setWfdDeviceInfo(eq(mTestThisDevice.wfdInfo.getDeviceInfoHex()));
checkSendThisDeviceChangedBroadcast();
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.SET_WFD_INFO_SUCCEEDED, message.what);
}
/**
* Verify the caller sends WifiP2pManager.SET_WFD_INFO with wfd is disabled.
*/
@Test
public void testSetWfdInfoSuccessWithWfdDisabled() throws Exception {
// Move to enabled state
forceP2pEnabled(mClient1);
mTestThisDevice.status = mTestThisDevice.AVAILABLE;
mTestThisDevice.wfdInfo = new WifiP2pWfdInfo();
mTestThisDevice.wfdInfo.setEnabled(false);
when(mWifiInjector.getWifiPermissionsWrapper()).thenReturn(mWifiPermissionsWrapper);
when(mWifiPermissionsWrapper.getUidPermission(anyString(), anyInt()))
.thenReturn(PackageManager.PERMISSION_GRANTED);
when(mWifiNative.setWfdEnable(anyBoolean())).thenReturn(true);
sendSetWfdInfoMsg(mClientMessenger, mTestThisDevice.wfdInfo);
verify(mWifiInjector).getWifiPermissionsWrapper();
verify(mWifiPermissionsWrapper).getUidPermission(
eq(android.Manifest.permission.CONFIGURE_WIFI_DISPLAY), anyInt());
verify(mWifiNative).setWfdEnable(eq(false));
checkSendThisDeviceChangedBroadcast();
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.SET_WFD_INFO_SUCCEEDED, message.what);
}
/**
* Verify WifiP2pManager.SET_WFD_INFO_FAILED is returned when wfd permission denied.
*/
@Test
public void testSetWfdInfoFailureWhenWfdPermissionDenied() throws Exception {
// Move to enabled state
forceP2pEnabled(mClient1);
mTestThisDevice.status = mTestThisDevice.AVAILABLE;
mTestThisDevice.wfdInfo = new WifiP2pWfdInfo();
when(mWifiInjector.getWifiPermissionsWrapper()).thenReturn(mWifiPermissionsWrapper);
when(mWifiPermissionsWrapper.getUidPermission(anyString(), anyInt()))
.thenReturn(PackageManager.PERMISSION_DENIED);
sendSetWfdInfoMsg(mClientMessenger, mTestThisDevice.wfdInfo);
verify(mWifiInjector).getWifiPermissionsWrapper();
verify(mWifiPermissionsWrapper).getUidPermission(
eq(android.Manifest.permission.CONFIGURE_WIFI_DISPLAY), anyInt());
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.SET_WFD_INFO_FAILED, message.what);
assertEquals(WifiP2pManager.ERROR, message.arg1);
}
/**
* Verify WifiP2pManager.SET_WFD_INFO_FAILED is returned when wfdInfo is null.
*/
@Test
public void testSetWfdInfoFailureWhenWfdInfoIsNull() throws Exception {
// Move to enabled state
forceP2pEnabled(mClient1);
mTestThisDevice.status = mTestThisDevice.AVAILABLE;
mTestThisDevice.wfdInfo = null;
when(mWifiInjector.getWifiPermissionsWrapper()).thenReturn(mWifiPermissionsWrapper);
when(mWifiPermissionsWrapper.getUidPermission(anyString(), anyInt()))
.thenReturn(PackageManager.PERMISSION_GRANTED);
sendSetWfdInfoMsg(mClientMessenger, mTestThisDevice.wfdInfo);
verify(mWifiInjector).getWifiPermissionsWrapper();
verify(mWifiPermissionsWrapper).getUidPermission(
eq(android.Manifest.permission.CONFIGURE_WIFI_DISPLAY), anyInt());
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.SET_WFD_INFO_FAILED, message.what);
assertEquals(WifiP2pManager.ERROR, message.arg1);
}
/**
* Verify WifiP2pManager.SET_WFD_INFO_FAILED is returned when wfd is enabled
* and native call "setWfdEnable" failure.
*/
@Test
public void testSetWfdInfoFailureWithWfdEnabledWhenNativeCallFailure1() throws Exception {
// Move to enabled state
forceP2pEnabled(mClient1);
mTestThisDevice.status = mTestThisDevice.AVAILABLE;
mTestThisDevice.wfdInfo = new WifiP2pWfdInfo();
mTestThisDevice.wfdInfo.setEnabled(true);
when(mWifiInjector.getWifiPermissionsWrapper()).thenReturn(mWifiPermissionsWrapper);
when(mWifiPermissionsWrapper.getUidPermission(anyString(), anyInt()))
.thenReturn(PackageManager.PERMISSION_GRANTED);
when(mWifiNative.setWfdEnable(anyBoolean())).thenReturn(false);
sendSetWfdInfoMsg(mClientMessenger, mTestThisDevice.wfdInfo);
verify(mWifiInjector).getWifiPermissionsWrapper();
verify(mWifiPermissionsWrapper).getUidPermission(
eq(android.Manifest.permission.CONFIGURE_WIFI_DISPLAY), anyInt());
verify(mWifiNative).setWfdEnable(eq(true));
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.SET_WFD_INFO_FAILED, message.what);
assertEquals(WifiP2pManager.ERROR, message.arg1);
}
/**
* Verify WifiP2pManager.SET_WFD_INFO_FAILED is returned when wfd is enabled
* and native call "setWfdDeviceInfo" failure.
*/
@Test
public void testSetWfdInfoFailureWithWfdEnabledWhenNativeCallFailure2() throws Exception {
// Move to enabled state
forceP2pEnabled(mClient1);
mTestThisDevice.status = mTestThisDevice.AVAILABLE;
mTestThisDevice.wfdInfo = new WifiP2pWfdInfo();
mTestThisDevice.wfdInfo.setEnabled(true);
when(mWifiInjector.getWifiPermissionsWrapper()).thenReturn(mWifiPermissionsWrapper);
when(mWifiPermissionsWrapper.getUidPermission(anyString(), anyInt()))
.thenReturn(PackageManager.PERMISSION_GRANTED);
when(mWifiNative.setWfdEnable(anyBoolean())).thenReturn(true);
when(mWifiNative.setWfdDeviceInfo(anyString())).thenReturn(false);
sendSetWfdInfoMsg(mClientMessenger, mTestThisDevice.wfdInfo);
verify(mWifiInjector).getWifiPermissionsWrapper();
verify(mWifiPermissionsWrapper).getUidPermission(
eq(android.Manifest.permission.CONFIGURE_WIFI_DISPLAY), anyInt());
verify(mWifiNative).setWfdEnable(eq(true));
verify(mWifiNative).setWfdDeviceInfo(eq(mTestThisDevice.wfdInfo.getDeviceInfoHex()));
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.SET_WFD_INFO_FAILED, message.what);
assertEquals(WifiP2pManager.ERROR, message.arg1);
}
/**
* Verify WifiP2pManager.SET_WFD_INFO_FAILED is returned when wfd is disabled
* and native call failure.
*/
@Test
public void testSetWfdInfoFailureWithWfdDisabledWhenNativeCallFailure() throws Exception {
// Move to enabled state
forceP2pEnabled(mClient1);
mTestThisDevice.status = mTestThisDevice.AVAILABLE;
mTestThisDevice.wfdInfo = new WifiP2pWfdInfo();
mTestThisDevice.wfdInfo.setEnabled(false);
when(mWifiInjector.getWifiPermissionsWrapper()).thenReturn(mWifiPermissionsWrapper);
when(mWifiPermissionsWrapper.getUidPermission(anyString(), anyInt()))
.thenReturn(PackageManager.PERMISSION_GRANTED);
when(mWifiNative.setWfdEnable(anyBoolean())).thenReturn(false);
sendSetWfdInfoMsg(mClientMessenger, mTestThisDevice.wfdInfo);
verify(mWifiInjector).getWifiPermissionsWrapper();
verify(mWifiPermissionsWrapper).getUidPermission(
eq(android.Manifest.permission.CONFIGURE_WIFI_DISPLAY), anyInt());
verify(mWifiNative).setWfdEnable(eq(false));
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.SET_WFD_INFO_FAILED, message.what);
assertEquals(WifiP2pManager.ERROR, message.arg1);
}
/**
* Verify WifiP2pManager.SET_WFD_INFO_FAILED is returned when wfd permission denied
* and p2p is disabled.
*/
@Test
public void testSetWfdInfoFailureWhenWfdPermissionDeniedAndP2pDisabled() throws Exception {
mTestThisDevice.wfdInfo = new WifiP2pWfdInfo();
when(mWifiInjector.getWifiPermissionsWrapper()).thenReturn(mWifiPermissionsWrapper);
when(mWifiPermissionsWrapper.getUidPermission(anyString(), anyInt()))
.thenReturn(PackageManager.PERMISSION_DENIED);
sendSetWfdInfoMsg(mClientMessenger, mTestThisDevice.wfdInfo);
verify(mWifiInjector).getWifiPermissionsWrapper();
verify(mWifiPermissionsWrapper).getUidPermission(
eq(android.Manifest.permission.CONFIGURE_WIFI_DISPLAY), anyInt());
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.SET_WFD_INFO_FAILED, message.what);
assertEquals(WifiP2pManager.ERROR, message.arg1);
}
/**
* Verify WifiP2pManager.SET_WFD_INFO_FAILED is returned when p2p is unsupported.
*/
@Test
public void testSetWfdInfoFailureWhenP2pUnsupported() throws Exception {
setUpWifiP2pServiceImpl(false);
mTestThisDevice.wfdInfo = new WifiP2pWfdInfo();
when(mWifiInjector.getWifiPermissionsWrapper()).thenReturn(mWifiPermissionsWrapper);
when(mWifiPermissionsWrapper.getUidPermission(anyString(), anyInt()))
.thenReturn(PackageManager.PERMISSION_GRANTED);
sendSetWfdInfoMsg(mClientMessenger, mTestThisDevice.wfdInfo);
verify(mWifiInjector).getWifiPermissionsWrapper();
verify(mWifiPermissionsWrapper).getUidPermission(
eq(android.Manifest.permission.CONFIGURE_WIFI_DISPLAY), anyInt());
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.SET_WFD_INFO_FAILED, message.what);
assertEquals(WifiP2pManager.P2P_UNSUPPORTED, message.arg1);
}
/**
* Verify WifiP2pManager.SET_WFD_INFO_FAILED is returned when wfd permission denied
* and p2p is unsupported.
*/
@Test
public void testSetWfdInfoFailureWhenWfdPermissionDeniedAndP2pUnsupported() throws Exception {
setUpWifiP2pServiceImpl(false);
mTestThisDevice.wfdInfo = new WifiP2pWfdInfo();
when(mWifiInjector.getWifiPermissionsWrapper()).thenReturn(mWifiPermissionsWrapper);
when(mWifiPermissionsWrapper.getUidPermission(anyString(), anyInt()))
.thenReturn(PackageManager.PERMISSION_DENIED);
sendSetWfdInfoMsg(mClientMessenger, mTestThisDevice.wfdInfo);
verify(mWifiInjector).getWifiPermissionsWrapper();
verify(mWifiPermissionsWrapper).getUidPermission(
eq(android.Manifest.permission.CONFIGURE_WIFI_DISPLAY), anyInt());
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.SET_WFD_INFO_FAILED, message.what);
assertEquals(WifiP2pManager.ERROR, message.arg1);
}
/**
* Verify the call setMiracastMode when p2p is enabled.
*/
@Test
public void testSetMiracastModeWhenP2pEnabled() throws Exception {
// Move to enabled state
forceP2pEnabled(mClient1);
when(mWifiInjector.getWifiPermissionsWrapper()).thenReturn(mWifiPermissionsWrapper);
when(mWifiPermissionsWrapper.getUidPermission(anyString(), anyInt()))
.thenReturn(PackageManager.PERMISSION_GRANTED);
mWifiP2pServiceImpl.setMiracastMode(0);
mLooper.dispatchAll();
verify(mWifiInjector).getWifiPermissionsWrapper();
verify(mWifiPermissionsWrapper).getUidPermission(
eq(android.Manifest.permission.CONFIGURE_WIFI_DISPLAY), anyInt());
verify(mWifiNative).setMiracastMode(eq(0));
}
/**
* Verify the call setMiracastMode when p2p is disable.
*/
@Test
public void testSetMiracastModeWhenP2pDisabled() throws Exception {
when(mWifiInjector.getWifiPermissionsWrapper()).thenReturn(mWifiPermissionsWrapper);
when(mWifiPermissionsWrapper.getUidPermission(anyString(), anyInt()))
.thenReturn(PackageManager.PERMISSION_GRANTED);
mWifiP2pServiceImpl.setMiracastMode(0);
mLooper.dispatchAll();
verify(mWifiInjector).getWifiPermissionsWrapper();
verify(mWifiPermissionsWrapper).getUidPermission(
eq(android.Manifest.permission.CONFIGURE_WIFI_DISPLAY), anyInt());
verify(mWifiNative, never()).setMiracastMode(anyInt());
}
/**
* Verify the call setMiracastMode when CONFIGURE_WIFI_DISPLAY permission denied.
*/
@Test(expected = SecurityException.class)
public void testSetMiracastModeWhenPermissionDeined() throws Exception {
when(mWifiInjector.getWifiPermissionsWrapper()).thenReturn(mWifiPermissionsWrapper);
when(mWifiPermissionsWrapper.getUidPermission(anyString(), anyInt()))
.thenReturn(PackageManager.PERMISSION_DENIED);
mWifiP2pServiceImpl.setMiracastMode(0);
verify(mWifiInjector).getWifiPermissionsWrapper();
verify(mWifiPermissionsWrapper).getUidPermission(
eq(android.Manifest.permission.CONFIGURE_WIFI_DISPLAY), anyInt());
verify(mWifiNative, never()).setMiracastMode(anyInt());
}
/**
* Verify the caller sends WifiP2pManager.FACTORY_RESET when p2p is enabled.
*/
@Test
public void testFactoryResetSuccessWhenP2pEnabled() throws Exception {
// Move to enabled state
forceP2pEnabled(mClient1);
when(mWifiInjector.getUserManager()).thenReturn(mUserManager);
when(mPackageManager.getNameForUid(anyInt())).thenReturn("testPkg");
when(mWifiPermissionsUtil.checkNetworkSettingsPermission(anyInt())).thenReturn(true);
when(mUserManager.hasUserRestrictionForUser(eq(UserManager.DISALLOW_NETWORK_RESET), any()))
.thenReturn(false);
when(mUserManager.hasUserRestrictionForUser(eq(UserManager.DISALLOW_CONFIG_WIFI), any()))
.thenReturn(false);
when(mWifiNative.p2pListNetworks(any())).thenReturn(true);
sendSimpleMsg(mClientMessenger, WifiP2pManager.FACTORY_RESET);
checkSendP2pPersistentGroupsChangedBroadcast();
verify(mWifiInjector).getUserManager();
verify(mPackageManager).getNameForUid(anyInt());
verify(mWifiPermissionsUtil).checkNetworkSettingsPermission(anyInt());
verify(mUserManager).hasUserRestrictionForUser(
eq(UserManager.DISALLOW_NETWORK_RESET), any());
verify(mUserManager).hasUserRestrictionForUser(eq(UserManager.DISALLOW_CONFIG_WIFI), any());
verify(mWifiNative, atLeastOnce()).p2pListNetworks(any());
verify(mWifiNative).teardownInterface();
verify(mWifiSettingsConfigStore).put(eq(WIFI_P2P_PENDING_FACTORY_RESET), eq(false));
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.FACTORY_RESET_SUCCEEDED, message.what);
}
/**
* Verify the caller sends WifiP2pManager.FACTORY_RESET when p2p is disabled at first
* and changes to enabled.
*/
@Test
public void testFactoryResetSuccessWhenP2pFromDisabledToEnabled() throws Exception {
when(mWifiInjector.getUserManager()).thenReturn(mUserManager);
when(mPackageManager.getNameForUid(anyInt())).thenReturn("testPkg");
when(mWifiPermissionsUtil.checkNetworkSettingsPermission(anyInt())).thenReturn(true);
when(mUserManager.hasUserRestrictionForUser(eq(UserManager.DISALLOW_NETWORK_RESET), any()))
.thenReturn(false);
when(mUserManager.hasUserRestrictionForUser(eq(UserManager.DISALLOW_CONFIG_WIFI), any()))
.thenReturn(false);
when(mWifiNative.p2pListNetworks(any())).thenReturn(true);
sendSimpleMsg(mClientMessenger, WifiP2pManager.FACTORY_RESET);
verify(mWifiInjector).getUserManager();
verify(mPackageManager).getNameForUid(anyInt());
verify(mWifiPermissionsUtil).checkNetworkSettingsPermission(anyInt());
verify(mUserManager).hasUserRestrictionForUser(
eq(UserManager.DISALLOW_NETWORK_RESET), any());
verify(mUserManager).hasUserRestrictionForUser(eq(UserManager.DISALLOW_CONFIG_WIFI), any());
verify(mWifiNative, never()).p2pListNetworks(any());
verify(mWifiSettingsConfigStore).put(eq(WIFI_P2P_PENDING_FACTORY_RESET), eq(true));
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.FACTORY_RESET_SUCCEEDED, message.what);
// Move to enabled state
when(mWifiSettingsConfigStore.get(eq(WIFI_P2P_PENDING_FACTORY_RESET))).thenReturn(true);
forceP2pEnabled(mClient1);
verify(mPackageManager, times(2)).getNameForUid(anyInt());
verify(mWifiPermissionsUtil, times(2)).checkNetworkSettingsPermission(anyInt());
verify(mUserManager, times(2)).hasUserRestrictionForUser(
eq(UserManager.DISALLOW_NETWORK_RESET), any());
verify(mUserManager, times(2)).hasUserRestrictionForUser(
eq(UserManager.DISALLOW_CONFIG_WIFI), any());
verify(mWifiNative, atLeastOnce()).p2pListNetworks(any());
verify(mWifiSettingsConfigStore).get(eq(WIFI_P2P_PENDING_FACTORY_RESET));
verify(mWifiSettingsConfigStore).put(eq(WIFI_P2P_PENDING_FACTORY_RESET), eq(false));
checkSendP2pPersistentGroupsChangedBroadcast();
}
/**
* Verify WifiP2pManager.FACTORY_RESET_FAILED is returned without network setting permission.
*/
@Test
public void testFactoryResetFailureWithoutNetworkSettingPermission() throws Exception {
// Move to enabled state
forceP2pEnabled(mClient1);
when(mWifiInjector.getUserManager()).thenReturn(mUserManager);
when(mPackageManager.getNameForUid(anyInt())).thenReturn("testPkg");
when(mWifiPermissionsUtil.checkNetworkSettingsPermission(anyInt())).thenReturn(false);
sendSimpleMsg(mClientMessenger, WifiP2pManager.FACTORY_RESET);
verify(mWifiInjector).getUserManager();
verify(mPackageManager).getNameForUid(anyInt());
verify(mWifiPermissionsUtil).checkNetworkSettingsPermission(anyInt());
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.FACTORY_RESET_FAILED, message.what);
assertEquals(WifiP2pManager.ERROR, message.arg1);
}
/**
* Verify WifiP2pManager.FACTORY_RESET_FAILED is returned when network reset disallow.
*/
@Test
public void testFactoryResetFailureWhenNetworkResetDisallow() throws Exception {
// Move to enabled state
forceP2pEnabled(mClient1);
when(mWifiInjector.getUserManager()).thenReturn(mUserManager);
when(mPackageManager.getNameForUid(anyInt())).thenReturn("testPkg");
when(mWifiPermissionsUtil.checkNetworkSettingsPermission(anyInt())).thenReturn(true);
when(mUserManager.hasUserRestrictionForUser(eq(UserManager.DISALLOW_NETWORK_RESET), any()))
.thenReturn(true);
sendSimpleMsg(mClientMessenger, WifiP2pManager.FACTORY_RESET);
verify(mWifiInjector).getUserManager();
verify(mPackageManager).getNameForUid(anyInt());
verify(mWifiPermissionsUtil).checkNetworkSettingsPermission(anyInt());
verify(mUserManager).hasUserRestrictionForUser(
eq(UserManager.DISALLOW_NETWORK_RESET), any());
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.FACTORY_RESET_FAILED, message.what);
assertEquals(WifiP2pManager.ERROR, message.arg1);
}
/**
* Verify WifiP2pManager.FACTORY_RESET_FAILED is returned when config wifi disallow.
*/
@Test
public void testFactoryResetFailureWhenConfigWifiDisallow() throws Exception {
// Move to enabled state
forceP2pEnabled(mClient1);
when(mWifiInjector.getUserManager()).thenReturn(mUserManager);
when(mPackageManager.getNameForUid(anyInt())).thenReturn(TEST_PACKAGE_NAME);
when(mWifiPermissionsUtil.checkNetworkSettingsPermission(anyInt())).thenReturn(true);
when(mUserManager.hasUserRestrictionForUser(eq(UserManager.DISALLOW_NETWORK_RESET), any()))
.thenReturn(false);
when(mUserManager.hasUserRestrictionForUser(eq(UserManager.DISALLOW_CONFIG_WIFI), any()))
.thenReturn(true);
sendSimpleMsg(mClientMessenger, WifiP2pManager.FACTORY_RESET);
verify(mWifiInjector).getUserManager();
verify(mPackageManager).getNameForUid(anyInt());
verify(mWifiPermissionsUtil).checkNetworkSettingsPermission(anyInt());
verify(mUserManager).hasUserRestrictionForUser(
eq(UserManager.DISALLOW_NETWORK_RESET), any());
verify(mUserManager).hasUserRestrictionForUser(eq(UserManager.DISALLOW_CONFIG_WIFI), any());
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.FACTORY_RESET_FAILED, message.what);
assertEquals(WifiP2pManager.ERROR, message.arg1);
}
/**
* Verify WifiP2pManager.FACTORY_RESET_FAILED is returned when p2p is unsupported.
*/
@Test
public void testFactoryResetFailureWhenP2pUnsupported() throws Exception {
setUpWifiP2pServiceImpl(false);
sendSimpleMsg(mClientMessenger, WifiP2pManager.FACTORY_RESET);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.FACTORY_RESET_FAILED, message.what);
assertEquals(WifiP2pManager.P2P_UNSUPPORTED, message.arg1);
}
/**
* Verify the caller sends WifiP2pManager.SET_ONGOING_PEER_CONFIG.
*/
@Test
public void testSetOngingPeerConfigSuccess() throws Exception {
forceP2pEnabled(mClient1);
mockPeersList();
WifiP2pConfig config = new WifiP2pConfig();
config.deviceAddress = mTestWifiP2pDevice.deviceAddress;
when(mWifiPermissionsUtil.checkNetworkStackPermission(anyInt())).thenReturn(true);
sendSetOngoingPeerConfigMsg(mClientMessenger, config);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.SET_ONGOING_PEER_CONFIG_SUCCEEDED, message.what);
}
/**
* Verify WifiP2pManager.SET_ONGOING_PEER_CONFIG_FAILED is returned without NETWORK_STACK
* permission.
*/
@Test
public void testSetOngingPeerConfigFailureWithoutPermission() throws Exception {
forceP2pEnabled(mClient1);
mockPeersList();
WifiP2pConfig config = new WifiP2pConfig();
when(mWifiPermissionsUtil.checkNetworkStackPermission(anyInt())).thenReturn(false);
sendSetOngoingPeerConfigMsg(mClientMessenger, config);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.SET_ONGOING_PEER_CONFIG_FAILED, message.what);
}
/**
* Verify WifiP2pManager.SET_ONGOING_PEER_CONFIG_FAILED is returned with invalid peer config.
*/
@Test
public void testSetOngoingPeerConfigFailureWithInvalidPeerConfig() throws Exception {
forceP2pEnabled(mClient1);
mockPeersList();
WifiP2pConfig config = new WifiP2pConfig();
when(mWifiPermissionsUtil.checkNetworkStackPermission(anyInt())).thenReturn(true);
sendSetOngoingPeerConfigMsg(mClientMessenger, config);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.SET_ONGOING_PEER_CONFIG_FAILED, message.what);
}
/**
* Verify that respond with RESPONSE_ONGOING_PEER_CONFIG
* when caller sends REQUEST_ONGOING_PEER_CONFIG and permission is granted.
*/
@Test
public void testRequestOngoingPeerConfigSuccess() throws Exception {
forceP2pEnabled(mClient1);
when(mWifiPermissionsUtil.checkNetworkStackPermission(anyInt())).thenReturn(true);
sendSimpleMsg(mClientMessenger, WifiP2pManager.REQUEST_ONGOING_PEER_CONFIG);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
WifiP2pConfig config = (WifiP2pConfig) message.obj;
assertEquals(WifiP2pManager.RESPONSE_ONGOING_PEER_CONFIG, message.what);
assertNotNull(config);
}
/**
* Verify that respond with RESPONSE_ONGOING_PEER_CONFIG
* when caller sends REQUEST_ONGOING_PEER_CONFIG and has no NETWORK_STACK permission.
*/
@Test
public void testRequestOngoingPeerConfigFailureWithoutPermission() throws Exception {
forceP2pEnabled(mClient1);
when(mWifiPermissionsUtil.checkNetworkStackPermission(anyInt())).thenReturn(false);
sendSimpleMsg(mClientMessenger, WifiP2pManager.REQUEST_ONGOING_PEER_CONFIG);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
WifiP2pConfig config = (WifiP2pConfig) message.obj;
assertEquals(WifiP2pManager.RESPONSE_ONGOING_PEER_CONFIG, message.what);
assertNull(config);
}
/**
* Verify that respond with RESPONSE_PERSISTENT_GROUP_INFO
* when caller sends REQUEST_PERSISTENT_GROUP_INFO.
*/
@Test
public void testRequestPersistentGroupInfoSuccess() throws Exception {
// Ensure our own MAC address is not anonymized in the result
when(mWifiPermissionsUtil.checkLocalMacAddressPermission(anyInt())).thenReturn(true);
forceP2pEnabled(mClient1);
sendSimpleMsg(mClientMessenger, WifiP2pManager.REQUEST_PERSISTENT_GROUP_INFO);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
WifiP2pGroupList groups = (WifiP2pGroupList) message.obj;
assertEquals(WifiP2pManager.RESPONSE_PERSISTENT_GROUP_INFO, message.what);
// WifiP2pGroupList does not implement equals operator,
// use toString to compare two lists.
assertEquals(mGroups.toString(), groups.toString());
}
/**
* Verify that when no permissions are held, an empty {@link WifiP2pGroupList} is returned.
*/
@Test
public void testRequestPersistentGroupInfoNoPermissionFailure() throws Exception {
// Ensure our own MAC address is not anonymized in the result
forceP2pEnabled(mClient1);
// no permissions held
when(mWifiPermissionsUtil.checkNetworkSettingsPermission(anyInt())).thenReturn(false);
when(mWifiPermissionsUtil.checkNetworkStackPermission(anyInt())).thenReturn(false);
when(mWifiPermissionsUtil.checkReadWifiCredentialPermission(anyInt())).thenReturn(false);
sendSimpleMsg(mClientMessenger, WifiP2pManager.REQUEST_PERSISTENT_GROUP_INFO);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
WifiP2pGroupList groups = (WifiP2pGroupList) message.obj;
assertEquals(WifiP2pManager.RESPONSE_PERSISTENT_GROUP_INFO, message.what);
// WifiP2pGroupList does not implement equals operator,
// use toString to compare two lists.
// Expect empty WifiP2pGroupList()
assertEquals(new WifiP2pGroupList().toString(), groups.toString());
}
/**
* Verify that respond with RESPONSE_PERSISTENT_GROUP_INFO
* when caller sends REQUEST_PERSISTENT_GROUP_INFO without LOCATION_FINE permission.
*/
@Test
public void testRequestPersistentGroupInfoNoLocationFinePermission() throws Exception {
assumeTrue(SdkLevel.isAtLeastT());
// Ensure our own MAC address is not anonymized in the result
when(mWifiPermissionsUtil.checkLocalMacAddressPermission(anyInt())).thenReturn(true);
when(mWifiPermissionsUtil.checkNearbyDevicesPermission(any(), anyBoolean(), any()))
.thenReturn(false);
when(mWifiPermissionsUtil.isTargetSdkLessThan(any(),
eq(Build.VERSION_CODES.TIRAMISU), anyInt())).thenReturn(false);
when(mWifiPermissionsUtil.checkCallersLocationPermission(
anyString(), anyString(), anyInt(), anyBoolean(), any())).thenReturn(false);
forceP2pEnabled(mClient1);
sendSimpleMsg(mClientMessenger, WifiP2pManager.REQUEST_PERSISTENT_GROUP_INFO);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
WifiP2pGroupList groups = (WifiP2pGroupList) message.obj;
assertEquals(WifiP2pManager.RESPONSE_PERSISTENT_GROUP_INFO, message.what);
// WifiP2pGroupList does not implement equals operator,
// use toString to compare two lists.
// Expect empty WifiP2pGroupList()
assertEquals(new WifiP2pGroupList().toString(), groups.toString());
}
/**
* Verify that respond with RESPONSE_CONNECTION_INFO
* when caller sends REQUEST_CONNECTION_INFO.
*/
@Test
public void testRequestConnectionInfoSuccess() throws Exception {
forceP2pEnabled(mClient1);
sendSimpleMsg(mClientMessenger, WifiP2pManager.REQUEST_CONNECTION_INFO);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
WifiP2pInfo info = (WifiP2pInfo) message.obj;
assertEquals(WifiP2pManager.RESPONSE_CONNECTION_INFO, message.what);
// WifiP2pInfo does not implement equals operator,
// use toString to compare two objects.
assertEquals((new WifiP2pInfo()).toString(), info.toString());
}
/**
* Verify that respond with RESPONSE_P2P_STATE
* when caller sends REQUEST_P2P_STATE and p2p is enabled.
*/
@Test
public void testRequestP2pStateEnabled() throws Exception {
forceP2pEnabled(mClient1);
sendSimpleMsg(mClientMessenger, WifiP2pManager.REQUEST_P2P_STATE);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.RESPONSE_P2P_STATE, message.what);
assertEquals(WifiP2pManager.WIFI_P2P_STATE_ENABLED, message.arg1);
}
/**
* Verify that respond with RESPONSE_P2P_STATE
* when caller sends REQUEST_P2P_STATE and p2p is disabled.
*/
@Test
public void testRequestP2pStateDisabled() throws Exception {
sendSimpleMsg(mClientMessenger, WifiP2pManager.REQUEST_P2P_STATE);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.RESPONSE_P2P_STATE, message.what);
assertEquals(WifiP2pManager.WIFI_P2P_STATE_DISABLED, message.arg1);
}
/**
* Verify that respond with RESPONSE_DISCOVERY_STATE
* when caller sends REQUEST_DISCOVERY_STATE and discovery is started.
*/
@Test
public void testRequestDiscoveryStateWhenStarted() throws Exception {
forceP2pEnabled(mClient1);
when(mWifiPermissionsUtil.checkCanAccessWifiDirect(any(), any(),
anyInt(), anyBoolean())).thenReturn(false);
when(mWifiPermissionsUtil.checkCanAccessWifiDirect(eq(TEST_PACKAGE_NAME), eq("testFeature"),
anyInt(), anyBoolean())).thenReturn(true);
when(mWifiNative.p2pFind(anyInt())).thenReturn(true);
sendDiscoverPeersMsg(mClientMessenger);
verify(mWifiNative).p2pFind(anyInt());
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(
eq(TEST_PACKAGE_NAME), eq("testFeature"), anyInt(), eq(true));
sendSimpleMsg(mClientMessenger, WifiP2pManager.REQUEST_DISCOVERY_STATE);
// there are 2 responses:
// * WifiP2pManager.DISCOVER_PEERS_SUCCEEDED
// * WifiP2pManager.RESPONSE_DISCOVERY_STATE
verify(mClientHandler, times(2)).sendMessage(mMessageCaptor.capture());
List<Message> messages = mMessageCaptor.getAllValues();
assertEquals(WifiP2pManager.DISCOVER_PEERS_SUCCEEDED, messages.get(0).what);
assertEquals(WifiP2pManager.RESPONSE_DISCOVERY_STATE, messages.get(1).what);
assertEquals(WifiP2pManager.WIFI_P2P_DISCOVERY_STARTED, messages.get(1).arg1);
}
/**
* Verify that respond with RESPONSE_DISCOVERY_STATE
* when caller sends REQUEST_DISCOVERY_STATE and discovery is stopped.
*/
@Test
public void testRequestDiscoveryStateWhenStopped() throws Exception {
forceP2pEnabled(mClient1);
sendSimpleMsg(mClientMessenger, WifiP2pManager.REQUEST_DISCOVERY_STATE);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.RESPONSE_DISCOVERY_STATE, message.what);
assertEquals(WifiP2pManager.WIFI_P2P_DISCOVERY_STOPPED, message.arg1);
}
@Test
public void testGetListenStateWhenStarted() throws Exception {
forceP2pEnabled(mClient1);
when(mWifiPermissionsUtil.checkCanAccessWifiDirect(anyString(), anyString(), anyInt(),
anyBoolean())).thenReturn(false);
sendSimpleMsg(mClientMessenger, WifiP2pManager.GET_LISTEN_STATE);
assertTrue(mClientHandler.hasMessages(WifiP2pManager.GET_LISTEN_STATE_FAILED));
when(mWifiPermissionsUtil.checkCanAccessWifiDirect(eq(TEST_PACKAGE_NAME), eq("testFeature"),
anyInt(), anyBoolean())).thenReturn(true);
when(mWifiNative.p2pExtListen(anyBoolean(), anyInt(), anyInt())).thenReturn(true);
sendSimpleMsg(mClientMessenger, WifiP2pManager.START_LISTEN);
verify(mWifiNative).p2pStopFind();
sendSimpleMsg(mClientMessenger, WifiP2pManager.GET_LISTEN_STATE);
sendSimpleMsg(mClientMessenger, WifiP2pManager.STOP_LISTEN);
verify(mWifiNative, times(2)).p2pExtListen(anyBoolean(), anyInt(), anyInt());
sendSimpleMsg(mClientMessenger, WifiP2pManager.GET_LISTEN_STATE);
verify(mClientHandler, times(5)).sendMessage(mMessageCaptor.capture());
List<Message> messages = mMessageCaptor.getAllValues();
assertEquals(WifiP2pManager.GET_LISTEN_STATE_FAILED, messages.get(0).what);
assertEquals(WifiP2pManager.START_LISTEN_SUCCEEDED, messages.get(1).what);
assertEquals(WifiP2pManager.RESPONSE_GET_LISTEN_STATE, messages.get(2).what);
assertEquals(WifiP2pManager.WIFI_P2P_LISTEN_STARTED, messages.get(2).arg1);
assertEquals(WifiP2pManager.STOP_LISTEN_SUCCEEDED, messages.get(3).what);
assertEquals(WifiP2pManager.RESPONSE_GET_LISTEN_STATE, messages.get(4).what);
assertEquals(WifiP2pManager.WIFI_P2P_LISTEN_STOPPED, messages.get(4).arg1);
}
@Test
public void testGetListenStateWhenStopped() throws Exception {
forceP2pEnabled(mClient1);
sendSimpleMsg(mClientMessenger, WifiP2pManager.GET_LISTEN_STATE);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.RESPONSE_GET_LISTEN_STATE, message.what);
assertEquals(WifiP2pManager.WIFI_P2P_LISTEN_STOPPED, message.arg1);
}
/**
* Verify that respond with RESPONSE_NETWORK_INFO
* when caller sends REQUEST_NETWORK_INFO.
*/
@Test
public void testRequestNetworkInfoSuccess() throws Exception {
NetworkInfo info_gold =
new NetworkInfo(ConnectivityManager.TYPE_WIFI_P2P, 0, "WIFI_P2P", "");
sendSimpleMsg(mClientMessenger, WifiP2pManager.REQUEST_NETWORK_INFO);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
NetworkInfo info = (NetworkInfo) message.obj;
assertEquals(WifiP2pManager.RESPONSE_NETWORK_INFO, message.what);
assertEquals(info_gold.toString(), info.toString());
}
/**
* Verify the caller sends WifiP2pManager.REMOVE_LOCAL_SERVICE.
*/
@Test
public void testRemoveLocalServiceSuccess() throws Exception {
setTargetSdkGreaterThanT();
forceP2pEnabled(mClient1);
verifyAddLocalService();
sendRemoveLocalServiceMsg(mClientMessenger, mTestWifiP2pServiceInfo);
verify(mWifiNative).p2pServiceDel(any(WifiP2pServiceInfo.class));
assertTrue(mClientHandler.hasMessages(WifiP2pManager.REMOVE_LOCAL_SERVICE_SUCCEEDED));
}
/**
* Verify the caller sends WifiP2pManager.REMOVE_LOCAL_SERVICE without client info.
*/
@Test
public void testRemoveLocalServiceFailureWithoutClientInfo() throws Exception {
forceP2pEnabledWithoutClientInfo();
sendRemoveLocalServiceMsg(mClientMessenger, mTestWifiP2pServiceInfo);
verify(mWifiNative, never()).p2pServiceDel(any(WifiP2pServiceInfo.class));
assertTrue(mClientHandler.hasMessages(WifiP2pManager.REMOVE_LOCAL_SERVICE_FAILED));
}
/**
* Verify the caller sends WifiP2pManager.REMOVE_LOCAL_SERVICE when service info is null.
*/
@Test
public void testRemoveLocalServiceSuccessWithNullServiceInfo() throws Exception {
setTargetSdkGreaterThanT();
forceP2pEnabled(mClient1);
verifyAddLocalService();
sendRemoveLocalServiceMsg(mClientMessenger, null);
verify(mWifiNative, never()).p2pServiceDel(any(WifiP2pServiceInfo.class));
assertTrue(mClientHandler.hasMessages(WifiP2pManager.REMOVE_LOCAL_SERVICE_SUCCEEDED));
}
/**
* Verify that respond with REMOVE_LOCAL_SERVICE_FAILED
* when caller sends REMOVE_LOCAL_SERVICE and p2p is disabled.
*/
@Test
public void testRemoveLocalServiceFailureWhenP2pDisabled() throws Exception {
sendRemoveLocalServiceMsg(mClientMessenger, null);
verify(mWifiNative, never()).p2pServiceDel(any(WifiP2pServiceInfo.class));
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.REMOVE_LOCAL_SERVICE_FAILED, message.what);
assertEquals(WifiP2pManager.BUSY, message.arg1);
}
/**
* Verify that respond with REMOVE_LOCAL_SERVICE_FAILED
* when caller sends REMOVE_LOCAL_SERVICE and p2p is unsupported.
*/
@Test
public void testRemoveLocalServiceFailureWhenP2pUnsupported() throws Exception {
setUpWifiP2pServiceImpl(false);
sendRemoveLocalServiceMsg(mClientMessenger, null);
verify(mWifiNative, never()).p2pServiceDel(any(WifiP2pServiceInfo.class));
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.REMOVE_LOCAL_SERVICE_FAILED, message.what);
assertEquals(WifiP2pManager.P2P_UNSUPPORTED, message.arg1);
}
/**
* Verify the caller sends WifiP2pManager.CLEAR_LOCAL_SERVICES.
*/
@Test
public void testClearLocalServiceSuccess() throws Exception {
setTargetSdkGreaterThanT();
forceP2pEnabled(mClient1);
verifyAddLocalService();
sendSimpleMsg(mClientMessenger, WifiP2pManager.CLEAR_LOCAL_SERVICES);
verify(mWifiNative, atLeastOnce()).p2pServiceDel(any(WifiP2pServiceInfo.class));
assertTrue(mClientHandler.hasMessages(WifiP2pManager.CLEAR_LOCAL_SERVICES_SUCCEEDED));
}
/**
* Verify the caller sends WifiP2pManager.CLEAR_LOCAL_SERVICES without client info.
*/
@Test
public void testClearLocalServiceFailureWithoutClientInfo() throws Exception {
forceP2pEnabledWithoutClientInfo();
sendSimpleMsg(mClientMessenger, WifiP2pManager.CLEAR_LOCAL_SERVICES);
verify(mWifiNative, never()).p2pServiceDel(any(WifiP2pServiceInfo.class));
assertTrue(mClientHandler.hasMessages(WifiP2pManager.CLEAR_LOCAL_SERVICES_FAILED));
}
/**
* Verify that respond with CLEAR_LOCAL_SERVICES_FAILED
* when caller sends CLEAR_LOCAL_SERVICES and p2p is disabled.
*/
@Test
public void testClearLocalServiceFailureWhenP2pDisabled() throws Exception {
sendSimpleMsg(mClientMessenger, WifiP2pManager.CLEAR_LOCAL_SERVICES);
verify(mWifiNative, never()).p2pServiceDel(any(WifiP2pServiceInfo.class));
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.CLEAR_LOCAL_SERVICES_FAILED, message.what);
assertEquals(WifiP2pManager.BUSY, message.arg1);
}
/**
* Verify that respond with CLEAR_LOCAL_SERVICES_FAILED
* when caller sends CLEAR_LOCAL_SERVICES and p2p is unsupported.
*/
@Test
public void testClearLocalServiceFailureWhenP2pUnsupported() throws Exception {
setUpWifiP2pServiceImpl(false);
sendSimpleMsg(mClientMessenger, WifiP2pManager.CLEAR_LOCAL_SERVICES);
verify(mWifiNative, never()).p2pServiceDel(any(WifiP2pServiceInfo.class));
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.CLEAR_LOCAL_SERVICES_FAILED, message.what);
assertEquals(WifiP2pManager.P2P_UNSUPPORTED, message.arg1);
}
/**
* Verify the caller sends WifiP2pManager.ADD_SERVICE_REQUEST without services discover.
*/
@Test
public void testAddServiceRequestNoOverflow() throws Exception {
forceP2pEnabled(mClient1);
for (int i = 0; i < 256; i++) {
reset(mTestWifiP2pServiceRequest);
sendAddServiceRequestMsg(mClientMessenger);
ArgumentCaptor<Integer> idCaptor = ArgumentCaptor.forClass(int.class);
verify(mTestWifiP2pServiceRequest).setTransactionId(idCaptor.capture());
assertTrue(idCaptor.getValue().intValue() > 0);
}
}
private void verifyAddServiceRequest() throws Exception {
sendAddServiceRequestMsg(mClientMessenger);
assertTrue(mClientHandler.hasMessages(WifiP2pManager.ADD_SERVICE_REQUEST_SUCCEEDED));
}
/**
* Verify the caller sends WifiP2pManager.ADD_SERVICE_REQUEST without services discover.
*/
@Test
public void testAddServiceRequestSuccessWithoutServiceDiscover() throws Exception {
forceP2pEnabled(mClient1);
verifyAddServiceRequest();
}
/**
* Verify the caller sends WifiP2pManager.ADD_SERVICE_REQUEST with services discover.
*/
@Test
public void testAddServiceRequestSuccessWithServiceDiscover() throws Exception {
testDiscoverServicesSuccess();
sendAddServiceRequestMsg(mClientMessenger);
verify(mWifiNative, atLeastOnce()).p2pServDiscReq(eq("00:00:00:00:00:00"), anyString());
assertTrue(mClientHandler.hasMessages(WifiP2pManager.ADD_SERVICE_REQUEST_SUCCEEDED));
}
/**
* Verify WifiP2pManager.ADD_SERVICE_REQUEST_FAILED is returned with null request.
*/
@Test
public void testAddServiceRequestFailureWithNullRequest() throws Exception {
forceP2pEnabled(mClient1);
sendSimpleMsg(mClientMessenger, WifiP2pManager.ADD_SERVICE_REQUEST, null);
assertTrue(mClientHandler.hasMessages(WifiP2pManager.ADD_SERVICE_REQUEST_FAILED));
}
/**
* Verify WifiP2pManager.ADD_SERVICE_REQUEST_FAILED is returned without client info.
*/
@Test
public void testAddServiceRequestFailureWithoutClientInfo() throws Exception {
forceP2pEnabledWithoutClientInfo();
sendAddServiceRequestMsg(mClientMessenger);
assertTrue(mClientHandler.hasMessages(WifiP2pManager.ADD_SERVICE_REQUEST_FAILED));
}
/**
* Verify that respond with ADD_SERVICE_REQUEST_FAILED
* when caller sends ADD_SERVICE_REQUEST and p2p is disabled.
*/
@Test
public void testAddServiceRequestFailureWhenP2pDisabled() throws Exception {
sendAddServiceRequestMsg(mClientMessenger);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.ADD_SERVICE_REQUEST_FAILED, message.what);
assertEquals(WifiP2pManager.BUSY, message.arg1);
}
/**
* Verify that respond with ADD_SERVICE_REQUEST_FAILED
* when caller sends ADD_SERVICE_REQUEST and p2p is unsupported.
*/
@Test
public void testAddServiceRequestFailureWhenP2pUnsupported() throws Exception {
setUpWifiP2pServiceImpl(false);
sendAddServiceRequestMsg(mClientMessenger);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.ADD_SERVICE_REQUEST_FAILED, message.what);
assertEquals(WifiP2pManager.P2P_UNSUPPORTED, message.arg1);
}
/**
* Verify the caller sends WifiP2pManager.REMOVE_SERVICE_REQUEST.
*/
@Test
public void testRemoveServiceRequestSuccess() throws Exception {
forceP2pEnabled(mClient1);
verifyAddServiceRequest();
sendRemoveServiceRequestMsg(mClientMessenger, mTestWifiP2pServiceRequest);
assertTrue(mClientHandler.hasMessages(WifiP2pManager.REMOVE_SERVICE_REQUEST_SUCCEEDED));
}
/**
* Verify the caller sends WifiP2pManager.REMOVE_SERVICE_REQUEST without client info.
*/
@Test
public void testRemoveServiceRequestFailureWithoutClientInfo() throws Exception {
forceP2pEnabledWithoutClientInfo();
sendRemoveServiceRequestMsg(mClientMessenger, mTestWifiP2pServiceRequest);
assertTrue(mClientHandler.hasMessages(WifiP2pManager.REMOVE_SERVICE_REQUEST_FAILED));
}
/**
* Verify the caller sends WifiP2pManager.REMOVE_SERVICE_REQUEST when service info is null.
*/
@Test
public void testRemoveServiceRequestSuccessWithNullServiceInfo() throws Exception {
setTargetSdkGreaterThanT();
forceP2pEnabled(mClient1);
verifyAddLocalService();
sendRemoveServiceRequestMsg(mClientMessenger, null);
assertTrue(mClientHandler.hasMessages(WifiP2pManager.REMOVE_SERVICE_REQUEST_SUCCEEDED));
}
/**
* Verify that respond with REMOVE_SERVICE_REQUEST_FAILED
* when caller sends REMOVE_SERVICE_REQUEST and p2p is disabled.
*/
@Test
public void testRemoveServiceRequestFailureWhenP2pDisabled() throws Exception {
sendRemoveServiceRequestMsg(mClientMessenger, null);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.REMOVE_SERVICE_REQUEST_FAILED, message.what);
assertEquals(WifiP2pManager.BUSY, message.arg1);
}
/**
* Verify that respond with REMOVE_SERVICE_REQUEST_FAILED
* when caller sends REMOVE_SERVICE_REQUEST and p2p is unsupported.
*/
@Test
public void testRemoveServiceRequestFailureWhenP2pUnsupported() throws Exception {
setUpWifiP2pServiceImpl(false);
sendRemoveServiceRequestMsg(mClientMessenger, null);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.REMOVE_SERVICE_REQUEST_FAILED, message.what);
assertEquals(WifiP2pManager.P2P_UNSUPPORTED, message.arg1);
}
/**
* Verify the caller sends WifiP2pManager.CLEAR_SERVICE_REQUESTS.
*/
@Test
public void testClearServiceRequestsSuccess() throws Exception {
forceP2pEnabled(mClient1);
verifyAddServiceRequest();
sendSimpleMsg(mClientMessenger, WifiP2pManager.CLEAR_SERVICE_REQUESTS);
assertTrue(mClientHandler.hasMessages(WifiP2pManager.CLEAR_SERVICE_REQUESTS_SUCCEEDED));
}
/**
* Verify the caller sends WifiP2pManager.CLEAR_SERVICE_REQUESTS without client info.
*/
@Test
public void testClearServiceRequestsFailureWithoutClientInfo() throws Exception {
forceP2pEnabledWithoutClientInfo();
sendSimpleMsg(mClientMessenger, WifiP2pManager.CLEAR_SERVICE_REQUESTS);
assertTrue(mClientHandler.hasMessages(WifiP2pManager.CLEAR_SERVICE_REQUESTS_FAILED));
}
/**
* Verify that respond with CLEAR_SERVICE_REQUESTS_FAILED
* when caller sends CLEAR_SERVICE_REQUEST and p2p is disabled.
*/
@Test
public void testClearServiceRequestsFailureWhenP2pDisabled() throws Exception {
sendSimpleMsg(mClientMessenger, WifiP2pManager.CLEAR_SERVICE_REQUESTS);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.CLEAR_SERVICE_REQUESTS_FAILED, message.what);
assertEquals(WifiP2pManager.BUSY, message.arg1);
}
/**
* Verify that respond with CLEAR_SERVICE_REQUESTS_FAILED
* when caller sends CLEAR_SERVICE_REQUEST and p2p is unsupported.
*/
@Test
public void testClearServiceRequestsFailureWhenP2pUnsupported() throws Exception {
setUpWifiP2pServiceImpl(false);
sendSimpleMsg(mClientMessenger, WifiP2pManager.CLEAR_SERVICE_REQUESTS);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.CLEAR_SERVICE_REQUESTS_FAILED, message.what);
assertEquals(WifiP2pManager.P2P_UNSUPPORTED, message.arg1);
}
/**
* Verify when prior to Android T, stopping discovery is executed when location mode is
* turned off.
*/
@Test
public void testStopDiscoveryWhenLocationModeIsDisabled() throws Exception {
forceP2pEnabled(mClient1);
simulateLocationModeChange(false);
mLooper.dispatchAll();
if (SdkLevel.isAtLeastT()) {
verify(mWifiNative, never()).p2pStopFind();
} else {
verify(mWifiNative).p2pStopFind();
}
}
/**
* Verify a network name which is too long is rejected.
*/
@Test
public void testSendConnectMsgWithTooLongNetworkName() throws Exception {
mTestWifiP2pFastConnectionConfig.networkName = "DIRECT-xy-abcdefghijklmnopqrstuvw";
sendConnectMsg(mClientMessenger, mTestWifiP2pFastConnectionConfig);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.CONNECT_FAILED, message.what);
}
/**
* Verify a network name which is too short is rejected.
*/
@Test
public void testSendConnectMsgWithTooShortNetworkName() throws Exception {
setTargetSdkGreaterThanT();
mTestWifiP2pFastConnectionConfig.networkName = "DIRECT-x";
forceP2pEnabled(mClient1);
when(mWifiNative.p2pGroupAdd(any(), eq(true))).thenReturn(true);
sendConnectMsg(mClientMessenger, mTestWifiP2pFastConnectionConfig);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.CONNECT_FAILED, message.what);
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
}
}
private void verifyGroupOwnerIntentSelection(int netId, int freq, int expectedGoIntent)
throws Exception {
when(mWifiInfo.getNetworkId()).thenReturn(netId);
when(mWifiInfo.getFrequency()).thenReturn(freq);
forceP2pEnabled(mClient1);
mockEnterProvisionDiscoveryState();
WifiP2pProvDiscEvent pdEvent = new WifiP2pProvDiscEvent();
pdEvent.device = mTestWifiP2pDevice;
sendSimpleMsg(null,
WifiP2pMonitor.P2P_PROV_DISC_PBC_RSP_EVENT,
pdEvent);
ArgumentCaptor<WifiP2pConfig> configCaptor =
ArgumentCaptor.forClass(WifiP2pConfig.class);
verify(mWifiNative).p2pConnect(configCaptor.capture(), anyBoolean());
WifiP2pConfig config = configCaptor.getValue();
assertEquals(expectedGoIntent, config.groupOwnerIntent);
}
/**
* Verify the group owner intent value is selected correctly when there is no STA connection.
*/
@Test
public void testGroupOwnerIntentSelectionWithoutStaConnection() throws Exception {
verifyGroupOwnerIntentSelection(WifiConfiguration.INVALID_NETWORK_ID, 2412,
WifiP2pServiceImpl.DEFAULT_GROUP_OWNER_INTENT);
}
/**
* Verify the group owner intent value is selected correctly when STA is connected in 2.4GHz
*/
@Test
public void testGroupOwnerIntentSelectionWith24GStaConnectionWith24g5gDbs() throws Exception {
verifyGroupOwnerIntentSelection(1, 2412, 7);
}
/**
* Verify the group owner intent value is selected correctly when STA is connected in 5GHz
* without 5GHz/6GHz DBS support.
*/
@Test
public void testGroupOwnerIntentSelectionWith5GHzStaConnectionWithout5g6gDbs()
throws Exception {
verifyGroupOwnerIntentSelection(1, 5200, 8);
}
/**
* Verify the group owner intent value is selected correctly when STA is connected in 5GHz
* with 5GHz/6GHz DBS support.
*/
@Test
public void testGroupOwnerIntentSelectionWith5GHzStaConnectionWith24g5gDbs5g6gDbs()
throws Exception {
when(mWifiNative.is5g6gDbsSupported()).thenReturn(true);
verifyGroupOwnerIntentSelection(1, 5200, 9);
}
/**
* Verify the group owner intent value is selected correctly when STA is connected in 6GHz
* without 5GHz/6GHz DBS support.
*/
@Test
public void testGroupOwnerIntentSelectionWith6GHzStaConnectionWithout5g6gDbs()
throws Exception {
verifyGroupOwnerIntentSelection(1, 6000, 11);
}
/**
* Verify the group owner intent value is selected correctly when STA is connected in 6GHz
* with 5GHz/6GHz DBS support.
*/
@Test
public void testGroupOwnerIntentSelectionWith6GHzStaConnectionWith5g6gDbs() throws Exception {
when(mWifiNative.is5g6gDbsSupported()).thenReturn(true);
verifyGroupOwnerIntentSelection(1, 6000, 12);
}
/**
* Verify that a P2P_PROV_DISC_SHOW_PIN_EVENT for config method DISPLAY triggers an invitation
* sent dialog with the correct PIN.
*/
@Test
public void testProvisionDiscoveryShowPinEventLaunchesInvitationSentDialog() throws Exception {
when(mWifiInfo.getNetworkId()).thenReturn(WifiConfiguration.INVALID_NETWORK_ID);
when(mWifiInfo.getFrequency()).thenReturn(2412);
mTestWifiP2pPeerConfig.wps.setup = WpsInfo.DISPLAY;
forceP2pEnabled(mClient1);
mockEnterProvisionDiscoveryState();
WifiP2pProvDiscEvent pdEvent = new WifiP2pProvDiscEvent();
pdEvent.device = mTestWifiP2pDevice;
pdEvent.pin = "pin";
sendSimpleMsg(null,
WifiP2pMonitor.P2P_PROV_DISC_SHOW_PIN_EVENT,
pdEvent);
verify(mWifiNative).p2pConnect(any(), anyBoolean());
if (!SdkLevel.isAtLeastT()) {
verify(mAlertDialog).show();
} else {
verify(mWifiDialogManager).createP2pInvitationSentDialog(
pdEvent.device.deviceName, pdEvent.pin, Display.DEFAULT_DISPLAY);
verify(mDialogHandle).launchDialog();
}
}
/**
* Verify that a P2P_PROV_DISC_SHOW_PIN_EVENT for config method DISPLAY triggers an invitation
* sent dialog with the correct PIN.
*/
@Test
public void testProvisionDiscoveryShowPinEventInactiveStateLaunchesInvitationReceivedDialog()
throws Exception {
when(mWifiInfo.getNetworkId()).thenReturn(WifiConfiguration.INVALID_NETWORK_ID);
when(mWifiInfo.getFrequency()).thenReturn(2412);
mTestWifiP2pPeerConfig.wps.setup = WpsInfo.DISPLAY;
forceP2pEnabled(mClient1);
sendDeviceFoundEventMsg(mTestWifiP2pDevice);
WifiP2pProvDiscEvent pdEvent = new WifiP2pProvDiscEvent();
pdEvent.device = mTestWifiP2pDevice;
pdEvent.pin = "pin";
sendSimpleMsg(null,
WifiP2pMonitor.P2P_PROV_DISC_SHOW_PIN_EVENT,
pdEvent);
if (!SdkLevel.isAtLeastT()) {
verify(mAlertDialog).show();
} else {
verify(mWifiDialogManager).createP2pInvitationReceivedDialog(
eq(pdEvent.device.deviceName), eq(false), eq(pdEvent.pin),
anyInt(), any(), any());
verify(mDialogHandle).launchDialog();
}
}
private List<CoexUnsafeChannel> setupCoexMock(int restrictionBits) {
assumeTrue(SdkLevel.isAtLeastS());
List<CoexUnsafeChannel> unsafeChannels = new ArrayList<>();
unsafeChannels.add(new CoexUnsafeChannel(WifiScanner.WIFI_BAND_24_GHZ, 1));
unsafeChannels.add(new CoexUnsafeChannel(WifiScanner.WIFI_BAND_24_GHZ, 2));
unsafeChannels.add(new CoexUnsafeChannel(WifiScanner.WIFI_BAND_24_GHZ, 3));
unsafeChannels.add(new CoexUnsafeChannel(WifiScanner.WIFI_BAND_5_GHZ, 36));
unsafeChannels.add(new CoexUnsafeChannel(WifiScanner.WIFI_BAND_5_GHZ, 40));
unsafeChannels.add(new CoexUnsafeChannel(WifiScanner.WIFI_BAND_5_GHZ, 165));
when(mCoexManager.getCoexRestrictions()).thenReturn(restrictionBits);
when(mCoexManager.getCoexUnsafeChannels()).thenReturn(unsafeChannels);
when(mWifiNative.p2pSetListenChannel(anyInt())).thenReturn(true);
when(mWifiNative.p2pSetOperatingChannel(anyInt(), any())).thenReturn(true);
return unsafeChannels;
}
/** Verify P2P unsafe channels are set if P2P bit presents in restriction bits. */
@Test
public void testCoexCallbackWithWifiP2pUnsafeChannels() throws Exception {
assumeTrue(SdkLevel.isAtLeastS());
setupCoexMock(0);
assertNotNull(mCoexListener);
forceP2pEnabled(mClient1);
mLooper.dispatchAll();
List<CoexUnsafeChannel> unsafeChannels =
setupCoexMock(WifiManager.COEX_RESTRICTION_WIFI_DIRECT);
mCoexListener.onCoexUnsafeChannelsChanged();
mLooper.dispatchAll();
// On entering P2pEnabledState, these are called once first.
verify(mWifiNative, times(2)).p2pSetListenChannel(eq(0));
ArgumentCaptor<List<CoexUnsafeChannel>> unsafeChannelsCaptor =
ArgumentCaptor.forClass(List.class);
verify(mWifiNative, times(2)).p2pSetOperatingChannel(eq(0), unsafeChannelsCaptor.capture());
List<List<CoexUnsafeChannel>> capturedUnsafeChannelsList =
unsafeChannelsCaptor.getAllValues();
// The second one is what we sent.
assertEquals(unsafeChannels, capturedUnsafeChannelsList.get(1));
}
/** Verify P2P unsafe channels are cleared if P2P bit does not present in restriction bits. */
@Test
public void testCoexCallbackWithoutWifiP2pInRestrictionBits() throws Exception {
assumeTrue(SdkLevel.isAtLeastS());
setupCoexMock(0);
assertNotNull(mCoexListener);
forceP2pEnabled(mClient1);
mLooper.dispatchAll();
mCoexListener.onCoexUnsafeChannelsChanged();
mLooper.dispatchAll();
// On entering P2pEnabledState, these are called once first.
verify(mWifiNative, times(2)).p2pSetListenChannel(eq(0));
ArgumentCaptor<List<CoexUnsafeChannel>> unsafeChannelsCaptor =
ArgumentCaptor.forClass(List.class);
verify(mWifiNative, times(2)).p2pSetOperatingChannel(eq(0), unsafeChannelsCaptor.capture());
List<List<CoexUnsafeChannel>> capturedUnsafeChannelsList =
unsafeChannelsCaptor.getAllValues();
// The second one is what we sent.
assertEquals(0, capturedUnsafeChannelsList.get(1).size());
}
/**
* Verify the caller sends WifiP2pManager.SET_WFD_INFO with wfd enabled
* and WFD R2 device info.
*/
@Test
public void testSetWfdR2InfoSuccessWithWfdEnabled() throws Exception {
assumeTrue(SdkLevel.isAtLeastS());
// Move to enabled state
forceP2pEnabled(mClient1);
mTestThisDevice.status = mTestThisDevice.AVAILABLE;
mTestThisDevice.wfdInfo = new WifiP2pWfdInfo();
mTestThisDevice.wfdInfo.setEnabled(true);
mTestThisDevice.wfdInfo.setR2DeviceType(WifiP2pWfdInfo.DEVICE_TYPE_WFD_SOURCE);
when(mWifiInjector.getWifiPermissionsWrapper()).thenReturn(mWifiPermissionsWrapper);
when(mWifiPermissionsWrapper.getUidPermission(anyString(), anyInt()))
.thenReturn(PackageManager.PERMISSION_GRANTED);
when(mWifiNative.setWfdEnable(anyBoolean())).thenReturn(true);
when(mWifiNative.setWfdDeviceInfo(anyString())).thenReturn(true);
when(mWifiNative.setWfdR2DeviceInfo(anyString())).thenReturn(true);
sendSetWfdInfoMsg(mClientMessenger, mTestThisDevice.wfdInfo);
verify(mWifiInjector).getWifiPermissionsWrapper();
verify(mWifiPermissionsWrapper).getUidPermission(
eq(android.Manifest.permission.CONFIGURE_WIFI_DISPLAY), anyInt());
verify(mWifiNative).setWfdEnable(eq(true));
verify(mWifiNative).setWfdDeviceInfo(eq(mTestThisDevice.wfdInfo.getDeviceInfoHex()));
verify(mWifiNative).setWfdR2DeviceInfo(eq(mTestThisDevice.wfdInfo.getR2DeviceInfoHex()));
checkSendThisDeviceChangedBroadcast();
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.SET_WFD_INFO_SUCCEEDED, message.what);
}
/**
* Verify WifiP2pManager.SET_WFD_INFO_FAILED is returned when wfd is enabled,
* WFD R2 device, and native call "setWfdR2DeviceInfo" failure.
*/
@Test
public void testSetWfdR2InfoFailureWithWfdEnabledWhenNativeCallFailure2() throws Exception {
assumeTrue(SdkLevel.isAtLeastS());
// Move to enabled state
forceP2pEnabled(mClient1);
mTestThisDevice.status = mTestThisDevice.AVAILABLE;
mTestThisDevice.wfdInfo = new WifiP2pWfdInfo();
mTestThisDevice.wfdInfo.setEnabled(true);
mTestThisDevice.wfdInfo.setR2DeviceType(WifiP2pWfdInfo.DEVICE_TYPE_WFD_SOURCE);
when(mWifiInjector.getWifiPermissionsWrapper()).thenReturn(mWifiPermissionsWrapper);
when(mWifiPermissionsWrapper.getUidPermission(anyString(), anyInt()))
.thenReturn(PackageManager.PERMISSION_GRANTED);
when(mWifiNative.setWfdEnable(anyBoolean())).thenReturn(true);
when(mWifiNative.setWfdDeviceInfo(anyString())).thenReturn(true);
when(mWifiNative.setWfdR2DeviceInfo(anyString())).thenReturn(false);
sendSetWfdInfoMsg(mClientMessenger, mTestThisDevice.wfdInfo);
verify(mWifiInjector).getWifiPermissionsWrapper();
verify(mWifiPermissionsWrapper).getUidPermission(
eq(android.Manifest.permission.CONFIGURE_WIFI_DISPLAY), anyInt());
verify(mWifiNative).setWfdEnable(eq(true));
verify(mWifiNative).setWfdDeviceInfo(eq(mTestThisDevice.wfdInfo.getDeviceInfoHex()));
verify(mWifiNative).setWfdR2DeviceInfo(eq(mTestThisDevice.wfdInfo.getR2DeviceInfoHex()));
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.SET_WFD_INFO_FAILED, message.what);
assertEquals(WifiP2pManager.ERROR, message.arg1);
}
/**
* Verify that P2P group is removed during group creating failure.
*/
@Test
public void testGroupCreatingFailureDueToTethering() throws Exception {
when(mWifiNative.p2pGroupAdd(anyBoolean())).thenReturn(true);
when(mWifiNative.p2pGroupRemove(eq(IFACE_NAME_P2P))).thenReturn(true);
when(mWifiPermissionsUtil.checkCanAccessWifiDirect(eq(TEST_PACKAGE_NAME), eq("testFeature"),
anyInt(), anyBoolean())).thenReturn(true);
WifiP2pGroup group = new WifiP2pGroup();
group.setNetworkId(WifiP2pGroup.NETWORK_ID_PERSISTENT);
group.setNetworkName("DIRECT-xy-NEW");
group.setOwner(new WifiP2pDevice("thisDeviceMac"));
group.setIsGroupOwner(true);
group.setInterface(IFACE_NAME_P2P);
forceP2pEnabled(mClient1);
mLooper.dispatchAll();
sendCreateGroupMsg(mClientMessenger, WifiP2pGroup.NETWORK_ID_TEMPORARY, null);
mLooper.dispatchAll();
sendGroupStartedMsg(group);
mLooper.dispatchAll();
mLooper.moveTimeForward(120 * 1000 * 2);
mLooper.dispatchAll();
verify(mWifiNative).p2pGroupRemove(group.getInterface());
}
/**
* Verify the idle timer is cancelled after leaving inactive state.
*/
@Test
public void testIdleTimeoutCancelledAfterLeavingInactiveState() throws Exception {
setTargetSdkGreaterThanT();
forceP2pEnabled(mClient1);
mockPeersList();
sendConnectMsg(mClientMessenger, mTestWifiP2pPeerConfig);
if (SdkLevel.isAtLeastT()) {
verify(mWifiPermissionsUtil, atLeastOnce()).checkNearbyDevicesPermission(
any(), eq(true), any());
verify(mWifiPermissionsUtil, never()).checkCanAccessWifiDirect(
any(), any(), anyInt(), anyBoolean());
} else {
verify(mWifiPermissionsUtil).checkCanAccessWifiDirect(eq(TEST_PACKAGE_NAME),
eq("testFeature"), anyInt(), eq(false));
}
ArgumentCaptor<WifiP2pConfig> configCaptor =
ArgumentCaptor.forClass(WifiP2pConfig.class);
verify(mWifiP2pMetrics).startConnectionEvent(
eq(P2pConnectionEvent.CONNECTION_FRESH),
configCaptor.capture(),
eq(WifiMetricsProto.GroupEvent.GROUP_UNKNOWN),
eq(mClient1.getCallingUid()));
assertEquals(mTestWifiP2pPeerConfig.toString(), configCaptor.getValue().toString());
// Verify timer is cannelled
// Includes re-schedule 3 times:
// 1. forceP2pEnabled(): enter InactiveState
// 2. CONNECT
// 3. leave InactiveState
verify(mAlarmManager, times(3)).setExact(anyInt(), anyLong(),
eq(mWifiP2pServiceImpl.P2P_IDLE_SHUTDOWN_MESSAGE_TIMEOUT_TAG), any(), any());
verify(mAlarmManager, times(3)).cancel(eq(mWifiP2pServiceImpl.mP2pIdleShutdownMessage));
}
/**
* Verify the interface down after idle timer is triggered.
*/
@Test
public void testIdleTimeoutTriggered() throws Exception {
forceP2pEnabled(mClient1);
mWifiP2pServiceImpl.mP2pIdleShutdownMessage.onAlarm();
mLooper.dispatchAll();
verify(mWifiNative).teardownInterface();
verify(mWifiMonitor).stopMonitoring(anyString());
}
/**
* Verify the WFD info is set again on going back to P2pEnabledState
* for the IdleShutdown case.
*/
@Test
public void testWfdInfoIsSetAtP2pEnabledStateForIdleShutdown() throws Exception {
// Move to enabled state
forceP2pEnabled(mClient1);
mTestThisDevice.status = mTestThisDevice.AVAILABLE;
mTestThisDevice.wfdInfo = new WifiP2pWfdInfo();
mTestThisDevice.wfdInfo.setEnabled(true);
when(mWifiInjector.getWifiPermissionsWrapper()).thenReturn(mWifiPermissionsWrapper);
when(mWifiPermissionsWrapper.getUidPermission(anyString(), anyInt()))
.thenReturn(PackageManager.PERMISSION_GRANTED);
when(mWifiNative.setWfdEnable(anyBoolean())).thenReturn(true);
when(mWifiNative.setWfdDeviceInfo(anyString())).thenReturn(true);
sendSetWfdInfoMsg(mClientMessenger, mTestThisDevice.wfdInfo);
// P2P is off due to IDLE and data should be kept for the resume.
mWifiP2pServiceImpl.mP2pIdleShutdownMessage.onAlarm();
mLooper.dispatchAll();
verify(mWifiNative).teardownInterface();
verify(mWifiMonitor).stopMonitoring(anyString());
sendSimpleMsg(null, WifiP2pMonitor.SUP_DISCONNECTION_EVENT);
reset(mWifiNative);
when(mWifiNative.setupInterface(any(), any(), any())).thenReturn(IFACE_NAME_P2P);
when(mWifiNative.setWfdEnable(anyBoolean())).thenReturn(true);
when(mWifiNative.setWfdDeviceInfo(anyString())).thenReturn(true);
// send a command to resume P2P
sendSimpleMsg(mClientMessenger, WifiP2pManager.DISCOVER_PEERS);
// Restore data for resuming from idle shutdown.
verify(mWifiNative).setWfdEnable(eq(true));
verify(mWifiNative).setWfdDeviceInfo(eq(mTestThisDevice.wfdInfo.getDeviceInfoHex()));
}
/**
* Verify the WFD info is set again on going back to P2pEnabledState
* for the normal shutdown case.
*/
@Test
public void testWfdInfoIsSetAtP2pEnabledStateForNormalShutdown() throws Exception {
// Move to enabled state
forceP2pEnabled(mClient1);
mTestThisDevice.status = mTestThisDevice.AVAILABLE;
mTestThisDevice.wfdInfo = new WifiP2pWfdInfo();
mTestThisDevice.wfdInfo.setEnabled(true);
when(mWifiInjector.getWifiPermissionsWrapper()).thenReturn(mWifiPermissionsWrapper);
when(mWifiPermissionsWrapper.getUidPermission(anyString(), anyInt()))
.thenReturn(PackageManager.PERMISSION_GRANTED);
when(mWifiNative.setWfdEnable(anyBoolean())).thenReturn(true);
when(mWifiNative.setWfdDeviceInfo(anyString())).thenReturn(true);
sendSetWfdInfoMsg(mClientMessenger, mTestThisDevice.wfdInfo);
// P2P is really disabled when wifi is off.
simulateWifiStateChange(false);
mLooper.dispatchAll();
verify(mWifiNative).teardownInterface();
verify(mWifiMonitor).stopMonitoring(anyString());
reset(mWifiNative);
when(mWifiNative.setupInterface(any(), any(), any())).thenReturn(IFACE_NAME_P2P);
when(mWifiNative.setWfdEnable(anyBoolean())).thenReturn(true);
when(mWifiNative.setWfdDeviceInfo(anyString())).thenReturn(true);
// send a command to resume P2P
sendSimpleMsg(mClientMessenger, WifiP2pManager.DISCOVER_PEERS);
mLooper.dispatchAll();
// In normal case, wfd info is cleared.
verify(mWifiNative, never()).setWfdEnable(anyBoolean());
verify(mWifiNative, never()).setWfdDeviceInfo(anyString());
}
/**
* Verify the WFD info is set if WFD info is set at P2pDisabledState.
*/
@Test
public void testWfdInfoIsSetAtP2pEnabledWithPreSetWfdInfo() throws Exception {
mTestThisDevice.wfdInfo = new WifiP2pWfdInfo();
mTestThisDevice.wfdInfo.setEnabled(true);
when(mWifiInjector.getWifiPermissionsWrapper()).thenReturn(mWifiPermissionsWrapper);
when(mWifiPermissionsWrapper.getUidPermission(anyString(), anyInt()))
.thenReturn(PackageManager.PERMISSION_GRANTED);
when(mWifiNative.setWfdEnable(anyBoolean())).thenReturn(true);
when(mWifiNative.setWfdDeviceInfo(anyString())).thenReturn(true);
sendSetWfdInfoMsg(mClientMessenger, mTestThisDevice.wfdInfo);
// At disabled state, WFD info is stored in the service, but not set actually.
verify(mWifiNative, never()).setWfdEnable(anyBoolean());
verify(mWifiNative, never()).setWfdDeviceInfo(any());
// Move to enabled state
forceP2pEnabled(mClient1);
mTestThisDevice.status = mTestThisDevice.AVAILABLE;
// Restore data for resuming from idle shutdown.
verify(mWifiNative).setWfdEnable(eq(true));
verify(mWifiNative).setWfdDeviceInfo(eq(mTestThisDevice.wfdInfo.getDeviceInfoHex()));
}
/**
* Verify the frequency changed event handling.
*/
@Test
public void testP2pFrequencyChangedEventHandling() throws Exception {
// Move to group created state
forceP2pEnabled(mClient1);
WifiP2pGroup group = new WifiP2pGroup();
group.setNetworkId(WifiP2pGroup.NETWORK_ID_PERSISTENT);
group.setNetworkName("DIRECT-xy-NEW");
group.setOwner(new WifiP2pDevice("thisDeviceMac"));
group.setIsGroupOwner(true);
group.setInterface(IFACE_NAME_P2P);
sendGroupStartedMsg(group);
simulateTetherReady();
// Send Frequency changed event.
sendSimpleMsg(null,
WifiP2pMonitor.P2P_FREQUENCY_CHANGED_EVENT,
TEST_GROUP_FREQUENCY);
// send WifiP2pManager.REQUEST_GROUP_INFO and check the updated frequency.
sendRequestGroupInfoMsg(mClientMessenger);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
assertEquals(WifiP2pManager.RESPONSE_GROUP_INFO, mMessageCaptor.getValue().what);
WifiP2pGroup wifiP2pGroup = (WifiP2pGroup) mMessageCaptor.getValue().obj;
assertEquals(TEST_GROUP_FREQUENCY, wifiP2pGroup.getFrequency());
}
/*
* Verify the caller sends WifiP2pManager.REMOVE_CLIENT.
*/
@Test
public void testRemoveClientSuccess() throws Exception {
when(mWifiNative.getSupportedFeatures()).thenReturn(
WifiP2pManager.FEATURE_GROUP_CLIENT_REMOVAL);
mockEnterGroupCreatedState();
when(mWifiNative.removeClient(anyString())).thenReturn(true);
sendSimpleMsg(mClientMessenger, WifiP2pManager.REMOVE_CLIENT, mTestWifiP2pPeerAddress);
verify(mWifiNative).removeClient(anyString());
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.REMOVE_CLIENT_SUCCEEDED, message.what);
}
/**
* Verify WifiP2pManager.REMOVE_CLIENT_FAILED is returned when native call failure.
*/
@Test
public void testRemoveClientFailureWhenNativeCallFailure() throws Exception {
when(mWifiNative.getSupportedFeatures()).thenReturn(
WifiP2pManager.FEATURE_GROUP_CLIENT_REMOVAL);
mockEnterGroupCreatedState();
when(mWifiNative.removeClient(anyString())).thenReturn(false);
sendSimpleMsg(mClientMessenger, WifiP2pManager.REMOVE_CLIENT, mTestWifiP2pPeerAddress);
verify(mWifiNative).removeClient(anyString());
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.REMOVE_CLIENT_FAILED, message.what);
assertEquals(WifiP2pManager.ERROR, message.arg1);
}
/**
* Verify WifiP2pManager.REMOVE_CLIENT_SUCCEEDED is returned when p2p is creating group.
*/
@Test
public void testRemoveClientSuccessWhenP2pCreatingGroup() throws Exception {
when(mWifiNative.getSupportedFeatures()).thenReturn(
WifiP2pManager.FEATURE_GROUP_CLIENT_REMOVAL);
// Move to group creating state
testConnectWithConfigValidAsGroupSuccess();
sendSimpleMsg(mClientMessenger, WifiP2pManager.REMOVE_CLIENT, mTestWifiP2pPeerAddress);
verify(mClientHandler, atLeastOnce()).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.REMOVE_CLIENT_SUCCEEDED, message.what);
}
/**
* Verify WifiP2pManager.REMOVE_CLIENT_SUCCEEDED is returned when p2p is inactive.
*/
@Test
public void testRemoveClientSuccessWhenP2pInactive() throws Exception {
when(mWifiNative.getSupportedFeatures()).thenReturn(
WifiP2pManager.FEATURE_GROUP_CLIENT_REMOVAL);
// Move to inactive state
forceP2pEnabled(mClient1);
sendSimpleMsg(mClientMessenger, WifiP2pManager.REMOVE_CLIENT, mTestWifiP2pPeerAddress);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.REMOVE_CLIENT_SUCCEEDED, message.what);
}
/**
* Verify WifiP2pManager.REMOVE_CLIENT_SUCCEEDED is returned when p2p is disabled.
*/
@Test
public void testRemoveClientSuccessWhenP2pDisabled() throws Exception {
when(mWifiNative.getSupportedFeatures()).thenReturn(
WifiP2pManager.FEATURE_GROUP_CLIENT_REMOVAL);
sendSimpleMsg(mClientMessenger, WifiP2pManager.REMOVE_CLIENT, mTestWifiP2pPeerAddress);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.REMOVE_CLIENT_SUCCEEDED, message.what);
}
/**
* Verify WifiP2pManager.REMOVE_CLIENT_FAILED is returned when p2p is unsupported.
*/
@Test
public void testRemoveClientFailureWhenP2pUnsupported() throws Exception {
setUpWifiP2pServiceImpl(false);
when(mWifiNative.getSupportedFeatures()).thenReturn(
WifiP2pManager.FEATURE_GROUP_CLIENT_REMOVAL);
sendSimpleMsg(mClientMessenger, WifiP2pManager.REMOVE_CLIENT, mTestWifiP2pPeerAddress);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
assertEquals(WifiP2pManager.REMOVE_CLIENT_FAILED, message.what);
assertEquals(WifiP2pManager.P2P_UNSUPPORTED, message.arg1);
}
/**
* Verify attribution is passed in correctly by WifiP2pManager#getMessenger.
*/
@Test
public void testGetMessenger_InvalidAttributions() {
assumeTrue(SdkLevel.isAtLeastS());
AttributionSource attributionSource = mock(AttributionSource.class);
when(attributionSource.checkCallingUid()).thenReturn(true);
when(attributionSource.isTrusted(any(Context.class))).thenReturn(true);
mAttribution.putParcelable(EXTRA_PARAM_KEY_ATTRIBUTION_SOURCE, attributionSource);
mWifiP2pServiceImpl = spy(mWifiP2pServiceImpl);
lenient().when(mWifiP2pServiceImpl.getMockableCallingUid()).thenReturn(Process.SYSTEM_UID);
assertThrows(SecurityException.class, () -> {
mWifiP2pServiceImpl.getMessenger(new Binder(), TEST_PACKAGE_NAME, null);
});
assertThrows(SecurityException.class, () -> {
mWifiP2pServiceImpl.getMessenger(new Binder(), TEST_PACKAGE_NAME, new Bundle());
});
assertThrows(SecurityException.class, () -> {
Bundle nullEntry = new Bundle();
nullEntry.putParcelable(EXTRA_PARAM_KEY_ATTRIBUTION_SOURCE, null);
mWifiP2pServiceImpl.getMessenger(new Binder(), TEST_PACKAGE_NAME, nullEntry);
});
assertThrows(SecurityException.class, () -> {
Bundle incorrectEntry = new Bundle();
incorrectEntry.putInt(EXTRA_PARAM_KEY_ATTRIBUTION_SOURCE, 10);
mWifiP2pServiceImpl.getMessenger(new Binder(), TEST_PACKAGE_NAME, incorrectEntry);
});
when(attributionSource.checkCallingUid()).thenReturn(false);
assertThrows(SecurityException.class, () -> {
mWifiP2pServiceImpl.getMessenger(new Binder(), TEST_PACKAGE_NAME, mAttribution);
});
when(attributionSource.checkCallingUid()).thenReturn(true); // restore
// single first attributions should not fail - even if (theoretically, doesn't happen in
// practice) are not trusted. I.e. this call checks that this method isn't called.
AttributionSource freshAs = mock(AttributionSource.class);
Bundle freshAttribution = new Bundle();
freshAttribution.putParcelable(EXTRA_PARAM_KEY_ATTRIBUTION_SOURCE, freshAs);
when(freshAs.checkCallingUid()).thenReturn(true);
when(freshAs.isTrusted(any(Context.class))).thenReturn(false);
mWifiP2pServiceImpl.getMessenger(new Binder(), TEST_PACKAGE_NAME, freshAttribution);
verify(freshAs, never()).isTrusted(any());
AttributionSource originalCaller = mock(AttributionSource.class);
when(originalCaller.getUid()).thenReturn(12345);
when(originalCaller.getPackageName()).thenReturn(TEST_PACKAGE_NAME + ".other");
when(originalCaller.isTrusted(any(Context.class))).thenReturn(false);
when(attributionSource.getNext()).thenReturn(originalCaller);
assertThrows(SecurityException.class, () -> {
mWifiP2pServiceImpl.getMessenger(new Binder(), TEST_PACKAGE_NAME, mAttribution);
});
}
/**
* Verify p2p connection dialog triggering without any Display ID information
*/
@Test
public void testInvitationReceivedDialogTrigger() throws Exception {
forceP2pEnabled(mClient1);
mockPeersList();
WifiP2pConfig config = new WifiP2pConfig();
config.deviceAddress = mTestWifiP2pDevice.deviceAddress;
config.wps = new WpsInfo();
config.wps.setup = WpsInfo.PBC;
// "simple" client connect (no display ID)
sendNegotiationRequestEvent(config);
if (!SdkLevel.isAtLeastT()) {
verify(mAlertDialog).show();
} else {
verify(mWifiDialogManager).createP2pInvitationReceivedDialog(anyString(), anyBoolean(),
any(), eq(Display.DEFAULT_DISPLAY), any(), any());
verify(mDialogHandle).launchDialog(P2P_INVITATION_RECEIVED_TIMEOUT_MS);
}
}
/**
* Verify p2p connection dialog triggering with a privileged caller specifying a display ID.
*/
@Test
public void testInvitationReceivedDialogTriggerWithDisplayId() throws Exception {
assumeTrue(SdkLevel.isAtLeastT());
final int someNonDefaultDisplayId = 123;
forceP2pEnabled(mClient1);
mockPeersList();
WifiP2pConfig config = new WifiP2pConfig();
config.deviceAddress = mTestWifiP2pDevice.deviceAddress;
config.wps = new WpsInfo();
config.wps.setup = WpsInfo.PBC;
// add a privileged client with a display ID
Bundle bundle = new Bundle();
bundle.putInt(WifiP2pManager.EXTRA_PARAM_KEY_DISPLAY_ID, someNonDefaultDisplayId);
when(mWifiPermissionsUtil.isSystem(eq(TEST_PACKAGE_NAME), anyInt())).thenReturn(true);
simulateInitChannel(mClient2, bundle);
sendNegotiationRequestEvent(config);
verify(mWifiDialogManager).createP2pInvitationReceivedDialog(anyString(),
anyBoolean(), any(), eq(someNonDefaultDisplayId), any(), any());
verify(mDialogHandle).launchDialog(P2P_INVITATION_RECEIVED_TIMEOUT_MS);
}
/**
* Verify p2p connection dialog triggering with a privileged client adding a Display ID but then
* closing (i.e. removing itself).
*/
@Test
public void testInvitationReceivedDialogTriggerWithDisplayIdDeleted() throws Exception {
assumeTrue(SdkLevel.isAtLeastT());
forceP2pEnabled(mClient1);
mockPeersList();
WifiP2pConfig config = new WifiP2pConfig();
config.deviceAddress = mTestWifiP2pDevice.deviceAddress;
config.wps = new WpsInfo();
config.wps.setup = WpsInfo.PBC;
// add a privileged client with a display ID
Bundle bundle = new Bundle();
bundle.putInt(WifiP2pManager.EXTRA_PARAM_KEY_DISPLAY_ID, 123);
when(mWifiPermissionsUtil.isSystem(eq(TEST_PACKAGE_NAME), anyInt())).thenReturn(true);
simulateInitChannel(mClient2, bundle);
mWifiP2pServiceImpl.close(mClient2);
// "simple" client connect (no display ID)
sendNegotiationRequestEvent(config);
verify(mWifiDialogManager).createP2pInvitationReceivedDialog(anyString(), anyBoolean(),
any(), eq(Display.DEFAULT_DISPLAY), any(), any());
verify(mDialogHandle).launchDialog(P2P_INVITATION_RECEIVED_TIMEOUT_MS);
}
private void verifySetVendorElement(boolean isP2pActivated, boolean shouldSucceed,
boolean hasPermission, boolean shouldSetToNative) throws Exception {
when(mWifiNative.getSupportedFeatures()).thenReturn(
WifiP2pManager.FEATURE_SET_VENDOR_ELEMENTS);
when(mWifiPermissionsUtil.checkNearbyDevicesPermission(any(), anyBoolean(), any()))
.thenReturn(hasPermission);
when(mWifiPermissionsUtil.checkConfigOverridePermission(anyInt()))
.thenReturn(hasPermission);
simulateWifiStateChange(true);
simulateLocationModeChange(true);
checkIsP2pInitWhenClientConnected(isP2pActivated, mClient1,
new WorkSource(mClient1.getCallingUid(), TEST_PACKAGE_NAME));
ArrayList<ScanResult.InformationElement> ies = new ArrayList<>();
ies.add(new ScanResult.InformationElement(
ScanResult.InformationElement.EID_VSA, 0,
new byte[]{(byte) 0xa, (byte) 0xb}));
HashSet<ScanResult.InformationElement> expectedIes = new HashSet<>();
expectedIes.add(ies.get(0));
sendSetVendorElementsMsg(mClientMessenger, ies);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
if (shouldSucceed) {
assertEquals(WifiP2pManager.SET_VENDOR_ELEMENTS_SUCCEEDED, message.what);
} else {
assertEquals(WifiP2pManager.SET_VENDOR_ELEMENTS_FAILED, message.what);
}
// Launch a peer discovery to set cached VSIEs to the native service.
sendDiscoverPeersMsg(mClientMessenger);
if (shouldSetToNative) {
if (shouldSucceed) {
verify(mWifiNative).setVendorElements(eq(expectedIes));
} else {
// If failed to set vendor elements, there is no entry in the list.
verify(mWifiNative).setVendorElements(eq(
new HashSet<ScanResult.InformationElement>()));
}
} else {
verify(mWifiNative, never()).setVendorElements(any());
}
}
/**
* Verify sunny scenario for setVendorElements when P2P is not in EnabledState.
*/
@Test
public void testSetVendorElementsSuccessForIdleShutdown() throws Exception {
assumeTrue(SdkLevel.isAtLeastT());
boolean isP2pActivated = false, shouldSucceed = true;
boolean hasPermission = true, shouldSetToNative = true;
verifySetVendorElement(isP2pActivated, shouldSucceed,
hasPermission, shouldSetToNative);
}
/**
* Verify sunny scenario for setVendorElements when P2P is in EnabledState.
*/
@Test
public void testSetVendorElementsSuccessForActiveP2p() throws Exception {
assumeTrue(SdkLevel.isAtLeastT());
boolean isP2pActivated = true, shouldSucceed = true;
boolean hasPermission = true, shouldSetToNative = true;
verifySetVendorElement(isP2pActivated, shouldSucceed,
hasPermission, shouldSetToNative);
}
/**
* Verify failure scenario for setVendorElements when no NEARBY permission.
*/
@Test
public void testSetVendorElementsFailureWithoutNearbyPermission() throws Exception {
assumeTrue(SdkLevel.isAtLeastT());
boolean isP2pActivated = false, shouldSucceed = false;
boolean hasPermission = false, shouldSetToNative = true;
verifySetVendorElement(isP2pActivated, shouldSucceed,
hasPermission, shouldSetToNative);
}
private void verifyAddExternalApprover(boolean hasPermission,
boolean shouldSucceed) throws Exception {
verifyAddExternalApprover(new Binder(), hasPermission, shouldSucceed);
}
private void verifyAddExternalApprover(Binder binder, boolean hasPermission,
boolean shouldSucceed) throws Exception {
verifyAddExternalApprover(binder, hasPermission,
shouldSucceed,
MacAddress.fromString(mTestWifiP2pDevice.deviceAddress));
}
private void verifyAddExternalApprover(Binder binder, boolean hasPermission,
boolean shouldSucceed, MacAddress devAddr) throws Exception {
when(mWifiPermissionsUtil.checkManageWifiNetworkSelectionPermission(anyInt()))
.thenReturn(hasPermission);
when(mWifiPermissionsUtil.checkNearbyDevicesPermission(any(), anyBoolean(), any()))
.thenReturn(hasPermission);
simulateInitChannel(mClient1);
sendAddExternalApproverMsg(mClientMessenger, devAddr, binder);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
if (shouldSucceed) {
assertEquals(WifiP2pManager.EXTERNAL_APPROVER_ATTACH, message.what);
} else {
assertEquals(WifiP2pManager.EXTERNAL_APPROVER_DETACH, message.what);
}
}
/**
* Verify sunny scenario for addExternalApprover.
*/
@Test
public void testAddExternalApproverSuccess() throws Exception {
assumeTrue(SdkLevel.isAtLeastS());
boolean hasPermission = true, shouldSucceed = true;
verifyAddExternalApprover(hasPermission, shouldSucceed);
}
/**
* Verify failure scenario for addExternalApprover when
* the caller has no proper permission.
*/
@Test
public void testAddExternalApproverFailureWithoutPermission() throws Exception {
assumeTrue(SdkLevel.isAtLeastS());
boolean hasPermission = false, shouldSucceed = false;
verifyAddExternalApprover(hasPermission, shouldSucceed);
}
private void verifyRemoveExternalApprover(boolean hasPermission,
boolean shouldSucceed) throws Exception {
when(mWifiPermissionsUtil.checkManageWifiNetworkSelectionPermission(anyInt()))
.thenReturn(hasPermission);
when(mWifiPermissionsUtil.checkNearbyDevicesPermission(any(), anyBoolean(), any()))
.thenReturn(hasPermission);
MacAddress devAddr = MacAddress.fromString(
mTestWifiP2pDevice.deviceAddress);
simulateInitChannel(mClient1);
sendRemoveExternalApproverMsg(mClientMessenger, devAddr, mClient1);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
Message message = mMessageCaptor.getValue();
if (shouldSucceed) {
assertEquals(WifiP2pManager.REMOVE_EXTERNAL_APPROVER_SUCCEEDED, message.what);
} else {
assertEquals(WifiP2pManager.REMOVE_EXTERNAL_APPROVER_FAILED, message.what);
}
}
/**
* Verify sunny scenario for removeExternalApprover.
*/
@Test
public void testRemoveExternalApproverSuccess() throws Exception {
assumeTrue(SdkLevel.isAtLeastS());
boolean hasPermission = true, shouldSucceed = true;
verifyRemoveExternalApprover(hasPermission, shouldSucceed);
}
/**
* Verify failure scenario for removeExternalApprover when
* the caller has no proper permission.
*/
@Test
public void testRemoveExternalApproverFailureWithoutPermission() throws Exception {
assumeTrue(SdkLevel.isAtLeastS());
boolean hasPermission = false, shouldSucceed = false;
verifyRemoveExternalApprover(hasPermission, shouldSucceed);
}
private void verifySetConnectionRequestResult(MacAddress addr,
boolean hasApprover,
boolean hasPermission, boolean shouldSucceed,
int wpsType, int result) throws Exception {
Binder binder = new Binder();
forceP2pEnabled(mClient1);
mockPeersList();
if (hasApprover) {
verifyAddExternalApprover(binder, true, true, addr);
}
mockEnterUserAuthorizingNegotiationRequestState(wpsType);
when(mWifiPermissionsUtil.checkManageWifiNetworkSelectionPermission(anyInt()))
.thenReturn(hasPermission);
when(mWifiPermissionsUtil.checkNearbyDevicesPermission(any(), anyBoolean(), any()))
.thenReturn(hasPermission);
sendSetConnectionRequestResultMsg(mClientMessenger,
MacAddress.fromString(mTestWifiP2pDevice.deviceAddress),
result, binder);
if (shouldSucceed) {
// There are 4 replies:
// * EXTERNAL_APPROVER_ATTACH
// * EXTERNAL_APPROVER_CONNECTION_REQUESTED
// * EXTERNAL_APPROVER_DETACH
// * SET_CONNECTION_REQUEST_RESULT_SUCCEEDED
ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class);
verify(mClientHandler, times(4)).sendMessage(messageCaptor.capture());
List<Message> messages = messageCaptor.getAllValues();
assertEquals(WifiP2pManager.SET_CONNECTION_REQUEST_RESULT_SUCCEEDED,
messages.get(3).what);
} else {
int expectedMessageCount = hasApprover ? 3 : 1;
// There are 2 additional replies if having a approver.
// * (With an approver) EXTERNAL_APPROVER_ATTACH
// * (With an approver) EXTERNAL_APPROVER_CONNECTION_REQUESTED
// * SET_CONNECTION_REQUEST_RESULT_FAILED
ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class);
verify(mClientHandler, times(expectedMessageCount)).sendMessage(
messageCaptor.capture());
List<Message> messages = messageCaptor.getAllValues();
assertEquals(WifiP2pManager.SET_CONNECTION_REQUEST_RESULT_FAILED,
messages.get(expectedMessageCount - 1).what);
}
}
/**
* Verify sunny scenario for setConnectionRequestResult.
*/
@Test
public void testSetConnectionRequestResultSuccess() throws Exception {
assumeTrue(SdkLevel.isAtLeastS());
boolean hasApprover = true, hasPermission = true, shouldSucceed = true;
verifySetConnectionRequestResult(MacAddress.fromString(mTestWifiP2pDevice.deviceAddress),
hasApprover, hasPermission, shouldSucceed,
WpsInfo.PBC, WifiP2pManager.CONNECTION_REQUEST_ACCEPT);
}
/**
* Verify sunny scenario for setConnectionRequestResult with the wildcard address.
*/
@Test
public void testSetConnectionRequestResultWithWildcardAddressSuccess() throws Exception {
assumeTrue(SdkLevel.isAtLeastS());
boolean hasApprover = true, hasPermission = true, shouldSucceed = true;
verifySetConnectionRequestResult(MacAddress.BROADCAST_ADDRESS,
hasApprover, hasPermission, shouldSucceed,
WpsInfo.PBC, WifiP2pManager.CONNECTION_REQUEST_ACCEPT);
}
private void verifyMultiApproverMatch(List<MacAddress> addresses, MacAddress expectedMatch)
throws Exception {
when(mWifiPermissionsUtil.checkManageWifiNetworkSelectionPermission(anyInt()))
.thenReturn(true);
when(mWifiPermissionsUtil.checkNearbyDevicesPermission(any(), anyBoolean(), any()))
.thenReturn(true);
Binder binder = new Binder();
forceP2pEnabled(mClient1);
mockPeersList();
for (MacAddress addr: addresses) {
verifyAddExternalApprover(binder, true /* hasPermission */,
true /* shouldSucceed */, addr);
reset(mClientHandler);
}
// Received a request from mTestWifiP2pDevice
mockEnterUserAuthorizingNegotiationRequestState(WpsInfo.PBC);
sendSetConnectionRequestResultMsg(mClientMessenger,
MacAddress.fromString(mTestWifiP2pDevice.deviceAddress),
WifiP2pManager.CONNECTION_REQUEST_ACCEPT, binder);
// There are 3 replies:
// * EXTERNAL_APPROVER_CONNECTION_REQUESTED
// * EXTERNAL_APPROVER_DETACH
// * SET_CONNECTION_REQUEST_RESULT_SUCCEEDED
ArgumentCaptor<Message> messageCaptor = ArgumentCaptor.forClass(Message.class);
verify(mClientHandler, times(3)).sendMessage(messageCaptor.capture());
List<Message> messages = messageCaptor.getAllValues();
assertEquals(WifiP2pManager.EXTERNAL_APPROVER_CONNECTION_REQUESTED,
messages.get(0).what);
Bundle requestBundle = (Bundle) messages.get(0).obj;
WifiP2pDevice requestDevice = requestBundle.getParcelable(
WifiP2pManager.EXTRA_PARAM_KEY_DEVICE);
assertEquals(mTestWifiP2pDevice.deviceAddress, requestDevice.deviceAddress);
assertEquals(WifiP2pManager.EXTERNAL_APPROVER_DETACH,
messages.get(1).what);
assertEquals(expectedMatch, (MacAddress) messages.get(1).obj);
assertEquals(WifiP2pManager.SET_CONNECTION_REQUEST_RESULT_SUCCEEDED,
messages.get(2).what);
}
/**
* Verify that a registered address could be matched correctly
* with additional wildcard address.
*/
@Test
public void testDirectMatchWithWildcardAddress() throws Exception {
assumeTrue(SdkLevel.isAtLeastS());
List<MacAddress> addresses = new ArrayList<>();
addresses.add(MacAddress.fromString(mTestWifiP2pDevice.deviceAddress));
addresses.add(MacAddress.BROADCAST_ADDRESS);
verifyMultiApproverMatch(addresses,
MacAddress.fromString(mTestWifiP2pDevice.deviceAddress));
}
/**
* Verify that a unkonwn address could be matched against the wildcard address correctly
* with an address and the wildcard address.
*/
@Test
public void testWildcardAddressMatch() throws Exception {
assumeTrue(SdkLevel.isAtLeastS());
List<MacAddress> addresses = new ArrayList<>();
addresses.add(MacAddress.fromString("00:02:00:00:00:00"));
addresses.add(MacAddress.BROADCAST_ADDRESS);
verifyMultiApproverMatch(addresses, MacAddress.BROADCAST_ADDRESS);
}
/**
* Verify the failure scenario for setConnectionRequestResult without permissions.
*/
@Test
public void testSetConnectionRequestResultFailureWithoutPermission() throws Exception {
assumeTrue(SdkLevel.isAtLeastS());
boolean hasApprover = true, hasPermission = false, shouldSucceed = false;
verifySetConnectionRequestResult(MacAddress.fromString(mTestWifiP2pDevice.deviceAddress),
hasApprover, hasPermission, shouldSucceed,
WpsInfo.PBC, WifiP2pManager.CONNECTION_REQUEST_ACCEPT);
}
/**
* Verify the failure scenario for setConnectionRequestResult without a registered approver.
*/
@Test
public void testSetConnectionRequestResultFailureWithoutApprover() throws Exception {
assumeTrue(SdkLevel.isAtLeastS());
boolean hasApprover = false, hasPermission = true, shouldSucceed = false;
verifySetConnectionRequestResult(MacAddress.fromString(mTestWifiP2pDevice.deviceAddress),
hasApprover, hasPermission, shouldSucceed,
WpsInfo.PBC, WifiP2pManager.CONNECTION_REQUEST_ACCEPT);
}
/**
* Verify that deferring pin to the framework works normally.
*/
@Test
public void testSetConnectionRequestResultDeferPinToFramework() throws Exception {
assumeTrue(SdkLevel.isAtLeastS());
boolean hasApprover = true, hasPermission = true, shouldSucceed = true;
verifySetConnectionRequestResult(MacAddress.fromString(mTestWifiP2pDevice.deviceAddress),
hasApprover, hasPermission, shouldSucceed,
WpsInfo.KEYPAD, WifiP2pManager.CONNECTION_REQUEST_DEFER_SHOW_PIN_TO_SERVICE);
}
/**
* Validate p2p initialization when user approval is required.
*/
public void runTestP2pWithUserApproval(boolean userAcceptsRequest) throws Exception {
ArgumentCaptor<State> mTargetStateCaptor = ArgumentCaptor.forClass(State.class);
ArgumentCaptor<WaitingState> mWaitingStateCaptor = ArgumentCaptor.forClass(
WaitingState.class);
InOrder inOrder = inOrder(mInterfaceConflictManager);
simulateWifiStateChange(true);
simulateInitChannel(mClient1);
// simulate user approval needed
when(mInterfaceConflictManager.manageInterfaceConflictForStateMachine(any(), any(), any(),
any(), any(), eq(HalDeviceManager.HDM_CREATE_IFACE_P2P), any(), anyBoolean()))
.thenAnswer(new MockAnswerUtil.AnswerWithArguments() {
public int answer(String tag, Message msg, StateMachine stateMachine,
WaitingState waitingState, State targetState, int createIfaceType,
WorkSource requestorWs,
boolean bypassDialog) {
stateMachine.deferMessage(msg);
stateMachine.transitionTo(waitingState);
return InterfaceConflictManager.ICM_SKIP_COMMAND_WAIT_FOR_USER;
}
});
sendSimpleMsg(mClientMessenger, WifiP2pManager.DISCOVER_PEERS);
mLooper.dispatchAll();
inOrder.verify(mInterfaceConflictManager).manageInterfaceConflictForStateMachine(any(),
any(), any(), mWaitingStateCaptor.capture(), mTargetStateCaptor.capture(),
eq(HalDeviceManager.HDM_CREATE_IFACE_P2P), any(), anyBoolean());
// simulate user approval triggered and granted
when(mInterfaceConflictManager.manageInterfaceConflictForStateMachine(any(), any(), any(),
any(), any(), eq(HalDeviceManager.HDM_CREATE_IFACE_P2P), any(), anyBoolean()))
.thenReturn(userAcceptsRequest ? InterfaceConflictManager.ICM_EXECUTE_COMMAND
: InterfaceConflictManager.ICM_ABORT_COMMAND);
mWaitingStateCaptor.getValue().sendTransitionStateCommand(mTargetStateCaptor.getValue());
mLooper.dispatchAll();
verify(mWifiNative, userAcceptsRequest ? times(1) : never()).setupInterface(any(), any(),
eq(new WorkSource(mClient1.getCallingUid(), TEST_PACKAGE_NAME)));
if (userAcceptsRequest) {
// Device status is AVAILABLE
mTestThisDevice.status = WifiP2pDevice.AVAILABLE;
checkSendThisDeviceChangedBroadcast();
sendSimpleMsg(mClientMessenger, WifiP2pManager.REQUEST_DEVICE_INFO);
verify(mClientHandler, times(2)).sendMessage(mMessageCaptor.capture());
assertEquals(WifiP2pManager.RESPONSE_DEVICE_INFO, mMessageCaptor.getValue().what);
assertEquals(WifiP2pDevice.AVAILABLE,
((WifiP2pDevice) mMessageCaptor.getValue().obj).status);
} else {
// Device status is UNAVAILABLE
mTestThisDevice = new WifiP2pDevice();
mTestThisDevice.deviceName = thisDeviceName;
mTestThisDevice.deviceAddress = thisDeviceMac;
checkSendThisDeviceChangedBroadcast();
sendSimpleMsg(mClientMessenger, WifiP2pManager.REQUEST_DEVICE_INFO);
verify(mClientHandler, times(2)).sendMessage(mMessageCaptor.capture());
assertEquals(WifiP2pManager.RESPONSE_DEVICE_INFO, mMessageCaptor.getValue().what);
assertEquals(WifiP2pDevice.UNAVAILABLE,
((WifiP2pDevice) mMessageCaptor.getValue().obj).status);
}
}
/**
* Validate p2p initialization when user approval is required and granted.
*/
@Test
public void testP2pWithUserApprovalAccept() throws Exception {
runTestP2pWithUserApproval(true);
}
/**
* Validate p2p initialization when user approval is required and granted.
*/
@Test
public void testP2pWithUserApprovalReject() throws Exception {
runTestP2pWithUserApproval(false);
}
/**
* Validate InterfaceConflictManager is reset if user approval occurs after wifi turned off.
*/
@Test
public void testInterfaceConflictManagerResetIfWifiTurnedOff() throws Exception {
ArgumentCaptor<State> mTargetStateCaptor = ArgumentCaptor.forClass(State.class);
ArgumentCaptor<WaitingState> mWaitingStateCaptor = ArgumentCaptor.forClass(
WaitingState.class);
InOrder inOrder = inOrder(mInterfaceConflictManager);
simulateWifiStateChange(true);
simulateInitChannel(mClient1);
// simulate user approval needed
when(mInterfaceConflictManager.manageInterfaceConflictForStateMachine(any(), any(), any(),
any(), any(), eq(HalDeviceManager.HDM_CREATE_IFACE_P2P), any(), anyBoolean()))
.thenAnswer(new MockAnswerUtil.AnswerWithArguments() {
public int answer(String tag, Message msg, StateMachine stateMachine,
WaitingState waitingState, State targetState,
int createIfaceType,
WorkSource requestorWs,
boolean bypassDialog) {
stateMachine.deferMessage(msg);
stateMachine.transitionTo(waitingState);
return InterfaceConflictManager.ICM_SKIP_COMMAND_WAIT_FOR_USER;
}
});
sendSimpleMsg(mClientMessenger, WifiP2pManager.DISCOVER_PEERS);
mLooper.dispatchAll();
inOrder.verify(mInterfaceConflictManager).manageInterfaceConflictForStateMachine(any(),
any(), any(), mWaitingStateCaptor.capture(), mTargetStateCaptor.capture(),
eq(HalDeviceManager.HDM_CREATE_IFACE_P2P), any(), anyBoolean());
// Turn off Wi-Fi
simulateWifiStateChange(false);
// simulate user approval triggered and granted
when(mInterfaceConflictManager.manageInterfaceConflictForStateMachine(any(), any(), any(),
any(), any(), eq(HalDeviceManager.HDM_CREATE_IFACE_P2P), any(), anyBoolean()))
.thenReturn(InterfaceConflictManager.ICM_EXECUTE_COMMAND);
mWaitingStateCaptor.getValue().sendTransitionStateCommand(mTargetStateCaptor.getValue());
mLooper.dispatchAll();
// Verify InterfaceConflictManager is reset
verify(mInterfaceConflictManager).reset();
verify(mWifiNative, never()).setupInterface(any(), any(),
eq(new WorkSource(mClient1.getCallingUid(), TEST_PACKAGE_NAME)));
}
/*
* Verify the connection event ends due to the provision discovery failure.
*/
@Test
public void testProvDiscRejectEventForProvDisc() throws Exception {
forceP2pEnabled(mClient1);
when(mWifiNative.p2pGroupAdd(anyBoolean())).thenReturn(true);
mockEnterProvisionDiscoveryState();
WifiP2pProvDiscEvent pdEvent = new WifiP2pProvDiscEvent();
pdEvent.device = mTestWifiP2pDevice;
sendSimpleMsg(null,
WifiP2pMonitor.P2P_PROV_DISC_FAILURE_EVENT,
WifiP2pMonitor.PROV_DISC_STATUS_REJECTED,
pdEvent);
verify(mWifiNative).p2pCancelConnect();
}
/**
* Verify the p2p reject is sent on canceling a request.
*/
@Test
public void testSendP2pRejectWhenCancelRequest() throws Exception {
forceP2pEnabled(mClient1);
when(mWifiNative.p2pGroupAdd(anyBoolean())).thenReturn(true);
mockEnterProvisionDiscoveryState();
WifiP2pProvDiscEvent pdEvent = new WifiP2pProvDiscEvent();
pdEvent.device = mTestWifiP2pDevice;
sendSimpleMsg(null, WifiP2pManager.CANCEL_CONNECT);
verify(mWifiNative).p2pReject(eq(mTestWifiP2pDevice.deviceAddress));
}
/**
*
*/
@Test
public void testSendP2pRejectOnRejectRequest() throws Exception {
when(mWifiNative.p2pGroupAdd(anyBoolean())).thenReturn(true);
forceP2pEnabled(mClient1);
mockEnterUserAuthorizingNegotiationRequestState(WpsInfo.PBC);
sendSimpleMsg(null, WifiP2pServiceImpl.PEER_CONNECTION_USER_REJECT);
verify(mWifiNative).p2pReject(eq(mTestWifiP2pDevice.deviceAddress));
}
@Test
public void testDismissDialogOnReceiveProvDiscFailureEvent() throws Exception {
assumeTrue(SdkLevel.isAtLeastT());
when(mWifiNative.p2pGroupAdd(anyBoolean())).thenReturn(true);
forceP2pEnabled(mClient1);
mockEnterUserAuthorizingNegotiationRequestState(WpsInfo.PBC);
WifiP2pProvDiscEvent pdEvent = new WifiP2pProvDiscEvent();
pdEvent.device = mTestWifiP2pDevice;
sendSimpleMsg(null,
WifiP2pMonitor.P2P_PROV_DISC_FAILURE_EVENT,
WifiP2pMonitor.PROV_DISC_STATUS_REJECTED,
pdEvent);
verify(mDialogHandle).dismissDialog();
}
@Test
public void testDismissDialogOnReceiveProvDiscFailureEventPreT() throws Exception {
assumeFalse(SdkLevel.isAtLeastT());
when(mWifiNative.p2pGroupAdd(anyBoolean())).thenReturn(true);
forceP2pEnabled(mClient1);
mockEnterUserAuthorizingNegotiationRequestState(WpsInfo.PBC);
WifiP2pProvDiscEvent pdEvent = new WifiP2pProvDiscEvent();
pdEvent.device = mTestWifiP2pDevice;
sendSimpleMsg(null,
WifiP2pMonitor.P2P_PROV_DISC_FAILURE_EVENT,
WifiP2pMonitor.PROV_DISC_STATUS_REJECTED,
pdEvent);
verify(mAlertDialog).dismiss();
}
/**
* Verify the tethering request is sent with TETHER_PRIVILEGED permission.
*/
@Test
public void testTetheringRequestWithTetherPrivilegedPermission() throws Exception {
mockEnterGroupCreatedState();
String[] permission_gold = new String[] {
android.Manifest.permission.TETHER_PRIVILEGED};
ArgumentCaptor<String []> permissionCaptor = ArgumentCaptor.forClass(String[].class);
String[] permission;
// 3 connection changed event:
// * Enter Enabled state
// * Enter Group Connecting state
// * Tethering request.
if (SdkLevel.isAtLeastT()) {
verify(mContext, times(3)).sendBroadcastWithMultiplePermissions(
argThat(new WifiP2pServiceImplTest
.P2pConnectionChangedIntentMatcherForNetworkState(null)),
permissionCaptor.capture());
permission = permissionCaptor.getAllValues().get(2);
} else {
verify(mContext, times(2)).sendBroadcastWithMultiplePermissions(
argThat(new WifiP2pServiceImplTest
.P2pConnectionChangedIntentMatcherForNetworkState(IDLE)),
permissionCaptor.capture());
permission = permissionCaptor.getAllValues().get(1);
}
Arrays.sort(permission);
Arrays.sort(permission_gold);
assertEquals(permission_gold, permission);
}
/**
* Verify ENABLE_P2P won't set up P2P interface when there is no
* active client.
*/
@Test
public void testEnableP2pIsIgnoredWhenNoActiveClient() throws Exception {
simulateWifiStateChange(true);
simulateLocationModeChange(true);
simulateInitChannel(mClient1);
sendP2pStateMachineMessage(WifiP2pServiceImpl.ENABLE_P2P);
mLooper.dispatchAll();
verify(mWifiNative, never()).setupInterface(any(), any(), any());
verify(mNetdWrapper, never()).setInterfaceUp(anyString());
verify(mWifiMonitor, never()).registerHandler(anyString(), anyInt(), any());
}
@Test
public void testPbcReconnectForUnknownGroupInvitation() throws Exception {
forceP2pEnabled(mClient1);
when(mWifiNative.getGroupCapability(any())).thenReturn(0);
when(mWifiNative.p2pReinvoke(anyInt(), any())).thenReturn(true);
when(mWifiNative.p2pGetSsid(any())).thenReturn(null);
when(mTestWifiP2pDevice.isGroupOwner()).thenReturn(false);
when(mTestWifiP2pDevice.isInvitationCapable()).thenReturn(true);
mockPeersList();
// Trigger reinvoke to enter Group Negotiation state
mTestWifiP2pPeerConfig.wps.setup = WpsInfo.PBC;
sendConnectMsg(mClientMessenger, mTestWifiP2pPeerConfig);
// Got the unknown group result from the peer.
sendInvitationResultMsg(WifiP2pServiceImpl.P2pStatus.UNKNOWN_P2P_GROUP);
// For PBC request, p2p should start from negotiation request directly.
verify(mWifiNative, never()).p2pProvisionDiscovery(any());
verify(mWifiNative).p2pConnect(eq(mTestWifiP2pPeerConfig), anyBoolean());
}
@Test
public void testPinReconnectForUnknownGroupInvitation() throws Exception {
forceP2pEnabled(mClient1);
when(mWifiNative.getGroupCapability(any())).thenReturn(0);
when(mWifiNative.p2pReinvoke(anyInt(), any())).thenReturn(true);
when(mWifiNative.p2pGetSsid(any())).thenReturn(null);
when(mTestWifiP2pDevice.isGroupOwner()).thenReturn(false);
when(mTestWifiP2pDevice.isInvitationCapable()).thenReturn(true);
mockPeersList();
// Trigger reinvoke to enter Group Negotiation state
mTestWifiP2pPeerConfig.wps.setup = WpsInfo.KEYPAD;
sendConnectMsg(mClientMessenger, mTestWifiP2pPeerConfig);
// Got the unknown group result from the peer.
sendInvitationResultMsg(WifiP2pServiceImpl.P2pStatus.UNKNOWN_P2P_GROUP);
// For Keypad/Display pin-based request, p2p should start the p2p connection
// from provision discovery to exchange pin codes.
verify(mWifiNative).p2pProvisionDiscovery(mTestWifiP2pPeerConfig);
}
/**
* Verify internal reconnect works normally.
*/
@Test
public void testInternalReconnectForUnknownP2pGroup() throws Exception {
lenient().when(Process.myUid()).thenReturn(Process.SYSTEM_UID);
when(mWifiNative.p2pInvite(any(), any())).thenReturn(true);
// Put newly formed group to the saved group list.
WifiP2pGroup savedGroup = new WifiP2pGroup(mTestWifiP2pNewPersistentGoGroup);
savedGroup.setNetworkId(99);
mGroups.add(savedGroup);
forceP2pEnabled(mClient1);
sendGroupStartedMsg(mTestWifiP2pNewPersistentGoGroup);
simulateTetherReady();
// Mock an outgoing invitation.
mockPeersList();
sendSetOngoingPeerConfigMsg(mClientMessenger, mTestWifiP2pPeerConfig);
mLooper.dispatchAll();
// The peer does not know this group, reconnect to the peer.
sendInvitationResultMsg(WifiP2pServiceImpl.P2pStatus.UNKNOWN_P2P_GROUP);
mLooper.dispatchAll();
verify(mWifiNative).p2pInvite(any(), eq(mTestWifiP2pPeerConfig.deviceAddress));
}
@Test
public void testSurplusProvisionDiscoveryRequestsBehavior() throws Exception {
assumeTrue(SdkLevel.isAtLeastT());
when(mClock.getElapsedSinceBootMillis()).thenReturn(0L);
mockEnterGroupCreatedState();
// The first provision discvoery request triggers the dialog.
WifiP2pProvDiscEvent pdEvent = new WifiP2pProvDiscEvent();
pdEvent.device = mTestWifiP2pDevice;
sendSimpleMsg(null, WifiP2pMonitor.P2P_PROV_DISC_PBC_REQ_EVENT,
pdEvent);
verify(mWifiDialogManager).createP2pInvitationReceivedDialog(
eq(mTestWifiP2pDevice.deviceAddress), anyBoolean(),
any(), anyInt(), any(), any());
verify(mDialogHandle).launchDialog(P2P_INVITATION_RECEIVED_TIMEOUT_MS);
// Handle it programmatically.
sendSimpleMsg(null, WifiP2pServiceImpl.PEER_CONNECTION_USER_REJECT);
// Send another provision discvoery request again.
sendSimpleMsg(null, WifiP2pMonitor.P2P_PROV_DISC_PBC_REQ_EVENT,
pdEvent);
// This surplus request should not trigger a dialog.
reset(mWifiDialogManager);
reset(mDialogHandle);
verify(mWifiDialogManager, never()).createP2pInvitationReceivedDialog(
any(), anyBoolean(), any(), anyInt(), any(), any());
when(mWifiDialogManager.createP2pInvitationReceivedDialog(any(), anyBoolean(), any(),
anyInt(), any(), any())).thenReturn(mDialogHandle);
when(mWifiDialogManager.createP2pInvitationSentDialog(any(), any(), anyInt()))
.thenReturn(mDialogHandle);
when(mClock.getElapsedSinceBootMillis()).thenReturn(P2P_PEER_AUTH_TIMEOUT_MS + 1L);
// Send another provision discvoery request again after the timeout
sendSimpleMsg(null, WifiP2pMonitor.P2P_PROV_DISC_PBC_REQ_EVENT,
pdEvent);
// Another dialog should be triggered.
verify(mWifiDialogManager).createP2pInvitationReceivedDialog(
eq(mTestWifiP2pDevice.deviceAddress), anyBoolean(),
any(), anyInt(), any(), any());
verify(mDialogHandle).launchDialog(P2P_INVITATION_RECEIVED_TIMEOUT_MS);
}
@Test
public void testP2pInfoIsClearedWhenP2pIsDisabledDurningNegotiation() throws Exception {
forceP2pEnabled(mClient1);
WifiP2pGroup group = new WifiP2pGroup();
group.setNetworkId(WifiP2pGroup.NETWORK_ID_PERSISTENT);
group.setNetworkName("DIRECT-xy-NEW");
group.setOwner(new WifiP2pDevice("thisDeviceMac"));
group.setIsGroupOwner(true);
group.setInterface(IFACE_NAME_P2P);
sendGroupStartedMsg(group);
// P2P group is formed, the internal group data are filled.
// The tether request is not done yet, so it stays at GroupNegotiationState.
sendSimpleMsg(mClientMessenger, WifiP2pManager.REQUEST_CONNECTION_INFO);
verify(mClientHandler).sendMessage(mMessageCaptor.capture());
assertEquals(WifiP2pManager.RESPONSE_CONNECTION_INFO, mMessageCaptor.getValue().what);
assertTrue(((WifiP2pInfo) mMessageCaptor.getValue().obj).groupFormed);
// Go back to P2pDisabledState.
sendP2pStateMachineMessage(WifiP2pServiceImpl.DISABLE_P2P);
sendP2pStateMachineMessage(WifiP2pMonitor.SUP_DISCONNECTION_EVENT);
mLooper.dispatchAll();
// p2p info should be cleared.
sendSimpleMsg(mClientMessenger, WifiP2pManager.REQUEST_CONNECTION_INFO);
verify(mClientHandler, times(2)).sendMessage(mMessageCaptor.capture());
assertEquals(WifiP2pManager.RESPONSE_CONNECTION_INFO, mMessageCaptor.getValue().what);
assertFalse(((WifiP2pInfo) mMessageCaptor.getValue().obj).groupFormed);
}
@Test
public void testGroupStartedTetheringDirectCallback() throws Exception {
assumeTrue(SdkLevel.isAtLeastS());
forceP2pEnabled(mClient1);
verify(mTetheringManager).registerTetheringEventCallback(any(), any());
//create/start/remove group
when(mWifiNative.p2pGroupAdd(any(), eq(false))).thenReturn(true);
sendCreateGroupMsgWithConfigValidAsGroup(mClientMessenger);
assertTrue(mClientHandler.hasMessages(WifiP2pManager.CREATE_GROUP_SUCCEEDED));
WifiP2pGroup group = new WifiP2pGroup();
group.setNetworkName("DIRECT-test");
group.setOwner(new WifiP2pDevice("thisDeviceMac"));
group.setIsGroupOwner(true);
group.setInterface(IFACE_NAME_P2P);
sendGroupStartedMsg(group);
simulateTetherReady();
verify(mWifiP2pMetrics).startGroupEvent(group);
sendGroupRemovedMsg();
//force to back disabled state
mockEnterDisabledState();
verify(mTetheringManager).unregisterTetheringEventCallback(any());
}
/**
* Verify that GroupFailure triggers internal p2p discover
*/
@Test
public void testGroupfailuretriggerInternalDiscoverPeers() throws Exception {
lenient().when(Process.myUid()).thenReturn(Process.SYSTEM_UID);
when(mWifiNative.p2pFind(anyInt())).thenReturn(true);
forceP2pEnabled(mClient1);
when(mWifiNative.p2pGroupAdd(anyBoolean())).thenReturn(true);
mockEnterProvisionDiscoveryState();
WifiP2pProvDiscEvent pdEvent = new WifiP2pProvDiscEvent();
pdEvent.device = mTestWifiP2pDevice;
/* Trigger a group failure */
sendSimpleMsg(null, WifiP2pManager.CANCEL_CONNECT);
/* Verify that p2p discover is triggered */
verify(mWifiNative).p2pFind(anyInt());
}
@Test
public void testFallbackToNegotiationOnInviteStatusCodeInfoUnavailable() throws Exception {
forceP2pEnabled(mClient1);
when(mWifiNative.getGroupCapability(any())).thenReturn(0);
when(mWifiNative.p2pReinvoke(anyInt(), any())).thenReturn(true);
when(mWifiNative.p2pGetSsid(any())).thenReturn(null);
when(mTestWifiP2pDevice.isGroupOwner()).thenReturn(false);
when(mTestWifiP2pDevice.isInvitationCapable()).thenReturn(true);
mockPeersList();
// Trigger reinvoke to enter Group Negotiation state
mTestWifiP2pPeerConfig.wps.setup = WpsInfo.KEYPAD;
sendConnectMsg(mClientMessenger, mTestWifiP2pPeerConfig);
// Got Fail: information is currently unavailable
sendInvitationResultMsg(WifiP2pServiceImpl.P2pStatus.INFORMATION_IS_CURRENTLY_UNAVAILABLE);
verify(mWifiNative).p2pConnect(eq(mTestWifiP2pPeerConfig), anyBoolean());
verify(mWifiP2pMetrics).setFallbackToNegotiationOnInviteStatusInfoUnavailable();
}
/**
* Verify that p2p connect with Join existing group is set
*/
@Test
public void verifyP2pConnectWithJoinExistingGroupSet() throws Exception {
forceP2pEnabled(mClient1);
mockEnterProvisionDiscoveryState(mTestWifiP2pJoinExistingGroupConfig);
WifiP2pProvDiscEvent pdEvent = new WifiP2pProvDiscEvent();
pdEvent.device = mTestWifiP2pDevice;
sendSimpleMsg(null,
WifiP2pMonitor.P2P_PROV_DISC_PBC_RSP_EVENT,
pdEvent);
ArgumentCaptor<WifiP2pConfig> configCaptor =
ArgumentCaptor.forClass(WifiP2pConfig.class);
verify(mWifiNative).p2pConnect(configCaptor.capture(), eq(true));
WifiP2pConfig config = configCaptor.getValue();
assertTrue(config.isJoinExistingGroup());
}
/**
* Verify that EAPOL IP Address allocation parameters are set
*/
@Test
public void checkConfigureEapolIpAddressAllocationParams() throws Exception {
when(mResources.getBoolean(R.bool
.config_wifiP2pGoIpAddressAllocationInEapolFrames)).thenReturn(true);
forceP2pEnabled(mClient1);
InetAddress ipAddressGo = InetAddresses.parseNumericAddress(
WifiP2pServiceImpl.GO_EAPOL_IP_ADDRESS);
InetAddress subnetMask = InetAddresses.parseNumericAddress(
WifiP2pServiceImpl.GO_EAPOL_IP_SUBNET_MASK);
InetAddress ipAddressRangeStart = InetAddresses.parseNumericAddress(
WifiP2pServiceImpl.GO_EAPOL_IP_RANGE_DEFAULT_START_ADDRESS);
InetAddress ipAddressRangeEnd = InetAddresses.parseNumericAddress(
WifiP2pServiceImpl.GO_EAPOL_IP_RANGE_DEFAULT_END_ADDRESS);
verify(mWifiNative).configureEapolIpAddressAllocationParams(
eq(inet4AddressToIntHTL((Inet4Address) ipAddressGo)),
eq(inet4AddressToIntHTL((Inet4Address) subnetMask)),
eq(inet4AddressToIntHTL((Inet4Address) ipAddressRangeStart)),
eq(inet4AddressToIntHTL((Inet4Address) ipAddressRangeEnd)));
}
/**
* Verify that EAPOL IP Address allocation parameters are not configured when the feature is not
* enabled via overlay configuration item.
*/
@Test
public void testConfigureEapolIpAddressAllocationParamsWhenConfigOverlayDisabled()
throws Exception {
forceP2pEnabled(mClient1);
verify(mWifiNative, never()).configureEapolIpAddressAllocationParams(anyInt(),
anyInt(), anyInt(), anyInt());
}
}