summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorJohn Wiegley <johnw@newartisans.com>2010-06-15 01:41:51 -0400
committerJohn Wiegley <johnw@newartisans.com>2010-06-15 01:49:18 -0400
commitfa263e729c65e073950a15db11c149ebacba0937 (patch)
tree8aa9079aa0475cb6c6d0cb2ce1666c13fb3c0d59 /test
parentf3bedb88b24ae8b2047ad86e57b161265c2812f5 (diff)
downloadfork-ledger-fa263e729c65e073950a15db11c149ebacba0937.tar.gz
fork-ledger-fa263e729c65e073950a15db11c149ebacba0937.tar.bz2
fork-ledger-fa263e729c65e073950a15db11c149ebacba0937.zip
Tests run in parallel with using acprep -jX make
This is done using the multiprocessing library in Python 2.6. If that's unavailable, this feature does nothing.
Diffstat (limited to 'test')
-rwxr-xr-xtest/GenerateTests.py43
-rwxr-xr-xtest/LedgerHarness.py21
-rwxr-xr-xtest/RegressTests.py63
3 files changed, 104 insertions, 23 deletions
diff --git a/test/GenerateTests.py b/test/GenerateTests.py
index d60e0581..70baee28 100755
--- a/test/GenerateTests.py
+++ b/test/GenerateTests.py
@@ -4,13 +4,30 @@
# final balance is the same as what the balance report shows.
import sys
-#import re
+import re
from difflib import ndiff
+multiproc = False
+try:
+ from multiprocessing import Pool
+ multiproc = True
+except:
+ pass
+
+args = sys.argv
+jobs = 1
+match = re.match('-j([0-9]+)?', args[1])
+if match:
+ args = [args[0]] + args[2:]
+ if match.group(1):
+ jobs = int(match.group(1))
+if jobs == 1:
+ multiproc = False
+
from LedgerHarness import LedgerHarness
-harness = LedgerHarness(sys.argv)
+harness = LedgerHarness(args)
#def normalize(line):
# match = re.match("((\s*)([A-Za-z]+)?(\s*)([-0-9.]+)(\s*)([A-Za-z]+)?)( (.+))?$", line)
@@ -104,14 +121,28 @@ def generation_test(seed):
beg_range = 1
end_range = 20
-if len(sys.argv) > 4:
- beg_range = int(sys.argv[3])
- end_range = int(sys.argv[4])
+if len(args) > 4:
+ beg_range = int(args[3])
+ end_range = int(args[4])
-for i in range(beg_range, end_range):
+def run_gen_test(i):
if generation_test(i):
harness.success()
else:
harness.failure()
+if multiproc:
+ pool = Pool(jobs*2)
+else:
+ pool = None
+
+if pool:
+ pool.map(run_gen_test, range(beg_range, end_range))
+else:
+ for i in range(beg_range, end_range):
+ run_gen_test(i)
+
+if pool:
+ pool.close()
+ pool.join()
harness.exit()
diff --git a/test/LedgerHarness.py b/test/LedgerHarness.py
index ea8290d4..44e4e61c 100755
--- a/test/LedgerHarness.py
+++ b/test/LedgerHarness.py
@@ -6,6 +6,27 @@ import re
from subprocess import Popen, PIPE
+import copy_reg
+import types
+
+def _pickle_method(method):
+ func_name = method.im_func.__name__
+ obj = method.im_self
+ cls = method.im_class
+ return _unpickle_method, (func_name, obj, cls)
+
+def _unpickle_method(func_name, obj, cls):
+ for cls in cls.mro():
+ try:
+ func = cls.__dict__[func_name]
+ except KeyError:
+ pass
+ else:
+ break
+ return func.__get__(obj, cls)
+
+copy_reg.pickle(types.MethodType, _pickle_method, _unpickle_method)
+
class LedgerHarness:
ledger = None
sourcepath = None
diff --git a/test/RegressTests.py b/test/RegressTests.py
index a32bdb6b..0472ac90 100755
--- a/test/RegressTests.py
+++ b/test/RegressTests.py
@@ -5,18 +5,35 @@ import os
import re
import tempfile
+multiproc = False
+try:
+ from multiprocessing import Pool
+ multiproc = True
+except:
+ pass
+
from string import join
from difflib import unified_diff
from LedgerHarness import LedgerHarness
-harness = LedgerHarness(sys.argv)
-tests = sys.argv[3]
+args = sys.argv
+jobs = 1
+match = re.match('-j([0-9]+)?', args[1])
+if match:
+ args = [args[0]] + args[2:]
+ if match.group(1):
+ jobs = int(match.group(1))
+if jobs == 1:
+ multiproc = False
+
+harness = LedgerHarness(args)
+tests = args[3]
if not os.path.isdir(tests) and not os.path.isfile(tests):
sys.exit(1)
-class RegressFile:
+class RegressFile(object):
def __init__(self, filename):
self.filename = filename
self.fd = open(self.filename)
@@ -137,24 +154,36 @@ class RegressFile:
if not use_stdin:
os.remove(tempdata[1])
- def run_tests(self):
+ def run_tests(self, pool):
test = self.read_test()
while test:
- self.run_test(test)
+ if pool:
+ pool.apply_async(RegressFile.run_test, (self, test,))
+ else:
+ self.run_test(test)
test = self.read_test(test)
def close(self):
self.fd.close()
-if os.path.isdir(tests):
- for test_file in os.listdir(tests):
- if re.search('\.test$', test_file):
- entry = RegressFile(os.path.join(tests, test_file))
- entry.run_tests()
- entry.close()
-else:
- entry = RegressFile(tests)
- entry.run_tests()
- entry.close()
-
-harness.exit()
+if __name__ == '__main__':
+ if multiproc:
+ pool = Pool(jobs*2)
+ else:
+ pool = None
+
+ if os.path.isdir(tests):
+ for test_file in os.listdir(tests):
+ if re.search('\.test$', test_file):
+ entry = RegressFile(os.path.join(tests, test_file))
+ entry.run_tests(pool)
+ entry.close()
+ else:
+ entry = RegressFile(tests)
+ entry.run_tests(pool)
+ entry.close()
+
+ if pool:
+ pool.close()
+ pool.join()
+ harness.exit()