| #!/usr/bin/env python |
| # Copyright 2018 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """Tests for memcache_adaptor.""" |
| |
| import cPickle |
| import unittest |
| |
| # pylint: disable=import-error, no-name-in-module |
| from google.appengine.api import memcache |
| import mock |
| |
| import factory_common # pylint: disable=unused-import |
| from cros.factory.hwid.service.appengine import memcache_adaptor |
| |
| |
| class MemcacheAdaptorTest(unittest.TestCase): |
| |
| def setUp(self): |
| super(MemcacheAdaptorTest, self).setUp() |
| memcache_adaptor.MEMCACHE_CHUNKSIZE = 950000 |
| memcache_adaptor.MAX_NUMBER_CHUNKS = 10 |
| |
| def testBreakIntoChunks(self): |
| memcache_adaptor.MEMCACHE_CHUNKSIZE = 2 |
| serialized_data = 'aabb' |
| adaptor = memcache_adaptor.MemcacheAdaptor('testnamespace') |
| chunks = adaptor.BreakIntoChunks('testkey', serialized_data) |
| |
| self.assertEqual(2, len(chunks)) |
| self.assertEqual('aa', chunks['testkey.0']) |
| self.assertEqual('bb', chunks['testkey.1']) |
| |
| def testBreakIntoChunksNone(self): |
| memcache_adaptor.MEMCACHE_CHUNKSIZE = 2 |
| serialized_data = '' |
| adaptor = memcache_adaptor.MemcacheAdaptor('testnamespace') |
| chunks = adaptor.BreakIntoChunks('testkey', serialized_data) |
| |
| self.assertEqual(0, len(chunks)) |
| |
| @mock.patch.object(memcache, 'set_multi') |
| @mock.patch.object(cPickle, 'dumps', return_value='aabb') |
| def testPut(self, mock_pickle, mock_memcache_set): |
| memcache_adaptor.MEMCACHE_CHUNKSIZE = 4 |
| data = ['aa', 'bb'] |
| |
| adaptor = memcache_adaptor.MemcacheAdaptor('testnamespace') |
| adaptor.Put('testkey', data) |
| |
| mock_memcache_set.assert_called_once_with({'testkey.0': 'aabb'}, |
| namespace='testnamespace') |
| mock_pickle.assert_called_once_with( |
| ['aa', 'bb'], memcache_adaptor.PICKLE_PROTOCOL_VERSION) |
| |
| def testPutTooBig(self): |
| memcache_adaptor.MEMCACHE_CHUNKSIZE = 4 |
| memcache_adaptor.MAX_NUMBER_CHUNKS = 2 |
| data = ['aa', 'bb'] |
| |
| adaptor = memcache_adaptor.MemcacheAdaptor('testnamespace') |
| self.assertRaises(memcache_adaptor.MemcacheAdaptorException, |
| adaptor.Put, 'testkey', data) |
| |
| def testAssembleFromChunks(self): |
| chunks = { |
| 'testkey.0': 'aa', 'testkey.1': 'bb', 'testkey.2': 'cc', |
| 'testkey.3': 'dd', 'testkey.4': 'ee', 'testkey.5': 'ff', |
| 'testkey.6': 'gg', 'testkey.7': 'hh', 'testkey.8': 'ii', |
| 'testkey.9': 'jj', 'testkey.10': 'kk', 'testkey.11': 'll', |
| 'testkey.12': None |
| } |
| |
| adaptor = memcache_adaptor.MemcacheAdaptor('testnamespace') |
| serialized_data = adaptor.AssembleFromChunks(chunks) |
| |
| self.assertEqual('aabbccddeeffgghhiijjkkll', serialized_data) |
| |
| @mock.patch.object(memcache, 'get_multi', |
| return_value={'testkey.1': 'zz', 'testkey.0': 'yy'}) |
| @mock.patch.object(cPickle, 'loads', return_value='pickle_return') |
| def testGet(self, mock_pickle, mock_memcache_get): |
| memcache_adaptor.MAX_NUMBER_CHUNKS = 2 |
| |
| adaptor = memcache_adaptor.MemcacheAdaptor('testnamespace') |
| value = adaptor.Get('testkey') |
| |
| mock_memcache_get.assert_called_once_with(['testkey.0', 'testkey.1'], |
| namespace='testnamespace') |
| mock_pickle.assert_called_once_with('yyzz') |
| self.assertEqual('pickle_return', value) |
| |
| @mock.patch.object(memcache, 'set_multi') |
| @mock.patch.object(memcache, 'get_multi') |
| def testEnd2End(self, mock_memcache_get, mock_memcache_set): |
| object_to_save = ['one', 'two', 'three'] |
| memcache_adaptor.MEMCACHE_CHUNKSIZE = 8 |
| |
| adaptor = memcache_adaptor.MemcacheAdaptor('testnamespace') |
| adaptor.Put('testkey', object_to_save) |
| mock_memcache_get.return_value = mock_memcache_set.call_args[0][0] |
| retrieved_object = adaptor.Get('testkey') |
| |
| self.assertListEqual(object_to_save, retrieved_object) |
| |
| |
| if __name__ == '__main__': |
| unittest.main() |