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

« back to all changes in this revision

Viewing changes to landscape/manager/tests/test_packagemanager.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.package.changer import find_changer_command
 
6
from landscape.package.store import PackageStore
 
7
 
 
8
from landscape.manager.packagemanager import PackageManager
 
9
from landscape.manager.manager import ManagerPluginRegistry
 
10
from landscape.tests.helpers import (
 
11
    LandscapeIsolatedTest, RemoteBrokerHelper, EnvironSaverHelper)
 
12
 
 
13
 
 
14
class PackageManagerTest(LandscapeIsolatedTest):
 
15
    """Tests for the temperature plugin."""
 
16
 
 
17
    helpers = [RemoteBrokerHelper, EnvironSaverHelper]
 
18
 
 
19
    def setUp(self):
 
20
        """Initialize test helpers and create a sample thermal zone."""
 
21
        LandscapeIsolatedTest.setUp(self)
 
22
 
 
23
        self.manager = ManagerPluginRegistry(self.broker_service.reactor,
 
24
                                             self.remote,
 
25
                                             self.broker_service.config)
 
26
 
 
27
        self.package_store_filename = self.makeFile()
 
28
        self.package_store = PackageStore(self.package_store_filename)
 
29
        self.package_manager = PackageManager(self.package_store_filename)
 
30
 
 
31
    def test_create_default_store_on_registration(self):
 
32
        filename = os.path.join(self.broker_service.config.data_path,
 
33
                                "package/database")
 
34
        package_manager = PackageManager()
 
35
        os.unlink(filename)
 
36
        self.assertFalse(os.path.isfile(filename))
 
37
        self.manager.add(package_manager)
 
38
        self.assertTrue(os.path.isfile(filename))
 
39
 
 
40
    def test_dont_spawn_changer_if_message_not_accepted(self):
 
41
        self.manager.add(self.package_manager)
 
42
 
 
43
        package_manager_mock = self.mocker.patch(self.package_manager)
 
44
        package_manager_mock.spawn_changer()
 
45
        self.mocker.count(0)
 
46
 
 
47
        self.mocker.replay()
 
48
 
 
49
        return self.package_manager.run()
 
50
 
 
51
    def test_spawn_changer_on_registration_when_already_accepted(self):
 
52
        package_manager_mock = self.mocker.patch(self.package_manager)
 
53
        package_manager_mock.spawn_changer()
 
54
 
 
55
        # Slightly tricky as we have to wait for the result of run(),
 
56
        # but we don't have its deferred yet.  To handle it, we create
 
57
        # our own deferred, and register a callback for when run()
 
58
        # returns, chaining both deferreds at that point.
 
59
        deferred = Deferred()
 
60
        def run_has_run(run_result_deferred):
 
61
            return run_result_deferred.chainDeferred(deferred)
 
62
 
 
63
        package_manager_mock.run()
 
64
        self.mocker.passthrough(run_has_run)
 
65
 
 
66
        self.mocker.replay()
 
67
 
 
68
        service = self.broker_service
 
69
        service.message_store.set_accepted_types(["change-packages-result"])
 
70
        self.manager.add(self.package_manager)
 
71
 
 
72
        return deferred
 
73
 
 
74
    def test_spawn_changer_on_run_if_message_accepted(self):
 
75
        self.manager.add(self.package_manager)
 
76
 
 
77
        service = self.broker_service
 
78
        service.message_store.set_accepted_types(["change-packages-result"])
 
79
 
 
80
        package_manager_mock = self.mocker.patch(self.package_manager)
 
81
        package_manager_mock.spawn_changer()
 
82
        self.mocker.count(2) # Once for registration, then again explicitly.
 
83
 
 
84
        self.mocker.replay()
 
85
 
 
86
        return self.package_manager.run()
 
87
 
 
88
    def test_change_packages_handling(self):
 
89
        self.manager.add(self.package_manager)
 
90
 
 
91
        package_manager_mock = self.mocker.patch(self.package_manager)
 
92
        package_manager_mock.spawn_changer()
 
93
        self.mocker.replay()
 
94
 
 
95
        message = {"type": "change-packages"}
 
96
        service = self.broker_service
 
97
        self.manager.dispatch_message(message)
 
98
        task = self.package_store.get_next_task("changer")
 
99
        self.assertTrue(task)
 
100
        self.assertEquals(task.data, message)
 
101
 
 
102
    def test_spawn_changer(self):
 
103
        command = self.makeFile("#!/bin/sh\necho 'I am the changer!' >&2\n")
 
104
        os.chmod(command, 0755)
 
105
        find_command_mock = self.mocker.replace(find_changer_command)
 
106
        find_command_mock()
 
107
        self.mocker.result(command)
 
108
        self.mocker.replay()
 
109
 
 
110
        self.package_store.add_task("changer", "Do something!")
 
111
 
 
112
        package_manager = PackageManager(self.package_store_filename)
 
113
        self.manager.add(package_manager)
 
114
        result = package_manager.spawn_changer()
 
115
 
 
116
        def got_result(result):
 
117
            log = self.logfile.getvalue()
 
118
            self.assertIn("I am the changer!", log)
 
119
            self.assertNotIn(command, log)
 
120
 
 
121
        return result.addCallback(got_result)
 
122
 
 
123
    def test_spawn_changer_without_output(self):
 
124
        find_command_mock = self.mocker.replace(find_changer_command)
 
125
        find_command_mock()
 
126
        self.mocker.result("/bin/true")
 
127
        self.mocker.replay()
 
128
 
 
129
        self.package_store.add_task("changer", "Do something!")
 
130
 
 
131
        package_manager = PackageManager(self.package_store_filename)
 
132
        self.manager.add(package_manager)
 
133
        result = package_manager.spawn_changer()
 
134
 
 
135
        def got_result(result):
 
136
            log = self.logfile.getvalue()
 
137
            self.assertNotIn("changer output", log)
 
138
 
 
139
        return result.addCallback(got_result)
 
140
 
 
141
    def test_spawn_changer_copies_environment(self):
 
142
        command = self.makeFile("#!/bin/sh\necho VAR: $VAR\n")
 
143
        os.chmod(command, 0755)
 
144
        find_command_mock = self.mocker.replace(find_changer_command)
 
145
        find_command_mock()
 
146
        self.mocker.result(command)
 
147
        self.mocker.replay()
 
148
 
 
149
        package_manager = PackageManager(self.package_store_filename)
 
150
        self.manager.add(package_manager)
 
151
 
 
152
        self.package_store.add_task("changer", "Do something!")
 
153
 
 
154
        os.environ["VAR"] = "HI!"
 
155
 
 
156
        result = package_manager.spawn_changer()
 
157
 
 
158
        def got_result(result):
 
159
            log = self.logfile.getvalue()
 
160
            self.assertIn("VAR: HI!", log)
 
161
            self.assertNotIn(command, log)
 
162
 
 
163
        return result.addCallback(got_result)
 
164
 
 
165
    def test_spawn_changer_passes_quiet_option(self):
 
166
        command = self.makeFile("#!/bin/sh\necho OPTIONS: $@\n")
 
167
        os.chmod(command, 0755)
 
168
        find_command_mock = self.mocker.replace(find_changer_command)
 
169
        find_command_mock()
 
170
        self.mocker.result(command)
 
171
        self.mocker.replay()
 
172
 
 
173
        package_manager = PackageManager(self.package_store_filename)
 
174
        self.manager.add(package_manager)
 
175
 
 
176
        self.package_store.add_task("changer", "Do something!")
 
177
 
 
178
        result = package_manager.spawn_changer()
 
179
 
 
180
        def got_result(result):
 
181
            log = self.logfile.getvalue()
 
182
            self.assertIn("OPTIONS: --quiet", log)
 
183
            self.assertNotIn(command, log)
 
184
 
 
185
        return result.addCallback(got_result)
 
186
 
 
187
    def test_spawn_changer_wont_run_without_tasks(self):
 
188
        command = self.makeFile("#!/bin/sh\necho RUN!\n")
 
189
        os.chmod(command, 0755)
 
190
        find_command_mock = self.mocker.replace(find_changer_command)
 
191
        find_command_mock()
 
192
        self.mocker.result(command)
 
193
        self.mocker.replay()
 
194
 
 
195
        package_manager = PackageManager(self.package_store_filename)
 
196
        self.manager.add(package_manager)
 
197
 
 
198
        result = package_manager.spawn_changer()
 
199
 
 
200
        def got_result(result):
 
201
            log = self.logfile.getvalue()
 
202
            self.assertNotIn("RUN!", log)
 
203
 
 
204
        return result.addCallback(got_result)
 
205
 
 
206
    def test_spawn_changer_doesnt_chdir(self):
 
207
        command = self.makeFile("#!/bin/sh\necho RUN\n")
 
208
        os.chmod(command, 0755)
 
209
        dir = self.make_dir()
 
210
        os.chdir(dir)
 
211
        os.chmod(dir, 0)
 
212
        
 
213
        find_command_mock = self.mocker.replace(find_changer_command)
 
214
        find_command_mock()
 
215
        self.mocker.result(command)
 
216
        self.mocker.replay()
 
217
 
 
218
        package_manager = PackageManager(self.package_store_filename)
 
219
        self.manager.add(package_manager)
 
220
 
 
221
        self.package_store.add_task("changer", "Do something!")
 
222
 
 
223
        result = package_manager.spawn_changer()
 
224
 
 
225
        def got_result(result):
 
226
            log = self.logfile.getvalue()
 
227
            self.assertIn("RUN", log)
 
228
            # restore permissions to the dir so tearDown can clean it up
 
229
            os.chmod(dir, 0766)
 
230
 
 
231
        return result.addCallback(got_result)