class TestCachedTemplate(SimpleTestCase):
    """Test the single cached angular template tag."""
    def setUp(self):
        """Patch in a local memory cache."""
        self.locmem_cache = LocMemCache('default', {})
        self.locmem_cache.clear()
        self.patch = mock.patch.object(angular, 'cache', self.locmem_cache)
        self.patch.start()

    def tearDown(self):
        """Stop the patch."""
        self.patch.stop()

    @tag('unit')
    @mock.patch('web.templatetags.angular.finders.get_finders')
    @mock.patch(
        'builtins.open',
        new_callable=mock.mock_open,
        read_data='some_data'
    )
    def test_not_cached(self, m_file, m_get_finders):
        """Test behaviour of a template that is not cached."""
        m_get_finders.return_value = [FakeFinder(['a'])]
        key = '_angular_template_a'
        self.assertFalse(self.locmem_cache.get(key))
        html = CAT('a')
        expected = (
            '<script type="text/ng-template" id="/static/a">'
            'some_data'
            '</script>'
        )
        self.assertEqual(html, expected)
        self.assertEqual(self.locmem_cache.get(key), expected)

    @tag('unit')
    @mock.patch('web.templatetags.angular.finders.get_finders')
    @mock.patch(
        'builtins.open',
        new_callable=mock.mock_open,
        read_data='some_data'
    )
    def test_cached(self, m_file, m_get_finders):
        """Test behavior of a template that is cached."""
        m_get_finders.return_value = [FakeFinder(['a'])]
        key = '_angular_template_a'
        self.locmem_cache.add(key, 'the_data')
        html = CAT('a')
        expected = 'the_data'
        self.assertEqual(html, expected)
        self.assertEqual(self.locmem_cache.get(key), expected)
Ejemplo n.º 2
0
def test_sensitive_cache_data_is_encrypted(settings, mocker):
    "fields marked as `encrypted` are stored in the cache with encryption"
    settings.registry.register('AWX_ENCRYPTED',
                               field_class=fields.CharField,
                               category=_('System'),
                               category_slug='system',
                               encrypted=True)

    def rot13(obj, attribute):
        assert obj.pk == 123
        return getattr(obj, attribute).encode('rot13')

    native_cache = LocMemCache(str(uuid4()), {})
    cache = EncryptedCacheProxy(native_cache,
                                settings.registry,
                                encrypter=rot13,
                                decrypter=rot13)
    # Insert the setting value into the database; the encryption process will
    # use its primary key as part of the encryption key
    setting_from_db = mocker.Mock(pk=123, key='AWX_ENCRYPTED', value='SECRET!')
    mocks = mocker.Mock(
        **{
            'order_by.return_value':
            mocker.Mock(
                **{
                    '__iter__': lambda self: iter([setting_from_db]),
                    'first.return_value': setting_from_db
                }),
        })
    with mocker.patch('awx.conf.models.Setting.objects.filter',
                      return_value=mocks):
        cache.set('AWX_ENCRYPTED', 'SECRET!')
        assert cache.get('AWX_ENCRYPTED') == 'SECRET!'
        assert native_cache.get('AWX_ENCRYPTED') == 'FRPERG!'
Ejemplo n.º 3
0
class InMemoryCache(CacheBase):

    def __init__(self, params=None):
        self.cache = LocMemCache(name='Hydro', params={})

    def get(self, key):
        try:
            value = self.cache.get(key)
        except Exception, err:
            value = None
        return value
Ejemplo n.º 4
0
def test_readonly_sensitive_cache_data_is_encrypted(settings):
    "readonly fields marked as `encrypted` are stored in the cache with encryption"
    settings.registry.register('AWX_ENCRYPTED', field_class=fields.CharField, category=_('System'), category_slug='system', read_only=True, encrypted=True)

    def rot13(obj, attribute):
        assert obj.pk is None
        return codecs.encode(getattr(obj, attribute), 'rot_13')

    native_cache = LocMemCache(str(uuid4()), {})
    cache = EncryptedCacheProxy(native_cache, settings.registry, encrypter=rot13, decrypter=rot13)
    cache.set('AWX_ENCRYPTED', 'SECRET!')
    assert cache.get('AWX_ENCRYPTED') == 'SECRET!'
    assert native_cache.get('AWX_ENCRYPTED') == 'FRPERG!'
Ejemplo n.º 5
0
class InMemoryCache(CacheBase):
    def __init__(self, params=None):
        self.cache = LocMemCache(name='Hydro', params={})

    def get(self, key):
        try:
            value = self.cache.get(key)
        except Exception as err:
            value = None
        return value

    def put(self, key, value, ttl=Configurator.CACHE_IN_MEMORY_KEY_EXPIRE):
        # just in case the default was changed during the running
        if ttl > Configurator.CACHE_IN_MEMORY_KEY_EXPIRE:
            ttl = Configurator.CACHE_IN_MEMORY_KEY_EXPIRE

        self.cache.set(key, value, ttl)
Ejemplo n.º 6
0
class TransactionCacheTestCase(base.JohnnyTestCase):
    def setUp(self):
        self.backend = LocMemCache('', {})
        self.cache = TransactionCache(self.backend)
        self.cache.timeout = 1000

    def test_get(self):
        self.backend.set('a', '1')
        self.assertEqual(self.cache.get('a'), '1')
        self.assertIsNone(self.cache.get('missing'))

    def test_local_caching(self):
        self.backend.set('a', '1')
        self.assertEqual(self.cache.get('a'), '1')
        self.backend.clear()
        self.assertEqual(self.cache.get('a'), '1')

    def test_get_many_local_caching(self):
        self.backend.set('a', '1')
        self.backend.set('b', '2')
        self.assertEqual(
            self.cache.get_many(['a', 'b', 'c']),
            {'a': '1', 'b': '2'},
        )
        self.backend.clear()
        self.backend.set('c', '3')
        self.assertEqual(
            self.cache.get_many(['a', 'b', 'c']),
            {'a': '1', 'b': '2'},
        )

    def test_get_many_looks_up_missing(self):
        self.cache.get('a')
        with patch.object(self.backend, 'get_many') as get_many:
            self.cache.get_many(['a', 'b', 'c'])
            get_many.assert_called_with(['b', 'c'])

    def test_set_get(self):
        self.backend.set('a', '1')
        self.assertEqual(self.cache.get('a'), '1')
        self.cache.set('a', '2')
        self.assertEqual(self.cache.get('a'), '2')
        self.assertEqual(self.backend.get('a'), '1')

    def test_set_many(self):
        self.cache.set_many({'a': '1', 'b': '2'})
        self.assertEqual(self.cache.get('a'), '1')
        self.assertEqual(self.cache.get('b'), '2')

    def test_delete_get(self):
        self.backend.set('a', '1')
        self.assertEqual(self.cache.get('a'), '1')
        self.cache.delete('a')
        self.assertIsNone(self.cache.get('a'))
        self.assertEqual(self.backend.get('a'), '1')

    def test_delete_many(self):
        self.backend.set_many({'a': '1', 'b': '2'})
        self.cache.delete_many(['a', 'b'])
        self.assertIsNone(self.cache.get('a'))
        self.assertIsNone(self.cache.get('b'))

    def test_rollback(self):
        self.backend.set('a', '1')
        self.assertEqual(self.cache.get('a'), '1')
        self.backend.set('a', '2')
        self.assertEqual(self.cache.get('a'), '1')
        self.cache.rollback()
        self.assertEqual(self.cache.get('a'), '2')

    def test_commit(self):
        self.backend.set('a', '1')
        self.backend.set('b', '2')
        self.cache.set('a', '3')
        self.cache.delete('b')
        self.assertEqual(self.backend.get('a'), '1')
        self.assertEqual(self.backend.get('b'), '2')
        self.cache.commit()
        self.assertEqual(self.backend.get('a'), '3')
        self.assertIsNone(self.backend.get('b'))

    def test_rollback_savepoint(self):
        self.cache.set('a', '1')
        self.cache.savepoint('sp1')
        self.cache.set('a', '2')
        self.cache.savepoint('sp2')
        self.cache.set('a', '3')

        self.assertEqual(self.cache.get('a'), '3')
        self.cache.rollback_savepoint('sp2')
        self.assertEqual(self.cache.get('a'), '2')
        self.cache.rollback_savepoint('sp1')
        self.assertEqual(self.cache.get('a'), '1')

        self.assertRaises(IndexError, self.cache.rollback_savepoint, 'sp0')

    def test_rollback_savepoint_skip(self):
        self.cache.set('a', '1')
        self.cache.savepoint('sp1')
        self.cache.set('a', '2')
        self.cache.savepoint('sp2')
        self.cache.set('a', '3')

        self.assertEqual(self.cache.get('a'), '3')
        self.cache.rollback_savepoint('sp1')
        self.assertEqual(self.cache.get('a'), '1')

        self.assertRaises(IndexError, self.cache.rollback_savepoint, 'sp2')

    def test_rollback_savepoint_same_name(self):
        self.cache.set('a', '1')
        self.cache.savepoint('sp')
        self.cache.set('a', '2')
        self.cache.savepoint('sp')
        self.cache.set('a', '3')

        self.assertEqual(self.cache.get('a'), '3')
        self.cache.rollback_savepoint('sp')
        self.assertEqual(self.cache.get('a'), '2')
        self.cache.rollback_savepoint('sp')
        self.assertEqual(self.cache.get('a'), '1')

        self.assertRaises(IndexError, self.cache.rollback_savepoint, 'sp')

    def test_commit_savepoint(self):
        self.cache.set('a', '1')
        self.cache.savepoint('sp1')
        self.cache.set('a', '2')

        self.assertEqual(self.cache.get('a'), '2')
        self.cache.commit_savepoint('sp1')
        self.assertEqual(self.cache.get('a'), '2')

        self.assertRaises(IndexError, self.cache.rollback_savepoint, 'sp1')

    def test_commit_savepoint_same_name(self):
        self.cache.set('a', '1')
        self.cache.savepoint('sp')
        self.cache.set('a', '2')
        self.cache.savepoint('sp')
        self.cache.set('a', '3')

        self.assertEqual(self.cache.get('a'), '3')
        self.cache.commit_savepoint('sp')
        self.assertEqual(self.cache.get('a'), '3')
        self.cache.rollback_savepoint('sp')
        self.assertEqual(self.cache.get('a'), '1')

        self.assertRaises(IndexError, self.cache.rollback_savepoint, 'sp')