| Index: swarm_client/tests/lru_test.py
|
| ===================================================================
|
| --- swarm_client/tests/lru_test.py (revision 235167)
|
| +++ swarm_client/tests/lru_test.py (working copy)
|
| @@ -1,226 +0,0 @@
|
| -#!/usr/bin/env python
|
| -# Copyright 2013 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 json
|
| -import logging
|
| -import os
|
| -import sys
|
| -import tempfile
|
| -import unittest
|
| -
|
| -ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
| -sys.path.insert(0, ROOT_DIR)
|
| -
|
| -from utils import lru
|
| -
|
| -
|
| -class LRUDictTest(unittest.TestCase):
|
| - @staticmethod
|
| - def prepare_lru_dict(keys):
|
| - """Returns new LRUDict with given |keys| added one by one."""
|
| - lru_dict = lru.LRUDict()
|
| - for key in keys:
|
| - lru_dict.add(key, None)
|
| - return lru_dict
|
| -
|
| - def assert_order(self, lru_dict, expected_keys):
|
| - """Asserts order of keys in |lru_dict| is |expected_keys|.
|
| -
|
| - expected_keys[0] is supposedly oldest key, expected_keys[-1] is newest.
|
| -
|
| - Destroys |lru_dict| state in the process.
|
| - """
|
| - # Check keys iteration works.
|
| - self.assertEqual(lru_dict.keys_set(), set(expected_keys))
|
| -
|
| - # Check pop_oldest returns keys in expected order.
|
| - actual_keys = []
|
| - while lru_dict:
|
| - oldest_key, _ = lru_dict.pop_oldest()
|
| - actual_keys.append(oldest_key)
|
| - self.assertEqual(actual_keys, expected_keys)
|
| -
|
| - def assert_same_data(self, lru_dict, regular_dict):
|
| - """Asserts that given |lru_dict| contains same data as |regular_dict|."""
|
| - self.assertEqual(lru_dict.keys_set(), set(regular_dict.keys()))
|
| - self.assertEqual(set(lru_dict.itervalues()), set(regular_dict.values()))
|
| -
|
| - for k, v in regular_dict.items():
|
| - self.assertEqual(lru_dict.get(k), v)
|
| -
|
| - def test_basic_dict_funcs(self):
|
| - lru_dict = lru.LRUDict()
|
| -
|
| - # Add a bunch.
|
| - data = {1: 'one', 2: 'two', 3: 'three'}
|
| - for k, v in data.items():
|
| - lru_dict.add(k, v)
|
| - # Check its there.
|
| - self.assert_same_data(lru_dict, data)
|
| -
|
| - # Replace value.
|
| - lru_dict.add(1, 'one!!!')
|
| - data[1] = 'one!!!'
|
| - self.assert_same_data(lru_dict, data)
|
| -
|
| - # Check pop works.
|
| - self.assertEqual(lru_dict.pop(2), 'two')
|
| - data.pop(2)
|
| - self.assert_same_data(lru_dict, data)
|
| -
|
| - # Pop missing key.
|
| - with self.assertRaises(KeyError):
|
| - lru_dict.pop(2)
|
| -
|
| - # Touch has no effect on set of keys and values.
|
| - lru_dict.touch(1)
|
| - self.assert_same_data(lru_dict, data)
|
| -
|
| - # Touch fails on missing key.
|
| - with self.assertRaises(KeyError):
|
| - lru_dict.touch(22)
|
| -
|
| - def test_magic_methods(self):
|
| - # Check __nonzero__, __len__ and __contains__ for empty dict.
|
| - lru_dict = lru.LRUDict()
|
| - self.assertFalse(lru_dict)
|
| - self.assertEqual(len(lru_dict), 0)
|
| - self.assertFalse(1 in lru_dict)
|
| -
|
| - # Dict with one item.
|
| - lru_dict.add(1, 'one')
|
| - self.assertTrue(lru_dict)
|
| - self.assertEqual(len(lru_dict), 1)
|
| - self.assertTrue(1 in lru_dict)
|
| - self.assertFalse(2 in lru_dict)
|
| -
|
| - def test_order(self):
|
| - data = [1, 2, 3]
|
| -
|
| - # Edge cases.
|
| - self.assert_order(self.prepare_lru_dict([]), [])
|
| - self.assert_order(self.prepare_lru_dict([1]), [1])
|
| -
|
| - # No touches.
|
| - self.assert_order(self.prepare_lru_dict(data), data)
|
| -
|
| - # Touching newest item is noop.
|
| - lru_dict = self.prepare_lru_dict(data)
|
| - lru_dict.touch(3)
|
| - self.assert_order(lru_dict, data)
|
| -
|
| - # Touch to move to newest.
|
| - lru_dict = self.prepare_lru_dict(data)
|
| - lru_dict.touch(2)
|
| - self.assert_order(lru_dict, [1, 3, 2])
|
| -
|
| - # Pop newest.
|
| - lru_dict = self.prepare_lru_dict(data)
|
| - lru_dict.pop(1)
|
| - self.assert_order(lru_dict, [2, 3])
|
| -
|
| - # Pop in the middle.
|
| - lru_dict = self.prepare_lru_dict(data)
|
| - lru_dict.pop(2)
|
| - self.assert_order(lru_dict, [1, 3])
|
| -
|
| - # Pop oldest.
|
| - lru_dict = self.prepare_lru_dict(data)
|
| - lru_dict.pop(3)
|
| - self.assert_order(lru_dict, [1, 2])
|
| -
|
| - # Add oldest.
|
| - lru_dict = self.prepare_lru_dict(data)
|
| - lru_dict.batch_insert_oldest([(4, 4), (5, 5)])
|
| - self.assert_order(lru_dict, [4, 5] + data)
|
| -
|
| - # Add newest.
|
| - lru_dict = self.prepare_lru_dict(data)
|
| - lru_dict.add(4, 4)
|
| - self.assert_order(lru_dict, data + [4])
|
| -
|
| - def test_load_save(self):
|
| - def save_and_load(lru_dict):
|
| - tmp_name = tempfile.mktemp()
|
| - try:
|
| - lru_dict.save(tmp_name)
|
| - return lru.LRUDict.load(tmp_name)
|
| - finally:
|
| - try:
|
| - os.unlink(tmp_name)
|
| - except OSError:
|
| - pass
|
| -
|
| - data = [1, 2, 3]
|
| -
|
| - # Edge case.
|
| - empty = save_and_load(lru.LRUDict())
|
| - self.assertFalse(empty)
|
| -
|
| - # Normal flow.
|
| - lru_dict = save_and_load(self.prepare_lru_dict(data))
|
| - self.assert_order(lru_dict, data)
|
| -
|
| - # After touches.
|
| - lru_dict = self.prepare_lru_dict(data)
|
| - lru_dict.touch(2)
|
| - lru_dict = save_and_load(lru_dict)
|
| - self.assert_order(lru_dict, [1, 3, 2])
|
| -
|
| - # After pop.
|
| - lru_dict = self.prepare_lru_dict(data)
|
| - lru_dict.pop(2)
|
| - lru_dict = save_and_load(lru_dict)
|
| - self.assert_order(lru_dict, [1, 3])
|
| -
|
| - # After add.
|
| - lru_dict = self.prepare_lru_dict(data)
|
| - lru_dict.add(4, 4)
|
| - lru_dict.batch_insert_oldest([(5, 5), (6, 6)])
|
| - lru_dict = save_and_load(lru_dict)
|
| - self.assert_order(lru_dict, [5, 6] + data + [4])
|
| -
|
| - def test_corrupted_state_file(self):
|
| - def load_from_state(state_text):
|
| - tmp_name = tempfile.mktemp()
|
| - try:
|
| - with open(tmp_name, 'wt') as f:
|
| - f.write(state_text)
|
| - return lru.LRUDict.load(tmp_name)
|
| - finally:
|
| - os.unlink(tmp_name)
|
| -
|
| - # Loads correct state just fine.
|
| - self.assertIsNotNone(load_from_state(json.dumps([
|
| - ['key1', 'value1'],
|
| - ['key2', 'value2'],
|
| - ])))
|
| -
|
| - # Not a json.
|
| - with self.assertRaises(ValueError):
|
| - load_from_state('garbage, not a state')
|
| -
|
| - # Not a list.
|
| - with self.assertRaises(ValueError):
|
| - load_from_state('{}')
|
| -
|
| - # Not a list of pairs.
|
| - with self.assertRaises(ValueError):
|
| - load_from_state(json.dumps([
|
| - ['key', 'value', 'and whats this?'],
|
| - ]))
|
| -
|
| - # Duplicate keys.
|
| - with self.assertRaises(ValueError):
|
| - load_from_state(json.dumps([
|
| - ['key', 'value'],
|
| - ['key', 'another_value'],
|
| - ]))
|
| -
|
| -
|
| -if __name__ == '__main__':
|
| - VERBOSE = '-v' in sys.argv
|
| - logging.basicConfig(level=logging.DEBUG if VERBOSE else logging.ERROR)
|
| - unittest.main()
|
|
|