diff options
Diffstat (limited to 'deluge/tests/test_config.py')
-rw-r--r-- | deluge/tests/test_config.py | 159 |
1 files changed, 111 insertions, 48 deletions
diff --git a/deluge/tests/test_config.py b/deluge/tests/test_config.py index 0f6df3bb5..2840dbf5b 100644 --- a/deluge/tests/test_config.py +++ b/deluge/tests/test_config.py @@ -1,23 +1,21 @@ -# -*- coding: utf-8 -*- # # This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with # the additional special exception to link portions of this program with the OpenSSL library. # See LICENSE for more details. # -from __future__ import unicode_literals - +import json +import logging import os from codecs import getwriter +import pytest +import pytest_twisted from twisted.internet import task -from twisted.trial import unittest -import deluge.config from deluge.common import JSON_FORMAT from deluge.config import Config - -from .common import set_tmp_config_dir +from deluge.ui.hostlist import mask_hosts_password DEFAULTS = { 'string': 'foobar', @@ -26,37 +24,42 @@ DEFAULTS = { 'bool': True, 'unicode': 'foobar', 'password': 'abc123*\\[!]?/<>#{@}=|"+$%(^)~', + 'hosts': [ + ('host1', 'port', '', 'password1234'), + ('host2', 'port', '', 'password5678'), + ], } -class ConfigTestCase(unittest.TestCase): - def setUp(self): # NOQA: N803 - self.config_dir = set_tmp_config_dir() +LOGGER = logging.getLogger(__name__) + +class TestConfig: def test_init(self): config = Config('test.conf', defaults=DEFAULTS, config_dir=self.config_dir) - self.assertEqual(DEFAULTS, config.config) + assert DEFAULTS == config.config config = Config('test.conf', config_dir=self.config_dir) - self.assertEqual({}, config.config) + assert {} == config.config def test_set_get_item(self): config = Config('test.conf', config_dir=self.config_dir) config['foo'] = 1 - self.assertEqual(config['foo'], 1) - self.assertRaises(ValueError, config.set_item, 'foo', 'bar') + assert config['foo'] == 1 + with pytest.raises(ValueError): + config.set_item('foo', 'bar') config['foo'] = 2 - self.assertEqual(config.get_item('foo'), 2) + assert config.get_item('foo') == 2 config['foo'] = '3' - self.assertEqual(config.get_item('foo'), 3) + assert config.get_item('foo') == 3 config['unicode'] = 'ВИДЕОФИЛЬМЫ' - self.assertEqual(config['unicode'], 'ВИДЕОФИЛЬМЫ') + assert config['unicode'] == 'ВИДЕОФИЛЬМЫ' config['unicode'] = b'foostring' - self.assertFalse(isinstance(config.get_item('unicode'), bytes)) + assert not isinstance(config.get_item('unicode'), bytes) config._save_timer.cancel() @@ -64,43 +67,103 @@ class ConfigTestCase(unittest.TestCase): config = Config('test.conf', config_dir=self.config_dir) config['foo'] = None - self.assertIsNone(config['foo']) - self.assertIsInstance(config['foo'], type(None)) + assert config['foo'] is None + assert isinstance(config['foo'], type(None)) config['foo'] = 1 - self.assertEqual(config.get('foo'), 1) + assert config.get('foo') == 1 config['foo'] = None - self.assertIsNone(config['foo']) + assert config['foo'] is None config['bar'] = None - self.assertIsNone(config['bar']) + assert config['bar'] is None config['bar'] = None - self.assertIsNone(config['bar']) + assert config['bar'] is None config._save_timer.cancel() + @pytest_twisted.ensureDeferred + async def test_on_changed_callback(self, mock_callback): + config = Config('test.conf', config_dir=self.config_dir) + config.register_change_callback(mock_callback) + config['foo'] = 1 + assert config['foo'] == 1 + await mock_callback.deferred + mock_callback.assert_called_once_with('foo', 1) + + @pytest_twisted.ensureDeferred + async def test_key_function_callback(self, mock_callback): + config = Config( + 'test.conf', defaults={'foo': 1, 'bar': 1}, config_dir=self.config_dir + ) + + assert config['foo'] == 1 + config.register_set_function('foo', mock_callback) + await mock_callback.deferred + mock_callback.assert_called_once_with('foo', 1) + + mock_callback.reset_mock() + config.register_set_function('bar', mock_callback, apply_now=False) + mock_callback.assert_not_called() + config['bar'] = 2 + await mock_callback.deferred + mock_callback.assert_called_once_with('bar', 2) + def test_get(self): config = Config('test.conf', config_dir=self.config_dir) config['foo'] = 1 - self.assertEqual(config.get('foo'), 1) - self.assertEqual(config.get('foobar'), None) - self.assertEqual(config.get('foobar', 2), 2) + assert config.get('foo') == 1 + assert config.get('foobar') is None + assert config.get('foobar', 2) == 2 config['foobar'] = 5 - self.assertEqual(config.get('foobar', 2), 5) + assert config.get('foobar', 2) == 5 + + def test_set_log_mask_funcs(self, caplog): + """Test mask func masks key in log""" + caplog.set_level(logging.DEBUG) + config = Config( + 'test.conf', + config_dir=self.config_dir, + log_mask_funcs={'hosts': mask_hosts_password}, + ) + config['hosts'] = DEFAULTS['hosts'] + assert isinstance(config['hosts'], list) + assert 'host1' in caplog.text + assert 'host2' in caplog.text + assert 'password1234' not in caplog.text + assert 'password5678' not in caplog.text + assert '*' * 10 in caplog.text + + def test_load_log_mask_funcs(self, caplog): + """Test mask func masks key in log""" + with open(os.path.join(self.config_dir, 'test.conf'), 'wb') as _file: + json.dump(DEFAULTS, getwriter('utf8')(_file), **JSON_FORMAT) + + config = Config( + 'test.conf', + config_dir=self.config_dir, + log_mask_funcs={'hosts': mask_hosts_password}, + ) + with caplog.at_level(logging.DEBUG): + config.load(os.path.join(self.config_dir, 'test.conf')) + assert 'host1' in caplog.text + assert 'host2' in caplog.text + assert 'foobar' in caplog.text + assert 'password1234' not in caplog.text + assert 'password5678' not in caplog.text + assert '*' * 10 in caplog.text def test_load(self): def check_config(): config = Config('test.conf', config_dir=self.config_dir) - self.assertEqual(config['string'], 'foobar') - self.assertEqual(config['float'], 0.435) - self.assertEqual(config['password'], 'abc123*\\[!]?/<>#{@}=|"+$%(^)~') + assert config['string'] == 'foobar' + assert config['float'] == 0.435 + assert config['password'] == 'abc123*\\[!]?/<>#{@}=|"+$%(^)~' # Test opening a previous 1.2 config file of just a json object - import json - with open(os.path.join(self.config_dir, 'test.conf'), 'wb') as _file: json.dump(DEFAULTS, getwriter('utf8')(_file), **JSON_FORMAT) @@ -128,38 +191,38 @@ class ConfigTestCase(unittest.TestCase): # We do this twice because the first time we need to save the file to disk # and the second time we do a compare and we should not write ret = config.save() - self.assertTrue(ret) + assert ret ret = config.save() - self.assertTrue(ret) + assert ret config['string'] = 'baz' config['int'] = 2 ret = config.save() - self.assertTrue(ret) + assert ret del config config = Config('test.conf', defaults=DEFAULTS, config_dir=self.config_dir) - self.assertEqual(config['string'], 'baz') - self.assertEqual(config['int'], 2) + assert config['string'] == 'baz' + assert config['int'] == 2 def test_save_timer(self): - self.clock = task.Clock() - deluge.config.callLater = self.clock.callLater + clock = task.Clock() config = Config('test.conf', defaults=DEFAULTS, config_dir=self.config_dir) + config.callLater = clock.callLater config['string'] = 'baz' config['int'] = 2 - self.assertTrue(config._save_timer.active()) + assert config._save_timer.active() # Timeout set for 5 seconds in config, so lets move clock by 5 seconds - self.clock.advance(5) + clock.advance(5) def check_config(config): - self.assertTrue(not config._save_timer.active()) + assert not config._save_timer.active() del config config = Config('test.conf', defaults=DEFAULTS, config_dir=self.config_dir) - self.assertEqual(config['string'], 'baz') - self.assertEqual(config['int'], 2) + assert config['string'] == 'baz' + assert config['int'] == 2 check_config(config) @@ -176,7 +239,7 @@ class ConfigTestCase(unittest.TestCase): from deluge.config import find_json_objects objects = find_json_objects(s) - self.assertEqual(len(objects), 2) + assert len(objects) == 2 def test_find_json_objects_curly_brace(self): """Test with string containing curly brace""" @@ -193,7 +256,7 @@ class ConfigTestCase(unittest.TestCase): from deluge.config import find_json_objects objects = find_json_objects(s) - self.assertEqual(len(objects), 2) + assert len(objects) == 2 def test_find_json_objects_double_quote(self): """Test with string containing double quote""" @@ -211,4 +274,4 @@ class ConfigTestCase(unittest.TestCase): from deluge.config import find_json_objects objects = find_json_objects(s) - self.assertEqual(len(objects), 2) + assert len(objects) == 2 |