| #!/usr/bin/env python3 |
| # |
| # Copyright (C) 2021 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. |
| """ |
| Script for to flash Fuchsia devices and reports the DUT's version of Fuchsia in |
| the Sponge test result properties. Uses the built in flashing tool for |
| fuchsia_devices. |
| """ |
| from acts import asserts |
| from acts import signals |
| from acts.base_test import BaseTestClass |
| from acts.utils import get_device |
| |
| MAX_FLASH_ATTEMPTS = 3 |
| |
| |
| class FlashTest(BaseTestClass): |
| |
| def setup_class(self): |
| super().setup_class() |
| self.failed_to_get_version = False |
| |
| def teardown_class(self): |
| # Verify that FlashTest successfully reported the DUT version. This is |
| # working around a flaw in ACTS where signals.TestAbortAll does not |
| # report any errors. |
| # |
| # TODO(http://b/253515812): This has been fixed in Mobly already. Remove |
| # teardown_class and change "TestError" to "abort_all" in |
| # test_flash_devices once we move to Mobly. |
| if self.failed_to_get_version: |
| asserts.abort_all('Failed to get DUT version') |
| |
| return super().teardown_class() |
| |
| def test_flash_devices(self): |
| for device in self.fuchsia_devices: |
| flash_counter = 0 |
| while True: |
| try: |
| device.reboot(reboot_type='flash', |
| use_ssh=True, |
| unreachable_timeout=120, |
| ping_timeout=120) |
| self.log.info(f'{device.orig_ip} has been flashed.') |
| break |
| except Exception as err: |
| self.log.error( |
| f'Failed to flash {device.orig_ip} with error:\n{err}') |
| |
| if not device.device_pdu_config: |
| asserts.abort_all( |
| f'Failed to flash {device.orig_ip} and no PDU available for hard reboot' |
| ) |
| |
| flash_counter = flash_counter + 1 |
| if flash_counter == MAX_FLASH_ATTEMPTS: |
| asserts.abort_all( |
| f'Failed to flash {device.orig_ip} after {MAX_FLASH_ATTEMPTS} attempts' |
| ) |
| |
| self.log.info( |
| f'Hard rebooting {device.orig_ip} and retrying flash.') |
| device.reboot(reboot_type='hard', |
| testbed_pdus=self.pdu_devices) |
| |
| # Report the new Fuchsia version |
| try: |
| dut = get_device(self.fuchsia_devices, 'DUT') |
| version = dut.version() |
| self.record_data({'sponge_properties': { |
| 'DUT_VERSION': version, |
| }}) |
| self.log.info("DUT version found: {}".format(version)) |
| except Exception as e: |
| self.failed_to_get_version = True |
| raise signals.TestError(f'Failed to get DUT version: {e}') from e |