##// END OF EJS Templates
tests: increase timeouts for better test stability
marcink -
r2462:c5eece17 default
parent child Browse files
Show More
@@ -1,194 +1,194 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2017 RhodeCode GmbH
3 # Copyright (C) 2010-2017 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
7 # (only), as published by the Free Software Foundation.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU Affero General Public License
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
16 #
17 # This program is dual-licensed. If you wish to learn more about the
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
20
21
21
22 import os
22 import os
23 import time
23 import time
24 import tempfile
24 import tempfile
25 import pytest
25 import pytest
26 import subprocess32
26 import subprocess32
27 import configobj
27 import configobj
28
28
29 from urllib2 import urlopen, URLError
29 from urllib2 import urlopen, URLError
30 from pyramid.compat import configparser
30 from pyramid.compat import configparser
31
31
32
32
33 from rhodecode.tests import TEST_USER_ADMIN_LOGIN, TEST_USER_ADMIN_PASS
33 from rhodecode.tests import TEST_USER_ADMIN_LOGIN, TEST_USER_ADMIN_PASS
34 from rhodecode.tests.utils import is_url_reachable
34 from rhodecode.tests.utils import is_url_reachable
35
35
36
36
37 def get_port(pyramid_config):
37 def get_port(pyramid_config):
38 config = configparser.ConfigParser()
38 config = configparser.ConfigParser()
39 config.read(pyramid_config)
39 config.read(pyramid_config)
40 return config.get('server:main', 'port')
40 return config.get('server:main', 'port')
41
41
42
42
43 def get_host_url(pyramid_config):
43 def get_host_url(pyramid_config):
44 """Construct the host url using the port in the test configuration."""
44 """Construct the host url using the port in the test configuration."""
45 return '127.0.0.1:%s' % get_port(pyramid_config)
45 return '127.0.0.1:%s' % get_port(pyramid_config)
46
46
47
47
48 def assert_no_running_instance(url):
48 def assert_no_running_instance(url):
49 if is_url_reachable(url):
49 if is_url_reachable(url):
50 print("Hint: Usually this means another instance of server "
50 print("Hint: Usually this means another instance of server "
51 "is running in the background at %s." % url)
51 "is running in the background at %s." % url)
52 pytest.fail(
52 pytest.fail(
53 "Port is not free at %s, cannot start server at" % url)
53 "Port is not free at %s, cannot start server at" % url)
54
54
55
55
56 class ServerBase(object):
56 class ServerBase(object):
57 _args = []
57 _args = []
58 log_file_name = 'NOT_DEFINED.log'
58 log_file_name = 'NOT_DEFINED.log'
59 status_url_tmpl = 'http://{host}:{port}'
59 status_url_tmpl = 'http://{host}:{port}'
60
60
61 def __init__(self, config_file, log_file):
61 def __init__(self, config_file, log_file):
62 self.config_file = config_file
62 self.config_file = config_file
63 config_data = configobj.ConfigObj(config_file)
63 config_data = configobj.ConfigObj(config_file)
64 self._config = config_data['server:main']
64 self._config = config_data['server:main']
65
65
66 self._args = []
66 self._args = []
67 self.log_file = log_file or os.path.join(
67 self.log_file = log_file or os.path.join(
68 tempfile.gettempdir(), self.log_file_name)
68 tempfile.gettempdir(), self.log_file_name)
69 self.process = None
69 self.process = None
70 self.server_out = None
70 self.server_out = None
71 print("Using the {} configuration:{}".format(
71 print("Using the {} configuration:{}".format(
72 self.__class__.__name__, config_file))
72 self.__class__.__name__, config_file))
73
73
74 if not os.path.isfile(config_file):
74 if not os.path.isfile(config_file):
75 raise RuntimeError('Failed to get config at {}'.format(config_file))
75 raise RuntimeError('Failed to get config at {}'.format(config_file))
76
76
77 @property
77 @property
78 def command(self):
78 def command(self):
79 return ' '.join(self._args)
79 return ' '.join(self._args)
80
80
81 @property
81 @property
82 def http_url(self):
82 def http_url(self):
83 template = 'http://{host}:{port}/'
83 template = 'http://{host}:{port}/'
84 return template.format(**self._config)
84 return template.format(**self._config)
85
85
86 def host_url(self):
86 def host_url(self):
87 return 'http://' + get_host_url(self.config_file)
87 return 'http://' + get_host_url(self.config_file)
88
88
89 def get_rc_log(self):
89 def get_rc_log(self):
90 with open(self.log_file) as f:
90 with open(self.log_file) as f:
91 return f.read()
91 return f.read()
92
92
93 def wait_until_ready(self, timeout=15):
93 def wait_until_ready(self, timeout=30):
94 host = self._config['host']
94 host = self._config['host']
95 port = self._config['port']
95 port = self._config['port']
96 status_url = self.status_url_tmpl.format(host=host, port=port)
96 status_url = self.status_url_tmpl.format(host=host, port=port)
97 start = time.time()
97 start = time.time()
98
98
99 while time.time() - start < timeout:
99 while time.time() - start < timeout:
100 try:
100 try:
101 urlopen(status_url)
101 urlopen(status_url)
102 break
102 break
103 except URLError:
103 except URLError:
104 time.sleep(0.2)
104 time.sleep(0.2)
105 else:
105 else:
106 pytest.fail(
106 pytest.fail(
107 "Starting the {} failed or took more than {} "
107 "Starting the {} failed or took more than {} "
108 "seconds. cmd: `{}`".format(
108 "seconds. cmd: `{}`".format(
109 self.__class__.__name__, timeout, self.command))
109 self.__class__.__name__, timeout, self.command))
110
110
111 def shutdown(self):
111 def shutdown(self):
112 self.process.kill()
112 self.process.kill()
113 self.server_out.flush()
113 self.server_out.flush()
114 self.server_out.close()
114 self.server_out.close()
115
115
116 def get_log_file_with_port(self):
116 def get_log_file_with_port(self):
117 log_file = list(self.log_file.partition('.log'))
117 log_file = list(self.log_file.partition('.log'))
118 log_file.insert(1, get_port(self.config_file))
118 log_file.insert(1, get_port(self.config_file))
119 log_file = ''.join(log_file)
119 log_file = ''.join(log_file)
120 return log_file
120 return log_file
121
121
122
122
123 class RcVCSServer(ServerBase):
123 class RcVCSServer(ServerBase):
124 """
124 """
125 Represents a running VCSServer instance.
125 Represents a running VCSServer instance.
126 """
126 """
127
127
128 log_file_name = 'rc-vcsserver.log'
128 log_file_name = 'rc-vcsserver.log'
129 status_url_tmpl = 'http://{host}:{port}/status'
129 status_url_tmpl = 'http://{host}:{port}/status'
130
130
131 def __init__(self, config_file, log_file=None):
131 def __init__(self, config_file, log_file=None):
132 super(RcVCSServer, self).__init__(config_file, log_file)
132 super(RcVCSServer, self).__init__(config_file, log_file)
133 self._args = [
133 self._args = [
134 'gunicorn', '--paste', self.config_file]
134 'gunicorn', '--paste', self.config_file]
135
135
136 def start(self):
136 def start(self):
137 env = os.environ.copy()
137 env = os.environ.copy()
138
138
139 self.log_file = self.get_log_file_with_port()
139 self.log_file = self.get_log_file_with_port()
140 self.server_out = open(self.log_file, 'w')
140 self.server_out = open(self.log_file, 'w')
141
141
142 host_url = self.host_url()
142 host_url = self.host_url()
143 assert_no_running_instance(host_url)
143 assert_no_running_instance(host_url)
144
144
145 print('rhodecode-vcsserver starting at: {}'.format(host_url))
145 print('rhodecode-vcsserver starting at: {}'.format(host_url))
146 print('rhodecode-vcsserver command: {}'.format(self.command))
146 print('rhodecode-vcsserver command: {}'.format(self.command))
147 print('rhodecode-vcsserver logfile: {}'.format(self.log_file))
147 print('rhodecode-vcsserver logfile: {}'.format(self.log_file))
148
148
149 self.process = subprocess32.Popen(
149 self.process = subprocess32.Popen(
150 self._args, bufsize=0, env=env,
150 self._args, bufsize=0, env=env,
151 stdout=self.server_out, stderr=self.server_out)
151 stdout=self.server_out, stderr=self.server_out)
152
152
153
153
154 class RcWebServer(ServerBase):
154 class RcWebServer(ServerBase):
155 """
155 """
156 Represents a running RCE web server used as a test fixture.
156 Represents a running RCE web server used as a test fixture.
157 """
157 """
158
158
159 log_file_name = 'rc-web.log'
159 log_file_name = 'rc-web.log'
160 status_url_tmpl = 'http://{host}:{port}/_admin/ops/ping'
160 status_url_tmpl = 'http://{host}:{port}/_admin/ops/ping'
161
161
162 def __init__(self, config_file, log_file=None):
162 def __init__(self, config_file, log_file=None):
163 super(RcWebServer, self).__init__(config_file, log_file)
163 super(RcWebServer, self).__init__(config_file, log_file)
164 self._args = [
164 self._args = [
165 'gunicorn', '--worker-class', 'gevent', '--paste', config_file]
165 'gunicorn', '--worker-class', 'gevent', '--paste', config_file]
166
166
167 def start(self):
167 def start(self):
168 env = os.environ.copy()
168 env = os.environ.copy()
169 env['RC_NO_TMP_PATH'] = '1'
169 env['RC_NO_TMP_PATH'] = '1'
170
170
171 self.log_file = self.get_log_file_with_port()
171 self.log_file = self.get_log_file_with_port()
172 self.server_out = open(self.log_file, 'w')
172 self.server_out = open(self.log_file, 'w')
173
173
174 host_url = self.host_url()
174 host_url = self.host_url()
175 assert_no_running_instance(host_url)
175 assert_no_running_instance(host_url)
176
176
177 print('rhodecode-web starting at: {}'.format(host_url))
177 print('rhodecode-web starting at: {}'.format(host_url))
178 print('rhodecode-web command: {}'.format(self.command))
178 print('rhodecode-web command: {}'.format(self.command))
179 print('rhodecode-web logfile: {}'.format(self.log_file))
179 print('rhodecode-web logfile: {}'.format(self.log_file))
180
180
181 self.process = subprocess32.Popen(
181 self.process = subprocess32.Popen(
182 self._args, bufsize=0, env=env,
182 self._args, bufsize=0, env=env,
183 stdout=self.server_out, stderr=self.server_out)
183 stdout=self.server_out, stderr=self.server_out)
184
184
185 def repo_clone_url(self, repo_name, **kwargs):
185 def repo_clone_url(self, repo_name, **kwargs):
186 params = {
186 params = {
187 'user': TEST_USER_ADMIN_LOGIN,
187 'user': TEST_USER_ADMIN_LOGIN,
188 'passwd': TEST_USER_ADMIN_PASS,
188 'passwd': TEST_USER_ADMIN_PASS,
189 'host': get_host_url(self.config_file),
189 'host': get_host_url(self.config_file),
190 'cloned_repo': repo_name,
190 'cloned_repo': repo_name,
191 }
191 }
192 params.update(**kwargs)
192 params.update(**kwargs)
193 _url = 'http://%(user)s:%(passwd)s@%(host)s/%(cloned_repo)s' % params
193 _url = 'http://%(user)s:%(passwd)s@%(host)s/%(cloned_repo)s' % params
194 return _url
194 return _url
@@ -1,262 +1,265 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2017 RhodeCode GmbH
3 # Copyright (C) 2010-2017 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
7 # (only), as published by the Free Software Foundation.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU Affero General Public License
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
16 #
17 # This program is dual-licensed. If you wish to learn more about the
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
20
21 """
21 """
22 py.test config for test suite for making push/pull operations.
22 py.test config for test suite for making push/pull operations.
23
23
24 .. important::
24 .. important::
25
25
26 You must have git >= 1.8.5 for tests to work fine. With 68b939b git started
26 You must have git >= 1.8.5 for tests to work fine. With 68b939b git started
27 to redirect things to stderr instead of stdout.
27 to redirect things to stderr instead of stdout.
28 """
28 """
29
29
30 import os
30 import os
31 import tempfile
31 import tempfile
32 import textwrap
32 import textwrap
33 import pytest
33 import pytest
34
34
35 from rhodecode import events
35 from rhodecode import events
36 from rhodecode.model.db import Integration
36 from rhodecode.model.db import Integration
37 from rhodecode.model.integration import IntegrationModel
37 from rhodecode.model.integration import IntegrationModel
38 from rhodecode.model.db import Repository
38 from rhodecode.model.db import Repository
39 from rhodecode.model.meta import Session
39 from rhodecode.model.meta import Session
40 from rhodecode.model.settings import SettingsModel
40 from rhodecode.model.settings import SettingsModel
41 from rhodecode.integrations.types.webhook import WebhookIntegrationType
41 from rhodecode.integrations.types.webhook import WebhookIntegrationType
42
42
43 from rhodecode.tests import GIT_REPO, HG_REPO
43 from rhodecode.tests import GIT_REPO, HG_REPO
44 from rhodecode.tests.fixture import Fixture
44 from rhodecode.tests.fixture import Fixture
45 from rhodecode.tests.server_utils import RcWebServer
45 from rhodecode.tests.server_utils import RcWebServer
46
46
47 REPO_GROUP = 'a_repo_group'
47 REPO_GROUP = 'a_repo_group'
48 HG_REPO_WITH_GROUP = '%s/%s' % (REPO_GROUP, HG_REPO)
48 HG_REPO_WITH_GROUP = '%s/%s' % (REPO_GROUP, HG_REPO)
49 GIT_REPO_WITH_GROUP = '%s/%s' % (REPO_GROUP, GIT_REPO)
49 GIT_REPO_WITH_GROUP = '%s/%s' % (REPO_GROUP, GIT_REPO)
50
50
51
51
52 @pytest.fixture(scope="module")
52 @pytest.fixture(scope="module")
53 def rcextensions(request, db_connection, tmpdir_factory):
53 def rcextensions(request, db_connection, tmpdir_factory):
54 """
54 """
55 Installs a testing rcextensions pack to ensure they work as expected.
55 Installs a testing rcextensions pack to ensure they work as expected.
56 """
56 """
57 init_content = textwrap.dedent("""
57 init_content = textwrap.dedent("""
58 # Forward import the example rcextensions to make it
58 # Forward import the example rcextensions to make it
59 # active for our tests.
59 # active for our tests.
60 from rhodecode.tests.other.example_rcextensions import *
60 from rhodecode.tests.other.example_rcextensions import *
61 """)
61 """)
62
62
63 # Note: rcextensions are looked up based on the path of the ini file
63 # Note: rcextensions are looked up based on the path of the ini file
64 root_path = tmpdir_factory.getbasetemp()
64 root_path = tmpdir_factory.getbasetemp()
65 rcextensions_path = root_path.join('rcextensions')
65 rcextensions_path = root_path.join('rcextensions')
66 init_path = rcextensions_path.join('__init__.py')
66 init_path = rcextensions_path.join('__init__.py')
67
67
68 if rcextensions_path.check():
68 if rcextensions_path.check():
69 pytest.fail(
69 pytest.fail(
70 "Path for rcextensions already exists, please clean up before "
70 "Path for rcextensions already exists, please clean up before "
71 "test run this path: %s" % (rcextensions_path, ))
71 "test run this path: %s" % (rcextensions_path, ))
72 return
72 return
73
73
74 request.addfinalizer(rcextensions_path.remove)
74 request.addfinalizer(rcextensions_path.remove)
75 init_path.write_binary(init_content, ensure=True)
75 init_path.write_binary(init_content, ensure=True)
76
76
77
77
78 @pytest.fixture(scope="module")
78 @pytest.fixture(scope="module")
79 def repos(request, db_connection):
79 def repos(request, db_connection):
80 """Create a copy of each test repo in a repo group."""
80 """Create a copy of each test repo in a repo group."""
81 fixture = Fixture()
81 fixture = Fixture()
82 repo_group = fixture.create_repo_group(REPO_GROUP)
82 repo_group = fixture.create_repo_group(REPO_GROUP)
83 repo_group_id = repo_group.group_id
83 repo_group_id = repo_group.group_id
84 fixture.create_fork(HG_REPO, HG_REPO,
84 fixture.create_fork(HG_REPO, HG_REPO,
85 repo_name_full=HG_REPO_WITH_GROUP,
85 repo_name_full=HG_REPO_WITH_GROUP,
86 repo_group=repo_group_id)
86 repo_group=repo_group_id)
87 fixture.create_fork(GIT_REPO, GIT_REPO,
87 fixture.create_fork(GIT_REPO, GIT_REPO,
88 repo_name_full=GIT_REPO_WITH_GROUP,
88 repo_name_full=GIT_REPO_WITH_GROUP,
89 repo_group=repo_group_id)
89 repo_group=repo_group_id)
90
90
91 @request.addfinalizer
91 @request.addfinalizer
92 def cleanup():
92 def cleanup():
93 fixture.destroy_repo(HG_REPO_WITH_GROUP)
93 fixture.destroy_repo(HG_REPO_WITH_GROUP)
94 fixture.destroy_repo(GIT_REPO_WITH_GROUP)
94 fixture.destroy_repo(GIT_REPO_WITH_GROUP)
95 fixture.destroy_repo_group(repo_group_id)
95 fixture.destroy_repo_group(repo_group_id)
96
96
97
97
98 @pytest.fixture(scope="module")
98 @pytest.fixture(scope="module")
99 def rc_web_server_config_modification():
99 def rc_web_server_config_modification():
100 return []
100 return []
101
101
102
102
103 @pytest.fixture(scope="module")
103 @pytest.fixture(scope="module")
104 def rc_web_server_config_factory(testini_factory, rc_web_server_config_modification):
104 def rc_web_server_config_factory(testini_factory, rc_web_server_config_modification):
105 """
105 """
106 Configuration file used for the fixture `rc_web_server`.
106 Configuration file used for the fixture `rc_web_server`.
107 """
107 """
108
108
109 def factory(vcsserver_port):
109 def factory(vcsserver_port):
110 custom_params = [
110 custom_params = [
111 {'handler_console': {'level': 'DEBUG'}},
111 {'handler_console': {'level': 'DEBUG'}},
112 {'app:main': {'vcs.server': 'localhost:%s' % vcsserver_port}}
112 {'app:main': {'vcs.server': 'localhost:%s' % vcsserver_port}}
113 ]
113 ]
114 custom_params.extend(rc_web_server_config_modification)
114 custom_params.extend(rc_web_server_config_modification)
115 return testini_factory(custom_params)
115 return testini_factory(custom_params)
116 return factory
116 return factory
117
117
118
118
119 @pytest.fixture(scope="module")
119 @pytest.fixture(scope="module")
120 def rc_web_server(
120 def rc_web_server(
121 request, vcsserver_factory, available_port_factory,
121 request, vcsserver_factory, available_port_factory,
122 rc_web_server_config_factory, repos, rcextensions):
122 rc_web_server_config_factory, repos, rcextensions):
123 """
123 """
124 Run the web server as a subprocess. with it's own instance of vcsserver
124 Run the web server as a subprocess. with it's own instance of vcsserver
125 """
125 """
126
126
127 vcsserver_port = available_port_factory()
127 vcsserver_port = available_port_factory()
128 print('Using vcsserver ops test port {}'.format(vcsserver_port))
128 print('Using vcsserver ops test port {}'.format(vcsserver_port))
129
129
130 vcs_log = os.path.join(tempfile.gettempdir(), 'rc_op_vcs.log')
130 vcs_log = os.path.join(tempfile.gettempdir(), 'rc_op_vcs.log')
131 vcsserver_factory(
131 vcsserver_factory(
132 request, vcsserver_port=vcsserver_port,
132 request, vcsserver_port=vcsserver_port,
133 log_file=vcs_log,
133 log_file=vcs_log,
134 overrides=({'server:main': {'workers': 2}},))
134 overrides=(
135 {'server:main': {'workers': 2}},
136 {'server:main': {'graceful_timeout': 10}},
137 ))
135
138
136 rc_log = os.path.join(tempfile.gettempdir(), 'rc_op_web.log')
139 rc_log = os.path.join(tempfile.gettempdir(), 'rc_op_web.log')
137 rc_web_server_config = rc_web_server_config_factory(
140 rc_web_server_config = rc_web_server_config_factory(
138 vcsserver_port=vcsserver_port)
141 vcsserver_port=vcsserver_port)
139 server = RcWebServer(rc_web_server_config, log_file=rc_log)
142 server = RcWebServer(rc_web_server_config, log_file=rc_log)
140 server.start()
143 server.start()
141
144
142 @request.addfinalizer
145 @request.addfinalizer
143 def cleanup():
146 def cleanup():
144 server.shutdown()
147 server.shutdown()
145
148
146 server.wait_until_ready()
149 server.wait_until_ready()
147 return server
150 return server
148
151
149
152
150 @pytest.fixture
153 @pytest.fixture
151 def disable_locking(baseapp):
154 def disable_locking(baseapp):
152 r = Repository.get_by_repo_name(GIT_REPO)
155 r = Repository.get_by_repo_name(GIT_REPO)
153 Repository.unlock(r)
156 Repository.unlock(r)
154 r.enable_locking = False
157 r.enable_locking = False
155 Session().add(r)
158 Session().add(r)
156 Session().commit()
159 Session().commit()
157
160
158 r = Repository.get_by_repo_name(HG_REPO)
161 r = Repository.get_by_repo_name(HG_REPO)
159 Repository.unlock(r)
162 Repository.unlock(r)
160 r.enable_locking = False
163 r.enable_locking = False
161 Session().add(r)
164 Session().add(r)
162 Session().commit()
165 Session().commit()
163
166
164
167
165 @pytest.fixture
168 @pytest.fixture
166 def enable_auth_plugins(request, baseapp, csrf_token):
169 def enable_auth_plugins(request, baseapp, csrf_token):
167 """
170 """
168 Return a factory object that when called, allows to control which
171 Return a factory object that when called, allows to control which
169 authentication plugins are enabled.
172 authentication plugins are enabled.
170 """
173 """
171 def _enable_plugins(plugins_list, override=None):
174 def _enable_plugins(plugins_list, override=None):
172 override = override or {}
175 override = override or {}
173 params = {
176 params = {
174 'auth_plugins': ','.join(plugins_list),
177 'auth_plugins': ','.join(plugins_list),
175 }
178 }
176
179
177 # helper translate some names to others
180 # helper translate some names to others
178 name_map = {
181 name_map = {
179 'token': 'authtoken'
182 'token': 'authtoken'
180 }
183 }
181
184
182 for module in plugins_list:
185 for module in plugins_list:
183 plugin_name = module.partition('#')[-1]
186 plugin_name = module.partition('#')[-1]
184 if plugin_name in name_map:
187 if plugin_name in name_map:
185 plugin_name = name_map[plugin_name]
188 plugin_name = name_map[plugin_name]
186 enabled_plugin = 'auth_%s_enabled' % plugin_name
189 enabled_plugin = 'auth_%s_enabled' % plugin_name
187 cache_ttl = 'auth_%s_cache_ttl' % plugin_name
190 cache_ttl = 'auth_%s_cache_ttl' % plugin_name
188
191
189 # default params that are needed for each plugin,
192 # default params that are needed for each plugin,
190 # `enabled` and `cache_ttl`
193 # `enabled` and `cache_ttl`
191 params.update({
194 params.update({
192 enabled_plugin: True,
195 enabled_plugin: True,
193 cache_ttl: 0
196 cache_ttl: 0
194 })
197 })
195 if override.get:
198 if override.get:
196 params.update(override.get(module, {}))
199 params.update(override.get(module, {}))
197
200
198 validated_params = params
201 validated_params = params
199 for k, v in validated_params.items():
202 for k, v in validated_params.items():
200 setting = SettingsModel().create_or_update_setting(k, v)
203 setting = SettingsModel().create_or_update_setting(k, v)
201 Session().add(setting)
204 Session().add(setting)
202 Session().commit()
205 Session().commit()
203
206
204 def cleanup():
207 def cleanup():
205 _enable_plugins(['egg:rhodecode-enterprise-ce#rhodecode'])
208 _enable_plugins(['egg:rhodecode-enterprise-ce#rhodecode'])
206
209
207 request.addfinalizer(cleanup)
210 request.addfinalizer(cleanup)
208
211
209 return _enable_plugins
212 return _enable_plugins
210
213
211
214
212 @pytest.fixture
215 @pytest.fixture
213 def fs_repo_only(request, rhodecode_fixtures):
216 def fs_repo_only(request, rhodecode_fixtures):
214 def fs_repo_fabric(repo_name, repo_type):
217 def fs_repo_fabric(repo_name, repo_type):
215 rhodecode_fixtures.create_repo(repo_name, repo_type=repo_type)
218 rhodecode_fixtures.create_repo(repo_name, repo_type=repo_type)
216 rhodecode_fixtures.destroy_repo(repo_name, fs_remove=False)
219 rhodecode_fixtures.destroy_repo(repo_name, fs_remove=False)
217
220
218 def cleanup():
221 def cleanup():
219 rhodecode_fixtures.destroy_repo(repo_name, fs_remove=True)
222 rhodecode_fixtures.destroy_repo(repo_name, fs_remove=True)
220 rhodecode_fixtures.destroy_repo_on_filesystem(repo_name)
223 rhodecode_fixtures.destroy_repo_on_filesystem(repo_name)
221
224
222 request.addfinalizer(cleanup)
225 request.addfinalizer(cleanup)
223
226
224 return fs_repo_fabric
227 return fs_repo_fabric
225
228
226
229
227 @pytest.fixture
230 @pytest.fixture
228 def enable_webhook_push_integration(request):
231 def enable_webhook_push_integration(request):
229 integration = Integration()
232 integration = Integration()
230 integration.integration_type = WebhookIntegrationType.key
233 integration.integration_type = WebhookIntegrationType.key
231 Session().add(integration)
234 Session().add(integration)
232
235
233 settings = dict(
236 settings = dict(
234 url='http://httpbin.org',
237 url='http://httpbin.org',
235 secret_token='secret',
238 secret_token='secret',
236 username=None,
239 username=None,
237 password=None,
240 password=None,
238 custom_header_key=None,
241 custom_header_key=None,
239 custom_header_val=None,
242 custom_header_val=None,
240 method_type='get',
243 method_type='get',
241 events=[events.RepoPushEvent.name],
244 events=[events.RepoPushEvent.name],
242 log_data=True
245 log_data=True
243 )
246 )
244
247
245 IntegrationModel().update_integration(
248 IntegrationModel().update_integration(
246 integration,
249 integration,
247 name='IntegrationWebhookTest',
250 name='IntegrationWebhookTest',
248 enabled=True,
251 enabled=True,
249 settings=settings,
252 settings=settings,
250 repo=None,
253 repo=None,
251 repo_group=None,
254 repo_group=None,
252 child_repos_only=False,
255 child_repos_only=False,
253 )
256 )
254 Session().commit()
257 Session().commit()
255 integration_id = integration.integration_id
258 integration_id = integration.integration_id
256
259
257 @request.addfinalizer
260 @request.addfinalizer
258 def cleanup():
261 def cleanup():
259 integration = Integration.get(integration_id)
262 integration = Integration.get(integration_id)
260 Session().delete(integration)
263 Session().delete(integration)
261 Session().commit()
264 Session().commit()
262
265
General Comments 0
You need to be logged in to leave comments. Login now