| # Copyright 2023 The Fuchsia Authors. All rights reserved. | |
| # Use of this source code is governed by a BSD-style license that can be | |
| # found in the LICENSE file. | |
| import logging | |
| import typing | |
| import fidl_fuchsia_hardware_power_statecontrol as power_statecontrol | |
| import fuchsia_async_extension | |
| from fuchsia_controller_py import FcTransportStatus | |
| from mobly import test_runner | |
| from mobly_controller import fuchsia_device | |
| _LOGGER = logging.getLogger("reboot_test") | |
| class FuchsiaControllerTests(fuchsia_async_extension.AsyncBaseTestClass): | |
| async def setup_class(self) -> None: | |
| self.fuchsia_devices: typing.List[ | |
| fuchsia_device.FuchsiaDevice | |
| ] = await self.register_controller(fuchsia_device) | |
| self.device = self.fuchsia_devices[0] | |
| self.device.set_ctx(self) | |
| async def test_fuchsia_device_reboot(self) -> None: | |
| """Attempts to reboot a device.""" | |
| if self.device.ctx is None: | |
| raise ValueError(f"Device: {self.device.target} has no context") | |
| # [START reboot_example] | |
| ch = self.device.ctx.connect_device_proxy( | |
| "bootstrap/shutdown_shim", power_statecontrol.AdminMarker | |
| ) | |
| admin = power_statecontrol.AdminClient(ch) | |
| # Makes a coroutine to ensure that a PEER_CLOSED isn't received from attempting | |
| # to write to the channel. | |
| coro = admin.shutdown( | |
| options=power_statecontrol.ShutdownOptions( | |
| action=power_statecontrol.ShutdownAction.REBOOT, | |
| reasons=[power_statecontrol.ShutdownReason.DEVELOPER_REQUEST], | |
| ), | |
| ) | |
| try: | |
| _LOGGER.info("Issuing reboot command") | |
| self.device.notify_intentional_disconnect() | |
| await coro | |
| except FcTransportStatus as status: | |
| valid_reboot_errs = [ | |
| FcTransportStatus.FC_ERR_FDOMAIN, | |
| FcTransportStatus.FC_ERR_TRANSPORT, | |
| ] | |
| if status.code() not in valid_reboot_errs: | |
| raise status | |
| _LOGGER.info("Device reboot command sent") | |
| # [END reboot_example] | |
| await self.device.wait_offline() | |
| await self.device.wait_online() | |
| if __name__ == "__main__": | |
| test_runner.main() |