20
22
"""Initialize test helpers and create a sample thermal zone."""
21
23
LandscapeIsolatedTest.setUp(self)
23
self.manager = ManagerPluginRegistry(self.remote, self.broker_service.reactor,
25
self.manager = ManagerPluginRegistry(self.remote,
26
self.broker_service.reactor,
24
27
self.broker_service.config)
26
self.package_store_filename = self.makeFile()
27
self.package_store = PackageStore(self.package_store_filename)
28
self.package_manager = PackageManager(self.package_store_filename)
29
self.package_store = PackageStore(os.path.join(self.data_path,
31
self.package_manager = PackageManager()
30
def test_create_default_store_on_registration(self):
33
def test_create_default_store_upon_message_handling(self):
35
If the package sqlite database file doesn't exist yet, it is created
36
upon message handling.
31
38
filename = os.path.join(self.broker_service.config.data_path,
32
39
"package/database")
33
package_manager = PackageManager()
34
40
os.unlink(filename)
35
41
self.assertFalse(os.path.isfile(filename))
36
self.manager.add(package_manager)
43
self.manager.add(self.package_manager)
44
self.package_manager.spawn_handler = lambda x: None
45
message = {"type": "release-upgrade"}
46
self.package_manager.handle_release_upgrade(message)
37
47
self.assertTrue(os.path.isfile(filename))
39
49
def test_dont_spawn_changer_if_message_not_accepted(self):
40
self.manager.add(self.package_manager)
42
package_manager_mock = self.mocker.patch(self.package_manager)
43
package_manager_mock.spawn_changer()
48
return self.package_manager.run()
50
def test_spawn_changer_on_registration_when_already_accepted(self):
51
package_manager_mock = self.mocker.patch(self.package_manager)
52
package_manager_mock.spawn_changer()
51
The L{PackageManager} spawns a L{PackageChanger} run only if the
52
appropriate message type is accepted.
54
self.manager.add(self.package_manager)
56
package_manager_mock = self.mocker.patch(self.package_manager)
57
package_manager_mock.spawn_handler(PackageChanger)
62
return self.package_manager.run()
64
def test_dont_spawn_release_upgrader_if_message_not_accepted(self):
66
The L{PackageManager} spawns a L{ReleaseUpgrader} run only if the
67
appropriate message type is accepted.
69
self.manager.add(self.package_manager)
71
package_manager_mock = self.mocker.patch(self.package_manager)
72
package_manager_mock.spawn_handler(ReleaseUpgrader)
77
return self.package_manager.run()
79
def test_spawn_handler_on_registration_when_already_accepted(self):
80
package_manager_mock = self.mocker.patch(self.package_manager)
81
package_manager_mock.spawn_handler(PackageChanger)
54
83
# Slightly tricky as we have to wait for the result of run(),
55
84
# but we don't have its deferred yet. To handle it, we create
56
85
# our own deferred, and register a callback for when run()
57
86
# returns, chaining both deferreds at that point.
58
87
deferred = Deferred()
59
89
def run_has_run(run_result_deferred):
60
90
return run_result_deferred.chainDeferred(deferred)
73
103
def test_spawn_changer_on_run_if_message_accepted(self):
105
The L{PackageManager} spawns a L{PackageChanger} run if messages
106
of type C{"change-packages-result"} are accepted.
74
108
self.manager.add(self.package_manager)
76
110
service = self.broker_service
77
111
service.message_store.set_accepted_types(["change-packages-result"])
79
113
package_manager_mock = self.mocker.patch(self.package_manager)
80
package_manager_mock.spawn_changer()
114
package_manager_mock.spawn_handler(PackageChanger)
115
self.mocker.count(2) # Once for registration, then again explicitly.
119
return self.package_manager.run()
121
def test_spawn_release_upgrader_on_run_if_message_accepted(self):
123
The L{PackageManager} spawns a L{ReleaseUpgrader} run if messages
124
of type C{"operation-result"} are accepted.
126
self.manager.add(self.package_manager)
128
service = self.broker_service
129
service.message_store.set_accepted_types(["operation-result"])
131
package_manager_mock = self.mocker.patch(self.package_manager)
132
package_manager_mock.spawn_handler(ReleaseUpgrader)
81
133
self.mocker.count(2) # Once for registration, then again explicitly.
83
135
self.mocker.replay()
98
150
self.assertTrue(task)
99
151
self.assertEquals(task.data, message)
153
def test_release_upgrade_handling(self):
155
The L{PackageManager.handle_release_upgrade} method is registered has
156
handler for messages of type C{"release-upgrade"}, and queues a task
157
in the appropriate queue.
159
self.manager.add(self.package_manager)
161
package_manager_mock = self.mocker.patch(self.package_manager)
162
package_manager_mock.spawn_handler(ReleaseUpgrader)
165
message = {"type": "release-upgrade"}
166
self.manager.dispatch_message(message)
167
task = self.package_store.get_next_task("release-upgrader")
168
self.assertTrue(task)
169
self.assertEquals(task.data, message)
101
171
def test_spawn_changer(self):
173
The L{PackageManager.spawn_handler} method executes the correct command
174
when passed the L{PackageChanger} class as argument.
102
176
command = self.makeFile("#!/bin/sh\necho 'I am the changer!' >&2\n")
103
177
os.chmod(command, 0755)
104
178
find_command_mock = self.mocker.replace(find_changer_command)
120
193
return result.addCallback(got_result)
122
def test_spawn_changer_without_output(self):
195
def test_spawn_release_upgrader(self):
197
The L{PackageManager.spawn_handler} method executes the correct command
198
when passed the L{ReleaseUpgrader} class as argument.
200
command = self.makeFile("#!/bin/sh\necho 'I am the upgrader!' >&2\n")
201
os.chmod(command, 0755)
202
find_command_mock = self.mocker.replace(find_release_upgrader_command)
204
self.mocker.result(command)
207
self.package_store.add_task("release-upgrader", "Do something!")
209
self.manager.add(self.package_manager)
210
result = self.package_manager.spawn_handler(ReleaseUpgrader)
212
def got_result(result):
213
log = self.logfile.getvalue()
214
self.assertIn("I am the upgrader!", log)
215
self.assertNotIn(command, log)
217
return result.addCallback(got_result)
219
def test_spawn_handler_without_output(self):
123
220
find_command_mock = self.mocker.replace(find_changer_command)
124
221
find_command_mock()
125
222
self.mocker.result("/bin/true")
145
241
self.mocker.result(command)
146
242
self.mocker.replay()
148
package_manager = PackageManager(self.package_store_filename)
149
self.manager.add(package_manager)
244
self.manager.add(self.package_manager)
151
246
self.package_store.add_task("changer", "Do something!")
153
248
os.environ["VAR"] = "HI!"
155
result = package_manager.spawn_changer()
250
result = self.package_manager.spawn_handler(PackageChanger)
157
252
def got_result(result):
158
253
log = self.logfile.getvalue()
184
278
return result.addCallback(got_result)
186
def test_spawn_changer_wont_run_without_tasks(self):
280
def test_spawn_handler_wont_run_without_tasks(self):
187
281
command = self.makeFile("#!/bin/sh\necho RUN!\n")
188
282
os.chmod(command, 0755)
189
find_command_mock = self.mocker.replace(find_changer_command)
191
self.mocker.result(command)
194
package_manager = PackageManager(self.package_store_filename)
195
self.manager.add(package_manager)
197
result = package_manager.spawn_changer()
284
self.manager.add(self.package_manager)
286
result = self.package_manager.spawn_handler(PackageChanger)
199
288
def got_result(result):
200
289
log = self.logfile.getvalue()
203
292
return result.addCallback(got_result)
205
def test_spawn_changer_doesnt_chdir(self):
294
def test_spawn_handler_doesnt_chdir(self):
206
295
command = self.makeFile("#!/bin/sh\necho RUN\n")
207
296
os.chmod(command, 0755)
208
dir = self.make_dir()
212
301
find_command_mock = self.mocker.replace(find_changer_command)
213
302
find_command_mock()
214
303
self.mocker.result(command)
215
304
self.mocker.replay()
217
package_manager = PackageManager(self.package_store_filename)
218
self.manager.add(package_manager)
306
self.manager.add(self.package_manager)
220
308
self.package_store.add_task("changer", "Do something!")
222
result = package_manager.spawn_changer()
310
result = self.package_manager.spawn_handler(PackageChanger)
224
312
def got_result(result):
225
313
log = self.logfile.getvalue()