From 86122781314952fce55a61bfd9d0116c6d4efd0e Mon Sep 17 00:00:00 2001 From: Ang Li Date: Sat, 8 Aug 2026 07:03:11 +0000 Subject: [PATCH] Fix deepcopy and pickle support for AdbError and AdbTimeoutError --- mobly/controllers/android_device_lib/adb.py | 4 +- .../android_device_lib/adb_test.py | 50 +++++++++++++++++++ 2 files changed, 52 insertions(+), 2 deletions(-) diff --git a/mobly/controllers/android_device_lib/adb.py b/mobly/controllers/android_device_lib/adb.py index 5760d27b..35f59ea6 100644 --- a/mobly/controllers/android_device_lib/adb.py +++ b/mobly/controllers/android_device_lib/adb.py @@ -68,7 +68,7 @@ class AdbError(Error): """ def __init__(self, cmd, stdout, stderr, ret_code, serial=''): - super().__init__() + super().__init__(cmd, stdout, stderr, ret_code, serial) self.cmd = cmd self.stdout = stdout self.stderr = stderr @@ -96,7 +96,7 @@ class AdbTimeoutError(Error): """ def __init__(self, cmd, timeout, serial=''): - super().__init__() + super().__init__(cmd, timeout, serial) self.cmd = cmd self.timeout = timeout self.serial = serial diff --git a/tests/mobly/controllers/android_device_lib/adb_test.py b/tests/mobly/controllers/android_device_lib/adb_test.py index 7b01feb7..31d3ff86 100755 --- a/tests/mobly/controllers/android_device_lib/adb_test.py +++ b/tests/mobly/controllers/android_device_lib/adb_test.py @@ -13,7 +13,9 @@ # limitations under the License. import collections +import copy import io +import pickle import subprocess import unittest from unittest import mock @@ -998,6 +1000,54 @@ def test_current_user_id_between_21_and_24(self, mock_exec_cmd, mock_getprop): ) self.assertEqual(user_id, 123) + def test_adberror_deepcopy_and_pickle(self): + err = adb.AdbError(['adb', 'devices'], b'stdout', b'stderr', 1, 'serial123') + err_copy = copy.deepcopy(err) + self.assertIsNot(err, err_copy) + self.assertIsNot(err.cmd, err_copy.cmd) + self.assertEqual(err.cmd, err_copy.cmd) + self.assertEqual(err.stdout, err_copy.stdout) + self.assertEqual(err.stderr, err_copy.stderr) + self.assertEqual(err.ret_code, err_copy.ret_code) + self.assertEqual(err.serial, err_copy.serial) + self.assertEqual(str(err), str(err_copy)) + + # Validate deepcopy isolation by mutating the original list + err.cmd.append('--extra') + self.assertNotEqual(err.cmd, err_copy.cmd) + + err_unpickled = pickle.loads(pickle.dumps(err_copy)) + self.assertIsNot(err_copy, err_unpickled) + self.assertIsNot(err_copy.cmd, err_unpickled.cmd) + self.assertEqual(err_copy.cmd, err_unpickled.cmd) + self.assertEqual(err_copy.stdout, err_unpickled.stdout) + self.assertEqual(err_copy.stderr, err_unpickled.stderr) + self.assertEqual(err_copy.ret_code, err_unpickled.ret_code) + self.assertEqual(err_copy.serial, err_unpickled.serial) + self.assertEqual(str(err_copy), str(err_unpickled)) + + def test_adbtimeouterror_deepcopy_and_pickle(self): + err = adb.AdbTimeoutError(['adb', 'logcat'], 15.5, 'serial123') + err_copy = copy.deepcopy(err) + self.assertIsNot(err, err_copy) + self.assertIsNot(err.cmd, err_copy.cmd) + self.assertEqual(err.cmd, err_copy.cmd) + self.assertEqual(err.timeout, err_copy.timeout) + self.assertEqual(err.serial, err_copy.serial) + self.assertEqual(str(err), str(err_copy)) + + # Validate deepcopy isolation by mutating the original list + err.cmd.append('--extra') + self.assertNotEqual(err.cmd, err_copy.cmd) + + err_unpickled = pickle.loads(pickle.dumps(err_copy)) + self.assertIsNot(err_copy, err_unpickled) + self.assertIsNot(err_copy.cmd, err_unpickled.cmd) + self.assertEqual(err_copy.cmd, err_unpickled.cmd) + self.assertEqual(err_copy.timeout, err_unpickled.timeout) + self.assertEqual(err_copy.serial, err_unpickled.serial) + self.assertEqual(str(err_copy), str(err_unpickled)) + if __name__ == '__main__': unittest.main()