cubicweb/devtools/httptest.py
author Philippe Pepiot <ph@itsalwaysdns.eu>
Tue, 31 Mar 2020 19:15:03 +0200
changeset 12957 0c973204033a
parent 12567 26744ad37953
permissions -rw-r--r--
[server] prevent returning closed cursor to the database pool In since c8c6ad8 init_repository use repo.internal_cnx() instead of repo.system_source.get_connection() so it use the pool and we should not close cursors from the pool before returning it back. Otherwise we may have "connection already closed" error. This bug only trigger when connection-pool-size = 1. Since we are moving to use a dynamic pooler we need to get this fixed. This does not occur with sqlite since the connection wrapper instantiate new cursor everytime, but this occur with other databases.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
10235
684215aca046 Remove remote repository-access-through-pyro support
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9929
diff changeset
     1
# copyright 2003-2014 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
5654
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     2
# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     3
#
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     4
# This file is part of CubicWeb.
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     5
#
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     6
# CubicWeb is free software: you can redistribute it and/or modify it under the
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     7
# terms of the GNU Lesser General Public License as published by the Free
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     8
# Software Foundation, either version 2.1 of the License, or (at your option)
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
     9
# any later version.
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    10
#
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    11
# CubicWeb is distributed in the hope that it will be useful, but WITHOUT
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    12
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    13
# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    14
# details.
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    15
#
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    16
# You should have received a copy of the GNU Lesser General Public License along
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    17
# with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    18
"""this module contains base classes and utilities for integration with running
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    19
http server
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    20
"""
10589
7c23b7de2b8d [py3k] print function
Samuel Trégouët <samuel.tregouet@logilab.fr>
parents: 10363
diff changeset
    21
12567
26744ad37953 Drop python2 support
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12531
diff changeset
    22
import http.client
9136
eef0388e8fea [devtool] randomise available ports search in http test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8941
diff changeset
    23
import random
5654
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    24
import threading
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    25
import socket
12567
26744ad37953 Drop python2 support
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12531
diff changeset
    26
from urllib.parse import urlparse
5654
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    27
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    28
from cubicweb.devtools.testlib import CubicWebTC
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    29
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    30
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    31
def get_available_port(ports_scan):
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    32
    """return the first available port from the given ports range
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    33
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    34
    Try to connect port by looking for refused connection (111) or transport
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    35
    endpoint already connected (106) errors
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    36
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    37
    Raise a RuntimeError if no port can be found
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    38
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    39
    :type ports_range: list
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    40
    :param ports_range: range of ports to test
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    41
    :rtype: int
6424
f443a2b8a5c7 [devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6322
diff changeset
    42
f443a2b8a5c7 [devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6322
diff changeset
    43
    .. see:: :func:`test.test_support.bind_port`
5654
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    44
    """
9136
eef0388e8fea [devtool] randomise available ports search in http test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8941
diff changeset
    45
    ports_scan = list(ports_scan)
eef0388e8fea [devtool] randomise available ports search in http test
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8941
diff changeset
    46
    random.shuffle(ports_scan)  # lower the chance of race condition
5654
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    47
    for port in ports_scan:
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    48
        try:
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    49
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
12531
2b9e815d20dc Flake8 cubicweb/devtools/httptest.py
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12530
diff changeset
    50
            s.connect(("localhost", port))
8695
358d8bed9626 [toward-py3k] rewrite to "except AnException as exc:" (part of #2711624)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8694
diff changeset
    51
        except socket.error as err:
5654
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    52
            if err.args[0] in (111, 106):
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    53
                return port
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    54
        finally:
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    55
            s.close()
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    56
    raise RuntimeError('get_available_port([ports_range]) cannot find an available port')
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    57
6322
711e7e8c69e3 [windmill] initialize windmill registry if not already existing (possible error case in dev)
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6315
diff changeset
    58
11158
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
    59
class _CubicWebServerTC(CubicWebTC):
12530
9d88e1177c35 Remove Twisted web server
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11767
diff changeset
    60
    """Base class for running a test web server.
5654
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    61
    """
6424
f443a2b8a5c7 [devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6322
diff changeset
    62
    ports_range = range(7000, 8000)
f443a2b8a5c7 [devtools] refactor http server initialization in a much saner way
Julien Jehannet <julien.jehannet@logilab.fr>
parents: 6322
diff changeset
    63
5654
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    64
    def start_server(self):
11158
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
    65
        raise NotImplementedError
5654
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    66
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    67
    def stop_server(self, timeout=15):
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    68
        """Stop the webserver, waiting for the thread to return"""
11158
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
    69
        raise NotImplementedError
5654
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    70
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    71
    def web_login(self, user=None, passwd=None):
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    72
        """Log the current http session for the provided credential
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    73
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    74
        If no user is provided, admin connection are used.
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    75
        """
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    76
        if user is None:
12531
2b9e815d20dc Flake8 cubicweb/devtools/httptest.py
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12530
diff changeset
    77
            user = self.admlogin
5654
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    78
            passwd = self.admpassword
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    79
        if passwd is None:
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    80
            passwd = user
7434
17ef6f9efaa1 [test] fix tests broken by 7427:5338d895b891
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7075
diff changeset
    81
        response = self.web_get("login?__login=%s&__password=%s" %
5654
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    82
                                (user, passwd))
12567
26744ad37953 Drop python2 support
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12531
diff changeset
    83
        assert response.status == http.client.SEE_OTHER, response.status
5654
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    84
        self._ident_cookie = response.getheader('Set-Cookie')
6315
8ca3ee849bee [test] fix broken tests and minor cleanups
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5700
diff changeset
    85
        assert self._ident_cookie
5654
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    86
        return True
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    87
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    88
    def web_logout(self, user='admin', pwd=None):
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    89
        """Log out current http user"""
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    90
        if self._ident_cookie is not None:
12531
2b9e815d20dc Flake8 cubicweb/devtools/httptest.py
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12530
diff changeset
    91
            self.web_get('logout')
5654
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    92
        self._ident_cookie = None
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    93
8727
5bca35901e9b [devtools/httptest] fix syntax error introduced by ce5ae7b80d2c
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8712
diff changeset
    94
    def web_request(self, path='', method='GET', body=None, headers=None):
12567
26744ad37953 Drop python2 support
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12531
diff changeset
    95
        """Return an http.client.HTTPResponse object for the specified path
5654
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    96
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    97
        Use available credential if available.
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    98
        """
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
    99
        if headers is None:
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   100
            headers = {}
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   101
        if self._ident_cookie is not None:
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   102
            assert 'Cookie' not in headers
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   103
            headers['Cookie'] = self._ident_cookie
8712
ce5ae7b80d2c [devtools/httptest] allow sending other types of requests besides GET
Julien Cristau <julien.cristau@logilab.fr>
parents: 8695
diff changeset
   104
        self._web_test_cnx.request(method, '/' + path, headers=headers, body=body)
5654
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   105
        response = self._web_test_cnx.getresponse()
12531
2b9e815d20dc Flake8 cubicweb/devtools/httptest.py
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12530
diff changeset
   106
        response.body = response.read()  # to chain request
2b9e815d20dc Flake8 cubicweb/devtools/httptest.py
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12530
diff changeset
   107
        response.read = lambda: response.body
5654
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   108
        return response
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   109
8712
ce5ae7b80d2c [devtools/httptest] allow sending other types of requests besides GET
Julien Cristau <julien.cristau@logilab.fr>
parents: 8695
diff changeset
   110
    def web_get(self, path='', body=None, headers=None):
ce5ae7b80d2c [devtools/httptest] allow sending other types of requests besides GET
Julien Cristau <julien.cristau@logilab.fr>
parents: 8695
diff changeset
   111
        return self.web_request(path=path, body=body, headers=headers)
ce5ae7b80d2c [devtools/httptest] allow sending other types of requests besides GET
Julien Cristau <julien.cristau@logilab.fr>
parents: 8695
diff changeset
   112
5654
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   113
    def setUp(self):
11158
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   114
        super(_CubicWebServerTC, self).setUp()
11015
baf463175505 [devtools] Fix database creation issues for CubicWebServerTC tests
Rémi Cardona <remi.cardona@logilab.fr>
parents: 11014
diff changeset
   115
        port = self.config['port'] or get_available_port(self.ports_range)
12531
2b9e815d20dc Flake8 cubicweb/devtools/httptest.py
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12530
diff changeset
   116
        self.config.global_set_option('port', port)  # force rewrite here
11015
baf463175505 [devtools] Fix database creation issues for CubicWebServerTC tests
Rémi Cardona <remi.cardona@logilab.fr>
parents: 11014
diff changeset
   117
        self.config.global_set_option('base-url', 'http://127.0.0.1:%d/' % port)
baf463175505 [devtools] Fix database creation issues for CubicWebServerTC tests
Rémi Cardona <remi.cardona@logilab.fr>
parents: 11014
diff changeset
   118
        # call load_configuration again to let the config reset its datadir_url
baf463175505 [devtools] Fix database creation issues for CubicWebServerTC tests
Rémi Cardona <remi.cardona@logilab.fr>
parents: 11014
diff changeset
   119
        self.config.load_configuration()
5654
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   120
        self.start_server()
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   121
8bb34548be86 [web test] Add a CubicWebServerTC class to run test with a cw web serveur available.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
diff changeset
   122
    def tearDown(self):
11158
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   123
        self.stop_server()
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   124
        super(_CubicWebServerTC, self).tearDown()
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   125
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   126
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   127
class CubicWebServerTC(_CubicWebServerTC):
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   128
    def start_server(self):
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   129
        from cubicweb.wsgi.handler import CubicWebWSGIApplication
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   130
        from wsgiref import simple_server
12567
26744ad37953 Drop python2 support
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12531
diff changeset
   131
        import queue
11158
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   132
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   133
        config = self.config
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   134
        port = config['port'] or 8080
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   135
        interface = config['interface']
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   136
        handler_cls = simple_server.WSGIRequestHandler
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   137
        app = CubicWebWSGIApplication(config)
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   138
        start_flag = queue.Queue()
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   139
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   140
        def run(config, *args, **kwargs):
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   141
            try:
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   142
                self.httpd = simple_server.WSGIServer((interface, port), handler_cls)
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   143
                self.httpd.set_app(app)
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   144
            except Exception as exc:
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   145
                start_flag.put(False)
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   146
                start_flag.put(exc)
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   147
                raise
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   148
            else:
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   149
                start_flag.put(True)
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   150
            try:
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   151
                self.httpd.serve_forever()
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   152
            finally:
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   153
                self.httpd.server_close()
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   154
        t = threading.Thread(target=run, name='cubicweb_test_web_server',
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   155
                             args=(self.config, True), kwargs={'repo': self.repo})
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   156
        self.web_thread = t
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   157
        t.start()
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   158
        flag = start_flag.get()
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   159
        if not flag:
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   160
            t.join()
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   161
            self.fail(start_flag.get())
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   162
        parseurl = urlparse(self.config['base-url'])
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   163
        assert parseurl.port == self.config['port'], (self.config['base-url'], self.config['port'])
12567
26744ad37953 Drop python2 support
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 12531
diff changeset
   164
        self._web_test_cnx = http.client.HTTPConnection(parseurl.hostname,
11158
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   165
                                                        parseurl.port)
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   166
        self._ident_cookie = None
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   167
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   168
    def stop_server(self, timeout=15):
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   169
        if self._web_test_cnx is None:
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   170
            self.web_logout()
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   171
            self._web_test_cnx.close()
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   172
        self.httpd.shutdown()
669eac69ea21 [devtools] add CubicWebWsgiTC
Julien Cristau <julien.cristau@logilab.fr>
parents: 11057
diff changeset
   173
        self.web_thread.join(timeout)