예제 #1
0
 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'
예제 #2
0
 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.'
예제 #3
0
    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
예제 #4
0
 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
예제 #5
0
 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
예제 #6
0
 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'
예제 #7
0
 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")
예제 #8
0
 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')
예제 #9
0
 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'
예제 #10
0
 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'
예제 #11
0
 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
예제 #12
0
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