summaryrefslogtreecommitdiff
path: root/test/suite/wttest.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/suite/wttest.py')
-rw-r--r--test/suite/wttest.py87
1 files changed, 80 insertions, 7 deletions
diff --git a/test/suite/wttest.py b/test/suite/wttest.py
index 4d6df0bc8bd..e91838544b9 100644
--- a/test/suite/wttest.py
+++ b/test/suite/wttest.py
@@ -37,9 +37,8 @@ except ImportError:
import unittest
from contextlib import contextmanager
-import os, re, shutil, sys, time, traceback
-import wtscenario
-import wiredtiger
+import glob, os, re, shutil, sys, time, traceback
+import wiredtiger, wtscenario
def shortenWithEllipsis(s, maxlen):
if len(s) > maxlen:
@@ -152,6 +151,14 @@ class TestSuiteConnection(object):
else:
return getattr(self._conn, attr)
+# Just like a list of strings, but with a convenience function
+class ExtensionList(list):
+ skipIfMissing = False
+ def extension(self, dirname, name, extarg=None):
+ if name != None and name != 'none':
+ ext = '' if extarg == None else '=' + extarg
+ self.append(dirname + '/' + name + ext)
+
class WiredTigerTestCase(unittest.TestCase):
_globalSetup = False
_printOnceSeen = {}
@@ -160,9 +167,16 @@ class WiredTigerTestCase(unittest.TestCase):
# Can be a string or a callable function or lambda expression.
conn_config = ''
+ # conn_extensions can be overridden to add a list of extensions to load.
+ # Each entry is a string (directory and extension name) and optional config.
+ # Example:
+ # conn_extensions = ('extractors/csv_extractor',
+ # 'test/fail_fs={allow_writes=100}')
+ conn_extensions = ()
+
@staticmethod
def globalSetup(preserveFiles = False, useTimestamp = False,
- gdbSub = False, verbose = 1, dirarg = None,
+ gdbSub = False, verbose = 1, builddir = None, dirarg = None,
longtest = False):
WiredTigerTestCase._preserveFiles = preserveFiles
d = 'WT_TEST' if dirarg == None else dirarg
@@ -172,6 +186,7 @@ class WiredTigerTestCase(unittest.TestCase):
os.makedirs(d)
wtscenario.set_long_run(longtest)
WiredTigerTestCase._parentTestdir = d
+ WiredTigerTestCase._builddir = builddir
WiredTigerTestCase._origcwd = os.getcwd()
WiredTigerTestCase._resultfile = open(os.path.join(d, 'results.txt'), "w", 0) # unbuffered
WiredTigerTestCase._gdbSubprocess = gdbSub
@@ -224,16 +239,70 @@ class WiredTigerTestCase(unittest.TestCase):
return "%s.%s.%s" % (self.__module__,
self.className(), self._testMethodName)
- # Can be overridden, but first consider setting self.conn_config .
+ # Return the wiredtiger_open extension argument for
+ # any needed shared library.
+ def extensionsConfig(self):
+ exts = self.conn_extensions
+ if hasattr(exts, '__call__'):
+ exts = ExtensionList()
+ self.conn_extensions(exts)
+ result = ''
+ extfiles = {}
+ skipIfMissing = False
+ if hasattr(exts, 'skip_if_missing'):
+ skipIfMissing = exts.skip_if_missing
+ for ext in exts:
+ extconf = ''
+ if '=' in ext:
+ splits = ext.split('=', 1)
+ ext = splits[0]
+ extconf = '=' + splits[1]
+ splits = ext.split('/')
+ if len(splits) != 2:
+ raise Exception(self.shortid() +
+ ": " + ext +
+ ": extension is not named <dir>/<name>")
+ libname = splits[1]
+ dirname = splits[0]
+ pat = os.path.join(WiredTigerTestCase._builddir, 'ext',
+ dirname, libname, '.libs', 'libwiredtiger_*.so')
+ filenames = glob.glob(pat)
+ if len(filenames) == 0:
+ if skipIfMissing:
+ self.skipTest('extension "' + ext + '" not built')
+ continue
+ else:
+ raise Exception(self.shortid() +
+ ": " + ext +
+ ": no extensions library found matching: " + pat)
+ elif len(filenames) > 1:
+ raise Exception(self.shortid() +
+ ": " + ext +
+ ": multiple extensions libraries found matching: " + pat)
+ complete = '"' + filenames[0] + '"' + extconf
+ if ext in extfiles:
+ if extfiles[ext] != complete:
+ raise Exception(self.shortid() +
+ ": non-matching extension arguments in " +
+ str(exts))
+ else:
+ extfiles[ext] = complete
+ if len(extfiles) != 0:
+ result = ',extensions=[' + ','.join(extfiles.values()) + ']'
+ return result
+
+ # Can be overridden, but first consider setting self.conn_config
+ # or self.conn_extensions
def setUpConnectionOpen(self, home):
self.home = home
config = self.conn_config
if hasattr(config, '__call__'):
- config = config(home)
+ config = self.conn_config()
+ config += self.extensionsConfig()
# In case the open starts additional threads, flush first to
# avoid confusion.
sys.stdout.flush()
- conn_param = 'create,error_prefix="%s: ",%s' % (self.shortid(), config)
+ conn_param = 'create,error_prefix="%s",%s' % (self.shortid(), config)
try:
conn = self.wiredtiger_open(home, conn_param)
except wiredtiger.WiredTigerError as e:
@@ -287,6 +356,7 @@ class WiredTigerTestCase(unittest.TestCase):
self.testsubdir = self.className() + '.' + str(self.__class__.wt_ntests)
self.testdir = os.path.join(WiredTigerTestCase._parentTestdir, self.testsubdir)
self.__class__.wt_ntests += 1
+ self.starttime = time.time()
if WiredTigerTestCase._verbose > 2:
self.prhead('started in ' + self.testdir, True)
# tearDown needs connections list, set it here in case the open fails.
@@ -355,6 +425,9 @@ class WiredTigerTestCase(unittest.TestCase):
else:
self.pr('preserving directory ' + self.testdir)
+ elapsed = time.time() - self.starttime
+ if elapsed > 0.001 and WiredTigerTestCase._verbose >= 2:
+ print "%s: %.2f seconds" % (str(self), elapsed)
if not passed and not skipped:
print "ERROR in " + str(self)
self.pr('FAIL')