/mandos/release

To get this branch, use:
bzr branch http://bzr.recompile.se/loggerhead/mandos/release

« back to all changes in this revision

Viewing changes to mandos-ctl

  • Committer: Teddy Hogeborn
  • Date: 2021-02-03 23:10:42 UTC
  • mto: This revision was merged to the branch mainline in revision 406.
  • Revision ID: teddy@recompile.se-20210203231042-2z3egrvpo1zt7nej
mandos-ctl: Fix bad test for command.Remove and related minor issues

The test for command.Remove removes all clients from the spy server,
and then loops over all clients, looking for the corresponding Remove
command as recorded by the spy server.  But since since there aren't
any clients left after they were removed, no assertions are made, and
the test therefore does nothing.  Fix this.

In tests for command.Approve and command.Deny, add checks that clients
were not somehow removed by the command (in which case, likewise, no
assertions are made).

Add related checks to TestPropertySetterCmd.runTest; i.e. test that a
sequence is not empty before looping over it and making assertions.

* mandos-ctl (TestBaseCommands.test_Remove): Save a copy of the
  original "clients" dict, and loop over those instead.  Add assertion
  that all clients were indeed removed.  Also fix the code which looks
  for the Remove command, which now needs to actually work.
  (TestBaseCommands.test_Approve, TestBaseCommands.test_Deny): Add
  assertion that there are still clients before looping over them.
  (TestPropertySetterCmd.runTest): Add assertion that the list of
  values to get is not empty before looping over them.  Also add check
  that there are still clients before looping over clients.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
#!/usr/bin/python3 -bbI
2
2
# -*- after-save-hook: (lambda () (let ((command (if (fboundp 'file-local-name) (file-local-name (buffer-file-name)) (or (file-remote-p (buffer-file-name) 'localname) (buffer-file-name))))) (if (= (progn (if (get-buffer "*Test*") (kill-buffer "*Test*")) (process-file-shell-command (format "%s --check" (shell-quote-argument command)) nil "*Test*")) 0) (let ((w (get-buffer-window "*Test*"))) (if w (delete-window w))) (progn (with-current-buffer "*Test*" (compilation-mode)) (display-buffer "*Test*" '(display-buffer-in-side-window)))))); coding: utf-8 -*-
3
3
#
4
 
# Mandos Monitor - Control and monitor the Mandos server
 
4
# Mandos Control - Control or query the Mandos server
5
5
#
6
 
# Copyright © 2008-2019 Teddy Hogeborn
7
 
# Copyright © 2008-2019 Björn Påhlsson
 
6
# Copyright © 2008-2020 Teddy Hogeborn
 
7
# Copyright © 2008-2020 Björn Påhlsson
8
8
#
9
9
# This file is part of Mandos.
10
10
#
89
89
 
90
90
locale.setlocale(locale.LC_ALL, "")
91
91
 
92
 
version = "1.8.11"
 
92
version = "1.8.14"
93
93
 
94
94
 
95
95
def main():
726
726
            with self.convert_exception(dbus.Error):
727
727
                value =  method(*args)
728
728
            # DBussy returns values either as an empty list or as a
729
 
            # tuple: (signature, value)
 
729
            # list of one element with the return value
730
730
            if value:
731
731
                return self.type_filter(value[0])
732
732
 
738
738
 
739
739
        def type_filter(self, value):
740
740
            """Convert the most bothersome types to Python types"""
 
741
            # A D-Bus Variant value is represented as the Python type
 
742
            # Tuple[dbussy.DBUS.Signature, Any]
741
743
            if isinstance(value, tuple):
742
744
                if (len(value) == 2
743
745
                    and isinstance(value[0],
2437
2439
        busname = "se.recompile.Mandos"
2438
2440
        client_interface = "se.recompile.Mandos.Client"
2439
2441
        command.Approve().run(self.bus.clients, self.bus)
 
2442
        self.assertTrue(self.bus.clients)
2440
2443
        for clientpath in self.bus.clients:
2441
2444
            self.assertIn(("Approve", busname, clientpath,
2442
2445
                           client_interface, (True,)), self.bus.calls)
2445
2448
        busname = "se.recompile.Mandos"
2446
2449
        client_interface = "se.recompile.Mandos.Client"
2447
2450
        command.Deny().run(self.bus.clients, self.bus)
 
2451
        self.assertTrue(self.bus.clients)
2448
2452
        for clientpath in self.bus.clients:
2449
2453
            self.assertIn(("Approve", busname, clientpath,
2450
2454
                           client_interface, (False,)),
2451
2455
                          self.bus.calls)
2452
2456
 
2453
2457
    def test_Remove(self):
 
2458
        busname = "se.recompile.Mandos"
 
2459
        server_path = "/"
 
2460
        server_interface = "se.recompile.Mandos"
 
2461
        orig_clients = self.bus.clients.copy()
2454
2462
        command.Remove().run(self.bus.clients, self.bus)
2455
 
        for clientpath in self.bus.clients:
2456
 
            self.assertIn(("RemoveClient", dbus_busname,
2457
 
                           dbus_server_path, dbus_server_interface,
 
2463
        self.assertFalse(self.bus.clients)
 
2464
        for clientpath in orig_clients:
 
2465
            self.assertIn(("RemoveClient", busname,
 
2466
                           server_path, server_interface,
2458
2467
                           (clientpath,)), self.bus.calls)
2459
2468
 
2460
2469
    expected_json = {
2662
2671
        else:
2663
2672
            cmd_args = [() for x in range(len(self.values_to_get))]
2664
2673
            values_to_get = self.values_to_get
 
2674
        self.assertTrue(values_to_get)
2665
2675
        for value_to_get, cmd_arg in zip(values_to_get, cmd_args):
2666
2676
            for clientpath in self.bus.clients:
2667
2677
                self.bus.clients[clientpath][self.propname] = (
2668
2678
                    Unique())
2669
2679
            self.command(*cmd_arg).run(self.bus.clients, self.bus)
 
2680
            self.assertTrue(self.bus.clients)
2670
2681
            for clientpath in self.bus.clients:
2671
2682
                value = (self.bus.clients[clientpath]
2672
2683
                         [self.propname])