Exemple #1
0
    def setUp(self):
        self.bus = Gio.TestDBus()
        self.bus.up()
        self.message_bus = AddressedMessageBus(self.bus.get_bus_address())

        self.service = None
        self.clients = []
Exemple #2
0
    def setUp(self):
        self.bus = Gio.TestDBus()
        self.bus.up()
        self.message_bus = AddressedMessageBus(
            self.bus.get_bus_address(),
            error_mapper=error_mapper
        )

        self.service = None
        self.clients = []
        self.maxDiff = None
Exemple #3
0
class DBusTestCase(unittest.TestCase):
    """Test DBus support with a real DBus connection."""

    TIMEOUT = 3

    def setUp(self):
        self.bus = Gio.TestDBus()
        self.bus.up()
        self.message_bus = AddressedMessageBus(
            self.bus.get_bus_address(),
            error_mapper=error_mapper
        )

        self.service = None
        self.clients = []
        self.maxDiff = None

    def tearDown(self):
        self.message_bus.disconnect()
        self.bus.down()

    def test_message_bus(self):
        """Test the message bus."""
        self.assertTrue(self.message_bus.check_connection())
        self.assertEqual(self.message_bus.address, self.bus.get_bus_address())
        self.assertEqual(self.message_bus.proxy.Ping(), None)

    def _set_service(self, service):
        self.service = service

    def test_xml_specification(self):
        """Test the generated specification."""
        self._set_service(ExampleInterface())

        expected_xml = '''
        <node>
          <!--Specifies ExampleInterface-->
          <interface name="my.testing.Example">
            <method name="GetInfo">
              <arg direction="in" name="arg" type="s"></arg>
              <arg direction="out" name="return" type="s"></arg>
            </method>
            <method name="Hello">
              <arg direction="in" name="name" type="s"></arg>
              <arg direction="out" name="return" type="s"></arg>
            </method>
            <method name="Knock"></method>
            <signal name="Knocked"></signal>
            <property access="read" name="Name" type="s"></property>
            <method name="Raise">
              <arg direction="in" name="message" type="s"></arg>
            </method>
            <method name="ReturnArgs">
              <arg direction="out" name="return_0" type="i"></arg>
              <arg direction="out" name="return_1" type="b"></arg>
              <arg direction="out" name="return_2" type="s"></arg>
            </method>
            <property access="write" name="Secret" type="s"></property>
            <property access="readwrite" name="Value" type="i"></property>
            <signal name="Visited">
              <arg direction="out" name="name" type="s"></arg>
            </signal>
          </interface>
        </node>
        '''

        generated_xml = self.service.__dbus_xml__

        self.assertEqual(
            XMLGenerator.prettify_xml(expected_xml),
            XMLGenerator.prettify_xml(generated_xml)
        )

    def _add_client(self, client_test):
        thread = Thread(None, client_test)
        thread.daemon = True
        self.clients.append(thread)

    def _get_proxy(self, interface_name=None):
        return self.message_bus.get_proxy(
            "my.testing.Example",
            "/my/testing/Example",
            interface_name=interface_name
        )

    def _run_test(self):
        self.message_bus.publish_object(
            "/my/testing/Example",
            self.service
        )

        self.message_bus.register_service(
            "my.testing.Example"
        )

        for client in self.clients:
            client.start()

        self.assertTrue(self._run_service())

        for client in self.clients:
            client.join()

    @run_in_glib(TIMEOUT)
    def _run_service(self):
        return True

    def test_knock(self):
        """Call a simple DBus method."""
        self._set_service(ExampleInterface())
        self.assertEqual(self.service._knocked, False)

        def test():
            proxy = self._get_proxy()
            self.assertEqual(None, proxy.Knock())

        self._add_client(test)
        self._run_test()

        self.assertEqual(self.service._knocked, True)

    def test_hello(self):
        """Call a DBus method."""
        self._set_service(ExampleInterface())
        self.assertEqual(self.service._names, [])

        def test1():
            proxy = self._get_proxy()
            self.assertEqual("Hello, Foo!", proxy.Hello("Foo"))

        def test2():
            proxy = self._get_proxy()
            self.assertEqual("Hello, Bar!", proxy.Hello("Bar"))

        self._add_client(test1)
        self._add_client(test2)
        self._run_test()

        self.assertEqual(sorted(self.service._names), ["Bar", "Foo"])

    def test_name(self):
        """Use a DBus read-only property."""
        self._set_service(ExampleInterface())

        def test1():
            proxy = self._get_proxy()
            self.assertEqual("My example", proxy.Name)

        def test2():
            proxy = self._get_proxy()
            self.assertEqual("My example", proxy.Name)

        def test3():
            proxy = self._get_proxy()
            with self.assertRaises(AttributeError) as cm:
                proxy.Name = "Another example"

            self.assertEqual(
                "Can't set DBus property.",
                str(cm.exception)
            )

            self.assertEqual("My example", proxy.Name)

        self._add_client(test1)
        self._add_client(test2)
        self._add_client(test3)
        self._run_test()

    def test_secret(self):
        """Use a DBus write-only property."""
        self._set_service(ExampleInterface())
        self.assertEqual(self.service._secrets, [])

        def test1():
            proxy = self._get_proxy()
            proxy.Secret = "Secret 1"

        def test2():
            proxy = self._get_proxy()
            proxy.Secret = "Secret 2"

        def test3():
            proxy = self._get_proxy()
            with self.assertRaises(AttributeError) as cm:
                self.fail(proxy.Secret)

            self.assertEqual(
                "Can't read DBus property.",
                str(cm.exception)
            )

        self._add_client(test1)
        self._add_client(test2)
        self._add_client(test3)
        self._run_test()

        self.assertEqual(sorted(self.service._secrets), [
            "Secret 1",
            "Secret 2"
        ])

    def test_value(self):
        """Use a DBus read-write property."""
        self._set_service(ExampleInterface())
        self.assertEqual(self.service._values, [0])

        def test1():
            proxy = self._get_proxy()
            self.assertIn(proxy.Value, (0, 3, 4))
            proxy.Value = 1
            self.assertIn(proxy.Value, (1, 3, 4))
            proxy.Value = 2
            self.assertIn(proxy.Value, (2, 3, 4))

        def test2():
            proxy = self._get_proxy()
            self.assertIn(proxy.Value, (0, 1, 2))
            proxy.Value = 3
            self.assertIn(proxy.Value, (3, 1, 2))
            proxy.Value = 4
            self.assertIn(proxy.Value, (4, 1, 2))

        self._add_client(test1)
        self._add_client(test2)
        self._run_test()

        self.assertEqual(sorted(self.service._values), [0, 1, 2, 3, 4])
        self.assertEqual(self.service._values[0], 0)
        self.assertLess(self.service._values.index(1),
                        self.service._values.index(2))
        self.assertLess(self.service._values.index(3),
                        self.service._values.index(4))

    def test_knocked(self):
        """Use a simple DBus signal."""
        self._set_service(ExampleInterface())
        event = Event()
        knocked = Mock()

        def callback():
            knocked("Knocked!")

        def test_1():
            proxy = self._get_proxy()
            proxy.Knocked.connect(callback)
            event.set()

        def test_2():
            event.wait()
            proxy = self._get_proxy()
            proxy.Knock()
            proxy.Knock()
            proxy.Knock()

        self._add_client(test_1)
        self._add_client(test_2)
        self._run_test()

        knocked.assert_has_calls([
            mock.call("Knocked!"),
            mock.call("Knocked!"),
            mock.call("Knocked!")
        ])

    def test_visited(self):
        """Use a DBus signal."""
        self._set_service(ExampleInterface())
        event = Event()
        visited = Mock()

        def callback(name):
            visited("Visited by {}.".format(name))

        def test1():
            proxy = self._get_proxy()
            proxy.Visited.connect(callback)
            event.set()

        def test2():
            event.wait()
            proxy = self._get_proxy()
            proxy.Hello("Foo")
            proxy.Hello("Bar")

        self._add_client(test1)
        self._add_client(test2)
        self._run_test()

        visited.assert_has_calls([
            mock.call("Visited by Foo."),
            mock.call("Visited by Bar.")
        ])

    def test_unsubscribed(self):
        """Use an unsubscribed DBus signal."""
        self._set_service(ExampleInterface())
        event = Event()
        knocked = Mock()

        def callback():
            knocked("Knocked!")

        def test_1():
            proxy = self._get_proxy()
            proxy.Knocked.connect(callback)
            disconnect_proxy(proxy)
            event.set()

        def test_2():
            event.wait()
            proxy = self._get_proxy()
            proxy.Knock()
            proxy.Knock()
            proxy.Knock()

        self._add_client(test_1)
        self._add_client(test_2)
        self._run_test()

        knocked.assert_not_called()

    def test_asynchronous(self):
        """Call a DBus method asynchronously."""
        self._set_service(ExampleInterface())
        self.assertEqual(self.service._names, [])
        returned = Mock()

        def callback(call, number):
            returned(number, call())

        def test():
            proxy = self._get_proxy()
            proxy.Hello("Foo", callback=callback, callback_args=(1, ))
            proxy.Hello("Foo", callback=callback, callback_args=(2, ))
            proxy.Hello("Bar", callback=callback, callback_args=(3, ))

        self._add_client(test)
        self._run_test()

        returned.assert_has_calls([
            mock.call(1, "Hello, Foo!"),
            mock.call(2, "Hello, Foo!"),
            mock.call(3, "Hello, Bar!"),
        ])

    def test_error(self):
        """Handle a DBus error."""
        self._set_service(ExampleInterface())
        self.assertEqual(self.service._names, [])
        raised = Mock()

        def callback(call, number):
            try:
                call()
            except ExampleException as e:
                raised(number, str(e))

        def test1():
            proxy = self._get_proxy()
            proxy.Raise("Foo failed!", callback=callback, callback_args=(1, ))
            proxy.Raise("Foo failed!", callback=callback, callback_args=(2, ))
            proxy.Raise("Bar failed!", callback=callback, callback_args=(3, ))

        def test2():
            proxy = self._get_proxy()

            try:
                proxy.Raise("My message")
            except ExampleException as e:
                self.assertEqual(str(e), "My message")
            else:
                self.fail("Exception wasn't raised!")

        self._add_client(test1)
        self._add_client(test2)

        with self.assertLogs(level='WARN'):
            self._run_test()

        raised.assert_has_calls([
            mock.call(1, "Foo failed!"),
            mock.call(2, "Foo failed!"),
            mock.call(3, "Bar failed!"),
        ])

    def test_properties_changed(self):
        """Test the PropertiesChanged signal."""
        self._set_service(ExampleInterface())
        event = Event()
        callback = Mock()

        def test_1():
            proxy = self._get_proxy()
            proxy.PropertiesChanged.connect(callback)
            event.set()

        def test_2():
            event.wait()
            proxy = self._get_proxy()
            proxy.Value = 10

        self._add_client(test_1)
        self._add_client(test_2)
        self._run_test()

        callback.assert_called_once_with(
            "my.testing.Example",
            {"Value": get_variant(Int, 10)},
            ["Name"]
        )

    def test_interface(self):
        """Use a specific DBus interface."""
        self._set_service(ExampleInterface())

        def test_1():
            proxy = self._get_proxy(interface_name="my.testing.Example")
            proxy.Knock()

            with self.assertRaises(AttributeError):
                proxy.Ping()

        def test_2():
            proxy = self._get_proxy(interface_name="org.freedesktop.DBus.Peer")
            proxy.Ping()

            with self.assertRaises(AttributeError):
                proxy.Knock()

        self._add_client(test_1)
        self._add_client(test_2)
        self._run_test()

    def test_additional_arguments(self):
        """Call a DBus method."""
        self._set_service(ExampleInterface())

        def test1():
            proxy = self._get_proxy()
            self.assertEqual(
                proxy.GetInfo("Foo"),
                "Foo: {'sender': ':1.0'}"
            )

        def test2():
            proxy = self._get_proxy()
            self.assertEqual(
                proxy.GetInfo("Bar"),
                "Bar: {'sender': ':1.0'}"
            )

        self._add_client(test1)
        self._add_client(test2)
        self._run_test()

    def test_multiple_output_arguments(self):
        """Call a DBus method with multiple output arguments."""
        self._set_service(ExampleInterface())

        def test1():
            proxy = self._get_proxy()
            self.assertEqual(
                proxy.ReturnArgs(),
                (0, False, "zero")
            )

        self._add_client(test1)
        self._run_test()
            for line in input_file:
                # change path to the startup script to point to local copy
                output_file.write(line.replace(EXEC_PATH, modified_exec_path))

test_dbus = Gio.TestDBus()

# set service folder
test_dbus.add_service_dir(temp_service_dir.name)

try:
    # start the custom DBus daemon
    print("starting custom dbus session")
    test_dbus.up()

    # our custom bus is now running, connect to it
    test_dbus_connection = AddressedMessageBus(test_dbus.get_bus_address())

    enter_word = GREEN + "enter" + RESET
    q_word = GREEN + "q" + RESET
    print("")
    print(
        "###########################################################################"
    )
    print("Connect to the bus address below [press a key to continue]:")
    print("(guid part may be ignored)")
    print(GREEN + test_dbus_connection.address + RESET)
    if args.kickstart:
        print()
        print("Kickstart file {} will be distributed to modules.".format(
            args.kickstart))
    print()
Exemple #5
0
 def test_addressed_bus(self, getter):
     """Test the addressed bus."""
     message_bus = AddressedMessageBus("ADDRESS")
     self._check_addressed_connection(message_bus, getter, "ADDRESS")
Exemple #6
0
class DBusTestCase(unittest.TestCase):
    """Test DBus support with a real DBus connection."""

    TIMEOUT = 3

    def setUp(self):
        self.bus = Gio.TestDBus()
        self.bus.up()
        self.message_bus = AddressedMessageBus(self.bus.get_bus_address())

        self.service = None
        self.clients = []

    def tearDown(self):
        self.message_bus.disconnect()
        self.bus.down()

    def test_message_bus(self):
        """Test the message bus."""
        self.assertTrue(self.message_bus.check_connection())
        self.assertEqual(self.message_bus.address, self.bus.get_bus_address())
        self.assertEqual(self.message_bus.proxy.Ping(), None)

    def _set_service(self, service):
        self.service = service

    def _add_client(self, client_test):
        thread = Thread(None, client_test)
        thread.daemon = True
        self.clients.append(thread)

    def _get_proxy(self):
        return self.message_bus.get_proxy("my.testing.Example",
                                          "/my/testing/Example")

    def _run_test(self):
        self.message_bus.publish_object("/my/testing/Example", self.service)

        self.message_bus.register_service("my.testing.Example")

        for client in self.clients:
            client.start()

        self.assertTrue(self._run_service())

        for client in self.clients:
            client.join()

    @run_in_glib(TIMEOUT)
    def _run_service(self):
        return True

    def test_knock(self):
        """Call a simple DBus method."""
        self._set_service(ExampleInterface())
        self.assertEqual(self.service._knocked, False)

        def test():
            proxy = self._get_proxy()
            self.assertEqual(None, proxy.Knock())

        self._add_client(test)
        self._run_test()

        self.assertEqual(self.service._knocked, True)

    def test_hello(self):
        """Call a DBus method."""
        self._set_service(ExampleInterface())
        self.assertEqual(self.service._names, [])

        def test1():
            proxy = self._get_proxy()
            self.assertEqual("Hello, Foo!", proxy.Hello("Foo"))

        def test2():
            proxy = self._get_proxy()
            self.assertEqual("Hello, Bar!", proxy.Hello("Bar"))

        self._add_client(test1)
        self._add_client(test2)
        self._run_test()

        self.assertEqual(sorted(self.service._names), ["Bar", "Foo"])

    def test_name(self):
        """Use a DBus read-only property."""
        self._set_service(ExampleInterface())

        def test1():
            proxy = self._get_proxy()
            self.assertEqual("My example", proxy.Name)

        def test2():
            proxy = self._get_proxy()
            self.assertEqual("My example", proxy.Name)

        def test3():
            proxy = self._get_proxy()
            with self.assertRaises(AttributeError):
                proxy.Name = "Another example"

            self.assertEqual("My example", proxy.Name)

        self._add_client(test1)
        self._add_client(test2)
        self._add_client(test3)
        self._run_test()

    def test_secret(self):
        """Use a DBus write-only property."""
        self._set_service(ExampleInterface())
        self.assertEqual(self.service._secrets, [])

        def test1():
            proxy = self._get_proxy()
            proxy.Secret = "Secret 1"

        def test2():
            proxy = self._get_proxy()
            proxy.Secret = "Secret 2"

        def test3():
            proxy = self._get_proxy()
            with self.assertRaises(AttributeError):
                self.fail(proxy.Secret)

        self._add_client(test1)
        self._add_client(test2)
        self._add_client(test3)
        self._run_test()

        self.assertEqual(sorted(self.service._secrets),
                         ["Secret 1", "Secret 2"])

    def test_value(self):
        """Use a DBus read-write property."""
        self._set_service(ExampleInterface())
        self.assertEqual(self.service._values, [0])

        def test1():
            proxy = self._get_proxy()
            self.assertIn(proxy.Value, (0, 3, 4))
            proxy.Value = 1
            self.assertIn(proxy.Value, (1, 3, 4))
            proxy.Value = 2
            self.assertIn(proxy.Value, (2, 3, 4))

        def test2():
            proxy = self._get_proxy()
            self.assertIn(proxy.Value, (0, 1, 2))
            proxy.Value = 3
            self.assertIn(proxy.Value, (3, 1, 2))
            proxy.Value = 4
            self.assertIn(proxy.Value, (4, 1, 2))

        self._add_client(test1)
        self._add_client(test2)
        self._run_test()

        self.assertEqual(sorted(self.service._values), [0, 1, 2, 3, 4])
        self.assertEqual(self.service._values[0], 0)
        self.assertLess(self.service._values.index(1),
                        self.service._values.index(2))
        self.assertLess(self.service._values.index(3),
                        self.service._values.index(4))

    def test_knocked(self):
        """Use a simple DBus signal."""
        self._set_service(ExampleInterface())
        event = Event()
        knocked = Mock()

        def callback():
            knocked("Knocked!")

        def test_1():
            proxy = self._get_proxy()
            proxy.Knocked.connect(callback)
            event.set()

        def test_2():
            event.wait()
            proxy = self._get_proxy()
            proxy.Knock()
            proxy.Knock()
            proxy.Knock()

        self._add_client(test_1)
        self._add_client(test_2)
        self._run_test()

        knocked.assert_has_calls([
            mock.call("Knocked!"),
            mock.call("Knocked!"),
            mock.call("Knocked!")
        ])

    def test_visited(self):
        """Use a DBus signal."""
        self._set_service(ExampleInterface())
        event = Event()
        visited = Mock()

        def callback(name):
            visited("Visited by {}.".format(name))

        def test1():
            proxy = self._get_proxy()
            proxy.Visited.connect(callback)
            event.set()

        def test2():
            event.wait()
            proxy = self._get_proxy()
            proxy.Hello("Foo")
            proxy.Hello("Bar")

        self._add_client(test1)
        self._add_client(test2)
        self._run_test()

        visited.assert_has_calls(
            [mock.call("Visited by Foo."),
             mock.call("Visited by Bar.")])

    def test_unsubscribed(self):
        """Use an unsubscribed DBus signal."""
        self._set_service(ExampleInterface())
        event = Event()
        knocked = Mock()

        def callback():
            knocked("Knocked!")

        def test_1():
            proxy = self._get_proxy()
            proxy.Knocked.connect(callback)
            disconnect_proxy(proxy)
            event.set()

        def test_2():
            event.wait()
            proxy = self._get_proxy()
            proxy.Knock()
            proxy.Knock()
            proxy.Knock()

        self._add_client(test_1)
        self._add_client(test_2)
        self._run_test()

        knocked.assert_not_called()

    def test_asynchronous(self):
        """Call a DBus method asynchronously."""
        self._set_service(ExampleInterface())
        self.assertEqual(self.service._names, [])
        returned = Mock()

        def callback(call, number):
            returned(number, call())

        def test():
            proxy = self._get_proxy()
            proxy.Hello("Foo", callback=callback, callback_args=(1, ))
            proxy.Hello("Foo", callback=callback, callback_args=(2, ))
            proxy.Hello("Bar", callback=callback, callback_args=(3, ))

        self._add_client(test)
        self._run_test()

        returned.assert_has_calls([
            mock.call(1, "Hello, Foo!"),
            mock.call(2, "Hello, Foo!"),
            mock.call(3, "Hello, Bar!"),
        ])

    def test_error(self):
        """Handle a DBus error."""
        self._set_service(ExampleInterface())
        self.assertEqual(self.service._names, [])
        raised = Mock()

        def callback(call, number):
            try:
                call()
            except ExampleException as e:
                raised(number, str(e))

        def test1():
            proxy = self._get_proxy()
            proxy.Raise("Foo failed!", callback=callback, callback_args=(1, ))
            proxy.Raise("Foo failed!", callback=callback, callback_args=(2, ))
            proxy.Raise("Bar failed!", callback=callback, callback_args=(3, ))

        def test2():
            proxy = self._get_proxy()

            try:
                proxy.Raise("My message")
            except ExampleException as e:
                self.assertEqual(str(e), "My message")
            else:
                self.fail("Exception wasn't raised!")

        self._add_client(test1)
        self._add_client(test2)

        with self.assertLogs(level='WARN'):
            self._run_test()

        raised.assert_has_calls([
            mock.call(1, "Foo failed!"),
            mock.call(2, "Foo failed!"),
            mock.call(3, "Bar failed!"),
        ])

    def test_properties_changed(self):
        self._set_service(ExampleInterface())
        event = Event()
        callback = Mock()

        def test_1():
            proxy = self._get_proxy()
            proxy.PropertiesChanged.connect(callback)
            event.set()

        def test_2():
            event.wait()
            proxy = self._get_proxy()
            proxy.Value = 10

        self._add_client(test_1)
        self._add_client(test_2)
        self._run_test()

        callback.assert_called_once_with("my.testing.Example",
                                         {"Value": get_variant(Int, 10)},
                                         ["Name"])