278
282
result = yield self.be.device_is_local(did)
279
283
self.assertFalse(result)
285
def test_shutdown_func(self):
286
"""A shutdown_func can be passed as creation parameter."""
288
be = backend.ControlBackend(shutdown_func=f)
289
self.assertEqual(be.shutdown_func, f)
291
def test_shutdown_func_is_called_on_shutdown(self):
292
"""The shutdown_func is called on shutdown."""
293
self.be.shutdown_func = self._set_called
295
self.assertEqual(self._called, ((), {}))
297
def test_shutdown_func_when_none(self):
298
"""The shutdown_func can be None."""
299
self.be.shutdown_func = None
282
304
class BackendAccountTestCase(BackendBasicTestCase):
283
305
"""Account tests for the backend."""
305
327
"""The account_info method exercises its errback."""
306
328
# pylint: disable=E1101
307
329
self.be.wc.failure = 404
308
yield self.assertFailure(self.be.account_info(), WebClientError)
330
yield self.assertFailure(self.be.account_info(),
331
backend.WebClientError)
334
def test_account_info_fails_with_unauthorized(self):
335
"""The account_info clears the credentials on unauthorized."""
336
# pylint: disable=E1101
337
self.be.wc.failure = 401
339
self.patch(backend.dbus_client, 'clear_credentials',
340
lambda: d.callback('called'))
341
yield self.assertFailure(self.be.account_info(),
342
backend.UnauthorizedError)
311
346
class BackendDevicesTestCase(BackendBasicTestCase):
323
358
def test_devices_info_fails(self):
324
359
"""The devices_info method exercises its errback."""
360
def fail(*args, **kwargs):
361
"""Raise any error other than WebClientError."""
362
raise ValueError(args)
364
self.patch(self.be.wc, 'call_api', fail)
365
yield self.assertFailure(self.be.devices_info(), ValueError)
368
def test_devices_info_with_webclient_error(self):
369
"""The devices_info returns local info if webclient error."""
325
370
# pylint: disable=E1101
326
371
self.be.wc.failure = 404
327
yield self.assertFailure(self.be.devices_info(), WebClientError)
372
result = yield self.be.devices_info()
374
self.assertEqual(result, [LOCAL_DEVICE])
375
self.assertTrue(self.memento.check_error('devices_info',
376
'web client failure'))
379
def test_devices_info_fails_with_unauthorized(self):
380
"""The devices_info clears the credentials on unauthorized."""
381
# pylint: disable=E1101
382
self.be.wc.failure = 401
384
self.patch(backend.dbus_client, 'clear_credentials',
385
lambda: d.callback('called'))
386
yield self.assertFailure(self.be.devices_info(),
387
backend.UnauthorizedError)
391
def test_devices_info_if_files_disable(self):
392
"""The devices_info returns device only info if files is disabled."""
393
yield self.be.disable_files()
394
status = yield self.be.file_sync_status()
395
assert status['status'] == backend.FILE_SYNC_DISABLED, status
397
# pylint: disable=E1101
398
self.be.wc.results[DEVICES_API] = SAMPLE_DEVICES_JSON
399
result = yield self.be.devices_info()
401
expected = EXPECTED_DEVICES_INFO[:]
402
for device in expected:
403
device.pop('limit_bandwidth', None)
404
device.pop('max_download_speed', None)
405
device.pop('max_upload_speed', None)
406
device.pop('show_all_notifications', None)
407
device['configurable'] = ''
408
self.assertEqual(result, expected)
411
def test_devices_info_when_token_name_is_empty(self):
412
"""The devices_info can handle empty token names."""
413
# pylint: disable=E1101
414
self.be.wc.results[DEVICES_API] = EMPTY_DESCRIPTION_JSON
415
result = yield self.be.devices_info()
416
expected = {'configurable': '',
417
'device_id': 'ComputerABCDEF01234token',
418
'is_local': '', 'name': 'None',
419
'type': DEVICE_TYPE_COMPUTER}
420
self.assertEqual(result, [expected])
421
self.assertTrue(self.memento.check_warning('name', 'None'))
424
def test_devices_info_does_not_log_device_id(self):
425
"""The devices_info does not log the device_id."""
426
# pylint: disable=E1101
427
self.be.wc.results[DEVICES_API] = SAMPLE_DEVICES_JSON
428
yield self.be.devices_info()
430
dids = (d['device_id'] for d in EXPECTED_DEVICES_INFO)
431
device_id_logged = all(all(did not in r.getMessage()
432
for r in self.memento.records)
434
self.assertTrue(device_id_logged)
330
437
def test_remove_device(self):
331
438
"""The remove_device method calls the right api."""
332
dtype, did = "Computer", "SAMPLE-TOKEN"
439
dtype, did = DEVICE_TYPE_COMPUTER, "SAMPLE-TOKEN"
333
440
device_id = dtype + did
334
441
apiurl = DEVICE_REMOVE_API % (dtype.lower(), did)
335
442
# pylint: disable=E1101
354
461
"""The remove_device method fails as expected."""
355
462
# pylint: disable=E1101
356
463
self.be.wc.failure = 404
357
yield self.assertFailure(self.be.devices_info(), WebClientError)
464
yield self.assertFailure(self.be.remove_device(self.local_token),
465
backend.WebClientError)
468
def test_remove_device_fails_with_unauthorized(self):
469
"""The remove_device clears the credentials on unauthorized."""
470
# pylint: disable=E1101
471
self.be.wc.failure = 401
473
self.patch(backend.dbus_client, 'clear_credentials',
474
lambda: d.callback('called'))
475
yield self.assertFailure(self.be.remove_device(self.local_token),
476
backend.UnauthorizedError)
480
def test_remove_device_does_not_log_device_id(self):
481
"""The remove_device does not log the device_id."""
482
device_id = DEVICE_TYPE_COMPUTER + TOKEN['token']
483
yield self.be.remove_device(device_id)
485
device_id_logged = all(device_id not in r.getMessage()
486
for r in self.memento.records)
487
self.assertTrue(device_id_logged)
360
490
def test_change_show_all_notifications(self):
411
541
self.assertEqual(backend.dbus_client.limits["upload"], -1)
412
542
self.assertEqual(backend.dbus_client.limits["download"], -1)
545
def test_changing_settings_does_not_log_device_id(self):
546
"""The change_device_settings does not log the device_id."""
547
device_id = 'yadda-yadda'
548
yield self.be.change_device_settings(device_id, {})
550
device_id_logged = all(device_id not in r.getMessage()
551
for r in self.memento.records)
552
self.assertTrue(device_id_logged)
415
555
class BackendVolumesTestCase(BackendBasicTestCase):
416
556
"""Volumes tests for the backend."""
754
929
self.assertEqual(self._called, ((expected_status,), {}))
932
class BackendSyncStatusIfDisabledTestCase(BackendSyncStatusTestCase):
933
"""Syncdaemon state for the backend when file sync is disabled."""
938
def assert_correct_status(self, status, msg=None):
939
"""Check that the resulting status is correct."""
940
sup = super(BackendSyncStatusIfDisabledTestCase, self)
941
if status != FILE_SYNC_STARTING:
942
yield sup.assert_correct_status(FILE_SYNC_DISABLED, msg='')
944
yield sup.assert_correct_status(status, msg=msg)
757
947
class BackendFileSyncOpsTestCase(BackendBasicTestCase):
758
948
"""Syncdaemon operations for the backend."""