613
612
"Checker", "ExtendedTimeout", "Expires",
614
613
"LastCheckerStatus")
616
def run(self, clients, bus=None, mandos=None):
617
print(self.output(clients.values()))
619
def output(self, clients):
620
raise NotImplementedError()
623
616
class DumpJSON(Output):
624
def output(self, clients):
617
def run(self, clients, bus=None, mandos=None):
625
618
data = {client["Name"]:
626
619
{key: self.dbus_boolean_to_bool(client[key])
627
620
for key in self.all_keywords}
628
for client in clients}
629
return json.dumps(data, indent=4, separators=(',', ': '))
621
for client in clients.values()}
622
print(json.dumps(data, indent=4, separators=(',', ': ')))
632
625
def dbus_boolean_to_bool(value):
753
746
raise NotImplementedError()
756
class Enable(Property):
749
class Enable(PropertySetter):
757
750
propname = "Enabled"
758
751
value_to_set = dbus.Boolean(True)
761
class Disable(Property):
754
class Disable(PropertySetter):
762
755
propname = "Enabled"
763
756
value_to_set = dbus.Boolean(False)
766
class BumpTimeout(Property):
759
class BumpTimeout(PropertySetter):
767
760
propname = "LastCheckedOK"
768
761
value_to_set = ""
771
class StartChecker(Property):
772
propname = "CheckerRunning"
773
value_to_set = dbus.Boolean(True)
776
class StopChecker(Property):
777
propname = "CheckerRunning"
778
value_to_set = dbus.Boolean(False)
781
class ApproveByDefault(Property):
782
propname = "ApprovedByDefault"
783
value_to_set = dbus.Boolean(True)
786
class DenyByDefault(Property):
787
propname = "ApprovedByDefault"
788
value_to_set = dbus.Boolean(False)
791
class PropertyValue(Property):
792
"Abstract class for Property recieving a value as argument"
764
class StartChecker(PropertySetter):
765
propname = "CheckerRunning"
766
value_to_set = dbus.Boolean(True)
769
class StopChecker(PropertySetter):
770
propname = "CheckerRunning"
771
value_to_set = dbus.Boolean(False)
774
class ApproveByDefault(PropertySetter):
775
propname = "ApprovedByDefault"
776
value_to_set = dbus.Boolean(True)
779
class DenyByDefault(PropertySetter):
780
propname = "ApprovedByDefault"
781
value_to_set = dbus.Boolean(False)
784
class PropertySetterValue(PropertySetter):
785
"""Abstract class for PropertySetter recieving a value as
786
constructor argument instead of a class attribute."""
793
787
def __init__(self, value):
794
788
self.value_to_set = value
797
class SetChecker(PropertyValue):
791
class SetChecker(PropertySetterValue):
798
792
propname = "Checker"
801
class SetHost(PropertyValue):
795
class SetHost(PropertySetterValue):
802
796
propname = "Host"
805
class SetSecret(PropertyValue):
799
class SetSecret(PropertySetterValue):
806
800
propname = "Secret"
891
886
# tests, which is run by doctest.
893
888
def test_rfc3339_zero_seconds(self):
894
self.assertEqual(string_to_delta("PT0S"),
895
datetime.timedelta())
889
self.assertEqual(datetime.timedelta(),
890
string_to_delta("PT0S"))
897
892
def test_rfc3339_zero_days(self):
898
self.assertEqual(string_to_delta("P0D"),
899
datetime.timedelta())
893
self.assertEqual(datetime.timedelta(), string_to_delta("P0D"))
901
895
def test_rfc3339_one_second(self):
902
self.assertEqual(string_to_delta("PT1S"),
903
datetime.timedelta(0, 1))
896
self.assertEqual(datetime.timedelta(0, 1),
897
string_to_delta("PT1S"))
905
899
def test_rfc3339_two_hours(self):
906
self.assertEqual(string_to_delta("PT2H"),
907
datetime.timedelta(0, 7200))
900
self.assertEqual(datetime.timedelta(0, 7200),
901
string_to_delta("PT2H"))
909
903
def test_falls_back_to_pre_1_6_1_with_warning(self):
910
904
with self.assertLogs(log, logging.WARNING):
911
905
value = string_to_delta("2h")
912
self.assertEqual(value, datetime.timedelta(0, 7200))
906
self.assertEqual(datetime.timedelta(0, 7200), value)
915
909
class Test_check_option_syntax(unittest.TestCase):
958
952
# Exit code from argparse is guaranteed to be "2". Reference:
959
953
# https://docs.python.org/3/library
960
954
# /argparse.html#exiting-methods
961
self.assertEqual(e.exception.code, 2)
955
self.assertEqual(2, e.exception.code)
964
958
@contextlib.contextmanager
965
959
def redirect_stderr_to_devnull():
966
null = os.open(os.path.devnull, os.O_RDWR)
967
stderrcopy = os.dup(sys.stderr.fileno())
968
os.dup2(null, sys.stderr.fileno())
974
os.dup2(stderrcopy, sys.stderr.fileno())
960
old_stderr = sys.stderr
961
with contextlib.closing(open(os.devnull, "w")) as null:
966
sys.stderr = old_stderr
977
968
def check_option_syntax(self, options):
978
969
check_option_syntax(self.parser, options)
1099
1090
self.assertTrue(mockbus.called)
1101
1092
def test_logs_and_exits_on_dbus_error(self):
1102
class MockBusFailing(object):
1093
class FailingBusStub(object):
1103
1094
def get_object(self, busname, dbus_path):
1104
1095
raise dbus.exceptions.DBusException("Test")
1106
1097
with self.assertLogs(log, logging.CRITICAL):
1107
1098
with self.assertRaises(SystemExit) as e:
1108
bus = get_mandos_dbus_object(bus=MockBusFailing())
1099
bus = get_mandos_dbus_object(bus=FailingBusStub())
1110
1101
if isinstance(e.exception.code, int):
1111
self.assertNotEqual(e.exception.code, 0)
1102
self.assertNotEqual(0, e.exception.code)
1113
1104
self.assertIsNotNone(e.exception.code)
1116
1107
class Test_get_managed_objects(TestCaseWithAssertLogs):
1117
1108
def test_calls_and_returns_GetManagedObjects(self):
1118
managed_objects = {"/clients/foo": { "Name": "foo"}}
1119
class MockObjectManager(object):
1109
managed_objects = {"/clients/client": { "Name": "client"}}
1110
class ObjectManagerStub(object):
1120
1111
def GetManagedObjects(self):
1121
1112
return managed_objects
1122
retval = get_managed_objects(MockObjectManager())
1113
retval = get_managed_objects(ObjectManagerStub())
1123
1114
self.assertDictEqual(managed_objects, retval)
1125
1116
def test_logs_and_exits_on_dbus_error(self):
1126
1117
dbus_logger = logging.getLogger("dbus.proxies")
1128
class MockObjectManagerFailing(object):
1119
class ObjectManagerFailingStub(object):
1129
1120
def GetManagedObjects(self):
1130
1121
dbus_logger.error("Test")
1131
1122
raise dbus.exceptions.DBusException("Test")
1143
1134
with self.assertLogs(log, logging.CRITICAL) as watcher:
1144
1135
with self.assertRaises(SystemExit) as e:
1145
get_managed_objects(MockObjectManagerFailing())
1136
get_managed_objects(ObjectManagerFailingStub())
1147
1138
dbus_logger.removeFilter(counting_handler)
1149
1140
# Make sure the dbus logger was suppressed
1150
self.assertEqual(counting_handler.count, 0)
1141
self.assertEqual(0, counting_handler.count)
1152
1143
# Test that the dbus_logger still works
1153
1144
with self.assertLogs(dbus_logger, logging.ERROR):
1154
1145
dbus_logger.error("Test")
1156
1147
if isinstance(e.exception.code, int):
1157
self.assertNotEqual(e.exception.code, 0)
1148
self.assertNotEqual(0, e.exception.code)
1159
1150
self.assertIsNotNone(e.exception.code)
1175
1166
options = self.parser.parse_args(args)
1176
1167
check_option_syntax(self.parser, options)
1177
1168
commands = commands_from_options(options)
1178
self.assertEqual(len(commands), 1)
1169
self.assertEqual(1, len(commands))
1179
1170
command = commands[0]
1180
1171
self.assertIsInstance(command, command_cls)
1181
1172
for key, value in cmd_attrs.items():
1182
self.assertEqual(getattr(command, key), value)
1173
self.assertEqual(value, getattr(command, key))
1184
1175
def test_is_enabled_short(self):
1185
self.assert_command_from_args(["-V", "foo"],
1176
self.assert_command_from_args(["-V", "client"],
1186
1177
command.IsEnabled)
1188
1179
def test_approve(self):
1189
self.assert_command_from_args(["--approve", "foo"],
1180
self.assert_command_from_args(["--approve", "client"],
1190
1181
command.Approve)
1192
1183
def test_approve_short(self):
1193
self.assert_command_from_args(["-A", "foo"], command.Approve)
1184
self.assert_command_from_args(["-A", "client"],
1195
1187
def test_deny(self):
1196
self.assert_command_from_args(["--deny", "foo"], command.Deny)
1188
self.assert_command_from_args(["--deny", "client"],
1198
1191
def test_deny_short(self):
1199
self.assert_command_from_args(["-D", "foo"], command.Deny)
1192
self.assert_command_from_args(["-D", "client"], command.Deny)
1201
1194
def test_remove(self):
1202
self.assert_command_from_args(["--remove", "foo"],
1195
self.assert_command_from_args(["--remove", "client"],
1203
1196
command.Remove)
1205
1198
def test_deny_before_remove(self):
1206
1199
options = self.parser.parse_args(["--deny", "--remove",
1208
1201
check_option_syntax(self.parser, options)
1209
1202
commands = commands_from_options(options)
1210
self.assertEqual(len(commands), 2)
1203
self.assertEqual(2, len(commands))
1211
1204
self.assertIsInstance(commands[0], command.Deny)
1212
1205
self.assertIsInstance(commands[1], command.Remove)
1217
1210
check_option_syntax(self.parser, options)
1218
1211
commands = commands_from_options(options)
1219
self.assertEqual(len(commands), 2)
1212
self.assertEqual(2, len(commands))
1220
1213
self.assertIsInstance(commands[0], command.Deny)
1221
1214
self.assertIsInstance(commands[1], command.Remove)
1223
1216
def test_remove_short(self):
1224
self.assert_command_from_args(["-r", "foo"], command.Remove)
1217
self.assert_command_from_args(["-r", "client"],
1226
1220
def test_dump_json(self):
1227
1221
self.assert_command_from_args(["--dump-json"],
1228
1222
command.DumpJSON)
1230
1224
def test_enable(self):
1231
self.assert_command_from_args(["--enable", "foo"],
1225
self.assert_command_from_args(["--enable", "client"],
1232
1226
command.Enable)
1234
1228
def test_enable_short(self):
1235
self.assert_command_from_args(["-e", "foo"], command.Enable)
1229
self.assert_command_from_args(["-e", "client"],
1237
1232
def test_disable(self):
1238
self.assert_command_from_args(["--disable", "foo"],
1233
self.assert_command_from_args(["--disable", "client"],
1239
1234
command.Disable)
1241
1236
def test_disable_short(self):
1242
self.assert_command_from_args(["-d", "foo"], command.Disable)
1237
self.assert_command_from_args(["-d", "client"],
1244
1240
def test_bump_timeout(self):
1245
self.assert_command_from_args(["--bump-timeout", "foo"],
1241
self.assert_command_from_args(["--bump-timeout", "client"],
1246
1242
command.BumpTimeout)
1248
1244
def test_bump_timeout_short(self):
1249
self.assert_command_from_args(["-b", "foo"],
1245
self.assert_command_from_args(["-b", "client"],
1250
1246
command.BumpTimeout)
1252
1248
def test_start_checker(self):
1253
self.assert_command_from_args(["--start-checker", "foo"],
1249
self.assert_command_from_args(["--start-checker", "client"],
1254
1250
command.StartChecker)
1256
1252
def test_stop_checker(self):
1257
self.assert_command_from_args(["--stop-checker", "foo"],
1253
self.assert_command_from_args(["--stop-checker", "client"],
1258
1254
command.StopChecker)
1260
1256
def test_approve_by_default(self):
1261
self.assert_command_from_args(["--approve-by-default", "foo"],
1257
self.assert_command_from_args(["--approve-by-default",
1262
1259
command.ApproveByDefault)
1264
1261
def test_deny_by_default(self):
1265
self.assert_command_from_args(["--deny-by-default", "foo"],
1262
self.assert_command_from_args(["--deny-by-default", "client"],
1266
1263
command.DenyByDefault)
1268
1265
def test_checker(self):
1269
self.assert_command_from_args(["--checker", ":", "foo"],
1266
self.assert_command_from_args(["--checker", ":", "client"],
1270
1267
command.SetChecker,
1271
1268
value_to_set=":")
1273
1270
def test_checker_empty(self):
1274
self.assert_command_from_args(["--checker", "", "foo"],
1271
self.assert_command_from_args(["--checker", "", "client"],
1275
1272
command.SetChecker,
1276
1273
value_to_set="")
1278
1275
def test_checker_short(self):
1279
self.assert_command_from_args(["-c", ":", "foo"],
1276
self.assert_command_from_args(["-c", ":", "client"],
1280
1277
command.SetChecker,
1281
1278
value_to_set=":")
1283
1280
def test_host(self):
1284
self.assert_command_from_args(["--host", "foo.example.org",
1285
"foo"], command.SetHost,
1286
value_to_set="foo.example.org")
1281
self.assert_command_from_args(
1282
["--host", "client.example.org", "client"],
1283
command.SetHost, value_to_set="client.example.org")
1288
1285
def test_host_short(self):
1289
self.assert_command_from_args(["-H", "foo.example.org",
1290
"foo"], command.SetHost,
1291
value_to_set="foo.example.org")
1286
self.assert_command_from_args(
1287
["-H", "client.example.org", "client"], command.SetHost,
1288
value_to_set="client.example.org")
1293
1290
def test_secret_devnull(self):
1294
1291
self.assert_command_from_args(["--secret", os.path.devnull,
1295
"foo"], command.SetSecret,
1292
"client"], command.SetSecret,
1296
1293
value_to_set=b"")
1298
1295
def test_secret_tempfile(self):
1314
1312
value = b"secret\0xyzzy\nbar"
1317
self.assert_command_from_args(["-s", f.name, "foo"],
1315
self.assert_command_from_args(["-s", f.name, "client"],
1318
1316
command.SetSecret,
1319
1317
value_to_set=value)
1321
1319
def test_timeout(self):
1322
self.assert_command_from_args(["--timeout", "PT5M", "foo"],
1320
self.assert_command_from_args(["--timeout", "PT5M", "client"],
1323
1321
command.SetTimeout,
1324
1322
value_to_set=300000)
1326
1324
def test_timeout_short(self):
1327
self.assert_command_from_args(["-t", "PT5M", "foo"],
1325
self.assert_command_from_args(["-t", "PT5M", "client"],
1328
1326
command.SetTimeout,
1329
1327
value_to_set=300000)
1331
1329
def test_extended_timeout(self):
1332
1330
self.assert_command_from_args(["--extended-timeout", "PT15M",
1334
1332
command.SetExtendedTimeout,
1335
1333
value_to_set=900000)
1337
1335
def test_interval(self):
1338
self.assert_command_from_args(["--interval", "PT2M", "foo"],
1339
command.SetInterval,
1336
self.assert_command_from_args(["--interval", "PT2M",
1337
"client"], command.SetInterval,
1340
1338
value_to_set=120000)
1342
1340
def test_interval_short(self):
1343
self.assert_command_from_args(["-i", "PT2M", "foo"],
1341
self.assert_command_from_args(["-i", "PT2M", "client"],
1344
1342
command.SetInterval,
1345
1343
value_to_set=120000)
1347
1345
def test_approval_delay(self):
1348
1346
self.assert_command_from_args(["--approval-delay", "PT30S",
1350
1348
command.SetApprovalDelay,
1351
1349
value_to_set=30000)
1353
1351
def test_approval_duration(self):
1354
1352
self.assert_command_from_args(["--approval-duration", "PT1S",
1356
1354
command.SetApprovalDuration,
1357
1355
value_to_set=1000)
1382
1380
self.attributes["Name"] = name
1383
1381
self.calls = []
1384
1382
def Set(self, interface, propname, value, dbus_interface):
1385
testcase.assertEqual(interface, client_dbus_interface)
1386
testcase.assertEqual(dbus_interface,
1387
dbus.PROPERTIES_IFACE)
1383
testcase.assertEqual(client_dbus_interface, interface)
1384
testcase.assertEqual(dbus.PROPERTIES_IFACE,
1388
1386
self.attributes[propname] = value
1389
1387
def Approve(self, approve, dbus_interface):
1390
testcase.assertEqual(dbus_interface,
1391
client_dbus_interface)
1388
testcase.assertEqual(client_dbus_interface,
1392
1390
self.calls.append(("Approve", (approve,
1393
1391
dbus_interface)))
1394
1392
self.client = MockClient(
1441
1439
LastCheckerStatus=-2)
1442
1440
self.clients = collections.OrderedDict(
1444
("/clients/foo", self.client.attributes),
1445
("/clients/barbar", self.other_client.attributes),
1442
(self.client.__dbus_object_path__,
1443
self.client.attributes),
1444
(self.other_client.__dbus_object_path__,
1445
self.other_client.attributes),
1447
self.one_client = {"/clients/foo": self.client.attributes}
1447
self.one_client = {self.client.__dbus_object_path__:
1448
self.client.attributes}
1452
class MockBus(object):
1453
1454
def get_object(client_bus_name, path):
1454
self.assertEqual(client_bus_name, dbus_busname)
1456
# Note: "self" here is the TestCmd instance, not
1457
# the Bus instance, since this is a static method!
1458
"/clients/foo": self.client,
1459
"/clients/barbar": self.other_client,
1455
self.assertEqual(dbus_busname, client_bus_name)
1456
# Note: "self" here is the TestCmd instance, not the
1457
# MockBus instance, since this is a static method!
1458
if path == self.client.__dbus_object_path__:
1460
elif path == self.other_client.__dbus_object_path__:
1461
return self.other_client
1464
1465
class TestBaseCommands(TestCommand):
1466
def test_IsEnabled(self):
1467
self.assertTrue(all(command.IsEnabled().is_enabled(client,
1469
for client, properties
1470
in self.clients.items()))
1472
def test_IsEnabled_run_exits_successfully(self):
1467
def test_IsEnabled_exits_successfully(self):
1473
1468
with self.assertRaises(SystemExit) as e:
1474
1469
command.IsEnabled().run(self.one_client)
1475
1470
if e.exception.code is not None:
1476
self.assertEqual(e.exception.code, 0)
1471
self.assertEqual(0, e.exception.code)
1478
1473
self.assertIsNone(e.exception.code)
1480
def test_IsEnabled_run_exits_with_failure(self):
1475
def test_IsEnabled_exits_with_failure(self):
1481
1476
self.client.attributes["Enabled"] = dbus.Boolean(False)
1482
1477
with self.assertRaises(SystemExit) as e:
1483
1478
command.IsEnabled().run(self.one_client)
1484
1479
if isinstance(e.exception.code, int):
1485
self.assertNotEqual(e.exception.code, 0)
1480
self.assertNotEqual(0, e.exception.code)
1487
1482
self.assertIsNotNone(e.exception.code)
1566
1561
def test_DumpJSON_normal(self):
1567
output = command.DumpJSON().output(self.clients.values())
1568
json_data = json.loads(output)
1569
self.assertDictEqual(json_data, self.expected_json)
1562
with self.capture_stdout_to_buffer() as buffer:
1563
command.DumpJSON().run(self.clients)
1564
json_data = json.loads(buffer.getvalue())
1565
self.assertDictEqual(self.expected_json, json_data)
1568
@contextlib.contextmanager
1569
def capture_stdout_to_buffer():
1570
capture_buffer = io.StringIO()
1571
old_stdout = sys.stdout
1572
sys.stdout = capture_buffer
1574
yield capture_buffer
1576
sys.stdout = old_stdout
1571
1578
def test_DumpJSON_one_client(self):
1572
output = command.DumpJSON().output(self.one_client.values())
1573
json_data = json.loads(output)
1579
with self.capture_stdout_to_buffer() as buffer:
1580
command.DumpJSON().run(self.one_client)
1581
json_data = json.loads(buffer.getvalue())
1574
1582
expected_json = {"foo": self.expected_json["foo"]}
1575
self.assertDictEqual(json_data, expected_json)
1583
self.assertDictEqual(expected_json, json_data)
1577
1585
def test_PrintTable_normal(self):
1578
output = command.PrintTable().output(self.clients.values())
1586
with self.capture_stdout_to_buffer() as buffer:
1587
command.PrintTable().run(self.clients)
1579
1588
expected_output = "\n".join((
1580
1589
"Name Enabled Timeout Last Successful Check",
1581
1590
"foo Yes 00:05:00 2019-02-03T00:00:00 ",
1582
1591
"barbar Yes 00:05:00 2019-02-04T00:00:00 ",
1584
self.assertEqual(output, expected_output)
1593
self.assertEqual(expected_output, buffer.getvalue())
1586
1595
def test_PrintTable_verbose(self):
1587
output = command.PrintTable(verbose=True).output(
1588
self.clients.values())
1596
with self.capture_stdout_to_buffer() as buffer:
1597
command.PrintTable(verbose=True).run(self.clients)
1675
1684
num_lines = max(len(rows) for rows in columns)
1676
expected_output = "\n".join("".join(rows[line]
1677
for rows in columns)
1678
for line in range(num_lines))
1679
self.assertEqual(output, expected_output)
1685
expected_output = ("\n".join("".join(rows[line]
1686
for rows in columns)
1687
for line in range(num_lines))
1689
self.assertEqual(expected_output, buffer.getvalue())
1681
1691
def test_PrintTable_one_client(self):
1682
output = command.PrintTable().output(self.one_client.values())
1692
with self.capture_stdout_to_buffer() as buffer:
1693
command.PrintTable().run(self.one_client)
1683
1694
expected_output = "\n".join((
1684
1695
"Name Enabled Timeout Last Successful Check",
1685
1696
"foo Yes 00:05:00 2019-02-03T00:00:00 ",
1687
self.assertEqual(output, expected_output)
1690
class TestPropertyCmd(TestCommand):
1691
"""Abstract class for tests of command.Property classes"""
1698
self.assertEqual(expected_output, buffer.getvalue())
1701
class TestPropertySetterCmd(TestCommand):
1702
"""Abstract class for tests of command.PropertySetter classes"""
1692
1703
def runTest(self):
1693
1704
if not hasattr(self, "command"):
1715
1726
self.command().run(clients, self.bus)
1718
class TestEnableCmd(TestPropertyCmd):
1729
class TestEnableCmd(TestPropertySetterCmd):
1719
1730
command = command.Enable
1720
1731
propname = "Enabled"
1721
1732
values_to_set = [dbus.Boolean(True)]
1724
class TestDisableCmd(TestPropertyCmd):
1735
class TestDisableCmd(TestPropertySetterCmd):
1725
1736
command = command.Disable
1726
1737
propname = "Enabled"
1727
1738
values_to_set = [dbus.Boolean(False)]
1730
class TestBumpTimeoutCmd(TestPropertyCmd):
1741
class TestBumpTimeoutCmd(TestPropertySetterCmd):
1731
1742
command = command.BumpTimeout
1732
1743
propname = "LastCheckedOK"
1733
1744
values_to_set = [""]
1736
class TestStartCheckerCmd(TestPropertyCmd):
1747
class TestStartCheckerCmd(TestPropertySetterCmd):
1737
1748
command = command.StartChecker
1738
1749
propname = "CheckerRunning"
1739
1750
values_to_set = [dbus.Boolean(True)]
1742
class TestStopCheckerCmd(TestPropertyCmd):
1753
class TestStopCheckerCmd(TestPropertySetterCmd):
1743
1754
command = command.StopChecker
1744
1755
propname = "CheckerRunning"
1745
1756
values_to_set = [dbus.Boolean(False)]
1748
class TestApproveByDefaultCmd(TestPropertyCmd):
1759
class TestApproveByDefaultCmd(TestPropertySetterCmd):
1749
1760
command = command.ApproveByDefault
1750
1761
propname = "ApprovedByDefault"
1751
1762
values_to_set = [dbus.Boolean(True)]
1754
class TestDenyByDefaultCmd(TestPropertyCmd):
1765
class TestDenyByDefaultCmd(TestPropertySetterCmd):
1755
1766
command = command.DenyByDefault
1756
1767
propname = "ApprovedByDefault"
1757
1768
values_to_set = [dbus.Boolean(False)]
1760
class TestPropertyValueCmd(TestPropertyCmd):
1761
"""Abstract class for tests of PropertyValueCmd classes"""
1771
class TestPropertySetterValueCmd(TestPropertySetterCmd):
1772
"""Abstract class for tests of PropertySetterValueCmd classes"""
1763
1774
def runTest(self):
1764
if type(self) is TestPropertyValueCmd:
1775
if type(self) is TestPropertySetterValueCmd:
1766
return super(TestPropertyValueCmd, self).runTest()
1777
return super(TestPropertySetterValueCmd, self).runTest()
1768
1779
def run_command(self, value, clients):
1769
1780
self.command(value).run(clients, self.bus)
1772
class TestSetCheckerCmd(TestPropertyValueCmd):
1783
class TestSetCheckerCmd(TestPropertySetterValueCmd):
1773
1784
command = command.SetChecker
1774
1785
propname = "Checker"
1775
1786
values_to_set = ["", ":", "fping -q -- %s"]
1778
class TestSetHostCmd(TestPropertyValueCmd):
1789
class TestSetHostCmd(TestPropertySetterValueCmd):
1779
1790
command = command.SetHost
1780
1791
propname = "Host"
1781
values_to_set = ["192.0.2.3", "foo.example.org"]
1784
class TestSetSecretCmd(TestPropertyValueCmd):
1792
values_to_set = ["192.0.2.3", "client.example.org"]
1795
class TestSetSecretCmd(TestPropertySetterValueCmd):
1785
1796
command = command.SetSecret
1786
1797
propname = "Secret"
1787
1798
values_to_set = [io.BytesIO(b""),
1788
1799
io.BytesIO(b"secret\0xyzzy\nbar")]
1789
values_to_get = [b"", b"secret\0xyzzy\nbar"]
1792
class TestSetTimeoutCmd(TestPropertyValueCmd):
1800
values_to_get = [f.getvalue() for f in values_to_set]
1803
class TestSetTimeoutCmd(TestPropertySetterValueCmd):
1793
1804
command = command.SetTimeout
1794
1805
propname = "Timeout"
1795
1806
values_to_set = [datetime.timedelta(),