blob: 5bc4d1d59b962408c06012e38af181e9f641a694 [file] [log] [blame]
Mike Frysingerd03e6b52019-08-03 12:49:01 -04001#!/usr/bin/python2
Fang Deng71c4b1f2013-05-20 09:55:04 -07002# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
6import __builtin__
7import mox
8import os
9import unittest
Fang Deng9b6c73b2015-10-12 19:22:17 -070010import time
Fang Deng71c4b1f2013-05-20 09:55:04 -070011from StringIO import StringIO
12
13import utils
14
15
16class TestUtils(mox.MoxTestBase):
17 """Test utility functions."""
18
19
20 def test_load_servo_interface_mapping(self):
21 """Test servo-interface mapping file can be loaded."""
22 self.mox.StubOutWithMock(__builtin__, 'open')
23 fake_content = (
24 'chromeos1-rack5-host10-servo, chromeos1-poe-switch1, fa42\n'
25 'chromeos1-rack5-host11-servo, chromeos1-poe-switch1, fa43\n'
26 ', chromeos2-poe-switch8, fa43\n'
27 'chromeos2-rack5-host11-servo, chromeos2-poe-switch8, fa44\n')
28 fake_file = self.mox.CreateMockAnything()
29 fake_file.__enter__().AndReturn(StringIO(fake_content))
30 fake_file.__exit__(mox.IgnoreArg(), mox.IgnoreArg(), mox.IgnoreArg())
31 open('fake_file.csv').AndReturn(fake_file)
32 expect = {'chromeos1-rack5-host10-servo':
33 ('chromeos1-poe-switch1', 'fa42'),
34 'chromeos1-rack5-host11-servo':
35 ('chromeos1-poe-switch1', 'fa43'),
36 'chromeos2-rack5-host11-servo':
37 ('chromeos2-poe-switch8', 'fa44')}
38 self.mox.ReplayAll()
39 self.assertEqual(
40 utils.load_servo_interface_mapping('fake_file.csv'), expect)
41 self.mox.VerifyAll()
42
43
44 def _reload_helper(self, do_reload):
45 """Helper class for mapping file reloading tests."""
46 self.mox.StubOutWithMock(utils, 'load_servo_interface_mapping')
47 self.mox.StubOutWithMock(os.path, 'getmtime')
48 check_point = 1369783561.8525634
49 if do_reload:
50 last_modified = check_point + 10.0
51 servo_interface = {'fake_servo': ('fake_switch', 'fake_if')}
52 utils.load_servo_interface_mapping('fake_file').AndReturn(
53 servo_interface)
54 else:
55 last_modified = check_point
56 os.path.getmtime(mox.IgnoreArg()).AndReturn(last_modified)
57 self.mox.ReplayAll()
58 result = utils.reload_servo_interface_mapping_if_necessary(
59 check_point, mapping_file='fake_file')
60 if do_reload:
61 self.assertEqual(result, (last_modified, servo_interface))
62 else:
63 self.assertIsNone(result)
64 self.mox.VerifyAll()
65
66
67 def test_reload_servo_interface_mapping_necessary(self):
68 """Test that mapping file is reloaded when it is modified."""
69 self._reload_helper(True)
70
71
72 def test_reload_servo_interface_mapping_not_necessary(self):
73 """Test that mapping file is not reloaded when it is not modified."""
74 self._reload_helper(False)
75
76
Fang Deng9c582892014-08-13 16:53:12 -070077 def test_LRU_cache(self):
78 """Test LRUCache."""
79 p1 = utils.PowerUnitInfo(
80 'host1', utils.PowerUnitInfo.POWERUNIT_TYPES.RPM,
81 'rpm1', 'hydra1')
82 p2 = utils.PowerUnitInfo(
83 'host2', utils.PowerUnitInfo.POWERUNIT_TYPES.RPM,
84 'rpm2', 'hydra2')
85 p3 = utils.PowerUnitInfo(
86 'host3', utils.PowerUnitInfo.POWERUNIT_TYPES.RPM,
87 'rpm3', 'hydra3')
Fang Deng9b6c73b2015-10-12 19:22:17 -070088 # Initialize an LRU with size 2, items never expire.
89 cache = utils.LRUCache(2, expiration_secs=None)
Fang Deng9c582892014-08-13 16:53:12 -070090 # Add two items, LRU should be full now
91 cache['host1'] = p1
92 cache['host2'] = p2
93 self.assertEqual(len(cache.cache), 2)
94 # Visit host2 and add one more item
95 # host1 should be removed from cache
96 _ = cache['host2']
97 cache['host3'] = p3
98 self.assertEqual(len(cache.cache), 2)
99 self.assertTrue('host1' not in cache)
100 self.assertTrue('host2' in cache)
101 self.assertTrue('host3' in cache)
102
103
Fang Deng9b6c73b2015-10-12 19:22:17 -0700104 def test_LRU_cache_expires(self):
105 """Test LRUCache expires."""
106 self.mox.StubOutWithMock(time, 'time')
107 time.time().AndReturn(10)
108 time.time().AndReturn(25)
109 p1 = utils.PowerUnitInfo(
110 'host1', utils.PowerUnitInfo.POWERUNIT_TYPES.RPM,
111 'rpm1', 'hydra1')
112
113 self.mox.ReplayAll()
114 # Initialize an LRU with size 1, items exppire after 10 secs.
115 cache = utils.LRUCache(1, expiration_secs=10)
116 # Add two items, LRU should be full now
117 cache['host1'] = p1
118 check_contains_1 = 'host1' in cache
119 check_contains_2 = 'host2' in cache
120 self.mox.VerifyAll()
121 self.assertFalse(check_contains_1)
122 self.assertFalse(check_contains_2)
123
124
125 def test_LRU_cache_full_with_expries(self):
126 """Test timestamp is removed properly when cache is full."""
127 self.mox.StubOutWithMock(time, 'time')
128 time.time().AndReturn(10)
129 time.time().AndReturn(25)
130 p1 = utils.PowerUnitInfo(
131 'host1', utils.PowerUnitInfo.POWERUNIT_TYPES.RPM,
132 'rpm1', 'hydra1')
133 p2 = utils.PowerUnitInfo(
134 'host2', utils.PowerUnitInfo.POWERUNIT_TYPES.RPM,
135 'rpm2', 'hydra2')
136 self.mox.ReplayAll()
137 # Initialize an LRU with size 1, items expire after 10 secs.
138 cache = utils.LRUCache(1, expiration_secs=10)
139 # Add two items, LRU should be full now
140 cache['host1'] = p1
141 cache['host2'] = p2
142 self.mox.VerifyAll()
143 self.assertEqual(len(cache.timestamps), 1)
144 self.assertEqual(len(cache.cache), 1)
145 self.assertTrue('host2' in cache.timestamps)
146 self.assertTrue('host2' in cache.cache)
147
148
Fang Deng71c4b1f2013-05-20 09:55:04 -0700149if __name__ == '__main__':
150 unittest.main()