| from acts_contrib.test_utils.instrumentation.device.apps.app_installer import AppInstaller |
| from acts_contrib.test_utils.instrumentation.power import instrumentation_power_test |
| |
| import time |
| |
| |
| class ApolloBaseTest(instrumentation_power_test.InstrumentationPowerTest): |
| """Test class for running instrumentation test idle system cases. |
| |
| Many functions shamelessly copied from: |
| google3/wireless/android/apollo/test/lib/apollo_decorator.py |
| """ |
| |
| def __init__(self, configs): |
| super().__init__(configs) |
| self.supported_hooks = {'start', 'stop'} |
| self._apk_install_wait_time_seconds = 5 |
| self._scan_interval_seconds = None |
| self._scan_time_seconds = None |
| # TODO: remove once b/156301031 is resolved |
| self._disable_consent_dialog = True |
| |
| def _prepare_device(self): |
| super()._prepare_device() |
| self.base_device_configuration() |
| |
| def setup_test(self): |
| super().setup_test() |
| # clear command options that won't work on OEM devices. |
| self._instr_cmd_builder.set_output_as_text() |
| self._instr_cmd_builder.remove_flag('--no-isolated-storage') |
| |
| def _set_nearby_phenotype_flag(self, flag_name, flag_type, flag_value): |
| self.adb_run(f'am broadcast -a "com.google.android.gms.phenotype.FLAG_OVERRIDE" --es package "com.google.android.gms.nearby" ' \ |
| f'--es user "*" --esa flags "{flag_name}" --esa values "{flag_value}" --esa types "{flag_type}" com.google.android.gms') |
| |
| def _set_installation_overrides(self): |
| self._set_nearby_phenotype_flag('exposure_notification_enable_client_apps_whitelist', 'boolean', 'false') |
| if self._disable_consent_dialog: |
| self._set_nearby_phenotype_flag('exposure_notification_use_consent_dialog_for_all_clients', 'boolean', 'false') |
| |
| # Scanning interval and scanning time need to be set here, before scanning starts |
| if self._scan_interval_seconds: |
| self._set_nearby_phenotype_flag('contact_tracing_scan_interval_second', 'long', str(self._scan_interval_seconds)) |
| if self._scan_time_seconds: |
| self._set_nearby_phenotype_flag('contact_tracing_scan_time_second', 'long', str(self._scan_time_seconds)) |
| |
| def _start_scanning(self): |
| self._issue_apollo_test_hook_command('start') |
| |
| def _issue_apollo_test_hook_command(self, hook_command, payload=None, time_to_wait_seconds=10): |
| if hook_command not in self.supported_hooks: |
| raise ValueError(f'Unsupported apollo test hook {hook_command}') |
| # Send a hook command, which is handled by the apollo test APK |
| self.adb_run(f'am start-foreground-service -a {hook_command} com.google.android.apps.exposurenotification/.debug.HookService') |
| # Wait for success and timeout on a failure. The test app does not explicitly tell you if the call failed. |
| start_time = time.time() |
| while time.time() - start_time < time_to_wait_seconds: |
| if self.ad_dut.search_logcat(f'HookService: Success:{hook_command}'): |
| return True |
| time.sleep(1) |
| raise RuntimeError(f'HookService:{hook_command} did not finish in {time_to_wait_seconds} seconds') |
| |
| def _sideload_apollo(self): |
| self.ad_dut.adb.ensure_root() |
| |
| self.adb_run('logcat -c') # Clear previous logcat information - reflashing is not performed for Apollo |
| |
| # Uninstall old APK's and clear flags |
| gmscore_apk_file = self.get_file_from_config('gmscore_file_' + self.ad_dut.serial) |
| gmscore_apk = AppInstaller(self.ad_dut, gmscore_apk_file) |
| gmscore_apk.uninstall() |
| nearby_module_apk_file = self.get_file_from_config('gmscore_nearby_en_file_' + self.ad_dut.serial) |
| nearby_module_apk = AppInstaller(self.ad_dut, nearby_module_apk_file) |
| nearby_module_apk.uninstall() |
| apollo_test_apk_file = self.get_file_from_config('exposure_notification_app') |
| apollo_test_apk = AppInstaller(self.ad_dut, apollo_test_apk_file) |
| apollo_test_apk.uninstall() |
| |
| # Set up BT and location |
| self.adb_run('service call bluetooth_manager 6') |
| self.adb_run('settings put secure location_providers_allowed +gps') |
| self.adb_run('settings put secure location_mode 3') |
| |
| # Install gmscore |
| gmscore_apk.install() |
| # Give gmscore some time to initialize (there doesn't appear to be a logcat message to key off) |
| time.sleep(self._apk_install_wait_time_seconds) |
| |
| # Whitelist EN for sideloading |
| self.adb_run('am broadcast -a com.google.gservices.intent.action.GSERVICES_OVERRIDE -e gms:chimera:dev_module_packages "com.google.android.gms.policy_nearby"') |
| # Install EN module |
| nearby_module_apk.install() |
| # Give EN some time to initialize (there doesn't appear to be a logcat message to key off) |
| time.sleep(self._apk_install_wait_time_seconds) |
| |
| # Whitelist test app and disable consent dialogs |
| self._set_installation_overrides() |
| |
| # Install test apk |
| apollo_test_apk.install() |
| # Give the test app some time to initialize (there doesn't appear to be a logcat message to key off) |
| time.sleep(self._apk_install_wait_time_seconds) |