summaryrefslogtreecommitdiff
path: root/test/suite
diff options
context:
space:
mode:
Diffstat (limited to 'test/suite')
-rw-r--r--test/suite/run.py3
-rw-r--r--test/suite/test_async01.py2
-rw-r--r--test/suite/test_async02.py2
-rw-r--r--test/suite/test_backup03.py2
-rw-r--r--test/suite/test_backup04.py2
-rw-r--r--test/suite/test_bug011.py2
-rw-r--r--test/suite/test_collator.py32
-rw-r--r--test/suite/test_compact02.py2
-rw-r--r--test/suite/test_compress01.py20
-rw-r--r--test/suite/test_config03.py2
-rw-r--r--test/suite/test_cursor07.py2
-rw-r--r--test/suite/test_cursor08.py20
-rw-r--r--test/suite/test_cursor10.py4
-rw-r--r--test/suite/test_cursor11.py159
-rw-r--r--test/suite/test_cursor_random.py49
-rw-r--r--test/suite/test_dump.py54
-rw-r--r--test/suite/test_encrypt01.py39
-rw-r--r--test/suite/test_encrypt02.py48
-rw-r--r--test/suite/test_encrypt03.py37
-rw-r--r--test/suite/test_encrypt04.py45
-rw-r--r--test/suite/test_encrypt05.py39
-rw-r--r--test/suite/test_encrypt06.py39
-rw-r--r--test/suite/test_encrypt07.py35
-rw-r--r--test/suite/test_intpack.py4
-rw-r--r--test/suite/test_join01.py2
-rw-r--r--test/suite/test_join03.py30
-rw-r--r--test/suite/test_join04.py30
-rw-r--r--test/suite/test_join07.py30
-rw-r--r--test/suite/test_jsondump02.py18
-rw-r--r--test/suite/test_lsm01.py2
-rw-r--r--test/suite/test_overwrite.py67
-rw-r--r--test/suite/test_perf001.py3
-rw-r--r--test/suite/test_readonly01.py3
-rw-r--r--test/suite/test_reconfig01.py12
-rw-r--r--test/suite/test_reconfig02.py3
-rw-r--r--test/suite/test_reconfig04.py2
-rw-r--r--test/suite/test_schema05.py30
-rw-r--r--test/suite/test_schema07.py3
-rw-r--r--test/suite/test_shared_cache01.py2
-rw-r--r--test/suite/test_shared_cache02.py2
-rw-r--r--test/suite/test_stat02.py2
-rw-r--r--test/suite/test_sweep01.py7
-rw-r--r--test/suite/test_truncate01.py10
-rw-r--r--test/suite/test_truncate02.py3
-rw-r--r--test/suite/test_txn02.py26
-rw-r--r--test/suite/test_txn04.py22
-rw-r--r--test/suite/test_txn05.py28
-rw-r--r--test/suite/test_txn06.py4
-rw-r--r--test/suite/test_txn07.py56
-rw-r--r--test/suite/test_txn08.py2
-rw-r--r--test/suite/test_txn09.py17
-rw-r--r--test/suite/test_txn11.py2
-rw-r--r--test/suite/test_txn13.py2
-rw-r--r--test/suite/test_txn15.py2
-rw-r--r--test/suite/test_util14.py92
-rw-r--r--test/suite/test_util15.py71
-rw-r--r--test/suite/test_util16.py71
-rw-r--r--test/suite/test_util17.py57
-rw-r--r--test/suite/wtdataset.py92
-rw-r--r--test/suite/wttest.py87
60 files changed, 987 insertions, 548 deletions
diff --git a/test/suite/run.py b/test/suite/run.py
index ba6d9f78503..97c58bfdccf 100644
--- a/test/suite/run.py
+++ b/test/suite/run.py
@@ -324,7 +324,8 @@ if __name__ == '__main__':
# All global variables should be set before any test classes are loaded.
# That way, verbose printing can be done at the class definition level.
wttest.WiredTigerTestCase.globalSetup(preserve, timestamp, gdbSub,
- verbose, dirarg, longtest)
+ verbose, wt_builddir, dirarg,
+ longtest)
# Without any tests listed as arguments, do discovery
if len(testargs) == 0:
diff --git a/test/suite/test_async01.py b/test/suite/test_async01.py
index cbb3dad8de6..158c16a9381 100644
--- a/test/suite/test_async01.py
+++ b/test/suite/test_async01.py
@@ -132,7 +132,7 @@ class test_async01(wttest.WiredTigerTestCase, suite_subprocess):
])
# Enable async for this test.
- def conn_config(self, dir):
+ def conn_config(self):
return 'async=(enabled=true,ops_max=%s,' % self.async_ops + \
'threads=%s)' % self.async_threads
diff --git a/test/suite/test_async02.py b/test/suite/test_async02.py
index 50652da6dfd..28435fe85b2 100644
--- a/test/suite/test_async02.py
+++ b/test/suite/test_async02.py
@@ -129,7 +129,7 @@ class test_async02(wttest.WiredTigerTestCase, suite_subprocess):
])
# Enable async for this test.
- def conn_config(self, dir):
+ def conn_config(self):
return 'async=(enabled=true,ops_max=%s,' % self.async_ops + \
'threads=%s)' % self.async_threads
diff --git a/test/suite/test_backup03.py b/test/suite/test_backup03.py
index 73d05f0b0a1..c1ed3cc9e1a 100644
--- a/test/suite/test_backup03.py
+++ b/test/suite/test_backup03.py
@@ -74,7 +74,7 @@ class test_backup_target(wttest.WiredTigerTestCase, suite_subprocess):
('backup_9', dict(big=3,list=[])), # Backup everything
]
- scenarios = make_scenarios(list)
+ scenarios = make_scenarios(list, prune=3, prunelong=1000)
# Create a large cache, otherwise this test runs quite slowly.
conn_config = 'cache_size=1G'
diff --git a/test/suite/test_backup04.py b/test/suite/test_backup04.py
index 919649fed57..be52a5e1e97 100644
--- a/test/suite/test_backup04.py
+++ b/test/suite/test_backup04.py
@@ -60,7 +60,7 @@ class test_backup_target(wttest.WiredTigerTestCase, suite_subprocess):
])
# Create a large cache, otherwise this test runs quite slowly.
- def conn_config(self, dir):
+ def conn_config(self):
return 'cache_size=1G,log=(archive=false,enabled,file_max=%s)' % \
self.logmax
diff --git a/test/suite/test_bug011.py b/test/suite/test_bug011.py
index 969aaeb5b39..5e0721b93f1 100644
--- a/test/suite/test_bug011.py
+++ b/test/suite/test_bug011.py
@@ -43,7 +43,7 @@ class test_bug011(wttest.WiredTigerTestCase):
nrows = 10000
nops = 10000
# Add connection configuration for this test.
- def conn_config(self, dir):
+ def conn_config(self):
return 'cache_size=1GB'
@wttest.longtest("Eviction copes with lots of files")
diff --git a/test/suite/test_collator.py b/test/suite/test_collator.py
index 3fae4ff47cb..7ce135c8976 100644
--- a/test/suite/test_collator.py
+++ b/test/suite/test_collator.py
@@ -48,34 +48,10 @@ class test_collator(wttest.WiredTigerTestCase):
nentries = 100
nindices = 4
- # Return the wiredtiger_open extension argument for a shared library.
- def extensionArg(self, exts):
- extfiles = []
- for ext in exts:
- (dirname, name, libname) = ext
- if name != None and name != 'none':
- testdir = os.path.dirname(__file__)
- extdir = os.path.join(run.wt_builddir, 'ext', dirname)
- extfile = os.path.join(
- extdir, name, '.libs', 'libwiredtiger_' + libname + '.so')
- if not os.path.exists(extfile):
- self.skipTest('extension "' + extfile + '" not built')
- if not extfile in extfiles:
- extfiles.append(extfile)
- if len(extfiles) == 0:
- return ''
- else:
- return ',extensions=["' + '","'.join(extfiles) + '"]'
-
- # Override WiredTigerTestCase, we have extensions.
- def setUpConnectionOpen(self, dir):
- extarg = self.extensionArg([('extractors', 'csv', 'csv_extractor'),
- ('collators', 'revint', 'revint_collator')])
- connarg = 'create,error_prefix="{0}: ",{1}'.format(
- self.shortid(), extarg)
- conn = self.wiredtiger_open(dir, connarg)
- self.pr(`conn`)
- return conn
+ def conn_extensions(self, extlist):
+ extlist.skip_if_missing = True
+ extlist.extension('extractors', 'csv')
+ extlist.extension('collators', 'revint')
def create_indices(self):
# Create self.nindices index files, each with a column from the CSV
diff --git a/test/suite/test_compact02.py b/test/suite/test_compact02.py
index 7af76b5fd58..803600eea14 100644
--- a/test/suite/test_compact02.py
+++ b/test/suite/test_compact02.py
@@ -99,7 +99,7 @@ class test_compact02(wttest.WiredTigerTestCase):
def ConnectionOpen(self, cacheSize):
self.home = '.'
conn_params = 'create,' + \
- cacheSize + ',error_prefix="%s: ",' % self.shortid() + \
+ cacheSize + ',error_prefix="%s",' % self.shortid() + \
'statistics=(all),' + \
'eviction_dirty_target=99,eviction_dirty_trigger=99'
try:
diff --git a/test/suite/test_compress01.py b/test/suite/test_compress01.py
index 606f7b63235..ef1064d294e 100644
--- a/test/suite/test_compress01.py
+++ b/test/suite/test_compress01.py
@@ -51,22 +51,10 @@ class test_compress01(wttest.WiredTigerTestCase):
nrecords = 10000
bigvalue = "abcdefghij" * 1000
- # Load the compression extension, compression is enabled elsewhere.
- def conn_config(self, dir):
- return self.extensionArg(self.compress)
-
- # Return the wiredtiger_open extension argument for a shared library.
- def extensionArg(self, name):
- if name == None:
- return ''
-
- testdir = os.path.dirname(__file__)
- extdir = os.path.join(run.wt_builddir, 'ext/compressors')
- extfile = os.path.join(
- extdir, name, '.libs', 'libwiredtiger_' + name + '.so')
- if not os.path.exists(extfile):
- self.skipTest('compression extension "' + extfile + '" not built')
- return ',extensions=["' + extfile + '"]'
+ # Load the compression extension, skip the test if missing
+ def conn_extensions(self, extlist):
+ extlist.skip_if_missing = True
+ extlist.extension('compressors', self.compress)
# Create a table, add keys with both big and small values, then verify them.
def test_compress(self):
diff --git a/test/suite/test_config03.py b/test/suite/test_config03.py
index 6699f7d2650..89038d71319 100644
--- a/test/suite/test_config03.py
+++ b/test/suite/test_config03.py
@@ -71,7 +71,7 @@ class test_config03(test_base03.test_base03):
cache_size_scenarios, create_scenarios, error_prefix_scenarios,
eviction_target_scenarios, eviction_trigger_scenarios,
multiprocess_scenarios, session_max_scenarios,
- transactional_scenarios, verbose_scenarios, prune=1000)
+ transactional_scenarios, verbose_scenarios, prune=100, prunelong=1000)
#wttest.WiredTigerTestCase.printVerbose(2, 'test_config03: running ' + \
# str(len(scenarios)) + ' of ' + \
diff --git a/test/suite/test_cursor07.py b/test/suite/test_cursor07.py
index d6078183fc1..19db718fd11 100644
--- a/test/suite/test_cursor07.py
+++ b/test/suite/test_cursor07.py
@@ -49,7 +49,7 @@ class test_cursor07(wttest.WiredTigerTestCase, suite_subprocess):
('reopen', dict(reopen=True))
])
# Enable logging for this test.
- def conn_config(self, dir):
+ def conn_config(self):
return 'log=(archive=false,enabled,file_max=%s),' % self.logmax + \
'transaction_sync="(method=dsync,enabled)"'
diff --git a/test/suite/test_cursor08.py b/test/suite/test_cursor08.py
index 3f8f50defa7..cc76f528aa9 100644
--- a/test/suite/test_cursor08.py
+++ b/test/suite/test_cursor08.py
@@ -54,24 +54,14 @@ class test_cursor08(wttest.WiredTigerTestCase, suite_subprocess):
]
scenarios = make_scenarios(reopens, compress)
# Load the compression extension, and enable it for logging.
- def conn_config(self, dir):
+ def conn_config(self):
return 'log=(archive=false,enabled,file_max=%s,' % self.logmax + \
'compressor=%s),' % self.compress + \
- 'transaction_sync="(method=dsync,enabled)",' + \
- self.extensionArg(self.compress)
+ 'transaction_sync="(method=dsync,enabled)"'
- # Return the wiredtiger_open extension argument for a shared library.
- def extensionArg(self, name):
- if name == None or name == 'none':
- return ''
-
- testdir = os.path.dirname(__file__)
- extdir = os.path.join(run.wt_builddir, 'ext/compressors')
- extfile = os.path.join(
- extdir, name, '.libs', 'libwiredtiger_' + name + '.so')
- if not os.path.exists(extfile):
- self.skipTest('compression extension "' + extfile + '" not built')
- return ',extensions=["' + extfile + '"]'
+ def conn_extensions(self, extlist):
+ extlist.skip_if_missing = True
+ extlist.extension('compressors', self.compress)
def test_log_cursor(self):
# print "Creating %s with config '%s'" % (self.uri, self.create_params)
diff --git a/test/suite/test_cursor10.py b/test/suite/test_cursor10.py
index b3cffeab4e9..6cabfde9f1f 100644
--- a/test/suite/test_cursor10.py
+++ b/test/suite/test_cursor10.py
@@ -31,11 +31,11 @@ from wtscenario import make_scenarios
# test_cursor10.py
# Cursors with projections.
-class test_cursor04(wttest.WiredTigerTestCase):
+class test_cursor10(wttest.WiredTigerTestCase):
"""
Test cursor search and search_near
"""
- table_name1 = 'test_cursor04'
+ table_name1 = 'test_cursor10'
nentries = 20
scenarios = make_scenarios([
diff --git a/test/suite/test_cursor11.py b/test/suite/test_cursor11.py
new file mode 100644
index 00000000000..e159ec499e6
--- /dev/null
+++ b/test/suite/test_cursor11.py
@@ -0,0 +1,159 @@
+#!/usr/bin/env python
+#
+# Public Domain 2014-2016 MongoDB, Inc.
+# Public Domain 2008-2014 WiredTiger, Inc.
+#
+# This is free and unencumbered software released into the public domain.
+#
+# Anyone is free to copy, modify, publish, use, compile, sell, or
+# distribute this software, either in source code form or as a compiled
+# binary, for any purpose, commercial or non-commercial, and by any
+# means.
+#
+# In jurisdictions that recognize copyright laws, the author or authors
+# of this software dedicate any and all copyright interest in the
+# software to the public domain. We make this dedication for the benefit
+# of the public at large and to the detriment of our heirs and
+# successors. We intend this dedication to be an overt act of
+# relinquishment in perpetuity of all present and future rights to this
+# software under copyright law.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+# IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+
+import wiredtiger, wttest
+from wtdataset import SimpleDataSet, SimpleIndexDataSet
+from wtdataset import SimpleLSMDataSet, ComplexDataSet, ComplexLSMDataSet
+from wtscenario import make_scenarios
+
+# test_cursor11.py
+# WT_CURSOR position tests: remove (if not already positioned), and insert
+# leave the cursor without position or information.
+class test_cursor11(wttest.WiredTigerTestCase):
+
+ keyfmt = [
+ ('integer', dict(keyfmt='i')),
+ ('recno', dict(keyfmt='r')),
+ ('string', dict(keyfmt='S')),
+ ]
+ types = [
+ ('file', dict(uri='file', ds=SimpleDataSet)),
+ ('lsm', dict(uri='lsm', ds=SimpleDataSet)),
+ ('table-complex', dict(uri='table', ds=ComplexDataSet)),
+ ('table-complex-lsm', dict(uri='table', ds=ComplexLSMDataSet)),
+ ('table-index', dict(uri='table', ds=SimpleIndexDataSet)),
+ ('table-simple', dict(uri='table', ds=SimpleDataSet)),
+ ('table-simple-lsm', dict(uri='table', ds=SimpleLSMDataSet)),
+ ]
+ scenarios = make_scenarios(types, keyfmt)
+
+ def skip(self):
+ return self.keyfmt == 'r' and \
+ (self.ds.is_lsm() or self.uri == 'lsm')
+
+ # Do a remove using the cursor after setting a position, and confirm
+ # the key and position remain set but no value.
+ def test_cursor_remove_with_position(self):
+ if self.skip():
+ return
+
+ # Build an object.
+ uri = self.uri + ':test_cursor11'
+ ds = self.ds(self, uri, 50, key_format=self.keyfmt)
+ ds.populate()
+ s = self.conn.open_session()
+ c = s.open_cursor(uri, None)
+
+ c.set_key(ds.key(25))
+ self.assertEquals(c.search(), 0)
+ self.assertEquals(c.next(), 0)
+ self.assertEquals(c.get_key(), ds.key(26))
+ c.remove()
+ self.assertEquals(c.get_key(), ds.key(26))
+ msg = '/requires value be set/'
+ self.assertRaisesWithMessage(
+ wiredtiger.WiredTigerError, c.get_value, msg)
+ self.assertEquals(c.next(), 0)
+ self.assertEquals(c.get_key(), ds.key(27))
+
+ # Do a remove using the cursor without setting a position, and confirm
+ # no key, value or position remains.
+ def test_cursor_remove_without_position(self):
+ if self.skip():
+ return
+
+ # Build an object.
+ uri = self.uri + ':test_cursor11'
+ ds = self.ds(self, uri, 50, key_format=self.keyfmt)
+ ds.populate()
+ s = self.conn.open_session()
+ c = s.open_cursor(uri, None)
+
+ c.set_key(ds.key(25))
+ c.remove()
+ msg = '/requires key be set/'
+ self.assertRaisesWithMessage(
+ wiredtiger.WiredTigerError, c.get_key, msg)
+ msg = '/requires value be set/'
+ self.assertRaisesWithMessage(
+ wiredtiger.WiredTigerError, c.get_value, msg)
+ self.assertEquals(c.next(), 0)
+ self.assertEquals(c.get_key(), ds.key(1))
+
+ # Do a remove using the key after also setting a position, and confirm
+ # no key, value or position remains.
+ def test_cursor_remove_with_key_and_position(self):
+ if self.skip():
+ return
+
+ # Build an object.
+ uri = self.uri + ':test_cursor11'
+ ds = self.ds(self, uri, 50, key_format=self.keyfmt)
+ ds.populate()
+ s = self.conn.open_session()
+ c = s.open_cursor(uri, None)
+
+ c.set_key(ds.key(25))
+ self.assertEquals(c.search(), 0)
+ c.set_key(ds.key(25))
+ c.remove()
+ msg = '/requires key be set/'
+ self.assertRaisesWithMessage(
+ wiredtiger.WiredTigerError, c.get_key, msg)
+ msg = '/requires value be set/'
+ self.assertRaisesWithMessage(
+ wiredtiger.WiredTigerError, c.get_value, msg)
+ self.assertEquals(c.next(), 0)
+ self.assertEquals(c.get_key(), ds.key(1))
+
+ # Do an insert and confirm no key, value or position remains.
+ def test_cursor_insert(self):
+ if self.skip():
+ return
+
+ # Build an object.
+ uri = self.uri + ':test_cursor11'
+ ds = self.ds(self, uri, 50, key_format=self.keyfmt)
+ ds.populate()
+ s = self.conn.open_session()
+ c = s.open_cursor(uri, None)
+
+ c.set_key(ds.key(25))
+ c.set_value(ds.value(300))
+ c.insert()
+ msg = '/requires key be set/'
+ self.assertRaisesWithMessage(
+ wiredtiger.WiredTigerError, c.get_key, msg)
+ msg = '/requires value be set/'
+ self.assertRaisesWithMessage(
+ wiredtiger.WiredTigerError, c.get_value, msg)
+ self.assertEquals(c.next(), 0)
+ self.assertEquals(c.get_key(), ds.key(1))
+
+if __name__ == '__main__':
+ wttest.run()
diff --git a/test/suite/test_cursor_random.py b/test/suite/test_cursor_random.py
index 3bda6dc9946..ee0f85a29ee 100644
--- a/test/suite/test_cursor_random.py
+++ b/test/suite/test_cursor_random.py
@@ -71,6 +71,15 @@ class test_cursor_random(wttest.WiredTigerTestCase):
self.assertEquals(cursor.reset(), 0)
cursor.close()
+ # Check that next_random fails with an empty tree, repeatedly.
+ def test_cursor_random_empty(self):
+ uri = self.type
+ self.session.create(uri, 'key_format=S,value_format=S')
+ cursor = self.session.open_cursor(uri, None, self.config)
+ for i in range(1,5):
+ self.assertTrue(cursor.next(), wiredtiger.WT_NOTFOUND)
+ cursor.close
+
# Check that next_random works with a single value, repeatedly.
def test_cursor_random_single_record(self):
uri = self.type
@@ -127,6 +136,46 @@ class test_cursor_random(wttest.WiredTigerTestCase):
def test_cursor_random_multiple_page_records(self):
self.cursor_random_multiple_page_records(0)
+ # Check that next_random fails in the presence of a set of values, some of
+ # which are deleted.
+ def test_cursor_random_deleted_partial(self):
+ uri = self.type
+ ds = self.dataset(self, uri, 10000,
+ config='allocation_size=512,leaf_page_max=512')
+ ds.populate()
+
+ # Close the connection so everything is forced to disk.
+ self.reopen_conn()
+
+ start = self.session.open_cursor(uri, None)
+ start.set_key(ds.key(10))
+ end = self.session.open_cursor(uri, None)
+ end.set_key(ds.key(10000-10))
+ self.session.truncate(None, start, end, None)
+ self.assertEqual(start.close(), 0)
+ self.assertEqual(end.close(), 0)
+
+ cursor = self.session.open_cursor(uri, None, self.config)
+ for i in range(1,10):
+ self.assertEqual(cursor.next(), 0)
+
+ # Check that next_random fails in the presence of a set of values, all of
+ # which are deleted.
+ def test_cursor_random_deleted_all(self):
+ uri = self.type
+ ds = self.dataset(self, uri, 10000,
+ config='allocation_size=512,leaf_page_max=512')
+ ds.populate()
+
+ # Close the connection so everything is forced to disk.
+ self.reopen_conn()
+
+ self.session.truncate(uri, None, None, None)
+
+ cursor = self.session.open_cursor(uri, None, self.config)
+ for i in range(1,10):
+ self.assertTrue(cursor.next(), wiredtiger.WT_NOTFOUND)
+
# Check that opening a random cursor on column-store returns not-supported.
class test_cursor_random_column(wttest.WiredTigerTestCase):
scenarios = make_scenarios([
diff --git a/test/suite/test_dump.py b/test/suite/test_dump.py
index f6a83c32489..3127c7aef00 100644
--- a/test/suite/test_dump.py
+++ b/test/suite/test_dump.py
@@ -32,7 +32,7 @@ import wiredtiger, wttest
from suite_subprocess import suite_subprocess
from wtscenario import make_scenarios
from wtdataset import SimpleDataSet, SimpleIndexDataSet, SimpleLSMDataSet, \
- ComplexDataSet, ComplexLSMDataSet
+ ComplexDataSet, ComplexLSMDataSet, ProjectionDataSet, ProjectionIndexDataSet
# test_dump.py
# Utilities: wt dump
@@ -62,6 +62,10 @@ class test_dump(wttest.WiredTigerTestCase, suite_subprocess):
('table-simple-lsm', dict(uri='table:', dataset=SimpleLSMDataSet)),
('table-complex', dict(uri='table:', dataset=ComplexDataSet)),
('table-complex-lsm', dict(uri='table:', dataset=ComplexLSMDataSet)),
+ ('table-simple-proj', dict(uri='table:',
+ dataset=ProjectionDataSet, projection=True)),
+ ('table-index-proj', dict(uri='table:',
+ dataset=ProjectionIndexDataSet, projection=True)),
]
scenarios = make_scenarios(types, keyfmt, dumpfmt)
@@ -158,5 +162,53 @@ class test_dump(wttest.WiredTigerTestCase, suite_subprocess):
pop = self.dataset(self, uri2, self.nentries, key_format=self.keyfmt)
pop.check()
+# test_dump_projection
+# Utilities: wt dump
+# Test the dump utility with projections
+class test_dump_projection(wttest.WiredTigerTestCase, suite_subprocess):
+ dir = 'dump.dir' # Backup directory name
+
+ name = 'test_dump'
+ nentries = 2500
+ uri = 'table:'
+
+ # Dump, re-load and do a content comparison.
+ def test_dump(self):
+
+ # Create the object.
+ uri = self.uri + self.name
+ pop = ProjectionDataSet(self, uri, self.nentries, key_format='S')
+ pop.populate()
+
+ # Check some cases with invalid projections.
+ self.runWt(['dump', '-x', uri + '('], \
+ outfilename='bad1.out', errfilename='err1.out', failure=True)
+ self.check_non_empty_file('err1.out')
+ self.runWt(['dump', '-x', uri + '(xx)'], \
+ outfilename='bad2.out', errfilename='err2.out', failure=True)
+ self.check_non_empty_file('err2.out')
+ self.runWt(['dump', '-x', uri + pop.projection[:-1]], \
+ outfilename='bad3.out', errfilename='err3.out', failure=True)
+ self.check_non_empty_file('err3.out')
+
+ # Dump the object with a valid projection.
+ self.runWt(['dump', '-x', uri + pop.projection], outfilename='dump.out')
+
+ # Re-load the object in a new home.
+ os.mkdir(self.dir)
+ self.runWt(['-h', self.dir, 'load', '-f', 'dump.out'])
+
+ # Check the database contents.
+ self.runWt(['list'], outfilename='list.out')
+ self.runWt(['-h', self.dir, 'list'], outfilename='list.out.new')
+ s1 = set(open('list.out').read().split())
+ s2 = set(open('list.out.new').read().split())
+ self.assertEqual(not s1.symmetric_difference(s2), True)
+
+ # Check the object's contents.
+ self.reopen_conn(self.dir)
+ pop_reload = ProjectionDataSet(self, uri, self.nentries, key_format='S')
+ pop_reload.check()
+
if __name__ == '__main__':
wttest.run()
diff --git a/test/suite/test_encrypt01.py b/test/suite/test_encrypt01.py
index 746c9d13e96..317bed93246 100644
--- a/test/suite/test_encrypt01.py
+++ b/test/suite/test_encrypt01.py
@@ -66,41 +66,20 @@ class test_encrypt01(wttest.WiredTigerTestCase):
nrecords = 5000
bigvalue = "abcdefghij" * 1001 # len(bigvalue) = 10010
- # Override WiredTigerTestCase, we have extensions.
- def setUpConnectionOpen(self, dir):
+ def conn_extensions(self, extlist):
+ extlist.skip_if_missing = True
+ extlist.extension('encryptors', self.sys_encrypt)
+ extlist.extension('encryptors', self.file_encrypt)
+ extlist.extension('compressors', self.block_compress)
+ extlist.extension('compressors', self.log_compress)
+
+ def conn_config(self):
encarg = 'encryption=(name={0}{1}),'.format(
self.sys_encrypt, self.sys_encrypt_args)
comparg = ''
if self.log_compress != None:
comparg='log=(compressor={0}),'.format(self.log_compress)
- extarg = self.extensionArg([('encryptors', self.sys_encrypt),
- ('encryptors', self.file_encrypt),
- ('compressors', self.block_compress),
- ('compressors', self.log_compress)])
- conn = self.wiredtiger_open(dir,
- 'create,error_prefix="{0}: ",{1}{2}{3}'.format(
- self.shortid(), encarg, comparg, extarg))
- self.pr(`conn`)
- return conn
-
- # Return the wiredtiger_open extension argument for a shared library.
- def extensionArg(self, exts):
- extfiles = []
- for ext in exts:
- (dirname, name) = ext
- if name != None and name != 'none':
- testdir = os.path.dirname(__file__)
- extdir = os.path.join(run.wt_builddir, 'ext', dirname)
- extfile = os.path.join(
- extdir, name, '.libs', 'libwiredtiger_' + name + '.so')
- if not os.path.exists(extfile):
- self.skipTest('extension "' + extfile + '" not built')
- if not extfile in extfiles:
- extfiles.append(extfile)
- if len(extfiles) == 0:
- return ''
- else:
- return ',extensions=["' + '","'.join(extfiles) + '"]'
+ return encarg + comparg
# Create a table, add keys with both big and small values, then verify them.
def test_encrypt(self):
diff --git a/test/suite/test_encrypt02.py b/test/suite/test_encrypt02.py
index 648686274c4..d950be067e2 100644
--- a/test/suite/test_encrypt02.py
+++ b/test/suite/test_encrypt02.py
@@ -39,51 +39,27 @@ from wtscenario import make_scenarios
class test_encrypt02(wttest.WiredTigerTestCase, suite_subprocess):
uri = 'file:test_encrypt02'
encrypt_type = [
- ('noarg', dict( encrypt='rotn', encrypt_args='name=rotn',
- secret_arg=None)),
- ('keyid', dict( encrypt='rotn', encrypt_args='name=rotn,keyid=11',
- secret_arg=None)),
- ('pass', dict( encrypt='rotn', encrypt_args='name=rotn',
- secret_arg='ABC')),
- ('keyid-pass', dict( encrypt='rotn', encrypt_args='name=rotn,keyid=11',
- secret_arg='ABC')),
+ ('noarg', dict( encrypt_args='name=rotn', secret_arg=None)),
+ ('keyid', dict( encrypt_args='name=rotn,keyid=11', secret_arg=None)),
+ ('pass', dict( encrypt_args='name=rotn', secret_arg='ABC')),
+ ('keyid-pass', dict(
+ encrypt_args='name=rotn,keyid=11', secret_arg='ABC')),
]
scenarios = make_scenarios(encrypt_type)
+ def conn_extensions(self, extlist):
+ # Load the compression extension, skip the test if missing
+ extlist.skip_if_missing = True
+ extlist.extension('encryptors', 'rotn')
+
nrecords = 5000
bigvalue = "abcdefghij" * 1001 # len(bigvalue) = 10010
- # Return the wiredtiger_open extension argument for a shared library.
- def extensionArg(self, exts):
- extfiles = []
- for ext in exts:
- (dirname, name) = ext
- if name != None and name != 'none':
- testdir = os.path.dirname(__file__)
- extdir = os.path.join(run.wt_builddir, 'ext', dirname)
- extfile = os.path.join(
- extdir, name, '.libs', 'libwiredtiger_' + name + '.so')
- if not os.path.exists(extfile):
- self.skipTest('extension "' + extfile + '" not built')
- if not extfile in extfiles:
- extfiles.append(extfile)
- if len(extfiles) == 0:
- return ''
- else:
- return ',extensions=["' + '","'.join(extfiles) + '"]'
-
- # Override WiredTigerTestCase, we have extensions.
- def setUpConnectionOpen(self, dir):
+ def conn_config(self):
secretarg = ''
if self.secret_arg != None:
secretarg = ',secretkey=' + self.secret_arg
- encarg = 'encryption=({0}{1})'.format(self.encrypt_args, secretarg)
- extarg = self.extensionArg([('encryptors', self.encrypt)])
- connarg = 'create,error_prefix="{0}: ",{1},{2}'.format(
- self.shortid(), encarg, extarg)
- conn = self.wiredtiger_open(dir, connarg)
- self.pr(`conn`)
- return conn
+ return 'encryption=({0}{1})'.format(self.encrypt_args, secretarg)
# Create a table, add keys with both big and small values, then verify them.
def test_pass(self):
diff --git a/test/suite/test_encrypt03.py b/test/suite/test_encrypt03.py
index cf459190637..302572bd044 100644
--- a/test/suite/test_encrypt03.py
+++ b/test/suite/test_encrypt03.py
@@ -50,37 +50,14 @@ class test_encrypt03(wttest.WiredTigerTestCase):
]
scenarios = make_scenarios(types, encrypt)
- # Override WiredTigerTestCase, we have extensions.
- def setUpConnectionOpen(self, dir):
- encarg = 'encryption=(name={0}{1}),'.format(
- self.sys_encrypt, self.sys_encrypt_args)
- extarg = self.extensionArg([('encryptors', self.sys_encrypt),
- ('encryptors', self.file_encrypt)])
- self.pr('encarg = ' + encarg + ' extarg = ' + extarg)
- conn = self.wiredtiger_open(dir,
- 'create,error_prefix="{0}: ",{1}{2}'.format(
- self.shortid(), encarg, extarg))
- self.pr(`conn`)
- return conn
+ def conn_extensions(self, extlist):
+ extlist.skip_if_missing = True
+ extlist.extension('encryptors', self.sys_encrypt)
+ extlist.extension('encryptors', self.file_encrypt)
- # Return the wiredtiger_open extension argument for a shared library.
- def extensionArg(self, exts):
- extfiles = []
- for ext in exts:
- (dirname, name) = ext
- if name != None and name != 'none':
- testdir = os.path.dirname(__file__)
- extdir = os.path.join(run.wt_builddir, 'ext', dirname)
- extfile = os.path.join(
- extdir, name, '.libs', 'libwiredtiger_' + name + '.so')
- if not os.path.exists(extfile):
- self.skipTest('extension "' + extfile + '" not built')
- if not extfile in extfiles:
- extfiles.append(extfile)
- if len(extfiles) == 0:
- return ''
- else:
- return ',extensions=["' + '","'.join(extfiles) + '"]'
+ def conn_config(self):
+ return 'encryption=(name={0}{1}),'.format(
+ self.sys_encrypt, self.sys_encrypt_args)
# Create a table with encryption values that are in error.
def test_encrypt(self):
diff --git a/test/suite/test_encrypt04.py b/test/suite/test_encrypt04.py
index a244cf97961..19c0b85d427 100644
--- a/test/suite/test_encrypt04.py
+++ b/test/suite/test_encrypt04.py
@@ -77,9 +77,16 @@ class test_encrypt04(wttest.WiredTigerTestCase, suite_subprocess):
wttest.WiredTigerTestCase.__init__(self, *args, **kwargs)
self.part = 1
+ def conn_extensions(self, extlist):
+ extarg = None
+ if self.expect_forceerror:
+ extarg='(config=\"rotn_force_error=true\")'
+ extlist.skip_if_missing = True
+ extlist.extension('encryptors', self.name, extarg)
+
# Override WiredTigerTestCase, we have extensions.
def setUpConnectionOpen(self, dir):
- forceerror = None
+ self.expect_forceerror = False
if self.part == 1:
self.name = self.name1
self.keyid = self.keyid1
@@ -93,21 +100,20 @@ class test_encrypt04(wttest.WiredTigerTestCase, suite_subprocess):
self.fileinclear = self.fileinclear2 if \
hasattr(self, 'fileinclear2') else False
if hasattr(self, 'forceerror1') and hasattr(self, 'forceerror2'):
- forceerror = "rotn_force_error=true"
- self.expect_forceerror = forceerror != None
+ self.expect_forceerror = True
self.got_forceerror = False
encarg = 'encryption=(name={0},keyid={1},secretkey={2}),'.format(
self.name, self.keyid, self.secretkey)
- # If forceerror is set for this test, add a config arg to
- # the extension string. That signals rotn to return a (-1000)
- # error code, which we'll detect here.
- extarg = self.extensionArg([('encryptors', self.name, forceerror)])
+ # If forceerror is set for this test, conn_extensions adds a
+ # config arg to the extension string. That signals rotn to
+ # return a (-1000) error code, which we'll detect here.
+ extarg = self.extensionsConfig()
self.pr('encarg = ' + encarg + ' extarg = ' + extarg)
completed = False
try:
conn = self.wiredtiger_open(dir,
- 'create,error_prefix="{0}: ",{1}{2}'.format(
+ 'create,error_prefix="{0}",{1}{2}'.format(
self.shortid(), encarg, extarg))
except (BaseException) as err:
# Capture the recognizable error created by rotn
@@ -135,29 +141,6 @@ class test_encrypt04(wttest.WiredTigerTestCase, suite_subprocess):
self.assertEqual(cursor.search(), 0)
self.assertEquals(cursor.get_value(), val)
- # Return the wiredtiger_open extension argument for a shared library.
- def extensionArg(self, exts):
- extfiles = []
- for ext in exts:
- (dirname, name, extarg) = ext
- if name != None and name != 'none':
- testdir = os.path.dirname(__file__)
- extdir = os.path.join(run.wt_builddir, 'ext', dirname)
- extfile = os.path.join(
- extdir, name, '.libs', 'libwiredtiger_' + name + '.so')
- if not os.path.exists(extfile):
- self.skipTest('extension "' + extfile + '" not built')
- extfile = '"' + extfile + '"'
- if not extfile in extfiles:
- s = extfile
- if extarg != None:
- s += "=(config=\"" + extarg + "\")"
- extfiles.append(s)
- if len(extfiles) == 0:
- return ''
- else:
- return ',extensions=[' + ','.join(extfiles) + ']'
-
# Evaluate expression, which either must succeed (if expect_okay)
# or must fail (if !expect_okay).
def check_okay(self, expect_okay, expr):
diff --git a/test/suite/test_encrypt05.py b/test/suite/test_encrypt05.py
index 19a3522b3d5..d8862321821 100644
--- a/test/suite/test_encrypt05.py
+++ b/test/suite/test_encrypt05.py
@@ -49,41 +49,20 @@ class test_encrypt05(wttest.WiredTigerTestCase):
nrecords = 500
bigvalue = 'a' * 500 # we use values that will definitely give compression
- # Override WiredTigerTestCase, we have extensions.
- def setUpConnectionOpen(self, dir):
+ def conn_extensions(self, extlist):
+ extlist.skip_if_missing = True
+ extlist.extension('encryptors', self.sys_encrypt)
+ extlist.extension('encryptors', self.file_encrypt)
+ extlist.extension('compressors', self.block_compress)
+ extlist.extension('compressors', self.log_compress)
+
+ def conn_config(self):
encarg = 'encryption=(name={0}{1}),'.format(
self.sys_encrypt, self.sys_encrypt_args)
comparg = ''
if self.log_compress != None:
comparg='log=(compressor={0}),'.format(self.log_compress)
- extarg = self.extensionArg([('encryptors', self.sys_encrypt),
- ('encryptors', self.file_encrypt),
- ('compressors', self.block_compress),
- ('compressors', self.log_compress)])
- conn = self.wiredtiger_open(dir,
- 'create,error_prefix="{0}: ",{1}{2}{3}'.format(
- self.shortid(), encarg, comparg, extarg))
- self.pr(`conn`)
- return conn
-
- # Return the wiredtiger_open extension argument for a shared library.
- def extensionArg(self, exts):
- extfiles = []
- for ext in exts:
- (dirname, name) = ext
- if name != None and name != 'none':
- testdir = os.path.dirname(__file__)
- extdir = os.path.join(run.wt_builddir, 'ext', dirname)
- extfile = os.path.join(
- extdir, name, '.libs', 'libwiredtiger_' + name + '.so')
- if not os.path.exists(extfile):
- self.skipTest('extension "' + extfile + '" not built')
- if not extfile in extfiles:
- extfiles.append(extfile)
- if len(extfiles) == 0:
- return ''
- else:
- return ',extensions=["' + '","'.join(extfiles) + '"]'
+ return encarg + comparg
def getvalue(self, r, n):
if n < len(self.bigvalue):
diff --git a/test/suite/test_encrypt06.py b/test/suite/test_encrypt06.py
index 893c4ba3095..72718e53b2b 100644
--- a/test/suite/test_encrypt06.py
+++ b/test/suite/test_encrypt06.py
@@ -89,38 +89,15 @@ class test_encrypt06(wttest.WiredTigerTestCase):
scenarios = make_scenarios(encrypt, storagetype)
nrecords = 1000
- # Override WiredTigerTestCase, we have extensions.
- def setUpConnectionOpen(self, dir):
- encarg = 'encryption=(name={0}{1}),'.format(
+ def conn_extensions(self, extlist):
+ extlist.skip_if_missing = True
+ extlist.extension('encryptors', self.sys_encrypt)
+ extlist.extension('encryptors', self.file0_encrypt)
+ extlist.extension('encryptors', self.file1_encrypt)
+
+ def conn_config(self):
+ return 'encryption=(name={0}{1}),'.format(
self.sys_encrypt, self.sys_encrypt_args)
- comparg = ''
- extarg = self.extensionArg([('encryptors', self.sys_encrypt),
- ('encryptors', self.file0_encrypt),
- ('encryptors', self.file1_encrypt)])
- self.open_params = 'create,error_prefix="{0}: ",{1}{2}{3}'.format(
- self.shortid(), encarg, comparg, extarg)
- conn = self.wiredtiger_open(dir, self.open_params)
- self.pr(`conn`)
- return conn
-
- # Return the wiredtiger_open extension argument for a shared library.
- def extensionArg(self, exts):
- extfiles = []
- for ext in exts:
- (dirname, name) = ext
- if name != None and name != 'none':
- testdir = os.path.dirname(__file__)
- extdir = os.path.join(run.wt_builddir, 'ext', dirname)
- extfile = os.path.join(
- extdir, name, '.libs', 'libwiredtiger_' + name + '.so')
- if not os.path.exists(extfile):
- self.skipTest('extension "' + extfile + '" not built')
- if not extfile in extfiles:
- extfiles.append(extfile)
- if len(extfiles) == 0:
- return ''
- else:
- return ',extensions=["' + '","'.join(extfiles) + '"]'
def encrypt_file_params(self, name, args):
if name == None:
diff --git a/test/suite/test_encrypt07.py b/test/suite/test_encrypt07.py
index 97ab1987d4f..81c9f1a49ea 100644
--- a/test/suite/test_encrypt07.py
+++ b/test/suite/test_encrypt07.py
@@ -44,35 +44,14 @@ class test_encrypt07(test_salvage.test_salvage):
nrecords = 5000
bigvalue = "abcdefghij" * 1007 # len(bigvalue) = 10070
- # Override WiredTigerTestCase, we have extensions.
- def setUpConnectionOpen(self, dir):
- encarg = 'encryption=(name={0}{1}),'.format(
- self.sys_encrypt, self.sys_encrypt_args)
- extarg = self.extensionArg([('encryptors', self.sys_encrypt)])
- conn = self.wiredtiger_open(dir,
- 'create,error_prefix="{0}: ",{1}{2}'.format(
- self.shortid(), encarg, extarg))
- self.pr(`conn`)
- return conn
+ def conn_extensions(self, extlist):
+ # Load the compression extension, skip the test if missing
+ extlist.skip_if_missing = True
+ extlist.extension('encryptors', self.sys_encrypt)
- # Return the wiredtiger_open extension argument for a shared library.
- def extensionArg(self, exts):
- extfiles = []
- for ext in exts:
- (dirname, name) = ext
- if name != None and name != 'none':
- testdir = os.path.dirname(__file__)
- extdir = os.path.join(run.wt_builddir, 'ext', dirname)
- extfile = os.path.join(
- extdir, name, '.libs', 'libwiredtiger_' + name + '.so')
- if not os.path.exists(extfile):
- self.skipTest('extension "' + extfile + '" not built')
- if not extfile in extfiles:
- extfiles.append(extfile)
- if len(extfiles) == 0:
- return ''
- else:
- return ',extensions=["' + '","'.join(extfiles) + '"]'
+ def conn_config(self):
+ return 'encryption=(name={0}{1}),'.format(
+ self.sys_encrypt, self.sys_encrypt_args)
def rot13(self, s):
return codecs.encode(s, 'rot_13')
diff --git a/test/suite/test_intpack.py b/test/suite/test_intpack.py
index b0cece09494..ae391e68fca 100644
--- a/test/suite/test_intpack.py
+++ b/test/suite/test_intpack.py
@@ -126,8 +126,8 @@ class PackTester:
class test_intpack(wttest.WiredTigerTestCase):
name = 'test_intpack'
- # We have to be a bit verbose here with naming, as there can be problems with
- # case insensitive test names:w
+ # We have to be a bit verbose here with naming, scenario names are
+ # case insensitive and must be unique.
scenarios = make_scenarios([
('int8_t_b', dict(formatcode='b', low=-128, high=127, nbits=8)),
diff --git a/test/suite/test_join01.py b/test/suite/test_join01.py
index 2c4328dc7d3..bdd86a06d4f 100644
--- a/test/suite/test_join01.py
+++ b/test/suite/test_join01.py
@@ -69,7 +69,7 @@ class test_join01(wttest.WiredTigerTestCase):
]
scenarios = make_scenarios(type_scen, bloom0_scen, bloom1_scen,
projection_scen, nested_scen, stats_scen,
- order_scen)
+ order_scen, prune=50, prunelong=1000)
# We need statistics for these tests.
conn_config = 'statistics=(all)'
diff --git a/test/suite/test_join03.py b/test/suite/test_join03.py
index edab7146a6b..dd8111f6ead 100644
--- a/test/suite/test_join03.py
+++ b/test/suite/test_join03.py
@@ -36,33 +36,9 @@ class test_join03(wttest.WiredTigerTestCase):
table_name1 = 'test_join03'
nentries = 100
- # Return the wiredtiger_open extension argument for a shared library.
- def extensionArg(self, exts):
- extfiles = []
- for ext in exts:
- (dirname, name, libname) = ext
- if name != None and name != 'none':
- testdir = os.path.dirname(__file__)
- extdir = os.path.join(run.wt_builddir, 'ext', dirname)
- extfile = os.path.join(
- extdir, name, '.libs', 'libwiredtiger_' + libname + '.so')
- if not os.path.exists(extfile):
- self.skipTest('extension "' + extfile + '" not built')
- if not extfile in extfiles:
- extfiles.append(extfile)
- if len(extfiles) == 0:
- return ''
- else:
- return ',extensions=["' + '","'.join(extfiles) + '"]'
-
- # Override WiredTigerTestCase, we have extensions.
- def setUpConnectionOpen(self, dir):
- extarg = self.extensionArg([('extractors', 'csv', 'csv_extractor')])
- connarg = 'create,error_prefix="{0}: ",{1}'.format(
- self.shortid(), extarg)
- conn = self.wiredtiger_open(dir, connarg)
- self.pr(`conn`)
- return conn
+ def conn_extensions(self, extlist):
+ extlist.skip_if_missing = True
+ extlist.extension('extractors', 'csv')
def gen_key(self, i):
return [ i + 1 ]
diff --git a/test/suite/test_join04.py b/test/suite/test_join04.py
index a71418d9f05..e65b8b53333 100644
--- a/test/suite/test_join04.py
+++ b/test/suite/test_join04.py
@@ -36,33 +36,9 @@ class test_join04(wttest.WiredTigerTestCase):
table_name1 = 'test_join04'
nentries = 100
- # Return the wiredtiger_open extension argument for a shared library.
- def extensionArg(self, exts):
- extfiles = []
- for ext in exts:
- (dirname, name, libname) = ext
- if name != None and name != 'none':
- testdir = os.path.dirname(__file__)
- extdir = os.path.join(run.wt_builddir, 'ext', dirname)
- extfile = os.path.join(
- extdir, name, '.libs', 'libwiredtiger_' + libname + '.so')
- if not os.path.exists(extfile):
- self.skipTest('extension "' + extfile + '" not built')
- if not extfile in extfiles:
- extfiles.append(extfile)
- if len(extfiles) == 0:
- return ''
- else:
- return ',extensions=["' + '","'.join(extfiles) + '"]'
-
- # Override WiredTigerTestCase, we have extensions.
- def setUpConnectionOpen(self, dir):
- extarg = self.extensionArg([('extractors', 'csv', 'csv_extractor')])
- connarg = 'create,error_prefix="{0}: ",{1}'.format(
- self.shortid(), extarg)
- conn = self.wiredtiger_open(dir, connarg)
- self.pr(`conn`)
- return conn
+ def conn_extensions(self, extlist):
+ extlist.skip_if_missing = True
+ extlist.extension('extractors', 'csv')
# JIRA WT-2308:
# Test extractors with equality joins
diff --git a/test/suite/test_join07.py b/test/suite/test_join07.py
index 2a32e678d72..8fae3539246 100644
--- a/test/suite/test_join07.py
+++ b/test/suite/test_join07.py
@@ -200,33 +200,9 @@ class test_join07(wttest.WiredTigerTestCase):
scenarios = make_scenarios(extractscen)
- # Return the wiredtiger_open extension argument for a shared library.
- def extensionArg(self, exts):
- extfiles = []
- for ext in exts:
- (dirname, name, libname) = ext
- if name != None and name != 'none':
- testdir = os.path.dirname(__file__)
- extdir = os.path.join(run.wt_builddir, 'ext', dirname)
- extfile = os.path.join(
- extdir, name, '.libs', 'libwiredtiger_' + libname + '.so')
- if not os.path.exists(extfile):
- self.skipTest('extension "' + extfile + '" not built')
- if not extfile in extfiles:
- extfiles.append(extfile)
- if len(extfiles) == 0:
- return ''
- else:
- return ',extensions=["' + '","'.join(extfiles) + '"]'
-
- # Override WiredTigerTestCase, we have extensions.
- def setUpConnectionOpen(self, dir):
- extarg = self.extensionArg([('extractors', 'csv', 'csv_extractor')])
- connarg = 'create,error_prefix="{0}: ",{1}'.format(
- self.shortid(), extarg)
- conn = self.wiredtiger_open(dir, connarg)
- self.pr(`conn`)
- return conn
+ def conn_extensions(self, extlist):
+ extlist.skip_if_missing = True
+ extlist.extension('extractors', 'csv')
def expect(self, token, expected):
if token == None or token.kind not in expected:
diff --git a/test/suite/test_jsondump02.py b/test/suite/test_jsondump02.py
index 8482851fb94..60863c4aa97 100644
--- a/test/suite/test_jsondump02.py
+++ b/test/suite/test_jsondump02.py
@@ -234,6 +234,24 @@ class test_jsondump02(wttest.WiredTigerTestCase, suite_subprocess):
('"ikey" : 4,\n"Skey" : "key4"',
'"S1" : "val16",\n"i2" : 16,\n"S3" : "val64",\n"i4" : 64'))
self.check_json(self.table_uri4, table4_json)
+ # This projection has 3 value fields reversed with a key at the end.
+ table4_json_projection = (
+ ('"ikey" : 1,\n"Skey" : "key1"',
+ '"i4" : 1,\n"S3" : "val1",\n"i2" : 1,\n"ikey" : 1'),
+ ('"ikey" : 2,\n"Skey" : "key2"',
+ '"i4" : 8,\n"S3" : "val8",\n"i2" : 4,\n"ikey" : 2'),
+ ('"ikey" : 3,\n"Skey" : "key3"',
+ '"i4" : 27,\n"S3" : "val27",\n"i2" : 9,\n"ikey" : 3'),
+ ('"ikey" : 4,\n"Skey" : "key4"',
+ '"i4" : 64,\n"S3" : "val64",\n"i2" : 16,\n"ikey" : 4'))
+ # bad projection URI
+ self.assertRaisesWithMessage(wiredtiger.WiredTigerError,
+ lambda: self.check_json(self.table_uri4 + '(i4,S3,i2,ikey',
+ table4_json_projection),
+ '/Unbalanced brackets/')
+ # This projection should work.
+ self.check_json(self.table_uri4 + '(i4,S3,i2,ikey)',
+ table4_json_projection)
# The dump config currently is not supported for the index type.
self.check_json(uri4index1, (
('"Skey" : "key1"',
diff --git a/test/suite/test_lsm01.py b/test/suite/test_lsm01.py
index b44df4bae14..f705b09b0a4 100644
--- a/test/suite/test_lsm01.py
+++ b/test/suite/test_lsm01.py
@@ -57,7 +57,7 @@ class test_lsm01(wttest.WiredTigerTestCase):
scenarios = wtscenario.make_scenarios(
chunk_size_scenarios, merge_max_scenarios, bloom_scenarios,
bloom_bit_scenarios, bloom_hash_scenarios, record_count_scenarios,
- prune=500)
+ prune=100, prunelong=500)
# Test drop of an object.
def test_lsm(self):
diff --git a/test/suite/test_overwrite.py b/test/suite/test_overwrite.py
index 4739abaa578..c894de99bd0 100644
--- a/test/suite/test_overwrite.py
+++ b/test/suite/test_overwrite.py
@@ -27,32 +27,47 @@
# OTHER DEALINGS IN THE SOFTWARE.
import wiredtiger, wttest
-from wtdataset import SimpleDataSet
+from wtdataset import SimpleDataSet, SimpleIndexDataSet
+from wtdataset import SimpleLSMDataSet, ComplexDataSet, ComplexLSMDataSet
from wtscenario import make_scenarios
# test_overwrite.py
# cursor overwrite configuration method
class test_overwrite(wttest.WiredTigerTestCase):
name = 'overwrite'
- scenarios = make_scenarios([
- ('file-r', dict(type='file:', keyfmt='r', dataset=SimpleDataSet)),
- ('file-S', dict(type='file:', keyfmt='S', dataset=SimpleDataSet)),
- ('lsm-S', dict(type='lsm:', keyfmt='S', dataset=SimpleDataSet)),
- ('table-r', dict(type='table:', keyfmt='r', dataset=SimpleDataSet)),
- ('table-S', dict(type='table:', keyfmt='S', dataset=SimpleDataSet)),
- ])
+ keyfmt = [
+ ('integer', dict(keyfmt='i')),
+ ('recno', dict(keyfmt='r')),
+ ('string', dict(keyfmt='S')),
+ ]
+ types = [
+ ('file', dict(uri='file:', ds=SimpleDataSet)),
+ ('lsm', dict(uri='lsm:', ds=SimpleDataSet)),
+ ('table-complex', dict(uri='table:', ds=ComplexDataSet)),
+ ('table-complex-lsm', dict(uri='table:', ds=ComplexLSMDataSet)),
+ ('table-index', dict(uri='table:', ds=SimpleIndexDataSet)),
+ ('table-simple', dict(uri='table:', ds=SimpleDataSet)),
+ ('table-simple-lsm', dict(uri='table:', ds=SimpleLSMDataSet)),
+ ]
+ scenarios = make_scenarios(types, keyfmt)
+ def skip(self):
+ return self.keyfmt == 'r' and \
+ (self.ds.is_lsm() or self.uri == 'lsm')
# Confirm a cursor configured with/without overwrite correctly handles
# non-existent records during insert, remove and update operations.
def test_overwrite_insert(self):
- uri = self.type + self.name
- ds = self.dataset(self, uri, 100, key_format=self.keyfmt)
+ if self.skip():
+ return
+
+ uri = self.uri + self.name
+ ds = self.ds(self, uri, 100, key_format=self.keyfmt)
ds.populate()
# Insert of an existing record with overwrite off fails.
cursor = self.session.open_cursor(uri, None, "overwrite=false")
cursor.set_key(ds.key(5))
- cursor.set_value('XXXXXXXXXX')
+ cursor.set_value(ds.value(1000))
self.assertRaises(wiredtiger.WiredTigerError, lambda: cursor.insert())
# One additional test for the insert method: duplicate the cursor with
@@ -63,30 +78,33 @@ class test_overwrite(wttest.WiredTigerTestCase):
cursor = self.session.open_cursor(uri, None, "overwrite=false")
cursor.set_key(ds.key(5))
dupc = self.session.open_cursor(None, cursor, "overwrite=true")
- dupc.set_value('XXXXXXXXXX')
+ dupc.set_value(ds.value(1001))
self.assertEquals(dupc.insert(), 0)
# Insert of an existing record with overwrite on succeeds.
cursor = self.session.open_cursor(uri, None)
cursor.set_key(ds.key(6))
- cursor.set_value('XXXXXXXXXX')
+ cursor.set_value(ds.value(1002))
self.assertEquals(cursor.insert(), 0)
# Insert of a non-existent record with overwrite off succeeds.
cursor = self.session.open_cursor(uri, None, "overwrite=false")
cursor.set_key(ds.key(200))
- cursor.set_value('XXXXXXXXXX')
+ cursor.set_value(ds.value(1003))
self.assertEquals(cursor.insert(), 0)
# Insert of a non-existent record with overwrite on succeeds.
cursor = self.session.open_cursor(uri, None)
cursor.set_key(ds.key(201))
- cursor.set_value('XXXXXXXXXX')
+ cursor.set_value(ds.value(1004))
self.assertEquals(cursor.insert(), 0)
def test_overwrite_remove(self):
- uri = self.type + self.name
- ds = self.dataset(self, uri, 100, key_format=self.keyfmt)
+ if self.skip():
+ return
+
+ uri = self.uri + self.name
+ ds = self.ds(self, uri, 100, key_format=self.keyfmt)
ds.populate()
# Remove of an existing record with overwrite off succeeds.
@@ -110,32 +128,35 @@ class test_overwrite(wttest.WiredTigerTestCase):
self.assertEquals(cursor.remove(), 0)
def test_overwrite_update(self):
- uri = self.type + self.name
- ds = self.dataset(self, uri, 100, key_format=self.keyfmt)
+ if self.skip():
+ return
+
+ uri = self.uri + self.name
+ ds = self.ds(self, uri, 100, key_format=self.keyfmt)
ds.populate()
# Update of an existing record with overwrite off succeeds.
cursor = self.session.open_cursor(uri, None, "overwrite=false")
cursor.set_key(ds.key(5))
- cursor.set_value('XXXXXXXXXX')
+ cursor.set_value(ds.value(1005))
self.assertEquals(cursor.update(), 0)
# Update of an existing record with overwrite on succeeds.
cursor = self.session.open_cursor(uri, None)
cursor.set_key(ds.key(6))
- cursor.set_value('XXXXXXXXXX')
+ cursor.set_value(ds.value(1006))
self.assertEquals(cursor.update(), 0)
# Update of a non-existent record with overwrite off fails.
cursor = self.session.open_cursor(uri, None, "overwrite=false")
cursor.set_key(ds.key(200))
- cursor.set_value('XXXXXXXXXX')
+ cursor.set_value(ds.value(1007))
self.assertEquals(cursor.update(), wiredtiger.WT_NOTFOUND)
# Update of a non-existent record with overwrite on succeeds.
cursor = self.session.open_cursor(uri, None)
cursor.set_key(ds.key(201))
- cursor.set_value('XXXXXXXXXX')
+ cursor.set_value(ds.value(1008))
self.assertEquals(cursor.update(), 0)
if __name__ == '__main__':
diff --git a/test/suite/test_perf001.py b/test/suite/test_perf001.py
index b22ed2baeb0..6331a3f64d6 100644
--- a/test/suite/test_perf001.py
+++ b/test/suite/test_perf001.py
@@ -40,7 +40,8 @@ class test_perf001(wttest.WiredTigerTestCase):
scenarios = make_scenarios([
#('file-file', dict(tabletype='file',indextype='file')),
- ('file-lsm', dict(tabletype='file',indextype='lsm')),
+ ('file-lsm', dict(tabletype='file',indextype='lsm', cfg='',
+ conn_config="statistics=(fast),statistics_log=(wait=1)")),
#('lsm-file', dict(tabletype='lsm',indextype='file')),
#('lsm-lsm', dict(tabletype='lsm',indextype='lsm')),
])
diff --git a/test/suite/test_readonly01.py b/test/suite/test_readonly01.py
index e4b431ca1da..f41280a3283 100644
--- a/test/suite/test_readonly01.py
+++ b/test/suite/test_readonly01.py
@@ -75,8 +75,7 @@ class test_readonly01(wttest.WiredTigerTestCase, suite_subprocess):
scenarios = make_scenarios(basecfg_list, dir_list, log_list, types)
- def conn_config(self, dir):
- self.home = dir
+ def conn_config(self):
params = \
'error_prefix="%s",' % self.shortid() + \
'%s' % self.logcfg + \
diff --git a/test/suite/test_reconfig01.py b/test/suite/test_reconfig01.py
index e76becac76a..cbc8bca5740 100644
--- a/test/suite/test_reconfig01.py
+++ b/test/suite/test_reconfig01.py
@@ -64,6 +64,18 @@ class test_reconfig01(wttest.WiredTigerTestCase):
# same ops_max of 512 and thread of 8.
self.conn.reconfigure("async=(enabled=true)")
+ def test_reconfig_eviction(self):
+ # Increase the max number of running threads (default 8).
+ self.conn.reconfigure("eviction=(threads_max=10)")
+ # Increase the min number of running threads (default 1).
+ self.conn.reconfigure("eviction=(threads_min=5)")
+ # Decrease the max number of running threads.
+ self.conn.reconfigure("eviction=(threads_max=7)")
+ # Decrease the min number of running threads.
+ self.conn.reconfigure("eviction=(threads_min=2)")
+ # Set min and max the same.
+ self.conn.reconfigure("eviction=(threads_min=6,threads_max=6)")
+
def test_reconfig_lsm_manager(self):
# We create and populate a tiny LSM so that we can start off with
# the LSM threads running and change the numbers of threads.
diff --git a/test/suite/test_reconfig02.py b/test/suite/test_reconfig02.py
index 36a78a1805f..042d3bbe71f 100644
--- a/test/suite/test_reconfig02.py
+++ b/test/suite/test_reconfig02.py
@@ -62,7 +62,7 @@ class test_reconfig02(wttest.WiredTigerTestCase):
self.assertRaisesWithMessage(wiredtiger.WiredTigerError,
lambda: self.conn.reconfigure("log=(path=foo)"), msg)
self.assertRaisesWithMessage(wiredtiger.WiredTigerError,
- lambda: self.conn.reconfigure("log=(recovery=true)"), msg)
+ lambda: self.conn.reconfigure("log=(recover=true)"), msg)
# Logging starts on, but prealloc is off. Verify it is off.
# Reconfigure it on and run again, making sure that log files
@@ -109,6 +109,7 @@ class test_reconfig02(wttest.WiredTigerTestCase):
# Now turn on archive, sleep a bit to allow the archive thread
# to run and then confirm that all original logs are gone.
self.conn.reconfigure("log=(archive=true)")
+ self.session.checkpoint("force")
time.sleep(2)
cur_logs = fnmatch.filter(os.listdir('.'), "*Log*")
for o in orig_logs:
diff --git a/test/suite/test_reconfig04.py b/test/suite/test_reconfig04.py
index be5e6d3729e..51d9b91c1f4 100644
--- a/test/suite/test_reconfig04.py
+++ b/test/suite/test_reconfig04.py
@@ -26,9 +26,7 @@
# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
# OTHER DEALINGS IN THE SOFTWARE.
-import fnmatch, os, time
import wiredtiger, wttest
-from wtdataset import SimpleDataSet
# test_reconfig04.py
# Test WT_SESSION::reconfigure
diff --git a/test/suite/test_schema05.py b/test/suite/test_schema05.py
index 28ad51b3c92..d536a629373 100644
--- a/test/suite/test_schema05.py
+++ b/test/suite/test_schema05.py
@@ -57,33 +57,9 @@ class test_schema05(wttest.WiredTigerTestCase):
('index-after', { 'create_index' : 2 }),
])
- # Return the wiredtiger_open extension argument for a shared library.
- def extensionArg(self, exts):
- extfiles = []
- for ext in exts:
- (dirname, name, libname) = ext
- if name != None and name != 'none':
- testdir = os.path.dirname(__file__)
- extdir = os.path.join(run.wt_builddir, 'ext', dirname)
- extfile = os.path.join(
- extdir, name, '.libs', 'libwiredtiger_' + libname + '.so')
- if not os.path.exists(extfile):
- self.skipTest('extension "' + extfile + '" not built')
- if not extfile in extfiles:
- extfiles.append(extfile)
- if len(extfiles) == 0:
- return ''
- else:
- return ',extensions=["' + '","'.join(extfiles) + '"]'
-
- # Override WiredTigerTestCase, we have extensions.
- def setUpConnectionOpen(self, dir):
- extarg = self.extensionArg([('extractors', 'csv', 'csv_extractor')])
- connarg = 'create,error_prefix="{0}: ",{1}'.format(
- self.shortid(), extarg)
- conn = self.wiredtiger_open(dir, connarg)
- self.pr(`conn`)
- return conn
+ def conn_extensions(self, extlist):
+ extlist.skip_if_missing = True
+ extlist.extension('extractors', 'csv')
def create_indices(self):
# Create self.nindices index files, each with a column from the CSV
diff --git a/test/suite/test_schema07.py b/test/suite/test_schema07.py
index ac397c6e1a1..3e4b1d28a4d 100644
--- a/test/suite/test_schema07.py
+++ b/test/suite/test_schema07.py
@@ -33,8 +33,7 @@ import wiredtiger, wttest
class test_schema07(wttest.WiredTigerTestCase):
tablename = 'table:test_schema07'
- def conn_config(self, dir):
- return 'cache_size=10MB'
+ conn_config = 'cache_size=10MB'
@wttest.longtest("Creating many tables shouldn't fill the cache")
def test_many_tables(self):
diff --git a/test/suite/test_shared_cache01.py b/test/suite/test_shared_cache01.py
index 70560a625ee..c3bd946cc4b 100644
--- a/test/suite/test_shared_cache01.py
+++ b/test/suite/test_shared_cache01.py
@@ -73,7 +73,7 @@ class test_shared_cache01(wttest.WiredTigerTestCase):
os.mkdir(name)
next_conn = self.wiredtiger_open(
name,
- 'create,error_prefix="' + self.shortid() + ': "' +
+ 'create,error_prefix="%s",' % self.shortid() +
pool_opts + extra_opts)
self.conns.append(next_conn)
self.sessions.append(next_conn.open_session(None))
diff --git a/test/suite/test_shared_cache02.py b/test/suite/test_shared_cache02.py
index 7cde6c86695..67f9bf7c6b7 100644
--- a/test/suite/test_shared_cache02.py
+++ b/test/suite/test_shared_cache02.py
@@ -73,7 +73,7 @@ class test_shared_cache02(wttest.WiredTigerTestCase):
os.mkdir(name)
next_conn = self.wiredtiger_open(
name,
- 'create,error_prefix="' + self.shortid() + ': "' +
+ 'create,error_prefix="%s",' % self.shortid() +
pool_opts + extra_opts)
self.conns.append(next_conn)
self.sessions.append(next_conn.open_session(None))
diff --git a/test/suite/test_stat02.py b/test/suite/test_stat02.py
index cecda7f1ddc..45af283ed02 100644
--- a/test/suite/test_stat02.py
+++ b/test/suite/test_stat02.py
@@ -59,7 +59,7 @@ class test_stat_cursor_config(wttest.WiredTigerTestCase):
scenarios = make_scenarios(uri, data_config, cursor_config)
# Turn on statistics for this test.
- def conn_config(self, dir):
+ def conn_config(self):
return 'statistics=(%s)' % self.data_config
# For each database/cursor configuration, confirm the right combinations
diff --git a/test/suite/test_sweep01.py b/test/suite/test_sweep01.py
index 71f8fcb180e..5559190caca 100644
--- a/test/suite/test_sweep01.py
+++ b/test/suite/test_sweep01.py
@@ -116,10 +116,15 @@ class test_sweep01(wttest.WiredTigerTestCase, suite_subprocess):
# Give slow machines time to process files.
stat_cursor = self.session.open_cursor('statistics:', None, None)
this_nfile = stat_cursor[stat.conn.file_open][2]
+ removed = stat_cursor[stat.conn.dh_sweep_remove][2]
stat_cursor.close()
self.pr("==== loop " + str(sleep))
self.pr("this_nfile " + str(this_nfile))
- if this_nfile == final_nfile:
+ self.pr("removed " + str(removed))
+ # On slow machines there can be a lag where files get closed but
+ # the sweep server cannot yet remove the handles. So wait for the
+ # removed statistic to indicate forward progress too.
+ if this_nfile == final_nfile and removed != remove1:
break
c.close()
self.pr("Sweep loop took " + str(sleep))
diff --git a/test/suite/test_truncate01.py b/test/suite/test_truncate01.py
index 2319eeddbef..98b741ba6a4 100644
--- a/test/suite/test_truncate01.py
+++ b/test/suite/test_truncate01.py
@@ -128,6 +128,7 @@ class test_truncate_cursor_order(wttest.WiredTigerTestCase):
msg = '/the start cursor position is after the stop cursor position/'
self.assertRaisesWithMessage(wiredtiger.WiredTigerError,
lambda: self.session.truncate(None, c1, c2, None), msg)
+ c1.set_key(ds.key(10))
c2.set_key(ds.key(20))
self.session.truncate(None, c1, c2, None)
@@ -183,11 +184,11 @@ class test_truncate_cursor(wttest.WiredTigerTestCase):
# those tests to file objects.
types = [
('file', dict(type='file:', valuefmt='S',
- config='allocation_size=512,leaf_page_max=512')),
+ config='allocation_size=512,leaf_page_max=512', P=0.25)),
('file8t', dict(type='file:', valuefmt='8t',
- config='allocation_size=512,leaf_page_max=512')),
+ config='allocation_size=512,leaf_page_max=512', P=0.25)),
('table', dict(type='table:', valuefmt='S',
- config='allocation_size=512,leaf_page_max=512')),
+ config='allocation_size=512,leaf_page_max=512', P=0.5)),
]
keyfmt = [
('integer', dict(keyfmt='i')),
@@ -203,7 +204,8 @@ class test_truncate_cursor(wttest.WiredTigerTestCase):
('big', dict(nentries=1000,skip=37)),
]
- scenarios = make_scenarios(types, keyfmt, size, reopen)
+ scenarios = make_scenarios(types, keyfmt, size, reopen,
+ prune=10, prunelong=1000)
# Set a cursor key.
def cursorKey(self, ds, uri, key):
diff --git a/test/suite/test_truncate02.py b/test/suite/test_truncate02.py
index 73fed362354..729825b26d4 100644
--- a/test/suite/test_truncate02.py
+++ b/test/suite/test_truncate02.py
@@ -85,7 +85,8 @@ class test_truncate_fast_delete(wttest.WiredTigerTestCase):
('txn2', dict(commit=False)),
]
- scenarios = make_scenarios(types, keyfmt, overflow, reads, writes, txn)
+ scenarios = make_scenarios(types, keyfmt, overflow, reads, writes, txn,
+ prune=20, prunelong=1000)
# Return the number of records visible to the cursor; test both forward
# and backward iteration, they are different code paths in this case.
diff --git a/test/suite/test_txn02.py b/test/suite/test_txn02.py
index a0c2c12a47c..01626057b9e 100644
--- a/test/suite/test_txn02.py
+++ b/test/suite/test_txn02.py
@@ -93,11 +93,10 @@ class test_txn02(wttest.WiredTigerTestCase, suite_subprocess):
checklog_calls = 100 if wttest.islongtest() else 2
checklog_mod = (len(scenarios) / checklog_calls + 1)
- def setUpConnectionOpen(self, dir):
- self.home = dir
+ def conn_config(self):
# Cycle through the different transaction_sync values in a
# deterministic manner.
- self.txn_sync = self.sync_list[
+ txn_sync = self.sync_list[
self.scenario_number % len(self.sync_list)]
#
# We don't want to run zero fill with only the same settings, such
@@ -107,17 +106,9 @@ class test_txn02(wttest.WiredTigerTestCase, suite_subprocess):
zerofill = 'false'
if self.scenario_number % freq == 0:
zerofill = 'true'
- self.backup_dir = os.path.join(self.home, "WT_BACKUP")
- conn_params = \
- 'log=(archive=false,enabled,file_max=%s),' % self.logmax + \
- 'log=(zero_fill=%s),' % zerofill + \
- 'create,error_prefix="%s: ",' % self.shortid() + \
- 'transaction_sync="%s",' % self.txn_sync
- # print "Creating conn at '%s' with config '%s'" % (dir, conn_params)
- conn = self.wiredtiger_open(dir, conn_params)
- self.pr(`conn`)
- self.session2 = conn.open_session()
- return conn
+ return 'log=(archive=false,enabled,file_max=%s),' % self.logmax + \
+ 'log=(zero_fill=%s),' % zerofill + \
+ 'transaction_sync="%s",' % txn_sync
# Check that a cursor (optionally started in a new transaction), sees the
# expected values.
@@ -176,8 +167,10 @@ class test_txn02(wttest.WiredTigerTestCase, suite_subprocess):
backup_conn = self.wiredtiger_open(self.backup_dir,
backup_conn_params)
try:
- self.check(backup_conn.open_session(), None, committed)
+ session = backup_conn.open_session()
finally:
+ session.checkpoint("force")
+ self.check(backup_conn.open_session(), None, committed)
# Sleep long enough so that the archive thread is guaranteed
# to run before we close the connection.
time.sleep(1.0)
@@ -204,6 +197,8 @@ class test_txn02(wttest.WiredTigerTestCase, suite_subprocess):
self.assertEqual(cur_logs, pr_logs)
def test_ops(self):
+ self.backup_dir = os.path.join(self.home, "WT_BACKUP")
+ self.session2 = self.conn.open_session()
# print "Creating %s with config '%s'" % (self.uri, self.create_params)
self.session.create(self.uri, self.create_params)
# Set up the table with entries for 1, 2, 10 and 11.
@@ -226,6 +221,7 @@ class test_txn02(wttest.WiredTigerTestCase, suite_subprocess):
# Close and reopen the connection and cursor.
if reopen == 'reopen':
self.reopen_conn()
+ self.session2 = self.conn.open_session()
c = self.session.open_cursor(self.uri, None, 'overwrite')
self.session.begin_transaction(
diff --git a/test/suite/test_txn04.py b/test/suite/test_txn04.py
index ade39272f84..d8f6774ded1 100644
--- a/test/suite/test_txn04.py
+++ b/test/suite/test_txn04.py
@@ -63,24 +63,15 @@ class test_txn04(wttest.WiredTigerTestCase, suite_subprocess):
txn1s = [('t1c', dict(txn1='commit')), ('t1r', dict(txn1='rollback'))]
scenarios = make_scenarios(types, op1s, txn1s)
- # Overrides WiredTigerTestCase
- def setUpConnectionOpen(self, dir):
- self.home = dir
+
+ def conn_config(self):
# Cycle through the different transaction_sync values in a
# deterministic manner.
- self.txn_sync = self.sync_list[
+ txn_sync = self.sync_list[
self.scenario_number % len(self.sync_list)]
- self.backup_dir = os.path.join(self.home, "WT_BACKUP")
# Set archive false on the home directory.
- conn_params = \
- 'log=(archive=false,enabled,file_max=%s),' % self.logmax + \
- 'create,error_prefix="%s: ",' % self.shortid() + \
- 'transaction_sync="%s",' % self.txn_sync
- # print "Creating conn at '%s' with config '%s'" % (dir, conn_params)
- conn = self.wiredtiger_open(dir, conn_params)
- self.pr(`conn`)
- self.session2 = conn.open_session()
- return conn
+ return 'log=(archive=false,enabled,file_max=%s),' % self.logmax + \
+ 'transaction_sync="%s",' % txn_sync
# Check that a cursor (optionally started in a new transaction), sees the
# expected values.
@@ -146,6 +137,7 @@ class test_txn04(wttest.WiredTigerTestCase, suite_subprocess):
# The runWt command closes our connection and sessions so
# we need to reopen them here.
self.hot_backup(None, committed)
+ self.session2 = self.conn.open_session()
c = self.session.open_cursor(self.uri, None, 'overwrite')
c.set_value(1)
# Then do the given modification.
@@ -193,6 +185,8 @@ class test_txn04(wttest.WiredTigerTestCase, suite_subprocess):
self.hot_backup(self.uri, committed)
def test_ops(self):
+ self.backup_dir = os.path.join(self.home, "WT_BACKUP")
+ self.session2 = self.conn.open_session()
with self.expectedStdoutPattern('recreating metadata'):
self.ops()
diff --git a/test/suite/test_txn05.py b/test/suite/test_txn05.py
index 9e84fe7d3fe..7aaff221ba4 100644
--- a/test/suite/test_txn05.py
+++ b/test/suite/test_txn05.py
@@ -64,23 +64,15 @@ class test_txn05(wttest.WiredTigerTestCase, suite_subprocess):
txn1s = [('t1c', dict(txn1='commit')), ('t1r', dict(txn1='rollback'))]
scenarios = make_scenarios(types, op1s, txn1s)
- # Overrides WiredTigerTestCase
- def setUpConnectionOpen(self, dir):
- self.home = dir
+
+ def conn_config(self):
# Cycle through the different transaction_sync values in a
# deterministic manner.
- self.txn_sync = self.sync_list[
+ txn_sync = self.sync_list[
self.scenario_number % len(self.sync_list)]
- self.backup_dir = os.path.join(self.home, "WT_BACKUP")
- conn_params = \
- 'log=(archive=false,enabled,file_max=%s),' % self.logmax + \
- 'create,error_prefix="%s: ",' % self.shortid() + \
- 'transaction_sync="%s",' % self.txn_sync
- # print "Creating conn at '%s' with config '%s'" % (dir, conn_params)
- conn = self.wiredtiger_open(dir, conn_params)
- self.pr(`conn`)
- self.session2 = conn.open_session()
- return conn
+ # Set archive false on the home directory.
+ return 'log=(archive=false,enabled,file_max=%s),' % self.logmax + \
+ 'transaction_sync="%s",' % txn_sync
# Check that a cursor (optionally started in a new transaction), sees the
# expected values.
@@ -139,8 +131,12 @@ class test_txn05(wttest.WiredTigerTestCase, suite_subprocess):
backup_conn = self.wiredtiger_open(self.backup_dir,
backup_conn_params)
try:
- self.check(backup_conn.open_session(), None, committed)
+ session = backup_conn.open_session()
finally:
+ self.check(session, None, committed)
+ # Force a checkpoint because we don't record the recovery
+ # checkpoint as available for archiving.
+ session.checkpoint("force")
# Sleep long enough so that the archive thread is guaranteed
# to run before we close the connection.
time.sleep(1.0)
@@ -163,6 +159,8 @@ class test_txn05(wttest.WiredTigerTestCase, suite_subprocess):
self.runWt(['-h', self.backup_dir, 'printlog'], outfilename='printlog.out')
def test_ops(self):
+ self.backup_dir = os.path.join(self.home, "WT_BACKUP")
+ self.session2 = self.conn.open_session()
# print "Creating %s with config '%s'" % (self.uri, self.create_params)
self.session.create(self.uri, self.create_params)
# Set up the table with entries for 1-5.
diff --git a/test/suite/test_txn06.py b/test/suite/test_txn06.py
index 2bff97f6aac..c91dc6a623b 100644
--- a/test/suite/test_txn06.py
+++ b/test/suite/test_txn06.py
@@ -40,10 +40,10 @@ class test_txn06(wttest.WiredTigerTestCase, suite_subprocess):
source_uri = 'table:' + tablename + "_src"
nrows = 100000
- def setUpConnectionOpen(self, *args):
+ def conn_config(self):
if not wiredtiger.verbose_build():
self.skipTest('requires a verbose build')
- return super(test_txn06, self).setUpConnectionOpen(*args)
+ return ''
def test_long_running(self):
# Populate a table
diff --git a/test/suite/test_txn07.py b/test/suite/test_txn07.py
index f9577bad7f2..e26cf5aaaea 100644
--- a/test/suite/test_txn07.py
+++ b/test/suite/test_txn07.py
@@ -70,43 +70,20 @@ class test_txn07(wttest.WiredTigerTestCase, suite_subprocess):
('none', dict(compress='')),
]
- scenarios = make_scenarios(types, op1s, txn1s, compress)
- # Overrides WiredTigerTestCase
- def setUpConnectionOpen(self, dir):
- self.home = dir
- # Cycle through the different transaction_sync values in a
- # deterministic manner.
- self.txn_sync = self.sync_list[
- self.scenario_number % len(self.sync_list)]
- self.backup_dir = os.path.join(self.home, "WT_BACKUP")
- conn_params = \
- 'log=(archive=false,enabled,file_max=%s,' % self.logmax + \
- 'compressor=%s)' % self.compress + \
- self.extensionArg(self.compress) + \
- ',create,error_prefix="%s: ",' % self.shortid() + \
- "statistics=(fast)," + \
- 'transaction_sync="%s",' % self.txn_sync
- # print "Creating conn at '%s' with config '%s'" % (dir, conn_params)
- try:
- conn = self.wiredtiger_open(dir, conn_params)
- except wiredtiger.WiredTigerError as e:
- print "Failed conn at '%s' with config '%s'" % (dir, conn_params)
- self.pr(`conn`)
- self.session2 = conn.open_session()
- return conn
-
- # Return the wiredtiger_open extension argument for a shared library.
- def extensionArg(self, name):
- if name == None or name == '':
- return ''
-
- testdir = os.path.dirname(__file__)
- extdir = os.path.join(run.wt_builddir, 'ext/compressors')
- extfile = os.path.join(
- extdir, name, '.libs', 'libwiredtiger_' + name + '.so')
- if not os.path.exists(extfile):
- self.skipTest('compression extension "' + extfile + '" not built')
- return ',extensions=["' + extfile + '"]'
+ scenarios = make_scenarios(types, op1s, txn1s, compress,
+ prune=30, prunelong=1000)
+
+ def conn_config(self):
+ return 'log=(archive=false,enabled,file_max=%s,' % self.logmax + \
+ 'compressor=%s)' % self.compress + \
+ ',create,error_prefix="%s",' % self.shortid() + \
+ "statistics=(fast)," + \
+ 'transaction_sync="%s",' % \
+ self.sync_list[self.scenario_number % len(self.sync_list)]
+
+ def conn_extensions(self, extlist):
+ extlist.skip_if_missing = True
+ extlist.extension('compressors', self.compress)
# Check that a cursor (optionally started in a new transaction), sees the
# expected values.
@@ -139,7 +116,7 @@ class test_txn07(wttest.WiredTigerTestCase, suite_subprocess):
self.backup(self.backup_dir)
backup_conn_params = 'log=(enabled,file_max=%s,' % self.logmax + \
'compressor=%s)' % self.compress + \
- self.extensionArg(self.compress)
+ self.extensionsConfig()
backup_conn = self.wiredtiger_open(self.backup_dir, backup_conn_params)
try:
self.check(backup_conn.open_session(), None, committed)
@@ -147,6 +124,9 @@ class test_txn07(wttest.WiredTigerTestCase, suite_subprocess):
backup_conn.close()
def test_ops(self):
+ self.backup_dir = os.path.join(self.home, "WT_BACKUP")
+ self.session2 = self.conn.open_session()
+
# print "Creating %s with config '%s'" % (self.uri, self.create_params)
self.session.create(self.uri, self.create_params)
# Set up the table with entries for 1-5.
diff --git a/test/suite/test_txn08.py b/test/suite/test_txn08.py
index f0cdf08df07..04faed9d45a 100644
--- a/test/suite/test_txn08.py
+++ b/test/suite/test_txn08.py
@@ -41,7 +41,7 @@ class test_txn08(wttest.WiredTigerTestCase, suite_subprocess):
uri = 'table:' + tablename
# Turn on logging for this test.
- def conn_config(self, dir):
+ def conn_config(self):
return 'log=(archive=false,enabled,file_max=%s),' % self.logmax + \
'transaction_sync="(method=dsync,enabled)"'
diff --git a/test/suite/test_txn09.py b/test/suite/test_txn09.py
index cfad8270ab1..768d714e248 100644
--- a/test/suite/test_txn09.py
+++ b/test/suite/test_txn09.py
@@ -80,19 +80,9 @@ class test_txn09(wttest.WiredTigerTestCase, suite_subprocess):
op1s, txn1s, op2s, txn2s, op3s, txn3s, op4s, txn4s,
prune=20, prunelong=5000)
- # Overrides WiredTigerTestCase
- def setUpConnectionOpen(self, dir):
- self.home = dir
- conn_params = \
- 'create,error_prefix="%s: ",' % self.shortid() + \
- 'log=(archive=false,enabled=%s),' % int(self.log_enabled) + \
- 'transaction_sync=(enabled=false),'
-
- # print "Opening conn at '%s' with config '%s'" % (dir, conn_params)
- conn = self.wiredtiger_open(dir, conn_params)
- self.pr(`conn`)
- self.session2 = conn.open_session()
- return conn
+ def conn_config(self):
+ return 'log=(archive=false,enabled=%s),' % int(self.log_enabled) + \
+ 'transaction_sync=(enabled=false)'
# Check that a cursor (optionally started in a new transaction), sees the
# expected values.
@@ -141,6 +131,7 @@ class test_txn09(wttest.WiredTigerTestCase, suite_subprocess):
# Close and reopen the connection and cursor, toggling the log
self.log_enabled = not self.log_enabled
self.reopen_conn()
+ self.session2 = self.conn.open_session()
c = self.session.open_cursor(self.uri, None, 'overwrite')
self.session.begin_transaction(
diff --git a/test/suite/test_txn11.py b/test/suite/test_txn11.py
index 147bf3a76c0..3c02b1e86e3 100644
--- a/test/suite/test_txn11.py
+++ b/test/suite/test_txn11.py
@@ -44,7 +44,7 @@ class test_txn11(wttest.WiredTigerTestCase, suite_subprocess):
uri = 'table:' + tablename
# Turn on logging for this test.
- def conn_config(self, dir):
+ def conn_config(self):
return 'log=(archive=%s,' % self.archive + \
'enabled,file_max=%s,prealloc=false),' % self.logmax + \
'transaction_sync=(enabled=false),'
diff --git a/test/suite/test_txn13.py b/test/suite/test_txn13.py
index ae0250c06e8..2bf49486b3a 100644
--- a/test/suite/test_txn13.py
+++ b/test/suite/test_txn13.py
@@ -50,7 +50,7 @@ class test_txn13(wttest.WiredTigerTestCase, suite_subprocess):
])
# Turn on logging for this test.
- def conn_config(self, dir):
+ def conn_config(self):
return 'log=(archive=false,enabled,file_max=%s)' % self.logmax + \
',cache_size=8G'
diff --git a/test/suite/test_txn15.py b/test/suite/test_txn15.py
index c061c093b02..a2bfb626338 100644
--- a/test/suite/test_txn15.py
+++ b/test/suite/test_txn15.py
@@ -41,7 +41,7 @@ class test_txn15(wttest.WiredTigerTestCase, suite_subprocess):
create_params = 'key_format=i,value_format=i'
entries = 100
# Turn on logging for this test.
- def conn_config(self, dir):
+ def conn_config(self):
return 'statistics=(fast),' + \
'log=(archive=false,enabled,file_max=100K),' + \
'use_environment=false,' + \
diff --git a/test/suite/test_util14.py b/test/suite/test_util14.py
new file mode 100644
index 00000000000..e2a9f41f0d4
--- /dev/null
+++ b/test/suite/test_util14.py
@@ -0,0 +1,92 @@
+#!/usr/bin/env python
+#
+# Public Domain 2014-2017 MongoDB, Inc.
+# Public Domain 2008-2014 WiredTiger, Inc.
+#
+# This is free and unencumbered software released into the public domain.
+#
+# Anyone is free to copy, modify, publish, use, compile, sell, or
+# distribute this software, either in source code form or as a compiled
+# binary, for any purpose, commercial or non-commercial, and by any
+# means.
+#
+# In jurisdictions that recognize copyright laws, the author or authors
+# of this software dedicate any and all copyright interest in the
+# software to the public domain. We make this dedication for the benefit
+# of the public at large and to the detriment of our heirs and
+# successors. We intend this dedication to be an overt act of
+# relinquishment in perpetuity of all present and future rights to this
+# software under copyright law.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+# IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+
+import os
+from suite_subprocess import suite_subprocess
+import wiredtiger, wttest
+
+# test_util14.py
+# Utilities: wt truncate
+class test_util14(wttest.WiredTigerTestCase, suite_subprocess):
+ tablename = 'test_util14.a'
+ nentries = 1000
+
+ def test_truncate_process(self):
+ """
+ Test truncate in a 'wt' process
+ """
+ params = 'key_format=S,value_format=S'
+ self.session.create('table:' + self.tablename, params)
+ self.assertTrue(os.path.exists(self.tablename + ".wt"))
+ cursor = self.session.open_cursor('table:' + self.tablename, None, None)
+ for i in range(0, self.nentries):
+ cursor[str(i)] = str(i)
+ cursor.close()
+
+ self.runWt(["truncate", "table:" + self.tablename])
+
+ """
+ Test to confirm table exists and is empty
+ """
+ outfile="outfile.txt"
+ errfile="errfile.txt"
+ self.assertTrue(os.path.exists(self.tablename + ".wt"))
+ self.runWt(["read", 'table:' + self.tablename, 'NoMatch'],
+ outfilename=outfile, errfilename=errfile, failure=True)
+ self.check_empty_file(outfile)
+ self.check_file_contains(errfile, 'NoMatch: not found\n')
+
+ """
+ Tests for error cases
+ 1. Missing URI
+ 2. Invalid URI
+ 3. Valid but incorrect URI
+ 4. Double URI
+ """
+ self.runWt(["truncate"],
+ outfilename=outfile, errfilename=errfile, failure=True)
+ self.check_empty_file(outfile)
+ self.check_file_contains(errfile, 'usage:')
+
+ self.runWt(["truncate", "foobar"],
+ outfilename=outfile, errfilename=errfile, failure=True)
+ self.check_empty_file(outfile)
+ self.check_file_contains(errfile, 'No such file or directory')
+
+ self.runWt(["truncate", 'table:xx' + self.tablename],
+ outfilename=outfile, errfilename=errfile, failure=True)
+ self.check_empty_file(outfile)
+ self.check_file_contains(errfile, 'No such file or directory')
+
+ self.runWt(["truncate", 'table:' + self.tablename, 'table:' + self.tablename],
+ outfilename=outfile, errfilename=errfile, failure=True)
+ self.check_empty_file(outfile)
+ self.check_file_contains(errfile, 'usage:')
+
+if __name__ == '__main__':
+ wttest.run()
diff --git a/test/suite/test_util15.py b/test/suite/test_util15.py
new file mode 100644
index 00000000000..33096e71bee
--- /dev/null
+++ b/test/suite/test_util15.py
@@ -0,0 +1,71 @@
+#!/usr/bin/env python
+#
+# Public Domain 2014-2017 MongoDB, Inc.
+# Public Domain 2008-2014 WiredTiger, Inc.
+#
+# This is free and unencumbered software released into the public domain.
+#
+# Anyone is free to copy, modify, publish, use, compile, sell, or
+# distribute this software, either in source code form or as a compiled
+# binary, for any purpose, commercial or non-commercial, and by any
+# means.
+#
+# In jurisdictions that recognize copyright laws, the author or authors
+# of this software dedicate any and all copyright interest in the
+# software to the public domain. We make this dedication for the benefit
+# of the public at large and to the detriment of our heirs and
+# successors. We intend this dedication to be an overt act of
+# relinquishment in perpetuity of all present and future rights to this
+# software under copyright law.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+# IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+
+import os
+from suite_subprocess import suite_subprocess
+import wiredtiger, wttest
+
+# test_util15.py
+# Utilities: wt alter
+class test_util15(wttest.WiredTigerTestCase, suite_subprocess):
+ tablename = 'test_util15.a'
+
+ def test_alter_process(self):
+ """
+ Test alter in a 'wt' process
+ """
+ params = 'key_format=S,value_format=S'
+ self.session.create('table:' + self.tablename, params)
+ self.assertTrue(os.path.exists(self.tablename + ".wt"))
+
+ """
+ Alter access pattern and confirm
+ """
+ acc_pat_seq="access_pattern_hint=sequential"
+ self.runWt(["alter", "table:" + self.tablename, acc_pat_seq])
+ cursor = self.session.open_cursor("metadata:create", None, None)
+ cursor.set_key("table:" + self.tablename)
+ self.assertEqual(cursor.search(),0)
+ string = cursor.get_value()
+ cursor.close()
+ self.assertTrue(acc_pat_seq in string)
+
+ """
+ Alter access pattern again and confirm
+ """
+ acc_pat_rand="access_pattern_hint=random"
+ self.runWt(["alter", "table:" + self.tablename, acc_pat_rand])
+ cursor = self.session.open_cursor("metadata:create", None, None)
+ cursor.set_key("table:" + self.tablename)
+ self.assertEqual(cursor.search(),0)
+ string = cursor.get_value()
+ cursor.close()
+ self.assertTrue(acc_pat_rand in string)
+
+if __name__ == '__main__':
+ wttest.run()
diff --git a/test/suite/test_util16.py b/test/suite/test_util16.py
new file mode 100644
index 00000000000..00e68c1017a
--- /dev/null
+++ b/test/suite/test_util16.py
@@ -0,0 +1,71 @@
+#!/usr/bin/env python
+#
+# Public Domain 2014-2017 MongoDB, Inc.
+# Public Domain 2008-2014 WiredTiger, Inc.
+#
+# This is free and unencumbered software released into the public domain.
+#
+# Anyone is free to copy, modify, publish, use, compile, sell, or
+# distribute this software, either in source code form or as a compiled
+# binary, for any purpose, commercial or non-commercial, and by any
+# means.
+#
+# In jurisdictions that recognize copyright laws, the author or authors
+# of this software dedicate any and all copyright interest in the
+# software to the public domain. We make this dedication for the benefit
+# of the public at large and to the detriment of our heirs and
+# successors. We intend this dedication to be an overt act of
+# relinquishment in perpetuity of all present and future rights to this
+# software under copyright law.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+# IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+
+import os
+from suite_subprocess import suite_subprocess
+import wiredtiger, wttest
+
+# test_util16.py
+# Utilities: wt rename
+class test_util16(wttest.WiredTigerTestCase, suite_subprocess):
+ tablename = 'test_util16.a'
+ tablename2 = 'test_util16.b'
+ nentries = 1000
+
+ def test_rename_process(self):
+ """
+ Test alter in a 'wt' process
+ """
+ params = 'key_format=S,value_format=S'
+ self.session.create('table:' + self.tablename, params)
+ self.assertTrue(os.path.exists(self.tablename + ".wt"))
+ cursor = self.session.open_cursor('table:' + self.tablename, None, None)
+ for i in range(0, self.nentries):
+ cursor[str(i)] = str(i)
+ cursor.close()
+
+ self.runWt(["rename", "table:" + self.tablename, "table:" + self.tablename2])
+ self.assertTrue(os.path.exists(self.tablename2 + ".wt"))
+ cursor = self.session.open_cursor('table:' + self.tablename2, None, None)
+ count = 0
+ while cursor.next() == 0:
+ count +=1
+ cursor.close()
+ self.assertEquals(self.nentries, count)
+
+ self.runWt(["rename", "table:" + self.tablename2, "table:" + self.tablename])
+ self.assertTrue(os.path.exists(self.tablename + ".wt"))
+ cursor = self.session.open_cursor('table:' + self.tablename, None, None)
+ count = 0
+ while cursor.next() == 0:
+ count +=1
+ cursor.close()
+ self.assertEquals(self.nentries, count)
+
+if __name__ == '__main__':
+ wttest.run()
diff --git a/test/suite/test_util17.py b/test/suite/test_util17.py
new file mode 100644
index 00000000000..decc1fabf1d
--- /dev/null
+++ b/test/suite/test_util17.py
@@ -0,0 +1,57 @@
+#!/usr/bin/env python
+#
+# Public Domain 2014-2017 MongoDB, Inc.
+# Public Domain 2008-2014 WiredTiger, Inc.
+#
+# This is free and unencumbered software released into the public domain.
+#
+# Anyone is free to copy, modify, publish, use, compile, sell, or
+# distribute this software, either in source code form or as a compiled
+# binary, for any purpose, commercial or non-commercial, and by any
+# means.
+#
+# In jurisdictions that recognize copyright laws, the author or authors
+# of this software dedicate any and all copyright interest in the
+# software to the public domain. We make this dedication for the benefit
+# of the public at large and to the detriment of our heirs and
+# successors. We intend this dedication to be an overt act of
+# relinquishment in perpetuity of all present and future rights to this
+# software under copyright law.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+# IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+
+import os
+from suite_subprocess import suite_subprocess
+import wiredtiger, wttest
+
+# test_util17.py
+# Utilities: wt stat
+class test_util17(wttest.WiredTigerTestCase, suite_subprocess):
+ tablename = 'test_util17.a'
+
+ def test_stat_process(self):
+ """
+ Test stat in a 'wt' process
+ This test is just here to confirm that stat produces a correct looking
+ output, it isn't here to do statistics validation.
+ """
+ params = 'key_format=S,value_format=S'
+ outfile = "wt-stat.out"
+ expected_string = "cursor: cursor create calls="
+ self.session.create('table:' + self.tablename, params)
+ self.assertTrue(os.path.exists(self.tablename + ".wt"))
+ self.runWt(["stat"], outfilename=outfile)
+ self.check_file_contains(outfile, expected_string)
+
+ expected_string = "cache_walk: Entries in the root page=1"
+ self.runWt(["stat", "table:" + self.tablename ], outfilename=outfile)
+ self.check_file_contains(outfile, expected_string)
+
+if __name__ == '__main__':
+ wttest.run()
diff --git a/test/suite/wtdataset.py b/test/suite/wtdataset.py
index 74e07e24e93..946b97d995f 100644
--- a/test/suite/wtdataset.py
+++ b/test/suite/wtdataset.py
@@ -41,6 +41,7 @@ class BaseDataSet(object):
self.key_format = kwargs.get('key_format', 'S')
self.value_format = kwargs.get('value_format', 'S')
self.config = kwargs.get('config', '')
+ self.projection = kwargs.get('projection', '')
def create(self):
self.testcase.session.create(self.uri, 'key_format=' + self.key_format
@@ -103,7 +104,8 @@ class BaseDataSet(object):
def check(self):
self.testcase.pr('check: ' + self.uri)
- cursor = self.testcase.session.open_cursor(self.uri, None)
+ cursor = self.testcase.session.open_cursor(
+ self.uri + self.projection, None, None)
self.check_cursor(cursor)
cursor.close()
@@ -289,6 +291,94 @@ class ComplexLSMDataSet(ComplexDataSet):
def is_lsm(cls):
return True
+class ProjectionDataSet(SimpleDataSet):
+ """
+ ProjectionDataSet creates a table with predefined data identical to
+ SimpleDataSet (single key and value), but when checking it, uses
+ a cursor with a projection.
+ """
+ def __init__(self, testcase, uri, rows, **kwargs):
+ kwargs['config'] = kwargs.get('config', '') + ',columns=(k,v0)'
+ kwargs['projection'] = '(v0,v0,v0)'
+ super(ProjectionDataSet, self).__init__(testcase, uri, rows, **kwargs)
+
+ # A value suitable for checking the value returned by a cursor.
+ def comparable_value(self, i):
+ v0 = self.value(i)
+ return [v0, v0, v0]
+
+ def check_cursor(self, cursor):
+ i = 0
+ for key, got0, got1, got2 in cursor:
+ i += 1
+ self.testcase.assertEqual(key, self.key(i))
+ if cursor.value_format == '8t' and got0 == 0: # deleted
+ continue
+ self.testcase.assertEqual([got0, got1, got2],
+ self.comparable_value(i))
+ self.testcase.assertEqual(i, self.rows)
+
+class ProjectionIndexDataSet(BaseDataSet):
+ """
+ ProjectionIndexDataSet creates a table with three values and
+ an index. Checks are made against a projection of the main table
+ and a projection of the index.
+ """
+ def __init__(self, testcase, uri, rows, **kwargs):
+ self.origconfig = kwargs.get('config', '')
+ self.indexname = 'index:' + uri.split(":")[1] + ':index0'
+ kwargs['config'] = self.origconfig + ',columns=(k,v0,v1,v2)'
+ kwargs['value_format'] = kwargs.get('value_format', 'SiS')
+ kwargs['projection'] = '(v1,v2,v0)'
+ super(ProjectionIndexDataSet, self).__init__(
+ testcase, uri, rows, **kwargs)
+
+ def value(self, i):
+ return ('v0:' + str(i), i*i, 'v2:' + str(i))
+
+ # Suitable for checking the value returned by a cursor using a projection.
+ def comparable_value(self, i):
+ return [i*i, 'v2:' + str(i), 'v0:' + str(i)]
+
+ def create(self):
+ super(ProjectionIndexDataSet, self).create()
+ self.testcase.session.create(self.indexname, 'columns=(v2,v1),' +
+ self.origconfig)
+
+ def check_cursor(self, cursor):
+ i = 0
+ for key, got0, got1, got2 in cursor:
+ i += 1
+ self.testcase.assertEqual(key, self.key(i))
+ if cursor.value_format == '8t' and got0 == 0: # deleted
+ continue
+ self.testcase.assertEqual([got0, got1, got2],
+ self.comparable_value(i))
+ self.testcase.assertEqual(i, self.rows)
+
+ def check_index_cursor(self, cursor):
+ for i in xrange(1, self.rows + 1):
+ k = self.key(i)
+ v = self.value(i)
+ ik = (v[2], v[1]) # The index key is (v2,v2)
+ expect = [v[1],k,v[2],v[0]]
+ self.testcase.assertEqual(expect, cursor[ik])
+
+ def check(self):
+ BaseDataSet.check(self)
+
+ # Check values in the index.
+ idxcursor = self.testcase.session.open_cursor(
+ self.indexname + '(v1,k,v2,v0)')
+ self.check_index_cursor(idxcursor)
+ idxcursor.close()
+
+ def index_count(self):
+ return 1
+
+ def index_name(self, i):
+ return self.indexname
+
# create a key based on a cursor as a shortcut to creating a SimpleDataSet
def simple_key(cursor, i):
return BaseDataSet.key_by_format(i, cursor.key_format)
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')