#!/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()