blob: d89358df039d4e0e56a931bf8dcd46a369216b95 [file] [log] [blame]
/*
* Copyright (C) 2017 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.server.wifi;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.ContentObserver;
import android.net.Uri;
import android.net.wifi.EAPConstants;
import android.net.wifi.WifiEnterpriseConfig;
import android.os.PersistableBundle;
import android.os.test.TestLooper;
import android.telephony.CarrierConfigManager;
import android.telephony.ImsiEncryptionInfo;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.util.Base64;
import androidx.test.filters.SmallTest;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import java.security.PublicKey;
import java.util.Arrays;
import java.util.Collections;
/**
* Unit tests for {@link com.android.server.wifi.CarrierNetworkConfig}.
*/
@SmallTest
public class CarrierNetworkConfigTest {
private static final String TEST_SSID = "Test SSID";
private static final int TEST_STANDARD_EAP_TYPE = EAPConstants.EAP_SIM;
private static final int TEST_INTERNAL_EAP_TYPE = WifiEnterpriseConfig.Eap.SIM;
private static final int TEST_SUBSCRIPTION_ID = 1;
private static final String TEST_CARRIER_NAME = "Test Carrier";
private static final SubscriptionInfo TEST_SUBSCRIPTION_INFO =
new SubscriptionInfo(TEST_SUBSCRIPTION_ID, null, 0, TEST_CARRIER_NAME, null, 0, 0,
null, 0, null, "0", "0", null, false, null, null);
@Mock Context mContext;
@Mock CarrierConfigManager mCarrierConfigManager;
@Mock SubscriptionManager mSubscriptionManager;
@Mock TelephonyManager mTelephonyManager;
@Mock TelephonyManager mDataTelephonyManager;
@Mock PublicKey mPublicKey;
@Mock FrameworkFacade mFrameworkFacade;
BroadcastReceiver mBroadcastReceiver;
CarrierNetworkConfig mCarrierNetworkConfig;
TestLooper mLooper;
ContentObserver mContentObserver;
private ImsiEncryptionInfo mImsiEncryptionInfo = new ImsiEncryptionInfo(null, null, 0, null,
mPublicKey, null);
/**
* Generate and return a carrier config for testing
*
* @param ssid The SSID of the carrier network
* @param eapType The EAP type of the carrier network
* @return {@link PersistableBundle} containing carrier config
*/
private PersistableBundle generateTestConfig(String ssid, int eapType) {
PersistableBundle bundle = new PersistableBundle();
String networkConfig =
new String(Base64.encode(ssid.getBytes(), Base64.DEFAULT)) + "," + eapType;
bundle.putStringArray(CarrierConfigManager.KEY_CARRIER_WIFI_STRING_ARRAY,
new String[]{networkConfig});
return bundle;
}
/**
* Method to initialize mocks for tests.
*/
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
when(mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE))
.thenReturn(mCarrierConfigManager);
when(mContext.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE))
.thenReturn(mSubscriptionManager);
when(mContext.getSystemService(Context.TELEPHONY_SERVICE)).thenReturn(mTelephonyManager);
when(mTelephonyManager.createForSubscriptionId(anyInt())).thenReturn(mDataTelephonyManager);
when(mCarrierConfigManager.getConfigForSubId(TEST_SUBSCRIPTION_ID))
.thenReturn(generateTestConfig(TEST_SSID, TEST_STANDARD_EAP_TYPE));
when(mSubscriptionManager.getActiveSubscriptionInfoList())
.thenReturn(Arrays.asList(new SubscriptionInfo[] {TEST_SUBSCRIPTION_INFO}));
when(mDataTelephonyManager.getCarrierInfoForImsiEncryption(TelephonyManager.KEY_TYPE_WLAN))
.thenReturn(mImsiEncryptionInfo);
mLooper = new TestLooper();
mCarrierNetworkConfig = new CarrierNetworkConfig(mContext, mLooper.getLooper(),
mFrameworkFacade);
ArgumentCaptor<BroadcastReceiver> receiver =
ArgumentCaptor.forClass(BroadcastReceiver.class);
verify(mContext).registerReceiver(receiver.capture(), any(IntentFilter.class));
mBroadcastReceiver = receiver.getValue();
ArgumentCaptor<ContentObserver> observerCaptor =
ArgumentCaptor.forClass(ContentObserver.class);
verify(mFrameworkFacade).registerContentObserver(eq(mContext), any(Uri.class), eq(false),
observerCaptor.capture());
mContentObserver = observerCaptor.getValue();
reset(mCarrierConfigManager);
}
/**
* Verify that {@link CarrierNetworkConfig#isCarrierNetwork} will return true and
* {@link CarrierNetworkConfig#getNetworkEapType} will return the corresponding EAP type
* when the given SSID is associated with a carrier network.
*
* @throws Exception
*/
@Test
public void getExistingCarrierNetworkInfo() throws Exception {
assertTrue(mCarrierNetworkConfig.isCarrierNetwork(TEST_SSID));
assertEquals(TEST_INTERNAL_EAP_TYPE, mCarrierNetworkConfig.getNetworkEapType(TEST_SSID));
assertEquals(TEST_CARRIER_NAME, mCarrierNetworkConfig.getCarrierName(TEST_SSID));
}
/**
* Tests that SubscriptionInfo.getDisplayName() returning null does not throw a
* NullPointerException in CarrierNetworkConfig.
*/
@Test
public void getExistingCarrierNetworkInfo_nullDisplayName_shouldNotThrowNpe() {
when(mCarrierConfigManager.getConfigForSubId(TEST_SUBSCRIPTION_ID))
.thenReturn(generateTestConfig(TEST_SSID, TEST_STANDARD_EAP_TYPE));
SubscriptionInfo testSubscriptionInfoNullDisplayName = new SubscriptionInfo(
TEST_SUBSCRIPTION_ID, null, 0, null, null, 0, 0,
null, 0, null, "0", "0", null, false, null, null);
when(mSubscriptionManager.getActiveSubscriptionInfoList())
.thenReturn(Collections.singletonList(testSubscriptionInfoNullDisplayName));
mCarrierNetworkConfig = new CarrierNetworkConfig(mContext, mLooper.getLooper(),
mFrameworkFacade);
reset(mCarrierConfigManager);
assertEquals("", mCarrierNetworkConfig.getCarrierName(TEST_SSID));
}
/**
* Verify that {@link CarrierNetworkConfig#isCarrierEncryptionInfoAvailable} will return true
* when the carrier IMSI encryption info is available.
*
* @throws Exception
*/
@Test
public void verifyIsCarrierEncryptionInfoAvailableReturnsTrueWhenEncryptionInfoIsAvailable()
throws Exception {
assertTrue(mCarrierNetworkConfig.isCarrierEncryptionInfoAvailable());
}
/**
* Verify that {@link CarrierNetworkConfig#isCarrierEncryptionInfoAvailable} will return false
* when the carrier IMSI encryption info is not available.
*
* @throws Exception
*/
@Test
public void verifyIsCarrierEncryptionInfoAvailableReturnsFalseWhenEncryptionInfoNotAvailable()
throws Exception {
when(mDataTelephonyManager.getCarrierInfoForImsiEncryption(TelephonyManager.KEY_TYPE_WLAN))
.thenReturn(null);
mBroadcastReceiver.onReceive(mContext,
new Intent(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED));
assertFalse(mCarrierNetworkConfig.isCarrierEncryptionInfoAvailable());
}
/**
* Verify that {@link CarrierNetworkConfig#isCarrierNetwork} will return false and
* {@link CarrierNetworkConfig#getNetworkEapType} will return -1 when the given SSID is not
* associated with any carrier network.
*
* @throws Exception
*/
@Test
public void getNonCarrierNetworkInfo() throws Exception {
String dummySsid = "Dummy SSID";
assertFalse(mCarrierNetworkConfig.isCarrierNetwork(dummySsid));
assertEquals(-1, mCarrierNetworkConfig.getNetworkEapType(dummySsid));
}
/**
* Verify that the carrier network config is updated when
* {@link CarrierConfigManager#ACTION_CARRIER_CONFIG_CHANGED} intent is received.
*
* @throws Exception
*/
@Test
public void receivedCarrierConfigChangedIntent() throws Exception {
String updatedSsid = "Updated SSID";
int updatedStandardEapType = EAPConstants.EAP_AKA;
int updatedInternalEapType = WifiEnterpriseConfig.Eap.AKA;
String updatedCarrierName = "Updated Carrier";
SubscriptionInfo updatedSubscriptionInfo = new SubscriptionInfo(TEST_SUBSCRIPTION_ID,
null, 0, updatedCarrierName, null, 0, 0, null, 0, null, "0", "0", null,
false, null, null);
when(mSubscriptionManager.getActiveSubscriptionInfoList())
.thenReturn(Arrays.asList(new SubscriptionInfo[] {updatedSubscriptionInfo}));
when(mCarrierConfigManager.getConfigForSubId(TEST_SUBSCRIPTION_ID))
.thenReturn(generateTestConfig(updatedSsid, updatedStandardEapType));
mBroadcastReceiver.onReceive(mContext,
new Intent(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED));
// Verify that original SSID no longer associated with a carrier network.
assertFalse(mCarrierNetworkConfig.isCarrierNetwork(TEST_SSID));
assertEquals(-1, mCarrierNetworkConfig.getNetworkEapType(TEST_SSID));
assertEquals(null, mCarrierNetworkConfig.getCarrierName(TEST_SSID));
// Verify that updated SSID is associated with a carrier network.
assertTrue(mCarrierNetworkConfig.isCarrierNetwork(updatedSsid));
assertEquals(updatedInternalEapType, mCarrierNetworkConfig.getNetworkEapType(updatedSsid));
assertEquals(updatedCarrierName, mCarrierNetworkConfig.getCarrierName(updatedSsid));
}
/**
* Verify that the carrier network config is not updated when non
* {@link CarrierConfigManager#ACTION_CARRIER_CONFIG_CHANGED} intent is received.
*
* @throws Exception
*/
@Test
public void receivedNonCarrierConfigChangedIntent() throws Exception {
mBroadcastReceiver.onReceive(mContext, new Intent("dummyIntent"));
verify(mCarrierConfigManager, never()).getConfig();
}
/**
* Verify that updateNetworkConfig is called when carrier networks certificates are downloaded.
*/
@Test
public void onFeatureDisable_setWifiNetworksAvailableNotificationSettingDisabled() {
when(mDataTelephonyManager.getCarrierInfoForImsiEncryption(TelephonyManager.KEY_TYPE_WLAN))
.thenReturn(null);
mBroadcastReceiver.onReceive(mContext,
new Intent(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED));
// make sure the initial value is false
assertFalse(mCarrierNetworkConfig.isCarrierEncryptionInfoAvailable());
when(mDataTelephonyManager.getCarrierInfoForImsiEncryption(TelephonyManager.KEY_TYPE_WLAN))
.thenReturn(mImsiEncryptionInfo);
mContentObserver.onChange(false);
assertTrue(mCarrierNetworkConfig.isCarrierEncryptionInfoAvailable());
}
}