~wgrant/ubuntu/natty/landscape-client/natty-updates-broken

« back to all changes in this revision

Viewing changes to landscape/tests/test_plugin.py

  • Committer: Bazaar Package Importer
  • Author(s): Free Ekanayaka
  • Date: 2010-04-21 19:58:10 UTC
  • mfrom: (1.1.16 upstream)
  • Revision ID: james.westby@ubuntu.com-20100421195810-s30uv3s6i27lue38
Tags: 1.5.2-0ubuntu0.10.10.0
* New upstream version (LP: #594594):
  - A new includes information about active network devices and their
    IP address in sysinfo output (LP: #272344).
  - A new plugin collects information about network traffic (#LP :284662).
  - Report information about which packages requested a reboot (LP: #538253).
  - Fix breakage on Lucid AMIs having no ramdisk (LP: #574810).
  - Migrate the inter-process communication system from DBus to Twisted AMP.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
from twisted.internet.defer import Deferred
2
2
 
3
 
from landscape.tests.helpers import LandscapeTest, LandscapeIsolatedTest
 
3
from landscape.tests.helpers import LandscapeTest
4
4
 
5
 
from landscape.plugin import (PluginRegistry, BrokerClientPluginRegistry,
6
 
                              BrokerPlugin, HandlerNotFoundError)
7
 
from landscape.lib.dbus_util import method
8
 
from landscape.lib.twisted_util import gather_results
9
 
from landscape.lib.bpickle import dumps
10
 
from landscape.tests.helpers import RemoteBrokerHelper, DEFAULT_ACCEPTED_TYPES
 
5
from landscape.plugin import PluginRegistry
11
6
 
12
7
 
13
8
class SamplePlugin(object):
64
59
        plugin = SamplePlugin()
65
60
        self.registry.add(plugin)
66
61
        self.assertEquals(self.registry.get_plugin("sample"), plugin)
67
 
 
68
 
 
69
 
class BrokerClientPluginTest(LandscapeIsolatedTest):
70
 
    helpers = [RemoteBrokerHelper]
71
 
 
72
 
    def setUp(self):
73
 
        super(BrokerClientPluginTest, self).setUp()
74
 
        self.registry = BrokerClientPluginRegistry(self.remote)
75
 
 
76
 
    def test_register_plugin(self):
77
 
        sample_plugin = SamplePlugin()
78
 
        self.registry.add(sample_plugin)
79
 
        self.assertEquals(sample_plugin.registered, [self.registry])
80
 
 
81
 
    def test_get_plugins(self):
82
 
        plugin1 = SamplePlugin()
83
 
        plugin2 = SamplePlugin()
84
 
        self.registry.add(plugin1)
85
 
        self.registry.add(plugin2)
86
 
        self.assertEquals(self.registry.get_plugins()[-2:], [plugin1, plugin2])
87
 
 
88
 
    def test_get_named_plugin(self):
89
 
        """
90
 
        If a plugin has a C{plugin_name} attribute, it is possible to look it
91
 
        up by name after adding it to the L{Monitor}.
92
 
        """
93
 
        plugin = SamplePlugin()
94
 
        self.registry.add(plugin)
95
 
        self.assertEquals(self.registry.get_plugin("sample"), plugin)
96
 
 
97
 
    def test_dispatch_message(self):
98
 
        """C{dispatch_message} calls a previously-registered message handler.
99
 
        """
100
 
        l = []
101
 
        def got_it(message):
102
 
            l.append(message)
103
 
            return "Heyo"
104
 
        self.registry.register_message("foo", got_it)
105
 
        msg = {"type": "foo", "value": "whatever"}
106
 
        self.assertEquals(self.registry.dispatch_message(msg), "Heyo")
107
 
        self.assertEquals(l, [msg])
108
 
 
109
 
    def test_dispatch_nonexistent_message(self):
110
 
        """
111
 
        L{HandlerNotFoundError} is raised when a message handler can't be
112
 
        found.
113
 
        """
114
 
        msg = {"type": "foo", "value": "whatever"}
115
 
        self.assertRaises(HandlerNotFoundError,
116
 
                          self.registry.dispatch_message, msg)
117
 
 
118
 
    def test_register_message_registers_message_type_with_broker(self):
119
 
        """
120
 
        When register_plugin is called on a BrokerClientPluginRegistry, the
121
 
        broker is notified that the message type is now accepted.
122
 
        """
123
 
        result1 = self.registry.register_message("foo", lambda m: None)
124
 
        result2 = self.registry.register_message("bar", lambda m: None)
125
 
        def got_result(result):
126
 
            exchanger = self.broker_service.exchanger
127
 
            self.assertEquals(exchanger.get_client_accepted_message_types(),
128
 
                              sorted(["bar", "foo"] + DEFAULT_ACCEPTED_TYPES))
129
 
        return gather_results([result1, result2]).addCallback(got_result)
130
 
 
131
 
    def test_exchange_calls_exchanges(self):
132
 
        """
133
 
        The L{PluginRegistry.exchange} method calls C{exchange} on all
134
 
        plugins, if available.
135
 
        """
136
 
        plugin1 = SamplePlugin()
137
 
        self.assertFalse(hasattr(plugin1, "exchange"))
138
 
 
139
 
        exchange_plugin1 = ExchangePlugin()
140
 
        exchange_plugin2 = ExchangePlugin()
141
 
 
142
 
        self.registry.add(plugin1)
143
 
        self.registry.add(exchange_plugin1)
144
 
        self.registry.add(exchange_plugin2)
145
 
        self.registry.add(SamplePlugin())
146
 
 
147
 
        self.registry.exchange()
148
 
        self.assertEquals(exchange_plugin1.exchanged, 1)
149
 
        self.assertEquals(exchange_plugin2.exchanged, 1)
150
 
 
151
 
    def test_exchange_logs_errors_and_continues(self):
152
 
        self.log_helper.ignore_errors(ZeroDivisionError)
153
 
        plugin1 = SamplePlugin()
154
 
        plugin2 = ExchangePlugin()
155
 
        plugin1.exchange = lambda: 1/0
156
 
        self.registry.add(plugin1)
157
 
        self.registry.add(plugin2)
158
 
 
159
 
        self.registry.exchange()
160
 
        self.assertEquals(plugin2.exchanged, 1)
161
 
        self.assertTrue("ZeroDivisionError" in self.logfile.getvalue())
162
 
 
163
 
    def test_broker_restart(self):
164
 
        """
165
 
        When L{BrokerClientPluginRegistry.broker_started} is called, any
166
 
        message types previously registered with the broker are registered
167
 
        again.
168
 
        """
169
 
        result1 = self.registry.register_message("foo", lambda m: None)
170
 
        result2 = self.registry.register_message("bar", lambda m: None)
171
 
        types = []
172
 
        d = Deferred()
173
 
        def register_client_accepted_message_type(type):
174
 
            types.append(type)
175
 
            if len(types) == 2:
176
 
                d.callback(types)
177
 
        def got_result(result):
178
 
            self.registry.broker.register_client_accepted_message_type = \
179
 
                 register_client_accepted_message_type
180
 
            self.registry.broker_started()
181
 
            return d.addCallback(self.assertEquals, ["foo", "bar"])
182
 
        return gather_results([result1, result2]).addCallback(got_result)
183
 
 
184
 
 
185
 
def assertReceivesMessages(test_case, broker_plugin, broker_service, remote):
186
 
    """
187
 
    Assert (with the given C{test_case}) that the given C{broker_plugin} is
188
 
    correctly receiving messages sent by the given C{broker_service} when
189
 
    registered with the given C{remote}.
190
 
 
191
 
    @return: A deferred that you should return from your test case.
192
 
    """
193
 
    final_result = Deferred()
194
 
    broker_plugin.registry.register_message("foo", final_result.callback)
195
 
 
196
 
    result = remote.register_plugin(broker_plugin.bus_name,
197
 
                                    broker_plugin.object_path)
198
 
 
199
 
    def registered(result):
200
 
        transport = broker_service.transport
201
 
        transport.responses.append([{"type": "foo", "value": 42}])
202
 
        return broker_service.exchanger.exchange()
203
 
    result.addCallback(registered)
204
 
 
205
 
    def ready(message):
206
 
        test_case.assertEquals(message, {"type": "foo", "value": 42})
207
 
 
208
 
    final_result.addCallback(ready)
209
 
    return final_result
210
 
 
211
 
 
212
 
class MyBrokerPlugin(BrokerPlugin):
213
 
    bus_name = "my.service"
214
 
    object_path = "/my/service"
215
 
 
216
 
    ping = method(bus_name)(BrokerPlugin.ping)
217
 
    exit = method(bus_name)(BrokerPlugin.exit)
218
 
    message = method(bus_name)(BrokerPlugin.message)
219
 
 
220
 
 
221
 
class BrokerPluginTests(LandscapeIsolatedTest):
222
 
    """Tests for L{BrokerPlugin}."""
223
 
 
224
 
    helpers = [RemoteBrokerHelper]
225
 
 
226
 
    def setUp(self):
227
 
        super(BrokerPluginTests, self).setUp()
228
 
        self.registry = BrokerClientPluginRegistry(self.remote)
229
 
 
230
 
    def test_message_receiving(self):
231
 
        """
232
 
        BrokerPlugins can receive messages via Broker. Really this is a test
233
 
        for L{assertReceivesMessages}.
234
 
        """
235
 
        plugin = MyBrokerPlugin(self.broker_service.bus, self.registry)
236
 
        return assertReceivesMessages(self, plugin, self.broker_service,
237
 
                                      self.remote)
238
 
 
239
 
    def test_message_found(self):
240
 
        """
241
 
        When a message handler is found and dispatched, C{message} returns
242
 
        True.
243
 
        """
244
 
        l = []
245
 
        self.registry.register_message("foo", l.append)
246
 
        broker_plugin = MyBrokerPlugin(self.broker_service.bus, self.registry)
247
 
        msg = {"type": "foo", "value": "x"}
248
 
        array = map(ord, dumps(msg))
249
 
        self.assertEquals(broker_plugin.dispatch_message(array), True)
250
 
        self.assertEquals(l, [msg])
251
 
 
252
 
    def test_message_not_found(self):
253
 
        """
254
 
        When a message handler is not found for a type of message, {message}
255
 
        returns False.
256
 
        """
257
 
        broker_plugin = MyBrokerPlugin(self.broker_service.bus, self.registry)
258
 
        msg = {"type": "foo", "value": "x"}
259
 
        array = map(ord, dumps(msg))
260
 
        self.assertEquals(broker_plugin.dispatch_message(array), False)
261
 
 
262
 
    def test_exchange_notification_calls_exchange(self):
263
 
        """
264
 
        When the L{Broker} notifies the L{MonitorDBusObject} that an
265
 
        exchange is about to happen, the plugins' C{exchange} methods
266
 
        gets called.
267
 
        """
268
 
        exchange_plugin1 = ExchangePlugin()
269
 
        exchange_plugin2 = ExchangePlugin()
270
 
        self.registry.add(exchange_plugin1)
271
 
        self.registry.add(exchange_plugin2)
272
 
 
273
 
        broker_plugin = MyBrokerPlugin(self.broker_service.bus, self.registry)
274
 
        self.broker_service.reactor.fire("impending-exchange")
275
 
 
276
 
        d = gather_results([exchange_plugin1.wait_for_exchange(),
277
 
                            exchange_plugin2.wait_for_exchange()])
278
 
        d.addCallback(self.assertEquals, [None, None])
279
 
        return d