OLD | NEW |
(Empty) | |
| 1 #!/usr/bin/env python |
| 2 # |
| 3 # $Id: test_memory_leaks.py 777 2010-11-08 18:29:13Z g.rodola $ |
| 4 # |
| 5 |
| 6 """ |
| 7 Note: this is targeted for python 2.x. |
| 8 To run it under python 3.x you need to use 2to3 tool first: |
| 9 |
| 10 $ 2to3 -w test/test_memory_leaks.py |
| 11 """ |
| 12 |
| 13 |
| 14 import os |
| 15 import gc |
| 16 import sys |
| 17 import unittest |
| 18 |
| 19 import psutil |
| 20 from test_psutil import reap_children, skipUnless, skipIf, \ |
| 21 POSIX, LINUX, WINDOWS, OSX, BSD |
| 22 |
| 23 LOOPS = 1000 |
| 24 TOLERANCE = 4096 |
| 25 |
| 26 |
| 27 class TestProcessObjectLeaks(unittest.TestCase): |
| 28 """Test leaks of Process class methods and properties""" |
| 29 |
| 30 def setUp(self): |
| 31 gc.collect() |
| 32 |
| 33 def tearDown(self): |
| 34 reap_children() |
| 35 |
| 36 def execute(self, method, *args, **kwarks): |
| 37 # step 1 |
| 38 p = psutil.Process(os.getpid()) |
| 39 for x in xrange(LOOPS): |
| 40 obj = getattr(p, method) |
| 41 if callable(obj): |
| 42 retvalue = obj(*args, **kwarks) |
| 43 else: |
| 44 retvalue = obj # property |
| 45 del x, p, obj, retvalue |
| 46 gc.collect() |
| 47 rss1 = psutil.Process(os.getpid()).get_memory_info()[0] |
| 48 |
| 49 # step 2 |
| 50 p = psutil.Process(os.getpid()) |
| 51 for x in xrange(LOOPS): |
| 52 obj = getattr(p, method) |
| 53 if callable(obj): |
| 54 retvalue = obj(*args, **kwarks) |
| 55 else: |
| 56 retvalue = obj # property |
| 57 del x, p, obj, retvalue |
| 58 gc.collect() |
| 59 rss2 = psutil.Process(os.getpid()).get_memory_info()[0] |
| 60 |
| 61 # comparison |
| 62 difference = rss2 - rss1 |
| 63 if difference > TOLERANCE: |
| 64 self.fail("rss1=%s, rss2=%s, difference=%s" %(rss1, rss2, difference
)) |
| 65 |
| 66 def test_name(self): |
| 67 self.execute('name') |
| 68 |
| 69 def test_cmdline(self): |
| 70 self.execute('cmdline') |
| 71 |
| 72 def test_ppid(self): |
| 73 self.execute('ppid') |
| 74 |
| 75 def test_uid(self): |
| 76 self.execute('uid') |
| 77 |
| 78 def test_uid(self): |
| 79 self.execute('gid') |
| 80 |
| 81 @skipIf(POSIX) |
| 82 def test_username(self): |
| 83 self.execute('username') |
| 84 |
| 85 def test_create_time(self): |
| 86 self.execute('create_time') |
| 87 |
| 88 def test_get_num_threads(self): |
| 89 self.execute('get_num_threads') |
| 90 |
| 91 def test_get_cpu_times(self): |
| 92 self.execute('get_cpu_times') |
| 93 |
| 94 def test_get_memory_info(self): |
| 95 self.execute('get_memory_info') |
| 96 |
| 97 def test_is_running(self): |
| 98 self.execute('is_running') |
| 99 |
| 100 @skipUnless(WINDOWS) |
| 101 def test_resume(self): |
| 102 self.execute('resume') |
| 103 |
| 104 @skipUnless(WINDOWS) |
| 105 def test_getcwd(self): |
| 106 self.execute('getcwd') |
| 107 |
| 108 @skipUnless(WINDOWS) |
| 109 def test_get_open_files(self): |
| 110 self.execute('get_open_files') |
| 111 |
| 112 @skipUnless(WINDOWS) |
| 113 def test_get_connections(self): |
| 114 self.execute('get_connections') |
| 115 |
| 116 |
| 117 class TestModuleFunctionsLeaks(unittest.TestCase): |
| 118 """Test leaks of psutil module functions.""" |
| 119 |
| 120 def setUp(self): |
| 121 gc.collect() |
| 122 |
| 123 def execute(self, function, *args, **kwarks): |
| 124 # step 1 |
| 125 for x in xrange(LOOPS): |
| 126 obj = getattr(psutil, function) |
| 127 if callable(obj): |
| 128 retvalue = obj(*args, **kwarks) |
| 129 else: |
| 130 retvalue = obj # property |
| 131 del x, obj, retvalue |
| 132 gc.collect() |
| 133 rss1 = psutil.Process(os.getpid()).get_memory_info()[0] |
| 134 |
| 135 # step 2 |
| 136 for x in xrange(LOOPS): |
| 137 obj = getattr(psutil, function) |
| 138 if callable(obj): |
| 139 retvalue = obj(*args, **kwarks) |
| 140 else: |
| 141 retvalue = obj # property |
| 142 del x, obj, retvalue |
| 143 gc.collect() |
| 144 rss2 = psutil.Process(os.getpid()).get_memory_info()[0] |
| 145 |
| 146 # comparison |
| 147 difference = rss2 - rss1 |
| 148 if difference > TOLERANCE: |
| 149 self.fail("rss1=%s, rss2=%s, difference=%s" %(rss1, rss2, difference
)) |
| 150 |
| 151 def test_get_pid_list(self): |
| 152 self.execute('get_pid_list') |
| 153 |
| 154 @skipIf(POSIX) |
| 155 def test_pid_exists(self): |
| 156 self.execute('pid_exists', os.getpid()) |
| 157 |
| 158 def test_process_iter(self): |
| 159 self.execute('process_iter') |
| 160 |
| 161 def test_used_phymem(self): |
| 162 self.execute('used_phymem') |
| 163 |
| 164 def test_avail_phymem(self): |
| 165 self.execute('avail_phymem') |
| 166 |
| 167 def test_total_virtmem(self): |
| 168 self.execute('total_virtmem') |
| 169 |
| 170 def test_used_virtmem(self): |
| 171 self.execute('used_virtmem') |
| 172 |
| 173 def test_avail_virtmem(self): |
| 174 self.execute('avail_virtmem') |
| 175 |
| 176 def test_cpu_times(self): |
| 177 self.execute('cpu_times') |
| 178 |
| 179 |
| 180 def test_main(): |
| 181 test_suite = unittest.TestSuite() |
| 182 test_suite.addTest(unittest.makeSuite(TestProcessObjectLeaks)) |
| 183 test_suite.addTest(unittest.makeSuite(TestModuleFunctionsLeaks)) |
| 184 unittest.TextTestRunner(verbosity=2).run(test_suite) |
| 185 |
| 186 if __name__ == '__main__': |
| 187 test_main() |
| 188 |
OLD | NEW |