diff options
24 files changed, 2158 insertions, 84 deletions
diff --git a/framework/java/android/net/wifi/SoftApInfo.java b/framework/java/android/net/wifi/SoftApInfo.java index fac3fd428c..3e974c06fe 100644 --- a/framework/java/android/net/wifi/SoftApInfo.java +++ b/framework/java/android/net/wifi/SoftApInfo.java @@ -454,7 +454,7 @@ public final class SoftApInfo implements Parcelable { sbuf.append(", mApInstanceIdentifier= ").append(mApInstanceIdentifier); sbuf.append(", mIdleShutdownTimeoutMillis= ").append(mIdleShutdownTimeoutMillis); sbuf.append(", mVendorData= ").append(mVendorData); - if (mMldAddress != null) sbuf.append(",mMldAddress=").append(mBssid.toString()); + if (mMldAddress != null) sbuf.append(",mMldAddress=").append(mMldAddress.toString()); sbuf.append("}"); return sbuf.toString(); } diff --git a/framework/java/android/net/wifi/WifiNetworkSpecifier.java b/framework/java/android/net/wifi/WifiNetworkSpecifier.java index e00e7e6b7b..abb8734ca2 100644 --- a/framework/java/android/net/wifi/WifiNetworkSpecifier.java +++ b/framework/java/android/net/wifi/WifiNetworkSpecifier.java @@ -22,6 +22,7 @@ import static com.android.internal.util.Preconditions.checkNotNull; import android.annotation.NonNull; import android.annotation.Nullable; +import android.compat.annotation.UnsupportedAppUsage; import android.net.ConnectivityManager; import android.net.ConnectivityManager.NetworkCallback; import android.net.MacAddress; @@ -490,7 +491,7 @@ public final class WifiNetworkSpecifier extends NetworkSpecifier implements Parc * @return Instance of {@link Builder} to enable chaining of the builder method. * @hide */ - @NonNull public Builder setPreferSecondarySta(boolean value) { + @NonNull @UnsupportedAppUsage public Builder setPreferSecondarySta(boolean value) { mPreferSecondarySta = value; return this; } @@ -779,7 +780,7 @@ public final class WifiNetworkSpecifier extends NetworkSpecifier implements Parc * @see Builder#setPreferSecondarySta(boolean) * @hide */ - public boolean isPreferSecondarySta() { + @UnsupportedAppUsage public boolean isPreferSecondarySta() { return mPreferSecondarySta; } diff --git a/service/ServiceWifiResources/res/values/config.xml b/service/ServiceWifiResources/res/values/config.xml index 5390b48e86..38bc072032 100644 --- a/service/ServiceWifiResources/res/values/config.xml +++ b/service/ServiceWifiResources/res/values/config.xml @@ -1019,9 +1019,9 @@ <!-- Indicate whether the verbose logging is always on --> <!-- 0: verbose logging controlled by user - 1: verbose logging on by default for userdebug + 1: verbose logging on by default for userdebug/eng 2: verbose logging on by default for all builds --> - <integer translatable="false" name="config_wifiVerboseLoggingAlwaysOnLevel">0</integer> + <integer translatable="false" name="config_wifiVerboseLoggingAlwaysOnLevel">1</integer> <!-- Indicate the help page link for the Root CA certifiate installation. --> <string translatable="false" name="config_wifiCertInstallationHelpLink">https://support.google.com/pixelphone/answer/2844832</string> diff --git a/service/java/com/android/server/wifi/ActiveModeWarden.java b/service/java/com/android/server/wifi/ActiveModeWarden.java index c08388a3cb..397d49d778 100644 --- a/service/java/com/android/server/wifi/ActiveModeWarden.java +++ b/service/java/com/android/server/wifi/ActiveModeWarden.java @@ -2467,9 +2467,6 @@ public class ActiveModeWarden { } class EnabledState extends BaseState { - - private boolean mIsDisablingDueToAirplaneMode; - EnabledState(int threshold) { super(threshold, mWifiInjector.getWifiHandlerLocalLog()); } @@ -2481,7 +2478,6 @@ public class ActiveModeWarden { if (!hasAnyModeManager()) { Log.e(TAG, "Entered EnabledState, but no active mode managers"); } - mIsDisablingDueToAirplaneMode = false; } @Override @@ -2664,15 +2660,15 @@ public class ActiveModeWarden { case CMD_AIRPLANE_TOGGLED: // airplane mode toggled on is handled in the default state if (mSettingsStore.isAirplaneModeOn()) { - mIsDisablingDueToAirplaneMode = true; return NOT_HANDLED; } else { - if (mIsDisablingDueToAirplaneMode) { + if (mWifiState.get() == WIFI_STATE_DISABLING) { // Previous airplane mode toggle on is being processed, defer the // message toggle off until previous processing is completed. // Once previous airplane mode toggle is complete, we should // transition to DisabledState. There, we will process the deferred // airplane mode toggle message to disable airplane mode. + Log.i(TAG, "Deferring CMD_AIRPLANE_TOGGLED."); deferMessage(msg); } else { if (!hasPrimaryOrScanOnlyModeManager()) { @@ -2745,6 +2741,26 @@ public class ActiveModeWarden { transitionTo(mDisabledState); } else { log("STA disabled, remain in EnabledState."); + // Handle any deferred airplane toggle off messages that didn't + // trigger due to no state change + if (hasDeferredMessages(CMD_AIRPLANE_TOGGLED) + && !hasPrimaryOrScanOnlyModeManager()) { + removeDeferredMessages(CMD_AIRPLANE_TOGGLED); + if (mSettingsStore.isAirplaneModeOn()) { + // deferred APM toggle is only meant to be done for APM off, so + // no-op if APM is already on here. + break; + } + log("Airplane mode disabled, determine next state"); + if (shouldEnableSta()) { + startPrimaryOrScanOnlyClientModeManager( + // Assumes user toggled it on from settings before. + mFacade.getSettingsWorkSource(mContext)); + mLastCallerInfoManager.put(WifiManager.API_WIFI_ENABLED, + Process.myTid(), Process.WIFI_UID, -1, "android_apm", + true); + } + } } break; case CMD_DEFERRED_RECOVERY_RESTART_WIFI: diff --git a/service/java/com/android/server/wifi/ClientModeImpl.java b/service/java/com/android/server/wifi/ClientModeImpl.java index edbd7e3043..d4858416fe 100644 --- a/service/java/com/android/server/wifi/ClientModeImpl.java +++ b/service/java/com/android/server/wifi/ClientModeImpl.java @@ -327,6 +327,12 @@ public class ClientModeImpl extends StateMachine implements ClientMode { private PowerManager.WakeLock mSuspendWakeLock; + // Log Wifi L2 and L3 connection state transition time stamp + private long mL2ConnectingStateTimestamp; + private long mL2ConnectedStateTimestamp; + private long mL3ProvisioningStateTimestamp; + private long mL3ConnectedStateTimestamp; + /** * Value to set in wpa_supplicant "bssid" field when we don't want to restrict connection to * a specific AP. @@ -3896,6 +3902,15 @@ public class ClientModeImpl extends StateMachine implements ClientMode { if (frequency == WifiInfo.UNKNOWN_FREQUENCY && candidate != null) { frequency = candidate.frequency; } + + long l2ConnectionDuration = + (mL2ConnectedStateTimestamp - mL2ConnectingStateTimestamp) > 0 + ? (mL2ConnectedStateTimestamp - mL2ConnectingStateTimestamp) : 0; + long l3ConnectionDuration = (mL3ConnectedStateTimestamp - mL3ProvisioningStateTimestamp) > 0 + ? (mL3ConnectedStateTimestamp - mL3ProvisioningStateTimestamp) : 0; + mWifiMetrics.reportConnectingDuration(mInterfaceName, + l2ConnectionDuration, l3ConnectionDuration); + mWifiMetrics.endConnectionEvent(mInterfaceName, level2FailureCode, connectivityFailureCode, level2FailureReason, frequency, statusCode); mWifiConnectivityManager.handleConnectionAttemptEnded( @@ -5783,6 +5798,8 @@ public class ClientModeImpl extends StateMachine implements ClientMode { // We need to get the updated pseudonym from supplicant for EAP-SIM/AKA/AKA' if (config.enterpriseConfig != null && config.enterpriseConfig.isAuthenticationSimBased()) { + // clear SIM related EapFailurenotification + mEapFailureNotifier.dismissEapFailureNotification(config.SSID); if (mWifiCarrierInfoManager.isOobPseudonymFeatureEnabled( config.carrierId)) { if (mVerboseLoggingEnabled) { @@ -6084,6 +6101,7 @@ public class ClientModeImpl extends StateMachine implements ClientMode { // network. In some cases supplicant ignores the connect requests (it might not // find the target SSID in its cache), Therefore we end up stuck that state, hence the // need for the watchdog. + mL2ConnectingStateTimestamp = mClock.getElapsedSinceBootMillis(); mConnectingWatchdogCount++; logd("Start Connecting Watchdog " + mConnectingWatchdogCount); sendMessageDelayed(obtainMessage(CMD_CONNECTING_WATCHDOG_TIMER, @@ -6459,6 +6477,7 @@ public class ClientModeImpl extends StateMachine implements ClientMode { @Override public void enterImpl() { + mL2ConnectedStateTimestamp = mClock.getElapsedSinceBootMillis(); final WifiConfiguration config = getConnectedWifiConfigurationInternal(); if (config == null) { logw("Connected to a network that's already been removed " + mLastNetworkId @@ -7078,6 +7097,7 @@ public class ClientModeImpl extends StateMachine implements ClientMode { @Override public void enterImpl() { + mL3ProvisioningStateTimestamp = mClock.getElapsedSinceBootMillis(); startL3Provisioning(); if (mContext.getResources().getBoolean( R.bool.config_wifiRemainConnectedAfterIpProvisionTimeout)) { @@ -7347,7 +7367,7 @@ public class ClientModeImpl extends StateMachine implements ClientMode { if (mVerboseLoggingEnabled) { log("Enter ConnectedState mScreenOn=" + mScreenOn); } - + mL3ConnectedStateTimestamp = mClock.getElapsedSinceBootMillis(); reportConnectionAttemptEnd( WifiMetrics.ConnectionEvent.FAILURE_NONE, WifiMetricsProto.ConnectionEvent.HLF_NONE, diff --git a/service/java/com/android/server/wifi/ConcreteClientModeManager.java b/service/java/com/android/server/wifi/ConcreteClientModeManager.java index c7094f84b0..c736c80166 100644 --- a/service/java/com/android/server/wifi/ConcreteClientModeManager.java +++ b/service/java/com/android/server/wifi/ConcreteClientModeManager.java @@ -20,6 +20,8 @@ import static android.net.wifi.WifiManager.WIFI_STATE_DISABLING; import static android.net.wifi.WifiManager.WIFI_STATE_ENABLED; import static android.net.wifi.WifiManager.WIFI_STATE_ENABLING; +import static com.android.server.wifi.util.GeneralUtil.bitsetToLong; + import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; @@ -1494,6 +1496,12 @@ public class ConcreteClientModeManager implements ClientModeManager { } @Override + @Keep + public long getSupportedFeatures() { + return bitsetToLong(getSupportedFeaturesBitSet()); + } + + @Override public boolean syncStartSubscriptionProvisioning(int callingUid, OsuProvider provider, IProvisioningCallback callback) { return getClientMode().syncStartSubscriptionProvisioning( diff --git a/service/java/com/android/server/wifi/EapFailureNotifier.java b/service/java/com/android/server/wifi/EapFailureNotifier.java index 64143eb816..fc0dddb5f6 100644 --- a/service/java/com/android/server/wifi/EapFailureNotifier.java +++ b/service/java/com/android/server/wifi/EapFailureNotifier.java @@ -135,6 +135,23 @@ public class EapFailureNotifier { } /** + * Dismiss notification + */ + public void dismissEapFailureNotification(String ssid) { + if (TextUtils.isEmpty(mCurrentShownSsid) || TextUtils.isEmpty(ssid) + || !TextUtils.equals(ssid, mCurrentShownSsid)) { + return; + } + StatusBarNotification[] activeNotifications = mNotificationManager.getActiveNotifications(); + for (StatusBarNotification activeNotification : activeNotifications) { + if ((activeNotification.getId() == NOTIFICATION_ID)) { + mNotificationManager.cancel(NOTIFICATION_ID); + return; + } + } + } + + /** * Display eap error notification which defined by carrier. * * @param ssid Error Message which defined by carrier diff --git a/service/java/com/android/server/wifi/FrameworkFacade.java b/service/java/com/android/server/wifi/FrameworkFacade.java index 7b905732c4..086bff6db1 100644 --- a/service/java/com/android/server/wifi/FrameworkFacade.java +++ b/service/java/com/android/server/wifi/FrameworkFacade.java @@ -448,8 +448,8 @@ public class FrameworkFacade { return true; //If the overlay setting enabled for userdebug builds only case VERBOSE_LOGGING_ALWAYS_ON_LEVEL_USERDEBUG: - // If it is a userdebug build - if (buildProperties.isUserdebugBuild()) return true; + // If it is a userdebug or eng build + if (buildProperties.isUserdebugBuild() || buildProperties.isEngBuild()) return true; break; case VERBOSE_LOGGING_ALWAYS_ON_LEVEL_NONE: // nothing diff --git a/service/java/com/android/server/wifi/WifiMetrics.java b/service/java/com/android/server/wifi/WifiMetrics.java index 00f117a2ef..58b13fc2ea 100644 --- a/service/java/com/android/server/wifi/WifiMetrics.java +++ b/service/java/com/android/server/wifi/WifiMetrics.java @@ -56,6 +56,7 @@ import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.net.ConnectivityManager; +import android.net.MacAddress; import android.net.Network; import android.net.NetworkCapabilities; import android.net.wifi.DeauthenticationReasonCode; @@ -1244,6 +1245,8 @@ public class WifiMetrics { private int mPhase2Method; private int mPasspointRoamingType; private int mTofuConnectionState; + private long mL2ConnectingDuration; + private long mL3ConnectingDuration; @VisibleForTesting ConnectionEvent() { @@ -2043,6 +2046,8 @@ public class WifiMetrics { mFirstConnectionAfterBoot; currentConnectionEvent.mRole = role; currentConnectionEvent.mUid = uid; + currentConnectionEvent.mL2ConnectingDuration = 0; + currentConnectionEvent.mL3ConnectingDuration = 0; mFirstConnectionAfterBoot = false; mConnectionEventList.add(currentConnectionEvent); mScanResultRssiTimestampMillis = -1; @@ -2261,6 +2266,26 @@ public class WifiMetrics { } /** + * Log L2 and L3 connection transition time + * + * @param ifaceName interface name for this connection event + * @param l2ConnectingDuration Time duration between L2ConnectState to L3ProvisioningState + * @param l3ConnectingDuration Time duration between L3ProvisioningState to mL3ConnectedState + */ + public void reportConnectingDuration( + String ifaceName, + long l2ConnectingDuration, + long l3ConnectingDuration) { + synchronized (mLock) { + ConnectionEvent currentConnectionEvent = mCurrentConnectionEventPerIface.get(ifaceName); + if (currentConnectionEvent != null) { + currentConnectionEvent.mL2ConnectingDuration = l2ConnectingDuration; + currentConnectionEvent.mL3ConnectingDuration = l3ConnectingDuration; + } + } + } + + /** * End a Connection event record. Call when wifi connection attempt succeeds or fails. * If a Connection event has not been started and is active when .end is called, then this * method will do nothing. @@ -2332,7 +2357,9 @@ public class WifiMetrics { currentConnectionEvent.mCarrierId, currentConnectionEvent.mTofuConnectionState, currentConnectionEvent.mUid, - frequency); + frequency, + currentConnectionEvent.mL2ConnectingDuration, + currentConnectionEvent.mL3ConnectingDuration); if (connectionSucceeded) { reportRouterCapabilities(currentConnectionEvent.mRouterFingerPrint); @@ -4959,8 +4986,8 @@ public class WifiMetrics { eventLine.append(",client_control_is_enabled=" + event.clientControlIsEnabled); pw.println(eventLine.toString()); } - - mWifiPowerMetrics.dump(pw); + // TODO(b/393985164): Temporary remove this from dump. + // mWifiPowerMetrics.dump(pw); mWifiWakeMetrics.dump(pw); pw.println("mWifiLogProto.isMacRandomizationOn=" @@ -7425,9 +7452,17 @@ public class WifiMetrics { WifiLinkLayerStats.ScanResultWithSameFreq linkLayerScanResult = link.scan_results_same_freq.get(scanResultsIndex); if (linkLayerScanResult != null) { - String wifiLinkBssid = (mloLinks.size() > 0) - ? mloLinks.get(link.link_id, new MloLink()) - .getApMacAddress().toString() : info.getBSSID(); + String wifiLinkBssid = ""; + if (mloLinks.size() > 0) { + MacAddress apMacAddress = + mloLinks.get(link.link_id, new MloLink()) + .getApMacAddress(); + if (apMacAddress != null) { + wifiLinkBssid = apMacAddress.toString(); + } + } else { + wifiLinkBssid = info.getBSSID(); + } if (!linkLayerScanResult.bssid.equals(wifiLinkBssid)) { ScanResultWithSameFreq scanResultWithSameFreq = new ScanResultWithSameFreq(); diff --git a/service/java/com/android/server/wifi/p2p/WifiP2pServiceImpl.java b/service/java/com/android/server/wifi/p2p/WifiP2pServiceImpl.java index 301240f3fd..391be46438 100644 --- a/service/java/com/android/server/wifi/p2p/WifiP2pServiceImpl.java +++ b/service/java/com/android/server/wifi/p2p/WifiP2pServiceImpl.java @@ -5939,6 +5939,7 @@ public class WifiP2pServiceImpl extends IWifiP2pManager.Stub { mSavedPeerConfig.wps.pin); } } + smTransition(this, mGroupCreatedState); break; case PEER_CONNECTION_USER_REJECT: if (mVerboseLoggingEnabled) logd("User rejected incoming request"); diff --git a/service/tests/wifitests/src/com/android/server/wifi/ActiveModeWardenTest.java b/service/tests/wifitests/src/com/android/server/wifi/ActiveModeWardenTest.java index 780fdbed07..18f09b8a46 100644 --- a/service/tests/wifitests/src/com/android/server/wifi/ActiveModeWardenTest.java +++ b/service/tests/wifitests/src/com/android/server/wifi/ActiveModeWardenTest.java @@ -1688,7 +1688,14 @@ public class ActiveModeWardenTest extends WifiBaseTest { anyInt(), eq("android_apm"), eq(false)); } - /** Wi-Fi state is restored properly when SoftAp is enabled during airplane mode. */ + /** + * Test sequence + * - APM on + * - STA stop + * - SoftAp on + * - APM off + * Wifi STA should get turned on at the end. + **/ @Test public void testWifiStateRestoredWhenSoftApEnabledDuringApm() throws Exception { enableWifi(); @@ -1709,6 +1716,7 @@ public class ActiveModeWardenTest extends WifiBaseTest { anyInt(), eq("android_apm"), eq(false)); + mActiveModeWarden.setWifiStateForApiCalls(WIFI_STATE_DISABLED); mClientListener.onStopped(mClientModeManager); mLooper.dispatchAll(); @@ -1738,6 +1746,134 @@ public class ActiveModeWardenTest extends WifiBaseTest { } /** + * Test sequence + * - APM on + * - SoftAp on + * - STA stop + * - APM off + * Wifi STA should get turned on at the end. + **/ + @Test + public void testWifiStateRestoredWhenSoftApEnabledDuringApm2() throws Exception { + enableWifi(); + assertInEnabledState(); + + // enabling airplane mode shuts down wifi + assertWifiShutDown( + () -> { + when(mSettingsStore.isAirplaneModeOn()).thenReturn(true); + mActiveModeWarden.airplaneModeToggled(); + mLooper.dispatchAll(); + }); + verify(mLastCallerInfoManager) + .put( + eq(WifiManager.API_WIFI_ENABLED), + anyInt(), + anyInt(), + anyInt(), + eq("android_apm"), + eq(false)); + + // start SoftAp + mActiveModeWarden.startSoftAp( + new SoftApModeConfiguration( + WifiManager.IFACE_IP_MODE_LOCAL_ONLY, + null, + mSoftApCapability, + TEST_COUNTRYCODE, + null), + TEST_WORKSOURCE); + mLooper.dispatchAll(); + + mActiveModeWarden.setWifiStateForApiCalls(WIFI_STATE_DISABLED); + mClientListener.onStopped(mClientModeManager); + mLooper.dispatchAll(); + + // disabling airplane mode enables wifi + when(mSettingsStore.isAirplaneModeOn()).thenReturn(false); + mActiveModeWarden.airplaneModeToggled(); + mLooper.dispatchAll(); + verify(mLastCallerInfoManager) + .put( + eq(WifiManager.API_WIFI_ENABLED), + anyInt(), + anyInt(), + anyInt(), + eq("android_apm"), + eq(true)); + } + + /** + * Test sequence + * - APM on + * - SoftAp on + * - APM off + * - STA stop + * Wifi STA should get turned on at the end. + **/ + @Test + public void testWifiStateRestoredWhenSoftApEnabledDuringApm3() throws Exception { + enableWifi(); + assertInEnabledState(); + + // enabling airplane mode shuts down wifi + assertWifiShutDown( + () -> { + when(mSettingsStore.isAirplaneModeOn()).thenReturn(true); + mActiveModeWarden.airplaneModeToggled(); + mLooper.dispatchAll(); + }); + verify(mLastCallerInfoManager) + .put( + eq(WifiManager.API_WIFI_ENABLED), + anyInt(), + anyInt(), + anyInt(), + eq("android_apm"), + eq(false)); + assertEquals(WIFI_STATE_DISABLING, mActiveModeWarden.getWifiState()); + + // start SoftAp + mActiveModeWarden.startSoftAp( + new SoftApModeConfiguration( + WifiManager.IFACE_IP_MODE_LOCAL_ONLY, + null, + mSoftApCapability, + TEST_COUNTRYCODE, + null), + TEST_WORKSOURCE); + mLooper.dispatchAll(); + + // disabling airplane mode does not enables wifi yet, since wifi haven't stopped properly + when(mSettingsStore.isAirplaneModeOn()).thenReturn(false); + mActiveModeWarden.airplaneModeToggled(); + mLooper.dispatchAll(); + verify(mLastCallerInfoManager, never()) + .put( + eq(WifiManager.API_WIFI_ENABLED), + anyInt(), + anyInt(), + anyInt(), + eq("android_apm"), + eq(true)); + assertInEnabledState(); + + // Wifi STA stopped, it should now trigger APM handling to re-enable STA + mActiveModeWarden.setWifiStateForApiCalls(WIFI_STATE_DISABLED); + mClientListener.onStopped(mClientModeManager); + mLooper.dispatchAll(); + + verify(mLastCallerInfoManager) + .put( + eq(WifiManager.API_WIFI_ENABLED), + anyInt(), + anyInt(), + anyInt(), + eq("android_apm"), + eq(true)); + } + + /** * Disabling location mode when in scan mode will disable wifi */ @Test diff --git a/service/tests/wifitests/src/com/android/server/wifi/ClientModeImplTest.java b/service/tests/wifitests/src/com/android/server/wifi/ClientModeImplTest.java index 915c9a49b0..9bb62b5c89 100644 --- a/service/tests/wifitests/src/com/android/server/wifi/ClientModeImplTest.java +++ b/service/tests/wifitests/src/com/android/server/wifi/ClientModeImplTest.java @@ -1577,6 +1577,7 @@ public class ClientModeImplTest extends WifiBaseTest { mCmi.sendMessage(WifiMonitor.NETWORK_CONNECTION_EVENT, new NetworkConnectionEventInfo(0, wifiSsid, TEST_BSSID_STR, false, null)); mLooper.dispatchAll(); + verify(mEapFailureNotifier).dismissEapFailureNotification(mConnectedNetwork.SSID); assertEquals("L3ProvisioningState", getCurrentState().getName()); } diff --git a/service/tests/wifitests/src/com/android/server/wifi/EapFailureNotifierTest.java b/service/tests/wifitests/src/com/android/server/wifi/EapFailureNotifierTest.java index e257c2d1bb..cb0706e4b0 100644 --- a/service/tests/wifitests/src/com/android/server/wifi/EapFailureNotifierTest.java +++ b/service/tests/wifitests/src/com/android/server/wifi/EapFailureNotifierTest.java @@ -20,6 +20,7 @@ import static com.android.server.wifi.EapFailureNotifier.CONFIG_EAP_FAILURE_DISA import static com.android.server.wifi.EapFailureNotifier.CONFIG_EAP_FAILURE_DISABLE_THRESHOLD; import static com.android.server.wifi.EapFailureNotifier.ERROR_MESSAGE_OVERLAY_PREFIX; import static com.android.server.wifi.EapFailureNotifier.ERROR_MESSAGE_OVERLAY_UNKNOWN_ERROR_CODE; +import static com.android.server.wifi.EapFailureNotifier.NOTIFICATION_ID; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; @@ -274,6 +275,10 @@ public class EapFailureNotifierTest extends WifiBaseTest { verify(mFrameworkFacade, never()).makeNotificationBuilder(any(), eq(WifiService.NOTIFICATION_NETWORK_ALERTS)); assertEquals(mExpectedEapFailureConfig, failureConfig); + + // verify cancel notification works + mEapFailureNotifier.dismissEapFailureNotification(SSID_1); + verify(mWifiNotificationManager).cancel(NOTIFICATION_ID); } /** diff --git a/service/tests/wifitests/src/com/android/server/wifi/WifiMetricsTest.java b/service/tests/wifitests/src/com/android/server/wifi/WifiMetricsTest.java index 8cd6ef014e..3d3a2e6924 100644 --- a/service/tests/wifitests/src/com/android/server/wifi/WifiMetricsTest.java +++ b/service/tests/wifitests/src/com/android/server/wifi/WifiMetricsTest.java @@ -77,6 +77,7 @@ import static org.junit.Assert.fail; import static org.mockito.Mockito.any; import static org.mockito.Mockito.anyBoolean; import static org.mockito.Mockito.anyInt; +import static org.mockito.Mockito.anyLong; import static org.mockito.Mockito.anyString; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.doThrow; @@ -572,6 +573,7 @@ public class WifiMetricsTest extends WifiBaseTest { private static final int NUM_RADIO_MODE_CHANGE_TO_DBS = 34; private static final int NUM_SOFTAP_USER_BAND_PREFERENCE_UNSATISFIED = 14; private static final long NUM_WATCHDOG_SUCCESS_DURATION_MS = 65; + private static final long WIFI_CONNECTING_DURATION_MS = 1000; private static final long WIFI_POWER_METRICS_LOGGING_DURATION = 280; private static final long WIFI_POWER_METRICS_SCAN_TIME = 33; private static final boolean LINK_SPEED_COUNTS_LOGGING_SETTING = true; @@ -2533,6 +2535,8 @@ public class WifiMetricsTest extends WifiBaseTest { mWifiMetrics.startConnectionEvent(TEST_IFACE_NAME, createComplexWifiConfig(), "RED", WifiMetricsProto.ConnectionEvent.ROAM_ENTERPRISE, false, WifiStatsLog.WIFI_CONNECTION_RESULT_REPORTED__ROLE__ROLE_CLIENT_PRIMARY, TEST_UID); + mWifiMetrics.reportConnectingDuration(TEST_IFACE_NAME, + WIFI_CONNECTING_DURATION_MS, WIFI_CONNECTING_DURATION_MS + 1); mWifiMetrics.endConnectionEvent(TEST_IFACE_NAME, WifiMetrics.ConnectionEvent.FAILURE_AUTHENTICATION_FAILURE, WifiMetricsProto.ConnectionEvent.HLF_DHCP, @@ -2551,7 +2555,8 @@ public class WifiMetricsTest extends WifiBaseTest { eq(true), eq(false), eq(1), eq(TEST_CONNECTION_FAILURE_STATUS_CODE), anyInt(), anyInt(), anyInt(), - anyInt(), anyInt(), eq(TEST_UID), eq(TEST_CANDIDATE_FREQ))); + anyInt(), anyInt(), eq(TEST_UID), eq(TEST_CANDIDATE_FREQ), + eq(WIFI_CONNECTING_DURATION_MS), eq(WIFI_CONNECTING_DURATION_MS + 1))); } /** @@ -6256,7 +6261,7 @@ public class WifiMetricsTest extends WifiBaseTest { eq(WifiStatsLog.WIFI_CONNECTION_RESULT_REPORTED), anyBoolean(), anyInt(), anyInt(), anyInt(), anyInt(), anyInt(), anyInt(), anyBoolean(), anyInt(), anyBoolean(), anyBoolean(), anyInt(), anyInt(), anyInt(), anyInt(), anyInt(), anyInt(), anyInt(), - eq(TEST_UID), anyInt()), + eq(TEST_UID), anyInt(), anyLong(), anyLong()), times(0)); } @@ -6272,22 +6277,26 @@ public class WifiMetricsTest extends WifiBaseTest { eq(WifiStatsLog.WIFI_CONNECTION_RESULT_REPORTED), anyBoolean(), anyInt(), anyInt(), anyInt(), anyInt(), anyInt(), anyInt(), anyBoolean(), anyInt(), anyBoolean(), anyBoolean(), anyInt(), anyInt(), anyInt(), anyInt(), anyInt(), anyInt(), anyInt(), - eq(TEST_UID), eq(TEST_CANDIDATE_FREQ)), + eq(TEST_UID), eq(TEST_CANDIDATE_FREQ), anyLong(), anyLong()), times(0)); } @Test public void testWifiConnectionResultAtomEmittedOnlyOnceWithMultipleConnectionEndEvents() { + long connectingDuration = WIFI_CONNECTING_DURATION_MS; mWifiMetrics.startConnectionEvent(TEST_IFACE_NAME, createComplexWifiConfig(), "RED", WifiMetricsProto.ConnectionEvent.ROAM_ENTERPRISE, false, WifiStatsLog.WIFI_CONNECTION_RESULT_REPORTED__ROLE__ROLE_CLIENT_PRIMARY, TEST_UID); for (int i = 0; i < 5; i++) { + mWifiMetrics.reportConnectingDuration(TEST_IFACE_NAME, + connectingDuration, connectingDuration); mWifiMetrics.endConnectionEvent(TEST_IFACE_NAME, WifiMetrics.ConnectionEvent.FAILURE_AUTHENTICATION_FAILURE, WifiMetricsProto.ConnectionEvent.HLF_DHCP, WifiMetricsProto.ConnectionEvent.FAILURE_REASON_UNKNOWN, TEST_CANDIDATE_FREQ, TEST_CONNECTION_FAILURE_STATUS_CODE); + connectingDuration++; } ExtendedMockito.verify(() -> WifiStatsLog.write( @@ -6300,7 +6309,8 @@ public class WifiMetricsTest extends WifiBaseTest { eq(true), eq(0), eq(true), eq(false), eq(1), eq(TEST_CONNECTION_FAILURE_STATUS_CODE), anyInt(), anyInt(), anyInt(), anyInt(), anyInt(), eq(TEST_UID), - eq(TEST_CANDIDATE_FREQ)), + eq(TEST_CANDIDATE_FREQ), + eq(WIFI_CONNECTING_DURATION_MS), eq(WIFI_CONNECTING_DURATION_MS)), times(1)); } @@ -6337,7 +6347,7 @@ public class WifiMetricsTest extends WifiBaseTest { eq(true), eq(0), eq(true), eq(true), eq(1), eq(TEST_CONNECTION_FAILURE_STATUS_CODE), anyInt(), anyInt(), anyInt(), anyInt(), anyInt(), eq(TEST_UID), - eq(TEST_CANDIDATE_FREQ)), + eq(TEST_CANDIDATE_FREQ), anyLong(), anyLong()), times(1)); } @@ -6361,7 +6371,7 @@ public class WifiMetricsTest extends WifiBaseTest { eq(WifiStatsLog.WIFI_CONNECTION_RESULT_REPORTED__TRIGGER__AUTOCONNECT_BOOT), anyBoolean(), anyInt(), anyBoolean(), anyBoolean(), anyInt(), eq(TEST_CONNECTION_FAILURE_STATUS_CODE), anyInt(), anyInt(), anyInt(), anyInt(), - anyInt(), eq(TEST_UID), eq(TEST_CANDIDATE_FREQ))); + anyInt(), eq(TEST_UID), eq(TEST_CANDIDATE_FREQ), anyLong(), anyLong())); mWifiMetrics.startConnectionEvent(TEST_IFACE_NAME, createComplexWifiConfig(), "RED", WifiMetricsProto.ConnectionEvent.ROAM_ENTERPRISE, false, @@ -6381,7 +6391,7 @@ public class WifiMetricsTest extends WifiBaseTest { eq(WifiStatsLog.WIFI_CONNECTION_RESULT_REPORTED__TRIGGER__RECONNECT_SAME_NETWORK), anyBoolean(), anyInt(), anyBoolean(), anyBoolean(), anyInt(), eq(TEST_CONNECTION_FAILURE_STATUS_CODE), anyInt(), anyInt(), anyInt(), anyInt(), - anyInt(), eq(TEST_UID), eq(TEST_CANDIDATE_FREQ))); + anyInt(), eq(TEST_UID), eq(TEST_CANDIDATE_FREQ), anyLong(), anyLong())); WifiConfiguration configOtherNetwork = createComplexWifiConfig(); configOtherNetwork.networkId = 21; @@ -6407,7 +6417,7 @@ public class WifiMetricsTest extends WifiBaseTest { eq(WifiStatsLog.WIFI_CONNECTION_RESULT_REPORTED__TRIGGER__AUTOCONNECT_CONFIGURED_NETWORK), anyBoolean(), anyInt(), anyBoolean(), anyBoolean(), anyInt(), eq(TEST_CONNECTION_FAILURE_STATUS_CODE), anyInt(), anyInt(), anyInt(), anyInt(), - anyInt(), eq(TEST_UID), eq(TEST_CANDIDATE_FREQ))); + anyInt(), eq(TEST_UID), eq(TEST_CANDIDATE_FREQ), anyLong(), anyLong())); WifiConfiguration config = createComplexWifiConfig(); config.networkId = 42; @@ -6430,7 +6440,7 @@ public class WifiMetricsTest extends WifiBaseTest { eq(WifiStatsLog.WIFI_CONNECTION_RESULT_REPORTED__TRIGGER__MANUAL), anyBoolean(), anyInt(), anyBoolean(), anyBoolean(), anyInt(), eq(TEST_CONNECTION_FAILURE_STATUS_CODE), anyInt(), anyInt(), anyInt(), anyInt(), - anyInt(), eq(TEST_UID), eq(TEST_CANDIDATE_FREQ))); + anyInt(), eq(TEST_UID), eq(TEST_CANDIDATE_FREQ), anyLong(), anyLong())); } @Test @@ -6591,7 +6601,7 @@ public class WifiMetricsTest extends WifiBaseTest { eq(WifiStatsLog.WIFI_CONNECTION_RESULT_REPORTED__TRIGGER__AUTOCONNECT_BOOT), anyBoolean(), eq(10), anyBoolean(), anyBoolean(), anyInt(), eq(TEST_CONNECTION_FAILURE_STATUS_CODE), anyInt(), anyInt(), anyInt(), anyInt(), - anyInt(), eq(TEST_UID), eq(TEST_CANDIDATE_FREQ))); + anyInt(), eq(TEST_UID), eq(TEST_CANDIDATE_FREQ), anyLong(), anyLong())); mWifiMetrics.reportNetworkDisconnect(TEST_IFACE_NAME, 0, 0, 0, 0); @@ -6613,7 +6623,7 @@ public class WifiMetricsTest extends WifiBaseTest { eq(WifiStatsLog.WIFI_CONNECTION_RESULT_REPORTED__TRIGGER__RECONNECT_SAME_NETWORK), anyBoolean(), eq(20), anyBoolean(), anyBoolean(), anyInt(), eq(TEST_CONNECTION_FAILURE_STATUS_CODE), anyInt(), anyInt(), anyInt(), anyInt(), - anyInt(), eq(TEST_UID), eq(TEST_CANDIDATE_FREQ))); + anyInt(), eq(TEST_UID), eq(TEST_CANDIDATE_FREQ), anyLong(), anyLong())); mWifiMetrics.reportNetworkDisconnect(TEST_IFACE_NAME, 0, 0, 0, 0); } diff --git a/tests/hostsidetests/multidevices/com.google.snippet.wifi/aware/WifiAwareManagerSnippet.java b/tests/hostsidetests/multidevices/com.google.snippet.wifi/aware/WifiAwareManagerSnippet.java index 146958c2c6..f7d867399f 100644 --- a/tests/hostsidetests/multidevices/com.google.snippet.wifi/aware/WifiAwareManagerSnippet.java +++ b/tests/hostsidetests/multidevices/com.google.snippet.wifi/aware/WifiAwareManagerSnippet.java @@ -886,6 +886,16 @@ public class WifiAwareManagerSnippet implements Snippet { if (result.getStatus() == RangingResult.STATUS_SUCCESS) { resultBundles[i].putInt("distanceMm", result.getDistanceMm()); resultBundles[i].putInt("rssi", result.getRssi()); + resultBundles[i].putInt("distanceStdDevMm", result.getDistanceStdDevMm()); + resultBundles[i].putInt( + "numAttemptedMeasurements", + result.getNumAttemptedMeasurements()); + resultBundles[i].putInt( + "numSuccessfulMeasurements", + result.getNumSuccessfulMeasurements()); + resultBundles[i].putByteArray("lci", result.getLci()); + resultBundles[i].putByteArray("lcr", result.getLcr()); + resultBundles[i].putLong("timestamp", result.getRangingTimestampMillis()); } PeerHandle peer = result.getPeerHandle(); if (peer != null) { diff --git a/tests/hostsidetests/multidevices/test/aware/integration/Android.bp b/tests/hostsidetests/multidevices/test/aware/integration/Android.bp index fa76467f0c..95aba290a4 100644 --- a/tests/hostsidetests/multidevices/test/aware/integration/Android.bp +++ b/tests/hostsidetests/multidevices/test/aware/integration/Android.bp @@ -21,11 +21,15 @@ python_test_host { name: "WifiAwareAttachTestCases", main: "wifi_aware_attached_test.py", srcs: ["wifi_aware_attached_test.py"], - device_common_data: [":wifi_aware_snippet_new"], + device_common_data: [ + ":wifi_aware_snippet_new", + ":wifi_mobly_snippet", + ], libs: [ "aware_lib_utils", "mobly", "wifi_aware_constants", + "platform-test-py-annotations", ], test_suites: [ "general-tests", @@ -59,11 +63,15 @@ python_test_host { name: "WifiAwareDiscoveryCases", main: "wifi_aware_discovery_test.py", srcs: ["wifi_aware_discovery_test.py"], - device_common_data: [":wifi_aware_snippet_new"], + device_common_data: [ + ":wifi_aware_snippet_new", + ":wifi_mobly_snippet", + ], libs: [ "aware_lib_utils", "mobly", "wifi_aware_constants", + "platform-test-py-annotations", ], test_suites: [ "general-tests", @@ -83,6 +91,7 @@ python_test_host { "aware_lib_utils", "mobly", "wifi_aware_constants", + "platform-test-py-annotations", ], test_suites: [ "general-tests", @@ -97,11 +106,15 @@ python_test_host { name: "WifiAwareMessageCases", main: "wifi_aware_message_test.py", srcs: ["wifi_aware_message_test.py"], - device_common_data: [":wifi_aware_snippet_new"], + device_common_data: [ + ":wifi_aware_snippet_new", + ":wifi_mobly_snippet", + ], libs: [ "aware_lib_utils", "mobly", "wifi_aware_constants", + "platform-test-py-annotations", ], test_suites: [ "general-tests", @@ -135,11 +148,15 @@ python_test_host { name: "WifiAwareMatchFilterCases", main: "wifi_aware_matchfilter_test.py", srcs: ["wifi_aware_matchfilter_test.py"], - device_common_data: [":wifi_aware_snippet_new"], + device_common_data: [ + ":wifi_aware_snippet_new", + ":wifi_mobly_snippet", + ], libs: [ "aware_lib_utils", "mobly", "wifi_aware_constants", + "platform-test-py-annotations", ], test_suites: [ "general-tests", @@ -178,6 +195,7 @@ python_test_host { "aware_lib_utils", "mobly", "wifi_aware_constants", + "platform-test-py-annotations", ], test_suites: [ "general-tests", @@ -206,3 +224,35 @@ python_test_host { tags: ["mobly"], }, } + +python_test_host { + name: "WifiAwareIntegrationTestSuite", + main: "wifi_aware_integration_test_suite.py", + srcs: [ + "wifi_aware_integration_test_suite.py", + "wifi_aware_attached_test.py", + "wifi_aware_capabilities_test.py", + "wifi_aware_datapath_test.py", + "wifi_aware_discovery_test.py", + "wifi_aware_discovery_with_ranging_test.py", + "wifi_aware_mac_random_test.py", + "wifi_aware_matchfilter_test.py", + "wifi_aware_message_test.py", + "wifi_aware_protocols_multi_country_test.py", + "wifi_aware_protocols_test.py", + ], + device_common_data: [":wifi_aware_snippet_new"], + libs: [ + "aware_lib_utils", + "mobly", + "wifi_aware_constants", + "platform-test-py-annotations", + ], + test_suites: [ + "general-tests", + ], + test_options: { + unit_test: false, + tags: ["mobly"], + }, +} diff --git a/tests/hostsidetests/multidevices/test/aware/integration/wifi_aware_attached_test.py b/tests/hostsidetests/multidevices/test/aware/integration/wifi_aware_attached_test.py index 908b9c1f57..5e8414c469 100644 --- a/tests/hostsidetests/multidevices/test/aware/integration/wifi_aware_attached_test.py +++ b/tests/hostsidetests/multidevices/test/aware/integration/wifi_aware_attached_test.py @@ -16,6 +16,7 @@ """ACTS Wi-Fi Aware Attached test reimplemented in Mobly.""" import sys +from android.platform.test.annotations import ApiTest from aware import aware_lib_utils as autils from aware import constants from mobly import asserts @@ -32,7 +33,10 @@ RUNTIME_PERMISSIONS = ( 'android.permission.NEARBY_WIFI_DEVICES', ) PACKAGE_NAME = constants.WIFI_AWARE_SNIPPET_PACKAGE_NAME - +snippets_to_load = [ + ('wifi_aware_snippet', PACKAGE_NAME), + ('wifi', constants.WIFI_SNIPPET_PACKAGE_NAME), +] class WifiAwareAttachTest(base_test.BaseTestClass): """Wi-Fi Aware Attach test class.""" @@ -44,9 +48,10 @@ class WifiAwareAttachTest(base_test.BaseTestClass): self.ads = self.register_controller(android_device, min_number=1) def setup_device(device: android_device.AndroidDevice): - device.load_snippet('wifi_aware_snippet', PACKAGE_NAME) + for snippet_name, package_name in snippets_to_load: + device.load_snippet(snippet_name, package_name) for permission in RUNTIME_PERMISSIONS: - device.adb.shell(['pm', 'grant', PACKAGE_NAME, permission]) + device.adb.shell(['pm', 'grant', package_name, permission]) asserts.abort_all_if( not device.wifi_aware_snippet.wifiAwareIsAvailable(), f'{device} Wi-Fi Aware is not available.', @@ -62,7 +67,7 @@ class WifiAwareAttachTest(base_test.BaseTestClass): def setup_test(self): for ad in self.ads: - autils.control_wifi(ad, True) + ad.wifi.wifiEnable() aware_avail = ad.wifi_aware_snippet.wifiAwareIsAvailable() if not aware_avail: ad.log.info('Aware not available. Waiting ...') @@ -85,14 +90,21 @@ class WifiAwareAttachTest(base_test.BaseTestClass): def _teardown_test_on_device(self, ad: android_device.AndroidDevice) -> None: ad.wifi_aware_snippet.wifiAwareCloseAllWifiAwareSession() ad.wifi_aware_snippet.wifiAwareMonitorStopStateChange() - autils.set_airplane_mode(ad, False) - autils.control_wifi(ad, True) + ad.wifi.wifiEnable() + if ad.is_adb_root: + autils.set_airplane_mode(ad, False) def on_fail(self, record: records.TestResult) -> None: android_device.take_bug_reports( self.ads, destination=self.current_test_info.output_path ) + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + ] + ) + def test_attach(self) -> None: """Basic attaching request. @@ -106,6 +118,12 @@ class WifiAwareAttachTest(base_test.BaseTestClass): handler, constants.AttachCallBackMethodType.ID_CHANGED ) + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + ] + ) + def test_attach_with_identity(self) -> None: """Basic attaching request with extra callback. @@ -117,6 +135,12 @@ class WifiAwareAttachTest(base_test.BaseTestClass): handler.waitAndGet(constants.AttachCallBackMethodType.ATTACHED) handler.waitAndGet(constants.AttachCallBackMethodType.ID_CHANGED) + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + ] + ) + def test_attach_multiple_sessions(self): """Multiple attaching request. @@ -138,6 +162,12 @@ class WifiAwareAttachTest(base_test.BaseTestClass): handler_3, constants.AttachCallBackMethodType.ID_CHANGED, 10, True ) + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + ] + ) + def test_attach_with_no_wifi(self): """WiFi Aware attempt to attach with wifi off. @@ -153,6 +183,12 @@ class WifiAwareAttachTest(base_test.BaseTestClass): attach_callback.waitAndGet(constants.AttachCallBackMethodType.ATTACH_FAILED) dut.wifi_aware_snippet.wifiAwareMonitorStopStateChange() + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + ] + ) + def test_attach_with_location_off(self): """Function/Attach test cases/attempt to attach with location mode off. @@ -176,6 +212,12 @@ class WifiAwareAttachTest(base_test.BaseTestClass): state_handler.waitAndGet(constants.WifiAwareBroadcast.WIFI_AWARE_AVAILABLE) dut.wifi_aware_snippet.wifiAwareMonitorStopStateChange() + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + ] + ) + def test_attach_apm_toggle_attach_again(self): """Function/Attach test cases/attempt to attach with airplane mode on. diff --git a/tests/hostsidetests/multidevices/test/aware/integration/wifi_aware_datapath_test.py b/tests/hostsidetests/multidevices/test/aware/integration/wifi_aware_datapath_test.py index a64aedd766..21d26aa68c 100644 --- a/tests/hostsidetests/multidevices/test/aware/integration/wifi_aware_datapath_test.py +++ b/tests/hostsidetests/multidevices/test/aware/integration/wifi_aware_datapath_test.py @@ -18,8 +18,9 @@ import base64 import logging import sys import time +import re - +from android.platform.test.annotations import ApiTest from aware import aware_lib_utils as autils from aware import constants from mobly import asserts @@ -29,6 +30,7 @@ from mobly import test_runner from mobly import utils from mobly.controllers import android_device from mobly.controllers.android_device_lib import callback_handler_v2 +from mobly.snippet import callback_event RUNTIME_PERMISSIONS = ( 'android.permission.ACCESS_FINE_LOCATION', @@ -924,6 +926,43 @@ class WifiAwareDatapathTest(base_test.BaseTestClass): init_dut.wifi_aware_snippet.connectivityUnregisterNetwork(init_callback_event.callback_id) resp_dut.wifi_aware_snippet.connectivityUnregisterNetwork(resp_callback_event.callback_id) + def wait_for_request_responses(self, dut, req_keys, aware_ifs, aware_ipv6): + """Wait for network request confirmation for all request keys. + + Args: + dut: Device under test + req_keys: (in) A list of the network requests + aware_ifs: (out) A list into which to append the network interface + aware_ipv6: (out) A list into which to append the network ipv6 + address + """ + network_callback_event = req_keys.waitAndGet( + event_name=constants.NetworkCbEventName.NETWORK_CALLBACK, + timeout=_DEFAULT_TIMEOUT, + ) + # network_callback_event=req_keys[0] + if network_callback_event.data[_CALLBACK_NAME] == _NETWORK_CB_LINK_PROPERTIES_CHANGED: + if network_callback_event.callback_id: + aware_ifs.append(network_callback_event.data["interfaceName"]) + else: + logging.info( + "Received an unexpected connectivity, the revoked "+ + "network request probably went through -- %s", network_callback_event) + elif network_callback_event.data[_CALLBACK_NAME] == ( + constants.NetworkCbName.ON_CAPABILITIES_CHANGED) : + if network_callback_event.callback_id: + aware_ipv6.append(network_callback_event.data[ + constants.NetworkCbName.NET_CAP_IPV6]) + else: + logging.info( + "Received an unexpected connectivity, the revoked "+ + "network request probably went through -- %s", + network_callback_event) + asserts.assert_false( + _NETWORK_CB_KEY_NETWORK_SPECIFIER in + network_callback_event.data, + "Network specifier leak!") + def get_ipv6_addr(self, device, interface): """Get the IPv6 address of the specified interface. Uses ifconfig and parses its output. Returns a None if the interface does not have an IPv6 address @@ -1080,6 +1119,529 @@ class WifiAwareDatapathTest(base_test.BaseTestClass): net_work_request_id, network_request_dict, _REQUEST_NETWORK_TIMEOUT_MS ) + def run_mix_ib_oob(self, same_request, ib_first, inits_on_same_dut): + """Validate that multiple network requests issued using both in-band + and out-of-band discovery behave as expected. + + The same_request parameter controls whether identical single NDP is + expected, if True, or whether multiple NDPs on different NDIs are + expected, if False. + + Args: + same_request: Issue canonically identical requests (same NMI peer, + same passphrase) if True, if False use different passphrases. + ib_first: If True then the in-band network is requested first, + otherwise (if False) then the out-of-band network is requested first. + inits_on_same_dut: If True then the Initiators are run on the same + device, otherwise (if False) then the Initiators are run on + different devices. Note that Subscribe == Initiator. + """ + p_dut = self.ads[0] + s_dut = self.ads[1] + if not same_request: + asserts.skip_if( + autils.get_aware_capabilities(p_dut)[ + _CAP_MAX_NDI_INTERFACES] < 2 or + autils.get_aware_capabilities(s_dut)[ + _CAP_MAX_NDI_INTERFACES] < 2, + "DUTs do not support enough NDIs") + + (p_dut, s_dut, p_id, s_id, p_disc_id, s_disc_id, peer_id_on_sub, + peer_id_on_pub) = self.set_up_discovery(_PUBLISH_TYPE_UNSOLICITED, + _SUBSCRIBE_TYPE_PASSIVE, True) + p_id2, p_mac = self.attach_with_identity(p_dut) + s_id2, s_mac = self.attach_with_identity(s_dut) + time.sleep(self.WAIT_FOR_CLUSTER) + + if inits_on_same_dut: + resp_dut = p_dut + resp_id = p_id2 + resp_mac = p_mac + init_dut = s_dut + init_id = s_id2 + init_mac = s_mac + + else: + resp_dut = s_dut + resp_id = s_id2 + resp_mac = s_mac + init_dut = p_dut + init_id = p_id2 + init_mac = p_mac + + passphrase = None if same_request else self.PASSPHRASE + pub_accept_handler = ( + p_dut.wifi_aware_snippet.connectivityServerSocketAccept()) + network_id = pub_accept_handler.callback_id + self.publish_session = p_disc_id.callback_id + self.subscribe_session = s_disc_id.callback_id + + if ib_first: + # request in-band network (to completion) + p_req_key = self._request_network( + ad=p_dut, + discovery_session=self.publish_session, + peer=peer_id_on_pub, + net_work_request_id=network_id + ) + s_req_key = self._request_network( + ad=s_dut, + discovery_session=self.subscribe_session, + peer=peer_id_on_sub, + net_work_request_id=network_id + ) + p_net_event_nc = autils.wait_for_network( + ad=p_dut, + request_network_cb_handler=p_req_key, + expected_channel=None, + ) + s_net_event_nc = autils.wait_for_network( + ad=s_dut, + request_network_cb_handler=s_req_key, + expected_channel=None, + ) + p_net_event_lp = autils.wait_for_link( + ad=p_dut, + request_network_cb_handler=p_req_key, + ) + s_net_event_lp = autils.wait_for_link( + ad=s_dut, + request_network_cb_handler=s_req_key, + ) + # validate no leak of information + asserts.assert_false( + _NETWORK_CB_KEY_NETWORK_SPECIFIER in p_net_event_nc.data, + "Network specifier leak!") + asserts.assert_false( + _NETWORK_CB_KEY_NETWORK_SPECIFIER in s_net_event_nc.data, + "Network specifier leak!") + + # request out-of-band network + init_dut_accept_handler = ( + init_dut.wifi_aware_snippet.connectivityServerSocketAccept()) + network_id = init_dut_accept_handler.callback_id + resp_req_key = self.request_oob_network( + resp_dut, + resp_id, + _DATA_PATH_RESPONDER, + init_mac, + passphrase, + None, + network_id + ) + init_req_key = self.request_oob_network( + init_dut, + init_id, + _DATA_PATH_INITIATOR, + resp_mac, + passphrase, + None, + network_id + ) + time.sleep(5) + # Publisher & Subscriber: wait for network formation + resp_net_event_nc = autils.wait_for_network( + ad=resp_dut, + request_network_cb_handler=resp_req_key, + expected_channel=None, + ) + init_net_event_nc = autils.wait_for_network( + ad=init_dut, + request_network_cb_handler=init_req_key, + expected_channel=None, + ) + resp_net_event_lp = autils.wait_for_link( + ad=resp_dut, + request_network_cb_handler=resp_req_key, + ) + init_net_event_lp = autils.wait_for_link( + ad=init_dut, + request_network_cb_handler=init_req_key, + ) + # validate no leak of information + asserts.assert_false( + _NETWORK_CB_KEY_NETWORK_SPECIFIER in resp_net_event_nc.data, + "Network specifier leak!") + asserts.assert_false( + _NETWORK_CB_KEY_NETWORK_SPECIFIER in init_net_event_nc.data, + "Network specifier leak!") + + if not ib_first: + # request in-band network (to completion) + p_req_key = self._request_network( + ad=p_dut, + discovery_session=self.publish_session, + peer=peer_id_on_pub, + net_work_request_id=network_id + ) + s_req_key = self._request_network( + ad=s_dut, + discovery_session=self.subscribe_session, + peer=peer_id_on_sub, + net_work_request_id=network_id + ) + # Publisher & Subscriber: wait for network formation + p_net_event_nc = autils.wait_for_network( + ad=p_dut, + request_network_cb_handler=p_req_key, + expected_channel=None, + ) + s_net_event_nc = autils.wait_for_network( + ad=s_dut, + request_network_cb_handler=s_req_key, + expected_channel=None, + ) + p_net_event_lp = autils.wait_for_link( + ad=p_dut, + request_network_cb_handler=p_req_key, + ) + s_net_event_lp = autils.wait_for_link( + ad=s_dut, + request_network_cb_handler=s_req_key, + ) + # validate no leak of information + asserts.assert_false( + _NETWORK_CB_KEY_NETWORK_SPECIFIER in p_net_event_nc.data, + "Network specifier leak!") + asserts.assert_false( + _NETWORK_CB_KEY_NETWORK_SPECIFIER in s_net_event_nc.data, + "Network specifier leak!") + + # note that Init <-> Resp & Pub <--> Sub since IPv6 are of peer's! + init_ipv6 = resp_net_event_nc.data[constants.NetworkCbName.NET_CAP_IPV6] + resp_ipv6 = init_net_event_nc.data[constants.NetworkCbName.NET_CAP_IPV6] + pub_ipv6 = s_net_event_nc.data[constants.NetworkCbName.NET_CAP_IPV6] + sub_ipv6 = p_net_event_nc.data[constants.NetworkCbName.NET_CAP_IPV6] + + # extract net info + pub_interface = p_net_event_lp.data[ + _NETWORK_CB_KEY_INTERFACE_NAME] + sub_interface = s_net_event_lp.data[ + _NETWORK_CB_KEY_INTERFACE_NAME] + resp_interface = resp_net_event_lp.data[ + _NETWORK_CB_KEY_INTERFACE_NAME] + init_interface = init_net_event_lp.data[ + _NETWORK_CB_KEY_INTERFACE_NAME] + logging.info( + "Interface names: Pub=%s, Sub=%s, Resp=%s, Init=%s", + pub_interface, sub_interface, resp_interface, + init_interface + ) + logging.info( + "Interface addresses (IPv6): Pub=%s, Sub=%s, Resp=%s, Init=%s", + pub_ipv6, sub_ipv6, resp_ipv6, init_ipv6) + + # validate NDP/NDI conditions (using interface names & ipv6) + if same_request: + asserts.assert_equal( + pub_interface, resp_interface if inits_on_same_dut else + init_interface, "NDP interfaces don't match on Pub/other") + asserts.assert_equal( + sub_interface, init_interface if inits_on_same_dut else + resp_interface, "NDP interfaces don't match on Sub/other") + + asserts.assert_equal( + pub_ipv6, resp_ipv6 if inits_on_same_dut else init_ipv6, + "NDP IPv6 don't match on Pub/other") + asserts.assert_equal( + sub_ipv6, init_ipv6 if inits_on_same_dut else resp_ipv6, + "NDP IPv6 don't match on Sub/other") + else: + asserts.assert_false( + pub_interface == ( + resp_interface if inits_on_same_dut else init_interface), + "NDP interfaces match on Pub/other") + asserts.assert_false( + sub_interface == ( + init_interface if inits_on_same_dut else resp_interface), + "NDP interfaces match on Sub/other") + + asserts.assert_false( + pub_ipv6 == (resp_ipv6 if inits_on_same_dut else init_ipv6), + "NDP IPv6 match on Pub/other") + asserts.assert_false( + sub_ipv6 == (init_ipv6 if inits_on_same_dut else resp_ipv6), + "NDP IPv6 match on Sub/other") + + # release requests + init_dut.wifi_aware_snippet.connectivityUnregisterNetwork( + init_net_event_nc.callback_id) + resp_dut.wifi_aware_snippet.connectivityUnregisterNetwork( + resp_net_event_nc.callback_id) + p_dut.wifi_aware_snippet.connectivityUnregisterNetwork( + p_net_event_nc.callback_id) + s_dut.wifi_aware_snippet.connectivityUnregisterNetwork( + s_net_event_nc.callback_id) + + def create_oob_ndp_on_sessions(self, + init_dut, + resp_dut, + init_id, + init_mac, + resp_id, + resp_mac): + """Create an NDP on top of existing Aware sessions (using OOB discovery) + + Args: + init_dut: Initiator device + resp_dut: Responder device + init_id: Initiator attach session id + init_mac: Initiator discovery MAC address + resp_id: Responder attach session id + resp_mac: Responder discovery MAC address + Returns: + init_req_key: Initiator network request + resp_req_key: Responder network request + init_aware_if: Initiator Aware data interface + resp_aware_if: Responder Aware data interface + init_ipv6: Initiator IPv6 address + resp_ipv6: Responder IPv6 address + """ + # Responder: request network + init_dut_accept_handler = init_dut.wifi_aware_snippet.connectivityServerSocketAccept() + network_id = init_dut_accept_handler.callback_id + init_local_port = init_dut_accept_handler.ret_value + resp_req_key = self.request_oob_network( + resp_dut, + resp_id, + _DATA_PATH_RESPONDER, + init_mac, + None, + None, + network_id + ) + # Initiator: request network + init_req_key = self.request_oob_network( + init_dut, + init_id, + _DATA_PATH_INITIATOR, + resp_mac, + None, + None, + network_id + ) + time.sleep(5) + init_callback_event = init_req_key.waitAndGet( + event_name=constants.NetworkCbEventName.NETWORK_CALLBACK, + timeout=_DEFAULT_TIMEOUT, + ) + init_name = init_callback_event.data[_CALLBACK_NAME] + resp_callback_event = resp_req_key.waitAndGet( + event_name=constants.NetworkCbEventName.NETWORK_CALLBACK, + timeout=_DEFAULT_TIMEOUT, + ) + resp_name = resp_callback_event.data[_CALLBACK_NAME] + asserts.assert_equal( + init_name, constants.NetworkCbName.ON_CAPABILITIES_CHANGED, + f'{init_dut} succeeded to request the network, got callback' + f' {init_name}.' + ) + asserts.assert_equal( + resp_name, constants.NetworkCbName.ON_CAPABILITIES_CHANGED, + f'{resp_dut} succeeded to request the network, got callback' + f' {resp_name}.' + ) + init_net_event_nc = init_callback_event.data + resp_net_event_nc = resp_callback_event.data + # validate no leak of information + asserts.assert_false( + _NETWORK_CB_KEY_NETWORK_SPECIFIER in init_net_event_nc, + "Network specifier leak!") + asserts.assert_false( + _NETWORK_CB_KEY_NETWORK_SPECIFIER in resp_net_event_nc, + "Network specifier leak!") + + #To get ipv6 ip address + resp_ipv6= init_net_event_nc[constants.NetworkCbName.NET_CAP_IPV6] + init_ipv6 = resp_net_event_nc[constants.NetworkCbName.NET_CAP_IPV6] + # note that Pub <-> Sub since IPv6 are of peer's! + init_callback_LINK = init_req_key.waitAndGet( + event_name=constants.NetworkCbEventName.NETWORK_CALLBACK, + timeout=_DEFAULT_TIMEOUT, + ) + asserts.assert_equal( + init_callback_LINK.data[_CALLBACK_NAME], + _NETWORK_CB_LINK_PROPERTIES_CHANGED, + f'{init_dut} succeeded to request the'+ + ' LinkPropertiesChanged, got callback' + f' {init_callback_LINK.data[_CALLBACK_NAME]}.' + ) + resp_callback_LINK = resp_req_key.waitAndGet( + event_name=constants.NetworkCbEventName.NETWORK_CALLBACK, + timeout=_DEFAULT_TIMEOUT, + ) + asserts.assert_equal( + resp_callback_LINK.data[_CALLBACK_NAME], + _NETWORK_CB_LINK_PROPERTIES_CHANGED, + f'{resp_dut} succeeded to request the'+ + 'LinkPropertiesChanged, got callback' + f' {resp_callback_LINK.data[_CALLBACK_NAME]}.' + ) + init_aware_if = init_callback_LINK.data[ + _NETWORK_CB_KEY_INTERFACE_NAME] + resp_aware_if = resp_callback_LINK.data[ + _NETWORK_CB_KEY_INTERFACE_NAME] + return (init_req_key, resp_req_key, init_aware_if, resp_aware_if, + init_ipv6, resp_ipv6) + + def set_wifi_country_code(self, + ad: android_device.AndroidDevice, + country_code): + """Sets the wifi country code on the device. + + Args: + ad: An AndroidDevice object. + country_code: 2 letter ISO country code + + Raises: + An RpcException if unable to set the country code. + """ + try: + ad.adb.shell("cmd wifi force-country-code enabled %s" % country_code) + except Exception as e: + ad.log.info(f"ADB command execution failed: {e}") + + def create_data_ib_ndp( + self, + p_dut: android_device.AndroidDevice, + s_dut: android_device.AndroidDevice, + p_config: dict[str, any], + s_config: dict[str, any] + ): + """Create an NDP (using in-band discovery). + Args: + p_dut: Device to use as publisher. + s_dut: Device to use as subscriber. + p_config: Publish configuration. + s_config: Subscribe configuration. + + Returns: + A tuple containing the following: + - Publisher network capabilities. + - Subscriber network capabilities. + - Publisher network interface name. + - Subscriber network interface name. + - Publisher IPv6 address. + - Subscriber IPv6 address. + """ + + (p_id, s_id, p_disc_id, s_disc_id, peer_id_on_sub, peer_id_on_pub) = ( + autils.create_discovery_pair( + p_dut, s_dut, p_config, s_config, msg_id=9999 + ) + ) + pub_accept_handler = ( + p_dut.wifi_aware_snippet.connectivityServerSocketAccept() + ) + network_id = pub_accept_handler.callback_id + + # Request network Publisher (responder). + pub_network_cb_handler = self._request_network( + ad=p_dut, + discovery_session=p_disc_id.callback_id, + peer=peer_id_on_pub, + net_work_request_id=network_id, + ) + + # Request network for Subscriber (initiator). + sub_network_cb_handler = self._request_network( + ad=s_dut, + discovery_session=s_disc_id.callback_id, + peer=peer_id_on_sub, + net_work_request_id=network_id, + ) + resp_net_event_nc = sub_network_cb_handler.waitAndGet( + event_name=constants.NetworkCbEventName.NETWORK_CALLBACK, + timeout=_DEFAULT_TIMEOUT, + ) + # time.sleep(5) + init_net_event_nc = pub_network_cb_handler.waitAndGet( + event_name=constants.NetworkCbEventName.NETWORK_CALLBACK, + timeout=_DEFAULT_TIMEOUT, + ) + s_ipv6 = resp_net_event_nc.data[constants.NetworkCbName.NET_CAP_IPV6] + p_ipv6 = init_net_event_nc.data[constants.NetworkCbName.NET_CAP_IPV6] + p_network_callback_LINK = pub_network_cb_handler.waitAndGet( + event_name=constants.NetworkCbEventName.NETWORK_CALLBACK, + timeout=_DEFAULT_TIMEOUT, + ) + s_network_callback_LINK = sub_network_cb_handler.waitAndGet( + event_name=constants.NetworkCbEventName.NETWORK_CALLBACK, + timeout=_DEFAULT_TIMEOUT, + ) + s_aware_if = s_network_callback_LINK.data[ + _NETWORK_CB_KEY_INTERFACE_NAME] + p_aware_if = p_network_callback_LINK.data[ + _NETWORK_CB_KEY_INTERFACE_NAME] + pub_network_cap = autils.wait_for_network( + ad=p_dut, + request_network_cb_handler=pub_network_cb_handler, + expected_channel=None, + ) + sub_network_cap = autils.wait_for_network( + ad=s_dut, + request_network_cb_handler=sub_network_cb_handler, + expected_channel=None, + ) + + p_dut.log.info('interfaceName = %s, ipv6=%s', p_aware_if, p_ipv6) + + s_dut.log.info('interfaceName = %s, ipv6=%s', s_aware_if, s_ipv6) + return ( + pub_network_cap, + sub_network_cap, + p_aware_if, + s_aware_if, + p_ipv6, + s_ipv6, + ) + + def run_multiple_regulatory_domains(self, use_ib, init_domain, + resp_domain): + """Verify that a data-path setup with two conflicting regulatory domains + works (the result should be run in Channel 6 - but that is not tested). + + Args: + use_ib: True to use in-band discovery, False to use out-of-band discovery. + init_domain: The regulatory domain of the Initiator/Subscriber. + resp_domain: The regulator domain of the Responder/Publisher. + """ + init_dut = self.ads[0] + resp_dut = self.ads[1] + asserts.skip_if( + not init_dut.is_adb_root or not resp_dut.is_adb_root, + 'Country code toggle needs Android device(s) with root permission', + ) + self.set_wifi_country_code(init_dut, init_domain) + self.set_wifi_country_code(resp_dut, resp_domain) + if use_ib: + (resp_req_key, init_req_key, resp_aware_if, init_aware_if, + resp_ipv6, init_ipv6) = self.create_data_ib_ndp( + resp_dut, init_dut, + autils.create_discovery_config( + "GoogleTestXyz", _PUBLISH_TYPE_UNSOLICITED), + autils.create_discovery_config( + "GoogleTestXyz", _SUBSCRIBE_TYPE_PASSIVE), + ) + else: + init_id, init_mac = self.attach_with_identity(init_dut) + resp_id, resp_mac = self.attach_with_identity(resp_dut) + time.sleep(self.WAIT_FOR_CLUSTER) + (init_req_key, resp_req_key, init_aware_if, resp_aware_if, init_ipv6, + resp_ipv6) = self.create_oob_ndp_on_sessions(init_dut, resp_dut, init_id, + init_mac, resp_id, resp_mac) + logging.info("Interface names: I=%s, R=%s", init_aware_if, + resp_aware_if) + logging.info("Interface addresses (IPv6): I=%s, R=%s", init_ipv6, + resp_ipv6) + pub_accept_handler = ( + init_dut.wifi_aware_snippet.connectivityServerSocketAccept() + ) + network_id = pub_accept_handler.callback_id + # clean-up + resp_dut.wifi_aware_snippet.connectivityUnregisterNetwork(network_id) + init_dut.wifi_aware_snippet.connectivityUnregisterNetwork(network_id) + ####################################### # Positive In-Band (IB) tests key: # @@ -2070,6 +2632,197 @@ class WifiAwareDatapathTest(base_test.BaseTestClass): """ self.run_multiple_ndi([self.PMK, self.PMK2], flip_init_resp=True) + ####################################### + # The device can create and use multiple NDIs tests key: + # + # names is:test_<same_request>_ndps_mix_ib_oob_ + # <ib_first>_<inits_on_same_dut>_polarity + # same_request: + # Issue canonically identical requests (same NMI peer, same passphrase) + # if True, if False use different passphrases. + # ib_first: + # If True then the in-band network is requested first, otherwise (if False) + # then the out-of-band network is requested first. + # inits_on_same_dut: + # If True then the Initiators are run on the same device, otherwise + # (if False) then the Initiators are run on different devices. + # + ####################################### + + def test_identical_ndps_mix_ib_oob_ib_first_same_polarity(self): + """Validate that a single NDP is created for multiple identical + requests which are issued through either in-band (ib) or out-of-band + (oob) APIs. + + The in-band request is issued first. Both Initiators (Sub == Initiator) + are run on the same device. + """ + self.run_mix_ib_oob( + same_request=True, ib_first=True, inits_on_same_dut=True) + + def test_identical_ndps_mix_ib_oob_oob_first_same_polarity(self): + """Validate that a single NDP is created for multiple identical + requests which are issued through either in-band (ib) or out-of-band + (oob) APIs. + + The out-of-band request is issued first. Both Initiators (Sub == + Initiator) + are run on the same device. + """ + self.run_mix_ib_oob( + same_request=True, ib_first=False, inits_on_same_dut=True) + + def test_identical_ndps_mix_ib_oob_ib_first_diff_polarity(self): + """Validate that a single NDP is created for multiple identical + requests which are issued through either in-band (ib) or out-of-band + (oob) APIs. + + The in-band request is issued first. Initiators (Sub == Initiator) are + run on different devices. + """ + self.run_mix_ib_oob( + same_request=True, ib_first=True, inits_on_same_dut=False) + + def test_identical_ndps_mix_ib_oob_oob_first_diff_polarity(self): + """Validate that a single NDP is created for multiple identical + requests which are issued through either in-band (ib) or out-of-band + (oob) APIs. + + The out-of-band request is issued first. Initiators (Sub == Initiator) + are run on different devices. + """ + self.run_mix_ib_oob( + same_request=True, ib_first=False, inits_on_same_dut=False) + + def test_multiple_ndis_mix_ib_oob_ib_first_same_polarity(self): + + """Validate that multiple NDIs are created for NDPs which are requested + with different security configurations. Use a mix of in-band and + out-of-band APIs to request the different NDPs. + + The in-band request is issued first. Initiators (Sub == Initiator) are + run on the same device. + """ + self.run_mix_ib_oob( + same_request=False, ib_first=True, inits_on_same_dut=True) + + def test_multiple_ndis_mix_ib_oob_oob_first_same_polarity(self): + """Validate that multiple NDIs are created for NDPs which are requested + with different security configurations. Use a mix of in-band and + out-of-band APIs to request the different NDPs. + + The out-of-band request is issued first. Initiators (Sub == Initiator) + are run on the same device. + """ + self.run_mix_ib_oob( + same_request=False, ib_first=False, inits_on_same_dut=True) + + def test_multiple_ndis_mix_ib_oob_ib_first_diff_polarity(self): + """Validate that multiple NDIs are created for NDPs which are requested + with different security configurations. Use a mix of in-band and + out-of-band APIs to request the different NDPs. + + The in-band request is issued first. Initiators (Sub == Initiator) are + run on different devices. + """ + self.run_mix_ib_oob( + same_request=False, ib_first=True, inits_on_same_dut=False) + + + def test_multiple_ndis_mix_ib_oob_oob_first_diff_polarity(self): + """Validate that multiple NDIs are created for NDPs which are requested + with different security configurations. Use a mix of in-band and + out-of-band APIs to request the different NDPs. + + The out-of-band request is issued first. Initiators (Sub == Initiator) + are run on different devices. + """ + self.run_mix_ib_oob( + same_request=False, ib_first=False, inits_on_same_dut=False) + + ####################################### + # The device can setup two conflicting regulatory domains with a data-path test: + # names is:test_multiple_regulator_domains_ib_(regulatorA)_(regulatorB) + # use_ib: True to use in-band discovery, False to use out-of-band discovery. + # init_domain: The regulatory domain of the Initiator/Subscriber. + # resp_domain: The regulator domain of the Responder/Publisher. + # + ####################################### + + def test_multiple_regulator_domains_ib_us_jp(self): + """Verify data-path setup across multiple regulator domains. + + - Uses in-band discovery + - Subscriber=US, Publisher=JP + """ + self.run_multiple_regulatory_domains( + use_ib=True, + init_domain="US", + resp_domain="JP") + + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#subscrible(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareNetworkSpecifier.Builder#build', + 'android.net.wifi.aware.WifiAwareSession#createNetworkSpecifierOpen(byte[])', + ] + ) + + def test_multiple_regulator_domains_ib_jp_us(self): + """Verify data-path setup across multiple regulator domains. + + - Uses in-band discovery + - Subscriber=JP, Publisher=US + """ + self.run_multiple_regulatory_domains( + use_ib=True, + init_domain="JP", + resp_domain="US") + + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#subscrible(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareNetworkSpecifier.Builder#build', + 'android.net.wifi.aware.WifiAwareSession#createNetworkSpecifierOpen(byte[])', + ] + ) + + def test_multiple_regulator_domains_oob_us_jp(self): + """Verify data-path setup across multiple regulator domains. + + - Uses out-f-band discovery + - Initiator=US, Responder=JP + """ + self.run_multiple_regulatory_domains( + use_ib=False, + init_domain="US", + resp_domain="JP") + + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#subscrible(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareNetworkSpecifier.Builder#build', + 'android.net.wifi.aware.WifiAwareSession#createNetworkSpecifierOpen(byte[])', + ] + ) + + def test_multiple_regulator_domains_oob_jp_us(self): + """Verify data-path setup across multiple regulator domains. + + - Uses out-of-band discovery + - Initiator=JP, Responder=US + """ + self.run_multiple_regulatory_domains( + use_ib=False, + init_domain="JP", + resp_domain="US") + if __name__ == '__main__': # Take test args diff --git a/tests/hostsidetests/multidevices/test/aware/integration/wifi_aware_discovery_test.py b/tests/hostsidetests/multidevices/test/aware/integration/wifi_aware_discovery_test.py index ebf36f5965..2f35e00760 100644 --- a/tests/hostsidetests/multidevices/test/aware/integration/wifi_aware_discovery_test.py +++ b/tests/hostsidetests/multidevices/test/aware/integration/wifi_aware_discovery_test.py @@ -22,6 +22,7 @@ import sys import time from typing import Any, Dict, Union +from android.platform.test.annotations import ApiTest from aware import aware_lib_utils as autils from aware import constants from mobly import asserts @@ -38,6 +39,10 @@ RUNTIME_PERMISSIONS = ( 'android.permission.NEARBY_WIFI_DEVICES', ) PACKAGE_NAME = constants.WIFI_AWARE_SNIPPET_PACKAGE_NAME +snippets_to_load = [ + ('wifi_aware_snippet', PACKAGE_NAME), + ('wifi', constants.WIFI_SNIPPET_PACKAGE_NAME), +] _DEFAULT_TIMEOUT = constants.WAIT_WIFI_STATE_TIME_OUT.total_seconds() _MSG_ID_SUB_TO_PUB = random.randint(1000, 5000) _MSG_ID_PUB_TO_SUB = random.randint(5001, 9999) @@ -70,11 +75,10 @@ class WifiAwareDiscoveryTest(base_test.BaseTestClass): self.subscriber = self.ads[1] def setup_device(device: android_device.AndroidDevice): - device.load_snippet( - 'wifi_aware_snippet', PACKAGE_NAME - ) + for snippet_name, package_name in snippets_to_load: + device.load_snippet(snippet_name, package_name) for permission in RUNTIME_PERMISSIONS: - device.adb.shell(['pm', 'grant', PACKAGE_NAME, permission]) + device.adb.shell(['pm', 'grant', package_name, permission]) asserts.abort_all_if( not device.wifi_aware_snippet.wifiAwareIsAvailable(), f'{device} Wi-Fi Aware is not available.', @@ -90,7 +94,7 @@ class WifiAwareDiscoveryTest(base_test.BaseTestClass): def setup_test(self): for ad in self.ads: - autils.control_wifi(ad, True) + ad.wifi.wifiEnable() aware_avail = ad.wifi_aware_snippet.wifiAwareIsAvailable() if not aware_avail: ad.log.info('Aware not available. Waiting ...') @@ -114,8 +118,11 @@ class WifiAwareDiscoveryTest(base_test.BaseTestClass): def _teardown_test_on_device(self, ad: android_device.AndroidDevice) -> None: ad.wifi_aware_snippet.wifiAwareCloseAllWifiAwareSession() - autils.reset_device_parameters(ad) - autils.reset_device_statistics(ad) + ad.wifi.wifiClearConfiguredNetworks() + ad.wifi.wifiEnable() + if ad.is_adb_root: + autils.reset_device_parameters(ad) + autils.reset_device_statistics(ad) def on_fail(self, record: records.TestResult) -> None: android_device.take_bug_reports(self.ads, @@ -696,7 +703,6 @@ class WifiAwareDiscoveryTest(base_test.BaseTestClass): if p_service_name is not None: p_config[constants.SERVICE_NAME] = p_service_name if p_mf_1 is not None: - # p_config[constants.MATCH_FILTER] = p_mf_1.encode("utf-8") p_config[constants.MATCH_FILTER] = autils.encode_list( [(10).to_bytes(1, byteorder="big"), p_mf_1 , bytes(range(40))]) s_config = self.create_subscribe_config( @@ -1116,7 +1122,6 @@ class WifiAwareDiscoveryTest(base_test.BaseTestClass): SERVICE_NAME = "ServiceName" X_SERVICE_SSI = "ServiceSpecificInfoXXX" Y_SERVICE_SSI = "ServiceSpecificInfoYYY" - # use_id = True # attach and wait for confirmation p_id = self._start_attach(p_dut) s_id = self._start_attach(s_dut) @@ -1277,7 +1282,6 @@ class WifiAwareDiscoveryTest(base_test.BaseTestClass): p_dut.wifi_aware_snippet.wifiAwareCloseDiscoverSession( p_disc_id.callback_id) time.sleep(10) - # service_lost_event = s_disc_id.waitAndGet("WifiAwareSessionOnServiceLost") service_lost_event = s_disc_id.waitAndGet( constants.DiscoverySessionCallbackMethodType.SESSION_CB_ON_SERVICE_LOST) asserts.assert_equal(peer_id_on_sub, @@ -1287,6 +1291,16 @@ class WifiAwareDiscoveryTest(base_test.BaseTestClass): service_lost_event.data[constants.DiscoverySessionCallbackMethodType.SESSION_CB_KEY_LOST_REASON] ) + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#subscrible(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_UNSOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE)', + ] + ) + def test_positive_unsolicited_passive_typical(self)-> None: """Functional test case / Discovery test cases / positive test case: - Unsolicited publish + passive subscribe @@ -1300,6 +1314,16 @@ class WifiAwareDiscoveryTest(base_test.BaseTestClass): _PAYLOAD_SIZE_TYPICAL ) + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#subscrible(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_UNSOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE)', + ] + ) + def test_positive_unsolicited_passive_min(self)-> None: """Functional test case / Discovery test cases / positive test case: - Unsolicited publish + passive subscribe @@ -1313,6 +1337,16 @@ class WifiAwareDiscoveryTest(base_test.BaseTestClass): _PAYLOAD_SIZE_MIN ) + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#subscrible(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_UNSOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE)', + ] + ) + def test_positive_unsolicited_passive_max(self)-> None: """Functional test case / Discovery test cases / positive test case: - Unsolicited publish + passive subscribe @@ -1326,6 +1360,16 @@ class WifiAwareDiscoveryTest(base_test.BaseTestClass): _PAYLOAD_SIZE_MAX ) + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#subscrible(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_SOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_ACTIVE)', + ] + ) + def test_positive_solicited_active_typical(self)-> None: """Functional test case / Discovery test cases / positive test case: - Solicited publish + active subscribe @@ -1339,6 +1383,16 @@ class WifiAwareDiscoveryTest(base_test.BaseTestClass): _PAYLOAD_SIZE_TYPICAL ) + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#subscrible(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_SOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_ACTIVE)', + ] + ) + def test_positive_solicited_active_min(self)-> None: """Functional test case / Discovery test cases / positive test case: - Solicited publish + active subscribe @@ -1352,6 +1406,16 @@ class WifiAwareDiscoveryTest(base_test.BaseTestClass): _PAYLOAD_SIZE_MIN ) + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#subscrible(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_SOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_ACTIVE)', + ] + ) + def test_positive_solicited_active_max(self)-> None: """Functional test case / Discovery test cases / positive test case: - Solicited publish + active subscribe @@ -1376,6 +1440,16 @@ class WifiAwareDiscoveryTest(base_test.BaseTestClass): # term_ind: ind_on or ind_off ####################################### + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#subscrible(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_UNSOLICITED)', + 'android.net.wifi.aware.PublishConfig.Builder#setTerminateNotificationEnabled(PublishConfig.mEnableTerminateNotification)', + ] + ) + def test_ttl_unsolicited_ind_on(self)-> None: """Functional test case / Discovery test cases / TTL test case: - Unsolicited publish @@ -1387,6 +1461,16 @@ class WifiAwareDiscoveryTest(base_test.BaseTestClass): stype=None, term_ind_on=True) + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#subscrible(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_UNSOLICITED)', + 'android.net.wifi.aware.PublishConfig.Builder#setTerminateNotificationEnabled(PublishConfig.mEnableTerminateNotification)', + ] + ) + def test_ttl_unsolicited_ind_off(self)-> None: """Functional test case / Discovery test cases / TTL test case: - Unsolicited publish @@ -1398,6 +1482,16 @@ class WifiAwareDiscoveryTest(base_test.BaseTestClass): stype=None, term_ind_on=False) + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#subscrible(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_SOLICITED)', + 'android.net.wifi.aware.PublishConfig.Builder#setTerminateNotificationEnabled(PublishConfig.mEnableTerminateNotification)', + ] + ) + def test_ttl_solicited_ind_on(self)-> None: """Functional test case / Discovery test cases / TTL test case: - Solicited publish @@ -1409,6 +1503,16 @@ class WifiAwareDiscoveryTest(base_test.BaseTestClass): stype=None, term_ind_on=True) + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#subscrible(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_SOLICITED)', + 'android.net.wifi.aware.PublishConfig.Builder#setTerminateNotificationEnabled(PublishConfig.mEnableTerminateNotification)', + ] + ) + def test_ttl_solicited_ind_off(self)-> None: """Functional test case / Discovery test cases / TTL test case: - Solicited publish @@ -1420,6 +1524,16 @@ class WifiAwareDiscoveryTest(base_test.BaseTestClass): stype=None, term_ind_on=False) + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#subscrible(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setTerminateNotificationEnabled(SubscribeConfig.mEnableTerminateNotification)', + ] + ) + def test_ttl_passive_ind_on(self)-> None: """Functional test case / Discovery test cases / TTL test case: - Passive subscribe @@ -1431,6 +1545,16 @@ class WifiAwareDiscoveryTest(base_test.BaseTestClass): stype=_SUBSCRIBE_TYPE_PASSIVE, term_ind_on=True) + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#subscrible(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setTerminateNotificationEnabled(SubscribeConfig.mEnableTerminateNotification)', + ] + ) + def test_ttl_passive_ind_off(self)-> None: """Functional test case / Discovery test cases / TTL test case: - Passive subscribe @@ -1442,6 +1566,16 @@ class WifiAwareDiscoveryTest(base_test.BaseTestClass): stype=_SUBSCRIBE_TYPE_PASSIVE, term_ind_on=False) + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#subscrible(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setTerminateNotificationEnabled(SubscribeConfig.mEnableTerminateNotification)', + ] + ) + def test_ttl_active_ind_on(self)-> None: """Functional test case / Discovery test cases / TTL test case: - Active subscribe @@ -1453,6 +1587,16 @@ class WifiAwareDiscoveryTest(base_test.BaseTestClass): stype=_SUBSCRIBE_TYPE_ACTIVE, term_ind_on=True) + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#subscrible(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setTerminateNotificationEnabled(SubscribeConfig.mEnableTerminateNotification)', + ] + ) + def test_ttl_active_ind_off(self)-> None: """Functional test case / Discovery test cases / TTL test case: - Active subscribe @@ -1474,6 +1618,18 @@ class WifiAwareDiscoveryTest(base_test.BaseTestClass): # sub_type: Type of subscribe discovery session: passive or active. ####################################### + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#subscrible(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_UNSOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_ACTIVE)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setTerminateNotificationEnabled(SubscribeConfig.mEnableTerminateNotification)', + 'android.net.wifi.aware.PublishConfig.Builder#setTerminateNotificationEnabled(PublishConfig.mEnableTerminateNotification)', + ] + ) + def test_mismatch_service_type_unsolicited_active(self): """Functional test case / Discovery test cases / Mismatch service name - Unsolicited publish @@ -1484,6 +1640,18 @@ class WifiAwareDiscoveryTest(base_test.BaseTestClass): p_type=_PUBLISH_TYPE_UNSOLICITED, s_type=_SUBSCRIBE_TYPE_ACTIVE) + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#subscrible(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_SOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setTerminateNotificationEnabled(SubscribeConfig.mEnableTerminateNotification)', + 'android.net.wifi.aware.PublishConfig.Builder#setTerminateNotificationEnabled(PublishConfig.mEnableTerminateNotification)', + ] + ) + def test_mismatch_service_type_solicited_passive(self): """Functional test case / Discovery test cases / Mismatch service name - Unsolicited publish @@ -1504,6 +1672,18 @@ class WifiAwareDiscoveryTest(base_test.BaseTestClass): # sub_type: Type of subscribe discovery session: passive or active. ####################################### + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#subscrible(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_UNSOLICITED,)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setTerminateNotificationEnabled(SubscribeConfig.mEnableTerminateNotification)', + 'android.net.wifi.aware.PublishConfig.Builder#setTerminateNotificationEnabled(PublishConfig.mEnableTerminateNotification)', + ] + ) + def test_mismatch_service_name_unsolicited_passive(self): """Functional test case / Discovery test cases / Mismatch service name - Unsolicited publish @@ -1516,6 +1696,18 @@ class WifiAwareDiscoveryTest(base_test.BaseTestClass): p_service_name="GoogleTestServiceXXX", s_service_name="GoogleTestServiceYYY") + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#subscrible(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_SOLICITED,)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_ACTIVE)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setTerminateNotificationEnabled(SubscribeConfig.mEnableTerminateNotification)', + 'android.net.wifi.aware.PublishConfig.Builder#setTerminateNotificationEnabled(PublishConfig.mEnableTerminateNotification)', + ] + ) + def test_mismatch_service_name_solicited_active(self): """Functional test case / Discovery test cases / Mismatch service name - Solicited publish @@ -1538,6 +1730,18 @@ class WifiAwareDiscoveryTest(base_test.BaseTestClass): # sub_type: Type of subscribe discovery session: passive or active. ####################################### + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#subscrible(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_UNSOLICITED,)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setTerminateNotificationEnabled(SubscribeConfig.mEnableTerminateNotification)', + 'android.net.wifi.aware.PublishConfig.Builder#setTerminateNotificationEnabled(PublishConfig.mEnableTerminateNotification)', + ] + ) + def test_mismatch_match_filter_unsolicited_passive(self): """Functional test case / Discovery test cases / Mismatch match filter - Unsolicited publish @@ -1550,6 +1754,18 @@ class WifiAwareDiscoveryTest(base_test.BaseTestClass): p_mf_1="hello there string", s_mf_1="goodbye there string") + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#subscrible(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_SOLICITED,)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_ACTIVE,)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setTerminateNotificationEnabled(SubscribeConfig.mEnableTerminateNotification)', + 'android.net.wifi.aware.PublishConfig.Builder#setTerminateNotificationEnabled(PublishConfig.mEnableTerminateNotification)', + ] + ) + def test_mismatch_match_filter_solicited_active(self): """Functional test case / Discovery test cases / Mismatch match filter - Solicited publish @@ -1566,6 +1782,17 @@ class WifiAwareDiscoveryTest(base_test.BaseTestClass): # Multiple concurrent services ####################################### + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#subscrible(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_UNSOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE)', + 'android.net.wifi.aware.DiscoverySession#sendMessage(int, byte[])', + ] + ) + def test_multiple_concurrent_services_both_unsolicited_passive(self): """Validate multiple concurrent discovery sessions running on both devices. - DUT1 & DUT2 running Publish for X @@ -1589,6 +1816,17 @@ class WifiAwareDiscoveryTest(base_test.BaseTestClass): _SUBSCRIBE_TYPE_PASSIVE ]) + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#subscrible(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_SOLICITED,)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_ACTIVE)', + 'android.net.wifi.aware.DiscoverySession#sendMessage(int, byte[])', + ] + ) + def test_multiple_concurrent_services_both_solicited_active(self): """Validate multiple concurrent discovery sessions running on both devices. - DUT1 & DUT2 running Publish for X @@ -1611,6 +1849,19 @@ class WifiAwareDiscoveryTest(base_test.BaseTestClass): _PUBLISH_TYPE_SOLICITED, _SUBSCRIBE_TYPE_ACTIVE ]) + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#subscrible(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_SOLICITED,)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_ACTIVE)', + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_UNSOLICITED,)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE)', + 'android.net.wifi.aware.DiscoverySession#sendMessage(int, byte[])', + ] + ) + def test_multiple_concurrent_services_mix_unsolicited_solicited(self): """Validate multiple concurrent discovery sessions running on both devices. - DUT1 & DUT2 running Publish for X @@ -1638,6 +1889,17 @@ class WifiAwareDiscoveryTest(base_test.BaseTestClass): # Multiple concurrent services with diff ssi ######################################################### + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#subscrible(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_UNSOLICITED,)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE)', + 'android.net.wifi.aware.DiscoverySession#sendMessage(int, byte[])', + ] + ) + def test_multiple_concurrent_services_diff_ssi_unsolicited_passive(self): """Multi service test on same service name but different Service Specific Info - Unsolicited publish @@ -1647,6 +1909,17 @@ class WifiAwareDiscoveryTest(base_test.BaseTestClass): type_x=[_PUBLISH_TYPE_UNSOLICITED, _SUBSCRIBE_TYPE_PASSIVE], type_y=[_PUBLISH_TYPE_UNSOLICITED, _SUBSCRIBE_TYPE_PASSIVE]) + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#subscrible(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_SOLICITED,)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_ACTIVE)', + 'android.net.wifi.aware.DiscoverySession#sendMessage(int, byte[])', + ] + ) + def test_multiple_concurrent_services_diff_ssi_solicited_active(self): """Multi service test on same service name but different Service Specific Info - Solicited publish @@ -1658,6 +1931,17 @@ class WifiAwareDiscoveryTest(base_test.BaseTestClass): ######################################################### + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#subscrible(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_UNSOLICITED,)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE)', + 'android.net.wifi.aware.DiscoverySession#sendMessage(int, byte[])', + ] + ) + def test_upper_lower_service_name_equivalence(self): """Validate that Service Name is case-insensitive. Publish a service name with mixed case, subscribe to the same service name with alternative case @@ -1681,6 +1965,16 @@ class WifiAwareDiscoveryTest(base_test.BaseTestClass): # service discovery on service lost ######################################################### + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#subscrible(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_UNSOLICITED,)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE)', + ] + ) + def test_service_discovery_on_service_lost_unsolicited_passive(self): """ Test service discovery lost with unsolicited publish and passive subscribe @@ -1688,6 +1982,16 @@ class WifiAwareDiscoveryTest(base_test.BaseTestClass): self.run_service_discovery_on_service_lost(_PUBLISH_TYPE_UNSOLICITED, _SUBSCRIBE_TYPE_PASSIVE) + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#subscrible(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_SOLICITED,)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_ACTIVE)', + ] + ) + def test_service_discovery_on_service_lost_solicited_active(self): """ Test service discovery lost with solicited publish and active subscribe @@ -1695,6 +1999,7 @@ class WifiAwareDiscoveryTest(base_test.BaseTestClass): self.run_service_discovery_on_service_lost(_PUBLISH_TYPE_SOLICITED, _SUBSCRIBE_TYPE_ACTIVE) + if __name__ == '__main__': # Take test args if '--' in sys.argv: diff --git a/tests/hostsidetests/multidevices/test/aware/integration/wifi_aware_discovery_with_ranging_test.py b/tests/hostsidetests/multidevices/test/aware/integration/wifi_aware_discovery_with_ranging_test.py index e689363962..5acd444dd2 100644 --- a/tests/hostsidetests/multidevices/test/aware/integration/wifi_aware_discovery_with_ranging_test.py +++ b/tests/hostsidetests/multidevices/test/aware/integration/wifi_aware_discovery_with_ranging_test.py @@ -19,6 +19,7 @@ import statistics import sys import time +from android.platform.test.annotations import ApiTest from aware import aware_lib_utils as autils from aware import constants from mobly import asserts @@ -291,6 +292,14 @@ class WiFiAwareDiscoveryWithRangingTest(base_test.BaseTestClass): return p_dut, s_dut, p_disc_id, s_disc_id + @ApiTest( + apis=[ + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_UNSOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE)', + 'android.net.wifi.aware.PublishConfig.Builder#setRangingEnabled(boolean enable)', + 'android.net.wifi.aware.DiscoverySessionCallback#onServiceDiscovered(android.net.wifi.aware.ServiceDiscoveryInfo info)', + ] + ) def test_ranged_discovery_unsolicited_passive_prange_snorange(self): """Verify discovery(unsolicited/passive) with ranging. @@ -319,6 +328,14 @@ class WiFiAwareDiscoveryWithRangingTest(base_test.BaseTestClass): s_dut.wifi_aware_snippet.wifiAwareCloseDiscoverSession( s_disc_id.callback_id) + @ApiTest( + apis=[ + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_SOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_ACTIVE)', + 'android.net.wifi.aware.PublishConfig.Builder#setRangingEnabled(boolean enable)', + 'android.net.wifi.aware.DiscoverySessionCallback#onServiceDiscovered(android.net.wifi.aware.ServiceDiscoveryInfo info)', + ] + ) def test_ranged_discovery_solicited_active_prange_snorange(self): """Verify discovery(solicited/active) with ranging. @@ -348,6 +365,14 @@ class WiFiAwareDiscoveryWithRangingTest(base_test.BaseTestClass): s_dut.wifi_aware_snippet.wifiAwareCloseDiscoverSession( s_disc_id.callback_id) + @ApiTest( + apis=[ + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_UNSOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMaxDistanceMm(int)', + 'android.net.wifi.aware.DiscoverySessionCallback#onServiceDiscovered(android.net.wifi.aware.ServiceDiscoveryInfo info)', + ] + ) def test_ranged_discovery_unsolicited_passive_pnorange_smax_inrange(self): """Verify discovery(unsolicited/passive) with ranging. @@ -380,6 +405,14 @@ class WiFiAwareDiscoveryWithRangingTest(base_test.BaseTestClass): s_dut.wifi_aware_snippet.wifiAwareCloseDiscoverSession( s_disc_id.callback_id) + @ApiTest( + apis = [ + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_SOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_ACTIVE)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMaxDistanceMm(int)', + 'android.net.wifi.aware.DiscoverySessionCallback#onServiceDiscovered(android.net.wifi.aware.ServiceDiscoveryInfo info)', + ] + ) def test_ranged_discovery_solicited_active_pnorange_smax_inrange(self): """Verify discovery(solicited/active) with ranging. @@ -412,6 +445,14 @@ class WiFiAwareDiscoveryWithRangingTest(base_test.BaseTestClass): s_dut.wifi_aware_snippet.wifiAwareCloseDiscoverSession( s_disc_id.callback_id) + @ApiTest( + apis = [ + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_UNSOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMinDistanceMm(int)', + 'android.net.wifi.aware.DiscoverySessionCallback#onServiceDiscovered(android.net.wifi.aware.ServiceDiscoveryInfo info)', + ] + ) def test_ranged_discovery_unsolicited_passive_pnorange_smin_outofrange(self): """Verify discovery(unsolicited/passive) with ranging. @@ -444,6 +485,14 @@ class WiFiAwareDiscoveryWithRangingTest(base_test.BaseTestClass): s_dut.wifi_aware_snippet.wifiAwareCloseDiscoverSession( s_disc_id.callback_id) + @ApiTest( + apis = [ + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_SOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_ACTIVE)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMinDistanceMm(int)', + 'android.net.wifi.aware.DiscoverySessionCallback#onServiceDiscovered(android.net.wifi.aware.ServiceDiscoveryInfo info)', + ] + ) def test_ranged_discovery_solicited_active_pnorange_smin_outofrange(self): """Verify discovery(solicited/active) with ranging. @@ -476,6 +525,16 @@ class WiFiAwareDiscoveryWithRangingTest(base_test.BaseTestClass): s_dut.wifi_aware_snippet.wifiAwareCloseDiscoverSession( s_disc_id.callback_id) + @ApiTest( + apis = [ + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_UNSOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE)', + 'android.net.wifi.aware.PublishConfig.Builder#setRangingEnabled(boolean enable)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMinDistanceMm(int)', + 'android.net.wifi.aware.DiscoverySessionCallback#onServiceDiscovered(android.net.wifi.aware.ServiceDiscoveryInfo info)', + 'android.net.wifi.aware.DiscoverySessionCallback#onServiceDiscoveredWithinRange(android.net.wifi.aware.PeerHandle peerHandle, byte[] serviceSpecificInfo, List<byte[]> matchFilter, int distanceMm)', + ] + ) def test_ranged_discovery_unsolicited_passive_prange_smin_inrange(self): """Verify discovery(unsolicited/passive) with ranging. @@ -507,6 +566,16 @@ class WiFiAwareDiscoveryWithRangingTest(base_test.BaseTestClass): s_dut.wifi_aware_snippet.wifiAwareCloseDiscoverSession( s_disc_id.callback_id) + @ApiTest( + apis = [ + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_UNSOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE)', + 'android.net.wifi.aware.PublishConfig.Builder#setRangingEnabled(boolean enable)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMaxDistanceMm(int)', + 'android.net.wifi.aware.DiscoverySessionCallback#onServiceDiscovered(android.net.wifi.aware.ServiceDiscoveryInfo info)', + 'android.net.wifi.aware.DiscoverySessionCallback#onServiceDiscoveredWithinRange(android.net.wifi.aware.PeerHandle peerHandle, byte[] serviceSpecificInfo, java.util.List<byte[]> matchFilter, int distanceMm)', + ] + ) def test_ranged_discovery_unsolicited_passive_prange_smax_inrange(self): """Verify discovery(unsolicited/passive) with ranging. @@ -538,6 +607,17 @@ class WiFiAwareDiscoveryWithRangingTest(base_test.BaseTestClass): s_dut.wifi_aware_snippet.wifiAwareCloseDiscoverSession( s_disc_id.callback_id) + @ApiTest( + apis = [ + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_UNSOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE)', + 'android.net.wifi.aware.PublishConfig.Builder#setRangingEnabled(boolean enable)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMinDistanceMm(int)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMaxDistanceMm(int)', + 'android.net.wifi.aware.DiscoverySessionCallback#onServiceDiscovered(android.net.wifi.aware.ServiceDiscoveryInfo info)', + 'android.net.wifi.aware.DiscoverySessionCallback#onServiceDiscoveredWithinRange(android.net.wifi.aware.PeerHandle peerHandle, byte[] serviceSpecificInfo, List<byte[]> matchFilter, int distanceMm)', + ] + ) def test_ranged_discovery_unsolicited_passive_prange_sminmax_inrange(self): """Verify discovery(unsolicited/passive) with ranging. @@ -570,6 +650,16 @@ class WiFiAwareDiscoveryWithRangingTest(base_test.BaseTestClass): s_dut.wifi_aware_snippet.wifiAwareCloseDiscoverSession( s_disc_id.callback_id) + @ApiTest( + apis = [ + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_SOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_ACTIVE)', + 'android.net.wifi.aware.PublishConfig.Builder#setRangingEnabled(boolean enable)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMinDistanceMm(int)', + 'android.net.wifi.aware.DiscoverySessionCallback#onServiceDiscovered(android.net.wifi.aware.ServiceDiscoveryInfo info)', + 'android.net.wifi.aware.DiscoverySessionCallback#onServiceDiscoveredWithinRange(android.net.wifi.aware.PeerHandle peerHandle, byte[] serviceSpecificInfo, List<byte[]> matchFilter, int distanceMm)', + ] + ) def test_ranged_discovery_solicited_active_prange_smin_inrange(self): """Verify discovery(solicited/active) with ranging. @@ -601,6 +691,16 @@ class WiFiAwareDiscoveryWithRangingTest(base_test.BaseTestClass): s_dut.wifi_aware_snippet.wifiAwareCloseDiscoverSession( s_disc_id.callback_id) + @ApiTest( + apis = [ + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_SOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_ACTIVE)', + 'android.net.wifi.aware.PublishConfig.Builder#setRangingEnabled(boolean enable)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMaxDistanceMm(int)', + 'android.net.wifi.aware.DiscoverySessionCallback#onServiceDiscovered(android.net.wifi.aware.ServiceDiscoveryInfo info)', + 'android.net.wifi.aware.DiscoverySessionCallback#onServiceDiscoveredWithinRange(android.net.wifi.aware.PeerHandle peerHandle, byte[] serviceSpecificInfo, List<byte[]> matchFilter, int distanceMm)', + ] + ) def test_ranged_discovery_solicited_active_prange_smax_inrange(self): """Verify discovery(solicited/active) with ranging. @@ -632,6 +732,17 @@ class WiFiAwareDiscoveryWithRangingTest(base_test.BaseTestClass): s_dut.wifi_aware_snippet.wifiAwareCloseDiscoverSession( s_disc_id.callback_id) + @ApiTest( + apis = [ + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_SOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_ACTIVE)', + 'android.net.wifi.aware.PublishConfig.Builder#setRangingEnabled(boolean enable)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMinDistanceMm(int)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMaxDistanceMm(int)', + 'android.net.wifi.aware.DiscoverySessionCallback#onServiceDiscovered(android.net.wifi.aware.ServiceDiscoveryInfo info)', + 'android.net.wifi.aware.DiscoverySessionCallback#onServiceDiscoveredWithinRange(android.net.wifi.aware.PeerHandle peerHandle, byte[] serviceSpecificInfo, List<byte[]> matchFilter, int distanceMm)', + ] + ) def test_ranged_discovery_solicited_active_prange_sminmax_inrange(self): """Verify discovery(solicited/active) with ranging. @@ -664,6 +775,14 @@ class WiFiAwareDiscoveryWithRangingTest(base_test.BaseTestClass): s_dut.wifi_aware_snippet.wifiAwareCloseDiscoverSession( s_disc_id.callback_id) + @ApiTest( + apis = [ + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_UNSOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE)', + 'android.net.wifi.aware.PublishConfig.Builder#setRangingEnabled(boolean enable)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMinDistanceMm(int)', + ] + ) def test_ranged_discovery_unsolicited_passive_prange_smin_outofrange(self): """Verify discovery(unsolicited/passive) with ranging. @@ -694,6 +813,15 @@ class WiFiAwareDiscoveryWithRangingTest(base_test.BaseTestClass): s_dut.wifi_aware_snippet.wifiAwareCloseDiscoverSession( s_disc_id.callback_id) + @ApiTest( + apis = [ + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_UNSOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE)', + 'android.net.wifi.aware.PublishConfig.Builder#setRangingEnabled(boolean enable)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMaxDistanceMm(int)', + 'android.net.wifi.aware.DiscoverySessionCallback#onServiceDiscovered(android.net.wifi.aware.ServiceDiscoveryInfo info)', + ] + ) def test_ranged_discovery_unsolicited_passive_prange_smax_outofrange(self): """Verify discovery(unsolicited/passive) with ranging. @@ -725,6 +853,15 @@ class WiFiAwareDiscoveryWithRangingTest(base_test.BaseTestClass): s_dut.wifi_aware_snippet.wifiAwareCloseDiscoverSession( s_disc_id.callback_id) + @ApiTest( + apis = [ + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_UNSOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE)', + 'android.net.wifi.aware.PublishConfig.Builder#setRangingEnabled(boolean enable)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMinDistanceMm(int)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMaxDistanceMm(int)', + ] + ) def test_ranged_discovery_unsolicited_passive_prange_sminmax_outofrange(self): """Verify discovery(unsolicited/passive) with ranging. @@ -756,6 +893,14 @@ class WiFiAwareDiscoveryWithRangingTest(base_test.BaseTestClass): s_dut.wifi_aware_snippet.wifiAwareCloseDiscoverSession( s_disc_id.callback_id) + @ApiTest( + apis = [ + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_SOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_ACTIVE)', + 'android.net.wifi.aware.PublishConfig.Builder#setRangingEnabled(boolean enable)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMinDistanceMm(int)', + ] + ) def test_ranged_discovery_solicited_active_prange_smin_outofrange(self): """Verify discovery(solicited/active) with ranging. @@ -786,6 +931,14 @@ class WiFiAwareDiscoveryWithRangingTest(base_test.BaseTestClass): s_dut.wifi_aware_snippet.wifiAwareCloseDiscoverSession( s_disc_id.callback_id) + @ApiTest( + apis = [ + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_SOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_ACTIVE)', + 'android.net.wifi.aware.PublishConfig.Builder#setRangingEnabled(boolean enable)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMaxDistanceMm(int)', + ] + ) def test_ranged_discovery_solicited_active_prange_smax_outofrange(self): """Verify discovery(solicited/active) with ranging. @@ -817,6 +970,15 @@ class WiFiAwareDiscoveryWithRangingTest(base_test.BaseTestClass): s_dut.wifi_aware_snippet.wifiAwareCloseDiscoverSession( s_disc_id.callback_id) + @ApiTest( + apis = [ + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_SOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_ACTIVE)', + 'android.net.wifi.aware.PublishConfig.Builder#setRangingEnabled(boolean enable)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMinDistanceMm(int)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMaxDistanceMm(int)', + ] + ) def test_ranged_discovery_solicited_active_prange_sminmax_outofrange(self): """Verify discovery(solicited/active) with ranging. @@ -980,6 +1142,18 @@ class WiFiAwareDiscoveryWithRangingTest(base_test.BaseTestClass): time.sleep(autils._EVENT_TIMEOUT) + @ApiTest( + apis = [ + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_UNSOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE)', + 'android.net.wifi.aware.PublishConfig.Builder#setRangingEnabled(boolean enable)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMinDistanceMm(int)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMaxDistanceMm(int)', + 'android.net.wifi.aware.DiscoverySessionCallback#onServiceDiscovered(android.net.wifi.aware.ServiceDiscoveryInfo info)', + 'android.net.wifi.aware.DiscoverySessionCallback#onServiceDiscoveredWithinRange(android.net.wifi.aware.PeerHandle peerHandle, byte[] serviceSpecificInfo, List<byte[]> matchFilter, int distanceMm)', + 'android.net.wifi.aware.SubscribeDiscoverySession#updateSubscribe(android.net.wifi.aware.SubscribeConfig subscribeConfig)', + ] + ) def test_ranged_updated_discovery_unsolicited_passive_oor_to_ir(self): """Verify discovery with ranging operation with updated configuration. @@ -1014,6 +1188,18 @@ class WiFiAwareDiscoveryWithRangingTest(base_test.BaseTestClass): p_dut.wifi_aware_snippet.wifiAwareCloseDiscoverSession(p_disc_id.callback_id) s_dut.wifi_aware_snippet.wifiAwareCloseDiscoverSession(s_disc_id.callback_id) + @ApiTest( + apis = [ + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_UNSOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE)', + 'android.net.wifi.aware.PublishConfig.Builder#setRangingEnabled(boolean enable)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMinDistanceMm(int)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMaxDistanceMm(int)', + 'android.net.wifi.aware.DiscoverySessionCallback#onServiceDiscovered(android.net.wifi.aware.ServiceDiscoveryInfo info)', + 'android.net.wifi.aware.DiscoverySessionCallback#onServiceDiscoveredWithinRange(android.net.wifi.aware.PeerHandle peerHandle, byte[] serviceSpecificInfo, List<byte[]> matchFilter, int distanceMm)', + 'android.net.wifi.aware.PublishDiscoverySession#updatePublish(android.net.wifi.aware.PublishConfig publishConfig)', + ] + ) def test_ranged_updated_discovery_unsolicited_passive_pub_unrange(self): """Verify discovery with ranging operation with updated configuration. @@ -1044,6 +1230,17 @@ class WiFiAwareDiscoveryWithRangingTest(base_test.BaseTestClass): p_dut.wifi_aware_snippet.wifiAwareCloseDiscoverSession(p_disc_id.callback_id) s_dut.wifi_aware_snippet.wifiAwareCloseDiscoverSession(s_disc_id.callback_id) + @ApiTest( + apis = [ + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_UNSOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE)', + 'android.net.wifi.aware.PublishConfig.Builder#setRangingEnabled(boolean enable)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMinDistanceMm(int)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMaxDistanceMm(int)', + 'android.net.wifi.aware.DiscoverySessionCallback#onServiceDiscovered(android.net.wifi.aware.ServiceDiscoveryInfo info)', + 'android.net.wifi.aware.SubscribeDiscoverySession#updateSubscribe(android.net.wifi.aware.SubscribeConfig subscribeConfig)', + ] + ) def test_ranged_updated_discovery_unsolicited_passive_sub_unrange(self): """Verify discovery with ranging operation with updated configuration. @@ -1075,6 +1272,16 @@ class WiFiAwareDiscoveryWithRangingTest(base_test.BaseTestClass): p_dut.wifi_aware_snippet.wifiAwareCloseDiscoverSession(p_disc_id.callback_id) s_dut.wifi_aware_snippet.wifiAwareCloseDiscoverSession(s_disc_id.callback_id) + @ApiTest( + apis = [ + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_UNSOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE)', + 'android.net.wifi.aware.PublishConfig.Builder#setRangingEnabled(boolean enable)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMinDistanceMm(int)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMaxDistanceMm(int)', + 'android.net.wifi.aware.SubscribeDiscoverySession#updateSubscribe(android.net.wifi.aware.SubscribeConfig subscribeConfig)', + ] + ) def test_ranged_updated_discovery_unsolicited_passive_sub_oor(self): """Verify discovery with ranging operation with updated configuration. @@ -1107,6 +1314,16 @@ class WiFiAwareDiscoveryWithRangingTest(base_test.BaseTestClass): p_dut.wifi_aware_snippet.wifiAwareCloseDiscoverSession(p_disc_id.callback_id) s_dut.wifi_aware_snippet.wifiAwareCloseDiscoverSession(s_disc_id.callback_id) + @ApiTest( + apis = [ + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_UNSOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE)', + 'android.net.wifi.aware.PublishConfig.Builder#setRangingEnabled(boolean enable)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMinDistanceMm(int)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMaxDistanceMm(int)', + 'android.net.wifi.aware.PublishDiscoverySession#updatePublish(android.net.wifi.aware.PublishConfig publishConfig)', + ] + ) def test_ranged_updated_discovery_unsolicited_passive_pub_same(self): """Verify discovery with ranging operation with updated configuration. @@ -1137,6 +1354,16 @@ class WiFiAwareDiscoveryWithRangingTest(base_test.BaseTestClass): p_dut.wifi_aware_snippet.wifiAwareCloseDiscoverSession(p_disc_id.callback_id) s_dut.wifi_aware_snippet.wifiAwareCloseDiscoverSession(s_disc_id.callback_id) + @ApiTest( + apis = [ + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_UNSOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE)', + 'android.net.wifi.aware.PublishConfig.Builder#setRangingEnabled(boolean enable)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMinDistanceMm(int)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMaxDistanceMm(int)', + 'android.net.wifi.aware.SubscribeDiscoverySession#updateSubscribe(android.net.wifi.aware.SubscribeConfig subscribeConfig)', + ] + ) def test_ranged_updated_discovery_unsolicited_passive_multi_step(self): """Verify discovery with ranging operation with updated configuration. @@ -1201,6 +1428,18 @@ class WiFiAwareDiscoveryWithRangingTest(base_test.BaseTestClass): p_dut.wifi_aware_snippet.wifiAwareCloseDiscoverSession(p_disc_id.callback_id) s_dut.wifi_aware_snippet.wifiAwareCloseDiscoverSession(s_disc_id.callback_id) + @ApiTest( + apis = [ + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_SOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_ACTIVE)', + 'android.net.wifi.aware.PublishConfig.Builder#setRangingEnabled(boolean enable)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMinDistanceMm(int)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMaxDistanceMm(int)', + 'android.net.wifi.aware.DiscoverySessionCallback#onServiceDiscovered(android.net.wifi.aware.ServiceDiscoveryInfo info)', + 'android.net.wifi.aware.DiscoverySessionCallback#onServiceDiscoveredWithinRange(android.net.wifi.aware.PeerHandle peerHandle, byte[] serviceSpecificInfo, List<byte[]> matchFilter, int distanceMm)', + 'android.net.wifi.aware.SubscribeDiscoverySession#updateSubscribe(android.net.wifi.aware.SubscribeConfig subscribeConfig)', + ] + ) def test_ranged_updated_discovery_solicited_active_oor_to_ir(self): """Verify discovery with ranging operation with updated configuration. @@ -1235,6 +1474,17 @@ class WiFiAwareDiscoveryWithRangingTest(base_test.BaseTestClass): p_dut.wifi_aware_snippet.wifiAwareCloseDiscoverSession(p_disc_id.callback_id) s_dut.wifi_aware_snippet.wifiAwareCloseDiscoverSession(s_disc_id.callback_id) + @ApiTest( + apis = [ + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_SOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_ACTIVE)', + 'android.net.wifi.aware.PublishConfig.Builder#setRangingEnabled(boolean enable)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMinDistanceMm(int)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMaxDistanceMm(int)', + 'android.net.wifi.aware.DiscoverySessionCallback#onServiceDiscovered(android.net.wifi.aware.ServiceDiscoveryInfo info)', + 'android.net.wifi.aware.PublishDiscoverySession#updatePublish(android.net.wifi.aware.PublishConfig publishConfig)', + ] + ) def test_ranged_updated_discovery_solicited_active_pub_unrange(self): """Verify discovery with ranging operation with updated configuration. @@ -1265,6 +1515,17 @@ class WiFiAwareDiscoveryWithRangingTest(base_test.BaseTestClass): p_dut.wifi_aware_snippet.wifiAwareCloseDiscoverSession(p_disc_id.callback_id) s_dut.wifi_aware_snippet.wifiAwareCloseDiscoverSession(s_disc_id.callback_id) + @ApiTest( + apis = [ + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_SOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_ACTIVE)', + 'android.net.wifi.aware.PublishConfig.Builder#setRangingEnabled(boolean enable)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMinDistanceMm(int)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMaxDistanceMm(int)', + 'android.net.wifi.aware.DiscoverySessionCallback#onServiceDiscovered(android.net.wifi.aware.ServiceDiscoveryInfo info)', + 'android.net.wifi.aware.SubscribeDiscoverySession#updateSubscribe(android.net.wifi.aware.SubscribeConfig subscribeConfig)', + ] + ) def test_ranged_updated_discovery_solicited_active_sub_unrange(self): """Verify discovery with ranging operation with updated configuration. @@ -1294,6 +1555,16 @@ class WiFiAwareDiscoveryWithRangingTest(base_test.BaseTestClass): p_dut.wifi_aware_snippet.wifiAwareCloseDiscoverSession(p_disc_id.callback_id) s_dut.wifi_aware_snippet.wifiAwareCloseDiscoverSession(s_disc_id.callback_id) + @ApiTest( + apis = [ + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_SOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_ACTIVE)', + 'android.net.wifi.aware.PublishConfig.Builder#setRangingEnabled(boolean enable)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMinDistanceMm(int)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMaxDistanceMm(int)', + 'android.net.wifi.aware.SubscribeDiscoverySession#updateSubscribe(android.net.wifi.aware.SubscribeConfig subscribeConfig)', + ] + ) def test_ranged_updated_discovery_solicited_active_sub_oor(self): """Verify discovery with ranging operation with updated configuration. @@ -1327,6 +1598,17 @@ class WiFiAwareDiscoveryWithRangingTest(base_test.BaseTestClass): p_dut.wifi_aware_snippet.wifiAwareCloseDiscoverSession(p_disc_id.callback_id) s_dut.wifi_aware_snippet.wifiAwareCloseDiscoverSession(s_disc_id.callback_id) + @ApiTest( + apis = [ + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_SOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_ACTIVE)', + 'android.net.wifi.aware.PublishConfig.Builder#setRangingEnabled(boolean enable)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMinDistanceMm(int)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMaxDistanceMm(int)', + 'android.net.wifi.aware.DiscoverySessionCallback#onServiceDiscovered(android.net.wifi.aware.ServiceDiscoveryInfo info)', + 'android.net.wifi.aware.PublishDiscoverySession#updatePublish(android.net.wifi.aware.PublishConfig publishConfig)', + ] + ) def test_ranged_updated_discovery_solicited_active_pub_same(self): """Verify discovery with ranging operation with updated configuration. @@ -1398,6 +1680,18 @@ class WiFiAwareDiscoveryWithRangingTest(base_test.BaseTestClass): timeout=_DEFAULT_TIMEOUT) return None + @ApiTest( + apis = [ + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_UNSOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE)', + 'android.net.wifi.aware.PublishConfig.Builder#setRangingEnabled(boolean enable)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMinDistanceMm(int)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMaxDistanceMm(int)', + 'android.net.wifi.aware.DiscoverySessionCallback#onServiceDiscovered(android.net.wifi.aware.ServiceDiscoveryInfo info)', + 'android.net.wifi.aware.DiscoverySessionCallback#onServiceDiscoveredWithinRange(android.net.wifi.aware.PeerHandle peerHandle, byte[] serviceSpecificInfo, List<byte[]> matchFilter, int distanceMm)', + 'android.net.wifi.aware.SubscribeDiscoverySession#updateSubscribe(android.net.wifi.aware.SubscribeConfig subscribeConfig)', + ] + ) def test_ranged_updated_discovery_solicited_active_multi_step(self): """Verify discovery with ranging operation with updated configuration. @@ -1461,6 +1755,17 @@ class WiFiAwareDiscoveryWithRangingTest(base_test.BaseTestClass): p_dut.wifi_aware_snippet.wifiAwareCloseDiscoverSession(p_disc_id.callback_id) s_dut.wifi_aware_snippet.wifiAwareCloseDiscoverSession(s_disc_id.callback_id) + @ApiTest( + apis = [ + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_UNSOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE)', + 'android.net.wifi.aware.PublishConfig.Builder#setRangingEnabled(boolean enable)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMinDistanceMm(int)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMaxDistanceMm(int)', + 'android.net.wifi.aware.DiscoverySessionCallback#onServiceDiscovered(android.net.wifi.aware.ServiceDiscoveryInfo info)', + 'android.net.wifi.aware.DiscoverySessionCallback#onServiceDiscoveredWithinRange(android.net.wifi.aware.PeerHandle peerHandle, byte[] serviceSpecificInfo, List<byte[]> matchFilter, int distanceMm)', + ] + ) def test_ranged_discovery_multi_session(self): """Verify behavior with multiple concurrent discovery session with different configurations. @@ -1833,6 +2138,18 @@ class WiFiAwareDiscoveryWithRangingTest(base_test.BaseTestClass): ) return results + @ApiTest( + apis = [ + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_UNSOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE)', + 'android.net.wifi.aware.PublishConfig.Builder#setRangingEnabled(boolean enable)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMinDistanceMm(int)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setMaxDistanceMm(int)', + 'android.net.wifi.aware.DiscoverySessionCallback#onServiceDiscovered(android.net.wifi.aware.ServiceDiscoveryInfo info)', + 'android.net.wifi.aware.DiscoverySessionCallback#onServiceDiscoveredWithinRange(android.net.wifi.aware.PeerHandle peerHandle, byte[] serviceSpecificInfo, List<byte[]> matchFilter, int distanceMm)', + 'android.net.wifi.aware.SubscribeDiscoverySession#updateSubscribe(android.net.wifi.aware.SubscribeConfig subscribeConfig)', + ] + ) def test_discovery_direct_concurrency(self): """Verify the behavior of Wi-Fi Aware Ranging used as part of discovery and as direct ranging to a peer device. diff --git a/tests/hostsidetests/multidevices/test/aware/integration/wifi_aware_integration_test_suite.py b/tests/hostsidetests/multidevices/test/aware/integration/wifi_aware_integration_test_suite.py new file mode 100644 index 0000000000..5b093721d3 --- /dev/null +++ b/tests/hostsidetests/multidevices/test/aware/integration/wifi_aware_integration_test_suite.py @@ -0,0 +1,61 @@ +# Copyright (C) 2025 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. + +# Lint as: python3 +"""Wi-Fi Aware integration test suite in Mobly.""" + +import sys + +from mobly import base_suite +from mobly import suite_runner +import wifi_aware_attached_test +import wifi_aware_capabilities_test +import wifi_aware_datapath_test +import wifi_aware_discovery_test +import wifi_aware_discovery_with_ranging_test +import wifi_aware_mac_random_test +import wifi_aware_matchfilter_test +import wifi_aware_message_test +import wifi_aware_protocols_multi_country_test +import wifi_aware_protocols_test + + +class WifiAwareIntegrationTestSuite(base_suite.BaseSuite): + """Wi-Fi Aware integration test suite.""" + + def setup_suite(self, config): + del config # Unused. + self.add_test_class(wifi_aware_attached_test.WifiAwareAttachTest) + self.add_test_class(wifi_aware_capabilities_test.WifiAwareCapabilitiesTest) + self.add_test_class(wifi_aware_datapath_test.WifiAwareDatapathTest) + self.add_test_class(wifi_aware_discovery_test.WifiAwareDiscoveryTest) + self.add_test_class( + wifi_aware_discovery_with_ranging_test.WiFiAwareDiscoveryWithRangingTest + ) + self.add_test_class(wifi_aware_mac_random_test.MacRandomTest) + self.add_test_class(wifi_aware_matchfilter_test.WifiAwareMatchFilterTest) + self.add_test_class(wifi_aware_message_test.WifiAwareMessageTest) + self.add_test_class( + wifi_aware_protocols_multi_country_test.ProtocolsMultiCountryTest + ) + self.add_test_class(wifi_aware_protocols_test.WifiAwareProtocolsTest) + + +if __name__ == '__main__': + # Take test args + if '--' in sys.argv: + index = sys.argv.index('--') + sys.argv = sys.argv[:1] + sys.argv[index + 1 :] + + suite_runner.run_suite_class() diff --git a/tests/hostsidetests/multidevices/test/aware/integration/wifi_aware_matchfilter_test.py b/tests/hostsidetests/multidevices/test/aware/integration/wifi_aware_matchfilter_test.py index f61f367eae..0f4a485c6f 100644 --- a/tests/hostsidetests/multidevices/test/aware/integration/wifi_aware_matchfilter_test.py +++ b/tests/hostsidetests/multidevices/test/aware/integration/wifi_aware_matchfilter_test.py @@ -20,6 +20,7 @@ import logging import random import sys +from android.platform.test.annotations import ApiTest from aware import aware_lib_utils as autils from aware import constants from mobly import asserts @@ -36,6 +37,10 @@ RUNTIME_PERMISSIONS = ( 'android.permission.NEARBY_WIFI_DEVICES', ) PACKAGE_NAME = constants.WIFI_AWARE_SNIPPET_PACKAGE_NAME +snippets_to_load = [ + ('wifi_aware_snippet', PACKAGE_NAME), + ('wifi', constants.WIFI_SNIPPET_PACKAGE_NAME), +] _DEFAULT_TIMEOUT = constants.WAIT_WIFI_STATE_TIME_OUT.total_seconds() _MSG_ID_SUB_TO_PUB = random.randint(1000, 5000) _MSG_ID_PUB_TO_SUB = random.randint(5001, 9999) @@ -106,11 +111,10 @@ class WifiAwareMatchFilterTest(base_test.BaseTestClass): self.subscriber = self.ads[1] def setup_device(device: android_device.AndroidDevice): - device.load_snippet( - 'wifi_aware_snippet', PACKAGE_NAME - ) + for snippet_name, package_name in snippets_to_load: + device.load_snippet(snippet_name, package_name) for permission in RUNTIME_PERMISSIONS: - device.adb.shell(['pm', 'grant', PACKAGE_NAME, permission]) + device.adb.shell(['pm', 'grant', package_name, permission]) asserts.abort_all_if( not device.wifi_aware_snippet.wifiAwareIsAvailable(), f'{device} Wi-Fi Aware is not available.', @@ -126,7 +130,7 @@ class WifiAwareMatchFilterTest(base_test.BaseTestClass): def setup_test(self): for ad in self.ads: - autils.control_wifi(ad, True) + ad.wifi.wifiEnable() aware_avail = ad.wifi_aware_snippet.wifiAwareIsAvailable() if not aware_avail: ad.log.info('Aware not available. Waiting ...') @@ -152,9 +156,12 @@ class WifiAwareMatchFilterTest(base_test.BaseTestClass): def _teardown_test_on_device(self, ad: android_device.AndroidDevice) -> None: ad.wifi_aware_snippet.wifiAwareCloseAllWifiAwareSession() - autils.reset_device_parameters(ad) - autils.validate_forbidden_callbacks(ad) - autils.reset_device_statistics(ad) + ad.wifi.wifiClearConfiguredNetworks() + ad.wifi.wifiEnable() + if ad.is_adb_root: + autils.reset_device_parameters(ad) + autils.reset_device_statistics(ad) + autils.validate_forbidden_callbacks(ad) def on_fail(self, record: records.TestResult) -> None: android_device.take_bug_reports(self.ads, @@ -325,12 +332,34 @@ class WifiAwareMatchFilterTest(base_test.BaseTestClass): "Some match filter tests are failing", extras={"data": fails}) + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#subscrible(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_UNSOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE)', + 'android.net.wifi.aware.DiscoverySession#sendMessage(int, byte[])', + ] + ) + def test_match_filters_per_spec_unsolicited_passive(self): """Validate all the match filter combinations in the Wi-Fi Aware spec, Appendix H for Unsolicited Publish (tx filter) Passive Subscribe (rx filter)""" self.run_match_filters_per_spec(do_unsolicited_passive=True) + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#subscrible(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_SOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_ACTIVE)', + 'android.net.wifi.aware.DiscoverySession#sendMessage(int, byte[])', + ] + ) + def test_match_filters_per_spec_solicited_active(self): """Validate all the match filter combinations in the Wi-Fi Aware spec, Appendix H for Solicited Publish (rx filter) Active Subscribe (tx diff --git a/tests/hostsidetests/multidevices/test/aware/integration/wifi_aware_message_test.py b/tests/hostsidetests/multidevices/test/aware/integration/wifi_aware_message_test.py index badd1390f4..ce6b658143 100644 --- a/tests/hostsidetests/multidevices/test/aware/integration/wifi_aware_message_test.py +++ b/tests/hostsidetests/multidevices/test/aware/integration/wifi_aware_message_test.py @@ -18,6 +18,7 @@ import logging import string import sys +from android.platform.test.annotations import ApiTest from aware import aware_lib_utils as autils from aware import constants from mobly import asserts @@ -34,6 +35,10 @@ RUNTIME_PERMISSIONS = ( 'android.permission.NEARBY_WIFI_DEVICES', ) PACKAGE_NAME = constants.WIFI_AWARE_SNIPPET_PACKAGE_NAME +snippets_to_load = [ + ('wifi_aware_snippet', PACKAGE_NAME), + ('wifi', constants.WIFI_SNIPPET_PACKAGE_NAME), +] _DEFAULT_TIMEOUT = constants.WAIT_WIFI_STATE_TIME_OUT.total_seconds() _CALLBACK_NAME = constants.DiscoverySessionCallbackParamsType.CALLBACK_NAME _IS_SESSION_INIT = constants.DiscoverySessionCallbackParamsType.IS_SESSION_INIT @@ -81,11 +86,10 @@ class WifiAwareMessageTest(base_test.BaseTestClass): self.subscriber = self.ads[1] def setup_device(device: android_device.AndroidDevice): - device.load_snippet( - 'wifi_aware_snippet', PACKAGE_NAME - ) + for snippet_name, package_name in snippets_to_load: + device.load_snippet(snippet_name, package_name) for permission in RUNTIME_PERMISSIONS: - device.adb.shell(['pm', 'grant', PACKAGE_NAME, permission]) + device.adb.shell(['pm', 'grant', package_name, permission]) asserts.abort_all_if( not device.wifi_aware_snippet.wifiAwareIsAvailable(), f'{device} Wi-Fi Aware is not available.', @@ -101,7 +105,7 @@ class WifiAwareMessageTest(base_test.BaseTestClass): def setup_test(self): for ad in self.ads: - autils.control_wifi(ad, True) + ad.wifi.wifiEnable() aware_avail = ad.wifi_aware_snippet.wifiAwareIsAvailable() if not aware_avail: ad.log.info('Aware not available. Waiting ...') @@ -125,9 +129,12 @@ class WifiAwareMessageTest(base_test.BaseTestClass): def _teardown_test_on_device(self, ad: android_device.AndroidDevice) -> None: ad.wifi_aware_snippet.wifiAwareCloseAllWifiAwareSession() - autils.reset_device_parameters(ad) - autils.validate_forbidden_callbacks(ad) - autils.reset_device_statistics(ad) + ad.wifi.wifiClearConfiguredNetworks() + ad.wifi.wifiEnable() + if ad.is_adb_root: + autils.reset_device_parameters(ad) + autils.reset_device_statistics(ad) + autils.validate_forbidden_callbacks(ad) def on_fail(self, record: records.TestResult) -> None: android_device.take_bug_reports(self.ads, @@ -403,12 +410,9 @@ class WifiAwareMessageTest(base_test.BaseTestClass): event_name=_MESSAGE_SEND_RESULT, timeout=_DEFAULT_TIMEOUT, ) - logging.info("tx_event: %s",tx_event ) tx_msg_id = tx_event.data[ constants.DiscoverySessionCallbackParamsType.MESSAGE_ID ] - logging.info("tx_msg_id: %s",tx_msg_id ) - logging.info("tx_msg_ids: %s",tx_msg_ids ) tx_msg_ids[tx_msg_id] = tx_msg_ids[tx_msg_id] + 1 if tx_msg_ids[tx_msg_id] == 1: still_to_be_tx = still_to_be_tx - 1 @@ -569,6 +573,16 @@ class WifiAwareMessageTest(base_test.BaseTestClass): self.wait_for_messages(msgs2, msg_ids2, p_disc_id2, s_disc_id2, p_dut, s_dut, payload_size == _PAYLOAD_SIZE_MIN) + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#subscrible(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_UNSOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE)', + 'android.net.wifi.aware.DiscoverySession#sendMessage(int, byte[])', + ] + ) def test_message_no_queue_min(self): """Functional / Message / No queue @@ -576,45 +590,112 @@ class WifiAwareMessageTest(base_test.BaseTestClass): """ self.run_message_no_queue(_PAYLOAD_SIZE_MIN) + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#subscrible(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_UNSOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE)', + 'android.net.wifi.aware.DiscoverySession#sendMessage(int, byte[])', + ] + ) + def test_message_no_queue_typical(self): """Functional / Message / No queue - Typical payload size """ self.run_message_no_queue(_PAYLOAD_SIZE_TYPICAL) + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#subscrible(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_UNSOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE)', + 'android.net.wifi.aware.DiscoverySession#sendMessage(int, byte[])', + ] + ) + def test_message_no_queue_max(self): """Functional / Message / No queue - Max payload size (based on device capabilities) """ self.run_message_no_queue(_PAYLOAD_SIZE_MAX) + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#subscrible(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_UNSOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE)', + 'android.net.wifi.aware.DiscoverySession#sendMessage(int, byte[])', + ] + ) + def test_message_with_queue_min(self): """Functional / Message / With queue - Minimal payload size (none or "") """ self.run_message_with_queue(_PAYLOAD_SIZE_MIN) + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#subscrible(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_UNSOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE)', + 'android.net.wifi.aware.DiscoverySession#sendMessage(int, byte[])', + ] + ) + def test_message_with_queue_typical(self): """Functional / Message / With queue - Typical payload size """ self.run_message_with_queue(_PAYLOAD_SIZE_TYPICAL) + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#subscrible(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_UNSOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE)', + 'android.net.wifi.aware.DiscoverySession#sendMessage(int, byte[])', + ] + ) + def test_message_with_queue_max(self): """Functional / Message / With queue - Max payload size (based on device capabilities) """ self.run_message_with_queue(_PAYLOAD_SIZE_MAX) + @ApiTest( + apis=[ + 'android.net.wifi.aware.WifiAwareManager#attach(android.net.wifi.aware.AttachCallback, android.net.wifi.aware.IdentityChangedListener, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#publish(android.net.wifi.aware.PublishConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.WifiAwareSession#subscrible(android.net.wifi.aware.SubscribeConfig, android.net.wifi.aware.DiscoverySessionCallback, android.os.Handler)', + 'android.net.wifi.aware.PublishConfig.Builder#setPublishType(PublishConfig.PUBLISH_TYPE_UNSOLICITED)', + 'android.net.wifi.aware.SubscribeConfig.Builder#setSubscribeType(SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE)', + 'android.net.wifi.aware.DiscoverySession#sendMessage(int, byte[])', + ] + ) + def test_message_with_multiple_discovery_sessions_typical(self): """Functional / Message / Multiple sessions - Sets up 2 discovery sessions on 2 devices. Sends a message in each - direction on each discovery session and verifies that reaches expected - destination. + Sets up 2 discovery sessions on 2 devices. Sends a message in each + direction on each discovery session and verifies that reaches expected + destination. """ self.run_message_multi_session_with_queue(_PAYLOAD_SIZE_TYPICAL) + if __name__ == '__main__': # Take test args if '--' in sys.argv: diff --git a/tests/hostsidetests/multidevices/test/aware/integration/wifi_aware_protocols_test.py b/tests/hostsidetests/multidevices/test/aware/integration/wifi_aware_protocols_test.py index 1217d0d12c..9cbbb40011 100644 --- a/tests/hostsidetests/multidevices/test/aware/integration/wifi_aware_protocols_test.py +++ b/tests/hostsidetests/multidevices/test/aware/integration/wifi_aware_protocols_test.py @@ -36,22 +36,21 @@ RUNTIME_PERMISSIONS = ( ) PACKAGE_NAME = constants.WIFI_AWARE_SNIPPET_PACKAGE_NAME -_CALLBACK_NAME = constants.DiscoverySessionCallbackParamsType.CALLBACK_NAME +_REQUEST_NETWORK_TIMEOUT_MS = 15 * 1000 -# Publish & Subscribe Config keys. -_PAYLOAD_SIZE_MIN = 0 -_PAYLOAD_SIZE_TYPICAL = 1 -_PAYLOAD_SIZE_MAX = 2 - -# number of second to 'reasonably' wait to make sure that devices synchronize +# The number of second to 'reasonably' wait to make sure that devices synchronize # with each other - useful for OOB test cases, where the OOB discovery would # take some time _WAIT_FOR_CLUSTER = 5 +# Aware Data-Path Constants +_DATA_PATH_INITIATOR = 0 +_DATA_PATH_RESPONDER = 1 + class WifiAwareProtocolsTest(base_test.BaseTestClass): """Set of tests for Wi-Fi Aware data-paths: validating protocols running ontop of a data-path.""" - # message ID counter to make sure all uses are unique + # The message ID counter to make sure all uses are unique. msg_id = 0 device_startup_offset = 1 @@ -282,9 +281,186 @@ class WifiAwareProtocolsTest(base_test.BaseTestClass): p_dut.wifi_aware_snippet.wifiAwareCloseAllWifiAwareSession() s_dut.wifi_aware_snippet.wifiAwareCloseAllWifiAwareSession() + def request_oob_network( + self, + ad: android_device.AndroidDevice, + aware_session: str, + role: int, + mac: str, + passphrase: str | None, + pmk: str | None, + net_work_request_id: str, + ) -> callback_handler_v2.CallbackHandlerV2: + """Requests a Wi-Fi Aware network.""" + network_specifier_parcel = ( + ad.wifi_aware_snippet.createNetworkSpecifierOob( + aware_session, role, mac, passphrase, pmk + ) + ) + network_request_dict = constants.NetworkRequest( + transport_type=constants.NetworkCapabilities.Transport.TRANSPORT_WIFI_AWARE, + network_specifier_parcel=network_specifier_parcel['result'], + ).to_dict() + return ad.wifi_aware_snippet.connectivityRequestNetwork( + net_work_request_id, network_request_dict, _REQUEST_NETWORK_TIMEOUT_MS + ) + + def create_oob_ndp_on_sessions( + self, + init_dut, + resp_dut, + init_id, + init_mac, + resp_id, + resp_mac): + """Create an NDP on top of existing Aware sessions (using OOB discovery). + + Args: + init_dut: Initiator device + resp_dut: Responder device + init_id: Initiator attach session id + init_mac: Initiator discovery MAC address + resp_id: Responder attach session id + resp_mac: Responder discovery MAC address + Returns: + init_req_key: Initiator network request + resp_req_key: Responder network request + init_aware_if: Initiator Aware data interface + resp_aware_if: Responder Aware data interface + init_ipv6: Initiator IPv6 address + resp_ipv6: Responder IPv6 address + """ + # Responder: request network. + init_dut_accept_handler = ( + init_dut.wifi_aware_snippet.connectivityServerSocketAccept()) + network_id = init_dut_accept_handler.callback_id + resp_network_cb_handler = self.request_oob_network( + resp_dut, + resp_id, + _DATA_PATH_RESPONDER, + init_mac, + None, + None, + network_id + ) + # Initiator: request network. + init_network_cb_handler = self.request_oob_network( + init_dut, + init_id, + _DATA_PATH_INITIATOR, + resp_mac, + None, + None, + network_id + ) + pub_network_cap = autils.wait_for_network( + ad=init_dut, + request_network_cb_handler=init_network_cb_handler, + expected_channel=None, + ) + sub_network_cap = autils.wait_for_network( + ad=resp_dut, + request_network_cb_handler=resp_network_cb_handler, + expected_channel=None, + ) + # To get ipv6 ip address. + resp_ipv6 = pub_network_cap.data[constants.NetworkCbName.NET_CAP_IPV6] + init_ipv6 = sub_network_cap.data[constants.NetworkCbName.NET_CAP_IPV6] + + pub_network_link = autils.wait_for_link( + ad=init_dut, + request_network_cb_handler=init_network_cb_handler, + ) + init_aware_if = pub_network_link.data[ + constants.NetworkCbEventKey.NETWORK_INTERFACE_NAME + ] + sub_network_link = autils.wait_for_link( + ad=resp_dut, + request_network_cb_handler=resp_network_cb_handler, + ) + resp_aware_if = sub_network_link.data[ + constants.NetworkCbEventKey.NETWORK_INTERFACE_NAME + ] + + init_dut.log.info('interfaceName = %s, ipv6=%s', init_aware_if, init_ipv6) + resp_dut.log.info('interfaceName = %s, ipv6=%s', resp_aware_if, resp_ipv6) + return (init_network_cb_handler, resp_network_cb_handler, + init_aware_if, resp_aware_if, + init_ipv6, resp_ipv6) + + def create_oob_ndp( + self, + init_dut: android_device.AndroidDevice, + resp_dut: android_device.AndroidDevice): + """Create an NDP (using OOB discovery). + + Args: + init_dut: Initiator device + resp_dut: Responder device + Returns: + A tuple containing the following: + - Initiator network request + - Responder network request + - Initiator Aware data interface + - Responder Aware data interface + - Initiator IPv6 address + - Responder IPv6 address + """ + init_dut.pretty_name = 'Initiator' + resp_dut.pretty_name = 'Responder' + + # Initiator+Responder: attach and wait for confirmation & identity. + init_id, init_mac = autils.start_attach(init_dut) + time.sleep(self.device_startup_offset) + resp_id, resp_mac = autils.start_attach(resp_dut) + + # Wait for devices to synchronize with each other - there are no other + # mechanisms to make sure this happens for OOB discovery (except retrying + # to execute the data-path request). + time.sleep(_WAIT_FOR_CLUSTER) + return self.create_oob_ndp_on_sessions(init_dut, resp_dut, init_id, + init_mac, resp_id, resp_mac) + + def test_ping6_oob(self): + """Validate that ping6 works correctly on an NDP created using OOB (out-of-band) discovery.""" + init_dut = self.ads[0] + resp_dut = self.ads[1] + + # Create NDP. + ( + init_network_cb, + resp_network_cb, + init_aware_if, + resp_aware_if, + init_ipv6, + resp_ipv6, + ) = self.create_oob_ndp(init_dut, resp_dut) + init_dut.log.info( + 'Interface names: I=%s, R=%s', init_aware_if, resp_aware_if + ) + resp_dut.log.info( + 'Interface addresses (IPv6): I=%s, R=%s', init_ipv6, resp_ipv6 + ) + + # Run ping6 command. + autils.run_ping6(init_dut, resp_ipv6) + time.sleep(3) + autils.run_ping6(resp_dut, init_ipv6) + time.sleep(3) + + # Clean-up. + init_dut.wifi_aware_snippet.connectivityUnregisterNetwork( + init_network_cb.callback_id + ) + resp_dut.wifi_aware_snippet.connectivityUnregisterNetwork( + resp_network_cb.callback_id + ) + init_dut.wifi_aware_snippet.wifiAwareCloseAllWifiAwareSession() + resp_dut.wifi_aware_snippet.wifiAwareCloseAllWifiAwareSession() + if __name__ == '__main__': - # Take test args + # Take test args. if '--' in sys.argv: index = sys.argv.index('--') sys.argv = sys.argv[:1] + sys.argv[index + 1 :] |