diff options
| author | drebs <drebs@leap.se> | 2016-07-24 07:56:52 -0300 | 
|---|---|---|
| committer | drebs <drebs@leap.se> | 2016-08-01 21:09:03 -0300 | 
| commit | 793180533e4f19b364145c61939d6cad07dd851a (patch) | |
| tree | c11d84b9a3f91ab4f8189a4c513e082555fd113c | |
| parent | 1893611393a3ec69d8099a8601fb21262e5f36f4 (diff) | |
[test] add pytest initial setup for performance tests
| -rw-r--r-- | testing/tests/perf/assets/cert_default.conf | 15 | ||||
| -rw-r--r-- | testing/tests/perf/conftest.py | 143 | ||||
| -rw-r--r-- | testing/tests/perf/pytest.ini | 2 | ||||
| -rw-r--r-- | testing/tests/perf/test_sync.py | 43 | ||||
| -rw-r--r-- | testing/tox.ini | 3 | 
5 files changed, 206 insertions, 0 deletions
diff --git a/testing/tests/perf/assets/cert_default.conf b/testing/tests/perf/assets/cert_default.conf new file mode 100644 index 00000000..8043cea3 --- /dev/null +++ b/testing/tests/perf/assets/cert_default.conf @@ -0,0 +1,15 @@ +[ req ] +default_bits           = 1024 +default_keyfile        = keyfile.pem +distinguished_name     = req_distinguished_name +prompt                 = no +output_password        = mypass + +[ req_distinguished_name ] +C                      = GB +ST                     = Test State or Province +L                      = Test Locality +O                      = Organization Name +OU                     = Organizational Unit Name +CN                     = localhost +emailAddress           = test@email.address diff --git a/testing/tests/perf/conftest.py b/testing/tests/perf/conftest.py new file mode 100644 index 00000000..c66f2863 --- /dev/null +++ b/testing/tests/perf/conftest.py @@ -0,0 +1,143 @@ +import json +import os +import pytest +import requests +import signal +import time + +from hashlib import sha512 +from subprocess import call + +from leap.soledad.client import Soledad +from leap.soledad.common.couch import CouchDatabase + +from leap.common.events import server +server.ensure_server() + + +DEFAULT_UUID = '0' +DEFAULT_PASSPHRASE = '123' + +DEFAULT_URL = 'http://127.0.0.1:2424' +DEFAULT_PRIVKEY = 'soledad_privkey.pem' +DEFAULT_CERTKEY = 'soledad_certkey.pem' +DEFAULT_TOKEN = 'an-auth-token' + + +@pytest.fixture +def certificate(tmpdir): +    privkey = os.path.join(tmpdir.strpath, 'privkey.pem') +    certkey = os.path.join(tmpdir.strpath, 'certkey.pem') +    call([ +        'openssl', +        'req', +        '-x509', +        '-sha256', +        '-nodes', +        '-days', '365', +        '-newkey', 'rsa:2048', +        '-config', './assets/cert_default.conf',  # TODO: fix basedir +        '-keyout', privkey, +        '-out', certkey]) +    return privkey, certkey + + +def get_pid(pidfile): +    if not os.path.isfile(pidfile): +        return 0 +    try: +        with open(pidfile) as f: +            return int(f.read()) +    except IOError: +        return 0 + + +class CouchUserDatabase(object): + +    def __init__(self): +        url = 'http://127.0.0.1:5984/' +        self._user_db_url = url + 'user-%s' % DEFAULT_UUID +        self._token_db_url = url + _token_dbname() +        self._shared_db_url = url + 'shared' + +    def setup(self): +        CouchDatabase.open_database( +            url=self._user_db_url, create=True, replica_uid=None) +        requests.put(self._token_db_url) +        requests.put(self._shared_db_url) +        self._add_token() + +    def _add_token(self): +        token = sha512(DEFAULT_TOKEN).hexdigest() +        content = {'type': 'Token', 'user_id': DEFAULT_UUID} +        requests.put( +            self._token_db_url + '/' + token, data=json.dumps(content)) + +    def teardown(self): +        requests.delete(self._user_db_url) +        requests.delete(self._token_db_url) +        requests.delete(self._shared_db_url) + + +@pytest.fixture(scope='function') +def couchdb_user_db(request): +    db = CouchUserDatabase() +    db.setup() +    request.addfinalizer(db.teardown) +    return db + + +def _token_dbname(): +    dbname = 'tokens_' + \ +        str(int(time.time() / (30 * 24 * 3600))) +    return dbname + + +class SoledadServer(object): + +    def __init__(self, tmpdir): +        self._pidfile = os.path.join(tmpdir.strpath, 'soledad-server.pid') +        self._logfile = os.path.join(tmpdir.strpath, 'soledad-server.log') + +    def start(self): +        call([ +            'twistd', +            '--logfile=%s' % self._logfile, +            '--pidfile=%s' % self._pidfile, +            'web', +            '--wsgi=leap.soledad.server.application', +            '--port=2424' +        ]) + +    def stop(self): +        pid = get_pid(self._pidfile) +        os.kill(pid, signal.SIGKILL) + + +@pytest.fixture +def soledad_server(tmpdir, couchdb_user_db, request): +    server = SoledadServer(tmpdir) +    server.start() +    request.addfinalizer(server.stop) +    return server + + +@pytest.fixture() +def soledad_client(tmpdir, soledad_server): +    uuid = DEFAULT_UUID +    passphrase = DEFAULT_PASSPHRASE +    secrets_path = os.path.join(tmpdir.strpath, '%s.secret' % uuid) +    local_db_path = os.path.join(tmpdir.strpath, '%s.db' % uuid) +    server_url = DEFAULT_URL +    token = DEFAULT_TOKEN + +    # get a soledad instance +    return Soledad( +        uuid, +        unicode(passphrase), +        secrets_path=secrets_path, +        local_db_path=local_db_path, +        server_url=server_url, +        cert_file=None, +        auth_token=token, +        defer_encryption=True) diff --git a/testing/tests/perf/pytest.ini b/testing/tests/perf/pytest.ini new file mode 100644 index 00000000..7a0508ce --- /dev/null +++ b/testing/tests/perf/pytest.ini @@ -0,0 +1,2 @@ +[pytest] +twisted = yes diff --git a/testing/tests/perf/test_sync.py b/testing/tests/perf/test_sync.py new file mode 100644 index 00000000..1e29a86a --- /dev/null +++ b/testing/tests/perf/test_sync.py @@ -0,0 +1,43 @@ +import pytest + +from twisted.internet.defer import gatherResults + +from leap.soledad.common.couch import CouchDatabase +from leap.soledad.common.document import ServerDocument + + +@pytest.inlineCallbacks +def test_upload(soledad_client): +    # create a bunch of local documents +    uploads = 100 +    deferreds = [] +    for i in xrange(uploads): +        d = soledad_client.create_doc({'upload': True}) +        deferreds.append(d) +    yield gatherResults(deferreds) + +    # synchronize +    yield soledad_client.sync() + +    # check that documents reached the remote database +    remote = CouchDatabase('http://127.0.0.1:5984', 'user-0') +    remote_count, _ = remote.get_all_docs() +    assert remote_count == uploads + + +@pytest.inlineCallbacks +def test_download(soledad_client): +    # create a bunch of remote documents +    downloads = 100 +    remote = CouchDatabase('http://127.0.0.1:5984', 'user-0') +    for i in xrange(downloads): +        doc = ServerDocument('doc-%d' % i, 'replica:1') +        doc.content = {'download': True} +        remote.save_document(None, doc, i) + +    # synchronize +    yield soledad_client.sync() + +    # check that documents reached the local database +    local_count, docs = yield soledad_client.get_all_docs() +    assert local_count == downloads diff --git a/testing/tox.ini b/testing/tox.ini index 3663eef3..caeb52c1 100644 --- a/testing/tox.ini +++ b/testing/tox.ini @@ -8,16 +8,19 @@ deps =      pytest      pytest-flake8      pytest-pep8 +    pytest-twisted      mock      testscenarios      setuptools-trial      pep8      pdbpp      couchdb +    requests  # install soledad local packages      -e../common      -e../client      -e../server  setenv =      HOME=/tmp +    TERM=xterm  install_command = pip install {opts} {packages}  | 
