summaryrefslogtreecommitdiff
path: root/scripts/backends_cpu_usage/test_u1db_sync.py
blob: 26ef8f9f73da1561e52fdf04bb23be7a8583b6ca (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
#!/usr/bin/python


import u1db
import tempfile
import logging
import shutil
import os
import argparse
import time
import binascii
import random


from leap.soledad.client.sqlcipher import open as sqlcipher_open
from log_cpu_usage import LogCpuUsage
from u1dblite import open as u1dblite_open
from u1dbcipher import open as u1dbcipher_open


DOCS_TO_SYNC = 1000
SMALLEST_DOC_SIZE = 1 * 1024  # 1 KB
BIGGEST_DOC_SIZE = 100 * 1024  # 100 KB


def get_data(size):
    return binascii.hexlify(os.urandom(size/2))


def run_test(testname, open_fun, tempdir, docs,  *args):
    logger.info('Starting test \"%s\".' % testname)

    # instantiate dbs
    db1 = open_fun(os.path.join(tempdir, testname + '1.db'), *args)
    db2 = open_fun(os.path.join(tempdir, testname + '2.db'), *args)

    # get sync target and synchsonizer
    target = db2.get_sync_target()
    synchronizer = u1db.sync.Synchronizer(db1, target)


    # generate lots of small documents
    logger.info('Creating %d documents in source db...' % DOCS_TO_SYNC)
    for content in docs:
        db1.create_doc(content)
    logger.info('%d documents created in source db.' % DOCS_TO_SYNC)

    # run the test
    filename = testname + '.txt'
    logger.info('Logging CPU usage to %s.' % filename)
    log_cpu = LogCpuUsage(filename)
    tstart = time.time()

    # start logging cpu
    log_cpu.start()
    logger.info('Sleeping for 5 seconds...')
    time.sleep(5)

    # sync
    logger.info('Starting sync...')
    sstart = time.time()
    synchronizer.sync()
    send = time.time()
    logger.info('Sync finished.')

    # stop logging cpu
    logger.info('Sleeping for 5 seconds...')
    time.sleep(5)
    tend = time.time()
    log_cpu.stop()

    # report
    logger.info('Total sync time: %f seconds' % (send - sstart))
    logger.info('Total test time: %f seconds' % (tend - tstart))
    logger.info('Finished test \"%s\".' % testname)

    # close dbs
    db1.close()
    db2.close()


if __name__ == '__main__':
    
    # configure logger
    logger = logging.getLogger(__name__)
    LOG_FORMAT = '%(asctime)s %(message)s'
    logging.basicConfig(format=LOG_FORMAT, level=logging.INFO)


    # get a temporary dir
    tempdir = tempfile.mkdtemp()
    logger.info('Using temporary directory %s' % tempdir)


    # create a lot of documents with random sizes
    docs = []
    for i in xrange(DOCS_TO_SYNC):
        docs.append({
            'index': i,
            #'data': get_data(
            #    random.randrange(
            #        SMALLEST_DOC_SIZE, BIGGEST_DOC_SIZE))
        })

    # run tests
    run_test('sqlite', u1db.open, tempdir, docs, True)
    run_test('sqlcipher', sqlcipher_open, tempdir, docs, '123456', True)
    run_test('u1dblite', u1dblite_open, tempdir, docs)
    run_test('u1dbcipher', u1dbcipher_open, tempdir, docs, '123456', True)

    # remove temporary dir
    logger.info('Removing temporary directory %s' % tempdir)
    shutil.rmtree(tempdir)