# Copyright 2015 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import cPickle import datetime import unittest import webapp2 import webtest from google.appengine.ext import ndb from dashboard import layered_cache from dashboard import testing_common class LayeredCacheTest(testing_common.TestCase): def setUp(self): super(LayeredCacheTest, self).setUp() app = webapp2.WSGIApplication([( '/delete_expired_entities', layered_cache.DeleteExpiredEntitiesHandler)]) self.testapp = webtest.TestApp(app) self.UnsetCurrentUser() testing_common.SetIsInternalUser('internal@chromium.org', True) testing_common.SetIsInternalUser('foo@chromium.org', False) def testSetAndGet(self): self.SetCurrentUser('internal@chromium.org') layered_cache.Set('str', 'Hello, World!') layered_cache.Set('dict', {'hello': [1, 2, 3]}) self.assertEqual( 'Hello, World!', cPickle.loads( ndb.Key('CachedPickledString', 'internal_only__str').get().value)) self.assertIsNone( ndb.Key('CachedPickledString', 'externally_visible__str').get()) self.assertEqual('Hello, World!', layered_cache.Get('str')) self.SetCurrentUser('foo@chromium.org') self.assertIsNone(layered_cache.Get('str')) self.SetCurrentUser('internal@chromium.org') self.assertEqual( {'hello': [1, 2, 3]}, cPickle.loads( ndb.Key('CachedPickledString', 'internal_only__dict').get().value)) self.assertIsNone( ndb.Key('CachedPickledString', 'externally_visible__dict').get()) self.assertEqual({'hello': [1, 2, 3]}, layered_cache.Get('dict')) self.SetCurrentUser('foo@chromium.org') self.assertIsNone(layered_cache.Get('dict')) def testGetAndSet_External(self): layered_cache.SetExternal('str', 'Hello, World!') layered_cache.SetExternal('dict', {'hello': [1, 2, 3]}) self.assertEqual( 'Hello, World!', cPickle.loads( ndb.Key('CachedPickledString', 'externally_visible__str').get().value)) self.assertEqual( None, ndb.Key('CachedPickledString', 'internal_only__str').get()) self.assertEqual('Hello, World!', layered_cache.GetExternal('str')) self.assertEqual( {'hello': [1, 2, 3]}, cPickle.loads( ndb.Key('CachedPickledString', 'externally_visible__dict').get().value)) self.assertEqual( None, ndb.Key('CachedPickledString', 'internal_only__dict').get()) self.assertEqual({'hello': [1, 2, 3]}, layered_cache.GetExternal('dict')) def testDelete(self): self.SetCurrentUser('internal@chromium.org') layered_cache.Set('hello', 'secret') self.SetCurrentUser('foo@chromium.org') layered_cache.Set('hello', 'not secret') layered_cache.Delete('hello') self.SetCurrentUser('internal@chromium.org') self.assertIsNone(layered_cache.Get('hello')) self.SetCurrentUser('foo@chromium.org') self.assertIsNone(layered_cache.Get('hello')) def testExpireTime(self): self.SetCurrentUser('internal@chromium.org') layered_cache.Set('str1', 'Hello, World!', days_to_keep=10) key_internal = ndb.Key('CachedPickledString', 'internal_only__str1') key_external = ndb.Key('CachedPickledString', 'externally_visible__str1') self.assertEqual('Hello, World!', cPickle.loads(key_internal.get().value)) self.assertIsNone(key_external.get()) self.assertEqual('Hello, World!', layered_cache.Get('str1')) # The expire date should be 10 days after the current date. actual_date = key_internal.get().expire_time expected_date = datetime.datetime.now() + datetime.timedelta(days=10) self.assertEqual(actual_date.date(), expected_date.date()) # When current user is external, the external version is returned by Get. self.SetCurrentUser('foo@chromium.org') self.assertIsNone(layered_cache.Get('str1')) def testDeleteAllExpiredEntities(self): self.SetCurrentUser('internal@chromium.org') layered_cache.Set('expired_str1', 'apple', days_to_keep=-10) layered_cache.Set('expired_str2', 'bat', days_to_keep=-1) layered_cache.Set('expired_str3', 'cat', days_to_keep=10) layered_cache.Set('expired_str4', 'dog', days_to_keep=0) layered_cache.Set('expired_str5', 'egg') self.assertEqual('apple', layered_cache.Get('expired_str1')) self.assertEqual('bat', layered_cache.Get('expired_str2')) self.assertEqual('cat', layered_cache.Get('expired_str3')) self.assertEqual('dog', layered_cache.Get('expired_str4')) self.assertEqual('egg', layered_cache.Get('expired_str5')) layered_cache.DeleteAllExpiredEntities() self.assertIsNone(layered_cache.Get('expired_str1')) self.assertIsNone(layered_cache.Get('expired_str2')) self.assertEqual('cat', layered_cache.Get('expired_str3')) self.assertEqual('dog', layered_cache.Get('expired_str4')) self.assertEqual('egg', layered_cache.Get('expired_str5')) def testGet_DeleteExpiredEntities(self): self.SetCurrentUser('internal@chromium.org') layered_cache.Set('expired_str1', 'apple', days_to_keep=-10) layered_cache.Set('expired_str2', 'bat', days_to_keep=-1) layered_cache.Set('expired_str3', 'cat', days_to_keep=10) layered_cache.Set('expired_str4', 'dog', days_to_keep=0) layered_cache.Set('expired_str5', 'egg') self.assertEqual('apple', layered_cache.Get('expired_str1')) self.assertEqual('bat', layered_cache.Get('expired_str2')) self.assertEqual('cat', layered_cache.Get('expired_str3')) self.assertEqual('dog', layered_cache.Get('expired_str4')) self.assertEqual('egg', layered_cache.Get('expired_str5')) self.testapp.get('/delete_expired_entities') self.assertIsNone(layered_cache.Get('expired_str1')) self.assertIsNone(layered_cache.Get('expired_str2')) self.assertEqual('cat', layered_cache.Get('expired_str3')) self.assertEqual('dog', layered_cache.Get('expired_str4')) self.assertEqual('egg', layered_cache.Get('expired_str5')) if __name__ == '__main__': unittest.main()