author | Julien Cristau <julien.cristau@logilab.fr> |
Wed, 09 Sep 2015 09:37:14 +0200 | |
changeset 10654 | d6d9913753d2 |
parent 10651 | 9ca33768473c |
child 10662 | 10942ed172de |
permissions | -rw-r--r-- |
9790
0872ac2a1db0
[testlib] call init_config once the config has been properly bootstraped
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
9789
diff
changeset
|
1 |
# copyright 2003-2014 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""" |
10589
7c23b7de2b8d
[py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents:
10588
diff
changeset
|
19 |
from __future__ import print_function |
0 | 20 |
|
21 |
__docformat__ = "restructuredtext en" |
|
22 |
||
23 |
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
|
24 |
import sys |
9886
1b26289217a3
[devtools] improve error message when postgresql tools are missing
Alain Leufroy <alain.leufroy@logilab.fr>
parents:
9864
diff
changeset
|
25 |
import errno |
0 | 26 |
import logging |
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
27 |
import shutil |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
28 |
import glob |
9498
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 |
10175
2659f8529a43
[devtools] Make PostgresTestDataBaseHandler multi-use friendly
Christophe de Vienne <christophe@unlish.com>
parents:
10064
diff
changeset
|
35 |
from os.path import (abspath, realpath, 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 | 37 |
|
10622
3cc6154b94a3
[py3k] unicode → six.text_type
Rémi Cardona <remi.cardona@logilab.fr>
parents:
10602
diff
changeset
|
38 |
from six import text_type |
10602
4845012cfc8e
[py3k] import 'pickle' using six.moves
Rémi Cardona <remi.cardona@logilab.fr>
parents:
10595
diff
changeset
|
39 |
from six.moves import cPickle as pickle |
4845012cfc8e
[py3k] import 'pickle' using six.moves
Rémi Cardona <remi.cardona@logilab.fr>
parents:
10595
diff
changeset
|
40 |
|
4466
8b0ca7904820
moved generic datetime manipulation function to lgc
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
4436
diff
changeset
|
41 |
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
|
42 |
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
|
43 |
|
8930
6a02be304486
remove unused import
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
8694
diff
changeset
|
44 |
from cubicweb import ExecutionError, BadConnectionId |
6a02be304486
remove unused import
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
8694
diff
changeset
|
45 |
from cubicweb import schema, cwconfig |
0 | 46 |
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
|
47 |
from cubicweb.etwist.twconfig import WebConfigurationBase |
0 | 48 |
|
2773
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2732
diff
changeset
|
49 |
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
|
50 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2732
diff
changeset
|
51 |
# 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
|
52 |
|
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
|
53 |
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
|
54 |
| 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
|
55 |
| 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
|
56 |
| 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
|
57 |
) |
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 |
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
|
59 |
| 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
|
60 |
| 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
|
61 |
| 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
|
62 |
| 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
|
63 |
| 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
|
64 |
)) |
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
|
65 |
) |
2773
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2732
diff
changeset
|
66 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2732
diff
changeset
|
67 |
# 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
|
68 |
|
0 | 69 |
# validators are used to validate (XML, DTD, whatever) view's content |
70 |
# validators availables are : |
|
71 |
# 'dtd' : validates XML + declared DTD |
|
72 |
# 'xml' : guarantees XML is well formed |
|
73 |
# 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
|
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 |
# {'vid': validator} |
0 | 76 |
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
|
77 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2732
diff
changeset
|
78 |
|
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2732
diff
changeset
|
79 |
# 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
|
80 |
|
0 | 81 |
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
|
82 |
|
0 | 83 |
DEFAULT_SOURCES = {'system': {'adapter' : 'native', |
84 |
'db-encoding' : 'UTF-8', #'ISO-8859-1', |
|
85 |
'db-user' : u'admin', |
|
86 |
'db-password' : 'gingkow', |
|
87 |
'db-name' : 'tmpdb', |
|
88 |
'db-driver' : 'sqlite', |
|
89 |
'db-host' : None, |
|
90 |
}, |
|
91 |
'admin' : {'login': u'admin', |
|
92 |
'password': u'gingkow', |
|
93 |
}, |
|
94 |
} |
|
9498
a76ac18f09c4
[devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents:
9460
diff
changeset
|
95 |
DEFAULT_PSQL_SOURCES = DEFAULT_SOURCES.copy() |
a76ac18f09c4
[devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents:
9460
diff
changeset
|
96 |
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
|
97 |
DEFAULT_PSQL_SOURCES['system']['db-driver'] = 'postgres' |
10622
3cc6154b94a3
[py3k] unicode → six.text_type
Rémi Cardona <remi.cardona@logilab.fr>
parents:
10602
diff
changeset
|
98 |
DEFAULT_PSQL_SOURCES['system']['db-user'] = text_type(getpass.getuser()) |
9498
a76ac18f09c4
[devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents:
9460
diff
changeset
|
99 |
DEFAULT_PSQL_SOURCES['system']['db-password'] = None |
0 | 100 |
|
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
101 |
def turn_repo_off(repo): |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
102 |
""" 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
|
103 |
off: |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
104 |
* 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
|
105 |
* cnxsets are closed |
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
106 |
* system source is shutdown |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
107 |
""" |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
108 |
if not repo._needs_refresh: |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
109 |
for sessionid in list(repo._sessions): |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
110 |
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
|
111 |
%sessionid, RuntimeWarning) |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
112 |
try: |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
113 |
repo.close(sessionid) |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
114 |
except BadConnectionId: #this is strange ? thread issue ? |
10589
7c23b7de2b8d
[py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents:
10588
diff
changeset
|
115 |
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
|
116 |
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
|
117 |
cnxset.close(True) |
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
118 |
repo.system_source.shutdown() |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
119 |
repo._needs_refresh = True |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
120 |
repo._has_started = False |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
121 |
|
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
|
122 |
|
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
123 |
def turn_repo_on(repo): |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
124 |
"""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
|
125 |
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
|
126 |
* cnxsets are connected |
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
127 |
* cache are cleared |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
128 |
""" |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
129 |
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
|
130 |
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
|
131 |
cnxset.reconnect() |
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
132 |
repo._type_source_cache = {} |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
133 |
repo._extid_cache = {} |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
134 |
repo.querier._rql_cache = {} |
9456
a79e88aad555
[multi-sources-removal] Kill repo.sources
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
9402
diff
changeset
|
135 |
repo.system_source.reset_caches() |
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
136 |
repo._needs_refresh = False |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
137 |
|
2773
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2732
diff
changeset
|
138 |
|
0 | 139 |
class TestServerConfiguration(ServerConfiguration): |
140 |
mode = 'test' |
|
2476
1294a6bdf3bf
application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1978
diff
changeset
|
141 |
read_instance_schema = False |
0 | 142 |
init_repository = True |
7239
078cfa8a5187
fix server/test/unittest_checkintegrity (failing since 70538ea2532d)
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
7220
diff
changeset
|
143 |
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
|
144 |
default_sources = DEFAULT_SOURCES |
a76ac18f09c4
[devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents:
9460
diff
changeset
|
145 |
|
7065
6a6ea9966931
[testlib] simplify code by using a class attribute
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7056
diff
changeset
|
146 |
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
|
147 |
# 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
|
148 |
if apphome is None: |
6593
0fd8792c9c8a
[testlib] self.appid not yet defined
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6585
diff
changeset
|
149 |
if exists(appid): |
0fd8792c9c8a
[testlib] self.appid not yet defined
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6585
diff
changeset
|
150 |
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
|
151 |
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
|
152 |
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
|
153 |
self._apphome = apphome |
0 | 154 |
ServerConfiguration.__init__(self, appid) |
155 |
self.init_log(log_threshold, force=True) |
|
156 |
# need this, usually triggered by cubicweb-ctl |
|
157 |
self.load_cwctl_plugins() |
|
158 |
||
7071
db7608cb32bc
[devtools] fix anonymous user handling in test classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7065
diff
changeset
|
159 |
# 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
|
160 |
# 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
|
161 |
anonymous_credential = ('anon', 'anon') |
db7608cb32bc
[devtools] fix anonymous user handling in test classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7065
diff
changeset
|
162 |
|
db7608cb32bc
[devtools] fix anonymous user handling in test classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7065
diff
changeset
|
163 |
def anonymous_user(self): |
db7608cb32bc
[devtools] fix anonymous user handling in test classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7065
diff
changeset
|
164 |
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
|
165 |
return None, None |
db7608cb32bc
[devtools] fix anonymous user handling in test classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7065
diff
changeset
|
166 |
return self.anonymous_credential |
db7608cb32bc
[devtools] fix anonymous user handling in test classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7065
diff
changeset
|
167 |
|
db7608cb32bc
[devtools] fix anonymous user handling in test classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7065
diff
changeset
|
168 |
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
|
169 |
if allowed: |
db7608cb32bc
[devtools] fix anonymous user handling in test classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7065
diff
changeset
|
170 |
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
|
171 |
else: |
db7608cb32bc
[devtools] fix anonymous user handling in test classes
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7065
diff
changeset
|
172 |
self.anonymous_credential = None |
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1016
diff
changeset
|
173 |
|
0 | 174 |
@property |
175 |
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
|
176 |
return self._apphome |
0 | 177 |
appdatahome = apphome |
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1016
diff
changeset
|
178 |
|
10474
1dcc52f5e340
[cwctl] allow overriding config settings from the command line (closes #5557656)
David Douard <david.douard@logilab.fr>
parents:
10472
diff
changeset
|
179 |
def load_configuration(self, **kw): |
1dcc52f5e340
[cwctl] allow overriding config settings from the command line (closes #5557656)
David Douard <david.douard@logilab.fr>
parents:
10472
diff
changeset
|
180 |
super(TestServerConfiguration, self).load_configuration(**kw) |
4913
083b4d454192
server/web api for accessing to deleted_entites
Katia Saurfelt <katia.saurfelt@logilab.fr>
parents:
4761
diff
changeset
|
181 |
# no undo support in tests |
8306
4da49700b06a
[config, undo] Fix undo-support option migration
Anthony Truchet <anthony.truchet@logilab.fr>
parents:
8265
diff
changeset
|
182 |
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
|
183 |
|
0 | 184 |
def main_config_file(self): |
2476
1294a6bdf3bf
application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
1978
diff
changeset
|
185 |
"""return instance's control configuration file""" |
0 | 186 |
return join(self.apphome, '%s.conf' % self.name) |
187 |
||
188 |
def bootstrap_cubes(self): |
|
189 |
try: |
|
190 |
super(TestServerConfiguration, self).bootstrap_cubes() |
|
191 |
except IOError: |
|
192 |
# no cubes |
|
193 |
self.init_cubes( () ) |
|
194 |
||
195 |
sourcefile = None |
|
196 |
def sources_file(self): |
|
197 |
"""define in subclasses self.sourcefile if necessary""" |
|
198 |
if self.sourcefile: |
|
10589
7c23b7de2b8d
[py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents:
10588
diff
changeset
|
199 |
print('Reading sources from', self.sourcefile) |
0 | 200 |
sourcefile = self.sourcefile |
201 |
if not isabs(sourcefile): |
|
202 |
sourcefile = join(self.apphome, sourcefile) |
|
203 |
else: |
|
204 |
sourcefile = super(TestServerConfiguration, self).sources_file() |
|
205 |
return sourcefile |
|
206 |
||
9460
a2a0bc984863
[config] cleanup/refactor server sources file values handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
9456
diff
changeset
|
207 |
def read_sources_file(self): |
0 | 208 |
"""By default, we run tests with the sqlite DB backend. One may use its |
209 |
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
|
210 |
directory from which tests are launched or by specifying an alternative |
0 | 211 |
sources file using self.sourcefile. |
212 |
""" |
|
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
|
213 |
try: |
9460
a2a0bc984863
[config] cleanup/refactor server sources file values handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
9456
diff
changeset
|
214 |
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
|
215 |
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
|
216 |
sources = {} |
0 | 217 |
if not sources: |
9498
a76ac18f09c4
[devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents:
9460
diff
changeset
|
218 |
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
|
219 |
if 'admin' not in sources: |
9498
a76ac18f09c4
[devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents:
9460
diff
changeset
|
220 |
sources['admin'] = self.default_sources['admin'] |
0 | 221 |
return sources |
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1016
diff
changeset
|
222 |
|
6441
adbce42ff1b5
TestServerConfig needs default_base_url
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6424
diff
changeset
|
223 |
# 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
|
224 |
# config |
adbce42ff1b5
TestServerConfig needs default_base_url
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6424
diff
changeset
|
225 |
|
adbce42ff1b5
TestServerConfig needs default_base_url
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6424
diff
changeset
|
226 |
def default_base_url(self): |
adbce42ff1b5
TestServerConfig needs default_base_url
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6424
diff
changeset
|
227 |
return BASE_URL |
adbce42ff1b5
TestServerConfig needs default_base_url
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
6424
diff
changeset
|
228 |
|
0 | 229 |
|
9252
01bca75ee8bd
[devtools,etwist] rename TwistedConfiguration to WebConfigurationBase (follows #2919310)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9235
diff
changeset
|
230 |
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
|
231 |
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
|
232 |
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
|
233 |
+ WebConfigurationBase.options) |
01bca75ee8bd
[devtools,etwist] rename TwistedConfiguration to WebConfigurationBase (follows #2919310)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9235
diff
changeset
|
234 |
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
|
235 |
cube_appobject_path = TestServerConfiguration.cube_appobject_path | WebConfigurationBase.cube_appobject_path |
0 | 236 |
|
237 |
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
|
238 |
return self.cw_languages() |
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1016
diff
changeset
|
239 |
|
0 | 240 |
|
6424
f443a2b8a5c7
[devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
6315
diff
changeset
|
241 |
# XXX merge with BaseApptestConfiguration ? |
0 | 242 |
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
|
243 |
# `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
|
244 |
# 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
|
245 |
# 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
|
246 |
# 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
|
247 |
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
|
248 |
|
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
|
249 |
def __init__(self, appid, apphome=None, |
10231
fdcc500002ef
[devtools] don't hide warnings and errors during tests
Julien Cristau <julien.cristau@logilab.fr>
parents:
10175
diff
changeset
|
250 |
log_threshold=logging.WARNING, sourcefile=None): |
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
|
251 |
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
|
252 |
log_threshold=log_threshold) |
0 | 253 |
self.init_repository = sourcefile is None |
254 |
self.sourcefile = sourcefile |
|
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1016
diff
changeset
|
255 |
|
6424
f443a2b8a5c7
[devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
6315
diff
changeset
|
256 |
|
9498
a76ac18f09c4
[devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents:
9460
diff
changeset
|
257 |
class PostgresApptestConfiguration(ApptestConfiguration): |
a76ac18f09c4
[devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents:
9460
diff
changeset
|
258 |
default_sources = DEFAULT_PSQL_SOURCES |
a76ac18f09c4
[devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents:
9460
diff
changeset
|
259 |
|
a76ac18f09c4
[devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents:
9460
diff
changeset
|
260 |
|
6164
ceb6951f9d2f
[devtools] restore ability to test on real databases
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
5754
diff
changeset
|
261 |
class RealDatabaseConfiguration(ApptestConfiguration): |
ceb6951f9d2f
[devtools] restore ability to test on real databases
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
5754
diff
changeset
|
262 |
"""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
|
263 |
|
ceb6951f9d2f
[devtools] restore ability to test on real databases
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
5754
diff
changeset
|
264 |
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
|
265 |
|
ceb6951f9d2f
[devtools] restore ability to test on real databases
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
5754
diff
changeset
|
266 |
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
|
267 |
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
|
268 |
accordingly. |
ceb6951f9d2f
[devtools] restore ability to test on real databases
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
5754
diff
changeset
|
269 |
|
ceb6951f9d2f
[devtools] restore ability to test on real databases
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
5754
diff
changeset
|
270 |
Example usage:: |
ceb6951f9d2f
[devtools] restore ability to test on real databases
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
5754
diff
changeset
|
271 |
|
ceb6951f9d2f
[devtools] restore ability to test on real databases
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
5754
diff
changeset
|
272 |
class MyTests(CubicWebTC): |
7856
51a3fb272bf3
[skeleton] fix new class configuration in realdbtest
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
7815
diff
changeset
|
273 |
_config = RealDatabaseConfiguration('myapp', |
51a3fb272bf3
[skeleton] fix new class configuration in realdbtest
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
7815
diff
changeset
|
274 |
sourcefile='/path/to/sources') |
51a3fb272bf3
[skeleton] fix new class configuration in realdbtest
Julien Jehannet <julien.jehannet@logilab.fr>
parents:
7815
diff
changeset
|
275 |
|
6164
ceb6951f9d2f
[devtools] restore ability to test on real databases
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
5754
diff
changeset
|
276 |
def test_something(self): |
9864
f60a80592224
[webtests] finish to give all self.view(....) a req=req parameter
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9790
diff
changeset
|
277 |
with self.admin_access.web_request() as req: |
f60a80592224
[webtests] finish to give all self.view(....) a req=req parameter
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9790
diff
changeset
|
278 |
rset = req.execute('Any X WHERE X is CWUser') |
f60a80592224
[webtests] finish to give all self.view(....) a req=req parameter
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9790
diff
changeset
|
279 |
self.view('foaf', rset, req=req) |
6164
ceb6951f9d2f
[devtools] restore ability to test on real databases
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
5754
diff
changeset
|
280 |
|
ceb6951f9d2f
[devtools] restore ability to test on real databases
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
5754
diff
changeset
|
281 |
""" |
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
|
282 |
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
|
283 |
read_instance_schema = True # read schema from database |
0 | 284 |
|
2773
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2732
diff
changeset
|
285 |
# test database handling ####################################################### |
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1016
diff
changeset
|
286 |
|
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
287 |
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
|
288 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
289 |
class TestDataBaseHandler(object): |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
290 |
DRIVER = None |
10064
91a8f355c082
[devtools] Avoid db_cache collisions and mis-loading
Christophe de Vienne <christophe@unlish.com>
parents:
10063
diff
changeset
|
291 |
|
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
292 |
db_cache = {} |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
293 |
explored_glob = set() |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
294 |
|
9790
0872ac2a1db0
[testlib] call init_config once the config has been properly bootstraped
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
9789
diff
changeset
|
295 |
def __init__(self, config, init_config=None): |
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
296 |
self.config = config |
9790
0872ac2a1db0
[testlib] call init_config once the config has been properly bootstraped
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
9789
diff
changeset
|
297 |
self.init_config = init_config |
7078
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 |
|
10472
7dd84b69c7d4
[devtools] avoid warning about source['global-db-name']
Julien Cristau <julien.cristau@logilab.fr>
parents:
10440
diff
changeset
|
302 |
# some handlers want to store info here, avoid a warning |
7dd84b69c7d4
[devtools] avoid warning about source['global-db-name']
Julien Cristau <julien.cristau@logilab.fr>
parents:
10440
diff
changeset
|
303 |
from cubicweb.server.sources.native import NativeSQLSource |
7dd84b69c7d4
[devtools] avoid warning about source['global-db-name']
Julien Cristau <julien.cristau@logilab.fr>
parents:
10440
diff
changeset
|
304 |
NativeSQLSource.options += ( |
7dd84b69c7d4
[devtools] avoid warning about source['global-db-name']
Julien Cristau <julien.cristau@logilab.fr>
parents:
10440
diff
changeset
|
305 |
('global-db-name', |
7dd84b69c7d4
[devtools] avoid warning about source['global-db-name']
Julien Cristau <julien.cristau@logilab.fr>
parents:
10440
diff
changeset
|
306 |
{'type': 'string', 'help': 'for internal use only' |
7dd84b69c7d4
[devtools] avoid warning about source['global-db-name']
Julien Cristau <julien.cristau@logilab.fr>
parents:
10440
diff
changeset
|
307 |
}), |
7dd84b69c7d4
[devtools] avoid warning about source['global-db-name']
Julien Cristau <julien.cristau@logilab.fr>
parents:
10440
diff
changeset
|
308 |
) |
7dd84b69c7d4
[devtools] avoid warning about source['global-db-name']
Julien Cristau <julien.cristau@logilab.fr>
parents:
10440
diff
changeset
|
309 |
|
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
310 |
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
|
311 |
"""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
|
312 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
313 |
The function create it if necessary""" |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
314 |
backupdir = join(self.config.apphome, 'database') |
9235
3eb8d65824f5
[devtools] fix race when creating backupdir
Julien Cristau <julien.cristau@logilab.fr>
parents:
8930
diff
changeset
|
315 |
try: |
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
316 |
os.makedirs(backupdir) |
9235
3eb8d65824f5
[devtools] fix race when creating backupdir
Julien Cristau <julien.cristau@logilab.fr>
parents:
8930
diff
changeset
|
317 |
except: |
3eb8d65824f5
[devtools] fix race when creating backupdir
Julien Cristau <julien.cristau@logilab.fr>
parents:
8930
diff
changeset
|
318 |
if not isdir(backupdir): |
3eb8d65824f5
[devtools] fix race when creating backupdir
Julien Cristau <julien.cristau@logilab.fr>
parents:
8930
diff
changeset
|
319 |
raise |
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
320 |
return backupdir |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
321 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
322 |
def config_path(self, db_id): |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
323 |
"""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
|
324 |
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
|
325 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
326 |
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
|
327 |
"""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
|
328 |
# 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
|
329 |
# 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
|
330 |
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
|
331 |
dbname = basename.replace('-', '_') |
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
332 |
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
|
333 |
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
|
334 |
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
|
335 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
336 |
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
|
337 |
"""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
|
338 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
339 |
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
|
340 |
if dbname is None: |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
341 |
dbname = self.dbname |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
342 |
dbname = os.path.basename(dbname) |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
343 |
dbname = dbname.replace('-', '_') |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
344 |
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
|
345 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
346 |
def backup_database(self, db_id): |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
347 |
"""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
|
348 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
349 |
The config used are also stored.""" |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
350 |
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
|
351 |
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
|
352 |
# 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
|
353 |
# 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
|
354 |
# be propertly restored |
9337
70f6b183085a
[devtools] write db config through a temporary file
Julien Cristau <julien.cristau@logilab.fr>
parents:
9235
diff
changeset
|
355 |
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
|
356 |
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
|
357 |
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
|
358 |
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
|
359 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
360 |
def _backup_database(self, db_id): |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
361 |
"""Actual backup the current database. |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
362 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
363 |
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
|
364 |
raise NotImplementedError() |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
365 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
366 |
def restore_database(self, db_id): |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
367 |
"""Restore a database. |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
368 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
369 |
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
|
370 |
# XXX set a clearer error message ??? |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
371 |
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
|
372 |
# 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
|
373 |
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
|
374 |
# shutdown repo before changing database content |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
375 |
if self._repo is not None: |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
376 |
self._repo.turn_repo_off() |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
377 |
self._restore_database(backup_coordinates, config) |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
378 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
379 |
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
|
380 |
"""Actual restore of the current database. |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
381 |
|
8543
b7c9443d8625
minor cleanups/typos
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8306
diff
changeset
|
382 |
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
|
383 |
raise NotImplementedError() |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
384 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
385 |
def get_repo(self, startup=False): |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
386 |
""" 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
|
387 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
388 |
(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
|
389 |
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
|
390 |
""" |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
391 |
if self._repo is None: |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
392 |
self._repo = self._new_repo(self.config) |
9790
0872ac2a1db0
[testlib] call init_config once the config has been properly bootstraped
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
9789
diff
changeset
|
393 |
# config has now been bootstrapped, call init_config if specified |
0872ac2a1db0
[testlib] call init_config once the config has been properly bootstraped
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
9789
diff
changeset
|
394 |
if self.init_config is not None: |
0872ac2a1db0
[testlib] call init_config once the config has been properly bootstraped
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
9789
diff
changeset
|
395 |
self.init_config(self.config) |
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
396 |
repo = self._repo |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
397 |
repo.turn_repo_on() |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
398 |
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
|
399 |
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
|
400 |
repo._has_started = True |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
401 |
return repo |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
402 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
403 |
def _new_repo(self, config): |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
404 |
"""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
|
405 |
config._cubes = None |
10568
3914388b2d0f
[repoapi, cwconfig] give a convenience method to get a repository from a config
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
10510
diff
changeset
|
406 |
repo = config.repository() |
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
407 |
# extending Repository class |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
408 |
repo._has_started = False |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
409 |
repo._needs_refresh = False |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
410 |
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
|
411 |
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
|
412 |
return repo |
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_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
|
415 |
"""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
|
416 |
from cubicweb.repoapi import connect |
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
417 |
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
|
418 |
sources = self.config.read_sources_file() |
10622
3cc6154b94a3
[py3k] unicode → six.text_type
Rémi Cardona <remi.cardona@logilab.fr>
parents:
10602
diff
changeset
|
419 |
login = text_type(sources['admin']['login']) |
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
420 |
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
|
421 |
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
|
422 |
return cnx |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
423 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
424 |
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
|
425 |
"""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
|
426 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
427 |
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
|
428 |
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
|
429 |
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
|
430 |
establised as admin.""" |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
431 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
432 |
self.restore_database(db_id) |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
433 |
repo = self.get_repo(startup=True) |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
434 |
cnx = self.get_cnx() |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
435 |
return repo, cnx |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
436 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
437 |
@property |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
438 |
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
|
439 |
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
|
440 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
441 |
@property |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
442 |
def dbname(self): |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
443 |
return self.system_source['db-name'] |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
444 |
|
7220
eb0f5f46138f
[testlib] fix typos / NameErrors in devtools/__init__.py
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
7217
diff
changeset
|
445 |
def init_test_database(self): |
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
446 |
"""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
|
447 |
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
|
448 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
449 |
def has_cache(self, db_id): |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
450 |
"""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
|
451 |
cache_glob = self.absolute_backup_file('*', '*') |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
452 |
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
|
453 |
self.discover_cached_db() |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
454 |
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
|
455 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
456 |
def discover_cached_db(self): |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
457 |
"""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
|
458 |
cache_glob = self.absolute_backup_file('*', '*') |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
459 |
directory = os.path.dirname(cache_glob) |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
460 |
entries={} |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
461 |
candidates = glob.glob(cache_glob) |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
462 |
for filepath in candidates: |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
463 |
data = os.path.basename(filepath) |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
464 |
# 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
|
465 |
dbname, data = data.split('-', 1) |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
466 |
db_id, filetype = data.split('.', 1) |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
467 |
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
|
468 |
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
|
469 |
# apply necessary transformation from the driver |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
470 |
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
|
471 |
assert 'config' in entry |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
472 |
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
|
473 |
# 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
|
474 |
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
|
475 |
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
|
476 |
self.explored_glob.add(cache_glob) |
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 |
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
|
479 |
"""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
|
480 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
481 |
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
|
482 |
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
|
483 |
return None |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
484 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
485 |
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
|
486 |
"""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
|
487 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
488 |
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
|
489 |
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
|
490 |
``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
|
491 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
492 |
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
|
493 |
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
|
494 |
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
|
495 |
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
|
496 |
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
|
497 |
else: |
10589
7c23b7de2b8d
[py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents:
10588
diff
changeset
|
498 |
print('Building %s for database %s' % (test_db_id, self.dbname)) |
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
499 |
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
|
500 |
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
|
501 |
repo = self.get_repo(startup=True) |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
502 |
cnx = self.get_cnx() |
9788
47d356ee14d2
[devtools] pre_setup_database should take a connection object
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9679
diff
changeset
|
503 |
with cnx: |
10354
635cfac73d28
[repoapi] fold ClientConnection into Connection
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
10331
diff
changeset
|
504 |
pre_setup_func(cnx, self.config) |
9788
47d356ee14d2
[devtools] pre_setup_database should take a connection object
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
9679
diff
changeset
|
505 |
cnx.commit() |
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
506 |
self.backup_database(test_db_id) |
0 | 507 |
|
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
|
508 |
|
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 |
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
|
510 |
"""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
|
511 |
|
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 |
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
|
513 |
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
|
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 |
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
|
516 |
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
|
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 |
|
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__(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
|
520 |
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
|
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 |
# 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
|
523 |
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
|
524 |
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
|
525 |
|
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 |
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
|
527 |
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
|
528 |
|
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 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
|
530 |
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
|
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 |
# 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
|
533 |
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
|
534 |
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
|
535 |
|
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
|
536 |
|
2773
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2732
diff
changeset
|
537 |
### postgres test database handling ############################################ |
0 | 538 |
|
10439
45e18b4a7466
[devtools] change the way we start/stop postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents:
10438
diff
changeset
|
539 |
def startpgcluster(pyfile): |
10440
eecb7bbb6795
[devtools] Put pg sockets in /tmp
Rémi Cardona <remi.cardona@logilab.fr>
parents:
10439
diff
changeset
|
540 |
"""Start a postgresql cluster next to pyfile""" |
10439
45e18b4a7466
[devtools] change the way we start/stop postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents:
10438
diff
changeset
|
541 |
datadir = join(os.path.dirname(pyfile), 'data', |
45e18b4a7466
[devtools] change the way we start/stop postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents:
10438
diff
changeset
|
542 |
'pgdb-%s' % os.path.splitext(os.path.basename(pyfile))[0]) |
10437
9cddd711419c
[devtools] extract functions to start/stop a postgresql cluster
Julien Cristau <julien.cristau@logilab.fr>
parents:
10354
diff
changeset
|
543 |
if not exists(datadir): |
9cddd711419c
[devtools] extract functions to start/stop a postgresql cluster
Julien Cristau <julien.cristau@logilab.fr>
parents:
10354
diff
changeset
|
544 |
try: |
9cddd711419c
[devtools] extract functions to start/stop a postgresql cluster
Julien Cristau <julien.cristau@logilab.fr>
parents:
10354
diff
changeset
|
545 |
subprocess.check_call(['initdb', '-D', datadir, '-E', 'utf-8', '--locale=C']) |
9cddd711419c
[devtools] extract functions to start/stop a postgresql cluster
Julien Cristau <julien.cristau@logilab.fr>
parents:
10354
diff
changeset
|
546 |
|
10588
fdaa0e4b7eaf
[py3k] except as
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents:
10568
diff
changeset
|
547 |
except OSError as err: |
10437
9cddd711419c
[devtools] extract functions to start/stop a postgresql cluster
Julien Cristau <julien.cristau@logilab.fr>
parents:
10354
diff
changeset
|
548 |
if err.errno == errno.ENOENT: |
9cddd711419c
[devtools] extract functions to start/stop a postgresql cluster
Julien Cristau <julien.cristau@logilab.fr>
parents:
10354
diff
changeset
|
549 |
raise OSError('"initdb" could not be found. ' |
9cddd711419c
[devtools] extract functions to start/stop a postgresql cluster
Julien Cristau <julien.cristau@logilab.fr>
parents:
10354
diff
changeset
|
550 |
'You should add the postgresql bin folder to your PATH ' |
9cddd711419c
[devtools] extract functions to start/stop a postgresql cluster
Julien Cristau <julien.cristau@logilab.fr>
parents:
10354
diff
changeset
|
551 |
'(/usr/lib/postgresql/9.1/bin for example).') |
9cddd711419c
[devtools] extract functions to start/stop a postgresql cluster
Julien Cristau <julien.cristau@logilab.fr>
parents:
10354
diff
changeset
|
552 |
raise |
9cddd711419c
[devtools] extract functions to start/stop a postgresql cluster
Julien Cristau <julien.cristau@logilab.fr>
parents:
10354
diff
changeset
|
553 |
datadir = os.path.abspath(datadir) |
10440
eecb7bbb6795
[devtools] Put pg sockets in /tmp
Rémi Cardona <remi.cardona@logilab.fr>
parents:
10439
diff
changeset
|
554 |
pgport = '5432' |
10437
9cddd711419c
[devtools] extract functions to start/stop a postgresql cluster
Julien Cristau <julien.cristau@logilab.fr>
parents:
10354
diff
changeset
|
555 |
env = os.environ.copy() |
10440
eecb7bbb6795
[devtools] Put pg sockets in /tmp
Rémi Cardona <remi.cardona@logilab.fr>
parents:
10439
diff
changeset
|
556 |
sockdir = tempfile.mkdtemp(prefix='cwpg') |
eecb7bbb6795
[devtools] Put pg sockets in /tmp
Rémi Cardona <remi.cardona@logilab.fr>
parents:
10439
diff
changeset
|
557 |
DEFAULT_PSQL_SOURCES['system']['db-host'] = sockdir |
eecb7bbb6795
[devtools] Put pg sockets in /tmp
Rémi Cardona <remi.cardona@logilab.fr>
parents:
10439
diff
changeset
|
558 |
DEFAULT_PSQL_SOURCES['system']['db-port'] = pgport |
eecb7bbb6795
[devtools] Put pg sockets in /tmp
Rémi Cardona <remi.cardona@logilab.fr>
parents:
10439
diff
changeset
|
559 |
options = '-h "" -k %s -p %s' % (sockdir, pgport) |
10437
9cddd711419c
[devtools] extract functions to start/stop a postgresql cluster
Julien Cristau <julien.cristau@logilab.fr>
parents:
10354
diff
changeset
|
560 |
options += ' -c fsync=off -c full_page_writes=off' |
9cddd711419c
[devtools] extract functions to start/stop a postgresql cluster
Julien Cristau <julien.cristau@logilab.fr>
parents:
10354
diff
changeset
|
561 |
options += ' -c synchronous_commit=off' |
9cddd711419c
[devtools] extract functions to start/stop a postgresql cluster
Julien Cristau <julien.cristau@logilab.fr>
parents:
10354
diff
changeset
|
562 |
try: |
9cddd711419c
[devtools] extract functions to start/stop a postgresql cluster
Julien Cristau <julien.cristau@logilab.fr>
parents:
10354
diff
changeset
|
563 |
subprocess.check_call(['pg_ctl', 'start', '-w', '-D', datadir, |
9cddd711419c
[devtools] extract functions to start/stop a postgresql cluster
Julien Cristau <julien.cristau@logilab.fr>
parents:
10354
diff
changeset
|
564 |
'-o', options], |
9cddd711419c
[devtools] extract functions to start/stop a postgresql cluster
Julien Cristau <julien.cristau@logilab.fr>
parents:
10354
diff
changeset
|
565 |
env=env) |
10588
fdaa0e4b7eaf
[py3k] except as
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents:
10568
diff
changeset
|
566 |
except OSError as err: |
10437
9cddd711419c
[devtools] extract functions to start/stop a postgresql cluster
Julien Cristau <julien.cristau@logilab.fr>
parents:
10354
diff
changeset
|
567 |
if err.errno == errno.ENOENT: |
9cddd711419c
[devtools] extract functions to start/stop a postgresql cluster
Julien Cristau <julien.cristau@logilab.fr>
parents:
10354
diff
changeset
|
568 |
raise OSError('"pg_ctl" could not be found. ' |
9cddd711419c
[devtools] extract functions to start/stop a postgresql cluster
Julien Cristau <julien.cristau@logilab.fr>
parents:
10354
diff
changeset
|
569 |
'You should add the postgresql bin folder to your PATH ' |
9cddd711419c
[devtools] extract functions to start/stop a postgresql cluster
Julien Cristau <julien.cristau@logilab.fr>
parents:
10354
diff
changeset
|
570 |
'(/usr/lib/postgresql/9.1/bin for example).') |
9cddd711419c
[devtools] extract functions to start/stop a postgresql cluster
Julien Cristau <julien.cristau@logilab.fr>
parents:
10354
diff
changeset
|
571 |
raise |
9cddd711419c
[devtools] extract functions to start/stop a postgresql cluster
Julien Cristau <julien.cristau@logilab.fr>
parents:
10354
diff
changeset
|
572 |
|
9cddd711419c
[devtools] extract functions to start/stop a postgresql cluster
Julien Cristau <julien.cristau@logilab.fr>
parents:
10354
diff
changeset
|
573 |
|
10439
45e18b4a7466
[devtools] change the way we start/stop postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents:
10438
diff
changeset
|
574 |
def stoppgcluster(pyfile): |
45e18b4a7466
[devtools] change the way we start/stop postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents:
10438
diff
changeset
|
575 |
"""Kill the postgresql cluster running next to pyfile""" |
45e18b4a7466
[devtools] change the way we start/stop postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents:
10438
diff
changeset
|
576 |
datadir = join(os.path.dirname(pyfile), 'data', |
45e18b4a7466
[devtools] change the way we start/stop postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents:
10438
diff
changeset
|
577 |
'pgdb-%s' % os.path.splitext(os.path.basename(pyfile))[0]) |
10437
9cddd711419c
[devtools] extract functions to start/stop a postgresql cluster
Julien Cristau <julien.cristau@logilab.fr>
parents:
10354
diff
changeset
|
578 |
subprocess.call(['pg_ctl', 'stop', '-D', datadir, '-m', 'fast']) |
9cddd711419c
[devtools] extract functions to start/stop a postgresql cluster
Julien Cristau <julien.cristau@logilab.fr>
parents:
10354
diff
changeset
|
579 |
|
9cddd711419c
[devtools] extract functions to start/stop a postgresql cluster
Julien Cristau <julien.cristau@logilab.fr>
parents:
10354
diff
changeset
|
580 |
|
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
581 |
class PostgresTestDataBaseHandler(TestDataBaseHandler): |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
582 |
DRIVER = 'postgres' |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
583 |
|
10064
91a8f355c082
[devtools] Avoid db_cache collisions and mis-loading
Christophe de Vienne <christophe@unlish.com>
parents:
10063
diff
changeset
|
584 |
# Separate db_cache for PG databases, to avoid collisions with sqlite dbs |
91a8f355c082
[devtools] Avoid db_cache collisions and mis-loading
Christophe de Vienne <christophe@unlish.com>
parents:
10063
diff
changeset
|
585 |
db_cache = {} |
91a8f355c082
[devtools] Avoid db_cache collisions and mis-loading
Christophe de Vienne <christophe@unlish.com>
parents:
10063
diff
changeset
|
586 |
explored_glob = set() |
91a8f355c082
[devtools] Avoid db_cache collisions and mis-loading
Christophe de Vienne <christophe@unlish.com>
parents:
10063
diff
changeset
|
587 |
|
9498
a76ac18f09c4
[devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents:
9460
diff
changeset
|
588 |
__CTL = set() |
a76ac18f09c4
[devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents:
9460
diff
changeset
|
589 |
|
9790
0872ac2a1db0
[testlib] call init_config once the config has been properly bootstraped
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
9789
diff
changeset
|
590 |
def __init__(self, *args, **kwargs): |
0872ac2a1db0
[testlib] call init_config once the config has been properly bootstraped
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
9789
diff
changeset
|
591 |
super(PostgresTestDataBaseHandler, self).__init__(*args, **kwargs) |
10438
f27a489994e8
[devtools] make test db name for postgresql process-specific
Julien Cristau <julien.cristau@logilab.fr>
parents:
10437
diff
changeset
|
592 |
if 'global-db-name' not in self.system_source: |
f27a489994e8
[devtools] make test db name for postgresql process-specific
Julien Cristau <julien.cristau@logilab.fr>
parents:
10437
diff
changeset
|
593 |
self.system_source['global-db-name'] = self.system_source['db-name'] |
f27a489994e8
[devtools] make test db name for postgresql process-specific
Julien Cristau <julien.cristau@logilab.fr>
parents:
10437
diff
changeset
|
594 |
self.system_source['db-name'] = self.system_source['db-name'] + str(os.getpid()) |
9498
a76ac18f09c4
[devtools] make PostgresTestDataBaseHandler start its own postgresql
Julien Cristau <julien.cristau@logilab.fr>
parents:
9460
diff
changeset
|
595 |
|
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
596 |
@property |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
597 |
@cached |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
598 |
def helper(self): |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
599 |
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
|
600 |
return get_db_helper('postgres') |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
601 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
602 |
@property |
10438
f27a489994e8
[devtools] make test db name for postgresql process-specific
Julien Cristau <julien.cristau@logilab.fr>
parents:
10437
diff
changeset
|
603 |
def dbname(self): |
f27a489994e8
[devtools] make test db name for postgresql process-specific
Julien Cristau <julien.cristau@logilab.fr>
parents:
10437
diff
changeset
|
604 |
return self.system_source['global-db-name'] |
f27a489994e8
[devtools] make test db name for postgresql process-specific
Julien Cristau <julien.cristau@logilab.fr>
parents:
10437
diff
changeset
|
605 |
|
f27a489994e8
[devtools] make test db name for postgresql process-specific
Julien Cristau <julien.cristau@logilab.fr>
parents:
10437
diff
changeset
|
606 |
@property |
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
607 |
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
|
608 |
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
|
609 |
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
|
610 |
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
|
611 |
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
|
612 |
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
|
613 |
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
|
614 |
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
|
615 |
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
|
616 |
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
|
617 |
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
|
618 |
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
|
619 |
raise |
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
620 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
621 |
@property |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
622 |
@cached |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
623 |
def cursor(self): |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
624 |
return self.dbcnx.cursor() |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
625 |
|
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
|
626 |
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
|
627 |
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
|
628 |
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
|
629 |
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
|
630 |
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
|
631 |
|
10644
c43e5dc41f8b
[devtools] add has_cache for postgres (closes #5739624)
Julien Cristau <julien.cristau@logilab.fr>
parents:
10510
diff
changeset
|
632 |
def has_cache(self, db_id): |
c43e5dc41f8b
[devtools] add has_cache for postgres (closes #5739624)
Julien Cristau <julien.cristau@logilab.fr>
parents:
10510
diff
changeset
|
633 |
backup_name = self._backup_name(db_id) |
c43e5dc41f8b
[devtools] add has_cache for postgres (closes #5739624)
Julien Cristau <julien.cristau@logilab.fr>
parents:
10510
diff
changeset
|
634 |
return (super(PostgresTestDataBaseHandler, self).has_cache(db_id) |
c43e5dc41f8b
[devtools] add has_cache for postgres (closes #5739624)
Julien Cristau <julien.cristau@logilab.fr>
parents:
10510
diff
changeset
|
635 |
and backup_name in self.helper.list_databases(self.cursor)) |
c43e5dc41f8b
[devtools] add has_cache for postgres (closes #5739624)
Julien Cristau <julien.cristau@logilab.fr>
parents:
10510
diff
changeset
|
636 |
|
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
637 |
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
|
638 |
"""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
|
639 |
from cubicweb.server import init_repository |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
640 |
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
|
641 |
# 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
|
642 |
try: |
10438
f27a489994e8
[devtools] make test db name for postgresql process-specific
Julien Cristau <julien.cristau@logilab.fr>
parents:
10437
diff
changeset
|
643 |
self._drop(self.system_source['db-name']) |
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
644 |
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
|
645 |
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
|
646 |
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
|
647 |
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
|
648 |
templcursor = cnx.cursor() |
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
649 |
try: |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
650 |
# XXX factorize with db-create code |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
651 |
self.helper.init_fti_extensions(templcursor) |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
652 |
# 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
|
653 |
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
|
654 |
for extlang in langs: |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
655 |
self.helper.create_language(templcursor, extlang) |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
656 |
cnx.commit() |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
657 |
finally: |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
658 |
templcursor.close() |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
659 |
cnx.close() |
9790
0872ac2a1db0
[testlib] call init_config once the config has been properly bootstraped
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
9789
diff
changeset
|
660 |
init_repository(self.config, interactive=False, |
0872ac2a1db0
[testlib] call init_config once the config has been properly bootstraped
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
9789
diff
changeset
|
661 |
init_config=self.init_config) |
7815
2a164a9cf81c
[exceptions] stop catching any exception in various places (closes #1942716)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
7765
diff
changeset
|
662 |
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
|
663 |
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
|
664 |
self.dbcnx.rollback() |
7896
4c954e1e73ef
[lint] remove uses of "print >> sys.stderr" (closes #1908571)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents:
7879
diff
changeset
|
665 |
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
|
666 |
#self._drop(self.dbname) |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
667 |
raise |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
668 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
669 |
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
|
670 |
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
|
671 |
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
|
672 |
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
|
673 |
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
|
674 |
clear_cache(self, 'cursor') |
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
675 |
clear_cache(self, 'helper') |
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 |
def __del__(self): |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
678 |
self.helper_clear_cache() |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
679 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
680 |
@property |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
681 |
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
|
682 |
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
|
683 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
684 |
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
|
685 |
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
|
686 |
return backup_name.lower() |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
687 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
688 |
def _drop(self, db_name): |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
689 |
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
|
690 |
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
|
691 |
self.dbcnx.commit() |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
692 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
693 |
def _backup_database(self, db_id): |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
694 |
"""Actual backup the current database. |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
695 |
|
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
|
696 |
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
|
697 |
""" |
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
698 |
from cubicweb.server.serverctl import createdb |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
699 |
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
|
700 |
try: |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
701 |
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
|
702 |
self._drop(backup_name) |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
703 |
self.system_source['db-name'] = backup_name |
10063
335fa90d5ef4
[devtools][pg] Remove a wrong assertion in _backup_database
Christophe de Vienne <christophe@unlish.com>
parents:
10038
diff
changeset
|
704 |
if self._repo: |
335fa90d5ef4
[devtools][pg] Remove a wrong assertion in _backup_database
Christophe de Vienne <christophe@unlish.com>
parents:
10038
diff
changeset
|
705 |
self._repo.turn_repo_off() |
335fa90d5ef4
[devtools][pg] Remove a wrong assertion in _backup_database
Christophe de Vienne <christophe@unlish.com>
parents:
10038
diff
changeset
|
706 |
try: |
335fa90d5ef4
[devtools][pg] Remove a wrong assertion in _backup_database
Christophe de Vienne <christophe@unlish.com>
parents:
10038
diff
changeset
|
707 |
createdb(self.helper, self.system_source, self.dbcnx, self.cursor, template=orig_name) |
335fa90d5ef4
[devtools][pg] Remove a wrong assertion in _backup_database
Christophe de Vienne <christophe@unlish.com>
parents:
10038
diff
changeset
|
708 |
self.dbcnx.commit() |
335fa90d5ef4
[devtools][pg] Remove a wrong assertion in _backup_database
Christophe de Vienne <christophe@unlish.com>
parents:
10038
diff
changeset
|
709 |
finally: |
335fa90d5ef4
[devtools][pg] Remove a wrong assertion in _backup_database
Christophe de Vienne <christophe@unlish.com>
parents:
10038
diff
changeset
|
710 |
if self._repo: |
335fa90d5ef4
[devtools][pg] Remove a wrong assertion in _backup_database
Christophe de Vienne <christophe@unlish.com>
parents:
10038
diff
changeset
|
711 |
self._repo.turn_repo_on() |
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
712 |
return backup_name |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
713 |
finally: |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
714 |
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
|
715 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
716 |
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
|
717 |
from cubicweb.server.serverctl import createdb |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
718 |
"""Actual restore of the current database. |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
719 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
720 |
Use the value tostored in db_cache as input """ |
10438
f27a489994e8
[devtools] make test db name for postgresql process-specific
Julien Cristau <julien.cristau@logilab.fr>
parents:
10437
diff
changeset
|
721 |
self._drop(self.system_source['db-name']) |
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
722 |
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
|
723 |
template=backup_coordinates) |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
724 |
self.dbcnx.commit() |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
725 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
726 |
|
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1016
diff
changeset
|
727 |
|
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
|
728 |
### sqlserver2005 test database handling ####################################### |
5166
1e96d01728c4
enable live test against sqlserver 2005 database
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents:
5043
diff
changeset
|
729 |
|
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
730 |
class SQLServerTestDataBaseHandler(TestDataBaseHandler): |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
731 |
DRIVER = 'sqlserver' |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
732 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
733 |
# XXX complete me |
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 init_test_database(self): |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
736 |
"""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
|
737 |
if self.config.init_repository: |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
738 |
from cubicweb.server import init_repository |
9790
0872ac2a1db0
[testlib] call init_config once the config has been properly bootstraped
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
9789
diff
changeset
|
739 |
init_repository(self.config, interactive=False, drop=True, |
0872ac2a1db0
[testlib] call init_config once the config has been properly bootstraped
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
9789
diff
changeset
|
740 |
init_config=self.init_config) |
5212
a545eb9add6f
[testlib] fix dummy bug in reset_test_database(): s/if/elif
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
5210
diff
changeset
|
741 |
|
2773
b2530e3e0afb
[testlib] #345052 and #344207: major test lib refactoring/cleanup + update usage
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
2732
diff
changeset
|
742 |
### 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
|
743 |
|
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
744 |
class SQLiteTestDataBaseHandler(TestDataBaseHandler): |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
745 |
DRIVER = 'sqlite' |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
746 |
|
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
|
747 |
__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
|
748 |
|
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
|
749 |
@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
|
750 |
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
|
751 |
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
|
752 |
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
|
753 |
|
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
|
754 |
|
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
|
755 |
|
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
|
756 |
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
|
757 |
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
|
758 |
# 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
|
759 |
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
|
760 |
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
|
761 |
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
|
762 |
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
|
763 |
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
|
764 |
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
|
765 |
|
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
766 |
@staticmethod |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
767 |
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
|
768 |
try: |
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
769 |
os.remove(dbfile) |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
770 |
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
|
771 |
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
|
772 |
pass |
1802
d628defebc17
delete-trailing-whitespace + some copyright update
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
1016
diff
changeset
|
773 |
|
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
|
774 |
@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
|
775 |
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
|
776 |
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
|
777 |
|
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
778 |
def absolute_dbfile(self): |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
779 |
"""absolute path of current database file""" |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
780 |
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
|
781 |
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
|
782 |
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
|
783 |
return dbfile |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
784 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
785 |
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
|
786 |
return entry.get('sqlite') |
0 | 787 |
|
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
788 |
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
|
789 |
# 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
|
790 |
dbfile = self.absolute_dbfile() |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
791 |
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
|
792 |
shutil.copy(dbfile, backup_file) |
10510
51321946da37
Spelling fixes in comments and docstrings
Rémi Cardona <remi.cardona@logilab.fr>
parents:
10474
diff
changeset
|
793 |
# Useful to debug WHO writes a database |
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
794 |
# 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
|
795 |
#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
|
796 |
# import traceback |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
797 |
# 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
|
798 |
return backup_file |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
799 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
800 |
def _new_repo(self, config): |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
801 |
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
|
802 |
install_sqlite_patch(repo.querier) |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
803 |
return repo |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
804 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
805 |
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
|
806 |
# remove database file if it exists ? |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
807 |
dbfile = self.absolute_dbfile() |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
808 |
self._cleanup_database(dbfile) |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
809 |
shutil.copy(backup_coordinates, dbfile) |
8543
b7c9443d8625
minor cleanups/typos
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
8306
diff
changeset
|
810 |
self.get_repo() |
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 |
def init_test_database(self): |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
813 |
"""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
|
814 |
# 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
|
815 |
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
|
816 |
self._cleanup_database(self.absolute_dbfile()) |
9790
0872ac2a1db0
[testlib] call init_config once the config has been properly bootstraped
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
9789
diff
changeset
|
817 |
init_repository(self.config, interactive=False, |
0872ac2a1db0
[testlib] call init_config once the config has been properly bootstraped
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
9789
diff
changeset
|
818 |
init_config=self.init_config) |
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
819 |
|
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
|
820 |
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
|
821 |
atexit.register(SQLiteTestDataBaseHandler._cleanup_all_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
|
822 |
|
0 | 823 |
|
2732 | 824 |
def install_sqlite_patch(querier): |
0 | 825 |
"""This patch hotfixes the following sqlite bug : |
298
3e6d32667140
[doc] Fix docstring indentation.
Sandrine Ribeau <sandrine.ribeau@logilab.fr>
parents:
0
diff
changeset
|
826 |
- http://www.sqlite.org/cvstrac/tktview?tn=1327,33 |
3e6d32667140
[doc] Fix docstring indentation.
Sandrine Ribeau <sandrine.ribeau@logilab.fr>
parents:
0
diff
changeset
|
827 |
(some dates are returned as strings rather thant date objects) |
0 | 828 |
""" |
937 | 829 |
if hasattr(querier.__class__, '_devtools_sqlite_patched'): |
830 |
return # already monkey patched |
|
0 | 831 |
def wrap_execute(base_execute): |
832 |
def new_execute(*args, **kwargs): |
|
833 |
rset = base_execute(*args, **kwargs) |
|
834 |
if rset.description: |
|
835 |
found_date = False |
|
836 |
for row, rowdesc in zip(rset, rset.description): |
|
837 |
for cellindex, (value, vtype) in enumerate(zip(row, rowdesc)): |
|
10622
3cc6154b94a3
[py3k] unicode → six.text_type
Rémi Cardona <remi.cardona@logilab.fr>
parents:
10602
diff
changeset
|
838 |
if vtype in ('Date', 'Datetime') and isinstance(value, text_type): |
0 | 839 |
found_date = True |
1016
26387b836099
use datetime instead of mx.DateTime
sylvain.thenault@logilab.fr
parents:
937
diff
changeset
|
840 |
value = value.rsplit('.', 1)[0] |
0 | 841 |
try: |
842 |
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
|
843 |
except Exception: |
0 | 844 |
row[cellindex] = strptime(value, '%Y-%m-%d') |
10622
3cc6154b94a3
[py3k] unicode → six.text_type
Rémi Cardona <remi.cardona@logilab.fr>
parents:
10602
diff
changeset
|
845 |
if vtype == 'Time' and isinstance(value, text_type): |
0 | 846 |
found_date = True |
847 |
try: |
|
848 |
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
|
849 |
except Exception: |
0 | 850 |
# DateTime used as Time? |
851 |
row[cellindex] = strptime(value, '%Y-%m-%d %H:%M:%S') |
|
10595
c7a090052e5f
Use isinstance() instead of type comparison
Rémi Cardona <remi.cardona@logilab.fr>
parents:
10589
diff
changeset
|
852 |
if vtype == 'Interval' and isinstance(value, int): |
0 | 853 |
found_date = True |
1016
26387b836099
use datetime instead of mx.DateTime
sylvain.thenault@logilab.fr
parents:
937
diff
changeset
|
854 |
row[cellindex] = timedelta(0, value, 0) # XXX value is in number of seconds? |
0 | 855 |
if not found_date: |
856 |
break |
|
857 |
return rset |
|
858 |
return new_execute |
|
859 |
querier.__class__.execute = wrap_execute(querier.__class__.execute) |
|
937 | 860 |
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
|
861 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
862 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
863 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
864 |
HANDLERS = {} |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
865 |
|
7090
d9e6e79e023a
[testlib] require explicite overwriting of TestDataBaseHandler.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
7078
diff
changeset
|
866 |
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
|
867 |
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
|
868 |
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
|
869 |
HANDLERS[handlerkls.DRIVER] = handlerkls |
d9e6e79e023a
[testlib] require explicite overwriting of TestDataBaseHandler.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
7078
diff
changeset
|
870 |
else: |
7093
dccc22c60473
fix stupid typo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
7090
diff
changeset
|
871 |
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
|
872 |
"(existing handler class is %r)" |
d9e6e79e023a
[testlib] require explicite overwriting of TestDataBaseHandler.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
7078
diff
changeset
|
873 |
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
|
874 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
875 |
register_handler(PostgresTestDataBaseHandler) |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
876 |
register_handler(SQLiteTestDataBaseHandler) |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
877 |
register_handler(SQLServerTestDataBaseHandler) |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
878 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
879 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
880 |
class HCache(object): |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
881 |
"""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
|
882 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
883 |
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
|
884 |
(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
|
885 |
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
|
886 |
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
|
887 |
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
|
888 |
again. |
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 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
891 |
def __init__(self): |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
892 |
self.config = None |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
893 |
self.handler = None |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
894 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
895 |
def get(self, config): |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
896 |
if config is self.config: |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
897 |
return self.handler |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
898 |
else: |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
899 |
return None |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
900 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
901 |
def set(self, config, handler): |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
902 |
self.config = config |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
903 |
self.handler = handler |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
904 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
905 |
HCACHE = HCache() |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
906 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
907 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
908 |
# 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
|
909 |
|
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
|
910 |
_CONFIG = None |
9790
0872ac2a1db0
[testlib] call init_config once the config has been properly bootstraped
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
9789
diff
changeset
|
911 |
def get_test_db_handler(config, init_config=None): |
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
|
912 |
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
|
913 |
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
|
914 |
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
|
915 |
# 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
|
916 |
# 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
|
917 |
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
|
918 |
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
|
919 |
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
|
920 |
# 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
|
921 |
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
|
922 |
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
|
923 |
_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
|
924 |
config.adjust_sys_path() |
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
925 |
handler = HCACHE.get(config) |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
926 |
if handler is not None: |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
927 |
return handler |
9460
a2a0bc984863
[config] cleanup/refactor server sources file values handling
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
9456
diff
changeset
|
928 |
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
|
929 |
key = (driver, config) |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
930 |
handlerkls = HANDLERS.get(driver, None) |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
931 |
if handlerkls is not None: |
9790
0872ac2a1db0
[testlib] call init_config once the config has been properly bootstraped
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents:
9789
diff
changeset
|
932 |
handler = handlerkls(config, init_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
|
933 |
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
|
934 |
handler = NoCreateDropDatabaseHandler(handler) |
7078
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
935 |
HCACHE.set(config, handler) |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
936 |
return handler |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
937 |
else: |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
938 |
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
|
939 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
940 |
### compatibility layer ############################################## |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
941 |
from logilab.common.deprecation import deprecated |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
942 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
943 |
@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
|
944 |
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
|
945 |
"""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
|
946 |
if config is None: |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
947 |
config = TestServerConfiguration(apphome=apphome) |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
948 |
handler = get_test_db_handler(config) |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
949 |
handler.build_db_cache() |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
950 |
return handler.get_repo_and_cnx() |
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
951 |
|
bad26a22fe29
[test] New Handling of database for test.
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents:
7071
diff
changeset
|
952 |