blob: bdb7c45323a946d18419ee287120b222e049576a [file] [log] [blame]
#!/usr/bin/env fuchsia-vendored-python
# Copyright 2024 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.
"""Unit tests for honeydew.affordances.starnix.system_power_state_controller.py."""
import unittest
from unittest import mock
from honeydew import errors
from honeydew.affordances.starnix import (
system_power_state_controller as starnix_system_power_state_controller,
)
from honeydew.interfaces.affordances import (
system_power_state_controller as system_power_state_controller_interface,
)
from honeydew.transports import ffx as ffx_transport
_INPUT_ARGS: dict[str, object] = {
"device_name": "fuchsia-emulator",
}
# pylint: disable=protected-access
class SystemPowerStateControllerStarnixTests(unittest.TestCase):
"""Unit tests for honeydew.affordances.starnix.system_power_state_controller.py."""
def setUp(self) -> None:
super().setUp()
self.mock_ffx = mock.MagicMock(spec=ffx_transport.FFX)
with mock.patch.object(
starnix_system_power_state_controller.SystemPowerStateController,
"_run_starnix_console_shell_cmd",
autospec=True,
) as mock_run_starnix_console_shell_cmd:
self.system_power_state_controller_obj = starnix_system_power_state_controller.SystemPowerStateController(
ffx=self.mock_ffx,
device_name=str(_INPUT_ARGS["device_name"]),
)
mock_run_starnix_console_shell_cmd.assert_called_once()
@mock.patch.object(
starnix_system_power_state_controller.SystemPowerStateController,
"suspend_resume",
autospec=True,
)
def test_idle_suspend_auto_resume(self, mock_suspend_resume) -> None:
"""Test case for SystemPowerStateController.idle_suspend_auto_resume()"""
self.system_power_state_controller_obj.idle_suspend_auto_resume()
mock_suspend_resume.assert_called_once_with(
mock.ANY,
suspend_state=system_power_state_controller_interface.IdleSuspend(),
resume_mode=system_power_state_controller_interface.AutomaticResume(),
)
@mock.patch.object(
starnix_system_power_state_controller.SystemPowerStateController,
"_verify_suspend_resume",
autospec=True,
)
@mock.patch.object(
starnix_system_power_state_controller.SystemPowerStateController,
"_run_starnix_console_shell_cmd",
autospec=True,
)
def test_suspend_resume_to_do_idle_suspend_auto_resume(
self, mock_run_starnix_console_shell_cmd, mock_verify_suspend_resume
) -> None:
"""Test case for SystemPowerStateController.suspend_resume()"""
self.system_power_state_controller_obj.suspend_resume(
suspend_state=system_power_state_controller_interface.IdleSuspend(),
resume_mode=system_power_state_controller_interface.AutomaticResume(),
)
mock_run_starnix_console_shell_cmd.assert_called_once_with(
mock.ANY,
cmd=starnix_system_power_state_controller._StarnixCmds.IDLE_SUSPEND,
timeout=None,
)
mock_verify_suspend_resume.assert_called_once_with(
mock.ANY,
suspend_state=system_power_state_controller_interface.IdleSuspend(),
resume_mode=system_power_state_controller_interface.AutomaticResume(),
duration=mock.ANY,
)
@mock.patch.object(
starnix_system_power_state_controller.SystemPowerStateController,
"_run_starnix_console_shell_cmd",
autospec=True,
)
def test_verify_suspend_resume_for_idle_suspend_auto_resume(
self, mock_run_starnix_console_shell_cmd
) -> None:
"""Test case for SystemPowerStateController._verify_suspend_resume()
raising an exception."""
with self.assertRaisesRegex(
errors.SystemPowerStateControllerError,
"Putting the 'fuchsia-emulator' into 'IdleSuspend' followed by "
"'AutomaticResume after .+sec' operation took .+ seconds instead "
"of .+ seconds",
):
self.system_power_state_controller_obj.suspend_resume(
suspend_state=system_power_state_controller_interface.IdleSuspend(),
resume_mode=system_power_state_controller_interface.AutomaticResume(),
)
mock_run_starnix_console_shell_cmd.assert_called_once_with(
mock.ANY,
cmd=starnix_system_power_state_controller._StarnixCmds.IDLE_SUSPEND,
timeout=None,
)
def test_suspend_resume_with_not_supported_suspend_mode(self) -> None:
"""Test case for SystemPowerStateController.suspend_resume() raising
NotSupportedError for suspend operation."""
with self.assertRaises(errors.NotSupportedError):
self.system_power_state_controller_obj.suspend_resume(
suspend_state="invalid", # type: ignore[arg-type]
resume_mode=system_power_state_controller_interface.AutomaticResume(),
)
def test_suspend_resume_with_not_supported_resume_mode(self) -> None:
"""Test case for SystemPowerStateController.suspend_resume() raising
NotSupportedError for suspend operation."""
with self.assertRaises(errors.NotSupportedError):
self.system_power_state_controller_obj.suspend_resume(
suspend_state=system_power_state_controller_interface.IdleSuspend(),
resume_mode=system_power_state_controller_interface.ButtonPressResume(),
)
@mock.patch(
"os.read",
return_value=starnix_system_power_state_controller._RegExPatterns.STARNIX_CMD_SUCCESS.pattern.encode(),
autospec=True,
)
@mock.patch(
"pty.openpty",
return_value=(1, 1),
autospec=True,
)
def test_run_starnix_console_shell_cmd(
self, mock_openpty, mock_os_read
) -> None:
"""Test case for SystemPowerStateController._run_starnix_console_shell_cmd()"""
self.system_power_state_controller_obj._run_starnix_console_shell_cmd(
cmd=["something"]
)
mock_openpty.assert_called_once()
mock_os_read.assert_called_once()
@mock.patch(
"os.read",
return_value=starnix_system_power_state_controller._RegExPatterns.STARNIX_NOT_SUPPORTED.pattern.encode(),
autospec=True,
)
@mock.patch(
"pty.openpty",
return_value=(1, 1),
autospec=True,
)
def test_run_starnix_console_shell_cmd_raises_not_supported_error(
self, mock_openpty, mock_os_read
) -> None:
"""Test case for SystemPowerStateController._run_starnix_console_shell_cmd()
raising NotSupportedError"""
with self.assertRaises(errors.NotSupportedError):
self.system_power_state_controller_obj._run_starnix_console_shell_cmd(
cmd=["something"]
)
mock_openpty.assert_called_once()
mock_os_read.assert_called_once()
@mock.patch(
"os.read",
return_value="something".encode(),
autospec=True,
)
@mock.patch(
"pty.openpty",
return_value=(1, 1),
autospec=True,
)
def test_run_starnix_console_shell_cmd_raises_starnix_error(
self, mock_openpty, mock_os_read
) -> None:
"""Test case for SystemPowerStateController._run_starnix_console_shell_cmd()
raising StarnixError"""
with self.assertRaises(errors.StarnixError):
self.system_power_state_controller_obj._run_starnix_console_shell_cmd(
cmd=["something"]
)
mock_openpty.assert_called_once()
mock_os_read.assert_called_once()