summaryrefslogtreecommitdiff
path: root/test/suite/test_compress01.py
blob: 2b75d7eba7d30b17500f779f93c8a7b0477e2f12 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#!/usr/bin/env python
#
# See the file LICENSE for redistribution information.
#
# Copyright (c) 2008-2011 WiredTiger, Inc.
#	All rights reserved.
#
# test001.py
# 	Basic operations
#

import unittest
import wiredtiger
import wttest
import os
import sys

class test_compress01_base(wttest.WiredTigerTestCase):
    """
    Test basic compression
    """
    nrecords = 10000

    # running tests from the base class uses no compressor,
    # a reasonable way to test the test case.
    def __init__(self, testname, compressor_name=None, abbrev='none'):
        wttest.WiredTigerTestCase.__init__(self, testname)
        self.compressor_name = compressor_name
        self.table_name1 = 'test_compress01' + abbrev + '.wt'
        # bigvalue = '1234567891011121314....'
        self.bigvalue = ''.join([`num` for num in xrange(1,10000)])  # about 38K chars long

    def create_table(self, tablename):
        extra_params = ',internal_node_min=512,internal_node_max=16384,leaf_node_min=131072,leaf_node_max=131072'
        comp_params = ''
        if self.compressor_name != None:
            comp_params = ',block_compressor=' + self.compressor_name
        params = 'key_format=S,value_format=S' + extra_params + comp_params
        self.pr('create_table: ' + tablename + ', params: ' + params)
        self.session.create('file:' + tablename, params)

    def cursor_s(self, tablename, key):
        cursor = self.session.open_cursor('file:' + tablename, None)
        cursor.set_key(key)
        return cursor

    def cursor_ss(self, tablename, key, val):
        cursor = self.cursor_s(tablename, key)
        cursor.set_value(val)
        return cursor

    def record_count(self):
        return self.nrecords

    def do_insert(self):
        """
        Create a table, add keys with big values, get them back
        """
        self.create_table(self.table_name1)

        self.pr("inserting `len(self.bigvalue)` byte values")
        for idx in xrange(1,self.record_count()):
            val = `idx` + self.bigvalue + `idx`
            inscursor = self.cursor_ss(self.table_name1, 'key' + `idx`, val)
            inscursor.insert()
            inscursor.close

    def do_verify(self):
        self.pr('search')
        for idx in xrange(1,self.record_count()):
            val = `idx` + self.bigvalue + `idx`
            getcursor = self.cursor_s(self.table_name1, 'key' + `idx`)
            ret = getcursor.search()
            self.assertTrue(ret == 0)
            self.assertEquals(getcursor.get_value(), val)
            getcursor.close(None)

    def do_fresh_cache(self):
        # Since we are running WT in-process, we just need
        # to shut down the connection and start again.
        self.conn.close(None)
        self.conn = self.setUpConnectionOpen(".")
        self.session = self.setUpSessionOpen(self.conn)

    def test_insert_and_verify(self):
        self.do_insert()
        # We want a fresh cache so that compressed pages
        # are really read from disk. 
        self.do_fresh_cache()
        self.do_verify()

    def extensionArg(self, name):
        if name != None:
            extensionsdir = os.path.dirname(__file__) + os.sep + '../../ext/compressors';
            extensionsarg = 'extensions=["' + extensionsdir + os.sep + name + os.sep + name + '.so"]'
            return extensionsarg
        else:
            return ''

    # override WiredTigerTestCase
    def setUpConnectionOpen(self, dir):
        return self.setUpConnectionWithExtension(dir, self.compressor_name)
        
    def setUpConnectionWithExtension(self, dir, name):
        conn = wiredtiger.wiredtiger_open(dir, 'create,' + self.extensionArg(name))
        self.pr(`conn`)
        return conn


class test_compress01_1_nop(test_compress01_base):
    def __init__(self, testname):
        test_compress01_base.__init__(self, testname, 'nop_compress', 'nop')


class test_compress01_2_bz(test_compress01_base):
    def __init__(self, testname):
        test_compress01_base.__init__(self, testname, 'bzip2_compress', 'bz')


if __name__ == '__main__':
    wttest.run(test_compress01_base)
    wttest.run(test_compress01_1_nop)
    wttest.run(test_compress01_2_bz)