| #!/usr/bin/python |
| # Copyright (c) 2013 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. |
| |
| import __builtin__ |
| import mox |
| import os |
| import unittest |
| import time |
| from StringIO import StringIO |
| |
| import utils |
| |
| |
| class TestUtils(mox.MoxTestBase): |
| """Test utility functions.""" |
| |
| |
| def test_load_servo_interface_mapping(self): |
| """Test servo-interface mapping file can be loaded.""" |
| self.mox.StubOutWithMock(__builtin__, 'open') |
| fake_content = ( |
| 'chromeos1-rack5-host10-servo, chromeos1-poe-switch1, fa42\n' |
| 'chromeos1-rack5-host11-servo, chromeos1-poe-switch1, fa43\n' |
| ', chromeos2-poe-switch8, fa43\n' |
| 'chromeos2-rack5-host11-servo, chromeos2-poe-switch8, fa44\n') |
| fake_file = self.mox.CreateMockAnything() |
| fake_file.__enter__().AndReturn(StringIO(fake_content)) |
| fake_file.__exit__(mox.IgnoreArg(), mox.IgnoreArg(), mox.IgnoreArg()) |
| open('fake_file.csv').AndReturn(fake_file) |
| expect = {'chromeos1-rack5-host10-servo': |
| ('chromeos1-poe-switch1', 'fa42'), |
| 'chromeos1-rack5-host11-servo': |
| ('chromeos1-poe-switch1', 'fa43'), |
| 'chromeos2-rack5-host11-servo': |
| ('chromeos2-poe-switch8', 'fa44')} |
| self.mox.ReplayAll() |
| self.assertEqual( |
| utils.load_servo_interface_mapping('fake_file.csv'), expect) |
| self.mox.VerifyAll() |
| |
| |
| def _reload_helper(self, do_reload): |
| """Helper class for mapping file reloading tests.""" |
| self.mox.StubOutWithMock(utils, 'load_servo_interface_mapping') |
| self.mox.StubOutWithMock(os.path, 'getmtime') |
| check_point = 1369783561.8525634 |
| if do_reload: |
| last_modified = check_point + 10.0 |
| servo_interface = {'fake_servo': ('fake_switch', 'fake_if')} |
| utils.load_servo_interface_mapping('fake_file').AndReturn( |
| servo_interface) |
| else: |
| last_modified = check_point |
| os.path.getmtime(mox.IgnoreArg()).AndReturn(last_modified) |
| self.mox.ReplayAll() |
| result = utils.reload_servo_interface_mapping_if_necessary( |
| check_point, mapping_file='fake_file') |
| if do_reload: |
| self.assertEqual(result, (last_modified, servo_interface)) |
| else: |
| self.assertIsNone(result) |
| self.mox.VerifyAll() |
| |
| |
| def test_reload_servo_interface_mapping_necessary(self): |
| """Test that mapping file is reloaded when it is modified.""" |
| self._reload_helper(True) |
| |
| |
| def test_reload_servo_interface_mapping_not_necessary(self): |
| """Test that mapping file is not reloaded when it is not modified.""" |
| self._reload_helper(False) |
| |
| |
| def test_LRU_cache(self): |
| """Test LRUCache.""" |
| p1 = utils.PowerUnitInfo( |
| 'host1', utils.PowerUnitInfo.POWERUNIT_TYPES.RPM, |
| 'rpm1', 'hydra1') |
| p2 = utils.PowerUnitInfo( |
| 'host2', utils.PowerUnitInfo.POWERUNIT_TYPES.RPM, |
| 'rpm2', 'hydra2') |
| p3 = utils.PowerUnitInfo( |
| 'host3', utils.PowerUnitInfo.POWERUNIT_TYPES.RPM, |
| 'rpm3', 'hydra3') |
| # Initialize an LRU with size 2, items never expire. |
| cache = utils.LRUCache(2, expiration_secs=None) |
| # Add two items, LRU should be full now |
| cache['host1'] = p1 |
| cache['host2'] = p2 |
| self.assertEqual(len(cache.cache), 2) |
| # Visit host2 and add one more item |
| # host1 should be removed from cache |
| _ = cache['host2'] |
| cache['host3'] = p3 |
| self.assertEqual(len(cache.cache), 2) |
| self.assertTrue('host1' not in cache) |
| self.assertTrue('host2' in cache) |
| self.assertTrue('host3' in cache) |
| |
| |
| def test_LRU_cache_expires(self): |
| """Test LRUCache expires.""" |
| self.mox.StubOutWithMock(time, 'time') |
| time.time().AndReturn(10) |
| time.time().AndReturn(25) |
| p1 = utils.PowerUnitInfo( |
| 'host1', utils.PowerUnitInfo.POWERUNIT_TYPES.RPM, |
| 'rpm1', 'hydra1') |
| |
| self.mox.ReplayAll() |
| # Initialize an LRU with size 1, items exppire after 10 secs. |
| cache = utils.LRUCache(1, expiration_secs=10) |
| # Add two items, LRU should be full now |
| cache['host1'] = p1 |
| check_contains_1 = 'host1' in cache |
| check_contains_2 = 'host2' in cache |
| self.mox.VerifyAll() |
| self.assertFalse(check_contains_1) |
| self.assertFalse(check_contains_2) |
| |
| |
| def test_LRU_cache_full_with_expries(self): |
| """Test timestamp is removed properly when cache is full.""" |
| self.mox.StubOutWithMock(time, 'time') |
| time.time().AndReturn(10) |
| time.time().AndReturn(25) |
| p1 = utils.PowerUnitInfo( |
| 'host1', utils.PowerUnitInfo.POWERUNIT_TYPES.RPM, |
| 'rpm1', 'hydra1') |
| p2 = utils.PowerUnitInfo( |
| 'host2', utils.PowerUnitInfo.POWERUNIT_TYPES.RPM, |
| 'rpm2', 'hydra2') |
| self.mox.ReplayAll() |
| # Initialize an LRU with size 1, items expire after 10 secs. |
| cache = utils.LRUCache(1, expiration_secs=10) |
| # Add two items, LRU should be full now |
| cache['host1'] = p1 |
| cache['host2'] = p2 |
| self.mox.VerifyAll() |
| self.assertEqual(len(cache.timestamps), 1) |
| self.assertEqual(len(cache.cache), 1) |
| self.assertTrue('host2' in cache.timestamps) |
| self.assertTrue('host2' in cache.cache) |
| |
| |
| if __name__ == '__main__': |
| unittest.main() |