devtools/__init__.py
author Julien Cristau <julien.cristau@logilab.fr>
Mon, 28 Apr 2014 11:20:26 +0200
changeset 9708 b36bc18f6ef7
parent 9679 a3a516cf8624
child 9788 47d356ee14d2
permissions -rw-r--r--
[migration] move 'entities' table changes from 3.19.0 to bootstrap script The 'mtime' and 'source' columns need to go away before we attempt to do anything else with the repo, otherwise any addition of an entity is going to explode.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9460
a2a0bc984863 [config] cleanup/refactor server sources file values handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9456
diff changeset
     1
# copyright 2003-2013 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
5421
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5267
diff changeset
     2
# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5267
diff changeset
     3
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5267
diff changeset
     4
# This file is part of CubicWeb.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5267
diff changeset
     5
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5267
diff changeset
     6
# CubicWeb is free software: you can redistribute it and/or modify it under the
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5267
diff changeset
     7
# terms of the GNU Lesser General Public License as published by the Free
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5267
diff changeset
     8
# Software Foundation, either version 2.1 of the License, or (at your option)
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5267
diff changeset
     9
# any later version.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5267
diff changeset
    10
#
5424
8ecbcbff9777 replace logilab-common by CubicWeb in disclaimer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5421
diff changeset
    11
# CubicWeb is distributed in the hope that it will be useful, but WITHOUT
5421
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5267
diff changeset
    12
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5267
diff changeset
    13
# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5267
diff changeset
    14
# details.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5267
diff changeset
    15
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5267
diff changeset
    16
# You should have received a copy of the GNU Lesser General Public License along
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5267
diff changeset
    17
# with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
6315
8ca3ee849bee [test] fix broken tests and minor cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6281
diff changeset
    18
"""Test tools for cubicweb"""
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    19
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    20
__docformat__ = "restructuredtext en"
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    21
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    22
import os
5754
51179e0bb250 [test] support for test on postgres database using the same mecanism as sqlite: one template database generated when necessary + actual test database created from the template
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5696
diff changeset
    23
import sys
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    24
import logging
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
    25
import shutil
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
    26
import pickle
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
    27
import glob
9498
a76ac18f09c4 [devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents: 9460
diff changeset
    28
import random
a76ac18f09c4 [devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents: 9460
diff changeset
    29
import subprocess
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
    30
import warnings
9337
70f6b183085a [devtools] write db config through a temporary file
Julien Cristau <julien.cristau@logilab.fr>
parents: 9235
diff changeset
    31
import tempfile
9498
a76ac18f09c4 [devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents: 9460
diff changeset
    32
import getpass
7879
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7856
diff changeset
    33
from hashlib import sha1 # pylint: disable=E0611
1016
26387b836099 use datetime instead of mx.DateTime
sylvain.thenault@logilab.fr
parents: 937
diff changeset
    34
from datetime import timedelta
8930
6a02be304486 remove unused import
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8694
diff changeset
    35
from os.path import (abspath, join, exists, split, isabs, isdir)
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
    36
from functools import partial
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    37
4466
8b0ca7904820 moved generic datetime manipulation function to lgc
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4436
diff changeset
    38
from logilab.common.date import strptime
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
    39
from logilab.common.decorators import cached, clear_cache
7301
93e96700e0c0 [configuration] exit with proper message when sources file is unreadable (you usually started cw while logged with a wrong user). Closes #1631238
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7240
diff changeset
    40
8930
6a02be304486 remove unused import
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8694
diff changeset
    41
from cubicweb import ExecutionError, BadConnectionId
6a02be304486 remove unused import
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8694
diff changeset
    42
from cubicweb import schema, cwconfig
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    43
from cubicweb.server.serverconfig import ServerConfiguration
9252
01bca75ee8bd [devtools,etwist] rename TwistedConfiguration to WebConfigurationBase (follows #2919310)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9235
diff changeset
    44
from cubicweb.etwist.twconfig import WebConfigurationBase
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    45
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2732
diff changeset
    46
cwconfig.CubicWebConfiguration.cls_adjust_sys_path()
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2732
diff changeset
    47
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2732
diff changeset
    48
# db auto-population configuration #############################################
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2732
diff changeset
    49
6377
3bb415310d4f [schema] introduce some new sets categorizing entity/relation types and benefits from them where possible
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6315
diff changeset
    50
SYSTEM_ENTITIES = (schema.SCHEMA_TYPES
3bb415310d4f [schema] introduce some new sets categorizing entity/relation types and benefits from them where possible
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6315
diff changeset
    51
                   | schema.INTERNAL_TYPES
3bb415310d4f [schema] introduce some new sets categorizing entity/relation types and benefits from them where possible
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6315
diff changeset
    52
                   | schema.WORKFLOW_TYPES
3bb415310d4f [schema] introduce some new sets categorizing entity/relation types and benefits from them where possible
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6315
diff changeset
    53
                   | set(('CWGroup', 'CWUser',))
3bb415310d4f [schema] introduce some new sets categorizing entity/relation types and benefits from them where possible
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6315
diff changeset
    54
                   )
3bb415310d4f [schema] introduce some new sets categorizing entity/relation types and benefits from them where possible
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6315
diff changeset
    55
SYSTEM_RELATIONS = (schema.META_RTYPES
3bb415310d4f [schema] introduce some new sets categorizing entity/relation types and benefits from them where possible
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6315
diff changeset
    56
                    | schema.WORKFLOW_RTYPES
3bb415310d4f [schema] introduce some new sets categorizing entity/relation types and benefits from them where possible
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6315
diff changeset
    57
                    | schema.WORKFLOW_DEF_RTYPES
3bb415310d4f [schema] introduce some new sets categorizing entity/relation types and benefits from them where possible
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6315
diff changeset
    58
                    | schema.SYSTEM_RTYPES
3bb415310d4f [schema] introduce some new sets categorizing entity/relation types and benefits from them where possible
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6315
diff changeset
    59
                    | schema.SCHEMA_TYPES
3bb415310d4f [schema] introduce some new sets categorizing entity/relation types and benefits from them where possible
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6315
diff changeset
    60
                    | set(('primary_email', # deducted from other relations
3bb415310d4f [schema] introduce some new sets categorizing entity/relation types and benefits from them where possible
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6315
diff changeset
    61
                           ))
3bb415310d4f [schema] introduce some new sets categorizing entity/relation types and benefits from them where possible
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6315
diff changeset
    62
                    )
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2732
diff changeset
    63
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2732
diff changeset
    64
# content validation configuration #############################################
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2732
diff changeset
    65
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    66
# validators are used to validate (XML, DTD, whatever) view's content
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    67
# validators availables are :
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    68
#  'dtd' : validates XML + declared DTD
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    69
#  'xml' : guarantees XML is well formed
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    70
#  None : do not try to validate anything
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2732
diff changeset
    71
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2732
diff changeset
    72
# {'vid': validator}
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    73
VIEW_VALIDATORS = {}
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2732
diff changeset
    74
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2732
diff changeset
    75
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2732
diff changeset
    76
# cubicweb test configuration ##################################################
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2732
diff changeset
    77
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    78
BASE_URL = 'http://testing.fr/cubicweb/'
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2732
diff changeset
    79
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    80
DEFAULT_SOURCES = {'system': {'adapter' : 'native',
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    81
                              'db-encoding' : 'UTF-8', #'ISO-8859-1',
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    82
                              'db-user' : u'admin',
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    83
                              'db-password' : 'gingkow',
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    84
                              'db-name' : 'tmpdb',
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    85
                              'db-driver' : 'sqlite',
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    86
                              'db-host' : None,
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    87
                              },
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    88
                   'admin' : {'login': u'admin',
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    89
                              'password': u'gingkow',
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    90
                              },
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    91
                   }
9498
a76ac18f09c4 [devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents: 9460
diff changeset
    92
DEFAULT_PSQL_SOURCES = DEFAULT_SOURCES.copy()
a76ac18f09c4 [devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents: 9460
diff changeset
    93
DEFAULT_PSQL_SOURCES['system'] = DEFAULT_SOURCES['system'].copy()
a76ac18f09c4 [devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents: 9460
diff changeset
    94
DEFAULT_PSQL_SOURCES['system']['db-driver'] = 'postgres'
a76ac18f09c4 [devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents: 9460
diff changeset
    95
DEFAULT_PSQL_SOURCES['system']['db-host'] = '/tmp'
a76ac18f09c4 [devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents: 9460
diff changeset
    96
DEFAULT_PSQL_SOURCES['system']['db-port'] = str(random.randrange(5432, 2**16))
a76ac18f09c4 [devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents: 9460
diff changeset
    97
DEFAULT_PSQL_SOURCES['system']['db-user'] = unicode(getpass.getuser())
a76ac18f09c4 [devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents: 9460
diff changeset
    98
DEFAULT_PSQL_SOURCES['system']['db-password'] = None
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    99
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   100
def turn_repo_off(repo):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   101
    """ Idea: this is less costly than a full re-creation of the repo object.
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   102
    off:
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   103
    * session are closed,
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7380
diff changeset
   104
    * cnxsets are closed
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   105
    * system source is shutdown
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   106
    """
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   107
    if not repo._needs_refresh:
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   108
        for sessionid in list(repo._sessions):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   109
            warnings.warn('%s Open session found while turning repository off'
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   110
                          %sessionid, RuntimeWarning)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   111
            try:
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   112
                repo.close(sessionid)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   113
            except BadConnectionId: #this is strange ? thread issue ?
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   114
                print 'XXX unknown session', sessionid
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7380
diff changeset
   115
        for cnxset in repo.cnxsets:
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7380
diff changeset
   116
            cnxset.close(True)
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   117
        repo.system_source.shutdown()
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   118
        repo._needs_refresh = True
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   119
        repo._has_started = False
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   120
9564
e2d5b0712974 [test] when the config change, we should cleanup sys.path and sys.modules. Closes #3634164
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9337
diff changeset
   121
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   122
def turn_repo_on(repo):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   123
    """Idea: this is less costly than a full re-creation of the repo object.
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   124
    on:
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7380
diff changeset
   125
    * cnxsets are connected
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   126
    * cache are cleared
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   127
    """
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   128
    if repo._needs_refresh:
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7380
diff changeset
   129
        for cnxset in repo.cnxsets:
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7380
diff changeset
   130
            cnxset.reconnect()
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   131
        repo._type_source_cache = {}
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   132
        repo._extid_cache = {}
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   133
        repo.querier._rql_cache = {}
9456
a79e88aad555 [multi-sources-removal] Kill repo.sources
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9402
diff changeset
   134
        repo.system_source.reset_caches()
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   135
        repo._needs_refresh = False
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   136
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2732
diff changeset
   137
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   138
class TestServerConfiguration(ServerConfiguration):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   139
    mode = 'test'
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1978
diff changeset
   140
    read_instance_schema = False
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   141
    init_repository = True
7239
078cfa8a5187 fix server/test/unittest_checkintegrity (failing since 70538ea2532d)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7220
diff changeset
   142
    skip_db_create_and_restore = False
9498
a76ac18f09c4 [devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents: 9460
diff changeset
   143
    default_sources = DEFAULT_SOURCES
a76ac18f09c4 [devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents: 9460
diff changeset
   144
7065
6a6ea9966931 [testlib] simplify code by using a class attribute
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7056
diff changeset
   145
    def __init__(self, appid='data', apphome=None, log_threshold=logging.CRITICAL+10):
6585
9af22f2c0c4c [test] start to make tests independant from cwd (more to do for tests which don't inherit from CubicWebTC
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6441
diff changeset
   146
        # must be set before calling parent __init__
9af22f2c0c4c [test] start to make tests independant from cwd (more to do for tests which don't inherit from CubicWebTC
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6441
diff changeset
   147
        if apphome is None:
6593
0fd8792c9c8a [testlib] self.appid not yet defined
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6585
diff changeset
   148
            if exists(appid):
0fd8792c9c8a [testlib] self.appid not yet defined
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6585
diff changeset
   149
                apphome = abspath(appid)
6585
9af22f2c0c4c [test] start to make tests independant from cwd (more to do for tests which don't inherit from CubicWebTC
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6441
diff changeset
   150
            else: # cube test
9af22f2c0c4c [test] start to make tests independant from cwd (more to do for tests which don't inherit from CubicWebTC
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6441
diff changeset
   151
                apphome = abspath('..')
9af22f2c0c4c [test] start to make tests independant from cwd (more to do for tests which don't inherit from CubicWebTC
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6441
diff changeset
   152
        self._apphome = apphome
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   153
        ServerConfiguration.__init__(self, appid)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   154
        self.init_log(log_threshold, force=True)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   155
        # need this, usually triggered by cubicweb-ctl
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   156
        self.load_cwctl_plugins()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   157
7071
db7608cb32bc [devtools] fix anonymous user handling in test classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7065
diff changeset
   158
    # By default anonymous login are allow but some test need to deny of to
db7608cb32bc [devtools] fix anonymous user handling in test classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7065
diff changeset
   159
    # change the default user. Set it to None to prevent anonymous login.
db7608cb32bc [devtools] fix anonymous user handling in test classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7065
diff changeset
   160
    anonymous_credential = ('anon', 'anon')
db7608cb32bc [devtools] fix anonymous user handling in test classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7065
diff changeset
   161
db7608cb32bc [devtools] fix anonymous user handling in test classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7065
diff changeset
   162
    def anonymous_user(self):
db7608cb32bc [devtools] fix anonymous user handling in test classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7065
diff changeset
   163
        if not self.anonymous_credential:
db7608cb32bc [devtools] fix anonymous user handling in test classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7065
diff changeset
   164
            return None, None
db7608cb32bc [devtools] fix anonymous user handling in test classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7065
diff changeset
   165
        return self.anonymous_credential
db7608cb32bc [devtools] fix anonymous user handling in test classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7065
diff changeset
   166
db7608cb32bc [devtools] fix anonymous user handling in test classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7065
diff changeset
   167
    def set_anonymous_allowed(self, allowed, anonuser='anon'):
db7608cb32bc [devtools] fix anonymous user handling in test classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7065
diff changeset
   168
        if allowed:
db7608cb32bc [devtools] fix anonymous user handling in test classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7065
diff changeset
   169
            self.anonymous_credential = (anonuser, anonuser)
db7608cb32bc [devtools] fix anonymous user handling in test classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7065
diff changeset
   170
        else:
db7608cb32bc [devtools] fix anonymous user handling in test classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7065
diff changeset
   171
            self.anonymous_credential = None
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1016
diff changeset
   172
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   173
    @property
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   174
    def apphome(self):
6585
9af22f2c0c4c [test] start to make tests independant from cwd (more to do for tests which don't inherit from CubicWebTC
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6441
diff changeset
   175
        return self._apphome
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   176
    appdatahome = apphome
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1016
diff changeset
   177
3435
84036ad2c82d add anon user for TestServerConfiguration, no only AppTestConfiguration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163
diff changeset
   178
    def load_configuration(self):
84036ad2c82d add anon user for TestServerConfiguration, no only AppTestConfiguration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163
diff changeset
   179
        super(TestServerConfiguration, self).load_configuration()
4913
083b4d454192 server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents: 4761
diff changeset
   180
        # no undo support in tests
8306
4da49700b06a [config, undo] Fix undo-support option migration
Anthony Truchet <anthony.truchet@logilab.fr>
parents: 8265
diff changeset
   181
        self.global_set_option('undo-enabled', 'n')
3435
84036ad2c82d add anon user for TestServerConfiguration, no only AppTestConfiguration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 3163
diff changeset
   182
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   183
    def main_config_file(self):
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 1978
diff changeset
   184
        """return instance's control configuration file"""
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   185
        return join(self.apphome, '%s.conf' % self.name)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   186
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   187
    def bootstrap_cubes(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   188
        try:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   189
            super(TestServerConfiguration, self).bootstrap_cubes()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   190
        except IOError:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   191
            # no cubes
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   192
            self.init_cubes( () )
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   193
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   194
    sourcefile = None
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   195
    def sources_file(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   196
        """define in subclasses self.sourcefile if necessary"""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   197
        if self.sourcefile:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   198
            print 'Reading sources from', self.sourcefile
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   199
            sourcefile = self.sourcefile
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   200
            if not isabs(sourcefile):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   201
                sourcefile = join(self.apphome, sourcefile)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   202
        else:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   203
            sourcefile = super(TestServerConfiguration, self).sources_file()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   204
        return sourcefile
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   205
9460
a2a0bc984863 [config] cleanup/refactor server sources file values handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9456
diff changeset
   206
    def read_sources_file(self):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   207
        """By default, we run tests with the sqlite DB backend.  One may use its
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   208
        own configuration by just creating a 'sources' file in the test
9498
a76ac18f09c4 [devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents: 9460
diff changeset
   209
        directory from which tests are launched or by specifying an alternative
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   210
        sources file using self.sourcefile.
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   211
        """
7301
93e96700e0c0 [configuration] exit with proper message when sources file is unreadable (you usually started cw while logged with a wrong user). Closes #1631238
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7240
diff changeset
   212
        try:
9460
a2a0bc984863 [config] cleanup/refactor server sources file values handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9456
diff changeset
   213
            sources = super(TestServerConfiguration, self).read_sources_file()
7301
93e96700e0c0 [configuration] exit with proper message when sources file is unreadable (you usually started cw while logged with a wrong user). Closes #1631238
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7240
diff changeset
   214
        except ExecutionError:
93e96700e0c0 [configuration] exit with proper message when sources file is unreadable (you usually started cw while logged with a wrong user). Closes #1631238
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7240
diff changeset
   215
            sources = {}
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   216
        if not sources:
9498
a76ac18f09c4 [devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents: 9460
diff changeset
   217
            sources = self.default_sources
6427
c8a5ac2d1eaa [schema / sources] store data sources as cubicweb entities
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6425
diff changeset
   218
        if 'admin' not in sources:
9498
a76ac18f09c4 [devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents: 9460
diff changeset
   219
            sources['admin'] = self.default_sources['admin']
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   220
        return sources
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1016
diff changeset
   221
6441
adbce42ff1b5 TestServerConfig needs default_base_url
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6424
diff changeset
   222
    # web config methods needed here for cases when we use this config as a web
adbce42ff1b5 TestServerConfig needs default_base_url
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6424
diff changeset
   223
    # config
adbce42ff1b5 TestServerConfig needs default_base_url
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6424
diff changeset
   224
adbce42ff1b5 TestServerConfig needs default_base_url
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6424
diff changeset
   225
    def default_base_url(self):
adbce42ff1b5 TestServerConfig needs default_base_url
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6424
diff changeset
   226
        return BASE_URL
adbce42ff1b5 TestServerConfig needs default_base_url
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6424
diff changeset
   227
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   228
9252
01bca75ee8bd [devtools,etwist] rename TwistedConfiguration to WebConfigurationBase (follows #2919310)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9235
diff changeset
   229
class BaseApptestConfiguration(TestServerConfiguration, WebConfigurationBase):
6843
b70a26ca271c [devtools] set configuration name to all-in-one so test/data/all-in-one.conf file will be loaded as one may expected
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6750
diff changeset
   230
    name = 'all-in-one' # so it search for all-in-one.conf, not repository.conf
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2732
diff changeset
   231
    options = cwconfig.merge_options(TestServerConfiguration.options
9252
01bca75ee8bd [devtools,etwist] rename TwistedConfiguration to WebConfigurationBase (follows #2919310)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9235
diff changeset
   232
                                     + WebConfigurationBase.options)
01bca75ee8bd [devtools,etwist] rename TwistedConfiguration to WebConfigurationBase (follows #2919310)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9235
diff changeset
   233
    cubicweb_appobject_path = TestServerConfiguration.cubicweb_appobject_path | WebConfigurationBase.cubicweb_appobject_path
01bca75ee8bd [devtools,etwist] rename TwistedConfiguration to WebConfigurationBase (follows #2919310)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9235
diff changeset
   234
    cube_appobject_path = TestServerConfiguration.cube_appobject_path | WebConfigurationBase.cube_appobject_path
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   235
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   236
    def available_languages(self, *args):
6749
48f468f33704 [config, i18n] Create default translation mechanism for all supported languages.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 6729
diff changeset
   237
        return self.cw_languages()
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1016
diff changeset
   238
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   239
    def pyro_enabled(self):
5754
51179e0bb250 [test] support for test on postgres database using the same mecanism as sqlite: one template database generated when necessary + actual test database created from the template
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5696
diff changeset
   240
        # but export PYRO_MULTITHREAD=0 or you get problems with sqlite and
51179e0bb250 [test] support for test on postgres database using the same mecanism as sqlite: one template database generated when necessary + actual test database created from the template
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5696
diff changeset
   241
        # threads
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   242
        return True
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   243
6424
f443a2b8a5c7 [devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6315
diff changeset
   244
# XXX merge with BaseApptestConfiguration ?
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   245
class ApptestConfiguration(BaseApptestConfiguration):
7214
70538ea2532d [testlib] fix readlb config handling, avoid systematic recreation of db with postgres (closes #1618089)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7129
diff changeset
   246
    # `skip_db_create_and_restore` controls wether or not the test database
70538ea2532d [testlib] fix readlb config handling, avoid systematic recreation of db with postgres (closes #1618089)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7129
diff changeset
   247
    # should be created / backuped / restored. If set to True, those
70538ea2532d [testlib] fix readlb config handling, avoid systematic recreation of db with postgres (closes #1618089)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7129
diff changeset
   248
    # steps are completely skipped, the database is used as is and is
70538ea2532d [testlib] fix readlb config handling, avoid systematic recreation of db with postgres (closes #1618089)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7129
diff changeset
   249
    # considered initialized
70538ea2532d [testlib] fix readlb config handling, avoid systematic recreation of db with postgres (closes #1618089)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7129
diff changeset
   250
    skip_db_create_and_restore = False
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1016
diff changeset
   251
6585
9af22f2c0c4c [test] start to make tests independant from cwd (more to do for tests which don't inherit from CubicWebTC
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6441
diff changeset
   252
    def __init__(self, appid, apphome=None,
9af22f2c0c4c [test] start to make tests independant from cwd (more to do for tests which don't inherit from CubicWebTC
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6441
diff changeset
   253
                 log_threshold=logging.CRITICAL, sourcefile=None):
9af22f2c0c4c [test] start to make tests independant from cwd (more to do for tests which don't inherit from CubicWebTC
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6441
diff changeset
   254
        BaseApptestConfiguration.__init__(self, appid, apphome,
9af22f2c0c4c [test] start to make tests independant from cwd (more to do for tests which don't inherit from CubicWebTC
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6441
diff changeset
   255
                                          log_threshold=log_threshold)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   256
        self.init_repository = sourcefile is None
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   257
        self.sourcefile = sourcefile
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1016
diff changeset
   258
6424
f443a2b8a5c7 [devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6315
diff changeset
   259
9498
a76ac18f09c4 [devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents: 9460
diff changeset
   260
class PostgresApptestConfiguration(ApptestConfiguration):
a76ac18f09c4 [devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents: 9460
diff changeset
   261
    default_sources = DEFAULT_PSQL_SOURCES
a76ac18f09c4 [devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents: 9460
diff changeset
   262
a76ac18f09c4 [devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents: 9460
diff changeset
   263
6164
ceb6951f9d2f [devtools] restore ability to test on real databases
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5754
diff changeset
   264
class RealDatabaseConfiguration(ApptestConfiguration):
ceb6951f9d2f [devtools] restore ability to test on real databases
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5754
diff changeset
   265
    """configuration class for tests to run on a real database.
ceb6951f9d2f [devtools] restore ability to test on real databases
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5754
diff changeset
   266
ceb6951f9d2f [devtools] restore ability to test on real databases
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5754
diff changeset
   267
    The intialization is done by specifying a source file path.
ceb6951f9d2f [devtools] restore ability to test on real databases
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5754
diff changeset
   268
ceb6951f9d2f [devtools] restore ability to test on real databases
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5754
diff changeset
   269
    Important note: init_test_database / reset_test_database steps are
ceb6951f9d2f [devtools] restore ability to test on real databases
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5754
diff changeset
   270
    skipped. It's thus up to the test developer to implement setUp/tearDown
ceb6951f9d2f [devtools] restore ability to test on real databases
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5754
diff changeset
   271
    accordingly.
ceb6951f9d2f [devtools] restore ability to test on real databases
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5754
diff changeset
   272
ceb6951f9d2f [devtools] restore ability to test on real databases
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5754
diff changeset
   273
    Example usage::
ceb6951f9d2f [devtools] restore ability to test on real databases
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5754
diff changeset
   274
ceb6951f9d2f [devtools] restore ability to test on real databases
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5754
diff changeset
   275
      class MyTests(CubicWebTC):
7856
51a3fb272bf3 [skeleton] fix new class configuration in realdbtest
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 7815
diff changeset
   276
          _config = RealDatabaseConfiguration('myapp',
51a3fb272bf3 [skeleton] fix new class configuration in realdbtest
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 7815
diff changeset
   277
                                              sourcefile='/path/to/sources')
51a3fb272bf3 [skeleton] fix new class configuration in realdbtest
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 7815
diff changeset
   278
6164
ceb6951f9d2f [devtools] restore ability to test on real databases
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5754
diff changeset
   279
          def test_something(self):
ceb6951f9d2f [devtools] restore ability to test on real databases
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5754
diff changeset
   280
              rset = self.execute('Any X WHERE X is CWUser')
ceb6951f9d2f [devtools] restore ability to test on real databases
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5754
diff changeset
   281
              self.view('foaf', rset)
ceb6951f9d2f [devtools] restore ability to test on real databases
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5754
diff changeset
   282
ceb6951f9d2f [devtools] restore ability to test on real databases
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5754
diff changeset
   283
    """
7214
70538ea2532d [testlib] fix readlb config handling, avoid systematic recreation of db with postgres (closes #1618089)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7129
diff changeset
   284
    skip_db_create_and_restore = True
6164
ceb6951f9d2f [devtools] restore ability to test on real databases
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5754
diff changeset
   285
    read_instance_schema = True # read schema from database
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   286
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2732
diff changeset
   287
# test database handling #######################################################
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1016
diff changeset
   288
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   289
DEFAULT_EMPTY_DB_ID = '__default_empty_db__'
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   290
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   291
class TestDataBaseHandler(object):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   292
    DRIVER = None
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   293
    db_cache = {}
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   294
    explored_glob = set()
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   295
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   296
    def __init__(self, config):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   297
        self.config = config
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   298
        self._repo = None
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   299
        # pure consistency check
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   300
        assert self.system_source['db-driver'] == self.DRIVER
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   301
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   302
    def _ensure_test_backup_db_dir(self):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   303
        """Return path of directory for database backup.
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   304
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   305
        The function create it if necessary"""
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   306
        backupdir = join(self.config.apphome, 'database')
9235
3eb8d65824f5 [devtools] fix race when creating backupdir
Julien Cristau <julien.cristau@logilab.fr>
parents: 8930
diff changeset
   307
        try:
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   308
            os.makedirs(backupdir)
9235
3eb8d65824f5 [devtools] fix race when creating backupdir
Julien Cristau <julien.cristau@logilab.fr>
parents: 8930
diff changeset
   309
        except:
3eb8d65824f5 [devtools] fix race when creating backupdir
Julien Cristau <julien.cristau@logilab.fr>
parents: 8930
diff changeset
   310
            if not isdir(backupdir):
3eb8d65824f5 [devtools] fix race when creating backupdir
Julien Cristau <julien.cristau@logilab.fr>
parents: 8930
diff changeset
   311
                raise
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   312
        return backupdir
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   313
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   314
    def config_path(self, db_id):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   315
        """Path for config backup of a given database id"""
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   316
        return self.absolute_backup_file(db_id, 'config')
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   317
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   318
    def absolute_backup_file(self, db_id, suffix):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   319
        """Path for config backup of a given database id"""
7217
4b860903d8c7 [testlib] fix bug in backup file name generation: it may erroneously replace '-' by '_' in database **parent directories**. This should fix random error when test are run under apycot.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7214
diff changeset
   320
        # in case db name is an absolute path, we don't want to replace anything
4b860903d8c7 [testlib] fix bug in backup file name generation: it may erroneously replace '-' by '_' in database **parent directories**. This should fix random error when test are run under apycot.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7214
diff changeset
   321
        # in parent directories
4b860903d8c7 [testlib] fix bug in backup file name generation: it may erroneously replace '-' by '_' in database **parent directories**. This should fix random error when test are run under apycot.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7214
diff changeset
   322
        directory, basename = split(self.dbname)
4b860903d8c7 [testlib] fix bug in backup file name generation: it may erroneously replace '-' by '_' in database **parent directories**. This should fix random error when test are run under apycot.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7214
diff changeset
   323
        dbname = basename.replace('-', '_')
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   324
        assert '.' not in db_id
7217
4b860903d8c7 [testlib] fix bug in backup file name generation: it may erroneously replace '-' by '_' in database **parent directories**. This should fix random error when test are run under apycot.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7214
diff changeset
   325
        filename = join(directory, '%s-%s.%s' % (dbname, db_id, suffix))
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   326
        return join(self._ensure_test_backup_db_dir(), filename)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   327
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   328
    def db_cache_key(self, db_id, dbname=None):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   329
        """Build a database cache key for a db_id with the current config
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   330
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   331
        This key is meant to be used in the cls.db_cache mapping"""
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   332
        if dbname is None:
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   333
            dbname = self.dbname
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   334
        dbname = os.path.basename(dbname)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   335
        dbname = dbname.replace('-', '_')
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   336
        return (self.config.apphome, dbname, db_id)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   337
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   338
    def backup_database(self, db_id):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   339
        """Store the content of the current database as <db_id>
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   340
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   341
        The config used are also stored."""
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   342
        backup_data = self._backup_database(db_id)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   343
        config_path = self.config_path(db_id)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   344
        # XXX we dump a dict of the config
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   345
        # This is an experimental to help config dependant setup (like BFSS) to
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   346
        # be propertly restored
9337
70f6b183085a [devtools] write db config through a temporary file
Julien Cristau <julien.cristau@logilab.fr>
parents: 9235
diff changeset
   347
        with tempfile.NamedTemporaryFile(dir=os.path.dirname(config_path), delete=False) as conf_file:
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   348
            conf_file.write(pickle.dumps(dict(self.config)))
9337
70f6b183085a [devtools] write db config through a temporary file
Julien Cristau <julien.cristau@logilab.fr>
parents: 9235
diff changeset
   349
        os.rename(conf_file.name, config_path)
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   350
        self.db_cache[self.db_cache_key(db_id)] = (backup_data, config_path)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   351
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   352
    def _backup_database(self, db_id):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   353
        """Actual backup the current database.
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   354
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   355
        return a value to be stored in db_cache to allow restoration"""
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   356
        raise NotImplementedError()
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   357
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   358
    def restore_database(self, db_id):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   359
        """Restore a database.
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   360
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   361
        takes as argument value stored in db_cache by self._backup_database"""
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   362
        # XXX set a clearer error message ???
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   363
        backup_coordinates, config_path = self.db_cache[self.db_cache_key(db_id)]
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   364
        # reload the config used to create the database.
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   365
        config = pickle.loads(open(config_path, 'rb').read())
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   366
        # shutdown repo before changing database content
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   367
        if self._repo is not None:
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   368
            self._repo.turn_repo_off()
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   369
        self._restore_database(backup_coordinates, config)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   370
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   371
    def _restore_database(self, backup_coordinates, config):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   372
        """Actual restore of the current database.
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   373
8543
b7c9443d8625 minor cleanups/typos
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8306
diff changeset
   374
        Use the value stored in db_cache as input """
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   375
        raise NotImplementedError()
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   376
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   377
    def get_repo(self, startup=False):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   378
        """ return Repository object on the current database.
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   379
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   380
        (turn the current repo object "on" if there is one or recreate one)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   381
        if startup is True, server startup server hooks will be called if needed
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   382
        """
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   383
        if self._repo is None:
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   384
            self._repo = self._new_repo(self.config)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   385
        repo = self._repo
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   386
        repo.turn_repo_on()
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   387
        if startup and not repo._has_started:
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   388
            repo.hm.call_hooks('server_startup', repo=repo)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   389
            repo._has_started = True
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   390
        return repo
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   391
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   392
    def _new_repo(self, config):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   393
        """Factory method to create a new Repository Instance"""
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   394
        from cubicweb.dbapi import in_memory_repo
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   395
        config._cubes = None
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   396
        repo = in_memory_repo(config)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   397
        # extending Repository class
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   398
        repo._has_started = False
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   399
        repo._needs_refresh = False
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   400
        repo.turn_repo_on = partial(turn_repo_on, repo)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   401
        repo.turn_repo_off = partial(turn_repo_off, repo)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   402
        return repo
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   403
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   404
    def get_cnx(self):
7222
fcb8932082a5 [testlib] refactor create_user and grant_permission to make them usable from pre_setup_database
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7217
diff changeset
   405
        """return Connection object on the current repository"""
9576
5d4f662f5e31 [devtools] make get_repo_and_cnx return a repoapi ClientConnection
Julien Cristau <julien.cristau@logilab.fr>
parents: 9519
diff changeset
   406
        from cubicweb.repoapi import connect
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   407
        repo = self.get_repo()
9460
a2a0bc984863 [config] cleanup/refactor server sources file values handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9456
diff changeset
   408
        sources = self.config.read_sources_file()
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   409
        login  = unicode(sources['admin']['login'])
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   410
        password = sources['admin']['password'] or 'xxx'
9576
5d4f662f5e31 [devtools] make get_repo_and_cnx return a repoapi ClientConnection
Julien Cristau <julien.cristau@logilab.fr>
parents: 9519
diff changeset
   411
        cnx = connect(repo, login, password=password)
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   412
        return cnx
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   413
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   414
    def get_repo_and_cnx(self, db_id=DEFAULT_EMPTY_DB_ID):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   415
        """Reset database with the current db_id and return (repo, cnx)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   416
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   417
        A database *MUST* have been build with the current <db_id> prior to
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   418
        call this method. See the ``build_db_cache`` method. The returned
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   419
        repository have it's startup hooks called and the connection is
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   420
        establised as admin."""
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   421
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   422
        self.restore_database(db_id)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   423
        repo = self.get_repo(startup=True)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   424
        cnx  = self.get_cnx()
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   425
        return repo, cnx
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   426
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   427
    @property
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   428
    def system_source(self):
9460
a2a0bc984863 [config] cleanup/refactor server sources file values handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9456
diff changeset
   429
        return self.config.system_source_config
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   430
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   431
    @property
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   432
    def dbname(self):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   433
        return self.system_source['db-name']
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   434
7220
eb0f5f46138f [testlib] fix typos / NameErrors in devtools/__init__.py
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7217
diff changeset
   435
    def init_test_database(self):
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   436
        """actual initialisation of the database"""
7220
eb0f5f46138f [testlib] fix typos / NameErrors in devtools/__init__.py
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7217
diff changeset
   437
        raise ValueError('no initialization function for driver %r' % self.DRIVER)
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   438
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   439
    def has_cache(self, db_id):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   440
        """Check if a given database id exist in cb cache for the current config"""
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   441
        cache_glob = self.absolute_backup_file('*', '*')
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   442
        if cache_glob not in self.explored_glob:
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   443
            self.discover_cached_db()
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   444
        return self.db_cache_key(db_id) in self.db_cache
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   445
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   446
    def discover_cached_db(self):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   447
        """Search available db_if for the current config"""
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   448
        cache_glob = self.absolute_backup_file('*', '*')
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   449
        directory = os.path.dirname(cache_glob)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   450
        entries={}
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   451
        candidates = glob.glob(cache_glob)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   452
        for filepath in candidates:
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   453
            data = os.path.basename(filepath)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   454
            # database backup are in the forms are <dbname>-<db_id>.<backtype>
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   455
            dbname, data = data.split('-', 1)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   456
            db_id, filetype = data.split('.', 1)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   457
            entries.setdefault((dbname, db_id), {})[filetype] = filepath
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   458
        for (dbname, db_id), entry in entries.iteritems():
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   459
            # apply necessary transformation from the driver
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   460
            value = self.process_cache_entry(directory, dbname, db_id, entry)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   461
            assert 'config' in entry
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   462
            if value is not None: # None value means "not handled by this driver
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   463
                                  # XXX Ignored value are shadowed to other Handler if cache are common.
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   464
                key = self.db_cache_key(db_id, dbname=dbname)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   465
                self.db_cache[key] = value, entry['config']
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   466
        self.explored_glob.add(cache_glob)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   467
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   468
    def process_cache_entry(self, directory, dbname, db_id, entry):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   469
        """Transforms potential cache entry to proper backup coordinate
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   470
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   471
        entry argument is a "filetype" -> "filepath" mapping
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   472
        Return None if an entry should be ignored."""
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   473
        return None
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   474
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   475
    def build_db_cache(self, test_db_id=DEFAULT_EMPTY_DB_ID, pre_setup_func=None):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   476
        """Build Database cache for ``test_db_id`` if a cache doesn't exist
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   477
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   478
        if ``test_db_id is DEFAULT_EMPTY_DB_ID`` self.init_test_database is
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   479
        called. otherwise, DEFAULT_EMPTY_DB_ID is build/restored and
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   480
        ``pre_setup_func`` to setup the database.
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   481
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   482
        This function backup any database it build"""
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   483
        if self.has_cache(test_db_id):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   484
            return #test_db_id, 'already in cache'
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   485
        if test_db_id is DEFAULT_EMPTY_DB_ID:
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   486
            self.init_test_database()
6164
ceb6951f9d2f [devtools] restore ability to test on real databases
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5754
diff changeset
   487
        else:
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   488
            print 'Building %s for database %s' % (test_db_id, self.dbname)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   489
            self.build_db_cache(DEFAULT_EMPTY_DB_ID)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   490
            self.restore_database(DEFAULT_EMPTY_DB_ID)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   491
            repo = self.get_repo(startup=True)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   492
            cnx = self.get_cnx()
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   493
            session = repo._sessions[cnx.sessionid]
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7380
diff changeset
   494
            session.set_cnxset()
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   495
            _commit = session.commit
8188
1867e252e487 [repository] ldap-feed source. Closes #2086984
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8175
diff changeset
   496
            def keep_cnxset_commit(free_cnxset=False):
1867e252e487 [repository] ldap-feed source. Closes #2086984
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8175
diff changeset
   497
                _commit(free_cnxset=free_cnxset)
7398
26695dd703d8 [repository api] definitly kill usage of word 'pool' to refer to connections set used by a session
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7380
diff changeset
   498
            session.commit = keep_cnxset_commit
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   499
            pre_setup_func(session, self.config)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   500
            session.commit()
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   501
            cnx.close()
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   502
        self.backup_database(test_db_id)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   503
7214
70538ea2532d [testlib] fix readlb config handling, avoid systematic recreation of db with postgres (closes #1618089)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7129
diff changeset
   504
70538ea2532d [testlib] fix readlb config handling, avoid systematic recreation of db with postgres (closes #1618089)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7129
diff changeset
   505
class NoCreateDropDatabaseHandler(TestDataBaseHandler):
70538ea2532d [testlib] fix readlb config handling, avoid systematic recreation of db with postgres (closes #1618089)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7129
diff changeset
   506
    """This handler is used if config.skip_db_create_and_restore is True
70538ea2532d [testlib] fix readlb config handling, avoid systematic recreation of db with postgres (closes #1618089)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7129
diff changeset
   507
70538ea2532d [testlib] fix readlb config handling, avoid systematic recreation of db with postgres (closes #1618089)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7129
diff changeset
   508
    This is typically the case with RealDBConfig. In that case,
70538ea2532d [testlib] fix readlb config handling, avoid systematic recreation of db with postgres (closes #1618089)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7129
diff changeset
   509
    we explicitely want to skip init / backup / restore phases.
70538ea2532d [testlib] fix readlb config handling, avoid systematic recreation of db with postgres (closes #1618089)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7129
diff changeset
   510
70538ea2532d [testlib] fix readlb config handling, avoid systematic recreation of db with postgres (closes #1618089)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7129
diff changeset
   511
    This handler redefines the three corresponding methods and delegates
70538ea2532d [testlib] fix readlb config handling, avoid systematic recreation of db with postgres (closes #1618089)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7129
diff changeset
   512
    to original handler for any other method / attribute
70538ea2532d [testlib] fix readlb config handling, avoid systematic recreation of db with postgres (closes #1618089)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7129
diff changeset
   513
    """
70538ea2532d [testlib] fix readlb config handling, avoid systematic recreation of db with postgres (closes #1618089)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7129
diff changeset
   514
70538ea2532d [testlib] fix readlb config handling, avoid systematic recreation of db with postgres (closes #1618089)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7129
diff changeset
   515
    def __init__(self, base_handler):
70538ea2532d [testlib] fix readlb config handling, avoid systematic recreation of db with postgres (closes #1618089)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7129
diff changeset
   516
        self.base_handler = base_handler
70538ea2532d [testlib] fix readlb config handling, avoid systematic recreation of db with postgres (closes #1618089)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7129
diff changeset
   517
70538ea2532d [testlib] fix readlb config handling, avoid systematic recreation of db with postgres (closes #1618089)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7129
diff changeset
   518
    # override init / backup / restore methods
70538ea2532d [testlib] fix readlb config handling, avoid systematic recreation of db with postgres (closes #1618089)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7129
diff changeset
   519
    def init_test_database(self):
70538ea2532d [testlib] fix readlb config handling, avoid systematic recreation of db with postgres (closes #1618089)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7129
diff changeset
   520
        pass
70538ea2532d [testlib] fix readlb config handling, avoid systematic recreation of db with postgres (closes #1618089)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7129
diff changeset
   521
70538ea2532d [testlib] fix readlb config handling, avoid systematic recreation of db with postgres (closes #1618089)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7129
diff changeset
   522
    def backup_database(self, db_id):
70538ea2532d [testlib] fix readlb config handling, avoid systematic recreation of db with postgres (closes #1618089)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7129
diff changeset
   523
        pass
70538ea2532d [testlib] fix readlb config handling, avoid systematic recreation of db with postgres (closes #1618089)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7129
diff changeset
   524
70538ea2532d [testlib] fix readlb config handling, avoid systematic recreation of db with postgres (closes #1618089)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7129
diff changeset
   525
    def restore_database(self, db_id):
70538ea2532d [testlib] fix readlb config handling, avoid systematic recreation of db with postgres (closes #1618089)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7129
diff changeset
   526
        pass
70538ea2532d [testlib] fix readlb config handling, avoid systematic recreation of db with postgres (closes #1618089)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7129
diff changeset
   527
70538ea2532d [testlib] fix readlb config handling, avoid systematic recreation of db with postgres (closes #1618089)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7129
diff changeset
   528
    # delegate to original handler in all other cases
70538ea2532d [testlib] fix readlb config handling, avoid systematic recreation of db with postgres (closes #1618089)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7129
diff changeset
   529
    def __getattr__(self, attrname):
70538ea2532d [testlib] fix readlb config handling, avoid systematic recreation of db with postgres (closes #1618089)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7129
diff changeset
   530
        return getattr(self.base_handler, attrname)
70538ea2532d [testlib] fix readlb config handling, avoid systematic recreation of db with postgres (closes #1618089)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7129
diff changeset
   531
70538ea2532d [testlib] fix readlb config handling, avoid systematic recreation of db with postgres (closes #1618089)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7129
diff changeset
   532
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2732
diff changeset
   533
### postgres test database handling ############################################
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   534
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   535
class PostgresTestDataBaseHandler(TestDataBaseHandler):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   536
    DRIVER = 'postgres'
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   537
9498
a76ac18f09c4 [devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents: 9460
diff changeset
   538
    __CTL = set()
a76ac18f09c4 [devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents: 9460
diff changeset
   539
a76ac18f09c4 [devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents: 9460
diff changeset
   540
    @classmethod
a76ac18f09c4 [devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents: 9460
diff changeset
   541
    def killall(cls):
a76ac18f09c4 [devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents: 9460
diff changeset
   542
        for datadir in cls.__CTL:
a76ac18f09c4 [devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents: 9460
diff changeset
   543
            subprocess.call(['pg_ctl', 'stop', '-D', datadir, '-m', 'fast'])
a76ac18f09c4 [devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents: 9460
diff changeset
   544
a76ac18f09c4 [devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents: 9460
diff changeset
   545
    def __init__(self, config):
a76ac18f09c4 [devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents: 9460
diff changeset
   546
        super(PostgresTestDataBaseHandler, self).__init__(config)
a76ac18f09c4 [devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents: 9460
diff changeset
   547
        datadir = join(self.config.apphome, 'pgdb')
a76ac18f09c4 [devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents: 9460
diff changeset
   548
        if not exists(datadir):
9519
32662203e334 [devtools] force locale to C for postgresql test clusters
Julien Cristau <julien.cristau@logilab.fr>
parents: 9498
diff changeset
   549
            subprocess.check_call(['initdb', '-D', datadir, '-E', 'utf-8', '--locale=C'])
9498
a76ac18f09c4 [devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents: 9460
diff changeset
   550
        port = self.system_source['db-port']
9679
a3a516cf8624 [devtools] set PGPORT/PGHOST when calling pg_ctl start
Julien Cristau <julien.cristau@logilab.fr>
parents: 9635
diff changeset
   551
        directory = self.system_source['db-host']
a3a516cf8624 [devtools] set PGPORT/PGHOST when calling pg_ctl start
Julien Cristau <julien.cristau@logilab.fr>
parents: 9635
diff changeset
   552
        env = os.environ.copy()
a3a516cf8624 [devtools] set PGPORT/PGHOST when calling pg_ctl start
Julien Cristau <julien.cristau@logilab.fr>
parents: 9635
diff changeset
   553
        env['PGPORT'] = str(port)
a3a516cf8624 [devtools] set PGPORT/PGHOST when calling pg_ctl start
Julien Cristau <julien.cristau@logilab.fr>
parents: 9635
diff changeset
   554
        env['PGHOST'] = str(directory)
a3a516cf8624 [devtools] set PGPORT/PGHOST when calling pg_ctl start
Julien Cristau <julien.cristau@logilab.fr>
parents: 9635
diff changeset
   555
        subprocess.check_call(['pg_ctl', 'start', '-w', '-D', datadir, '-o', '-h "" -k %s -p %s' % (directory, port)],
a3a516cf8624 [devtools] set PGPORT/PGHOST when calling pg_ctl start
Julien Cristau <julien.cristau@logilab.fr>
parents: 9635
diff changeset
   556
                              env=env)
9498
a76ac18f09c4 [devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents: 9460
diff changeset
   557
        self.__CTL.add(datadir)
a76ac18f09c4 [devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents: 9460
diff changeset
   558
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   559
    @property
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   560
    @cached
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   561
    def helper(self):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   562
        from logilab.database import get_db_helper
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   563
        return get_db_helper('postgres')
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   564
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   565
    @property
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   566
    def dbcnx(self):
7520
b7456b454334 [devtools pg handler] some fixes so we get proper error when pg host is not reachable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7506
diff changeset
   567
        try:
b7456b454334 [devtools pg handler] some fixes so we get proper error when pg host is not reachable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7506
diff changeset
   568
            return self._cnx
b7456b454334 [devtools pg handler] some fixes so we get proper error when pg host is not reachable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7506
diff changeset
   569
        except AttributeError:
b7456b454334 [devtools pg handler] some fixes so we get proper error when pg host is not reachable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7506
diff changeset
   570
            from cubicweb.server.serverctl import _db_sys_cnx
b7456b454334 [devtools pg handler] some fixes so we get proper error when pg host is not reachable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7506
diff changeset
   571
            try:
b7456b454334 [devtools pg handler] some fixes so we get proper error when pg host is not reachable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7506
diff changeset
   572
                self._cnx = _db_sys_cnx(
b7456b454334 [devtools pg handler] some fixes so we get proper error when pg host is not reachable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7506
diff changeset
   573
                    self.system_source, 'CREATE DATABASE and / or USER',
b7456b454334 [devtools pg handler] some fixes so we get proper error when pg host is not reachable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7506
diff changeset
   574
                    interactive=False)
b7456b454334 [devtools pg handler] some fixes so we get proper error when pg host is not reachable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7506
diff changeset
   575
                return self._cnx
b7456b454334 [devtools pg handler] some fixes so we get proper error when pg host is not reachable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7506
diff changeset
   576
            except Exception:
b7456b454334 [devtools pg handler] some fixes so we get proper error when pg host is not reachable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7506
diff changeset
   577
                self._cnx = None
b7456b454334 [devtools pg handler] some fixes so we get proper error when pg host is not reachable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7506
diff changeset
   578
                raise
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   579
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   580
    @property
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   581
    @cached
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   582
    def cursor(self):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   583
        return self.dbcnx.cursor()
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   584
7214
70538ea2532d [testlib] fix readlb config handling, avoid systematic recreation of db with postgres (closes #1618089)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7129
diff changeset
   585
    def process_cache_entry(self, directory, dbname, db_id, entry):
70538ea2532d [testlib] fix readlb config handling, avoid systematic recreation of db with postgres (closes #1618089)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7129
diff changeset
   586
        backup_name = self._backup_name(db_id)
70538ea2532d [testlib] fix readlb config handling, avoid systematic recreation of db with postgres (closes #1618089)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7129
diff changeset
   587
        if backup_name in self.helper.list_databases(self.cursor):
70538ea2532d [testlib] fix readlb config handling, avoid systematic recreation of db with postgres (closes #1618089)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7129
diff changeset
   588
            return backup_name
70538ea2532d [testlib] fix readlb config handling, avoid systematic recreation of db with postgres (closes #1618089)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7129
diff changeset
   589
        return None
70538ea2532d [testlib] fix readlb config handling, avoid systematic recreation of db with postgres (closes #1618089)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7129
diff changeset
   590
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   591
    def init_test_database(self):
7214
70538ea2532d [testlib] fix readlb config handling, avoid systematic recreation of db with postgres (closes #1618089)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7129
diff changeset
   592
        """initialize a fresh postgresql database used for testing purpose"""
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   593
        from cubicweb.server import init_repository
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   594
        from cubicweb.server.serverctl import system_source_cnx, createdb
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   595
        # connect on the dbms system base to create our base
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   596
        try:
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   597
            self._drop(self.dbname)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   598
            createdb(self.helper, self.system_source, self.dbcnx, self.cursor)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   599
            self.dbcnx.commit()
7112
bb27cc300040 [db connection] fix db connections method: verbose should be named interactive, it's not a question of verbosity but wether question should be asked or not
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7095
diff changeset
   600
            cnx = system_source_cnx(self.system_source, special_privs='LANGUAGE C',
bb27cc300040 [db connection] fix db connections method: verbose should be named interactive, it's not a question of verbosity but wether question should be asked or not
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7095
diff changeset
   601
                                    interactive=False)
5754
51179e0bb250 [test] support for test on postgres database using the same mecanism as sqlite: one template database generated when necessary + actual test database created from the template
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5696
diff changeset
   602
            templcursor = cnx.cursor()
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   603
            try:
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   604
                # XXX factorize with db-create code
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   605
                self.helper.init_fti_extensions(templcursor)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   606
                # install plpythonu/plpgsql language if not installed by the cube
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   607
                langs = sys.platform == 'win32' and ('plpgsql',) or ('plpythonu', 'plpgsql')
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   608
                for extlang in langs:
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   609
                    self.helper.create_language(templcursor, extlang)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   610
                cnx.commit()
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   611
            finally:
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   612
                templcursor.close()
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   613
                cnx.close()
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   614
            init_repository(self.config, interactive=False)
7815
2a164a9cf81c [exceptions] stop catching any exception in various places (closes #1942716)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7765
diff changeset
   615
        except BaseException:
7520
b7456b454334 [devtools pg handler] some fixes so we get proper error when pg host is not reachable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7506
diff changeset
   616
            if self.dbcnx is not None:
b7456b454334 [devtools pg handler] some fixes so we get proper error when pg host is not reachable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7506
diff changeset
   617
                self.dbcnx.rollback()
7896
4c954e1e73ef [lint] remove uses of "print >> sys.stderr" (closes #1908571)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 7879
diff changeset
   618
            sys.stderr.write('building %s failed\n' % self.dbname)
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   619
            #self._drop(self.dbname)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   620
            raise
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   621
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   622
    def helper_clear_cache(self):
7520
b7456b454334 [devtools pg handler] some fixes so we get proper error when pg host is not reachable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7506
diff changeset
   623
        if self.dbcnx is not None:
b7456b454334 [devtools pg handler] some fixes so we get proper error when pg host is not reachable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7506
diff changeset
   624
            self.dbcnx.commit()
b7456b454334 [devtools pg handler] some fixes so we get proper error when pg host is not reachable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7506
diff changeset
   625
            self.dbcnx.close()
b7456b454334 [devtools pg handler] some fixes so we get proper error when pg host is not reachable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7506
diff changeset
   626
            del self._cnx
b7456b454334 [devtools pg handler] some fixes so we get proper error when pg host is not reachable
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7506
diff changeset
   627
            clear_cache(self, 'cursor')
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   628
        clear_cache(self, 'helper')
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   629
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   630
    def __del__(self):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   631
        self.helper_clear_cache()
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   632
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   633
    @property
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   634
    def _config_id(self):
7879
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7856
diff changeset
   635
        return sha1(self.config.apphome).hexdigest()[:10]
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   636
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   637
    def _backup_name(self, db_id): # merge me with parent
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   638
        backup_name = '_'.join(('cache', self._config_id, self.dbname, db_id))
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   639
        return backup_name.lower()
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   640
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   641
    def _drop(self, db_name):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   642
        if db_name in self.helper.list_databases(self.cursor):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   643
            self.cursor.execute('DROP DATABASE %s' % db_name)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   644
            self.dbcnx.commit()
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   645
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   646
    def _backup_database(self, db_id):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   647
        """Actual backup the current database.
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   648
7506
c8cda2aca92e [testlib, realdb] we should close connections prior to create a new db using current db as template
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7240
diff changeset
   649
        return a value to be stored in db_cache to allow restoration
c8cda2aca92e [testlib, realdb] we should close connections prior to create a new db using current db as template
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7240
diff changeset
   650
        """
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   651
        from cubicweb.server.serverctl import createdb
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   652
        orig_name = self.system_source['db-name']
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   653
        try:
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   654
            backup_name = self._backup_name(db_id)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   655
            self._drop(backup_name)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   656
            self.system_source['db-name'] = backup_name
8175
89fcaca0bca0 [testlib, postgres] take care, _repo is None when backuping postgres test db, crashing database generation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7896
diff changeset
   657
            # during postgres database initialization, there is no repo set here.
89fcaca0bca0 [testlib, postgres] take care, _repo is None when backuping postgres test db, crashing database generation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7896
diff changeset
   658
            assert self._repo is None
89fcaca0bca0 [testlib, postgres] take care, _repo is None when backuping postgres test db, crashing database generation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7896
diff changeset
   659
            #self._repo.turn_repo_off()
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   660
            createdb(self.helper, self.system_source, self.dbcnx, self.cursor, template=orig_name)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   661
            self.dbcnx.commit()
8175
89fcaca0bca0 [testlib, postgres] take care, _repo is None when backuping postgres test db, crashing database generation
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7896
diff changeset
   662
            #self._repo.turn_repo_on()
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   663
            return backup_name
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   664
        finally:
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   665
            self.system_source['db-name'] = orig_name
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   666
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   667
    def _restore_database(self, backup_coordinates, config):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   668
        from cubicweb.server.serverctl import createdb
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   669
        """Actual restore of the current database.
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   670
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   671
        Use the value tostored in db_cache as input """
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   672
        self._drop(self.dbname)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   673
        createdb(self.helper, self.system_source, self.dbcnx, self.cursor,
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   674
                 template=backup_coordinates)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   675
        self.dbcnx.commit()
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   676
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   677
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1016
diff changeset
   678
5754
51179e0bb250 [test] support for test on postgres database using the same mecanism as sqlite: one template database generated when necessary + actual test database created from the template
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5696
diff changeset
   679
### sqlserver2005 test database handling #######################################
5166
1e96d01728c4 enable live test against sqlserver 2005 database
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 5043
diff changeset
   680
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   681
class SQLServerTestDataBaseHandler(TestDataBaseHandler):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   682
    DRIVER = 'sqlserver'
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   683
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   684
    # XXX complete me
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   685
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   686
    def init_test_database(self):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   687
        """initialize a fresh sqlserver databse used for testing purpose"""
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   688
        if self.config.init_repository:
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   689
            from cubicweb.server import init_repository
7220
eb0f5f46138f [testlib] fix typos / NameErrors in devtools/__init__.py
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7217
diff changeset
   690
            init_repository(self.config, interactive=False, drop=True)
5212
a545eb9add6f [testlib] fix dummy bug in reset_test_database(): s/if/elif
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 5210
diff changeset
   691
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2732
diff changeset
   692
### sqlite test database handling ##############################################
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2732
diff changeset
   693
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   694
class SQLiteTestDataBaseHandler(TestDataBaseHandler):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   695
    DRIVER = 'sqlite'
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   696
7722
fb231d62adda [devtool] Make the sqlite database used for test execution process specific (closes #1230401)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7536
diff changeset
   697
    __TMPDB = set()
fb231d62adda [devtool] Make the sqlite database used for test execution process specific (closes #1230401)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7536
diff changeset
   698
fb231d62adda [devtool] Make the sqlite database used for test execution process specific (closes #1230401)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7536
diff changeset
   699
    @classmethod
fb231d62adda [devtool] Make the sqlite database used for test execution process specific (closes #1230401)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7536
diff changeset
   700
    def _cleanup_all_tmpdb(cls):
fb231d62adda [devtool] Make the sqlite database used for test execution process specific (closes #1230401)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7536
diff changeset
   701
        for dbpath in cls.__TMPDB:
fb231d62adda [devtool] Make the sqlite database used for test execution process specific (closes #1230401)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7536
diff changeset
   702
            cls._cleanup_database(dbpath)
fb231d62adda [devtool] Make the sqlite database used for test execution process specific (closes #1230401)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7536
diff changeset
   703
fb231d62adda [devtool] Make the sqlite database used for test execution process specific (closes #1230401)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7536
diff changeset
   704
fb231d62adda [devtool] Make the sqlite database used for test execution process specific (closes #1230401)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7536
diff changeset
   705
fb231d62adda [devtool] Make the sqlite database used for test execution process specific (closes #1230401)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7536
diff changeset
   706
    def __init__(self, *args, **kwargs):
fb231d62adda [devtool] Make the sqlite database used for test execution process specific (closes #1230401)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7536
diff changeset
   707
        super(SQLiteTestDataBaseHandler, self).__init__(*args, **kwargs)
fb231d62adda [devtool] Make the sqlite database used for test execution process specific (closes #1230401)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7536
diff changeset
   708
        # use a dedicated base for each process.
fb231d62adda [devtool] Make the sqlite database used for test execution process specific (closes #1230401)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7536
diff changeset
   709
        if 'global-db-name' not in self.system_source:
fb231d62adda [devtool] Make the sqlite database used for test execution process specific (closes #1230401)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7536
diff changeset
   710
            self.system_source['global-db-name'] = self.system_source['db-name']
fb231d62adda [devtool] Make the sqlite database used for test execution process specific (closes #1230401)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7536
diff changeset
   711
            process_db = self.system_source['db-name'] + str(os.getpid())
fb231d62adda [devtool] Make the sqlite database used for test execution process specific (closes #1230401)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7536
diff changeset
   712
            self.system_source['db-name'] = process_db
7765
6f6253e44bdd devtools: Fix cleanup of temporary database (closes #1908656)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7722
diff changeset
   713
        process_db = self.absolute_dbfile() # update db-name to absolute path
6f6253e44bdd devtools: Fix cleanup of temporary database (closes #1908656)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7722
diff changeset
   714
        self.__TMPDB.add(process_db)
7722
fb231d62adda [devtool] Make the sqlite database used for test execution process specific (closes #1230401)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7536
diff changeset
   715
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   716
    @staticmethod
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   717
    def _cleanup_database(dbfile):
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2732
diff changeset
   718
        try:
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   719
            os.remove(dbfile)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   720
            os.remove('%s-journal' % dbfile)
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2732
diff changeset
   721
        except OSError:
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2732
diff changeset
   722
            pass
1802
d628defebc17 delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1016
diff changeset
   723
7722
fb231d62adda [devtool] Make the sqlite database used for test execution process specific (closes #1230401)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7536
diff changeset
   724
    @property
fb231d62adda [devtool] Make the sqlite database used for test execution process specific (closes #1230401)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7536
diff changeset
   725
    def dbname(self):
fb231d62adda [devtool] Make the sqlite database used for test execution process specific (closes #1230401)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7536
diff changeset
   726
        return self.system_source['global-db-name']
fb231d62adda [devtool] Make the sqlite database used for test execution process specific (closes #1230401)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7536
diff changeset
   727
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   728
    def absolute_dbfile(self):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   729
        """absolute path of current database file"""
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   730
        dbfile = join(self._ensure_test_backup_db_dir(),
9460
a2a0bc984863 [config] cleanup/refactor server sources file values handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9456
diff changeset
   731
                      self.system_source['db-name'])
a2a0bc984863 [config] cleanup/refactor server sources file values handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9456
diff changeset
   732
        self.system_source['db-name'] = dbfile
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   733
        return dbfile
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   734
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   735
    def process_cache_entry(self, directory, dbname, db_id, entry):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   736
        return entry.get('sqlite')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   737
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   738
    def _backup_database(self, db_id=DEFAULT_EMPTY_DB_ID):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   739
        # XXX remove database file if it exists ???
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   740
        dbfile = self.absolute_dbfile()
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   741
        backup_file = self.absolute_backup_file(db_id, 'sqlite')
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   742
        shutil.copy(dbfile, backup_file)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   743
        # Usefull to debug WHO write a database
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   744
        # backup_stack = self.absolute_backup_file(db_id, '.stack')
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   745
        #with open(backup_stack, 'w') as backup_stack_file:
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   746
        #    import traceback
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   747
        #    traceback.print_stack(file=backup_stack_file)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   748
        return backup_file
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   749
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   750
    def _new_repo(self, config):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   751
        repo = super(SQLiteTestDataBaseHandler, self)._new_repo(config)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   752
        install_sqlite_patch(repo.querier)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   753
        return repo
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   754
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   755
    def _restore_database(self, backup_coordinates, _config):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   756
        # remove database file if it exists ?
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   757
        dbfile = self.absolute_dbfile()
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   758
        self._cleanup_database(dbfile)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   759
        shutil.copy(backup_coordinates, dbfile)
8543
b7c9443d8625 minor cleanups/typos
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8306
diff changeset
   760
        self.get_repo()
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   761
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   762
    def init_test_database(self):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   763
        """initialize a fresh sqlite databse used for testing purpose"""
2773
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2732
diff changeset
   764
        # initialize the database
b2530e3e0afb [testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2732
diff changeset
   765
        from cubicweb.server import init_repository
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   766
        self._cleanup_database(self.absolute_dbfile())
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   767
        init_repository(self.config, interactive=False)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   768
7722
fb231d62adda [devtool] Make the sqlite database used for test execution process specific (closes #1230401)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7536
diff changeset
   769
import atexit
fb231d62adda [devtool] Make the sqlite database used for test execution process specific (closes #1230401)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7536
diff changeset
   770
atexit.register(SQLiteTestDataBaseHandler._cleanup_all_tmpdb)
9498
a76ac18f09c4 [devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents: 9460
diff changeset
   771
atexit.register(PostgresTestDataBaseHandler.killall)
7722
fb231d62adda [devtool] Make the sqlite database used for test execution process specific (closes #1230401)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7536
diff changeset
   772
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   773
2732
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2657
diff changeset
   774
def install_sqlite_patch(querier):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   775
    """This patch hotfixes the following sqlite bug :
298
3e6d32667140 [doc] Fix docstring indentation.
Sandrine Ribeau <sandrine.ribeau@logilab.fr>
parents: 0
diff changeset
   776
       - http://www.sqlite.org/cvstrac/tktview?tn=1327,33
3e6d32667140 [doc] Fix docstring indentation.
Sandrine Ribeau <sandrine.ribeau@logilab.fr>
parents: 0
diff changeset
   777
       (some dates are returned as strings rather thant date objects)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   778
    """
937
491dbd818f9b avoid patching if already done
sylvain.thenault@logilab.fr
parents: 298
diff changeset
   779
    if hasattr(querier.__class__, '_devtools_sqlite_patched'):
491dbd818f9b avoid patching if already done
sylvain.thenault@logilab.fr
parents: 298
diff changeset
   780
        return # already monkey patched
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   781
    def wrap_execute(base_execute):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   782
        def new_execute(*args, **kwargs):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   783
            rset = base_execute(*args, **kwargs)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   784
            if rset.description:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   785
                found_date = False
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   786
                for row, rowdesc in zip(rset, rset.description):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   787
                    for cellindex, (value, vtype) in enumerate(zip(row, rowdesc)):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   788
                        if vtype in ('Date', 'Datetime') and type(value) is unicode:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   789
                            found_date = True
1016
26387b836099 use datetime instead of mx.DateTime
sylvain.thenault@logilab.fr
parents: 937
diff changeset
   790
                            value = value.rsplit('.', 1)[0]
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   791
                            try:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   792
                                row[cellindex] = strptime(value, '%Y-%m-%d %H:%M:%S')
7815
2a164a9cf81c [exceptions] stop catching any exception in various places (closes #1942716)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7765
diff changeset
   793
                            except Exception:
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   794
                                row[cellindex] = strptime(value, '%Y-%m-%d')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   795
                        if vtype == 'Time' and type(value) is unicode:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   796
                            found_date = True
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   797
                            try:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   798
                                row[cellindex] = strptime(value, '%H:%M:%S')
7815
2a164a9cf81c [exceptions] stop catching any exception in various places (closes #1942716)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7765
diff changeset
   799
                            except Exception:
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   800
                                # DateTime used as Time?
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   801
                                row[cellindex] = strptime(value, '%Y-%m-%d %H:%M:%S')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   802
                        if vtype == 'Interval' and type(value) is int:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   803
                            found_date = True
1016
26387b836099 use datetime instead of mx.DateTime
sylvain.thenault@logilab.fr
parents: 937
diff changeset
   804
                            row[cellindex] = timedelta(0, value, 0) # XXX value is in number of seconds?
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   805
                    if not found_date:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   806
                        break
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   807
            return rset
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   808
        return new_execute
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   809
    querier.__class__.execute = wrap_execute(querier.__class__.execute)
937
491dbd818f9b avoid patching if already done
sylvain.thenault@logilab.fr
parents: 298
diff changeset
   810
    querier.__class__._devtools_sqlite_patched = True
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   811
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   812
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   813
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   814
HANDLERS = {}
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   815
7090
d9e6e79e023a [testlib] require explicite overwriting of TestDataBaseHandler.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7078
diff changeset
   816
def register_handler(handlerkls, overwrite=False):
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   817
    assert handlerkls is not None
7090
d9e6e79e023a [testlib] require explicite overwriting of TestDataBaseHandler.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7078
diff changeset
   818
    if overwrite or handlerkls.DRIVER not in HANDLERS:
d9e6e79e023a [testlib] require explicite overwriting of TestDataBaseHandler.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7078
diff changeset
   819
        HANDLERS[handlerkls.DRIVER] = handlerkls
d9e6e79e023a [testlib] require explicite overwriting of TestDataBaseHandler.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7078
diff changeset
   820
    else:
7093
dccc22c60473 fix stupid typo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7090
diff changeset
   821
        msg = "%s: Handler already exists use overwrite if it's intended\n"\
7090
d9e6e79e023a [testlib] require explicite overwriting of TestDataBaseHandler.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7078
diff changeset
   822
              "(existing handler class is %r)"
d9e6e79e023a [testlib] require explicite overwriting of TestDataBaseHandler.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 7078
diff changeset
   823
        raise ValueError(msg % (handlerkls.DRIVER, HANDLERS[handlerkls.DRIVER]))
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   824
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   825
register_handler(PostgresTestDataBaseHandler)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   826
register_handler(SQLiteTestDataBaseHandler)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   827
register_handler(SQLServerTestDataBaseHandler)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   828
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   829
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   830
class HCache(object):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   831
    """Handler cache object: store database handler for a given configuration.
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   832
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   833
    We only keep one repo in cache to prevent too much objects to stay alive
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   834
    (database handler holds a reference to a repository). As at the moment a new
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   835
    handler is created for each TestCase class and all test methods are executed
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   836
    sequentialy whithin this class, there should not have more cache miss that
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   837
    if we had a wider cache as once a Handler stop being used it won't be used
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   838
    again.
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   839
    """
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   840
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   841
    def __init__(self):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   842
        self.config = None
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   843
        self.handler = None
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   844
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   845
    def get(self, config):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   846
        if config is self.config:
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   847
            return self.handler
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   848
        else:
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   849
            return None
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   850
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   851
    def set(self, config, handler):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   852
        self.config = config
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   853
        self.handler = handler
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   854
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   855
HCACHE = HCache()
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   856
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   857
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   858
# XXX a class method on Test ?
9564
e2d5b0712974 [test] when the config change, we should cleanup sys.path and sys.modules. Closes #3634164
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9337
diff changeset
   859
e2d5b0712974 [test] when the config change, we should cleanup sys.path and sys.modules. Closes #3634164
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9337
diff changeset
   860
_CONFIG = None
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   861
def get_test_db_handler(config):
9564
e2d5b0712974 [test] when the config change, we should cleanup sys.path and sys.modules. Closes #3634164
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9337
diff changeset
   862
    global _CONFIG
e2d5b0712974 [test] when the config change, we should cleanup sys.path and sys.modules. Closes #3634164
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9337
diff changeset
   863
    if _CONFIG is not None and config is not _CONFIG:
e2d5b0712974 [test] when the config change, we should cleanup sys.path and sys.modules. Closes #3634164
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9337
diff changeset
   864
        from logilab.common.modutils import cleanup_sys_modules
e2d5b0712974 [test] when the config change, we should cleanup sys.path and sys.modules. Closes #3634164
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9337
diff changeset
   865
        # cleanup all dynamically loaded modules and everything in the instance
e2d5b0712974 [test] when the config change, we should cleanup sys.path and sys.modules. Closes #3634164
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9337
diff changeset
   866
        # directory
e2d5b0712974 [test] when the config change, we should cleanup sys.path and sys.modules. Closes #3634164
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9337
diff changeset
   867
        apphome = _CONFIG.apphome
e2d5b0712974 [test] when the config change, we should cleanup sys.path and sys.modules. Closes #3634164
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9337
diff changeset
   868
        if apphome: # may be unset in tests
e2d5b0712974 [test] when the config change, we should cleanup sys.path and sys.modules. Closes #3634164
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9337
diff changeset
   869
            cleanup_sys_modules([apphome])
e2d5b0712974 [test] when the config change, we should cleanup sys.path and sys.modules. Closes #3634164
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9337
diff changeset
   870
        # also cleanup sys.path
e2d5b0712974 [test] when the config change, we should cleanup sys.path and sys.modules. Closes #3634164
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9337
diff changeset
   871
        if apphome in sys.path:
e2d5b0712974 [test] when the config change, we should cleanup sys.path and sys.modules. Closes #3634164
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9337
diff changeset
   872
            sys.path.remove(apphome)
e2d5b0712974 [test] when the config change, we should cleanup sys.path and sys.modules. Closes #3634164
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9337
diff changeset
   873
    _CONFIG = config
e2d5b0712974 [test] when the config change, we should cleanup sys.path and sys.modules. Closes #3634164
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9337
diff changeset
   874
    config.adjust_sys_path()
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   875
    handler = HCACHE.get(config)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   876
    if handler is not None:
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   877
        return handler
9460
a2a0bc984863 [config] cleanup/refactor server sources file values handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9456
diff changeset
   878
    driver = config.system_source_config['db-driver']
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   879
    key = (driver, config)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   880
    handlerkls = HANDLERS.get(driver, None)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   881
    if handlerkls is not None:
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   882
        handler = handlerkls(config)
7214
70538ea2532d [testlib] fix readlb config handling, avoid systematic recreation of db with postgres (closes #1618089)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7129
diff changeset
   883
        if config.skip_db_create_and_restore:
70538ea2532d [testlib] fix readlb config handling, avoid systematic recreation of db with postgres (closes #1618089)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7129
diff changeset
   884
            handler = NoCreateDropDatabaseHandler(handler)
7078
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   885
        HCACHE.set(config, handler)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   886
        return handler
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   887
    else:
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   888
        raise ValueError('no initialization function for driver %r' % driver)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   889
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   890
### compatibility layer ##############################################
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   891
from logilab.common.deprecation import deprecated
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   892
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   893
@deprecated("please use the new DatabaseHandler mecanism")
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   894
def init_test_database(config=None, configdir='data', apphome=None):
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   895
    """init a test database for a specific driver"""
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   896
    if config is None:
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   897
        config = TestServerConfiguration(apphome=apphome)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   898
    handler = get_test_db_handler(config)
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   899
    handler.build_db_cache()
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   900
    return handler.get_repo_and_cnx()
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   901
bad26a22fe29 [test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 7071
diff changeset
   902