Skip to content

Commit

Permalink
Change to check fail only
Browse files Browse the repository at this point in the history
  • Loading branch information
hanhsuan committed Jan 24, 2025
1 parent c0c2536 commit 10872f3
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 88 deletions.
45 changes: 12 additions & 33 deletions providers/base/bin/suspend_stats.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,27 +68,19 @@ def is_after_suspend(self) -> bool:
"""
return (
self.contents["success"] != "0"
and self.contents["failed_prepare"] == "0"
and self.contents["failed_suspend"] == "0"
and self.contents["failed_resume"] == "0"
)

def is_device_failed(self) -> bool:
def is_any_failed(self) -> bool:
"""
Is any device failed during suspend
Is any failed during suspend
:returns: return Ture while one device failed during suspend
:returns: return Ture while one failed during suspend
"""
return self.contents["fail"] != "0"

def get_last_failed_device(self) -> str:
"""
show the last failed device during the suspend process
:returns: return the last failed device
"""
if self.is_device_failed():
return self.contents["last_failed_dev"]
return "There is no failed device"

def parse_args(self, args=sys.argv[1:]):
"""
command line arguments parsing
Expand Down Expand Up @@ -117,24 +109,17 @@ def parse_args(self, args=sys.argv[1:]):
help="Print content",
)
# Add parser for printing last failed device
parser_failed_device = subparsers.add_parser(
"failed_device",
help="validating the system is after suspend or not",
parser_any = subparsers.add_parser(
"any",
help="Is there any failed during suspend",
)
parser_failed_device.add_argument(
parser_any.add_argument(
"-p",
"--print",
dest="print",
action="store_true",
help="Print content",
)
parser_failed_device.add_argument(
"-r",
"--raise_exit",
dest="raise_exit",
action="store_true",
help="raise SystemExit while finding failed device",
)

return parser.parse_args(args)

Expand All @@ -145,19 +130,13 @@ def main(self):
self.print_all_content()
if not self.is_after_suspend():
raise SystemExit("System is not under after suspend status")
elif args.type == "failed_device":
elif args.type == "any":
if args.print:
self.print_all_content()
failed_device = self.get_last_failed_device()
if (
args.raise_exit
and failed_device != "There is no failed device"
):
if self.is_any_failed():
raise SystemExit(
"last failed device:[{}]".format(failed_device)
"There are [{}] failed".format(self.contents["fail"])
)
else:
print("last failed device:[{}]".format(failed_device))


if __name__ == "__main__":
Expand Down
76 changes: 27 additions & 49 deletions providers/base/tests/test_suspend_stats.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,43 +49,37 @@ def test_is_after_suspend(self):
stats = SuspendStats()
stats.contents = {
"success": "1",
"failed_prepare": "0",
"failed_suspend": "0",
"failed_resume": "0",
"fail": "0",
"last_failed_dev": "",
}
self.assertTrue(stats.is_after_suspend())

stats.contents["failed_suspend"] = "1"
stats.contents["failed_prepare"] = "1"
self.assertFalse(stats.is_after_suspend())

def test_is_device_failed(self):
stats = SuspendStats()
stats.contents = {
"success": "1",
"failed_suspend": "0",
"fail": "1",
"last_failed_dev": "",
}
self.assertTrue(stats.is_device_failed())
stats.contents["failed_prepare"] = "0"
stats.contents["failed_suspend"] = "1"
self.assertFalse(stats.is_after_suspend())

stats.contents["fail"] = "0"
self.assertFalse(stats.is_device_failed())
stats.contents["failed_suspend"] = "0"
stats.contents["failed_resume"] = "1"
self.assertFalse(stats.is_after_suspend())

def test_get_last_failed_device(self):
def test_is_any_failed(self):
stats = SuspendStats()

stats.contents = {
"success": "1",
"failed_suspend": "0",
"fail": "1",
"last_failed_dev": "deviceA",
"last_failed_dev": "",
}
self.assertEqual(stats.get_last_failed_device(), "deviceA")
self.assertTrue(stats.is_any_failed())

stats.contents["fail"] = "0"
self.assertEqual(
stats.get_last_failed_device(), "There is no failed device"
)
self.assertFalse(stats.is_any_failed())

def test_parse_args_valid(self):
stats = SuspendStats()
Expand All @@ -95,12 +89,12 @@ def test_parse_args_valid(self):
self.assertEqual(rv.type, "valid")
self.assertTrue(rv.print)

def test_parse_args_failed_device(self):
def test_parse_args_any(self):
stats = SuspendStats()
args = ["failed_device", "--print"]
args = ["any", "--print"]
rv = stats.parse_args(args)

self.assertEqual(rv.type, "failed_device")
self.assertEqual(rv.type, "any")
self.assertTrue(rv.print)


Expand Down Expand Up @@ -129,48 +123,32 @@ def test_run_valid_fail(self, mock_print, mock_after, mock_parse_args):
SuspendStats().main()

@patch("suspend_stats.SuspendStats.parse_args")
@patch("suspend_stats.SuspendStats.get_last_failed_device")
@patch("suspend_stats.SuspendStats.is_any_failed")
@patch("suspend_stats.SuspendStats.print_all_content")
def test_run_failed_device_succ(
self, mock_print, mock_device, mock_parse_args
def test_run_any_succ(
self, mock_print, mock_any, mock_parse_args
):
args_mock = MagicMock()
args_mock.type = "failed_device"
args_mock.print = True
args_mock.raise_exit = False
args_mock.type = "any"
args_mock.print = False
mock_parse_args.return_value = args_mock
mock_device.return_value = "There is no failed device"
mock_any.return_value = False
self.assertEqual(SuspendStats().main(), None)

@patch("suspend_stats.SuspendStats.parse_args")
@patch("suspend_stats.SuspendStats.get_last_failed_device")
@patch("suspend_stats.SuspendStats.is_any_failed")
@patch("suspend_stats.SuspendStats.print_all_content")
def test_run_failed_device_fail(
self, mock_print, mock_device, mock_parse_args
def test_run_any_fail(
self, mock_print, mock_any, mock_parse_args
):
args_mock = MagicMock()
args_mock.type = "failed_device"
args_mock.type = "any"
args_mock.print = True
args_mock.raise_exit = True
mock_parse_args.return_value = args_mock
mock_device.return_value = "deviceA"
mock_any.return_value = True
with self.assertRaises(SystemExit):
SuspendStats().main()

@patch("suspend_stats.SuspendStats.parse_args")
@patch("suspend_stats.SuspendStats.get_last_failed_device")
@patch("suspend_stats.SuspendStats.print_all_content")
def test_run_failed_device_fail_no_raise(
self, mock_print, mock_device, mock_parse_args
):
args_mock = MagicMock()
args_mock.type = "failed_device"
args_mock.print = False
args_mock.raise_exit = False
mock_parse_args.return_value = args_mock
mock_device.return_value = "deviceA"
self.assertEqual(SuspendStats().main(), None)

@patch("suspend_stats.SuspendStats.parse_args")
def test_run_nothing(self, mock_parse_args):
args_mock = MagicMock()
Expand Down
8 changes: 4 additions & 4 deletions providers/base/units/suspend/suspend.pxu
Original file line number Diff line number Diff line change
Expand Up @@ -1717,24 +1717,24 @@ command:
_purpose: Attaches the FWTS oops results log to the submission after suspend
_summary: Attach FWTS oops results log post-suspend.

id: suspend/is_suspend_success
id: suspend/valid_suspend_status
plugin: shell
category_id: com.canonical.plainbox::suspend
depends: suspend/suspend_advanced_auto
estimated_duration: 5s
command: suspend_stats.py valid -p
summary:
Test this machine suspend status is failed or not
Test this machine suspend status is success or not
description:
If the suspend is successed, the count in /sys/power/suspend_stats/success will be non zero
and the /sys/power/suspend_stats/failed_suspend will be zero

id: suspend/is_device_suspend_success
id: suspend/any_fail_during_suspend
plugin: shell
category_id: com.canonical.plainbox::suspend
depends: suspend/suspend_advanced_auto
estimated_duration: 5s
command: suspend_stats.py failed_device -p -r
command: suspend_stats.py any -p
summary:
Test all devices in this machine suspend status is failed or not
description:
Expand Down
4 changes: 2 additions & 2 deletions providers/base/units/suspend/test-plan.pxu
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,8 @@ include:
suspend/audio_after_suspend_auto certification-status=blocker
suspend/cpu_after_suspend_auto certification-status=blocker
suspend/memory_after_suspend_auto certification-status=blocker
suspend/is_suspend_success
suspend/is_device_suspend_success
suspend/valid_suspend_status
suspend/any_fail_during_suspend
bootstrap_include:
device

Expand Down

0 comments on commit 10872f3

Please sign in to comment.