From b48796131ddd016071144f77f208360e8c408f0e Mon Sep 17 00:00:00 2001 From: Peter Qiu Date: Thu, 2 Mar 2017 09:20:25 -0800 Subject: hotspot2: use the updated public intent definitions While there, add unit tests for handling WNM frames. Bug: 35857805 Test: frameworks/opt/net/wifi/tests/wifitests/runtests.sh Change-Id: Ic546aa2854d925a9546fcabdca92fc056c2435f4 Merged-In: Ic546aa2854d925a9546fcabdca92fc056c2435f4 --- .../server/wifi/hotspot2/PasspointManager.java | 59 +++++++------- .../server/wifi/hotspot2/PasspointManagerTest.java | 91 ++++++++++++++++++---- 2 files changed, 104 insertions(+), 46 deletions(-) diff --git a/service/java/com/android/server/wifi/hotspot2/PasspointManager.java b/service/java/com/android/server/wifi/hotspot2/PasspointManager.java index 3d4d61bf6..ff8b50f77 100644 --- a/service/java/com/android/server/wifi/hotspot2/PasspointManager.java +++ b/service/java/com/android/server/wifi/hotspot2/PasspointManager.java @@ -16,19 +16,19 @@ package com.android.server.wifi.hotspot2; -import static android.net.wifi.WifiManager.EXTRA_PASSPOINT_ICON_BSSID; -import static android.net.wifi.WifiManager.EXTRA_PASSPOINT_ICON_DATA; -import static android.net.wifi.WifiManager.EXTRA_PASSPOINT_ICON_FILE; -import static android.net.wifi.WifiManager.EXTRA_PASSPOINT_WNM_BSSID; -import static android.net.wifi.WifiManager.EXTRA_PASSPOINT_WNM_DELAY; -import static android.net.wifi.WifiManager.EXTRA_PASSPOINT_WNM_ESS; -import static android.net.wifi.WifiManager.EXTRA_PASSPOINT_WNM_METHOD; -import static android.net.wifi.WifiManager.EXTRA_PASSPOINT_WNM_URL; -import static android.net.wifi.WifiManager.PASSPOINT_ICON_RECEIVED_ACTION; -import static android.net.wifi.WifiManager.PASSPOINT_WNM_FRAME_RECEIVED_ACTION; +import static android.net.wifi.WifiManager.ACTION_PASSPOINT_DEAUTH_IMMINENT; +import static android.net.wifi.WifiManager.ACTION_PASSPOINT_ICON; +import static android.net.wifi.WifiManager.ACTION_PASSPOINT_SUBSCRIPTION_REMEDIATION; +import static android.net.wifi.WifiManager.EXTRA_BSSID_LONG; +import static android.net.wifi.WifiManager.EXTRA_DELAY; +import static android.net.wifi.WifiManager.EXTRA_ESS; +import static android.net.wifi.WifiManager.EXTRA_ICON_INFO; +import static android.net.wifi.WifiManager.EXTRA_SUBSCRIPTION_REMEDIATION_METHOD; +import static android.net.wifi.WifiManager.EXTRA_URL; import android.content.Context; import android.content.Intent; +import android.net.wifi.IconInfo; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiEnterpriseConfig; import android.net.wifi.hotspot2.PasspointConfiguration; @@ -124,36 +124,35 @@ public class PasspointManager { @Override public void onIconResponse(long bssid, String fileName, byte[] data) { - Intent intent = new Intent(PASSPOINT_ICON_RECEIVED_ACTION); + Intent intent = new Intent(ACTION_PASSPOINT_ICON); intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); - intent.putExtra(EXTRA_PASSPOINT_ICON_BSSID, bssid); - intent.putExtra(EXTRA_PASSPOINT_ICON_FILE, fileName); - if (data != null) { - intent.putExtra(EXTRA_PASSPOINT_ICON_DATA, data); - } - mContext.sendBroadcastAsUser(intent, UserHandle.ALL); + intent.putExtra(EXTRA_BSSID_LONG, bssid); + intent.putExtra(EXTRA_ICON_INFO, new IconInfo(fileName, data)); + mContext.sendBroadcastAsUser(intent, UserHandle.ALL, + android.Manifest.permission.ACCESS_WIFI_STATE); } @Override public void onWnmFrameReceived(WnmData event) { // %012x HS20-SUBSCRIPTION-REMEDIATION "%u %s", osu_method, url // %012x HS20-DEAUTH-IMMINENT-NOTICE "%u %u %s", code, reauth_delay, url - Intent intent = new Intent(PASSPOINT_WNM_FRAME_RECEIVED_ACTION); - intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); - - intent.putExtra(EXTRA_PASSPOINT_WNM_BSSID, event.getBssid()); - intent.putExtra(EXTRA_PASSPOINT_WNM_URL, event.getUrl()); - + Intent intent; if (event.isDeauthEvent()) { - intent.putExtra(EXTRA_PASSPOINT_WNM_ESS, event.isEss()); - intent.putExtra(EXTRA_PASSPOINT_WNM_DELAY, event.getDelay()); + intent = new Intent(ACTION_PASSPOINT_DEAUTH_IMMINENT); + intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); + intent.putExtra(EXTRA_BSSID_LONG, event.getBssid()); + intent.putExtra(EXTRA_URL, event.getUrl()); + intent.putExtra(EXTRA_ESS, event.isEss()); + intent.putExtra(EXTRA_DELAY, event.getDelay()); } else { - intent.putExtra(EXTRA_PASSPOINT_WNM_METHOD, event.getMethod()); - // TODO(zqiu): set the passpoint matching status with the respect to the - // current connected network (e.g. HomeProvider, RoamingProvider, None, - // Declined). + intent = new Intent(ACTION_PASSPOINT_SUBSCRIPTION_REMEDIATION); + intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); + intent.putExtra(EXTRA_BSSID_LONG, event.getBssid()); + intent.putExtra(EXTRA_SUBSCRIPTION_REMEDIATION_METHOD, event.getMethod()); + intent.putExtra(EXTRA_URL, event.getUrl()); } - mContext.sendBroadcastAsUser(intent, UserHandle.ALL); + mContext.sendBroadcastAsUser(intent, UserHandle.ALL, + android.Manifest.permission.ACCESS_WIFI_STATE); } } diff --git a/tests/wifitests/src/com/android/server/wifi/hotspot2/PasspointManagerTest.java b/tests/wifitests/src/com/android/server/wifi/hotspot2/PasspointManagerTest.java index 8def58ccf..e424b4dbe 100644 --- a/tests/wifitests/src/com/android/server/wifi/hotspot2/PasspointManagerTest.java +++ b/tests/wifitests/src/com/android/server/wifi/hotspot2/PasspointManagerTest.java @@ -16,10 +16,15 @@ package com.android.server.wifi.hotspot2; -import static android.net.wifi.WifiManager.EXTRA_PASSPOINT_ICON_BSSID; -import static android.net.wifi.WifiManager.EXTRA_PASSPOINT_ICON_DATA; -import static android.net.wifi.WifiManager.EXTRA_PASSPOINT_ICON_FILE; -import static android.net.wifi.WifiManager.PASSPOINT_ICON_RECEIVED_ACTION; +import static android.net.wifi.WifiManager.ACTION_PASSPOINT_DEAUTH_IMMINENT; +import static android.net.wifi.WifiManager.ACTION_PASSPOINT_ICON; +import static android.net.wifi.WifiManager.ACTION_PASSPOINT_SUBSCRIPTION_REMEDIATION; +import static android.net.wifi.WifiManager.EXTRA_BSSID_LONG; +import static android.net.wifi.WifiManager.EXTRA_DELAY; +import static android.net.wifi.WifiManager.EXTRA_ESS; +import static android.net.wifi.WifiManager.EXTRA_ICON_INFO; +import static android.net.wifi.WifiManager.EXTRA_SUBSCRIPTION_REMEDIATION_METHOD; +import static android.net.wifi.WifiManager.EXTRA_URL; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -39,6 +44,7 @@ import static org.mockito.MockitoAnnotations.initMocks; import android.content.Context; import android.content.Intent; import android.net.wifi.EAPConstants; +import android.net.wifi.IconInfo; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiEnterpriseConfig; import android.net.wifi.hotspot2.PasspointConfiguration; @@ -128,24 +134,22 @@ public class PasspointManagerTest { } /** - * Verify PASSPOINT_ICON_RECEIVED_ACTION broadcast intent. + * Verify {@link WifiManager#ACTION_PASSPOINT_ICON} broadcast intent. * @param bssid BSSID of the AP * @param fileName Name of the icon file * @param data icon data byte array */ private void verifyIconIntent(long bssid, String fileName, byte[] data) { ArgumentCaptor intent = ArgumentCaptor.forClass(Intent.class); - verify(mContext).sendBroadcastAsUser(intent.capture(), eq(UserHandle.ALL)); - assertEquals(PASSPOINT_ICON_RECEIVED_ACTION, intent.getValue().getAction()); - assertTrue(intent.getValue().getExtras().containsKey(EXTRA_PASSPOINT_ICON_BSSID)); - assertEquals(bssid, intent.getValue().getExtras().getLong(EXTRA_PASSPOINT_ICON_BSSID)); - assertTrue(intent.getValue().getExtras().containsKey(EXTRA_PASSPOINT_ICON_FILE)); - assertEquals(fileName, intent.getValue().getExtras().getString(EXTRA_PASSPOINT_ICON_FILE)); - if (data != null) { - assertTrue(intent.getValue().getExtras().containsKey(EXTRA_PASSPOINT_ICON_DATA)); - assertEquals(data, - intent.getValue().getExtras().getByteArray(EXTRA_PASSPOINT_ICON_DATA)); - } + verify(mContext).sendBroadcastAsUser(intent.capture(), eq(UserHandle.ALL), + eq(android.Manifest.permission.ACCESS_WIFI_STATE)); + assertEquals(ACTION_PASSPOINT_ICON, intent.getValue().getAction()); + assertTrue(intent.getValue().getExtras().containsKey(EXTRA_BSSID_LONG)); + assertEquals(bssid, intent.getValue().getExtras().getLong(EXTRA_BSSID_LONG)); + assertTrue(intent.getValue().getExtras().containsKey(EXTRA_ICON_INFO)); + IconInfo expectedInfo = new IconInfo(fileName, data); + assertEquals(new IconInfo(fileName, data), + (IconInfo) intent.getValue().getExtras().getParcelable(EXTRA_ICON_INFO)); } /** @@ -329,6 +333,61 @@ public class PasspointManagerTest { verifyIconIntent(BSSID, ICON_FILENAME, null); } + /** + * Validate the broadcast intent {@link WifiManager#ACTION_PASSPOINT_DEAUTH_IMMINENT} when + * Deauth Imminent WNM frame is received. + * + * @throws Exception + */ + @Test + public void onDeauthImminentReceived() throws Exception { + String reasonUrl = "test.com"; + int delay = 123; + boolean ess = true; + + mCallbacks.onWnmFrameReceived(new WnmData(BSSID, reasonUrl, ess, delay)); + // Verify the broadcast intent. + ArgumentCaptor intent = ArgumentCaptor.forClass(Intent.class); + verify(mContext).sendBroadcastAsUser(intent.capture(), eq(UserHandle.ALL), + eq(android.Manifest.permission.ACCESS_WIFI_STATE)); + assertEquals(ACTION_PASSPOINT_DEAUTH_IMMINENT, intent.getValue().getAction()); + assertTrue(intent.getValue().getExtras().containsKey(EXTRA_BSSID_LONG)); + assertEquals(BSSID, intent.getValue().getExtras().getLong(EXTRA_BSSID_LONG)); + assertTrue(intent.getValue().getExtras().containsKey(EXTRA_ESS)); + assertEquals(ess, intent.getValue().getExtras().getBoolean(EXTRA_ESS)); + assertTrue(intent.getValue().getExtras().containsKey(EXTRA_DELAY)); + assertEquals(delay, intent.getValue().getExtras().getInt(EXTRA_DELAY)); + assertTrue(intent.getValue().getExtras().containsKey(EXTRA_URL)); + assertEquals(reasonUrl, intent.getValue().getExtras().getString(EXTRA_URL)); + } + + /** + * Validate the broadcast intent {@link WifiManager#ACTION_PASSPOINT_SUBSCRIPTION_REMEDIATION} + * when Subscription Remediation WNM frame is received. + * + * @throws Exception + */ + @Test + public void onSubscriptionRemediationReceived() throws Exception { + int serverMethod = 1; + String serverUrl = "testUrl"; + + mCallbacks.onWnmFrameReceived(new WnmData(BSSID, serverUrl, serverMethod)); + // Verify the broadcast intent. + ArgumentCaptor intent = ArgumentCaptor.forClass(Intent.class); + verify(mContext).sendBroadcastAsUser(intent.capture(), eq(UserHandle.ALL), + eq(android.Manifest.permission.ACCESS_WIFI_STATE)); + assertEquals(ACTION_PASSPOINT_SUBSCRIPTION_REMEDIATION, intent.getValue().getAction()); + assertTrue(intent.getValue().getExtras().containsKey(EXTRA_BSSID_LONG)); + assertEquals(BSSID, intent.getValue().getExtras().getLong(EXTRA_BSSID_LONG)); + assertTrue(intent.getValue().getExtras().containsKey( + EXTRA_SUBSCRIPTION_REMEDIATION_METHOD)); + assertEquals(serverMethod, intent.getValue().getExtras().getInt( + EXTRA_SUBSCRIPTION_REMEDIATION_METHOD)); + assertTrue(intent.getValue().getExtras().containsKey(EXTRA_URL)); + assertEquals(serverUrl, intent.getValue().getExtras().getString(EXTRA_URL)); + } + /** * Verify that adding a provider with a null configuration will fail. * -- cgit v1.2.3