ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/COMP/FILEMOVER/test/mapping_manager.py
Revision: 1.2
Committed: Wed Jan 14 03:20:57 2009 UTC (16 years, 3 months ago) by bbockelm
Content type: text/x-python
Branch: MAIN
CVS Tags: V01_00_33, V01_00_32, V01_00_31, V01_00_30, V01_00_29, V01_00_28, V01_00_27, V01_00_26, V01_00_25, V01_00_24, V01_00_23, V01_00_22, V01_00_21, V01_00_20, V01_00_19, V01_00_18, V01_00_17, V01_00_16, V01_00_15, V01_00_14, V01_00_13, V01_00_12, HEAD
Changes since 1.1: +22 -0 lines
Log Message:
Commit of FileMover version used for benchmarks reported to Dima.

File Contents

# User Rev Content
1 bbockelm 1.1
2     import os
3     import sys
4     import sets
5     import time
6     import unittest
7     import threading
8     import ConfigParser
9    
10     if os.path.exists("src"):
11     sys.path.append("src")
12     if os.path.exists('../src'):
13     sys.path.append('../src')
14    
15     from CmsFileServer.MappingManager import MappingManager
16    
17     class BlockingMappingManager(MappingManager):
18     """
19     A mapping manager which can be made to block on acquire and release
20     (so we can test thread-safety a bit).
21     """
22    
23     def __init__(self):
24     super(BlockingMappingManager, self).__init__()
25     self._acquire_cond = None
26     self._release_cond = None
27     self._acquire_count = 0
28     self._release_count = 0
29 bbockelm 1.2 self._acquire_error = None
30 bbockelm 1.1
31     def blockOnAcquire(self, cond):
32     self._acquire_cond = cond
33    
34 bbockelm 1.2 def errorOnAcquire(self, error):
35     self._acquire_error = error
36    
37 bbockelm 1.1 def _lookup(self, key):
38     if self._acquire_cond:
39     self._acquire_cond.acquire()
40     self._acquire_cond.wait()
41     self._acquire_cond.release()
42     self._acquire_count += 1
43 bbockelm 1.2 if self._acquire_error:
44     raise self._acquire_error
45 bbockelm 1.1 return key**2
46    
47     def blockOnRelease(self, cond):
48     self._acquire_cond = cond
49    
50     def _release(self, key):
51     if self._release_cond:
52     self._release_cond.acquire()
53     self._release_cond.wait()
54     self._release_cond.release()
55     self._release_count += 1
56    
57     class TestMappingManager(unittest.TestCase):
58     """
59     A test case for the MappingManager
60     """
61    
62     def setUp(self):
63     self.manager = BlockingMappingManager()
64    
65     def test_acquire_release_serial(self):
66     value = self.manager.acquireValue(3)
67     self.failUnless(value==9, "Returned the incorrect value.")
68     self.manager.releaseKey(3)
69     value = self.manager.acquireValue(3)
70     self.failUnless(value==9, "Returned the incorrect value.")
71     self.manager.releaseKey(3)
72     self.failUnless(self.manager._acquire_count == 2)
73     self.failUnless(self.manager._release_count == 2)
74    
75     def test_acquire_release_overlapping(self):
76     value = self.manager.acquireValue(3)
77     self.failUnless(value==9, "Returned the incorrect value.")
78     self.failUnless(self.manager._keys_refcount[3] == 1)
79     value = self.manager.acquireValue(3)
80     self.failUnless(self.manager._keys_refcount[3] == 2)
81     self.manager.releaseKey(3)
82     self.failUnless(self.manager._keys_refcount[3] == 1)
83     self.failUnless(value==9, "Returned the incorrect value.")
84     self.manager.releaseKey(3)
85     self.failUnless(3 not in self.manager._keys_refcount)
86     self.failUnless(self.manager._acquire_count == 1)
87     self.failUnless(self.manager._release_count == 2)
88    
89     def _acquire_key_3(self):
90     self.manager.acquireValue(3)
91    
92     def test_acquire_release_blocking(self):
93     cond = threading.Condition()
94     self.manager.blockOnAcquire(cond)
95     t1 = threading.Thread(target=self._acquire_key_3)
96     t2 = threading.Thread(target=self._acquire_key_3)
97     self.failUnless(3 not in self.manager._lookup_attempts)
98     self.failUnless(3 not in self.manager._keys_refcount)
99     t1.start()
100     self.failUnless(3 in self.manager._lookup_attempts)
101     self.failUnless(3 not in self.manager._keys_refcount)
102     t2.start()
103     time.sleep(.2)
104     cond.acquire()
105     cond.notifyAll()
106     cond.release()
107     cond.acquire()
108     cond.notifyAll()
109     cond.release()
110     t1.join()
111     t2.join()
112     self.failUnless(self.manager._acquire_count == 1)
113     self.failUnless(self.manager._keys_refcount[3] == 2)
114     self.manager.releaseKey(3)
115     self.manager.releaseKey(3)
116     self.failUnless(3 not in self.manager._keys_refcount)
117    
118 bbockelm 1.2 def test_error(self):
119     self.manager.errorOnAcquire(Exception("known error."))
120     did_fail = False
121     try:
122     self.manager.acquireValue()
123     except:
124     did_fail = True
125     self.failUnless(did_fail, msg="Error on acquire failed.")
126     self.manager.errorOnAcquire(None)
127     self.failUnless(self.manager.acquireValue(3) == 9)
128     self.failUnless(self.manager._acquire_count == 1)
129     self.failUnless(self.manager._keys_refcount[3] == 1)
130     self.manager.releaseKey(3)
131     self.failUnless(3 not in self.manager._keys_refcount)
132    
133 bbockelm 1.1 if __name__ == '__main__':
134     unittest.main()
135 bbockelm 1.2