136
122
help="Select all clients")
137
123
parser.add_argument("-v", "--verbose", action="store_true",
138
124
help="Print all fields")
139
parser.add_argument("-j", "--dump-json", dest="commands",
140
action="append_const", default=[],
141
const=command.DumpJSON(),
125
parser.add_argument("-j", "--dump-json", action="store_true",
142
126
help="Dump client data in JSON format")
143
127
enable_disable = parser.add_mutually_exclusive_group()
144
enable_disable.add_argument("-e", "--enable", dest="commands",
145
action="append_const", default=[],
146
const=command.Enable(),
128
enable_disable.add_argument("-e", "--enable", action="store_true",
147
129
help="Enable client")
148
enable_disable.add_argument("-d", "--disable", dest="commands",
149
action="append_const", default=[],
150
const=command.Disable(),
130
enable_disable.add_argument("-d", "--disable",
151
132
help="disable client")
152
parser.add_argument("-b", "--bump-timeout", dest="commands",
153
action="append_const", default=[],
154
const=command.BumpTimeout(),
133
parser.add_argument("-b", "--bump-timeout", action="store_true",
155
134
help="Bump timeout for client")
156
135
start_stop_checker = parser.add_mutually_exclusive_group()
157
136
start_stop_checker.add_argument("--start-checker",
159
action="append_const", default=[],
160
const=command.StartChecker(),
161
138
help="Start checker for client")
162
start_stop_checker.add_argument("--stop-checker", dest="commands",
163
action="append_const", default=[],
164
const=command.StopChecker(),
139
start_stop_checker.add_argument("--stop-checker",
165
141
help="Stop checker for client")
166
parser.add_argument("-V", "--is-enabled", dest="commands",
167
action="append_const", default=[],
168
const=command.IsEnabled(),
142
parser.add_argument("-V", "--is-enabled", action="store_true",
169
143
help="Check if client is enabled")
170
parser.add_argument("-r", "--remove", dest="commands",
171
action="append_const", default=[],
172
const=command.Remove(),
144
parser.add_argument("-r", "--remove", action="store_true",
173
145
help="Remove client")
174
parser.add_argument("-c", "--checker", dest="commands",
175
action="append", default=[],
176
metavar="COMMAND", type=command.SetChecker,
146
parser.add_argument("-c", "--checker",
177
147
help="Set checker command for client")
179
"-t", "--timeout", dest="commands", action="append",
180
default=[], metavar="TIME",
181
type=command.SetTimeout.argparse(string_to_delta),
182
help="Set timeout for client")
184
"--extended-timeout", dest="commands", action="append",
185
default=[], metavar="TIME",
186
type=command.SetExtendedTimeout.argparse(string_to_delta),
187
help="Set extended timeout for client")
189
"-i", "--interval", dest="commands", action="append",
190
default=[], metavar="TIME",
191
type=command.SetInterval.argparse(string_to_delta),
192
help="Set checker interval for client")
148
parser.add_argument("-t", "--timeout", type=string_to_delta,
149
help="Set timeout for client")
150
parser.add_argument("--extended-timeout", type=string_to_delta,
151
help="Set extended timeout for client")
152
parser.add_argument("-i", "--interval", type=string_to_delta,
153
help="Set checker interval for client")
193
154
approve_deny_default = parser.add_mutually_exclusive_group()
194
155
approve_deny_default.add_argument(
195
"--approve-by-default", dest="commands",
196
action="append_const", default=[],
197
const=command.ApproveByDefault(),
156
"--approve-by-default", action="store_true",
157
default=None, dest="approved_by_default",
198
158
help="Set client to be approved by default")
199
159
approve_deny_default.add_argument(
200
"--deny-by-default", dest="commands",
201
action="append_const", default=[],
202
const=command.DenyByDefault(),
160
"--deny-by-default", action="store_false",
161
dest="approved_by_default",
203
162
help="Set client to be denied by default")
205
"--approval-delay", dest="commands", action="append",
206
default=[], metavar="TIME",
207
type=command.SetApprovalDelay.argparse(string_to_delta),
208
help="Set delay before client approve/deny")
210
"--approval-duration", dest="commands", action="append",
211
default=[], metavar="TIME",
212
type=command.SetApprovalDuration.argparse(string_to_delta),
213
help="Set duration of one client approval")
214
parser.add_argument("-H", "--host", dest="commands",
215
action="append", default=[], metavar="STRING",
216
type=command.SetHost,
217
help="Set host for client")
219
"-s", "--secret", dest="commands", action="append",
220
default=[], metavar="FILENAME",
221
type=command.SetSecret.argparse(argparse.FileType(mode="rb")),
222
help="Set password blob (file) for client")
163
parser.add_argument("--approval-delay", type=string_to_delta,
164
help="Set delay before client approve/deny")
165
parser.add_argument("--approval-duration", type=string_to_delta,
166
help="Set duration of one client approval")
167
parser.add_argument("-H", "--host", help="Set host for client")
168
parser.add_argument("-s", "--secret",
169
type=argparse.FileType(mode="rb"),
170
help="Set password blob (file) for client")
223
171
approve_deny = parser.add_mutually_exclusive_group()
224
172
approve_deny.add_argument(
225
"-A", "--approve", dest="commands", action="append_const",
226
default=[], const=command.Approve(),
173
"-A", "--approve", action="store_true",
227
174
help="Approve any current client request")
228
approve_deny.add_argument("-D", "--deny", dest="commands",
229
action="append_const", default=[],
230
const=command.Deny(),
175
approve_deny.add_argument("-D", "--deny", action="store_true",
231
176
help="Deny any current client request")
232
177
parser.add_argument("--debug", action="store_true",
233
178
help="Debug mode (show D-Bus commands)")
424
369
"""Apply additional restrictions on options, not expressible in
427
def has_commands(options, commands=None):
429
commands = (command.Enable,
432
command.StartChecker,
438
command.SetExtendedTimeout,
440
command.ApproveByDefault,
441
command.DenyByDefault,
442
command.SetApprovalDelay,
443
command.SetApprovalDuration,
448
return any(isinstance(cmd, commands)
449
for cmd in options.commands)
372
def has_actions(options):
373
return any((options.enable,
375
options.bump_timeout,
376
options.start_checker,
377
options.stop_checker,
380
options.checker is not None,
381
options.timeout is not None,
382
options.extended_timeout is not None,
383
options.interval is not None,
384
options.approved_by_default is not None,
385
options.approval_delay is not None,
386
options.approval_duration is not None,
387
options.host is not None,
388
options.secret is not None,
451
if has_commands(options) and not (options.client or options.all):
392
if has_actions(options) and not (options.client or options.all):
452
393
parser.error("Options require clients names or --all.")
453
if options.verbose and has_commands(options):
394
if options.verbose and has_actions(options):
454
395
parser.error("--verbose can only be used alone.")
455
if (has_commands(options, (command.DumpJSON,))
456
and (options.verbose or len(options.commands) > 1)):
396
if options.dump_json and (options.verbose
397
or has_actions(options)):
457
398
parser.error("--dump-json can only be used alone.")
458
if options.all and not has_commands(options):
399
if options.all and not has_actions(options):
459
400
parser.error("--all requires an action.")
460
if (has_commands(options, (command.IsEnabled,))
461
and len(options.client) > 1):
401
if options.is_enabled and len(options.client) > 1:
462
402
parser.error("--is-enabled requires exactly one client")
463
if (len(options.commands) > 1
464
and has_commands(options, (command.Remove,))
465
and not has_commands(options, (command.Deny,))):
466
parser.error("--remove can only be combined with --deny")
404
options.remove = False
405
if has_actions(options) and not options.deny:
406
parser.error("--remove can only be combined with --deny")
407
options.remove = True
469
411
class dbus(object):
615
549
return new_object
618
class pydbus_adapter(object):
619
class SystemBus(dbus.MandosBus):
620
def __init__(self, module=pydbus):
622
self.bus = self.pydbus.SystemBus()
624
@contextlib.contextmanager
625
def convert_exception(self, exception_class=dbus.Error):
628
except gi.repository.GLib.Error as e:
629
# This does what "raise from" would do
630
exc = exception_class(*e.args)
634
def call_method(self, methodname, busname, objectpath,
636
proxy_object = self.get(busname, objectpath)
637
log.debug("D-Bus: %s:%s:%s.%s(%s)", busname, objectpath,
638
interface, methodname,
639
", ".join(repr(a) for a in args))
640
method = getattr(proxy_object[interface], methodname)
641
with self.convert_exception():
644
def get(self, busname, objectpath):
645
log.debug("D-Bus: Connect to: (busname=%r, path=%r)",
647
with self.convert_exception(dbus.ConnectFailed):
648
if sys.version_info.major <= 2:
649
with warnings.catch_warnings():
650
warnings.filterwarnings(
651
"ignore", "", DeprecationWarning,
652
r"^xml\.etree\.ElementTree$")
653
return self.bus.get(busname, objectpath)
655
return self.bus.get(busname, objectpath)
657
def set_property(self, busname, objectpath, interface, key,
659
proxy_object = self.get(busname, objectpath)
660
log.debug("D-Bus: %s:%s:%s.Set(%r, %r, %r)", busname,
661
objectpath, self.properties_iface, interface,
663
setattr(proxy_object[interface], key, value)
665
class CachingBus(SystemBus):
666
"""A caching layer for pydbus_adapter.SystemBus"""
667
def __init__(self, *args, **kwargs):
668
self.object_cache = {}
669
super(pydbus_adapter.CachingBus,
670
self).__init__(*args, **kwargs)
671
def get(self, busname, objectpath):
673
return self.object_cache[(busname, objectpath)]
675
new_object = (super(pydbus_adapter.CachingBus, self)
676
.get(busname, objectpath))
677
self.object_cache[(busname, objectpath)] = new_object
681
552
def commands_from_options(options):
683
commands = list(options.commands)
685
def find_cmd(cmd, commands):
687
for i, c in enumerate(commands):
688
if isinstance(c, cmd):
692
# If command.Remove is present, move any instances of command.Deny
693
# to occur ahead of command.Remove.
694
index_of_remove = find_cmd(command.Remove, commands)
695
before_remove = commands[:index_of_remove]
696
after_remove = commands[index_of_remove:]
698
for cmd in after_remove:
699
if isinstance(cmd, command.Deny):
700
before_remove.append(cmd)
556
if options.is_enabled:
557
commands.append(command.IsEnabled())
560
commands.append(command.Approve())
563
commands.append(command.Deny())
566
commands.append(command.Remove())
568
if options.dump_json:
569
commands.append(command.DumpJSON())
572
commands.append(command.Enable())
575
commands.append(command.Disable())
577
if options.bump_timeout:
578
commands.append(command.BumpTimeout())
580
if options.start_checker:
581
commands.append(command.StartChecker())
583
if options.stop_checker:
584
commands.append(command.StopChecker())
586
if options.approved_by_default is not None:
587
if options.approved_by_default:
588
commands.append(command.ApproveByDefault())
702
cleaned_after.append(cmd)
703
if cleaned_after != after_remove:
704
commands = before_remove + cleaned_after
590
commands.append(command.DenyByDefault())
592
if options.checker is not None:
593
commands.append(command.SetChecker(options.checker))
595
if options.host is not None:
596
commands.append(command.SetHost(options.host))
598
if options.secret is not None:
599
commands.append(command.SetSecret(options.secret))
601
if options.timeout is not None:
602
commands.append(command.SetTimeout(options.timeout))
604
if options.extended_timeout:
606
command.SetExtendedTimeout(options.extended_timeout))
608
if options.interval is not None:
609
commands.append(command.SetInterval(options.interval))
611
if options.approval_delay is not None:
613
command.SetApprovalDelay(options.approval_delay))
615
if options.approval_duration is not None:
617
command.SetApprovalDuration(options.approval_duration))
706
619
# If no command option has been given, show table of clients,
707
620
# optionally verbosely
1059
967
def test_actions_requires_client_or_all(self):
1060
968
for action, value in self.actions.items():
1061
args = self.actionargs(action, value)
969
options = self.parser.parse_args()
970
setattr(options, action, value)
1062
971
with self.assertParseError():
1063
self.parse_args(args)
972
self.check_option_syntax(options)
1065
# This mostly corresponds to the definition from has_commands() in
974
# This mostly corresponds to the definition from has_actions() in
1066
975
# check_option_syntax()
1070
"--bump-timeout": None,
1071
"--start-checker": None,
1072
"--stop-checker": None,
1073
"--is-enabled": None,
1076
"--timeout": "PT0S",
1077
"--extended-timeout": "PT0S",
1078
"--interval": "PT0S",
1079
"--approve-by-default": None,
1080
"--deny-by-default": None,
1081
"--approval-delay": "PT0S",
1082
"--approval-duration": "PT0S",
1083
"--host": "hostname",
1084
"--secret": "/dev/null",
977
# The actual values set here are not that important, but we do
978
# at least stick to the correct types, even though they are
982
"bump_timeout": True,
983
"start_checker": True,
984
"stop_checker": True,
988
"timeout": datetime.timedelta(),
989
"extended_timeout": datetime.timedelta(),
990
"interval": datetime.timedelta(),
991
"approved_by_default": True,
992
"approval_delay": datetime.timedelta(),
993
"approval_duration": datetime.timedelta(),
995
"secret": io.BytesIO(b"x"),
1090
def actionargs(action, value, *args):
1091
if value is not None:
1092
return [action, value] + list(args)
1094
return [action] + list(args)
1096
1000
@contextlib.contextmanager
1097
1001
def assertParseError(self):
1098
1002
with self.assertRaises(SystemExit) as e:
1124
1024
def test_actions_all_conflicts_with_verbose(self):
1125
1025
for action, value in self.actions.items():
1126
args = self.actionargs(action, value, "--all",
1026
options = self.parser.parse_args()
1027
setattr(options, action, value)
1029
options.verbose = True
1128
1030
with self.assertParseError():
1129
self.parse_args(args)
1031
self.check_option_syntax(options)
1131
1033
def test_actions_with_client_conflicts_with_verbose(self):
1132
1034
for action, value in self.actions.items():
1133
args = self.actionargs(action, value, "--verbose",
1035
options = self.parser.parse_args()
1036
setattr(options, action, value)
1037
options.verbose = True
1038
options.client = ["client"]
1135
1039
with self.assertParseError():
1136
self.parse_args(args)
1040
self.check_option_syntax(options)
1138
1042
def test_dump_json_conflicts_with_verbose(self):
1139
args = ["--dump-json", "--verbose"]
1043
options = self.parser.parse_args()
1044
options.dump_json = True
1045
options.verbose = True
1140
1046
with self.assertParseError():
1141
self.parse_args(args)
1047
self.check_option_syntax(options)
1143
1049
def test_dump_json_conflicts_with_action(self):
1144
1050
for action, value in self.actions.items():
1145
args = self.actionargs(action, value, "--dump-json")
1051
options = self.parser.parse_args()
1052
setattr(options, action, value)
1053
options.dump_json = True
1146
1054
with self.assertParseError():
1147
self.parse_args(args)
1055
self.check_option_syntax(options)
1149
1057
def test_all_can_not_be_alone(self):
1058
options = self.parser.parse_args()
1151
1060
with self.assertParseError():
1152
self.parse_args(args)
1061
self.check_option_syntax(options)
1154
1063
def test_all_is_ok_with_any_action(self):
1155
1064
for action, value in self.actions.items():
1156
args = self.actionargs(action, value, "--all")
1157
self.parse_args(args)
1065
options = self.parser.parse_args()
1066
setattr(options, action, value)
1068
self.check_option_syntax(options)
1159
1070
def test_any_action_is_ok_with_one_client(self):
1160
1071
for action, value in self.actions.items():
1161
args = self.actionargs(action, value, "client")
1162
self.parse_args(args)
1072
options = self.parser.parse_args()
1073
setattr(options, action, value)
1074
options.client = ["client"]
1075
self.check_option_syntax(options)
1164
1077
def test_one_client_with_all_actions_except_is_enabled(self):
1078
options = self.parser.parse_args()
1165
1079
for action, value in self.actions.items():
1166
if action == "--is-enabled":
1080
if action == "is_enabled":
1168
args = self.actionargs(action, value, "client")
1169
self.parse_args(args)
1082
setattr(options, action, value)
1083
options.client = ["client"]
1084
self.check_option_syntax(options)
1171
1086
def test_two_clients_with_all_actions_except_is_enabled(self):
1087
options = self.parser.parse_args()
1172
1088
for action, value in self.actions.items():
1173
if action == "--is-enabled":
1089
if action == "is_enabled":
1175
args = self.actionargs(action, value, "client1",
1177
self.parse_args(args)
1091
setattr(options, action, value)
1092
options.client = ["client1", "client2"]
1093
self.check_option_syntax(options)
1179
1095
def test_two_clients_are_ok_with_actions_except_is_enabled(self):
1180
1096
for action, value in self.actions.items():
1181
if action == "--is-enabled":
1097
if action == "is_enabled":
1183
args = self.actionargs(action, value, "client1",
1185
self.parse_args(args)
1099
options = self.parser.parse_args()
1100
setattr(options, action, value)
1101
options.client = ["client1", "client2"]
1102
self.check_option_syntax(options)
1187
1104
def test_is_enabled_fails_without_client(self):
1188
args = ["--is-enabled"]
1105
options = self.parser.parse_args()
1106
options.is_enabled = True
1189
1107
with self.assertParseError():
1190
self.parse_args(args)
1108
self.check_option_syntax(options)
1192
1110
def test_is_enabled_fails_with_two_clients(self):
1193
args = ["--is-enabled", "client1", "client2"]
1111
options = self.parser.parse_args()
1112
options.is_enabled = True
1113
options.client = ["client1", "client2"]
1194
1114
with self.assertParseError():
1195
self.parse_args(args)
1115
self.check_option_syntax(options)
1197
1117
def test_remove_can_only_be_combined_with_action_deny(self):
1198
1118
for action, value in self.actions.items():
1199
if action in {"--remove", "--deny"}:
1119
if action in {"remove", "deny"}:
1201
args = self.actionargs(action, value, "--all",
1121
options = self.parser.parse_args()
1122
setattr(options, action, value)
1124
options.remove = True
1203
1125
with self.assertParseError():
1204
self.parse_args(args)
1126
self.check_option_syntax(options)
1207
1129
class Test_dbus_exceptions(unittest.TestCase):
1621
1516
self.assertIs(obj1, obj1b)
1624
class Test_pydbus_adapter_SystemBus(TestCaseWithAssertLogs):
1626
def Stub_pydbus_func(self, func):
1627
class stub_pydbus(object):
1628
"""stub pydbus module"""
1629
class SystemBus(object):
1631
def get(busname, objectpath):
1632
DBusObject = collections.namedtuple(
1633
"DBusObject", ("methodname",))
1634
return {"interface":
1635
DBusObject(methodname=func)}
1638
def call_method(self, bus, methodname, busname, objectpath,
1640
with self.assertLogs(log, logging.DEBUG):
1641
return bus.call_method(methodname, busname, objectpath,
1644
def test_call_method_returns(self):
1645
expected_method_return = Unique()
1646
method_args = (Unique(), Unique())
1648
self.assertEqual(len(method_args), len(args))
1649
for marg, arg in zip(method_args, args):
1650
self.assertIs(marg, arg)
1651
return expected_method_return
1652
stub_pydbus = self.Stub_pydbus_func(func)
1653
bus = pydbus_adapter.SystemBus(stub_pydbus)
1654
ret = self.call_method(bus, "methodname", "busname",
1655
"objectpath", "interface",
1657
self.assertIs(ret, expected_method_return)
1659
def test_call_method_handles_exception(self):
1660
dbus_logger = logging.getLogger("dbus.proxies")
1663
raise gi.repository.GLib.Error()
1665
stub_pydbus = self.Stub_pydbus_func(func)
1666
bus = pydbus_adapter.SystemBus(stub_pydbus)
1668
with self.assertRaises(dbus.Error) as e:
1669
self.call_method(bus, "methodname", "busname",
1670
"objectpath", "interface")
1672
self.assertNotIsInstance(e, dbus.ConnectFailed)
1674
def test_get_converts_to_correct_exception(self):
1675
bus = pydbus_adapter.SystemBus(
1676
self.fake_pydbus_raises_exception_on_connect)
1677
with self.assertRaises(dbus.ConnectFailed):
1678
self.call_method(bus, "methodname", "busname",
1679
"objectpath", "interface")
1681
class fake_pydbus_raises_exception_on_connect(object):
1682
"""fake dbus-python module"""
1685
def get(busname, objectpath):
1686
raise gi.repository.GLib.Error()
1687
Bus = collections.namedtuple("Bus", ["get"])
1690
def test_set_property_uses_setattr(self):
1691
class Object(object):
1694
class pydbus_spy(object):
1695
class SystemBus(object):
1697
def get(busname, objectpath):
1698
return {"interface": obj}
1699
bus = pydbus_adapter.SystemBus(pydbus_spy)
1701
bus.set_property("busname", "objectpath", "interface", "key",
1703
self.assertIs(value, obj.key)
1705
def test_get_suppresses_xml_deprecation_warning(self):
1706
if sys.version_info.major >= 3:
1708
class stub_pydbus_get(object):
1709
class SystemBus(object):
1711
def get(busname, objectpath):
1712
warnings.warn_explicit(
1713
"deprecated", DeprecationWarning,
1714
"xml.etree.ElementTree", 0)
1715
bus = pydbus_adapter.SystemBus(stub_pydbus_get)
1716
with warnings.catch_warnings(record=True) as w:
1717
warnings.simplefilter("always")
1718
bus.get("busname", "objectpath")
1719
self.assertEqual(0, len(w))
1722
class Test_pydbus_adapter_CachingBus(unittest.TestCase):
1723
class stub_pydbus(object):
1724
"""stub pydbus module"""
1725
class SystemBus(object):
1727
def get(busname, objectpath):
1731
self.bus = pydbus_adapter.CachingBus(self.stub_pydbus)
1733
def test_returns_distinct_objectpaths(self):
1734
obj1 = self.bus.get("busname", "objectpath1")
1735
self.assertIsInstance(obj1, Unique)
1736
obj2 = self.bus.get("busname", "objectpath2")
1737
self.assertIsInstance(obj2, Unique)
1738
self.assertIsNot(obj1, obj2)
1740
def test_returns_distinct_busnames(self):
1741
obj1 = self.bus.get("busname1", "objectpath")
1742
self.assertIsInstance(obj1, Unique)
1743
obj2 = self.bus.get("busname2", "objectpath")
1744
self.assertIsInstance(obj2, Unique)
1745
self.assertIsNot(obj1, obj2)
1747
def test_returns_distinct_both(self):
1748
obj1 = self.bus.get("busname1", "objectpath")
1749
self.assertIsInstance(obj1, Unique)
1750
obj2 = self.bus.get("busname2", "objectpath")
1751
self.assertIsInstance(obj2, Unique)
1752
self.assertIsNot(obj1, obj2)
1754
def test_returns_same(self):
1755
obj1 = self.bus.get("busname", "objectpath")
1756
self.assertIsInstance(obj1, Unique)
1757
obj2 = self.bus.get("busname", "objectpath")
1758
self.assertIsInstance(obj2, Unique)
1759
self.assertIs(obj1, obj2)
1761
def test_returns_same_old(self):
1762
obj1 = self.bus.get("busname1", "objectpath1")
1763
self.assertIsInstance(obj1, Unique)
1764
obj2 = self.bus.get("busname2", "objectpath2")
1765
self.assertIsInstance(obj2, Unique)
1766
obj1b = self.bus.get("busname1", "objectpath1")
1767
self.assertIsInstance(obj1b, Unique)
1768
self.assertIsNot(obj1, obj2)
1769
self.assertIsNot(obj2, obj1b)
1770
self.assertIs(obj1, obj1b)
1773
1519
class Test_commands_from_options(unittest.TestCase):
1775
1521
def setUp(self):
2366
2070
def runTest(self):
2367
2071
if not hasattr(self, "command"):
2368
2072
return # Abstract TestCase class
2370
if hasattr(self, "values_to_set"):
2371
cmd_args = [(value,) for value in self.values_to_set]
2372
values_to_get = getattr(self, "values_to_get",
2375
cmd_args = [() for x in range(len(self.values_to_get))]
2376
values_to_get = self.values_to_get
2377
for value_to_get, cmd_arg in zip(values_to_get, cmd_args):
2378
for clientpath in self.bus.clients:
2379
self.bus.clients[clientpath][self.propname] = (
2381
self.command(*cmd_arg).run(self.bus.clients, self.bus)
2382
for clientpath in self.bus.clients:
2383
value = (self.bus.clients[clientpath]
2073
values_to_get = getattr(self, "values_to_get",
2075
for value_to_set, value_to_get in zip(self.values_to_set,
2077
for clientpath in self.bus.clients:
2078
self.bus.clients[clientpath][self.propname] = Unique()
2079
self.run_command(value_to_set, self.bus.clients)
2080
for clientpath in self.bus.clients:
2081
value = self.bus.clients[clientpath][self.propname]
2385
2082
self.assertNotIsInstance(value, Unique)
2386
2083
self.assertEqual(value_to_get, value)
2085
def run_command(self, value, clients):
2086
self.command().run(clients, self.bus)
2389
2089
class TestEnableCmd(TestPropertySetterCmd):
2390
2090
command = command.Enable
2391
2091
propname = "Enabled"
2392
values_to_get = [True]
2092
values_to_set = [True]
2395
2095
class TestDisableCmd(TestPropertySetterCmd):
2396
2096
command = command.Disable
2397
2097
propname = "Enabled"
2398
values_to_get = [False]
2098
values_to_set = [False]
2401
2101
class TestBumpTimeoutCmd(TestPropertySetterCmd):
2402
2102
command = command.BumpTimeout
2403
2103
propname = "LastCheckedOK"
2404
values_to_get = [""]
2104
values_to_set = [""]
2407
2107
class TestStartCheckerCmd(TestPropertySetterCmd):
2408
2108
command = command.StartChecker
2409
2109
propname = "CheckerRunning"
2410
values_to_get = [True]
2110
values_to_set = [True]
2413
2113
class TestStopCheckerCmd(TestPropertySetterCmd):
2414
2114
command = command.StopChecker
2415
2115
propname = "CheckerRunning"
2416
values_to_get = [False]
2116
values_to_set = [False]
2419
2119
class TestApproveByDefaultCmd(TestPropertySetterCmd):
2420
2120
command = command.ApproveByDefault
2421
2121
propname = "ApprovedByDefault"
2422
values_to_get = [True]
2122
values_to_set = [True]
2425
2125
class TestDenyByDefaultCmd(TestPropertySetterCmd):
2426
2126
command = command.DenyByDefault
2427
2127
propname = "ApprovedByDefault"
2428
values_to_get = [False]
2431
class TestSetCheckerCmd(TestPropertySetterCmd):
2128
values_to_set = [False]
2131
class TestPropertySetterValueCmd(TestPropertySetterCmd):
2132
"""Abstract class for tests of PropertySetterValueCmd classes"""
2134
def run_command(self, value, clients):
2135
self.command(value).run(clients, self.bus)
2138
class TestSetCheckerCmd(TestPropertySetterValueCmd):
2432
2139
command = command.SetChecker
2433
2140
propname = "Checker"
2434
2141
values_to_set = ["", ":", "fping -q -- %s"]
2437
class TestSetHostCmd(TestPropertySetterCmd):
2144
class TestSetHostCmd(TestPropertySetterValueCmd):
2438
2145
command = command.SetHost
2439
2146
propname = "Host"
2440
2147
values_to_set = ["192.0.2.3", "client.example.org"]
2443
class TestSetSecretCmd(TestPropertySetterCmd):
2150
class TestSetSecretCmd(TestPropertySetterValueCmd):
2444
2151
command = command.SetSecret
2445
2152
propname = "Secret"
2446
2153
values_to_set = [io.BytesIO(b""),