From 5197dff52de281235cabf8538da47a517c08c5a5 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 24 Aug 2012 11:50:07 +0530 Subject: [PATCH] MTP: Add tests for mem leaks --- src/calibre/devices/mtp/test.py | 45 +++++++++++++++++++++++++-- src/calibre/devices/mtp/unix/libmtp.c | 2 +- 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/src/calibre/devices/mtp/test.py b/src/calibre/devices/mtp/test.py index 6d4dcf03bb..ca8dd55176 100644 --- a/src/calibre/devices/mtp/test.py +++ b/src/calibre/devices/mtp/test.py @@ -7,7 +7,7 @@ __license__ = 'GPL v3' __copyright__ = '2012, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import unittest +import unittest, gc from calibre.constants import iswindows, islinux from calibre.utils.icu import lower @@ -78,13 +78,52 @@ class TestDeviceInteraction(unittest.TestCase): with self.assertRaises(ValueError): self.dev.create_folder(root_file[0], 'sub-folder') + def measure_memory_usage(self, repetitions, func, *args, **kwargs): + from calibre.utils.mem import memory + gc.disable() + try: + start_mem = memory() + for i in xrange(repetitions): + func(*args, **kwargs) + for i in xrange(3): gc.collect() + end_mem = memory() + finally: + gc.enable() + return end_mem - start_mem + def test_memory_leaks(self): + ''' Test for memory leaks in the C modules ''' if not (iswindows or islinux): self.skipTest('Can only test for leaks on windows and linux') - from calibre.utils.mem import memory + + # Test device scanning + used_by_one = self.measure_memory_usage(1, + self.dev.detect_managed_devices, self.scanner.devices, + force_refresh=True) + + used_by_many = self.measure_memory_usage(1000, + self.dev.detect_managed_devices, self.scanner.devices, + force_refresh=True) + + self.assertTrue(used_by_many <= used_by_one, + msg='Memory consumption during device scan: for one: %g for many:%g'% + (used_by_one, used_by_many)) + + # Test get_filesystem + used_by_one = self.measure_memory_usage(1, + self.dev.dev.get_filesystem, self.storage.object_id) + + used_by_many = self.measure_memory_usage(5, + self.dev.dev.get_filesystem, self.storage.object_id) + + self.assertTrue(used_by_many <= used_by_one, + msg='Memory consumption during get_filesystem: for one: %g for many:%g'% + (used_by_one, used_by_many)) def tests(): - return unittest.TestLoader().loadTestsFromTestCase(TestDeviceInteraction) + tl = unittest.TestLoader() + return tl.loadTestsFromName('test.TestDeviceInteraction.test_memory_leaks') + return tl.loadTestsFromTestCase(TestDeviceInteraction) def run(): unittest.TextTestRunner(verbosity=2).run(tests()) diff --git a/src/calibre/devices/mtp/unix/libmtp.c b/src/calibre/devices/mtp/unix/libmtp.c index 620d1afe46..982d0faf97 100644 --- a/src/calibre/devices/mtp/unix/libmtp.c +++ b/src/calibre/devices/mtp/unix/libmtp.c @@ -14,7 +14,7 @@ #include "devices.h" -// Macros and utilities +// Macros and utilities {{{ static PyObject *MTPError = NULL; #define ENSURE_DEV(rval) \