diff options
Diffstat (limited to 'src/third_party/wiredtiger/test/suite/test_intpack.py')
-rw-r--r-- | src/third_party/wiredtiger/test/suite/test_intpack.py | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/src/third_party/wiredtiger/test/suite/test_intpack.py b/src/third_party/wiredtiger/test/suite/test_intpack.py new file mode 100644 index 00000000000..187b2d7f579 --- /dev/null +++ b/src/third_party/wiredtiger/test/suite/test_intpack.py @@ -0,0 +1,167 @@ +#!/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. +# +# test_intpack.py +# Tests integer packing using public methods +# + +import wiredtiger, wttest +from wtscenario import check_scenarios, number_scenarios + +class PackTester: + def __init__(self, formatcode, validlow, validhigh, equals): + self.formatcode = formatcode + self.validlow = validlow + self.validhigh = validhigh + self.recno = 1 + self.forw = None # r -> code + self.forw_idx = None # code -> r + self.back = None # code -> r + self.back_idx = None # r -> code + self.session = None + self.equals = equals + self.forw_uri = None + self.back_uri = None + self.forw_idx_uri = None + self.back_idx_uri = None + + def initialize(self, session): + self.session = session + pfx = 'test_intpack_' + x = self.formatcode + if x.isupper(): + x = x + '_' # differentiate upper case from lower case in our naming + tab = pfx + x + 'forw' + forw_uri = 'table:' + tab + forw_idx_uri = 'index:' + tab + ':inverse' + tab = pfx + x + 'back' + back_uri = 'table:' + tab + back_idx_uri = 'index:' + tab + ':inverse' + + session.create(forw_uri, "columns=(k,v)," + + "key_format=i,value_format=" + self.formatcode) + session.create(forw_idx_uri, "columns=(v)") + session.create(back_uri, "columns=(k,v)," + + "key_format=" + self.formatcode + ",value_format=i") + session.create(back_idx_uri, "columns=(v)") + self.forw_uri = forw_uri + self.back_uri = back_uri + self.forw_idx_uri = forw_idx_uri + self.back_idx_uri = back_idx_uri + self.truncate() + + def closeall(self): + if self.forw != None: + self.forw.close() + self.forw_idx.close() + self.back.close() + self.back_idx.close() + self.forw = None + self.forw_idx = None + self.back = None + self.back_idx = None + + def truncate(self): + self.closeall() + self.session.truncate(self.forw_uri, None, None, None) + self.session.truncate(self.back_uri, None, None, None) + self.forw = self.session.open_cursor(self.forw_uri, None, None) + self.forw_idx = self.session.open_cursor(self.forw_idx_uri + "(k)", + None, None) + + self.back = self.session.open_cursor(self.back_uri, None, None) + self.back_idx = self.session.open_cursor(self.back_idx_uri + "(k)", + None, None) + + def check_range(self, low, high): + if low < self.validlow: + low = self.validlow + if high > self.validhigh: + high = self.validhigh + i = low + forw = self.forw + forw_idx = self.forw_idx + back = self.back + back_idx = self.back_idx + while i <= high: + forw[self.recno] = i + back[i] = self.recno + self.equals(forw[self.recno], i) + self.equals(forw_idx[i], self.recno) + self.equals(back[i], self.recno) + self.equals(back_idx[self.recno], i) + forw.reset() + forw_idx.reset() + back.reset() + back_idx.reset() + self.recno += 1 + i += 1 + +# Test integer packing with various formats +class test_intpack(wttest.WiredTigerTestCase): + name = 'test_intpack' + + scenarios = check_scenarios([ + ('b', dict(formatcode='b', low=-128, high=127, nbits=8)), + ('B', dict(formatcode='B', low=0, high=255, nbits=8)), + ('8t', dict(formatcode='8t', low=0, high=255, nbits=8)), + ('5t', dict(formatcode='5t', low=0, high=31, nbits=5)), + ('h', dict(formatcode='h', low=-32768, high=32767, nbits=16)), + ('H', dict(formatcode='H', low=0, high=65535, nbits=16)), + ('i', dict(formatcode='i', low=-2147483648, high=2147483647, nbits=32)), + ('I', dict(formatcode='I', low=0, high=4294967295, nbits=32)), + ('l', dict(formatcode='l', low=-2147483648, high=2147483647, nbits=32)), + ('L', dict(formatcode='L', low=0, high=4294967295, nbits=32)), + ('q', dict(formatcode='q', low=-9223372036854775808, + high=9223372036854775807, nbits=64)), + ('Q', dict(formatcode='Q', low=0, high=18446744073709551615, nbits=64)), + ]) + scenarios = check_scenarios(number_scenarios(scenarios)) + + def test_packing(self): + pt = PackTester(self.formatcode, self.low, self.high, self.assertEquals) + self.assertEquals(2 ** self.nbits, self.high - self.low + 1) + pt.initialize(self.session) + pt.check_range(-66000, 66000) + if self.nbits >= 32: + e32 = 2 ** 32 + pt.check_range(e32 - 1000, e32 + 1000) + pt.check_range(-e32 - 1000, -e32 + 1000) + if self.nbits >= 64: + e64 = 2 ** 64 + pt.check_range(e64 - 1000, e64 + 1000) + pt.check_range(-e64 - 1000, -e64 + 1000) + pt.truncate() + i = 8 + while i < 1 << 60: + pt.check_range(-i - 1, -i + 1) + pt.check_range(i - 1, i + 1) + i <<= 1 + +if __name__ == '__main__': + wttest.run() |