Add UT for satellite access config file update
SatelliteAccessController supports config update of satellite access
config file. Added unit test to verify the functionality of the same.
Test: atest SatelliteAccessControllerTest
Bug: 391782433
Flag: com.android.internal.telephony.flags.carrier_roaming_nb_iot_ntn
Change-Id: I608862c69b5d0db998e593528e368ac4b2afa1bf
diff --git a/tests/Android.bp b/tests/Android.bp
index 22b2f46..bc66408 100644
--- a/tests/Android.bp
+++ b/tests/Android.bp
@@ -60,4 +60,6 @@
"mts",
],
+ resource_dirs: ["res"],
+
}
diff --git a/tests/res/raw/v15_satellite_access_config.json b/tests/res/raw/v15_satellite_access_config.json
new file mode 100644
index 0000000..fd5257e
--- /dev/null
+++ b/tests/res/raw/v15_satellite_access_config.json
@@ -0,0 +1,195 @@
+{
+ "access_control_configs": [
+ {
+ "config_id": 0,
+ "satellite_infos": [
+ {
+ "satellite_id": "967f8e86-fc27-4673-9343-a820280a14dd",
+ "satellite_position": {
+ "longitude": 10.25,
+ "altitude": 35793.1
+ },
+ "bands": [
+ 256
+ ],
+ "earfcn_ranges": [
+ {
+ "start_earfcn": 229360,
+ "end_earfcn": 229360
+ },
+ {
+ "start_earfcn": 229362,
+ "end_earfcn": 229362
+ },
+ {
+ "start_earfcn": 229364,
+ "end_earfcn": 229364
+ },
+ {
+ "start_earfcn": 229366,
+ "end_earfcn": 229366
+ }
+ ]
+ }
+ ],
+ "tag_ids": [
+ 101
+ ]
+ },
+ {
+ "config_id": 1,
+ "satellite_infos": [
+ {
+ "satellite_id": "c9d78ffa-ffa5-4d41-a81b-34693b33b496",
+ "satellite_position": {
+ "longitude": -101.3,
+ "altitude": 35786.0
+ },
+ "bands": [
+ 255
+ ],
+ "earfcn_ranges": [
+ {
+ "start_earfcn": 229011,
+ "end_earfcn": 229011
+ },
+ {
+ "start_earfcn": 229013,
+ "end_earfcn": 229013
+ },
+ {
+ "start_earfcn": 229015,
+ "end_earfcn": 229015
+ },
+ {
+ "start_earfcn": 229017,
+ "end_earfcn": 229017
+ }
+ ]
+ }
+ ],
+ "tag_ids": [
+ 11,
+ 1001
+ ]
+ },
+ {
+ "config_id": 2,
+ "satellite_infos": [
+ {
+ "satellite_id": "62de127d-ead1-481f-8524-b58e2664103a",
+ "satellite_position": {
+ "longitude": -98.0,
+ "altitude": 35775.1
+ },
+ "bands": [
+ 255
+ ],
+ "earfcn_ranges": [
+ {
+ "start_earfcn": 228837,
+ "end_earfcn": 228837
+ }
+ ]
+ }
+ ],
+ "tag_ids": [
+ 11,
+ 1001
+ ]
+ },
+ {
+ "config_id": 3,
+ "satellite_infos": [
+ {
+ "satellite_id": "62de127d-ead1-481f-8524-b58e2664103a",
+ "satellite_position": {
+ "longitude": -98.0,
+ "altitude": 35775.1
+ },
+ "bands": [
+ 255
+ ],
+ "earfcn_ranges": [
+ {
+ "start_earfcn": 228909,
+ "end_earfcn": 228909
+ },
+ {
+ "start_earfcn": 228919,
+ "end_earfcn": 228919
+ }
+ ]
+ }
+ ],
+ "tag_ids": [
+ 11
+ ]
+ },
+ {
+ "config_id": 4,
+ "satellite_infos": [
+ {
+ "satellite_id": "c9d78ffa-ffa5-4d41-a81b-34693b33b496",
+ "satellite_position": {
+ "longitude": -101.3,
+ "altitude": 35786.0
+ },
+ "bands": [
+ 255
+ ],
+ "earfcn_ranges": [
+ {
+ "start_earfcn": 229011,
+ "end_earfcn": 229011
+ },
+ {
+ "start_earfcn": 229013,
+ "end_earfcn": 229013
+ },
+ {
+ "start_earfcn": 229015,
+ "end_earfcn": 229015
+ },
+ {
+ "start_earfcn": 229017,
+ "end_earfcn": 229017
+ }
+ ]
+ }
+ ],
+ "tag_ids": [
+ 12
+ ]
+ },
+ {
+ "config_id": 5,
+ "satellite_infos": [
+ {
+ "satellite_id": "62de127d-ead1-481f-8524-b58e2664103a",
+ "satellite_position": {
+ "longitude": -98.0,
+ "altitude": 35775.1
+ },
+ "bands": [
+ 255
+ ],
+ "earfcn_ranges": [
+ {
+ "start_earfcn": 228919,
+ "end_earfcn": 228919
+ },
+ {
+ "start_earfcn": 228909,
+ "end_earfcn": 228909
+ }
+ ]
+ }
+ ],
+ "tag_ids": [
+ 11,
+ 1001
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/tests/res/raw/v15_sats2.dat b/tests/res/raw/v15_sats2.dat
new file mode 100644
index 0000000..b06872f
--- /dev/null
+++ b/tests/res/raw/v15_sats2.dat
Binary files differ
diff --git a/tests/res/raw/v16_satellite_access_config.json b/tests/res/raw/v16_satellite_access_config.json
new file mode 100644
index 0000000..48cc642
--- /dev/null
+++ b/tests/res/raw/v16_satellite_access_config.json
@@ -0,0 +1,267 @@
+{
+ "access_control_configs": [
+ {
+ "config_id": 0,
+ "satellite_infos": [
+ {
+ "satellite_id": "64998d22-17ce-47d2-bba9-1a2c72296e83",
+ "satellite_position": {
+ "longitude": 143.5,
+ "altitude": 35775.1
+ },
+ "bands": [
+ 255
+ ],
+ "earfcn_ranges": [
+ {
+ "start_earfcn": 229001,
+ "end_earfcn": 229001
+ },
+ {
+ "start_earfcn": 229003,
+ "end_earfcn": 229003
+ },
+ {
+ "start_earfcn": 229005,
+ "end_earfcn": 229005
+ },
+ {
+ "start_earfcn": 229007,
+ "end_earfcn": 229007
+ }
+ ]
+ }
+ ],
+ "tag_ids": [
+ 886
+ ]
+ },
+ {
+ "config_id": 1,
+ "satellite_infos": [
+ {
+ "satellite_id": "967f8e86-fc27-4673-9343-a820280a14dd",
+ "satellite_position": {
+ "longitude": 10.25,
+ "altitude": 35793.1
+ },
+ "bands": [
+ 256
+ ],
+ "earfcn_ranges": [
+ {
+ "start_earfcn": 229360,
+ "end_earfcn": 229360
+ },
+ {
+ "start_earfcn": 229362,
+ "end_earfcn": 229362
+ },
+ {
+ "start_earfcn": 229364,
+ "end_earfcn": 229364
+ },
+ {
+ "start_earfcn": 229366,
+ "end_earfcn": 229366
+ }
+ ]
+ }
+ ],
+ "tag_ids": [
+ 101
+ ]
+ },
+ {
+ "config_id": 2,
+ "satellite_infos": [
+ {
+ "satellite_id": "c9d78ffa-ffa5-4d41-a81b-34693b33b496",
+ "satellite_position": {
+ "longitude": -101.3,
+ "altitude": 35786.0
+ },
+ "bands": [
+ 255
+ ],
+ "earfcn_ranges": [
+ {
+ "start_earfcn": 229011,
+ "end_earfcn": 229011
+ },
+ {
+ "start_earfcn": 229013,
+ "end_earfcn": 229013
+ },
+ {
+ "start_earfcn": 229015,
+ "end_earfcn": 229015
+ },
+ {
+ "start_earfcn": 229017,
+ "end_earfcn": 229017
+ }
+ ]
+ }
+ ],
+ "tag_ids": [
+ 11,
+ 1001
+ ]
+ },
+ {
+ "config_id": 3,
+ "satellite_infos": [
+ {
+ "satellite_id": "795bfab9-2851-438e-8861-79e8c82acc5e",
+ "satellite_position": {
+ "longitude": 143.5,
+ "altitude": 35775.1
+ },
+ "bands": [
+ 255
+ ],
+ "earfcn_ranges": [
+ {
+ "start_earfcn": 229001,
+ "end_earfcn": 229001
+ },
+ {
+ "start_earfcn": 229003,
+ "end_earfcn": 229003
+ },
+ {
+ "start_earfcn": 229005,
+ "end_earfcn": 229005
+ },
+ {
+ "start_earfcn": 229007,
+ "end_earfcn": 229007
+ }
+ ]
+ }
+ ],
+ "tag_ids": [
+ 886
+ ]
+ },
+ {
+ "config_id": 4,
+ "satellite_infos": [
+ {
+ "satellite_id": "62de127d-ead1-481f-8524-b58e2664103a",
+ "satellite_position": {
+ "longitude": -98.0,
+ "altitude": 35775.1
+ },
+ "bands": [
+ 255
+ ],
+ "earfcn_ranges": [
+ {
+ "start_earfcn": 228837,
+ "end_earfcn": 228837
+ }
+ ]
+ }
+ ],
+ "tag_ids": [
+ 11,
+ 1001
+ ]
+ },
+ {
+ "config_id": 5,
+ "satellite_infos": [
+ {
+ "satellite_id": "62de127d-ead1-481f-8524-b58e2664103a",
+ "satellite_position": {
+ "longitude": -98.0,
+ "altitude": 35775.1
+ },
+ "bands": [
+ 255
+ ],
+ "earfcn_ranges": [
+ {
+ "start_earfcn": 228909,
+ "end_earfcn": 228909
+ },
+ {
+ "start_earfcn": 228919,
+ "end_earfcn": 228919
+ }
+ ]
+ }
+ ],
+ "tag_ids": [
+ 11
+ ]
+ },
+ {
+ "config_id": 6,
+ "satellite_infos": [
+ {
+ "satellite_id": "c9d78ffa-ffa5-4d41-a81b-34693b33b496",
+ "satellite_position": {
+ "longitude": -101.3,
+ "altitude": 35786.0
+ },
+ "bands": [
+ 255
+ ],
+ "earfcn_ranges": [
+ {
+ "start_earfcn": 229011,
+ "end_earfcn": 229011
+ },
+ {
+ "start_earfcn": 229013,
+ "end_earfcn": 229013
+ },
+ {
+ "start_earfcn": 229015,
+ "end_earfcn": 229015
+ },
+ {
+ "start_earfcn": 229017,
+ "end_earfcn": 229017
+ }
+ ]
+ }
+ ],
+ "tag_ids": [
+ 12
+ ]
+ },
+ {
+ "config_id": 7,
+ "satellite_infos": [
+ {
+ "satellite_id": "62de127d-ead1-481f-8524-b58e2664103a",
+ "satellite_position": {
+ "longitude": -98.0,
+ "altitude": 35775.1
+ },
+ "bands": [
+ 255
+ ],
+ "earfcn_ranges": [
+ {
+ "start_earfcn": 228919,
+ "end_earfcn": 228919
+ },
+ {
+ "start_earfcn": 228909,
+ "end_earfcn": 228909
+ }
+ ]
+ }
+ ],
+ "tag_ids": [
+ 11,
+ 1001
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/tests/res/raw/v16_sats2.dat b/tests/res/raw/v16_sats2.dat
new file mode 100644
index 0000000..d8ec415
--- /dev/null
+++ b/tests/res/raw/v16_sats2.dat
Binary files differ
diff --git a/tests/res/raw/v17_satellite_access_config.json b/tests/res/raw/v17_satellite_access_config.json
new file mode 100644
index 0000000..fd5257e
--- /dev/null
+++ b/tests/res/raw/v17_satellite_access_config.json
@@ -0,0 +1,195 @@
+{
+ "access_control_configs": [
+ {
+ "config_id": 0,
+ "satellite_infos": [
+ {
+ "satellite_id": "967f8e86-fc27-4673-9343-a820280a14dd",
+ "satellite_position": {
+ "longitude": 10.25,
+ "altitude": 35793.1
+ },
+ "bands": [
+ 256
+ ],
+ "earfcn_ranges": [
+ {
+ "start_earfcn": 229360,
+ "end_earfcn": 229360
+ },
+ {
+ "start_earfcn": 229362,
+ "end_earfcn": 229362
+ },
+ {
+ "start_earfcn": 229364,
+ "end_earfcn": 229364
+ },
+ {
+ "start_earfcn": 229366,
+ "end_earfcn": 229366
+ }
+ ]
+ }
+ ],
+ "tag_ids": [
+ 101
+ ]
+ },
+ {
+ "config_id": 1,
+ "satellite_infos": [
+ {
+ "satellite_id": "c9d78ffa-ffa5-4d41-a81b-34693b33b496",
+ "satellite_position": {
+ "longitude": -101.3,
+ "altitude": 35786.0
+ },
+ "bands": [
+ 255
+ ],
+ "earfcn_ranges": [
+ {
+ "start_earfcn": 229011,
+ "end_earfcn": 229011
+ },
+ {
+ "start_earfcn": 229013,
+ "end_earfcn": 229013
+ },
+ {
+ "start_earfcn": 229015,
+ "end_earfcn": 229015
+ },
+ {
+ "start_earfcn": 229017,
+ "end_earfcn": 229017
+ }
+ ]
+ }
+ ],
+ "tag_ids": [
+ 11,
+ 1001
+ ]
+ },
+ {
+ "config_id": 2,
+ "satellite_infos": [
+ {
+ "satellite_id": "62de127d-ead1-481f-8524-b58e2664103a",
+ "satellite_position": {
+ "longitude": -98.0,
+ "altitude": 35775.1
+ },
+ "bands": [
+ 255
+ ],
+ "earfcn_ranges": [
+ {
+ "start_earfcn": 228837,
+ "end_earfcn": 228837
+ }
+ ]
+ }
+ ],
+ "tag_ids": [
+ 11,
+ 1001
+ ]
+ },
+ {
+ "config_id": 3,
+ "satellite_infos": [
+ {
+ "satellite_id": "62de127d-ead1-481f-8524-b58e2664103a",
+ "satellite_position": {
+ "longitude": -98.0,
+ "altitude": 35775.1
+ },
+ "bands": [
+ 255
+ ],
+ "earfcn_ranges": [
+ {
+ "start_earfcn": 228909,
+ "end_earfcn": 228909
+ },
+ {
+ "start_earfcn": 228919,
+ "end_earfcn": 228919
+ }
+ ]
+ }
+ ],
+ "tag_ids": [
+ 11
+ ]
+ },
+ {
+ "config_id": 4,
+ "satellite_infos": [
+ {
+ "satellite_id": "c9d78ffa-ffa5-4d41-a81b-34693b33b496",
+ "satellite_position": {
+ "longitude": -101.3,
+ "altitude": 35786.0
+ },
+ "bands": [
+ 255
+ ],
+ "earfcn_ranges": [
+ {
+ "start_earfcn": 229011,
+ "end_earfcn": 229011
+ },
+ {
+ "start_earfcn": 229013,
+ "end_earfcn": 229013
+ },
+ {
+ "start_earfcn": 229015,
+ "end_earfcn": 229015
+ },
+ {
+ "start_earfcn": 229017,
+ "end_earfcn": 229017
+ }
+ ]
+ }
+ ],
+ "tag_ids": [
+ 12
+ ]
+ },
+ {
+ "config_id": 5,
+ "satellite_infos": [
+ {
+ "satellite_id": "62de127d-ead1-481f-8524-b58e2664103a",
+ "satellite_position": {
+ "longitude": -98.0,
+ "altitude": 35775.1
+ },
+ "bands": [
+ 255
+ ],
+ "earfcn_ranges": [
+ {
+ "start_earfcn": 228919,
+ "end_earfcn": 228919
+ },
+ {
+ "start_earfcn": 228909,
+ "end_earfcn": 228909
+ }
+ ]
+ }
+ ],
+ "tag_ids": [
+ 11,
+ 1001
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/tests/res/raw/v17_sats2.dat b/tests/res/raw/v17_sats2.dat
new file mode 100644
index 0000000..b06872f
--- /dev/null
+++ b/tests/res/raw/v17_sats2.dat
Binary files differ
diff --git a/tests/src/com/android/phone/satellite/accesscontrol/SatelliteAccessControllerTest.java b/tests/src/com/android/phone/satellite/accesscontrol/SatelliteAccessControllerTest.java
index 3798790..f61455d 100644
--- a/tests/src/com/android/phone/satellite/accesscontrol/SatelliteAccessControllerTest.java
+++ b/tests/src/com/android/phone/satellite/accesscontrol/SatelliteAccessControllerTest.java
@@ -44,6 +44,7 @@
import static com.android.phone.satellite.accesscontrol.SatelliteAccessController.EVENT_KEEP_ON_DEVICE_ACCESS_CONTROLLER_RESOURCES_TIMEOUT;
import static com.android.phone.satellite.accesscontrol.SatelliteAccessController.EVENT_WAIT_FOR_CURRENT_LOCATION_TIMEOUT;
import static com.android.phone.satellite.accesscontrol.SatelliteAccessController.GOOGLE_US_SAN_SAT_S2_FILE_NAME;
+import static com.android.phone.satellite.accesscontrol.SatelliteAccessController.SATELLITE_ACCESS_CONFIG_FILE_NAME;
import static com.android.phone.satellite.accesscontrol.SatelliteAccessController.UNKNOWN_REGIONAL_SATELLITE_CONFIG_ID;
import static org.junit.Assert.assertArrayEquals;
@@ -53,7 +54,6 @@
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
-import static org.junit.Assume.assumeTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
@@ -136,6 +136,9 @@
import org.mockito.Mock;
import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
@@ -317,6 +320,7 @@
@Before
public void setUp() throws Exception {
+ logd("SatelliteAccessControllerTest setUp");
super.setUp();
mMockContext = mContext;
@@ -338,6 +342,12 @@
return InstrumentationRegistry.getTargetContext()
.getDir((String) args[0], (Integer) args[1]);
}).when(mPhoneGlobals).getDir(anyString(), anyInt());
+ doAnswer(
+ inv -> {
+ return InstrumentationRegistry.getTargetContext().getAssets();
+ })
+ .when(mPhoneGlobals)
+ .getAssets();
mPhones = new Phone[]{mMockPhone, mMockPhone2};
replaceInstance(PhoneFactory.class, "sPhones", null, mPhones);
replaceInstance(SatelliteController.class, "sInstance", null,
@@ -431,6 +441,7 @@
new ArrayList<>(Arrays.asList(5, 30)),
new ArrayList<>(Arrays.asList(new EarfcnRange(0, 250))));
+ logd("setUp: Initializing mSatelliteAccessControllerUT:TestSatelliteAccessController");
mSatelliteAccessControllerUT = new TestSatelliteAccessController(mMockContext,
mMockFeatureFlags, mTestableLooper.getLooper(), mMockLocationManager,
mMockTelecomManager, mMockSatelliteOnDeviceAccessController, mMockSatS2File);
@@ -1469,6 +1480,7 @@
@Test
public void testUpdateSatelliteConfigData() throws Exception {
+ logd("registering for config update changed");
verify(mMockSatelliteController).registerForConfigUpdateChanged(
mConfigUpdateHandlerCaptor.capture(), mConfigUpdateIntCaptor.capture(),
mConfigUpdateObjectCaptor.capture());
@@ -1477,14 +1489,17 @@
assertSame(mConfigUpdateIntCaptor.getValue(), EVENT_CONFIG_DATA_UPDATED);
assertSame(mConfigUpdateObjectCaptor.getValue(), mMockContext);
+ logd("replacing instance for mCachedAccessRestrictionMap");
replaceInstance(SatelliteAccessController.class, "mCachedAccessRestrictionMap",
mSatelliteAccessControllerUT, mMockCachedAccessRestrictionMap);
// These APIs are executed during loadRemoteConfigs
+ logd("verify load remote configs shared preferences method calls");
verify(mMockSharedPreferences, times(1)).getStringSet(anyString(), any());
verify(mMockSharedPreferences, times(5)).getBoolean(anyString(), anyBoolean());
// satelliteConfig is null
+ logd("test for satelliteConfig is null");
SatelliteConfigParser spyConfigParser =
spy(new SatelliteConfigParser("test".getBytes()));
doReturn(spyConfigParser).when(mMockSatelliteController).getSatelliteConfigParser();
@@ -1493,8 +1508,10 @@
sendConfigUpdateChangedEvent(mMockContext);
verify(mMockSharedPreferences, never()).edit();
verify(mMockCachedAccessRestrictionMap, never()).clear();
+ verify(mMockSatelliteController, times(1)).getSatelliteConfig();
// satelliteConfig has invalid country codes
+ logd("test for satelliteConfig with invalid country codes");
SatelliteConfig mockConfig = mock(SatelliteConfig.class);
doReturn(List.of("USA", "JAP")).when(mockConfig).getDeviceSatelliteCountryCodes();
doReturn(mockConfig).when(mMockSatelliteController).getSatelliteConfig();
@@ -1503,8 +1520,14 @@
sendConfigUpdateChangedEvent(mMockContext);
verify(mMockSharedPreferences, never()).edit();
verify(mMockCachedAccessRestrictionMap, never()).clear();
+ verify(mMockSatelliteController, times(2)).getSatelliteConfig();
+ verify(mockConfig, times(1)).getDeviceSatelliteCountryCodes();
+ verify(mockConfig, times(0)).isSatelliteDataForAllowedRegion();
+ verify(mockConfig, times(0)).getSatelliteS2CellFile(mMockContext);
+ verify(mockConfig, times(0)).getSatelliteAccessConfigJsonFile(mMockContext);
// satelliteConfig does not have is_allow_access_control data
+ logd("test for satelliteConfig does not have is_allow_access_control data");
doReturn(List.of(TEST_SATELLITE_COUNTRY_CODES))
.when(mockConfig).getDeviceSatelliteCountryCodes();
doReturn(null).when(mockConfig).isSatelliteDataForAllowedRegion();
@@ -1512,32 +1535,439 @@
sendConfigUpdateChangedEvent(mMockContext);
verify(mMockSharedPreferences, never()).edit();
verify(mMockCachedAccessRestrictionMap, never()).clear();
+ verify(mMockSatelliteController, times(3)).getSatelliteConfig();
+ verify(mockConfig, times(2)).getDeviceSatelliteCountryCodes();
+ verify(mockConfig, times(1)).isSatelliteDataForAllowedRegion();
+ verify(mockConfig, times(0)).getSatelliteS2CellFile(mMockContext);
+ verify(mockConfig, times(0)).getSatelliteAccessConfigJsonFile(mMockContext);
- // satelliteConfig doesn't have S2CellFile
- File mockFile = mock(File.class);
- doReturn(false).when(mockFile).exists();
+ // satelliteConfig doesn't have both S2CellFile and satellite access config json file
+ logd(
+ "test for satelliteConfig doesn't have both S2CellFile and satellite access config"
+ + " json file");
+ File mockS2File = mock(File.class);
+ doReturn(false).when(mockS2File).exists();
+ File mockSatelliteAccessConfigJsonFile = mock(File.class);
+ doReturn(false).when(mockSatelliteAccessConfigJsonFile).exists();
doReturn(List.of(TEST_SATELLITE_COUNTRY_CODES))
.when(mockConfig).getDeviceSatelliteCountryCodes();
doReturn(true).when(mockConfig).isSatelliteDataForAllowedRegion();
- doReturn(mockFile).when(mockConfig).getSatelliteS2CellFile(mMockContext);
+ doReturn(mockS2File).when(mockConfig).getSatelliteS2CellFile(mMockContext);
+ doReturn(mockSatelliteAccessConfigJsonFile)
+ .when(mockConfig)
+ .getSatelliteAccessConfigJsonFile(mMockContext);
sendConfigUpdateChangedEvent(mMockContext);
verify(mMockSharedPreferences, never()).edit();
verify(mMockCachedAccessRestrictionMap, never()).clear();
+ verify(mMockSatelliteController, times(4)).getSatelliteConfig();
+ verify(mockConfig, times(3)).getDeviceSatelliteCountryCodes();
+ verify(mockConfig, times(2)).isSatelliteDataForAllowedRegion();
+ verify(mockConfig, times(1)).getSatelliteS2CellFile(mMockContext);
+ verify(mockConfig, times(0)).getSatelliteAccessConfigJsonFile(mMockContext);
- // satelliteConfig has valid data
+ // satelliteConfig has s2CellFill, but doesn't have satellite access config json file
+ logd(
+ "test for satelliteConfig having s2CellFill, but doesn't have satellite access"
+ + " config json file");
doReturn(mockConfig).when(mMockSatelliteController).getSatelliteConfig();
File testS2File = mSatelliteAccessControllerUT
.getTestSatelliteS2File(GOOGLE_US_SAN_SAT_S2_FILE_NAME);
- assumeTrue("Satellite not supported", testS2File != null && testS2File.exists());
+ assertTrue("Test S2 file not created", testS2File != null && testS2File.exists());
+ mockSatelliteAccessConfigJsonFile = mock(File.class);
+ doReturn(false).when(mockSatelliteAccessConfigJsonFile).exists();
doReturn(List.of(TEST_SATELLITE_COUNTRY_CODES))
.when(mockConfig).getDeviceSatelliteCountryCodes();
doReturn(true).when(mockConfig).isSatelliteDataForAllowedRegion();
doReturn(testS2File).when(mockConfig).getSatelliteS2CellFile(mMockContext);
+ doReturn(mockSatelliteAccessConfigJsonFile)
+ .when(mockConfig)
+ .getSatelliteAccessConfigJsonFile(mMockContext);
+
+ sendConfigUpdateChangedEvent(mMockContext);
+ verify(mMockSharedPreferences, never()).edit();
+ verify(mMockCachedAccessRestrictionMap, never()).clear();
+ verify(mMockSatelliteController, times(5)).getSatelliteConfig();
+ verify(mockConfig, times(4)).getDeviceSatelliteCountryCodes();
+ verify(mockConfig, times(3)).isSatelliteDataForAllowedRegion();
+ verify(mockConfig, times(2)).getSatelliteS2CellFile(mMockContext);
+ verify(mockConfig, times(1)).getSatelliteAccessConfigJsonFile(mMockContext);
+
+ // satelliteConfig has valid data
+ logd("test for satelliteConfig having valid data");
+ doReturn(true).when(mockConfig).isSatelliteDataForAllowedRegion();
+ doReturn(List.of(TEST_SATELLITE_COUNTRY_CODES))
+ .when(mockConfig)
+ .getDeviceSatelliteCountryCodes();
+ testS2File =
+ mSatelliteAccessControllerUT.getTestSatelliteS2File(GOOGLE_US_SAN_SAT_S2_FILE_NAME);
+ assertTrue("Test S2 file not created", testS2File != null && testS2File.exists());
+ doReturn(testS2File).when(mockConfig).getSatelliteS2CellFile(mMockContext);
+ File testSatelliteAccessConfigFile =
+ mSatelliteAccessControllerUT.getTestSatelliteConfiguration(
+ SATELLITE_ACCESS_CONFIG_FILE_NAME);
+ assertTrue(
+ "Test satellite access config file not created",
+ testSatelliteAccessConfigFile != null && testSatelliteAccessConfigFile.exists());
+ doReturn(testSatelliteAccessConfigFile)
+ .when(mockConfig)
+ .getSatelliteAccessConfigJsonFile(mMockContext);
sendConfigUpdateChangedEvent(mMockContext);
verify(mMockSharedPreferences, times(2)).edit();
verify(mMockCachedAccessRestrictionMap, times(1)).clear();
+ verify(mMockSatelliteController, times(6)).getSatelliteConfig();
+ verify(mockConfig, times(5)).getDeviceSatelliteCountryCodes();
+ verify(mockConfig, times(5)).isSatelliteDataForAllowedRegion();
+ verify(mockConfig, times(3)).getSatelliteS2CellFile(mMockContext);
+ verify(mockConfig, times(2)).getSatelliteAccessConfigJsonFile(mMockContext);
+ }
+
+ private String setupTestFileFromRawResource(int resId, String targetFileName)
+ throws IOException {
+ logd("setting up rest file for resId: " + resId + ", targetFileName: " + targetFileName);
+ Context context = InstrumentationRegistry.getInstrumentation().getContext();
+ InputStream is = context.getResources().openRawResource(resId);
+ logd("Copying test file to temp_satellite_config_update");
+ File tempDir =
+ InstrumentationRegistry.getInstrumentation()
+ .getTargetContext()
+ .getDir("temp_satellite_config_update", Context.MODE_PRIVATE);
+ File tempFile = new File(tempDir, targetFileName);
+ FileOutputStream fos = new FileOutputStream(tempFile);
+ byte[] buffer = new byte[1024];
+ int length;
+ while ((length = is.read(buffer)) > 0) {
+ fos.write(buffer, 0, length);
+ }
+ is.close();
+ fos.close();
+ return tempFile.getAbsolutePath();
+ }
+
+ private boolean isLocationAllowed(
+ ArgumentCaptor<Bundle> bundleCaptor,
+ Iterator<ResultReceiver> mockResultReceiverIterator,
+ Location location)
+ throws Exception {
+ clearInvocations(mMockResultReceiver);
+ when(mMockLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER))
+ .thenReturn(location);
+ when(mMockLocationManager.getLastKnownLocation(LocationManager.FUSED_PROVIDER))
+ .thenReturn(location);
+ doReturn(true, false).when(mockResultReceiverIterator).hasNext();
+ mSatelliteAccessControllerUT.checkSatelliteAccessRestrictionForLocation(location);
+ verify(mMockResultReceiver, times(1))
+ .send(mResultCodeIntCaptor.capture(), bundleCaptor.capture());
+ if (mResultCodeIntCaptor.getValue() != SATELLITE_RESULT_SUCCESS) return false;
+ return bundleCaptor.getValue().getBoolean(KEY_SATELLITE_COMMUNICATION_ALLOWED);
+ }
+
+ private void setupOnDeviceGeofenceData(
+ int sats2ResId,
+ String targetSats2FileName,
+ int satelliteAccessConfigResId,
+ String targetSatelliteAccessConfigFileName)
+ throws Exception {
+ logd("setting up on device geofence data");
+
+ logd("Clearing on device geofence data");
+ sendSatelliteDeviceAccessControllerResourcesTimeOutEvent();
+
+ logd("Creating sats2.dat and satellite_access_config.json files");
+ // set given sats2.dat and satellite_access_config.json as device geofence files
+ String sats2FilePath = setupTestFileFromRawResource(sats2ResId, targetSats2FileName);
+ when(mMockResources.getString(
+ com.android.internal.R.string.config_oem_enabled_satellite_s2cell_file))
+ .thenReturn(sats2FilePath);
+ String satelliteAccessConfigFilePath =
+ setupTestFileFromRawResource(
+ satelliteAccessConfigResId, targetSatelliteAccessConfigFileName);
+ when(mMockResources.getString(com.android.internal.R.string.satellite_access_config_file))
+ .thenReturn(satelliteAccessConfigFilePath);
+ mSatelliteAccessControllerUT.loadOverlayConfigs(mMockContext);
+ }
+
+ private void setupOtaGeofenceData(
+ SatelliteConfig mockConfig,
+ int sats2ResId,
+ String targetSats2FileName,
+ int satelliteAccessConfigResId,
+ String targetSatelliteAccessConfigFileName,
+ String[] countryCodes)
+ throws Exception {
+ String sats2FilePath = setupTestFileFromRawResource(sats2ResId, targetSats2FileName);
+ String satelliteAccessConfigFilePath =
+ setupTestFileFromRawResource(
+ satelliteAccessConfigResId, targetSatelliteAccessConfigFileName);
+
+ File sats2File = new File(sats2FilePath);
+ assertTrue("OTA geofence S2 file not created", sats2File != null && sats2File.exists());
+ doReturn(sats2File).when(mockConfig).getSatelliteS2CellFile(mMockContext);
+
+ File satelliteAccessConfigFile = new File(satelliteAccessConfigFilePath);
+ assertTrue(
+ "OTA geofence satellite access config file not created",
+ satelliteAccessConfigFile != null && satelliteAccessConfigFile.exists());
+ doReturn(satelliteAccessConfigFile)
+ .when(mockConfig)
+ .getSatelliteAccessConfigJsonFile(mMockContext);
+
+ doReturn(true).when(mockConfig).isSatelliteDataForAllowedRegion();
+ doReturn(List.of(TEST_SATELLITE_COUNTRY_CODES))
+ .when(mockConfig)
+ .getDeviceSatelliteCountryCodes();
+ }
+
+ private boolean areOnDeviceAndOtaFilesValidAndDifferent(
+ File onDeviceSats2File,
+ File onDeviceSatelliteAccessConfigFile,
+ File otaSats2File,
+ File otaSatelliteAccessConfigFile) {
+ if (onDeviceSats2File == null
+ || onDeviceSatelliteAccessConfigFile == null
+ || otaSats2File == null
+ || otaSatelliteAccessConfigFile == null) {
+ throw new AssertionError("Both on device and OTA files should NOT be null");
+ }
+ String onDeviceSats2FileAbsPath = onDeviceSats2File.getAbsolutePath();
+ String onDeviceSatelliteAccessConfigFileAbsPath =
+ onDeviceSatelliteAccessConfigFile.getAbsolutePath();
+ String otaSats2FileAbsPath = otaSats2File.getAbsolutePath();
+ String otaSatelliteAccessConfigFileAbsPath = otaSatelliteAccessConfigFile.getAbsolutePath();
+
+ logd("onDeviceSats2FileAbsPath: " + onDeviceSats2FileAbsPath);
+ logd(
+ "onDeviceSatelliteAccessConfigFileAbsPath: "
+ + onDeviceSatelliteAccessConfigFileAbsPath);
+ logd("otaSats2FileAbsPath: " + otaSats2FileAbsPath);
+ logd("otaSatelliteAccessConfigFileAbsPath: " + otaSatelliteAccessConfigFileAbsPath);
+
+ if (onDeviceSats2FileAbsPath.equals(otaSats2FileAbsPath)
+ || onDeviceSatelliteAccessConfigFileAbsPath.equals(otaSatelliteAccessConfigFile)) {
+ return false;
+ }
+
+ logd("areOnDeviceAndOtaFilesValidAndDifferent: true");
+ return true;
+ }
+
+ @Test
+ public void testConfigUpdateAndCorrespondingSatelliteAllowedAtLocationChecks()
+ throws Exception {
+ replaceInstance(
+ SatelliteAccessController.class,
+ "mS2Level",
+ mSatelliteAccessControllerUT,
+ DEFAULT_S2_LEVEL);
+ when(mMockFeatureFlags.carrierRoamingNbIotNtn()).thenReturn(true);
+ when(mMockFeatureFlags.oemEnabledSatelliteFlag()).thenReturn(true);
+ when(mMockContext.getResources()).thenReturn(mMockResources);
+ when(mMockResources.getBoolean(
+ com.android.internal.R.bool.config_oem_enabled_satellite_access_allow))
+ .thenReturn(TEST_SATELLITE_ALLOW);
+ setUpResponseForRequestIsSatelliteSupported(true, SATELLITE_RESULT_SUCCESS);
+ setUpResponseForRequestIsSatelliteProvisioned(true, SATELLITE_RESULT_SUCCESS);
+ doReturn(true).when(mMockLocationManager).isLocationEnabled();
+
+ ArgumentCaptor<Bundle> bundleCaptor = ArgumentCaptor.forClass(Bundle.class);
+ Iterator<ResultReceiver> mockResultReceiverIterator = mock(Iterator.class);
+ doReturn(mockResultReceiverIterator).when(mMockSatelliteAllowResultReceivers).iterator();
+ doNothing().when(mMockSatelliteAllowResultReceivers).clear();
+ doReturn(mMockResultReceiver).when(mockResultReceiverIterator).next();
+ replaceInstance(
+ SatelliteAccessController.class,
+ "mSatelliteAllowResultReceivers",
+ mSatelliteAccessControllerUT,
+ mMockSatelliteAllowResultReceivers);
+ replaceInstance(
+ SatelliteAccessController.class,
+ "mCachedAccessRestrictionMap",
+ mSatelliteAccessControllerUT,
+ mMockCachedAccessRestrictionMap);
+
+ SatelliteConfig mockConfig = mock(SatelliteConfig.class);
+ doReturn(mockConfig).when(mMockSatelliteController).getSatelliteConfig();
+
+ Location locationUS = mock(Location.class);
+ when(locationUS.getLatitude()).thenReturn(37.7749);
+ when(locationUS.getLongitude()).thenReturn(-122.4194);
+ Location locationKR = mock(Location.class);
+ when(locationKR.getLatitude()).thenReturn(37.5665);
+ when(locationKR.getLongitude()).thenReturn(126.9780);
+ Location locationTW = mock(Location.class);
+ when(locationTW.getLatitude()).thenReturn(25.034);
+ when(locationTW.getLongitude()).thenReturn(121.565);
+
+ // Test v15 geofence data - supports US location
+ // set v15's sats2.dat and satellite_access_config.json as device geofence files and
+ // verify for below locations are allowed or not for satellite commiunication as expected.
+ // location1 - US - allowed; location2 - KR - not allowed; location3 - TW - not allowed;
+ logd(
+ "Step 1: Testing v15 (US) satellite config files. Expectation: locationUS -"
+ + " allowed; locationKR - not allowed; locationTW - not allowed");
+ setupOnDeviceGeofenceData(
+ com.android.phone.tests.R.raw.v15_sats2,
+ "v15_sats2.dat",
+ com.android.phone.tests.R.raw.v15_satellite_access_config,
+ "v15_satellite_access_config.json");
+ assertTrue(isLocationAllowed(bundleCaptor, mockResultReceiverIterator, locationUS));
+ assertFalse(isLocationAllowed(bundleCaptor, mockResultReceiverIterator, locationKR));
+ assertFalse(isLocationAllowed(bundleCaptor, mockResultReceiverIterator, locationTW));
+ Map<Integer, SatelliteAccessConfiguration> satelliteAccessConfigurationMap =
+ mSatelliteAccessControllerUT.getSatelliteAccessConfigMap();
+ logd("Obatined satelliteAccessConfigurationMap: " + satelliteAccessConfigurationMap);
+ assertEquals(6, satelliteAccessConfigurationMap.size());
+ assertEquals(
+ "62de127d-ead1-481f-8524-b58e2664103a",
+ satelliteAccessConfigurationMap
+ .get(5)
+ .getSatelliteInfos()
+ .get(0)
+ .getSatelliteId()
+ .toString());
+ assertEquals(
+ -98.0,
+ satelliteAccessConfigurationMap
+ .get(5)
+ .getSatelliteInfos()
+ .get(0)
+ .getSatellitePosition()
+ .getLongitudeDegrees(),
+ 0.001);
+ assertEquals(
+ 35775.1,
+ satelliteAccessConfigurationMap
+ .get(5)
+ .getSatelliteInfos()
+ .get(0)
+ .getSatellitePosition()
+ .getAltitudeKm(),
+ 0.001);
+ File onDeviceSats2File = mSatelliteAccessControllerUT.getSatelliteS2CellFile();
+ File onDeviceSatelliteAccessConfigFile =
+ mSatelliteAccessControllerUT.getSatelliteAccessConfigFile();
+
+ // Test v16 geofence data - supports US, KR, TW locations
+ // Simulate config update to override v16's sats2.dat and satellite_access_config.json
+ // as the geofence files.
+ // And verify for below locations are allowed or not for satellite commiunication as
+ // expected.
+ // location1 - US - allowed; location2 - KR - allowed; location3 - TW - allowed;
+ logd(
+ "Step 2: Testing v16 (US, KR, TW) satellite config files."
+ + " Simulate config update for v16 files. Expectation: locationUS -"
+ + " allowed; locationKR - allowed; locationTW - allowed");
+ setupOtaGeofenceData(
+ mockConfig,
+ com.android.phone.tests.R.raw.v16_sats2,
+ "v16_sats2.dat",
+ com.android.phone.tests.R.raw.v16_satellite_access_config,
+ "v16_satellite_access_config.json",
+ new String[] {"US", "CA", "UK", "KR", "TW"});
+ sendConfigUpdateChangedEvent(mMockContext);
+ assertTrue(isLocationAllowed(bundleCaptor, mockResultReceiverIterator, locationUS));
+ assertTrue(isLocationAllowed(bundleCaptor, mockResultReceiverIterator, locationKR));
+ assertTrue(isLocationAllowed(bundleCaptor, mockResultReceiverIterator, locationTW));
+ satelliteAccessConfigurationMap =
+ mSatelliteAccessControllerUT.getSatelliteAccessConfigMap();
+ logd("Obatined satelliteAccessConfigurationMap: " + satelliteAccessConfigurationMap);
+ assertEquals(8, satelliteAccessConfigurationMap.size());
+ assertEquals(
+ "c9d78ffa-ffa5-4d41-a81b-34693b33b496",
+ satelliteAccessConfigurationMap
+ .get(6)
+ .getSatelliteInfos()
+ .get(0)
+ .getSatelliteId()
+ .toString());
+ assertEquals(
+ -101.3,
+ satelliteAccessConfigurationMap
+ .get(6)
+ .getSatelliteInfos()
+ .get(0)
+ .getSatellitePosition()
+ .getLongitudeDegrees(),
+ 0.001);
+ assertEquals(
+ 35786.0,
+ satelliteAccessConfigurationMap
+ .get(6)
+ .getSatelliteInfos()
+ .get(0)
+ .getSatellitePosition()
+ .getAltitudeKm(),
+ 0.001);
+ File otaSats2File = mSatelliteAccessControllerUT.getSatelliteS2CellFile();
+ File otaSatelliteAccessConfigFile =
+ mSatelliteAccessControllerUT.getSatelliteAccessConfigFile();
+ assertTrue(
+ areOnDeviceAndOtaFilesValidAndDifferent(
+ onDeviceSats2File,
+ onDeviceSatelliteAccessConfigFile,
+ otaSats2File,
+ otaSatelliteAccessConfigFile));
+
+ // Test v17 geofence data - supports US location
+ // Simulate config update to override v17's sats2.dat and satellite_access_config.json
+ // as the geofence files.
+ // And verify for below locations are allowed or not for satellite commiunication as
+ // expected.
+ // location1 - US - allowed; location2 - KR - not allowed; location3 - TW - not allowed;
+ logd(
+ "Step 3: Testing v17 (US) satellite config files."
+ + " Simulate config update for v17 files. Expectation: locationUS -"
+ + " allowed; locationKR - not allowed; locationTW - not allowed");
+ setupOtaGeofenceData(
+ mockConfig,
+ com.android.phone.tests.R.raw.v17_sats2,
+ "v17_sats2.dat",
+ com.android.phone.tests.R.raw.v17_satellite_access_config,
+ "v17_satellite_access_config.json",
+ new String[] {"US", "CA", "UK", "KR", "TW"});
+ sendConfigUpdateChangedEvent(mMockContext);
+ assertTrue(isLocationAllowed(bundleCaptor, mockResultReceiverIterator, locationUS));
+ assertFalse(isLocationAllowed(bundleCaptor, mockResultReceiverIterator, locationKR));
+ assertFalse(isLocationAllowed(bundleCaptor, mockResultReceiverIterator, locationTW));
+ satelliteAccessConfigurationMap =
+ mSatelliteAccessControllerUT.getSatelliteAccessConfigMap();
+ logd("Obatined satelliteAccessConfigurationMap: " + satelliteAccessConfigurationMap);
+ assertEquals(6, satelliteAccessConfigurationMap.size());
+ assertEquals(
+ "62de127d-ead1-481f-8524-b58e2664103a",
+ satelliteAccessConfigurationMap
+ .get(5)
+ .getSatelliteInfos()
+ .get(0)
+ .getSatelliteId()
+ .toString());
+ assertEquals(
+ -98.0,
+ satelliteAccessConfigurationMap
+ .get(5)
+ .getSatelliteInfos()
+ .get(0)
+ .getSatellitePosition()
+ .getLongitudeDegrees(),
+ 0.001);
+ assertEquals(
+ 35775.1,
+ satelliteAccessConfigurationMap
+ .get(5)
+ .getSatelliteInfos()
+ .get(0)
+ .getSatellitePosition()
+ .getAltitudeKm(),
+ 0.001);
+ otaSats2File = mSatelliteAccessControllerUT.getSatelliteS2CellFile();
+ otaSatelliteAccessConfigFile = mSatelliteAccessControllerUT.getSatelliteAccessConfigFile();
+ assertTrue(
+ areOnDeviceAndOtaFilesValidAndDifferent(
+ onDeviceSats2File,
+ onDeviceSatelliteAccessConfigFile,
+ otaSats2File,
+ otaSatelliteAccessConfigFile));
}
@Test
@@ -2061,6 +2491,7 @@
}
private void sendSatelliteDeviceAccessControllerResourcesTimeOutEvent() {
+ logd("sendSatelliteDeviceAccessControllerResourcesTimeOutEvent");
Message msg = mSatelliteAccessControllerUT
.obtainMessage(EVENT_KEEP_ON_DEVICE_ACCESS_CONTROLLER_RESOURCES_TIMEOUT);
msg.sendToTarget();
@@ -2318,5 +2749,11 @@
}
}
}
+
+ public Map<Integer, SatelliteAccessConfiguration> getSatelliteAccessConfigMap() {
+ synchronized (mLock) {
+ return mSatelliteAccessConfigMap;
+ }
+ }
}
}