def test_read_no_path(self): ''' Test _read() is bailing out if no path [yet] exists. :return: ''' logger = MagicMock() with patch('salt.utils.cache.log', logger): cache.CacheDisk(0, '/solar/interference') assert logger.error.call_count == 0 assert logger.debug.call_count == 1 assert len(logger.debug.call_args[0]) == 2 msg, arg = logger.debug.call_args[0] assert msg % arg == 'Cache path does not exist for reading: /solar/interference'
def test_store_target_is_not_writable(self): ''' Test store() function cannot write target properly. :return: ''' logger = MagicMock() with patch('salt.utils.cache.log', logger): c = cache.CacheDisk(0, '/dev/nowhere') c.store() assert logger.error.call_count == 1 assert len(logger.error.call_args[0]) == 2 msg, args = logger.error.call_args[0] assert msg % args == 'Error storing cache data to the disk: Your processor does not develop enough heat.'
def test_cache_data_expiration(self): ''' Test if data is expired. :return: ''' c = cache.CacheDisk(0xffff, '/dev/nowhere') c['banana'] = 42 assert 'banana' in c with patch.object(c, '_ttl', -1): assert 'banana' not in c assert isinstance(c._key_cache_time, dict) assert not c._key_cache_time
def test_add_remove_operations(self): ''' Test dict operations set/delete on the cache object. :return: ''' c = cache.CacheDisk(0, '/dev/nowhere') assert 'backup_destination' not in c assert c['backup_destination'] is None c['backup_destination'] = '/dev/null' assert c['backup_destination'] == '/dev/null' del c['backup_destination'] assert 'backup_destination' not in c assert c['backup_destination'] is None
def test_read_new_format_support(self): ''' Test _read() supports new format of the cache. :return: ''' logger = MagicMock() with patch('salt.utils.cache.log', logger): c = cache.CacheDisk(0, '/dev/nowhere') assert 'banana' in c assert 'status' in c['banana'] # pylint: disable=E1135 assert c['banana']['status'] == 'rotten' assert c['banana'] == c._dict['banana'] assert 'banana' in c._key_cache_time assert c._key_cache_time['banana'] == 42
def test_store_msgpack_missing(self): ''' Test storing is not happening if no msgpack installed. :return: ''' logger = MagicMock() with patch('salt.utils.cache.log', logger): c = cache.CacheDisk(0, '/dev/nowhere') with patch('salt.utils.cache.msgpack', None): c.store() assert logger.error.call_count == 1 assert len(logger.error.call_args[0]) == 1 assert logger.error.call_args[0][ 0] == 'Cache cannot be stored on disk: msgpack is missing'
def test_read_oserror_handling(self): ''' Test _read() is handling OSError. :return: ''' logger = MagicMock() with patch('salt.utils.cache.log', logger): cache.CacheDisk(0, '/dev/nowhere') assert logger.error.call_count == 1 assert len(logger.error.call_args[0]) == 3 msg, pth, exc = logger.error.call_args[0] assert msg % (pth, exc) == ( 'Error while reading disk cache from /dev/nowhere: ' "The keyboard isn't plugged in")
def test_read_ioerror_handling(self): ''' Test _read() is handling IOError. :return: ''' logger = MagicMock() with patch('salt.utils.cache.log', logger): cache.CacheDisk(0, '/solar/interference') assert logger.error.call_count == 1 assert len(logger.error.call_args[0]) == 3 msg, pth, exc = logger.error.call_args[0] assert msg % (pth, exc) == ( 'Error while reading disk cache from /solar/interference: ' 'Radial telemetry infiltration')
def test_add_remove_operations_stores_data(self): ''' Test dict operations set/delete triggering store() function transparently. :return: ''' # This should raise the OSError thrice. logger = MagicMock() with patch('salt.utils.cache.log', logger): c = cache.CacheDisk(0, '/dev/nowhere') assert logger.error.call_count == 1 c['banana'] = {'status': 'rotten'} assert logger.error.call_count == 2 del c['banana'] assert logger.error.call_count == 3 assert len(logger.error.call_args[0]) == 2 msg, arg = logger.error.call_args[0] assert msg % arg == 'Error storing cache data to the disk: Boredom in the kernel'
def test_read_success_debugging(self): ''' Test if CacheDisk adds debug message once successfully read the cache content from the disk. :return: ''' logger = MagicMock() logger.isEnabledFor = MagicMock(return_value=True) with patch('salt.utils.cache.log', logger): c = cache.CacheDisk(0, '/dev/nowhere') assert 'banana' in c assert c._key_cache_time['banana'] == 42 assert logger.debug.call_count == 1 assert len(logger.debug.call_args[0]) == 2 msg, args = logger.debug.call_args[0] assert isinstance(args, dict) assert 'banana' in args assert msg % 'Redundant ACLs' == 'Disk cache retrieved: Redundant ACLs'
def test_store_new_format(self): ''' Test store() function saves data in the new format. :return: ''' dumper = MagicMock() with patch('salt.utils.cache.msgpack.dump', dumper): c = cache.CacheDisk(0, '/dev/nowhere') c['banana'] = {'status': 'rotten'} stored_data = dumper.call_args[0][0] assert isinstance(stored_data, dict) assert 'CacheDisk_data' in stored_data assert 'CacheDisk_cachetime' in stored_data assert isinstance(stored_data['CacheDisk_data'], dict) assert isinstance(stored_data['CacheDisk_cachetime'], dict) assert 'banana' in stored_data['CacheDisk_data'] assert 'banana' in stored_data['CacheDisk_cachetime'] assert stored_data['CacheDisk_data']['banana']['status'] == 'rotten' assert stored_data['CacheDisk_cachetime']['banana'] == 42
def test_unicode_error(tmp_path, data): """ Test when the data in the cache raises a UnicodeDecodeError we do not raise an error. """ path = tmp_path / "cachedir" path.mkdir() path = path / "minion" path.touch() cache_data = { "CacheDisk_data": { b"poc-minion": { None: { b"secrets": { b"itsasecret": data, b"CacheDisk_cachetime": {b"poc-minion": 1649339137.1236317}, } } } } } with patch.object(salt.utils.msgpack, "load", return_value=cache_data): cd = cache.CacheDisk(0.3, str(path)) assert cd._dict == cache_data