~ahasenack/landscape-client/landscape-client-1.5.5-0ubuntu0.9.04.0

« back to all changes in this revision

Viewing changes to landscape/monitor/tests/test_packagemonitor.py

  • Committer: Bazaar Package Importer
  • Author(s): Rick Clark
  • Date: 2008-09-08 16:35:57 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20080908163557-l3ixzj5dxz37wnw2
Tags: 1.0.18-0ubuntu1
New upstream release 

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
import os
 
2
 
 
3
from twisted.internet.defer import Deferred
 
4
 
 
5
from landscape.lib.persist import Persist
 
6
 
 
7
from landscape.package.reporter import find_reporter_command
 
8
from landscape.package.store import PackageStore
 
9
 
 
10
from landscape.monitor.packagemonitor import PackageMonitor
 
11
from landscape.monitor.monitor import MonitorPluginRegistry
 
12
from landscape.tests.helpers import (
 
13
    LandscapeIsolatedTest, RemoteBrokerHelper, EnvironSaverHelper)
 
14
 
 
15
 
 
16
class PackageMonitorTest(LandscapeIsolatedTest):
 
17
    """Tests for the temperature plugin."""
 
18
 
 
19
    helpers = [RemoteBrokerHelper, EnvironSaverHelper]
 
20
 
 
21
    def setUp(self):
 
22
        """Initialize test helpers and create a sample thermal zone."""
 
23
        super(PackageMonitorTest, self).setUp()
 
24
        self.monitor = MonitorPluginRegistry(self.broker_service.reactor,
 
25
                                            self.remote,
 
26
                                            self.broker_service.config,
 
27
                                            Persist(), self.makeFile())
 
28
 
 
29
        self.package_store_filename = self.makeFile()
 
30
        self.package_store = PackageStore(self.package_store_filename)
 
31
 
 
32
        self.package_monitor = PackageMonitor(self.package_store_filename)
 
33
 
 
34
    def test_create_default_store_on_registration(self):
 
35
        filename = os.path.join(self.broker_service.config.data_path,
 
36
                                "package/database")
 
37
        package_monitor = PackageMonitor()
 
38
        os.unlink(filename)
 
39
        self.assertFalse(os.path.isfile(filename))
 
40
        self.monitor.add(package_monitor)
 
41
        self.assertTrue(os.path.isfile(filename))
 
42
 
 
43
    def test_dont_spawn_reporter_if_message_not_accepted(self):
 
44
        self.monitor.add(self.package_monitor)
 
45
 
 
46
        package_monitor_mock = self.mocker.patch(self.package_monitor)
 
47
        package_monitor_mock.spawn_reporter()
 
48
        self.mocker.count(0)
 
49
 
 
50
        self.mocker.replay()
 
51
 
 
52
        return self.package_monitor.run()
 
53
 
 
54
    def test_spawn_reporter_on_registration_when_already_accepted(self):
 
55
        package_monitor_mock = self.mocker.patch(self.package_monitor)
 
56
        package_monitor_mock.spawn_reporter()
 
57
 
 
58
        # Slightly tricky as we have to wait for the result of run(),
 
59
        # but we don't have its deferred yet.  To handle it, we create
 
60
        # our own deferred, and register a callback for when run()
 
61
        # returns, chaining both deferreds at that point.
 
62
        deferred = Deferred()
 
63
        def run_has_run(run_result_deferred):
 
64
            return run_result_deferred.chainDeferred(deferred)
 
65
 
 
66
        package_monitor_mock.run()
 
67
        self.mocker.passthrough(run_has_run)
 
68
 
 
69
        self.mocker.replay()
 
70
 
 
71
        self.broker_service.message_store.set_accepted_types(["packages"])
 
72
        self.monitor.add(self.package_monitor)
 
73
 
 
74
        return deferred
 
75
 
 
76
    def test_spawn_reporter_on_run_if_message_accepted(self):
 
77
        self.monitor.add(self.package_monitor)
 
78
 
 
79
        self.broker_service.message_store.set_accepted_types(["packages"])
 
80
 
 
81
        package_monitor_mock = self.mocker.patch(self.package_monitor)
 
82
        package_monitor_mock.spawn_reporter()
 
83
        self.mocker.count(2) # Once for registration, then again explicitly.
 
84
 
 
85
        self.mocker.replay()
 
86
 
 
87
        return self.package_monitor.run()
 
88
 
 
89
    def test_package_ids_handling(self):
 
90
        self.monitor.add(self.package_monitor)
 
91
 
 
92
        package_monitor_mock = self.mocker.patch(self.package_monitor)
 
93
        package_monitor_mock.spawn_reporter()
 
94
        self.mocker.replay()
 
95
 
 
96
        message = {"type": "package-ids", "ids": [None], "request-id": 1}
 
97
        self.monitor.dispatch_message(message)
 
98
        task = self.package_store.get_next_task("reporter")
 
99
        self.assertTrue(task)
 
100
        self.assertEquals(task.data, message)
 
101
 
 
102
    def test_spawn_reporter(self):
 
103
        command = self.makeFile("#!/bin/sh\necho 'I am the reporter!' >&2\n")
 
104
        os.chmod(command, 0755)
 
105
        find_command_mock = self.mocker.replace(find_reporter_command)
 
106
        find_command_mock()
 
107
        self.mocker.result(command)
 
108
        self.mocker.replay()
 
109
 
 
110
        package_monitor = PackageMonitor(self.package_store_filename)
 
111
        self.monitor.add(package_monitor)
 
112
        result = package_monitor.spawn_reporter()
 
113
 
 
114
        def got_result(result):
 
115
            log = self.logfile.getvalue()
 
116
            self.assertIn("I am the reporter!", log)
 
117
            self.assertNotIn(command, log)
 
118
 
 
119
        return result.addCallback(got_result)
 
120
 
 
121
    def test_spawn_reporter_without_output(self):
 
122
        find_command_mock = self.mocker.replace(find_reporter_command)
 
123
        find_command_mock()
 
124
        self.mocker.result("/bin/true")
 
125
        self.mocker.replay()
 
126
 
 
127
        package_monitor = PackageMonitor(self.package_store_filename)
 
128
        self.monitor.add(package_monitor)
 
129
        result = package_monitor.spawn_reporter()
 
130
 
 
131
        def got_result(result):
 
132
            log = self.logfile.getvalue()
 
133
            self.assertNotIn("reporter output", log)
 
134
 
 
135
        return result.addCallback(got_result)
 
136
 
 
137
    def test_spawn_reporter_copies_environment(self):
 
138
        command = self.makeFile("#!/bin/sh\necho VAR: $VAR\n")
 
139
        os.chmod(command, 0755)
 
140
        find_command_mock = self.mocker.replace(find_reporter_command)
 
141
        find_command_mock()
 
142
        self.mocker.result(command)
 
143
        self.mocker.replay()
 
144
 
 
145
        package_monitor = PackageMonitor(self.package_store_filename)
 
146
        self.monitor.add(package_monitor)
 
147
 
 
148
        os.environ["VAR"] = "HI!"
 
149
 
 
150
        result = package_monitor.spawn_reporter()
 
151
 
 
152
        def got_result(result):
 
153
            log = self.logfile.getvalue()
 
154
            self.assertIn("VAR: HI!", log)
 
155
            self.assertNotIn(command, log)
 
156
 
 
157
        return result.addCallback(got_result)
 
158
 
 
159
    def test_spawn_reporter_passes_quiet_option(self):
 
160
        command = self.makeFile("#!/bin/sh\necho OPTIONS: $@\n")
 
161
        os.chmod(command, 0755)
 
162
        find_command_mock = self.mocker.replace(find_reporter_command)
 
163
        find_command_mock()
 
164
        self.mocker.result(command)
 
165
        self.mocker.replay()
 
166
 
 
167
        package_monitor = PackageMonitor(self.package_store_filename)
 
168
        self.monitor.add(package_monitor)
 
169
 
 
170
        result = package_monitor.spawn_reporter()
 
171
 
 
172
        def got_result(result):
 
173
            log = self.logfile.getvalue()
 
174
            self.assertIn("OPTIONS: --quiet", log)
 
175
            self.assertNotIn(command, log)
 
176
 
 
177
        return result.addCallback(got_result)
 
178
 
 
179
    def test_call_on_accepted(self):
 
180
        package_monitor_mock = self.mocker.patch(self.package_monitor)
 
181
        package_monitor_mock.spawn_reporter()
 
182
 
 
183
        self.mocker.replay()
 
184
 
 
185
        self.monitor.add(self.package_monitor)
 
186
        self.monitor.reactor.fire(
 
187
            ("message-type-acceptance-changed", "packages"), True)
 
188
 
 
189
    def test_resynchronize(self):
 
190
        """
 
191
        If a 'resynchronize' reactor event is fired, the package
 
192
        monitor should clear all queued tasks and queue a task that
 
193
        tells the report to clear out the rest of the package data.
 
194
        """
 
195
        self.monitor.add(self.package_monitor)
 
196
        message = {"type": "package-ids", "ids": [None], "request-id": 1}
 
197
        self.package_store.add_task("reporter", message)
 
198
 
 
199
        self.broker_service.reactor.fire("resynchronize")
 
200
 
 
201
        # The next task should be the resynchronize message.
 
202
        task = self.package_store.get_next_task("reporter")
 
203
        self.assertEquals(task.data, {"type" : "resynchronize"})
 
204
 
 
205
        # We want to make sure it has the correct id of 2 so that we
 
206
        # know it's not a new task that the reporter could possibly
 
207
        # remove by accident.
 
208
        self.assertEquals(task.id, 2)
 
209
 
 
210
        # Let's remove that task and make sure there are no more tasks
 
211
        # in the queue.
 
212
        task.remove()
 
213
        task = self.package_store.get_next_task("reporter")
 
214
        self.assertEquals(task, None)
 
215
 
 
216
    def test_spawn_reporter_doesnt_chdir(self):
 
217
        command = self.makeFile("#!/bin/sh\necho RUN\n")
 
218
        os.chmod(command, 0755)
 
219
        dir = self.make_dir()
 
220
        cwd = os.getcwd()
 
221
        os.chdir(dir)
 
222
        os.chmod(dir, 0)
 
223
        
 
224
        find_command_mock = self.mocker.replace(find_reporter_command)
 
225
        find_command_mock()
 
226
        self.mocker.result(command)
 
227
        self.mocker.replay()
 
228
 
 
229
        package_monitor = PackageMonitor(self.package_store_filename)
 
230
        self.monitor.add(package_monitor)
 
231
 
 
232
        result = package_monitor.spawn_reporter()
 
233
 
 
234
        def got_result(result):
 
235
            log = self.logfile.getvalue()
 
236
            self.assertIn("RUN", log)
 
237
            # restore permissions to the dir so tearDown can clean it up
 
238
            os.chmod(dir, 0766)
 
239
 
 
240
        return result.addCallback(got_result)