~barry/ubuntu-system-image/citrain-250u1

« back to all changes in this revision

Viewing changes to systemimage/testing/dbus.py

  • Committer: CI bot
  • Date: 2014-09-17 17:56:35 UTC
  • mfrom: (236.1.3 citrain-24.0u1)
  • Revision ID: ps-jenkins@lists.canonical.com-20140917175635-vinboezbdhcojvh9
* New upstream release.
  - LP: #1353178 - The channel.ini file can override the device name by
    setting `[service]device`.
  - LP: #1324241 - Add optional instrumentation to collect code coverage
    data during test suite run via tox.
  - LP: #1279970 - When an exception occurs in a `system-image-dbus`
    D-Bus method, signal, or callback, this exception is logged in the
    standard log file, and the process exits.  Also, `[system]loglevel`
    can now take an optional ":level" prefix which can be used to set
    the log level for the D-Bus API methods.  By default, they log at
    `ERROR` level, but can be set lower for debugging purposes.
  - LP: #1365646 - Don't crash when releasing an unacquired checking lock.
  - LP: #1365761 - When checking files for `last_update_date()` ignore
    PermissionErrors and just keep checking the fall backs.
  - LP: #1369714 - `system-image-cli --dbus` has been deprecated and
    will be removed in the future.
* d/control: Remove tox as a build dependency to avoid having to MIR tox,
  virtualenv, and pip.
* d/rules:
  - Call nose2 explicitly to avoid use of tox.
  - Remove unnecessary override_dh_auto_clean rule.
* d/system-image-common.post{inst,rm}: `set -e` to make lintian happy.

Show diffs side-by-side

added added

removed removed

Lines of Context:
27
27
from gi.repository import GLib
28
28
from systemimage.api import Mediator
29
29
from systemimage.config import config
30
 
from systemimage.dbus import Service
 
30
from systemimage.dbus import Service, log_and_exit
31
31
from systemimage.helpers import MiB, makedirs, safe_remove, version_detail
32
32
from unittest.mock import patch
33
33
 
62
62
class _LiveTestableService(Service):
63
63
    """For testing purposes only."""
64
64
 
 
65
    @log_and_exit
65
66
    @method('com.canonical.SystemImage')
66
67
    def Reset(self):
67
68
        self._api = Mediator()
77
78
        del config.build_number
78
79
        safe_remove(config.system.settings_db)
79
80
 
 
81
    @log_and_exit
80
82
    @method('com.canonical.SystemImage')
81
83
    def TearDown(self):
82
84
        # Like CancelUpdate() except it sends a different signal that's only
84
86
        self._api.cancel()
85
87
        self.TornDown()
86
88
 
 
89
    @log_and_exit
87
90
    @signal('com.canonical.SystemImage')
88
91
    def TornDown(self):
89
92
        pass
106
109
        self._percentage = 0
107
110
        self._rebootable = False
108
111
 
 
112
    @log_and_exit
109
113
    @method('com.canonical.SystemImage')
110
114
    def Reset(self):
111
115
        self._reset()
112
116
 
 
117
    @log_and_exit
113
118
    @method('com.canonical.SystemImage')
114
119
    def CheckForUpdate(self):
115
120
        if self._failure_count > 0:
116
121
            self._reset()
117
122
        GLib.timeout_add_seconds(3, self._send_status)
118
123
 
 
124
    @log_and_exit
119
125
    def _send_status(self):
120
126
        if self._auto_download:
121
127
            self._downloading = True
132
138
            self.UpdateDownloaded()
133
139
        return False
134
140
 
 
141
    @log_and_exit
135
142
    def _send_more_status(self):
136
143
        if self._canceled:
137
144
            self._downloading = False
151
158
        # Continue sending more status.
152
159
        return True
153
160
 
 
161
    @log_and_exit
154
162
    @method('com.canonical.SystemImage', out_signature='s')
155
163
    def PauseDownload(self):
156
164
        if self._downloading:
159
167
        # Otherwise it's a no-op.
160
168
        return ''
161
169
 
 
170
    @log_and_exit
162
171
    @method('com.canonical.SystemImage')
163
172
    def DownloadUpdate(self):
164
173
        self._paused = False
168
177
                self.UpdateProgress(0, 50.0)
169
178
                GLib.timeout_add(500, self._send_more_status)
170
179
 
 
180
    @log_and_exit
171
181
    @method('com.canonical.SystemImage', out_signature='s')
172
182
    def CancelUpdate(self):
173
183
        if self._downloading:
175
185
        # Otherwise it's a no-op.
176
186
        return ''
177
187
 
 
188
    @log_and_exit
178
189
    @method('com.canonical.SystemImage')
179
190
    def ApplyUpdate(self):
180
191
        # Always succeeds.
196
207
 
197
208
    def _reset(self):
198
209
        self._failure_count = 1
 
210
        self._last_error = 'mock service failed'
199
211
 
 
212
    @log_and_exit
200
213
    @method('com.canonical.SystemImage')
201
214
    def Reset(self):
202
215
        self._reset()
203
216
 
 
217
    @log_and_exit
204
218
    @method('com.canonical.SystemImage')
205
219
    def CheckForUpdate(self):
206
220
        msg = ('You need some network for downloading'
207
221
               if self._failure_count > 0
208
222
               else '')
 
223
        # Fake enough of the update status to trick _download() into checking
 
224
        # the failure state.
 
225
        class Update:
 
226
            is_available = True
 
227
        self._update = Update()
209
228
        self.UpdateAvailableStatus(
210
229
            True, False, '42', 1337 * MiB,
211
230
            '1983-09-13T12:13:14',
214
233
            self._failure_count += 1
215
234
            self.UpdateFailed(self._failure_count, msg)
216
235
 
 
236
    @log_and_exit
217
237
    @method('com.canonical.SystemImage', out_signature='s')
218
238
    def CancelUpdate(self):
219
239
        self._failure_count = 0
221
241
 
222
242
 
223
243
class _FailApply(Service):
 
244
    @log_and_exit
224
245
    @method('com.canonical.SystemImage')
225
246
    def Reset(self):
226
247
        pass
227
248
 
 
249
    @log_and_exit
228
250
    @method('com.canonical.SystemImage')
229
251
    def CheckForUpdate(self):
230
252
        self.UpdateAvailableStatus(
233
255
            '')
234
256
        self.UpdateDownloaded()
235
257
 
 
258
    @log_and_exit
236
259
    @method('com.canonical.SystemImage')
237
260
    def ApplyUpdate(self):
238
261
        # The update cannot be applied.
242
265
 
243
266
 
244
267
class _FailResume(Service):
 
268
    @log_and_exit
245
269
    @method('com.canonical.SystemImage')
246
270
    def Reset(self):
247
271
        pass
248
272
 
 
273
    @log_and_exit
249
274
    @method('com.canonical.SystemImage')
250
275
    def CheckForUpdate(self):
251
276
        self.UpdateAvailableStatus(
254
279
            '')
255
280
        self.UpdatePaused(42)
256
281
 
 
282
    @log_and_exit
257
283
    @method('com.canonical.SystemImage')
258
284
    def DownloadUpdate(self):
259
285
        self.UpdateFailed(9, 'You need some network for downloading')
260
286
 
261
287
 
262
288
class _FailPause(Service):
 
289
    @log_and_exit
263
290
    @method('com.canonical.SystemImage')
264
291
    def Reset(self):
265
292
        pass
266
293
 
 
294
    @log_and_exit
267
295
    @method('com.canonical.SystemImage')
268
296
    def CheckForUpdate(self):
269
297
        self.UpdateAvailableStatus(
272
300
            '')
273
301
        self.UpdateProgress(10, 0)
274
302
 
 
303
    @log_and_exit
275
304
    @method('com.canonical.SystemImage', out_signature='s')
276
305
    def PauseDownload(self):
277
306
        return 'no no, not now'
278
307
 
279
308
 
280
309
class _NoUpdate(Service):
 
310
    @log_and_exit
281
311
    @method('com.canonical.SystemImage')
282
312
    def Reset(self):
283
313
        pass
284
314
 
 
315
    @log_and_exit
285
316
    @method('com.canonical.SystemImage')
286
317
    def CheckForUpdate(self):
287
318
        GLib.timeout_add_seconds(3, self._send_status)
288
319
 
 
320
    @log_and_exit
289
321
    def _send_status(self):
290
322
        self.UpdateAvailableStatus(
291
323
            False, False, '', 0,
303
335
        self._version = 'ubuntu=123,mako=456,custom=789'
304
336
        self._checked = '2099-08-01 04:45:00'
305
337
 
 
338
    @log_and_exit
306
339
    @method('com.canonical.SystemImage')
307
340
    def Reset(self):
308
341
        pass
309
342
 
 
343
    @log_and_exit
310
344
    @method('com.canonical.SystemImage', out_signature='isssa{ss}')
311
345
    def Info(self):
312
346
        return (self._buildno, self._device, self._channel, self._updated,
313
347
                version_detail(self._version))
314
348
 
 
349
    @log_and_exit
315
350
    @method('com.canonical.SystemImage', out_signature='a{ss}')
316
351
    def Information(self):
317
352
        return dict(current_build_number=str(self._buildno),
322
357
                    last_check_date=self._checked)
323
358
 
324
359
 
 
360
class _Crasher(Service):
 
361
    @log_and_exit
 
362
    @method('com.canonical.SystemImage')
 
363
    def Crash(self):
 
364
        1/0
 
365
 
 
366
    @log_and_exit
 
367
    @signal('com.canonical.SystemImage')
 
368
    def SignalCrash(self):
 
369
        1/0
 
370
 
 
371
    @log_and_exit
 
372
    @signal('com.canonical.SystemImage')
 
373
    def SignalOkay(self):
 
374
        pass
 
375
 
 
376
    @log_and_exit
 
377
    @method('com.canonical.SystemImage')
 
378
    def CrashSignal(self):
 
379
        self.SignalCrash()
 
380
 
 
381
    @log_and_exit
 
382
    @method('com.canonical.SystemImage')
 
383
    def Okay(self):
 
384
        pass
 
385
 
 
386
    @log_and_exit
 
387
    @method('com.canonical.SystemImage')
 
388
    def CrashAfterSignal(self):
 
389
        self.SignalOkay()
 
390
        1/0
 
391
 
 
392
 
325
393
def get_service(testing_mode, system_bus, object_path, loop):
326
394
    """Return the appropriate service class for the testing mode."""
327
395
    if testing_mode == 'live':
342
410
        ServiceClass = _NoUpdate
343
411
    elif testing_mode == 'more-info':
344
412
        ServiceClass = _MoreInfo
 
413
    elif testing_mode == 'crasher':
 
414
        ServiceClass = _Crasher
345
415
    else:
346
416
        raise RuntimeError('Invalid testing mode: {}'.format(testing_mode))
347
417
    return ServiceClass(system_bus, object_path, loop)