{
    "file_diffs": [
        {
            "old_file_content": "import base64\nimport binascii\nfrom codecs import utf_8_decode, utf_8_encode\nfrom collections import namedtuple\nimport hashlib\nimport re\nimport time as time_mod\nfrom urllib.parse import quote, unquote\nimport warnings\nfrom webob.cookies import CookieProfile\nfrom zope.interface import implementer\n\nfrom pyramid.authorization import Authenticated, Everyone\nfrom pyramid.interfaces import IAuthenticationPolicy, IDebugLogger\nfrom pyramid.util import (\n    SimpleSerializer,\n    ascii_,\n    bytes_,\n    strings_differ,\n    text_,\n)\n\nVALID_TOKEN = re.compile(r\"^[A-Za-z][A-Za-z0-9+_-]*$\")\n\n\nclass CallbackAuthenticationPolicy:\n    \"\"\" Abstract class \"\"\"\n\n    debug = False\n    callback = None\n\n    def _log(self, msg, methodname, request):\n        logger = request.registry.queryUtility(IDebugLogger)\n        if logger:\n            cls = self.__class__\n            classname = cls.__module__ + '.' + cls.__name__\n            methodname = classname + '.' + methodname\n            logger.debug(methodname + ': ' + msg)\n\n    def _clean_principal(self, princid):\n        if princid in (Authenticated, Everyone):\n            princid = None\n        return princid\n\n    def authenticated_userid(self, request):\n        \"\"\" Return the authenticated userid or ``None``.\n\n        If no callback is registered, this will be the same as\n        ``unauthenticated_userid``.\n\n        If a ``callback`` is registered, this will return the userid if\n        and only if the callback returns a value that is not ``None``.\n\n        \"\"\"\n        debug = self.debug\n        userid = self.unauthenticated_userid(request)\n        if userid is None:\n            debug and self._log(\n                'call to unauthenticated_userid returned None; returning None',\n                'authenticated_userid',\n                request,\n            )\n            return None\n        if self._clean_principal(userid) is None:\n            debug and self._log(\n                (\n                    'use of userid %r is disallowed by any built-in Pyramid '\n                    'security policy, returning None' % userid\n                ),\n                'authenticated_userid',\n                request,\n            )\n            return None\n\n        if self.callback is None:\n            debug and self._log(\n                'there was no groupfinder callback; returning %r' % (userid,),\n                'authenticated_userid',\n                request,\n            )\n            return userid\n        callback_ok = self.callback(userid, request)\n        if callback_ok is not None:  # is not None!\n            debug and self._log(\n                'groupfinder callback returned %r; returning %r'\n                % (callback_ok, userid),\n                'authenticated_userid',\n                request,\n            )\n            return userid\n        debug and self._log(\n            'groupfinder callback returned None; returning None',\n            'authenticated_userid',\n            request,\n        )\n\n    def effective_principals(self, request):\n        \"\"\" A list of effective principals derived from request.\n\n        This will return a list of principals including, at least,\n        :data:`pyramid.authorization.Everyone`. If there is no authenticated\n        userid, or the ``callback`` returns ``None``, this will be the\n        only principal:\n\n        .. code-block:: python\n\n            return [Everyone]\n\n        If the ``callback`` does not return ``None`` and an authenticated\n        userid is found, then the principals will include\n        :data:`pyramid.authorization.Authenticated`, the\n        ``authenticated_userid`` and the list of principals returned by the\n        ``callback``:\n\n        .. code-block:: python\n\n            extra_principals = callback(userid, request)\n            return [Everyone, Authenticated, userid] + extra_principals\n\n        \"\"\"\n        debug = self.debug\n        effective_principals = [Everyone]\n        userid = self.unauthenticated_userid(request)\n\n        if userid is None:\n            debug and self._log(\n                'unauthenticated_userid returned %r; returning %r'\n                % (userid, effective_principals),\n                'effective_principals',\n                request,\n            )\n            return effective_principals\n\n        if self._clean_principal(userid) is None:\n            debug and self._log(\n                (\n                    'unauthenticated_userid returned disallowed %r; returning '\n                    '%r as if it was None' % (userid, effective_principals)\n                ),\n                'effective_principals',\n                request,\n            )\n            return effective_principals\n\n        if self.callback is None:\n            debug and self._log(\n                'groupfinder callback is None, so groups is []',\n                'effective_principals',\n                request,\n            )\n            groups = []\n        else:\n            groups = self.callback(userid, request)\n            debug and self._log(\n                'groupfinder callback returned %r as groups' % (groups,),\n                'effective_principals',\n                request,\n            )\n\n        if groups is None:  # is None!\n            debug and self._log(\n                'returning effective principals: %r' % (effective_principals,),\n                'effective_principals',\n                request,\n            )\n            return effective_principals\n\n        effective_principals.append(Authenticated)\n        effective_principals.append(userid)\n        effective_principals.extend(groups)\n\n        debug and self._log(\n            'returning effective principals: %r' % (effective_principals,),\n            'effective_principals',\n            request,\n        )\n        return effective_principals\n\n\n@implementer(IAuthenticationPolicy)\nclass RepozeWho1AuthenticationPolicy(CallbackAuthenticationPolicy):\n    \"\"\" A :app:`Pyramid` :term:`authentication policy` which\n    obtains data from the :mod:`repoze.who` 1.X WSGI 'API' (the\n    ``repoze.who.identity`` key in the WSGI environment).\n\n    Constructor Arguments\n\n    ``identifier_name``\n\n       Default: ``auth_tkt``.  The :mod:`repoze.who` plugin name that\n       performs remember/forget.  Optional.\n\n    ``callback``\n\n        Default: ``None``.  A callback passed the :mod:`repoze.who` identity\n        and the :term:`request`, expected to return ``None`` if the user\n        represented by the identity doesn't exist or a sequence of principal\n        identifiers (possibly empty) representing groups if the user does\n        exist.  If ``callback`` is None, the userid will be assumed to exist\n        with no group principals.\n\n    Objects of this class implement the interface described by\n    :class:`pyramid.interfaces.IAuthenticationPolicy`.\n    \"\"\"\n\n    def __init__(self, identifier_name='auth_tkt', callback=None):\n        self.identifier_name = identifier_name\n        self.callback = callback\n\n    def _get_identity(self, request):\n        return request.environ.get('repoze.who.identity')\n\n    def _get_identifier(self, request):\n        plugins = request.environ.get('repoze.who.plugins')\n        if plugins is None:\n            return None\n        identifier = plugins[self.identifier_name]\n        return identifier\n\n    def authenticated_userid(self, request):\n        \"\"\" Return the authenticated userid or ``None``.\n\n        If no callback is registered, this will be the same as\n        ``unauthenticated_userid``.\n\n        If a ``callback`` is registered, this will return the userid if\n        and only if the callback returns a value that is not ``None``.\n\n        \"\"\"\n        identity = self._get_identity(request)\n\n        if identity is None:\n            self.debug and self._log(\n                'repoze.who identity is None, returning None',\n                'authenticated_userid',\n                request,\n            )\n            return None\n\n        userid = identity['repoze.who.userid']\n\n        if userid is None:\n            self.debug and self._log(\n                'repoze.who.userid is None, returning None' % userid,\n                'authenticated_userid',\n                request,\n            )\n            return None\n\n        if self._clean_principal(userid) is None:\n            self.debug and self._log(\n                (\n                    'use of userid %r is disallowed by any built-in Pyramid '\n                    'security policy, returning None' % userid\n                ),\n                'authenticated_userid',\n                request,\n            )\n            return None\n\n        if self.callback is None:\n            return userid\n\n        if self.callback(identity, request) is not None:  # is not None!\n            return userid\n\n    def unauthenticated_userid(self, request):\n        \"\"\" Return the ``repoze.who.userid`` key from the detected identity.\"\"\"\n        identity = self._get_identity(request)\n        if identity is None:\n            return None\n        return identity['repoze.who.userid']\n\n    def effective_principals(self, request):\n        \"\"\" A list of effective principals derived from the identity.\n\n        This will return a list of principals including, at least,\n        :data:`pyramid.authorization.Everyone`. If there is no identity, or\n        the ``callback`` returns ``None``, this will be the only principal.\n\n        If the ``callback`` does not return ``None`` and an identity is\n        found, then the principals will include\n        :data:`pyramid.authorization.Authenticated`, the\n        ``authenticated_userid`` and the list of principals returned by the\n        ``callback``.\n\n        \"\"\"\n        effective_principals = [Everyone]\n        identity = self._get_identity(request)\n\n        if identity is None:\n            self.debug and self._log(\n                (\n                    'repoze.who identity was None; returning %r'\n                    % effective_principals\n                ),\n                'effective_principals',\n                request,\n            )\n            return effective_principals\n\n        if self.callback is None:\n            groups = []\n        else:\n            groups = self.callback(identity, request)\n\n        if groups is None:  # is None!\n            self.debug and self._log(\n                (\n                    'security policy groups callback returned None; returning '\n                    '%r' % effective_principals\n                ),\n                'effective_principals',\n                request,\n            )\n            return effective_principals\n\n        userid = identity['repoze.who.userid']\n\n        if userid is None:\n            self.debug and self._log(\n                (\n                    'repoze.who.userid was None; returning %r'\n                    % effective_principals\n                ),\n                'effective_principals',\n                request,\n            )\n            return effective_principals\n\n        if self._clean_principal(userid) is None:\n            self.debug and self._log(\n                (\n                    'unauthenticated_userid returned disallowed %r; returning '\n                    '%r as if it was None' % (userid, effective_principals)\n                ),\n                'effective_principals',\n                request,\n            )\n            return effective_principals\n\n        effective_principals.append(Authenticated)\n        effective_principals.append(userid)\n        effective_principals.extend(groups)\n        return effective_principals\n\n    def remember(self, request, userid, **kw):\n        \"\"\" Store the ``userid`` as ``repoze.who.userid``.\n\n        The identity to authenticated to :mod:`repoze.who`\n        will contain the given userid as ``userid``, and\n        provide all keyword arguments as additional identity\n        keys. Useful keys could be ``max_age`` or ``userdata``.\n        \"\"\"\n        identifier = self._get_identifier(request)\n        if identifier is None:\n            return []\n        environ = request.environ\n        identity = kw\n        identity['repoze.who.userid'] = userid\n        return identifier.remember(environ, identity)\n\n    def forget(self, request):\n        \"\"\" Forget the current authenticated user.\n\n        Return headers that, if included in a response, will delete the\n        cookie responsible for tracking the current user.\n\n        \"\"\"\n        identifier = self._get_identifier(request)\n        if identifier is None:\n            return []\n        identity = self._get_identity(request)\n        return identifier.forget(request.environ, identity)\n\n\n@implementer(IAuthenticationPolicy)\nclass RemoteUserAuthenticationPolicy(CallbackAuthenticationPolicy):\n    \"\"\" A :app:`Pyramid` :term:`authentication policy` which\n    obtains data from the ``REMOTE_USER`` WSGI environment variable.\n\n    Constructor Arguments\n\n    ``environ_key``\n\n        Default: ``REMOTE_USER``.  The key in the WSGI environ which\n        provides the userid.\n\n    ``callback``\n\n        Default: ``None``.  A callback passed the userid and the request,\n        expected to return None if the userid doesn't exist or a sequence of\n        principal identifiers (possibly empty) representing groups if the\n        user does exist.  If ``callback`` is None, the userid will be assumed\n        to exist with no group principals.\n\n    ``debug``\n\n        Default: ``False``.  If ``debug`` is ``True``, log messages to the\n        Pyramid debug logger about the results of various authentication\n        steps.  The output from debugging is useful for reporting to maillist\n        or IRC channels when asking for support.\n\n    Objects of this class implement the interface described by\n    :class:`pyramid.interfaces.IAuthenticationPolicy`.\n    \"\"\"\n\n    def __init__(self, environ_key='REMOTE_USER', callback=None, debug=False):\n        self.environ_key = environ_key\n        self.callback = callback\n        self.debug = debug\n\n    def unauthenticated_userid(self, request):\n        \"\"\" The ``REMOTE_USER`` value found within the ``environ``.\"\"\"\n        return request.environ.get(self.environ_key)\n\n    def remember(self, request, userid, **kw):\n        \"\"\" A no-op. The ``REMOTE_USER`` does not provide a protocol for\n        remembering the user. This will be application-specific and can\n        be done somewhere else or in a subclass.\"\"\"\n        return []\n\n    def forget(self, request):\n        \"\"\" A no-op. The ``REMOTE_USER`` does not provide a protocol for\n        forgetting the user. This will be application-specific and can\n        be done somewhere else or in a subclass.\"\"\"\n        return []\n\n\n@implementer(IAuthenticationPolicy)\nclass AuthTktAuthenticationPolicy(CallbackAuthenticationPolicy):\n    \"\"\"A :app:`Pyramid` :term:`authentication policy` which\n    obtains data from a Pyramid \"auth ticket\" cookie.\n\n    Constructor Arguments\n\n    ``secret``\n\n       The secret (a string) used for auth_tkt cookie signing.  This value\n       should be unique across all values provided to Pyramid for various\n       subsystem secrets (see :ref:`admonishment_against_secret_sharing`).\n       Required.\n\n    ``callback``\n\n       Default: ``None``.  A callback passed the userid and the\n       request, expected to return ``None`` if the userid doesn't\n       exist or a sequence of principal identifiers (possibly empty) if\n       the user does exist.  If ``callback`` is ``None``, the userid\n       will be assumed to exist with no principals.  Optional.\n\n    ``cookie_name``\n\n       Default: ``auth_tkt``.  The cookie name used\n       (string).  Optional.\n\n    ``secure``\n\n       Default: ``False``.  Only send the cookie back over a secure\n       conn.  Optional.\n\n    ``include_ip``\n\n       Default: ``False``.  Make the requesting IP address part of\n       the authentication data in the cookie.  Optional.\n\n       For IPv6 this option is not recommended. The ``mod_auth_tkt``\n       specification does not specify how to handle IPv6 addresses, so using\n       this option in combination with IPv6 addresses may cause an\n       incompatible cookie. It ties the authentication ticket to that\n       individual's IPv6 address.\n\n    ``timeout``\n\n       Default: ``None``.  Maximum number of seconds which a newly\n       issued ticket will be considered valid.  After this amount of\n       time, the ticket will expire (effectively logging the user\n       out).  If this value is ``None``, the ticket never expires.\n       Optional.\n\n    ``reissue_time``\n\n       Default: ``None``.  If this parameter is set, it represents the number\n       of seconds that must pass before an authentication token cookie is\n       automatically reissued as the result of a request which requires\n       authentication.  The duration is measured as the number of seconds\n       since the last auth_tkt cookie was issued and 'now'.  If this value is\n       ``0``, a new ticket cookie will be reissued on every request which\n       requires authentication.\n\n       A good rule of thumb: if you want auto-expired cookies based on\n       inactivity: set the ``timeout`` value to 1200 (20 mins) and set the\n       ``reissue_time`` value to perhaps a tenth of the ``timeout`` value\n       (120 or 2 mins).  It's nonsensical to set the ``timeout`` value lower\n       than the ``reissue_time`` value, as the ticket will never be reissued\n       if so.  However, such a configuration is not explicitly prevented.\n\n       Optional.\n\n    ``max_age``\n\n       Default: ``None``.  The max age of the auth_tkt cookie, in\n       seconds.  This differs from ``timeout`` inasmuch as ``timeout``\n       represents the lifetime of the ticket contained in the cookie,\n       while this value represents the lifetime of the cookie itself.\n       When this value is set, the cookie's ``Max-Age`` and\n       ``Expires`` settings will be set, allowing the auth_tkt cookie\n       to last between browser sessions.  It is typically nonsensical\n       to set this to a value that is lower than ``timeout`` or\n       ``reissue_time``, although it is not explicitly prevented.\n       Optional.\n\n    ``path``\n\n       Default: ``/``. The path for which the auth_tkt cookie is valid.\n       May be desirable if the application only serves part of a domain.\n       Optional.\n\n    ``http_only``\n\n       Default: ``False``. Hide cookie from JavaScript by setting the\n       HttpOnly flag. Not honored by all browsers.\n       Optional.\n\n    ``wild_domain``\n\n       Default: ``True``. An auth_tkt cookie will be generated for the\n       wildcard domain. If your site is hosted as ``example.com`` this\n       will make the cookie available for sites underneath ``example.com``\n       such as ``www.example.com``.\n       Optional.\n\n    ``parent_domain``\n\n       Default: ``False``. An auth_tkt cookie will be generated for the\n       parent domain of the current site. For example if your site is\n       hosted under ``www.example.com`` a cookie will be generated for\n       ``.example.com``. This can be useful if you have multiple sites\n       sharing the same domain. This option supercedes the ``wild_domain``\n       option.\n       Optional.\n\n    ``domain``\n\n       Default: ``None``. If provided the auth_tkt cookie will only be\n       set for this domain. This option is not compatible with ``wild_domain``\n       and ``parent_domain``.\n       Optional.\n\n    ``hashalg``\n\n       Default: ``sha512`` (the literal string).\n\n       Any hash algorithm supported by Python's ``hashlib.new()`` function\n       can be used as the ``hashalg``.\n\n       Cookies generated by different instances of AuthTktAuthenticationPolicy\n       using different ``hashalg`` options are not compatible. Switching the\n       ``hashalg`` will imply that all existing users with a valid cookie will\n       be required to re-login.\n\n       Optional.\n\n    ``debug``\n\n        Default: ``False``.  If ``debug`` is ``True``, log messages to the\n        Pyramid debug logger about the results of various authentication\n        steps.  The output from debugging is useful for reporting to maillist\n        or IRC channels when asking for support.\n\n    ``samesite``\n\n        Default: ``'Lax'``.  The 'samesite' option of the session cookie. Set\n        the value to ``None`` to turn off the samesite option.\n\n    .. versionchanged:: 1.4\n\n       Added the ``hashalg`` option, defaulting to ``sha512``.\n\n    .. versionchanged:: 1.5\n\n       Added the ``domain`` option.\n\n       Added the ``parent_domain`` option.\n\n    .. versionchanged:: 1.10\n\n       Added the ``samesite`` option and made the default ``'Lax'``.\n\n    Objects of this class implement the interface described by\n    :class:`pyramid.interfaces.IAuthenticationPolicy`.\n\n    \"\"\"\n\n    def __init__(\n        self,\n        secret,\n        callback=None,\n        cookie_name='auth_tkt',\n        secure=False,\n        include_ip=False,\n        timeout=None,\n        reissue_time=None,\n        max_age=None,\n        path=\"/\",\n        http_only=False,\n        wild_domain=True,\n        debug=False,\n        hashalg='sha512',\n        parent_domain=False,\n        domain=None,\n        samesite='Lax',\n    ):\n        self.cookie = AuthTktCookieHelper(\n            secret,\n            cookie_name=cookie_name,\n            secure=secure,\n            include_ip=include_ip,\n            timeout=timeout,\n            reissue_time=reissue_time,\n            max_age=max_age,\n            http_only=http_only,\n            path=path,\n            wild_domain=wild_domain,\n            hashalg=hashalg,\n            parent_domain=parent_domain,\n            domain=domain,\n            samesite=samesite,\n        )\n        self.callback = callback\n        self.debug = debug\n\n    def unauthenticated_userid(self, request):\n        \"\"\" The userid key within the auth_tkt cookie.\"\"\"\n        result = self.cookie.identify(request)\n        if result:\n            return result['userid']\n\n    def remember(self, request, userid, **kw):\n        \"\"\" Accepts the following kw args: ``max_age=<int-seconds>,\n        ``tokens=<sequence-of-ascii-strings>``.\n\n        Return a list of headers which will set appropriate cookies on\n        the response.\n\n        \"\"\"\n        return self.cookie.remember(request, userid, **kw)\n\n    def forget(self, request):\n        \"\"\" A list of headers which will delete appropriate cookies.\"\"\"\n        return self.cookie.forget(request)\n\n\ndef b64encode(v):\n    return base64.b64encode(bytes_(v)).strip().replace(b'\\n', b'')\n\n\ndef b64decode(v):\n    return base64.b64decode(bytes_(v))\n\n\n# this class licensed under the MIT license (stolen from Paste)\nclass AuthTicket:\n    \"\"\"\n    This class represents an authentication token.  You must pass in\n    the shared secret, the userid, and the IP address.  Optionally you\n    can include tokens (a list of strings, representing role names),\n    'user_data', which is arbitrary data available for your own use in\n    later scripts.  Lastly, you can override the cookie name and\n    timestamp.\n\n    Once you provide all the arguments, use .cookie_value() to\n    generate the appropriate authentication ticket.\n\n    Usage::\n\n        token = AuthTicket('sharedsecret', 'username',\n            os.environ['REMOTE_ADDR'], tokens=['admin'])\n        val = token.cookie_value()\n\n    \"\"\"\n\n    def __init__(\n        self,\n        secret,\n        userid,\n        ip,\n        tokens=(),\n        user_data='',\n        time=None,\n        cookie_name='auth_tkt',\n        secure=False,\n        hashalg='md5',\n    ):\n        self.secret = secret\n        self.userid = userid\n        self.ip = ip\n        self.tokens = ','.join(tokens)\n        self.user_data = user_data\n        if time is None:\n            self.time = time_mod.time()\n        else:\n            self.time = time\n        self.cookie_name = cookie_name\n        self.secure = secure\n        self.hashalg = hashalg\n\n    def digest(self):\n        return calculate_digest(\n            self.ip,\n            self.time,\n            self.secret,\n            self.userid,\n            self.tokens,\n            self.user_data,\n            self.hashalg,\n        )\n\n    def cookie_value(self):\n        v = '%s%08x%s!' % (self.digest(), int(self.time), quote(self.userid))\n        if self.tokens:\n            v += self.tokens + '!'\n        v += self.user_data\n        return v\n\n\n# this class licensed under the MIT license (stolen from Paste)\nclass BadTicket(Exception):\n    \"\"\"\n    Exception raised when a ticket can't be parsed.  If we get far enough to\n    determine what the expected digest should have been, expected is set.\n    This should not be shown by default, but can be useful for debugging.\n    \"\"\"\n\n    def __init__(self, msg, expected=None):\n        self.expected = expected\n        Exception.__init__(self, msg)\n\n\n# this function licensed under the MIT license (stolen from Paste)\ndef parse_ticket(secret, ticket, ip, hashalg='md5'):\n    \"\"\"\n    Parse the ticket, returning (timestamp, userid, tokens, user_data).\n\n    If the ticket cannot be parsed, a ``BadTicket`` exception will be raised\n    with an explanation.\n    \"\"\"\n    ticket = text_(ticket).strip('\"')\n    digest_size = hashlib.new(hashalg).digest_size * 2\n    digest = ticket[:digest_size]\n    try:\n        timestamp = int(ticket[digest_size : digest_size + 8], 16)\n    except ValueError as e:\n        raise BadTicket('Timestamp is not a hex integer: %s' % e)\n    try:\n        userid, data = ticket[digest_size + 8 :].split('!', 1)\n    except ValueError:\n        raise BadTicket('userid is not followed by !')\n    userid = unquote(userid)\n    if '!' in data:\n        tokens, user_data = data.split('!', 1)\n    else:  # pragma: no cover (never generated)\n        # @@: Is this the right order?\n        tokens = ''\n        user_data = data\n\n    expected = calculate_digest(\n        ip, timestamp, secret, userid, tokens, user_data, hashalg\n    )\n\n    # Avoid timing attacks (see\n    # http://seb.dbzteam.org/crypto/python-oauth-timing-hmac.pdf)\n    if strings_differ(expected, digest):\n        raise BadTicket(\n            'Digest signature is not correct', expected=(expected, digest)\n        )\n\n    tokens = tokens.split(',')\n\n    return (timestamp, userid, tokens, user_data)\n\n\n# this function licensed under the MIT license (stolen from Paste)\ndef calculate_digest(\n    ip, timestamp, secret, userid, tokens, user_data, hashalg='md5'\n):\n    secret = bytes_(secret, 'utf-8')\n    userid = bytes_(userid, 'utf-8')\n    tokens = bytes_(tokens, 'utf-8')\n    user_data = bytes_(user_data, 'utf-8')\n    hash_obj = hashlib.new(hashalg)\n\n    # Check to see if this is an IPv6 address\n    if ':' in ip:\n        ip_timestamp = ip + str(int(timestamp))\n        ip_timestamp = bytes_(ip_timestamp)\n    else:\n        # encode_ip_timestamp not required, left in for backwards compatibility\n        ip_timestamp = encode_ip_timestamp(ip, timestamp)\n\n    hash_obj.update(\n        ip_timestamp + secret + userid + b'\\0' + tokens + b'\\0' + user_data\n    )\n    digest = hash_obj.hexdigest()\n    hash_obj2 = hashlib.new(hashalg)\n    hash_obj2.update(bytes_(digest) + secret)\n    return hash_obj2.hexdigest()\n\n\n# this function licensed under the MIT license (stolen from Paste)\ndef encode_ip_timestamp(ip, timestamp):\n    ip_chars = ''.join(map(chr, map(int, ip.split('.'))))\n    t = int(timestamp)\n    ts = (\n        (t & 0xFF000000) >> 24,\n        (t & 0xFF0000) >> 16,\n        (t & 0xFF00) >> 8,\n        t & 0xFF,\n    )\n    ts_chars = ''.join(map(chr, ts))\n    return bytes_(ip_chars + ts_chars)\n\n\nclass AuthTktCookieHelper:\n    \"\"\"\n    A helper class for security policies that obtains data from an \"auth\n    ticket\" cookie.\n\n    Constructor Arguments\n\n    ``secret``\n\n       The secret (a string) used for auth_tkt cookie signing.  This value\n       should be unique across all values provided to Pyramid for various\n       subsystem secrets (see :ref:`admonishment_against_secret_sharing`).\n       Required.\n\n    ``cookie_name``\n\n       Default: ``auth_tkt``.  The cookie name used\n       (string).  Optional.\n\n    ``secure``\n\n       Default: ``False``.  Only send the cookie back over a secure\n       conn.  Optional.\n\n    ``include_ip``\n\n       Default: ``False``.  Make the requesting IP address part of\n       the authentication data in the cookie.  Optional.\n\n       For IPv6 this option is not recommended. The ``mod_auth_tkt``\n       specification does not specify how to handle IPv6 addresses, so using\n       this option in combination with IPv6 addresses may cause an\n       incompatible cookie. It ties the authentication ticket to that\n       individual's IPv6 address.\n\n    ``timeout``\n\n       Default: ``None``.  Maximum number of seconds which a newly\n       issued ticket will be considered valid.  After this amount of\n       time, the ticket will expire (effectively logging the user\n       out).  If this value is ``None``, the ticket never expires.\n       Optional.\n\n    ``reissue_time``\n\n       Default: ``None``.  If this parameter is set, it represents the number\n       of seconds that must pass before an authentication token cookie is\n       automatically reissued as the result of a request which requires\n       authentication.  The duration is measured as the number of seconds\n       since the last auth_tkt cookie was issued and 'now'.  If this value is\n       ``0``, a new ticket cookie will be reissued on every request which\n       requires authentication.\n\n       A good rule of thumb: if you want auto-expired cookies based on\n       inactivity: set the ``timeout`` value to 1200 (20 mins) and set the\n       ``reissue_time`` value to perhaps a tenth of the ``timeout`` value\n       (120 or 2 mins).  It's nonsensical to set the ``timeout`` value lower\n       than the ``reissue_time`` value, as the ticket will never be reissued\n       if so.  However, such a configuration is not explicitly prevented.\n\n       Optional.\n\n    ``max_age``\n\n       Default: ``None``.  The max age of the auth_tkt cookie, in\n       seconds.  This differs from ``timeout`` inasmuch as ``timeout``\n       represents the lifetime of the ticket contained in the cookie,\n       while this value represents the lifetime of the cookie itself.\n       When this value is set, the cookie's ``Max-Age`` and\n       ``Expires`` settings will be set, allowing the auth_tkt cookie\n       to last between browser sessions.  It is typically nonsensical\n       to set this to a value that is lower than ``timeout`` or\n       ``reissue_time``, although it is not explicitly prevented.\n       Optional.\n\n    ``path``\n\n       Default: ``/``. The path for which the auth_tkt cookie is valid.\n       May be desirable if the application only serves part of a domain.\n       Optional.\n\n    ``http_only``\n\n       Default: ``False``. Hide cookie from JavaScript by setting the\n       HttpOnly flag. Not honored by all browsers.\n       Optional.\n\n    ``wild_domain``\n\n       Default: ``True``. An auth_tkt cookie will be generated for the\n       wildcard domain. If your site is hosted as ``example.com`` this\n       will make the cookie available for sites underneath ``example.com``\n       such as ``www.example.com``.\n       Optional.\n\n    ``parent_domain``\n\n       Default: ``False``. An auth_tkt cookie will be generated for the\n       parent domain of the current site. For example if your site is\n       hosted under ``www.example.com`` a cookie will be generated for\n       ``.example.com``. This can be useful if you have multiple sites\n       sharing the same domain. This option supercedes the ``wild_domain``\n       option.\n       Optional.\n\n    ``domain``\n\n       Default: ``None``. If provided the auth_tkt cookie will only be\n       set for this domain. This option is not compatible with ``wild_domain``\n       and ``parent_domain``.\n       Optional.\n\n    ``hashalg``\n\n       Default: ``sha512`` (the literal string).\n\n       Any hash algorithm supported by Python's ``hashlib.new()`` function\n       can be used as the ``hashalg``.\n\n       Cookies generated by different instances of AuthTktAuthenticationPolicy\n       using different ``hashalg`` options are not compatible. Switching the\n       ``hashalg`` will imply that all existing users with a valid cookie will\n       be required to re-login.\n\n       Optional.\n\n    ``debug``\n\n        Default: ``False``.  If ``debug`` is ``True``, log messages to the\n        Pyramid debug logger about the results of various authentication\n        steps.  The output from debugging is useful for reporting to maillist\n        or IRC channels when asking for support. Optional.\n\n    ``samesite``\n\n        Default: ``'Lax'``.  The 'samesite' option of the session cookie. Set\n        the value to ``None`` to turn off the samesite option. Optional.\n\n    .. versionchanged:: 2.0\n\n        The default ``hashalg`` was changed from ``md5`` to ``sha512``.\n\n    \"\"\"\n\n    parse_ticket = staticmethod(parse_ticket)  # for tests\n    AuthTicket = AuthTicket  # for tests\n    BadTicket = BadTicket  # for tests\n    now = None  # for tests\n\n    userid_type_decoders = {\n        'int': int,\n        'unicode': lambda x: utf_8_decode(x)[0],  # bw compat for old cookies\n        'b64unicode': lambda x: utf_8_decode(b64decode(x))[0],\n        'b64str': lambda x: b64decode(x),\n    }\n\n    userid_type_encoders = {\n        int: ('int', str),\n        str: ('b64unicode', lambda x: b64encode(utf_8_encode(x)[0])),\n        bytes: ('b64str', lambda x: b64encode(x)),\n    }\n\n    def __init__(\n        self,\n        secret,\n        cookie_name='auth_tkt',\n        secure=False,\n        include_ip=False,\n        timeout=None,\n        reissue_time=None,\n        max_age=None,\n        http_only=False,\n        path=\"/\",\n        wild_domain=True,\n        hashalg='sha512',\n        parent_domain=False,\n        domain=None,\n        samesite='Lax',\n    ):\n        self.cookie_profile = CookieProfile(\n            cookie_name=cookie_name,\n            secure=secure,\n            max_age=max_age,\n            httponly=http_only,\n            path=path,\n            serializer=SimpleSerializer(),\n            samesite=samesite,\n        )\n\n        self.secret = secret\n        self.cookie_name = cookie_name\n        self.secure = secure\n        self.include_ip = include_ip\n        self.timeout = timeout if timeout is None else int(timeout)\n        self.reissue_time = (\n            reissue_time if reissue_time is None else int(reissue_time)\n        )\n        self.max_age = max_age if max_age is None else int(max_age)\n        self.wild_domain = wild_domain\n        self.parent_domain = parent_domain\n        self.domain = domain\n        self.hashalg = hashalg\n\n    def _get_cookies(self, request, value, max_age=None):\n        cur_domain = request.domain\n\n        domains = []\n        if self.domain:\n            domains.append(self.domain)\n        else:\n            if self.parent_domain and cur_domain.count('.') > 1:\n                domains.append('.' + cur_domain.split('.', 1)[1])\n            else:\n                domains.append(None)\n                domains.append(cur_domain)\n                if self.wild_domain:\n                    domains.append('.' + cur_domain)\n\n        profile = self.cookie_profile(request)\n\n        kw = {}\n        kw['domains'] = domains\n        if max_age is not None:\n            kw['max_age'] = max_age\n\n        headers = profile.get_headers(value, **kw)\n        return headers\n\n    def identify(self, request):\n        \"\"\" Return a dictionary with authentication information, or ``None``\n        if no valid auth_tkt is attached to ``request``\"\"\"\n        environ = request.environ\n        cookie = request.cookies.get(self.cookie_name)\n\n        if cookie is None:\n            return None\n\n        if self.include_ip:\n            remote_addr = environ['REMOTE_ADDR']\n        else:\n            remote_addr = '0.0.0.0'\n\n        try:\n            timestamp, userid, tokens, user_data = self.parse_ticket(\n                self.secret, cookie, remote_addr, self.hashalg\n            )\n        except self.BadTicket:\n            return None\n\n        now = self.now  # service tests\n\n        if now is None:\n            now = time_mod.time()\n\n        if self.timeout and ((timestamp + self.timeout) < now):\n            # the auth_tkt data has expired\n            return None\n\n        userid_typename = 'userid_type:'\n        user_data_info = user_data.split('|')\n        for datum in filter(None, user_data_info):\n            if datum.startswith(userid_typename):\n                userid_type = datum[len(userid_typename) :]\n                decoder = self.userid_type_decoders.get(userid_type)\n                if decoder:\n                    userid = decoder(userid)\n\n        reissue = self.reissue_time is not None\n\n        if reissue and not hasattr(request, '_authtkt_reissued'):\n            if (now - timestamp) > self.reissue_time:\n                # See https://github.com/Pylons/pyramid/issues#issue/108\n                tokens = list(filter(None, tokens))\n                headers = self.remember(\n                    request, userid, max_age=self.max_age, tokens=tokens\n                )\n\n                def reissue_authtkt(request, response):\n                    if not hasattr(request, '_authtkt_reissue_revoked'):\n                        for k, v in headers:\n                            response.headerlist.append((k, v))\n\n                request.add_response_callback(reissue_authtkt)\n                request._authtkt_reissued = True\n\n        environ['REMOTE_USER_TOKENS'] = tokens\n        environ['REMOTE_USER_DATA'] = user_data\n        environ['AUTH_TYPE'] = 'cookie'\n\n        identity = {}\n        identity['timestamp'] = timestamp\n        identity['userid'] = userid\n        identity['tokens'] = tokens\n        identity['userdata'] = user_data\n        return identity\n\n    def forget(self, request):\n        \"\"\" Return a set of expires Set-Cookie headers, which will destroy\n        any existing auth_tkt cookie when attached to a response\"\"\"\n        request._authtkt_reissue_revoked = True\n        return self._get_cookies(request, None)\n\n    def remember(self, request, userid, max_age=None, tokens=()):\n        \"\"\" Return a set of Set-Cookie headers; when set into a response,\n        these headers will represent a valid authentication ticket.\n\n        ``max_age``\n          The max age of the auth_tkt cookie, in seconds.  When this value is\n          set, the cookie's ``Max-Age`` and ``Expires`` settings will be set,\n          allowing the auth_tkt cookie to last between browser sessions.  If\n          this value is ``None``, the ``max_age`` value provided to the\n          helper itself will be used as the ``max_age`` value.  Default:\n          ``None``.\n\n        ``tokens``\n          A sequence of strings that will be placed into the auth_tkt tokens\n          field.  Each string in the sequence must be of the Python ``str``\n          type and must match the regex ``^[A-Za-z][A-Za-z0-9+_-]*$``.\n          Tokens are available in the returned identity when an auth_tkt is\n          found in the request and unpacked.  Default: ``()``.\n        \"\"\"\n        max_age = self.max_age if max_age is None else int(max_age)\n\n        environ = request.environ\n\n        if self.include_ip:\n            remote_addr = environ['REMOTE_ADDR']\n        else:\n            remote_addr = '0.0.0.0'\n\n        user_data = ''\n\n        encoding_data = self.userid_type_encoders.get(type(userid))\n\n        if encoding_data:\n            encoding, encoder = encoding_data\n        else:\n            warnings.warn(\n                \"userid is of type {}, and is not supported by the \"\n                \"AuthTktAuthenticationPolicy. Explicitly converting to string \"\n                \"and storing as base64. Subsequent requests will receive a \"\n                \"string as the userid, it will not be decoded back to the \"\n                \"type provided.\".format(type(userid)),\n                RuntimeWarning,\n            )\n            encoding, encoder = self.userid_type_encoders.get(str)\n            userid = str(userid)\n\n        userid = encoder(userid)\n        user_data = 'userid_type:%s' % encoding\n\n        new_tokens = []\n        for token in tokens:\n            if isinstance(token, str):\n                try:\n                    token = ascii_(token)\n                except UnicodeEncodeError:\n                    raise ValueError(\"Invalid token %r\" % (token,))\n            if not (isinstance(token, str) and VALID_TOKEN.match(token)):\n                raise ValueError(\"Invalid token %r\" % (token,))\n            new_tokens.append(token)\n        tokens = tuple(new_tokens)\n\n        if hasattr(request, '_authtkt_reissued'):\n            request._authtkt_reissue_revoked = True\n\n        ticket = self.AuthTicket(\n            self.secret,\n            userid,\n            remote_addr,\n            tokens=tokens,\n            user_data=user_data,\n            cookie_name=self.cookie_name,\n            secure=self.secure,\n            hashalg=self.hashalg,\n        )\n\n        cookie_value = ticket.cookie_value()\n        return self._get_cookies(request, cookie_value, max_age)\n\n\n@implementer(IAuthenticationPolicy)\nclass SessionAuthenticationPolicy(CallbackAuthenticationPolicy):\n    \"\"\" A :app:`Pyramid` authentication policy which gets its data from the\n    configured :term:`session`.  For this authentication policy to work, you\n    will have to follow the instructions in the :ref:`sessions_chapter` to\n    configure a :term:`session factory`.\n\n    Constructor Arguments\n\n    ``prefix``\n\n       A prefix used when storing the authentication parameters in the\n       session. Defaults to 'auth.'. Optional.\n\n    ``callback``\n\n       Default: ``None``.  A callback passed the userid and the\n       request, expected to return ``None`` if the userid doesn't\n       exist or a sequence of principal identifiers (possibly empty) if\n       the user does exist.  If ``callback`` is ``None``, the userid\n       will be assumed to exist with no principals.  Optional.\n\n    ``debug``\n\n        Default: ``False``.  If ``debug`` is ``True``, log messages to the\n        Pyramid debug logger about the results of various authentication\n        steps.  The output from debugging is useful for reporting to maillist\n        or IRC channels when asking for support.\n\n    \"\"\"\n\n    def __init__(self, prefix='auth.', callback=None, debug=False):\n        self.callback = callback\n        self.debug = debug\n        self.helper = SessionAuthenticationHelper(prefix)\n\n    def remember(self, request, userid, **kw):\n        \"\"\" Store a userid in the session.\"\"\"\n        return self.helper.remember(request, userid, **kw)\n\n    def forget(self, request):\n        \"\"\" Remove the stored userid from the session.\"\"\"\n        return self.helper.forget(request)\n\n    def unauthenticated_userid(self, request):\n        return self.helper.authenticated_userid(request)\n\n\nclass SessionAuthenticationHelper:\n    \"\"\" A helper for use with a :term:`security policy` which stores user data\n    in the configured :term:`session`.\n\n    Constructor Arguments\n\n    ``prefix``\n\n       A prefix used when storing the authentication parameters in the\n       session. Defaults to 'auth.'. Optional.\n\n    \"\"\"\n\n    def __init__(self, prefix='auth.'):\n        self.userid_key = prefix + 'userid'\n\n    def remember(self, request, userid, **kw):\n        \"\"\" Store a userid in the session.\"\"\"\n        request.session[self.userid_key] = userid\n        return []\n\n    def forget(self, request, **kw):\n        \"\"\" Remove the stored userid from the session.\"\"\"\n        if self.userid_key in request.session:\n            del request.session[self.userid_key]\n        return []\n\n    def authenticated_userid(self, request):\n        \"\"\" Return the stored userid.\"\"\"\n        return request.session.get(self.userid_key)\n\n\n@implementer(IAuthenticationPolicy)\nclass BasicAuthAuthenticationPolicy(CallbackAuthenticationPolicy):\n    \"\"\" A :app:`Pyramid` authentication policy which uses HTTP standard basic\n    authentication protocol to authenticate users.  To use this policy you will\n    need to provide a callback which checks the supplied user credentials\n    against your source of login data.\n\n    Constructor Arguments\n\n    ``check``\n\n       A callback function passed a username, password and request, in that\n       order as positional arguments.  Expected to return ``None`` if the\n       userid doesn't exist or a sequence of principal identifiers (possibly\n       empty) if the user does exist.\n\n    ``realm``\n\n       Default: ``\"Realm\"``.  The Basic Auth Realm string.  Usually displayed\n       to the user by the browser in the login dialog.\n\n    ``debug``\n\n        Default: ``False``.  If ``debug`` is ``True``, log messages to the\n        Pyramid debug logger about the results of various authentication\n        steps.  The output from debugging is useful for reporting to maillist\n        or IRC channels when asking for support.\n\n    **Issuing a challenge**\n\n    Regular browsers will not send username/password credentials unless they\n    first receive a challenge from the server.  The following recipe will\n    register a view that will send a Basic Auth challenge to the user whenever\n    there is an attempt to call a view which results in a Forbidden response::\n\n        from pyramid.httpexceptions import HTTPUnauthorized\n        from pyramid.security import forget\n        from pyramid.view import forbidden_view_config\n\n        @forbidden_view_config()\n        def forbidden_view(request):\n            if request.authenticated_userid is None:\n                response = HTTPUnauthorized()\n                response.headers.update(forget(request))\n                return response\n            return HTTPForbidden()\n    \"\"\"\n\n    def __init__(self, check, realm='Realm', debug=False):\n        self.check = check\n        self.realm = realm\n        self.debug = debug\n\n    def unauthenticated_userid(self, request):\n        \"\"\" The userid parsed from the ``Authorization`` request header.\"\"\"\n        credentials = extract_http_basic_credentials(request)\n        if credentials:\n            return credentials.username\n\n    def remember(self, request, userid, **kw):\n        \"\"\" A no-op. Basic authentication does not provide a protocol for\n        remembering the user. Credentials are sent on every request.\n\n        \"\"\"\n        return []\n\n    def forget(self, request):\n        \"\"\" Returns challenge headers. This should be attached to a response\n        to indicate that credentials are required.\"\"\"\n        return [('WWW-Authenticate', 'Basic realm=\"%s\"' % self.realm)]\n\n    def callback(self, username, request):\n        # Username arg is ignored. Unfortunately\n        # extract_http_basic_credentials winds up getting called twice when\n        # authenticated_userid is called. Avoiding that, however,\n        # winds up duplicating logic from the superclass.\n        credentials = extract_http_basic_credentials(request)\n        if credentials:\n            username, password = credentials\n            return self.check(username, password, request)\n\n\nHTTPBasicCredentials = namedtuple(\n    'HTTPBasicCredentials', ['username', 'password']\n)\n\n\ndef extract_http_basic_credentials(request):\n    \"\"\" A helper function for extraction of HTTP Basic credentials\n    from a given :term:`request`.\n\n    Returns a :class:`.HTTPBasicCredentials` 2-tuple with ``username`` and\n    ``password`` attributes or ``None`` if no credentials could be found.\n\n    \"\"\"\n    authorization = request.headers.get('Authorization')\n    if not authorization:\n        return None\n\n    try:\n        authmeth, auth = authorization.split(' ', 1)\n    except ValueError:  # not enough values to unpack\n        return None\n\n    if authmeth.lower() != 'basic':\n        return None\n\n    try:\n        authbytes = b64decode(auth.strip())\n    except (TypeError, binascii.Error):  # can't decode\n        return None\n\n    # try utf-8 first, then latin-1; see discussion in\n    # https://github.com/Pylons/pyramid/issues/898\n    try:\n        auth = authbytes.decode('utf-8')\n    except UnicodeDecodeError:\n        auth = authbytes.decode('latin-1')\n\n    try:\n        username, password = auth.split(':', 1)\n    except ValueError:  # not enough values to unpack\n        return None\n\n    return HTTPBasicCredentials(username, password)\n",
            "new_file_content": "import base64\nimport binascii\nfrom codecs import utf_8_decode, utf_8_encode\nfrom collections import namedtuple\nimport hashlib\nimport re\nimport time as time_mod\nfrom urllib.parse import quote, unquote\nimport warnings\nfrom webob.cookies import CookieProfile\nfrom zope.interface import implementer\n\nfrom pyramid.authorization import Authenticated, Everyone\nfrom pyramid.interfaces import IAuthenticationPolicy, IDebugLogger\nfrom pyramid.util import (\n    SimpleSerializer,\n    ascii_,\n    bytes_,\n    strings_differ,\n    text_,\n)\n\nVALID_TOKEN = re.compile(r\"^[A-Za-z][A-Za-z0-9+_-]*$\")\n\n\nclass CallbackAuthenticationPolicy:\n    \"\"\" Abstract class \"\"\"\n\n    debug = False\n    callback = None\n\n    def _log(self, msg, methodname, request):\n        logger = request.registry.queryUtility(IDebugLogger)\n        if logger:\n            cls = self.__class__\n            classname = cls.__module__ + '.' + cls.__name__\n            methodname = classname + '.' + methodname\n            logger.debug(methodname + ': ' + msg)\n\n    def _clean_principal(self, princid):\n        if princid in (Authenticated, Everyone):\n            princid = None\n        return princid\n\n    def authenticated_userid(self, request):\n        \"\"\" Return the authenticated userid or ``None``.\n\n        If no callback is registered, this will be the same as\n        ``unauthenticated_userid``.\n\n        If a ``callback`` is registered, this will return the userid if\n        and only if the callback returns a value that is not ``None``.\n\n        \"\"\"\n        debug = self.debug\n        userid = self.unauthenticated_userid(request)\n        if userid is None:\n            debug and self._log(\n                'call to unauthenticated_userid returned None; returning None',\n                'authenticated_userid',\n                request,\n            )\n            return None\n        if self._clean_principal(userid) is None:\n            debug and self._log(\n                (\n                    'use of userid %r is disallowed by any built-in Pyramid '\n                    'security policy, returning None' % userid\n                ),\n                'authenticated_userid',\n                request,\n            )\n            return None\n\n        if self.callback is None:\n            debug and self._log(\n                'there was no groupfinder callback; returning %r' % (userid,),\n                'authenticated_userid',\n                request,\n            )\n            return userid\n        callback_ok = self.callback(userid, request)\n        if callback_ok is not None:  # is not None!\n            debug and self._log(\n                'groupfinder callback returned %r; returning %r'\n                % (callback_ok, userid),\n                'authenticated_userid',\n                request,\n            )\n            return userid\n        debug and self._log(\n            'groupfinder callback returned None; returning None',\n            'authenticated_userid',\n            request,\n        )\n\n    def effective_principals(self, request):\n        \"\"\" A list of effective principals derived from request.\n\n        This will return a list of principals including, at least,\n        :data:`pyramid.authorization.Everyone`. If there is no authenticated\n        userid, or the ``callback`` returns ``None``, this will be the\n        only principal:\n\n        .. code-block:: python\n\n            return [Everyone]\n\n        If the ``callback`` does not return ``None`` and an authenticated\n        userid is found, then the principals will include\n        :data:`pyramid.authorization.Authenticated`, the\n        ``authenticated_userid`` and the list of principals returned by the\n        ``callback``:\n\n        .. code-block:: python\n\n            extra_principals = callback(userid, request)\n            return [Everyone, Authenticated, userid] + extra_principals\n\n        \"\"\"\n        debug = self.debug\n        effective_principals = [Everyone]\n        userid = self.unauthenticated_userid(request)\n\n        if userid is None:\n            debug and self._log(\n                'unauthenticated_userid returned %r; returning %r'\n                % (userid, effective_principals),\n                'effective_principals',\n                request,\n            )\n            return effective_principals\n\n        if self._clean_principal(userid) is None:\n            debug and self._log(\n                (\n                    'unauthenticated_userid returned disallowed %r; returning '\n                    '%r as if it was None' % (userid, effective_principals)\n                ),\n                'effective_principals',\n                request,\n            )\n            return effective_principals\n\n        if self.callback is None:\n            debug and self._log(\n                'groupfinder callback is None, so groups is []',\n                'effective_principals',\n                request,\n            )\n            groups = []\n        else:\n            groups = self.callback(userid, request)\n            debug and self._log(\n                'groupfinder callback returned %r as groups' % (groups,),\n                'effective_principals',\n                request,\n            )\n\n        if groups is None:  # is None!\n            debug and self._log(\n                'returning effective principals: %r' % (effective_principals,),\n                'effective_principals',\n                request,\n            )\n            return effective_principals\n\n        effective_principals.append(Authenticated)\n        effective_principals.append(userid)\n        effective_principals.extend(groups)\n\n        debug and self._log(\n            'returning effective principals: %r' % (effective_principals,),\n            'effective_principals',\n            request,\n        )\n        return effective_principals\n\n\n@implementer(IAuthenticationPolicy)\nclass RepozeWho1AuthenticationPolicy(CallbackAuthenticationPolicy):\n    \"\"\" A :app:`Pyramid` :term:`authentication policy` which\n    obtains data from the :mod:`repoze.who` 1.X WSGI 'API' (the\n    ``repoze.who.identity`` key in the WSGI environment).\n\n    Constructor Arguments\n\n    ``identifier_name``\n\n       Default: ``auth_tkt``.  The :mod:`repoze.who` plugin name that\n       performs remember/forget.  Optional.\n\n    ``callback``\n\n        Default: ``None``.  A callback passed the :mod:`repoze.who` identity\n        and the :term:`request`, expected to return ``None`` if the user\n        represented by the identity doesn't exist or a sequence of principal\n        identifiers (possibly empty) representing groups if the user does\n        exist.  If ``callback`` is None, the userid will be assumed to exist\n        with no group principals.\n\n    Objects of this class implement the interface described by\n    :class:`pyramid.interfaces.IAuthenticationPolicy`.\n    \"\"\"\n\n    def __init__(self, identifier_name='auth_tkt', callback=None):\n        self.identifier_name = identifier_name\n        self.callback = callback\n\n    def _get_identity(self, request):\n        return request.environ.get('repoze.who.identity')\n\n    def _get_identifier(self, request):\n        plugins = request.environ.get('repoze.who.plugins')\n        if plugins is None:\n            return None\n        identifier = plugins[self.identifier_name]\n        return identifier\n\n    def authenticated_userid(self, request):\n        \"\"\" Return the authenticated userid or ``None``.\n\n        If no callback is registered, this will be the same as\n        ``unauthenticated_userid``.\n\n        If a ``callback`` is registered, this will return the userid if\n        and only if the callback returns a value that is not ``None``.\n\n        \"\"\"\n        identity = self._get_identity(request)\n\n        if identity is None:\n            self.debug and self._log(\n                'repoze.who identity is None, returning None',\n                'authenticated_userid',\n                request,\n            )\n            return None\n\n        userid = identity['repoze.who.userid']\n\n        if userid is None:\n            self.debug and self._log(\n                'repoze.who.userid is None, returning None' % userid,\n                'authenticated_userid',\n                request,\n            )\n            return None\n\n        if self._clean_principal(userid) is None:\n            self.debug and self._log(\n                (\n                    'use of userid %r is disallowed by any built-in Pyramid '\n                    'security policy, returning None' % userid\n                ),\n                'authenticated_userid',\n                request,\n            )\n            return None\n\n        if self.callback is None:\n            return userid\n\n        if self.callback(identity, request) is not None:  # is not None!\n            return userid\n\n    def unauthenticated_userid(self, request):\n        \"\"\" Return the ``repoze.who.userid`` key from the detected identity.\"\"\"\n        identity = self._get_identity(request)\n        if identity is None:\n            return None\n        return identity['repoze.who.userid']\n\n    def effective_principals(self, request):\n        \"\"\" A list of effective principals derived from the identity.\n\n        This will return a list of principals including, at least,\n        :data:`pyramid.authorization.Everyone`. If there is no identity, or\n        the ``callback`` returns ``None``, this will be the only principal.\n\n        If the ``callback`` does not return ``None`` and an identity is\n        found, then the principals will include\n        :data:`pyramid.authorization.Authenticated`, the\n        ``authenticated_userid`` and the list of principals returned by the\n        ``callback``.\n\n        \"\"\"\n        effective_principals = [Everyone]\n        identity = self._get_identity(request)\n\n        if identity is None:\n            self.debug and self._log(\n                (\n                    'repoze.who identity was None; returning %r'\n                    % effective_principals\n                ),\n                'effective_principals',\n                request,\n            )\n            return effective_principals\n\n        if self.callback is None:\n            groups = []\n        else:\n            groups = self.callback(identity, request)\n\n        if groups is None:  # is None!\n            self.debug and self._log(\n                (\n                    'security policy groups callback returned None; returning '\n                    '%r' % effective_principals\n                ),\n                'effective_principals',\n                request,\n            )\n            return effective_principals\n\n        userid = identity['repoze.who.userid']\n\n        if userid is None:\n            self.debug and self._log(\n                (\n                    'repoze.who.userid was None; returning %r'\n                    % effective_principals\n                ),\n                'effective_principals',\n                request,\n            )\n            return effective_principals\n\n        if self._clean_principal(userid) is None:\n            self.debug and self._log(\n                (\n                    'unauthenticated_userid returned disallowed %r; returning '\n                    '%r as if it was None' % (userid, effective_principals)\n                ),\n                'effective_principals',\n                request,\n            )\n            return effective_principals\n\n        effective_principals.append(Authenticated)\n        effective_principals.append(userid)\n        effective_principals.extend(groups)\n        return effective_principals\n\n    def remember(self, request, userid, **kw):\n        \"\"\" Store the ``userid`` as ``repoze.who.userid``.\n\n        The identity to authenticated to :mod:`repoze.who`\n        will contain the given userid as ``userid``, and\n        provide all keyword arguments as additional identity\n        keys. Useful keys could be ``max_age`` or ``userdata``.\n        \"\"\"\n        identifier = self._get_identifier(request)\n        if identifier is None:\n            return []\n        environ = request.environ\n        identity = kw\n        identity['repoze.who.userid'] = userid\n        return identifier.remember(environ, identity)\n\n    def forget(self, request):\n        \"\"\" Forget the current authenticated user.\n\n        Return headers that, if included in a response, will delete the\n        cookie responsible for tracking the current user.\n\n        \"\"\"\n        identifier = self._get_identifier(request)\n        if identifier is None:\n            return []\n        identity = self._get_identity(request)\n        return identifier.forget(request.environ, identity)\n\n\n@implementer(IAuthenticationPolicy)\nclass RemoteUserAuthenticationPolicy(CallbackAuthenticationPolicy):\n    \"\"\" A :app:`Pyramid` :term:`authentication policy` which\n    obtains data from the ``REMOTE_USER`` WSGI environment variable.\n\n    Constructor Arguments\n\n    ``environ_key``\n\n        Default: ``REMOTE_USER``.  The key in the WSGI environ which\n        provides the userid.\n\n    ``callback``\n\n        Default: ``None``.  A callback passed the userid and the request,\n        expected to return None if the userid doesn't exist or a sequence of\n        principal identifiers (possibly empty) representing groups if the\n        user does exist.  If ``callback`` is None, the userid will be assumed\n        to exist with no group principals.\n\n    ``debug``\n\n        Default: ``False``.  If ``debug`` is ``True``, log messages to the\n        Pyramid debug logger about the results of various authentication\n        steps.  The output from debugging is useful for reporting to maillist\n        or IRC channels when asking for support.\n\n    Objects of this class implement the interface described by\n    :class:`pyramid.interfaces.IAuthenticationPolicy`.\n    \"\"\"\n\n    def __init__(self, environ_key='REMOTE_USER', callback=None, debug=False):\n        self.environ_key = environ_key\n        self.callback = callback\n        self.debug = debug\n\n    def unauthenticated_userid(self, request):\n        \"\"\" The ``REMOTE_USER`` value found within the ``environ``.\"\"\"\n        return request.environ.get(self.environ_key)\n\n    def remember(self, request, userid, **kw):\n        \"\"\" A no-op. The ``REMOTE_USER`` does not provide a protocol for\n        remembering the user. This will be application-specific and can\n        be done somewhere else or in a subclass.\"\"\"\n        return []\n\n    def forget(self, request):\n        \"\"\" A no-op. The ``REMOTE_USER`` does not provide a protocol for\n        forgetting the user. This will be application-specific and can\n        be done somewhere else or in a subclass.\"\"\"\n        return []\n\n\n@implementer(IAuthenticationPolicy)\nclass AuthTktAuthenticationPolicy(CallbackAuthenticationPolicy):\n    \"\"\"A :app:`Pyramid` :term:`authentication policy` which\n    obtains data from a Pyramid \"auth ticket\" cookie.\n\n    Constructor Arguments\n\n    ``secret``\n\n       The secret (a string) used for auth_tkt cookie signing.  This value\n       should be unique across all values provided to Pyramid for various\n       subsystem secrets (see :ref:`admonishment_against_secret_sharing`).\n       Required.\n\n    ``callback``\n\n       Default: ``None``.  A callback passed the userid and the\n       request, expected to return ``None`` if the userid doesn't\n       exist or a sequence of principal identifiers (possibly empty) if\n       the user does exist.  If ``callback`` is ``None``, the userid\n       will be assumed to exist with no principals.  Optional.\n\n    ``cookie_name``\n\n       Default: ``auth_tkt``.  The cookie name used\n       (string).  Optional.\n\n    ``secure``\n\n       Default: ``False``.  Only send the cookie back over a secure\n       conn.  Optional.\n\n    ``include_ip``\n\n       Default: ``False``.  Make the requesting IP address part of\n       the authentication data in the cookie.  Optional.\n\n       For IPv6 this option is not recommended. The ``mod_auth_tkt``\n       specification does not specify how to handle IPv6 addresses, so using\n       this option in combination with IPv6 addresses may cause an\n       incompatible cookie. It ties the authentication ticket to that\n       individual's IPv6 address.\n\n    ``timeout``\n\n       Default: ``None``.  Maximum number of seconds which a newly\n       issued ticket will be considered valid.  After this amount of\n       time, the ticket will expire (effectively logging the user\n       out).  If this value is ``None``, the ticket never expires.\n       Optional.\n\n    ``reissue_time``\n\n       Default: ``None``.  If this parameter is set, it represents the number\n       of seconds that must pass before an authentication token cookie is\n       automatically reissued as the result of a request which requires\n       authentication.  The duration is measured as the number of seconds\n       since the last auth_tkt cookie was issued and 'now'.  If this value is\n       ``0``, a new ticket cookie will be reissued on every request which\n       requires authentication.\n\n       A good rule of thumb: if you want auto-expired cookies based on\n       inactivity: set the ``timeout`` value to 1200 (20 mins) and set the\n       ``reissue_time`` value to perhaps a tenth of the ``timeout`` value\n       (120 or 2 mins).  It's nonsensical to set the ``timeout`` value lower\n       than the ``reissue_time`` value, as the ticket will never be reissued\n       if so.  However, such a configuration is not explicitly prevented.\n\n       Optional.\n\n    ``max_age``\n\n       Default: ``None``.  The max age of the auth_tkt cookie, in\n       seconds.  This differs from ``timeout`` inasmuch as ``timeout``\n       represents the lifetime of the ticket contained in the cookie,\n       while this value represents the lifetime of the cookie itself.\n       When this value is set, the cookie's ``Max-Age`` and\n       ``Expires`` settings will be set, allowing the auth_tkt cookie\n       to last between browser sessions.  It is typically nonsensical\n       to set this to a value that is lower than ``timeout`` or\n       ``reissue_time``, although it is not explicitly prevented.\n       Optional.\n\n    ``path``\n\n       Default: ``/``. The path for which the auth_tkt cookie is valid.\n       May be desirable if the application only serves part of a domain.\n       Optional.\n\n    ``http_only``\n\n       Default: ``False``. Hide cookie from JavaScript by setting the\n       HttpOnly flag. Not honored by all browsers.\n       Optional.\n\n    ``wild_domain``\n\n       Default: ``True``. An auth_tkt cookie will be generated for the\n       wildcard domain. If your site is hosted as ``example.com`` this\n       will make the cookie available for sites underneath ``example.com``\n       such as ``www.example.com``.\n       Optional.\n\n    ``parent_domain``\n\n       Default: ``False``. An auth_tkt cookie will be generated for the\n       parent domain of the current site. For example if your site is\n       hosted under ``www.example.com`` a cookie will be generated for\n       ``.example.com``. This can be useful if you have multiple sites\n       sharing the same domain. This option supercedes the ``wild_domain``\n       option.\n       Optional.\n\n    ``domain``\n\n       Default: ``None``. If provided the auth_tkt cookie will only be\n       set for this domain. This option is not compatible with ``wild_domain``\n       and ``parent_domain``.\n       Optional.\n\n    ``hashalg``\n\n       Default: ``sha512`` (the literal string).\n\n       Any hash algorithm supported by Python's ``hashlib.new()`` function\n       can be used as the ``hashalg``.\n\n       Cookies generated by different instances of AuthTktAuthenticationPolicy\n       using different ``hashalg`` options are not compatible. Switching the\n       ``hashalg`` will imply that all existing users with a valid cookie will\n       be required to re-login.\n\n       Optional.\n\n    ``debug``\n\n        Default: ``False``.  If ``debug`` is ``True``, log messages to the\n        Pyramid debug logger about the results of various authentication\n        steps.  The output from debugging is useful for reporting to maillist\n        or IRC channels when asking for support.\n\n    ``samesite``\n\n        Default: ``'Lax'``.  The 'samesite' option of the session cookie. Set\n        the value to ``None`` to turn off the samesite option.\n\n    .. versionchanged:: 1.4\n\n       Added the ``hashalg`` option, defaulting to ``sha512``.\n\n    .. versionchanged:: 1.5\n\n       Added the ``domain`` option.\n\n       Added the ``parent_domain`` option.\n\n    .. versionchanged:: 1.10\n\n       Added the ``samesite`` option and made the default ``'Lax'``.\n\n    Objects of this class implement the interface described by\n    :class:`pyramid.interfaces.IAuthenticationPolicy`.\n\n    \"\"\"\n\n    def __init__(\n        self,\n        secret,\n        callback=None,\n        cookie_name='auth_tkt',\n        secure=False,\n        include_ip=False,\n        timeout=None,\n        reissue_time=None,\n        max_age=None,\n        path=\"/\",\n        http_only=False,\n        wild_domain=True,\n        debug=False,\n        hashalg='sha512',\n        parent_domain=False,\n        domain=None,\n        samesite='Lax',\n    ):\n        self.cookie = AuthTktCookieHelper(\n            secret,\n            cookie_name=cookie_name,\n            secure=secure,\n            include_ip=include_ip,\n            timeout=timeout,\n            reissue_time=reissue_time,\n            max_age=max_age,\n            http_only=http_only,\n            path=path,\n            wild_domain=wild_domain,\n            hashalg=hashalg,\n            parent_domain=parent_domain,\n            domain=domain,\n            samesite=samesite,\n        )\n        self.callback = callback\n        self.debug = debug\n\n    def unauthenticated_userid(self, request):\n        \"\"\" The userid key within the auth_tkt cookie.\"\"\"\n        result = self.cookie.identify(request)\n        if result:\n            return result['userid']\n\n    def remember(self, request, userid, **kw):\n        \"\"\" Accepts the following kw args: ``max_age=<int-seconds>,\n        ``tokens=<sequence-of-ascii-strings>``.\n\n        Return a list of headers which will set appropriate cookies on\n        the response.\n\n        \"\"\"\n        return self.cookie.remember(request, userid, **kw)\n\n    def forget(self, request):\n        \"\"\" A list of headers which will delete appropriate cookies.\"\"\"\n        return self.cookie.forget(request)\n\n\ndef b64encode(v):\n    return base64.b64encode(bytes_(v)).strip().replace(b'\\n', b'')\n\n\ndef b64decode(v):\n    return base64.b64decode(bytes_(v))\n\n\n# this class licensed under the MIT license (stolen from Paste)\nclass AuthTicket:\n    \"\"\"\n    This class represents an authentication token.  You must pass in\n    the shared secret, the userid, and the IP address.  Optionally you\n    can include tokens (a list of strings, representing role names),\n    'user_data', which is arbitrary data available for your own use in\n    later scripts.  Lastly, you can override the cookie name and\n    timestamp.\n\n    Once you provide all the arguments, use .cookie_value() to\n    generate the appropriate authentication ticket.\n\n    Usage::\n\n        token = AuthTicket('sharedsecret', 'username',\n            os.environ['REMOTE_ADDR'], tokens=['admin'])\n        val = token.cookie_value()\n\n    \"\"\"\n\n    def __init__(\n        self,\n        secret,\n        userid,\n        ip,\n        tokens=(),\n        user_data='',\n        time=None,\n        cookie_name='auth_tkt',\n        secure=False,\n        hashalg='md5',\n    ):\n        self.secret = secret\n        self.userid = userid\n        self.ip = ip\n        self.tokens = ','.join(tokens)\n        self.user_data = user_data\n        if time is None:\n            self.time = time_mod.time()\n        else:\n            self.time = time\n        self.cookie_name = cookie_name\n        self.secure = secure\n        self.hashalg = hashalg\n\n    def digest(self):\n        return calculate_digest(\n            self.ip,\n            self.time,\n            self.secret,\n            self.userid,\n            self.tokens,\n            self.user_data,\n            self.hashalg,\n        )\n\n    def cookie_value(self):\n        v = '%s%08x%s!' % (self.digest(), int(self.time), quote(self.userid))\n        if self.tokens:\n            v += self.tokens + '!'\n        v += self.user_data\n        return v\n\n\n# this class licensed under the MIT license (stolen from Paste)\nclass BadTicket(Exception):\n    \"\"\"\n    Exception raised when a ticket can't be parsed.  If we get far enough to\n    determine what the expected digest should have been, expected is set.\n    This should not be shown by default, but can be useful for debugging.\n    \"\"\"\n\n    def __init__(self, msg, expected=None):\n        self.expected = expected\n        Exception.__init__(self, msg)\n\n\n# this function licensed under the MIT license (stolen from Paste)\ndef parse_ticket(secret, ticket, ip, hashalg='md5'):\n    \"\"\"\n    Parse the ticket, returning (timestamp, userid, tokens, user_data).\n\n    If the ticket cannot be parsed, a ``BadTicket`` exception will be raised\n    with an explanation.\n    \"\"\"\n    ticket = text_(ticket).strip('\"')\n    digest_size = hashlib.new(hashalg).digest_size * 2\n    digest = ticket[:digest_size]\n    try:\n        timestamp = int(ticket[digest_size : digest_size + 8], 16)\n    except ValueError as e:\n        raise BadTicket('Timestamp is not a hex integer: %s' % e)\n    try:\n        userid, data = ticket[digest_size + 8 :].split('!', 1)\n    except ValueError:\n        raise BadTicket('userid is not followed by !')\n    userid = unquote(userid)\n    if '!' in data:\n        tokens, user_data = data.split('!', 1)\n    else:  # pragma: no cover (never generated)\n        # @@: Is this the right order?\n        tokens = ''\n        user_data = data\n\n    expected = calculate_digest(\n        ip, timestamp, secret, userid, tokens, user_data, hashalg\n    )\n\n    # Avoid timing attacks (see\n    # http://seb.dbzteam.org/crypto/python-oauth-timing-hmac.pdf)\n    if strings_differ(expected, digest):\n        raise BadTicket(\n            'Digest signature is not correct', expected=(expected, digest)\n        )\n\n    tokens = tokens.split(',')\n\n    return (timestamp, userid, tokens, user_data)\n\n\n# this function licensed under the MIT license (stolen from Paste)\ndef calculate_digest(\n    ip, timestamp, secret, userid, tokens, user_data, hashalg='md5'\n):\n    secret = bytes_(secret, 'utf-8')\n    userid = bytes_(userid, 'utf-8')\n    tokens = bytes_(tokens, 'utf-8')\n    user_data = bytes_(user_data, 'utf-8')\n    hash_obj = hashlib.new(hashalg)\n\n    # Check to see if this is an IPv6 address\n    if ':' in ip:\n        ip_timestamp = ip + str(int(timestamp))\n        ip_timestamp = bytes_(ip_timestamp)\n    else:\n        # encode_ip_timestamp not required, left in for backwards compatibility\n        ip_timestamp = encode_ip_timestamp(ip, timestamp)\n\n    hash_obj.update(\n        ip_timestamp + secret + userid + b'\\0' + tokens + b'\\0' + user_data\n    )\n    digest = hash_obj.hexdigest()\n    hash_obj2 = hashlib.new(hashalg)\n    hash_obj2.update(bytes_(digest) + secret)\n    return hash_obj2.hexdigest()\n\n\n# this function licensed under the MIT license (stolen from Paste)\ndef encode_ip_timestamp(ip, timestamp):\n    ip_chars = ''.join(map(chr, map(int, ip.split('.'))))\n    t = int(timestamp)\n    ts = (\n        (t & 0xFF000000) >> 24,\n        (t & 0xFF0000) >> 16,\n        (t & 0xFF00) >> 8,\n        t & 0xFF,\n    )\n    ts_chars = ''.join(map(chr, ts))\n    return bytes_(ip_chars + ts_chars)\n\n\nclass AuthTktCookieHelper:\n    \"\"\"\n    A helper class for security policies that obtains data from an \"auth\n    ticket\" cookie.\n\n    Constructor Arguments\n\n    ``secret``\n\n       The secret (a string) used for auth_tkt cookie signing.  This value\n       should be unique across all values provided to Pyramid for various\n       subsystem secrets (see :ref:`admonishment_against_secret_sharing`).\n       Required.\n\n    ``cookie_name``\n\n       Default: ``auth_tkt``.  The cookie name used\n       (string).  Optional.\n\n    ``secure``\n\n       Default: ``False``.  Only send the cookie back over a secure\n       conn.  Optional.\n\n    ``include_ip``\n\n       Default: ``False``.  Make the requesting IP address part of\n       the authentication data in the cookie.  Optional.\n\n       For IPv6 this option is not recommended. The ``mod_auth_tkt``\n       specification does not specify how to handle IPv6 addresses, so using\n       this option in combination with IPv6 addresses may cause an\n       incompatible cookie. It ties the authentication ticket to that\n       individual's IPv6 address.\n\n    ``timeout``\n\n       Default: ``None``.  Maximum number of seconds which a newly\n       issued ticket will be considered valid.  After this amount of\n       time, the ticket will expire (effectively logging the user\n       out).  If this value is ``None``, the ticket never expires.\n       Optional.\n\n    ``reissue_time``\n\n       Default: ``None``.  If this parameter is set, it represents the number\n       of seconds that must pass before an authentication token cookie is\n       automatically reissued as the result of a request which requires\n       authentication.  The duration is measured as the number of seconds\n       since the last auth_tkt cookie was issued and 'now'.  If this value is\n       ``0``, a new ticket cookie will be reissued on every request which\n       requires authentication.\n\n       A good rule of thumb: if you want auto-expired cookies based on\n       inactivity: set the ``timeout`` value to 1200 (20 mins) and set the\n       ``reissue_time`` value to perhaps a tenth of the ``timeout`` value\n       (120 or 2 mins).  It's nonsensical to set the ``timeout`` value lower\n       than the ``reissue_time`` value, as the ticket will never be reissued\n       if so.  However, such a configuration is not explicitly prevented.\n\n       Optional.\n\n    ``max_age``\n\n       Default: ``None``.  The max age of the auth_tkt cookie, in\n       seconds.  This differs from ``timeout`` inasmuch as ``timeout``\n       represents the lifetime of the ticket contained in the cookie,\n       while this value represents the lifetime of the cookie itself.\n       When this value is set, the cookie's ``Max-Age`` and\n       ``Expires`` settings will be set, allowing the auth_tkt cookie\n       to last between browser sessions.  It is typically nonsensical\n       to set this to a value that is lower than ``timeout`` or\n       ``reissue_time``, although it is not explicitly prevented.\n       Optional.\n\n    ``path``\n\n       Default: ``/``. The path for which the auth_tkt cookie is valid.\n       May be desirable if the application only serves part of a domain.\n       Optional.\n\n    ``http_only``\n\n       Default: ``False``. Hide cookie from JavaScript by setting the\n       HttpOnly flag. Not honored by all browsers.\n       Optional.\n\n    ``wild_domain``\n\n       Default: ``True``. An auth_tkt cookie will be generated for the\n       wildcard domain. If your site is hosted as ``example.com`` this\n       will make the cookie available for sites underneath ``example.com``\n       such as ``www.example.com``.\n       Optional.\n\n    ``parent_domain``\n\n       Default: ``False``. An auth_tkt cookie will be generated for the\n       parent domain of the current site. For example if your site is\n       hosted under ``www.example.com`` a cookie will be generated for\n       ``.example.com``. This can be useful if you have multiple sites\n       sharing the same domain. This option supercedes the ``wild_domain``\n       option.\n       Optional.\n\n    ``domain``\n\n       Default: ``None``. If provided the auth_tkt cookie will only be\n       set for this domain. This option is not compatible with ``wild_domain``\n       and ``parent_domain``.\n       Optional.\n\n    ``hashalg``\n\n       Default: ``sha512`` (the literal string).\n\n       Any hash algorithm supported by Python's ``hashlib.new()`` function\n       can be used as the ``hashalg``.\n\n       Cookies generated by different instances of AuthTktAuthenticationPolicy\n       using different ``hashalg`` options are not compatible. Switching the\n       ``hashalg`` will imply that all existing users with a valid cookie will\n       be required to re-login.\n\n       Optional.\n\n    ``debug``\n\n        Default: ``False``.  If ``debug`` is ``True``, log messages to the\n        Pyramid debug logger about the results of various authentication\n        steps.  The output from debugging is useful for reporting to maillist\n        or IRC channels when asking for support. Optional.\n\n    ``samesite``\n\n        Default: ``'Lax'``.  The 'samesite' option of the session cookie. Set\n        the value to ``None`` to turn off the samesite option. Optional.\n\n    .. versionchanged:: 2.0\n\n        The default ``hashalg`` was changed from ``md5`` to ``sha512``.\n\n    \"\"\"\n\n    parse_ticket = staticmethod(parse_ticket)  # for tests\n    AuthTicket = AuthTicket  # for tests\n    BadTicket = BadTicket  # for tests\n    now = None  # for tests\n\n    userid_type_decoders = {\n        'int': int,\n        'unicode': lambda x: utf_8_decode(x)[0],  # bw compat for old cookies\n        'b64unicode': lambda x: utf_8_decode(b64decode(x))[0],\n        'b64str': lambda x: b64decode(x),\n    }\n\n    userid_type_encoders = {\n        int: ('int', str),\n        str: ('b64unicode', lambda x: b64encode(utf_8_encode(x)[0])),\n        bytes: ('b64str', lambda x: b64encode(x)),\n    }\n\n    def __init__(\n        self,\n        secret,\n        cookie_name='auth_tkt',\n        secure=False,\n        include_ip=False,\n        timeout=None,\n        reissue_time=None,\n        max_age=None,\n        http_only=False,\n        path=\"/\",\n        wild_domain=True,\n        hashalg='sha512',\n        parent_domain=False,\n        domain=None,\n        samesite='Lax',\n    ):\n        self.cookie_profile = CookieProfile(\n            cookie_name=cookie_name,\n            secure=secure,\n            max_age=max_age,\n            httponly=http_only,\n            path=path,\n            serializer=SimpleSerializer(),\n            samesite=samesite,\n        )\n\n        self.secret = secret\n        self.cookie_name = cookie_name\n        self.secure = secure\n        self.include_ip = include_ip\n        self.timeout = timeout if timeout is None else int(timeout)\n        self.reissue_time = (\n            reissue_time if reissue_time is None else int(reissue_time)\n        )\n        self.max_age = max_age if max_age is None else int(max_age)\n        self.wild_domain = wild_domain\n        self.parent_domain = parent_domain\n        self.domain = domain\n        self.hashalg = hashalg\n\n    def _get_cookies(self, request, value, max_age=None):\n        cur_domain = request.domain\n\n        domains = []\n        if self.domain:\n            domains.append(self.domain)\n        else:\n            if self.parent_domain and cur_domain.count('.') > 1:\n                domains.append('.' + cur_domain.split('.', 1)[1])\n            else:\n                domains.append(None)\n                if self.wild_domain:\n                    domains.append(cur_domain)\n                    domains.append('.' + cur_domain)\n\n        profile = self.cookie_profile(request)\n\n        kw = {}\n        kw['domains'] = domains\n        if max_age is not None:\n            kw['max_age'] = max_age\n\n        headers = profile.get_headers(value, **kw)\n        return headers\n\n    def identify(self, request):\n        \"\"\" Return a dictionary with authentication information, or ``None``\n        if no valid auth_tkt is attached to ``request``\"\"\"\n        environ = request.environ\n        cookie = request.cookies.get(self.cookie_name)\n\n        if cookie is None:\n            return None\n\n        if self.include_ip:\n            remote_addr = environ['REMOTE_ADDR']\n        else:\n            remote_addr = '0.0.0.0'\n\n        try:\n            timestamp, userid, tokens, user_data = self.parse_ticket(\n                self.secret, cookie, remote_addr, self.hashalg\n            )\n        except self.BadTicket:\n            return None\n\n        now = self.now  # service tests\n\n        if now is None:\n            now = time_mod.time()\n\n        if self.timeout and ((timestamp + self.timeout) < now):\n            # the auth_tkt data has expired\n            return None\n\n        userid_typename = 'userid_type:'\n        user_data_info = user_data.split('|')\n        for datum in filter(None, user_data_info):\n            if datum.startswith(userid_typename):\n                userid_type = datum[len(userid_typename) :]\n                decoder = self.userid_type_decoders.get(userid_type)\n                if decoder:\n                    userid = decoder(userid)\n\n        reissue = self.reissue_time is not None\n\n        if reissue and not hasattr(request, '_authtkt_reissued'):\n            if (now - timestamp) > self.reissue_time:\n                # See https://github.com/Pylons/pyramid/issues#issue/108\n                tokens = list(filter(None, tokens))\n                headers = self.remember(\n                    request, userid, max_age=self.max_age, tokens=tokens\n                )\n\n                def reissue_authtkt(request, response):\n                    if not hasattr(request, '_authtkt_reissue_revoked'):\n                        for k, v in headers:\n                            response.headerlist.append((k, v))\n\n                request.add_response_callback(reissue_authtkt)\n                request._authtkt_reissued = True\n\n        environ['REMOTE_USER_TOKENS'] = tokens\n        environ['REMOTE_USER_DATA'] = user_data\n        environ['AUTH_TYPE'] = 'cookie'\n\n        identity = {}\n        identity['timestamp'] = timestamp\n        identity['userid'] = userid\n        identity['tokens'] = tokens\n        identity['userdata'] = user_data\n        return identity\n\n    def forget(self, request):\n        \"\"\" Return a set of expires Set-Cookie headers, which will destroy\n        any existing auth_tkt cookie when attached to a response\"\"\"\n        request._authtkt_reissue_revoked = True\n        return self._get_cookies(request, None)\n\n    def remember(self, request, userid, max_age=None, tokens=()):\n        \"\"\" Return a set of Set-Cookie headers; when set into a response,\n        these headers will represent a valid authentication ticket.\n\n        ``max_age``\n          The max age of the auth_tkt cookie, in seconds.  When this value is\n          set, the cookie's ``Max-Age`` and ``Expires`` settings will be set,\n          allowing the auth_tkt cookie to last between browser sessions.  If\n          this value is ``None``, the ``max_age`` value provided to the\n          helper itself will be used as the ``max_age`` value.  Default:\n          ``None``.\n\n        ``tokens``\n          A sequence of strings that will be placed into the auth_tkt tokens\n          field.  Each string in the sequence must be of the Python ``str``\n          type and must match the regex ``^[A-Za-z][A-Za-z0-9+_-]*$``.\n          Tokens are available in the returned identity when an auth_tkt is\n          found in the request and unpacked.  Default: ``()``.\n        \"\"\"\n        max_age = self.max_age if max_age is None else int(max_age)\n\n        environ = request.environ\n\n        if self.include_ip:\n            remote_addr = environ['REMOTE_ADDR']\n        else:\n            remote_addr = '0.0.0.0'\n\n        user_data = ''\n\n        encoding_data = self.userid_type_encoders.get(type(userid))\n\n        if encoding_data:\n            encoding, encoder = encoding_data\n        else:\n            warnings.warn(\n                \"userid is of type {}, and is not supported by the \"\n                \"AuthTktAuthenticationPolicy. Explicitly converting to string \"\n                \"and storing as base64. Subsequent requests will receive a \"\n                \"string as the userid, it will not be decoded back to the \"\n                \"type provided.\".format(type(userid)),\n                RuntimeWarning,\n            )\n            encoding, encoder = self.userid_type_encoders.get(str)\n            userid = str(userid)\n\n        userid = encoder(userid)\n        user_data = 'userid_type:%s' % encoding\n\n        new_tokens = []\n        for token in tokens:\n            if isinstance(token, str):\n                try:\n                    token = ascii_(token)\n                except UnicodeEncodeError:\n                    raise ValueError(\"Invalid token %r\" % (token,))\n            if not (isinstance(token, str) and VALID_TOKEN.match(token)):\n                raise ValueError(\"Invalid token %r\" % (token,))\n            new_tokens.append(token)\n        tokens = tuple(new_tokens)\n\n        if hasattr(request, '_authtkt_reissued'):\n            request._authtkt_reissue_revoked = True\n\n        ticket = self.AuthTicket(\n            self.secret,\n            userid,\n            remote_addr,\n            tokens=tokens,\n            user_data=user_data,\n            cookie_name=self.cookie_name,\n            secure=self.secure,\n            hashalg=self.hashalg,\n        )\n\n        cookie_value = ticket.cookie_value()\n        return self._get_cookies(request, cookie_value, max_age)\n\n\n@implementer(IAuthenticationPolicy)\nclass SessionAuthenticationPolicy(CallbackAuthenticationPolicy):\n    \"\"\" A :app:`Pyramid` authentication policy which gets its data from the\n    configured :term:`session`.  For this authentication policy to work, you\n    will have to follow the instructions in the :ref:`sessions_chapter` to\n    configure a :term:`session factory`.\n\n    Constructor Arguments\n\n    ``prefix``\n\n       A prefix used when storing the authentication parameters in the\n       session. Defaults to 'auth.'. Optional.\n\n    ``callback``\n\n       Default: ``None``.  A callback passed the userid and the\n       request, expected to return ``None`` if the userid doesn't\n       exist or a sequence of principal identifiers (possibly empty) if\n       the user does exist.  If ``callback`` is ``None``, the userid\n       will be assumed to exist with no principals.  Optional.\n\n    ``debug``\n\n        Default: ``False``.  If ``debug`` is ``True``, log messages to the\n        Pyramid debug logger about the results of various authentication\n        steps.  The output from debugging is useful for reporting to maillist\n        or IRC channels when asking for support.\n\n    \"\"\"\n\n    def __init__(self, prefix='auth.', callback=None, debug=False):\n        self.callback = callback\n        self.debug = debug\n        self.helper = SessionAuthenticationHelper(prefix)\n\n    def remember(self, request, userid, **kw):\n        \"\"\" Store a userid in the session.\"\"\"\n        return self.helper.remember(request, userid, **kw)\n\n    def forget(self, request):\n        \"\"\" Remove the stored userid from the session.\"\"\"\n        return self.helper.forget(request)\n\n    def unauthenticated_userid(self, request):\n        return self.helper.authenticated_userid(request)\n\n\nclass SessionAuthenticationHelper:\n    \"\"\" A helper for use with a :term:`security policy` which stores user data\n    in the configured :term:`session`.\n\n    Constructor Arguments\n\n    ``prefix``\n\n       A prefix used when storing the authentication parameters in the\n       session. Defaults to 'auth.'. Optional.\n\n    \"\"\"\n\n    def __init__(self, prefix='auth.'):\n        self.userid_key = prefix + 'userid'\n\n    def remember(self, request, userid, **kw):\n        \"\"\" Store a userid in the session.\"\"\"\n        request.session[self.userid_key] = userid\n        return []\n\n    def forget(self, request, **kw):\n        \"\"\" Remove the stored userid from the session.\"\"\"\n        if self.userid_key in request.session:\n            del request.session[self.userid_key]\n        return []\n\n    def authenticated_userid(self, request):\n        \"\"\" Return the stored userid.\"\"\"\n        return request.session.get(self.userid_key)\n\n\n@implementer(IAuthenticationPolicy)\nclass BasicAuthAuthenticationPolicy(CallbackAuthenticationPolicy):\n    \"\"\" A :app:`Pyramid` authentication policy which uses HTTP standard basic\n    authentication protocol to authenticate users.  To use this policy you will\n    need to provide a callback which checks the supplied user credentials\n    against your source of login data.\n\n    Constructor Arguments\n\n    ``check``\n\n       A callback function passed a username, password and request, in that\n       order as positional arguments.  Expected to return ``None`` if the\n       userid doesn't exist or a sequence of principal identifiers (possibly\n       empty) if the user does exist.\n\n    ``realm``\n\n       Default: ``\"Realm\"``.  The Basic Auth Realm string.  Usually displayed\n       to the user by the browser in the login dialog.\n\n    ``debug``\n\n        Default: ``False``.  If ``debug`` is ``True``, log messages to the\n        Pyramid debug logger about the results of various authentication\n        steps.  The output from debugging is useful for reporting to maillist\n        or IRC channels when asking for support.\n\n    **Issuing a challenge**\n\n    Regular browsers will not send username/password credentials unless they\n    first receive a challenge from the server.  The following recipe will\n    register a view that will send a Basic Auth challenge to the user whenever\n    there is an attempt to call a view which results in a Forbidden response::\n\n        from pyramid.httpexceptions import HTTPUnauthorized\n        from pyramid.security import forget\n        from pyramid.view import forbidden_view_config\n\n        @forbidden_view_config()\n        def forbidden_view(request):\n            if request.authenticated_userid is None:\n                response = HTTPUnauthorized()\n                response.headers.update(forget(request))\n                return response\n            return HTTPForbidden()\n    \"\"\"\n\n    def __init__(self, check, realm='Realm', debug=False):\n        self.check = check\n        self.realm = realm\n        self.debug = debug\n\n    def unauthenticated_userid(self, request):\n        \"\"\" The userid parsed from the ``Authorization`` request header.\"\"\"\n        credentials = extract_http_basic_credentials(request)\n        if credentials:\n            return credentials.username\n\n    def remember(self, request, userid, **kw):\n        \"\"\" A no-op. Basic authentication does not provide a protocol for\n        remembering the user. Credentials are sent on every request.\n\n        \"\"\"\n        return []\n\n    def forget(self, request):\n        \"\"\" Returns challenge headers. This should be attached to a response\n        to indicate that credentials are required.\"\"\"\n        return [('WWW-Authenticate', 'Basic realm=\"%s\"' % self.realm)]\n\n    def callback(self, username, request):\n        # Username arg is ignored. Unfortunately\n        # extract_http_basic_credentials winds up getting called twice when\n        # authenticated_userid is called. Avoiding that, however,\n        # winds up duplicating logic from the superclass.\n        credentials = extract_http_basic_credentials(request)\n        if credentials:\n            username, password = credentials\n            return self.check(username, password, request)\n\n\nHTTPBasicCredentials = namedtuple(\n    'HTTPBasicCredentials', ['username', 'password']\n)\n\n\ndef extract_http_basic_credentials(request):\n    \"\"\" A helper function for extraction of HTTP Basic credentials\n    from a given :term:`request`.\n\n    Returns a :class:`.HTTPBasicCredentials` 2-tuple with ``username`` and\n    ``password`` attributes or ``None`` if no credentials could be found.\n\n    \"\"\"\n    authorization = request.headers.get('Authorization')\n    if not authorization:\n        return None\n\n    try:\n        authmeth, auth = authorization.split(' ', 1)\n    except ValueError:  # not enough values to unpack\n        return None\n\n    if authmeth.lower() != 'basic':\n        return None\n\n    try:\n        authbytes = b64decode(auth.strip())\n    except (TypeError, binascii.Error):  # can't decode\n        return None\n\n    # try utf-8 first, then latin-1; see discussion in\n    # https://github.com/Pylons/pyramid/issues/898\n    try:\n        auth = authbytes.decode('utf-8')\n    except UnicodeDecodeError:\n        auth = authbytes.decode('latin-1')\n\n    try:\n        username, password = auth.split(':', 1)\n    except ValueError:  # not enough values to unpack\n        return None\n\n    return HTTPBasicCredentials(username, password)\n",
            "header": {
                "file": {
                    "path": "src/pyramid/authentication.py"
                },
                "misc_line": null
            },
            "index_line": {
                "old_commit_hash": "47570d5fc",
                "new_commit_hash": "1bddc1ff3",
                "mode": "100644"
            },
            "is_binary_file": false,
            "binary_line": null,
            "minus_file": {
                "path": "a/src/pyramid/authentication.py"
            },
            "plus_file": {
                "path": "b/src/pyramid/authentication.py"
            },
            "hunks": [
                {
                    "descriptor": {
                        "old_range": {
                            "start": 1035,
                            "length": 8
                        },
                        "new_range": {
                            "start": 1035,
                            "length": 8
                        },
                        "section": "class AuthTktCookieHelper:"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "                domains.append('.' + cur_domain.split('.', 1)[1])",
                                "type": "context"
                            },
                            {
                                "content": "            else:",
                                "type": "context"
                            },
                            {
                                "content": "                domains.append(None)",
                                "type": "context"
                            },
                            {
                                "content": "                domains.append(cur_domain)",
                                "type": "deleted"
                            },
                            {
                                "content": "                if self.wild_domain:",
                                "type": "context"
                            },
                            {
                                "content": "                    domains.append(cur_domain)",
                                "type": "added"
                            },
                            {
                                "content": "                    domains.append('.' + cur_domain)",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "        profile = self.cookie_profile(request)",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [
                        {
                            "file_name": "src/pyramid/authentication.py",
                            "type": "class",
                            "name": "AuthTktCookieHelper",
                            "content": "class AuthTktCookieHelper:\n    \"\"\"\n    A helper class for security policies that obtains data from an \"auth\n    ticket\" cookie.\n\n    Constructor Arguments\n\n    ``secret``\n\n       The secret (a string) used for auth_tkt cookie signing.  This value\n       should be unique across all values provided to Pyramid for various\n       subsystem secrets (see :ref:`admonishment_against_secret_sharing`).\n       Required.\n\n    ``cookie_name``\n\n       Default: ``auth_tkt``.  The cookie name used\n       (string).  Optional.\n\n    ``secure``\n\n       Default: ``False``.  Only send the cookie back over a secure\n       conn.  Optional.\n\n    ``include_ip``\n\n       Default: ``False``.  Make the requesting IP address part of\n       the authentication data in the cookie.  Optional.\n\n       For IPv6 this option is not recommended. The ``mod_auth_tkt``\n       specification does not specify how to handle IPv6 addresses, so using\n       this option in combination with IPv6 addresses may cause an\n       incompatible cookie. It ties the authentication ticket to that\n       individual's IPv6 address.\n\n    ``timeout``\n\n       Default: ``None``.  Maximum number of seconds which a newly\n       issued ticket will be considered valid.  After this amount of\n       time, the ticket will expire (effectively logging the user\n       out).  If this value is ``None``, the ticket never expires.\n       Optional.\n\n    ``reissue_time``\n\n       Default: ``None``.  If this parameter is set, it represents the number\n       of seconds that must pass before an authentication token cookie is\n       automatically reissued as the result of a request which requires\n       authentication.  The duration is measured as the number of seconds\n       since the last auth_tkt cookie was issued and 'now'.  If this value is\n       ``0``, a new ticket cookie will be reissued on every request which\n       requires authentication.\n\n       A good rule of thumb: if you want auto-expired cookies based on\n       inactivity: set the ``timeout`` value to 1200 (20 mins) and set the\n       ``reissue_time`` value to perhaps a tenth of the ``timeout`` value\n       (120 or 2 mins).  It's nonsensical to set the ``timeout`` value lower\n       than the ``reissue_time`` value, as the ticket will never be reissued\n       if so.  However, such a configuration is not explicitly prevented.\n\n       Optional.\n\n    ``max_age``\n\n       Default: ``None``.  The max age of the auth_tkt cookie, in\n       seconds.  This differs from ``timeout`` inasmuch as ``timeout``\n       represents the lifetime of the ticket contained in the cookie,\n       while this value represents the lifetime of the cookie itself.\n       When this value is set, the cookie's ``Max-Age`` and\n       ``Expires`` settings will be set, allowing the auth_tkt cookie\n       to last between browser sessions.  It is typically nonsensical\n       to set this to a value that is lower than ``timeout`` or\n       ``reissue_time``, although it is not explicitly prevented.\n       Optional.\n\n    ``path``\n\n       Default: ``/``. The path for which the auth_tkt cookie is valid.\n       May be desirable if the application only serves part of a domain.\n       Optional.\n\n    ``http_only``\n\n       Default: ``False``. Hide cookie from JavaScript by setting the\n       HttpOnly flag. Not honored by all browsers.\n       Optional.\n\n    ``wild_domain``\n\n       Default: ``True``. An auth_tkt cookie will be generated for the\n       wildcard domain. If your site is hosted as ``example.com`` this\n       will make the cookie available for sites underneath ``example.com``\n       such as ``www.example.com``.\n       Optional.\n\n    ``parent_domain``\n\n       Default: ``False``. An auth_tkt cookie will be generated for the\n       parent domain of the current site. For example if your site is\n       hosted under ``www.example.com`` a cookie will be generated for\n       ``.example.com``. This can be useful if you have multiple sites\n       sharing the same domain. This option supercedes the ``wild_domain``\n       option.\n       Optional.\n\n    ``domain``\n\n       Default: ``None``. If provided the auth_tkt cookie will only be\n       set for this domain. This option is not compatible with ``wild_domain``\n       and ``parent_domain``.\n       Optional.\n\n    ``hashalg``\n\n       Default: ``sha512`` (the literal string).\n\n       Any hash algorithm supported by Python's ``hashlib.new()`` function\n       can be used as the ``hashalg``.\n\n       Cookies generated by different instances of AuthTktAuthenticationPolicy\n       using different ``hashalg`` options are not compatible. Switching the\n       ``hashalg`` will imply that all existing users with a valid cookie will\n       be required to re-login.\n\n       Optional.\n\n    ``debug``\n\n        Default: ``False``.  If ``debug`` is ``True``, log messages to the\n        Pyramid debug logger about the results of various authentication\n        steps.  The output from debugging is useful for reporting to maillist\n        or IRC channels when asking for support. Optional.\n\n    ``samesite``\n\n        Default: ``'Lax'``.  The 'samesite' option of the session cookie. Set\n        the value to ``None`` to turn off the samesite option. Optional.\n\n    .. versionchanged:: 2.0\n\n        The default ``hashalg`` was changed from ``md5`` to ``sha512``.\n\n    \"\"\"\n\n    parse_ticket = staticmethod(parse_ticket)  # for tests\n    AuthTicket = AuthTicket  # for tests\n    BadTicket = BadTicket  # for tests\n    now = None  # for tests\n\n    userid_type_decoders = {\n        'int': int,\n        'unicode': lambda x: utf_8_decode(x)[0],  # bw compat for old cookies\n        'b64unicode': lambda x: utf_8_decode(b64decode(x))[0],\n        'b64str': lambda x: b64decode(x),\n    }\n\n    userid_type_encoders = {\n        int: ('int', str),\n        str: ('b64unicode', lambda x: b64encode(utf_8_encode(x)[0])),\n        bytes: ('b64str', lambda x: b64encode(x)),\n    }\n\n    def __init__(\n        self,\n        secret,\n        cookie_name='auth_tkt',\n        secure=False,\n        include_ip=False,\n        timeout=None,\n        reissue_time=None,\n        max_age=None,\n        http_only=False,\n        path=\"/\",\n        wild_domain=True,\n        hashalg='sha512',\n        parent_domain=False,\n        domain=None,\n        samesite='Lax',\n    ):\n        self.cookie_profile = CookieProfile(\n            cookie_name=cookie_name,\n            secure=secure,\n            max_age=max_age,\n            httponly=http_only,\n            path=path,\n            serializer=SimpleSerializer(),\n            samesite=samesite,\n        )\n\n        self.secret = secret\n        self.cookie_name = cookie_name\n        self.secure = secure\n        self.include_ip = include_ip\n        self.timeout = timeout if timeout is None else int(timeout)\n        self.reissue_time = (\n            reissue_time if reissue_time is None else int(reissue_time)\n        )\n        self.max_age = max_age if max_age is None else int(max_age)\n        self.wild_domain = wild_domain\n        self.parent_domain = parent_domain\n        self.domain = domain\n        self.hashalg = hashalg\n\n    def _get_cookies(self, request, value, max_age=None):\n        cur_domain = request.domain\n\n        domains = []\n        if self.domain:\n            domains.append(self.domain)\n        else:\n            if self.parent_domain and cur_domain.count('.') > 1:\n                domains.append('.' + cur_domain.split('.', 1)[1])\n            else:\n                domains.append(None)\n                domains.append(cur_domain)\n                if self.wild_domain:\n                    domains.append('.' + cur_domain)\n\n        profile = self.cookie_profile(request)\n\n        kw = {}\n        kw['domains'] = domains\n        if max_age is not None:\n            kw['max_age'] = max_age\n\n        headers = profile.get_headers(value, **kw)\n        return headers\n\n    def identify(self, request):\n        \"\"\" Return a dictionary with authentication information, or ``None``\n        if no valid auth_tkt is attached to ``request``\"\"\"\n        environ = request.environ\n        cookie = request.cookies.get(self.cookie_name)\n\n        if cookie is None:\n            return None\n\n        if self.include_ip:\n            remote_addr = environ['REMOTE_ADDR']\n        else:\n            remote_addr = '0.0.0.0'\n\n        try:\n            timestamp, userid, tokens, user_data = self.parse_ticket(\n                self.secret, cookie, remote_addr, self.hashalg\n            )\n        except self.BadTicket:\n            return None\n\n        now = self.now  # service tests\n\n        if now is None:\n            now = time_mod.time()\n\n        if self.timeout and ((timestamp + self.timeout) < now):\n            # the auth_tkt data has expired\n            return None\n\n        userid_typename = 'userid_type:'\n        user_data_info = user_data.split('|')\n        for datum in filter(None, user_data_info):\n            if datum.startswith(userid_typename):\n                userid_type = datum[len(userid_typename) :]\n                decoder = self.userid_type_decoders.get(userid_type)\n                if decoder:\n                    userid = decoder(userid)\n\n        reissue = self.reissue_time is not None\n\n        if reissue and not hasattr(request, '_authtkt_reissued'):\n            if (now - timestamp) > self.reissue_time:\n                # See https://github.com/Pylons/pyramid/issues#issue/108\n                tokens = list(filter(None, tokens))\n                headers = self.remember(\n                    request, userid, max_age=self.max_age, tokens=tokens\n                )\n\n                def reissue_authtkt(request, response):\n                    if not hasattr(request, '_authtkt_reissue_revoked'):\n                        for k, v in headers:\n                            response.headerlist.append((k, v))\n\n                request.add_response_callback(reissue_authtkt)\n                request._authtkt_reissued = True\n\n        environ['REMOTE_USER_TOKENS'] = tokens\n        environ['REMOTE_USER_DATA'] = user_data\n        environ['AUTH_TYPE'] = 'cookie'\n\n        identity = {}\n        identity['timestamp'] = timestamp\n        identity['userid'] = userid\n        identity['tokens'] = tokens\n        identity['userdata'] = user_data\n        return identity\n\n    def forget(self, request):\n        \"\"\" Return a set of expires Set-Cookie headers, which will destroy\n        any existing auth_tkt cookie when attached to a response\"\"\"\n        request._authtkt_reissue_revoked = True\n        return self._get_cookies(request, None)\n\n    def remember(self, request, userid, max_age=None, tokens=()):\n        \"\"\" Return a set of Set-Cookie headers; when set into a response,\n        these headers will represent a valid authentication ticket.\n\n        ``max_age``\n          The max age of the auth_tkt cookie, in seconds.  When this value is\n          set, the cookie's ``Max-Age`` and ``Expires`` settings will be set,\n          allowing the auth_tkt cookie to last between browser sessions.  If\n          this value is ``None``, the ``max_age`` value provided to the\n          helper itself will be used as the ``max_age`` value.  Default:\n          ``None``.\n\n        ``tokens``\n          A sequence of strings that will be placed into the auth_tkt tokens\n          field.  Each string in the sequence must be of the Python ``str``\n          type and must match the regex ``^[A-Za-z][A-Za-z0-9+_-]*$``.\n          Tokens are available in the returned identity when an auth_tkt is\n          found in the request and unpacked.  Default: ``()``.\n        \"\"\"\n        max_age = self.max_age if max_age is None else int(max_age)\n\n        environ = request.environ\n\n        if self.include_ip:\n            remote_addr = environ['REMOTE_ADDR']\n        else:\n            remote_addr = '0.0.0.0'\n\n        user_data = ''\n\n        encoding_data = self.userid_type_encoders.get(type(userid))\n\n        if encoding_data:\n            encoding, encoder = encoding_data\n        else:\n            warnings.warn(\n                \"userid is of type {}, and is not supported by the \"\n                \"AuthTktAuthenticationPolicy. Explicitly converting to string \"\n                \"and storing as base64. Subsequent requests will receive a \"\n                \"string as the userid, it will not be decoded back to the \"\n                \"type provided.\".format(type(userid)),\n                RuntimeWarning,\n            )\n            encoding, encoder = self.userid_type_encoders.get(str)\n            userid = str(userid)\n\n        userid = encoder(userid)\n        user_data = 'userid_type:%s' % encoding\n\n        new_tokens = []\n        for token in tokens:\n            if isinstance(token, str):\n                try:\n                    token = ascii_(token)\n                except UnicodeEncodeError:\n                    raise ValueError(\"Invalid token %r\" % (token,))\n            if not (isinstance(token, str) and VALID_TOKEN.match(token)):\n                raise ValueError(\"Invalid token %r\" % (token,))\n            new_tokens.append(token)\n        tokens = tuple(new_tokens)\n\n        if hasattr(request, '_authtkt_reissued'):\n            request._authtkt_reissue_revoked = True\n\n        ticket = self.AuthTicket(\n            self.secret,\n            userid,\n            remote_addr,\n            tokens=tokens,\n            user_data=user_data,\n            cookie_name=self.cookie_name,\n            secure=self.secure,\n            hashalg=self.hashalg,\n        )\n\n        cookie_value = ticket.cookie_value()\n        return self._get_cookies(request, cookie_value, max_age)",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 824,
                            "end_lineno": 1202,
                            "parent": null
                        },
                        {
                            "file_name": "src/pyramid/authentication.py",
                            "type": "method",
                            "name": "AuthTktCookieHelper._get_cookies",
                            "content": "class AuthTktCookieHelper:\n    \"\"\"\n    A helper class for security policies that obtains data from an \"auth\n    ticket\" cookie.\n\n    Constructor Arguments\n\n    ``secret``\n\n       The secret (a string) used for auth_tkt cookie signing.  This value\n       should be unique across all values provided to Pyramid for various\n       subsystem secrets (see :ref:`admonishment_against_secret_sharing`).\n       Required.\n\n    ``cookie_name``\n\n       Default: ``auth_tkt``.  The cookie name used\n       (string).  Optional.\n\n    ``secure``\n\n       Default: ``False``.  Only send the cookie back over a secure\n       conn.  Optional.\n\n    ``include_ip``\n\n       Default: ``False``.  Make the requesting IP address part of\n       the authentication data in the cookie.  Optional.\n\n       For IPv6 this option is not recommended. The ``mod_auth_tkt``\n       specification does not specify how to handle IPv6 addresses, so using\n       this option in combination with IPv6 addresses may cause an\n       incompatible cookie. It ties the authentication ticket to that\n       individual's IPv6 address.\n\n    ``timeout``\n\n       Default: ``None``.  Maximum number of seconds which a newly\n       issued ticket will be considered valid.  After this amount of\n       time, the ticket will expire (effectively logging the user\n       out).  If this value is ``None``, the ticket never expires.\n       Optional.\n\n    ``reissue_time``\n\n       Default: ``None``.  If this parameter is set, it represents the number\n       of seconds that must pass before an authentication token cookie is\n       automatically reissued as the result of a request which requires\n       authentication.  The duration is measured as the number of seconds\n       since the last auth_tkt cookie was issued and 'now'.  If this value is\n       ``0``, a new ticket cookie will be reissued on every request which\n       requires authentication.\n\n       A good rule of thumb: if you want auto-expired cookies based on\n       inactivity: set the ``timeout`` value to 1200 (20 mins) and set the\n       ``reissue_time`` value to perhaps a tenth of the ``timeout`` value\n       (120 or 2 mins).  It's nonsensical to set the ``timeout`` value lower\n       than the ``reissue_time`` value, as the ticket will never be reissued\n       if so.  However, such a configuration is not explicitly prevented.\n\n       Optional.\n\n    ``max_age``\n\n       Default: ``None``.  The max age of the auth_tkt cookie, in\n       seconds.  This differs from ``timeout`` inasmuch as ``timeout``\n       represents the lifetime of the ticket contained in the cookie,\n       while this value represents the lifetime of the cookie itself.\n       When this value is set, the cookie's ``Max-Age`` and\n       ``Expires`` settings will be set, allowing the auth_tkt cookie\n       to last between browser sessions.  It is typically nonsensical\n       to set this to a value that is lower than ``timeout`` or\n       ``reissue_time``, although it is not explicitly prevented.\n       Optional.\n\n    ``path``\n\n       Default: ``/``. The path for which the auth_tkt cookie is valid.\n       May be desirable if the application only serves part of a domain.\n       Optional.\n\n    ``http_only``\n\n       Default: ``False``. Hide cookie from JavaScript by setting the\n       HttpOnly flag. Not honored by all browsers.\n       Optional.\n\n    ``wild_domain``\n\n       Default: ``True``. An auth_tkt cookie will be generated for the\n       wildcard domain. If your site is hosted as ``example.com`` this\n       will make the cookie available for sites underneath ``example.com``\n       such as ``www.example.com``.\n       Optional.\n\n    ``parent_domain``\n\n       Default: ``False``. An auth_tkt cookie will be generated for the\n       parent domain of the current site. For example if your site is\n       hosted under ``www.example.com`` a cookie will be generated for\n       ``.example.com``. This can be useful if you have multiple sites\n       sharing the same domain. This option supercedes the ``wild_domain``\n       option.\n       Optional.\n\n    ``domain``\n\n       Default: ``None``. If provided the auth_tkt cookie will only be\n       set for this domain. This option is not compatible with ``wild_domain``\n       and ``parent_domain``.\n       Optional.\n\n    ``hashalg``\n\n       Default: ``sha512`` (the literal string).\n\n       Any hash algorithm supported by Python's ``hashlib.new()`` function\n       can be used as the ``hashalg``.\n\n       Cookies generated by different instances of AuthTktAuthenticationPolicy\n       using different ``hashalg`` options are not compatible. Switching the\n       ``hashalg`` will imply that all existing users with a valid cookie will\n       be required to re-login.\n\n       Optional.\n\n    ``debug``\n\n        Default: ``False``.  If ``debug`` is ``True``, log messages to the\n        Pyramid debug logger about the results of various authentication\n        steps.  The output from debugging is useful for reporting to maillist\n        or IRC channels when asking for support. Optional.\n\n    ``samesite``\n\n        Default: ``'Lax'``.  The 'samesite' option of the session cookie. Set\n        the value to ``None`` to turn off the samesite option. Optional.\n\n    .. versionchanged:: 2.0\n\n        The default ``hashalg`` was changed from ``md5`` to ``sha512``.\n\n    \"\"\"\n\n    parse_ticket = staticmethod(parse_ticket)  # for tests\n    AuthTicket = AuthTicket  # for tests\n    BadTicket = BadTicket  # for tests\n    now = None  # for tests\n\n    userid_type_decoders = {\n        'int': int,\n        'unicode': lambda x: utf_8_decode(x)[0],  # bw compat for old cookies\n        'b64unicode': lambda x: utf_8_decode(b64decode(x))[0],\n        'b64str': lambda x: b64decode(x),\n    }\n\n    userid_type_encoders = {\n        int: ('int', str),\n        str: ('b64unicode', lambda x: b64encode(utf_8_encode(x)[0])),\n        bytes: ('b64str', lambda x: b64encode(x)),\n    }\n\n    def __init__(\n        self,\n        secret,\n        cookie_name='auth_tkt',\n        secure=False,\n        include_ip=False,\n        timeout=None,\n        reissue_time=None,\n        max_age=None,\n        http_only=False,\n        path=\"/\",\n        wild_domain=True,\n        hashalg='sha512',\n        parent_domain=False,\n        domain=None,\n        samesite='Lax',\n    ):\n        self.cookie_profile = CookieProfile(\n            cookie_name=cookie_name,\n            secure=secure,\n            max_age=max_age,\n            httponly=http_only,\n            path=path,\n            serializer=SimpleSerializer(),\n            samesite=samesite,\n        )\n\n        self.secret = secret\n        self.cookie_name = cookie_name\n        self.secure = secure\n        self.include_ip = include_ip\n        self.timeout = timeout if timeout is None else int(timeout)\n        self.reissue_time = (\n            reissue_time if reissue_time is None else int(reissue_time)\n        )\n        self.max_age = max_age if max_age is None else int(max_age)\n        self.wild_domain = wild_domain\n        self.parent_domain = parent_domain\n        self.domain = domain\n        self.hashalg = hashalg\n\n    def _get_cookies(self, request, value, max_age=None):\n        cur_domain = request.domain\n\n        domains = []\n        if self.domain:\n            domains.append(self.domain)\n        else:\n            if self.parent_domain and cur_domain.count('.') > 1:\n                domains.append('.' + cur_domain.split('.', 1)[1])\n            else:\n                domains.append(None)\n                domains.append(cur_domain)\n                if self.wild_domain:\n                    domains.append('.' + cur_domain)\n\n        profile = self.cookie_profile(request)\n\n        kw = {}\n        kw['domains'] = domains\n        if max_age is not None:\n            kw['max_age'] = max_age\n\n        headers = profile.get_headers(value, **kw)\n        return headers\n\n    def identify(self, request):\n        \"\"\" Return a dictionary with authentication information, or ``None``\n        if no valid auth_tkt is attached to ``request``\"\"\"\n        environ = request.environ\n        cookie = request.cookies.get(self.cookie_name)\n\n        if cookie is None:\n            return None\n\n        if self.include_ip:\n            remote_addr = environ['REMOTE_ADDR']\n        else:\n            remote_addr = '0.0.0.0'\n\n        try:\n            timestamp, userid, tokens, user_data = self.parse_ticket(\n                self.secret, cookie, remote_addr, self.hashalg\n            )\n        except self.BadTicket:\n            return None\n\n        now = self.now  # service tests\n\n        if now is None:\n            now = time_mod.time()\n\n        if self.timeout and ((timestamp + self.timeout) < now):\n            # the auth_tkt data has expired\n            return None\n\n        userid_typename = 'userid_type:'\n        user_data_info = user_data.split('|')\n        for datum in filter(None, user_data_info):\n            if datum.startswith(userid_typename):\n                userid_type = datum[len(userid_typename) :]\n                decoder = self.userid_type_decoders.get(userid_type)\n                if decoder:\n                    userid = decoder(userid)\n\n        reissue = self.reissue_time is not None\n\n        if reissue and not hasattr(request, '_authtkt_reissued'):\n            if (now - timestamp) > self.reissue_time:\n                # See https://github.com/Pylons/pyramid/issues#issue/108\n                tokens = list(filter(None, tokens))\n                headers = self.remember(\n                    request, userid, max_age=self.max_age, tokens=tokens\n                )\n\n                def reissue_authtkt(request, response):\n                    if not hasattr(request, '_authtkt_reissue_revoked'):\n                        for k, v in headers:\n                            response.headerlist.append((k, v))\n\n                request.add_response_callback(reissue_authtkt)\n                request._authtkt_reissued = True\n\n        environ['REMOTE_USER_TOKENS'] = tokens\n        environ['REMOTE_USER_DATA'] = user_data\n        environ['AUTH_TYPE'] = 'cookie'\n\n        identity = {}\n        identity['timestamp'] = timestamp\n        identity['userid'] = userid\n        identity['tokens'] = tokens\n        identity['userdata'] = user_data\n        return identity\n\n    def forget(self, request):\n        \"\"\" Return a set of expires Set-Cookie headers, which will destroy\n        any existing auth_tkt cookie when attached to a response\"\"\"\n        request._authtkt_reissue_revoked = True\n        return self._get_cookies(request, None)\n\n    def remember(self, request, userid, max_age=None, tokens=()):\n        \"\"\" Return a set of Set-Cookie headers; when set into a response,\n        these headers will represent a valid authentication ticket.\n\n        ``max_age``\n          The max age of the auth_tkt cookie, in seconds.  When this value is\n          set, the cookie's ``Max-Age`` and ``Expires`` settings will be set,\n          allowing the auth_tkt cookie to last between browser sessions.  If\n          this value is ``None``, the ``max_age`` value provided to the\n          helper itself will be used as the ``max_age`` value.  Default:\n          ``None``.\n\n        ``tokens``\n          A sequence of strings that will be placed into the auth_tkt tokens\n          field.  Each string in the sequence must be of the Python ``str``\n          type and must match the regex ``^[A-Za-z][A-Za-z0-9+_-]*$``.\n          Tokens are available in the returned identity when an auth_tkt is\n          found in the request and unpacked.  Default: ``()``.\n        \"\"\"\n        max_age = self.max_age if max_age is None else int(max_age)\n\n        environ = request.environ\n\n        if self.include_ip:\n            remote_addr = environ['REMOTE_ADDR']\n        else:\n            remote_addr = '0.0.0.0'\n\n        user_data = ''\n\n        encoding_data = self.userid_type_encoders.get(type(userid))\n\n        if encoding_data:\n            encoding, encoder = encoding_data\n        else:\n            warnings.warn(\n                \"userid is of type {}, and is not supported by the \"\n                \"AuthTktAuthenticationPolicy. Explicitly converting to string \"\n                \"and storing as base64. Subsequent requests will receive a \"\n                \"string as the userid, it will not be decoded back to the \"\n                \"type provided.\".format(type(userid)),\n                RuntimeWarning,\n            )\n            encoding, encoder = self.userid_type_encoders.get(str)\n            userid = str(userid)\n\n        userid = encoder(userid)\n        user_data = 'userid_type:%s' % encoding\n\n        new_tokens = []\n        for token in tokens:\n            if isinstance(token, str):\n                try:\n                    token = ascii_(token)\n                except UnicodeEncodeError:\n                    raise ValueError(\"Invalid token %r\" % (token,))\n            if not (isinstance(token, str) and VALID_TOKEN.match(token)):\n                raise ValueError(\"Invalid token %r\" % (token,))\n            new_tokens.append(token)\n        tokens = tuple(new_tokens)\n\n        if hasattr(request, '_authtkt_reissued'):\n            request._authtkt_reissue_revoked = True\n\n        ticket = self.AuthTicket(\n            self.secret,\n            userid,\n            remote_addr,\n            tokens=tokens,\n            user_data=user_data,\n            cookie_name=self.cookie_name,\n            secure=self.secure,\n            hashalg=self.hashalg,\n        )\n\n        cookie_value = ticket.cookie_value()\n        return self._get_cookies(request, cookie_value, max_age)",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 1027,
                            "end_lineno": 1050,
                            "parent": {
                                "file_name": "src/pyramid/authentication.py",
                                "type": "class",
                                "name": "AuthTktCookieHelper",
                                "content": "class AuthTktCookieHelper:\n    \"\"\"\n    A helper class for security policies that obtains data from an \"auth\n    ticket\" cookie.\n\n    Constructor Arguments\n\n    ``secret``\n\n       The secret (a string) used for auth_tkt cookie signing.  This value\n       should be unique across all values provided to Pyramid for various\n       subsystem secrets (see :ref:`admonishment_against_secret_sharing`).\n       Required.\n\n    ``cookie_name``\n\n       Default: ``auth_tkt``.  The cookie name used\n       (string).  Optional.\n\n    ``secure``\n\n       Default: ``False``.  Only send the cookie back over a secure\n       conn.  Optional.\n\n    ``include_ip``\n\n       Default: ``False``.  Make the requesting IP address part of\n       the authentication data in the cookie.  Optional.\n\n       For IPv6 this option is not recommended. The ``mod_auth_tkt``\n       specification does not specify how to handle IPv6 addresses, so using\n       this option in combination with IPv6 addresses may cause an\n       incompatible cookie. It ties the authentication ticket to that\n       individual's IPv6 address.\n\n    ``timeout``\n\n       Default: ``None``.  Maximum number of seconds which a newly\n       issued ticket will be considered valid.  After this amount of\n       time, the ticket will expire (effectively logging the user\n       out).  If this value is ``None``, the ticket never expires.\n       Optional.\n\n    ``reissue_time``\n\n       Default: ``None``.  If this parameter is set, it represents the number\n       of seconds that must pass before an authentication token cookie is\n       automatically reissued as the result of a request which requires\n       authentication.  The duration is measured as the number of seconds\n       since the last auth_tkt cookie was issued and 'now'.  If this value is\n       ``0``, a new ticket cookie will be reissued on every request which\n       requires authentication.\n\n       A good rule of thumb: if you want auto-expired cookies based on\n       inactivity: set the ``timeout`` value to 1200 (20 mins) and set the\n       ``reissue_time`` value to perhaps a tenth of the ``timeout`` value\n       (120 or 2 mins).  It's nonsensical to set the ``timeout`` value lower\n       than the ``reissue_time`` value, as the ticket will never be reissued\n       if so.  However, such a configuration is not explicitly prevented.\n\n       Optional.\n\n    ``max_age``\n\n       Default: ``None``.  The max age of the auth_tkt cookie, in\n       seconds.  This differs from ``timeout`` inasmuch as ``timeout``\n       represents the lifetime of the ticket contained in the cookie,\n       while this value represents the lifetime of the cookie itself.\n       When this value is set, the cookie's ``Max-Age`` and\n       ``Expires`` settings will be set, allowing the auth_tkt cookie\n       to last between browser sessions.  It is typically nonsensical\n       to set this to a value that is lower than ``timeout`` or\n       ``reissue_time``, although it is not explicitly prevented.\n       Optional.\n\n    ``path``\n\n       Default: ``/``. The path for which the auth_tkt cookie is valid.\n       May be desirable if the application only serves part of a domain.\n       Optional.\n\n    ``http_only``\n\n       Default: ``False``. Hide cookie from JavaScript by setting the\n       HttpOnly flag. Not honored by all browsers.\n       Optional.\n\n    ``wild_domain``\n\n       Default: ``True``. An auth_tkt cookie will be generated for the\n       wildcard domain. If your site is hosted as ``example.com`` this\n       will make the cookie available for sites underneath ``example.com``\n       such as ``www.example.com``.\n       Optional.\n\n    ``parent_domain``\n\n       Default: ``False``. An auth_tkt cookie will be generated for the\n       parent domain of the current site. For example if your site is\n       hosted under ``www.example.com`` a cookie will be generated for\n       ``.example.com``. This can be useful if you have multiple sites\n       sharing the same domain. This option supercedes the ``wild_domain``\n       option.\n       Optional.\n\n    ``domain``\n\n       Default: ``None``. If provided the auth_tkt cookie will only be\n       set for this domain. This option is not compatible with ``wild_domain``\n       and ``parent_domain``.\n       Optional.\n\n    ``hashalg``\n\n       Default: ``sha512`` (the literal string).\n\n       Any hash algorithm supported by Python's ``hashlib.new()`` function\n       can be used as the ``hashalg``.\n\n       Cookies generated by different instances of AuthTktAuthenticationPolicy\n       using different ``hashalg`` options are not compatible. Switching the\n       ``hashalg`` will imply that all existing users with a valid cookie will\n       be required to re-login.\n\n       Optional.\n\n    ``debug``\n\n        Default: ``False``.  If ``debug`` is ``True``, log messages to the\n        Pyramid debug logger about the results of various authentication\n        steps.  The output from debugging is useful for reporting to maillist\n        or IRC channels when asking for support. Optional.\n\n    ``samesite``\n\n        Default: ``'Lax'``.  The 'samesite' option of the session cookie. Set\n        the value to ``None`` to turn off the samesite option. Optional.\n\n    .. versionchanged:: 2.0\n\n        The default ``hashalg`` was changed from ``md5`` to ``sha512``.\n\n    \"\"\"\n\n    parse_ticket = staticmethod(parse_ticket)  # for tests\n    AuthTicket = AuthTicket  # for tests\n    BadTicket = BadTicket  # for tests\n    now = None  # for tests\n\n    userid_type_decoders = {\n        'int': int,\n        'unicode': lambda x: utf_8_decode(x)[0],  # bw compat for old cookies\n        'b64unicode': lambda x: utf_8_decode(b64decode(x))[0],\n        'b64str': lambda x: b64decode(x),\n    }\n\n    userid_type_encoders = {\n        int: ('int', str),\n        str: ('b64unicode', lambda x: b64encode(utf_8_encode(x)[0])),\n        bytes: ('b64str', lambda x: b64encode(x)),\n    }\n\n    def __init__(\n        self,\n        secret,\n        cookie_name='auth_tkt',\n        secure=False,\n        include_ip=False,\n        timeout=None,\n        reissue_time=None,\n        max_age=None,\n        http_only=False,\n        path=\"/\",\n        wild_domain=True,\n        hashalg='sha512',\n        parent_domain=False,\n        domain=None,\n        samesite='Lax',\n    ):\n        self.cookie_profile = CookieProfile(\n            cookie_name=cookie_name,\n            secure=secure,\n            max_age=max_age,\n            httponly=http_only,\n            path=path,\n            serializer=SimpleSerializer(),\n            samesite=samesite,\n        )\n\n        self.secret = secret\n        self.cookie_name = cookie_name\n        self.secure = secure\n        self.include_ip = include_ip\n        self.timeout = timeout if timeout is None else int(timeout)\n        self.reissue_time = (\n            reissue_time if reissue_time is None else int(reissue_time)\n        )\n        self.max_age = max_age if max_age is None else int(max_age)\n        self.wild_domain = wild_domain\n        self.parent_domain = parent_domain\n        self.domain = domain\n        self.hashalg = hashalg\n\n    def _get_cookies(self, request, value, max_age=None):\n        cur_domain = request.domain\n\n        domains = []\n        if self.domain:\n            domains.append(self.domain)\n        else:\n            if self.parent_domain and cur_domain.count('.') > 1:\n                domains.append('.' + cur_domain.split('.', 1)[1])\n            else:\n                domains.append(None)\n                domains.append(cur_domain)\n                if self.wild_domain:\n                    domains.append('.' + cur_domain)\n\n        profile = self.cookie_profile(request)\n\n        kw = {}\n        kw['domains'] = domains\n        if max_age is not None:\n            kw['max_age'] = max_age\n\n        headers = profile.get_headers(value, **kw)\n        return headers\n\n    def identify(self, request):\n        \"\"\" Return a dictionary with authentication information, or ``None``\n        if no valid auth_tkt is attached to ``request``\"\"\"\n        environ = request.environ\n        cookie = request.cookies.get(self.cookie_name)\n\n        if cookie is None:\n            return None\n\n        if self.include_ip:\n            remote_addr = environ['REMOTE_ADDR']\n        else:\n            remote_addr = '0.0.0.0'\n\n        try:\n            timestamp, userid, tokens, user_data = self.parse_ticket(\n                self.secret, cookie, remote_addr, self.hashalg\n            )\n        except self.BadTicket:\n            return None\n\n        now = self.now  # service tests\n\n        if now is None:\n            now = time_mod.time()\n\n        if self.timeout and ((timestamp + self.timeout) < now):\n            # the auth_tkt data has expired\n            return None\n\n        userid_typename = 'userid_type:'\n        user_data_info = user_data.split('|')\n        for datum in filter(None, user_data_info):\n            if datum.startswith(userid_typename):\n                userid_type = datum[len(userid_typename) :]\n                decoder = self.userid_type_decoders.get(userid_type)\n                if decoder:\n                    userid = decoder(userid)\n\n        reissue = self.reissue_time is not None\n\n        if reissue and not hasattr(request, '_authtkt_reissued'):\n            if (now - timestamp) > self.reissue_time:\n                # See https://github.com/Pylons/pyramid/issues#issue/108\n                tokens = list(filter(None, tokens))\n                headers = self.remember(\n                    request, userid, max_age=self.max_age, tokens=tokens\n                )\n\n                def reissue_authtkt(request, response):\n                    if not hasattr(request, '_authtkt_reissue_revoked'):\n                        for k, v in headers:\n                            response.headerlist.append((k, v))\n\n                request.add_response_callback(reissue_authtkt)\n                request._authtkt_reissued = True\n\n        environ['REMOTE_USER_TOKENS'] = tokens\n        environ['REMOTE_USER_DATA'] = user_data\n        environ['AUTH_TYPE'] = 'cookie'\n\n        identity = {}\n        identity['timestamp'] = timestamp\n        identity['userid'] = userid\n        identity['tokens'] = tokens\n        identity['userdata'] = user_data\n        return identity\n\n    def forget(self, request):\n        \"\"\" Return a set of expires Set-Cookie headers, which will destroy\n        any existing auth_tkt cookie when attached to a response\"\"\"\n        request._authtkt_reissue_revoked = True\n        return self._get_cookies(request, None)\n\n    def remember(self, request, userid, max_age=None, tokens=()):\n        \"\"\" Return a set of Set-Cookie headers; when set into a response,\n        these headers will represent a valid authentication ticket.\n\n        ``max_age``\n          The max age of the auth_tkt cookie, in seconds.  When this value is\n          set, the cookie's ``Max-Age`` and ``Expires`` settings will be set,\n          allowing the auth_tkt cookie to last between browser sessions.  If\n          this value is ``None``, the ``max_age`` value provided to the\n          helper itself will be used as the ``max_age`` value.  Default:\n          ``None``.\n\n        ``tokens``\n          A sequence of strings that will be placed into the auth_tkt tokens\n          field.  Each string in the sequence must be of the Python ``str``\n          type and must match the regex ``^[A-Za-z][A-Za-z0-9+_-]*$``.\n          Tokens are available in the returned identity when an auth_tkt is\n          found in the request and unpacked.  Default: ``()``.\n        \"\"\"\n        max_age = self.max_age if max_age is None else int(max_age)\n\n        environ = request.environ\n\n        if self.include_ip:\n            remote_addr = environ['REMOTE_ADDR']\n        else:\n            remote_addr = '0.0.0.0'\n\n        user_data = ''\n\n        encoding_data = self.userid_type_encoders.get(type(userid))\n\n        if encoding_data:\n            encoding, encoder = encoding_data\n        else:\n            warnings.warn(\n                \"userid is of type {}, and is not supported by the \"\n                \"AuthTktAuthenticationPolicy. Explicitly converting to string \"\n                \"and storing as base64. Subsequent requests will receive a \"\n                \"string as the userid, it will not be decoded back to the \"\n                \"type provided.\".format(type(userid)),\n                RuntimeWarning,\n            )\n            encoding, encoder = self.userid_type_encoders.get(str)\n            userid = str(userid)\n\n        userid = encoder(userid)\n        user_data = 'userid_type:%s' % encoding\n\n        new_tokens = []\n        for token in tokens:\n            if isinstance(token, str):\n                try:\n                    token = ascii_(token)\n                except UnicodeEncodeError:\n                    raise ValueError(\"Invalid token %r\" % (token,))\n            if not (isinstance(token, str) and VALID_TOKEN.match(token)):\n                raise ValueError(\"Invalid token %r\" % (token,))\n            new_tokens.append(token)\n        tokens = tuple(new_tokens)\n\n        if hasattr(request, '_authtkt_reissued'):\n            request._authtkt_reissue_revoked = True\n\n        ticket = self.AuthTicket(\n            self.secret,\n            userid,\n            remote_addr,\n            tokens=tokens,\n            user_data=user_data,\n            cookie_name=self.cookie_name,\n            secure=self.secure,\n            hashalg=self.hashalg,\n        )\n\n        cookie_value = ticket.cookie_value()\n        return self._get_cookies(request, cookie_value, max_age)",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 824,
                                "end_lineno": 1202,
                                "parent": null
                            }
                        }
                    ],
                    "added_entities": [],
                    "deleted_entities": []
                }
            ]
        },
        {
            "old_file_content": "from http.cookies import SimpleCookie\nimport unittest\nimport warnings\n\nfrom pyramid import testing\nfrom pyramid.util import bytes_, text_\n\n\nclass TestCallbackAuthenticationPolicyDebugging(unittest.TestCase):\n    def setUp(self):\n        from pyramid.interfaces import IDebugLogger\n\n        self.config = testing.setUp()\n        self.config.registry.registerUtility(self, IDebugLogger)\n        self.messages = []\n\n    def tearDown(self):\n        del self.config\n\n    def debug(self, msg):\n        self.messages.append(msg)\n\n    def _makeOne(self, userid=None, callback=None):\n        from pyramid.authentication import CallbackAuthenticationPolicy\n\n        class MyAuthenticationPolicy(CallbackAuthenticationPolicy):\n            def unauthenticated_userid(self, request):\n                return userid\n\n        policy = MyAuthenticationPolicy()\n        policy.debug = True\n        policy.callback = callback\n        return policy\n\n    def test_authenticated_userid_no_unauthenticated_userid(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), None)\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            'tests.test_authentication.MyAuthenticationPolicy.'\n            'authenticated_userid: call to unauthenticated_userid returned '\n            'None; returning None',\n        )\n\n    def test_authenticated_userid_no_callback(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne(userid='fred')\n        self.assertEqual(policy.authenticated_userid(request), 'fred')\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            \"tests.test_authentication.MyAuthenticationPolicy.\"\n            \"authenticated_userid: there was no groupfinder callback; \"\n            \"returning 'fred'\",\n        )\n\n    def test_authenticated_userid_with_callback_fail(self):\n        request = DummyRequest(registry=self.config.registry)\n\n        def callback(userid, request):\n            return None\n\n        policy = self._makeOne(userid='fred', callback=callback)\n        self.assertEqual(policy.authenticated_userid(request), None)\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            'tests.test_authentication.MyAuthenticationPolicy.'\n            'authenticated_userid: groupfinder callback returned None; '\n            'returning None',\n        )\n\n    def test_authenticated_userid_with_callback_success(self):\n        request = DummyRequest(registry=self.config.registry)\n\n        def callback(userid, request):\n            return []\n\n        policy = self._makeOne(userid='fred', callback=callback)\n        self.assertEqual(policy.authenticated_userid(request), 'fred')\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            \"tests.test_authentication.MyAuthenticationPolicy.\"\n            \"authenticated_userid: groupfinder callback returned []; \"\n            \"returning 'fred'\",\n        )\n\n    def test_authenticated_userid_fails_cleaning_as_Authenticated(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne(userid='system.Authenticated')\n        self.assertEqual(policy.authenticated_userid(request), None)\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            \"tests.test_authentication.MyAuthenticationPolicy.\"\n            \"authenticated_userid: use of userid 'system.Authenticated' is \"\n            \"disallowed by any built-in Pyramid security policy, returning \"\n            \"None\",\n        )\n\n    def test_authenticated_userid_fails_cleaning_as_Everyone(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne(userid='system.Everyone')\n        self.assertEqual(policy.authenticated_userid(request), None)\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            \"tests.test_authentication.MyAuthenticationPolicy.\"\n            \"authenticated_userid: use of userid 'system.Everyone' is \"\n            \"disallowed by any built-in Pyramid security policy, returning \"\n            \"None\",\n        )\n\n    def test_effective_principals_no_unauthenticated_userid(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne()\n        self.assertEqual(\n            policy.effective_principals(request), ['system.Everyone']\n        )\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            \"tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: unauthenticated_userid returned None; \"\n            \"returning ['system.Everyone']\",\n        )\n\n    def test_effective_principals_no_callback(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne(userid='fred')\n        self.assertEqual(\n            policy.effective_principals(request),\n            ['system.Everyone', 'system.Authenticated', 'fred'],\n        )\n        self.assertEqual(len(self.messages), 2)\n        self.assertEqual(\n            self.messages[0],\n            'tests.test_authentication.MyAuthenticationPolicy.'\n            'effective_principals: groupfinder callback is None, so groups '\n            'is []',\n        )\n        self.assertEqual(\n            self.messages[1],\n            \"tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: returning effective principals: \"\n            \"['system.Everyone', 'system.Authenticated', 'fred']\",\n        )\n\n    def test_effective_principals_with_callback_fail(self):\n        request = DummyRequest(registry=self.config.registry)\n\n        def callback(userid, request):\n            return None\n\n        policy = self._makeOne(userid='fred', callback=callback)\n        self.assertEqual(\n            policy.effective_principals(request), ['system.Everyone']\n        )\n        self.assertEqual(len(self.messages), 2)\n        self.assertEqual(\n            self.messages[0],\n            'tests.test_authentication.MyAuthenticationPolicy.'\n            'effective_principals: groupfinder callback returned None as '\n            'groups',\n        )\n        self.assertEqual(\n            self.messages[1],\n            \"tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: returning effective principals: \"\n            \"['system.Everyone']\",\n        )\n\n    def test_effective_principals_with_callback_success(self):\n        request = DummyRequest(registry=self.config.registry)\n\n        def callback(userid, request):\n            return []\n\n        policy = self._makeOne(userid='fred', callback=callback)\n        self.assertEqual(\n            policy.effective_principals(request),\n            ['system.Everyone', 'system.Authenticated', 'fred'],\n        )\n        self.assertEqual(len(self.messages), 2)\n        self.assertEqual(\n            self.messages[0],\n            'tests.test_authentication.MyAuthenticationPolicy.'\n            'effective_principals: groupfinder callback returned [] as groups',\n        )\n        self.assertEqual(\n            self.messages[1],\n            \"tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: returning effective principals: \"\n            \"['system.Everyone', 'system.Authenticated', 'fred']\",\n        )\n\n    def test_effective_principals_with_unclean_principal_Authenticated(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne(userid='system.Authenticated')\n        self.assertEqual(\n            policy.effective_principals(request), ['system.Everyone']\n        )\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            \"tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: unauthenticated_userid returned disallowed \"\n            \"'system.Authenticated'; returning ['system.Everyone'] as if it \"\n            \"was None\",\n        )\n\n    def test_effective_principals_with_unclean_principal_Everyone(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne(userid='system.Everyone')\n        self.assertEqual(\n            policy.effective_principals(request), ['system.Everyone']\n        )\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            \"tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: unauthenticated_userid returned disallowed \"\n            \"'system.Everyone'; returning ['system.Everyone'] as if it \"\n            \"was None\",\n        )\n\n\nclass TestRepozeWho1AuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import RepozeWho1AuthenticationPolicy\n\n        return RepozeWho1AuthenticationPolicy\n\n    def _makeOne(self, identifier_name='auth_tkt', callback=None):\n        return self._getTargetClass()(identifier_name, callback)\n\n    def test_class_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyClass\n        from pyramid.interfaces import IAuthenticationPolicy\n\n        verifyClass(IAuthenticationPolicy, self._getTargetClass())\n\n    def test_instance_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyObject\n        from pyramid.interfaces import IAuthenticationPolicy\n\n        verifyObject(IAuthenticationPolicy, self._makeOne())\n\n    def test_unauthenticated_userid_returns_None(self):\n        request = DummyRequest({})\n        policy = self._makeOne()\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_unauthenticated_userid(self):\n        request = DummyRequest(\n            {'repoze.who.identity': {'repoze.who.userid': 'fred'}}\n        )\n        policy = self._makeOne()\n        self.assertEqual(policy.unauthenticated_userid(request), 'fred')\n\n    def test_authenticated_userid_None(self):\n        request = DummyRequest({})\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid(self):\n        request = DummyRequest(\n            {'repoze.who.identity': {'repoze.who.userid': 'fred'}}\n        )\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), 'fred')\n\n    def test_authenticated_userid_repoze_who_userid_is_None(self):\n        request = DummyRequest(\n            {'repoze.who.identity': {'repoze.who.userid': None}}\n        )\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid_with_callback_returns_None(self):\n        request = DummyRequest(\n            {'repoze.who.identity': {'repoze.who.userid': 'fred'}}\n        )\n\n        def callback(identity, request):\n            return None\n\n        policy = self._makeOne(callback=callback)\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid_with_callback_returns_something(self):\n        request = DummyRequest(\n            {'repoze.who.identity': {'repoze.who.userid': 'fred'}}\n        )\n\n        def callback(identity, request):\n            return ['agroup']\n\n        policy = self._makeOne(callback=callback)\n        self.assertEqual(policy.authenticated_userid(request), 'fred')\n\n    def test_authenticated_userid_unclean_principal_Authenticated(self):\n        request = DummyRequest(\n            {\n                'repoze.who.identity': {\n                    'repoze.who.userid': 'system.Authenticated'\n                }\n            }\n        )\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid_unclean_principal_Everyone(self):\n        request = DummyRequest(\n            {'repoze.who.identity': {'repoze.who.userid': 'system.Everyone'}}\n        )\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_effective_principals_None(self):\n        from pyramid.authorization import Everyone\n\n        request = DummyRequest({})\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals_userid_only(self):\n        from pyramid.authorization import Everyone\n        from pyramid.authorization import Authenticated\n\n        request = DummyRequest(\n            {'repoze.who.identity': {'repoze.who.userid': 'fred'}}\n        )\n        policy = self._makeOne()\n        self.assertEqual(\n            policy.effective_principals(request),\n            [Everyone, Authenticated, 'fred'],\n        )\n\n    def test_effective_principals_userid_and_groups(self):\n        from pyramid.authorization import Everyone\n        from pyramid.authorization import Authenticated\n\n        request = DummyRequest(\n            {\n                'repoze.who.identity': {\n                    'repoze.who.userid': 'fred',\n                    'groups': ['quux', 'biz'],\n                }\n            }\n        )\n\n        def callback(identity, request):\n            return identity['groups']\n\n        policy = self._makeOne(callback=callback)\n        self.assertEqual(\n            policy.effective_principals(request),\n            [Everyone, Authenticated, 'fred', 'quux', 'biz'],\n        )\n\n    def test_effective_principals_userid_callback_returns_None(self):\n        from pyramid.authorization import Everyone\n\n        request = DummyRequest(\n            {\n                'repoze.who.identity': {\n                    'repoze.who.userid': 'fred',\n                    'groups': ['quux', 'biz'],\n                }\n            }\n        )\n\n        def callback(identity, request):\n            return None\n\n        policy = self._makeOne(callback=callback)\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals_repoze_who_userid_is_None(self):\n        from pyramid.authorization import Everyone\n\n        request = DummyRequest(\n            {'repoze.who.identity': {'repoze.who.userid': None}}\n        )\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals_repoze_who_userid_is_unclean_Everyone(self):\n        from pyramid.authorization import Everyone\n\n        request = DummyRequest(\n            {'repoze.who.identity': {'repoze.who.userid': 'system.Everyone'}}\n        )\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals_repoze_who_userid_is_unclean_Authenticated(\n        self,\n    ):\n        from pyramid.authorization import Everyone\n\n        request = DummyRequest(\n            {\n                'repoze.who.identity': {\n                    'repoze.who.userid': 'system.Authenticated'\n                }\n            }\n        )\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_remember_no_plugins(self):\n        request = DummyRequest({})\n        policy = self._makeOne()\n        result = policy.remember(request, 'fred')\n        self.assertEqual(result, [])\n\n    def test_remember(self):\n        authtkt = DummyWhoPlugin()\n        request = DummyRequest({'repoze.who.plugins': {'auth_tkt': authtkt}})\n        policy = self._makeOne()\n        result = policy.remember(request, 'fred')\n        self.assertEqual(result[0], request.environ)\n        self.assertEqual(result[1], {'repoze.who.userid': 'fred'})\n\n    def test_remember_kwargs(self):\n        authtkt = DummyWhoPlugin()\n        request = DummyRequest({'repoze.who.plugins': {'auth_tkt': authtkt}})\n        policy = self._makeOne()\n        result = policy.remember(request, 'fred', max_age=23)\n        self.assertEqual(\n            result[1], {'repoze.who.userid': 'fred', 'max_age': 23}\n        )\n\n    def test_forget_no_plugins(self):\n        request = DummyRequest({})\n        policy = self._makeOne()\n        result = policy.forget(request)\n        self.assertEqual(result, [])\n\n    def test_forget(self):\n        authtkt = DummyWhoPlugin()\n        request = DummyRequest(\n            {\n                'repoze.who.plugins': {'auth_tkt': authtkt},\n                'repoze.who.identity': {'repoze.who.userid': 'fred'},\n            }\n        )\n        policy = self._makeOne()\n        result = policy.forget(request)\n        self.assertEqual(result[0], request.environ)\n        self.assertEqual(result[1], request.environ['repoze.who.identity'])\n\n\nclass TestRemoteUserAuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import RemoteUserAuthenticationPolicy\n\n        return RemoteUserAuthenticationPolicy\n\n    def _makeOne(self, environ_key='REMOTE_USER', callback=None):\n        return self._getTargetClass()(environ_key, callback)\n\n    def test_class_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyClass\n        from pyramid.interfaces import IAuthenticationPolicy\n\n        verifyClass(IAuthenticationPolicy, self._getTargetClass())\n\n    def test_instance_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyObject\n        from pyramid.interfaces import IAuthenticationPolicy\n\n        verifyObject(IAuthenticationPolicy, self._makeOne())\n\n    def test_unauthenticated_userid_returns_None(self):\n        request = DummyRequest({})\n        policy = self._makeOne()\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_unauthenticated_userid(self):\n        request = DummyRequest({'REMOTE_USER': 'fred'})\n        policy = self._makeOne()\n        self.assertEqual(policy.unauthenticated_userid(request), 'fred')\n\n    def test_authenticated_userid_None(self):\n        request = DummyRequest({})\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid(self):\n        request = DummyRequest({'REMOTE_USER': 'fred'})\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), 'fred')\n\n    def test_effective_principals_None(self):\n        from pyramid.authorization import Everyone\n\n        request = DummyRequest({})\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals(self):\n        from pyramid.authorization import Everyone\n        from pyramid.authorization import Authenticated\n\n        request = DummyRequest({'REMOTE_USER': 'fred'})\n        policy = self._makeOne()\n        self.assertEqual(\n            policy.effective_principals(request),\n            [Everyone, Authenticated, 'fred'],\n        )\n\n    def test_remember(self):\n        request = DummyRequest({'REMOTE_USER': 'fred'})\n        policy = self._makeOne()\n        result = policy.remember(request, 'fred')\n        self.assertEqual(result, [])\n\n    def test_forget(self):\n        request = DummyRequest({'REMOTE_USER': 'fred'})\n        policy = self._makeOne()\n        result = policy.forget(request)\n        self.assertEqual(result, [])\n\n\nclass TestAuthTktAuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import AuthTktAuthenticationPolicy\n\n        return AuthTktAuthenticationPolicy\n\n    def _makeOne(self, callback, cookieidentity, **kw):\n        inst = self._getTargetClass()('secret', callback, **kw)\n        inst.cookie = DummyCookieHelper(cookieidentity)\n        return inst\n\n    def setUp(self):\n        self.warnings = warnings.catch_warnings()\n        self.warnings.__enter__()\n        warnings.simplefilter('ignore', DeprecationWarning)\n\n    def tearDown(self):\n        self.warnings.__exit__(None, None, None)\n\n    def test_allargs(self):\n        # pass all known args\n        inst = self._getTargetClass()(\n            'secret',\n            callback=None,\n            cookie_name=None,\n            secure=False,\n            include_ip=False,\n            timeout=None,\n            reissue_time=None,\n            hashalg='sha512',\n            samesite=None,\n        )\n        self.assertEqual(inst.callback, None)\n\n    def test_hashalg_override(self):\n        # important to ensure hashalg is passed to cookie helper\n        inst = self._getTargetClass()('secret', hashalg='sha512')\n        self.assertEqual(inst.cookie.hashalg, 'sha512')\n\n    def test_unauthenticated_userid_returns_None(self):\n        request = DummyRequest({})\n        policy = self._makeOne(None, None)\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_unauthenticated_userid(self):\n        request = DummyRequest({'REMOTE_USER': 'fred'})\n        policy = self._makeOne(None, {'userid': 'fred'})\n        self.assertEqual(policy.unauthenticated_userid(request), 'fred')\n\n    def test_authenticated_userid_no_cookie_identity(self):\n        request = DummyRequest({})\n        policy = self._makeOne(None, None)\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid_callback_returns_None(self):\n        request = DummyRequest({})\n\n        def callback(userid, request):\n            return None\n\n        policy = self._makeOne(callback, {'userid': 'fred'})\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid(self):\n        request = DummyRequest({})\n\n        def callback(userid, request):\n            return True\n\n        policy = self._makeOne(callback, {'userid': 'fred'})\n        self.assertEqual(policy.authenticated_userid(request), 'fred')\n\n    def test_effective_principals_no_cookie_identity(self):\n        from pyramid.authorization import Everyone\n\n        request = DummyRequest({})\n        policy = self._makeOne(None, None)\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals_callback_returns_None(self):\n        from pyramid.authorization import Everyone\n\n        request = DummyRequest({})\n\n        def callback(userid, request):\n            return None\n\n        policy = self._makeOne(callback, {'userid': 'fred'})\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals(self):\n        from pyramid.authorization import Everyone\n        from pyramid.authorization import Authenticated\n\n        request = DummyRequest({})\n\n        def callback(userid, request):\n            return ['group.foo']\n\n        policy = self._makeOne(callback, {'userid': 'fred'})\n        self.assertEqual(\n            policy.effective_principals(request),\n            [Everyone, Authenticated, 'fred', 'group.foo'],\n        )\n\n    def test_remember(self):\n        request = DummyRequest({})\n        policy = self._makeOne(None, None)\n        result = policy.remember(request, 'fred')\n        self.assertEqual(result, [])\n\n    def test_remember_with_extra_kargs(self):\n        request = DummyRequest({})\n        policy = self._makeOne(None, None)\n        result = policy.remember(request, 'fred', a=1, b=2)\n        self.assertEqual(policy.cookie.kw, {'a': 1, 'b': 2})\n        self.assertEqual(result, [])\n\n    def test_forget(self):\n        request = DummyRequest({})\n        policy = self._makeOne(None, None)\n        result = policy.forget(request)\n        self.assertEqual(result, [])\n\n    def test_class_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyClass\n        from pyramid.interfaces import IAuthenticationPolicy\n\n        verifyClass(IAuthenticationPolicy, self._getTargetClass())\n\n    def test_instance_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyObject\n        from pyramid.interfaces import IAuthenticationPolicy\n\n        verifyObject(IAuthenticationPolicy, self._makeOne(None, None))\n\n\nclass TestAuthTktCookieHelper(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import AuthTktCookieHelper\n\n        return AuthTktCookieHelper\n\n    def _makeOne(self, *arg, **kw):\n        helper = self._getTargetClass()(*arg, **kw)\n        # laziness after moving auth_tkt classes and funcs into\n        # authentication module\n        auth_tkt = DummyAuthTktModule()\n        helper.auth_tkt = auth_tkt\n        helper.AuthTicket = auth_tkt.AuthTicket\n        helper.parse_ticket = auth_tkt.parse_ticket\n        helper.BadTicket = auth_tkt.BadTicket\n        return helper\n\n    def _makeRequest(self, cookie=None, ipv6=False):\n        environ = {'wsgi.version': (1, 0)}\n\n        if ipv6 is False:\n            environ['REMOTE_ADDR'] = '1.1.1.1'\n        else:\n            environ['REMOTE_ADDR'] = '::1'\n        environ['SERVER_NAME'] = 'localhost'\n        return DummyRequest(environ, cookie=cookie)\n\n    def _cookieValue(self, cookie):\n        items = cookie.value.split('/')\n        D = {}\n        for item in items:\n            k, v = item.split('=', 1)\n            D[k] = v\n        return D\n\n    def _parseHeaders(self, headers):\n        return [self._parseHeader(header) for header in headers]\n\n    def _parseHeader(self, header):\n        cookie = self._parseCookie(header[1])\n        return cookie\n\n    def _parseCookie(self, cookie):\n        cookies = SimpleCookie()\n        cookies.load(cookie)\n        return cookies.get('auth_tkt')\n\n    def test_init_cookie_str_reissue_invalid(self):\n        self.assertRaises(\n            ValueError, self._makeOne, 'secret', reissue_time='invalid value'\n        )\n\n    def test_init_cookie_str_timeout_invalid(self):\n        self.assertRaises(\n            ValueError, self._makeOne, 'secret', timeout='invalid value'\n        )\n\n    def test_init_cookie_str_max_age_invalid(self):\n        self.assertRaises(\n            ValueError, self._makeOne, 'secret', max_age='invalid value'\n        )\n\n    def test_identify_nocookie(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.identify(request)\n        self.assertEqual(result, None)\n\n    def test_identify_cookie_value_is_None(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest(None)\n        result = helper.identify(request)\n        self.assertEqual(result, None)\n\n    def test_identify_good_cookie_include_ip(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 'userid')\n        self.assertEqual(result['userdata'], '')\n        self.assertEqual(result['timestamp'], 0)\n        self.assertEqual(helper.auth_tkt.value, 'ticket')\n        self.assertEqual(helper.auth_tkt.remote_addr, '1.1.1.1')\n        self.assertEqual(helper.auth_tkt.secret, 'secret')\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], '')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_include_ipv6(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest('ticket', ipv6=True)\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 'userid')\n        self.assertEqual(result['userdata'], '')\n        self.assertEqual(result['timestamp'], 0)\n        self.assertEqual(helper.auth_tkt.value, 'ticket')\n        self.assertEqual(helper.auth_tkt.remote_addr, '::1')\n        self.assertEqual(helper.auth_tkt.secret, 'secret')\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], '')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_dont_include_ip(self):\n        helper = self._makeOne('secret', include_ip=False)\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 'userid')\n        self.assertEqual(result['userdata'], '')\n        self.assertEqual(result['timestamp'], 0)\n        self.assertEqual(helper.auth_tkt.value, 'ticket')\n        self.assertEqual(helper.auth_tkt.remote_addr, '0.0.0.0')\n        self.assertEqual(helper.auth_tkt.secret, 'secret')\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], '')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_int_useridtype(self):\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = '1'\n        helper.auth_tkt.user_data = 'userid_type:int'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 1)\n        self.assertEqual(result['userdata'], 'userid_type:int')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], 'userid_type:int')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_nonuseridtype_user_data(self):\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = '1'\n        helper.auth_tkt.user_data = 'bogus:int'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], '1')\n        self.assertEqual(result['userdata'], 'bogus:int')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], 'bogus:int')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_unknown_useridtype(self):\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = 'abc'\n        helper.auth_tkt.user_data = 'userid_type:unknown'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 'abc')\n        self.assertEqual(result['userdata'], 'userid_type:unknown')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], 'userid_type:unknown')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_b64str_useridtype(self):\n        from base64 import b64encode\n\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = b64encode(b'encoded').strip()\n        helper.auth_tkt.user_data = 'userid_type:b64str'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], b'encoded')\n        self.assertEqual(result['userdata'], 'userid_type:b64str')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], 'userid_type:b64str')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_b64unicode_useridtype(self):\n        from base64 import b64encode\n\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = b64encode(b'\\xc3\\xa9ncoded').strip()\n        helper.auth_tkt.user_data = 'userid_type:b64unicode'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], text_(b'\\xc3\\xa9ncoded', 'utf-8'))\n        self.assertEqual(result['userdata'], 'userid_type:b64unicode')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], 'userid_type:b64unicode')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_bad_cookie(self):\n        helper = self._makeOne('secret', include_ip=True)\n        helper.auth_tkt.parse_raise = True\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(result, None)\n\n    def test_identify_cookie_timeout(self):\n        helper = self._makeOne('secret', timeout=1)\n        self.assertEqual(helper.timeout, 1)\n\n    def test_identify_cookie_str_timeout(self):\n        helper = self._makeOne('secret', timeout='1')\n        self.assertEqual(helper.timeout, 1)\n\n    def test_identify_cookie_timeout_aged(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10)\n        now = time.time()\n        helper.auth_tkt.timestamp = now - 1\n        helper.now = now + 10\n        helper.auth_tkt.tokens = (text_('a'),)\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertFalse(result)\n\n    def test_identify_cookie_reissue(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        helper.auth_tkt.tokens = (text_('a'),)\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n\n    def test_identify_cookie_str_reissue(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time='0')\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        helper.auth_tkt.tokens = (text_('a'),)\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n\n    def test_identify_cookie_reissue_already_reissued_this_request(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        request._authtkt_reissued = True\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_notyet(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=10)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_revoked_by_forget(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.forget(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_revoked_by_remember(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.remember(request, 'bob')\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_with_tokens_default(self):\n        # see https://github.com/Pylons/pyramid/issues#issue/108\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        auth_tkt = DummyAuthTktModule(tokens=[''])\n        helper.auth_tkt = auth_tkt\n        helper.AuthTicket = auth_tkt.AuthTicket\n        helper.parse_ticket = auth_tkt.parse_ticket\n        helper.BadTicket = auth_tkt.BadTicket\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](None, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=/\" in response.headerlist[0][1])\n\n    def test_remember(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/; SameSite=Lax'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\n            result[1][1].endswith('; Domain=localhost; Path=/; SameSite=Lax')\n        )\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\n            result[2][1].endswith('; Domain=.localhost; Path=/; SameSite=Lax')\n        )\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_nondefault_samesite(self):\n        helper = self._makeOne('secret', samesite='Strict')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/; SameSite=Strict'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\n            result[1][1].endswith(\n                '; Domain=localhost; Path=/; SameSite=Strict'\n            )\n        )\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\n            result[2][1].endswith(\n                '; Domain=.localhost; Path=/; SameSite=Strict'\n            )\n        )\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_None_samesite(self):\n        helper = self._makeOne('secret', samesite=None)\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))  # no samesite\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_include_ip(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/; SameSite=Lax'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\n            result[1][1].endswith('; Domain=localhost; Path=/; SameSite=Lax')\n        )\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\n            result[2][1].endswith('; Domain=.localhost; Path=/; SameSite=Lax')\n        )\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_path(self):\n        helper = self._makeOne(\n            'secret', include_ip=True, path=\"/cgi-bin/app.cgi/\"\n        )\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\n            result[0][1].endswith('; Path=/cgi-bin/app.cgi/; SameSite=Lax')\n        )\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\n            result[1][1].endswith(\n                '; Domain=localhost; Path=/cgi-bin/app.cgi/; SameSite=Lax'\n            )\n        )\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\n            result[2][1].endswith(\n                '; Domain=.localhost; Path=/cgi-bin/app.cgi/; SameSite=Lax'\n            )\n        )\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_http_only(self):\n        helper = self._makeOne('secret', include_ip=True, http_only=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; HttpOnly; SameSite=Lax'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_secure(self):\n        helper = self._makeOne('secret', include_ip=True, secure=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[0][1])\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_wild_domain_disabled(self):\n        helper = self._makeOne('secret', wild_domain=False)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 2)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/; SameSite=Lax'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\n            result[1][1].endswith('; Domain=localhost; Path=/; SameSite=Lax')\n        )\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain(self):\n        helper = self._makeOne('secret', parent_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\n            result[0][1].endswith(\n                '; Domain=.example.com; Path=/; SameSite=Lax'\n            )\n        )\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain_supercedes_wild_domain(self):\n        helper = self._makeOne('secret', parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(\n            result[0][1].endswith(\n                '; Domain=.example.com; Path=/; SameSite=Lax'\n            )\n        )\n\n    def test_remember_explicit_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga')\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\n            result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/; SameSite=Lax'\n            )\n        )\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_domain_supercedes_parent_and_wild_domain(self):\n        helper = self._makeOne(\n            'secret',\n            domain='pyramid.bazinga',\n            parent_domain=True,\n            wild_domain=True,\n        )\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(\n            result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/; SameSite=Lax'\n            )\n        )\n\n    def test_remember_binary_userid(self):\n        import base64\n\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, b'userid')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(\n            val['userid'], text_(base64.b64encode(b'userid').strip())\n        )\n        self.assertEqual(val['user_data'], 'userid_type:b64str')\n\n    def test_remember_int_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 1)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_unicode_userid(self):\n        import base64\n\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = text_(b'\\xc2\\xa9', 'utf-8')\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(\n            val['userid'], text_(base64.b64encode(userid.encode('utf-8')))\n        )\n        self.assertEqual(val['user_data'], 'userid_type:b64unicode')\n\n    def test_remember_insane_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = object()\n        with warnings.catch_warnings(record=True) as w:\n            warnings.simplefilter('always', RuntimeWarning)\n            result = helper.remember(request, userid)\n            self.assertTrue(str(w[-1].message).startswith('userid is of type'))\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        value = values[0]\n        self.assertTrue('userid' in value.value)\n\n    def test_remember_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age=500)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age='500')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age_invalid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(\n            ValueError,\n            helper.remember,\n            request,\n            'userid',\n            max_age='invalid value',\n        )\n\n    def test_remember_tokens(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'other', tokens=('foo', 'bar'))\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[0][1])\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[1][1])\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[2][1])\n\n    def test_remember_samesite_nondefault(self):\n        helper = self._makeOne('secret', samesite='Strict')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        cookieval = result[0][1]\n        self.assertTrue(\n            'SameSite=Strict' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        cookieval = result[1][1]\n        self.assertTrue(\n            'SameSite=Strict' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        cookieval = result[2][1]\n        self.assertTrue(\n            'SameSite=Strict' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n    def test_remember_samesite_default(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        cookieval = result[0][1]\n        self.assertTrue(\n            'SameSite=Lax' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        cookieval = result[1][1]\n        self.assertTrue(\n            'SameSite=Lax' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        cookieval = result[2][1]\n        self.assertTrue(\n            'SameSite=Lax' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n    def test_remember_unicode_but_ascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'foo', 'utf-8')\n        result = helper.remember(request, 'other', tokens=(la,))\n        # tokens must be str type on both Python 2 and 3\n        self.assertTrue(\"/tokens=foo/\" in result[0][1])\n\n    def test_remember_nonascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'La Pe\\xc3\\xb1a', 'utf-8')\n        self.assertRaises(\n            ValueError, helper.remember, request, 'other', tokens=(la,)\n        )\n\n    def test_remember_invalid_token_format(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(\n            ValueError, helper.remember, request, 'other', tokens=('foo bar',)\n        )\n        self.assertRaises(\n            ValueError, helper.remember, request, 'other', tokens=('1bar',)\n        )\n\n    def test_forget(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        headers = helper.forget(request)\n        self.assertEqual(len(headers), 3)\n        name, value = headers[0]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT; SameSite=Lax',\n        )\n        name, value = headers[1]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT; SameSite=Lax',\n        )\n        name, value = headers[2]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=.localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT; SameSite=Lax',\n        )\n\n\nclass TestAuthTicket(unittest.TestCase):\n    def _makeOne(self, *arg, **kw):\n        from pyramid.authentication import AuthTicket\n\n        return AuthTicket(*arg, **kw)\n\n    def test_ctor_with_tokens(self):\n        ticket = self._makeOne('secret', 'userid', 'ip', tokens=('a', 'b'))\n        self.assertEqual(ticket.tokens, 'a,b')\n\n    def test_ctor_with_time(self):\n        ticket = self._makeOne('secret', 'userid', 'ip', time='time')\n        self.assertEqual(ticket.time, 'time')\n\n    def test_digest(self):\n        ticket = self._makeOne('secret', 'userid', '0.0.0.0', time=10)\n        result = ticket.digest()\n        self.assertEqual(result, '126fd6224912187ee9ffa80e0b81420c')\n\n    def test_digest_sha512(self):\n        ticket = self._makeOne(\n            'secret', 'userid', '0.0.0.0', time=10, hashalg='sha512'\n        )\n        result = ticket.digest()\n        self.assertEqual(\n            result,\n            '74770b2e0d5b1a54c2a466ec567a40f7d7823576aa49'\n            '3c65fc3445e9b44097f4a80410319ef8cb256a2e60b9'\n            'c2002e48a9e33a3e8ee4379352c04ef96d2cb278',\n        )\n\n    def test_cookie_value(self):\n        ticket = self._makeOne(\n            'secret', 'userid', '0.0.0.0', time=10, tokens=('a', 'b')\n        )\n        result = ticket.cookie_value()\n        self.assertEqual(\n            result, '66f9cc3e423dc57c91df696cf3d1f0d80000000auserid!a,b!'\n        )\n\n    def test_ipv4(self):\n        ticket = self._makeOne(\n            'secret', 'userid', '198.51.100.1', time=10, hashalg='sha256'\n        )\n        result = ticket.cookie_value()\n        self.assertEqual(\n            result,\n            'b3e7156db4f8abde4439c4a6499a0668f9e7ffd7fa27b'\n            '798400ecdade8d76c530000000auserid!',\n        )\n\n    def test_ipv6(self):\n        ticket = self._makeOne(\n            'secret', 'userid', '2001:db8::1', time=10, hashalg='sha256'\n        )\n        result = ticket.cookie_value()\n        self.assertEqual(\n            result,\n            'd025b601a0f12ca6d008aa35ff3a22b7d8f3d1c1456c8'\n            '5becf8760cd7a2fa4910000000auserid!',\n        )\n\n\nclass TestBadTicket(unittest.TestCase):\n    def _makeOne(self, msg, expected=None):\n        from pyramid.authentication import BadTicket\n\n        return BadTicket(msg, expected)\n\n    def test_it(self):\n        exc = self._makeOne('msg', expected=True)\n        self.assertEqual(exc.expected, True)\n        self.assertTrue(isinstance(exc, Exception))\n\n\nclass Test_parse_ticket(unittest.TestCase):\n    def _callFUT(self, secret, ticket, ip, hashalg='md5'):\n        from pyramid.authentication import parse_ticket\n\n        return parse_ticket(secret, ticket, ip, hashalg)\n\n    def _assertRaisesBadTicket(self, secret, ticket, ip, hashalg='md5'):\n        from pyramid.authentication import BadTicket\n\n        self.assertRaises(\n            BadTicket, self._callFUT, secret, ticket, ip, hashalg\n        )\n\n    def test_bad_timestamp(self):\n        ticket = 'x' * 64\n        self._assertRaisesBadTicket('secret', ticket, 'ip')\n\n    def test_bad_userid_or_data(self):\n        ticket = 'x' * 32 + '11111111' + 'x' * 10\n        self._assertRaisesBadTicket('secret', ticket, 'ip')\n\n    def test_digest_sig_incorrect(self):\n        ticket = 'x' * 32 + '11111111' + 'a!b!c'\n        self._assertRaisesBadTicket('secret', ticket, '0.0.0.0')\n\n    def test_correct_with_user_data(self):\n        ticket = text_('66f9cc3e423dc57c91df696cf3d1f0d80000000auserid!a,b!')\n        result = self._callFUT('secret', ticket, '0.0.0.0')\n        self.assertEqual(result, (10, 'userid', ['a', 'b'], ''))\n\n    def test_correct_with_user_data_sha512(self):\n        ticket = text_(\n            '7d947cdef99bad55f8e3382a8bd089bb9dd0547f7925b7d189adc1'\n            '160cab0ec0e6888faa41eba641a18522b26f19109f3ffafb769767'\n            'ba8a26d02aaeae56599a0000000auserid!a,b!'\n        )\n        result = self._callFUT('secret', ticket, '0.0.0.0', 'sha512')\n        self.assertEqual(result, (10, 'userid', ['a', 'b'], ''))\n\n    def test_ipv4(self):\n        ticket = text_(\n            'b3e7156db4f8abde4439c4a6499a0668f9e7ffd7fa27b798400ecd'\n            'ade8d76c530000000auserid!'\n        )\n        result = self._callFUT('secret', ticket, '198.51.100.1', 'sha256')\n        self.assertEqual(result, (10, 'userid', [''], ''))\n\n    def test_ipv6(self):\n        ticket = text_(\n            'd025b601a0f12ca6d008aa35ff3a22b7d8f3d1c1456c85becf8760'\n            'cd7a2fa4910000000auserid!'\n        )\n        result = self._callFUT('secret', ticket, '2001:db8::1', 'sha256')\n        self.assertEqual(result, (10, 'userid', [''], ''))\n\n\nclass TestSessionAuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import SessionAuthenticationPolicy\n\n        return SessionAuthenticationPolicy\n\n    def _makeOne(self, callback=None, prefix=''):\n        return self._getTargetClass()(prefix=prefix, callback=callback)\n\n    def test_class_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyClass\n        from pyramid.interfaces import IAuthenticationPolicy\n\n        verifyClass(IAuthenticationPolicy, self._getTargetClass())\n\n    def test_instance_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyObject\n        from pyramid.interfaces import IAuthenticationPolicy\n\n        verifyObject(IAuthenticationPolicy, self._makeOne())\n\n    def test_unauthenticated_userid_returns_None(self):\n        request = DummyRequest()\n        policy = self._makeOne()\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_unauthenticated_userid(self):\n        request = DummyRequest(session={'userid': 'fred'})\n        policy = self._makeOne()\n        self.assertEqual(policy.unauthenticated_userid(request), 'fred')\n\n    def test_authenticated_userid_no_cookie_identity(self):\n        request = DummyRequest()\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid_callback_returns_None(self):\n        request = DummyRequest(session={'userid': 'fred'})\n\n        def callback(userid, request):\n            return None\n\n        policy = self._makeOne(callback)\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid(self):\n        request = DummyRequest(session={'userid': 'fred'})\n\n        def callback(userid, request):\n            return True\n\n        policy = self._makeOne(callback)\n        self.assertEqual(policy.authenticated_userid(request), 'fred')\n\n    def test_effective_principals_no_identity(self):\n        from pyramid.authorization import Everyone\n\n        request = DummyRequest()\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals_callback_returns_None(self):\n        from pyramid.authorization import Everyone\n\n        request = DummyRequest(session={'userid': 'fred'})\n\n        def callback(userid, request):\n            return None\n\n        policy = self._makeOne(callback)\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals(self):\n        from pyramid.authorization import Everyone\n        from pyramid.authorization import Authenticated\n\n        request = DummyRequest(session={'userid': 'fred'})\n\n        def callback(userid, request):\n            return ['group.foo']\n\n        policy = self._makeOne(callback)\n        self.assertEqual(\n            policy.effective_principals(request),\n            [Everyone, Authenticated, 'fred', 'group.foo'],\n        )\n\n    def test_remember(self):\n        request = DummyRequest()\n        policy = self._makeOne()\n        result = policy.remember(request, 'fred')\n        self.assertEqual(request.session.get('userid'), 'fred')\n        self.assertEqual(result, [])\n\n    def test_forget(self):\n        request = DummyRequest(session={'userid': 'fred'})\n        policy = self._makeOne()\n        result = policy.forget(request)\n        self.assertEqual(request.session.get('userid'), None)\n        self.assertEqual(result, [])\n\n    def test_forget_no_identity(self):\n        request = DummyRequest()\n        policy = self._makeOne()\n        result = policy.forget(request)\n        self.assertEqual(request.session.get('userid'), None)\n        self.assertEqual(result, [])\n\n\nclass TestSessionAuthenticationHelper(unittest.TestCase):\n    def _makeRequest(self, session=None):\n        from types import SimpleNamespace\n\n        if session is None:\n            session = dict()\n        return SimpleNamespace(session=session)\n\n    def _makeOne(self, prefix=''):\n        from pyramid.authentication import SessionAuthenticationHelper\n\n        return SessionAuthenticationHelper(prefix=prefix)\n\n    def test_authenticated_userid(self):\n        request = self._makeRequest({'userid': 'fred'})\n        helper = self._makeOne()\n        self.assertEqual(helper.authenticated_userid(request), 'fred')\n\n    def test_authenticated_userid_with_prefix(self):\n        request = self._makeRequest({'foo.userid': 'fred'})\n        helper = self._makeOne(prefix='foo.')\n        self.assertEqual(helper.authenticated_userid(request), 'fred')\n\n    def test_authenticated_userid_none(self):\n        request = self._makeRequest()\n        helper = self._makeOne()\n        self.assertEqual(helper.authenticated_userid(request), None)\n\n    def test_remember(self):\n        request = self._makeRequest()\n        helper = self._makeOne()\n        result = helper.remember(request, 'fred')\n        self.assertEqual(request.session.get('userid'), 'fred')\n        self.assertEqual(result, [])\n\n    def test_forget(self):\n        request = self._makeRequest({'userid': 'fred'})\n        helper = self._makeOne()\n        result = helper.forget(request)\n        self.assertEqual(request.session.get('userid'), None)\n        self.assertEqual(result, [])\n\n    def test_forget_no_identity(self):\n        request = self._makeRequest()\n        helper = self._makeOne()\n        result = helper.forget(request)\n        self.assertEqual(request.session.get('userid'), None)\n        self.assertEqual(result, [])\n\n\nclass TestBasicAuthAuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import BasicAuthAuthenticationPolicy as cls\n\n        return cls\n\n    def _makeOne(self, check):\n        return self._getTargetClass()(check, realm='SomeRealm')\n\n    def test_class_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyClass\n        from pyramid.interfaces import IAuthenticationPolicy\n\n        verifyClass(IAuthenticationPolicy, self._getTargetClass())\n\n    def test_unauthenticated_userid(self):\n        import base64\n\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Basic %s' % base64.b64encode(\n            bytes_('chrisr:password')\n        ).decode('ascii')\n        policy = self._makeOne(None)\n        self.assertEqual(policy.unauthenticated_userid(request), 'chrisr')\n\n    def test_unauthenticated_userid_no_credentials(self):\n        request = testing.DummyRequest()\n        policy = self._makeOne(None)\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_unauthenticated_bad_header(self):\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = '...'\n        policy = self._makeOne(None)\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_unauthenticated_userid_not_basic(self):\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Complicated things'\n        policy = self._makeOne(None)\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_unauthenticated_userid_corrupt_base64(self):\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Basic chrisr:password'\n        policy = self._makeOne(None)\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_authenticated_userid(self):\n        import base64\n\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Basic %s' % base64.b64encode(\n            bytes_('chrisr:password')\n        ).decode('ascii')\n\n        def check(username, password, request):\n            return []\n\n        policy = self._makeOne(check)\n        self.assertEqual(policy.authenticated_userid(request), 'chrisr')\n\n    def test_authenticated_userid_utf8(self):\n        import base64\n\n        request = testing.DummyRequest()\n        inputs = (\n            b'm\\xc3\\xb6rk\\xc3\\xb6:' b'm\\xc3\\xb6rk\\xc3\\xb6password'\n        ).decode('utf-8')\n        request.headers['Authorization'] = 'Basic %s' % (\n            base64.b64encode(inputs.encode('utf-8')).decode('latin-1')\n        )\n\n        def check(username, password, request):\n            return []\n\n        policy = self._makeOne(check)\n        self.assertEqual(\n            policy.authenticated_userid(request),\n            b'm\\xc3\\xb6rk\\xc3\\xb6'.decode('utf-8'),\n        )\n\n    def test_authenticated_userid_latin1(self):\n        import base64\n\n        request = testing.DummyRequest()\n        inputs = (\n            b'm\\xc3\\xb6rk\\xc3\\xb6:' b'm\\xc3\\xb6rk\\xc3\\xb6password'\n        ).decode('utf-8')\n        request.headers['Authorization'] = 'Basic %s' % (\n            base64.b64encode(inputs.encode('latin-1')).decode('latin-1')\n        )\n\n        def check(username, password, request):\n            return []\n\n        policy = self._makeOne(check)\n        self.assertEqual(\n            policy.authenticated_userid(request),\n            b'm\\xc3\\xb6rk\\xc3\\xb6'.decode('utf-8'),\n        )\n\n    def test_unauthenticated_userid_invalid_payload(self):\n        import base64\n\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Basic %s' % base64.b64encode(\n            bytes_('chrisrpassword')\n        ).decode('ascii')\n        policy = self._makeOne(None)\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_remember(self):\n        policy = self._makeOne(None)\n        self.assertEqual(policy.remember(None, None), [])\n\n    def test_forget(self):\n        policy = self._makeOne(None)\n        self.assertEqual(\n            policy.forget(None),\n            [('WWW-Authenticate', 'Basic realm=\"SomeRealm\"')],\n        )\n\n\nclass TestExtractHTTPBasicCredentials(unittest.TestCase):\n    def _get_func(self):\n        from pyramid.authentication import extract_http_basic_credentials\n\n        return extract_http_basic_credentials\n\n    def test_no_auth_header(self):\n        request = testing.DummyRequest()\n        fn = self._get_func()\n\n        self.assertIsNone(fn(request))\n\n    def test_invalid_payload(self):\n        import base64\n\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Basic %s' % base64.b64encode(\n            bytes_('chrisrpassword')\n        ).decode('ascii')\n        fn = self._get_func()\n        self.assertIsNone(fn(request))\n\n    def test_not_a_basic_auth_scheme(self):\n        import base64\n\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'OtherScheme %s' % base64.b64encode(\n            bytes_('chrisr:password')\n        ).decode('ascii')\n        fn = self._get_func()\n        self.assertIsNone(fn(request))\n\n    def test_no_base64_encoding(self):\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Basic ...'\n        fn = self._get_func()\n        self.assertIsNone(fn(request))\n\n    def test_latin1_payload(self):\n        import base64\n\n        request = testing.DummyRequest()\n        inputs = (\n            b'm\\xc3\\xb6rk\\xc3\\xb6:' b'm\\xc3\\xb6rk\\xc3\\xb6password'\n        ).decode('utf-8')\n        request.headers['Authorization'] = 'Basic %s' % (\n            base64.b64encode(inputs.encode('latin-1')).decode('latin-1')\n        )\n        fn = self._get_func()\n        self.assertEqual(\n            fn(request),\n            (\n                b'm\\xc3\\xb6rk\\xc3\\xb6'.decode('utf-8'),\n                b'm\\xc3\\xb6rk\\xc3\\xb6password'.decode('utf-8'),\n            ),\n        )\n\n    def test_utf8_payload(self):\n        import base64\n\n        request = testing.DummyRequest()\n        inputs = (\n            b'm\\xc3\\xb6rk\\xc3\\xb6:' b'm\\xc3\\xb6rk\\xc3\\xb6password'\n        ).decode('utf-8')\n        request.headers['Authorization'] = 'Basic %s' % (\n            base64.b64encode(inputs.encode('utf-8')).decode('latin-1')\n        )\n        fn = self._get_func()\n        self.assertEqual(\n            fn(request),\n            (\n                b'm\\xc3\\xb6rk\\xc3\\xb6'.decode('utf-8'),\n                b'm\\xc3\\xb6rk\\xc3\\xb6password'.decode('utf-8'),\n            ),\n        )\n\n    def test_namedtuple_return(self):\n        import base64\n\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Basic %s' % base64.b64encode(\n            bytes_('chrisr:pass')\n        ).decode('ascii')\n        fn = self._get_func()\n        result = fn(request)\n\n        self.assertEqual(result.username, 'chrisr')\n        self.assertEqual(result.password, 'pass')\n\n\nclass DummyContext:\n    pass\n\n\nclass DummyCookies:\n    def __init__(self, cookie):\n        self.cookie = cookie\n\n    def get(self, name):\n        return self.cookie\n\n\nclass DummyRequest:\n    domain = 'localhost'\n\n    def __init__(self, environ=None, session=None, registry=None, cookie=None):\n        self.environ = environ or {}\n        self.session = session or {}\n        self.registry = registry\n        self.callbacks = []\n        self.cookies = DummyCookies(cookie)\n\n    def add_response_callback(self, callback):\n        self.callbacks.append(callback)\n\n\nclass DummyWhoPlugin:\n    def remember(self, environ, identity):\n        return environ, identity\n\n    def forget(self, environ, identity):\n        return environ, identity\n\n\nclass DummyCookieHelper:\n    def __init__(self, result):\n        self.result = result\n\n    def identify(self, *arg, **kw):\n        return self.result\n\n    def remember(self, *arg, **kw):\n        self.kw = kw\n        return []\n\n    def forget(self, *arg):\n        return []\n\n\nclass DummyAuthTktModule:\n    def __init__(\n        self,\n        timestamp=0,\n        userid='userid',\n        tokens=(),\n        user_data='',\n        parse_raise=False,\n        hashalg=\"md5\",\n    ):\n        self.timestamp = timestamp\n        self.userid = userid\n        self.tokens = tokens\n        self.user_data = user_data\n        self.parse_raise = parse_raise\n        self.hashalg = hashalg\n\n        def parse_ticket(secret, value, remote_addr, hashalg):\n            self.secret = secret\n            self.value = value\n            self.remote_addr = remote_addr\n            if self.parse_raise:\n                raise self.BadTicket()\n            return self.timestamp, self.userid, self.tokens, self.user_data\n\n        self.parse_ticket = parse_ticket\n\n        class AuthTicket:\n            def __init__(self, secret, userid, remote_addr, **kw):\n                self.secret = secret\n                self.userid = userid\n                self.remote_addr = remote_addr\n                self.kw = kw\n\n            def cookie_value(self):\n                result = {\n                    'secret': self.secret,\n                    'userid': self.userid,\n                    'remote_addr': self.remote_addr,\n                }\n                result.update(self.kw)\n                tokens = result.pop('tokens', None)\n                if tokens is not None:\n                    tokens = '|'.join(tokens)\n                    result['tokens'] = tokens\n                items = sorted(result.items())\n                new_items = []\n                for k, v in items:\n                    if isinstance(v, bytes):\n                        v = text_(v)\n                    new_items.append((k, v))\n                result = '/'.join(['%s=%s' % (k, v) for k, v in new_items])\n                return result\n\n        self.AuthTicket = AuthTicket\n\n    class BadTicket(Exception):\n        pass\n\n\nclass DummyResponse:\n    def __init__(self):\n        self.headerlist = []\n",
            "new_file_content": "from http.cookies import SimpleCookie\nimport unittest\nimport warnings\n\nfrom pyramid import testing\nfrom pyramid.util import bytes_, text_\n\n\nclass TestCallbackAuthenticationPolicyDebugging(unittest.TestCase):\n    def setUp(self):\n        from pyramid.interfaces import IDebugLogger\n\n        self.config = testing.setUp()\n        self.config.registry.registerUtility(self, IDebugLogger)\n        self.messages = []\n\n    def tearDown(self):\n        del self.config\n\n    def debug(self, msg):\n        self.messages.append(msg)\n\n    def _makeOne(self, userid=None, callback=None):\n        from pyramid.authentication import CallbackAuthenticationPolicy\n\n        class MyAuthenticationPolicy(CallbackAuthenticationPolicy):\n            def unauthenticated_userid(self, request):\n                return userid\n\n        policy = MyAuthenticationPolicy()\n        policy.debug = True\n        policy.callback = callback\n        return policy\n\n    def test_authenticated_userid_no_unauthenticated_userid(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), None)\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            'tests.test_authentication.MyAuthenticationPolicy.'\n            'authenticated_userid: call to unauthenticated_userid returned '\n            'None; returning None',\n        )\n\n    def test_authenticated_userid_no_callback(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne(userid='fred')\n        self.assertEqual(policy.authenticated_userid(request), 'fred')\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            \"tests.test_authentication.MyAuthenticationPolicy.\"\n            \"authenticated_userid: there was no groupfinder callback; \"\n            \"returning 'fred'\",\n        )\n\n    def test_authenticated_userid_with_callback_fail(self):\n        request = DummyRequest(registry=self.config.registry)\n\n        def callback(userid, request):\n            return None\n\n        policy = self._makeOne(userid='fred', callback=callback)\n        self.assertEqual(policy.authenticated_userid(request), None)\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            'tests.test_authentication.MyAuthenticationPolicy.'\n            'authenticated_userid: groupfinder callback returned None; '\n            'returning None',\n        )\n\n    def test_authenticated_userid_with_callback_success(self):\n        request = DummyRequest(registry=self.config.registry)\n\n        def callback(userid, request):\n            return []\n\n        policy = self._makeOne(userid='fred', callback=callback)\n        self.assertEqual(policy.authenticated_userid(request), 'fred')\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            \"tests.test_authentication.MyAuthenticationPolicy.\"\n            \"authenticated_userid: groupfinder callback returned []; \"\n            \"returning 'fred'\",\n        )\n\n    def test_authenticated_userid_fails_cleaning_as_Authenticated(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne(userid='system.Authenticated')\n        self.assertEqual(policy.authenticated_userid(request), None)\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            \"tests.test_authentication.MyAuthenticationPolicy.\"\n            \"authenticated_userid: use of userid 'system.Authenticated' is \"\n            \"disallowed by any built-in Pyramid security policy, returning \"\n            \"None\",\n        )\n\n    def test_authenticated_userid_fails_cleaning_as_Everyone(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne(userid='system.Everyone')\n        self.assertEqual(policy.authenticated_userid(request), None)\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            \"tests.test_authentication.MyAuthenticationPolicy.\"\n            \"authenticated_userid: use of userid 'system.Everyone' is \"\n            \"disallowed by any built-in Pyramid security policy, returning \"\n            \"None\",\n        )\n\n    def test_effective_principals_no_unauthenticated_userid(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne()\n        self.assertEqual(\n            policy.effective_principals(request), ['system.Everyone']\n        )\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            \"tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: unauthenticated_userid returned None; \"\n            \"returning ['system.Everyone']\",\n        )\n\n    def test_effective_principals_no_callback(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne(userid='fred')\n        self.assertEqual(\n            policy.effective_principals(request),\n            ['system.Everyone', 'system.Authenticated', 'fred'],\n        )\n        self.assertEqual(len(self.messages), 2)\n        self.assertEqual(\n            self.messages[0],\n            'tests.test_authentication.MyAuthenticationPolicy.'\n            'effective_principals: groupfinder callback is None, so groups '\n            'is []',\n        )\n        self.assertEqual(\n            self.messages[1],\n            \"tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: returning effective principals: \"\n            \"['system.Everyone', 'system.Authenticated', 'fred']\",\n        )\n\n    def test_effective_principals_with_callback_fail(self):\n        request = DummyRequest(registry=self.config.registry)\n\n        def callback(userid, request):\n            return None\n\n        policy = self._makeOne(userid='fred', callback=callback)\n        self.assertEqual(\n            policy.effective_principals(request), ['system.Everyone']\n        )\n        self.assertEqual(len(self.messages), 2)\n        self.assertEqual(\n            self.messages[0],\n            'tests.test_authentication.MyAuthenticationPolicy.'\n            'effective_principals: groupfinder callback returned None as '\n            'groups',\n        )\n        self.assertEqual(\n            self.messages[1],\n            \"tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: returning effective principals: \"\n            \"['system.Everyone']\",\n        )\n\n    def test_effective_principals_with_callback_success(self):\n        request = DummyRequest(registry=self.config.registry)\n\n        def callback(userid, request):\n            return []\n\n        policy = self._makeOne(userid='fred', callback=callback)\n        self.assertEqual(\n            policy.effective_principals(request),\n            ['system.Everyone', 'system.Authenticated', 'fred'],\n        )\n        self.assertEqual(len(self.messages), 2)\n        self.assertEqual(\n            self.messages[0],\n            'tests.test_authentication.MyAuthenticationPolicy.'\n            'effective_principals: groupfinder callback returned [] as groups',\n        )\n        self.assertEqual(\n            self.messages[1],\n            \"tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: returning effective principals: \"\n            \"['system.Everyone', 'system.Authenticated', 'fred']\",\n        )\n\n    def test_effective_principals_with_unclean_principal_Authenticated(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne(userid='system.Authenticated')\n        self.assertEqual(\n            policy.effective_principals(request), ['system.Everyone']\n        )\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            \"tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: unauthenticated_userid returned disallowed \"\n            \"'system.Authenticated'; returning ['system.Everyone'] as if it \"\n            \"was None\",\n        )\n\n    def test_effective_principals_with_unclean_principal_Everyone(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne(userid='system.Everyone')\n        self.assertEqual(\n            policy.effective_principals(request), ['system.Everyone']\n        )\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            \"tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: unauthenticated_userid returned disallowed \"\n            \"'system.Everyone'; returning ['system.Everyone'] as if it \"\n            \"was None\",\n        )\n\n\nclass TestRepozeWho1AuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import RepozeWho1AuthenticationPolicy\n\n        return RepozeWho1AuthenticationPolicy\n\n    def _makeOne(self, identifier_name='auth_tkt', callback=None):\n        return self._getTargetClass()(identifier_name, callback)\n\n    def test_class_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyClass\n        from pyramid.interfaces import IAuthenticationPolicy\n\n        verifyClass(IAuthenticationPolicy, self._getTargetClass())\n\n    def test_instance_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyObject\n        from pyramid.interfaces import IAuthenticationPolicy\n\n        verifyObject(IAuthenticationPolicy, self._makeOne())\n\n    def test_unauthenticated_userid_returns_None(self):\n        request = DummyRequest({})\n        policy = self._makeOne()\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_unauthenticated_userid(self):\n        request = DummyRequest(\n            {'repoze.who.identity': {'repoze.who.userid': 'fred'}}\n        )\n        policy = self._makeOne()\n        self.assertEqual(policy.unauthenticated_userid(request), 'fred')\n\n    def test_authenticated_userid_None(self):\n        request = DummyRequest({})\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid(self):\n        request = DummyRequest(\n            {'repoze.who.identity': {'repoze.who.userid': 'fred'}}\n        )\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), 'fred')\n\n    def test_authenticated_userid_repoze_who_userid_is_None(self):\n        request = DummyRequest(\n            {'repoze.who.identity': {'repoze.who.userid': None}}\n        )\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid_with_callback_returns_None(self):\n        request = DummyRequest(\n            {'repoze.who.identity': {'repoze.who.userid': 'fred'}}\n        )\n\n        def callback(identity, request):\n            return None\n\n        policy = self._makeOne(callback=callback)\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid_with_callback_returns_something(self):\n        request = DummyRequest(\n            {'repoze.who.identity': {'repoze.who.userid': 'fred'}}\n        )\n\n        def callback(identity, request):\n            return ['agroup']\n\n        policy = self._makeOne(callback=callback)\n        self.assertEqual(policy.authenticated_userid(request), 'fred')\n\n    def test_authenticated_userid_unclean_principal_Authenticated(self):\n        request = DummyRequest(\n            {\n                'repoze.who.identity': {\n                    'repoze.who.userid': 'system.Authenticated'\n                }\n            }\n        )\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid_unclean_principal_Everyone(self):\n        request = DummyRequest(\n            {'repoze.who.identity': {'repoze.who.userid': 'system.Everyone'}}\n        )\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_effective_principals_None(self):\n        from pyramid.authorization import Everyone\n\n        request = DummyRequest({})\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals_userid_only(self):\n        from pyramid.authorization import Everyone\n        from pyramid.authorization import Authenticated\n\n        request = DummyRequest(\n            {'repoze.who.identity': {'repoze.who.userid': 'fred'}}\n        )\n        policy = self._makeOne()\n        self.assertEqual(\n            policy.effective_principals(request),\n            [Everyone, Authenticated, 'fred'],\n        )\n\n    def test_effective_principals_userid_and_groups(self):\n        from pyramid.authorization import Everyone\n        from pyramid.authorization import Authenticated\n\n        request = DummyRequest(\n            {\n                'repoze.who.identity': {\n                    'repoze.who.userid': 'fred',\n                    'groups': ['quux', 'biz'],\n                }\n            }\n        )\n\n        def callback(identity, request):\n            return identity['groups']\n\n        policy = self._makeOne(callback=callback)\n        self.assertEqual(\n            policy.effective_principals(request),\n            [Everyone, Authenticated, 'fred', 'quux', 'biz'],\n        )\n\n    def test_effective_principals_userid_callback_returns_None(self):\n        from pyramid.authorization import Everyone\n\n        request = DummyRequest(\n            {\n                'repoze.who.identity': {\n                    'repoze.who.userid': 'fred',\n                    'groups': ['quux', 'biz'],\n                }\n            }\n        )\n\n        def callback(identity, request):\n            return None\n\n        policy = self._makeOne(callback=callback)\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals_repoze_who_userid_is_None(self):\n        from pyramid.authorization import Everyone\n\n        request = DummyRequest(\n            {'repoze.who.identity': {'repoze.who.userid': None}}\n        )\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals_repoze_who_userid_is_unclean_Everyone(self):\n        from pyramid.authorization import Everyone\n\n        request = DummyRequest(\n            {'repoze.who.identity': {'repoze.who.userid': 'system.Everyone'}}\n        )\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals_repoze_who_userid_is_unclean_Authenticated(\n        self,\n    ):\n        from pyramid.authorization import Everyone\n\n        request = DummyRequest(\n            {\n                'repoze.who.identity': {\n                    'repoze.who.userid': 'system.Authenticated'\n                }\n            }\n        )\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_remember_no_plugins(self):\n        request = DummyRequest({})\n        policy = self._makeOne()\n        result = policy.remember(request, 'fred')\n        self.assertEqual(result, [])\n\n    def test_remember(self):\n        authtkt = DummyWhoPlugin()\n        request = DummyRequest({'repoze.who.plugins': {'auth_tkt': authtkt}})\n        policy = self._makeOne()\n        result = policy.remember(request, 'fred')\n        self.assertEqual(result[0], request.environ)\n        self.assertEqual(result[1], {'repoze.who.userid': 'fred'})\n\n    def test_remember_kwargs(self):\n        authtkt = DummyWhoPlugin()\n        request = DummyRequest({'repoze.who.plugins': {'auth_tkt': authtkt}})\n        policy = self._makeOne()\n        result = policy.remember(request, 'fred', max_age=23)\n        self.assertEqual(\n            result[1], {'repoze.who.userid': 'fred', 'max_age': 23}\n        )\n\n    def test_forget_no_plugins(self):\n        request = DummyRequest({})\n        policy = self._makeOne()\n        result = policy.forget(request)\n        self.assertEqual(result, [])\n\n    def test_forget(self):\n        authtkt = DummyWhoPlugin()\n        request = DummyRequest(\n            {\n                'repoze.who.plugins': {'auth_tkt': authtkt},\n                'repoze.who.identity': {'repoze.who.userid': 'fred'},\n            }\n        )\n        policy = self._makeOne()\n        result = policy.forget(request)\n        self.assertEqual(result[0], request.environ)\n        self.assertEqual(result[1], request.environ['repoze.who.identity'])\n\n\nclass TestRemoteUserAuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import RemoteUserAuthenticationPolicy\n\n        return RemoteUserAuthenticationPolicy\n\n    def _makeOne(self, environ_key='REMOTE_USER', callback=None):\n        return self._getTargetClass()(environ_key, callback)\n\n    def test_class_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyClass\n        from pyramid.interfaces import IAuthenticationPolicy\n\n        verifyClass(IAuthenticationPolicy, self._getTargetClass())\n\n    def test_instance_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyObject\n        from pyramid.interfaces import IAuthenticationPolicy\n\n        verifyObject(IAuthenticationPolicy, self._makeOne())\n\n    def test_unauthenticated_userid_returns_None(self):\n        request = DummyRequest({})\n        policy = self._makeOne()\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_unauthenticated_userid(self):\n        request = DummyRequest({'REMOTE_USER': 'fred'})\n        policy = self._makeOne()\n        self.assertEqual(policy.unauthenticated_userid(request), 'fred')\n\n    def test_authenticated_userid_None(self):\n        request = DummyRequest({})\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid(self):\n        request = DummyRequest({'REMOTE_USER': 'fred'})\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), 'fred')\n\n    def test_effective_principals_None(self):\n        from pyramid.authorization import Everyone\n\n        request = DummyRequest({})\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals(self):\n        from pyramid.authorization import Everyone\n        from pyramid.authorization import Authenticated\n\n        request = DummyRequest({'REMOTE_USER': 'fred'})\n        policy = self._makeOne()\n        self.assertEqual(\n            policy.effective_principals(request),\n            [Everyone, Authenticated, 'fred'],\n        )\n\n    def test_remember(self):\n        request = DummyRequest({'REMOTE_USER': 'fred'})\n        policy = self._makeOne()\n        result = policy.remember(request, 'fred')\n        self.assertEqual(result, [])\n\n    def test_forget(self):\n        request = DummyRequest({'REMOTE_USER': 'fred'})\n        policy = self._makeOne()\n        result = policy.forget(request)\n        self.assertEqual(result, [])\n\n\nclass TestAuthTktAuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import AuthTktAuthenticationPolicy\n\n        return AuthTktAuthenticationPolicy\n\n    def _makeOne(self, callback, cookieidentity, **kw):\n        inst = self._getTargetClass()('secret', callback, **kw)\n        inst.cookie = DummyCookieHelper(cookieidentity)\n        return inst\n\n    def setUp(self):\n        self.warnings = warnings.catch_warnings()\n        self.warnings.__enter__()\n        warnings.simplefilter('ignore', DeprecationWarning)\n\n    def tearDown(self):\n        self.warnings.__exit__(None, None, None)\n\n    def test_allargs(self):\n        # pass all known args\n        inst = self._getTargetClass()(\n            'secret',\n            callback=None,\n            cookie_name=None,\n            secure=False,\n            include_ip=False,\n            timeout=None,\n            reissue_time=None,\n            hashalg='sha512',\n            samesite=None,\n        )\n        self.assertEqual(inst.callback, None)\n\n    def test_hashalg_override(self):\n        # important to ensure hashalg is passed to cookie helper\n        inst = self._getTargetClass()('secret', hashalg='sha512')\n        self.assertEqual(inst.cookie.hashalg, 'sha512')\n\n    def test_unauthenticated_userid_returns_None(self):\n        request = DummyRequest({})\n        policy = self._makeOne(None, None)\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_unauthenticated_userid(self):\n        request = DummyRequest({'REMOTE_USER': 'fred'})\n        policy = self._makeOne(None, {'userid': 'fred'})\n        self.assertEqual(policy.unauthenticated_userid(request), 'fred')\n\n    def test_authenticated_userid_no_cookie_identity(self):\n        request = DummyRequest({})\n        policy = self._makeOne(None, None)\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid_callback_returns_None(self):\n        request = DummyRequest({})\n\n        def callback(userid, request):\n            return None\n\n        policy = self._makeOne(callback, {'userid': 'fred'})\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid(self):\n        request = DummyRequest({})\n\n        def callback(userid, request):\n            return True\n\n        policy = self._makeOne(callback, {'userid': 'fred'})\n        self.assertEqual(policy.authenticated_userid(request), 'fred')\n\n    def test_effective_principals_no_cookie_identity(self):\n        from pyramid.authorization import Everyone\n\n        request = DummyRequest({})\n        policy = self._makeOne(None, None)\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals_callback_returns_None(self):\n        from pyramid.authorization import Everyone\n\n        request = DummyRequest({})\n\n        def callback(userid, request):\n            return None\n\n        policy = self._makeOne(callback, {'userid': 'fred'})\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals(self):\n        from pyramid.authorization import Everyone\n        from pyramid.authorization import Authenticated\n\n        request = DummyRequest({})\n\n        def callback(userid, request):\n            return ['group.foo']\n\n        policy = self._makeOne(callback, {'userid': 'fred'})\n        self.assertEqual(\n            policy.effective_principals(request),\n            [Everyone, Authenticated, 'fred', 'group.foo'],\n        )\n\n    def test_remember(self):\n        request = DummyRequest({})\n        policy = self._makeOne(None, None)\n        result = policy.remember(request, 'fred')\n        self.assertEqual(result, [])\n\n    def test_remember_with_extra_kargs(self):\n        request = DummyRequest({})\n        policy = self._makeOne(None, None)\n        result = policy.remember(request, 'fred', a=1, b=2)\n        self.assertEqual(policy.cookie.kw, {'a': 1, 'b': 2})\n        self.assertEqual(result, [])\n\n    def test_forget(self):\n        request = DummyRequest({})\n        policy = self._makeOne(None, None)\n        result = policy.forget(request)\n        self.assertEqual(result, [])\n\n    def test_class_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyClass\n        from pyramid.interfaces import IAuthenticationPolicy\n\n        verifyClass(IAuthenticationPolicy, self._getTargetClass())\n\n    def test_instance_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyObject\n        from pyramid.interfaces import IAuthenticationPolicy\n\n        verifyObject(IAuthenticationPolicy, self._makeOne(None, None))\n\n\nclass TestAuthTktCookieHelper(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import AuthTktCookieHelper\n\n        return AuthTktCookieHelper\n\n    def _makeOne(self, *arg, **kw):\n        helper = self._getTargetClass()(*arg, **kw)\n        # laziness after moving auth_tkt classes and funcs into\n        # authentication module\n        auth_tkt = DummyAuthTktModule()\n        helper.auth_tkt = auth_tkt\n        helper.AuthTicket = auth_tkt.AuthTicket\n        helper.parse_ticket = auth_tkt.parse_ticket\n        helper.BadTicket = auth_tkt.BadTicket\n        return helper\n\n    def _makeRequest(self, cookie=None, ipv6=False):\n        environ = {'wsgi.version': (1, 0)}\n\n        if ipv6 is False:\n            environ['REMOTE_ADDR'] = '1.1.1.1'\n        else:\n            environ['REMOTE_ADDR'] = '::1'\n        environ['SERVER_NAME'] = 'localhost'\n        return DummyRequest(environ, cookie=cookie)\n\n    def _cookieValue(self, cookie):\n        items = cookie.value.split('/')\n        D = {}\n        for item in items:\n            k, v = item.split('=', 1)\n            D[k] = v\n        return D\n\n    def _parseHeaders(self, headers):\n        return [self._parseHeader(header) for header in headers]\n\n    def _parseHeader(self, header):\n        cookie = self._parseCookie(header[1])\n        return cookie\n\n    def _parseCookie(self, cookie):\n        cookies = SimpleCookie()\n        cookies.load(cookie)\n        return cookies.get('auth_tkt')\n\n    def test_init_cookie_str_reissue_invalid(self):\n        self.assertRaises(\n            ValueError, self._makeOne, 'secret', reissue_time='invalid value'\n        )\n\n    def test_init_cookie_str_timeout_invalid(self):\n        self.assertRaises(\n            ValueError, self._makeOne, 'secret', timeout='invalid value'\n        )\n\n    def test_init_cookie_str_max_age_invalid(self):\n        self.assertRaises(\n            ValueError, self._makeOne, 'secret', max_age='invalid value'\n        )\n\n    def test_identify_nocookie(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.identify(request)\n        self.assertEqual(result, None)\n\n    def test_identify_cookie_value_is_None(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest(None)\n        result = helper.identify(request)\n        self.assertEqual(result, None)\n\n    def test_identify_good_cookie_include_ip(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 'userid')\n        self.assertEqual(result['userdata'], '')\n        self.assertEqual(result['timestamp'], 0)\n        self.assertEqual(helper.auth_tkt.value, 'ticket')\n        self.assertEqual(helper.auth_tkt.remote_addr, '1.1.1.1')\n        self.assertEqual(helper.auth_tkt.secret, 'secret')\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], '')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_include_ipv6(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest('ticket', ipv6=True)\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 'userid')\n        self.assertEqual(result['userdata'], '')\n        self.assertEqual(result['timestamp'], 0)\n        self.assertEqual(helper.auth_tkt.value, 'ticket')\n        self.assertEqual(helper.auth_tkt.remote_addr, '::1')\n        self.assertEqual(helper.auth_tkt.secret, 'secret')\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], '')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_dont_include_ip(self):\n        helper = self._makeOne('secret', include_ip=False)\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 'userid')\n        self.assertEqual(result['userdata'], '')\n        self.assertEqual(result['timestamp'], 0)\n        self.assertEqual(helper.auth_tkt.value, 'ticket')\n        self.assertEqual(helper.auth_tkt.remote_addr, '0.0.0.0')\n        self.assertEqual(helper.auth_tkt.secret, 'secret')\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], '')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_int_useridtype(self):\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = '1'\n        helper.auth_tkt.user_data = 'userid_type:int'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 1)\n        self.assertEqual(result['userdata'], 'userid_type:int')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], 'userid_type:int')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_nonuseridtype_user_data(self):\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = '1'\n        helper.auth_tkt.user_data = 'bogus:int'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], '1')\n        self.assertEqual(result['userdata'], 'bogus:int')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], 'bogus:int')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_unknown_useridtype(self):\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = 'abc'\n        helper.auth_tkt.user_data = 'userid_type:unknown'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 'abc')\n        self.assertEqual(result['userdata'], 'userid_type:unknown')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], 'userid_type:unknown')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_b64str_useridtype(self):\n        from base64 import b64encode\n\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = b64encode(b'encoded').strip()\n        helper.auth_tkt.user_data = 'userid_type:b64str'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], b'encoded')\n        self.assertEqual(result['userdata'], 'userid_type:b64str')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], 'userid_type:b64str')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_b64unicode_useridtype(self):\n        from base64 import b64encode\n\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = b64encode(b'\\xc3\\xa9ncoded').strip()\n        helper.auth_tkt.user_data = 'userid_type:b64unicode'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], text_(b'\\xc3\\xa9ncoded', 'utf-8'))\n        self.assertEqual(result['userdata'], 'userid_type:b64unicode')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], 'userid_type:b64unicode')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_bad_cookie(self):\n        helper = self._makeOne('secret', include_ip=True)\n        helper.auth_tkt.parse_raise = True\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(result, None)\n\n    def test_identify_cookie_timeout(self):\n        helper = self._makeOne('secret', timeout=1)\n        self.assertEqual(helper.timeout, 1)\n\n    def test_identify_cookie_str_timeout(self):\n        helper = self._makeOne('secret', timeout='1')\n        self.assertEqual(helper.timeout, 1)\n\n    def test_identify_cookie_timeout_aged(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10)\n        now = time.time()\n        helper.auth_tkt.timestamp = now - 1\n        helper.now = now + 10\n        helper.auth_tkt.tokens = (text_('a'),)\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertFalse(result)\n\n    def test_identify_cookie_reissue(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        helper.auth_tkt.tokens = (text_('a'),)\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n\n    def test_identify_cookie_str_reissue(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time='0')\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        helper.auth_tkt.tokens = (text_('a'),)\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n\n    def test_identify_cookie_reissue_already_reissued_this_request(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        request._authtkt_reissued = True\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_notyet(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=10)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_revoked_by_forget(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.forget(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_revoked_by_remember(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.remember(request, 'bob')\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_with_tokens_default(self):\n        # see https://github.com/Pylons/pyramid/issues#issue/108\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        auth_tkt = DummyAuthTktModule(tokens=[''])\n        helper.auth_tkt = auth_tkt\n        helper.AuthTicket = auth_tkt.AuthTicket\n        helper.parse_ticket = auth_tkt.parse_ticket\n        helper.BadTicket = auth_tkt.BadTicket\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](None, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=/\" in response.headerlist[0][1])\n\n    def test_remember(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/; SameSite=Lax'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\n            result[1][1].endswith('; Domain=localhost; Path=/; SameSite=Lax')\n        )\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\n            result[2][1].endswith('; Domain=.localhost; Path=/; SameSite=Lax')\n        )\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_nondefault_samesite(self):\n        helper = self._makeOne('secret', samesite='Strict')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/; SameSite=Strict'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\n            result[1][1].endswith(\n                '; Domain=localhost; Path=/; SameSite=Strict'\n            )\n        )\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\n            result[2][1].endswith(\n                '; Domain=.localhost; Path=/; SameSite=Strict'\n            )\n        )\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_None_samesite(self):\n        helper = self._makeOne('secret', samesite=None)\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))  # no samesite\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_include_ip(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/; SameSite=Lax'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\n            result[1][1].endswith('; Domain=localhost; Path=/; SameSite=Lax')\n        )\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\n            result[2][1].endswith('; Domain=.localhost; Path=/; SameSite=Lax')\n        )\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_path(self):\n        helper = self._makeOne(\n            'secret', include_ip=True, path=\"/cgi-bin/app.cgi/\"\n        )\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\n            result[0][1].endswith('; Path=/cgi-bin/app.cgi/; SameSite=Lax')\n        )\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\n            result[1][1].endswith(\n                '; Domain=localhost; Path=/cgi-bin/app.cgi/; SameSite=Lax'\n            )\n        )\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\n            result[2][1].endswith(\n                '; Domain=.localhost; Path=/cgi-bin/app.cgi/; SameSite=Lax'\n            )\n        )\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_http_only(self):\n        helper = self._makeOne('secret', include_ip=True, http_only=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; HttpOnly; SameSite=Lax'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_secure(self):\n        helper = self._makeOne('secret', include_ip=True, secure=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[0][1])\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_wild_domain_disabled(self):\n        helper = self._makeOne('secret', wild_domain=False)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/; SameSite=Lax'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain(self):\n        helper = self._makeOne('secret', parent_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\n            result[0][1].endswith(\n                '; Domain=.example.com; Path=/; SameSite=Lax'\n            )\n        )\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain_supercedes_wild_domain(self):\n        helper = self._makeOne('secret', parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(\n            result[0][1].endswith(\n                '; Domain=.example.com; Path=/; SameSite=Lax'\n            )\n        )\n\n    def test_remember_explicit_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga')\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\n            result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/; SameSite=Lax'\n            )\n        )\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_domain_supercedes_parent_and_wild_domain(self):\n        helper = self._makeOne(\n            'secret',\n            domain='pyramid.bazinga',\n            parent_domain=True,\n            wild_domain=True,\n        )\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(\n            result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/; SameSite=Lax'\n            )\n        )\n\n    def test_remember_binary_userid(self):\n        import base64\n\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, b'userid')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(\n            val['userid'], text_(base64.b64encode(b'userid').strip())\n        )\n        self.assertEqual(val['user_data'], 'userid_type:b64str')\n\n    def test_remember_int_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 1)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_unicode_userid(self):\n        import base64\n\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = text_(b'\\xc2\\xa9', 'utf-8')\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(\n            val['userid'], text_(base64.b64encode(userid.encode('utf-8')))\n        )\n        self.assertEqual(val['user_data'], 'userid_type:b64unicode')\n\n    def test_remember_insane_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = object()\n        with warnings.catch_warnings(record=True) as w:\n            warnings.simplefilter('always', RuntimeWarning)\n            result = helper.remember(request, userid)\n            self.assertTrue(str(w[-1].message).startswith('userid is of type'))\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        value = values[0]\n        self.assertTrue('userid' in value.value)\n\n    def test_remember_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age=500)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age='500')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age_invalid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(\n            ValueError,\n            helper.remember,\n            request,\n            'userid',\n            max_age='invalid value',\n        )\n\n    def test_remember_tokens(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'other', tokens=('foo', 'bar'))\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[0][1])\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[1][1])\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[2][1])\n\n    def test_remember_samesite_nondefault(self):\n        helper = self._makeOne('secret', samesite='Strict')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        cookieval = result[0][1]\n        self.assertTrue(\n            'SameSite=Strict' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        cookieval = result[1][1]\n        self.assertTrue(\n            'SameSite=Strict' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        cookieval = result[2][1]\n        self.assertTrue(\n            'SameSite=Strict' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n    def test_remember_samesite_default(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        cookieval = result[0][1]\n        self.assertTrue(\n            'SameSite=Lax' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        cookieval = result[1][1]\n        self.assertTrue(\n            'SameSite=Lax' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        cookieval = result[2][1]\n        self.assertTrue(\n            'SameSite=Lax' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n    def test_remember_unicode_but_ascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'foo', 'utf-8')\n        result = helper.remember(request, 'other', tokens=(la,))\n        # tokens must be str type on both Python 2 and 3\n        self.assertTrue(\"/tokens=foo/\" in result[0][1])\n\n    def test_remember_nonascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'La Pe\\xc3\\xb1a', 'utf-8')\n        self.assertRaises(\n            ValueError, helper.remember, request, 'other', tokens=(la,)\n        )\n\n    def test_remember_invalid_token_format(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(\n            ValueError, helper.remember, request, 'other', tokens=('foo bar',)\n        )\n        self.assertRaises(\n            ValueError, helper.remember, request, 'other', tokens=('1bar',)\n        )\n\n    def test_forget(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        headers = helper.forget(request)\n        self.assertEqual(len(headers), 3)\n        name, value = headers[0]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT; SameSite=Lax',\n        )\n        name, value = headers[1]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT; SameSite=Lax',\n        )\n        name, value = headers[2]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=.localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT; SameSite=Lax',\n        )\n\n\nclass TestAuthTicket(unittest.TestCase):\n    def _makeOne(self, *arg, **kw):\n        from pyramid.authentication import AuthTicket\n\n        return AuthTicket(*arg, **kw)\n\n    def test_ctor_with_tokens(self):\n        ticket = self._makeOne('secret', 'userid', 'ip', tokens=('a', 'b'))\n        self.assertEqual(ticket.tokens, 'a,b')\n\n    def test_ctor_with_time(self):\n        ticket = self._makeOne('secret', 'userid', 'ip', time='time')\n        self.assertEqual(ticket.time, 'time')\n\n    def test_digest(self):\n        ticket = self._makeOne('secret', 'userid', '0.0.0.0', time=10)\n        result = ticket.digest()\n        self.assertEqual(result, '126fd6224912187ee9ffa80e0b81420c')\n\n    def test_digest_sha512(self):\n        ticket = self._makeOne(\n            'secret', 'userid', '0.0.0.0', time=10, hashalg='sha512'\n        )\n        result = ticket.digest()\n        self.assertEqual(\n            result,\n            '74770b2e0d5b1a54c2a466ec567a40f7d7823576aa49'\n            '3c65fc3445e9b44097f4a80410319ef8cb256a2e60b9'\n            'c2002e48a9e33a3e8ee4379352c04ef96d2cb278',\n        )\n\n    def test_cookie_value(self):\n        ticket = self._makeOne(\n            'secret', 'userid', '0.0.0.0', time=10, tokens=('a', 'b')\n        )\n        result = ticket.cookie_value()\n        self.assertEqual(\n            result, '66f9cc3e423dc57c91df696cf3d1f0d80000000auserid!a,b!'\n        )\n\n    def test_ipv4(self):\n        ticket = self._makeOne(\n            'secret', 'userid', '198.51.100.1', time=10, hashalg='sha256'\n        )\n        result = ticket.cookie_value()\n        self.assertEqual(\n            result,\n            'b3e7156db4f8abde4439c4a6499a0668f9e7ffd7fa27b'\n            '798400ecdade8d76c530000000auserid!',\n        )\n\n    def test_ipv6(self):\n        ticket = self._makeOne(\n            'secret', 'userid', '2001:db8::1', time=10, hashalg='sha256'\n        )\n        result = ticket.cookie_value()\n        self.assertEqual(\n            result,\n            'd025b601a0f12ca6d008aa35ff3a22b7d8f3d1c1456c8'\n            '5becf8760cd7a2fa4910000000auserid!',\n        )\n\n\nclass TestBadTicket(unittest.TestCase):\n    def _makeOne(self, msg, expected=None):\n        from pyramid.authentication import BadTicket\n\n        return BadTicket(msg, expected)\n\n    def test_it(self):\n        exc = self._makeOne('msg', expected=True)\n        self.assertEqual(exc.expected, True)\n        self.assertTrue(isinstance(exc, Exception))\n\n\nclass Test_parse_ticket(unittest.TestCase):\n    def _callFUT(self, secret, ticket, ip, hashalg='md5'):\n        from pyramid.authentication import parse_ticket\n\n        return parse_ticket(secret, ticket, ip, hashalg)\n\n    def _assertRaisesBadTicket(self, secret, ticket, ip, hashalg='md5'):\n        from pyramid.authentication import BadTicket\n\n        self.assertRaises(\n            BadTicket, self._callFUT, secret, ticket, ip, hashalg\n        )\n\n    def test_bad_timestamp(self):\n        ticket = 'x' * 64\n        self._assertRaisesBadTicket('secret', ticket, 'ip')\n\n    def test_bad_userid_or_data(self):\n        ticket = 'x' * 32 + '11111111' + 'x' * 10\n        self._assertRaisesBadTicket('secret', ticket, 'ip')\n\n    def test_digest_sig_incorrect(self):\n        ticket = 'x' * 32 + '11111111' + 'a!b!c'\n        self._assertRaisesBadTicket('secret', ticket, '0.0.0.0')\n\n    def test_correct_with_user_data(self):\n        ticket = text_('66f9cc3e423dc57c91df696cf3d1f0d80000000auserid!a,b!')\n        result = self._callFUT('secret', ticket, '0.0.0.0')\n        self.assertEqual(result, (10, 'userid', ['a', 'b'], ''))\n\n    def test_correct_with_user_data_sha512(self):\n        ticket = text_(\n            '7d947cdef99bad55f8e3382a8bd089bb9dd0547f7925b7d189adc1'\n            '160cab0ec0e6888faa41eba641a18522b26f19109f3ffafb769767'\n            'ba8a26d02aaeae56599a0000000auserid!a,b!'\n        )\n        result = self._callFUT('secret', ticket, '0.0.0.0', 'sha512')\n        self.assertEqual(result, (10, 'userid', ['a', 'b'], ''))\n\n    def test_ipv4(self):\n        ticket = text_(\n            'b3e7156db4f8abde4439c4a6499a0668f9e7ffd7fa27b798400ecd'\n            'ade8d76c530000000auserid!'\n        )\n        result = self._callFUT('secret', ticket, '198.51.100.1', 'sha256')\n        self.assertEqual(result, (10, 'userid', [''], ''))\n\n    def test_ipv6(self):\n        ticket = text_(\n            'd025b601a0f12ca6d008aa35ff3a22b7d8f3d1c1456c85becf8760'\n            'cd7a2fa4910000000auserid!'\n        )\n        result = self._callFUT('secret', ticket, '2001:db8::1', 'sha256')\n        self.assertEqual(result, (10, 'userid', [''], ''))\n\n\nclass TestSessionAuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import SessionAuthenticationPolicy\n\n        return SessionAuthenticationPolicy\n\n    def _makeOne(self, callback=None, prefix=''):\n        return self._getTargetClass()(prefix=prefix, callback=callback)\n\n    def test_class_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyClass\n        from pyramid.interfaces import IAuthenticationPolicy\n\n        verifyClass(IAuthenticationPolicy, self._getTargetClass())\n\n    def test_instance_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyObject\n        from pyramid.interfaces import IAuthenticationPolicy\n\n        verifyObject(IAuthenticationPolicy, self._makeOne())\n\n    def test_unauthenticated_userid_returns_None(self):\n        request = DummyRequest()\n        policy = self._makeOne()\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_unauthenticated_userid(self):\n        request = DummyRequest(session={'userid': 'fred'})\n        policy = self._makeOne()\n        self.assertEqual(policy.unauthenticated_userid(request), 'fred')\n\n    def test_authenticated_userid_no_cookie_identity(self):\n        request = DummyRequest()\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid_callback_returns_None(self):\n        request = DummyRequest(session={'userid': 'fred'})\n\n        def callback(userid, request):\n            return None\n\n        policy = self._makeOne(callback)\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid(self):\n        request = DummyRequest(session={'userid': 'fred'})\n\n        def callback(userid, request):\n            return True\n\n        policy = self._makeOne(callback)\n        self.assertEqual(policy.authenticated_userid(request), 'fred')\n\n    def test_effective_principals_no_identity(self):\n        from pyramid.authorization import Everyone\n\n        request = DummyRequest()\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals_callback_returns_None(self):\n        from pyramid.authorization import Everyone\n\n        request = DummyRequest(session={'userid': 'fred'})\n\n        def callback(userid, request):\n            return None\n\n        policy = self._makeOne(callback)\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals(self):\n        from pyramid.authorization import Everyone\n        from pyramid.authorization import Authenticated\n\n        request = DummyRequest(session={'userid': 'fred'})\n\n        def callback(userid, request):\n            return ['group.foo']\n\n        policy = self._makeOne(callback)\n        self.assertEqual(\n            policy.effective_principals(request),\n            [Everyone, Authenticated, 'fred', 'group.foo'],\n        )\n\n    def test_remember(self):\n        request = DummyRequest()\n        policy = self._makeOne()\n        result = policy.remember(request, 'fred')\n        self.assertEqual(request.session.get('userid'), 'fred')\n        self.assertEqual(result, [])\n\n    def test_forget(self):\n        request = DummyRequest(session={'userid': 'fred'})\n        policy = self._makeOne()\n        result = policy.forget(request)\n        self.assertEqual(request.session.get('userid'), None)\n        self.assertEqual(result, [])\n\n    def test_forget_no_identity(self):\n        request = DummyRequest()\n        policy = self._makeOne()\n        result = policy.forget(request)\n        self.assertEqual(request.session.get('userid'), None)\n        self.assertEqual(result, [])\n\n\nclass TestSessionAuthenticationHelper(unittest.TestCase):\n    def _makeRequest(self, session=None):\n        from types import SimpleNamespace\n\n        if session is None:\n            session = dict()\n        return SimpleNamespace(session=session)\n\n    def _makeOne(self, prefix=''):\n        from pyramid.authentication import SessionAuthenticationHelper\n\n        return SessionAuthenticationHelper(prefix=prefix)\n\n    def test_authenticated_userid(self):\n        request = self._makeRequest({'userid': 'fred'})\n        helper = self._makeOne()\n        self.assertEqual(helper.authenticated_userid(request), 'fred')\n\n    def test_authenticated_userid_with_prefix(self):\n        request = self._makeRequest({'foo.userid': 'fred'})\n        helper = self._makeOne(prefix='foo.')\n        self.assertEqual(helper.authenticated_userid(request), 'fred')\n\n    def test_authenticated_userid_none(self):\n        request = self._makeRequest()\n        helper = self._makeOne()\n        self.assertEqual(helper.authenticated_userid(request), None)\n\n    def test_remember(self):\n        request = self._makeRequest()\n        helper = self._makeOne()\n        result = helper.remember(request, 'fred')\n        self.assertEqual(request.session.get('userid'), 'fred')\n        self.assertEqual(result, [])\n\n    def test_forget(self):\n        request = self._makeRequest({'userid': 'fred'})\n        helper = self._makeOne()\n        result = helper.forget(request)\n        self.assertEqual(request.session.get('userid'), None)\n        self.assertEqual(result, [])\n\n    def test_forget_no_identity(self):\n        request = self._makeRequest()\n        helper = self._makeOne()\n        result = helper.forget(request)\n        self.assertEqual(request.session.get('userid'), None)\n        self.assertEqual(result, [])\n\n\nclass TestBasicAuthAuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import BasicAuthAuthenticationPolicy as cls\n\n        return cls\n\n    def _makeOne(self, check):\n        return self._getTargetClass()(check, realm='SomeRealm')\n\n    def test_class_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyClass\n        from pyramid.interfaces import IAuthenticationPolicy\n\n        verifyClass(IAuthenticationPolicy, self._getTargetClass())\n\n    def test_unauthenticated_userid(self):\n        import base64\n\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Basic %s' % base64.b64encode(\n            bytes_('chrisr:password')\n        ).decode('ascii')\n        policy = self._makeOne(None)\n        self.assertEqual(policy.unauthenticated_userid(request), 'chrisr')\n\n    def test_unauthenticated_userid_no_credentials(self):\n        request = testing.DummyRequest()\n        policy = self._makeOne(None)\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_unauthenticated_bad_header(self):\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = '...'\n        policy = self._makeOne(None)\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_unauthenticated_userid_not_basic(self):\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Complicated things'\n        policy = self._makeOne(None)\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_unauthenticated_userid_corrupt_base64(self):\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Basic chrisr:password'\n        policy = self._makeOne(None)\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_authenticated_userid(self):\n        import base64\n\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Basic %s' % base64.b64encode(\n            bytes_('chrisr:password')\n        ).decode('ascii')\n\n        def check(username, password, request):\n            return []\n\n        policy = self._makeOne(check)\n        self.assertEqual(policy.authenticated_userid(request), 'chrisr')\n\n    def test_authenticated_userid_utf8(self):\n        import base64\n\n        request = testing.DummyRequest()\n        inputs = (\n            b'm\\xc3\\xb6rk\\xc3\\xb6:' b'm\\xc3\\xb6rk\\xc3\\xb6password'\n        ).decode('utf-8')\n        request.headers['Authorization'] = 'Basic %s' % (\n            base64.b64encode(inputs.encode('utf-8')).decode('latin-1')\n        )\n\n        def check(username, password, request):\n            return []\n\n        policy = self._makeOne(check)\n        self.assertEqual(\n            policy.authenticated_userid(request),\n            b'm\\xc3\\xb6rk\\xc3\\xb6'.decode('utf-8'),\n        )\n\n    def test_authenticated_userid_latin1(self):\n        import base64\n\n        request = testing.DummyRequest()\n        inputs = (\n            b'm\\xc3\\xb6rk\\xc3\\xb6:' b'm\\xc3\\xb6rk\\xc3\\xb6password'\n        ).decode('utf-8')\n        request.headers['Authorization'] = 'Basic %s' % (\n            base64.b64encode(inputs.encode('latin-1')).decode('latin-1')\n        )\n\n        def check(username, password, request):\n            return []\n\n        policy = self._makeOne(check)\n        self.assertEqual(\n            policy.authenticated_userid(request),\n            b'm\\xc3\\xb6rk\\xc3\\xb6'.decode('utf-8'),\n        )\n\n    def test_unauthenticated_userid_invalid_payload(self):\n        import base64\n\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Basic %s' % base64.b64encode(\n            bytes_('chrisrpassword')\n        ).decode('ascii')\n        policy = self._makeOne(None)\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_remember(self):\n        policy = self._makeOne(None)\n        self.assertEqual(policy.remember(None, None), [])\n\n    def test_forget(self):\n        policy = self._makeOne(None)\n        self.assertEqual(\n            policy.forget(None),\n            [('WWW-Authenticate', 'Basic realm=\"SomeRealm\"')],\n        )\n\n\nclass TestExtractHTTPBasicCredentials(unittest.TestCase):\n    def _get_func(self):\n        from pyramid.authentication import extract_http_basic_credentials\n\n        return extract_http_basic_credentials\n\n    def test_no_auth_header(self):\n        request = testing.DummyRequest()\n        fn = self._get_func()\n\n        self.assertIsNone(fn(request))\n\n    def test_invalid_payload(self):\n        import base64\n\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Basic %s' % base64.b64encode(\n            bytes_('chrisrpassword')\n        ).decode('ascii')\n        fn = self._get_func()\n        self.assertIsNone(fn(request))\n\n    def test_not_a_basic_auth_scheme(self):\n        import base64\n\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'OtherScheme %s' % base64.b64encode(\n            bytes_('chrisr:password')\n        ).decode('ascii')\n        fn = self._get_func()\n        self.assertIsNone(fn(request))\n\n    def test_no_base64_encoding(self):\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Basic ...'\n        fn = self._get_func()\n        self.assertIsNone(fn(request))\n\n    def test_latin1_payload(self):\n        import base64\n\n        request = testing.DummyRequest()\n        inputs = (\n            b'm\\xc3\\xb6rk\\xc3\\xb6:' b'm\\xc3\\xb6rk\\xc3\\xb6password'\n        ).decode('utf-8')\n        request.headers['Authorization'] = 'Basic %s' % (\n            base64.b64encode(inputs.encode('latin-1')).decode('latin-1')\n        )\n        fn = self._get_func()\n        self.assertEqual(\n            fn(request),\n            (\n                b'm\\xc3\\xb6rk\\xc3\\xb6'.decode('utf-8'),\n                b'm\\xc3\\xb6rk\\xc3\\xb6password'.decode('utf-8'),\n            ),\n        )\n\n    def test_utf8_payload(self):\n        import base64\n\n        request = testing.DummyRequest()\n        inputs = (\n            b'm\\xc3\\xb6rk\\xc3\\xb6:' b'm\\xc3\\xb6rk\\xc3\\xb6password'\n        ).decode('utf-8')\n        request.headers['Authorization'] = 'Basic %s' % (\n            base64.b64encode(inputs.encode('utf-8')).decode('latin-1')\n        )\n        fn = self._get_func()\n        self.assertEqual(\n            fn(request),\n            (\n                b'm\\xc3\\xb6rk\\xc3\\xb6'.decode('utf-8'),\n                b'm\\xc3\\xb6rk\\xc3\\xb6password'.decode('utf-8'),\n            ),\n        )\n\n    def test_namedtuple_return(self):\n        import base64\n\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Basic %s' % base64.b64encode(\n            bytes_('chrisr:pass')\n        ).decode('ascii')\n        fn = self._get_func()\n        result = fn(request)\n\n        self.assertEqual(result.username, 'chrisr')\n        self.assertEqual(result.password, 'pass')\n\n\nclass DummyContext:\n    pass\n\n\nclass DummyCookies:\n    def __init__(self, cookie):\n        self.cookie = cookie\n\n    def get(self, name):\n        return self.cookie\n\n\nclass DummyRequest:\n    domain = 'localhost'\n\n    def __init__(self, environ=None, session=None, registry=None, cookie=None):\n        self.environ = environ or {}\n        self.session = session or {}\n        self.registry = registry\n        self.callbacks = []\n        self.cookies = DummyCookies(cookie)\n\n    def add_response_callback(self, callback):\n        self.callbacks.append(callback)\n\n\nclass DummyWhoPlugin:\n    def remember(self, environ, identity):\n        return environ, identity\n\n    def forget(self, environ, identity):\n        return environ, identity\n\n\nclass DummyCookieHelper:\n    def __init__(self, result):\n        self.result = result\n\n    def identify(self, *arg, **kw):\n        return self.result\n\n    def remember(self, *arg, **kw):\n        self.kw = kw\n        return []\n\n    def forget(self, *arg):\n        return []\n\n\nclass DummyAuthTktModule:\n    def __init__(\n        self,\n        timestamp=0,\n        userid='userid',\n        tokens=(),\n        user_data='',\n        parse_raise=False,\n        hashalg=\"md5\",\n    ):\n        self.timestamp = timestamp\n        self.userid = userid\n        self.tokens = tokens\n        self.user_data = user_data\n        self.parse_raise = parse_raise\n        self.hashalg = hashalg\n\n        def parse_ticket(secret, value, remote_addr, hashalg):\n            self.secret = secret\n            self.value = value\n            self.remote_addr = remote_addr\n            if self.parse_raise:\n                raise self.BadTicket()\n            return self.timestamp, self.userid, self.tokens, self.user_data\n\n        self.parse_ticket = parse_ticket\n\n        class AuthTicket:\n            def __init__(self, secret, userid, remote_addr, **kw):\n                self.secret = secret\n                self.userid = userid\n                self.remote_addr = remote_addr\n                self.kw = kw\n\n            def cookie_value(self):\n                result = {\n                    'secret': self.secret,\n                    'userid': self.userid,\n                    'remote_addr': self.remote_addr,\n                }\n                result.update(self.kw)\n                tokens = result.pop('tokens', None)\n                if tokens is not None:\n                    tokens = '|'.join(tokens)\n                    result['tokens'] = tokens\n                items = sorted(result.items())\n                new_items = []\n                for k, v in items:\n                    if isinstance(v, bytes):\n                        v = text_(v)\n                    new_items.append((k, v))\n                result = '/'.join(['%s=%s' % (k, v) for k, v in new_items])\n                return result\n\n        self.AuthTicket = AuthTicket\n\n    class BadTicket(Exception):\n        pass\n\n\nclass DummyResponse:\n    def __init__(self):\n        self.headerlist = []\n",
            "header": {
                "file": {
                    "path": "tests/test_authentication.py"
                },
                "misc_line": null
            },
            "index_line": {
                "old_commit_hash": "6d3b154e7",
                "new_commit_hash": "deeda5e78",
                "mode": "100644"
            },
            "is_binary_file": false,
            "binary_line": null,
            "minus_file": {
                "path": "a/tests/test_authentication.py"
            },
            "plus_file": {
                "path": "b/tests/test_authentication.py"
            },
            "hunks": [
                {
                    "descriptor": {
                        "old_range": {
                            "start": 1177,
                            "length": 18
                        },
                        "new_range": {
                            "start": 1177,
                            "length": 12
                        },
                        "section": "class TestAuthTktCookieHelper(unittest.TestCase):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "        helper = self._makeOne('secret', wild_domain=False)",
                                "type": "context"
                            },
                            {
                                "content": "        request = self._makeRequest()",
                                "type": "context"
                            },
                            {
                                "content": "        result = helper.remember(request, 'other')",
                                "type": "context"
                            },
                            {
                                "content": "        self.assertEqual(len(result), 2)",
                                "type": "deleted"
                            },
                            {
                                "content": "        self.assertEqual(len(result), 1)",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "        self.assertEqual(result[0][0], 'Set-Cookie')",
                                "type": "context"
                            },
                            {
                                "content": "        self.assertTrue(result[0][1].endswith('; Path=/; SameSite=Lax'))",
                                "type": "context"
                            },
                            {
                                "content": "        self.assertTrue(result[0][1].startswith('auth_tkt='))",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "        self.assertEqual(result[1][0], 'Set-Cookie')",
                                "type": "deleted"
                            },
                            {
                                "content": "        self.assertTrue(",
                                "type": "deleted"
                            },
                            {
                                "content": "            result[1][1].endswith('; Domain=localhost; Path=/; SameSite=Lax')",
                                "type": "deleted"
                            },
                            {
                                "content": "        )",
                                "type": "deleted"
                            },
                            {
                                "content": "        self.assertTrue(result[1][1].startswith('auth_tkt='))",
                                "type": "deleted"
                            },
                            {
                                "content": "",
                                "type": "deleted"
                            },
                            {
                                "content": "    def test_remember_parent_domain(self):",
                                "type": "context"
                            },
                            {
                                "content": "        helper = self._makeOne('secret', parent_domain=True)",
                                "type": "context"
                            },
                            {
                                "content": "        request = self._makeRequest()",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [
                        {
                            "file_name": "tests/test_authentication.py",
                            "type": "method",
                            "name": "TestAuthTktCookieHelper.test_remember_wild_domain_disabled",
                            "content": "class TestAuthTktCookieHelper(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import AuthTktCookieHelper\n\n        return AuthTktCookieHelper\n\n    def _makeOne(self, *arg, **kw):\n        helper = self._getTargetClass()(*arg, **kw)\n        # laziness after moving auth_tkt classes and funcs into\n        # authentication module\n        auth_tkt = DummyAuthTktModule()\n        helper.auth_tkt = auth_tkt\n        helper.AuthTicket = auth_tkt.AuthTicket\n        helper.parse_ticket = auth_tkt.parse_ticket\n        helper.BadTicket = auth_tkt.BadTicket\n        return helper\n\n    def _makeRequest(self, cookie=None, ipv6=False):\n        environ = {'wsgi.version': (1, 0)}\n\n        if ipv6 is False:\n            environ['REMOTE_ADDR'] = '1.1.1.1'\n        else:\n            environ['REMOTE_ADDR'] = '::1'\n        environ['SERVER_NAME'] = 'localhost'\n        return DummyRequest(environ, cookie=cookie)\n\n    def _cookieValue(self, cookie):\n        items = cookie.value.split('/')\n        D = {}\n        for item in items:\n            k, v = item.split('=', 1)\n            D[k] = v\n        return D\n\n    def _parseHeaders(self, headers):\n        return [self._parseHeader(header) for header in headers]\n\n    def _parseHeader(self, header):\n        cookie = self._parseCookie(header[1])\n        return cookie\n\n    def _parseCookie(self, cookie):\n        cookies = SimpleCookie()\n        cookies.load(cookie)\n        return cookies.get('auth_tkt')\n\n    def test_init_cookie_str_reissue_invalid(self):\n        self.assertRaises(\n            ValueError, self._makeOne, 'secret', reissue_time='invalid value'\n        )\n\n    def test_init_cookie_str_timeout_invalid(self):\n        self.assertRaises(\n            ValueError, self._makeOne, 'secret', timeout='invalid value'\n        )\n\n    def test_init_cookie_str_max_age_invalid(self):\n        self.assertRaises(\n            ValueError, self._makeOne, 'secret', max_age='invalid value'\n        )\n\n    def test_identify_nocookie(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.identify(request)\n        self.assertEqual(result, None)\n\n    def test_identify_cookie_value_is_None(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest(None)\n        result = helper.identify(request)\n        self.assertEqual(result, None)\n\n    def test_identify_good_cookie_include_ip(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 'userid')\n        self.assertEqual(result['userdata'], '')\n        self.assertEqual(result['timestamp'], 0)\n        self.assertEqual(helper.auth_tkt.value, 'ticket')\n        self.assertEqual(helper.auth_tkt.remote_addr, '1.1.1.1')\n        self.assertEqual(helper.auth_tkt.secret, 'secret')\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], '')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_include_ipv6(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest('ticket', ipv6=True)\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 'userid')\n        self.assertEqual(result['userdata'], '')\n        self.assertEqual(result['timestamp'], 0)\n        self.assertEqual(helper.auth_tkt.value, 'ticket')\n        self.assertEqual(helper.auth_tkt.remote_addr, '::1')\n        self.assertEqual(helper.auth_tkt.secret, 'secret')\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], '')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_dont_include_ip(self):\n        helper = self._makeOne('secret', include_ip=False)\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 'userid')\n        self.assertEqual(result['userdata'], '')\n        self.assertEqual(result['timestamp'], 0)\n        self.assertEqual(helper.auth_tkt.value, 'ticket')\n        self.assertEqual(helper.auth_tkt.remote_addr, '0.0.0.0')\n        self.assertEqual(helper.auth_tkt.secret, 'secret')\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], '')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_int_useridtype(self):\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = '1'\n        helper.auth_tkt.user_data = 'userid_type:int'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 1)\n        self.assertEqual(result['userdata'], 'userid_type:int')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], 'userid_type:int')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_nonuseridtype_user_data(self):\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = '1'\n        helper.auth_tkt.user_data = 'bogus:int'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], '1')\n        self.assertEqual(result['userdata'], 'bogus:int')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], 'bogus:int')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_unknown_useridtype(self):\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = 'abc'\n        helper.auth_tkt.user_data = 'userid_type:unknown'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 'abc')\n        self.assertEqual(result['userdata'], 'userid_type:unknown')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], 'userid_type:unknown')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_b64str_useridtype(self):\n        from base64 import b64encode\n\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = b64encode(b'encoded').strip()\n        helper.auth_tkt.user_data = 'userid_type:b64str'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], b'encoded')\n        self.assertEqual(result['userdata'], 'userid_type:b64str')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], 'userid_type:b64str')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_b64unicode_useridtype(self):\n        from base64 import b64encode\n\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = b64encode(b'\\xc3\\xa9ncoded').strip()\n        helper.auth_tkt.user_data = 'userid_type:b64unicode'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], text_(b'\\xc3\\xa9ncoded', 'utf-8'))\n        self.assertEqual(result['userdata'], 'userid_type:b64unicode')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], 'userid_type:b64unicode')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_bad_cookie(self):\n        helper = self._makeOne('secret', include_ip=True)\n        helper.auth_tkt.parse_raise = True\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(result, None)\n\n    def test_identify_cookie_timeout(self):\n        helper = self._makeOne('secret', timeout=1)\n        self.assertEqual(helper.timeout, 1)\n\n    def test_identify_cookie_str_timeout(self):\n        helper = self._makeOne('secret', timeout='1')\n        self.assertEqual(helper.timeout, 1)\n\n    def test_identify_cookie_timeout_aged(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10)\n        now = time.time()\n        helper.auth_tkt.timestamp = now - 1\n        helper.now = now + 10\n        helper.auth_tkt.tokens = (text_('a'),)\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertFalse(result)\n\n    def test_identify_cookie_reissue(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        helper.auth_tkt.tokens = (text_('a'),)\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n\n    def test_identify_cookie_str_reissue(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time='0')\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        helper.auth_tkt.tokens = (text_('a'),)\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n\n    def test_identify_cookie_reissue_already_reissued_this_request(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        request._authtkt_reissued = True\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_notyet(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=10)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_revoked_by_forget(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.forget(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_revoked_by_remember(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.remember(request, 'bob')\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_with_tokens_default(self):\n        # see https://github.com/Pylons/pyramid/issues#issue/108\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        auth_tkt = DummyAuthTktModule(tokens=[''])\n        helper.auth_tkt = auth_tkt\n        helper.AuthTicket = auth_tkt.AuthTicket\n        helper.parse_ticket = auth_tkt.parse_ticket\n        helper.BadTicket = auth_tkt.BadTicket\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](None, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=/\" in response.headerlist[0][1])\n\n    def test_remember(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/; SameSite=Lax'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\n            result[1][1].endswith('; Domain=localhost; Path=/; SameSite=Lax')\n        )\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\n            result[2][1].endswith('; Domain=.localhost; Path=/; SameSite=Lax')\n        )\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_nondefault_samesite(self):\n        helper = self._makeOne('secret', samesite='Strict')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/; SameSite=Strict'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\n            result[1][1].endswith(\n                '; Domain=localhost; Path=/; SameSite=Strict'\n            )\n        )\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\n            result[2][1].endswith(\n                '; Domain=.localhost; Path=/; SameSite=Strict'\n            )\n        )\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_None_samesite(self):\n        helper = self._makeOne('secret', samesite=None)\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))  # no samesite\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_include_ip(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/; SameSite=Lax'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\n            result[1][1].endswith('; Domain=localhost; Path=/; SameSite=Lax')\n        )\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\n            result[2][1].endswith('; Domain=.localhost; Path=/; SameSite=Lax')\n        )\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_path(self):\n        helper = self._makeOne(\n            'secret', include_ip=True, path=\"/cgi-bin/app.cgi/\"\n        )\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\n            result[0][1].endswith('; Path=/cgi-bin/app.cgi/; SameSite=Lax')\n        )\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\n            result[1][1].endswith(\n                '; Domain=localhost; Path=/cgi-bin/app.cgi/; SameSite=Lax'\n            )\n        )\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\n            result[2][1].endswith(\n                '; Domain=.localhost; Path=/cgi-bin/app.cgi/; SameSite=Lax'\n            )\n        )\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_http_only(self):\n        helper = self._makeOne('secret', include_ip=True, http_only=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; HttpOnly; SameSite=Lax'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_secure(self):\n        helper = self._makeOne('secret', include_ip=True, secure=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[0][1])\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_wild_domain_disabled(self):\n        helper = self._makeOne('secret', wild_domain=False)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 2)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/; SameSite=Lax'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\n            result[1][1].endswith('; Domain=localhost; Path=/; SameSite=Lax')\n        )\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain(self):\n        helper = self._makeOne('secret', parent_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\n            result[0][1].endswith(\n                '; Domain=.example.com; Path=/; SameSite=Lax'\n            )\n        )\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain_supercedes_wild_domain(self):\n        helper = self._makeOne('secret', parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(\n            result[0][1].endswith(\n                '; Domain=.example.com; Path=/; SameSite=Lax'\n            )\n        )\n\n    def test_remember_explicit_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga')\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\n            result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/; SameSite=Lax'\n            )\n        )\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_domain_supercedes_parent_and_wild_domain(self):\n        helper = self._makeOne(\n            'secret',\n            domain='pyramid.bazinga',\n            parent_domain=True,\n            wild_domain=True,\n        )\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(\n            result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/; SameSite=Lax'\n            )\n        )\n\n    def test_remember_binary_userid(self):\n        import base64\n\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, b'userid')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(\n            val['userid'], text_(base64.b64encode(b'userid').strip())\n        )\n        self.assertEqual(val['user_data'], 'userid_type:b64str')\n\n    def test_remember_int_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 1)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_unicode_userid(self):\n        import base64\n\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = text_(b'\\xc2\\xa9', 'utf-8')\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(\n            val['userid'], text_(base64.b64encode(userid.encode('utf-8')))\n        )\n        self.assertEqual(val['user_data'], 'userid_type:b64unicode')\n\n    def test_remember_insane_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = object()\n        with warnings.catch_warnings(record=True) as w:\n            warnings.simplefilter('always', RuntimeWarning)\n            result = helper.remember(request, userid)\n            self.assertTrue(str(w[-1].message).startswith('userid is of type'))\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        value = values[0]\n        self.assertTrue('userid' in value.value)\n\n    def test_remember_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age=500)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age='500')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age_invalid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(\n            ValueError,\n            helper.remember,\n            request,\n            'userid',\n            max_age='invalid value',\n        )\n\n    def test_remember_tokens(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'other', tokens=('foo', 'bar'))\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[0][1])\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[1][1])\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[2][1])\n\n    def test_remember_samesite_nondefault(self):\n        helper = self._makeOne('secret', samesite='Strict')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        cookieval = result[0][1]\n        self.assertTrue(\n            'SameSite=Strict' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        cookieval = result[1][1]\n        self.assertTrue(\n            'SameSite=Strict' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        cookieval = result[2][1]\n        self.assertTrue(\n            'SameSite=Strict' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n    def test_remember_samesite_default(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        cookieval = result[0][1]\n        self.assertTrue(\n            'SameSite=Lax' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        cookieval = result[1][1]\n        self.assertTrue(\n            'SameSite=Lax' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        cookieval = result[2][1]\n        self.assertTrue(\n            'SameSite=Lax' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n    def test_remember_unicode_but_ascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'foo', 'utf-8')\n        result = helper.remember(request, 'other', tokens=(la,))\n        # tokens must be str type on both Python 2 and 3\n        self.assertTrue(\"/tokens=foo/\" in result[0][1])\n\n    def test_remember_nonascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'La Pe\\xc3\\xb1a', 'utf-8')\n        self.assertRaises(\n            ValueError, helper.remember, request, 'other', tokens=(la,)\n        )\n\n    def test_remember_invalid_token_format(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(\n            ValueError, helper.remember, request, 'other', tokens=('foo bar',)\n        )\n        self.assertRaises(\n            ValueError, helper.remember, request, 'other', tokens=('1bar',)\n        )\n\n    def test_forget(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        headers = helper.forget(request)\n        self.assertEqual(len(headers), 3)\n        name, value = headers[0]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT; SameSite=Lax',\n        )\n        name, value = headers[1]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT; SameSite=Lax',\n        )\n        name, value = headers[2]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=.localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT; SameSite=Lax',\n        )",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 1176,
                            "end_lineno": 1190,
                            "parent": {
                                "file_name": "tests/test_authentication.py",
                                "type": "class",
                                "name": "TestAuthTktCookieHelper",
                                "content": "class TestAuthTktCookieHelper(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import AuthTktCookieHelper\n\n        return AuthTktCookieHelper\n\n    def _makeOne(self, *arg, **kw):\n        helper = self._getTargetClass()(*arg, **kw)\n        # laziness after moving auth_tkt classes and funcs into\n        # authentication module\n        auth_tkt = DummyAuthTktModule()\n        helper.auth_tkt = auth_tkt\n        helper.AuthTicket = auth_tkt.AuthTicket\n        helper.parse_ticket = auth_tkt.parse_ticket\n        helper.BadTicket = auth_tkt.BadTicket\n        return helper\n\n    def _makeRequest(self, cookie=None, ipv6=False):\n        environ = {'wsgi.version': (1, 0)}\n\n        if ipv6 is False:\n            environ['REMOTE_ADDR'] = '1.1.1.1'\n        else:\n            environ['REMOTE_ADDR'] = '::1'\n        environ['SERVER_NAME'] = 'localhost'\n        return DummyRequest(environ, cookie=cookie)\n\n    def _cookieValue(self, cookie):\n        items = cookie.value.split('/')\n        D = {}\n        for item in items:\n            k, v = item.split('=', 1)\n            D[k] = v\n        return D\n\n    def _parseHeaders(self, headers):\n        return [self._parseHeader(header) for header in headers]\n\n    def _parseHeader(self, header):\n        cookie = self._parseCookie(header[1])\n        return cookie\n\n    def _parseCookie(self, cookie):\n        cookies = SimpleCookie()\n        cookies.load(cookie)\n        return cookies.get('auth_tkt')\n\n    def test_init_cookie_str_reissue_invalid(self):\n        self.assertRaises(\n            ValueError, self._makeOne, 'secret', reissue_time='invalid value'\n        )\n\n    def test_init_cookie_str_timeout_invalid(self):\n        self.assertRaises(\n            ValueError, self._makeOne, 'secret', timeout='invalid value'\n        )\n\n    def test_init_cookie_str_max_age_invalid(self):\n        self.assertRaises(\n            ValueError, self._makeOne, 'secret', max_age='invalid value'\n        )\n\n    def test_identify_nocookie(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.identify(request)\n        self.assertEqual(result, None)\n\n    def test_identify_cookie_value_is_None(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest(None)\n        result = helper.identify(request)\n        self.assertEqual(result, None)\n\n    def test_identify_good_cookie_include_ip(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 'userid')\n        self.assertEqual(result['userdata'], '')\n        self.assertEqual(result['timestamp'], 0)\n        self.assertEqual(helper.auth_tkt.value, 'ticket')\n        self.assertEqual(helper.auth_tkt.remote_addr, '1.1.1.1')\n        self.assertEqual(helper.auth_tkt.secret, 'secret')\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], '')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_include_ipv6(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest('ticket', ipv6=True)\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 'userid')\n        self.assertEqual(result['userdata'], '')\n        self.assertEqual(result['timestamp'], 0)\n        self.assertEqual(helper.auth_tkt.value, 'ticket')\n        self.assertEqual(helper.auth_tkt.remote_addr, '::1')\n        self.assertEqual(helper.auth_tkt.secret, 'secret')\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], '')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_dont_include_ip(self):\n        helper = self._makeOne('secret', include_ip=False)\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 'userid')\n        self.assertEqual(result['userdata'], '')\n        self.assertEqual(result['timestamp'], 0)\n        self.assertEqual(helper.auth_tkt.value, 'ticket')\n        self.assertEqual(helper.auth_tkt.remote_addr, '0.0.0.0')\n        self.assertEqual(helper.auth_tkt.secret, 'secret')\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], '')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_int_useridtype(self):\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = '1'\n        helper.auth_tkt.user_data = 'userid_type:int'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 1)\n        self.assertEqual(result['userdata'], 'userid_type:int')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], 'userid_type:int')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_nonuseridtype_user_data(self):\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = '1'\n        helper.auth_tkt.user_data = 'bogus:int'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], '1')\n        self.assertEqual(result['userdata'], 'bogus:int')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], 'bogus:int')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_unknown_useridtype(self):\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = 'abc'\n        helper.auth_tkt.user_data = 'userid_type:unknown'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 'abc')\n        self.assertEqual(result['userdata'], 'userid_type:unknown')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], 'userid_type:unknown')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_b64str_useridtype(self):\n        from base64 import b64encode\n\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = b64encode(b'encoded').strip()\n        helper.auth_tkt.user_data = 'userid_type:b64str'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], b'encoded')\n        self.assertEqual(result['userdata'], 'userid_type:b64str')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], 'userid_type:b64str')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_b64unicode_useridtype(self):\n        from base64 import b64encode\n\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = b64encode(b'\\xc3\\xa9ncoded').strip()\n        helper.auth_tkt.user_data = 'userid_type:b64unicode'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], text_(b'\\xc3\\xa9ncoded', 'utf-8'))\n        self.assertEqual(result['userdata'], 'userid_type:b64unicode')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], 'userid_type:b64unicode')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_bad_cookie(self):\n        helper = self._makeOne('secret', include_ip=True)\n        helper.auth_tkt.parse_raise = True\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(result, None)\n\n    def test_identify_cookie_timeout(self):\n        helper = self._makeOne('secret', timeout=1)\n        self.assertEqual(helper.timeout, 1)\n\n    def test_identify_cookie_str_timeout(self):\n        helper = self._makeOne('secret', timeout='1')\n        self.assertEqual(helper.timeout, 1)\n\n    def test_identify_cookie_timeout_aged(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10)\n        now = time.time()\n        helper.auth_tkt.timestamp = now - 1\n        helper.now = now + 10\n        helper.auth_tkt.tokens = (text_('a'),)\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertFalse(result)\n\n    def test_identify_cookie_reissue(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        helper.auth_tkt.tokens = (text_('a'),)\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n\n    def test_identify_cookie_str_reissue(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time='0')\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        helper.auth_tkt.tokens = (text_('a'),)\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n\n    def test_identify_cookie_reissue_already_reissued_this_request(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        request._authtkt_reissued = True\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_notyet(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=10)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_revoked_by_forget(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.forget(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_revoked_by_remember(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.remember(request, 'bob')\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_with_tokens_default(self):\n        # see https://github.com/Pylons/pyramid/issues#issue/108\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        auth_tkt = DummyAuthTktModule(tokens=[''])\n        helper.auth_tkt = auth_tkt\n        helper.AuthTicket = auth_tkt.AuthTicket\n        helper.parse_ticket = auth_tkt.parse_ticket\n        helper.BadTicket = auth_tkt.BadTicket\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](None, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=/\" in response.headerlist[0][1])\n\n    def test_remember(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/; SameSite=Lax'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\n            result[1][1].endswith('; Domain=localhost; Path=/; SameSite=Lax')\n        )\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\n            result[2][1].endswith('; Domain=.localhost; Path=/; SameSite=Lax')\n        )\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_nondefault_samesite(self):\n        helper = self._makeOne('secret', samesite='Strict')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/; SameSite=Strict'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\n            result[1][1].endswith(\n                '; Domain=localhost; Path=/; SameSite=Strict'\n            )\n        )\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\n            result[2][1].endswith(\n                '; Domain=.localhost; Path=/; SameSite=Strict'\n            )\n        )\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_None_samesite(self):\n        helper = self._makeOne('secret', samesite=None)\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))  # no samesite\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_include_ip(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/; SameSite=Lax'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\n            result[1][1].endswith('; Domain=localhost; Path=/; SameSite=Lax')\n        )\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\n            result[2][1].endswith('; Domain=.localhost; Path=/; SameSite=Lax')\n        )\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_path(self):\n        helper = self._makeOne(\n            'secret', include_ip=True, path=\"/cgi-bin/app.cgi/\"\n        )\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\n            result[0][1].endswith('; Path=/cgi-bin/app.cgi/; SameSite=Lax')\n        )\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\n            result[1][1].endswith(\n                '; Domain=localhost; Path=/cgi-bin/app.cgi/; SameSite=Lax'\n            )\n        )\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\n            result[2][1].endswith(\n                '; Domain=.localhost; Path=/cgi-bin/app.cgi/; SameSite=Lax'\n            )\n        )\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_http_only(self):\n        helper = self._makeOne('secret', include_ip=True, http_only=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; HttpOnly; SameSite=Lax'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_secure(self):\n        helper = self._makeOne('secret', include_ip=True, secure=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[0][1])\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_wild_domain_disabled(self):\n        helper = self._makeOne('secret', wild_domain=False)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 2)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/; SameSite=Lax'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\n            result[1][1].endswith('; Domain=localhost; Path=/; SameSite=Lax')\n        )\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain(self):\n        helper = self._makeOne('secret', parent_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\n            result[0][1].endswith(\n                '; Domain=.example.com; Path=/; SameSite=Lax'\n            )\n        )\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain_supercedes_wild_domain(self):\n        helper = self._makeOne('secret', parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(\n            result[0][1].endswith(\n                '; Domain=.example.com; Path=/; SameSite=Lax'\n            )\n        )\n\n    def test_remember_explicit_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga')\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\n            result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/; SameSite=Lax'\n            )\n        )\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_domain_supercedes_parent_and_wild_domain(self):\n        helper = self._makeOne(\n            'secret',\n            domain='pyramid.bazinga',\n            parent_domain=True,\n            wild_domain=True,\n        )\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(\n            result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/; SameSite=Lax'\n            )\n        )\n\n    def test_remember_binary_userid(self):\n        import base64\n\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, b'userid')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(\n            val['userid'], text_(base64.b64encode(b'userid').strip())\n        )\n        self.assertEqual(val['user_data'], 'userid_type:b64str')\n\n    def test_remember_int_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 1)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_unicode_userid(self):\n        import base64\n\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = text_(b'\\xc2\\xa9', 'utf-8')\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(\n            val['userid'], text_(base64.b64encode(userid.encode('utf-8')))\n        )\n        self.assertEqual(val['user_data'], 'userid_type:b64unicode')\n\n    def test_remember_insane_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = object()\n        with warnings.catch_warnings(record=True) as w:\n            warnings.simplefilter('always', RuntimeWarning)\n            result = helper.remember(request, userid)\n            self.assertTrue(str(w[-1].message).startswith('userid is of type'))\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        value = values[0]\n        self.assertTrue('userid' in value.value)\n\n    def test_remember_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age=500)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age='500')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age_invalid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(\n            ValueError,\n            helper.remember,\n            request,\n            'userid',\n            max_age='invalid value',\n        )\n\n    def test_remember_tokens(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'other', tokens=('foo', 'bar'))\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[0][1])\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[1][1])\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[2][1])\n\n    def test_remember_samesite_nondefault(self):\n        helper = self._makeOne('secret', samesite='Strict')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        cookieval = result[0][1]\n        self.assertTrue(\n            'SameSite=Strict' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        cookieval = result[1][1]\n        self.assertTrue(\n            'SameSite=Strict' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        cookieval = result[2][1]\n        self.assertTrue(\n            'SameSite=Strict' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n    def test_remember_samesite_default(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        cookieval = result[0][1]\n        self.assertTrue(\n            'SameSite=Lax' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        cookieval = result[1][1]\n        self.assertTrue(\n            'SameSite=Lax' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        cookieval = result[2][1]\n        self.assertTrue(\n            'SameSite=Lax' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n    def test_remember_unicode_but_ascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'foo', 'utf-8')\n        result = helper.remember(request, 'other', tokens=(la,))\n        # tokens must be str type on both Python 2 and 3\n        self.assertTrue(\"/tokens=foo/\" in result[0][1])\n\n    def test_remember_nonascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'La Pe\\xc3\\xb1a', 'utf-8')\n        self.assertRaises(\n            ValueError, helper.remember, request, 'other', tokens=(la,)\n        )\n\n    def test_remember_invalid_token_format(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(\n            ValueError, helper.remember, request, 'other', tokens=('foo bar',)\n        )\n        self.assertRaises(\n            ValueError, helper.remember, request, 'other', tokens=('1bar',)\n        )\n\n    def test_forget(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        headers = helper.forget(request)\n        self.assertEqual(len(headers), 3)\n        name, value = headers[0]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT; SameSite=Lax',\n        )\n        name, value = headers[1]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT; SameSite=Lax',\n        )\n        name, value = headers[2]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=.localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT; SameSite=Lax',\n        )",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 668,
                                "end_lineno": 1454,
                                "parent": null
                            }
                        },
                        {
                            "file_name": "tests/test_authentication.py",
                            "type": "class",
                            "name": "TestAuthTktCookieHelper",
                            "content": "class TestAuthTktCookieHelper(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import AuthTktCookieHelper\n\n        return AuthTktCookieHelper\n\n    def _makeOne(self, *arg, **kw):\n        helper = self._getTargetClass()(*arg, **kw)\n        # laziness after moving auth_tkt classes and funcs into\n        # authentication module\n        auth_tkt = DummyAuthTktModule()\n        helper.auth_tkt = auth_tkt\n        helper.AuthTicket = auth_tkt.AuthTicket\n        helper.parse_ticket = auth_tkt.parse_ticket\n        helper.BadTicket = auth_tkt.BadTicket\n        return helper\n\n    def _makeRequest(self, cookie=None, ipv6=False):\n        environ = {'wsgi.version': (1, 0)}\n\n        if ipv6 is False:\n            environ['REMOTE_ADDR'] = '1.1.1.1'\n        else:\n            environ['REMOTE_ADDR'] = '::1'\n        environ['SERVER_NAME'] = 'localhost'\n        return DummyRequest(environ, cookie=cookie)\n\n    def _cookieValue(self, cookie):\n        items = cookie.value.split('/')\n        D = {}\n        for item in items:\n            k, v = item.split('=', 1)\n            D[k] = v\n        return D\n\n    def _parseHeaders(self, headers):\n        return [self._parseHeader(header) for header in headers]\n\n    def _parseHeader(self, header):\n        cookie = self._parseCookie(header[1])\n        return cookie\n\n    def _parseCookie(self, cookie):\n        cookies = SimpleCookie()\n        cookies.load(cookie)\n        return cookies.get('auth_tkt')\n\n    def test_init_cookie_str_reissue_invalid(self):\n        self.assertRaises(\n            ValueError, self._makeOne, 'secret', reissue_time='invalid value'\n        )\n\n    def test_init_cookie_str_timeout_invalid(self):\n        self.assertRaises(\n            ValueError, self._makeOne, 'secret', timeout='invalid value'\n        )\n\n    def test_init_cookie_str_max_age_invalid(self):\n        self.assertRaises(\n            ValueError, self._makeOne, 'secret', max_age='invalid value'\n        )\n\n    def test_identify_nocookie(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.identify(request)\n        self.assertEqual(result, None)\n\n    def test_identify_cookie_value_is_None(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest(None)\n        result = helper.identify(request)\n        self.assertEqual(result, None)\n\n    def test_identify_good_cookie_include_ip(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 'userid')\n        self.assertEqual(result['userdata'], '')\n        self.assertEqual(result['timestamp'], 0)\n        self.assertEqual(helper.auth_tkt.value, 'ticket')\n        self.assertEqual(helper.auth_tkt.remote_addr, '1.1.1.1')\n        self.assertEqual(helper.auth_tkt.secret, 'secret')\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], '')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_include_ipv6(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest('ticket', ipv6=True)\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 'userid')\n        self.assertEqual(result['userdata'], '')\n        self.assertEqual(result['timestamp'], 0)\n        self.assertEqual(helper.auth_tkt.value, 'ticket')\n        self.assertEqual(helper.auth_tkt.remote_addr, '::1')\n        self.assertEqual(helper.auth_tkt.secret, 'secret')\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], '')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_dont_include_ip(self):\n        helper = self._makeOne('secret', include_ip=False)\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 'userid')\n        self.assertEqual(result['userdata'], '')\n        self.assertEqual(result['timestamp'], 0)\n        self.assertEqual(helper.auth_tkt.value, 'ticket')\n        self.assertEqual(helper.auth_tkt.remote_addr, '0.0.0.0')\n        self.assertEqual(helper.auth_tkt.secret, 'secret')\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], '')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_int_useridtype(self):\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = '1'\n        helper.auth_tkt.user_data = 'userid_type:int'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 1)\n        self.assertEqual(result['userdata'], 'userid_type:int')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], 'userid_type:int')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_nonuseridtype_user_data(self):\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = '1'\n        helper.auth_tkt.user_data = 'bogus:int'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], '1')\n        self.assertEqual(result['userdata'], 'bogus:int')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], 'bogus:int')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_unknown_useridtype(self):\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = 'abc'\n        helper.auth_tkt.user_data = 'userid_type:unknown'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 'abc')\n        self.assertEqual(result['userdata'], 'userid_type:unknown')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], 'userid_type:unknown')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_b64str_useridtype(self):\n        from base64 import b64encode\n\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = b64encode(b'encoded').strip()\n        helper.auth_tkt.user_data = 'userid_type:b64str'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], b'encoded')\n        self.assertEqual(result['userdata'], 'userid_type:b64str')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], 'userid_type:b64str')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_b64unicode_useridtype(self):\n        from base64 import b64encode\n\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = b64encode(b'\\xc3\\xa9ncoded').strip()\n        helper.auth_tkt.user_data = 'userid_type:b64unicode'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], text_(b'\\xc3\\xa9ncoded', 'utf-8'))\n        self.assertEqual(result['userdata'], 'userid_type:b64unicode')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], 'userid_type:b64unicode')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_bad_cookie(self):\n        helper = self._makeOne('secret', include_ip=True)\n        helper.auth_tkt.parse_raise = True\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(result, None)\n\n    def test_identify_cookie_timeout(self):\n        helper = self._makeOne('secret', timeout=1)\n        self.assertEqual(helper.timeout, 1)\n\n    def test_identify_cookie_str_timeout(self):\n        helper = self._makeOne('secret', timeout='1')\n        self.assertEqual(helper.timeout, 1)\n\n    def test_identify_cookie_timeout_aged(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10)\n        now = time.time()\n        helper.auth_tkt.timestamp = now - 1\n        helper.now = now + 10\n        helper.auth_tkt.tokens = (text_('a'),)\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertFalse(result)\n\n    def test_identify_cookie_reissue(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        helper.auth_tkt.tokens = (text_('a'),)\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n\n    def test_identify_cookie_str_reissue(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time='0')\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        helper.auth_tkt.tokens = (text_('a'),)\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n\n    def test_identify_cookie_reissue_already_reissued_this_request(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        request._authtkt_reissued = True\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_notyet(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=10)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_revoked_by_forget(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.forget(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_revoked_by_remember(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.remember(request, 'bob')\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_with_tokens_default(self):\n        # see https://github.com/Pylons/pyramid/issues#issue/108\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        auth_tkt = DummyAuthTktModule(tokens=[''])\n        helper.auth_tkt = auth_tkt\n        helper.AuthTicket = auth_tkt.AuthTicket\n        helper.parse_ticket = auth_tkt.parse_ticket\n        helper.BadTicket = auth_tkt.BadTicket\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](None, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=/\" in response.headerlist[0][1])\n\n    def test_remember(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/; SameSite=Lax'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\n            result[1][1].endswith('; Domain=localhost; Path=/; SameSite=Lax')\n        )\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\n            result[2][1].endswith('; Domain=.localhost; Path=/; SameSite=Lax')\n        )\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_nondefault_samesite(self):\n        helper = self._makeOne('secret', samesite='Strict')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/; SameSite=Strict'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\n            result[1][1].endswith(\n                '; Domain=localhost; Path=/; SameSite=Strict'\n            )\n        )\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\n            result[2][1].endswith(\n                '; Domain=.localhost; Path=/; SameSite=Strict'\n            )\n        )\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_None_samesite(self):\n        helper = self._makeOne('secret', samesite=None)\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))  # no samesite\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_include_ip(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/; SameSite=Lax'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\n            result[1][1].endswith('; Domain=localhost; Path=/; SameSite=Lax')\n        )\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\n            result[2][1].endswith('; Domain=.localhost; Path=/; SameSite=Lax')\n        )\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_path(self):\n        helper = self._makeOne(\n            'secret', include_ip=True, path=\"/cgi-bin/app.cgi/\"\n        )\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\n            result[0][1].endswith('; Path=/cgi-bin/app.cgi/; SameSite=Lax')\n        )\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\n            result[1][1].endswith(\n                '; Domain=localhost; Path=/cgi-bin/app.cgi/; SameSite=Lax'\n            )\n        )\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\n            result[2][1].endswith(\n                '; Domain=.localhost; Path=/cgi-bin/app.cgi/; SameSite=Lax'\n            )\n        )\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_http_only(self):\n        helper = self._makeOne('secret', include_ip=True, http_only=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; HttpOnly; SameSite=Lax'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_secure(self):\n        helper = self._makeOne('secret', include_ip=True, secure=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[0][1])\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_wild_domain_disabled(self):\n        helper = self._makeOne('secret', wild_domain=False)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 2)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/; SameSite=Lax'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\n            result[1][1].endswith('; Domain=localhost; Path=/; SameSite=Lax')\n        )\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain(self):\n        helper = self._makeOne('secret', parent_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\n            result[0][1].endswith(\n                '; Domain=.example.com; Path=/; SameSite=Lax'\n            )\n        )\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain_supercedes_wild_domain(self):\n        helper = self._makeOne('secret', parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(\n            result[0][1].endswith(\n                '; Domain=.example.com; Path=/; SameSite=Lax'\n            )\n        )\n\n    def test_remember_explicit_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga')\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\n            result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/; SameSite=Lax'\n            )\n        )\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_domain_supercedes_parent_and_wild_domain(self):\n        helper = self._makeOne(\n            'secret',\n            domain='pyramid.bazinga',\n            parent_domain=True,\n            wild_domain=True,\n        )\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(\n            result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/; SameSite=Lax'\n            )\n        )\n\n    def test_remember_binary_userid(self):\n        import base64\n\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, b'userid')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(\n            val['userid'], text_(base64.b64encode(b'userid').strip())\n        )\n        self.assertEqual(val['user_data'], 'userid_type:b64str')\n\n    def test_remember_int_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 1)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_unicode_userid(self):\n        import base64\n\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = text_(b'\\xc2\\xa9', 'utf-8')\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(\n            val['userid'], text_(base64.b64encode(userid.encode('utf-8')))\n        )\n        self.assertEqual(val['user_data'], 'userid_type:b64unicode')\n\n    def test_remember_insane_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = object()\n        with warnings.catch_warnings(record=True) as w:\n            warnings.simplefilter('always', RuntimeWarning)\n            result = helper.remember(request, userid)\n            self.assertTrue(str(w[-1].message).startswith('userid is of type'))\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        value = values[0]\n        self.assertTrue('userid' in value.value)\n\n    def test_remember_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age=500)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age='500')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age_invalid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(\n            ValueError,\n            helper.remember,\n            request,\n            'userid',\n            max_age='invalid value',\n        )\n\n    def test_remember_tokens(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'other', tokens=('foo', 'bar'))\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[0][1])\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[1][1])\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[2][1])\n\n    def test_remember_samesite_nondefault(self):\n        helper = self._makeOne('secret', samesite='Strict')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        cookieval = result[0][1]\n        self.assertTrue(\n            'SameSite=Strict' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        cookieval = result[1][1]\n        self.assertTrue(\n            'SameSite=Strict' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        cookieval = result[2][1]\n        self.assertTrue(\n            'SameSite=Strict' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n    def test_remember_samesite_default(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        cookieval = result[0][1]\n        self.assertTrue(\n            'SameSite=Lax' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        cookieval = result[1][1]\n        self.assertTrue(\n            'SameSite=Lax' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        cookieval = result[2][1]\n        self.assertTrue(\n            'SameSite=Lax' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n    def test_remember_unicode_but_ascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'foo', 'utf-8')\n        result = helper.remember(request, 'other', tokens=(la,))\n        # tokens must be str type on both Python 2 and 3\n        self.assertTrue(\"/tokens=foo/\" in result[0][1])\n\n    def test_remember_nonascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'La Pe\\xc3\\xb1a', 'utf-8')\n        self.assertRaises(\n            ValueError, helper.remember, request, 'other', tokens=(la,)\n        )\n\n    def test_remember_invalid_token_format(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(\n            ValueError, helper.remember, request, 'other', tokens=('foo bar',)\n        )\n        self.assertRaises(\n            ValueError, helper.remember, request, 'other', tokens=('1bar',)\n        )\n\n    def test_forget(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        headers = helper.forget(request)\n        self.assertEqual(len(headers), 3)\n        name, value = headers[0]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT; SameSite=Lax',\n        )\n        name, value = headers[1]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT; SameSite=Lax',\n        )\n        name, value = headers[2]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=.localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT; SameSite=Lax',\n        )",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 668,
                            "end_lineno": 1454,
                            "parent": null
                        }
                    ],
                    "added_entities": [],
                    "deleted_entities": []
                }
            ]
        }
    ],
    "old_commit_hash": "942c6c07a643d8f2253b190882fae72aba3f0ea8^",
    "new_commit_hash": "942c6c07a643d8f2253b190882fae72aba3f0ea8",
    "commit_message": "cur_domain is effectively equivalent to '.' + cur_domain and therefore negates the effect of wild_domain",
    "commit_date": "2020-05-28T18:22:31-06:00",
    "metadata": {}
}
{
    "repo_name": "pyramid",
    "new_commit_hash": "942c6c07a643d8f2253b190882fae72aba3f0ea8",
    "test_file_codes": [
        "from http.cookies import SimpleCookie\nimport unittest\nimport warnings\n\nfrom pyramid import testing\nfrom pyramid.util import bytes_, text_\n\n\nclass TestCallbackAuthenticationPolicyDebugging(unittest.TestCase):\n    def setUp(self):\n        from pyramid.interfaces import IDebugLogger\n\n        self.config = testing.setUp()\n        self.config.registry.registerUtility(self, IDebugLogger)\n        self.messages = []\n\n    def tearDown(self):\n        del self.config\n\n    def debug(self, msg):\n        self.messages.append(msg)\n\n    def _makeOne(self, userid=None, callback=None):\n        from pyramid.authentication import CallbackAuthenticationPolicy\n\n        class MyAuthenticationPolicy(CallbackAuthenticationPolicy):\n            def unauthenticated_userid(self, request):\n                return userid\n\n        policy = MyAuthenticationPolicy()\n        policy.debug = True\n        policy.callback = callback\n        return policy\n\n    def test_authenticated_userid_no_unauthenticated_userid(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), None)\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            'tests.test_authentication.MyAuthenticationPolicy.'\n            'authenticated_userid: call to unauthenticated_userid returned '\n            'None; returning None',\n        )\n\n    def test_authenticated_userid_no_callback(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne(userid='fred')\n        self.assertEqual(policy.authenticated_userid(request), 'fred')\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            \"tests.test_authentication.MyAuthenticationPolicy.\"\n            \"authenticated_userid: there was no groupfinder callback; \"\n            \"returning 'fred'\",\n        )\n\n    def test_authenticated_userid_with_callback_fail(self):\n        request = DummyRequest(registry=self.config.registry)\n\n        def callback(userid, request):\n            return None\n\n        policy = self._makeOne(userid='fred', callback=callback)\n        self.assertEqual(policy.authenticated_userid(request), None)\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            'tests.test_authentication.MyAuthenticationPolicy.'\n            'authenticated_userid: groupfinder callback returned None; '\n            'returning None',\n        )\n\n    def test_authenticated_userid_with_callback_success(self):\n        request = DummyRequest(registry=self.config.registry)\n\n        def callback(userid, request):\n            return []\n\n        policy = self._makeOne(userid='fred', callback=callback)\n        self.assertEqual(policy.authenticated_userid(request), 'fred')\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            \"tests.test_authentication.MyAuthenticationPolicy.\"\n            \"authenticated_userid: groupfinder callback returned []; \"\n            \"returning 'fred'\",\n        )\n\n    def test_authenticated_userid_fails_cleaning_as_Authenticated(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne(userid='system.Authenticated')\n        self.assertEqual(policy.authenticated_userid(request), None)\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            \"tests.test_authentication.MyAuthenticationPolicy.\"\n            \"authenticated_userid: use of userid 'system.Authenticated' is \"\n            \"disallowed by any built-in Pyramid security policy, returning \"\n            \"None\",\n        )\n\n    def test_authenticated_userid_fails_cleaning_as_Everyone(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne(userid='system.Everyone')\n        self.assertEqual(policy.authenticated_userid(request), None)\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            \"tests.test_authentication.MyAuthenticationPolicy.\"\n            \"authenticated_userid: use of userid 'system.Everyone' is \"\n            \"disallowed by any built-in Pyramid security policy, returning \"\n            \"None\",\n        )\n\n    def test_effective_principals_no_unauthenticated_userid(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne()\n        self.assertEqual(\n            policy.effective_principals(request), ['system.Everyone']\n        )\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            \"tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: unauthenticated_userid returned None; \"\n            \"returning ['system.Everyone']\",\n        )\n\n    def test_effective_principals_no_callback(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne(userid='fred')\n        self.assertEqual(\n            policy.effective_principals(request),\n            ['system.Everyone', 'system.Authenticated', 'fred'],\n        )\n        self.assertEqual(len(self.messages), 2)\n        self.assertEqual(\n            self.messages[0],\n            'tests.test_authentication.MyAuthenticationPolicy.'\n            'effective_principals: groupfinder callback is None, so groups '\n            'is []',\n        )\n        self.assertEqual(\n            self.messages[1],\n            \"tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: returning effective principals: \"\n            \"['system.Everyone', 'system.Authenticated', 'fred']\",\n        )\n\n    def test_effective_principals_with_callback_fail(self):\n        request = DummyRequest(registry=self.config.registry)\n\n        def callback(userid, request):\n            return None\n\n        policy = self._makeOne(userid='fred', callback=callback)\n        self.assertEqual(\n            policy.effective_principals(request), ['system.Everyone']\n        )\n        self.assertEqual(len(self.messages), 2)\n        self.assertEqual(\n            self.messages[0],\n            'tests.test_authentication.MyAuthenticationPolicy.'\n            'effective_principals: groupfinder callback returned None as '\n            'groups',\n        )\n        self.assertEqual(\n            self.messages[1],\n            \"tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: returning effective principals: \"\n            \"['system.Everyone']\",\n        )\n\n    def test_effective_principals_with_callback_success(self):\n        request = DummyRequest(registry=self.config.registry)\n\n        def callback(userid, request):\n            return []\n\n        policy = self._makeOne(userid='fred', callback=callback)\n        self.assertEqual(\n            policy.effective_principals(request),\n            ['system.Everyone', 'system.Authenticated', 'fred'],\n        )\n        self.assertEqual(len(self.messages), 2)\n        self.assertEqual(\n            self.messages[0],\n            'tests.test_authentication.MyAuthenticationPolicy.'\n            'effective_principals: groupfinder callback returned [] as groups',\n        )\n        self.assertEqual(\n            self.messages[1],\n            \"tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: returning effective principals: \"\n            \"['system.Everyone', 'system.Authenticated', 'fred']\",\n        )\n\n    def test_effective_principals_with_unclean_principal_Authenticated(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne(userid='system.Authenticated')\n        self.assertEqual(\n            policy.effective_principals(request), ['system.Everyone']\n        )\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            \"tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: unauthenticated_userid returned disallowed \"\n            \"'system.Authenticated'; returning ['system.Everyone'] as if it \"\n            \"was None\",\n        )\n\n    def test_effective_principals_with_unclean_principal_Everyone(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne(userid='system.Everyone')\n        self.assertEqual(\n            policy.effective_principals(request), ['system.Everyone']\n        )\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            \"tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: unauthenticated_userid returned disallowed \"\n            \"'system.Everyone'; returning ['system.Everyone'] as if it \"\n            \"was None\",\n        )\n\n\nclass TestRepozeWho1AuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import RepozeWho1AuthenticationPolicy\n\n        return RepozeWho1AuthenticationPolicy\n\n    def _makeOne(self, identifier_name='auth_tkt', callback=None):\n        return self._getTargetClass()(identifier_name, callback)\n\n    def test_class_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyClass\n        from pyramid.interfaces import IAuthenticationPolicy\n\n        verifyClass(IAuthenticationPolicy, self._getTargetClass())\n\n    def test_instance_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyObject\n        from pyramid.interfaces import IAuthenticationPolicy\n\n        verifyObject(IAuthenticationPolicy, self._makeOne())\n\n    def test_unauthenticated_userid_returns_None(self):\n        request = DummyRequest({})\n        policy = self._makeOne()\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_unauthenticated_userid(self):\n        request = DummyRequest(\n            {'repoze.who.identity': {'repoze.who.userid': 'fred'}}\n        )\n        policy = self._makeOne()\n        self.assertEqual(policy.unauthenticated_userid(request), 'fred')\n\n    def test_authenticated_userid_None(self):\n        request = DummyRequest({})\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid(self):\n        request = DummyRequest(\n            {'repoze.who.identity': {'repoze.who.userid': 'fred'}}\n        )\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), 'fred')\n\n    def test_authenticated_userid_repoze_who_userid_is_None(self):\n        request = DummyRequest(\n            {'repoze.who.identity': {'repoze.who.userid': None}}\n        )\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid_with_callback_returns_None(self):\n        request = DummyRequest(\n            {'repoze.who.identity': {'repoze.who.userid': 'fred'}}\n        )\n\n        def callback(identity, request):\n            return None\n\n        policy = self._makeOne(callback=callback)\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid_with_callback_returns_something(self):\n        request = DummyRequest(\n            {'repoze.who.identity': {'repoze.who.userid': 'fred'}}\n        )\n\n        def callback(identity, request):\n            return ['agroup']\n\n        policy = self._makeOne(callback=callback)\n        self.assertEqual(policy.authenticated_userid(request), 'fred')\n\n    def test_authenticated_userid_unclean_principal_Authenticated(self):\n        request = DummyRequest(\n            {\n                'repoze.who.identity': {\n                    'repoze.who.userid': 'system.Authenticated'\n                }\n            }\n        )\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid_unclean_principal_Everyone(self):\n        request = DummyRequest(\n            {'repoze.who.identity': {'repoze.who.userid': 'system.Everyone'}}\n        )\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_effective_principals_None(self):\n        from pyramid.authorization import Everyone\n\n        request = DummyRequest({})\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals_userid_only(self):\n        from pyramid.authorization import Everyone\n        from pyramid.authorization import Authenticated\n\n        request = DummyRequest(\n            {'repoze.who.identity': {'repoze.who.userid': 'fred'}}\n        )\n        policy = self._makeOne()\n        self.assertEqual(\n            policy.effective_principals(request),\n            [Everyone, Authenticated, 'fred'],\n        )\n\n    def test_effective_principals_userid_and_groups(self):\n        from pyramid.authorization import Everyone\n        from pyramid.authorization import Authenticated\n\n        request = DummyRequest(\n            {\n                'repoze.who.identity': {\n                    'repoze.who.userid': 'fred',\n                    'groups': ['quux', 'biz'],\n                }\n            }\n        )\n\n        def callback(identity, request):\n            return identity['groups']\n\n        policy = self._makeOne(callback=callback)\n        self.assertEqual(\n            policy.effective_principals(request),\n            [Everyone, Authenticated, 'fred', 'quux', 'biz'],\n        )\n\n    def test_effective_principals_userid_callback_returns_None(self):\n        from pyramid.authorization import Everyone\n\n        request = DummyRequest(\n            {\n                'repoze.who.identity': {\n                    'repoze.who.userid': 'fred',\n                    'groups': ['quux', 'biz'],\n                }\n            }\n        )\n\n        def callback(identity, request):\n            return None\n\n        policy = self._makeOne(callback=callback)\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals_repoze_who_userid_is_None(self):\n        from pyramid.authorization import Everyone\n\n        request = DummyRequest(\n            {'repoze.who.identity': {'repoze.who.userid': None}}\n        )\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals_repoze_who_userid_is_unclean_Everyone(self):\n        from pyramid.authorization import Everyone\n\n        request = DummyRequest(\n            {'repoze.who.identity': {'repoze.who.userid': 'system.Everyone'}}\n        )\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals_repoze_who_userid_is_unclean_Authenticated(\n        self,\n    ):\n        from pyramid.authorization import Everyone\n\n        request = DummyRequest(\n            {\n                'repoze.who.identity': {\n                    'repoze.who.userid': 'system.Authenticated'\n                }\n            }\n        )\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_remember_no_plugins(self):\n        request = DummyRequest({})\n        policy = self._makeOne()\n        result = policy.remember(request, 'fred')\n        self.assertEqual(result, [])\n\n    def test_remember(self):\n        authtkt = DummyWhoPlugin()\n        request = DummyRequest({'repoze.who.plugins': {'auth_tkt': authtkt}})\n        policy = self._makeOne()\n        result = policy.remember(request, 'fred')\n        self.assertEqual(result[0], request.environ)\n        self.assertEqual(result[1], {'repoze.who.userid': 'fred'})\n\n    def test_remember_kwargs(self):\n        authtkt = DummyWhoPlugin()\n        request = DummyRequest({'repoze.who.plugins': {'auth_tkt': authtkt}})\n        policy = self._makeOne()\n        result = policy.remember(request, 'fred', max_age=23)\n        self.assertEqual(\n            result[1], {'repoze.who.userid': 'fred', 'max_age': 23}\n        )\n\n    def test_forget_no_plugins(self):\n        request = DummyRequest({})\n        policy = self._makeOne()\n        result = policy.forget(request)\n        self.assertEqual(result, [])\n\n    def test_forget(self):\n        authtkt = DummyWhoPlugin()\n        request = DummyRequest(\n            {\n                'repoze.who.plugins': {'auth_tkt': authtkt},\n                'repoze.who.identity': {'repoze.who.userid': 'fred'},\n            }\n        )\n        policy = self._makeOne()\n        result = policy.forget(request)\n        self.assertEqual(result[0], request.environ)\n        self.assertEqual(result[1], request.environ['repoze.who.identity'])\n\n\nclass TestRemoteUserAuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import RemoteUserAuthenticationPolicy\n\n        return RemoteUserAuthenticationPolicy\n\n    def _makeOne(self, environ_key='REMOTE_USER', callback=None):\n        return self._getTargetClass()(environ_key, callback)\n\n    def test_class_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyClass\n        from pyramid.interfaces import IAuthenticationPolicy\n\n        verifyClass(IAuthenticationPolicy, self._getTargetClass())\n\n    def test_instance_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyObject\n        from pyramid.interfaces import IAuthenticationPolicy\n\n        verifyObject(IAuthenticationPolicy, self._makeOne())\n\n    def test_unauthenticated_userid_returns_None(self):\n        request = DummyRequest({})\n        policy = self._makeOne()\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_unauthenticated_userid(self):\n        request = DummyRequest({'REMOTE_USER': 'fred'})\n        policy = self._makeOne()\n        self.assertEqual(policy.unauthenticated_userid(request), 'fred')\n\n    def test_authenticated_userid_None(self):\n        request = DummyRequest({})\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid(self):\n        request = DummyRequest({'REMOTE_USER': 'fred'})\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), 'fred')\n\n    def test_effective_principals_None(self):\n        from pyramid.authorization import Everyone\n\n        request = DummyRequest({})\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals(self):\n        from pyramid.authorization import Everyone\n        from pyramid.authorization import Authenticated\n\n        request = DummyRequest({'REMOTE_USER': 'fred'})\n        policy = self._makeOne()\n        self.assertEqual(\n            policy.effective_principals(request),\n            [Everyone, Authenticated, 'fred'],\n        )\n\n    def test_remember(self):\n        request = DummyRequest({'REMOTE_USER': 'fred'})\n        policy = self._makeOne()\n        result = policy.remember(request, 'fred')\n        self.assertEqual(result, [])\n\n    def test_forget(self):\n        request = DummyRequest({'REMOTE_USER': 'fred'})\n        policy = self._makeOne()\n        result = policy.forget(request)\n        self.assertEqual(result, [])\n\n\nclass TestAuthTktAuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import AuthTktAuthenticationPolicy\n\n        return AuthTktAuthenticationPolicy\n\n    def _makeOne(self, callback, cookieidentity, **kw):\n        inst = self._getTargetClass()('secret', callback, **kw)\n        inst.cookie = DummyCookieHelper(cookieidentity)\n        return inst\n\n    def setUp(self):\n        self.warnings = warnings.catch_warnings()\n        self.warnings.__enter__()\n        warnings.simplefilter('ignore', DeprecationWarning)\n\n    def tearDown(self):\n        self.warnings.__exit__(None, None, None)\n\n    def test_allargs(self):\n        # pass all known args\n        inst = self._getTargetClass()(\n            'secret',\n            callback=None,\n            cookie_name=None,\n            secure=False,\n            include_ip=False,\n            timeout=None,\n            reissue_time=None,\n            hashalg='sha512',\n            samesite=None,\n        )\n        self.assertEqual(inst.callback, None)\n\n    def test_hashalg_override(self):\n        # important to ensure hashalg is passed to cookie helper\n        inst = self._getTargetClass()('secret', hashalg='sha512')\n        self.assertEqual(inst.cookie.hashalg, 'sha512')\n\n    def test_unauthenticated_userid_returns_None(self):\n        request = DummyRequest({})\n        policy = self._makeOne(None, None)\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_unauthenticated_userid(self):\n        request = DummyRequest({'REMOTE_USER': 'fred'})\n        policy = self._makeOne(None, {'userid': 'fred'})\n        self.assertEqual(policy.unauthenticated_userid(request), 'fred')\n\n    def test_authenticated_userid_no_cookie_identity(self):\n        request = DummyRequest({})\n        policy = self._makeOne(None, None)\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid_callback_returns_None(self):\n        request = DummyRequest({})\n\n        def callback(userid, request):\n            return None\n\n        policy = self._makeOne(callback, {'userid': 'fred'})\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid(self):\n        request = DummyRequest({})\n\n        def callback(userid, request):\n            return True\n\n        policy = self._makeOne(callback, {'userid': 'fred'})\n        self.assertEqual(policy.authenticated_userid(request), 'fred')\n\n    def test_effective_principals_no_cookie_identity(self):\n        from pyramid.authorization import Everyone\n\n        request = DummyRequest({})\n        policy = self._makeOne(None, None)\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals_callback_returns_None(self):\n        from pyramid.authorization import Everyone\n\n        request = DummyRequest({})\n\n        def callback(userid, request):\n            return None\n\n        policy = self._makeOne(callback, {'userid': 'fred'})\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals(self):\n        from pyramid.authorization import Everyone\n        from pyramid.authorization import Authenticated\n\n        request = DummyRequest({})\n\n        def callback(userid, request):\n            return ['group.foo']\n\n        policy = self._makeOne(callback, {'userid': 'fred'})\n        self.assertEqual(\n            policy.effective_principals(request),\n            [Everyone, Authenticated, 'fred', 'group.foo'],\n        )\n\n    def test_remember(self):\n        request = DummyRequest({})\n        policy = self._makeOne(None, None)\n        result = policy.remember(request, 'fred')\n        self.assertEqual(result, [])\n\n    def test_remember_with_extra_kargs(self):\n        request = DummyRequest({})\n        policy = self._makeOne(None, None)\n        result = policy.remember(request, 'fred', a=1, b=2)\n        self.assertEqual(policy.cookie.kw, {'a': 1, 'b': 2})\n        self.assertEqual(result, [])\n\n    def test_forget(self):\n        request = DummyRequest({})\n        policy = self._makeOne(None, None)\n        result = policy.forget(request)\n        self.assertEqual(result, [])\n\n    def test_class_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyClass\n        from pyramid.interfaces import IAuthenticationPolicy\n\n        verifyClass(IAuthenticationPolicy, self._getTargetClass())\n\n    def test_instance_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyObject\n        from pyramid.interfaces import IAuthenticationPolicy\n\n        verifyObject(IAuthenticationPolicy, self._makeOne(None, None))\n\n\nclass TestAuthTktCookieHelper(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import AuthTktCookieHelper\n\n        return AuthTktCookieHelper\n\n    def _makeOne(self, *arg, **kw):\n        helper = self._getTargetClass()(*arg, **kw)\n        # laziness after moving auth_tkt classes and funcs into\n        # authentication module\n        auth_tkt = DummyAuthTktModule()\n        helper.auth_tkt = auth_tkt\n        helper.AuthTicket = auth_tkt.AuthTicket\n        helper.parse_ticket = auth_tkt.parse_ticket\n        helper.BadTicket = auth_tkt.BadTicket\n        return helper\n\n    def _makeRequest(self, cookie=None, ipv6=False):\n        environ = {'wsgi.version': (1, 0)}\n\n        if ipv6 is False:\n            environ['REMOTE_ADDR'] = '1.1.1.1'\n        else:\n            environ['REMOTE_ADDR'] = '::1'\n        environ['SERVER_NAME'] = 'localhost'\n        return DummyRequest(environ, cookie=cookie)\n\n    def _cookieValue(self, cookie):\n        items = cookie.value.split('/')\n        D = {}\n        for item in items:\n            k, v = item.split('=', 1)\n            D[k] = v\n        return D\n\n    def _parseHeaders(self, headers):\n        return [self._parseHeader(header) for header in headers]\n\n    def _parseHeader(self, header):\n        cookie = self._parseCookie(header[1])\n        return cookie\n\n    def _parseCookie(self, cookie):\n        cookies = SimpleCookie()\n        cookies.load(cookie)\n        return cookies.get('auth_tkt')\n\n    def test_init_cookie_str_reissue_invalid(self):\n        self.assertRaises(\n            ValueError, self._makeOne, 'secret', reissue_time='invalid value'\n        )\n\n    def test_init_cookie_str_timeout_invalid(self):\n        self.assertRaises(\n            ValueError, self._makeOne, 'secret', timeout='invalid value'\n        )\n\n    def test_init_cookie_str_max_age_invalid(self):\n        self.assertRaises(\n            ValueError, self._makeOne, 'secret', max_age='invalid value'\n        )\n\n    def test_identify_nocookie(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.identify(request)\n        self.assertEqual(result, None)\n\n    def test_identify_cookie_value_is_None(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest(None)\n        result = helper.identify(request)\n        self.assertEqual(result, None)\n\n    def test_identify_good_cookie_include_ip(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 'userid')\n        self.assertEqual(result['userdata'], '')\n        self.assertEqual(result['timestamp'], 0)\n        self.assertEqual(helper.auth_tkt.value, 'ticket')\n        self.assertEqual(helper.auth_tkt.remote_addr, '1.1.1.1')\n        self.assertEqual(helper.auth_tkt.secret, 'secret')\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], '')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_include_ipv6(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest('ticket', ipv6=True)\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 'userid')\n        self.assertEqual(result['userdata'], '')\n        self.assertEqual(result['timestamp'], 0)\n        self.assertEqual(helper.auth_tkt.value, 'ticket')\n        self.assertEqual(helper.auth_tkt.remote_addr, '::1')\n        self.assertEqual(helper.auth_tkt.secret, 'secret')\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], '')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_dont_include_ip(self):\n        helper = self._makeOne('secret', include_ip=False)\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 'userid')\n        self.assertEqual(result['userdata'], '')\n        self.assertEqual(result['timestamp'], 0)\n        self.assertEqual(helper.auth_tkt.value, 'ticket')\n        self.assertEqual(helper.auth_tkt.remote_addr, '0.0.0.0')\n        self.assertEqual(helper.auth_tkt.secret, 'secret')\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], '')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_int_useridtype(self):\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = '1'\n        helper.auth_tkt.user_data = 'userid_type:int'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 1)\n        self.assertEqual(result['userdata'], 'userid_type:int')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], 'userid_type:int')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_nonuseridtype_user_data(self):\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = '1'\n        helper.auth_tkt.user_data = 'bogus:int'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], '1')\n        self.assertEqual(result['userdata'], 'bogus:int')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], 'bogus:int')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_unknown_useridtype(self):\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = 'abc'\n        helper.auth_tkt.user_data = 'userid_type:unknown'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 'abc')\n        self.assertEqual(result['userdata'], 'userid_type:unknown')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], 'userid_type:unknown')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_b64str_useridtype(self):\n        from base64 import b64encode\n\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = b64encode(b'encoded').strip()\n        helper.auth_tkt.user_data = 'userid_type:b64str'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], b'encoded')\n        self.assertEqual(result['userdata'], 'userid_type:b64str')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], 'userid_type:b64str')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_good_cookie_b64unicode_useridtype(self):\n        from base64 import b64encode\n\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = b64encode(b'\\xc3\\xa9ncoded').strip()\n        helper.auth_tkt.user_data = 'userid_type:b64unicode'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], text_(b'\\xc3\\xa9ncoded', 'utf-8'))\n        self.assertEqual(result['userdata'], 'userid_type:b64unicode')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'], 'userid_type:b64unicode')\n        self.assertEqual(environ['AUTH_TYPE'], 'cookie')\n\n    def test_identify_bad_cookie(self):\n        helper = self._makeOne('secret', include_ip=True)\n        helper.auth_tkt.parse_raise = True\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(result, None)\n\n    def test_identify_cookie_timeout(self):\n        helper = self._makeOne('secret', timeout=1)\n        self.assertEqual(helper.timeout, 1)\n\n    def test_identify_cookie_str_timeout(self):\n        helper = self._makeOne('secret', timeout='1')\n        self.assertEqual(helper.timeout, 1)\n\n    def test_identify_cookie_timeout_aged(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10)\n        now = time.time()\n        helper.auth_tkt.timestamp = now - 1\n        helper.now = now + 10\n        helper.auth_tkt.tokens = (text_('a'),)\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertFalse(result)\n\n    def test_identify_cookie_reissue(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        helper.auth_tkt.tokens = (text_('a'),)\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n\n    def test_identify_cookie_str_reissue(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time='0')\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        helper.auth_tkt.tokens = (text_('a'),)\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n\n    def test_identify_cookie_reissue_already_reissued_this_request(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        request._authtkt_reissued = True\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_notyet(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=10)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_revoked_by_forget(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.forget(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_revoked_by_remember(self):\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.remember(request, 'bob')\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_with_tokens_default(self):\n        # see https://github.com/Pylons/pyramid/issues#issue/108\n        import time\n\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        auth_tkt = DummyAuthTktModule(tokens=[''])\n        helper.auth_tkt = auth_tkt\n        helper.AuthTicket = auth_tkt.AuthTicket\n        helper.parse_ticket = auth_tkt.parse_ticket\n        helper.BadTicket = auth_tkt.BadTicket\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](None, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=/\" in response.headerlist[0][1])\n\n    def test_remember(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/; SameSite=Lax'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\n            result[1][1].endswith('; Domain=localhost; Path=/; SameSite=Lax')\n        )\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\n            result[2][1].endswith('; Domain=.localhost; Path=/; SameSite=Lax')\n        )\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_nondefault_samesite(self):\n        helper = self._makeOne('secret', samesite='Strict')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/; SameSite=Strict'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\n            result[1][1].endswith(\n                '; Domain=localhost; Path=/; SameSite=Strict'\n            )\n        )\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\n            result[2][1].endswith(\n                '; Domain=.localhost; Path=/; SameSite=Strict'\n            )\n        )\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_None_samesite(self):\n        helper = self._makeOne('secret', samesite=None)\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))  # no samesite\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_include_ip(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/; SameSite=Lax'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\n            result[1][1].endswith('; Domain=localhost; Path=/; SameSite=Lax')\n        )\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\n            result[2][1].endswith('; Domain=.localhost; Path=/; SameSite=Lax')\n        )\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_path(self):\n        helper = self._makeOne(\n            'secret', include_ip=True, path=\"/cgi-bin/app.cgi/\"\n        )\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\n            result[0][1].endswith('; Path=/cgi-bin/app.cgi/; SameSite=Lax')\n        )\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\n            result[1][1].endswith(\n                '; Domain=localhost; Path=/cgi-bin/app.cgi/; SameSite=Lax'\n            )\n        )\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\n            result[2][1].endswith(\n                '; Domain=.localhost; Path=/cgi-bin/app.cgi/; SameSite=Lax'\n            )\n        )\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_http_only(self):\n        helper = self._makeOne('secret', include_ip=True, http_only=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; HttpOnly; SameSite=Lax'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_secure(self):\n        helper = self._makeOne('secret', include_ip=True, secure=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[0][1])\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_wild_domain_disabled(self):\n        helper = self._makeOne('secret', wild_domain=False)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/; SameSite=Lax'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain(self):\n        helper = self._makeOne('secret', parent_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\n            result[0][1].endswith(\n                '; Domain=.example.com; Path=/; SameSite=Lax'\n            )\n        )\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain_supercedes_wild_domain(self):\n        helper = self._makeOne('secret', parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(\n            result[0][1].endswith(\n                '; Domain=.example.com; Path=/; SameSite=Lax'\n            )\n        )\n\n    def test_remember_explicit_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga')\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\n            result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/; SameSite=Lax'\n            )\n        )\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_domain_supercedes_parent_and_wild_domain(self):\n        helper = self._makeOne(\n            'secret',\n            domain='pyramid.bazinga',\n            parent_domain=True,\n            wild_domain=True,\n        )\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(\n            result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/; SameSite=Lax'\n            )\n        )\n\n    def test_remember_binary_userid(self):\n        import base64\n\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, b'userid')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(\n            val['userid'], text_(base64.b64encode(b'userid').strip())\n        )\n        self.assertEqual(val['user_data'], 'userid_type:b64str')\n\n    def test_remember_int_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 1)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_unicode_userid(self):\n        import base64\n\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = text_(b'\\xc2\\xa9', 'utf-8')\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(\n            val['userid'], text_(base64.b64encode(userid.encode('utf-8')))\n        )\n        self.assertEqual(val['user_data'], 'userid_type:b64unicode')\n\n    def test_remember_insane_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = object()\n        with warnings.catch_warnings(record=True) as w:\n            warnings.simplefilter('always', RuntimeWarning)\n            result = helper.remember(request, userid)\n            self.assertTrue(str(w[-1].message).startswith('userid is of type'))\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        value = values[0]\n        self.assertTrue('userid' in value.value)\n\n    def test_remember_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age=500)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age='500')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age_invalid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(\n            ValueError,\n            helper.remember,\n            request,\n            'userid',\n            max_age='invalid value',\n        )\n\n    def test_remember_tokens(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'other', tokens=('foo', 'bar'))\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[0][1])\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[1][1])\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[2][1])\n\n    def test_remember_samesite_nondefault(self):\n        helper = self._makeOne('secret', samesite='Strict')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        cookieval = result[0][1]\n        self.assertTrue(\n            'SameSite=Strict' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        cookieval = result[1][1]\n        self.assertTrue(\n            'SameSite=Strict' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        cookieval = result[2][1]\n        self.assertTrue(\n            'SameSite=Strict' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n    def test_remember_samesite_default(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        cookieval = result[0][1]\n        self.assertTrue(\n            'SameSite=Lax' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        cookieval = result[1][1]\n        self.assertTrue(\n            'SameSite=Lax' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        cookieval = result[2][1]\n        self.assertTrue(\n            'SameSite=Lax' in [x.strip() for x in cookieval.split(';')],\n            cookieval,\n        )\n\n    def test_remember_unicode_but_ascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'foo', 'utf-8')\n        result = helper.remember(request, 'other', tokens=(la,))\n        # tokens must be str type on both Python 2 and 3\n        self.assertTrue(\"/tokens=foo/\" in result[0][1])\n\n    def test_remember_nonascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'La Pe\\xc3\\xb1a', 'utf-8')\n        self.assertRaises(\n            ValueError, helper.remember, request, 'other', tokens=(la,)\n        )\n\n    def test_remember_invalid_token_format(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(\n            ValueError, helper.remember, request, 'other', tokens=('foo bar',)\n        )\n        self.assertRaises(\n            ValueError, helper.remember, request, 'other', tokens=('1bar',)\n        )\n\n    def test_forget(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        headers = helper.forget(request)\n        self.assertEqual(len(headers), 3)\n        name, value = headers[0]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT; SameSite=Lax',\n        )\n        name, value = headers[1]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT; SameSite=Lax',\n        )\n        name, value = headers[2]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=.localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT; SameSite=Lax',\n        )\n\n\nclass TestAuthTicket(unittest.TestCase):\n    def _makeOne(self, *arg, **kw):\n        from pyramid.authentication import AuthTicket\n\n        return AuthTicket(*arg, **kw)\n\n    def test_ctor_with_tokens(self):\n        ticket = self._makeOne('secret', 'userid', 'ip', tokens=('a', 'b'))\n        self.assertEqual(ticket.tokens, 'a,b')\n\n    def test_ctor_with_time(self):\n        ticket = self._makeOne('secret', 'userid', 'ip', time='time')\n        self.assertEqual(ticket.time, 'time')\n\n    def test_digest(self):\n        ticket = self._makeOne('secret', 'userid', '0.0.0.0', time=10)\n        result = ticket.digest()\n        self.assertEqual(result, '126fd6224912187ee9ffa80e0b81420c')\n\n    def test_digest_sha512(self):\n        ticket = self._makeOne(\n            'secret', 'userid', '0.0.0.0', time=10, hashalg='sha512'\n        )\n        result = ticket.digest()\n        self.assertEqual(\n            result,\n            '74770b2e0d5b1a54c2a466ec567a40f7d7823576aa49'\n            '3c65fc3445e9b44097f4a80410319ef8cb256a2e60b9'\n            'c2002e48a9e33a3e8ee4379352c04ef96d2cb278',\n        )\n\n    def test_cookie_value(self):\n        ticket = self._makeOne(\n            'secret', 'userid', '0.0.0.0', time=10, tokens=('a', 'b')\n        )\n        result = ticket.cookie_value()\n        self.assertEqual(\n            result, '66f9cc3e423dc57c91df696cf3d1f0d80000000auserid!a,b!'\n        )\n\n    def test_ipv4(self):\n        ticket = self._makeOne(\n            'secret', 'userid', '198.51.100.1', time=10, hashalg='sha256'\n        )\n        result = ticket.cookie_value()\n        self.assertEqual(\n            result,\n            'b3e7156db4f8abde4439c4a6499a0668f9e7ffd7fa27b'\n            '798400ecdade8d76c530000000auserid!',\n        )\n\n    def test_ipv6(self):\n        ticket = self._makeOne(\n            'secret', 'userid', '2001:db8::1', time=10, hashalg='sha256'\n        )\n        result = ticket.cookie_value()\n        self.assertEqual(\n            result,\n            'd025b601a0f12ca6d008aa35ff3a22b7d8f3d1c1456c8'\n            '5becf8760cd7a2fa4910000000auserid!',\n        )\n\n\nclass TestBadTicket(unittest.TestCase):\n    def _makeOne(self, msg, expected=None):\n        from pyramid.authentication import BadTicket\n\n        return BadTicket(msg, expected)\n\n    def test_it(self):\n        exc = self._makeOne('msg', expected=True)\n        self.assertEqual(exc.expected, True)\n        self.assertTrue(isinstance(exc, Exception))\n\n\nclass Test_parse_ticket(unittest.TestCase):\n    def _callFUT(self, secret, ticket, ip, hashalg='md5'):\n        from pyramid.authentication import parse_ticket\n\n        return parse_ticket(secret, ticket, ip, hashalg)\n\n    def _assertRaisesBadTicket(self, secret, ticket, ip, hashalg='md5'):\n        from pyramid.authentication import BadTicket\n\n        self.assertRaises(\n            BadTicket, self._callFUT, secret, ticket, ip, hashalg\n        )\n\n    def test_bad_timestamp(self):\n        ticket = 'x' * 64\n        self._assertRaisesBadTicket('secret', ticket, 'ip')\n\n    def test_bad_userid_or_data(self):\n        ticket = 'x' * 32 + '11111111' + 'x' * 10\n        self._assertRaisesBadTicket('secret', ticket, 'ip')\n\n    def test_digest_sig_incorrect(self):\n        ticket = 'x' * 32 + '11111111' + 'a!b!c'\n        self._assertRaisesBadTicket('secret', ticket, '0.0.0.0')\n\n    def test_correct_with_user_data(self):\n        ticket = text_('66f9cc3e423dc57c91df696cf3d1f0d80000000auserid!a,b!')\n        result = self._callFUT('secret', ticket, '0.0.0.0')\n        self.assertEqual(result, (10, 'userid', ['a', 'b'], ''))\n\n    def test_correct_with_user_data_sha512(self):\n        ticket = text_(\n            '7d947cdef99bad55f8e3382a8bd089bb9dd0547f7925b7d189adc1'\n            '160cab0ec0e6888faa41eba641a18522b26f19109f3ffafb769767'\n            'ba8a26d02aaeae56599a0000000auserid!a,b!'\n        )\n        result = self._callFUT('secret', ticket, '0.0.0.0', 'sha512')\n        self.assertEqual(result, (10, 'userid', ['a', 'b'], ''))\n\n    def test_ipv4(self):\n        ticket = text_(\n            'b3e7156db4f8abde4439c4a6499a0668f9e7ffd7fa27b798400ecd'\n            'ade8d76c530000000auserid!'\n        )\n        result = self._callFUT('secret', ticket, '198.51.100.1', 'sha256')\n        self.assertEqual(result, (10, 'userid', [''], ''))\n\n    def test_ipv6(self):\n        ticket = text_(\n            'd025b601a0f12ca6d008aa35ff3a22b7d8f3d1c1456c85becf8760'\n            'cd7a2fa4910000000auserid!'\n        )\n        result = self._callFUT('secret', ticket, '2001:db8::1', 'sha256')\n        self.assertEqual(result, (10, 'userid', [''], ''))\n\n\nclass TestSessionAuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import SessionAuthenticationPolicy\n\n        return SessionAuthenticationPolicy\n\n    def _makeOne(self, callback=None, prefix=''):\n        return self._getTargetClass()(prefix=prefix, callback=callback)\n\n    def test_class_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyClass\n        from pyramid.interfaces import IAuthenticationPolicy\n\n        verifyClass(IAuthenticationPolicy, self._getTargetClass())\n\n    def test_instance_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyObject\n        from pyramid.interfaces import IAuthenticationPolicy\n\n        verifyObject(IAuthenticationPolicy, self._makeOne())\n\n    def test_unauthenticated_userid_returns_None(self):\n        request = DummyRequest()\n        policy = self._makeOne()\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_unauthenticated_userid(self):\n        request = DummyRequest(session={'userid': 'fred'})\n        policy = self._makeOne()\n        self.assertEqual(policy.unauthenticated_userid(request), 'fred')\n\n    def test_authenticated_userid_no_cookie_identity(self):\n        request = DummyRequest()\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid_callback_returns_None(self):\n        request = DummyRequest(session={'userid': 'fred'})\n\n        def callback(userid, request):\n            return None\n\n        policy = self._makeOne(callback)\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid(self):\n        request = DummyRequest(session={'userid': 'fred'})\n\n        def callback(userid, request):\n            return True\n\n        policy = self._makeOne(callback)\n        self.assertEqual(policy.authenticated_userid(request), 'fred')\n\n    def test_effective_principals_no_identity(self):\n        from pyramid.authorization import Everyone\n\n        request = DummyRequest()\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals_callback_returns_None(self):\n        from pyramid.authorization import Everyone\n\n        request = DummyRequest(session={'userid': 'fred'})\n\n        def callback(userid, request):\n            return None\n\n        policy = self._makeOne(callback)\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals(self):\n        from pyramid.authorization import Everyone\n        from pyramid.authorization import Authenticated\n\n        request = DummyRequest(session={'userid': 'fred'})\n\n        def callback(userid, request):\n            return ['group.foo']\n\n        policy = self._makeOne(callback)\n        self.assertEqual(\n            policy.effective_principals(request),\n            [Everyone, Authenticated, 'fred', 'group.foo'],\n        )\n\n    def test_remember(self):\n        request = DummyRequest()\n        policy = self._makeOne()\n        result = policy.remember(request, 'fred')\n        self.assertEqual(request.session.get('userid'), 'fred')\n        self.assertEqual(result, [])\n\n    def test_forget(self):\n        request = DummyRequest(session={'userid': 'fred'})\n        policy = self._makeOne()\n        result = policy.forget(request)\n        self.assertEqual(request.session.get('userid'), None)\n        self.assertEqual(result, [])\n\n    def test_forget_no_identity(self):\n        request = DummyRequest()\n        policy = self._makeOne()\n        result = policy.forget(request)\n        self.assertEqual(request.session.get('userid'), None)\n        self.assertEqual(result, [])\n\n\nclass TestSessionAuthenticationHelper(unittest.TestCase):\n    def _makeRequest(self, session=None):\n        from types import SimpleNamespace\n\n        if session is None:\n            session = dict()\n        return SimpleNamespace(session=session)\n\n    def _makeOne(self, prefix=''):\n        from pyramid.authentication import SessionAuthenticationHelper\n\n        return SessionAuthenticationHelper(prefix=prefix)\n\n    def test_authenticated_userid(self):\n        request = self._makeRequest({'userid': 'fred'})\n        helper = self._makeOne()\n        self.assertEqual(helper.authenticated_userid(request), 'fred')\n\n    def test_authenticated_userid_with_prefix(self):\n        request = self._makeRequest({'foo.userid': 'fred'})\n        helper = self._makeOne(prefix='foo.')\n        self.assertEqual(helper.authenticated_userid(request), 'fred')\n\n    def test_authenticated_userid_none(self):\n        request = self._makeRequest()\n        helper = self._makeOne()\n        self.assertEqual(helper.authenticated_userid(request), None)\n\n    def test_remember(self):\n        request = self._makeRequest()\n        helper = self._makeOne()\n        result = helper.remember(request, 'fred')\n        self.assertEqual(request.session.get('userid'), 'fred')\n        self.assertEqual(result, [])\n\n    def test_forget(self):\n        request = self._makeRequest({'userid': 'fred'})\n        helper = self._makeOne()\n        result = helper.forget(request)\n        self.assertEqual(request.session.get('userid'), None)\n        self.assertEqual(result, [])\n\n    def test_forget_no_identity(self):\n        request = self._makeRequest()\n        helper = self._makeOne()\n        result = helper.forget(request)\n        self.assertEqual(request.session.get('userid'), None)\n        self.assertEqual(result, [])\n\n\nclass TestBasicAuthAuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import BasicAuthAuthenticationPolicy as cls\n\n        return cls\n\n    def _makeOne(self, check):\n        return self._getTargetClass()(check, realm='SomeRealm')\n\n    def test_class_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyClass\n        from pyramid.interfaces import IAuthenticationPolicy\n\n        verifyClass(IAuthenticationPolicy, self._getTargetClass())\n\n    def test_unauthenticated_userid(self):\n        import base64\n\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Basic %s' % base64.b64encode(\n            bytes_('chrisr:password')\n        ).decode('ascii')\n        policy = self._makeOne(None)\n        self.assertEqual(policy.unauthenticated_userid(request), 'chrisr')\n\n    def test_unauthenticated_userid_no_credentials(self):\n        request = testing.DummyRequest()\n        policy = self._makeOne(None)\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_unauthenticated_bad_header(self):\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = '...'\n        policy = self._makeOne(None)\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_unauthenticated_userid_not_basic(self):\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Complicated things'\n        policy = self._makeOne(None)\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_unauthenticated_userid_corrupt_base64(self):\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Basic chrisr:password'\n        policy = self._makeOne(None)\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_authenticated_userid(self):\n        import base64\n\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Basic %s' % base64.b64encode(\n            bytes_('chrisr:password')\n        ).decode('ascii')\n\n        def check(username, password, request):\n            return []\n\n        policy = self._makeOne(check)\n        self.assertEqual(policy.authenticated_userid(request), 'chrisr')\n\n    def test_authenticated_userid_utf8(self):\n        import base64\n\n        request = testing.DummyRequest()\n        inputs = (\n            b'm\\xc3\\xb6rk\\xc3\\xb6:' b'm\\xc3\\xb6rk\\xc3\\xb6password'\n        ).decode('utf-8')\n        request.headers['Authorization'] = 'Basic %s' % (\n            base64.b64encode(inputs.encode('utf-8')).decode('latin-1')\n        )\n\n        def check(username, password, request):\n            return []\n\n        policy = self._makeOne(check)\n        self.assertEqual(\n            policy.authenticated_userid(request),\n            b'm\\xc3\\xb6rk\\xc3\\xb6'.decode('utf-8'),\n        )\n\n    def test_authenticated_userid_latin1(self):\n        import base64\n\n        request = testing.DummyRequest()\n        inputs = (\n            b'm\\xc3\\xb6rk\\xc3\\xb6:' b'm\\xc3\\xb6rk\\xc3\\xb6password'\n        ).decode('utf-8')\n        request.headers['Authorization'] = 'Basic %s' % (\n            base64.b64encode(inputs.encode('latin-1')).decode('latin-1')\n        )\n\n        def check(username, password, request):\n            return []\n\n        policy = self._makeOne(check)\n        self.assertEqual(\n            policy.authenticated_userid(request),\n            b'm\\xc3\\xb6rk\\xc3\\xb6'.decode('utf-8'),\n        )\n\n    def test_unauthenticated_userid_invalid_payload(self):\n        import base64\n\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Basic %s' % base64.b64encode(\n            bytes_('chrisrpassword')\n        ).decode('ascii')\n        policy = self._makeOne(None)\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_remember(self):\n        policy = self._makeOne(None)\n        self.assertEqual(policy.remember(None, None), [])\n\n    def test_forget(self):\n        policy = self._makeOne(None)\n        self.assertEqual(\n            policy.forget(None),\n            [('WWW-Authenticate', 'Basic realm=\"SomeRealm\"')],\n        )\n\n\nclass TestExtractHTTPBasicCredentials(unittest.TestCase):\n    def _get_func(self):\n        from pyramid.authentication import extract_http_basic_credentials\n\n        return extract_http_basic_credentials\n\n    def test_no_auth_header(self):\n        request = testing.DummyRequest()\n        fn = self._get_func()\n\n        self.assertIsNone(fn(request))\n\n    def test_invalid_payload(self):\n        import base64\n\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Basic %s' % base64.b64encode(\n            bytes_('chrisrpassword')\n        ).decode('ascii')\n        fn = self._get_func()\n        self.assertIsNone(fn(request))\n\n    def test_not_a_basic_auth_scheme(self):\n        import base64\n\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'OtherScheme %s' % base64.b64encode(\n            bytes_('chrisr:password')\n        ).decode('ascii')\n        fn = self._get_func()\n        self.assertIsNone(fn(request))\n\n    def test_no_base64_encoding(self):\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Basic ...'\n        fn = self._get_func()\n        self.assertIsNone(fn(request))\n\n    def test_latin1_payload(self):\n        import base64\n\n        request = testing.DummyRequest()\n        inputs = (\n            b'm\\xc3\\xb6rk\\xc3\\xb6:' b'm\\xc3\\xb6rk\\xc3\\xb6password'\n        ).decode('utf-8')\n        request.headers['Authorization'] = 'Basic %s' % (\n            base64.b64encode(inputs.encode('latin-1')).decode('latin-1')\n        )\n        fn = self._get_func()\n        self.assertEqual(\n            fn(request),\n            (\n                b'm\\xc3\\xb6rk\\xc3\\xb6'.decode('utf-8'),\n                b'm\\xc3\\xb6rk\\xc3\\xb6password'.decode('utf-8'),\n            ),\n        )\n\n    def test_utf8_payload(self):\n        import base64\n\n        request = testing.DummyRequest()\n        inputs = (\n            b'm\\xc3\\xb6rk\\xc3\\xb6:' b'm\\xc3\\xb6rk\\xc3\\xb6password'\n        ).decode('utf-8')\n        request.headers['Authorization'] = 'Basic %s' % (\n            base64.b64encode(inputs.encode('utf-8')).decode('latin-1')\n        )\n        fn = self._get_func()\n        self.assertEqual(\n            fn(request),\n            (\n                b'm\\xc3\\xb6rk\\xc3\\xb6'.decode('utf-8'),\n                b'm\\xc3\\xb6rk\\xc3\\xb6password'.decode('utf-8'),\n            ),\n        )\n\n    def test_namedtuple_return(self):\n        import base64\n\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Basic %s' % base64.b64encode(\n            bytes_('chrisr:pass')\n        ).decode('ascii')\n        fn = self._get_func()\n        result = fn(request)\n\n        self.assertEqual(result.username, 'chrisr')\n        self.assertEqual(result.password, 'pass')\n\n\nclass DummyContext:\n    pass\n\n\nclass DummyCookies:\n    def __init__(self, cookie):\n        self.cookie = cookie\n\n    def get(self, name):\n        return self.cookie\n\n\nclass DummyRequest:\n    domain = 'localhost'\n\n    def __init__(self, environ=None, session=None, registry=None, cookie=None):\n        self.environ = environ or {}\n        self.session = session or {}\n        self.registry = registry\n        self.callbacks = []\n        self.cookies = DummyCookies(cookie)\n\n    def add_response_callback(self, callback):\n        self.callbacks.append(callback)\n\n\nclass DummyWhoPlugin:\n    def remember(self, environ, identity):\n        return environ, identity\n\n    def forget(self, environ, identity):\n        return environ, identity\n\n\nclass DummyCookieHelper:\n    def __init__(self, result):\n        self.result = result\n\n    def identify(self, *arg, **kw):\n        return self.result\n\n    def remember(self, *arg, **kw):\n        self.kw = kw\n        return []\n\n    def forget(self, *arg):\n        return []\n\n\nclass DummyAuthTktModule:\n    def __init__(\n        self,\n        timestamp=0,\n        userid='userid',\n        tokens=(),\n        user_data='',\n        parse_raise=False,\n        hashalg=\"md5\",\n    ):\n        self.timestamp = timestamp\n        self.userid = userid\n        self.tokens = tokens\n        self.user_data = user_data\n        self.parse_raise = parse_raise\n        self.hashalg = hashalg\n\n        def parse_ticket(secret, value, remote_addr, hashalg):\n            self.secret = secret\n            self.value = value\n            self.remote_addr = remote_addr\n            if self.parse_raise:\n                raise self.BadTicket()\n            return self.timestamp, self.userid, self.tokens, self.user_data\n\n        self.parse_ticket = parse_ticket\n\n        class AuthTicket:\n            def __init__(self, secret, userid, remote_addr, **kw):\n                self.secret = secret\n                self.userid = userid\n                self.remote_addr = remote_addr\n                self.kw = kw\n\n            def cookie_value(self):\n                result = {\n                    'secret': self.secret,\n                    'userid': self.userid,\n                    'remote_addr': self.remote_addr,\n                }\n                result.update(self.kw)\n                tokens = result.pop('tokens', None)\n                if tokens is not None:\n                    tokens = '|'.join(tokens)\n                    result['tokens'] = tokens\n                items = sorted(result.items())\n                new_items = []\n                for k, v in items:\n                    if isinstance(v, bytes):\n                        v = text_(v)\n                    new_items.append((k, v))\n                result = '/'.join(['%s=%s' % (k, v) for k, v in new_items])\n                return result\n\n        self.AuthTicket = AuthTicket\n\n    class BadTicket(Exception):\n        pass\n\n\nclass DummyResponse:\n    def __init__(self):\n        self.headerlist = []\n"
    ],
    "test_file_names": [
        "test_1.py"
    ],
    "setup_res_code": 0,
    "setup_res_stdout": "",
    "setup_res_stderr": "Using CPython 3.8.20\nCreating virtual environment at: .venv\nActivate with: source .venv/bin/activate\nResolved 11 packages in 838ms\nPrepared 1 package in 1.03s\nInstalled 11 packages in 23ms\n + hupper==1.12.1\n + pastedeploy==3.1.0\n + plaster==1.1.2\n + plaster-pastedeploy==1.0.1\n + pyramid==2.0.dev0 (from file:///home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8)\n + setuptools==75.3.0\n + translationstring==1.4\n + venusian==3.1.1\n + webob==1.8.9\n + zope-deprecation==5.0\n + zope-interface==7.2\nResolved 26 packages in 20ms\nInstalled 15 packages in 9ms\n + beautifulsoup4==4.12.3\n + coverage==7.6.1\n + exceptiongroup==1.2.2\n + iniconfig==2.0.0\n + packaging==24.2\n + pluggy==1.5.0\n + pytest==8.3.4\n + pytest-cov==5.0.0\n + soupsieve==2.6\n + tomli==2.2.1\n + waitress==3.0.0\n + webtest==3.0.1\n + zope-component==6.0\n + zope-event==5.0\n + zope-hookable==7.0\nResolved 16 packages in 5ms\nInstalled 10 packages in 9ms\n + cachetools==5.5.0\n + chardet==5.2.0\n + colorama==0.4.6\n + distlib==0.3.9\n + filelock==3.16.1\n + platformdirs==4.3.6\n + pyproject-api==1.8.0\n + tox==4.23.2\n + typing-extensions==4.12.2\n + virtualenv==20.29.0\n",
    "new_commit_res_code": 1,
    "new_commit_res_stdout": "============================= test session starts ==============================\nplatform linux -- Python 3.8.20, pytest-8.3.4, pluggy-1.5.0\nrootdir: /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8\nconfigfile: setup.cfg\nplugins: cov-5.0.0\ncollected 979 items\n\nr2e_tests/test_1.py FFFFFFFFFFFF........................................ [  5%]\n........................................................................ [ 12%]\n.......................................                                  [ 16%]\nr2e_tests/test_config/test_actions.py .................................. [ 20%]\n............                                                             [ 21%]\nr2e_tests/test_config/test_adapters.py .FF..............F...             [ 23%]\nr2e_tests/test_config/test_assets.py ....F.F...F...FF.FF................ [ 27%]\n.....................................F.F................................ [ 34%]\n                                                                         [ 34%]\nr2e_tests/test_config/test_factories.py ..........F.F..F.F               [ 36%]\nr2e_tests/test_config/test_i18n.py FFFF..FF.FFF.F                        [ 37%]\nr2e_tests/test_config/test_init.py .............................F..F.... [ 41%]\n....F......F...................F................F..F.FF...FFF...         [ 48%]\nr2e_tests/test_config/test_predicates.py ............................... [ 51%]\n....                                                                     [ 51%]\nr2e_tests/test_config/test_rendering.py ...                              [ 51%]\nr2e_tests/test_config/test_routes.py .............F................      [ 54%]\nr2e_tests/test_config/test_security.py ..............                    [ 56%]\nr2e_tests/test_config/test_settings.py ........................          [ 58%]\nr2e_tests/test_config/test_testing.py ....F.......                       [ 60%]\nr2e_tests/test_config/test_tweens.py F.........F..F...................   [ 63%]\nr2e_tests/test_config/test_views.py ..........F.........F............F.. [ 67%]\nF.........F....................F....................F................... [ 74%]\n..........................FF.....FFF.................................... [ 81%]\n.............................................................F.......F.  [ 89%]\nr2e_tests/test_scripts/test_common.py ..                                 [ 89%]\nr2e_tests/test_scripts/test_pdistreport.py ..                            [ 89%]\nr2e_tests/test_scripts/test_prequest.py ...................              [ 91%]\nr2e_tests/test_scripts/test_proutes.py ...F.......FFFF.F.FF.F..F..FF.    [ 94%]\nr2e_tests/test_scripts/test_pserve.py .F.......                          [ 95%]\nr2e_tests/test_scripts/test_pshell.py .................                  [ 97%]\nr2e_tests/test_scripts/test_ptweens.py .....                             [ 97%]\nr2e_tests/test_scripts/test_pviews.py ..........FFFF..FFFFFF.            [100%]\n\n=================================== FAILURES ===================================\n_ TestCallbackAuthenticationPolicyDebugging.test_authenticated_userid_fails_cleaning_as_Authenticated _\n\nself = <r2e_tests.test_1.TestCallbackAuthenticationPolicyDebugging testMethod=test_authenticated_userid_fails_cleaning_as_Authenticated>\n\n    def test_authenticated_userid_fails_cleaning_as_Authenticated(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne(userid='system.Authenticated')\n        self.assertEqual(policy.authenticated_userid(request), None)\n        self.assertEqual(len(self.messages), 1)\n>       self.assertEqual(\n            self.messages[0],\n            \"tests.test_authentication.MyAuthenticationPolicy.\"\n            \"authenticated_userid: use of userid 'system.Authenticated' is \"\n            \"disallowed by any built-in Pyramid security policy, returning \"\n            \"None\",\n        )\nE       AssertionError: \"r2e_tests.test_1.MyAuthenticationPolicy.a[123 chars]None\" != \"tests.test_authentication.MyAuthenticatio[132 chars]None\"\nE       - r2e_tests.test_1.MyAuthenticationPolicy.authenticated_userid: use of userid 'system.Authenticated' is disallowed by any built-in Pyramid security policy, returning None\nE       ? ----           ^\nE       + tests.test_authentication.MyAuthenticationPolicy.authenticated_userid: use of userid 'system.Authenticated' is disallowed by any built-in Pyramid security policy, returning None\nE       ?            ^^^^^^^^^^^^^^\n\nr2e_tests/test_1.py:96: AssertionError\n_ TestCallbackAuthenticationPolicyDebugging.test_authenticated_userid_fails_cleaning_as_Everyone _\n\nself = <r2e_tests.test_1.TestCallbackAuthenticationPolicyDebugging testMethod=test_authenticated_userid_fails_cleaning_as_Everyone>\n\n    def test_authenticated_userid_fails_cleaning_as_Everyone(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne(userid='system.Everyone')\n        self.assertEqual(policy.authenticated_userid(request), None)\n        self.assertEqual(len(self.messages), 1)\n>       self.assertEqual(\n            self.messages[0],\n            \"tests.test_authentication.MyAuthenticationPolicy.\"\n            \"authenticated_userid: use of userid 'system.Everyone' is \"\n            \"disallowed by any built-in Pyramid security policy, returning \"\n            \"None\",\n        )\nE       AssertionError: \"r2e_tests.test_1.MyAuthenticationPolicy.a[118 chars]None\" != \"tests.test_authentication.MyAuthenticatio[127 chars]None\"\nE       - r2e_tests.test_1.MyAuthenticationPolicy.authenticated_userid: use of userid 'system.Everyone' is disallowed by any built-in Pyramid security policy, returning None\nE       ? ----           ^\nE       + tests.test_authentication.MyAuthenticationPolicy.authenticated_userid: use of userid 'system.Everyone' is disallowed by any built-in Pyramid security policy, returning None\nE       ?            ^^^^^^^^^^^^^^\n\nr2e_tests/test_1.py:109: AssertionError\n_ TestCallbackAuthenticationPolicyDebugging.test_authenticated_userid_no_callback _\n\nself = <r2e_tests.test_1.TestCallbackAuthenticationPolicyDebugging testMethod=test_authenticated_userid_no_callback>\n\n    def test_authenticated_userid_no_callback(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne(userid='fred')\n        self.assertEqual(policy.authenticated_userid(request), 'fred')\n        self.assertEqual(len(self.messages), 1)\n>       self.assertEqual(\n            self.messages[0],\n            \"tests.test_authentication.MyAuthenticationPolicy.\"\n            \"authenticated_userid: there was no groupfinder callback; \"\n            \"returning 'fred'\",\n        )\nE       AssertionError: \"r2e_tests.test_1.MyAuthenticationPolicy.a[68 chars]red'\" != \"tests.test_authentication.MyAuthenticatio[77 chars]red'\"\nE       - r2e_tests.test_1.MyAuthenticationPolicy.authenticated_userid: there was no groupfinder callback; returning 'fred'\nE       ? ----           ^\nE       + tests.test_authentication.MyAuthenticationPolicy.authenticated_userid: there was no groupfinder callback; returning 'fred'\nE       ?            ^^^^^^^^^^^^^^\n\nr2e_tests/test_1.py:52: AssertionError\n_ TestCallbackAuthenticationPolicyDebugging.test_authenticated_userid_no_unauthenticated_userid _\n\nself = <r2e_tests.test_1.TestCallbackAuthenticationPolicyDebugging testMethod=test_authenticated_userid_no_unauthenticated_userid>\n\n    def test_authenticated_userid_no_unauthenticated_userid(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), None)\n        self.assertEqual(len(self.messages), 1)\n>       self.assertEqual(\n            self.messages[0],\n            'tests.test_authentication.MyAuthenticationPolicy.'\n            'authenticated_userid: call to unauthenticated_userid returned '\n            'None; returning None',\n        )\nE       AssertionError: 'r2e_tests.test_1.MyAuthenticationPolicy.a[77 chars]None' != 'tests.test_authentication.MyAuthenticatio[86 chars]None'\nE       - r2e_tests.test_1.MyAuthenticationPolicy.authenticated_userid: call to unauthenticated_userid returned None; returning None\nE       ? ----           ^\nE       + tests.test_authentication.MyAuthenticationPolicy.authenticated_userid: call to unauthenticated_userid returned None; returning None\nE       ?            ^^^^^^^^^^^^^^\n\nr2e_tests/test_1.py:40: AssertionError\n_ TestCallbackAuthenticationPolicyDebugging.test_authenticated_userid_with_callback_fail _\n\nself = <r2e_tests.test_1.TestCallbackAuthenticationPolicyDebugging testMethod=test_authenticated_userid_with_callback_fail>\n\n    def test_authenticated_userid_with_callback_fail(self):\n        request = DummyRequest(registry=self.config.registry)\n    \n        def callback(userid, request):\n            return None\n    \n        policy = self._makeOne(userid='fred', callback=callback)\n        self.assertEqual(policy.authenticated_userid(request), None)\n        self.assertEqual(len(self.messages), 1)\n>       self.assertEqual(\n            self.messages[0],\n            'tests.test_authentication.MyAuthenticationPolicy.'\n            'authenticated_userid: groupfinder callback returned None; '\n            'returning None',\n        )\nE       AssertionError: 'r2e_tests.test_1.MyAuthenticationPolicy.a[67 chars]None' != 'tests.test_authentication.MyAuthenticatio[76 chars]None'\nE       - r2e_tests.test_1.MyAuthenticationPolicy.authenticated_userid: groupfinder callback returned None; returning None\nE       ? ----           ^\nE       + tests.test_authentication.MyAuthenticationPolicy.authenticated_userid: groupfinder callback returned None; returning None\nE       ?            ^^^^^^^^^^^^^^\n\nr2e_tests/test_1.py:68: AssertionError\n_ TestCallbackAuthenticationPolicyDebugging.test_authenticated_userid_with_callback_success _\n\nself = <r2e_tests.test_1.TestCallbackAuthenticationPolicyDebugging testMethod=test_authenticated_userid_with_callback_success>\n\n    def test_authenticated_userid_with_callback_success(self):\n        request = DummyRequest(registry=self.config.registry)\n    \n        def callback(userid, request):\n            return []\n    \n        policy = self._makeOne(userid='fred', callback=callback)\n        self.assertEqual(policy.authenticated_userid(request), 'fred')\n        self.assertEqual(len(self.messages), 1)\n>       self.assertEqual(\n            self.messages[0],\n            \"tests.test_authentication.MyAuthenticationPolicy.\"\n            \"authenticated_userid: groupfinder callback returned []; \"\n            \"returning 'fred'\",\n        )\nE       AssertionError: \"r2e_tests.test_1.MyAuthenticationPolicy.a[67 chars]red'\" != \"tests.test_authentication.MyAuthenticatio[76 chars]red'\"\nE       - r2e_tests.test_1.MyAuthenticationPolicy.authenticated_userid: groupfinder callback returned []; returning 'fred'\nE       ? ----           ^\nE       + tests.test_authentication.MyAuthenticationPolicy.authenticated_userid: groupfinder callback returned []; returning 'fred'\nE       ?            ^^^^^^^^^^^^^^\n\nr2e_tests/test_1.py:84: AssertionError\n_ TestCallbackAuthenticationPolicyDebugging.test_effective_principals_no_callback _\n\nself = <r2e_tests.test_1.TestCallbackAuthenticationPolicyDebugging testMethod=test_effective_principals_no_callback>\n\n    def test_effective_principals_no_callback(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne(userid='fred')\n        self.assertEqual(\n            policy.effective_principals(request),\n            ['system.Everyone', 'system.Authenticated', 'fred'],\n        )\n        self.assertEqual(len(self.messages), 2)\n>       self.assertEqual(\n            self.messages[0],\n            'tests.test_authentication.MyAuthenticationPolicy.'\n            'effective_principals: groupfinder callback is None, so groups '\n            'is []',\n        )\nE       AssertionError: 'r2e_tests.test_1.MyAuthenticationPolicy.e[62 chars]s []' != 'tests.test_authentication.MyAuthenticatio[71 chars]s []'\nE       - r2e_tests.test_1.MyAuthenticationPolicy.effective_principals: groupfinder callback is None, so groups is []\nE       ? ----           ^\nE       + tests.test_authentication.MyAuthenticationPolicy.effective_principals: groupfinder callback is None, so groups is []\nE       ?            ^^^^^^^^^^^^^^\n\nr2e_tests/test_1.py:139: AssertionError\n_ TestCallbackAuthenticationPolicyDebugging.test_effective_principals_no_unauthenticated_userid _\n\nself = <r2e_tests.test_1.TestCallbackAuthenticationPolicyDebugging testMethod=test_effective_principals_no_unauthenticated_userid>\n\n    def test_effective_principals_no_unauthenticated_userid(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne()\n        self.assertEqual(\n            policy.effective_principals(request), ['system.Everyone']\n        )\n        self.assertEqual(len(self.messages), 1)\n>       self.assertEqual(\n            self.messages[0],\n            \"tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: unauthenticated_userid returned None; \"\n            \"returning ['system.Everyone']\",\n        )\nE       AssertionError: \"r2e_tests.test_1.MyAuthenticationPolicy.e[84 chars]ne']\" != \"tests.test_authentication.MyAuthenticatio[93 chars]ne']\"\nE       - r2e_tests.test_1.MyAuthenticationPolicy.effective_principals: unauthenticated_userid returned None; returning ['system.Everyone']\nE       ? ----           ^\nE       + tests.test_authentication.MyAuthenticationPolicy.effective_principals: unauthenticated_userid returned None; returning ['system.Everyone']\nE       ?            ^^^^^^^^^^^^^^\n\nr2e_tests/test_1.py:124: AssertionError\n_ TestCallbackAuthenticationPolicyDebugging.test_effective_principals_with_callback_fail _\n\nself = <r2e_tests.test_1.TestCallbackAuthenticationPolicyDebugging testMethod=test_effective_principals_with_callback_fail>\n\n    def test_effective_principals_with_callback_fail(self):\n        request = DummyRequest(registry=self.config.registry)\n    \n        def callback(userid, request):\n            return None\n    \n        policy = self._makeOne(userid='fred', callback=callback)\n        self.assertEqual(\n            policy.effective_principals(request), ['system.Everyone']\n        )\n        self.assertEqual(len(self.messages), 2)\n>       self.assertEqual(\n            self.messages[0],\n            'tests.test_authentication.MyAuthenticationPolicy.'\n            'effective_principals: groupfinder callback returned None as '\n            'groups',\n        )\nE       AssertionError: 'r2e_tests.test_1.MyAuthenticationPolicy.e[61 chars]oups' != 'tests.test_authentication.MyAuthenticatio[70 chars]oups'\nE       - r2e_tests.test_1.MyAuthenticationPolicy.effective_principals: groupfinder callback returned None as groups\nE       ? ----           ^\nE       + tests.test_authentication.MyAuthenticationPolicy.effective_principals: groupfinder callback returned None as groups\nE       ?            ^^^^^^^^^^^^^^\n\nr2e_tests/test_1.py:163: AssertionError\n_ TestCallbackAuthenticationPolicyDebugging.test_effective_principals_with_callback_success _\n\nself = <r2e_tests.test_1.TestCallbackAuthenticationPolicyDebugging testMethod=test_effective_principals_with_callback_success>\n\n    def test_effective_principals_with_callback_success(self):\n        request = DummyRequest(registry=self.config.registry)\n    \n        def callback(userid, request):\n            return []\n    \n        policy = self._makeOne(userid='fred', callback=callback)\n        self.assertEqual(\n            policy.effective_principals(request),\n            ['system.Everyone', 'system.Authenticated', 'fred'],\n        )\n        self.assertEqual(len(self.messages), 2)\n>       self.assertEqual(\n            self.messages[0],\n            'tests.test_authentication.MyAuthenticationPolicy.'\n            'effective_principals: groupfinder callback returned [] as groups',\n        )\nE       AssertionError: 'r2e_tests.test_1.MyAuthenticationPolicy.e[59 chars]oups' != 'tests.test_authentication.MyAuthenticatio[68 chars]oups'\nE       - r2e_tests.test_1.MyAuthenticationPolicy.effective_principals: groupfinder callback returned [] as groups\nE       ? ----           ^\nE       + tests.test_authentication.MyAuthenticationPolicy.effective_principals: groupfinder callback returned [] as groups\nE       ?            ^^^^^^^^^^^^^^\n\nr2e_tests/test_1.py:188: AssertionError\n_ TestCallbackAuthenticationPolicyDebugging.test_effective_principals_with_unclean_principal_Authenticated _\n\nself = <r2e_tests.test_1.TestCallbackAuthenticationPolicyDebugging testMethod=test_effective_principals_with_unclean_principal_Authenticated>\n\n    def test_effective_principals_with_unclean_principal_Authenticated(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne(userid='system.Authenticated')\n        self.assertEqual(\n            policy.effective_principals(request), ['system.Everyone']\n        )\n        self.assertEqual(len(self.messages), 1)\n>       self.assertEqual(\n            self.messages[0],\n            \"tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: unauthenticated_userid returned disallowed \"\n            \"'system.Authenticated'; returning ['system.Everyone'] as if it \"\n            \"was None\",\n        )\nE       AssertionError: \"r2e_tests.test_1.MyAuthenticationPolicy.e[131 chars]None\" != \"tests.test_authentication.MyAuthenticatio[140 chars]None\"\nE       - r2e_tests.test_1.MyAuthenticationPolicy.effective_principals: unauthenticated_userid returned disallowed 'system.Authenticated'; returning ['system.Everyone'] as if it was None\nE       ? ----           ^\nE       + tests.test_authentication.MyAuthenticationPolicy.effective_principals: unauthenticated_userid returned disallowed 'system.Authenticated'; returning ['system.Everyone'] as if it was None\nE       ?            ^^^^^^^^^^^^^^\n\nr2e_tests/test_1.py:207: AssertionError\n_ TestCallbackAuthenticationPolicyDebugging.test_effective_principals_with_unclean_principal_Everyone _\n\nself = <r2e_tests.test_1.TestCallbackAuthenticationPolicyDebugging testMethod=test_effective_principals_with_unclean_principal_Everyone>\n\n    def test_effective_principals_with_unclean_principal_Everyone(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne(userid='system.Everyone')\n        self.assertEqual(\n            policy.effective_principals(request), ['system.Everyone']\n        )\n        self.assertEqual(len(self.messages), 1)\n>       self.assertEqual(\n            self.messages[0],\n            \"tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: unauthenticated_userid returned disallowed \"\n            \"'system.Everyone'; returning ['system.Everyone'] as if it \"\n            \"was None\",\n        )\nE       AssertionError: \"r2e_tests.test_1.MyAuthenticationPolicy.e[126 chars]None\" != \"tests.test_authentication.MyAuthenticatio[135 chars]None\"\nE       - r2e_tests.test_1.MyAuthenticationPolicy.effective_principals: unauthenticated_userid returned disallowed 'system.Everyone'; returning ['system.Everyone'] as if it was None\nE       ? ----           ^\nE       + tests.test_authentication.MyAuthenticationPolicy.effective_principals: unauthenticated_userid returned disallowed 'system.Everyone'; returning ['system.Everyone'] as if it was None\nE       ?            ^^^^^^^^^^^^^^\n\nr2e_tests/test_1.py:222: AssertionError\n__ AdaptersConfiguratorMixinTests.test_add_resource_url_adapter_dotted_names ___\n\nself = <r2e_tests.test_config.test_adapters.AdaptersConfiguratorMixinTests testMethod=test_add_resource_url_adapter_dotted_names>\n\n    def test_add_resource_url_adapter_dotted_names(self):\n        from pyramid.interfaces import IResourceURL\n    \n        config = self._makeOne(autocommit=True)\n        config.add_resource_url_adapter(\n            'tests.test_config.test_adapters.DummyResourceURL',\n            'tests.test_config.test_adapters.DummyIface',\n        )\n        iface = DummyIface()\n>       adapter = config.registry.getMultiAdapter((iface, iface), IResourceURL)\n\nr2e_tests/test_config/test_adapters.py:332: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <Registry r2e_tests.test_config>\nobjects = (<r2e_tests.test_config.test_adapters.DummyIface object at 0x7871a28f74f0>, <r2e_tests.test_config.test_adapters.DummyIface object at 0x7871a28f74f0>)\ninterface = <InterfaceClass pyramid.interfaces.IResourceURL>, name = ''\n\n    def getMultiAdapter(self, objects, interface, name=''):\n        adapter = self.adapters.queryMultiAdapter(objects, interface, name)\n        if adapter is None:\n>           raise ComponentLookupError(objects, interface, name)\nE           zope.interface.interfaces.ComponentLookupError: ((<r2e_tests.test_config.test_adapters.DummyIface object at 0x7871a28f74f0>, <r2e_tests.test_config.test_adapters.DummyIface object at 0x7871a28f74f0>), <InterfaceClass pyramid.interfaces.IResourceURL>, '')\n\n.venv/lib/python3.8/site-packages/zope/interface/registry.py:379: ComponentLookupError\n_ AdaptersConfiguratorMixinTests.test_add_resource_url_adapter_introspectables _\n\nself = <r2e_tests.test_config.test_adapters.AdaptersConfiguratorMixinTests testMethod=test_add_resource_url_adapter_introspectables>\n\n    def test_add_resource_url_adapter_introspectables(self):\n        config = self._makeOne()\n        config.add_resource_url_adapter(DummyResourceURL, DummyIface)\n        actions = config.action_state.actions\n        self.assertEqual(len(actions), 1)\n        intrs = actions[0]['introspectables']\n        self.assertEqual(len(intrs), 1)\n        intr = intrs[0]\n        self.assertEqual(intr.type_name, 'resource url adapter')\n        self.assertEqual(\n            intr.discriminator, ('resource url adapter', DummyIface)\n        )\n        self.assertEqual(intr.category_name, 'resource url adapters')\n>       self.assertEqual(\n            intr.title,\n            \"resource url adapter for resource iface \"\n            \"<class 'tests.test_config.test_adapters.DummyIface'>\",\n        )\nE       AssertionError: \"reso[30 chars]iface <class 'r2e_tests.test_config.test_adapters.DummyIface'>\" != \"reso[30 chars]iface <class 'tests.test_config.test_adapters.DummyIface'>\"\nE       - resource url adapter for resource iface <class 'r2e_tests.test_config.test_adapters.DummyIface'>\nE       ?                                                 ----\nE       + resource url adapter for resource iface <class 'tests.test_config.test_adapters.DummyIface'>\n\nr2e_tests/test_config/test_adapters.py:377: AssertionError\n________ AdaptersConfiguratorMixinTests.test_add_traverser_dotted_names ________\n\nself = <r2e_tests.test_config.test_adapters.AdaptersConfiguratorMixinTests testMethod=test_add_traverser_dotted_names>\n\n    def test_add_traverser_dotted_names(self):\n        from pyramid.interfaces import ITraverser\n    \n        config = self._makeOne(autocommit=True)\n        config.add_traverser(\n            'tests.test_config.test_adapters.DummyTraverser',\n            'tests.test_config.test_adapters.DummyIface',\n        )\n        iface = DummyIface()\n>       traverser = config.registry.getAdapter(iface, ITraverser)\n\nr2e_tests/test_config/test_adapters.py:286: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <Registry r2e_tests.test_config>\nobject = <r2e_tests.test_config.test_adapters.DummyIface object at 0x7871a1f4cfd0>\ninterface = <InterfaceClass pyramid.interfaces.ITraverser>, name = ''\n\n    def getAdapter(self, object, interface, name=''):\n        adapter = self.adapters.queryAdapter(object, interface, name)\n        if adapter is None:\n>           raise ComponentLookupError(object, interface, name)\nE           zope.interface.interfaces.ComponentLookupError: (<r2e_tests.test_config.test_adapters.DummyIface object at 0x7871a1f4cfd0>, <InterfaceClass pyramid.interfaces.ITraverser>, '')\n\n.venv/lib/python3.8/site-packages/zope/interface/registry.py:368: ComponentLookupError\n___ TestAssetsConfiguratorMixin.test_override_asset_directory_with_directory ___\n\nself = <r2e_tests.test_config.test_assets.TestAssetsConfiguratorMixin testMethod=test_override_asset_directory_with_directory>\n\n    def test_override_asset_directory_with_directory(self):\n        from pyramid.config.assets import PackageAssetSource\n    \n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'tests.test_config.pkgs.asset:templates/',\n            'tests.test_config.pkgs.asset.subpackage:templates/',\n            _override=override,\n        )\n        from tests.test_config.pkgs import asset\n        from tests.test_config.pkgs.asset import subpackage\n    \n        self.assertEqual(override.package, asset)\n        self.assertEqual(override.path, 'templates/')\n        source = override.source\n        self.assertTrue(isinstance(source, PackageAssetSource))\n        self.assertEqual(source.package, subpackage)\n        self.assertEqual(source.prefix, 'templates/')\n    \n        resource_name = 'bar.pt'\n        expected = os.path.join(\n            here, 'pkgs', 'asset', 'subpackage', 'templates', 'bar.pt'\n        )\n>       self.assertEqual(override.source.get_filename(resource_name), expected)\nE       AssertionError: '/hom[90 chars]0ea8/tests/test_config/pkgs/asset/subpackage/templates/bar.pt' != '/hom[90 chars]0ea8/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    ++++\n\nr2e_tests/test_config/test_assets.py:132: AssertionError\n____ TestAssetsConfiguratorMixin.test_override_asset_directory_with_package ____\n\nself = <r2e_tests.test_config.test_assets.TestAssetsConfiguratorMixin testMethod=test_override_asset_directory_with_package>\n\n    def test_override_asset_directory_with_package(self):\n        from pyramid.config.assets import PackageAssetSource\n    \n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'tests.test_config.pkgs.asset:templates/',\n            'tests.test_config.pkgs.asset.subpackage',\n            _override=override,\n        )\n        from tests.test_config.pkgs import asset\n        from tests.test_config.pkgs.asset import subpackage\n    \n        self.assertEqual(override.package, asset)\n        self.assertEqual(override.path, 'templates/')\n        source = override.source\n        self.assertTrue(isinstance(source, PackageAssetSource))\n        self.assertEqual(source.package, subpackage)\n        self.assertEqual(source.prefix, '')\n    \n        resource_name = 'templates/bar.pt'\n        expected = os.path.join(\n            here, 'pkgs', 'asset', 'subpackage', 'templates', 'bar.pt'\n        )\n>       self.assertEqual(override.source.get_filename(resource_name), expected)\nE       AssertionError: '/hom[90 chars]0ea8/tests/test_config/pkgs/asset/subpackage/templates/bar.pt' != '/hom[90 chars]0ea8/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    ++++\n\nr2e_tests/test_config/test_assets.py:158: AssertionError\n________ TestAssetsConfiguratorMixin.test_override_asset_file_with_file ________\n\nself = <r2e_tests.test_config.test_assets.TestAssetsConfiguratorMixin testMethod=test_override_asset_file_with_file>\n\n    def test_override_asset_file_with_file(self):\n        from pyramid.config.assets import PackageAssetSource\n    \n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'tests.test_config.pkgs.asset:templates/foo.pt',\n            'tests.test_config.pkgs.asset.subpackage:templates/bar.pt',\n            _override=override,\n        )\n        from tests.test_config.pkgs import asset\n        from tests.test_config.pkgs.asset import subpackage\n    \n        self.assertEqual(override.package, asset)\n        self.assertEqual(override.path, 'templates/foo.pt')\n        source = override.source\n        self.assertTrue(isinstance(source, PackageAssetSource))\n        self.assertEqual(source.package, subpackage)\n        self.assertEqual(source.prefix, 'templates/bar.pt')\n    \n        resource_name = ''\n        expected = os.path.join(\n            here, 'pkgs', 'asset', 'subpackage', 'templates', 'bar.pt'\n        )\n>       self.assertEqual(override.source.get_filename(resource_name), expected)\nE       AssertionError: '/hom[90 chars]0ea8/tests/test_config/pkgs/asset/subpackage/templates/bar.pt' != '/hom[90 chars]0ea8/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    ++++\n\nr2e_tests/test_config/test_assets.py:80: AssertionError\n____ TestAssetsConfiguratorMixin.test_override_asset_package_with_directory ____\n\nself = <r2e_tests.test_config.test_assets.TestAssetsConfiguratorMixin testMethod=test_override_asset_package_with_directory>\n\n    def test_override_asset_package_with_directory(self):\n        from pyramid.config.assets import PackageAssetSource\n    \n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'tests.test_config.pkgs.asset',\n            'tests.test_config.pkgs.asset.subpackage:templates/',\n            _override=override,\n        )\n        from tests.test_config.pkgs import asset\n        from tests.test_config.pkgs.asset import subpackage\n    \n        self.assertEqual(override.package, asset)\n        self.assertEqual(override.path, '')\n        source = override.source\n        self.assertTrue(isinstance(source, PackageAssetSource))\n        self.assertEqual(source.package, subpackage)\n        self.assertEqual(source.prefix, 'templates/')\n    \n        resource_name = 'bar.pt'\n        expected = os.path.join(\n            here, 'pkgs', 'asset', 'subpackage', 'templates', 'bar.pt'\n        )\n>       self.assertEqual(override.source.get_filename(resource_name), expected)\nE       AssertionError: '/hom[90 chars]0ea8/tests/test_config/pkgs/asset/subpackage/templates/bar.pt' != '/hom[90 chars]0ea8/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    ++++\n\nr2e_tests/test_config/test_assets.py:184: AssertionError\n_____ TestAssetsConfiguratorMixin.test_override_asset_package_with_package _____\n\nself = <r2e_tests.test_config.test_assets.TestAssetsConfiguratorMixin testMethod=test_override_asset_package_with_package>\n\n    def test_override_asset_package_with_package(self):\n        from pyramid.config.assets import PackageAssetSource\n    \n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'tests.test_config.pkgs.asset',\n            'tests.test_config.pkgs.asset.subpackage',\n            _override=override,\n        )\n        from tests.test_config.pkgs import asset\n        from tests.test_config.pkgs.asset import subpackage\n    \n        self.assertEqual(override.package, asset)\n        self.assertEqual(override.path, '')\n        source = override.source\n        self.assertTrue(isinstance(source, PackageAssetSource))\n        self.assertEqual(source.package, subpackage)\n        self.assertEqual(source.prefix, '')\n    \n        resource_name = 'templates/bar.pt'\n        expected = os.path.join(\n            here, 'pkgs', 'asset', 'subpackage', 'templates', 'bar.pt'\n        )\n>       self.assertEqual(override.source.get_filename(resource_name), expected)\nE       AssertionError: '/hom[90 chars]0ea8/tests/test_config/pkgs/asset/subpackage/templates/bar.pt' != '/hom[90 chars]0ea8/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    ++++\n\nr2e_tests/test_config/test_assets.py:106: AssertionError\n_________ TestOverrideProvider.test_get_resource_filename_no_overrides _________\n\nself = <r2e_tests.test_config.test_assets.TestOverrideProvider testMethod=test_get_resource_filename_no_overrides>\n\n    def test_get_resource_filename_no_overrides(self):\n        resource_name = 'test_assets.py'\n        import tests.test_config\n    \n        provider = self._makeOne(tests.test_config)\n        expected = os.path.join(here, resource_name)\n        result = provider.get_resource_filename(None, resource_name)\n>       self.assertEqual(result, expected)\nE       AssertionError: '/hom[69 chars]2253b190882fae72aba3f0ea8/tests/test_config/test_assets.py' != '/hom[69 chars]2253b190882fae72aba3f0ea8/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/tests/test_config/test_assets.py\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                    ++++\n\nr2e_tests/test_config/test_assets.py:360: AssertionError\n____ TestOverrideProvider.test_get_resource_filename_override_returns_None _____\n\nself = <r2e_tests.test_config.test_assets.TestOverrideProvider testMethod=test_get_resource_filename_override_returns_None>\n\n    def test_get_resource_filename_override_returns_None(self):\n        overrides = DummyOverrides(None)\n        self._registerOverrides(overrides)\n        resource_name = 'test_assets.py'\n        import tests.test_config\n    \n        provider = self._makeOne(tests.test_config)\n        expected = os.path.join(here, resource_name)\n        result = provider.get_resource_filename(None, resource_name)\n>       self.assertEqual(result, expected)\nE       AssertionError: '/hom[69 chars]2253b190882fae72aba3f0ea8/tests/test_config/test_assets.py' != '/hom[69 chars]2253b190882fae72aba3f0ea8/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/tests/test_config/test_assets.py\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                    ++++\n\nr2e_tests/test_config/test_assets.py:414: AssertionError\n___________________ TestPackageAssetSource.test_get_filename ___________________\n\nself = <r2e_tests.test_config.test_assets.TestPackageAssetSource testMethod=test_get_filename>\n\n    def test_get_filename(self):\n        source = self._makeOne('')\n>       self.assertEqual(\n            source.get_filename('test_assets.py'),\n            os.path.join(here, 'test_assets.py'),\n        )\nE       AssertionError: '/hom[69 chars]2253b190882fae72aba3f0ea8/tests/test_config/test_assets.py' != '/hom[69 chars]2253b190882fae72aba3f0ea8/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/tests/test_config/test_assets.py\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                    ++++\n\nr2e_tests/test_config/test_assets.py:826: AssertionError\n_____________ TestPackageAssetSource.test_get_filename_with_prefix _____________\n\nself = <r2e_tests.test_config.test_assets.TestPackageAssetSource testMethod=test_get_filename_with_prefix>\n\n    def test_get_filename_with_prefix(self):\n        source = self._makeOne('test_assets.py')\n>       self.assertEqual(\n            source.get_filename(''), os.path.join(here, 'test_assets.py')\n        )\nE       AssertionError: '/hom[69 chars]2253b190882fae72aba3f0ea8/tests/test_config/test_assets.py' != '/hom[69 chars]2253b190882fae72aba3f0ea8/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/tests/test_config/test_assets.py\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                    ++++\n\nr2e_tests/test_config/test_assets.py:833: AssertionError\n____________ TestFactoriesMixin.test_set_request_factory_dottedname ____________\n\nself = <r2e_tests.test_config.test_factories.TestFactoriesMixin testMethod=test_set_request_factory_dottedname>\n\n    def test_set_request_factory_dottedname(self):\n        from pyramid.interfaces import IRequestFactory\n    \n        config = self._makeOne(autocommit=True)\n        config.set_request_factory('tests.test_config.dummyfactory')\n>       self.assertEqual(\n            config.registry.getUtility(IRequestFactory), dummyfactory\n        )\nE       AssertionError: <function dummyfactory at 0x7871a2213430> != <function dummyfactory at 0x7871a24feb80>\n\nr2e_tests/test_config/test_factories.py:26: AssertionError\n___________ TestFactoriesMixin.test_set_response_factory_dottedname ____________\n\nself = <r2e_tests.test_config.test_factories.TestFactoriesMixin testMethod=test_set_response_factory_dottedname>\n\n    def test_set_response_factory_dottedname(self):\n        from pyramid.interfaces import IResponseFactory\n    \n        config = self._makeOne(autocommit=True)\n        config.set_response_factory('tests.test_config.dummyfactory')\n>       self.assertEqual(\n            config.registry.getUtility(IResponseFactory), dummyfactory\n        )\nE       AssertionError: <function dummyfactory at 0x7871a2213430> != <function dummyfactory at 0x7871a24feb80>\n\nr2e_tests/test_config/test_factories.py:43: AssertionError\n_____________ TestFactoriesMixin.test_set_root_factory_dottedname ______________\n\nself = <r2e_tests.test_config.test_factories.TestFactoriesMixin testMethod=test_set_root_factory_dottedname>\n\n    def test_set_root_factory_dottedname(self):\n        from pyramid.interfaces import IRootFactory\n    \n        config = self._makeOne()\n        config.set_root_factory('tests.test_config.dummyfactory')\n        self.assertEqual(config.registry.queryUtility(IRootFactory), None)\n        config.commit()\n>       self.assertEqual(\n            config.registry.getUtility(IRootFactory), dummyfactory\n        )\nE       AssertionError: <function dummyfactory at 0x7871a2213430> != <function dummyfactory at 0x7871a24feb80>\n\nr2e_tests/test_config/test_factories.py:77: AssertionError\n____________ TestFactoriesMixin.test_set_session_factory_dottedname ____________\n\nself = <r2e_tests.test_config.test_factories.TestFactoriesMixin testMethod=test_set_session_factory_dottedname>\n\n    def test_set_session_factory_dottedname(self):\n        from pyramid.interfaces import ISessionFactory\n    \n        config = self._makeOne()\n        config.set_session_factory('tests.test_config.dummyfactory')\n        self.assertEqual(config.registry.queryUtility(ISessionFactory), None)\n        config.commit()\n>       self.assertEqual(\n            config.registry.getUtility(ISessionFactory), dummyfactory\n        )\nE       AssertionError: <function dummyfactory at 0x7871a2213430> != <function dummyfactory at 0x7871a24feb80>\n\nr2e_tests/test_config/test_factories.py:99: AssertionError\n_________ TestI18NConfiguratorMixin.test_add_translation_dirs_abspath __________\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_abspath>\n\n    def test_add_translation_dirs_abspath(self):\n        from pyramid.interfaces import ITranslationDirectories\n    \n        config = self._makeOne(autocommit=True)\n>       config.add_translation_dirs(locale)\n\nr2e_tests/test_config/test_i18n.py:131: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nsrc/pyramid/config/actions.py:572: in wrapper\n    result = wrapped(self, *arg, **kw)\nsrc/pyramid/config/i18n.py:125: in add_translation_dirs\n    self.action(None, register, introspectables=introspectables)\nsrc/pyramid/config/actions.py:94: in action\n    callable(*args, **kw)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\n    def register():\n        directories = []\n        resolver = AssetResolver(self.package_name)\n    \n        # defer spec resolution until register to allow for asset\n        # overrides to take place in an earlier config phase\n        for spec in specs:\n            # the trailing slash helps match asset overrides for folders\n            if not spec.endswith('/'):\n                spec += '/'\n            asset = resolver.resolve(spec)\n            directory = asset.abspath()\n            if not asset.isdir():\n>               raise ConfigurationError(\n                    '\"%s\" is not a directory' % directory\n                )\nE               pyramid.exceptions.ConfigurationError: \"/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/pkgs/localeapp/locale\" is not a directory\n\nsrc/pyramid/config/i18n.py:101: ConfigurationError\n________ TestI18NConfiguratorMixin.test_add_translation_dirs_asset_spec ________\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_asset_spec>\n\n    def test_add_translation_dirs_asset_spec(self):\n        from pyramid.interfaces import ITranslationDirectories\n    \n        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs('tests.pkgs.localeapp:locale')\n>       self.assertEqual(\n            config.registry.getUtility(ITranslationDirectories), [locale]\n        )\nE       AssertionError: Lists differ: ['/ho[66 chars]3d8f2253b190882fae72aba3f0ea8/tests/pkgs/localeapp/locale'] != ['/ho[66 chars]3d8f2253b190882fae72aba3f0ea8/r2e_tests/pkgs/localeapp/locale']\nE       \nE       First differing element 0:\nE       '/hom[64 chars]43d8f2253b190882fae72aba3f0ea8/tests/pkgs/localeapp/locale'\nE       '/hom[64 chars]43d8f2253b190882fae72aba3f0ea8/r2e_tests/pkgs/localeapp/locale'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/tests/pkgs/localeapp/locale']\nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/pkgs/localeapp/locale']\nE       ?                                                                                                      ++++\n\nr2e_tests/test_config/test_i18n.py:68: AssertionError\n_ TestI18NConfiguratorMixin.test_add_translation_dirs_asset_spec_existing_translation_dirs _\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_asset_spec_existing_translation_dirs>\n\n    def test_add_translation_dirs_asset_spec_existing_translation_dirs(self):\n        from pyramid.interfaces import ITranslationDirectories\n    \n        config = self._makeOne(autocommit=True)\n        directories = ['abc']\n        config.registry.registerUtility(directories, ITranslationDirectories)\n        config.add_translation_dirs('tests.pkgs.localeapp:locale')\n        result = config.registry.getUtility(ITranslationDirectories)\n>       self.assertEqual(result, [locale, 'abc'])\nE       AssertionError: Lists differ: ['/ho[73 chars]3b190882fae72aba3f0ea8/tests/pkgs/localeapp/locale', 'abc'] != ['/ho[73 chars]3b190882fae72aba3f0ea8/r2e_tests/pkgs/localeapp/locale', 'abc']\nE       \nE       First differing element 0:\nE       '/hom[64 chars]43d8f2253b190882fae72aba3f0ea8/tests/pkgs/localeapp/locale'\nE       '/hom[64 chars]43d8f2253b190882fae72aba3f0ea8/r2e_tests/pkgs/localeapp/locale'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/tests/pkgs/localeapp/locale',\nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/pkgs/localeapp/locale',\nE       ?                                                                                                      ++++\nE       \nE          'abc']\n\nr2e_tests/test_config/test_i18n.py:80: AssertionError\n_ TestI18NConfiguratorMixin.test_add_translation_dirs_doesnt_use_override_w_autocommit _\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_doesnt_use_override_w_autocommit>\n\n    def test_add_translation_dirs_doesnt_use_override_w_autocommit(self):\n        from pyramid.interfaces import ITranslationDirectories\n    \n        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs('tests.pkgs.localeapp:locale')\n        config.override_asset(\n            'tests.pkgs.localeapp:locale/', 'tests.pkgs.localeapp:locale2/'\n        )\n>       self.assertEqual(\n            config.registry.getUtility(ITranslationDirectories), [locale]\n        )\nE       AssertionError: Lists differ: ['/ho[66 chars]3d8f2253b190882fae72aba3f0ea8/tests/pkgs/localeapp/locale'] != ['/ho[66 chars]3d8f2253b190882fae72aba3f0ea8/r2e_tests/pkgs/localeapp/locale']\nE       \nE       First differing element 0:\nE       '/hom[64 chars]43d8f2253b190882fae72aba3f0ea8/tests/pkgs/localeapp/locale'\nE       '/hom[64 chars]43d8f2253b190882fae72aba3f0ea8/r2e_tests/pkgs/localeapp/locale'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/tests/pkgs/localeapp/locale']\nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/pkgs/localeapp/locale']\nE       ?                                                                                                      ++++\n\nr2e_tests/test_config/test_i18n.py:157: AssertionError\n______ TestI18NConfiguratorMixin.test_add_translation_dirs_multiple_specs ______\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_multiple_specs>\n\n    def test_add_translation_dirs_multiple_specs(self):\n        from pyramid.interfaces import ITranslationDirectories\n    \n        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs(\n            'tests.pkgs.localeapp:locale', 'tests.pkgs.localeapp:locale2'\n        )\n>       self.assertEqual(\n            config.registry.getUtility(ITranslationDirectories),\n            [locale, locale2],\n        )\nE       AssertionError: Lists differ: ['/ho[91 chars]0ea8/tests/pkgs/localeapp/locale', '/home/gcpu[114 chars]le2'] != ['/ho[91 chars]0ea8/r2e_tests/pkgs/localeapp/locale', '/home/[122 chars]le2']\nE       \nE       First differing element 0:\nE       '/hom[64 chars]43d8f2253b190882fae72aba3f0ea8/tests/pkgs/localeapp/locale'\nE       '/hom[64 chars]43d8f2253b190882fae72aba3f0ea8/r2e_tests/pkgs/localeapp/locale'\nE       \nE       Diff is 760 characters long. Set self.maxDiff to None to see it.\n\nr2e_tests/test_config/test_i18n.py:89: AssertionError\n_ TestI18NConfiguratorMixin.test_add_translation_dirs_multiple_specs_multiple_calls _\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_multiple_specs_multiple_calls>\n\n    def test_add_translation_dirs_multiple_specs_multiple_calls(self):\n        from pyramid.interfaces import ITranslationDirectories\n    \n        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs(\n            'tests.pkgs.localeapp:locale', 'tests.pkgs.localeapp:locale2'\n        )\n        config.add_translation_dirs('tests.pkgs.localeapp:locale3')\n>       self.assertEqual(\n            config.registry.getUtility(ITranslationDirectories),\n            [locale3, locale, locale2],\n        )\nE       AssertionError: Lists differ: ['/ho[91 chars]0ea8/tests/pkgs/localeapp/locale3', '/home/gcp[245 chars]le2'] != ['/ho[91 chars]0ea8/r2e_tests/pkgs/localeapp/locale3', '/home[257 chars]le2']\nE       \nE       First differing element 0:\nE       '/hom[65 chars]3d8f2253b190882fae72aba3f0ea8/tests/pkgs/localeapp/locale3'\nE       '/hom[65 chars]3d8f2253b190882fae72aba3f0ea8/r2e_tests/pkgs/localeapp/locale3'\nE       \nE       Diff is 1141 characters long. Set self.maxDiff to None to see it.\n\nr2e_tests/test_config/test_i18n.py:102: AssertionError\n_ TestI18NConfiguratorMixin.test_add_translation_dirs_override_multiple_specs_multiple_calls _\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_override_multiple_specs_multiple_calls>\n\n    def test_add_translation_dirs_override_multiple_specs_multiple_calls(self):\n        from pyramid.interfaces import ITranslationDirectories\n    \n        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs(\n            'tests.pkgs.localeapp:locale', 'tests.pkgs.localeapp:locale2'\n        )\n        config.add_translation_dirs(\n            'tests.pkgs.localeapp:locale3', override=True\n        )\n>       self.assertEqual(\n            config.registry.getUtility(ITranslationDirectories),\n            [locale, locale2, locale3],\n        )\nE       AssertionError: Lists differ: ['/ho[91 chars]0ea8/tests/pkgs/localeapp/locale', '/home/gcpu[245 chars]le3'] != ['/ho[91 chars]0ea8/r2e_tests/pkgs/localeapp/locale', '/home/[257 chars]le3']\nE       \nE       First differing element 0:\nE       '/hom[64 chars]43d8f2253b190882fae72aba3f0ea8/tests/pkgs/localeapp/locale'\nE       '/hom[64 chars]43d8f2253b190882fae72aba3f0ea8/r2e_tests/pkgs/localeapp/locale'\nE       \nE       Diff is 1141 characters long. Set self.maxDiff to None to see it.\n\nr2e_tests/test_config/test_i18n.py:117: AssertionError\n_ TestI18NConfiguratorMixin.test_add_translation_dirs_uses_override_out_of_order _\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_uses_override_out_of_order>\n\n    def test_add_translation_dirs_uses_override_out_of_order(self):\n        from pyramid.interfaces import ITranslationDirectories\n    \n        config = self._makeOne()\n        config.add_translation_dirs('tests.pkgs.localeapp:locale')\n        config.override_asset(\n            'tests.pkgs.localeapp:locale/', 'tests.pkgs.localeapp:locale2/'\n        )\n        config.commit()\n>       self.assertEqual(\n            config.registry.getUtility(ITranslationDirectories), [locale2]\n        )\nE       AssertionError: Lists differ: ['/ho[67 chars]d8f2253b190882fae72aba3f0ea8/tests/pkgs/localeapp/locale2'] != ['/ho[67 chars]d8f2253b190882fae72aba3f0ea8/r2e_tests/pkgs/localeapp/locale2']\nE       \nE       First differing element 0:\nE       '/hom[65 chars]3d8f2253b190882fae72aba3f0ea8/tests/pkgs/localeapp/locale2'\nE       '/hom[65 chars]3d8f2253b190882fae72aba3f0ea8/r2e_tests/pkgs/localeapp/locale2'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/tests/pkgs/localeapp/locale2']\nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/pkgs/localeapp/locale2']\nE       ?                                                                                                      ++++\n\nr2e_tests/test_config/test_i18n.py:145: AssertionError\n_ TestI18NConfiguratorMixin.test_add_translation_dirs_uses_override_w_autocommit _\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_uses_override_w_autocommit>\n\n    def test_add_translation_dirs_uses_override_w_autocommit(self):\n        from pyramid.interfaces import ITranslationDirectories\n    \n        config = self._makeOne(autocommit=True)\n        config.override_asset(\n            'tests.pkgs.localeapp:locale/', 'tests.pkgs.localeapp:locale2/'\n        )\n        config.add_translation_dirs('tests.pkgs.localeapp:locale')\n>       self.assertEqual(\n            config.registry.getUtility(ITranslationDirectories), [locale2]\n        )\nE       AssertionError: Lists differ: ['/ho[67 chars]d8f2253b190882fae72aba3f0ea8/tests/pkgs/localeapp/locale2'] != ['/ho[67 chars]d8f2253b190882fae72aba3f0ea8/r2e_tests/pkgs/localeapp/locale2']\nE       \nE       First differing element 0:\nE       '/hom[65 chars]3d8f2253b190882fae72aba3f0ea8/tests/pkgs/localeapp/locale2'\nE       '/hom[65 chars]3d8f2253b190882fae72aba3f0ea8/r2e_tests/pkgs/localeapp/locale2'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/tests/pkgs/localeapp/locale2']\nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/pkgs/localeapp/locale2']\nE       ?                                                                                                      ++++\n\nr2e_tests/test_config/test_i18n.py:169: AssertionError\n_______ TestI18NConfiguratorMixin.test_set_locale_negotiator_dottedname ________\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_set_locale_negotiator_dottedname>\n\n    def test_set_locale_negotiator_dottedname(self):\n        from pyramid.interfaces import ILocaleNegotiator\n    \n        config = self._makeOne(autocommit=True)\n        config.set_locale_negotiator('tests.test_config.dummyfactory')\n>       self.assertEqual(\n            config.registry.getUtility(ILocaleNegotiator), dummyfactory\n        )\nE       AssertionError: <function dummyfactory at 0x7871a2213430> != <function dummyfactory at 0x7871a24feb80>\n\nr2e_tests/test_config/test_i18n.py:43: AssertionError\n___________________ ConfiguratorTests.test_ctor_no_registry ____________________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_ctor_no_registry>\n\n    def test_ctor_no_registry(self):\n        import sys\n        from pyramid.interfaces import ISettings\n        from pyramid.config import Configurator\n        from pyramid.interfaces import IRendererFactory\n    \n        config = Configurator()\n        this_pkg = sys.modules['tests.test_config']\n        self.assertTrue(config.registry.getUtility(ISettings))\n>       self.assertEqual(config.package, this_pkg)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'tests.test_config' from '/home/gcpuser/bu[109 chars].py'>\n\nr2e_tests/test_config/test_init.py:76: AssertionError\n_________ ConfiguratorTests.test_ctor_noreg_debug_logger_None_default __________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_ctor_noreg_debug_logger_None_default>\n\n    def test_ctor_noreg_debug_logger_None_default(self):\n        from pyramid.interfaces import IDebugLogger\n    \n        config = self._makeOne()\n        logger = config.registry.getUtility(IDebugLogger)\n>       self.assertEqual(logger.name, 'tests.test_config')\nE       AssertionError: 'r2e_tests.test_config' != 'tests.test_config'\nE       - r2e_tests.test_config\nE       ? ----\nE       + tests.test_config\n\nr2e_tests/test_config/test_init.py:201: AssertionError\n_____________ ConfiguratorTests.test_include_constant_root_package _____________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_include_constant_root_package>\n\n    def test_include_constant_root_package(self):\n        import tests\n        from tests import test_config\n    \n        config = self._makeOne(root_package=tests)\n        results = {}\n    \n        def include(config):\n            results['package'] = config.package\n            results['root_package'] = config.root_package\n    \n        config.include(include)\n        self.assertEqual(results['root_package'], tests)\n>       self.assertEqual(results['package'], test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'tests.test_config' from '/home/gcpuser/bu[109 chars].py'>\n\nr2e_tests/test_config/test_init.py:960: AssertionError\n_____________ ConfiguratorTests.test_include_with_python_callable ______________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_include_with_python_callable>\n\n    def test_include_with_python_callable(self):\n        from tests import test_config\n    \n        config = self._makeOne()\n        config.include(dummy_include)\n        after = config.action_state\n        actions = after.actions\n        self.assertEqual(len(actions), 1)\n        action = actions[0]\n        self.assertEqual(action['discriminator'], 'discrim')\n        self.assertEqual(action['callable'], None)\n>       self.assertEqual(action['args'], test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'tests.test_config' from '/home/gcpuser/bu[109 chars].py'>\n\nr2e_tests/test_config/test_init.py:873: AssertionError\n_______ ConfiguratorTests.test_setup_registry_debug_logger_None_default ________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_setup_registry_debug_logger_None_default>\n\n    def test_setup_registry_debug_logger_None_default(self):\n        from pyramid.registry import Registry\n        from pyramid.interfaces import IDebugLogger\n    \n        reg = Registry()\n        config = self._makeOne(reg)\n        config.setup_registry()\n        logger = reg.getUtility(IDebugLogger)\n>       self.assertEqual(logger.name, 'tests.test_config')\nE       AssertionError: 'r2e_tests.test_config' != 'tests.test_config'\nE       - r2e_tests.test_config\nE       ? ----\nE       + tests.test_config\n\nr2e_tests/test_config/test_init.py:589: AssertionError\n_________________ ConfiguratorTests.test_setup_registry_tweens _________________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_setup_registry_tweens>\n\n    def test_setup_registry_tweens(self):\n        from pyramid.interfaces import ITweens\n        from pyramid.registry import Registry\n    \n        reg = Registry()\n        config = self._makeOne(reg)\n        settings = {'pyramid.tweens': 'tests.test_config.dummy_tween_factory'}\n        config.setup_registry(settings=settings)\n        config.commit()\n        tweens = config.registry.getUtility(ITweens)\n>       self.assertEqual(\n            tweens.explicit,\n            [('tests.test_config.dummy_tween_factory', dummy_tween_factory)],\n        )\nE       AssertionError: Lists differ: [('te[25 chars]en_factory', <function dummy_tween_factory at 0x7871a21bae50>)] != [('te[25 chars]en_factory', <function dummy_tween_factory at 0x7871a24fe820>)]\nE       \nE       First differing element 0:\nE       ('tes[23 chars]een_factory', <function dummy_tween_factory at 0x7871a21bae50>)\nE       ('tes[23 chars]een_factory', <function dummy_tween_factory at 0x7871a24fe820>)\nE       \nE         [('tests.test_config.dummy_tween_factory',\nE       -   <function dummy_tween_factory at 0x7871a21bae50>)]\nE       ?                                            ^^^ ^\nE       \nE       +   <function dummy_tween_factory at 0x7871a24fe820>)]\nE       ?                                            ^^ ^^\n\nr2e_tests/test_config/test_init.py:810: AssertionError\n__________________ ConfiguratorTests.test_with_package_module __________________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_with_package_module>\n\n    def test_with_package_module(self):\n        from . import test_init\n    \n        config = self._makeOne()\n        newconfig = config.with_package(test_init)\n        import tests.test_config\n    \n>       self.assertEqual(newconfig.package, tests.test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'tests.test_config' from '/home/gcpuser/bu[109 chars].py'>\n\nr2e_tests/test_config/test_init.py:351: AssertionError\n____ TestConfigurator_add_directive.test_add_directive_with_custom_callable ____\n\nself = <r2e_tests.test_config.test_init.TestConfigurator_add_directive testMethod=test_add_directive_with_custom_callable>\n\n    def test_add_directive_with_custom_callable(self):\n        from tests import test_config\n    \n        config = self.config\n        config.add_directive(\n            'dummy_callable', 'tests.test_config.dummy_callable'\n        )\n        self.assertTrue(hasattr(config, 'dummy_callable'))\n        config.dummy_callable('discrim')\n        after = config.action_state\n        action = after.actions[-1]\n        self.assertEqual(action['discriminator'], 'discrim')\n        self.assertEqual(action['callable'], None)\n>       self.assertEqual(action['args'], test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'tests.test_config' from '/home/gcpuser/bu[109 chars].py'>\n\nr2e_tests/test_config/test_init.py:1279: AssertionError\n________ TestConfigurator_add_directive.test_add_directive_with_partial ________\n\nself = <r2e_tests.test_config.test_init.TestConfigurator_add_directive testMethod=test_add_directive_with_partial>\n\n    def test_add_directive_with_partial(self):\n        from tests import test_config\n    \n        config = self.config\n        config.add_directive(\n            'dummy_partial', 'tests.test_config.dummy_partial'\n        )\n        self.assertTrue(hasattr(config, 'dummy_partial'))\n        config.dummy_partial()\n        after = config.action_state\n        action = after.actions[-1]\n        self.assertEqual(action['discriminator'], 'partial')\n        self.assertEqual(action['callable'], None)\n>       self.assertEqual(action['args'], test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'tests.test_config' from '/home/gcpuser/bu[109 chars].py'>\n\nr2e_tests/test_config/test_init.py:1264: AssertionError\n_________ TestConfigurator_add_directive.test_extend_with_dotted_name __________\n\nself = <r2e_tests.test_config.test_init.TestConfigurator_add_directive testMethod=test_extend_with_dotted_name>\n\n    def test_extend_with_dotted_name(self):\n        from tests import test_config\n    \n        config = self.config\n        config.add_directive('dummy_extend', 'tests.test_config.dummy_extend')\n        self.assertTrue(hasattr(config, 'dummy_extend'))\n        config.dummy_extend('discrim')\n        after = config.action_state\n        action = after.actions[-1]\n        self.assertEqual(action['discriminator'], 'discrim')\n        self.assertEqual(action['callable'], None)\n>       self.assertEqual(action['args'], test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'tests.test_config' from '/home/gcpuser/bu[109 chars].py'>\n\nr2e_tests/test_config/test_init.py:1249: AssertionError\n_______ TestConfigurator_add_directive.test_extend_with_python_callable ________\n\nself = <r2e_tests.test_config.test_init.TestConfigurator_add_directive testMethod=test_extend_with_python_callable>\n\n    def test_extend_with_python_callable(self):\n        from tests import test_config\n    \n        config = self.config\n        config.add_directive('dummy_extend', dummy_extend)\n        self.assertTrue(hasattr(config, 'dummy_extend'))\n        config.dummy_extend('discrim')\n        after = config.action_state\n        action = after.actions[-1]\n        self.assertEqual(action['discriminator'], 'discrim')\n        self.assertEqual(action['callable'], None)\n>       self.assertEqual(action['args'], test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'tests.test_config' from '/home/gcpuser/bu[109 chars].py'>\n\nr2e_tests/test_config/test_init.py:1292: AssertionError\n_________ TestConfigurator__add_predicate.test_factory_as_dotted_name __________\n\nself = <r2e_tests.test_config.test_init.TestConfigurator__add_predicate testMethod=test_factory_as_dotted_name>\n\n    def test_factory_as_dotted_name(self):\n        config = self._makeOne()\n    \n        def _fakeAction(\n            discriminator,\n            callable=None,\n            args=(),\n            kw=None,\n            order=0,\n            introspectables=(),\n            **extra\n        ):\n            self.assertEqual(len(introspectables), 1)\n            self.assertEqual(introspectables[0]['name'], 'testing')\n            self.assertEqual(introspectables[0]['factory'], DummyPredicate)\n    \n        config.action = _fakeAction\n>       config._add_predicate(\n            'route', 'testing', 'tests.test_config.test_init.DummyPredicate'\n        )\n\nr2e_tests/test_config/test_init.py:1369: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nsrc/pyramid/config/predicates.py:47: in _add_predicate\n    self.action(\nr2e_tests/test_config/test_init.py:1366: in _fakeAction\n    self.assertEqual(introspectables[0]['factory'], DummyPredicate)\nE   AssertionError: <class 'tests.test_config.test_init.DummyPredicate'> != <class 'r2e_tests.test_config.test_init.DummyPredicate'>\n_____ RoutesConfiguratorMixinTests.test_add_route_with_factory_dottedname ______\n\nself = <r2e_tests.test_config.test_routes.RoutesConfiguratorMixinTests testMethod=test_add_route_with_factory_dottedname>\n\n    def test_add_route_with_factory_dottedname(self):\n        config = self._makeOne(autocommit=True)\n        config.add_route(\n            'name', 'path', factory='tests.test_config.dummyfactory'\n        )\n        route = self._assertRoute(config, 'name', 'path')\n>       self.assertEqual(route.factory, dummyfactory)\nE       AssertionError: <function dummyfactory at 0x7871a2213430> != <function dummyfactory at 0x7871a24feb80>\n\nr2e_tests/test_config/test_routes.py:109: AssertionError\n_____ TestingConfiguratorMixinTests.test_testing_add_subscriber_dottedname _____\n\nself = <r2e_tests.test_config.test_testing.TestingConfiguratorMixinTests testMethod=test_testing_add_subscriber_dottedname>\n\n    def test_testing_add_subscriber_dottedname(self):\n        config = self._makeOne(autocommit=True)\n        L = config.testing_add_subscriber('tests.test_config.IDummy')\n        event = DummyEvent()\n        config.registry.notify(event)\n>       self.assertEqual(len(L), 1)\nE       AssertionError: 0 != 1\n\nr2e_tests/test_config/test_testing.py:108: AssertionError\n____________ TestTweensConfiguratorMixin.test_add_tween_dottedname _____________\n\nself = <r2e_tests.test_config.test_tweens.TestTweensConfiguratorMixin testMethod=test_add_tween_dottedname>\n\n    def test_add_tween_dottedname(self):\n        from pyramid.interfaces import ITweens\n        from pyramid.tweens import excview_tween_factory\n    \n        config = self._makeOne()\n        config.add_tween('tests.test_config.dummy_tween_factory')\n        config.commit()\n        tweens = config.registry.queryUtility(ITweens)\n>       self.assertEqual(\n            tweens.implicit(),\n            [\n                ('tests.test_config.dummy_tween_factory', dummy_tween_factory),\n                (\n                    'pyramid.tweens.excview_tween_factory',\n                    excview_tween_factory,\n                ),\n            ],\n        )\nE       AssertionError: Lists differ: [('te[74 chars]871a21bae50>), ('pyramid.tweens.excview_tween_[57 chars]b0>)] != [('te[74 chars]871a24fe820>), ('pyramid.tweens.excview_tween_[57 chars]b0>)]\nE       \nE       First differing element 0:\nE       ('tes[23 chars]een_factory', <function dummy_tween_factory at 0x7871a21bae50>)\nE       ('tes[23 chars]een_factory', <function dummy_tween_factory at 0x7871a24fe820>)\nE       \nE         [('tests.test_config.dummy_tween_factory',\nE       -   <function dummy_tween_factory at 0x7871a21bae50>),\nE       ?                                            ^^^ ^\nE       \nE       +   <function dummy_tween_factory at 0x7871a24fe820>),\nE       ?                                            ^^ ^^\nE       \nE          ('pyramid.tweens.excview_tween_factory',\nE           <function excview_tween_factory at 0x7871a28308b0>)]\n\nr2e_tests/test_config/test_tweens.py:106: AssertionError\n__________ TestTweensConfiguratorMixin.test_add_tweens_names_distinct __________\n\nself = <r2e_tests.test_config.test_tweens.TestTweensConfiguratorMixin testMethod=test_add_tweens_names_distinct>\n\n    def test_add_tweens_names_distinct(self):\n        from pyramid.interfaces import ITweens\n        from pyramid.tweens import excview_tween_factory\n    \n        def factory1(handler, registry):  # pragma: no cover\n            return handler\n    \n        def factory2(handler, registry):  # pragma: no cover\n            return handler\n    \n        config = self._makeOne()\n        config.add_tween('tests.test_config.dummy_tween_factory')\n        config.add_tween('tests.test_config.dummy_tween_factory2')\n        config.commit()\n        tweens = config.registry.queryUtility(ITweens)\n        implicit = tweens.implicit()\n>       self.assertEqual(\n            implicit,\n            [\n                (\n                    'tests.test_config.dummy_tween_factory2',\n                    dummy_tween_factory2,\n                ),\n                ('tests.test_config.dummy_tween_factory', dummy_tween_factory),\n                (\n                    'pyramid.tweens.excview_tween_factory',\n                    excview_tween_factory,\n                ),\n            ],\n        )\nE       AssertionError: Lists differ: [('te[76 chars]871a21baee0>), ('tests.test_config.dummy_tween[150 chars]b0>)] != [('te[76 chars]871a24fe8b0>), ('tests.test_config.dummy_tween[150 chars]b0>)]\nE       \nE       First differing element 0:\nE       ('tes[25 chars]n_factory2', <function dummy_tween_factory2 at 0x7871a21baee0>)\nE       ('tes[25 chars]n_factory2', <function dummy_tween_factory2 at 0x7871a24fe8b0>)\nE       \nE         [('tests.test_config.dummy_tween_factory2',\nE       -   <function dummy_tween_factory2 at 0x7871a21baee0>),\nE       ?                                             ^ ---\nE       \nE       +   <function dummy_tween_factory2 at 0x7871a24fe8b0>),\nE       ?                                             ^^^^\nE       \nE          ('tests.test_config.dummy_tween_factory',\nE       -   <function dummy_tween_factory at 0x7871a21bae50>),\nE       ?                                            ^^^ ^\nE       \nE       +   <function dummy_tween_factory at 0x7871a24fe820>),\nE       ?                                            ^^ ^^\nE       \nE          ('pyramid.tweens.excview_tween_factory',\nE           <function excview_tween_factory at 0x7871a28308b0>)]\n\nr2e_tests/test_config/test_tweens.py:31: AssertionError\n_______ TestTweensConfiguratorMixin.test_add_tweens_names_with_underover _______\n\nself = <r2e_tests.test_config.test_tweens.TestTweensConfiguratorMixin testMethod=test_add_tweens_names_with_underover>\n\n    def test_add_tweens_names_with_underover(self):\n        from pyramid.interfaces import ITweens\n        from pyramid.tweens import excview_tween_factory\n        from pyramid.tweens import MAIN\n    \n        config = self._makeOne()\n        config.add_tween('tests.test_config.dummy_tween_factory', over=MAIN)\n        config.add_tween(\n            'tests.test_config.dummy_tween_factory2',\n            over=MAIN,\n            under='tests.test_config.dummy_tween_factory',\n        )\n        config.commit()\n        tweens = config.registry.queryUtility(ITweens)\n        implicit = tweens.implicit()\n>       self.assertEqual(\n            implicit,\n            [\n                (\n                    'pyramid.tweens.excview_tween_factory',\n                    excview_tween_factory,\n                ),\n                ('tests.test_config.dummy_tween_factory', dummy_tween_factory),\n                (\n                    'tests.test_config.dummy_tween_factory2',\n                    dummy_tween_factory2,\n                ),\n            ],\n        )\nE       AssertionError: Lists differ: [('py[168 chars]871a21bae50>), ('tests.test_config.dummy_tween[58 chars]e0>)] != [('py[168 chars]871a24fe820>), ('tests.test_config.dummy_tween[58 chars]b0>)]\nE       \nE       First differing element 1:\nE       ('tes[23 chars]een_factory', <function dummy_tween_factory at 0x7871a21bae50>)\nE       ('tes[23 chars]een_factory', <function dummy_tween_factory at 0x7871a24fe820>)\nE       \nE         [('pyramid.tweens.excview_tween_factory',\nE           <function excview_tween_factory at 0x7871a28308b0>),\nE          ('tests.test_config.dummy_tween_factory',\nE       -   <function dummy_tween_factory at 0x7871a21bae50>),\nE       ?                                            ^^^ ^\nE       \nE       +   <function dummy_tween_factory at 0x7871a24fe820>),\nE       ?                                            ^^ ^^\nE       \nE          ('tests.test_config.dummy_tween_factory2',\nE       -   <function dummy_tween_factory2 at 0x7871a21baee0>)]\nE       ?                                             ^ ---\nE       \nE       +   <function dummy_tween_factory2 at 0x7871a24fe8b0>)]\nE       ?                                             ^^^^\n\nr2e_tests/test_config/test_tweens.py:61: AssertionError\n____ TestViewsConfigurationMixin.test_add_exception_view_with_view_defaults ____\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_exception_view_with_view_defaults>\n\n    def test_add_exception_view_with_view_defaults(self):\n        from pyramid.renderers import null_renderer\n        from pyramid.exceptions import PredicateMismatch\n        from zope.interface import directlyProvides\n        from zope.interface import implementedBy\n    \n        class view:\n            __view_defaults__ = {'containment': 'tests.test_config.IDummy'}\n    \n            def __init__(self, request):\n                pass\n    \n            def __call__(self):\n                return 'OK'\n    \n        config = self._makeOne(autocommit=True)\n        config.add_exception_view(\n            view=view, context=Exception, renderer=null_renderer\n        )\n        wrapper = self._getViewCallable(\n            config, exc_iface=implementedBy(Exception)\n        )\n        context = DummyContext()\n        directlyProvides(context, IDummy)\n        request = self._makeRequest(config)\n>       self.assertEqual(wrapper(context, request), 'OK')\n\nr2e_tests/test_config/test_views.py:2375: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nsrc/pyramid/config/views.py:170: in attr_view\n    return view(context, request)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = <r2e_tests.test_config.test_views.DummyContext object at 0x7871a1c0b730>\nrequest = <r2e_tests.test_config.test_views.DummyRequest object at 0x7871a1c128b0>\n\n    def predicate_wrapper(context, request):\n        for predicate in preds:\n            if not predicate(context, request):\n                view_name = getattr(view, '__name__', view)\n>               raise PredicateMismatch(\n                    'predicate mismatch for view %s (%s)'\n                    % (view_name, predicate.text())\n                )\nE               pyramid.exceptions.PredicateMismatch: predicate mismatch for view view (containment = tests.test_config.IDummy)\n\nsrc/pyramid/config/views.py:192: PredicateMismatch\n____ TestViewsConfigurationMixin.test_add_forbidden_view_with_view_defaults ____\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_forbidden_view_with_view_defaults>\n\n    def test_add_forbidden_view_with_view_defaults(self):\n        from pyramid.interfaces import IRequest\n        from pyramid.renderers import null_renderer\n        from pyramid.exceptions import PredicateMismatch\n        from pyramid.httpexceptions import HTTPForbidden\n        from zope.interface import directlyProvides\n        from zope.interface import implementedBy\n    \n        class view:\n            __view_defaults__ = {'containment': 'tests.test_config.IDummy'}\n    \n            def __init__(self, request):\n                pass\n    \n            def __call__(self):\n                return 'OK'\n    \n        config = self._makeOne(autocommit=True)\n        config.add_forbidden_view(view=view, renderer=null_renderer)\n        wrapper = self._getViewCallable(\n            config,\n            exc_iface=implementedBy(HTTPForbidden),\n            request_iface=IRequest,\n        )\n        context = DummyContext()\n        directlyProvides(context, IDummy)\n        request = self._makeRequest(config)\n>       self.assertEqual(wrapper(context, request), 'OK')\n\nr2e_tests/test_config/test_views.py:2600: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nsrc/pyramid/config/views.py:170: in attr_view\n    return view(context, request)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = <r2e_tests.test_config.test_views.DummyContext object at 0x7871a2028400>\nrequest = <r2e_tests.test_config.test_views.DummyRequest object at 0x7871a24c0910>\n\n    def predicate_wrapper(context, request):\n        for predicate in preds:\n            if not predicate(context, request):\n                view_name = getattr(view, '__name__', view)\n>               raise PredicateMismatch(\n                    'predicate mismatch for view %s (%s)'\n                    % (view_name, predicate.text())\n                )\nE               pyramid.exceptions.PredicateMismatch: predicate mismatch for view view (containment = tests.test_config.IDummy)\n\nsrc/pyramid/config/views.py:192: PredicateMismatch\n____ TestViewsConfigurationMixin.test_add_notfound_view_with_view_defaults _____\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_notfound_view_with_view_defaults>\n\n    def test_add_notfound_view_with_view_defaults(self):\n        from pyramid.interfaces import IRequest\n        from pyramid.renderers import null_renderer\n        from pyramid.exceptions import PredicateMismatch\n        from pyramid.httpexceptions import HTTPNotFound\n        from zope.interface import directlyProvides\n        from zope.interface import implementedBy\n    \n        class view:\n            __view_defaults__ = {'containment': 'tests.test_config.IDummy'}\n    \n            def __init__(self, request):\n                pass\n    \n            def __call__(self):\n                return 'OK'\n    \n        config = self._makeOne(autocommit=True)\n        config.add_notfound_view(view=view, renderer=null_renderer)\n        wrapper = self._getViewCallable(\n            config,\n            exc_iface=implementedBy(HTTPNotFound),\n            request_iface=IRequest,\n        )\n        context = DummyContext()\n        directlyProvides(context, IDummy)\n        request = self._makeRequest(config)\n>       self.assertEqual(wrapper(context, request), 'OK')\n\nr2e_tests/test_config/test_views.py:2764: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nsrc/pyramid/config/views.py:170: in attr_view\n    return view(context, request)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = <r2e_tests.test_config.test_views.DummyContext object at 0x7871a28e2670>\nrequest = <r2e_tests.test_config.test_views.DummyRequest object at 0x7871a1d0dfd0>\n\n    def predicate_wrapper(context, request):\n        for predicate in preds:\n            if not predicate(context, request):\n                view_name = getattr(view, '__name__', view)\n>               raise PredicateMismatch(\n                    'predicate mismatch for view %s (%s)'\n                    % (view_name, predicate.text())\n                )\nE               pyramid.exceptions.PredicateMismatch: predicate mismatch for view view (containment = tests.test_config.IDummy)\n\nsrc/pyramid/config/views.py:192: PredicateMismatch\n____ TestViewsConfigurationMixin.test_add_static_view_package_here_relative ____\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_static_view_package_here_relative>\n\n    def test_add_static_view_package_here_relative(self):\n        from pyramid.interfaces import IStaticURLInfo\n    \n        info = DummyStaticURLInfo()\n        config = self._makeOne(autocommit=True)\n        config.registry.registerUtility(info, IStaticURLInfo)\n        config.add_static_view('static', 'files')\n>       self.assertEqual(\n            info.added, [(config, 'static', 'tests.test_config:files', {})]\n        )\nE       AssertionError: Lists differ: [(<py[35 chars] 0x7871a1b00a00>, 'static', 'r2e_tests.test_config:files', {})] != [(<py[35 chars] 0x7871a1b00a00>, 'static', 'tests.test_config:files', {})]\nE       \nE       First differing element 0:\nE       (<pyr[33 chars]t 0x7871a1b00a00>, 'static', 'r2e_tests.test_config:files', {})\nE       (<pyr[33 chars]t 0x7871a1b00a00>, 'static', 'tests.test_config:files', {})\nE       \nE         [(<pyramid.config.Configurator object at 0x7871a1b00a00>,\nE           'static',\nE       -   'r2e_tests.test_config:files',\nE       ?    ----\nE       \nE       +   'tests.test_config:files',\nE           {})]\n\nr2e_tests/test_config/test_views.py:2483: AssertionError\n_______ TestViewsConfigurationMixin.test_add_view_context_as_dottedname ________\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_context_as_dottedname>\n\n    def test_add_view_context_as_dottedname(self):\n        from pyramid.renderers import null_renderer\n    \n        view = lambda *arg: 'OK'\n        config = self._makeOne(autocommit=True)\n        config.add_view(\n            context='tests.test_config.IDummy',\n            view=view,\n            renderer=null_renderer,\n        )\n        wrapper = self._getViewCallable(config, IDummy)\n>       self.assertEqual(wrapper, view)\nE       AssertionError: None != <function TestViewsConfigurationMixin.tes[64 chars]e670>\n\nr2e_tests/test_config/test_views.py:452: AssertionError\n_________ TestViewsConfigurationMixin.test_add_view_for__as_dottedname _________\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_for__as_dottedname>\n\n    def test_add_view_for__as_dottedname(self):\n        from pyramid.renderers import null_renderer\n    \n        view = lambda *arg: 'OK'\n        config = self._makeOne(autocommit=True)\n        config.add_view(\n            for_='tests.test_config.IDummy', view=view, renderer=null_renderer\n        )\n        wrapper = self._getViewCallable(config, IDummy)\n>       self.assertEqual(wrapper, view)\nE       AssertionError: None != <function TestViewsConfigurationMixin.tes[61 chars]a940>\n\nr2e_tests/test_config/test_views.py:463: AssertionError\n____ TestViewsConfigurationMixin.test_add_view_with_containment_dottedname _____\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_with_containment_dottedname>\n\n    def test_add_view_with_containment_dottedname(self):\n        from pyramid.renderers import null_renderer\n        from zope.interface import directlyProvides\n    \n        view = lambda *arg: 'OK'\n        config = self._makeOne(autocommit=True)\n        config.add_view(\n            view=view,\n            containment='tests.test_config.IDummy',\n            renderer=null_renderer,\n        )\n        wrapper = self._getViewCallable(config)\n        context = DummyContext()\n        directlyProvides(context, IDummy)\n>       self.assertEqual(wrapper(context, None), 'OK')\n\nr2e_tests/test_config/test_views.py:1863: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nsrc/pyramid/config/views.py:170: in attr_view\n    return view(context, request)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = <r2e_tests.test_config.test_views.DummyContext object at 0x7871a1dfba90>\nrequest = None\n\n    def predicate_wrapper(context, request):\n        for predicate in preds:\n            if not predicate(context, request):\n                view_name = getattr(view, '__name__', view)\n>               raise PredicateMismatch(\n                    'predicate mismatch for view %s (%s)'\n                    % (view_name, predicate.text())\n                )\nE               pyramid.exceptions.PredicateMismatch: predicate mismatch for view <lambda> (containment = tests.test_config.IDummy)\n\nsrc/pyramid/config/views.py:192: PredicateMismatch\n_______ TestViewsConfigurationMixin.test_add_view_with_template_renderer _______\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_with_template_renderer>\n\n    def test_add_view_with_template_renderer(self):\n        from tests import test_config\n        from pyramid.interfaces import ISettings\n    \n        class view:\n            def __init__(self, context, request):\n                self.request = request\n                self.context = context\n    \n            def __call__(self):\n                return {'a': '1'}\n    \n        config = self._makeOne(autocommit=True)\n        renderer = self._registerRenderer(config)\n        fixture = 'tests.test_config:files/minimal.txt'\n        config.introspection = False\n        config.add_view(view=view, renderer=fixture)\n        wrapper = self._getViewCallable(config)\n        request = self._makeRequest(config)\n        result = wrapper(None, request)\n        self.assertEqual(result.body, b'Hello!')\n        settings = config.registry.queryUtility(ISettings)\n        result = renderer.info\n        self.assertEqual(result.registry, config.registry)\n        self.assertEqual(result.type, '.txt')\n>       self.assertEqual(result.package, test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'tests.test_config' from '/home/gcpuser/bu[109 chars].py'>\n\nr2e_tests/test_config/test_views.py:1492: AssertionError\n_ TestViewsConfigurationMixin.test_add_view_with_template_renderer_no_callable _\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_with_template_renderer_no_callable>\n\n    def test_add_view_with_template_renderer_no_callable(self):\n        from tests import test_config\n        from pyramid.interfaces import ISettings\n    \n        config = self._makeOne(autocommit=True)\n        renderer = self._registerRenderer(config)\n        fixture = 'tests.test_config:files/minimal.txt'\n        config.introspection = False\n        config.add_view(view=None, renderer=fixture)\n        wrapper = self._getViewCallable(config)\n        request = self._makeRequest(config)\n        result = wrapper(None, request)\n        self.assertEqual(result.body, b'Hello!')\n        settings = config.registry.queryUtility(ISettings)\n        result = renderer.info\n        self.assertEqual(result.registry, config.registry)\n        self.assertEqual(result.type, '.txt')\n>       self.assertEqual(result.package, test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'tests.test_config' from '/home/gcpuser/bu[109 chars].py'>\n\nr2e_tests/test_config/test_views.py:1538: AssertionError\n_________ TestViewsConfigurationMixin.test_add_view_with_view_defaults _________\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_with_view_defaults>\n\n    def test_add_view_with_view_defaults(self):\n        from pyramid.renderers import null_renderer\n        from pyramid.exceptions import PredicateMismatch\n        from zope.interface import directlyProvides\n    \n        class view:\n            __view_defaults__ = {'containment': 'tests.test_config.IDummy'}\n    \n            def __init__(self, request):\n                pass\n    \n            def __call__(self):\n                return 'OK'\n    \n        config = self._makeOne(autocommit=True)\n        config.add_view(view=view, renderer=null_renderer)\n        wrapper = self._getViewCallable(config)\n        context = DummyContext()\n        directlyProvides(context, IDummy)\n        request = self._makeRequest(config)\n>       self.assertEqual(wrapper(context, request), 'OK')\n\nr2e_tests/test_config/test_views.py:2140: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nsrc/pyramid/config/views.py:170: in attr_view\n    return view(context, request)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = <r2e_tests.test_config.test_views.DummyContext object at 0x7871a24ab370>\nrequest = <r2e_tests.test_config.test_views.DummyRequest object at 0x7871a1e42ca0>\n\n    def predicate_wrapper(context, request):\n        for predicate in preds:\n            if not predicate(context, request):\n                view_name = getattr(view, '__name__', view)\n>               raise PredicateMismatch(\n                    'predicate mismatch for view %s (%s)'\n                    % (view_name, predicate.text())\n                )\nE               pyramid.exceptions.PredicateMismatch: predicate mismatch for view view (containment = tests.test_config.IDummy)\n\nsrc/pyramid/config/views.py:192: PredicateMismatch\n_ TestViewsConfigurationMixin.test_add_view_with_view_defaults_viewname_is_dottedname_kwarg _\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_with_view_defaults_viewname_is_dottedname_kwarg>\n\n    def test_add_view_with_view_defaults_viewname_is_dottedname_kwarg(self):\n        from pyramid.renderers import null_renderer\n        from pyramid.exceptions import PredicateMismatch\n        from zope.interface import directlyProvides\n    \n        config = self._makeOne(autocommit=True)\n        config.add_view(\n            view='tests.test_config.test_views.DummyViewDefaultsClass',\n            renderer=null_renderer,\n        )\n        wrapper = self._getViewCallable(config)\n        context = DummyContext()\n        directlyProvides(context, IDummy)\n        request = self._makeRequest(config)\n>       self.assertEqual(wrapper(context, request), 'OK')\n\nr2e_tests/test_config/test_views.py:2159: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nsrc/pyramid/config/views.py:170: in attr_view\n    return view(context, request)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = <r2e_tests.test_config.test_views.DummyContext object at 0x7871a25c7f10>\nrequest = <r2e_tests.test_config.test_views.DummyRequest object at 0x7871a2190ac0>\n\n    def predicate_wrapper(context, request):\n        for predicate in preds:\n            if not predicate(context, request):\n                view_name = getattr(view, '__name__', view)\n>               raise PredicateMismatch(\n                    'predicate mismatch for view %s (%s)'\n                    % (view_name, predicate.text())\n                )\nE               pyramid.exceptions.PredicateMismatch: predicate mismatch for view DummyViewDefaultsClass (containment = tests.test_config.IDummy)\n\nsrc/pyramid/config/views.py:192: PredicateMismatch\n_ TestViewsConfigurationMixin.test_add_view_with_view_defaults_viewname_is_dottedname_nonkwarg _\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_with_view_defaults_viewname_is_dottedname_nonkwarg>\n\n    def test_add_view_with_view_defaults_viewname_is_dottedname_nonkwarg(self):\n        from pyramid.renderers import null_renderer\n        from pyramid.exceptions import PredicateMismatch\n        from zope.interface import directlyProvides\n    \n        config = self._makeOne(autocommit=True)\n        config.add_view(\n            'tests.test_config.test_views.DummyViewDefaultsClass',\n            renderer=null_renderer,\n        )\n        wrapper = self._getViewCallable(config)\n        context = DummyContext()\n        directlyProvides(context, IDummy)\n        request = self._makeRequest(config)\n>       self.assertEqual(wrapper(context, request), 'OK')\n\nr2e_tests/test_config/test_views.py:2178: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nsrc/pyramid/config/views.py:170: in attr_view\n    return view(context, request)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = <r2e_tests.test_config.test_views.DummyContext object at 0x7871a1924f70>\nrequest = <r2e_tests.test_config.test_views.DummyRequest object at 0x7871a1912310>\n\n    def predicate_wrapper(context, request):\n        for predicate in preds:\n            if not predicate(context, request):\n                view_name = getattr(view, '__name__', view)\n>               raise PredicateMismatch(\n                    'predicate mismatch for view %s (%s)'\n                    % (view_name, predicate.text())\n                )\nE               pyramid.exceptions.PredicateMismatch: predicate mismatch for view DummyViewDefaultsClass (containment = tests.test_config.IDummy)\n\nsrc/pyramid/config/views.py:192: PredicateMismatch\n_________ TestStaticURLInfo.test_generate_url_cachebust_with_overrides _________\n\nself = <r2e_tests.test_config.test_views.TestStaticURLInfo testMethod=test_generate_url_cachebust_with_overrides>\n\n    def test_generate_url_cachebust_with_overrides(self):\n        config = testing.setUp()\n        try:\n            request = testing.DummyRequest()\n            config.add_static_view('static', 'path')\n            config.override_asset(\n                'tests.test_config:path/', 'tests.test_config:other_path/'\n            )\n    \n            def cb(val):\n                def cb_(request, subpath, kw):\n                    kw['_query'] = {'x': val}\n                    return subpath, kw\n    \n                return cb_\n    \n            config.add_cache_buster('path', cb('foo'))\n            result = request.static_url('path/foo.png')\n            self.assertEqual(result, 'http://example.com/static/foo.png?x=foo')\n            config.add_cache_buster('other_path', cb('bar'), explicit=True)\n            result = request.static_url('path/foo.png')\n>           self.assertEqual(result, 'http://example.com/static/foo.png?x=bar')\nE           AssertionError: 'http://example.com/static/foo.png?x=foo' != 'http://example.com/static/foo.png?x=bar'\nE           - http://example.com/static/foo.png?x=foo\nE           ?                                     ^^^\nE           + http://example.com/static/foo.png?x=bar\nE           ?                                     ^^^\n\nr2e_tests/test_config/test_views.py:3953: AssertionError\n___________________ Test_view_description.test_without_text ____________________\n\nself = <r2e_tests.test_config.test_views.Test_view_description testMethod=test_without_text>\n\n    def test_without_text(self):\n        def view():  # pragma: no cover\n            pass\n    \n        result = self._callFUT(view)\n>       self.assertEqual(result, 'function tests.test_config.test_views.view')\nE       AssertionError: 'function r2e_tests.test_config.test_views.view' != 'function tests.test_config.test_views.view'\nE       - function r2e_tests.test_config.test_views.view\nE       ?          ----\nE       + function tests.test_config.test_views.view\n\nr2e_tests/test_config/test_views.py:4157: AssertionError\n______________________ TestPRoutesCommand.test_class_view ______________________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_class_view>\n\n    def test_class_view(self):\n        from pyramid.renderers import null_renderer as nr\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b')\n        config.add_view(\n            route_name='foo',\n            view=dummy.DummyView,\n            attr='view',\n            renderer=nr,\n            request_method='POST',\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = dummy.DummyBootstrap(registry=config.registry)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo',\n            '/a/b',\n            'tests.test_scripts.dummy.DummyView.view',\n            'POST',\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.dummy.DummyView.view', 'POST'] != ['foo', '/a/b', 'tests.test_scripts.dummy.DummyView.view', 'POST']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.dummy.DummyView.view'\nE       'tests.test_scripts.dummy.DummyView.view'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.dummy.DummyView.view', 'POST']\nE       ?                  ----\nE       \nE       + ['foo', '/a/b', 'tests.test_scripts.dummy.DummyView.view', 'POST']\n\nr2e_tests/test_scripts/test_proutes.py:248: AssertionError\n_________ TestPRoutesCommand.test_one_route_all_methods_view_only_post _________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_one_route_all_methods_view_only_post>\n\n    def test_one_route_all_methods_view_only_post(self):\n        from pyramid.renderers import null_renderer as nr\n    \n        def view1(context, request):  # pragma: no cover\n            return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b')\n        config.add_view(\n            route_name='foo', view=view1, renderer=nr, request_method='POST'\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = dummy.DummyBootstrap(registry=config.registry)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo',\n            '/a/b',\n            'tests.test_scripts.test_proutes.view1',\n            'POST',\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST'] != ['foo', '/a/b', 'tests.test_scripts.test_proutes.view1', 'POST']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST']\nE       ?                  ----\nE       \nE       + ['foo', '/a/b', 'tests.test_scripts.test_proutes.view1', 'POST']\n\nr2e_tests/test_scripts/test_proutes.py:361: AssertionError\n_________ TestPRoutesCommand.test_one_route_only_post_view_all_methods _________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_one_route_only_post_view_all_methods>\n\n    def test_one_route_only_post_view_all_methods(self):\n        from pyramid.renderers import null_renderer as nr\n    \n        def view1(context, request):  # pragma: no cover\n            return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b', request_method='POST')\n        config.add_view(route_name='foo', view=view1, renderer=nr)\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = dummy.DummyBootstrap(registry=config.registry)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo',\n            '/a/b',\n            'tests.test_scripts.test_proutes.view1',\n            'POST',\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST'] != ['foo', '/a/b', 'tests.test_scripts.test_proutes.view1', 'POST']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST']\nE       ?                  ----\nE       \nE       + ['foo', '/a/b', 'tests.test_scripts.test_proutes.view1', 'POST']\n\nr2e_tests/test_scripts/test_proutes.py:387: AssertionError\n________ TestPRoutesCommand.test_one_route_only_post_view_post_and_get _________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_one_route_only_post_view_post_and_get>\n\n    def test_one_route_only_post_view_post_and_get(self):\n        from pyramid.renderers import null_renderer as nr\n    \n        def view1(context, request):  # pragma: no cover\n            return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b', request_method='POST')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method=('POST', 'GET'),\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = dummy.DummyBootstrap(registry=config.registry)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo',\n            '/a/b',\n            'tests.test_scripts.test_proutes.view1',\n            'POST',\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST'] != ['foo', '/a/b', 'tests.test_scripts.test_proutes.view1', 'POST']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST']\nE       ?                  ----\nE       \nE       + ['foo', '/a/b', 'tests.test_scripts.test_proutes.view1', 'POST']\n\nr2e_tests/test_scripts/test_proutes.py:418: AssertionError\n_____ TestPRoutesCommand.test_one_route_with_long_name_one_view_registered _____\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_one_route_with_long_name_one_view_registered>\n\n    def test_one_route_with_long_name_one_view_registered(self):\n        from zope.interface import Interface\n        from pyramid.interfaces import IRouteRequest\n        from pyramid.interfaces import IViewClassifier\n        from pyramid.interfaces import IView\n    \n        registry = self._makeRegistry()\n    \n        def view():  # pragma: no cover\n            pass\n    \n        class IMyRoute(Interface):\n            pass\n    \n        registry.registerAdapter(\n            view, (IViewClassifier, IMyRoute, Interface), IView, ''\n        )\n    \n        registry.registerUtility(\n            IMyRoute, IRouteRequest, name='very_long_name_123'\n        )\n    \n        command = self._makeOne()\n        route = dummy.DummyRoute(\n            'very_long_name_123', '/and_very_long_pattern_as_well'\n        )\n        mapper = dummy.DummyMapper(route)\n        command._get_mapper = lambda *arg: mapper\n        L = []\n        command.out = L.append\n        command.bootstrap = dummy.DummyBootstrap(registry=registry)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()[:3]\n>       self.assertEqual(\n            compare_to,\n            [\n                'very_long_name_123',\n                '/and_very_long_pattern_as_well',\n                'tests.test_scripts.test_proutes.view',\n            ],\n        )\nE       AssertionError: Lists differ: ['ver[32 chars]g_pattern_as_well', 'r2e_tests.test_scripts.test_proutes.view'] != ['ver[32 chars]g_pattern_as_well', 'tests.test_scripts.test_proutes.view']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view'\nE       'tests.test_scripts.test_proutes.view'\nE       \nE         ['very_long_name_123',\nE          '/and_very_long_pattern_as_well',\nE       -  'r2e_tests.test_scripts.test_proutes.view']\nE       ?   ----\nE       \nE       +  'tests.test_scripts.test_proutes.view']\n\nr2e_tests/test_scripts/test_proutes.py:212: AssertionError\n______ TestPRoutesCommand.test_route_is_get_view_request_method_not_post _______\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_route_is_get_view_request_method_not_post>\n\n    def test_route_is_get_view_request_method_not_post(self):\n        from pyramid.renderers import null_renderer as nr\n        from pyramid.config import not_\n    \n        def view1(context, request):  # pragma: no cover\n            return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b', request_method='GET')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method=not_('POST'),\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = dummy.DummyBootstrap(registry=config.registry)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo',\n            '/a/b',\n            'tests.test_scripts.test_proutes.view1',\n            'GET',\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'GET'] != ['foo', '/a/b', 'tests.test_scripts.test_proutes.view1', 'GET']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'GET']\nE       ?                  ----\nE       \nE       + ['foo', '/a/b', 'tests.test_scripts.test_proutes.view1', 'GET']\n\nr2e_tests/test_scripts/test_proutes.py:558: AssertionError\n____________ TestPRoutesCommand.test_route_request_method_mismatch _____________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_route_request_method_mismatch>\n\n    def test_route_request_method_mismatch(self):\n        from pyramid.renderers import null_renderer as nr\n    \n        def view1(context, request):  # pragma: no cover\n            return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b', request_method='POST')\n        config.add_view(\n            route_name='foo', view=view1, renderer=nr, request_method='GET'\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = dummy.DummyBootstrap(registry=config.registry)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo',\n            '/a/b',\n            'tests.test_scripts.test_proutes.view1',\n            '<route',\n            'mismatch>',\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1[20 chars]ch>'] != ['foo', '/a/b', 'tests.test_scripts.test_proutes.view1', '[16 chars]ch>']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'tests.test_scripts.test_proutes.view1'\nE       \nE       + ['foo', '/a/b', 'tests.test_scripts.test_proutes.view1', '<route', 'mismatch>']\nE       - ['foo',\nE       -  '/a/b',\nE       -  'r2e_tests.test_scripts.test_proutes.view1',\nE       -  '<route',\nE       -  'mismatch>']\n\nr2e_tests/test_scripts/test_proutes.py:447: AssertionError\n__________________ TestPRoutesCommand.test_route_static_views __________________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_route_static_views>\n\n    def test_route_static_views(self):\n        config = self._makeConfig(autocommit=True)\n        config.add_static_view('static', 'static', cache_max_age=3600)\n        path2 = os.path.normpath('/var/www/static')\n        config.add_static_view(name='static2', path=path2)\n        config.add_static_view(\n            name='pyramid_scaffold',\n            path='pyramid:scaffolds/starter/+package+/static',\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = dummy.DummyBootstrap(registry=config.registry)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 5)\n    \n        expected = [\n            [\n                '__static/',\n                '/static/*subpath',\n                'tests.test_scripts:static/',\n                '*',\n            ],\n            ['__static2/', '/static2/*subpath', path2 + os.sep, '*'],\n            [\n                '__pyramid_scaffold/',\n                '/pyramid_scaffold/*subpath',\n                'pyramid:scaffolds/starter/+package+/static/',\n                '*',\n            ],\n        ]\n    \n        for index, line in enumerate(L[2:]):\n            data = line.split()\n>           self.assertEqual(data, expected[index])\nE           AssertionError: Lists differ: ['__static/', '/static/*subpath', 'r2e_tests.test_scripts:static/', '*'] != ['__static/', '/static/*subpath', 'tests.test_scripts:static/', '*']\nE           \nE           First differing element 2:\nE           'r2e_tests.test_scripts:static/'\nE           'tests.test_scripts:static/'\nE           \nE           - ['__static/', '/static/*subpath', 'r2e_tests.test_scripts:static/', '*']\nE           ?                                    ----\nE           \nE           + ['__static/', '/static/*subpath', 'tests.test_scripts:static/', '*']\n\nr2e_tests/test_scripts/test_proutes.py:485: AssertionError\n__________ TestPRoutesCommand.test_single_route_multiview_registered ___________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_single_route_multiview_registered>\n\n    def test_single_route_multiview_registered(self):\n        from zope.interface import Interface\n        from pyramid.interfaces import IRouteRequest\n        from pyramid.interfaces import IViewClassifier\n        from pyramid.interfaces import IMultiView\n    \n        registry = self._makeRegistry()\n    \n        def view():  # pragma: no cover\n            pass\n    \n        class IMyRoute(Interface):\n            pass\n    \n        multiview1 = dummy.DummyMultiView(\n            view, context='context', view_name='a1'\n        )\n    \n        registry.registerAdapter(\n            multiview1, (IViewClassifier, IMyRoute, Interface), IMultiView, ''\n        )\n        registry.registerUtility(IMyRoute, IRouteRequest, name='a')\n        command = self._makeOne()\n        route = dummy.DummyRoute('a', '/a')\n        mapper = dummy.DummyMapper(route)\n        command._get_mapper = lambda *arg: mapper\n        L = []\n        command.out = L.append\n        command.bootstrap = dummy.DummyBootstrap(registry=registry)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()[:3]\n        view_module = 'tests.test_scripts.dummy'\n        view_str = '<tests.test_scripts.dummy.DummyMultiView'\n        final = '%s.%s' % (view_module, view_str)\n    \n>       self.assertEqual(compare_to, ['a', '/a', final])\nE       AssertionError: Lists differ: ['a', '/a', 'r2e_tests.test_scripts.dummy.<r2e_tests.t[29 chars]iew'] != ['a', '/a', 'tests.test_scripts.dummy.<tests.test_scri[21 chars]iew']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.dummy.<r2e_tests.test_scripts.dummy.DummyMultiView'\nE       'tests.test_scripts.dummy.<tests.test_scripts.dummy.DummyMultiView'\nE       \nE       - ['a',\nE       -  '/a',\nE       -  'r2e_tests.test_scripts.dummy.<r2e_tests.test_scripts.dummy.DummyMultiView']\nE       ? ^ ^^^^                          ----\nE       \nE       + ['a', '/a', 'tests.test_scripts.dummy.<tests.test_scripts.dummy.DummyMultiView']\nE       ? ^ ^^^^^^^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:324: AssertionError\n___________ TestPRoutesCommand.test_single_route_one_view_registered ___________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_single_route_one_view_registered>\n\n    def test_single_route_one_view_registered(self):\n        from zope.interface import Interface\n        from pyramid.interfaces import IRouteRequest\n        from pyramid.interfaces import IViewClassifier\n        from pyramid.interfaces import IView\n    \n        registry = self._makeRegistry()\n    \n        def view():  # pragma: no cover\n            pass\n    \n        class IMyRoute(Interface):\n            pass\n    \n        registry.registerAdapter(\n            view, (IViewClassifier, IMyRoute, Interface), IView, ''\n        )\n        registry.registerUtility(IMyRoute, IRouteRequest, name='a')\n        command = self._makeOne()\n        route = dummy.DummyRoute('a', '/a')\n        mapper = dummy.DummyMapper(route)\n        command._get_mapper = lambda *arg: mapper\n        L = []\n        command.out = L.append\n        command.bootstrap = dummy.DummyBootstrap(registry=registry)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()[:3]\n>       self.assertEqual(\n            compare_to, ['a', '/a', 'tests.test_scripts.test_proutes.view']\n        )\nE       AssertionError: Lists differ: ['a', '/a', 'r2e_tests.test_scripts.test_proutes.view'] != ['a', '/a', 'tests.test_scripts.test_proutes.view']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view'\nE       'tests.test_scripts.test_proutes.view'\nE       \nE       - ['a', '/a', 'r2e_tests.test_scripts.test_proutes.view']\nE       ?              ----\nE       \nE       + ['a', '/a', 'tests.test_scripts.test_proutes.view']\n\nr2e_tests/test_scripts/test_proutes.py:173: AssertionError\n______________________ TestPRoutesCommand.test_view_glob _______________________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_view_glob>\n\n    def test_view_glob(self):\n        from pyramid.renderers import null_renderer as nr\n        from pyramid.config import not_\n    \n        def view1(context, request):  # pragma: no cover\n            return 'view1'\n    \n        def view2(context, request):  # pragma: no cover\n            return 'view2'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method=not_('POST'),\n        )\n    \n        config.add_route('bar', '/b/a')\n        config.add_view(\n            route_name='bar',\n            view=view2,\n            renderer=nr,\n            request_method=not_('POST'),\n        )\n    \n        command = self._makeOne()\n        command.args.glob = '*foo*'\n    \n        L = []\n        command.out = L.append\n        command.bootstrap = dummy.DummyBootstrap(registry=config.registry)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo',\n            '/a/b',\n            'tests.test_scripts.test_proutes.view1',\n            '!POST,*',\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', '!POST,*'] != ['foo', '/a/b', 'tests.test_scripts.test_proutes.view1', '!POST,*']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', '!POST,*']\nE       ?                  ----\nE       \nE       + ['foo', '/a/b', 'tests.test_scripts.test_proutes.view1', '!POST,*']\n\nr2e_tests/test_scripts/test_proutes.py:635: AssertionError\n_____________ TestPRoutesCommand.test_view_request_method_not_post _____________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_view_request_method_not_post>\n\n    def test_view_request_method_not_post(self):\n        from pyramid.renderers import null_renderer as nr\n        from pyramid.config import not_\n    \n        def view1(context, request):  # pragma: no cover\n            return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method=not_('POST'),\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = dummy.DummyBootstrap(registry=config.registry)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo',\n            '/a/b',\n            'tests.test_scripts.test_proutes.view1',\n            '!POST,*',\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', '!POST,*'] != ['foo', '/a/b', 'tests.test_scripts.test_proutes.view1', '!POST,*']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', '!POST,*']\nE       ?                  ----\nE       \nE       + ['foo', '/a/b', 'tests.test_scripts.test_proutes.view1', '!POST,*']\n\nr2e_tests/test_scripts/test_proutes.py:590: AssertionError\n_____________ TestPServeCommand.test_config_file_finds_watch_files _____________\n\nself = <r2e_tests.test_scripts.test_pserve.TestPServeCommand testMethod=test_config_file_finds_watch_files>\n\n    def test_config_file_finds_watch_files(self):\n        inst = self._makeOne('development.ini')\n        loader = self.loader('/base/path.ini')\n        loader.settings = {\n            'pserve': {'watch_files': 'foo\\n/baz\\ntests.test_scripts:*.py'}\n        }\n        inst.pserve_file_config(loader, global_conf={'a': '1'})\n        self.assertEqual(loader.calls[0]['defaults'], {'a': '1'})\n>       self.assertEqual(\n            inst.watch_files,\n            {\n                os.path.abspath('/base/foo'),\n                os.path.abspath('/baz'),\n                os.path.abspath(os.path.join(here, '*.py')),\n            },\n        )\nE       AssertionError: Items in the first set but not the second:\nE       '/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/tests/test_scripts/*.py'\nE       Items in the second set but not the first:\nE       '/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/test_scripts/*.py'\n\nr2e_tests/test_scripts/test_pserve.py:90: AssertionError\n____________ TestPViewsCommand.test_views_command_multi_view_nested ____________\n\nself = <r2e_tests.test_scripts.test_pviews.TestPViewsCommand testMethod=test_views_command_multi_view_nested>\n\n    def test_views_command_multi_view_nested(self):\n        from pyramid.registry import Registry\n    \n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n        view1 = dummy.DummyView(context='context', view_name='a1')\n        view1.__name__ = 'view1'\n        view1.__view_attr__ = 'call'\n        multiview1 = dummy.DummyMultiView(\n            view1, context='context', view_name='a1'\n        )\n        multiview2 = dummy.DummyMultiView(\n            multiview1, context='context', view_name='a'\n        )\n        command._find_view = lambda arg1: multiview2\n        command.args.config_uri = '/foo/bar/myapp.ini#myapp'\n        command.args.url = '/a'\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(L[1], 'URL = /a')\n        self.assertEqual(L[3], '    context: context')\n        self.assertEqual(L[4], '    view name: a')\n>       self.assertEqual(L[8], '    tests.test_scripts.dummy.DummyMultiView')\nE       AssertionError: '    r2e_tests.test_scripts.dummy.DummyMultiView' != '    tests.test_scripts.dummy.DummyMultiView'\nE       -     r2e_tests.test_scripts.dummy.DummyMultiView\nE       ?     ----\nE       +     tests.test_scripts.dummy.DummyMultiView\n\nr2e_tests/test_scripts/test_pviews.py:482: AssertionError\n________________ TestPViewsCommand.test_views_command_multiview ________________\n\nself = <r2e_tests.test_scripts.test_pviews.TestPViewsCommand testMethod=test_views_command_multiview>\n\n    def test_views_command_multiview(self):\n        from pyramid.registry import Registry\n    \n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n        view = dummy.DummyView(context='context')\n        view.__name__ = 'view'\n        view.__view_attr__ = 'call'\n        multiview = dummy.DummyMultiView(\n            view, context='context', view_name='a'\n        )\n        command._find_view = lambda arg1: multiview\n        command.args.config_uri = '/foo/bar/myapp.ini#myapp'\n        command.args.url = '/a'\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(L[1], 'URL = /a')\n        self.assertEqual(L[3], '    context: context')\n        self.assertEqual(L[4], '    view name: a')\n>       self.assertEqual(L[8], '    tests.test_scripts.dummy.view.call')\nE       AssertionError: '    r2e_tests.test_scripts.dummy.view.call' != '    tests.test_scripts.dummy.view.call'\nE       -     r2e_tests.test_scripts.dummy.view.call\nE       ?     ----\nE       +     tests.test_scripts.dummy.view.call\n\nr2e_tests/test_scripts/test_pviews.py:538: AssertionError\n________ TestPViewsCommand.test_views_command_multiview_with_permission ________\n\nself = <r2e_tests.test_scripts.test_pviews.TestPViewsCommand testMethod=test_views_command_multiview_with_permission>\n\n    def test_views_command_multiview_with_permission(self):\n        from pyramid.registry import Registry\n    \n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n        view = dummy.DummyView(context='context')\n        view.__name__ = 'view'\n        view.__view_attr__ = 'call'\n        view.__permission__ = 'test'\n        multiview = dummy.DummyMultiView(\n            view, context='context', view_name='a'\n        )\n        command._find_view = lambda arg1: multiview\n        command.args.config_uri = '/foo/bar/myapp.ini#myapp'\n        command.args.url = '/a'\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(L[1], 'URL = /a')\n        self.assertEqual(L[3], '    context: context')\n        self.assertEqual(L[4], '    view name: a')\n>       self.assertEqual(L[8], '    tests.test_scripts.dummy.view.call')\nE       AssertionError: '    r2e_tests.test_scripts.dummy.view.call' != '    tests.test_scripts.dummy.view.call'\nE       -     r2e_tests.test_scripts.dummy.view.call\nE       ?     ----\nE       +     tests.test_scripts.dummy.view.call\n\nr2e_tests/test_scripts/test_pviews.py:562: AssertionError\n________ TestPViewsCommand.test_views_command_multiview_with_predicates ________\n\nself = <r2e_tests.test_scripts.test_pviews.TestPViewsCommand testMethod=test_views_command_multiview_with_predicates>\n\n    def test_views_command_multiview_with_predicates(self):\n        from pyramid.registry import Registry\n    \n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n    \n        def predicate():  # pragma: no cover\n            pass\n    \n        predicate.text = lambda *arg: \"predicate = x\"\n        view = dummy.DummyView(context='context')\n        view.__name__ = 'view'\n        view.__view_attr__ = 'call'\n        view.__predicates__ = [predicate]\n        multiview = dummy.DummyMultiView(\n            view, context='context', view_name='a'\n        )\n        command._find_view = lambda arg1: multiview\n        command.args.config_uri = '/foo/bar/myapp.ini#myapp'\n        command.args.url = '/a'\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(L[1], 'URL = /a')\n        self.assertEqual(L[3], '    context: context')\n        self.assertEqual(L[4], '    view name: a')\n>       self.assertEqual(L[8], '    tests.test_scripts.dummy.view.call')\nE       AssertionError: '    r2e_tests.test_scripts.dummy.view.call' != '    tests.test_scripts.dummy.view.call'\nE       -     r2e_tests.test_scripts.dummy.view.call\nE       ?     ----\nE       +     tests.test_scripts.dummy.view.call\n\nr2e_tests/test_scripts/test_pviews.py:592: AssertionError\n_____ TestPViewsCommand.test_views_command_single_view_function_traversal ______\n\nself = <r2e_tests.test_scripts.test_pviews.TestPViewsCommand testMethod=test_views_command_single_view_function_traversal>\n\n    def test_views_command_single_view_function_traversal(self):\n        from pyramid.registry import Registry\n    \n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n    \n        def view():  # pragma: no cover\n            pass\n    \n        view.__request_attrs__ = {'context': 'context', 'view_name': 'a'}\n        command._find_view = lambda arg1: view\n        command.args.config_uri = '/foo/bar/myapp.ini#myapp'\n        command.args.url = '/a'\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(L[1], 'URL = /a')\n        self.assertEqual(L[3], '    context: context')\n        self.assertEqual(L[4], '    view name: a')\n>       self.assertEqual(L[8], '    tests.test_scripts.test_pviews.view')\nE       AssertionError: '    r2e_tests.test_scripts.test_pviews.view' != '    tests.test_scripts.test_pviews.view'\nE       -     r2e_tests.test_scripts.test_pviews.view\nE       ?     ----\nE       +     tests.test_scripts.test_pviews.view\n\nr2e_tests/test_scripts/test_pviews.py:385: AssertionError\n____________ TestPViewsCommand.test_views_command_single_view_route ____________\n\nself = <r2e_tests.test_scripts.test_pviews.TestPViewsCommand testMethod=test_views_command_single_view_route>\n\n    def test_views_command_single_view_route(self):\n        from pyramid.registry import Registry\n    \n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n        route = dummy.DummyRoute('a', '/a', matchdict={})\n        view = dummy.DummyView(\n            context='context', view_name='a', matched_route=route, subpath=''\n        )\n        command._find_view = lambda arg1: view\n        command.args.config_uri = '/foo/bar/myapp.ini#myapp'\n        command.args.url = '/a'\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(L[1], 'URL = /a')\n        self.assertEqual(L[3], '    context: context')\n        self.assertEqual(L[4], '    view name: a')\n        self.assertEqual(L[6], '    Route:')\n        self.assertEqual(L[8], '    route name: a')\n        self.assertEqual(L[9], '    route pattern: /a')\n        self.assertEqual(L[10], '    route path: /a')\n        self.assertEqual(L[11], '    subpath: ')\n>       self.assertEqual(L[15], '        tests.test_scripts.dummy.DummyView')\nE       AssertionError: '        r2e_tests.test_scripts.dummy.DummyView' != '        tests.test_scripts.dummy.DummyView'\nE       -         r2e_tests.test_scripts.dummy.DummyView\nE       ?         ----\nE       +         tests.test_scripts.dummy.DummyView\n\nr2e_tests/test_scripts/test_pviews.py:456: AssertionError\n_ TestPViewsCommand.test_views_command_single_view_route_with_route_predicates _\n\nself = <r2e_tests.test_scripts.test_pviews.TestPViewsCommand testMethod=test_views_command_single_view_route_with_route_predicates>\n\n    def test_views_command_single_view_route_with_route_predicates(self):\n        from pyramid.registry import Registry\n    \n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n    \n        def predicate():  # pragma: no cover\n            pass\n    \n        predicate.text = lambda *arg: \"predicate = x\"\n        route = dummy.DummyRoute('a', '/a', matchdict={}, predicate=predicate)\n        view = dummy.DummyView(\n            context='context', view_name='a', matched_route=route, subpath=''\n        )\n        command._find_view = lambda arg1: view\n        command.args.config_uri = '/foo/bar/myapp.ini#myapp'\n        command.args.url = '/a'\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(L[1], 'URL = /a')\n        self.assertEqual(L[3], '    context: context')\n        self.assertEqual(L[4], '    view name: a')\n        self.assertEqual(L[6], '    Route:')\n        self.assertEqual(L[8], '    route name: a')\n        self.assertEqual(L[9], '    route pattern: /a')\n        self.assertEqual(L[10], '    route path: /a')\n        self.assertEqual(L[11], '    subpath: ')\n        self.assertEqual(L[12], '    route predicates (predicate = x)')\n>       self.assertEqual(L[16], '        tests.test_scripts.dummy.DummyView')\nE       AssertionError: '        r2e_tests.test_scripts.dummy.DummyView' != '        tests.test_scripts.dummy.DummyView'\nE       -         r2e_tests.test_scripts.dummy.DummyView\nE       ?         ----\nE       +         tests.test_scripts.dummy.DummyView\n\nr2e_tests/test_scripts/test_pviews.py:515: AssertionError\n__________ TestPViewsCommand.test_views_command_single_view_traversal __________\n\nself = <r2e_tests.test_scripts.test_pviews.TestPViewsCommand testMethod=test_views_command_single_view_traversal>\n\n    def test_views_command_single_view_traversal(self):\n        from pyramid.registry import Registry\n    \n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n        view = dummy.DummyView(context='context', view_name='a')\n        command._find_view = lambda arg1: view\n        command.args.config_uri = '/foo/bar/myapp.ini#myapp'\n        command.args.url = '/a'\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(L[1], 'URL = /a')\n        self.assertEqual(L[3], '    context: context')\n        self.assertEqual(L[4], '    view name: a')\n>       self.assertEqual(L[8], '    tests.test_scripts.dummy.DummyView')\nE       AssertionError: '    r2e_tests.test_scripts.dummy.DummyView' != '    tests.test_scripts.dummy.DummyView'\nE       -     r2e_tests.test_scripts.dummy.DummyView\nE       ?     ----\nE       +     tests.test_scripts.dummy.DummyView\n\nr2e_tests/test_scripts/test_pviews.py:363: AssertionError\n__ TestPViewsCommand.test_views_command_single_view_traversal_with_permission __\n\nself = <r2e_tests.test_scripts.test_pviews.TestPViewsCommand testMethod=test_views_command_single_view_traversal_with_permission>\n\n    def test_views_command_single_view_traversal_with_permission(self):\n        from pyramid.registry import Registry\n    \n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n        view = dummy.DummyView(context='context', view_name='a')\n        view.__permission__ = 'test'\n        command._find_view = lambda arg1: view\n        command.args.config_uri = '/foo/bar/myapp.ini#myapp'\n        command.args.url = '/a'\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(L[1], 'URL = /a')\n        self.assertEqual(L[3], '    context: context')\n        self.assertEqual(L[4], '    view name: a')\n>       self.assertEqual(L[8], '    tests.test_scripts.dummy.DummyView')\nE       AssertionError: '    r2e_tests.test_scripts.dummy.DummyView' != '    tests.test_scripts.dummy.DummyView'\nE       -     r2e_tests.test_scripts.dummy.DummyView\nE       ?     ----\nE       +     tests.test_scripts.dummy.DummyView\n\nr2e_tests/test_scripts/test_pviews.py:404: AssertionError\n__ TestPViewsCommand.test_views_command_single_view_traversal_with_predicates __\n\nself = <r2e_tests.test_scripts.test_pviews.TestPViewsCommand testMethod=test_views_command_single_view_traversal_with_predicates>\n\n    def test_views_command_single_view_traversal_with_predicates(self):\n        from pyramid.registry import Registry\n    \n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n    \n        def predicate():  # pragma: no cover\n            pass\n    \n        predicate.text = lambda *arg: \"predicate = x\"\n        view = dummy.DummyView(context='context', view_name='a')\n        view.__predicates__ = [predicate]\n        command._find_view = lambda arg1: view\n        command.args.config_uri = '/foo/bar/myapp.ini#myapp'\n        command.args.url = '/a'\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(L[1], 'URL = /a')\n        self.assertEqual(L[3], '    context: context')\n        self.assertEqual(L[4], '    view name: a')\n>       self.assertEqual(L[8], '    tests.test_scripts.dummy.DummyView')\nE       AssertionError: '    r2e_tests.test_scripts.dummy.DummyView' != '    tests.test_scripts.dummy.DummyView'\nE       -     r2e_tests.test_scripts.dummy.DummyView\nE       ?     ----\nE       +     tests.test_scripts.dummy.DummyView\n\nr2e_tests/test_scripts/test_pviews.py:429: AssertionError\n=============================== warnings summary ===============================\nsrc/pyramid/asset.py:2\n  /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/src/pyramid/asset.py:2: DeprecationWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html\n    import pkg_resources\n\n.venv/lib/python3.8/site-packages/pkg_resources/__init__.py:3154\n  /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/.venv/lib/python3.8/site-packages/pkg_resources/__init__.py:3154: DeprecationWarning: Deprecated call to `pkg_resources.declare_namespace('paste')`.\n  Implementing implicit namespace packages (as specified in PEP 420) is preferred to `pkg_resources.declare_namespace`. See https://setuptools.pypa.io/en/latest/references/keywords.html#keyword-namespace-packages\n    declare_namespace(pkg)\n\n.venv/lib/python3.8/site-packages/pkg_resources/__init__.py:3154\n.venv/lib/python3.8/site-packages/pkg_resources/__init__.py:3154\n.venv/lib/python3.8/site-packages/pkg_resources/__init__.py:3154\n.venv/lib/python3.8/site-packages/pkg_resources/__init__.py:3154\n.venv/lib/python3.8/site-packages/pkg_resources/__init__.py:3154\n  /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/.venv/lib/python3.8/site-packages/pkg_resources/__init__.py:3154: DeprecationWarning: Deprecated call to `pkg_resources.declare_namespace('zope')`.\n  Implementing implicit namespace packages (as specified in PEP 420) is preferred to `pkg_resources.declare_namespace`. See https://setuptools.pypa.io/en/latest/references/keywords.html#keyword-namespace-packages\n    declare_namespace(pkg)\n\nr2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_authentication_policy\nr2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_authorization_policy_only\nr2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authentication_policy\nr2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authentication_policy_dottedname\nr2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authorization_policy_dottedname\nr2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authorization_policy_only\nr2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_no_default_permission_no_explicit_permission\n  /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/src/pyramid/config/__init__.py:405: DeprecationWarning: Authentication and authorization policies have been deprecated in favor of security policies.  See \"Upgrading Authentication/Authorization\" in \"What's New in Pyramid 2.0\" of the documentation for more information.\n    self.set_authorization_policy(authorization_policy)\n\nr2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_authentication_policy\nr2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authentication_policy\nr2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authentication_policy_dottedname\nr2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authorization_policy_dottedname\nr2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_no_default_permission_no_explicit_permission\n  /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/src/pyramid/config/__init__.py:408: DeprecationWarning: Authentication and authorization policies have been deprecated in favor of security policies.  See \"Upgrading Authentication/Authorization\" in \"What's New in Pyramid 2.0\" of the documentation for more information.\n    self.set_authentication_policy(authentication_policy)\n\nr2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authentication_policy_no_authz_policy\n  /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/test_config/test_security.py:38: DeprecationWarning: Authentication and authorization policies have been deprecated in favor of security policies.  See \"Upgrading Authentication/Authorization\" in \"What's New in Pyramid 2.0\" of the documentation for more information.\n    config.set_authentication_policy(policy)\n\nr2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authentication_policy_no_authz_policy_autocommit\n  /home/gcpuser/.local/share/uv/python/cpython-3.8.20-linux-x86_64-gnu/lib/python3.8/unittest/case.py:202: DeprecationWarning: Authentication and authorization policies have been deprecated in favor of security policies.  See \"Upgrading Authentication/Authorization\" in \"What's New in Pyramid 2.0\" of the documentation for more information.\n    callable_obj(*args, **kwargs)\n\nr2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authentication_policy_with_authz_policy\n  /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/test_config/test_security.py:58: DeprecationWarning: Authentication and authorization policies have been deprecated in favor of security policies.  See \"Upgrading Authentication/Authorization\" in \"What's New in Pyramid 2.0\" of the documentation for more information.\n    config.set_authentication_policy(authn_policy)\n\nr2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authentication_policy_with_authz_policy_autocommit\n  /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/test_config/test_security.py:77: DeprecationWarning: Authentication and authorization policies have been deprecated in favor of security policies.  See \"Upgrading Authentication/Authorization\" in \"What's New in Pyramid 2.0\" of the documentation for more information.\n    config.set_authentication_policy(authn_policy)\n\nr2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authentication_policy_with_security_policy\n  /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/test_config/test_security.py:32: DeprecationWarning: Authentication and authorization policies have been deprecated in favor of security policies.  See \"Upgrading Authentication/Authorization\" in \"What's New in Pyramid 2.0\" of the documentation for more information.\n    config.set_authentication_policy(authn_policy)\n\nr2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authorization_policy_no_authn_policy\n  /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/test_config/test_security.py:89: DeprecationWarning: Authentication and authorization policies have been deprecated in favor of security policies.  See \"Upgrading Authentication/Authorization\" in \"What's New in Pyramid 2.0\" of the documentation for more information.\n    config.set_authorization_policy(policy)\n\nr2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authorization_policy_no_authn_policy_autocommit\n  /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/test_config/test_security.py:97: DeprecationWarning: Authentication and authorization policies have been deprecated in favor of security policies.  See \"Upgrading Authentication/Authorization\" in \"What's New in Pyramid 2.0\" of the documentation for more information.\n    config.set_authorization_policy(policy)\n\nr2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authorization_policy_with_authn_policy\n  /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/test_config/test_security.py:110: DeprecationWarning: Authentication and authorization policies have been deprecated in favor of security policies.  See \"Upgrading Authentication/Authorization\" in \"What's New in Pyramid 2.0\" of the documentation for more information.\n    config.set_authorization_policy(authz_policy)\n\nr2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authorization_policy_with_authn_policy_autocommit\n  /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/test_config/test_security.py:124: DeprecationWarning: Authentication and authorization policies have been deprecated in favor of security policies.  See \"Upgrading Authentication/Authorization\" in \"What's New in Pyramid 2.0\" of the documentation for more information.\n    config.set_authorization_policy(authz_policy)\n\n-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html\n==================================== PASSES ====================================\n=========================== short test summary info ============================\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_authenticated_userid\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_authenticated_userid_None\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_authenticated_userid_repoze_who_userid_is_None\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_authenticated_userid_unclean_principal_Authenticated\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_authenticated_userid_unclean_principal_Everyone\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_authenticated_userid_with_callback_returns_None\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_authenticated_userid_with_callback_returns_something\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_class_implements_IAuthenticationPolicy\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_effective_principals_None\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_effective_principals_repoze_who_userid_is_None\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_effective_principals_repoze_who_userid_is_unclean_Authenticated\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_effective_principals_repoze_who_userid_is_unclean_Everyone\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_effective_principals_userid_and_groups\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_effective_principals_userid_callback_returns_None\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_effective_principals_userid_only\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_forget\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_forget_no_plugins\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_instance_implements_IAuthenticationPolicy\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_remember\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_remember_kwargs\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_remember_no_plugins\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_unauthenticated_userid\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_unauthenticated_userid_returns_None\nPASSED r2e_tests/test_1.py::TestRemoteUserAuthenticationPolicy::test_authenticated_userid\nPASSED r2e_tests/test_1.py::TestRemoteUserAuthenticationPolicy::test_authenticated_userid_None\nPASSED r2e_tests/test_1.py::TestRemoteUserAuthenticationPolicy::test_class_implements_IAuthenticationPolicy\nPASSED r2e_tests/test_1.py::TestRemoteUserAuthenticationPolicy::test_effective_principals\nPASSED r2e_tests/test_1.py::TestRemoteUserAuthenticationPolicy::test_effective_principals_None\nPASSED r2e_tests/test_1.py::TestRemoteUserAuthenticationPolicy::test_forget\nPASSED r2e_tests/test_1.py::TestRemoteUserAuthenticationPolicy::test_instance_implements_IAuthenticationPolicy\nPASSED r2e_tests/test_1.py::TestRemoteUserAuthenticationPolicy::test_remember\nPASSED r2e_tests/test_1.py::TestRemoteUserAuthenticationPolicy::test_unauthenticated_userid\nPASSED r2e_tests/test_1.py::TestRemoteUserAuthenticationPolicy::test_unauthenticated_userid_returns_None\nPASSED r2e_tests/test_1.py::TestAuthTktAuthenticationPolicy::test_allargs\nPASSED r2e_tests/test_1.py::TestAuthTktAuthenticationPolicy::test_authenticated_userid\nPASSED r2e_tests/test_1.py::TestAuthTktAuthenticationPolicy::test_authenticated_userid_callback_returns_None\nPASSED r2e_tests/test_1.py::TestAuthTktAuthenticationPolicy::test_authenticated_userid_no_cookie_identity\nPASSED r2e_tests/test_1.py::TestAuthTktAuthenticationPolicy::test_class_implements_IAuthenticationPolicy\nPASSED r2e_tests/test_1.py::TestAuthTktAuthenticationPolicy::test_effective_principals\nPASSED r2e_tests/test_1.py::TestAuthTktAuthenticationPolicy::test_effective_principals_callback_returns_None\nPASSED r2e_tests/test_1.py::TestAuthTktAuthenticationPolicy::test_effective_principals_no_cookie_identity\nPASSED r2e_tests/test_1.py::TestAuthTktAuthenticationPolicy::test_forget\nPASSED r2e_tests/test_1.py::TestAuthTktAuthenticationPolicy::test_hashalg_override\nPASSED r2e_tests/test_1.py::TestAuthTktAuthenticationPolicy::test_instance_implements_IAuthenticationPolicy\nPASSED r2e_tests/test_1.py::TestAuthTktAuthenticationPolicy::test_remember\nPASSED r2e_tests/test_1.py::TestAuthTktAuthenticationPolicy::test_remember_with_extra_kargs\nPASSED r2e_tests/test_1.py::TestAuthTktAuthenticationPolicy::test_unauthenticated_userid\nPASSED r2e_tests/test_1.py::TestAuthTktAuthenticationPolicy::test_unauthenticated_userid_returns_None\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_forget\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_bad_cookie\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_cookie_reissue\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_cookie_reissue_already_reissued_this_request\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_cookie_reissue_notyet\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_cookie_reissue_revoked_by_forget\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_cookie_reissue_revoked_by_remember\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_cookie_reissue_with_tokens_default\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_cookie_str_reissue\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_cookie_str_timeout\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_cookie_timeout\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_cookie_timeout_aged\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_cookie_value_is_None\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_good_cookie_b64str_useridtype\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_good_cookie_b64unicode_useridtype\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_good_cookie_dont_include_ip\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_good_cookie_include_ip\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_good_cookie_include_ipv6\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_good_cookie_int_useridtype\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_good_cookie_unknown_useridtype\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_nocookie\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_nonuseridtype_user_data\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_init_cookie_str_max_age_invalid\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_init_cookie_str_reissue_invalid\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_init_cookie_str_timeout_invalid\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_None_samesite\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_binary_userid\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_domain_supercedes_parent_and_wild_domain\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_explicit_domain\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_http_only\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_include_ip\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_insane_userid\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_int_userid\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_invalid_token_format\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_max_age\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_nonascii_token\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_nondefault_samesite\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_parent_domain\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_parent_domain_supercedes_wild_domain\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_path\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_samesite_default\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_samesite_nondefault\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_secure\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_str_max_age\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_str_max_age_invalid\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_tokens\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_unicode_but_ascii_token\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_unicode_userid\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_wild_domain_disabled\nPASSED r2e_tests/test_1.py::TestAuthTicket::test_cookie_value\nPASSED r2e_tests/test_1.py::TestAuthTicket::test_ctor_with_time\nPASSED r2e_tests/test_1.py::TestAuthTicket::test_ctor_with_tokens\nPASSED r2e_tests/test_1.py::TestAuthTicket::test_digest\nPASSED r2e_tests/test_1.py::TestAuthTicket::test_digest_sha512\nPASSED r2e_tests/test_1.py::TestAuthTicket::test_ipv4\nPASSED r2e_tests/test_1.py::TestAuthTicket::test_ipv6\nPASSED r2e_tests/test_1.py::TestBadTicket::test_it\nPASSED r2e_tests/test_1.py::Test_parse_ticket::test_bad_timestamp\nPASSED r2e_tests/test_1.py::Test_parse_ticket::test_bad_userid_or_data\nPASSED r2e_tests/test_1.py::Test_parse_ticket::test_correct_with_user_data\nPASSED r2e_tests/test_1.py::Test_parse_ticket::test_correct_with_user_data_sha512\nPASSED r2e_tests/test_1.py::Test_parse_ticket::test_digest_sig_incorrect\nPASSED r2e_tests/test_1.py::Test_parse_ticket::test_ipv4\nPASSED r2e_tests/test_1.py::Test_parse_ticket::test_ipv6\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationPolicy::test_authenticated_userid\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationPolicy::test_authenticated_userid_callback_returns_None\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationPolicy::test_authenticated_userid_no_cookie_identity\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationPolicy::test_class_implements_IAuthenticationPolicy\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationPolicy::test_effective_principals\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationPolicy::test_effective_principals_callback_returns_None\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationPolicy::test_effective_principals_no_identity\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationPolicy::test_forget\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationPolicy::test_forget_no_identity\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationPolicy::test_instance_implements_IAuthenticationPolicy\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationPolicy::test_remember\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationPolicy::test_unauthenticated_userid\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationPolicy::test_unauthenticated_userid_returns_None\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationHelper::test_authenticated_userid\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationHelper::test_authenticated_userid_none\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationHelper::test_authenticated_userid_with_prefix\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationHelper::test_forget\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationHelper::test_forget_no_identity\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationHelper::test_remember\nPASSED r2e_tests/test_1.py::TestBasicAuthAuthenticationPolicy::test_authenticated_userid\nPASSED r2e_tests/test_1.py::TestBasicAuthAuthenticationPolicy::test_authenticated_userid_latin1\nPASSED r2e_tests/test_1.py::TestBasicAuthAuthenticationPolicy::test_authenticated_userid_utf8\nPASSED r2e_tests/test_1.py::TestBasicAuthAuthenticationPolicy::test_class_implements_IAuthenticationPolicy\nPASSED r2e_tests/test_1.py::TestBasicAuthAuthenticationPolicy::test_forget\nPASSED r2e_tests/test_1.py::TestBasicAuthAuthenticationPolicy::test_remember\nPASSED r2e_tests/test_1.py::TestBasicAuthAuthenticationPolicy::test_unauthenticated_bad_header\nPASSED r2e_tests/test_1.py::TestBasicAuthAuthenticationPolicy::test_unauthenticated_userid\nPASSED r2e_tests/test_1.py::TestBasicAuthAuthenticationPolicy::test_unauthenticated_userid_corrupt_base64\nPASSED r2e_tests/test_1.py::TestBasicAuthAuthenticationPolicy::test_unauthenticated_userid_invalid_payload\nPASSED r2e_tests/test_1.py::TestBasicAuthAuthenticationPolicy::test_unauthenticated_userid_no_credentials\nPASSED r2e_tests/test_1.py::TestBasicAuthAuthenticationPolicy::test_unauthenticated_userid_not_basic\nPASSED r2e_tests/test_1.py::TestExtractHTTPBasicCredentials::test_invalid_payload\nPASSED r2e_tests/test_1.py::TestExtractHTTPBasicCredentials::test_latin1_payload\nPASSED r2e_tests/test_1.py::TestExtractHTTPBasicCredentials::test_namedtuple_return\nPASSED r2e_tests/test_1.py::TestExtractHTTPBasicCredentials::test_no_auth_header\nPASSED r2e_tests/test_1.py::TestExtractHTTPBasicCredentials::test_no_base64_encoding\nPASSED r2e_tests/test_1.py::TestExtractHTTPBasicCredentials::test_not_a_basic_auth_scheme\nPASSED r2e_tests/test_1.py::TestExtractHTTPBasicCredentials::test_utf8_payload\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_action_autocommit_with_introspectables\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_action_autocommit_with_introspectables_introspection_off\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_action_branching_kw_is_None\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_action_branching_kw_is_not_None\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_action_branching_nonautocommit_with_config_info\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_action_branching_nonautocommit_with_introspectables\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_action_branching_nonautocommit_without_config_info\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_action_nonautocommit_with_introspectables_introspection_off\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_autocommit_no_conflicts\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_commit_conflict_resolved_with_include\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_commit_conflict_resolved_with_two_includes_and_local\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_commit_conflict_simple\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_commit_conflict_with_two_includes\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_conflict_set_forbidden_view\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_conflict_set_notfound_view\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_action_simple\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_action_with_includepath\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_action_with_includepath_and_info\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_action_with_info\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_action_with_introspectables\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_action_with_order\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_execute_actions_dicts\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_execute_actions_error\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_execute_actions_tuples\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_execute_actions_with_introspectable_no_callable\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_execute_actions_with_introspectables\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_executing_conflicting_action_across_orders\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_executing_conflicting_action_across_reentrant_orders\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_it\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_processSpec\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_reentrant_action\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_reentrant_action_error\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_reentrant_action_with_deferred_discriminator\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_reentrant_action_without_clear\nPASSED r2e_tests/test_config/test_actions.py::Test_reentrant_action_functional::test_deferred_discriminator\nPASSED r2e_tests/test_config/test_actions.py::Test_reentrant_action_functional::test_functional\nPASSED r2e_tests/test_config/test_actions.py::Test_resolveConflicts::test_conflicts_across_orders\nPASSED r2e_tests/test_config/test_actions.py::Test_resolveConflicts::test_it_conflict\nPASSED r2e_tests/test_config/test_actions.py::Test_resolveConflicts::test_it_success_dicts\nPASSED r2e_tests/test_config/test_actions.py::Test_resolveConflicts::test_it_success_tuples\nPASSED r2e_tests/test_config/test_actions.py::Test_resolveConflicts::test_it_with_actions_grouped_by_order\nPASSED r2e_tests/test_config/test_actions.py::Test_resolveConflicts::test_override_success_across_orders\nPASSED r2e_tests/test_config/test_actions.py::TestActionInfo::test___str__\nPASSED r2e_tests/test_config/test_actions.py::TestActionInfo::test_class_conforms\nPASSED r2e_tests/test_config/test_actions.py::TestActionInfo::test_ctor\nPASSED r2e_tests/test_config/test_actions.py::TestActionInfo::test_instance_conforms\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_object_event_subscriber\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_resource_url_default_resource_iface_means_Interface\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_resource_url_nodefault_resource_iface\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_response_adapter\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_response_adapter_dottednames\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_response_adapter_self\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_defaults\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_dottednames\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_iface_specified\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_predicate\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_with_default_type_predicates_False\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_with_default_type_predicates_True\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_with_specific_type_and_predicates_False\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_with_specific_type_and_predicates_True\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_traverser_default_iface_means_Interface\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_traverser_introspectables\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_traverser_nondefault_iface\nPASSED r2e_tests/test_config/test_adapters.py::Test_eventonly::test_defaults\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test__override_already_registered\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test__override_not_yet_registered\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_directory_with_absdirectory\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_directory_with_absfile\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_directory_with_file\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_absdirectory\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_absfile\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_directory\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_missing_abspath\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_package\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_package_with_absdirectory\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_samename\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_filename_override_returns_value\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_stream_no_overrides\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_stream_override_returns_None\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_stream_override_returns_value\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_string_no_overrides\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_string_override_returns_None\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_string_override_returns_value\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_has_resource_no_overrides\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_has_resource_override_returns_None\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_has_resource_override_returns_True\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_isdir_no_overrides\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_isdir_override_returns_False\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_isdir_override_returns_None\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_listdir_no_overrides\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_listdir_override_returns_None\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_listdir_override_returns_values\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_class_conforms_to_IPEP302Loader\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_class_conforms_to_IPackageOverrides\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_ctor_package_already_has_loader_of_different_type\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_ctor_package_already_has_loader_of_same_type\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_ctor_registers_loader_type\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_ctor_sets_loader\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_ctor_sets_local_state\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_filtered_sources\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_code_pkg_has___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_code_pkg_has_no___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_data_pkg_has___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_data_pkg_has_no___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_filename\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_filename_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_source_pkg_has___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_source_pkg_has_no___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_stream\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_stream_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_string\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_string_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_has_resource\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_has_resource_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_insert_directory\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_insert_emptystring\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_insert_file\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_instance_conforms_to_IPEP302Loader\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_instance_conforms_to_IPackageOverrides\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_is_package_pkg_has___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_is_package_pkg_has_no___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_isdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_isdir_false\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_isdir_true\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_listdir\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_listdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_exists\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_exists_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_exists_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_filename_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_stream\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_stream_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_stream_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_string\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_string_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_string_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_isdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_isdir_false\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_isdir_true\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_listdir\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_listdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_exists\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_exists_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_exists_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_filename\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_filename_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_filename_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_stream\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_stream_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_stream_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_string\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_string_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_string_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_isdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_isdir_false\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_isdir_true\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_listdir\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_listdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestDirectoryOverride::test_it_match\nPASSED r2e_tests/test_config/test_assets.py::TestDirectoryOverride::test_it_no_match\nPASSED r2e_tests/test_config/test_assets.py::TestFileOverride::test_it_match\nPASSED r2e_tests/test_config/test_assets.py::TestFileOverride::test_it_no_match\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_None_callable\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_None_callable_and_no_name\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_None_callable_conflict\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_callable\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_text_name\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_unnamed_callable\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_execution_policy\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_execution_policy_to_None\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_multiple_request_methods_conflict\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_request_factory\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_response_factory\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_root_factory\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_root_factory_as_None\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_session_factory\nPASSED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_invalid_kwargs\nPASSED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_missing_dir\nPASSED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_no_specs\nPASSED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_set_locale_negotiator\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test___getattr__matches\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test___getattr__matches_no_action_wrap\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test___getattr__missing_when_directives_dont_exist\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test___getattr__missing_when_directives_exist\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_adds__lock\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_adds_clear_view_lookup_cache\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_has_listeners\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_notify\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_queryAdapterOrSelf\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_registerSelfAdapter\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_absolute_asset_spec_already_absolute\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_absolute_asset_spec_notastring\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_absolute_asset_spec_relative\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_begin\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_begin_does_not_propagate_request_for_diff_registry\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_begin_overrides_request\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_begin_propagates_request_for_same_registry\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_begin_with_request\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_context_manager\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_alternate_renderers\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_authentication_policy\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_authorization_policy_only\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_default_permission\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_default_renderers\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_default_view_mapper\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_default_webob_response_adapter_registered\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_exceptionresponse_view_None\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_exceptionresponse_view_custom\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_httpexception_view_default\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_no_root_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_noreg_custom_settings\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_noreg_debug_logger_non_None\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_security_policy\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_session_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_with_introspection\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_with_package_registry\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_with_root_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_end\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_hook_zca\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_threadlocals_active\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_dotted_name\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_missing_source_file\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_module_defaults_to_includeme\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_module_defaults_to_includeme_missing\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_nested_route_prefix\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_route_prefix\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_introspector_decorator\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_make_wsgi_app\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_maybe_dotted_notstring_success\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_maybe_dotted_string_fail\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_maybe_dotted_string_success\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration_conflict\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration_dottedname_package\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration_with_extra_kw\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration_with_ignore\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration_with_onerror\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_alternate_renderers\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authentication_policy\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authentication_policy_dottedname\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authorization_policy_dottedname\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authorization_policy_only\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_calls_fix_registry\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_custom_settings\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_debug_logger_name\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_debug_logger_non_None\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_default_permission\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_dottedname_root_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_explicit_notfound_trumps_iexceptionresponse\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_includes\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_includes_spaces\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_locale_negotiator\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_locale_negotiator_dottedname\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_no_default_root_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_registers_default_exceptionresponse_views\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_registers_default_view_predicates\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_registers_default_webob_iresponse_adapter\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_request_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_request_factory_dottedname\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_response_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_unhook_zca\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_with_package\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_with_package_package\nPASSED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_directive_persists_across_configurator_creations\nPASSED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_extend_action_method_successful\nPASSED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_extend_same_name_doesnt_conflict\nPASSED r2e_tests/test_config/test_init.py::TestConfigurator__add_predicate::test_factory_as_object\nPASSED r2e_tests/test_config/test_init.py::TestGlobalRegistriesIntegration::test_global_registries\nPASSED r2e_tests/test_config/test_init.py::TestGlobalRegistriesIntegration::test_global_registries_empty\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_custom_predicates_can_affect_traversal\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_different_custom_predicates_with_same_hash\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_header_multiple\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_header_multiple_fails\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_header_multiple_mixed\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_header_multiple_mixed_fails\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_header_multiple_with_values\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_header_multiple_with_values_fails\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_header_simple\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_header_simple_fails\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_header_with_value\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_header_with_value_fails\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_header_with_value_fails_case\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_match_param_from_dict\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_match_param_from_dict_fails\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_match_param_from_string\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_match_param_from_string_fails\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_notted\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_ordering_importance_and_number\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_ordering_importance_of_predicates\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_ordering_number_of_predicates\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_ordering_xhr_and_request_method_trump_only_containment\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_predicate_close_matches\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_predicate_text_is_correct\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_predicate_text_is_correct_when_multiple\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_request_method_ordering_hashes_same\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_request_method_sequence\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_traverse_has_remainder_already\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_traverse_matches\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_traverse_matches_with_highorder_chars\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_unknown_predicate\nPASSED r2e_tests/test_config/test_predicates.py::Test_sort_accept_offers::test_default_specificities\nPASSED r2e_tests/test_config/test_predicates.py::Test_sort_accept_offers::test_params_inherit_type_prefs\nPASSED r2e_tests/test_config/test_predicates.py::Test_sort_accept_offers::test_params_order\nPASSED r2e_tests/test_config/test_predicates.py::Test_sort_accept_offers::test_specific_type_order\nPASSED r2e_tests/test_config/test_rendering.py::TestRenderingConfiguratorMixin::test_add_default_renderers\nPASSED r2e_tests/test_config/test_rendering.py::TestRenderingConfiguratorMixin::test_add_renderer\nPASSED r2e_tests/test_config/test_rendering.py::TestRenderingConfiguratorMixin::test_add_renderer_dottedname_factory\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_defaults\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_discriminator\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_effective_principals_deprecated\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_path_no_pattern\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_pattern_with_path\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_view_with_view_attr\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_view_with_view_context\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_view_with_view_permission\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_view_with_view_renderer\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_accept\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_accept_list\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_custom_predicates\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_factory\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_header\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_inherit_errors\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_path_info\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_path_info_highorder\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_path_info_regex\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_pregenerator\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_request_method\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_request_param\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_root_slash_with_route_prefix\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_route_prefix\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_route_prefix_with_inherit_slash\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_static\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_wildcard_accept_raises\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_xhr\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_get_routes_mapper_already_registered\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_get_routes_mapper_not_yet_registered\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_add_permission\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_changing_set_default_csrf_options\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authentication_policy_no_authz_policy\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authentication_policy_no_authz_policy_autocommit\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authentication_policy_with_authz_policy\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authentication_policy_with_authz_policy_autocommit\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authentication_policy_with_security_policy\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authorization_policy_no_authn_policy\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authorization_policy_no_authn_policy_autocommit\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authorization_policy_with_authn_policy\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authorization_policy_with_authn_policy_autocommit\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_default_csrf_options\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_default_permission\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_security_policy\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test__set_settings_as_None\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test__set_settings_as_dictwithvalues\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test__set_settings_does_not_uses_original_dict\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test_add_settings_settings_None\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test_add_settings_settings_already_registered\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test_add_settings_settings_not_yet_registered\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test_get_settings_nosettings\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test_get_settings_withsettings\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test_settings_parameter_dict_is_never_updated\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_csrf_trusted_origins\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_debug_all\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_debug_authorization\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_debug_notfound\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_debug_routematch\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_debug_templates\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_default_locale_name\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_noargs\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_originals_kept\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_prevent_cachebust\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_prevent_http_cache\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_reload_all\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_reload_assets\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_reload_resources\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_reload_templates\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_renderer\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_renderer_explicitrenderer\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_renderer_twice\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_subscriber_defaults\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_subscriber_multiple\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_subscriber_single\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_template\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_resources\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_securitypolicy\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_securitypolicy_forget_result\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_securitypolicy_remember_result\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_instance\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_name_ingress\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_name_main\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_over_ingress\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_over_ingress_iterable\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_under_main\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_under_main_iterable\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_unsuitable\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tweens_conflict\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tweens_names_with_over_nonstringoriter\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tweens_names_with_under_nonstringoriter\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test___call___explicit\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test___call___implicit\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_add_explicit\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_add_implicit\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_1\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_2\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_3\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_4\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_5\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_conflict_direct\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_conflict_indirect\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_missing_over_and_under_partials\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_missing_over_partial\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_missing_over_partial_with_fallback\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_missing_under_partial\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_missing_under_partial_with_fallback\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_with_missing_fallbacks\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_with_multiple_matching_fallbacks\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_with_partial_fallbacks\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_accept_view_order_override\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_accept_view_order_throws_on_type_mismatch\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_accept_view_order_throws_on_wildcard\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view_disallows_exception_only\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view_disallows_for_\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view_disallows_name\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view_disallows_permission\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view_disallows_require_csrf\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view_with_subclass\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_allows_other_predicates\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_disallows_context\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_disallows_for_\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_disallows_name\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_disallows_permission\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_disallows_require_csrf\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_no_view_argument\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_with_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_normal_and_exception_view_intr_derived_callable\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_allows_other_predicates\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_append_slash\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_append_slash_custom_response\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_disallows_context\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_disallows_for_\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_disallows_name\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_disallows_permission\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_disallows_require_csrf\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_no_view_argument\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_with_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_static_view_absolute\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_static_view_here_no_utility_registered\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_static_view_package_relative\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_instance\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_instance_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_instancemethod\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_instancemethod_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_oldstyle_class\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_oldstyle_class_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_class_method_no_attr\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_context_as_class\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_context_as_iface\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_context_trumps_for\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_custom_more_preds_first_bests_fewer_preds_last\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_custom_predicate_bests_standard_predicate\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_default_phash_overrides_default_phash\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_default_phash_overrides_no_phash\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_does_not_accept_iterable_accept\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_default_phash_overrides_default_phash\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_default_phash_overrides_no_phash\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_multiview_replaces_existing_securedview\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_multiview_replaces_existing_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_multiview_replaces_multiviews\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_multiview_replaces_only_exc_multiview\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_mulview_replaces_existing_view_with___accept__\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_same_phash_overrides_existing_single_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_with_accept_multiview_replaces_existing_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exception_only\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exception_only_misconfiguration\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exception_only_no_regular_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exception_register_secured_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_for_as_class\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_for_as_iface\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_mixed_case_replaces_existing_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview___discriminator__\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview_call_ordering\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview_context_superclass_then_subclass\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview_exception_superclass_then_subclass\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview_replaces_existing_securedview\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview_replaces_existing_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview_replaces_existing_view_with___accept__\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview_replaces_multiview\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_register_secured_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_same_phash_overrides_existing_single_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_same_predicates\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_view_callable_None_no_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_view_callable_None_with_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_view_callable_dottedname\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_accept_match\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_accept_multiview_replaces_existing_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_accept_nomatch\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_containment_false\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_containment_true\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_csrf_header\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_csrf_param\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_custom_predicates_match\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_custom_predicates_nomatch\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_decorator\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_decorator_tuple\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_default_permission_no_explicit_permission\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_default_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_function_callable\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_function_callable_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_badregex\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_noval_match\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_noval_nomatch\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_val_match\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_val_missing\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_val_nomatch\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_http_cache\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_mapper\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_missing_csrf_header\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_name\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_name_unicode\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_no_default_permission_no_explicit_permission\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_nonexistant_route_name\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_path_info_badregex\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_path_info_match\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_path_info_nomatch\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_permission\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_method_false\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_method_get_implies_head\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_method_sequence_conflict\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_method_sequence_false\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_method_sequence_true\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_method_true\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_param_noval_false\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_param_noval_true\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_param_val_false\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_param_val_true\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_type\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_type_and_route_name\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_type_as_iface\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_type_as_noniface\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_route_name\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_route_name_exception\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_tmpl_renderer_factory_introspector_missing\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_tmpl_renderer_factory_no_renderer_factory\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_tmpl_renderer_factory_with_renderer_factory\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_config_and_view_defaults_conflicts\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_config_and_view_defaults_doesnt_conflict\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_wildcard_accept_raises\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_xhr_false\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_xhr_true\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_wrapped_view_is_decorated\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_views_with_accept_multiview_replaces_existing\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_default_accept_view_order\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_derive_view_dottedname\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_derive_view_function\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_derive_view_with_default_renderer_no_explicit_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_derive_view_with_default_renderer_with_explicit_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_effective_principals_deprecated\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_set_view_mapper\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_set_view_mapper_dottedname\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_view_with_most_specific_predicate\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_view_with_most_specific_predicate_with_mismatch\nPASSED r2e_tests/test_config/test_views.py::Test_runtime_exc_view::test_call\nPASSED r2e_tests/test_config/test_views.py::Test_runtime_exc_view::test_call_dispatches_on_exception\nPASSED r2e_tests/test_config/test_views.py::Test_runtime_exc_view::test_permitted\nPASSED r2e_tests/test_config/test_views.py::Test_runtime_exc_view::test_permitted_dispatches_on_exception\nPASSED r2e_tests/test_config/test_views.py::Test_requestonly::test_defaults\nPASSED r2e_tests/test_config/test_views.py::Test_requestonly::test_otherattr\nPASSED r2e_tests/test_config/test_views.py::Test_isexception::test_is_IException\nPASSED r2e_tests/test_config/test_views.py::Test_isexception::test_is_IException_subinterface\nPASSED r2e_tests/test_config/test_views.py::Test_isexception::test_is_exception_class\nPASSED r2e_tests/test_config/test_views.py::Test_isexception::test_is_exception_instance\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test___call__\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test___call__intermediate_not_found\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test___call__raise_not_found_isnt_interpreted_as_pred_mismatch\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test___call_permissive_has_call_permissive\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test___call_permissive_has_no_call_permissive\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test__call__not_found\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test__call__with_accept_match\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test__call__with_accept_miss\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test__call_permissive__not_found\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_add\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_add_with_phash\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_add_with_phash_override_accept\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_add_with_phash_override_accept2\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_class_implements_ISecuredView\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_get_views\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_get_views_best_match_returns_None\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_get_views_no_self_accepts\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_get_views_request_has_no_accept\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_instance_implements_ISecuredView\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_match_not_found\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_match_predicate_fails\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_match_predicate_succeeds\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_multiple_with_functions_as_views\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_permitted\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_permitted_no_match_with__permitted__\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_permitted_no_views\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test__view_as_function_with_attr\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_function_context_and_request\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_function_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_function_requestonly_with_attr\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_instance_context_and_request\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_instance_context_and_request_and_attr\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_instance_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_instance_requestonly_with_attr\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_newstyle_class_context_and_request\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_newstyle_class_context_and_request_with_attr\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_newstyle_class_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_newstyle_class_requestonly_with_attr\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_oldstyle_class_context_and_request\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_oldstyle_class_context_and_request_with_attr\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_oldstyle_class_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_oldstyle_class_requestonly_with_attr\nPASSED r2e_tests/test_config/test_views.py::Test_preserve_view_attrs::test_it_different\nPASSED r2e_tests/test_config/test_views.py::Test_preserve_view_attrs::test_it_different_with_existing_original_view\nPASSED r2e_tests/test_config/test_views.py::Test_preserve_view_attrs::test_it_same\nPASSED r2e_tests/test_config/test_views.py::Test_preserve_view_attrs::test_it_view_is_None\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_already_exists\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_cachebust_prevented\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_cachebuster\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_cachebuster_abspath\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_cachebuster_for_more_specific_path\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_cachebuster_overwrite\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_cachebuster_overwrite_explicit\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_package_root\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_url_noendslash\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_url_noscheme\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_url_withendslash\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_context\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_for_\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_permission\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_renderer\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_route_prefix\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_missing\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_quoting\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_registration_miss\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_route_url\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_slash_in_name1\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_slash_in_name2\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_cachebust\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_cachebust_abspath\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_cachebust_nomatch\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_quoted_remote\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_unquoted_local\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_with_custom_anchor\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_with_custom_query\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_verifyClass\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_verifyObject\nPASSED r2e_tests/test_config/test_views.py::Test_view_description::test_with_text\nPASSED r2e_tests/test_config/test_views.py::Test_viewdefaults::test_dunder_attrs_copied\nPASSED r2e_tests/test_scripts/test_common.py::TestParseVars::test_parse_vars_bad\nPASSED r2e_tests/test_scripts/test_common.py::TestParseVars::test_parse_vars_good\nPASSED r2e_tests/test_scripts/test_pdistreport.py::TestPDistReportCommand::test_no_dists\nPASSED r2e_tests/test_scripts/test_pdistreport.py::TestPDistReportCommand::test_with_dists\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_display_headers\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_has_bad_config_header\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_has_content_type_header_var\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_has_good_header_var\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_has_multiple_header_vars\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_configures_logging\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_get\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_options\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_patch\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_post\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_propfind\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_put\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_not_enough_args\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_path_doesnt_start_with_slash\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_response_has_no_charset\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_two_args\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_w_basic_auth\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_with_query_string\nPASSED r2e_tests/test_scripts/test_prequest.py::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test__get_mapper\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_bad_args\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_bad_format\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_config_format_ini_commas\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_config_format_ini_newlines\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_config_format_ini_spaces\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_good_args\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_good_format\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_no_mapper\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_no_routes\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_as_wsgiapp\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_no_view\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_with_no_slash_prefix\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_single_route_no_route_registered\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_single_route_no_views_registered\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_single_route_one_view_registered_with_factory\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_static_routes_included_in_list\nPASSED r2e_tests/test_scripts/test_proutes.py::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_config_file_finds_open_url\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_guess_server_url\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_original_ignore_files\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_parse_vars_bad\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_parse_vars_good\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_reload_call_hupper_with_correct_args\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_run_no_args\nPASSED r2e_tests/test_scripts/test_pserve.py::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_custom_section_override\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_default_shell_option\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_errors_with_unknown_shell\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_check_variable_override_order\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_custom_items\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_default_shell\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_ipython\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_pythonstartup\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_setup_from_options\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_setup\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_setup_generator\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_list_shells\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_shell_entry_points\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_shell_ordering\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_shell_override\nPASSED r2e_tests/test_scripts/test_pshell.py::Test_python_shell_runner::test_it\nPASSED r2e_tests/test_scripts/test_pshell.py::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_ptweens.py::TestPTweensCommand::test__get_tweens\nPASSED r2e_tests/test_scripts/test_ptweens.py::TestPTweensCommand::test_command_implicit_and_explicit_tweens\nPASSED r2e_tests/test_scripts/test_ptweens.py::TestPTweensCommand::test_command_implicit_tweens_only\nPASSED r2e_tests/test_scripts/test_ptweens.py::TestPTweensCommand::test_command_no_tweens\nPASSED r2e_tests/test_scripts/test_ptweens.py::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_multi_routes_all_match\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_multi_routes_none_match\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_multi_routes_some_match\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_no_match\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_no_match_multiview_registered\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_route_multiview\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_route_multiview_no_view_registered\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_route_no_multiview\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_traversal\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_traversal_multiview\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_not_found\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_not_found_url_starts_without_slash\nPASSED r2e_tests/test_scripts/test_pviews.py::Test_main::test_it\nFAILED r2e_tests/test_1.py::TestCallbackAuthenticationPolicyDebugging::test_authenticated_userid_fails_cleaning_as_Authenticated\nFAILED r2e_tests/test_1.py::TestCallbackAuthenticationPolicyDebugging::test_authenticated_userid_fails_cleaning_as_Everyone\nFAILED r2e_tests/test_1.py::TestCallbackAuthenticationPolicyDebugging::test_authenticated_userid_no_callback\nFAILED r2e_tests/test_1.py::TestCallbackAuthenticationPolicyDebugging::test_authenticated_userid_no_unauthenticated_userid\nFAILED r2e_tests/test_1.py::TestCallbackAuthenticationPolicyDebugging::test_authenticated_userid_with_callback_fail\nFAILED r2e_tests/test_1.py::TestCallbackAuthenticationPolicyDebugging::test_authenticated_userid_with_callback_success\nFAILED r2e_tests/test_1.py::TestCallbackAuthenticationPolicyDebugging::test_effective_principals_no_callback\nFAILED r2e_tests/test_1.py::TestCallbackAuthenticationPolicyDebugging::test_effective_principals_no_unauthenticated_userid\nFAILED r2e_tests/test_1.py::TestCallbackAuthenticationPolicyDebugging::test_effective_principals_with_callback_fail\nFAILED r2e_tests/test_1.py::TestCallbackAuthenticationPolicyDebugging::test_effective_principals_with_callback_success\nFAILED r2e_tests/test_1.py::TestCallbackAuthenticationPolicyDebugging::test_effective_principals_with_unclean_principal_Authenticated\nFAILED r2e_tests/test_1.py::TestCallbackAuthenticationPolicyDebugging::test_effective_principals_with_unclean_principal_Everyone\nFAILED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_resource_url_adapter_dotted_names\nFAILED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_resource_url_adapter_introspectables\nFAILED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_traverser_dotted_names\nFAILED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_directory_with_directory\nFAILED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_directory_with_package\nFAILED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_file\nFAILED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_package_with_directory\nFAILED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_package_with_package\nFAILED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_filename_no_overrides\nFAILED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_filename_override_returns_None\nFAILED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_filename\nFAILED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_filename_with_prefix\nFAILED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_request_factory_dottedname\nFAILED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_response_factory_dottedname\nFAILED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_root_factory_dottedname\nFAILED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_session_factory_dottedname\nFAILED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_abspath\nFAILED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_asset_spec\nFAILED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_asset_spec_existing_translation_dirs\nFAILED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_doesnt_use_override_w_autocommit\nFAILED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_multiple_specs\nFAILED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_multiple_specs_multiple_calls\nFAILED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_override_multiple_specs_multiple_calls\nFAILED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_uses_override_out_of_order\nFAILED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_uses_override_w_autocommit\nFAILED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_set_locale_negotiator_dottedname\nFAILED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_no_registry\nFAILED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_noreg_debug_logger_None_default\nFAILED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_constant_root_package\nFAILED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_python_callable\nFAILED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_debug_logger_None_default\nFAILED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_tweens\nFAILED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_with_package_module\nFAILED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_add_directive_with_custom_callable\nFAILED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_add_directive_with_partial\nFAILED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_extend_with_dotted_name\nFAILED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_extend_with_python_callable\nFAILED r2e_tests/test_config/test_init.py::TestConfigurator__add_predicate::test_factory_as_dotted_name\nFAILED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_factory_dottedname\nFAILED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_subscriber_dottedname\nFAILED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_dottedname\nFAILED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tweens_names_distinct\nFAILED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tweens_names_with_underover\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view_with_view_defaults\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_with_view_defaults\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_with_view_defaults\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_static_view_package_here_relative\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_context_as_dottedname\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_for__as_dottedname\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_containment_dottedname\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_template_renderer\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_template_renderer_no_callable\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_defaults\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_defaults_viewname_is_dottedname_kwarg\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_defaults_viewname_is_dottedname_nonkwarg\nFAILED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_cachebust_with_overrides\nFAILED r2e_tests/test_config/test_views.py::Test_view_description::test_without_text\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_class_view\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_one_route_all_methods_view_only_post\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_one_route_only_post_view_all_methods\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_one_route_only_post_view_post_and_get\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_one_route_with_long_name_one_view_registered\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_is_get_view_request_method_not_post\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_request_method_mismatch\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_static_views\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_single_route_multiview_registered\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_single_route_one_view_registered\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_view_glob\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_view_request_method_not_post\nFAILED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_config_file_finds_watch_files\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_multi_view_nested\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_multiview\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_multiview_with_permission\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_multiview_with_predicates\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_function_traversal\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_route\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_route_with_route_predicates\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_traversal\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_traversal_with_permission\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_traversal_with_predicates\n================= 92 failed, 887 passed, 28 warnings in 6.84s ==================\n",
    "new_commit_res_stderr": "",
    "old_commit_res_code": 1,
    "old_commit_res_stdout": "============================= test session starts ==============================\nplatform linux -- Python 3.8.20, pytest-8.3.4, pluggy-1.5.0\nrootdir: /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8\nconfigfile: setup.cfg\nplugins: cov-5.0.0\ncollected 979 items\n\nr2e_tests/test_1.py FFFFFFFFFFFF........................................ [  5%]\n.........................................................F.............. [ 12%]\n.......................................                                  [ 16%]\nr2e_tests/test_config/test_actions.py .................................. [ 20%]\n............                                                             [ 21%]\nr2e_tests/test_config/test_adapters.py .FF..............F...             [ 23%]\nr2e_tests/test_config/test_assets.py ....F.F...F...FF.FF................ [ 27%]\n.....................................F.F................................ [ 34%]\n                                                                         [ 34%]\nr2e_tests/test_config/test_factories.py ..........F.F..F.F               [ 36%]\nr2e_tests/test_config/test_i18n.py FFFF..FF.FFF.F                        [ 37%]\nr2e_tests/test_config/test_init.py .............................F..F.... [ 41%]\n....F......F...................F................F..F.FF...FFF...         [ 48%]\nr2e_tests/test_config/test_predicates.py ............................... [ 51%]\n....                                                                     [ 51%]\nr2e_tests/test_config/test_rendering.py ...                              [ 51%]\nr2e_tests/test_config/test_routes.py .............F................      [ 54%]\nr2e_tests/test_config/test_security.py ..............                    [ 56%]\nr2e_tests/test_config/test_settings.py ........................          [ 58%]\nr2e_tests/test_config/test_testing.py ....F.......                       [ 60%]\nr2e_tests/test_config/test_tweens.py F.........F..F...................   [ 63%]\nr2e_tests/test_config/test_views.py ..........F.........F............F.. [ 67%]\nF.........F....................F....................F................... [ 74%]\n..........................FF.....FFF.................................... [ 81%]\n.............................................................F.......F.  [ 89%]\nr2e_tests/test_scripts/test_common.py ..                                 [ 89%]\nr2e_tests/test_scripts/test_pdistreport.py ..                            [ 89%]\nr2e_tests/test_scripts/test_prequest.py ...................              [ 91%]\nr2e_tests/test_scripts/test_proutes.py ...F.......FFFF.F.FF.F..F..FF.    [ 94%]\nr2e_tests/test_scripts/test_pserve.py .F.......                          [ 95%]\nr2e_tests/test_scripts/test_pshell.py .................                  [ 97%]\nr2e_tests/test_scripts/test_ptweens.py .....                             [ 97%]\nr2e_tests/test_scripts/test_pviews.py ..........FFFF..FFFFFF.            [100%]\n\n=================================== FAILURES ===================================\n_ TestCallbackAuthenticationPolicyDebugging.test_authenticated_userid_fails_cleaning_as_Authenticated _\n\nself = <r2e_tests.test_1.TestCallbackAuthenticationPolicyDebugging testMethod=test_authenticated_userid_fails_cleaning_as_Authenticated>\n\n    def test_authenticated_userid_fails_cleaning_as_Authenticated(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne(userid='system.Authenticated')\n        self.assertEqual(policy.authenticated_userid(request), None)\n        self.assertEqual(len(self.messages), 1)\n>       self.assertEqual(\n            self.messages[0],\n            \"tests.test_authentication.MyAuthenticationPolicy.\"\n            \"authenticated_userid: use of userid 'system.Authenticated' is \"\n            \"disallowed by any built-in Pyramid security policy, returning \"\n            \"None\",\n        )\nE       AssertionError: \"r2e_tests.test_1.MyAuthenticationPolicy.a[123 chars]None\" != \"tests.test_authentication.MyAuthenticatio[132 chars]None\"\nE       - r2e_tests.test_1.MyAuthenticationPolicy.authenticated_userid: use of userid 'system.Authenticated' is disallowed by any built-in Pyramid security policy, returning None\nE       ? ----           ^\nE       + tests.test_authentication.MyAuthenticationPolicy.authenticated_userid: use of userid 'system.Authenticated' is disallowed by any built-in Pyramid security policy, returning None\nE       ?            ^^^^^^^^^^^^^^\n\nr2e_tests/test_1.py:96: AssertionError\n_ TestCallbackAuthenticationPolicyDebugging.test_authenticated_userid_fails_cleaning_as_Everyone _\n\nself = <r2e_tests.test_1.TestCallbackAuthenticationPolicyDebugging testMethod=test_authenticated_userid_fails_cleaning_as_Everyone>\n\n    def test_authenticated_userid_fails_cleaning_as_Everyone(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne(userid='system.Everyone')\n        self.assertEqual(policy.authenticated_userid(request), None)\n        self.assertEqual(len(self.messages), 1)\n>       self.assertEqual(\n            self.messages[0],\n            \"tests.test_authentication.MyAuthenticationPolicy.\"\n            \"authenticated_userid: use of userid 'system.Everyone' is \"\n            \"disallowed by any built-in Pyramid security policy, returning \"\n            \"None\",\n        )\nE       AssertionError: \"r2e_tests.test_1.MyAuthenticationPolicy.a[118 chars]None\" != \"tests.test_authentication.MyAuthenticatio[127 chars]None\"\nE       - r2e_tests.test_1.MyAuthenticationPolicy.authenticated_userid: use of userid 'system.Everyone' is disallowed by any built-in Pyramid security policy, returning None\nE       ? ----           ^\nE       + tests.test_authentication.MyAuthenticationPolicy.authenticated_userid: use of userid 'system.Everyone' is disallowed by any built-in Pyramid security policy, returning None\nE       ?            ^^^^^^^^^^^^^^\n\nr2e_tests/test_1.py:109: AssertionError\n_ TestCallbackAuthenticationPolicyDebugging.test_authenticated_userid_no_callback _\n\nself = <r2e_tests.test_1.TestCallbackAuthenticationPolicyDebugging testMethod=test_authenticated_userid_no_callback>\n\n    def test_authenticated_userid_no_callback(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne(userid='fred')\n        self.assertEqual(policy.authenticated_userid(request), 'fred')\n        self.assertEqual(len(self.messages), 1)\n>       self.assertEqual(\n            self.messages[0],\n            \"tests.test_authentication.MyAuthenticationPolicy.\"\n            \"authenticated_userid: there was no groupfinder callback; \"\n            \"returning 'fred'\",\n        )\nE       AssertionError: \"r2e_tests.test_1.MyAuthenticationPolicy.a[68 chars]red'\" != \"tests.test_authentication.MyAuthenticatio[77 chars]red'\"\nE       - r2e_tests.test_1.MyAuthenticationPolicy.authenticated_userid: there was no groupfinder callback; returning 'fred'\nE       ? ----           ^\nE       + tests.test_authentication.MyAuthenticationPolicy.authenticated_userid: there was no groupfinder callback; returning 'fred'\nE       ?            ^^^^^^^^^^^^^^\n\nr2e_tests/test_1.py:52: AssertionError\n_ TestCallbackAuthenticationPolicyDebugging.test_authenticated_userid_no_unauthenticated_userid _\n\nself = <r2e_tests.test_1.TestCallbackAuthenticationPolicyDebugging testMethod=test_authenticated_userid_no_unauthenticated_userid>\n\n    def test_authenticated_userid_no_unauthenticated_userid(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), None)\n        self.assertEqual(len(self.messages), 1)\n>       self.assertEqual(\n            self.messages[0],\n            'tests.test_authentication.MyAuthenticationPolicy.'\n            'authenticated_userid: call to unauthenticated_userid returned '\n            'None; returning None',\n        )\nE       AssertionError: 'r2e_tests.test_1.MyAuthenticationPolicy.a[77 chars]None' != 'tests.test_authentication.MyAuthenticatio[86 chars]None'\nE       - r2e_tests.test_1.MyAuthenticationPolicy.authenticated_userid: call to unauthenticated_userid returned None; returning None\nE       ? ----           ^\nE       + tests.test_authentication.MyAuthenticationPolicy.authenticated_userid: call to unauthenticated_userid returned None; returning None\nE       ?            ^^^^^^^^^^^^^^\n\nr2e_tests/test_1.py:40: AssertionError\n_ TestCallbackAuthenticationPolicyDebugging.test_authenticated_userid_with_callback_fail _\n\nself = <r2e_tests.test_1.TestCallbackAuthenticationPolicyDebugging testMethod=test_authenticated_userid_with_callback_fail>\n\n    def test_authenticated_userid_with_callback_fail(self):\n        request = DummyRequest(registry=self.config.registry)\n    \n        def callback(userid, request):\n            return None\n    \n        policy = self._makeOne(userid='fred', callback=callback)\n        self.assertEqual(policy.authenticated_userid(request), None)\n        self.assertEqual(len(self.messages), 1)\n>       self.assertEqual(\n            self.messages[0],\n            'tests.test_authentication.MyAuthenticationPolicy.'\n            'authenticated_userid: groupfinder callback returned None; '\n            'returning None',\n        )\nE       AssertionError: 'r2e_tests.test_1.MyAuthenticationPolicy.a[67 chars]None' != 'tests.test_authentication.MyAuthenticatio[76 chars]None'\nE       - r2e_tests.test_1.MyAuthenticationPolicy.authenticated_userid: groupfinder callback returned None; returning None\nE       ? ----           ^\nE       + tests.test_authentication.MyAuthenticationPolicy.authenticated_userid: groupfinder callback returned None; returning None\nE       ?            ^^^^^^^^^^^^^^\n\nr2e_tests/test_1.py:68: AssertionError\n_ TestCallbackAuthenticationPolicyDebugging.test_authenticated_userid_with_callback_success _\n\nself = <r2e_tests.test_1.TestCallbackAuthenticationPolicyDebugging testMethod=test_authenticated_userid_with_callback_success>\n\n    def test_authenticated_userid_with_callback_success(self):\n        request = DummyRequest(registry=self.config.registry)\n    \n        def callback(userid, request):\n            return []\n    \n        policy = self._makeOne(userid='fred', callback=callback)\n        self.assertEqual(policy.authenticated_userid(request), 'fred')\n        self.assertEqual(len(self.messages), 1)\n>       self.assertEqual(\n            self.messages[0],\n            \"tests.test_authentication.MyAuthenticationPolicy.\"\n            \"authenticated_userid: groupfinder callback returned []; \"\n            \"returning 'fred'\",\n        )\nE       AssertionError: \"r2e_tests.test_1.MyAuthenticationPolicy.a[67 chars]red'\" != \"tests.test_authentication.MyAuthenticatio[76 chars]red'\"\nE       - r2e_tests.test_1.MyAuthenticationPolicy.authenticated_userid: groupfinder callback returned []; returning 'fred'\nE       ? ----           ^\nE       + tests.test_authentication.MyAuthenticationPolicy.authenticated_userid: groupfinder callback returned []; returning 'fred'\nE       ?            ^^^^^^^^^^^^^^\n\nr2e_tests/test_1.py:84: AssertionError\n_ TestCallbackAuthenticationPolicyDebugging.test_effective_principals_no_callback _\n\nself = <r2e_tests.test_1.TestCallbackAuthenticationPolicyDebugging testMethod=test_effective_principals_no_callback>\n\n    def test_effective_principals_no_callback(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne(userid='fred')\n        self.assertEqual(\n            policy.effective_principals(request),\n            ['system.Everyone', 'system.Authenticated', 'fred'],\n        )\n        self.assertEqual(len(self.messages), 2)\n>       self.assertEqual(\n            self.messages[0],\n            'tests.test_authentication.MyAuthenticationPolicy.'\n            'effective_principals: groupfinder callback is None, so groups '\n            'is []',\n        )\nE       AssertionError: 'r2e_tests.test_1.MyAuthenticationPolicy.e[62 chars]s []' != 'tests.test_authentication.MyAuthenticatio[71 chars]s []'\nE       - r2e_tests.test_1.MyAuthenticationPolicy.effective_principals: groupfinder callback is None, so groups is []\nE       ? ----           ^\nE       + tests.test_authentication.MyAuthenticationPolicy.effective_principals: groupfinder callback is None, so groups is []\nE       ?            ^^^^^^^^^^^^^^\n\nr2e_tests/test_1.py:139: AssertionError\n_ TestCallbackAuthenticationPolicyDebugging.test_effective_principals_no_unauthenticated_userid _\n\nself = <r2e_tests.test_1.TestCallbackAuthenticationPolicyDebugging testMethod=test_effective_principals_no_unauthenticated_userid>\n\n    def test_effective_principals_no_unauthenticated_userid(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne()\n        self.assertEqual(\n            policy.effective_principals(request), ['system.Everyone']\n        )\n        self.assertEqual(len(self.messages), 1)\n>       self.assertEqual(\n            self.messages[0],\n            \"tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: unauthenticated_userid returned None; \"\n            \"returning ['system.Everyone']\",\n        )\nE       AssertionError: \"r2e_tests.test_1.MyAuthenticationPolicy.e[84 chars]ne']\" != \"tests.test_authentication.MyAuthenticatio[93 chars]ne']\"\nE       - r2e_tests.test_1.MyAuthenticationPolicy.effective_principals: unauthenticated_userid returned None; returning ['system.Everyone']\nE       ? ----           ^\nE       + tests.test_authentication.MyAuthenticationPolicy.effective_principals: unauthenticated_userid returned None; returning ['system.Everyone']\nE       ?            ^^^^^^^^^^^^^^\n\nr2e_tests/test_1.py:124: AssertionError\n_ TestCallbackAuthenticationPolicyDebugging.test_effective_principals_with_callback_fail _\n\nself = <r2e_tests.test_1.TestCallbackAuthenticationPolicyDebugging testMethod=test_effective_principals_with_callback_fail>\n\n    def test_effective_principals_with_callback_fail(self):\n        request = DummyRequest(registry=self.config.registry)\n    \n        def callback(userid, request):\n            return None\n    \n        policy = self._makeOne(userid='fred', callback=callback)\n        self.assertEqual(\n            policy.effective_principals(request), ['system.Everyone']\n        )\n        self.assertEqual(len(self.messages), 2)\n>       self.assertEqual(\n            self.messages[0],\n            'tests.test_authentication.MyAuthenticationPolicy.'\n            'effective_principals: groupfinder callback returned None as '\n            'groups',\n        )\nE       AssertionError: 'r2e_tests.test_1.MyAuthenticationPolicy.e[61 chars]oups' != 'tests.test_authentication.MyAuthenticatio[70 chars]oups'\nE       - r2e_tests.test_1.MyAuthenticationPolicy.effective_principals: groupfinder callback returned None as groups\nE       ? ----           ^\nE       + tests.test_authentication.MyAuthenticationPolicy.effective_principals: groupfinder callback returned None as groups\nE       ?            ^^^^^^^^^^^^^^\n\nr2e_tests/test_1.py:163: AssertionError\n_ TestCallbackAuthenticationPolicyDebugging.test_effective_principals_with_callback_success _\n\nself = <r2e_tests.test_1.TestCallbackAuthenticationPolicyDebugging testMethod=test_effective_principals_with_callback_success>\n\n    def test_effective_principals_with_callback_success(self):\n        request = DummyRequest(registry=self.config.registry)\n    \n        def callback(userid, request):\n            return []\n    \n        policy = self._makeOne(userid='fred', callback=callback)\n        self.assertEqual(\n            policy.effective_principals(request),\n            ['system.Everyone', 'system.Authenticated', 'fred'],\n        )\n        self.assertEqual(len(self.messages), 2)\n>       self.assertEqual(\n            self.messages[0],\n            'tests.test_authentication.MyAuthenticationPolicy.'\n            'effective_principals: groupfinder callback returned [] as groups',\n        )\nE       AssertionError: 'r2e_tests.test_1.MyAuthenticationPolicy.e[59 chars]oups' != 'tests.test_authentication.MyAuthenticatio[68 chars]oups'\nE       - r2e_tests.test_1.MyAuthenticationPolicy.effective_principals: groupfinder callback returned [] as groups\nE       ? ----           ^\nE       + tests.test_authentication.MyAuthenticationPolicy.effective_principals: groupfinder callback returned [] as groups\nE       ?            ^^^^^^^^^^^^^^\n\nr2e_tests/test_1.py:188: AssertionError\n_ TestCallbackAuthenticationPolicyDebugging.test_effective_principals_with_unclean_principal_Authenticated _\n\nself = <r2e_tests.test_1.TestCallbackAuthenticationPolicyDebugging testMethod=test_effective_principals_with_unclean_principal_Authenticated>\n\n    def test_effective_principals_with_unclean_principal_Authenticated(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne(userid='system.Authenticated')\n        self.assertEqual(\n            policy.effective_principals(request), ['system.Everyone']\n        )\n        self.assertEqual(len(self.messages), 1)\n>       self.assertEqual(\n            self.messages[0],\n            \"tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: unauthenticated_userid returned disallowed \"\n            \"'system.Authenticated'; returning ['system.Everyone'] as if it \"\n            \"was None\",\n        )\nE       AssertionError: \"r2e_tests.test_1.MyAuthenticationPolicy.e[131 chars]None\" != \"tests.test_authentication.MyAuthenticatio[140 chars]None\"\nE       - r2e_tests.test_1.MyAuthenticationPolicy.effective_principals: unauthenticated_userid returned disallowed 'system.Authenticated'; returning ['system.Everyone'] as if it was None\nE       ? ----           ^\nE       + tests.test_authentication.MyAuthenticationPolicy.effective_principals: unauthenticated_userid returned disallowed 'system.Authenticated'; returning ['system.Everyone'] as if it was None\nE       ?            ^^^^^^^^^^^^^^\n\nr2e_tests/test_1.py:207: AssertionError\n_ TestCallbackAuthenticationPolicyDebugging.test_effective_principals_with_unclean_principal_Everyone _\n\nself = <r2e_tests.test_1.TestCallbackAuthenticationPolicyDebugging testMethod=test_effective_principals_with_unclean_principal_Everyone>\n\n    def test_effective_principals_with_unclean_principal_Everyone(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne(userid='system.Everyone')\n        self.assertEqual(\n            policy.effective_principals(request), ['system.Everyone']\n        )\n        self.assertEqual(len(self.messages), 1)\n>       self.assertEqual(\n            self.messages[0],\n            \"tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: unauthenticated_userid returned disallowed \"\n            \"'system.Everyone'; returning ['system.Everyone'] as if it \"\n            \"was None\",\n        )\nE       AssertionError: \"r2e_tests.test_1.MyAuthenticationPolicy.e[126 chars]None\" != \"tests.test_authentication.MyAuthenticatio[135 chars]None\"\nE       - r2e_tests.test_1.MyAuthenticationPolicy.effective_principals: unauthenticated_userid returned disallowed 'system.Everyone'; returning ['system.Everyone'] as if it was None\nE       ? ----           ^\nE       + tests.test_authentication.MyAuthenticationPolicy.effective_principals: unauthenticated_userid returned disallowed 'system.Everyone'; returning ['system.Everyone'] as if it was None\nE       ?            ^^^^^^^^^^^^^^\n\nr2e_tests/test_1.py:222: AssertionError\n__________ TestAuthTktCookieHelper.test_remember_wild_domain_disabled __________\n\nself = <r2e_tests.test_1.TestAuthTktCookieHelper testMethod=test_remember_wild_domain_disabled>\n\n    def test_remember_wild_domain_disabled(self):\n        helper = self._makeOne('secret', wild_domain=False)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n>       self.assertEqual(len(result), 1)\nE       AssertionError: 2 != 1\n\nr2e_tests/test_1.py:1180: AssertionError\n__ AdaptersConfiguratorMixinTests.test_add_resource_url_adapter_dotted_names ___\n\nself = <r2e_tests.test_config.test_adapters.AdaptersConfiguratorMixinTests testMethod=test_add_resource_url_adapter_dotted_names>\n\n    def test_add_resource_url_adapter_dotted_names(self):\n        from pyramid.interfaces import IResourceURL\n    \n        config = self._makeOne(autocommit=True)\n        config.add_resource_url_adapter(\n            'tests.test_config.test_adapters.DummyResourceURL',\n            'tests.test_config.test_adapters.DummyIface',\n        )\n        iface = DummyIface()\n>       adapter = config.registry.getMultiAdapter((iface, iface), IResourceURL)\n\nr2e_tests/test_config/test_adapters.py:332: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <Registry r2e_tests.test_config>\nobjects = (<r2e_tests.test_config.test_adapters.DummyIface object at 0x75b4c2d9f5e0>, <r2e_tests.test_config.test_adapters.DummyIface object at 0x75b4c2d9f5e0>)\ninterface = <InterfaceClass pyramid.interfaces.IResourceURL>, name = ''\n\n    def getMultiAdapter(self, objects, interface, name=''):\n        adapter = self.adapters.queryMultiAdapter(objects, interface, name)\n        if adapter is None:\n>           raise ComponentLookupError(objects, interface, name)\nE           zope.interface.interfaces.ComponentLookupError: ((<r2e_tests.test_config.test_adapters.DummyIface object at 0x75b4c2d9f5e0>, <r2e_tests.test_config.test_adapters.DummyIface object at 0x75b4c2d9f5e0>), <InterfaceClass pyramid.interfaces.IResourceURL>, '')\n\n.venv/lib/python3.8/site-packages/zope/interface/registry.py:379: ComponentLookupError\n_ AdaptersConfiguratorMixinTests.test_add_resource_url_adapter_introspectables _\n\nself = <r2e_tests.test_config.test_adapters.AdaptersConfiguratorMixinTests testMethod=test_add_resource_url_adapter_introspectables>\n\n    def test_add_resource_url_adapter_introspectables(self):\n        config = self._makeOne()\n        config.add_resource_url_adapter(DummyResourceURL, DummyIface)\n        actions = config.action_state.actions\n        self.assertEqual(len(actions), 1)\n        intrs = actions[0]['introspectables']\n        self.assertEqual(len(intrs), 1)\n        intr = intrs[0]\n        self.assertEqual(intr.type_name, 'resource url adapter')\n        self.assertEqual(\n            intr.discriminator, ('resource url adapter', DummyIface)\n        )\n        self.assertEqual(intr.category_name, 'resource url adapters')\n>       self.assertEqual(\n            intr.title,\n            \"resource url adapter for resource iface \"\n            \"<class 'tests.test_config.test_adapters.DummyIface'>\",\n        )\nE       AssertionError: \"reso[30 chars]iface <class 'r2e_tests.test_config.test_adapters.DummyIface'>\" != \"reso[30 chars]iface <class 'tests.test_config.test_adapters.DummyIface'>\"\nE       - resource url adapter for resource iface <class 'r2e_tests.test_config.test_adapters.DummyIface'>\nE       ?                                                 ----\nE       + resource url adapter for resource iface <class 'tests.test_config.test_adapters.DummyIface'>\n\nr2e_tests/test_config/test_adapters.py:377: AssertionError\n________ AdaptersConfiguratorMixinTests.test_add_traverser_dotted_names ________\n\nself = <r2e_tests.test_config.test_adapters.AdaptersConfiguratorMixinTests testMethod=test_add_traverser_dotted_names>\n\n    def test_add_traverser_dotted_names(self):\n        from pyramid.interfaces import ITraverser\n    \n        config = self._makeOne(autocommit=True)\n        config.add_traverser(\n            'tests.test_config.test_adapters.DummyTraverser',\n            'tests.test_config.test_adapters.DummyIface',\n        )\n        iface = DummyIface()\n>       traverser = config.registry.getAdapter(iface, ITraverser)\n\nr2e_tests/test_config/test_adapters.py:286: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <Registry r2e_tests.test_config>\nobject = <r2e_tests.test_config.test_adapters.DummyIface object at 0x75b4c3136f70>\ninterface = <InterfaceClass pyramid.interfaces.ITraverser>, name = ''\n\n    def getAdapter(self, object, interface, name=''):\n        adapter = self.adapters.queryAdapter(object, interface, name)\n        if adapter is None:\n>           raise ComponentLookupError(object, interface, name)\nE           zope.interface.interfaces.ComponentLookupError: (<r2e_tests.test_config.test_adapters.DummyIface object at 0x75b4c3136f70>, <InterfaceClass pyramid.interfaces.ITraverser>, '')\n\n.venv/lib/python3.8/site-packages/zope/interface/registry.py:368: ComponentLookupError\n___ TestAssetsConfiguratorMixin.test_override_asset_directory_with_directory ___\n\nself = <r2e_tests.test_config.test_assets.TestAssetsConfiguratorMixin testMethod=test_override_asset_directory_with_directory>\n\n    def test_override_asset_directory_with_directory(self):\n        from pyramid.config.assets import PackageAssetSource\n    \n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'tests.test_config.pkgs.asset:templates/',\n            'tests.test_config.pkgs.asset.subpackage:templates/',\n            _override=override,\n        )\n        from tests.test_config.pkgs import asset\n        from tests.test_config.pkgs.asset import subpackage\n    \n        self.assertEqual(override.package, asset)\n        self.assertEqual(override.path, 'templates/')\n        source = override.source\n        self.assertTrue(isinstance(source, PackageAssetSource))\n        self.assertEqual(source.package, subpackage)\n        self.assertEqual(source.prefix, 'templates/')\n    \n        resource_name = 'bar.pt'\n        expected = os.path.join(\n            here, 'pkgs', 'asset', 'subpackage', 'templates', 'bar.pt'\n        )\n>       self.assertEqual(override.source.get_filename(resource_name), expected)\nE       AssertionError: '/hom[90 chars]0ea8/tests/test_config/pkgs/asset/subpackage/templates/bar.pt' != '/hom[90 chars]0ea8/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    ++++\n\nr2e_tests/test_config/test_assets.py:132: AssertionError\n____ TestAssetsConfiguratorMixin.test_override_asset_directory_with_package ____\n\nself = <r2e_tests.test_config.test_assets.TestAssetsConfiguratorMixin testMethod=test_override_asset_directory_with_package>\n\n    def test_override_asset_directory_with_package(self):\n        from pyramid.config.assets import PackageAssetSource\n    \n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'tests.test_config.pkgs.asset:templates/',\n            'tests.test_config.pkgs.asset.subpackage',\n            _override=override,\n        )\n        from tests.test_config.pkgs import asset\n        from tests.test_config.pkgs.asset import subpackage\n    \n        self.assertEqual(override.package, asset)\n        self.assertEqual(override.path, 'templates/')\n        source = override.source\n        self.assertTrue(isinstance(source, PackageAssetSource))\n        self.assertEqual(source.package, subpackage)\n        self.assertEqual(source.prefix, '')\n    \n        resource_name = 'templates/bar.pt'\n        expected = os.path.join(\n            here, 'pkgs', 'asset', 'subpackage', 'templates', 'bar.pt'\n        )\n>       self.assertEqual(override.source.get_filename(resource_name), expected)\nE       AssertionError: '/hom[90 chars]0ea8/tests/test_config/pkgs/asset/subpackage/templates/bar.pt' != '/hom[90 chars]0ea8/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    ++++\n\nr2e_tests/test_config/test_assets.py:158: AssertionError\n________ TestAssetsConfiguratorMixin.test_override_asset_file_with_file ________\n\nself = <r2e_tests.test_config.test_assets.TestAssetsConfiguratorMixin testMethod=test_override_asset_file_with_file>\n\n    def test_override_asset_file_with_file(self):\n        from pyramid.config.assets import PackageAssetSource\n    \n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'tests.test_config.pkgs.asset:templates/foo.pt',\n            'tests.test_config.pkgs.asset.subpackage:templates/bar.pt',\n            _override=override,\n        )\n        from tests.test_config.pkgs import asset\n        from tests.test_config.pkgs.asset import subpackage\n    \n        self.assertEqual(override.package, asset)\n        self.assertEqual(override.path, 'templates/foo.pt')\n        source = override.source\n        self.assertTrue(isinstance(source, PackageAssetSource))\n        self.assertEqual(source.package, subpackage)\n        self.assertEqual(source.prefix, 'templates/bar.pt')\n    \n        resource_name = ''\n        expected = os.path.join(\n            here, 'pkgs', 'asset', 'subpackage', 'templates', 'bar.pt'\n        )\n>       self.assertEqual(override.source.get_filename(resource_name), expected)\nE       AssertionError: '/hom[90 chars]0ea8/tests/test_config/pkgs/asset/subpackage/templates/bar.pt' != '/hom[90 chars]0ea8/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    ++++\n\nr2e_tests/test_config/test_assets.py:80: AssertionError\n____ TestAssetsConfiguratorMixin.test_override_asset_package_with_directory ____\n\nself = <r2e_tests.test_config.test_assets.TestAssetsConfiguratorMixin testMethod=test_override_asset_package_with_directory>\n\n    def test_override_asset_package_with_directory(self):\n        from pyramid.config.assets import PackageAssetSource\n    \n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'tests.test_config.pkgs.asset',\n            'tests.test_config.pkgs.asset.subpackage:templates/',\n            _override=override,\n        )\n        from tests.test_config.pkgs import asset\n        from tests.test_config.pkgs.asset import subpackage\n    \n        self.assertEqual(override.package, asset)\n        self.assertEqual(override.path, '')\n        source = override.source\n        self.assertTrue(isinstance(source, PackageAssetSource))\n        self.assertEqual(source.package, subpackage)\n        self.assertEqual(source.prefix, 'templates/')\n    \n        resource_name = 'bar.pt'\n        expected = os.path.join(\n            here, 'pkgs', 'asset', 'subpackage', 'templates', 'bar.pt'\n        )\n>       self.assertEqual(override.source.get_filename(resource_name), expected)\nE       AssertionError: '/hom[90 chars]0ea8/tests/test_config/pkgs/asset/subpackage/templates/bar.pt' != '/hom[90 chars]0ea8/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    ++++\n\nr2e_tests/test_config/test_assets.py:184: AssertionError\n_____ TestAssetsConfiguratorMixin.test_override_asset_package_with_package _____\n\nself = <r2e_tests.test_config.test_assets.TestAssetsConfiguratorMixin testMethod=test_override_asset_package_with_package>\n\n    def test_override_asset_package_with_package(self):\n        from pyramid.config.assets import PackageAssetSource\n    \n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'tests.test_config.pkgs.asset',\n            'tests.test_config.pkgs.asset.subpackage',\n            _override=override,\n        )\n        from tests.test_config.pkgs import asset\n        from tests.test_config.pkgs.asset import subpackage\n    \n        self.assertEqual(override.package, asset)\n        self.assertEqual(override.path, '')\n        source = override.source\n        self.assertTrue(isinstance(source, PackageAssetSource))\n        self.assertEqual(source.package, subpackage)\n        self.assertEqual(source.prefix, '')\n    \n        resource_name = 'templates/bar.pt'\n        expected = os.path.join(\n            here, 'pkgs', 'asset', 'subpackage', 'templates', 'bar.pt'\n        )\n>       self.assertEqual(override.source.get_filename(resource_name), expected)\nE       AssertionError: '/hom[90 chars]0ea8/tests/test_config/pkgs/asset/subpackage/templates/bar.pt' != '/hom[90 chars]0ea8/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    ++++\n\nr2e_tests/test_config/test_assets.py:106: AssertionError\n_________ TestOverrideProvider.test_get_resource_filename_no_overrides _________\n\nself = <r2e_tests.test_config.test_assets.TestOverrideProvider testMethod=test_get_resource_filename_no_overrides>\n\n    def test_get_resource_filename_no_overrides(self):\n        resource_name = 'test_assets.py'\n        import tests.test_config\n    \n        provider = self._makeOne(tests.test_config)\n        expected = os.path.join(here, resource_name)\n        result = provider.get_resource_filename(None, resource_name)\n>       self.assertEqual(result, expected)\nE       AssertionError: '/hom[69 chars]2253b190882fae72aba3f0ea8/tests/test_config/test_assets.py' != '/hom[69 chars]2253b190882fae72aba3f0ea8/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/tests/test_config/test_assets.py\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                    ++++\n\nr2e_tests/test_config/test_assets.py:360: AssertionError\n____ TestOverrideProvider.test_get_resource_filename_override_returns_None _____\n\nself = <r2e_tests.test_config.test_assets.TestOverrideProvider testMethod=test_get_resource_filename_override_returns_None>\n\n    def test_get_resource_filename_override_returns_None(self):\n        overrides = DummyOverrides(None)\n        self._registerOverrides(overrides)\n        resource_name = 'test_assets.py'\n        import tests.test_config\n    \n        provider = self._makeOne(tests.test_config)\n        expected = os.path.join(here, resource_name)\n        result = provider.get_resource_filename(None, resource_name)\n>       self.assertEqual(result, expected)\nE       AssertionError: '/hom[69 chars]2253b190882fae72aba3f0ea8/tests/test_config/test_assets.py' != '/hom[69 chars]2253b190882fae72aba3f0ea8/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/tests/test_config/test_assets.py\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                    ++++\n\nr2e_tests/test_config/test_assets.py:414: AssertionError\n___________________ TestPackageAssetSource.test_get_filename ___________________\n\nself = <r2e_tests.test_config.test_assets.TestPackageAssetSource testMethod=test_get_filename>\n\n    def test_get_filename(self):\n        source = self._makeOne('')\n>       self.assertEqual(\n            source.get_filename('test_assets.py'),\n            os.path.join(here, 'test_assets.py'),\n        )\nE       AssertionError: '/hom[69 chars]2253b190882fae72aba3f0ea8/tests/test_config/test_assets.py' != '/hom[69 chars]2253b190882fae72aba3f0ea8/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/tests/test_config/test_assets.py\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                    ++++\n\nr2e_tests/test_config/test_assets.py:826: AssertionError\n_____________ TestPackageAssetSource.test_get_filename_with_prefix _____________\n\nself = <r2e_tests.test_config.test_assets.TestPackageAssetSource testMethod=test_get_filename_with_prefix>\n\n    def test_get_filename_with_prefix(self):\n        source = self._makeOne('test_assets.py')\n>       self.assertEqual(\n            source.get_filename(''), os.path.join(here, 'test_assets.py')\n        )\nE       AssertionError: '/hom[69 chars]2253b190882fae72aba3f0ea8/tests/test_config/test_assets.py' != '/hom[69 chars]2253b190882fae72aba3f0ea8/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/tests/test_config/test_assets.py\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                    ++++\n\nr2e_tests/test_config/test_assets.py:833: AssertionError\n____________ TestFactoriesMixin.test_set_request_factory_dottedname ____________\n\nself = <r2e_tests.test_config.test_factories.TestFactoriesMixin testMethod=test_set_request_factory_dottedname>\n\n    def test_set_request_factory_dottedname(self):\n        from pyramid.interfaces import IRequestFactory\n    \n        config = self._makeOne(autocommit=True)\n        config.set_request_factory('tests.test_config.dummyfactory')\n>       self.assertEqual(\n            config.registry.getUtility(IRequestFactory), dummyfactory\n        )\nE       AssertionError: <function dummyfactory at 0x75b4c31b5820> != <function dummyfactory at 0x75b4c3802670>\n\nr2e_tests/test_config/test_factories.py:26: AssertionError\n___________ TestFactoriesMixin.test_set_response_factory_dottedname ____________\n\nself = <r2e_tests.test_config.test_factories.TestFactoriesMixin testMethod=test_set_response_factory_dottedname>\n\n    def test_set_response_factory_dottedname(self):\n        from pyramid.interfaces import IResponseFactory\n    \n        config = self._makeOne(autocommit=True)\n        config.set_response_factory('tests.test_config.dummyfactory')\n>       self.assertEqual(\n            config.registry.getUtility(IResponseFactory), dummyfactory\n        )\nE       AssertionError: <function dummyfactory at 0x75b4c31b5820> != <function dummyfactory at 0x75b4c3802670>\n\nr2e_tests/test_config/test_factories.py:43: AssertionError\n_____________ TestFactoriesMixin.test_set_root_factory_dottedname ______________\n\nself = <r2e_tests.test_config.test_factories.TestFactoriesMixin testMethod=test_set_root_factory_dottedname>\n\n    def test_set_root_factory_dottedname(self):\n        from pyramid.interfaces import IRootFactory\n    \n        config = self._makeOne()\n        config.set_root_factory('tests.test_config.dummyfactory')\n        self.assertEqual(config.registry.queryUtility(IRootFactory), None)\n        config.commit()\n>       self.assertEqual(\n            config.registry.getUtility(IRootFactory), dummyfactory\n        )\nE       AssertionError: <function dummyfactory at 0x75b4c31b5820> != <function dummyfactory at 0x75b4c3802670>\n\nr2e_tests/test_config/test_factories.py:77: AssertionError\n____________ TestFactoriesMixin.test_set_session_factory_dottedname ____________\n\nself = <r2e_tests.test_config.test_factories.TestFactoriesMixin testMethod=test_set_session_factory_dottedname>\n\n    def test_set_session_factory_dottedname(self):\n        from pyramid.interfaces import ISessionFactory\n    \n        config = self._makeOne()\n        config.set_session_factory('tests.test_config.dummyfactory')\n        self.assertEqual(config.registry.queryUtility(ISessionFactory), None)\n        config.commit()\n>       self.assertEqual(\n            config.registry.getUtility(ISessionFactory), dummyfactory\n        )\nE       AssertionError: <function dummyfactory at 0x75b4c31b5820> != <function dummyfactory at 0x75b4c3802670>\n\nr2e_tests/test_config/test_factories.py:99: AssertionError\n_________ TestI18NConfiguratorMixin.test_add_translation_dirs_abspath __________\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_abspath>\n\n    def test_add_translation_dirs_abspath(self):\n        from pyramid.interfaces import ITranslationDirectories\n    \n        config = self._makeOne(autocommit=True)\n>       config.add_translation_dirs(locale)\n\nr2e_tests/test_config/test_i18n.py:131: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nsrc/pyramid/config/actions.py:572: in wrapper\n    result = wrapped(self, *arg, **kw)\nsrc/pyramid/config/i18n.py:125: in add_translation_dirs\n    self.action(None, register, introspectables=introspectables)\nsrc/pyramid/config/actions.py:94: in action\n    callable(*args, **kw)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\n    def register():\n        directories = []\n        resolver = AssetResolver(self.package_name)\n    \n        # defer spec resolution until register to allow for asset\n        # overrides to take place in an earlier config phase\n        for spec in specs:\n            # the trailing slash helps match asset overrides for folders\n            if not spec.endswith('/'):\n                spec += '/'\n            asset = resolver.resolve(spec)\n            directory = asset.abspath()\n            if not asset.isdir():\n>               raise ConfigurationError(\n                    '\"%s\" is not a directory' % directory\n                )\nE               pyramid.exceptions.ConfigurationError: \"/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/pkgs/localeapp/locale\" is not a directory\n\nsrc/pyramid/config/i18n.py:101: ConfigurationError\n________ TestI18NConfiguratorMixin.test_add_translation_dirs_asset_spec ________\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_asset_spec>\n\n    def test_add_translation_dirs_asset_spec(self):\n        from pyramid.interfaces import ITranslationDirectories\n    \n        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs('tests.pkgs.localeapp:locale')\n>       self.assertEqual(\n            config.registry.getUtility(ITranslationDirectories), [locale]\n        )\nE       AssertionError: Lists differ: ['/ho[66 chars]3d8f2253b190882fae72aba3f0ea8/tests/pkgs/localeapp/locale'] != ['/ho[66 chars]3d8f2253b190882fae72aba3f0ea8/r2e_tests/pkgs/localeapp/locale']\nE       \nE       First differing element 0:\nE       '/hom[64 chars]43d8f2253b190882fae72aba3f0ea8/tests/pkgs/localeapp/locale'\nE       '/hom[64 chars]43d8f2253b190882fae72aba3f0ea8/r2e_tests/pkgs/localeapp/locale'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/tests/pkgs/localeapp/locale']\nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/pkgs/localeapp/locale']\nE       ?                                                                                                      ++++\n\nr2e_tests/test_config/test_i18n.py:68: AssertionError\n_ TestI18NConfiguratorMixin.test_add_translation_dirs_asset_spec_existing_translation_dirs _\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_asset_spec_existing_translation_dirs>\n\n    def test_add_translation_dirs_asset_spec_existing_translation_dirs(self):\n        from pyramid.interfaces import ITranslationDirectories\n    \n        config = self._makeOne(autocommit=True)\n        directories = ['abc']\n        config.registry.registerUtility(directories, ITranslationDirectories)\n        config.add_translation_dirs('tests.pkgs.localeapp:locale')\n        result = config.registry.getUtility(ITranslationDirectories)\n>       self.assertEqual(result, [locale, 'abc'])\nE       AssertionError: Lists differ: ['/ho[73 chars]3b190882fae72aba3f0ea8/tests/pkgs/localeapp/locale', 'abc'] != ['/ho[73 chars]3b190882fae72aba3f0ea8/r2e_tests/pkgs/localeapp/locale', 'abc']\nE       \nE       First differing element 0:\nE       '/hom[64 chars]43d8f2253b190882fae72aba3f0ea8/tests/pkgs/localeapp/locale'\nE       '/hom[64 chars]43d8f2253b190882fae72aba3f0ea8/r2e_tests/pkgs/localeapp/locale'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/tests/pkgs/localeapp/locale',\nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/pkgs/localeapp/locale',\nE       ?                                                                                                      ++++\nE       \nE          'abc']\n\nr2e_tests/test_config/test_i18n.py:80: AssertionError\n_ TestI18NConfiguratorMixin.test_add_translation_dirs_doesnt_use_override_w_autocommit _\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_doesnt_use_override_w_autocommit>\n\n    def test_add_translation_dirs_doesnt_use_override_w_autocommit(self):\n        from pyramid.interfaces import ITranslationDirectories\n    \n        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs('tests.pkgs.localeapp:locale')\n        config.override_asset(\n            'tests.pkgs.localeapp:locale/', 'tests.pkgs.localeapp:locale2/'\n        )\n>       self.assertEqual(\n            config.registry.getUtility(ITranslationDirectories), [locale]\n        )\nE       AssertionError: Lists differ: ['/ho[66 chars]3d8f2253b190882fae72aba3f0ea8/tests/pkgs/localeapp/locale'] != ['/ho[66 chars]3d8f2253b190882fae72aba3f0ea8/r2e_tests/pkgs/localeapp/locale']\nE       \nE       First differing element 0:\nE       '/hom[64 chars]43d8f2253b190882fae72aba3f0ea8/tests/pkgs/localeapp/locale'\nE       '/hom[64 chars]43d8f2253b190882fae72aba3f0ea8/r2e_tests/pkgs/localeapp/locale'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/tests/pkgs/localeapp/locale']\nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/pkgs/localeapp/locale']\nE       ?                                                                                                      ++++\n\nr2e_tests/test_config/test_i18n.py:157: AssertionError\n______ TestI18NConfiguratorMixin.test_add_translation_dirs_multiple_specs ______\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_multiple_specs>\n\n    def test_add_translation_dirs_multiple_specs(self):\n        from pyramid.interfaces import ITranslationDirectories\n    \n        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs(\n            'tests.pkgs.localeapp:locale', 'tests.pkgs.localeapp:locale2'\n        )\n>       self.assertEqual(\n            config.registry.getUtility(ITranslationDirectories),\n            [locale, locale2],\n        )\nE       AssertionError: Lists differ: ['/ho[91 chars]0ea8/tests/pkgs/localeapp/locale', '/home/gcpu[114 chars]le2'] != ['/ho[91 chars]0ea8/r2e_tests/pkgs/localeapp/locale', '/home/[122 chars]le2']\nE       \nE       First differing element 0:\nE       '/hom[64 chars]43d8f2253b190882fae72aba3f0ea8/tests/pkgs/localeapp/locale'\nE       '/hom[64 chars]43d8f2253b190882fae72aba3f0ea8/r2e_tests/pkgs/localeapp/locale'\nE       \nE       Diff is 760 characters long. Set self.maxDiff to None to see it.\n\nr2e_tests/test_config/test_i18n.py:89: AssertionError\n_ TestI18NConfiguratorMixin.test_add_translation_dirs_multiple_specs_multiple_calls _\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_multiple_specs_multiple_calls>\n\n    def test_add_translation_dirs_multiple_specs_multiple_calls(self):\n        from pyramid.interfaces import ITranslationDirectories\n    \n        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs(\n            'tests.pkgs.localeapp:locale', 'tests.pkgs.localeapp:locale2'\n        )\n        config.add_translation_dirs('tests.pkgs.localeapp:locale3')\n>       self.assertEqual(\n            config.registry.getUtility(ITranslationDirectories),\n            [locale3, locale, locale2],\n        )\nE       AssertionError: Lists differ: ['/ho[91 chars]0ea8/tests/pkgs/localeapp/locale3', '/home/gcp[245 chars]le2'] != ['/ho[91 chars]0ea8/r2e_tests/pkgs/localeapp/locale3', '/home[257 chars]le2']\nE       \nE       First differing element 0:\nE       '/hom[65 chars]3d8f2253b190882fae72aba3f0ea8/tests/pkgs/localeapp/locale3'\nE       '/hom[65 chars]3d8f2253b190882fae72aba3f0ea8/r2e_tests/pkgs/localeapp/locale3'\nE       \nE       Diff is 1141 characters long. Set self.maxDiff to None to see it.\n\nr2e_tests/test_config/test_i18n.py:102: AssertionError\n_ TestI18NConfiguratorMixin.test_add_translation_dirs_override_multiple_specs_multiple_calls _\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_override_multiple_specs_multiple_calls>\n\n    def test_add_translation_dirs_override_multiple_specs_multiple_calls(self):\n        from pyramid.interfaces import ITranslationDirectories\n    \n        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs(\n            'tests.pkgs.localeapp:locale', 'tests.pkgs.localeapp:locale2'\n        )\n        config.add_translation_dirs(\n            'tests.pkgs.localeapp:locale3', override=True\n        )\n>       self.assertEqual(\n            config.registry.getUtility(ITranslationDirectories),\n            [locale, locale2, locale3],\n        )\nE       AssertionError: Lists differ: ['/ho[91 chars]0ea8/tests/pkgs/localeapp/locale', '/home/gcpu[245 chars]le3'] != ['/ho[91 chars]0ea8/r2e_tests/pkgs/localeapp/locale', '/home/[257 chars]le3']\nE       \nE       First differing element 0:\nE       '/hom[64 chars]43d8f2253b190882fae72aba3f0ea8/tests/pkgs/localeapp/locale'\nE       '/hom[64 chars]43d8f2253b190882fae72aba3f0ea8/r2e_tests/pkgs/localeapp/locale'\nE       \nE       Diff is 1141 characters long. Set self.maxDiff to None to see it.\n\nr2e_tests/test_config/test_i18n.py:117: AssertionError\n_ TestI18NConfiguratorMixin.test_add_translation_dirs_uses_override_out_of_order _\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_uses_override_out_of_order>\n\n    def test_add_translation_dirs_uses_override_out_of_order(self):\n        from pyramid.interfaces import ITranslationDirectories\n    \n        config = self._makeOne()\n        config.add_translation_dirs('tests.pkgs.localeapp:locale')\n        config.override_asset(\n            'tests.pkgs.localeapp:locale/', 'tests.pkgs.localeapp:locale2/'\n        )\n        config.commit()\n>       self.assertEqual(\n            config.registry.getUtility(ITranslationDirectories), [locale2]\n        )\nE       AssertionError: Lists differ: ['/ho[67 chars]d8f2253b190882fae72aba3f0ea8/tests/pkgs/localeapp/locale2'] != ['/ho[67 chars]d8f2253b190882fae72aba3f0ea8/r2e_tests/pkgs/localeapp/locale2']\nE       \nE       First differing element 0:\nE       '/hom[65 chars]3d8f2253b190882fae72aba3f0ea8/tests/pkgs/localeapp/locale2'\nE       '/hom[65 chars]3d8f2253b190882fae72aba3f0ea8/r2e_tests/pkgs/localeapp/locale2'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/tests/pkgs/localeapp/locale2']\nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/pkgs/localeapp/locale2']\nE       ?                                                                                                      ++++\n\nr2e_tests/test_config/test_i18n.py:145: AssertionError\n_ TestI18NConfiguratorMixin.test_add_translation_dirs_uses_override_w_autocommit _\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_uses_override_w_autocommit>\n\n    def test_add_translation_dirs_uses_override_w_autocommit(self):\n        from pyramid.interfaces import ITranslationDirectories\n    \n        config = self._makeOne(autocommit=True)\n        config.override_asset(\n            'tests.pkgs.localeapp:locale/', 'tests.pkgs.localeapp:locale2/'\n        )\n        config.add_translation_dirs('tests.pkgs.localeapp:locale')\n>       self.assertEqual(\n            config.registry.getUtility(ITranslationDirectories), [locale2]\n        )\nE       AssertionError: Lists differ: ['/ho[67 chars]d8f2253b190882fae72aba3f0ea8/tests/pkgs/localeapp/locale2'] != ['/ho[67 chars]d8f2253b190882fae72aba3f0ea8/r2e_tests/pkgs/localeapp/locale2']\nE       \nE       First differing element 0:\nE       '/hom[65 chars]3d8f2253b190882fae72aba3f0ea8/tests/pkgs/localeapp/locale2'\nE       '/hom[65 chars]3d8f2253b190882fae72aba3f0ea8/r2e_tests/pkgs/localeapp/locale2'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/tests/pkgs/localeapp/locale2']\nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/pkgs/localeapp/locale2']\nE       ?                                                                                                      ++++\n\nr2e_tests/test_config/test_i18n.py:169: AssertionError\n_______ TestI18NConfiguratorMixin.test_set_locale_negotiator_dottedname ________\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_set_locale_negotiator_dottedname>\n\n    def test_set_locale_negotiator_dottedname(self):\n        from pyramid.interfaces import ILocaleNegotiator\n    \n        config = self._makeOne(autocommit=True)\n        config.set_locale_negotiator('tests.test_config.dummyfactory')\n>       self.assertEqual(\n            config.registry.getUtility(ILocaleNegotiator), dummyfactory\n        )\nE       AssertionError: <function dummyfactory at 0x75b4c31b5820> != <function dummyfactory at 0x75b4c3802670>\n\nr2e_tests/test_config/test_i18n.py:43: AssertionError\n___________________ ConfiguratorTests.test_ctor_no_registry ____________________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_ctor_no_registry>\n\n    def test_ctor_no_registry(self):\n        import sys\n        from pyramid.interfaces import ISettings\n        from pyramid.config import Configurator\n        from pyramid.interfaces import IRendererFactory\n    \n        config = Configurator()\n        this_pkg = sys.modules['tests.test_config']\n        self.assertTrue(config.registry.getUtility(ISettings))\n>       self.assertEqual(config.package, this_pkg)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'tests.test_config' from '/home/gcpuser/bu[109 chars].py'>\n\nr2e_tests/test_config/test_init.py:76: AssertionError\n_________ ConfiguratorTests.test_ctor_noreg_debug_logger_None_default __________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_ctor_noreg_debug_logger_None_default>\n\n    def test_ctor_noreg_debug_logger_None_default(self):\n        from pyramid.interfaces import IDebugLogger\n    \n        config = self._makeOne()\n        logger = config.registry.getUtility(IDebugLogger)\n>       self.assertEqual(logger.name, 'tests.test_config')\nE       AssertionError: 'r2e_tests.test_config' != 'tests.test_config'\nE       - r2e_tests.test_config\nE       ? ----\nE       + tests.test_config\n\nr2e_tests/test_config/test_init.py:201: AssertionError\n_____________ ConfiguratorTests.test_include_constant_root_package _____________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_include_constant_root_package>\n\n    def test_include_constant_root_package(self):\n        import tests\n        from tests import test_config\n    \n        config = self._makeOne(root_package=tests)\n        results = {}\n    \n        def include(config):\n            results['package'] = config.package\n            results['root_package'] = config.root_package\n    \n        config.include(include)\n        self.assertEqual(results['root_package'], tests)\n>       self.assertEqual(results['package'], test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'tests.test_config' from '/home/gcpuser/bu[109 chars].py'>\n\nr2e_tests/test_config/test_init.py:960: AssertionError\n_____________ ConfiguratorTests.test_include_with_python_callable ______________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_include_with_python_callable>\n\n    def test_include_with_python_callable(self):\n        from tests import test_config\n    \n        config = self._makeOne()\n        config.include(dummy_include)\n        after = config.action_state\n        actions = after.actions\n        self.assertEqual(len(actions), 1)\n        action = actions[0]\n        self.assertEqual(action['discriminator'], 'discrim')\n        self.assertEqual(action['callable'], None)\n>       self.assertEqual(action['args'], test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'tests.test_config' from '/home/gcpuser/bu[109 chars].py'>\n\nr2e_tests/test_config/test_init.py:873: AssertionError\n_______ ConfiguratorTests.test_setup_registry_debug_logger_None_default ________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_setup_registry_debug_logger_None_default>\n\n    def test_setup_registry_debug_logger_None_default(self):\n        from pyramid.registry import Registry\n        from pyramid.interfaces import IDebugLogger\n    \n        reg = Registry()\n        config = self._makeOne(reg)\n        config.setup_registry()\n        logger = reg.getUtility(IDebugLogger)\n>       self.assertEqual(logger.name, 'tests.test_config')\nE       AssertionError: 'r2e_tests.test_config' != 'tests.test_config'\nE       - r2e_tests.test_config\nE       ? ----\nE       + tests.test_config\n\nr2e_tests/test_config/test_init.py:589: AssertionError\n_________________ ConfiguratorTests.test_setup_registry_tweens _________________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_setup_registry_tweens>\n\n    def test_setup_registry_tweens(self):\n        from pyramid.interfaces import ITweens\n        from pyramid.registry import Registry\n    \n        reg = Registry()\n        config = self._makeOne(reg)\n        settings = {'pyramid.tweens': 'tests.test_config.dummy_tween_factory'}\n        config.setup_registry(settings=settings)\n        config.commit()\n        tweens = config.registry.getUtility(ITweens)\n>       self.assertEqual(\n            tweens.explicit,\n            [('tests.test_config.dummy_tween_factory', dummy_tween_factory)],\n        )\nE       AssertionError: Lists differ: [('te[25 chars]en_factory', <function dummy_tween_factory at 0x75b4c2de85e0>)] != [('te[25 chars]en_factory', <function dummy_tween_factory at 0x75b4c3802310>)]\nE       \nE       First differing element 0:\nE       ('tes[23 chars]een_factory', <function dummy_tween_factory at 0x75b4c2de85e0>)\nE       ('tes[23 chars]een_factory', <function dummy_tween_factory at 0x75b4c3802310>)\nE       \nE         [('tests.test_config.dummy_tween_factory',\nE       -   <function dummy_tween_factory at 0x75b4c2de85e0>)]\nE       ?                                            ^^^^^\nE       \nE       +   <function dummy_tween_factory at 0x75b4c3802310>)]\nE       ?                                           +++ ^^\n\nr2e_tests/test_config/test_init.py:810: AssertionError\n__________________ ConfiguratorTests.test_with_package_module __________________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_with_package_module>\n\n    def test_with_package_module(self):\n        from . import test_init\n    \n        config = self._makeOne()\n        newconfig = config.with_package(test_init)\n        import tests.test_config\n    \n>       self.assertEqual(newconfig.package, tests.test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'tests.test_config' from '/home/gcpuser/bu[109 chars].py'>\n\nr2e_tests/test_config/test_init.py:351: AssertionError\n____ TestConfigurator_add_directive.test_add_directive_with_custom_callable ____\n\nself = <r2e_tests.test_config.test_init.TestConfigurator_add_directive testMethod=test_add_directive_with_custom_callable>\n\n    def test_add_directive_with_custom_callable(self):\n        from tests import test_config\n    \n        config = self.config\n        config.add_directive(\n            'dummy_callable', 'tests.test_config.dummy_callable'\n        )\n        self.assertTrue(hasattr(config, 'dummy_callable'))\n        config.dummy_callable('discrim')\n        after = config.action_state\n        action = after.actions[-1]\n        self.assertEqual(action['discriminator'], 'discrim')\n        self.assertEqual(action['callable'], None)\n>       self.assertEqual(action['args'], test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'tests.test_config' from '/home/gcpuser/bu[109 chars].py'>\n\nr2e_tests/test_config/test_init.py:1279: AssertionError\n________ TestConfigurator_add_directive.test_add_directive_with_partial ________\n\nself = <r2e_tests.test_config.test_init.TestConfigurator_add_directive testMethod=test_add_directive_with_partial>\n\n    def test_add_directive_with_partial(self):\n        from tests import test_config\n    \n        config = self.config\n        config.add_directive(\n            'dummy_partial', 'tests.test_config.dummy_partial'\n        )\n        self.assertTrue(hasattr(config, 'dummy_partial'))\n        config.dummy_partial()\n        after = config.action_state\n        action = after.actions[-1]\n        self.assertEqual(action['discriminator'], 'partial')\n        self.assertEqual(action['callable'], None)\n>       self.assertEqual(action['args'], test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'tests.test_config' from '/home/gcpuser/bu[109 chars].py'>\n\nr2e_tests/test_config/test_init.py:1264: AssertionError\n_________ TestConfigurator_add_directive.test_extend_with_dotted_name __________\n\nself = <r2e_tests.test_config.test_init.TestConfigurator_add_directive testMethod=test_extend_with_dotted_name>\n\n    def test_extend_with_dotted_name(self):\n        from tests import test_config\n    \n        config = self.config\n        config.add_directive('dummy_extend', 'tests.test_config.dummy_extend')\n        self.assertTrue(hasattr(config, 'dummy_extend'))\n        config.dummy_extend('discrim')\n        after = config.action_state\n        action = after.actions[-1]\n        self.assertEqual(action['discriminator'], 'discrim')\n        self.assertEqual(action['callable'], None)\n>       self.assertEqual(action['args'], test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'tests.test_config' from '/home/gcpuser/bu[109 chars].py'>\n\nr2e_tests/test_config/test_init.py:1249: AssertionError\n_______ TestConfigurator_add_directive.test_extend_with_python_callable ________\n\nself = <r2e_tests.test_config.test_init.TestConfigurator_add_directive testMethod=test_extend_with_python_callable>\n\n    def test_extend_with_python_callable(self):\n        from tests import test_config\n    \n        config = self.config\n        config.add_directive('dummy_extend', dummy_extend)\n        self.assertTrue(hasattr(config, 'dummy_extend'))\n        config.dummy_extend('discrim')\n        after = config.action_state\n        action = after.actions[-1]\n        self.assertEqual(action['discriminator'], 'discrim')\n        self.assertEqual(action['callable'], None)\n>       self.assertEqual(action['args'], test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'tests.test_config' from '/home/gcpuser/bu[109 chars].py'>\n\nr2e_tests/test_config/test_init.py:1292: AssertionError\n_________ TestConfigurator__add_predicate.test_factory_as_dotted_name __________\n\nself = <r2e_tests.test_config.test_init.TestConfigurator__add_predicate testMethod=test_factory_as_dotted_name>\n\n    def test_factory_as_dotted_name(self):\n        config = self._makeOne()\n    \n        def _fakeAction(\n            discriminator,\n            callable=None,\n            args=(),\n            kw=None,\n            order=0,\n            introspectables=(),\n            **extra\n        ):\n            self.assertEqual(len(introspectables), 1)\n            self.assertEqual(introspectables[0]['name'], 'testing')\n            self.assertEqual(introspectables[0]['factory'], DummyPredicate)\n    \n        config.action = _fakeAction\n>       config._add_predicate(\n            'route', 'testing', 'tests.test_config.test_init.DummyPredicate'\n        )\n\nr2e_tests/test_config/test_init.py:1369: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nsrc/pyramid/config/predicates.py:47: in _add_predicate\n    self.action(\nr2e_tests/test_config/test_init.py:1366: in _fakeAction\n    self.assertEqual(introspectables[0]['factory'], DummyPredicate)\nE   AssertionError: <class 'tests.test_config.test_init.DummyPredicate'> != <class 'r2e_tests.test_config.test_init.DummyPredicate'>\n_____ RoutesConfiguratorMixinTests.test_add_route_with_factory_dottedname ______\n\nself = <r2e_tests.test_config.test_routes.RoutesConfiguratorMixinTests testMethod=test_add_route_with_factory_dottedname>\n\n    def test_add_route_with_factory_dottedname(self):\n        config = self._makeOne(autocommit=True)\n        config.add_route(\n            'name', 'path', factory='tests.test_config.dummyfactory'\n        )\n        route = self._assertRoute(config, 'name', 'path')\n>       self.assertEqual(route.factory, dummyfactory)\nE       AssertionError: <function dummyfactory at 0x75b4c31b5820> != <function dummyfactory at 0x75b4c3802670>\n\nr2e_tests/test_config/test_routes.py:109: AssertionError\n_____ TestingConfiguratorMixinTests.test_testing_add_subscriber_dottedname _____\n\nself = <r2e_tests.test_config.test_testing.TestingConfiguratorMixinTests testMethod=test_testing_add_subscriber_dottedname>\n\n    def test_testing_add_subscriber_dottedname(self):\n        config = self._makeOne(autocommit=True)\n        L = config.testing_add_subscriber('tests.test_config.IDummy')\n        event = DummyEvent()\n        config.registry.notify(event)\n>       self.assertEqual(len(L), 1)\nE       AssertionError: 0 != 1\n\nr2e_tests/test_config/test_testing.py:108: AssertionError\n____________ TestTweensConfiguratorMixin.test_add_tween_dottedname _____________\n\nself = <r2e_tests.test_config.test_tweens.TestTweensConfiguratorMixin testMethod=test_add_tween_dottedname>\n\n    def test_add_tween_dottedname(self):\n        from pyramid.interfaces import ITweens\n        from pyramid.tweens import excview_tween_factory\n    \n        config = self._makeOne()\n        config.add_tween('tests.test_config.dummy_tween_factory')\n        config.commit()\n        tweens = config.registry.queryUtility(ITweens)\n>       self.assertEqual(\n            tweens.implicit(),\n            [\n                ('tests.test_config.dummy_tween_factory', dummy_tween_factory),\n                (\n                    'pyramid.tweens.excview_tween_factory',\n                    excview_tween_factory,\n                ),\n            ],\n        )\nE       AssertionError: Lists differ: [('te[73 chars]75b4c2de85e0>), ('pyramid.tweens.excview_tween[58 chars]50>)] != [('te[73 chars]75b4c3802310>), ('pyramid.tweens.excview_tween[58 chars]50>)]\nE       \nE       First differing element 0:\nE       ('tes[23 chars]een_factory', <function dummy_tween_factory at 0x75b4c2de85e0>)\nE       ('tes[23 chars]een_factory', <function dummy_tween_factory at 0x75b4c3802310>)\nE       \nE         [('tests.test_config.dummy_tween_factory',\nE       -   <function dummy_tween_factory at 0x75b4c2de85e0>),\nE       ?                                            ^^^^^\nE       \nE       +   <function dummy_tween_factory at 0x75b4c3802310>),\nE       ?                                           +++ ^^\nE       \nE          ('pyramid.tweens.excview_tween_factory',\nE           <function excview_tween_factory at 0x75b4c38ba550>)]\n\nr2e_tests/test_config/test_tweens.py:106: AssertionError\n__________ TestTweensConfiguratorMixin.test_add_tweens_names_distinct __________\n\nself = <r2e_tests.test_config.test_tweens.TestTweensConfiguratorMixin testMethod=test_add_tweens_names_distinct>\n\n    def test_add_tweens_names_distinct(self):\n        from pyramid.interfaces import ITweens\n        from pyramid.tweens import excview_tween_factory\n    \n        def factory1(handler, registry):  # pragma: no cover\n            return handler\n    \n        def factory2(handler, registry):  # pragma: no cover\n            return handler\n    \n        config = self._makeOne()\n        config.add_tween('tests.test_config.dummy_tween_factory')\n        config.add_tween('tests.test_config.dummy_tween_factory2')\n        config.commit()\n        tweens = config.registry.queryUtility(ITweens)\n        implicit = tweens.implicit()\n>       self.assertEqual(\n            implicit,\n            [\n                (\n                    'tests.test_config.dummy_tween_factory2',\n                    dummy_tween_factory2,\n                ),\n                ('tests.test_config.dummy_tween_factory', dummy_tween_factory),\n                (\n                    'pyramid.tweens.excview_tween_factory',\n                    excview_tween_factory,\n                ),\n            ],\n        )\nE       AssertionError: Lists differ: [('te[76 chars]5b4c3241280>), ('tests.test_config.dummy_tween[150 chars]50>)] != [('te[76 chars]5b4c38023a0>), ('tests.test_config.dummy_tween[150 chars]50>)]\nE       \nE       First differing element 0:\nE       ('tes[25 chars]n_factory2', <function dummy_tween_factory2 at 0x75b4c3241280>)\nE       ('tes[25 chars]n_factory2', <function dummy_tween_factory2 at 0x75b4c38023a0>)\nE       \nE         [('tests.test_config.dummy_tween_factory2',\nE       -   <function dummy_tween_factory2 at 0x75b4c3241280>),\nE       ?                                              ^^^^\nE       \nE       +   <function dummy_tween_factory2 at 0x75b4c38023a0>),\nE       ?                                             ++ ^^\nE       \nE          ('tests.test_config.dummy_tween_factory',\nE       -   <function dummy_tween_factory at 0x75b4c2de85e0>),\nE       ?                                            ^^^^^\nE       \nE       +   <function dummy_tween_factory at 0x75b4c3802310>),\nE       ?                                           +++ ^^\nE       \nE          ('pyramid.tweens.excview_tween_factory',\nE           <function excview_tween_factory at 0x75b4c38ba550>)]\n\nr2e_tests/test_config/test_tweens.py:31: AssertionError\n_______ TestTweensConfiguratorMixin.test_add_tweens_names_with_underover _______\n\nself = <r2e_tests.test_config.test_tweens.TestTweensConfiguratorMixin testMethod=test_add_tweens_names_with_underover>\n\n    def test_add_tweens_names_with_underover(self):\n        from pyramid.interfaces import ITweens\n        from pyramid.tweens import excview_tween_factory\n        from pyramid.tweens import MAIN\n    \n        config = self._makeOne()\n        config.add_tween('tests.test_config.dummy_tween_factory', over=MAIN)\n        config.add_tween(\n            'tests.test_config.dummy_tween_factory2',\n            over=MAIN,\n            under='tests.test_config.dummy_tween_factory',\n        )\n        config.commit()\n        tweens = config.registry.queryUtility(ITweens)\n        implicit = tweens.implicit()\n>       self.assertEqual(\n            implicit,\n            [\n                (\n                    'pyramid.tweens.excview_tween_factory',\n                    excview_tween_factory,\n                ),\n                ('tests.test_config.dummy_tween_factory', dummy_tween_factory),\n                (\n                    'tests.test_config.dummy_tween_factory2',\n                    dummy_tween_factory2,\n                ),\n            ],\n        )\nE       AssertionError: Lists differ: [('py[167 chars]75b4c2de85e0>), ('tests.test_config.dummy_twee[59 chars]80>)] != [('py[167 chars]75b4c3802310>), ('tests.test_config.dummy_twee[59 chars]a0>)]\nE       \nE       First differing element 1:\nE       ('tes[23 chars]een_factory', <function dummy_tween_factory at 0x75b4c2de85e0>)\nE       ('tes[23 chars]een_factory', <function dummy_tween_factory at 0x75b4c3802310>)\nE       \nE         [('pyramid.tweens.excview_tween_factory',\nE           <function excview_tween_factory at 0x75b4c38ba550>),\nE          ('tests.test_config.dummy_tween_factory',\nE       -   <function dummy_tween_factory at 0x75b4c2de85e0>),\nE       ?                                            ^^^^^\nE       \nE       +   <function dummy_tween_factory at 0x75b4c3802310>),\nE       ?                                           +++ ^^\nE       \nE          ('tests.test_config.dummy_tween_factory2',\nE       -   <function dummy_tween_factory2 at 0x75b4c3241280>)]\nE       ?                                              ^^^^\nE       \nE       +   <function dummy_tween_factory2 at 0x75b4c38023a0>)]\nE       ?                                             ++ ^^\n\nr2e_tests/test_config/test_tweens.py:61: AssertionError\n____ TestViewsConfigurationMixin.test_add_exception_view_with_view_defaults ____\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_exception_view_with_view_defaults>\n\n    def test_add_exception_view_with_view_defaults(self):\n        from pyramid.renderers import null_renderer\n        from pyramid.exceptions import PredicateMismatch\n        from zope.interface import directlyProvides\n        from zope.interface import implementedBy\n    \n        class view:\n            __view_defaults__ = {'containment': 'tests.test_config.IDummy'}\n    \n            def __init__(self, request):\n                pass\n    \n            def __call__(self):\n                return 'OK'\n    \n        config = self._makeOne(autocommit=True)\n        config.add_exception_view(\n            view=view, context=Exception, renderer=null_renderer\n        )\n        wrapper = self._getViewCallable(\n            config, exc_iface=implementedBy(Exception)\n        )\n        context = DummyContext()\n        directlyProvides(context, IDummy)\n        request = self._makeRequest(config)\n>       self.assertEqual(wrapper(context, request), 'OK')\n\nr2e_tests/test_config/test_views.py:2375: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nsrc/pyramid/config/views.py:170: in attr_view\n    return view(context, request)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = <r2e_tests.test_config.test_views.DummyContext object at 0x75b4c37993a0>\nrequest = <r2e_tests.test_config.test_views.DummyRequest object at 0x75b4c3013130>\n\n    def predicate_wrapper(context, request):\n        for predicate in preds:\n            if not predicate(context, request):\n                view_name = getattr(view, '__name__', view)\n>               raise PredicateMismatch(\n                    'predicate mismatch for view %s (%s)'\n                    % (view_name, predicate.text())\n                )\nE               pyramid.exceptions.PredicateMismatch: predicate mismatch for view view (containment = tests.test_config.IDummy)\n\nsrc/pyramid/config/views.py:192: PredicateMismatch\n____ TestViewsConfigurationMixin.test_add_forbidden_view_with_view_defaults ____\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_forbidden_view_with_view_defaults>\n\n    def test_add_forbidden_view_with_view_defaults(self):\n        from pyramid.interfaces import IRequest\n        from pyramid.renderers import null_renderer\n        from pyramid.exceptions import PredicateMismatch\n        from pyramid.httpexceptions import HTTPForbidden\n        from zope.interface import directlyProvides\n        from zope.interface import implementedBy\n    \n        class view:\n            __view_defaults__ = {'containment': 'tests.test_config.IDummy'}\n    \n            def __init__(self, request):\n                pass\n    \n            def __call__(self):\n                return 'OK'\n    \n        config = self._makeOne(autocommit=True)\n        config.add_forbidden_view(view=view, renderer=null_renderer)\n        wrapper = self._getViewCallable(\n            config,\n            exc_iface=implementedBy(HTTPForbidden),\n            request_iface=IRequest,\n        )\n        context = DummyContext()\n        directlyProvides(context, IDummy)\n        request = self._makeRequest(config)\n>       self.assertEqual(wrapper(context, request), 'OK')\n\nr2e_tests/test_config/test_views.py:2600: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nsrc/pyramid/config/views.py:170: in attr_view\n    return view(context, request)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = <r2e_tests.test_config.test_views.DummyContext object at 0x75b4c3208cd0>\nrequest = <r2e_tests.test_config.test_views.DummyRequest object at 0x75b4c30fb220>\n\n    def predicate_wrapper(context, request):\n        for predicate in preds:\n            if not predicate(context, request):\n                view_name = getattr(view, '__name__', view)\n>               raise PredicateMismatch(\n                    'predicate mismatch for view %s (%s)'\n                    % (view_name, predicate.text())\n                )\nE               pyramid.exceptions.PredicateMismatch: predicate mismatch for view view (containment = tests.test_config.IDummy)\n\nsrc/pyramid/config/views.py:192: PredicateMismatch\n____ TestViewsConfigurationMixin.test_add_notfound_view_with_view_defaults _____\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_notfound_view_with_view_defaults>\n\n    def test_add_notfound_view_with_view_defaults(self):\n        from pyramid.interfaces import IRequest\n        from pyramid.renderers import null_renderer\n        from pyramid.exceptions import PredicateMismatch\n        from pyramid.httpexceptions import HTTPNotFound\n        from zope.interface import directlyProvides\n        from zope.interface import implementedBy\n    \n        class view:\n            __view_defaults__ = {'containment': 'tests.test_config.IDummy'}\n    \n            def __init__(self, request):\n                pass\n    \n            def __call__(self):\n                return 'OK'\n    \n        config = self._makeOne(autocommit=True)\n        config.add_notfound_view(view=view, renderer=null_renderer)\n        wrapper = self._getViewCallable(\n            config,\n            exc_iface=implementedBy(HTTPNotFound),\n            request_iface=IRequest,\n        )\n        context = DummyContext()\n        directlyProvides(context, IDummy)\n        request = self._makeRequest(config)\n>       self.assertEqual(wrapper(context, request), 'OK')\n\nr2e_tests/test_config/test_views.py:2764: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nsrc/pyramid/config/views.py:170: in attr_view\n    return view(context, request)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = <r2e_tests.test_config.test_views.DummyContext object at 0x75b4c2f32ca0>\nrequest = <r2e_tests.test_config.test_views.DummyRequest object at 0x75b4c3f3e910>\n\n    def predicate_wrapper(context, request):\n        for predicate in preds:\n            if not predicate(context, request):\n                view_name = getattr(view, '__name__', view)\n>               raise PredicateMismatch(\n                    'predicate mismatch for view %s (%s)'\n                    % (view_name, predicate.text())\n                )\nE               pyramid.exceptions.PredicateMismatch: predicate mismatch for view view (containment = tests.test_config.IDummy)\n\nsrc/pyramid/config/views.py:192: PredicateMismatch\n____ TestViewsConfigurationMixin.test_add_static_view_package_here_relative ____\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_static_view_package_here_relative>\n\n    def test_add_static_view_package_here_relative(self):\n        from pyramid.interfaces import IStaticURLInfo\n    \n        info = DummyStaticURLInfo()\n        config = self._makeOne(autocommit=True)\n        config.registry.registerUtility(info, IStaticURLInfo)\n        config.add_static_view('static', 'files')\n>       self.assertEqual(\n            info.added, [(config, 'static', 'tests.test_config:files', {})]\n        )\nE       AssertionError: Lists differ: [(<py[35 chars] 0x75b4c3167e80>, 'static', 'r2e_tests.test_config:files', {})] != [(<py[35 chars] 0x75b4c3167e80>, 'static', 'tests.test_config:files', {})]\nE       \nE       First differing element 0:\nE       (<pyr[33 chars]t 0x75b4c3167e80>, 'static', 'r2e_tests.test_config:files', {})\nE       (<pyr[33 chars]t 0x75b4c3167e80>, 'static', 'tests.test_config:files', {})\nE       \nE         [(<pyramid.config.Configurator object at 0x75b4c3167e80>,\nE           'static',\nE       -   'r2e_tests.test_config:files',\nE       ?    ----\nE       \nE       +   'tests.test_config:files',\nE           {})]\n\nr2e_tests/test_config/test_views.py:2483: AssertionError\n_______ TestViewsConfigurationMixin.test_add_view_context_as_dottedname ________\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_context_as_dottedname>\n\n    def test_add_view_context_as_dottedname(self):\n        from pyramid.renderers import null_renderer\n    \n        view = lambda *arg: 'OK'\n        config = self._makeOne(autocommit=True)\n        config.add_view(\n            context='tests.test_config.IDummy',\n            view=view,\n            renderer=null_renderer,\n        )\n        wrapper = self._getViewCallable(config, IDummy)\n>       self.assertEqual(wrapper, view)\nE       AssertionError: None != <function TestViewsConfigurationMixin.tes[64 chars]c700>\n\nr2e_tests/test_config/test_views.py:452: AssertionError\n_________ TestViewsConfigurationMixin.test_add_view_for__as_dottedname _________\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_for__as_dottedname>\n\n    def test_add_view_for__as_dottedname(self):\n        from pyramid.renderers import null_renderer\n    \n        view = lambda *arg: 'OK'\n        config = self._makeOne(autocommit=True)\n        config.add_view(\n            for_='tests.test_config.IDummy', view=view, renderer=null_renderer\n        )\n        wrapper = self._getViewCallable(config, IDummy)\n>       self.assertEqual(wrapper, view)\nE       AssertionError: None != <function TestViewsConfigurationMixin.tes[61 chars]5940>\n\nr2e_tests/test_config/test_views.py:463: AssertionError\n____ TestViewsConfigurationMixin.test_add_view_with_containment_dottedname _____\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_with_containment_dottedname>\n\n    def test_add_view_with_containment_dottedname(self):\n        from pyramid.renderers import null_renderer\n        from zope.interface import directlyProvides\n    \n        view = lambda *arg: 'OK'\n        config = self._makeOne(autocommit=True)\n        config.add_view(\n            view=view,\n            containment='tests.test_config.IDummy',\n            renderer=null_renderer,\n        )\n        wrapper = self._getViewCallable(config)\n        context = DummyContext()\n        directlyProvides(context, IDummy)\n>       self.assertEqual(wrapper(context, None), 'OK')\n\nr2e_tests/test_config/test_views.py:1863: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nsrc/pyramid/config/views.py:170: in attr_view\n    return view(context, request)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = <r2e_tests.test_config.test_views.DummyContext object at 0x75b4c3052340>\nrequest = None\n\n    def predicate_wrapper(context, request):\n        for predicate in preds:\n            if not predicate(context, request):\n                view_name = getattr(view, '__name__', view)\n>               raise PredicateMismatch(\n                    'predicate mismatch for view %s (%s)'\n                    % (view_name, predicate.text())\n                )\nE               pyramid.exceptions.PredicateMismatch: predicate mismatch for view <lambda> (containment = tests.test_config.IDummy)\n\nsrc/pyramid/config/views.py:192: PredicateMismatch\n_______ TestViewsConfigurationMixin.test_add_view_with_template_renderer _______\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_with_template_renderer>\n\n    def test_add_view_with_template_renderer(self):\n        from tests import test_config\n        from pyramid.interfaces import ISettings\n    \n        class view:\n            def __init__(self, context, request):\n                self.request = request\n                self.context = context\n    \n            def __call__(self):\n                return {'a': '1'}\n    \n        config = self._makeOne(autocommit=True)\n        renderer = self._registerRenderer(config)\n        fixture = 'tests.test_config:files/minimal.txt'\n        config.introspection = False\n        config.add_view(view=view, renderer=fixture)\n        wrapper = self._getViewCallable(config)\n        request = self._makeRequest(config)\n        result = wrapper(None, request)\n        self.assertEqual(result.body, b'Hello!')\n        settings = config.registry.queryUtility(ISettings)\n        result = renderer.info\n        self.assertEqual(result.registry, config.registry)\n        self.assertEqual(result.type, '.txt')\n>       self.assertEqual(result.package, test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'tests.test_config' from '/home/gcpuser/bu[109 chars].py'>\n\nr2e_tests/test_config/test_views.py:1492: AssertionError\n_ TestViewsConfigurationMixin.test_add_view_with_template_renderer_no_callable _\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_with_template_renderer_no_callable>\n\n    def test_add_view_with_template_renderer_no_callable(self):\n        from tests import test_config\n        from pyramid.interfaces import ISettings\n    \n        config = self._makeOne(autocommit=True)\n        renderer = self._registerRenderer(config)\n        fixture = 'tests.test_config:files/minimal.txt'\n        config.introspection = False\n        config.add_view(view=None, renderer=fixture)\n        wrapper = self._getViewCallable(config)\n        request = self._makeRequest(config)\n        result = wrapper(None, request)\n        self.assertEqual(result.body, b'Hello!')\n        settings = config.registry.queryUtility(ISettings)\n        result = renderer.info\n        self.assertEqual(result.registry, config.registry)\n        self.assertEqual(result.type, '.txt')\n>       self.assertEqual(result.package, test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'tests.test_config' from '/home/gcpuser/bu[109 chars].py'>\n\nr2e_tests/test_config/test_views.py:1538: AssertionError\n_________ TestViewsConfigurationMixin.test_add_view_with_view_defaults _________\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_with_view_defaults>\n\n    def test_add_view_with_view_defaults(self):\n        from pyramid.renderers import null_renderer\n        from pyramid.exceptions import PredicateMismatch\n        from zope.interface import directlyProvides\n    \n        class view:\n            __view_defaults__ = {'containment': 'tests.test_config.IDummy'}\n    \n            def __init__(self, request):\n                pass\n    \n            def __call__(self):\n                return 'OK'\n    \n        config = self._makeOne(autocommit=True)\n        config.add_view(view=view, renderer=null_renderer)\n        wrapper = self._getViewCallable(config)\n        context = DummyContext()\n        directlyProvides(context, IDummy)\n        request = self._makeRequest(config)\n>       self.assertEqual(wrapper(context, request), 'OK')\n\nr2e_tests/test_config/test_views.py:2140: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nsrc/pyramid/config/views.py:170: in attr_view\n    return view(context, request)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = <r2e_tests.test_config.test_views.DummyContext object at 0x75b4c329adf0>\nrequest = <r2e_tests.test_config.test_views.DummyRequest object at 0x75b4c3013970>\n\n    def predicate_wrapper(context, request):\n        for predicate in preds:\n            if not predicate(context, request):\n                view_name = getattr(view, '__name__', view)\n>               raise PredicateMismatch(\n                    'predicate mismatch for view %s (%s)'\n                    % (view_name, predicate.text())\n                )\nE               pyramid.exceptions.PredicateMismatch: predicate mismatch for view view (containment = tests.test_config.IDummy)\n\nsrc/pyramid/config/views.py:192: PredicateMismatch\n_ TestViewsConfigurationMixin.test_add_view_with_view_defaults_viewname_is_dottedname_kwarg _\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_with_view_defaults_viewname_is_dottedname_kwarg>\n\n    def test_add_view_with_view_defaults_viewname_is_dottedname_kwarg(self):\n        from pyramid.renderers import null_renderer\n        from pyramid.exceptions import PredicateMismatch\n        from zope.interface import directlyProvides\n    \n        config = self._makeOne(autocommit=True)\n        config.add_view(\n            view='tests.test_config.test_views.DummyViewDefaultsClass',\n            renderer=null_renderer,\n        )\n        wrapper = self._getViewCallable(config)\n        context = DummyContext()\n        directlyProvides(context, IDummy)\n        request = self._makeRequest(config)\n>       self.assertEqual(wrapper(context, request), 'OK')\n\nr2e_tests/test_config/test_views.py:2159: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nsrc/pyramid/config/views.py:170: in attr_view\n    return view(context, request)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = <r2e_tests.test_config.test_views.DummyContext object at 0x75b4c2f9cdc0>\nrequest = <r2e_tests.test_config.test_views.DummyRequest object at 0x75b4c354b340>\n\n    def predicate_wrapper(context, request):\n        for predicate in preds:\n            if not predicate(context, request):\n                view_name = getattr(view, '__name__', view)\n>               raise PredicateMismatch(\n                    'predicate mismatch for view %s (%s)'\n                    % (view_name, predicate.text())\n                )\nE               pyramid.exceptions.PredicateMismatch: predicate mismatch for view DummyViewDefaultsClass (containment = tests.test_config.IDummy)\n\nsrc/pyramid/config/views.py:192: PredicateMismatch\n_ TestViewsConfigurationMixin.test_add_view_with_view_defaults_viewname_is_dottedname_nonkwarg _\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_with_view_defaults_viewname_is_dottedname_nonkwarg>\n\n    def test_add_view_with_view_defaults_viewname_is_dottedname_nonkwarg(self):\n        from pyramid.renderers import null_renderer\n        from pyramid.exceptions import PredicateMismatch\n        from zope.interface import directlyProvides\n    \n        config = self._makeOne(autocommit=True)\n        config.add_view(\n            'tests.test_config.test_views.DummyViewDefaultsClass',\n            renderer=null_renderer,\n        )\n        wrapper = self._getViewCallable(config)\n        context = DummyContext()\n        directlyProvides(context, IDummy)\n        request = self._makeRequest(config)\n>       self.assertEqual(wrapper(context, request), 'OK')\n\nr2e_tests/test_config/test_views.py:2178: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nsrc/pyramid/config/views.py:170: in attr_view\n    return view(context, request)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = <r2e_tests.test_config.test_views.DummyContext object at 0x75b4c3247ca0>\nrequest = <r2e_tests.test_config.test_views.DummyRequest object at 0x75b4c2d7bfa0>\n\n    def predicate_wrapper(context, request):\n        for predicate in preds:\n            if not predicate(context, request):\n                view_name = getattr(view, '__name__', view)\n>               raise PredicateMismatch(\n                    'predicate mismatch for view %s (%s)'\n                    % (view_name, predicate.text())\n                )\nE               pyramid.exceptions.PredicateMismatch: predicate mismatch for view DummyViewDefaultsClass (containment = tests.test_config.IDummy)\n\nsrc/pyramid/config/views.py:192: PredicateMismatch\n_________ TestStaticURLInfo.test_generate_url_cachebust_with_overrides _________\n\nself = <r2e_tests.test_config.test_views.TestStaticURLInfo testMethod=test_generate_url_cachebust_with_overrides>\n\n    def test_generate_url_cachebust_with_overrides(self):\n        config = testing.setUp()\n        try:\n            request = testing.DummyRequest()\n            config.add_static_view('static', 'path')\n            config.override_asset(\n                'tests.test_config:path/', 'tests.test_config:other_path/'\n            )\n    \n            def cb(val):\n                def cb_(request, subpath, kw):\n                    kw['_query'] = {'x': val}\n                    return subpath, kw\n    \n                return cb_\n    \n            config.add_cache_buster('path', cb('foo'))\n            result = request.static_url('path/foo.png')\n            self.assertEqual(result, 'http://example.com/static/foo.png?x=foo')\n            config.add_cache_buster('other_path', cb('bar'), explicit=True)\n            result = request.static_url('path/foo.png')\n>           self.assertEqual(result, 'http://example.com/static/foo.png?x=bar')\nE           AssertionError: 'http://example.com/static/foo.png?x=foo' != 'http://example.com/static/foo.png?x=bar'\nE           - http://example.com/static/foo.png?x=foo\nE           ?                                     ^^^\nE           + http://example.com/static/foo.png?x=bar\nE           ?                                     ^^^\n\nr2e_tests/test_config/test_views.py:3953: AssertionError\n___________________ Test_view_description.test_without_text ____________________\n\nself = <r2e_tests.test_config.test_views.Test_view_description testMethod=test_without_text>\n\n    def test_without_text(self):\n        def view():  # pragma: no cover\n            pass\n    \n        result = self._callFUT(view)\n>       self.assertEqual(result, 'function tests.test_config.test_views.view')\nE       AssertionError: 'function r2e_tests.test_config.test_views.view' != 'function tests.test_config.test_views.view'\nE       - function r2e_tests.test_config.test_views.view\nE       ?          ----\nE       + function tests.test_config.test_views.view\n\nr2e_tests/test_config/test_views.py:4157: AssertionError\n______________________ TestPRoutesCommand.test_class_view ______________________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_class_view>\n\n    def test_class_view(self):\n        from pyramid.renderers import null_renderer as nr\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b')\n        config.add_view(\n            route_name='foo',\n            view=dummy.DummyView,\n            attr='view',\n            renderer=nr,\n            request_method='POST',\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = dummy.DummyBootstrap(registry=config.registry)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo',\n            '/a/b',\n            'tests.test_scripts.dummy.DummyView.view',\n            'POST',\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.dummy.DummyView.view', 'POST'] != ['foo', '/a/b', 'tests.test_scripts.dummy.DummyView.view', 'POST']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.dummy.DummyView.view'\nE       'tests.test_scripts.dummy.DummyView.view'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.dummy.DummyView.view', 'POST']\nE       ?                  ----\nE       \nE       + ['foo', '/a/b', 'tests.test_scripts.dummy.DummyView.view', 'POST']\n\nr2e_tests/test_scripts/test_proutes.py:248: AssertionError\n_________ TestPRoutesCommand.test_one_route_all_methods_view_only_post _________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_one_route_all_methods_view_only_post>\n\n    def test_one_route_all_methods_view_only_post(self):\n        from pyramid.renderers import null_renderer as nr\n    \n        def view1(context, request):  # pragma: no cover\n            return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b')\n        config.add_view(\n            route_name='foo', view=view1, renderer=nr, request_method='POST'\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = dummy.DummyBootstrap(registry=config.registry)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo',\n            '/a/b',\n            'tests.test_scripts.test_proutes.view1',\n            'POST',\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST'] != ['foo', '/a/b', 'tests.test_scripts.test_proutes.view1', 'POST']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST']\nE       ?                  ----\nE       \nE       + ['foo', '/a/b', 'tests.test_scripts.test_proutes.view1', 'POST']\n\nr2e_tests/test_scripts/test_proutes.py:361: AssertionError\n_________ TestPRoutesCommand.test_one_route_only_post_view_all_methods _________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_one_route_only_post_view_all_methods>\n\n    def test_one_route_only_post_view_all_methods(self):\n        from pyramid.renderers import null_renderer as nr\n    \n        def view1(context, request):  # pragma: no cover\n            return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b', request_method='POST')\n        config.add_view(route_name='foo', view=view1, renderer=nr)\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = dummy.DummyBootstrap(registry=config.registry)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo',\n            '/a/b',\n            'tests.test_scripts.test_proutes.view1',\n            'POST',\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST'] != ['foo', '/a/b', 'tests.test_scripts.test_proutes.view1', 'POST']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST']\nE       ?                  ----\nE       \nE       + ['foo', '/a/b', 'tests.test_scripts.test_proutes.view1', 'POST']\n\nr2e_tests/test_scripts/test_proutes.py:387: AssertionError\n________ TestPRoutesCommand.test_one_route_only_post_view_post_and_get _________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_one_route_only_post_view_post_and_get>\n\n    def test_one_route_only_post_view_post_and_get(self):\n        from pyramid.renderers import null_renderer as nr\n    \n        def view1(context, request):  # pragma: no cover\n            return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b', request_method='POST')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method=('POST', 'GET'),\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = dummy.DummyBootstrap(registry=config.registry)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo',\n            '/a/b',\n            'tests.test_scripts.test_proutes.view1',\n            'POST',\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST'] != ['foo', '/a/b', 'tests.test_scripts.test_proutes.view1', 'POST']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST']\nE       ?                  ----\nE       \nE       + ['foo', '/a/b', 'tests.test_scripts.test_proutes.view1', 'POST']\n\nr2e_tests/test_scripts/test_proutes.py:418: AssertionError\n_____ TestPRoutesCommand.test_one_route_with_long_name_one_view_registered _____\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_one_route_with_long_name_one_view_registered>\n\n    def test_one_route_with_long_name_one_view_registered(self):\n        from zope.interface import Interface\n        from pyramid.interfaces import IRouteRequest\n        from pyramid.interfaces import IViewClassifier\n        from pyramid.interfaces import IView\n    \n        registry = self._makeRegistry()\n    \n        def view():  # pragma: no cover\n            pass\n    \n        class IMyRoute(Interface):\n            pass\n    \n        registry.registerAdapter(\n            view, (IViewClassifier, IMyRoute, Interface), IView, ''\n        )\n    \n        registry.registerUtility(\n            IMyRoute, IRouteRequest, name='very_long_name_123'\n        )\n    \n        command = self._makeOne()\n        route = dummy.DummyRoute(\n            'very_long_name_123', '/and_very_long_pattern_as_well'\n        )\n        mapper = dummy.DummyMapper(route)\n        command._get_mapper = lambda *arg: mapper\n        L = []\n        command.out = L.append\n        command.bootstrap = dummy.DummyBootstrap(registry=registry)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()[:3]\n>       self.assertEqual(\n            compare_to,\n            [\n                'very_long_name_123',\n                '/and_very_long_pattern_as_well',\n                'tests.test_scripts.test_proutes.view',\n            ],\n        )\nE       AssertionError: Lists differ: ['ver[32 chars]g_pattern_as_well', 'r2e_tests.test_scripts.test_proutes.view'] != ['ver[32 chars]g_pattern_as_well', 'tests.test_scripts.test_proutes.view']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view'\nE       'tests.test_scripts.test_proutes.view'\nE       \nE         ['very_long_name_123',\nE          '/and_very_long_pattern_as_well',\nE       -  'r2e_tests.test_scripts.test_proutes.view']\nE       ?   ----\nE       \nE       +  'tests.test_scripts.test_proutes.view']\n\nr2e_tests/test_scripts/test_proutes.py:212: AssertionError\n______ TestPRoutesCommand.test_route_is_get_view_request_method_not_post _______\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_route_is_get_view_request_method_not_post>\n\n    def test_route_is_get_view_request_method_not_post(self):\n        from pyramid.renderers import null_renderer as nr\n        from pyramid.config import not_\n    \n        def view1(context, request):  # pragma: no cover\n            return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b', request_method='GET')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method=not_('POST'),\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = dummy.DummyBootstrap(registry=config.registry)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo',\n            '/a/b',\n            'tests.test_scripts.test_proutes.view1',\n            'GET',\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'GET'] != ['foo', '/a/b', 'tests.test_scripts.test_proutes.view1', 'GET']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'GET']\nE       ?                  ----\nE       \nE       + ['foo', '/a/b', 'tests.test_scripts.test_proutes.view1', 'GET']\n\nr2e_tests/test_scripts/test_proutes.py:558: AssertionError\n____________ TestPRoutesCommand.test_route_request_method_mismatch _____________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_route_request_method_mismatch>\n\n    def test_route_request_method_mismatch(self):\n        from pyramid.renderers import null_renderer as nr\n    \n        def view1(context, request):  # pragma: no cover\n            return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b', request_method='POST')\n        config.add_view(\n            route_name='foo', view=view1, renderer=nr, request_method='GET'\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = dummy.DummyBootstrap(registry=config.registry)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo',\n            '/a/b',\n            'tests.test_scripts.test_proutes.view1',\n            '<route',\n            'mismatch>',\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1[20 chars]ch>'] != ['foo', '/a/b', 'tests.test_scripts.test_proutes.view1', '[16 chars]ch>']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'tests.test_scripts.test_proutes.view1'\nE       \nE       + ['foo', '/a/b', 'tests.test_scripts.test_proutes.view1', '<route', 'mismatch>']\nE       - ['foo',\nE       -  '/a/b',\nE       -  'r2e_tests.test_scripts.test_proutes.view1',\nE       -  '<route',\nE       -  'mismatch>']\n\nr2e_tests/test_scripts/test_proutes.py:447: AssertionError\n__________________ TestPRoutesCommand.test_route_static_views __________________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_route_static_views>\n\n    def test_route_static_views(self):\n        config = self._makeConfig(autocommit=True)\n        config.add_static_view('static', 'static', cache_max_age=3600)\n        path2 = os.path.normpath('/var/www/static')\n        config.add_static_view(name='static2', path=path2)\n        config.add_static_view(\n            name='pyramid_scaffold',\n            path='pyramid:scaffolds/starter/+package+/static',\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = dummy.DummyBootstrap(registry=config.registry)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 5)\n    \n        expected = [\n            [\n                '__static/',\n                '/static/*subpath',\n                'tests.test_scripts:static/',\n                '*',\n            ],\n            ['__static2/', '/static2/*subpath', path2 + os.sep, '*'],\n            [\n                '__pyramid_scaffold/',\n                '/pyramid_scaffold/*subpath',\n                'pyramid:scaffolds/starter/+package+/static/',\n                '*',\n            ],\n        ]\n    \n        for index, line in enumerate(L[2:]):\n            data = line.split()\n>           self.assertEqual(data, expected[index])\nE           AssertionError: Lists differ: ['__static/', '/static/*subpath', 'r2e_tests.test_scripts:static/', '*'] != ['__static/', '/static/*subpath', 'tests.test_scripts:static/', '*']\nE           \nE           First differing element 2:\nE           'r2e_tests.test_scripts:static/'\nE           'tests.test_scripts:static/'\nE           \nE           - ['__static/', '/static/*subpath', 'r2e_tests.test_scripts:static/', '*']\nE           ?                                    ----\nE           \nE           + ['__static/', '/static/*subpath', 'tests.test_scripts:static/', '*']\n\nr2e_tests/test_scripts/test_proutes.py:485: AssertionError\n__________ TestPRoutesCommand.test_single_route_multiview_registered ___________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_single_route_multiview_registered>\n\n    def test_single_route_multiview_registered(self):\n        from zope.interface import Interface\n        from pyramid.interfaces import IRouteRequest\n        from pyramid.interfaces import IViewClassifier\n        from pyramid.interfaces import IMultiView\n    \n        registry = self._makeRegistry()\n    \n        def view():  # pragma: no cover\n            pass\n    \n        class IMyRoute(Interface):\n            pass\n    \n        multiview1 = dummy.DummyMultiView(\n            view, context='context', view_name='a1'\n        )\n    \n        registry.registerAdapter(\n            multiview1, (IViewClassifier, IMyRoute, Interface), IMultiView, ''\n        )\n        registry.registerUtility(IMyRoute, IRouteRequest, name='a')\n        command = self._makeOne()\n        route = dummy.DummyRoute('a', '/a')\n        mapper = dummy.DummyMapper(route)\n        command._get_mapper = lambda *arg: mapper\n        L = []\n        command.out = L.append\n        command.bootstrap = dummy.DummyBootstrap(registry=registry)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()[:3]\n        view_module = 'tests.test_scripts.dummy'\n        view_str = '<tests.test_scripts.dummy.DummyMultiView'\n        final = '%s.%s' % (view_module, view_str)\n    \n>       self.assertEqual(compare_to, ['a', '/a', final])\nE       AssertionError: Lists differ: ['a', '/a', 'r2e_tests.test_scripts.dummy.<r2e_tests.t[29 chars]iew'] != ['a', '/a', 'tests.test_scripts.dummy.<tests.test_scri[21 chars]iew']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.dummy.<r2e_tests.test_scripts.dummy.DummyMultiView'\nE       'tests.test_scripts.dummy.<tests.test_scripts.dummy.DummyMultiView'\nE       \nE       - ['a',\nE       -  '/a',\nE       -  'r2e_tests.test_scripts.dummy.<r2e_tests.test_scripts.dummy.DummyMultiView']\nE       ? ^ ^^^^                          ----\nE       \nE       + ['a', '/a', 'tests.test_scripts.dummy.<tests.test_scripts.dummy.DummyMultiView']\nE       ? ^ ^^^^^^^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:324: AssertionError\n___________ TestPRoutesCommand.test_single_route_one_view_registered ___________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_single_route_one_view_registered>\n\n    def test_single_route_one_view_registered(self):\n        from zope.interface import Interface\n        from pyramid.interfaces import IRouteRequest\n        from pyramid.interfaces import IViewClassifier\n        from pyramid.interfaces import IView\n    \n        registry = self._makeRegistry()\n    \n        def view():  # pragma: no cover\n            pass\n    \n        class IMyRoute(Interface):\n            pass\n    \n        registry.registerAdapter(\n            view, (IViewClassifier, IMyRoute, Interface), IView, ''\n        )\n        registry.registerUtility(IMyRoute, IRouteRequest, name='a')\n        command = self._makeOne()\n        route = dummy.DummyRoute('a', '/a')\n        mapper = dummy.DummyMapper(route)\n        command._get_mapper = lambda *arg: mapper\n        L = []\n        command.out = L.append\n        command.bootstrap = dummy.DummyBootstrap(registry=registry)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()[:3]\n>       self.assertEqual(\n            compare_to, ['a', '/a', 'tests.test_scripts.test_proutes.view']\n        )\nE       AssertionError: Lists differ: ['a', '/a', 'r2e_tests.test_scripts.test_proutes.view'] != ['a', '/a', 'tests.test_scripts.test_proutes.view']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view'\nE       'tests.test_scripts.test_proutes.view'\nE       \nE       - ['a', '/a', 'r2e_tests.test_scripts.test_proutes.view']\nE       ?              ----\nE       \nE       + ['a', '/a', 'tests.test_scripts.test_proutes.view']\n\nr2e_tests/test_scripts/test_proutes.py:173: AssertionError\n______________________ TestPRoutesCommand.test_view_glob _______________________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_view_glob>\n\n    def test_view_glob(self):\n        from pyramid.renderers import null_renderer as nr\n        from pyramid.config import not_\n    \n        def view1(context, request):  # pragma: no cover\n            return 'view1'\n    \n        def view2(context, request):  # pragma: no cover\n            return 'view2'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method=not_('POST'),\n        )\n    \n        config.add_route('bar', '/b/a')\n        config.add_view(\n            route_name='bar',\n            view=view2,\n            renderer=nr,\n            request_method=not_('POST'),\n        )\n    \n        command = self._makeOne()\n        command.args.glob = '*foo*'\n    \n        L = []\n        command.out = L.append\n        command.bootstrap = dummy.DummyBootstrap(registry=config.registry)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo',\n            '/a/b',\n            'tests.test_scripts.test_proutes.view1',\n            '!POST,*',\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', '!POST,*'] != ['foo', '/a/b', 'tests.test_scripts.test_proutes.view1', '!POST,*']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', '!POST,*']\nE       ?                  ----\nE       \nE       + ['foo', '/a/b', 'tests.test_scripts.test_proutes.view1', '!POST,*']\n\nr2e_tests/test_scripts/test_proutes.py:635: AssertionError\n_____________ TestPRoutesCommand.test_view_request_method_not_post _____________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_view_request_method_not_post>\n\n    def test_view_request_method_not_post(self):\n        from pyramid.renderers import null_renderer as nr\n        from pyramid.config import not_\n    \n        def view1(context, request):  # pragma: no cover\n            return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method=not_('POST'),\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = dummy.DummyBootstrap(registry=config.registry)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo',\n            '/a/b',\n            'tests.test_scripts.test_proutes.view1',\n            '!POST,*',\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', '!POST,*'] != ['foo', '/a/b', 'tests.test_scripts.test_proutes.view1', '!POST,*']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', '!POST,*']\nE       ?                  ----\nE       \nE       + ['foo', '/a/b', 'tests.test_scripts.test_proutes.view1', '!POST,*']\n\nr2e_tests/test_scripts/test_proutes.py:590: AssertionError\n_____________ TestPServeCommand.test_config_file_finds_watch_files _____________\n\nself = <r2e_tests.test_scripts.test_pserve.TestPServeCommand testMethod=test_config_file_finds_watch_files>\n\n    def test_config_file_finds_watch_files(self):\n        inst = self._makeOne('development.ini')\n        loader = self.loader('/base/path.ini')\n        loader.settings = {\n            'pserve': {'watch_files': 'foo\\n/baz\\ntests.test_scripts:*.py'}\n        }\n        inst.pserve_file_config(loader, global_conf={'a': '1'})\n        self.assertEqual(loader.calls[0]['defaults'], {'a': '1'})\n>       self.assertEqual(\n            inst.watch_files,\n            {\n                os.path.abspath('/base/foo'),\n                os.path.abspath('/baz'),\n                os.path.abspath(os.path.join(here, '*.py')),\n            },\n        )\nE       AssertionError: Items in the first set but not the second:\nE       '/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/tests/test_scripts/*.py'\nE       Items in the second set but not the first:\nE       '/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/test_scripts/*.py'\n\nr2e_tests/test_scripts/test_pserve.py:90: AssertionError\n____________ TestPViewsCommand.test_views_command_multi_view_nested ____________\n\nself = <r2e_tests.test_scripts.test_pviews.TestPViewsCommand testMethod=test_views_command_multi_view_nested>\n\n    def test_views_command_multi_view_nested(self):\n        from pyramid.registry import Registry\n    \n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n        view1 = dummy.DummyView(context='context', view_name='a1')\n        view1.__name__ = 'view1'\n        view1.__view_attr__ = 'call'\n        multiview1 = dummy.DummyMultiView(\n            view1, context='context', view_name='a1'\n        )\n        multiview2 = dummy.DummyMultiView(\n            multiview1, context='context', view_name='a'\n        )\n        command._find_view = lambda arg1: multiview2\n        command.args.config_uri = '/foo/bar/myapp.ini#myapp'\n        command.args.url = '/a'\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(L[1], 'URL = /a')\n        self.assertEqual(L[3], '    context: context')\n        self.assertEqual(L[4], '    view name: a')\n>       self.assertEqual(L[8], '    tests.test_scripts.dummy.DummyMultiView')\nE       AssertionError: '    r2e_tests.test_scripts.dummy.DummyMultiView' != '    tests.test_scripts.dummy.DummyMultiView'\nE       -     r2e_tests.test_scripts.dummy.DummyMultiView\nE       ?     ----\nE       +     tests.test_scripts.dummy.DummyMultiView\n\nr2e_tests/test_scripts/test_pviews.py:482: AssertionError\n________________ TestPViewsCommand.test_views_command_multiview ________________\n\nself = <r2e_tests.test_scripts.test_pviews.TestPViewsCommand testMethod=test_views_command_multiview>\n\n    def test_views_command_multiview(self):\n        from pyramid.registry import Registry\n    \n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n        view = dummy.DummyView(context='context')\n        view.__name__ = 'view'\n        view.__view_attr__ = 'call'\n        multiview = dummy.DummyMultiView(\n            view, context='context', view_name='a'\n        )\n        command._find_view = lambda arg1: multiview\n        command.args.config_uri = '/foo/bar/myapp.ini#myapp'\n        command.args.url = '/a'\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(L[1], 'URL = /a')\n        self.assertEqual(L[3], '    context: context')\n        self.assertEqual(L[4], '    view name: a')\n>       self.assertEqual(L[8], '    tests.test_scripts.dummy.view.call')\nE       AssertionError: '    r2e_tests.test_scripts.dummy.view.call' != '    tests.test_scripts.dummy.view.call'\nE       -     r2e_tests.test_scripts.dummy.view.call\nE       ?     ----\nE       +     tests.test_scripts.dummy.view.call\n\nr2e_tests/test_scripts/test_pviews.py:538: AssertionError\n________ TestPViewsCommand.test_views_command_multiview_with_permission ________\n\nself = <r2e_tests.test_scripts.test_pviews.TestPViewsCommand testMethod=test_views_command_multiview_with_permission>\n\n    def test_views_command_multiview_with_permission(self):\n        from pyramid.registry import Registry\n    \n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n        view = dummy.DummyView(context='context')\n        view.__name__ = 'view'\n        view.__view_attr__ = 'call'\n        view.__permission__ = 'test'\n        multiview = dummy.DummyMultiView(\n            view, context='context', view_name='a'\n        )\n        command._find_view = lambda arg1: multiview\n        command.args.config_uri = '/foo/bar/myapp.ini#myapp'\n        command.args.url = '/a'\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(L[1], 'URL = /a')\n        self.assertEqual(L[3], '    context: context')\n        self.assertEqual(L[4], '    view name: a')\n>       self.assertEqual(L[8], '    tests.test_scripts.dummy.view.call')\nE       AssertionError: '    r2e_tests.test_scripts.dummy.view.call' != '    tests.test_scripts.dummy.view.call'\nE       -     r2e_tests.test_scripts.dummy.view.call\nE       ?     ----\nE       +     tests.test_scripts.dummy.view.call\n\nr2e_tests/test_scripts/test_pviews.py:562: AssertionError\n________ TestPViewsCommand.test_views_command_multiview_with_predicates ________\n\nself = <r2e_tests.test_scripts.test_pviews.TestPViewsCommand testMethod=test_views_command_multiview_with_predicates>\n\n    def test_views_command_multiview_with_predicates(self):\n        from pyramid.registry import Registry\n    \n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n    \n        def predicate():  # pragma: no cover\n            pass\n    \n        predicate.text = lambda *arg: \"predicate = x\"\n        view = dummy.DummyView(context='context')\n        view.__name__ = 'view'\n        view.__view_attr__ = 'call'\n        view.__predicates__ = [predicate]\n        multiview = dummy.DummyMultiView(\n            view, context='context', view_name='a'\n        )\n        command._find_view = lambda arg1: multiview\n        command.args.config_uri = '/foo/bar/myapp.ini#myapp'\n        command.args.url = '/a'\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(L[1], 'URL = /a')\n        self.assertEqual(L[3], '    context: context')\n        self.assertEqual(L[4], '    view name: a')\n>       self.assertEqual(L[8], '    tests.test_scripts.dummy.view.call')\nE       AssertionError: '    r2e_tests.test_scripts.dummy.view.call' != '    tests.test_scripts.dummy.view.call'\nE       -     r2e_tests.test_scripts.dummy.view.call\nE       ?     ----\nE       +     tests.test_scripts.dummy.view.call\n\nr2e_tests/test_scripts/test_pviews.py:592: AssertionError\n_____ TestPViewsCommand.test_views_command_single_view_function_traversal ______\n\nself = <r2e_tests.test_scripts.test_pviews.TestPViewsCommand testMethod=test_views_command_single_view_function_traversal>\n\n    def test_views_command_single_view_function_traversal(self):\n        from pyramid.registry import Registry\n    \n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n    \n        def view():  # pragma: no cover\n            pass\n    \n        view.__request_attrs__ = {'context': 'context', 'view_name': 'a'}\n        command._find_view = lambda arg1: view\n        command.args.config_uri = '/foo/bar/myapp.ini#myapp'\n        command.args.url = '/a'\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(L[1], 'URL = /a')\n        self.assertEqual(L[3], '    context: context')\n        self.assertEqual(L[4], '    view name: a')\n>       self.assertEqual(L[8], '    tests.test_scripts.test_pviews.view')\nE       AssertionError: '    r2e_tests.test_scripts.test_pviews.view' != '    tests.test_scripts.test_pviews.view'\nE       -     r2e_tests.test_scripts.test_pviews.view\nE       ?     ----\nE       +     tests.test_scripts.test_pviews.view\n\nr2e_tests/test_scripts/test_pviews.py:385: AssertionError\n____________ TestPViewsCommand.test_views_command_single_view_route ____________\n\nself = <r2e_tests.test_scripts.test_pviews.TestPViewsCommand testMethod=test_views_command_single_view_route>\n\n    def test_views_command_single_view_route(self):\n        from pyramid.registry import Registry\n    \n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n        route = dummy.DummyRoute('a', '/a', matchdict={})\n        view = dummy.DummyView(\n            context='context', view_name='a', matched_route=route, subpath=''\n        )\n        command._find_view = lambda arg1: view\n        command.args.config_uri = '/foo/bar/myapp.ini#myapp'\n        command.args.url = '/a'\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(L[1], 'URL = /a')\n        self.assertEqual(L[3], '    context: context')\n        self.assertEqual(L[4], '    view name: a')\n        self.assertEqual(L[6], '    Route:')\n        self.assertEqual(L[8], '    route name: a')\n        self.assertEqual(L[9], '    route pattern: /a')\n        self.assertEqual(L[10], '    route path: /a')\n        self.assertEqual(L[11], '    subpath: ')\n>       self.assertEqual(L[15], '        tests.test_scripts.dummy.DummyView')\nE       AssertionError: '        r2e_tests.test_scripts.dummy.DummyView' != '        tests.test_scripts.dummy.DummyView'\nE       -         r2e_tests.test_scripts.dummy.DummyView\nE       ?         ----\nE       +         tests.test_scripts.dummy.DummyView\n\nr2e_tests/test_scripts/test_pviews.py:456: AssertionError\n_ TestPViewsCommand.test_views_command_single_view_route_with_route_predicates _\n\nself = <r2e_tests.test_scripts.test_pviews.TestPViewsCommand testMethod=test_views_command_single_view_route_with_route_predicates>\n\n    def test_views_command_single_view_route_with_route_predicates(self):\n        from pyramid.registry import Registry\n    \n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n    \n        def predicate():  # pragma: no cover\n            pass\n    \n        predicate.text = lambda *arg: \"predicate = x\"\n        route = dummy.DummyRoute('a', '/a', matchdict={}, predicate=predicate)\n        view = dummy.DummyView(\n            context='context', view_name='a', matched_route=route, subpath=''\n        )\n        command._find_view = lambda arg1: view\n        command.args.config_uri = '/foo/bar/myapp.ini#myapp'\n        command.args.url = '/a'\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(L[1], 'URL = /a')\n        self.assertEqual(L[3], '    context: context')\n        self.assertEqual(L[4], '    view name: a')\n        self.assertEqual(L[6], '    Route:')\n        self.assertEqual(L[8], '    route name: a')\n        self.assertEqual(L[9], '    route pattern: /a')\n        self.assertEqual(L[10], '    route path: /a')\n        self.assertEqual(L[11], '    subpath: ')\n        self.assertEqual(L[12], '    route predicates (predicate = x)')\n>       self.assertEqual(L[16], '        tests.test_scripts.dummy.DummyView')\nE       AssertionError: '        r2e_tests.test_scripts.dummy.DummyView' != '        tests.test_scripts.dummy.DummyView'\nE       -         r2e_tests.test_scripts.dummy.DummyView\nE       ?         ----\nE       +         tests.test_scripts.dummy.DummyView\n\nr2e_tests/test_scripts/test_pviews.py:515: AssertionError\n__________ TestPViewsCommand.test_views_command_single_view_traversal __________\n\nself = <r2e_tests.test_scripts.test_pviews.TestPViewsCommand testMethod=test_views_command_single_view_traversal>\n\n    def test_views_command_single_view_traversal(self):\n        from pyramid.registry import Registry\n    \n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n        view = dummy.DummyView(context='context', view_name='a')\n        command._find_view = lambda arg1: view\n        command.args.config_uri = '/foo/bar/myapp.ini#myapp'\n        command.args.url = '/a'\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(L[1], 'URL = /a')\n        self.assertEqual(L[3], '    context: context')\n        self.assertEqual(L[4], '    view name: a')\n>       self.assertEqual(L[8], '    tests.test_scripts.dummy.DummyView')\nE       AssertionError: '    r2e_tests.test_scripts.dummy.DummyView' != '    tests.test_scripts.dummy.DummyView'\nE       -     r2e_tests.test_scripts.dummy.DummyView\nE       ?     ----\nE       +     tests.test_scripts.dummy.DummyView\n\nr2e_tests/test_scripts/test_pviews.py:363: AssertionError\n__ TestPViewsCommand.test_views_command_single_view_traversal_with_permission __\n\nself = <r2e_tests.test_scripts.test_pviews.TestPViewsCommand testMethod=test_views_command_single_view_traversal_with_permission>\n\n    def test_views_command_single_view_traversal_with_permission(self):\n        from pyramid.registry import Registry\n    \n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n        view = dummy.DummyView(context='context', view_name='a')\n        view.__permission__ = 'test'\n        command._find_view = lambda arg1: view\n        command.args.config_uri = '/foo/bar/myapp.ini#myapp'\n        command.args.url = '/a'\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(L[1], 'URL = /a')\n        self.assertEqual(L[3], '    context: context')\n        self.assertEqual(L[4], '    view name: a')\n>       self.assertEqual(L[8], '    tests.test_scripts.dummy.DummyView')\nE       AssertionError: '    r2e_tests.test_scripts.dummy.DummyView' != '    tests.test_scripts.dummy.DummyView'\nE       -     r2e_tests.test_scripts.dummy.DummyView\nE       ?     ----\nE       +     tests.test_scripts.dummy.DummyView\n\nr2e_tests/test_scripts/test_pviews.py:404: AssertionError\n__ TestPViewsCommand.test_views_command_single_view_traversal_with_predicates __\n\nself = <r2e_tests.test_scripts.test_pviews.TestPViewsCommand testMethod=test_views_command_single_view_traversal_with_predicates>\n\n    def test_views_command_single_view_traversal_with_predicates(self):\n        from pyramid.registry import Registry\n    \n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n    \n        def predicate():  # pragma: no cover\n            pass\n    \n        predicate.text = lambda *arg: \"predicate = x\"\n        view = dummy.DummyView(context='context', view_name='a')\n        view.__predicates__ = [predicate]\n        command._find_view = lambda arg1: view\n        command.args.config_uri = '/foo/bar/myapp.ini#myapp'\n        command.args.url = '/a'\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(L[1], 'URL = /a')\n        self.assertEqual(L[3], '    context: context')\n        self.assertEqual(L[4], '    view name: a')\n>       self.assertEqual(L[8], '    tests.test_scripts.dummy.DummyView')\nE       AssertionError: '    r2e_tests.test_scripts.dummy.DummyView' != '    tests.test_scripts.dummy.DummyView'\nE       -     r2e_tests.test_scripts.dummy.DummyView\nE       ?     ----\nE       +     tests.test_scripts.dummy.DummyView\n\nr2e_tests/test_scripts/test_pviews.py:429: AssertionError\n=============================== warnings summary ===============================\nsrc/pyramid/asset.py:2\n  /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/src/pyramid/asset.py:2: DeprecationWarning: pkg_resources is deprecated as an API. See https://setuptools.pypa.io/en/latest/pkg_resources.html\n    import pkg_resources\n\n.venv/lib/python3.8/site-packages/pkg_resources/__init__.py:3154\n  /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/.venv/lib/python3.8/site-packages/pkg_resources/__init__.py:3154: DeprecationWarning: Deprecated call to `pkg_resources.declare_namespace('paste')`.\n  Implementing implicit namespace packages (as specified in PEP 420) is preferred to `pkg_resources.declare_namespace`. See https://setuptools.pypa.io/en/latest/references/keywords.html#keyword-namespace-packages\n    declare_namespace(pkg)\n\n.venv/lib/python3.8/site-packages/pkg_resources/__init__.py:3154\n.venv/lib/python3.8/site-packages/pkg_resources/__init__.py:3154\n.venv/lib/python3.8/site-packages/pkg_resources/__init__.py:3154\n.venv/lib/python3.8/site-packages/pkg_resources/__init__.py:3154\n.venv/lib/python3.8/site-packages/pkg_resources/__init__.py:3154\n  /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/.venv/lib/python3.8/site-packages/pkg_resources/__init__.py:3154: DeprecationWarning: Deprecated call to `pkg_resources.declare_namespace('zope')`.\n  Implementing implicit namespace packages (as specified in PEP 420) is preferred to `pkg_resources.declare_namespace`. See https://setuptools.pypa.io/en/latest/references/keywords.html#keyword-namespace-packages\n    declare_namespace(pkg)\n\nr2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_authentication_policy\nr2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_authorization_policy_only\nr2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authentication_policy\nr2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authentication_policy_dottedname\nr2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authorization_policy_dottedname\nr2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authorization_policy_only\nr2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_no_default_permission_no_explicit_permission\n  /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/src/pyramid/config/__init__.py:405: DeprecationWarning: Authentication and authorization policies have been deprecated in favor of security policies.  See \"Upgrading Authentication/Authorization\" in \"What's New in Pyramid 2.0\" of the documentation for more information.\n    self.set_authorization_policy(authorization_policy)\n\nr2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_authentication_policy\nr2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authentication_policy\nr2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authentication_policy_dottedname\nr2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authorization_policy_dottedname\nr2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_no_default_permission_no_explicit_permission\n  /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/src/pyramid/config/__init__.py:408: DeprecationWarning: Authentication and authorization policies have been deprecated in favor of security policies.  See \"Upgrading Authentication/Authorization\" in \"What's New in Pyramid 2.0\" of the documentation for more information.\n    self.set_authentication_policy(authentication_policy)\n\nr2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authentication_policy_no_authz_policy\n  /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/test_config/test_security.py:38: DeprecationWarning: Authentication and authorization policies have been deprecated in favor of security policies.  See \"Upgrading Authentication/Authorization\" in \"What's New in Pyramid 2.0\" of the documentation for more information.\n    config.set_authentication_policy(policy)\n\nr2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authentication_policy_no_authz_policy_autocommit\n  /home/gcpuser/.local/share/uv/python/cpython-3.8.20-linux-x86_64-gnu/lib/python3.8/unittest/case.py:202: DeprecationWarning: Authentication and authorization policies have been deprecated in favor of security policies.  See \"Upgrading Authentication/Authorization\" in \"What's New in Pyramid 2.0\" of the documentation for more information.\n    callable_obj(*args, **kwargs)\n\nr2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authentication_policy_with_authz_policy\n  /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/test_config/test_security.py:58: DeprecationWarning: Authentication and authorization policies have been deprecated in favor of security policies.  See \"Upgrading Authentication/Authorization\" in \"What's New in Pyramid 2.0\" of the documentation for more information.\n    config.set_authentication_policy(authn_policy)\n\nr2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authentication_policy_with_authz_policy_autocommit\n  /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/test_config/test_security.py:77: DeprecationWarning: Authentication and authorization policies have been deprecated in favor of security policies.  See \"Upgrading Authentication/Authorization\" in \"What's New in Pyramid 2.0\" of the documentation for more information.\n    config.set_authentication_policy(authn_policy)\n\nr2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authentication_policy_with_security_policy\n  /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/test_config/test_security.py:32: DeprecationWarning: Authentication and authorization policies have been deprecated in favor of security policies.  See \"Upgrading Authentication/Authorization\" in \"What's New in Pyramid 2.0\" of the documentation for more information.\n    config.set_authentication_policy(authn_policy)\n\nr2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authorization_policy_no_authn_policy\n  /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/test_config/test_security.py:89: DeprecationWarning: Authentication and authorization policies have been deprecated in favor of security policies.  See \"Upgrading Authentication/Authorization\" in \"What's New in Pyramid 2.0\" of the documentation for more information.\n    config.set_authorization_policy(policy)\n\nr2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authorization_policy_no_authn_policy_autocommit\n  /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/test_config/test_security.py:97: DeprecationWarning: Authentication and authorization policies have been deprecated in favor of security policies.  See \"Upgrading Authentication/Authorization\" in \"What's New in Pyramid 2.0\" of the documentation for more information.\n    config.set_authorization_policy(policy)\n\nr2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authorization_policy_with_authn_policy\n  /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/test_config/test_security.py:110: DeprecationWarning: Authentication and authorization policies have been deprecated in favor of security policies.  See \"Upgrading Authentication/Authorization\" in \"What's New in Pyramid 2.0\" of the documentation for more information.\n    config.set_authorization_policy(authz_policy)\n\nr2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authorization_policy_with_authn_policy_autocommit\n  /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_942c6c07a643d8f2253b190882fae72aba3f0ea8/r2e_tests/test_config/test_security.py:124: DeprecationWarning: Authentication and authorization policies have been deprecated in favor of security policies.  See \"Upgrading Authentication/Authorization\" in \"What's New in Pyramid 2.0\" of the documentation for more information.\n    config.set_authorization_policy(authz_policy)\n\n-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html\n==================================== PASSES ====================================\n=========================== short test summary info ============================\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_authenticated_userid\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_authenticated_userid_None\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_authenticated_userid_repoze_who_userid_is_None\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_authenticated_userid_unclean_principal_Authenticated\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_authenticated_userid_unclean_principal_Everyone\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_authenticated_userid_with_callback_returns_None\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_authenticated_userid_with_callback_returns_something\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_class_implements_IAuthenticationPolicy\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_effective_principals_None\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_effective_principals_repoze_who_userid_is_None\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_effective_principals_repoze_who_userid_is_unclean_Authenticated\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_effective_principals_repoze_who_userid_is_unclean_Everyone\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_effective_principals_userid_and_groups\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_effective_principals_userid_callback_returns_None\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_effective_principals_userid_only\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_forget\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_forget_no_plugins\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_instance_implements_IAuthenticationPolicy\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_remember\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_remember_kwargs\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_remember_no_plugins\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_unauthenticated_userid\nPASSED r2e_tests/test_1.py::TestRepozeWho1AuthenticationPolicy::test_unauthenticated_userid_returns_None\nPASSED r2e_tests/test_1.py::TestRemoteUserAuthenticationPolicy::test_authenticated_userid\nPASSED r2e_tests/test_1.py::TestRemoteUserAuthenticationPolicy::test_authenticated_userid_None\nPASSED r2e_tests/test_1.py::TestRemoteUserAuthenticationPolicy::test_class_implements_IAuthenticationPolicy\nPASSED r2e_tests/test_1.py::TestRemoteUserAuthenticationPolicy::test_effective_principals\nPASSED r2e_tests/test_1.py::TestRemoteUserAuthenticationPolicy::test_effective_principals_None\nPASSED r2e_tests/test_1.py::TestRemoteUserAuthenticationPolicy::test_forget\nPASSED r2e_tests/test_1.py::TestRemoteUserAuthenticationPolicy::test_instance_implements_IAuthenticationPolicy\nPASSED r2e_tests/test_1.py::TestRemoteUserAuthenticationPolicy::test_remember\nPASSED r2e_tests/test_1.py::TestRemoteUserAuthenticationPolicy::test_unauthenticated_userid\nPASSED r2e_tests/test_1.py::TestRemoteUserAuthenticationPolicy::test_unauthenticated_userid_returns_None\nPASSED r2e_tests/test_1.py::TestAuthTktAuthenticationPolicy::test_allargs\nPASSED r2e_tests/test_1.py::TestAuthTktAuthenticationPolicy::test_authenticated_userid\nPASSED r2e_tests/test_1.py::TestAuthTktAuthenticationPolicy::test_authenticated_userid_callback_returns_None\nPASSED r2e_tests/test_1.py::TestAuthTktAuthenticationPolicy::test_authenticated_userid_no_cookie_identity\nPASSED r2e_tests/test_1.py::TestAuthTktAuthenticationPolicy::test_class_implements_IAuthenticationPolicy\nPASSED r2e_tests/test_1.py::TestAuthTktAuthenticationPolicy::test_effective_principals\nPASSED r2e_tests/test_1.py::TestAuthTktAuthenticationPolicy::test_effective_principals_callback_returns_None\nPASSED r2e_tests/test_1.py::TestAuthTktAuthenticationPolicy::test_effective_principals_no_cookie_identity\nPASSED r2e_tests/test_1.py::TestAuthTktAuthenticationPolicy::test_forget\nPASSED r2e_tests/test_1.py::TestAuthTktAuthenticationPolicy::test_hashalg_override\nPASSED r2e_tests/test_1.py::TestAuthTktAuthenticationPolicy::test_instance_implements_IAuthenticationPolicy\nPASSED r2e_tests/test_1.py::TestAuthTktAuthenticationPolicy::test_remember\nPASSED r2e_tests/test_1.py::TestAuthTktAuthenticationPolicy::test_remember_with_extra_kargs\nPASSED r2e_tests/test_1.py::TestAuthTktAuthenticationPolicy::test_unauthenticated_userid\nPASSED r2e_tests/test_1.py::TestAuthTktAuthenticationPolicy::test_unauthenticated_userid_returns_None\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_forget\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_bad_cookie\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_cookie_reissue\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_cookie_reissue_already_reissued_this_request\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_cookie_reissue_notyet\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_cookie_reissue_revoked_by_forget\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_cookie_reissue_revoked_by_remember\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_cookie_reissue_with_tokens_default\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_cookie_str_reissue\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_cookie_str_timeout\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_cookie_timeout\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_cookie_timeout_aged\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_cookie_value_is_None\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_good_cookie_b64str_useridtype\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_good_cookie_b64unicode_useridtype\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_good_cookie_dont_include_ip\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_good_cookie_include_ip\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_good_cookie_include_ipv6\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_good_cookie_int_useridtype\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_good_cookie_unknown_useridtype\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_nocookie\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_identify_nonuseridtype_user_data\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_init_cookie_str_max_age_invalid\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_init_cookie_str_reissue_invalid\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_init_cookie_str_timeout_invalid\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_None_samesite\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_binary_userid\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_domain_supercedes_parent_and_wild_domain\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_explicit_domain\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_http_only\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_include_ip\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_insane_userid\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_int_userid\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_invalid_token_format\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_max_age\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_nonascii_token\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_nondefault_samesite\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_parent_domain\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_parent_domain_supercedes_wild_domain\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_path\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_samesite_default\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_samesite_nondefault\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_secure\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_str_max_age\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_str_max_age_invalid\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_tokens\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_unicode_but_ascii_token\nPASSED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_unicode_userid\nPASSED r2e_tests/test_1.py::TestAuthTicket::test_cookie_value\nPASSED r2e_tests/test_1.py::TestAuthTicket::test_ctor_with_time\nPASSED r2e_tests/test_1.py::TestAuthTicket::test_ctor_with_tokens\nPASSED r2e_tests/test_1.py::TestAuthTicket::test_digest\nPASSED r2e_tests/test_1.py::TestAuthTicket::test_digest_sha512\nPASSED r2e_tests/test_1.py::TestAuthTicket::test_ipv4\nPASSED r2e_tests/test_1.py::TestAuthTicket::test_ipv6\nPASSED r2e_tests/test_1.py::TestBadTicket::test_it\nPASSED r2e_tests/test_1.py::Test_parse_ticket::test_bad_timestamp\nPASSED r2e_tests/test_1.py::Test_parse_ticket::test_bad_userid_or_data\nPASSED r2e_tests/test_1.py::Test_parse_ticket::test_correct_with_user_data\nPASSED r2e_tests/test_1.py::Test_parse_ticket::test_correct_with_user_data_sha512\nPASSED r2e_tests/test_1.py::Test_parse_ticket::test_digest_sig_incorrect\nPASSED r2e_tests/test_1.py::Test_parse_ticket::test_ipv4\nPASSED r2e_tests/test_1.py::Test_parse_ticket::test_ipv6\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationPolicy::test_authenticated_userid\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationPolicy::test_authenticated_userid_callback_returns_None\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationPolicy::test_authenticated_userid_no_cookie_identity\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationPolicy::test_class_implements_IAuthenticationPolicy\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationPolicy::test_effective_principals\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationPolicy::test_effective_principals_callback_returns_None\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationPolicy::test_effective_principals_no_identity\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationPolicy::test_forget\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationPolicy::test_forget_no_identity\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationPolicy::test_instance_implements_IAuthenticationPolicy\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationPolicy::test_remember\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationPolicy::test_unauthenticated_userid\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationPolicy::test_unauthenticated_userid_returns_None\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationHelper::test_authenticated_userid\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationHelper::test_authenticated_userid_none\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationHelper::test_authenticated_userid_with_prefix\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationHelper::test_forget\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationHelper::test_forget_no_identity\nPASSED r2e_tests/test_1.py::TestSessionAuthenticationHelper::test_remember\nPASSED r2e_tests/test_1.py::TestBasicAuthAuthenticationPolicy::test_authenticated_userid\nPASSED r2e_tests/test_1.py::TestBasicAuthAuthenticationPolicy::test_authenticated_userid_latin1\nPASSED r2e_tests/test_1.py::TestBasicAuthAuthenticationPolicy::test_authenticated_userid_utf8\nPASSED r2e_tests/test_1.py::TestBasicAuthAuthenticationPolicy::test_class_implements_IAuthenticationPolicy\nPASSED r2e_tests/test_1.py::TestBasicAuthAuthenticationPolicy::test_forget\nPASSED r2e_tests/test_1.py::TestBasicAuthAuthenticationPolicy::test_remember\nPASSED r2e_tests/test_1.py::TestBasicAuthAuthenticationPolicy::test_unauthenticated_bad_header\nPASSED r2e_tests/test_1.py::TestBasicAuthAuthenticationPolicy::test_unauthenticated_userid\nPASSED r2e_tests/test_1.py::TestBasicAuthAuthenticationPolicy::test_unauthenticated_userid_corrupt_base64\nPASSED r2e_tests/test_1.py::TestBasicAuthAuthenticationPolicy::test_unauthenticated_userid_invalid_payload\nPASSED r2e_tests/test_1.py::TestBasicAuthAuthenticationPolicy::test_unauthenticated_userid_no_credentials\nPASSED r2e_tests/test_1.py::TestBasicAuthAuthenticationPolicy::test_unauthenticated_userid_not_basic\nPASSED r2e_tests/test_1.py::TestExtractHTTPBasicCredentials::test_invalid_payload\nPASSED r2e_tests/test_1.py::TestExtractHTTPBasicCredentials::test_latin1_payload\nPASSED r2e_tests/test_1.py::TestExtractHTTPBasicCredentials::test_namedtuple_return\nPASSED r2e_tests/test_1.py::TestExtractHTTPBasicCredentials::test_no_auth_header\nPASSED r2e_tests/test_1.py::TestExtractHTTPBasicCredentials::test_no_base64_encoding\nPASSED r2e_tests/test_1.py::TestExtractHTTPBasicCredentials::test_not_a_basic_auth_scheme\nPASSED r2e_tests/test_1.py::TestExtractHTTPBasicCredentials::test_utf8_payload\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_action_autocommit_with_introspectables\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_action_autocommit_with_introspectables_introspection_off\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_action_branching_kw_is_None\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_action_branching_kw_is_not_None\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_action_branching_nonautocommit_with_config_info\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_action_branching_nonautocommit_with_introspectables\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_action_branching_nonautocommit_without_config_info\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_action_nonautocommit_with_introspectables_introspection_off\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_autocommit_no_conflicts\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_commit_conflict_resolved_with_include\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_commit_conflict_resolved_with_two_includes_and_local\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_commit_conflict_simple\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_commit_conflict_with_two_includes\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_conflict_set_forbidden_view\nPASSED r2e_tests/test_config/test_actions.py::ActionConfiguratorMixinTests::test_conflict_set_notfound_view\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_action_simple\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_action_with_includepath\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_action_with_includepath_and_info\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_action_with_info\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_action_with_introspectables\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_action_with_order\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_execute_actions_dicts\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_execute_actions_error\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_execute_actions_tuples\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_execute_actions_with_introspectable_no_callable\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_execute_actions_with_introspectables\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_executing_conflicting_action_across_orders\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_executing_conflicting_action_across_reentrant_orders\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_it\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_processSpec\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_reentrant_action\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_reentrant_action_error\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_reentrant_action_with_deferred_discriminator\nPASSED r2e_tests/test_config/test_actions.py::TestActionState::test_reentrant_action_without_clear\nPASSED r2e_tests/test_config/test_actions.py::Test_reentrant_action_functional::test_deferred_discriminator\nPASSED r2e_tests/test_config/test_actions.py::Test_reentrant_action_functional::test_functional\nPASSED r2e_tests/test_config/test_actions.py::Test_resolveConflicts::test_conflicts_across_orders\nPASSED r2e_tests/test_config/test_actions.py::Test_resolveConflicts::test_it_conflict\nPASSED r2e_tests/test_config/test_actions.py::Test_resolveConflicts::test_it_success_dicts\nPASSED r2e_tests/test_config/test_actions.py::Test_resolveConflicts::test_it_success_tuples\nPASSED r2e_tests/test_config/test_actions.py::Test_resolveConflicts::test_it_with_actions_grouped_by_order\nPASSED r2e_tests/test_config/test_actions.py::Test_resolveConflicts::test_override_success_across_orders\nPASSED r2e_tests/test_config/test_actions.py::TestActionInfo::test___str__\nPASSED r2e_tests/test_config/test_actions.py::TestActionInfo::test_class_conforms\nPASSED r2e_tests/test_config/test_actions.py::TestActionInfo::test_ctor\nPASSED r2e_tests/test_config/test_actions.py::TestActionInfo::test_instance_conforms\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_object_event_subscriber\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_resource_url_default_resource_iface_means_Interface\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_resource_url_nodefault_resource_iface\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_response_adapter\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_response_adapter_dottednames\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_response_adapter_self\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_defaults\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_dottednames\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_iface_specified\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_predicate\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_with_default_type_predicates_False\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_with_default_type_predicates_True\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_with_specific_type_and_predicates_False\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_with_specific_type_and_predicates_True\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_traverser_default_iface_means_Interface\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_traverser_introspectables\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_traverser_nondefault_iface\nPASSED r2e_tests/test_config/test_adapters.py::Test_eventonly::test_defaults\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test__override_already_registered\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test__override_not_yet_registered\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_directory_with_absdirectory\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_directory_with_absfile\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_directory_with_file\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_absdirectory\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_absfile\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_directory\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_missing_abspath\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_package\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_package_with_absdirectory\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_samename\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_filename_override_returns_value\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_stream_no_overrides\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_stream_override_returns_None\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_stream_override_returns_value\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_string_no_overrides\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_string_override_returns_None\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_string_override_returns_value\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_has_resource_no_overrides\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_has_resource_override_returns_None\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_has_resource_override_returns_True\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_isdir_no_overrides\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_isdir_override_returns_False\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_isdir_override_returns_None\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_listdir_no_overrides\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_listdir_override_returns_None\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_listdir_override_returns_values\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_class_conforms_to_IPEP302Loader\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_class_conforms_to_IPackageOverrides\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_ctor_package_already_has_loader_of_different_type\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_ctor_package_already_has_loader_of_same_type\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_ctor_registers_loader_type\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_ctor_sets_loader\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_ctor_sets_local_state\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_filtered_sources\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_code_pkg_has___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_code_pkg_has_no___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_data_pkg_has___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_data_pkg_has_no___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_filename\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_filename_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_source_pkg_has___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_source_pkg_has_no___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_stream\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_stream_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_string\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_string_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_has_resource\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_has_resource_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_insert_directory\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_insert_emptystring\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_insert_file\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_instance_conforms_to_IPEP302Loader\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_instance_conforms_to_IPackageOverrides\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_is_package_pkg_has___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_is_package_pkg_has_no___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_isdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_isdir_false\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_isdir_true\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_listdir\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_listdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_exists\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_exists_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_exists_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_filename_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_stream\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_stream_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_stream_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_string\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_string_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_string_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_isdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_isdir_false\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_isdir_true\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_listdir\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_listdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_exists\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_exists_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_exists_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_filename\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_filename_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_filename_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_stream\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_stream_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_stream_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_string\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_string_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_string_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_isdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_isdir_false\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_isdir_true\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_listdir\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_listdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestDirectoryOverride::test_it_match\nPASSED r2e_tests/test_config/test_assets.py::TestDirectoryOverride::test_it_no_match\nPASSED r2e_tests/test_config/test_assets.py::TestFileOverride::test_it_match\nPASSED r2e_tests/test_config/test_assets.py::TestFileOverride::test_it_no_match\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_None_callable\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_None_callable_and_no_name\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_None_callable_conflict\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_callable\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_text_name\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_unnamed_callable\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_execution_policy\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_execution_policy_to_None\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_multiple_request_methods_conflict\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_request_factory\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_response_factory\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_root_factory\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_root_factory_as_None\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_session_factory\nPASSED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_invalid_kwargs\nPASSED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_missing_dir\nPASSED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_no_specs\nPASSED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_set_locale_negotiator\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test___getattr__matches\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test___getattr__matches_no_action_wrap\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test___getattr__missing_when_directives_dont_exist\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test___getattr__missing_when_directives_exist\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_adds__lock\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_adds_clear_view_lookup_cache\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_has_listeners\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_notify\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_queryAdapterOrSelf\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_registerSelfAdapter\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_absolute_asset_spec_already_absolute\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_absolute_asset_spec_notastring\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_absolute_asset_spec_relative\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_begin\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_begin_does_not_propagate_request_for_diff_registry\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_begin_overrides_request\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_begin_propagates_request_for_same_registry\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_begin_with_request\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_context_manager\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_alternate_renderers\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_authentication_policy\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_authorization_policy_only\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_default_permission\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_default_renderers\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_default_view_mapper\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_default_webob_response_adapter_registered\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_exceptionresponse_view_None\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_exceptionresponse_view_custom\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_httpexception_view_default\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_no_root_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_noreg_custom_settings\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_noreg_debug_logger_non_None\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_security_policy\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_session_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_with_introspection\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_with_package_registry\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_with_root_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_end\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_hook_zca\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_threadlocals_active\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_dotted_name\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_missing_source_file\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_module_defaults_to_includeme\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_module_defaults_to_includeme_missing\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_nested_route_prefix\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_route_prefix\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_introspector_decorator\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_make_wsgi_app\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_maybe_dotted_notstring_success\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_maybe_dotted_string_fail\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_maybe_dotted_string_success\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration_conflict\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration_dottedname_package\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration_with_extra_kw\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration_with_ignore\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration_with_onerror\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_alternate_renderers\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authentication_policy\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authentication_policy_dottedname\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authorization_policy_dottedname\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authorization_policy_only\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_calls_fix_registry\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_custom_settings\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_debug_logger_name\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_debug_logger_non_None\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_default_permission\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_dottedname_root_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_explicit_notfound_trumps_iexceptionresponse\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_includes\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_includes_spaces\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_locale_negotiator\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_locale_negotiator_dottedname\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_no_default_root_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_registers_default_exceptionresponse_views\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_registers_default_view_predicates\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_registers_default_webob_iresponse_adapter\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_request_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_request_factory_dottedname\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_response_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_unhook_zca\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_with_package\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_with_package_package\nPASSED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_directive_persists_across_configurator_creations\nPASSED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_extend_action_method_successful\nPASSED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_extend_same_name_doesnt_conflict\nPASSED r2e_tests/test_config/test_init.py::TestConfigurator__add_predicate::test_factory_as_object\nPASSED r2e_tests/test_config/test_init.py::TestGlobalRegistriesIntegration::test_global_registries\nPASSED r2e_tests/test_config/test_init.py::TestGlobalRegistriesIntegration::test_global_registries_empty\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_custom_predicates_can_affect_traversal\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_different_custom_predicates_with_same_hash\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_header_multiple\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_header_multiple_fails\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_header_multiple_mixed\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_header_multiple_mixed_fails\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_header_multiple_with_values\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_header_multiple_with_values_fails\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_header_simple\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_header_simple_fails\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_header_with_value\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_header_with_value_fails\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_header_with_value_fails_case\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_match_param_from_dict\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_match_param_from_dict_fails\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_match_param_from_string\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_match_param_from_string_fails\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_notted\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_ordering_importance_and_number\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_ordering_importance_of_predicates\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_ordering_number_of_predicates\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_ordering_xhr_and_request_method_trump_only_containment\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_predicate_close_matches\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_predicate_text_is_correct\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_predicate_text_is_correct_when_multiple\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_request_method_ordering_hashes_same\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_request_method_sequence\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_traverse_has_remainder_already\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_traverse_matches\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_traverse_matches_with_highorder_chars\nPASSED r2e_tests/test_config/test_predicates.py::TestPredicateList::test_unknown_predicate\nPASSED r2e_tests/test_config/test_predicates.py::Test_sort_accept_offers::test_default_specificities\nPASSED r2e_tests/test_config/test_predicates.py::Test_sort_accept_offers::test_params_inherit_type_prefs\nPASSED r2e_tests/test_config/test_predicates.py::Test_sort_accept_offers::test_params_order\nPASSED r2e_tests/test_config/test_predicates.py::Test_sort_accept_offers::test_specific_type_order\nPASSED r2e_tests/test_config/test_rendering.py::TestRenderingConfiguratorMixin::test_add_default_renderers\nPASSED r2e_tests/test_config/test_rendering.py::TestRenderingConfiguratorMixin::test_add_renderer\nPASSED r2e_tests/test_config/test_rendering.py::TestRenderingConfiguratorMixin::test_add_renderer_dottedname_factory\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_defaults\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_discriminator\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_effective_principals_deprecated\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_path_no_pattern\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_pattern_with_path\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_view_with_view_attr\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_view_with_view_context\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_view_with_view_permission\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_view_with_view_renderer\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_accept\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_accept_list\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_custom_predicates\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_factory\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_header\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_inherit_errors\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_path_info\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_path_info_highorder\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_path_info_regex\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_pregenerator\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_request_method\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_request_param\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_root_slash_with_route_prefix\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_route_prefix\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_route_prefix_with_inherit_slash\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_static\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_wildcard_accept_raises\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_xhr\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_get_routes_mapper_already_registered\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_get_routes_mapper_not_yet_registered\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_add_permission\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_changing_set_default_csrf_options\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authentication_policy_no_authz_policy\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authentication_policy_no_authz_policy_autocommit\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authentication_policy_with_authz_policy\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authentication_policy_with_authz_policy_autocommit\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authentication_policy_with_security_policy\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authorization_policy_no_authn_policy\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authorization_policy_no_authn_policy_autocommit\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authorization_policy_with_authn_policy\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authorization_policy_with_authn_policy_autocommit\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_default_csrf_options\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_default_permission\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_security_policy\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test__set_settings_as_None\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test__set_settings_as_dictwithvalues\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test__set_settings_does_not_uses_original_dict\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test_add_settings_settings_None\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test_add_settings_settings_already_registered\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test_add_settings_settings_not_yet_registered\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test_get_settings_nosettings\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test_get_settings_withsettings\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test_settings_parameter_dict_is_never_updated\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_csrf_trusted_origins\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_debug_all\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_debug_authorization\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_debug_notfound\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_debug_routematch\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_debug_templates\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_default_locale_name\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_noargs\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_originals_kept\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_prevent_cachebust\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_prevent_http_cache\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_reload_all\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_reload_assets\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_reload_resources\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_reload_templates\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_renderer\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_renderer_explicitrenderer\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_renderer_twice\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_subscriber_defaults\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_subscriber_multiple\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_subscriber_single\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_template\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_resources\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_securitypolicy\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_securitypolicy_forget_result\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_securitypolicy_remember_result\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_instance\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_name_ingress\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_name_main\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_over_ingress\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_over_ingress_iterable\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_under_main\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_under_main_iterable\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_unsuitable\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tweens_conflict\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tweens_names_with_over_nonstringoriter\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tweens_names_with_under_nonstringoriter\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test___call___explicit\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test___call___implicit\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_add_explicit\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_add_implicit\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_1\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_2\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_3\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_4\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_5\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_conflict_direct\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_conflict_indirect\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_missing_over_and_under_partials\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_missing_over_partial\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_missing_over_partial_with_fallback\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_missing_under_partial\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_missing_under_partial_with_fallback\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_with_missing_fallbacks\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_with_multiple_matching_fallbacks\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_with_partial_fallbacks\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_accept_view_order_override\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_accept_view_order_throws_on_type_mismatch\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_accept_view_order_throws_on_wildcard\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view_disallows_exception_only\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view_disallows_for_\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view_disallows_name\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view_disallows_permission\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view_disallows_require_csrf\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view_with_subclass\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_allows_other_predicates\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_disallows_context\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_disallows_for_\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_disallows_name\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_disallows_permission\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_disallows_require_csrf\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_no_view_argument\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_with_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_normal_and_exception_view_intr_derived_callable\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_allows_other_predicates\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_append_slash\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_append_slash_custom_response\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_disallows_context\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_disallows_for_\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_disallows_name\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_disallows_permission\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_disallows_require_csrf\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_no_view_argument\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_with_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_static_view_absolute\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_static_view_here_no_utility_registered\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_static_view_package_relative\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_instance\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_instance_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_instancemethod\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_instancemethod_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_oldstyle_class\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_oldstyle_class_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_class_method_no_attr\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_context_as_class\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_context_as_iface\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_context_trumps_for\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_custom_more_preds_first_bests_fewer_preds_last\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_custom_predicate_bests_standard_predicate\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_default_phash_overrides_default_phash\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_default_phash_overrides_no_phash\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_does_not_accept_iterable_accept\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_default_phash_overrides_default_phash\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_default_phash_overrides_no_phash\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_multiview_replaces_existing_securedview\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_multiview_replaces_existing_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_multiview_replaces_multiviews\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_multiview_replaces_only_exc_multiview\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_mulview_replaces_existing_view_with___accept__\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_same_phash_overrides_existing_single_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exc_with_accept_multiview_replaces_existing_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exception_only\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exception_only_misconfiguration\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exception_only_no_regular_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_exception_register_secured_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_for_as_class\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_for_as_iface\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_mixed_case_replaces_existing_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview___discriminator__\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview_call_ordering\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview_context_superclass_then_subclass\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview_exception_superclass_then_subclass\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview_replaces_existing_securedview\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview_replaces_existing_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview_replaces_existing_view_with___accept__\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_multiview_replaces_multiview\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_register_secured_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_same_phash_overrides_existing_single_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_same_predicates\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_view_callable_None_no_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_view_callable_None_with_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_view_callable_dottedname\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_accept_match\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_accept_multiview_replaces_existing_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_accept_nomatch\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_containment_false\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_containment_true\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_csrf_header\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_csrf_param\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_custom_predicates_match\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_custom_predicates_nomatch\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_decorator\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_decorator_tuple\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_default_permission_no_explicit_permission\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_default_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_function_callable\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_function_callable_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_badregex\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_noval_match\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_noval_nomatch\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_val_match\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_val_missing\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_val_nomatch\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_http_cache\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_mapper\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_missing_csrf_header\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_name\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_name_unicode\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_no_default_permission_no_explicit_permission\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_nonexistant_route_name\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_path_info_badregex\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_path_info_match\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_path_info_nomatch\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_permission\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_method_false\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_method_get_implies_head\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_method_sequence_conflict\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_method_sequence_false\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_method_sequence_true\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_method_true\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_param_noval_false\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_param_noval_true\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_param_val_false\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_param_val_true\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_type\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_type_and_route_name\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_type_as_iface\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_request_type_as_noniface\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_route_name\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_route_name_exception\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_tmpl_renderer_factory_introspector_missing\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_tmpl_renderer_factory_no_renderer_factory\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_tmpl_renderer_factory_with_renderer_factory\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_config_and_view_defaults_conflicts\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_config_and_view_defaults_doesnt_conflict\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_wildcard_accept_raises\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_xhr_false\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_xhr_true\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_wrapped_view_is_decorated\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_views_with_accept_multiview_replaces_existing\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_default_accept_view_order\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_derive_view_dottedname\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_derive_view_function\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_derive_view_with_default_renderer_no_explicit_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_derive_view_with_default_renderer_with_explicit_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_effective_principals_deprecated\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_set_view_mapper\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_set_view_mapper_dottedname\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_view_with_most_specific_predicate\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_view_with_most_specific_predicate_with_mismatch\nPASSED r2e_tests/test_config/test_views.py::Test_runtime_exc_view::test_call\nPASSED r2e_tests/test_config/test_views.py::Test_runtime_exc_view::test_call_dispatches_on_exception\nPASSED r2e_tests/test_config/test_views.py::Test_runtime_exc_view::test_permitted\nPASSED r2e_tests/test_config/test_views.py::Test_runtime_exc_view::test_permitted_dispatches_on_exception\nPASSED r2e_tests/test_config/test_views.py::Test_requestonly::test_defaults\nPASSED r2e_tests/test_config/test_views.py::Test_requestonly::test_otherattr\nPASSED r2e_tests/test_config/test_views.py::Test_isexception::test_is_IException\nPASSED r2e_tests/test_config/test_views.py::Test_isexception::test_is_IException_subinterface\nPASSED r2e_tests/test_config/test_views.py::Test_isexception::test_is_exception_class\nPASSED r2e_tests/test_config/test_views.py::Test_isexception::test_is_exception_instance\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test___call__\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test___call__intermediate_not_found\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test___call__raise_not_found_isnt_interpreted_as_pred_mismatch\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test___call_permissive_has_call_permissive\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test___call_permissive_has_no_call_permissive\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test__call__not_found\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test__call__with_accept_match\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test__call__with_accept_miss\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test__call_permissive__not_found\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_add\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_add_with_phash\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_add_with_phash_override_accept\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_add_with_phash_override_accept2\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_class_implements_ISecuredView\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_get_views\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_get_views_best_match_returns_None\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_get_views_no_self_accepts\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_get_views_request_has_no_accept\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_instance_implements_ISecuredView\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_match_not_found\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_match_predicate_fails\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_match_predicate_succeeds\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_multiple_with_functions_as_views\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_permitted\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_permitted_no_match_with__permitted__\nPASSED r2e_tests/test_config/test_views.py::TestMultiView::test_permitted_no_views\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test__view_as_function_with_attr\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_function_context_and_request\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_function_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_function_requestonly_with_attr\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_instance_context_and_request\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_instance_context_and_request_and_attr\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_instance_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_instance_requestonly_with_attr\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_newstyle_class_context_and_request\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_newstyle_class_context_and_request_with_attr\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_newstyle_class_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_newstyle_class_requestonly_with_attr\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_oldstyle_class_context_and_request\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_oldstyle_class_context_and_request_with_attr\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_oldstyle_class_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestDefaultViewMapper::test_view_as_oldstyle_class_requestonly_with_attr\nPASSED r2e_tests/test_config/test_views.py::Test_preserve_view_attrs::test_it_different\nPASSED r2e_tests/test_config/test_views.py::Test_preserve_view_attrs::test_it_different_with_existing_original_view\nPASSED r2e_tests/test_config/test_views.py::Test_preserve_view_attrs::test_it_same\nPASSED r2e_tests/test_config/test_views.py::Test_preserve_view_attrs::test_it_view_is_None\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_already_exists\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_cachebust_prevented\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_cachebuster\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_cachebuster_abspath\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_cachebuster_for_more_specific_path\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_cachebuster_overwrite\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_cachebuster_overwrite_explicit\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_package_root\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_url_noendslash\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_url_noscheme\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_url_withendslash\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_context\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_for_\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_permission\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_renderer\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_route_prefix\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_missing\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_quoting\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_registration_miss\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_route_url\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_slash_in_name1\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_slash_in_name2\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_cachebust\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_cachebust_abspath\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_cachebust_nomatch\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_quoted_remote\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_unquoted_local\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_with_custom_anchor\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_with_custom_query\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_verifyClass\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_verifyObject\nPASSED r2e_tests/test_config/test_views.py::Test_view_description::test_with_text\nPASSED r2e_tests/test_config/test_views.py::Test_viewdefaults::test_dunder_attrs_copied\nPASSED r2e_tests/test_scripts/test_common.py::TestParseVars::test_parse_vars_bad\nPASSED r2e_tests/test_scripts/test_common.py::TestParseVars::test_parse_vars_good\nPASSED r2e_tests/test_scripts/test_pdistreport.py::TestPDistReportCommand::test_no_dists\nPASSED r2e_tests/test_scripts/test_pdistreport.py::TestPDistReportCommand::test_with_dists\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_display_headers\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_has_bad_config_header\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_has_content_type_header_var\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_has_good_header_var\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_has_multiple_header_vars\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_configures_logging\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_get\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_options\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_patch\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_post\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_propfind\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_put\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_not_enough_args\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_path_doesnt_start_with_slash\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_response_has_no_charset\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_two_args\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_w_basic_auth\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_with_query_string\nPASSED r2e_tests/test_scripts/test_prequest.py::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test__get_mapper\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_bad_args\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_bad_format\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_config_format_ini_commas\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_config_format_ini_newlines\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_config_format_ini_spaces\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_good_args\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_good_format\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_no_mapper\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_no_routes\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_as_wsgiapp\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_no_view\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_with_no_slash_prefix\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_single_route_no_route_registered\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_single_route_no_views_registered\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_single_route_one_view_registered_with_factory\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_static_routes_included_in_list\nPASSED r2e_tests/test_scripts/test_proutes.py::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_config_file_finds_open_url\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_guess_server_url\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_original_ignore_files\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_parse_vars_bad\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_parse_vars_good\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_reload_call_hupper_with_correct_args\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_run_no_args\nPASSED r2e_tests/test_scripts/test_pserve.py::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_custom_section_override\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_default_shell_option\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_errors_with_unknown_shell\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_check_variable_override_order\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_custom_items\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_default_shell\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_ipython\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_pythonstartup\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_setup_from_options\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_setup\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_setup_generator\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_list_shells\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_shell_entry_points\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_shell_ordering\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_shell_override\nPASSED r2e_tests/test_scripts/test_pshell.py::Test_python_shell_runner::test_it\nPASSED r2e_tests/test_scripts/test_pshell.py::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_ptweens.py::TestPTweensCommand::test__get_tweens\nPASSED r2e_tests/test_scripts/test_ptweens.py::TestPTweensCommand::test_command_implicit_and_explicit_tweens\nPASSED r2e_tests/test_scripts/test_ptweens.py::TestPTweensCommand::test_command_implicit_tweens_only\nPASSED r2e_tests/test_scripts/test_ptweens.py::TestPTweensCommand::test_command_no_tweens\nPASSED r2e_tests/test_scripts/test_ptweens.py::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_multi_routes_all_match\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_multi_routes_none_match\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_multi_routes_some_match\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_no_match\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_no_match_multiview_registered\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_route_multiview\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_route_multiview_no_view_registered\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_route_no_multiview\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_traversal\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_traversal_multiview\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_not_found\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_not_found_url_starts_without_slash\nPASSED r2e_tests/test_scripts/test_pviews.py::Test_main::test_it\nFAILED r2e_tests/test_1.py::TestCallbackAuthenticationPolicyDebugging::test_authenticated_userid_fails_cleaning_as_Authenticated\nFAILED r2e_tests/test_1.py::TestCallbackAuthenticationPolicyDebugging::test_authenticated_userid_fails_cleaning_as_Everyone\nFAILED r2e_tests/test_1.py::TestCallbackAuthenticationPolicyDebugging::test_authenticated_userid_no_callback\nFAILED r2e_tests/test_1.py::TestCallbackAuthenticationPolicyDebugging::test_authenticated_userid_no_unauthenticated_userid\nFAILED r2e_tests/test_1.py::TestCallbackAuthenticationPolicyDebugging::test_authenticated_userid_with_callback_fail\nFAILED r2e_tests/test_1.py::TestCallbackAuthenticationPolicyDebugging::test_authenticated_userid_with_callback_success\nFAILED r2e_tests/test_1.py::TestCallbackAuthenticationPolicyDebugging::test_effective_principals_no_callback\nFAILED r2e_tests/test_1.py::TestCallbackAuthenticationPolicyDebugging::test_effective_principals_no_unauthenticated_userid\nFAILED r2e_tests/test_1.py::TestCallbackAuthenticationPolicyDebugging::test_effective_principals_with_callback_fail\nFAILED r2e_tests/test_1.py::TestCallbackAuthenticationPolicyDebugging::test_effective_principals_with_callback_success\nFAILED r2e_tests/test_1.py::TestCallbackAuthenticationPolicyDebugging::test_effective_principals_with_unclean_principal_Authenticated\nFAILED r2e_tests/test_1.py::TestCallbackAuthenticationPolicyDebugging::test_effective_principals_with_unclean_principal_Everyone\nFAILED r2e_tests/test_1.py::TestAuthTktCookieHelper::test_remember_wild_domain_disabled\nFAILED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_resource_url_adapter_dotted_names\nFAILED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_resource_url_adapter_introspectables\nFAILED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_traverser_dotted_names\nFAILED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_directory_with_directory\nFAILED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_directory_with_package\nFAILED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_file\nFAILED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_package_with_directory\nFAILED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_package_with_package\nFAILED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_filename_no_overrides\nFAILED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_filename_override_returns_None\nFAILED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_filename\nFAILED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_filename_with_prefix\nFAILED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_request_factory_dottedname\nFAILED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_response_factory_dottedname\nFAILED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_root_factory_dottedname\nFAILED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_session_factory_dottedname\nFAILED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_abspath\nFAILED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_asset_spec\nFAILED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_asset_spec_existing_translation_dirs\nFAILED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_doesnt_use_override_w_autocommit\nFAILED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_multiple_specs\nFAILED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_multiple_specs_multiple_calls\nFAILED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_override_multiple_specs_multiple_calls\nFAILED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_uses_override_out_of_order\nFAILED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_uses_override_w_autocommit\nFAILED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_set_locale_negotiator_dottedname\nFAILED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_no_registry\nFAILED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_noreg_debug_logger_None_default\nFAILED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_constant_root_package\nFAILED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_python_callable\nFAILED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_debug_logger_None_default\nFAILED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_tweens\nFAILED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_with_package_module\nFAILED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_add_directive_with_custom_callable\nFAILED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_add_directive_with_partial\nFAILED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_extend_with_dotted_name\nFAILED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_extend_with_python_callable\nFAILED r2e_tests/test_config/test_init.py::TestConfigurator__add_predicate::test_factory_as_dotted_name\nFAILED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_factory_dottedname\nFAILED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_subscriber_dottedname\nFAILED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_dottedname\nFAILED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tweens_names_distinct\nFAILED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tweens_names_with_underover\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_exception_view_with_view_defaults\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_with_view_defaults\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_with_view_defaults\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_static_view_package_here_relative\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_context_as_dottedname\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_for__as_dottedname\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_containment_dottedname\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_template_renderer\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_template_renderer_no_callable\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_defaults\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_defaults_viewname_is_dottedname_kwarg\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_defaults_viewname_is_dottedname_nonkwarg\nFAILED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_cachebust_with_overrides\nFAILED r2e_tests/test_config/test_views.py::Test_view_description::test_without_text\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_class_view\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_one_route_all_methods_view_only_post\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_one_route_only_post_view_all_methods\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_one_route_only_post_view_post_and_get\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_one_route_with_long_name_one_view_registered\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_is_get_view_request_method_not_post\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_request_method_mismatch\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_static_views\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_single_route_multiview_registered\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_single_route_one_view_registered\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_view_glob\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_view_request_method_not_post\nFAILED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_config_file_finds_watch_files\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_multi_view_nested\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_multiview\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_multiview_with_permission\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_multiview_with_predicates\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_function_traversal\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_route\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_route_with_route_predicates\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_traversal\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_traversal_with_permission\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_traversal_with_predicates\n================= 93 failed, 886 passed, 28 warnings in 5.89s ==================\n",
    "old_commit_res_stderr": ""
}
src/pyramid/authentication.py tests/test_authentication.py
We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
[ISSUE]
**Title:** Multiple Set-Cookie Headers Added When `wild_domain` is Disabled

**Description:**
When creating authentication tickets with `wild_domain` set to `False`, the system unexpectedly adds multiple `Set-Cookie` headers. This behavior leads to redundant cookies being set, which can cause confusion and potential security issues.

**Example Code:**
```python
helper = AuthTktCookieHelper('secret', wild_domain=False)
request = make_request()
result = helper.remember(request, 'other')
# Expected to have 1 Set-Cookie header
# Actual result contains 2 Set-Cookie headers
```

**Expected Behavior:**
Only a single `Set-Cookie` header should be added when `wild_domain` is disabled to ensure that cookies are set correctly and efficiently.

**Actual Behavior:**
Two `Set-Cookie` headers are added, despite `wild_domain` being set to `False`, resulting in unnecessary duplication of cookies.
[/ISSUE]
--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.

--- BEGIN FILE ---
```
### src/pyramid/authentication.py
import base64
import binascii
from codecs import utf_8_decode, utf_8_encode
from collections import namedtuple
import hashlib
import re
import time as time_mod
from urllib.parse import quote, unquote
import warnings
from webob.cookies import CookieProfile
from zope.interface import implementer

from pyramid.authorization import Authenticated, Everyone
from pyramid.interfaces import IAuthenticationPolicy, IDebugLogger
from pyramid.util import (
    SimpleSerializer,
    ascii_,
    bytes_,
    strings_differ,
    text_,
)

VALID_TOKEN = re.compile(r"^[A-Za-z][A-Za-z0-9+_-]*$")


class CallbackAuthenticationPolicy:
    """ Abstract class """

    debug = False
    callback = None

    def _log(self, msg, methodname, request):
        logger = request.registry.queryUtility(IDebugLogger)
        if logger:
            cls = self.__class__
            classname = cls.__module__ + '.' + cls.__name__
            methodname = classname + '.' + methodname
            logger.debug(methodname + ': ' + msg)

    def _clean_principal(self, princid):
        if princid in (Authenticated, Everyone):
            princid = None
        return princid

    def authenticated_userid(self, request):
        """ Return the authenticated userid or ``None``.

        If no callback is registered, this will be the same as
        ``unauthenticated_userid``.

        If a ``callback`` is registered, this will return the userid if
        and only if the callback returns a value that is not ``None``.

        """
        debug = self.debug
        userid = self.unauthenticated_userid(request)
        if userid is None:
            debug and self._log(
                'call to unauthenticated_userid returned None; returning None',
                'authenticated_userid',
                request,
            )
            return None
        if self._clean_principal(userid) is None:
            debug and self._log(
                (
                    'use of userid %r is disallowed by any built-in Pyramid '
                    'security policy, returning None' % userid
                ),
                'authenticated_userid',
                request,
            )
            return None

        if self.callback is None:
            debug and self._log(
                'there was no groupfinder callback; returning %r' % (userid,),
                'authenticated_userid',
                request,
            )
            return userid
        callback_ok = self.callback(userid, request)
        if callback_ok is not None:  # is not None!
            debug and self._log(
                'groupfinder callback returned %r; returning %r'
                % (callback_ok, userid),
                'authenticated_userid',
                request,
            )
            return userid
        debug and self._log(
            'groupfinder callback returned None; returning None',
            'authenticated_userid',
            request,
        )

    def effective_principals(self, request):
        """ A list of effective principals derived from request.

        This will return a list of principals including, at least,
        :data:`pyramid.authorization.Everyone`. If there is no authenticated
        userid, or the ``callback`` returns ``None``, this will be the
        only principal:

        .. code-block:: python

            return [Everyone]

        If the ``callback`` does not return ``None`` and an authenticated
        userid is found, then the principals will include
        :data:`pyramid.authorization.Authenticated`, the
        ``authenticated_userid`` and the list of principals returned by the
        ``callback``:

        .. code-block:: python

            extra_principals = callback(userid, request)
            return [Everyone, Authenticated, userid] + extra_principals

        """
        debug = self.debug
        effective_principals = [Everyone]
        userid = self.unauthenticated_userid(request)

        if userid is None:
            debug and self._log(
                'unauthenticated_userid returned %r; returning %r'
                % (userid, effective_principals),
                'effective_principals',
                request,
            )
            return effective_principals

        if self._clean_principal(userid) is None:
            debug and self._log(
                (
                    'unauthenticated_userid returned disallowed %r; returning '
                    '%r as if it was None' % (userid, effective_principals)
                ),
                'effective_principals',
                request,
            )
            return effective_principals

        if self.callback is None:
            debug and self._log(
                'groupfinder callback is None, so groups is []',
                'effective_principals',
                request,
            )
            groups = []
        else:
            groups = self.callback(userid, request)
            debug and self._log(
                'groupfinder callback returned %r as groups' % (groups,),
                'effective_principals',
                request,
            )

        if groups is None:  # is None!
            debug and self._log(
                'returning effective principals: %r' % (effective_principals,),
                'effective_principals',
                request,
            )
            return effective_principals

        effective_principals.append(Authenticated)
        effective_principals.append(userid)
        effective_principals.extend(groups)

        debug and self._log(
            'returning effective principals: %r' % (effective_principals,),
            'effective_principals',
            request,
        )
        return effective_principals


@implementer(IAuthenticationPolicy)
class RepozeWho1AuthenticationPolicy(CallbackAuthenticationPolicy):
    """ A :app:`Pyramid` :term:`authentication policy` which
    obtains data from the :mod:`repoze.who` 1.X WSGI 'API' (the
    ``repoze.who.identity`` key in the WSGI environment).

    Constructor Arguments

    ``identifier_name``

       Default: ``auth_tkt``.  The :mod:`repoze.who` plugin name that
       performs remember/forget.  Optional.

    ``callback``

        Default: ``None``.  A callback passed the :mod:`repoze.who` identity
        and the :term:`request`, expected to return ``None`` if the user
        represented by the identity doesn't exist or a sequence of principal
        identifiers (possibly empty) representing groups if the user does
        exist.  If ``callback`` is None, the userid will be assumed to exist
        with no group principals.

    Objects of this class implement the interface described by
    :class:`pyramid.interfaces.IAuthenticationPolicy`.
    """

    def __init__(self, identifier_name='auth_tkt', callback=None):
        self.identifier_name = identifier_name
        self.callback = callback

    def _get_identity(self, request):
        return request.environ.get('repoze.who.identity')

    def _get_identifier(self, request):
        plugins = request.environ.get('repoze.who.plugins')
        if plugins is None:
            return None
        identifier = plugins[self.identifier_name]
        return identifier

    def authenticated_userid(self, request):
        """ Return the authenticated userid or ``None``.

        If no callback is registered, this will be the same as
        ``unauthenticated_userid``.

        If a ``callback`` is registered, this will return the userid if
        and only if the callback returns a value that is not ``None``.

        """
        identity = self._get_identity(request)

        if identity is None:
            self.debug and self._log(
                'repoze.who identity is None, returning None',
                'authenticated_userid',
                request,
            )
            return None

        userid = identity['repoze.who.userid']

        if userid is None:
            self.debug and self._log(
                'repoze.who.userid is None, returning None' % userid,
                'authenticated_userid',
                request,
            )
            return None

        if self._clean_principal(userid) is None:
            self.debug and self._log(
                (
                    'use of userid %r is disallowed by any built-in Pyramid '
                    'security policy, returning None' % userid
                ),
                'authenticated_userid',
                request,
            )
            return None

        if self.callback is None:
            return userid

        if self.callback(identity, request) is not None:  # is not None!
            return userid

    def unauthenticated_userid(self, request):
        """ Return the ``repoze.who.userid`` key from the detected identity."""
        identity = self._get_identity(request)
        if identity is None:
            return None
        return identity['repoze.who.userid']

    def effective_principals(self, request):
        """ A list of effective principals derived from the identity.

        This will return a list of principals including, at least,
        :data:`pyramid.authorization.Everyone`. If there is no identity, or
        the ``callback`` returns ``None``, this will be the only principal.

        If the ``callback`` does not return ``None`` and an identity is
        found, then the principals will include
        :data:`pyramid.authorization.Authenticated`, the
        ``authenticated_userid`` and the list of principals returned by the
        ``callback``.

        """
        effective_principals = [Everyone]
        identity = self._get_identity(request)

        if identity is None:
            self.debug and self._log(
                (
                    'repoze.who identity was None; returning %r'
                    % effective_principals
                ),
                'effective_principals',
                request,
            )
            return effective_principals

        if self.callback is None:
            groups = []
        else:
            groups = self.callback(identity, request)

        if groups is None:  # is None!
            self.debug and self._log(
                (
                    'security policy groups callback returned None; returning '
                    '%r' % effective_principals
                ),
                'effective_principals',
                request,
            )
            return effective_principals

        userid = identity['repoze.who.userid']

        if userid is None:
            self.debug and self._log(
                (
                    'repoze.who.userid was None; returning %r'
                    % effective_principals
                ),
                'effective_principals',
                request,
            )
            return effective_principals

        if self._clean_principal(userid) is None:
            self.debug and self._log(
                (
                    'unauthenticated_userid returned disallowed %r; returning '
                    '%r as if it was None' % (userid, effective_principals)
                ),
                'effective_principals',
                request,
            )
            return effective_principals

        effective_principals.append(Authenticated)
        effective_principals.append(userid)
        effective_principals.extend(groups)
        return effective_principals

    def remember(self, request, userid, **kw):
        """ Store the ``userid`` as ``repoze.who.userid``.

        The identity to authenticated to :mod:`repoze.who`
        will contain the given userid as ``userid``, and
        provide all keyword arguments as additional identity
        keys. Useful keys could be ``max_age`` or ``userdata``.
        """
        identifier = self._get_identifier(request)
        if identifier is None:
            return []
        environ = request.environ
        identity = kw
        identity['repoze.who.userid'] = userid
        return identifier.remember(environ, identity)

    def forget(self, request):
        """ Forget the current authenticated user.

        Return headers that, if included in a response, will delete the
        cookie responsible for tracking the current user.

        """
        identifier = self._get_identifier(request)
        if identifier is None:
            return []
        identity = self._get_identity(request)
        return identifier.forget(request.environ, identity)


@implementer(IAuthenticationPolicy)
class RemoteUserAuthenticationPolicy(CallbackAuthenticationPolicy):
    """ A :app:`Pyramid` :term:`authentication policy` which
    obtains data from the ``REMOTE_USER`` WSGI environment variable.

    Constructor Arguments

    ``environ_key``

        Default: ``REMOTE_USER``.  The key in the WSGI environ which
        provides the userid.

    ``callback``

        Default: ``None``.  A callback passed the userid and the request,
        expected to return None if the userid doesn't exist or a sequence of
        principal identifiers (possibly empty) representing groups if the
        user does exist.  If ``callback`` is None, the userid will be assumed
        to exist with no group principals.

    ``debug``

        Default: ``False``.  If ``debug`` is ``True``, log messages to the
        Pyramid debug logger about the results of various authentication
        steps.  The output from debugging is useful for reporting to maillist
        or IRC channels when asking for support.

    Objects of this class implement the interface described by
    :class:`pyramid.interfaces.IAuthenticationPolicy`.
    """

    def __init__(self, environ_key='REMOTE_USER', callback=None, debug=False):
        self.environ_key = environ_key
        self.callback = callback
        self.debug = debug

    def unauthenticated_userid(self, request):
        """ The ``REMOTE_USER`` value found within the ``environ``."""
        return request.environ.get(self.environ_key)

    def remember(self, request, userid, **kw):
        """ A no-op. The ``REMOTE_USER`` does not provide a protocol for
        remembering the user. This will be application-specific and can
        be done somewhere else or in a subclass."""
        return []

    def forget(self, request):
        """ A no-op. The ``REMOTE_USER`` does not provide a protocol for
        forgetting the user. This will be application-specific and can
        be done somewhere else or in a subclass."""
        return []


@implementer(IAuthenticationPolicy)
class AuthTktAuthenticationPolicy(CallbackAuthenticationPolicy):
    """A :app:`Pyramid` :term:`authentication policy` which
    obtains data from a Pyramid "auth ticket" cookie.

    Constructor Arguments

    ``secret``

       The secret (a string) used for auth_tkt cookie signing.  This value
       should be unique across all values provided to Pyramid for various
       subsystem secrets (see :ref:`admonishment_against_secret_sharing`).
       Required.

    ``callback``

       Default: ``None``.  A callback passed the userid and the
       request, expected to return ``None`` if the userid doesn't
       exist or a sequence of principal identifiers (possibly empty) if
       the user does exist.  If ``callback`` is ``None``, the userid
       will be assumed to exist with no principals.  Optional.

    ``cookie_name``

       Default: ``auth_tkt``.  The cookie name used
       (string).  Optional.

    ``secure``

       Default: ``False``.  Only send the cookie back over a secure
       conn.  Optional.

    ``include_ip``

       Default: ``False``.  Make the requesting IP address part of
       the authentication data in the cookie.  Optional.

       For IPv6 this option is not recommended. The ``mod_auth_tkt``
       specification does not specify how to handle IPv6 addresses, so using
       this option in combination with IPv6 addresses may cause an
       incompatible cookie. It ties the authentication ticket to that
       individual's IPv6 address.

    ``timeout``

       Default: ``None``.  Maximum number of seconds which a newly
       issued ticket will be considered valid.  After this amount of
       time, the ticket will expire (effectively logging the user
       out).  If this value is ``None``, the ticket never expires.
       Optional.

    ``reissue_time``

       Default: ``None``.  If this parameter is set, it represents the number
       of seconds that must pass before an authentication token cookie is
       automatically reissued as the result of a request which requires
       authentication.  The duration is measured as the number of seconds
       since the last auth_tkt cookie was issued and 'now'.  If this value is
       ``0``, a new ticket cookie will be reissued on every request which
       requires authentication.

       A good rule of thumb: if you want auto-expired cookies based on
       inactivity: set the ``timeout`` value to 1200 (20 mins) and set the
       ``reissue_time`` value to perhaps a tenth of the ``timeout`` value
       (120 or 2 mins).  It's nonsensical to set the ``timeout`` value lower
       than the ``reissue_time`` value, as the ticket will never be reissued
       if so.  However, such a configuration is not explicitly prevented.

       Optional.

    ``max_age``

       Default: ``None``.  The max age of the auth_tkt cookie, in
       seconds.  This differs from ``timeout`` inasmuch as ``timeout``
       represents the lifetime of the ticket contained in the cookie,
       while this value represents the lifetime of the cookie itself.
       When this value is set, the cookie's ``Max-Age`` and
       ``Expires`` settings will be set, allowing the auth_tkt cookie
       to last between browser sessions.  It is typically nonsensical
       to set this to a value that is lower than ``timeout`` or
       ``reissue_time``, although it is not explicitly prevented.
       Optional.

    ``path``

       Default: ``/``. The path for which the auth_tkt cookie is valid.
       May be desirable if the application only serves part of a domain.
       Optional.

    ``http_only``

       Default: ``False``. Hide cookie from JavaScript by setting the
       HttpOnly flag. Not honored by all browsers.
       Optional.

    ``wild_domain``

       Default: ``True``. An auth_tkt cookie will be generated for the
       wildcard domain. If your site is hosted as ``example.com`` this
       will make the cookie available for sites underneath ``example.com``
       such as ``www.example.com``.
       Optional.

    ``parent_domain``

       Default: ``False``. An auth_tkt cookie will be generated for the
       parent domain of the current site. For example if your site is
       hosted under ``www.example.com`` a cookie will be generated for
       ``.example.com``. This can be useful if you have multiple sites
       sharing the same domain. This option supercedes the ``wild_domain``
       option.
       Optional.

    ``domain``

       Default: ``None``. If provided the auth_tkt cookie will only be
       set for this domain. This option is not compatible with ``wild_domain``
       and ``parent_domain``.
       Optional.

    ``hashalg``

       Default: ``sha512`` (the literal string).

       Any hash algorithm supported by Python's ``hashlib.new()`` function
       can be used as the ``hashalg``.

       Cookies generated by different instances of AuthTktAuthenticationPolicy
       using different ``hashalg`` options are not compatible. Switching the
       ``hashalg`` will imply that all existing users with a valid cookie will
       be required to re-login.

       Optional.

    ``debug``

        Default: ``False``.  If ``debug`` is ``True``, log messages to the
        Pyramid debug logger about the results of various authentication
        steps.  The output from debugging is useful for reporting to maillist
        or IRC channels when asking for support.

    ``samesite``

        Default: ``'Lax'``.  The 'samesite' option of the session cookie. Set
        the value to ``None`` to turn off the samesite option.

    .. versionchanged:: 1.4

       Added the ``hashalg`` option, defaulting to ``sha512``.

    .. versionchanged:: 1.5

       Added the ``domain`` option.

       Added the ``parent_domain`` option.

    .. versionchanged:: 1.10

       Added the ``samesite`` option and made the default ``'Lax'``.

    Objects of this class implement the interface described by
    :class:`pyramid.interfaces.IAuthenticationPolicy`.

    """

    def __init__(
        self,
        secret,
        callback=None,
        cookie_name='auth_tkt',
        secure=False,
        include_ip=False,
        timeout=None,
        reissue_time=None,
        max_age=None,
        path="/",
        http_only=False,
        wild_domain=True,
        debug=False,
        hashalg='sha512',
        parent_domain=False,
        domain=None,
        samesite='Lax',
    ):
        self.cookie = AuthTktCookieHelper(
            secret,
            cookie_name=cookie_name,
            secure=secure,
            include_ip=include_ip,
            timeout=timeout,
            reissue_time=reissue_time,
            max_age=max_age,
            http_only=http_only,
            path=path,
            wild_domain=wild_domain,
            hashalg=hashalg,
            parent_domain=parent_domain,
            domain=domain,
            samesite=samesite,
        )
        self.callback = callback
        self.debug = debug

    def unauthenticated_userid(self, request):
        """ The userid key within the auth_tkt cookie."""
        result = self.cookie.identify(request)
        if result:
            return result['userid']

    def remember(self, request, userid, **kw):
        """ Accepts the following kw args: ``max_age=<int-seconds>,
        ``tokens=<sequence-of-ascii-strings>``.

        Return a list of headers which will set appropriate cookies on
        the response.

        """
        return self.cookie.remember(request, userid, **kw)

    def forget(self, request):
        """ A list of headers which will delete appropriate cookies."""
        return self.cookie.forget(request)


def b64encode(v):
    return base64.b64encode(bytes_(v)).strip().replace(b'\n', b'')


def b64decode(v):
    return base64.b64decode(bytes_(v))


# this class licensed under the MIT license (stolen from Paste)
class AuthTicket:
    """
    This class represents an authentication token.  You must pass in
    the shared secret, the userid, and the IP address.  Optionally you
    can include tokens (a list of strings, representing role names),
    'user_data', which is arbitrary data available for your own use in
    later scripts.  Lastly, you can override the cookie name and
    timestamp.

    Once you provide all the arguments, use .cookie_value() to
    generate the appropriate authentication ticket.

    Usage::

        token = AuthTicket('sharedsecret', 'username',
            os.environ['REMOTE_ADDR'], tokens=['admin'])
        val = token.cookie_value()

    """

    def __init__(
        self,
        secret,
        userid,
        ip,
        tokens=(),
        user_data='',
        time=None,
        cookie_name='auth_tkt',
        secure=False,
        hashalg='md5',
    ):
        self.secret = secret
        self.userid = userid
        self.ip = ip
        self.tokens = ','.join(tokens)
        self.user_data = user_data
        if time is None:
            self.time = time_mod.time()
        else:
            self.time = time
        self.cookie_name = cookie_name
        self.secure = secure
        self.hashalg = hashalg

    def digest(self):
        return calculate_digest(
            self.ip,
            self.time,
            self.secret,
            self.userid,
            self.tokens,
            self.user_data,
            self.hashalg,
        )

    def cookie_value(self):
        v = '%s%08x%s!' % (self.digest(), int(self.time), quote(self.userid))
        if self.tokens:
            v += self.tokens + '!'
        v += self.user_data
        return v


# this class licensed under the MIT license (stolen from Paste)
class BadTicket(Exception):
    """
    Exception raised when a ticket can't be parsed.  If we get far enough to
    determine what the expected digest should have been, expected is set.
    This should not be shown by default, but can be useful for debugging.
    """

    def __init__(self, msg, expected=None):
        self.expected = expected
        Exception.__init__(self, msg)


# this function licensed under the MIT license (stolen from Paste)
def parse_ticket(secret, ticket, ip, hashalg='md5'):
    """
    Parse the ticket, returning (timestamp, userid, tokens, user_data).

    If the ticket cannot be parsed, a ``BadTicket`` exception will be raised
    with an explanation.
    """
    ticket = text_(ticket).strip('"')
    digest_size = hashlib.new(hashalg).digest_size * 2
    digest = ticket[:digest_size]
    try:
        timestamp = int(ticket[digest_size : digest_size + 8], 16)
    except ValueError as e:
        raise BadTicket('Timestamp is not a hex integer: %s' % e)
    try:
        userid, data = ticket[digest_size + 8 :].split('!', 1)
    except ValueError:
        raise BadTicket('userid is not followed by !')
    userid = unquote(userid)
    if '!' in data:
        tokens, user_data = data.split('!', 1)
    else:  # pragma: no cover (never generated)
        # @@: Is this the right order?
        tokens = ''
        user_data = data

    expected = calculate_digest(
        ip, timestamp, secret, userid, tokens, user_data, hashalg
    )

    # Avoid timing attacks (see
    # http://seb.dbzteam.org/crypto/python-oauth-timing-hmac.pdf)
    if strings_differ(expected, digest):
        raise BadTicket(
            'Digest signature is not correct', expected=(expected, digest)
        )

    tokens = tokens.split(',')

    return (timestamp, userid, tokens, user_data)


# this function licensed under the MIT license (stolen from Paste)
def calculate_digest(
    ip, timestamp, secret, userid, tokens, user_data, hashalg='md5'
):
    secret = bytes_(secret, 'utf-8')
    userid = bytes_(userid, 'utf-8')
    tokens = bytes_(tokens, 'utf-8')
    user_data = bytes_(user_data, 'utf-8')
    hash_obj = hashlib.new(hashalg)

    # Check to see if this is an IPv6 address
    if ':' in ip:
        ip_timestamp = ip + str(int(timestamp))
        ip_timestamp = bytes_(ip_timestamp)
    else:
        # encode_ip_timestamp not required, left in for backwards compatibility
        ip_timestamp = encode_ip_timestamp(ip, timestamp)

    hash_obj.update(
        ip_timestamp + secret + userid + b'\0' + tokens + b'\0' + user_data
    )
    digest = hash_obj.hexdigest()
    hash_obj2 = hashlib.new(hashalg)
    hash_obj2.update(bytes_(digest) + secret)
    return hash_obj2.hexdigest()


# this function licensed under the MIT license (stolen from Paste)
def encode_ip_timestamp(ip, timestamp):
    ip_chars = ''.join(map(chr, map(int, ip.split('.'))))
    t = int(timestamp)
    ts = (
        (t & 0xFF000000) >> 24,
        (t & 0xFF0000) >> 16,
        (t & 0xFF00) >> 8,
        t & 0xFF,
    )
    ts_chars = ''.join(map(chr, ts))
    return bytes_(ip_chars + ts_chars)


class AuthTktCookieHelper:
    """
    A helper class for security policies that obtains data from an "auth
    ticket" cookie.

    Constructor Arguments

    ``secret``

       The secret (a string) used for auth_tkt cookie signing.  This value
       should be unique across all values provided to Pyramid for various
       subsystem secrets (see :ref:`admonishment_against_secret_sharing`).
       Required.

    ``cookie_name``

       Default: ``auth_tkt``.  The cookie name used
       (string).  Optional.

    ``secure``

       Default: ``False``.  Only send the cookie back over a secure
       conn.  Optional.

    ``include_ip``

       Default: ``False``.  Make the requesting IP address part of
       the authentication data in the cookie.  Optional.

       For IPv6 this option is not recommended. The ``mod_auth_tkt``
       specification does not specify how to handle IPv6 addresses, so using
       this option in combination with IPv6 addresses may cause an
       incompatible cookie. It ties the authentication ticket to that
       individual's IPv6 address.

    ``timeout``

       Default: ``None``.  Maximum number of seconds which a newly
       issued ticket will be considered valid.  After this amount of
       time, the ticket will expire (effectively logging the user
       out).  If this value is ``None``, the ticket never expires.
       Optional.

    ``reissue_time``

       Default: ``None``.  If this parameter is set, it represents the number
       of seconds that must pass before an authentication token cookie is
       automatically reissued as the result of a request which requires
       authentication.  The duration is measured as the number of seconds
       since the last auth_tkt cookie was issued and 'now'.  If this value is
       ``0``, a new ticket cookie will be reissued on every request which
       requires authentication.

       A good rule of thumb: if you want auto-expired cookies based on
       inactivity: set the ``timeout`` value to 1200 (20 mins) and set the
       ``reissue_time`` value to perhaps a tenth of the ``timeout`` value
       (120 or 2 mins).  It's nonsensical to set the ``timeout`` value lower
       than the ``reissue_time`` value, as the ticket will never be reissued
       if so.  However, such a configuration is not explicitly prevented.

       Optional.

    ``max_age``

       Default: ``None``.  The max age of the auth_tkt cookie, in
       seconds.  This differs from ``timeout`` inasmuch as ``timeout``
       represents the lifetime of the ticket contained in the cookie,
       while this value represents the lifetime of the cookie itself.
       When this value is set, the cookie's ``Max-Age`` and
       ``Expires`` settings will be set, allowing the auth_tkt cookie
       to last between browser sessions.  It is typically nonsensical
       to set this to a value that is lower than ``timeout`` or
       ``reissue_time``, although it is not explicitly prevented.
       Optional.

    ``path``

       Default: ``/``. The path for which the auth_tkt cookie is valid.
       May be desirable if the application only serves part of a domain.
       Optional.

    ``http_only``

       Default: ``False``. Hide cookie from JavaScript by setting the
       HttpOnly flag. Not honored by all browsers.
       Optional.

    ``wild_domain``

       Default: ``True``. An auth_tkt cookie will be generated for the
       wildcard domain. If your site is hosted as ``example.com`` this
       will make the cookie available for sites underneath ``example.com``
       such as ``www.example.com``.
       Optional.

    ``parent_domain``

       Default: ``False``. An auth_tkt cookie will be generated for the
       parent domain of the current site. For example if your site is
       hosted under ``www.example.com`` a cookie will be generated for
       ``.example.com``. This can be useful if you have multiple sites
       sharing the same domain. This option supercedes the ``wild_domain``
       option.
       Optional.

    ``domain``

       Default: ``None``. If provided the auth_tkt cookie will only be
       set for this domain. This option is not compatible with ``wild_domain``
       and ``parent_domain``.
       Optional.

    ``hashalg``

       Default: ``sha512`` (the literal string).

       Any hash algorithm supported by Python's ``hashlib.new()`` function
       can be used as the ``hashalg``.

       Cookies generated by different instances of AuthTktAuthenticationPolicy
       using different ``hashalg`` options are not compatible. Switching the
       ``hashalg`` will imply that all existing users with a valid cookie will
       be required to re-login.

       Optional.

    ``debug``

        Default: ``False``.  If ``debug`` is ``True``, log messages to the
        Pyramid debug logger about the results of various authentication
        steps.  The output from debugging is useful for reporting to maillist
        or IRC channels when asking for support. Optional.

    ``samesite``

        Default: ``'Lax'``.  The 'samesite' option of the session cookie. Set
        the value to ``None`` to turn off the samesite option. Optional.

    .. versionchanged:: 2.0

        The default ``hashalg`` was changed from ``md5`` to ``sha512``.

    """

    parse_ticket = staticmethod(parse_ticket)  # for tests
    AuthTicket = AuthTicket  # for tests
    BadTicket = BadTicket  # for tests
    now = None  # for tests

    userid_type_decoders = {
        'int': int,
        'unicode': lambda x: utf_8_decode(x)[0],  # bw compat for old cookies
        'b64unicode': lambda x: utf_8_decode(b64decode(x))[0],
        'b64str': lambda x: b64decode(x),
    }

    userid_type_encoders = {
        int: ('int', str),
        str: ('b64unicode', lambda x: b64encode(utf_8_encode(x)[0])),
        bytes: ('b64str', lambda x: b64encode(x)),
    }

    def __init__(
        self,
        secret,
        cookie_name='auth_tkt',
        secure=False,
        include_ip=False,
        timeout=None,
        reissue_time=None,
        max_age=None,
        http_only=False,
        path="/",
        wild_domain=True,
        hashalg='sha512',
        parent_domain=False,
        domain=None,
        samesite='Lax',
    ):
        self.cookie_profile = CookieProfile(
            cookie_name=cookie_name,
            secure=secure,
            max_age=max_age,
            httponly=http_only,
            path=path,
            serializer=SimpleSerializer(),
            samesite=samesite,
        )

        self.secret = secret
        self.cookie_name = cookie_name
        self.secure = secure
        self.include_ip = include_ip
        self.timeout = timeout if timeout is None else int(timeout)
        self.reissue_time = (
            reissue_time if reissue_time is None else int(reissue_time)
        )
        self.max_age = max_age if max_age is None else int(max_age)
        self.wild_domain = wild_domain
        self.parent_domain = parent_domain
        self.domain = domain
        self.hashalg = hashalg

    def _get_cookies(self, request, value, max_age=None):
        cur_domain = request.domain

        domains = []
        if self.domain:
            domains.append(self.domain)
        else:
            if self.parent_domain and cur_domain.count('.') > 1:
                domains.append('.' + cur_domain.split('.', 1)[1])
            else:
                domains.append(None)
                domains.append(cur_domain)
                if self.wild_domain:
                    domains.append('.' + cur_domain)

        profile = self.cookie_profile(request)

        kw = {}
        kw['domains'] = domains
        if max_age is not None:
            kw['max_age'] = max_age

        headers = profile.get_headers(value, **kw)
        return headers

    def identify(self, request):
        """ Return a dictionary with authentication information, or ``None``
        if no valid auth_tkt is attached to ``request``"""
        environ = request.environ
        cookie = request.cookies.get(self.cookie_name)

        if cookie is None:
            return None

        if self.include_ip:
            remote_addr = environ['REMOTE_ADDR']
        else:
            remote_addr = '0.0.0.0'

        try:
            timestamp, userid, tokens, user_data = self.parse_ticket(
                self.secret, cookie, remote_addr, self.hashalg
            )
        except self.BadTicket:
            return None

        now = self.now  # service tests

        if now is None:
            now = time_mod.time()

        if self.timeout and ((timestamp + self.timeout) < now):
            # the auth_tkt data has expired
            return None

        userid_typename = 'userid_type:'
        user_data_info = user_data.split('|')
        for datum in filter(None, user_data_info):
            if datum.startswith(userid_typename):
                userid_type = datum[len(userid_typename) :]
                decoder = self.userid_type_decoders.get(userid_type)
                if decoder:
                    userid = decoder(userid)

        reissue = self.reissue_time is not None

        if reissue and not hasattr(request, '_authtkt_reissued'):
            if (now - timestamp) > self.reissue_time:
                # See https://github.com/Pylons/pyramid/issues#issue/108
                tokens = list(filter(None, tokens))
                headers = self.remember(
                    request, userid, max_age=self.max_age, tokens=tokens
                )

                def reissue_authtkt(request, response):
                    if not hasattr(request, '_authtkt_reissue_revoked'):
                        for k, v in headers:
                            response.headerlist.append((k, v))

                request.add_response_callback(reissue_authtkt)
                request._authtkt_reissued = True

        environ['REMOTE_USER_TOKENS'] = tokens
        environ['REMOTE_USER_DATA'] = user_data
        environ['AUTH_TYPE'] = 'cookie'

        identity = {}
        identity['timestamp'] = timestamp
        identity['userid'] = userid
        identity['tokens'] = tokens
        identity['userdata'] = user_data
        return identity

    def forget(self, request):
        """ Return a set of expires Set-Cookie headers, which will destroy
        any existing auth_tkt cookie when attached to a response"""
        request._authtkt_reissue_revoked = True
        return self._get_cookies(request, None)

    def remember(self, request, userid, max_age=None, tokens=()):
        """ Return a set of Set-Cookie headers; when set into a response,
        these headers will represent a valid authentication ticket.

        ``max_age``
          The max age of the auth_tkt cookie, in seconds.  When this value is
          set, the cookie's ``Max-Age`` and ``Expires`` settings will be set,
          allowing the auth_tkt cookie to last between browser sessions.  If
          this value is ``None``, the ``max_age`` value provided to the
          helper itself will be used as the ``max_age`` value.  Default:
          ``None``.

        ``tokens``
          A sequence of strings that will be placed into the auth_tkt tokens
          field.  Each string in the sequence must be of the Python ``str``
          type and must match the regex ``^[A-Za-z][A-Za-z0-9+_-]*$``.
          Tokens are available in the returned identity when an auth_tkt is
          found in the request and unpacked.  Default: ``()``.
        """
        max_age = self.max_age if max_age is None else int(max_age)

        environ = request.environ

        if self.include_ip:
            remote_addr = environ['REMOTE_ADDR']
        else:
            remote_addr = '0.0.0.0'

        user_data = ''

        encoding_data = self.userid_type_encoders.get(type(userid))

        if encoding_data:
            encoding, encoder = encoding_data
        else:
            warnings.warn(
                "userid is of type {}, and is not supported by the "
                "AuthTktAuthenticationPolicy. Explicitly converting to string "
                "and storing as base64. Subsequent requests will receive a "
                "string as the userid, it will not be decoded back to the "
                "type provided.".format(type(userid)),
                RuntimeWarning,
            )
            encoding, encoder = self.userid_type_encoders.get(str)
            userid = str(userid)

        userid = encoder(userid)
        user_data = 'userid_type:%s' % encoding

        new_tokens = []
        for token in tokens:
            if isinstance(token, str):
                try:
                    token = ascii_(token)
                except UnicodeEncodeError:
                    raise ValueError("Invalid token %r" % (token,))
            if not (isinstance(token, str) and VALID_TOKEN.match(token)):
                raise ValueError("Invalid token %r" % (token,))
            new_tokens.append(token)
        tokens = tuple(new_tokens)

        if hasattr(request, '_authtkt_reissued'):
            request._authtkt_reissue_revoked = True

        ticket = self.AuthTicket(
            self.secret,
            userid,
            remote_addr,
            tokens=tokens,
            user_data=user_data,
            cookie_name=self.cookie_name,
            secure=self.secure,
            hashalg=self.hashalg,
        )

        cookie_value = ticket.cookie_value()
        return self._get_cookies(request, cookie_value, max_age)


@implementer(IAuthenticationPolicy)
class SessionAuthenticationPolicy(CallbackAuthenticationPolicy):
    """ A :app:`Pyramid` authentication policy which gets its data from the
    configured :term:`session`.  For this authentication policy to work, you
    will have to follow the instructions in the :ref:`sessions_chapter` to
    configure a :term:`session factory`.

    Constructor Arguments

    ``prefix``

       A prefix used when storing the authentication parameters in the
       session. Defaults to 'auth.'. Optional.

    ``callback``

       Default: ``None``.  A callback passed the userid and the
       request, expected to return ``None`` if the userid doesn't
       exist or a sequence of principal identifiers (possibly empty) if
       the user does exist.  If ``callback`` is ``None``, the userid
       will be assumed to exist with no principals.  Optional.

    ``debug``

        Default: ``False``.  If ``debug`` is ``True``, log messages to the
        Pyramid debug logger about the results of various authentication
        steps.  The output from debugging is useful for reporting to maillist
        or IRC channels when asking for support.

    """

    def __init__(self, prefix='auth.', callback=None, debug=False):
        self.callback = callback
        self.debug = debug
        self.helper = SessionAuthenticationHelper(prefix)

    def remember(self, request, userid, **kw):
        """ Store a userid in the session."""
        return self.helper.remember(request, userid, **kw)

    def forget(self, request):
        """ Remove the stored userid from the session."""
        return self.helper.forget(request)

    def unauthenticated_userid(self, request):
        return self.helper.authenticated_userid(request)


class SessionAuthenticationHelper:
    """ A helper for use with a :term:`security policy` which stores user data
    in the configured :term:`session`.

    Constructor Arguments

    ``prefix``

       A prefix used when storing the authentication parameters in the
       session. Defaults to 'auth.'. Optional.

    """

    def __init__(self, prefix='auth.'):
        self.userid_key = prefix + 'userid'

    def remember(self, request, userid, **kw):
        """ Store a userid in the session."""
        request.session[self.userid_key] = userid
        return []

    def forget(self, request, **kw):
        """ Remove the stored userid from the session."""
        if self.userid_key in request.session:
            del request.session[self.userid_key]
        return []

    def authenticated_userid(self, request):
        """ Return the stored userid."""
        return request.session.get(self.userid_key)


@implementer(IAuthenticationPolicy)
class BasicAuthAuthenticationPolicy(CallbackAuthenticationPolicy):
    """ A :app:`Pyramid` authentication policy which uses HTTP standard basic
    authentication protocol to authenticate users.  To use this policy you will
    need to provide a callback which checks the supplied user credentials
    against your source of login data.

    Constructor Arguments

    ``check``

       A callback function passed a username, password and request, in that
       order as positional arguments.  Expected to return ``None`` if the
       userid doesn't exist or a sequence of principal identifiers (possibly
       empty) if the user does exist.

    ``realm``

       Default: ``"Realm"``.  The Basic Auth Realm string.  Usually displayed
       to the user by the browser in the login dialog.

    ``debug``

        Default: ``False``.  If ``debug`` is ``True``, log messages to the
        Pyramid debug logger about the results of various authentication
        steps.  The output from debugging is useful for reporting to maillist
        or IRC channels when asking for support.

    **Issuing a challenge**

    Regular browsers will not send username/password credentials unless they
    first receive a challenge from the server.  The following recipe will
    register a view that will send a Basic Auth challenge to the user whenever
    there is an attempt to call a view which results in a Forbidden response::

        from pyramid.httpexceptions import HTTPUnauthorized
        from pyramid.security import forget
        from pyramid.view import forbidden_view_config

        @forbidden_view_config()
        def forbidden_view(request):
            if request.authenticated_userid is None:
                response = HTTPUnauthorized()
                response.headers.update(forget(request))
                return response
            return HTTPForbidden()
    """

    def __init__(self, check, realm='Realm', debug=False):
        self.check = check
        self.realm = realm
        self.debug = debug

    def unauthenticated_userid(self, request):
        """ The userid parsed from the ``Authorization`` request header."""
        credentials = extract_http_basic_credentials(request)
        if credentials:
            return credentials.username

    def remember(self, request, userid, **kw):
        """ A no-op. Basic authentication does not provide a protocol for
        remembering the user. Credentials are sent on every request.

        """
        return []

    def forget(self, request):
        """ Returns challenge headers. This should be attached to a response
        to indicate that credentials are required."""
        return [('WWW-Authenticate', 'Basic realm="%s"' % self.realm)]

    def callback(self, username, request):
        # Username arg is ignored. Unfortunately
        # extract_http_basic_credentials winds up getting called twice when
        # authenticated_userid is called. Avoiding that, however,
        # winds up duplicating logic from the superclass.
        credentials = extract_http_basic_credentials(request)
        if credentials:
            username, password = credentials
            return self.check(username, password, request)


HTTPBasicCredentials = namedtuple(
    'HTTPBasicCredentials', ['username', 'password']
)


def extract_http_basic_credentials(request):
    """ A helper function for extraction of HTTP Basic credentials
    from a given :term:`request`.

    Returns a :class:`.HTTPBasicCredentials` 2-tuple with ``username`` and
    ``password`` attributes or ``None`` if no credentials could be found.

    """
    authorization = request.headers.get('Authorization')
    if not authorization:
        return None

    try:
        authmeth, auth = authorization.split(' ', 1)
    except ValueError:  # not enough values to unpack
        return None

    if authmeth.lower() != 'basic':
        return None

    try:
        authbytes = b64decode(auth.strip())
    except (TypeError, binascii.Error):  # can't decode
        return None

    # try utf-8 first, then latin-1; see discussion in
    # https://github.com/Pylons/pyramid/issues/898
    try:
        auth = authbytes.decode('utf-8')
    except UnicodeDecodeError:
        auth = authbytes.decode('latin-1')

    try:
        username, password = auth.split(':', 1)
    except ValueError:  # not enough values to unpack
        return None

    return HTTPBasicCredentials(username, password)

```
--- END FILE ---

Please first localize the bug based on the issue statement, and then generate *SEARCH/REPLACE* edits to fix the issue.

Every *SEARCH/REPLACE* edit must use this format:
1. The file path
2. The start of search block: <<<<<<< SEARCH
3. A contiguous chunk of lines to search for in the existing source code
4. The dividing line: =======
5. The lines to replace into the source code
6. The end of the replace block: >>>>>>> REPLACE

Here is an example:

```python
### mathweb/flask/app.py
<<<<<<< SEARCH
from flask import Flask
=======
import math
from flask import Flask
>>>>>>> REPLACE
```
</solution>

Please note that the *SEARCH/REPLACE* edit REQUIRES PROPER INDENTATION. If you would like to add the line '        print(x)', you must fully write that out, with all those spaces before the code!
Wrap each *SEARCH/REPLACE* edit in a code block as shown in the example above. If you have multiple *SEARCH/REPLACE* edits, use a separate code block for each one.
[ISSUE]
**Title:** Multiple Set-Cookie Headers Added When `wild_domain` is Disabled

**Description:**
When creating authentication tickets with `wild_domain` set to `False`, the system unexpectedly adds multiple `Set-Cookie` headers. This behavior leads to redundant cookies being set, which can cause confusion and potential security issues.

**Example Code:**
```python
helper = AuthTktCookieHelper('secret', wild_domain=False)
request = make_request()
result = helper.remember(request, 'other')
# Expected to have 1 Set-Cookie header
# Actual result contains 2 Set-Cookie headers
```

**Expected Behavior:**
Only a single `Set-Cookie` header should be added when `wild_domain` is disabled to ensure that cookies are set correctly and efficiently.

**Actual Behavior:**
Two `Set-Cookie` headers are added, despite `wild_domain` being set to `False`, resulting in unnecessary duplication of cookies.
[/ISSUE]
{
    "TestRepozeWho1AuthenticationPolicy.test_authenticated_userid": "PASSED",
    "TestRepozeWho1AuthenticationPolicy.test_authenticated_userid_None": "PASSED",
    "TestRepozeWho1AuthenticationPolicy.test_authenticated_userid_repoze_who_userid_is_None": "PASSED",
    "TestRepozeWho1AuthenticationPolicy.test_authenticated_userid_unclean_principal_Authenticated": "PASSED",
    "TestRepozeWho1AuthenticationPolicy.test_authenticated_userid_unclean_principal_Everyone": "PASSED",
    "TestRepozeWho1AuthenticationPolicy.test_authenticated_userid_with_callback_returns_None": "PASSED",
    "TestRepozeWho1AuthenticationPolicy.test_authenticated_userid_with_callback_returns_something": "PASSED",
    "TestRepozeWho1AuthenticationPolicy.test_class_implements_IAuthenticationPolicy": "PASSED",
    "TestRepozeWho1AuthenticationPolicy.test_effective_principals_None": "PASSED",
    "TestRepozeWho1AuthenticationPolicy.test_effective_principals_repoze_who_userid_is_None": "PASSED",
    "TestRepozeWho1AuthenticationPolicy.test_effective_principals_repoze_who_userid_is_unclean_Authenticated": "PASSED",
    "TestRepozeWho1AuthenticationPolicy.test_effective_principals_repoze_who_userid_is_unclean_Everyone": "PASSED",
    "TestRepozeWho1AuthenticationPolicy.test_effective_principals_userid_and_groups": "PASSED",
    "TestRepozeWho1AuthenticationPolicy.test_effective_principals_userid_callback_returns_None": "PASSED",
    "TestRepozeWho1AuthenticationPolicy.test_effective_principals_userid_only": "PASSED",
    "TestRepozeWho1AuthenticationPolicy.test_forget": "PASSED",
    "TestRepozeWho1AuthenticationPolicy.test_forget_no_plugins": "PASSED",
    "TestRepozeWho1AuthenticationPolicy.test_instance_implements_IAuthenticationPolicy": "PASSED",
    "TestRepozeWho1AuthenticationPolicy.test_remember": "PASSED",
    "TestRepozeWho1AuthenticationPolicy.test_remember_kwargs": "PASSED",
    "TestRepozeWho1AuthenticationPolicy.test_remember_no_plugins": "PASSED",
    "TestRepozeWho1AuthenticationPolicy.test_unauthenticated_userid": "PASSED",
    "TestRepozeWho1AuthenticationPolicy.test_unauthenticated_userid_returns_None": "PASSED",
    "TestRemoteUserAuthenticationPolicy.test_authenticated_userid": "PASSED",
    "TestRemoteUserAuthenticationPolicy.test_authenticated_userid_None": "PASSED",
    "TestRemoteUserAuthenticationPolicy.test_class_implements_IAuthenticationPolicy": "PASSED",
    "TestRemoteUserAuthenticationPolicy.test_effective_principals": "PASSED",
    "TestRemoteUserAuthenticationPolicy.test_effective_principals_None": "PASSED",
    "TestRemoteUserAuthenticationPolicy.test_forget": "PASSED",
    "TestRemoteUserAuthenticationPolicy.test_instance_implements_IAuthenticationPolicy": "PASSED",
    "TestRemoteUserAuthenticationPolicy.test_remember": "PASSED",
    "TestRemoteUserAuthenticationPolicy.test_unauthenticated_userid": "PASSED",
    "TestRemoteUserAuthenticationPolicy.test_unauthenticated_userid_returns_None": "PASSED",
    "TestAuthTktAuthenticationPolicy.test_allargs": "PASSED",
    "TestAuthTktAuthenticationPolicy.test_authenticated_userid": "PASSED",
    "TestAuthTktAuthenticationPolicy.test_authenticated_userid_callback_returns_None": "PASSED",
    "TestAuthTktAuthenticationPolicy.test_authenticated_userid_no_cookie_identity": "PASSED",
    "TestAuthTktAuthenticationPolicy.test_class_implements_IAuthenticationPolicy": "PASSED",
    "TestAuthTktAuthenticationPolicy.test_effective_principals": "PASSED",
    "TestAuthTktAuthenticationPolicy.test_effective_principals_callback_returns_None": "PASSED",
    "TestAuthTktAuthenticationPolicy.test_effective_principals_no_cookie_identity": "PASSED",
    "TestAuthTktAuthenticationPolicy.test_forget": "PASSED",
    "TestAuthTktAuthenticationPolicy.test_hashalg_override": "PASSED",
    "TestAuthTktAuthenticationPolicy.test_instance_implements_IAuthenticationPolicy": "PASSED",
    "TestAuthTktAuthenticationPolicy.test_remember": "PASSED",
    "TestAuthTktAuthenticationPolicy.test_remember_with_extra_kargs": "PASSED",
    "TestAuthTktAuthenticationPolicy.test_unauthenticated_userid": "PASSED",
    "TestAuthTktAuthenticationPolicy.test_unauthenticated_userid_returns_None": "PASSED",
    "TestAuthTktCookieHelper.test_forget": "PASSED",
    "TestAuthTktCookieHelper.test_identify_bad_cookie": "PASSED",
    "TestAuthTktCookieHelper.test_identify_cookie_reissue": "PASSED",
    "TestAuthTktCookieHelper.test_identify_cookie_reissue_already_reissued_this_request": "PASSED",
    "TestAuthTktCookieHelper.test_identify_cookie_reissue_notyet": "PASSED",
    "TestAuthTktCookieHelper.test_identify_cookie_reissue_revoked_by_forget": "PASSED",
    "TestAuthTktCookieHelper.test_identify_cookie_reissue_revoked_by_remember": "PASSED",
    "TestAuthTktCookieHelper.test_identify_cookie_reissue_with_tokens_default": "PASSED",
    "TestAuthTktCookieHelper.test_identify_cookie_str_reissue": "PASSED",
    "TestAuthTktCookieHelper.test_identify_cookie_str_timeout": "PASSED",
    "TestAuthTktCookieHelper.test_identify_cookie_timeout": "PASSED",
    "TestAuthTktCookieHelper.test_identify_cookie_timeout_aged": "PASSED",
    "TestAuthTktCookieHelper.test_identify_cookie_value_is_None": "PASSED",
    "TestAuthTktCookieHelper.test_identify_good_cookie_b64str_useridtype": "PASSED",
    "TestAuthTktCookieHelper.test_identify_good_cookie_b64unicode_useridtype": "PASSED",
    "TestAuthTktCookieHelper.test_identify_good_cookie_dont_include_ip": "PASSED",
    "TestAuthTktCookieHelper.test_identify_good_cookie_include_ip": "PASSED",
    "TestAuthTktCookieHelper.test_identify_good_cookie_include_ipv6": "PASSED",
    "TestAuthTktCookieHelper.test_identify_good_cookie_int_useridtype": "PASSED",
    "TestAuthTktCookieHelper.test_identify_good_cookie_unknown_useridtype": "PASSED",
    "TestAuthTktCookieHelper.test_identify_nocookie": "PASSED",
    "TestAuthTktCookieHelper.test_identify_nonuseridtype_user_data": "PASSED",
    "TestAuthTktCookieHelper.test_init_cookie_str_max_age_invalid": "PASSED",
    "TestAuthTktCookieHelper.test_init_cookie_str_reissue_invalid": "PASSED",
    "TestAuthTktCookieHelper.test_init_cookie_str_timeout_invalid": "PASSED",
    "TestAuthTktCookieHelper.test_remember": "PASSED",
    "TestAuthTktCookieHelper.test_remember_None_samesite": "PASSED",
    "TestAuthTktCookieHelper.test_remember_binary_userid": "PASSED",
    "TestAuthTktCookieHelper.test_remember_domain_supercedes_parent_and_wild_domain": "PASSED",
    "TestAuthTktCookieHelper.test_remember_explicit_domain": "PASSED",
    "TestAuthTktCookieHelper.test_remember_http_only": "PASSED",
    "TestAuthTktCookieHelper.test_remember_include_ip": "PASSED",
    "TestAuthTktCookieHelper.test_remember_insane_userid": "PASSED",
    "TestAuthTktCookieHelper.test_remember_int_userid": "PASSED",
    "TestAuthTktCookieHelper.test_remember_invalid_token_format": "PASSED",
    "TestAuthTktCookieHelper.test_remember_max_age": "PASSED",
    "TestAuthTktCookieHelper.test_remember_nonascii_token": "PASSED",
    "TestAuthTktCookieHelper.test_remember_nondefault_samesite": "PASSED",
    "TestAuthTktCookieHelper.test_remember_parent_domain": "PASSED",
    "TestAuthTktCookieHelper.test_remember_parent_domain_supercedes_wild_domain": "PASSED",
    "TestAuthTktCookieHelper.test_remember_path": "PASSED",
    "TestAuthTktCookieHelper.test_remember_samesite_default": "PASSED",
    "TestAuthTktCookieHelper.test_remember_samesite_nondefault": "PASSED",
    "TestAuthTktCookieHelper.test_remember_secure": "PASSED",
    "TestAuthTktCookieHelper.test_remember_str_max_age": "PASSED",
    "TestAuthTktCookieHelper.test_remember_str_max_age_invalid": "PASSED",
    "TestAuthTktCookieHelper.test_remember_tokens": "PASSED",
    "TestAuthTktCookieHelper.test_remember_unicode_but_ascii_token": "PASSED",
    "TestAuthTktCookieHelper.test_remember_unicode_userid": "PASSED",
    "TestAuthTktCookieHelper.test_remember_wild_domain_disabled": "PASSED",
    "TestAuthTicket.test_cookie_value": "PASSED",
    "TestAuthTicket.test_ctor_with_time": "PASSED",
    "TestAuthTicket.test_ctor_with_tokens": "PASSED",
    "TestAuthTicket.test_digest": "PASSED",
    "TestAuthTicket.test_digest_sha512": "PASSED",
    "TestAuthTicket.test_ipv4": "PASSED",
    "TestAuthTicket.test_ipv6": "PASSED",
    "TestBadTicket.test_it": "PASSED",
    "Test_parse_ticket.test_bad_timestamp": "PASSED",
    "Test_parse_ticket.test_bad_userid_or_data": "PASSED",
    "Test_parse_ticket.test_correct_with_user_data": "PASSED",
    "Test_parse_ticket.test_correct_with_user_data_sha512": "PASSED",
    "Test_parse_ticket.test_digest_sig_incorrect": "PASSED",
    "Test_parse_ticket.test_ipv4": "PASSED",
    "Test_parse_ticket.test_ipv6": "PASSED",
    "TestSessionAuthenticationPolicy.test_authenticated_userid": "PASSED",
    "TestSessionAuthenticationPolicy.test_authenticated_userid_callback_returns_None": "PASSED",
    "TestSessionAuthenticationPolicy.test_authenticated_userid_no_cookie_identity": "PASSED",
    "TestSessionAuthenticationPolicy.test_class_implements_IAuthenticationPolicy": "PASSED",
    "TestSessionAuthenticationPolicy.test_effective_principals": "PASSED",
    "TestSessionAuthenticationPolicy.test_effective_principals_callback_returns_None": "PASSED",
    "TestSessionAuthenticationPolicy.test_effective_principals_no_identity": "PASSED",
    "TestSessionAuthenticationPolicy.test_forget": "PASSED",
    "TestSessionAuthenticationPolicy.test_forget_no_identity": "PASSED",
    "TestSessionAuthenticationPolicy.test_instance_implements_IAuthenticationPolicy": "PASSED",
    "TestSessionAuthenticationPolicy.test_remember": "PASSED",
    "TestSessionAuthenticationPolicy.test_unauthenticated_userid": "PASSED",
    "TestSessionAuthenticationPolicy.test_unauthenticated_userid_returns_None": "PASSED",
    "TestSessionAuthenticationHelper.test_authenticated_userid": "PASSED",
    "TestSessionAuthenticationHelper.test_authenticated_userid_none": "PASSED",
    "TestSessionAuthenticationHelper.test_authenticated_userid_with_prefix": "PASSED",
    "TestSessionAuthenticationHelper.test_forget": "PASSED",
    "TestSessionAuthenticationHelper.test_forget_no_identity": "PASSED",
    "TestSessionAuthenticationHelper.test_remember": "PASSED",
    "TestBasicAuthAuthenticationPolicy.test_authenticated_userid": "PASSED",
    "TestBasicAuthAuthenticationPolicy.test_authenticated_userid_latin1": "PASSED",
    "TestBasicAuthAuthenticationPolicy.test_authenticated_userid_utf8": "PASSED",
    "TestBasicAuthAuthenticationPolicy.test_class_implements_IAuthenticationPolicy": "PASSED",
    "TestBasicAuthAuthenticationPolicy.test_forget": "PASSED",
    "TestBasicAuthAuthenticationPolicy.test_remember": "PASSED",
    "TestBasicAuthAuthenticationPolicy.test_unauthenticated_bad_header": "PASSED",
    "TestBasicAuthAuthenticationPolicy.test_unauthenticated_userid": "PASSED",
    "TestBasicAuthAuthenticationPolicy.test_unauthenticated_userid_corrupt_base64": "PASSED",
    "TestBasicAuthAuthenticationPolicy.test_unauthenticated_userid_invalid_payload": "PASSED",
    "TestBasicAuthAuthenticationPolicy.test_unauthenticated_userid_no_credentials": "PASSED",
    "TestBasicAuthAuthenticationPolicy.test_unauthenticated_userid_not_basic": "PASSED",
    "TestExtractHTTPBasicCredentials.test_invalid_payload": "PASSED",
    "TestExtractHTTPBasicCredentials.test_latin1_payload": "PASSED",
    "TestExtractHTTPBasicCredentials.test_namedtuple_return": "PASSED",
    "TestExtractHTTPBasicCredentials.test_no_auth_header": "PASSED",
    "TestExtractHTTPBasicCredentials.test_no_base64_encoding": "PASSED",
    "TestExtractHTTPBasicCredentials.test_not_a_basic_auth_scheme": "PASSED",
    "TestExtractHTTPBasicCredentials.test_utf8_payload": "PASSED",
    "ActionConfiguratorMixinTests.test_action_autocommit_with_introspectables": "PASSED",
    "ActionConfiguratorMixinTests.test_action_autocommit_with_introspectables_introspection_off": "PASSED",
    "ActionConfiguratorMixinTests.test_action_branching_kw_is_None": "PASSED",
    "ActionConfiguratorMixinTests.test_action_branching_kw_is_not_None": "PASSED",
    "ActionConfiguratorMixinTests.test_action_branching_nonautocommit_with_config_info": "PASSED",
    "ActionConfiguratorMixinTests.test_action_branching_nonautocommit_with_introspectables": "PASSED",
    "ActionConfiguratorMixinTests.test_action_branching_nonautocommit_without_config_info": "PASSED",
    "ActionConfiguratorMixinTests.test_action_nonautocommit_with_introspectables_introspection_off": "PASSED",
    "ActionConfiguratorMixinTests.test_autocommit_no_conflicts": "PASSED",
    "ActionConfiguratorMixinTests.test_commit_conflict_resolved_with_include": "PASSED",
    "ActionConfiguratorMixinTests.test_commit_conflict_resolved_with_two_includes_and_local": "PASSED",
    "ActionConfiguratorMixinTests.test_commit_conflict_simple": "PASSED",
    "ActionConfiguratorMixinTests.test_commit_conflict_with_two_includes": "PASSED",
    "ActionConfiguratorMixinTests.test_conflict_set_forbidden_view": "PASSED",
    "ActionConfiguratorMixinTests.test_conflict_set_notfound_view": "PASSED",
    "TestActionState.test_action_simple": "PASSED",
    "TestActionState.test_action_with_includepath": "PASSED",
    "TestActionState.test_action_with_includepath_and_info": "PASSED",
    "TestActionState.test_action_with_info": "PASSED",
    "TestActionState.test_action_with_introspectables": "PASSED",
    "TestActionState.test_action_with_order": "PASSED",
    "TestActionState.test_execute_actions_dicts": "PASSED",
    "TestActionState.test_execute_actions_error": "PASSED",
    "TestActionState.test_execute_actions_tuples": "PASSED",
    "TestActionState.test_execute_actions_with_introspectable_no_callable": "PASSED",
    "TestActionState.test_execute_actions_with_introspectables": "PASSED",
    "TestActionState.test_executing_conflicting_action_across_orders": "PASSED",
    "TestActionState.test_executing_conflicting_action_across_reentrant_orders": "PASSED",
    "TestActionState.test_it": "PASSED",
    "TestActionState.test_processSpec": "PASSED",
    "TestActionState.test_reentrant_action": "PASSED",
    "TestActionState.test_reentrant_action_error": "PASSED",
    "TestActionState.test_reentrant_action_with_deferred_discriminator": "PASSED",
    "TestActionState.test_reentrant_action_without_clear": "PASSED",
    "Test_reentrant_action_functional.test_deferred_discriminator": "PASSED",
    "Test_reentrant_action_functional.test_functional": "PASSED",
    "Test_resolveConflicts.test_conflicts_across_orders": "PASSED",
    "Test_resolveConflicts.test_it_conflict": "PASSED",
    "Test_resolveConflicts.test_it_success_dicts": "PASSED",
    "Test_resolveConflicts.test_it_success_tuples": "PASSED",
    "Test_resolveConflicts.test_it_with_actions_grouped_by_order": "PASSED",
    "Test_resolveConflicts.test_override_success_across_orders": "PASSED",
    "TestActionInfo.test___str__": "PASSED",
    "TestActionInfo.test_class_conforms": "PASSED",
    "TestActionInfo.test_ctor": "PASSED",
    "TestActionInfo.test_instance_conforms": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_object_event_subscriber": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_resource_url_default_resource_iface_means_Interface": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_resource_url_nodefault_resource_iface": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_response_adapter": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_response_adapter_dottednames": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_response_adapter_self": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_subscriber_defaults": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_subscriber_dottednames": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_subscriber_iface_specified": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_subscriber_predicate": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_subscriber_with_default_type_predicates_False": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_subscriber_with_default_type_predicates_True": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_subscriber_with_specific_type_and_predicates_False": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_subscriber_with_specific_type_and_predicates_True": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_traverser_default_iface_means_Interface": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_traverser_introspectables": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_traverser_nondefault_iface": "PASSED",
    "Test_eventonly.test_defaults": "PASSED",
    "TestAssetsConfiguratorMixin.test__override_already_registered": "PASSED",
    "TestAssetsConfiguratorMixin.test__override_not_yet_registered": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_directory_with_absdirectory": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_directory_with_absfile": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_directory_with_file": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_file_with_absdirectory": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_file_with_absfile": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_file_with_directory": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_file_with_missing_abspath": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_file_with_package": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_package_with_absdirectory": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_samename": "PASSED",
    "TestOverrideProvider.test_get_resource_filename_override_returns_value": "PASSED",
    "TestOverrideProvider.test_get_resource_stream_no_overrides": "PASSED",
    "TestOverrideProvider.test_get_resource_stream_override_returns_None": "PASSED",
    "TestOverrideProvider.test_get_resource_stream_override_returns_value": "PASSED",
    "TestOverrideProvider.test_get_resource_string_no_overrides": "PASSED",
    "TestOverrideProvider.test_get_resource_string_override_returns_None": "PASSED",
    "TestOverrideProvider.test_get_resource_string_override_returns_value": "PASSED",
    "TestOverrideProvider.test_has_resource_no_overrides": "PASSED",
    "TestOverrideProvider.test_has_resource_override_returns_None": "PASSED",
    "TestOverrideProvider.test_has_resource_override_returns_True": "PASSED",
    "TestOverrideProvider.test_resource_isdir_no_overrides": "PASSED",
    "TestOverrideProvider.test_resource_isdir_override_returns_False": "PASSED",
    "TestOverrideProvider.test_resource_isdir_override_returns_None": "PASSED",
    "TestOverrideProvider.test_resource_listdir_no_overrides": "PASSED",
    "TestOverrideProvider.test_resource_listdir_override_returns_None": "PASSED",
    "TestOverrideProvider.test_resource_listdir_override_returns_values": "PASSED",
    "TestPackageOverrides.test_class_conforms_to_IPEP302Loader": "PASSED",
    "TestPackageOverrides.test_class_conforms_to_IPackageOverrides": "PASSED",
    "TestPackageOverrides.test_ctor_package_already_has_loader_of_different_type": "PASSED",
    "TestPackageOverrides.test_ctor_package_already_has_loader_of_same_type": "PASSED",
    "TestPackageOverrides.test_ctor_registers_loader_type": "PASSED",
    "TestPackageOverrides.test_ctor_sets_loader": "PASSED",
    "TestPackageOverrides.test_ctor_sets_local_state": "PASSED",
    "TestPackageOverrides.test_filtered_sources": "PASSED",
    "TestPackageOverrides.test_get_code_pkg_has___loader__": "PASSED",
    "TestPackageOverrides.test_get_code_pkg_has_no___loader__": "PASSED",
    "TestPackageOverrides.test_get_data_pkg_has___loader__": "PASSED",
    "TestPackageOverrides.test_get_data_pkg_has_no___loader__": "PASSED",
    "TestPackageOverrides.test_get_filename": "PASSED",
    "TestPackageOverrides.test_get_filename_file_doesnt_exist": "PASSED",
    "TestPackageOverrides.test_get_source_pkg_has___loader__": "PASSED",
    "TestPackageOverrides.test_get_source_pkg_has_no___loader__": "PASSED",
    "TestPackageOverrides.test_get_stream": "PASSED",
    "TestPackageOverrides.test_get_stream_file_doesnt_exist": "PASSED",
    "TestPackageOverrides.test_get_string": "PASSED",
    "TestPackageOverrides.test_get_string_file_doesnt_exist": "PASSED",
    "TestPackageOverrides.test_has_resource": "PASSED",
    "TestPackageOverrides.test_has_resource_file_doesnt_exist": "PASSED",
    "TestPackageOverrides.test_insert_directory": "PASSED",
    "TestPackageOverrides.test_insert_emptystring": "PASSED",
    "TestPackageOverrides.test_insert_file": "PASSED",
    "TestPackageOverrides.test_instance_conforms_to_IPEP302Loader": "PASSED",
    "TestPackageOverrides.test_instance_conforms_to_IPackageOverrides": "PASSED",
    "TestPackageOverrides.test_is_package_pkg_has___loader__": "PASSED",
    "TestPackageOverrides.test_is_package_pkg_has_no___loader__": "PASSED",
    "TestPackageOverrides.test_isdir_doesnt_exist": "PASSED",
    "TestPackageOverrides.test_isdir_false": "PASSED",
    "TestPackageOverrides.test_isdir_true": "PASSED",
    "TestPackageOverrides.test_listdir": "PASSED",
    "TestPackageOverrides.test_listdir_doesnt_exist": "PASSED",
    "TestPackageAssetSource.test_exists": "PASSED",
    "TestPackageAssetSource.test_exists_file_doesnt_exist": "PASSED",
    "TestPackageAssetSource.test_exists_with_prefix": "PASSED",
    "TestPackageAssetSource.test_get_filename_file_doesnt_exist": "PASSED",
    "TestPackageAssetSource.test_get_stream": "PASSED",
    "TestPackageAssetSource.test_get_stream_file_doesnt_exist": "PASSED",
    "TestPackageAssetSource.test_get_stream_with_prefix": "PASSED",
    "TestPackageAssetSource.test_get_string": "PASSED",
    "TestPackageAssetSource.test_get_string_file_doesnt_exist": "PASSED",
    "TestPackageAssetSource.test_get_string_with_prefix": "PASSED",
    "TestPackageAssetSource.test_isdir_doesnt_exist": "PASSED",
    "TestPackageAssetSource.test_isdir_false": "PASSED",
    "TestPackageAssetSource.test_isdir_true": "PASSED",
    "TestPackageAssetSource.test_listdir": "PASSED",
    "TestPackageAssetSource.test_listdir_doesnt_exist": "PASSED",
    "TestFSAssetSource.test_exists": "PASSED",
    "TestFSAssetSource.test_exists_file_doesnt_exist": "PASSED",
    "TestFSAssetSource.test_exists_with_prefix": "PASSED",
    "TestFSAssetSource.test_get_filename": "PASSED",
    "TestFSAssetSource.test_get_filename_file_doesnt_exist": "PASSED",
    "TestFSAssetSource.test_get_filename_with_prefix": "PASSED",
    "TestFSAssetSource.test_get_stream": "PASSED",
    "TestFSAssetSource.test_get_stream_file_doesnt_exist": "PASSED",
    "TestFSAssetSource.test_get_stream_with_prefix": "PASSED",
    "TestFSAssetSource.test_get_string": "PASSED",
    "TestFSAssetSource.test_get_string_file_doesnt_exist": "PASSED",
    "TestFSAssetSource.test_get_string_with_prefix": "PASSED",
    "TestFSAssetSource.test_isdir_doesnt_exist": "PASSED",
    "TestFSAssetSource.test_isdir_false": "PASSED",
    "TestFSAssetSource.test_isdir_true": "PASSED",
    "TestFSAssetSource.test_listdir": "PASSED",
    "TestFSAssetSource.test_listdir_doesnt_exist": "PASSED",
    "TestDirectoryOverride.test_it_match": "PASSED",
    "TestDirectoryOverride.test_it_no_match": "PASSED",
    "TestFileOverride.test_it_match": "PASSED",
    "TestFileOverride.test_it_no_match": "PASSED",
    "TestFactoriesMixin.test_add_request_method_with_None_callable": "PASSED",
    "TestFactoriesMixin.test_add_request_method_with_None_callable_and_no_name": "PASSED",
    "TestFactoriesMixin.test_add_request_method_with_None_callable_conflict": "PASSED",
    "TestFactoriesMixin.test_add_request_method_with_callable": "PASSED",
    "TestFactoriesMixin.test_add_request_method_with_text_name": "PASSED",
    "TestFactoriesMixin.test_add_request_method_with_unnamed_callable": "PASSED",
    "TestFactoriesMixin.test_set_execution_policy": "PASSED",
    "TestFactoriesMixin.test_set_execution_policy_to_None": "PASSED",
    "TestFactoriesMixin.test_set_multiple_request_methods_conflict": "PASSED",
    "TestFactoriesMixin.test_set_request_factory": "PASSED",
    "TestFactoriesMixin.test_set_response_factory": "PASSED",
    "TestFactoriesMixin.test_set_root_factory": "PASSED",
    "TestFactoriesMixin.test_set_root_factory_as_None": "PASSED",
    "TestFactoriesMixin.test_set_session_factory": "PASSED",
    "TestI18NConfiguratorMixin.test_add_translation_dirs_invalid_kwargs": "PASSED",
    "TestI18NConfiguratorMixin.test_add_translation_dirs_missing_dir": "PASSED",
    "TestI18NConfiguratorMixin.test_add_translation_dirs_no_specs": "PASSED",
    "TestI18NConfiguratorMixin.test_set_locale_negotiator": "PASSED",
    "ConfiguratorTests.test___getattr__matches": "PASSED",
    "ConfiguratorTests.test___getattr__matches_no_action_wrap": "PASSED",
    "ConfiguratorTests.test___getattr__missing_when_directives_dont_exist": "PASSED",
    "ConfiguratorTests.test___getattr__missing_when_directives_exist": "PASSED",
    "ConfiguratorTests.test__fix_registry_adds__lock": "PASSED",
    "ConfiguratorTests.test__fix_registry_adds_clear_view_lookup_cache": "PASSED",
    "ConfiguratorTests.test__fix_registry_has_listeners": "PASSED",
    "ConfiguratorTests.test__fix_registry_notify": "PASSED",
    "ConfiguratorTests.test__fix_registry_queryAdapterOrSelf": "PASSED",
    "ConfiguratorTests.test__fix_registry_registerSelfAdapter": "PASSED",
    "ConfiguratorTests.test_absolute_asset_spec_already_absolute": "PASSED",
    "ConfiguratorTests.test_absolute_asset_spec_notastring": "PASSED",
    "ConfiguratorTests.test_absolute_asset_spec_relative": "PASSED",
    "ConfiguratorTests.test_begin": "PASSED",
    "ConfiguratorTests.test_begin_does_not_propagate_request_for_diff_registry": "PASSED",
    "ConfiguratorTests.test_begin_overrides_request": "PASSED",
    "ConfiguratorTests.test_begin_propagates_request_for_same_registry": "PASSED",
    "ConfiguratorTests.test_begin_with_request": "PASSED",
    "ConfiguratorTests.test_context_manager": "PASSED",
    "ConfiguratorTests.test_ctor_alternate_renderers": "PASSED",
    "ConfiguratorTests.test_ctor_authentication_policy": "PASSED",
    "ConfiguratorTests.test_ctor_authorization_policy_only": "PASSED",
    "ConfiguratorTests.test_ctor_default_permission": "PASSED",
    "ConfiguratorTests.test_ctor_default_renderers": "PASSED",
    "ConfiguratorTests.test_ctor_default_view_mapper": "PASSED",
    "ConfiguratorTests.test_ctor_default_webob_response_adapter_registered": "PASSED",
    "ConfiguratorTests.test_ctor_exceptionresponse_view_None": "PASSED",
    "ConfiguratorTests.test_ctor_exceptionresponse_view_custom": "PASSED",
    "ConfiguratorTests.test_ctor_httpexception_view_default": "PASSED",
    "ConfiguratorTests.test_ctor_no_root_factory": "PASSED",
    "ConfiguratorTests.test_ctor_noreg_custom_settings": "PASSED",
    "ConfiguratorTests.test_ctor_noreg_debug_logger_non_None": "PASSED",
    "ConfiguratorTests.test_ctor_security_policy": "PASSED",
    "ConfiguratorTests.test_ctor_session_factory": "PASSED",
    "ConfiguratorTests.test_ctor_with_introspection": "PASSED",
    "ConfiguratorTests.test_ctor_with_package_registry": "PASSED",
    "ConfiguratorTests.test_ctor_with_root_factory": "PASSED",
    "ConfiguratorTests.test_end": "PASSED",
    "ConfiguratorTests.test_hook_zca": "PASSED",
    "ConfiguratorTests.test_include_threadlocals_active": "PASSED",
    "ConfiguratorTests.test_include_with_dotted_name": "PASSED",
    "ConfiguratorTests.test_include_with_missing_source_file": "PASSED",
    "ConfiguratorTests.test_include_with_module_defaults_to_includeme": "PASSED",
    "ConfiguratorTests.test_include_with_module_defaults_to_includeme_missing": "PASSED",
    "ConfiguratorTests.test_include_with_nested_route_prefix": "PASSED",
    "ConfiguratorTests.test_include_with_route_prefix": "PASSED",
    "ConfiguratorTests.test_introspector_decorator": "PASSED",
    "ConfiguratorTests.test_make_wsgi_app": "PASSED",
    "ConfiguratorTests.test_maybe_dotted_notstring_success": "PASSED",
    "ConfiguratorTests.test_maybe_dotted_string_fail": "PASSED",
    "ConfiguratorTests.test_maybe_dotted_string_success": "PASSED",
    "ConfiguratorTests.test_scan_integration": "PASSED",
    "ConfiguratorTests.test_scan_integration_conflict": "PASSED",
    "ConfiguratorTests.test_scan_integration_dottedname_package": "PASSED",
    "ConfiguratorTests.test_scan_integration_with_extra_kw": "PASSED",
    "ConfiguratorTests.test_scan_integration_with_ignore": "PASSED",
    "ConfiguratorTests.test_scan_integration_with_onerror": "PASSED",
    "ConfiguratorTests.test_setup_registry_alternate_renderers": "PASSED",
    "ConfiguratorTests.test_setup_registry_authentication_policy": "PASSED",
    "ConfiguratorTests.test_setup_registry_authentication_policy_dottedname": "PASSED",
    "ConfiguratorTests.test_setup_registry_authorization_policy_dottedname": "PASSED",
    "ConfiguratorTests.test_setup_registry_authorization_policy_only": "PASSED",
    "ConfiguratorTests.test_setup_registry_calls_fix_registry": "PASSED",
    "ConfiguratorTests.test_setup_registry_custom_settings": "PASSED",
    "ConfiguratorTests.test_setup_registry_debug_logger_name": "PASSED",
    "ConfiguratorTests.test_setup_registry_debug_logger_non_None": "PASSED",
    "ConfiguratorTests.test_setup_registry_default_permission": "PASSED",
    "ConfiguratorTests.test_setup_registry_dottedname_root_factory": "PASSED",
    "ConfiguratorTests.test_setup_registry_explicit_notfound_trumps_iexceptionresponse": "PASSED",
    "ConfiguratorTests.test_setup_registry_includes": "PASSED",
    "ConfiguratorTests.test_setup_registry_includes_spaces": "PASSED",
    "ConfiguratorTests.test_setup_registry_locale_negotiator": "PASSED",
    "ConfiguratorTests.test_setup_registry_locale_negotiator_dottedname": "PASSED",
    "ConfiguratorTests.test_setup_registry_no_default_root_factory": "PASSED",
    "ConfiguratorTests.test_setup_registry_registers_default_exceptionresponse_views": "PASSED",
    "ConfiguratorTests.test_setup_registry_registers_default_view_predicates": "PASSED",
    "ConfiguratorTests.test_setup_registry_registers_default_webob_iresponse_adapter": "PASSED",
    "ConfiguratorTests.test_setup_registry_request_factory": "PASSED",
    "ConfiguratorTests.test_setup_registry_request_factory_dottedname": "PASSED",
    "ConfiguratorTests.test_setup_registry_response_factory": "PASSED",
    "ConfiguratorTests.test_unhook_zca": "PASSED",
    "ConfiguratorTests.test_with_package": "PASSED",
    "ConfiguratorTests.test_with_package_package": "PASSED",
    "TestConfigurator_add_directive.test_directive_persists_across_configurator_creations": "PASSED",
    "TestConfigurator_add_directive.test_extend_action_method_successful": "PASSED",
    "TestConfigurator_add_directive.test_extend_same_name_doesnt_conflict": "PASSED",
    "TestConfigurator__add_predicate.test_factory_as_object": "PASSED",
    "TestGlobalRegistriesIntegration.test_global_registries": "PASSED",
    "TestGlobalRegistriesIntegration.test_global_registries_empty": "PASSED",
    "TestPredicateList.test_custom_predicates_can_affect_traversal": "PASSED",
    "TestPredicateList.test_different_custom_predicates_with_same_hash": "PASSED",
    "TestPredicateList.test_header_multiple": "PASSED",
    "TestPredicateList.test_header_multiple_fails": "PASSED",
    "TestPredicateList.test_header_multiple_mixed": "PASSED",
    "TestPredicateList.test_header_multiple_mixed_fails": "PASSED",
    "TestPredicateList.test_header_multiple_with_values": "PASSED",
    "TestPredicateList.test_header_multiple_with_values_fails": "PASSED",
    "TestPredicateList.test_header_simple": "PASSED",
    "TestPredicateList.test_header_simple_fails": "PASSED",
    "TestPredicateList.test_header_with_value": "PASSED",
    "TestPredicateList.test_header_with_value_fails": "PASSED",
    "TestPredicateList.test_header_with_value_fails_case": "PASSED",
    "TestPredicateList.test_match_param_from_dict": "PASSED",
    "TestPredicateList.test_match_param_from_dict_fails": "PASSED",
    "TestPredicateList.test_match_param_from_string": "PASSED",
    "TestPredicateList.test_match_param_from_string_fails": "PASSED",
    "TestPredicateList.test_notted": "PASSED",
    "TestPredicateList.test_ordering_importance_and_number": "PASSED",
    "TestPredicateList.test_ordering_importance_of_predicates": "PASSED",
    "TestPredicateList.test_ordering_number_of_predicates": "PASSED",
    "TestPredicateList.test_ordering_xhr_and_request_method_trump_only_containment": "PASSED",
    "TestPredicateList.test_predicate_close_matches": "PASSED",
    "TestPredicateList.test_predicate_text_is_correct": "PASSED",
    "TestPredicateList.test_predicate_text_is_correct_when_multiple": "PASSED",
    "TestPredicateList.test_request_method_ordering_hashes_same": "PASSED",
    "TestPredicateList.test_request_method_sequence": "PASSED",
    "TestPredicateList.test_traverse_has_remainder_already": "PASSED",
    "TestPredicateList.test_traverse_matches": "PASSED",
    "TestPredicateList.test_traverse_matches_with_highorder_chars": "PASSED",
    "TestPredicateList.test_unknown_predicate": "PASSED",
    "Test_sort_accept_offers.test_default_specificities": "PASSED",
    "Test_sort_accept_offers.test_params_inherit_type_prefs": "PASSED",
    "Test_sort_accept_offers.test_params_order": "PASSED",
    "Test_sort_accept_offers.test_specific_type_order": "PASSED",
    "TestRenderingConfiguratorMixin.test_add_default_renderers": "PASSED",
    "TestRenderingConfiguratorMixin.test_add_renderer": "PASSED",
    "TestRenderingConfiguratorMixin.test_add_renderer_dottedname_factory": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_defaults": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_discriminator": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_effective_principals_deprecated": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_no_path_no_pattern": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_no_pattern_with_path": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_no_view_with_view_attr": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_no_view_with_view_context": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_no_view_with_view_permission": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_no_view_with_view_renderer": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_accept": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_accept_list": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_custom_predicates": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_factory": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_header": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_inherit_errors": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_path_info": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_path_info_highorder": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_path_info_regex": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_pregenerator": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_request_method": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_request_param": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_root_slash_with_route_prefix": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_route_prefix": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_route_prefix_with_inherit_slash": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_static": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_wildcard_accept_raises": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_xhr": "PASSED",
    "RoutesConfiguratorMixinTests.test_get_routes_mapper_already_registered": "PASSED",
    "RoutesConfiguratorMixinTests.test_get_routes_mapper_not_yet_registered": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_add_permission": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_changing_set_default_csrf_options": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_set_authentication_policy_no_authz_policy": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_set_authentication_policy_no_authz_policy_autocommit": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_set_authentication_policy_with_authz_policy": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_set_authentication_policy_with_authz_policy_autocommit": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_set_authentication_policy_with_security_policy": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_set_authorization_policy_no_authn_policy": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_set_authorization_policy_no_authn_policy_autocommit": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_set_authorization_policy_with_authn_policy": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_set_authorization_policy_with_authn_policy_autocommit": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_set_default_csrf_options": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_set_default_permission": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_set_security_policy": "PASSED",
    "TestSettingsConfiguratorMixin.test__set_settings_as_None": "PASSED",
    "TestSettingsConfiguratorMixin.test__set_settings_as_dictwithvalues": "PASSED",
    "TestSettingsConfiguratorMixin.test__set_settings_does_not_uses_original_dict": "PASSED",
    "TestSettingsConfiguratorMixin.test_add_settings_settings_None": "PASSED",
    "TestSettingsConfiguratorMixin.test_add_settings_settings_already_registered": "PASSED",
    "TestSettingsConfiguratorMixin.test_add_settings_settings_not_yet_registered": "PASSED",
    "TestSettingsConfiguratorMixin.test_get_settings_nosettings": "PASSED",
    "TestSettingsConfiguratorMixin.test_get_settings_withsettings": "PASSED",
    "TestSettingsConfiguratorMixin.test_settings_parameter_dict_is_never_updated": "PASSED",
    "TestSettings.test_csrf_trusted_origins": "PASSED",
    "TestSettings.test_debug_all": "PASSED",
    "TestSettings.test_debug_authorization": "PASSED",
    "TestSettings.test_debug_notfound": "PASSED",
    "TestSettings.test_debug_routematch": "PASSED",
    "TestSettings.test_debug_templates": "PASSED",
    "TestSettings.test_default_locale_name": "PASSED",
    "TestSettings.test_noargs": "PASSED",
    "TestSettings.test_originals_kept": "PASSED",
    "TestSettings.test_prevent_cachebust": "PASSED",
    "TestSettings.test_prevent_http_cache": "PASSED",
    "TestSettings.test_reload_all": "PASSED",
    "TestSettings.test_reload_assets": "PASSED",
    "TestSettings.test_reload_resources": "PASSED",
    "TestSettings.test_reload_templates": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_add_renderer": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_add_renderer_explicitrenderer": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_add_renderer_twice": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_add_subscriber_defaults": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_add_subscriber_multiple": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_add_subscriber_single": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_add_template": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_resources": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_securitypolicy": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_securitypolicy_forget_result": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_securitypolicy_remember_result": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tween_instance": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tween_name_ingress": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tween_name_main": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tween_over_ingress": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tween_over_ingress_iterable": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tween_under_main": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tween_under_main_iterable": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tween_unsuitable": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tweens_conflict": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tweens_names_with_over_nonstringoriter": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tweens_names_with_under_nonstringoriter": "PASSED",
    "TestTweens.test___call___explicit": "PASSED",
    "TestTweens.test___call___implicit": "PASSED",
    "TestTweens.test_add_explicit": "PASSED",
    "TestTweens.test_add_implicit": "PASSED",
    "TestTweens.test_implicit_ordering_1": "PASSED",
    "TestTweens.test_implicit_ordering_2": "PASSED",
    "TestTweens.test_implicit_ordering_3": "PASSED",
    "TestTweens.test_implicit_ordering_4": "PASSED",
    "TestTweens.test_implicit_ordering_5": "PASSED",
    "TestTweens.test_implicit_ordering_conflict_direct": "PASSED",
    "TestTweens.test_implicit_ordering_conflict_indirect": "PASSED",
    "TestTweens.test_implicit_ordering_missing_over_and_under_partials": "PASSED",
    "TestTweens.test_implicit_ordering_missing_over_partial": "PASSED",
    "TestTweens.test_implicit_ordering_missing_over_partial_with_fallback": "PASSED",
    "TestTweens.test_implicit_ordering_missing_under_partial": "PASSED",
    "TestTweens.test_implicit_ordering_missing_under_partial_with_fallback": "PASSED",
    "TestTweens.test_implicit_ordering_with_missing_fallbacks": "PASSED",
    "TestTweens.test_implicit_ordering_with_multiple_matching_fallbacks": "PASSED",
    "TestTweens.test_implicit_ordering_with_partial_fallbacks": "PASSED",
    "TestViewsConfigurationMixin.test_add_accept_view_order_override": "PASSED",
    "TestViewsConfigurationMixin.test_add_accept_view_order_throws_on_type_mismatch": "PASSED",
    "TestViewsConfigurationMixin.test_add_accept_view_order_throws_on_wildcard": "PASSED",
    "TestViewsConfigurationMixin.test_add_exception_view": "PASSED",
    "TestViewsConfigurationMixin.test_add_exception_view_disallows_exception_only": "PASSED",
    "TestViewsConfigurationMixin.test_add_exception_view_disallows_for_": "PASSED",
    "TestViewsConfigurationMixin.test_add_exception_view_disallows_name": "PASSED",
    "TestViewsConfigurationMixin.test_add_exception_view_disallows_permission": "PASSED",
    "TestViewsConfigurationMixin.test_add_exception_view_disallows_require_csrf": "PASSED",
    "TestViewsConfigurationMixin.test_add_exception_view_with_subclass": "PASSED",
    "TestViewsConfigurationMixin.test_add_forbidden_view": "PASSED",
    "TestViewsConfigurationMixin.test_add_forbidden_view_allows_other_predicates": "PASSED",
    "TestViewsConfigurationMixin.test_add_forbidden_view_disallows_context": "PASSED",
    "TestViewsConfigurationMixin.test_add_forbidden_view_disallows_for_": "PASSED",
    "TestViewsConfigurationMixin.test_add_forbidden_view_disallows_name": "PASSED",
    "TestViewsConfigurationMixin.test_add_forbidden_view_disallows_permission": "PASSED",
    "TestViewsConfigurationMixin.test_add_forbidden_view_disallows_require_csrf": "PASSED",
    "TestViewsConfigurationMixin.test_add_forbidden_view_no_view_argument": "PASSED",
    "TestViewsConfigurationMixin.test_add_forbidden_view_with_renderer": "PASSED",
    "TestViewsConfigurationMixin.test_add_normal_and_exception_view_intr_derived_callable": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_allows_other_predicates": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_append_slash": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_append_slash_custom_response": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_disallows_context": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_disallows_for_": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_disallows_name": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_disallows_permission": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_disallows_require_csrf": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_no_view_argument": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_with_renderer": "PASSED",
    "TestViewsConfigurationMixin.test_add_static_view_absolute": "PASSED",
    "TestViewsConfigurationMixin.test_add_static_view_here_no_utility_registered": "PASSED",
    "TestViewsConfigurationMixin.test_add_static_view_package_relative": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_as_instance": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_as_instance_requestonly": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_as_instancemethod": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_as_instancemethod_requestonly": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_as_oldstyle_class": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_as_oldstyle_class_requestonly": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_class_method_no_attr": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_context_as_class": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_context_as_iface": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_context_trumps_for": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_custom_more_preds_first_bests_fewer_preds_last": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_custom_predicate_bests_standard_predicate": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_default_phash_overrides_default_phash": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_default_phash_overrides_no_phash": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_does_not_accept_iterable_accept": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_exc_default_phash_overrides_default_phash": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_exc_default_phash_overrides_no_phash": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_exc_multiview_replaces_existing_securedview": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_exc_multiview_replaces_existing_view": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_exc_multiview_replaces_multiviews": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_exc_multiview_replaces_only_exc_multiview": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_exc_mulview_replaces_existing_view_with___accept__": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_exc_same_phash_overrides_existing_single_view": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_exc_with_accept_multiview_replaces_existing_view": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_exception_only": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_exception_only_misconfiguration": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_exception_only_no_regular_view": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_exception_register_secured_view": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_for_as_class": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_for_as_iface": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_mixed_case_replaces_existing_view": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_multiview___discriminator__": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_multiview_call_ordering": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_multiview_context_superclass_then_subclass": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_multiview_exception_superclass_then_subclass": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_multiview_replaces_existing_securedview": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_multiview_replaces_existing_view": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_multiview_replaces_existing_view_with___accept__": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_multiview_replaces_multiview": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_register_secured_view": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_same_phash_overrides_existing_single_view": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_same_predicates": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_view_callable_None_no_renderer": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_view_callable_None_with_renderer": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_view_callable_dottedname": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_accept_match": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_accept_multiview_replaces_existing_view": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_accept_nomatch": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_containment_false": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_containment_true": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_csrf_header": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_csrf_param": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_custom_predicates_match": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_custom_predicates_nomatch": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_decorator": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_decorator_tuple": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_default_permission_no_explicit_permission": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_default_renderer": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_function_callable": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_function_callable_requestonly": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_header_badregex": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_header_noval_match": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_header_noval_nomatch": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_header_val_match": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_header_val_missing": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_header_val_nomatch": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_http_cache": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_mapper": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_missing_csrf_header": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_name": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_name_unicode": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_no_default_permission_no_explicit_permission": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_nonexistant_route_name": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_path_info_badregex": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_path_info_match": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_path_info_nomatch": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_permission": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_request_method_false": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_request_method_get_implies_head": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_request_method_sequence_conflict": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_request_method_sequence_false": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_request_method_sequence_true": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_request_method_true": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_request_param_noval_false": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_request_param_noval_true": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_request_param_val_false": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_request_param_val_true": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_request_type": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_request_type_and_route_name": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_request_type_as_iface": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_request_type_as_noniface": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_route_name": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_route_name_exception": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_tmpl_renderer_factory_introspector_missing": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_tmpl_renderer_factory_no_renderer_factory": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_tmpl_renderer_factory_with_renderer_factory": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_view_config_and_view_defaults_conflicts": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_view_config_and_view_defaults_doesnt_conflict": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_wildcard_accept_raises": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_xhr_false": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_xhr_true": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_wrapped_view_is_decorated": "PASSED",
    "TestViewsConfigurationMixin.test_add_views_with_accept_multiview_replaces_existing": "PASSED",
    "TestViewsConfigurationMixin.test_default_accept_view_order": "PASSED",
    "TestViewsConfigurationMixin.test_derive_view_dottedname": "PASSED",
    "TestViewsConfigurationMixin.test_derive_view_function": "PASSED",
    "TestViewsConfigurationMixin.test_derive_view_with_default_renderer_no_explicit_renderer": "PASSED",
    "TestViewsConfigurationMixin.test_derive_view_with_default_renderer_with_explicit_renderer": "PASSED",
    "TestViewsConfigurationMixin.test_effective_principals_deprecated": "PASSED",
    "TestViewsConfigurationMixin.test_set_view_mapper": "PASSED",
    "TestViewsConfigurationMixin.test_set_view_mapper_dottedname": "PASSED",
    "TestViewsConfigurationMixin.test_view_with_most_specific_predicate": "PASSED",
    "TestViewsConfigurationMixin.test_view_with_most_specific_predicate_with_mismatch": "PASSED",
    "Test_runtime_exc_view.test_call": "PASSED",
    "Test_runtime_exc_view.test_call_dispatches_on_exception": "PASSED",
    "Test_runtime_exc_view.test_permitted": "PASSED",
    "Test_runtime_exc_view.test_permitted_dispatches_on_exception": "PASSED",
    "Test_requestonly.test_defaults": "PASSED",
    "Test_requestonly.test_otherattr": "PASSED",
    "Test_isexception.test_is_IException": "PASSED",
    "Test_isexception.test_is_IException_subinterface": "PASSED",
    "Test_isexception.test_is_exception_class": "PASSED",
    "Test_isexception.test_is_exception_instance": "PASSED",
    "TestMultiView.test___call__": "PASSED",
    "TestMultiView.test___call__intermediate_not_found": "PASSED",
    "TestMultiView.test___call__raise_not_found_isnt_interpreted_as_pred_mismatch": "PASSED",
    "TestMultiView.test___call_permissive_has_call_permissive": "PASSED",
    "TestMultiView.test___call_permissive_has_no_call_permissive": "PASSED",
    "TestMultiView.test__call__not_found": "PASSED",
    "TestMultiView.test__call__with_accept_match": "PASSED",
    "TestMultiView.test__call__with_accept_miss": "PASSED",
    "TestMultiView.test__call_permissive__not_found": "PASSED",
    "TestMultiView.test_add": "PASSED",
    "TestMultiView.test_add_with_phash": "PASSED",
    "TestMultiView.test_add_with_phash_override_accept": "PASSED",
    "TestMultiView.test_add_with_phash_override_accept2": "PASSED",
    "TestMultiView.test_class_implements_ISecuredView": "PASSED",
    "TestMultiView.test_get_views": "PASSED",
    "TestMultiView.test_get_views_best_match_returns_None": "PASSED",
    "TestMultiView.test_get_views_no_self_accepts": "PASSED",
    "TestMultiView.test_get_views_request_has_no_accept": "PASSED",
    "TestMultiView.test_instance_implements_ISecuredView": "PASSED",
    "TestMultiView.test_match_not_found": "PASSED",
    "TestMultiView.test_match_predicate_fails": "PASSED",
    "TestMultiView.test_match_predicate_succeeds": "PASSED",
    "TestMultiView.test_multiple_with_functions_as_views": "PASSED",
    "TestMultiView.test_permitted": "PASSED",
    "TestMultiView.test_permitted_no_match_with__permitted__": "PASSED",
    "TestMultiView.test_permitted_no_views": "PASSED",
    "TestDefaultViewMapper.test__view_as_function_with_attr": "PASSED",
    "TestDefaultViewMapper.test_view_as_function_context_and_request": "PASSED",
    "TestDefaultViewMapper.test_view_as_function_requestonly": "PASSED",
    "TestDefaultViewMapper.test_view_as_function_requestonly_with_attr": "PASSED",
    "TestDefaultViewMapper.test_view_as_instance_context_and_request": "PASSED",
    "TestDefaultViewMapper.test_view_as_instance_context_and_request_and_attr": "PASSED",
    "TestDefaultViewMapper.test_view_as_instance_requestonly": "PASSED",
    "TestDefaultViewMapper.test_view_as_instance_requestonly_with_attr": "PASSED",
    "TestDefaultViewMapper.test_view_as_newstyle_class_context_and_request": "PASSED",
    "TestDefaultViewMapper.test_view_as_newstyle_class_context_and_request_with_attr": "PASSED",
    "TestDefaultViewMapper.test_view_as_newstyle_class_requestonly": "PASSED",
    "TestDefaultViewMapper.test_view_as_newstyle_class_requestonly_with_attr": "PASSED",
    "TestDefaultViewMapper.test_view_as_oldstyle_class_context_and_request": "PASSED",
    "TestDefaultViewMapper.test_view_as_oldstyle_class_context_and_request_with_attr": "PASSED",
    "TestDefaultViewMapper.test_view_as_oldstyle_class_requestonly": "PASSED",
    "TestDefaultViewMapper.test_view_as_oldstyle_class_requestonly_with_attr": "PASSED",
    "Test_preserve_view_attrs.test_it_different": "PASSED",
    "Test_preserve_view_attrs.test_it_different_with_existing_original_view": "PASSED",
    "Test_preserve_view_attrs.test_it_same": "PASSED",
    "Test_preserve_view_attrs.test_it_view_is_None": "PASSED",
    "TestStaticURLInfo.test_add_already_exists": "PASSED",
    "TestStaticURLInfo.test_add_cachebust_prevented": "PASSED",
    "TestStaticURLInfo.test_add_cachebuster": "PASSED",
    "TestStaticURLInfo.test_add_cachebuster_abspath": "PASSED",
    "TestStaticURLInfo.test_add_cachebuster_for_more_specific_path": "PASSED",
    "TestStaticURLInfo.test_add_cachebuster_overwrite": "PASSED",
    "TestStaticURLInfo.test_add_cachebuster_overwrite_explicit": "PASSED",
    "TestStaticURLInfo.test_add_package_root": "PASSED",
    "TestStaticURLInfo.test_add_url_noendslash": "PASSED",
    "TestStaticURLInfo.test_add_url_noscheme": "PASSED",
    "TestStaticURLInfo.test_add_url_withendslash": "PASSED",
    "TestStaticURLInfo.test_add_viewname": "PASSED",
    "TestStaticURLInfo.test_add_viewname_with_context": "PASSED",
    "TestStaticURLInfo.test_add_viewname_with_for_": "PASSED",
    "TestStaticURLInfo.test_add_viewname_with_permission": "PASSED",
    "TestStaticURLInfo.test_add_viewname_with_renderer": "PASSED",
    "TestStaticURLInfo.test_add_viewname_with_route_prefix": "PASSED",
    "TestStaticURLInfo.test_generate_missing": "PASSED",
    "TestStaticURLInfo.test_generate_quoting": "PASSED",
    "TestStaticURLInfo.test_generate_registration_miss": "PASSED",
    "TestStaticURLInfo.test_generate_route_url": "PASSED",
    "TestStaticURLInfo.test_generate_slash_in_name1": "PASSED",
    "TestStaticURLInfo.test_generate_slash_in_name2": "PASSED",
    "TestStaticURLInfo.test_generate_url_cachebust": "PASSED",
    "TestStaticURLInfo.test_generate_url_cachebust_abspath": "PASSED",
    "TestStaticURLInfo.test_generate_url_cachebust_nomatch": "PASSED",
    "TestStaticURLInfo.test_generate_url_quoted_remote": "PASSED",
    "TestStaticURLInfo.test_generate_url_unquoted_local": "PASSED",
    "TestStaticURLInfo.test_generate_url_with_custom_anchor": "PASSED",
    "TestStaticURLInfo.test_generate_url_with_custom_query": "PASSED",
    "TestStaticURLInfo.test_verifyClass": "PASSED",
    "TestStaticURLInfo.test_verifyObject": "PASSED",
    "Test_view_description.test_with_text": "PASSED",
    "Test_viewdefaults.test_dunder_attrs_copied": "PASSED",
    "TestParseVars.test_parse_vars_bad": "PASSED",
    "TestParseVars.test_parse_vars_good": "PASSED",
    "TestPDistReportCommand.test_no_dists": "PASSED",
    "TestPDistReportCommand.test_with_dists": "PASSED",
    "TestPRequestCommand.test_command_display_headers": "PASSED",
    "TestPRequestCommand.test_command_has_bad_config_header": "PASSED",
    "TestPRequestCommand.test_command_has_content_type_header_var": "PASSED",
    "TestPRequestCommand.test_command_has_good_header_var": "PASSED",
    "TestPRequestCommand.test_command_has_multiple_header_vars": "PASSED",
    "TestPRequestCommand.test_command_method_configures_logging": "PASSED",
    "TestPRequestCommand.test_command_method_get": "PASSED",
    "TestPRequestCommand.test_command_method_options": "PASSED",
    "TestPRequestCommand.test_command_method_patch": "PASSED",
    "TestPRequestCommand.test_command_method_post": "PASSED",
    "TestPRequestCommand.test_command_method_propfind": "PASSED",
    "TestPRequestCommand.test_command_method_put": "PASSED",
    "TestPRequestCommand.test_command_not_enough_args": "PASSED",
    "TestPRequestCommand.test_command_path_doesnt_start_with_slash": "PASSED",
    "TestPRequestCommand.test_command_response_has_no_charset": "PASSED",
    "TestPRequestCommand.test_command_two_args": "PASSED",
    "TestPRequestCommand.test_command_w_basic_auth": "PASSED",
    "TestPRequestCommand.test_command_with_query_string": "PASSED",
    "Test_main.test_it": "PASSED",
    "TestPRoutesCommand.test__get_mapper": "PASSED",
    "TestPRoutesCommand.test_bad_args": "PASSED",
    "TestPRoutesCommand.test_bad_format": "PASSED",
    "TestPRoutesCommand.test_config_format_ini_commas": "PASSED",
    "TestPRoutesCommand.test_config_format_ini_newlines": "PASSED",
    "TestPRoutesCommand.test_config_format_ini_spaces": "PASSED",
    "TestPRoutesCommand.test_good_args": "PASSED",
    "TestPRoutesCommand.test_good_format": "PASSED",
    "TestPRoutesCommand.test_no_mapper": "PASSED",
    "TestPRoutesCommand.test_no_routes": "PASSED",
    "TestPRoutesCommand.test_route_as_wsgiapp": "PASSED",
    "TestPRoutesCommand.test_route_no_view": "PASSED",
    "TestPRoutesCommand.test_route_with_no_slash_prefix": "PASSED",
    "TestPRoutesCommand.test_single_route_no_route_registered": "PASSED",
    "TestPRoutesCommand.test_single_route_no_views_registered": "PASSED",
    "TestPRoutesCommand.test_single_route_one_view_registered_with_factory": "PASSED",
    "TestPRoutesCommand.test_static_routes_included_in_list": "PASSED",
    "TestPServeCommand.test_config_file_finds_open_url": "PASSED",
    "TestPServeCommand.test_guess_server_url": "PASSED",
    "TestPServeCommand.test_original_ignore_files": "PASSED",
    "TestPServeCommand.test_parse_vars_bad": "PASSED",
    "TestPServeCommand.test_parse_vars_good": "PASSED",
    "TestPServeCommand.test_reload_call_hupper_with_correct_args": "PASSED",
    "TestPServeCommand.test_run_no_args": "PASSED",
    "TestPShellCommand.test_command_custom_section_override": "PASSED",
    "TestPShellCommand.test_command_default_shell_option": "PASSED",
    "TestPShellCommand.test_command_errors_with_unknown_shell": "PASSED",
    "TestPShellCommand.test_command_loads_check_variable_override_order": "PASSED",
    "TestPShellCommand.test_command_loads_custom_items": "PASSED",
    "TestPShellCommand.test_command_loads_default_shell": "PASSED",
    "TestPShellCommand.test_command_loads_ipython": "PASSED",
    "TestPShellCommand.test_command_loads_pythonstartup": "PASSED",
    "TestPShellCommand.test_command_loads_setup_from_options": "PASSED",
    "TestPShellCommand.test_command_setup": "PASSED",
    "TestPShellCommand.test_command_setup_generator": "PASSED",
    "TestPShellCommand.test_list_shells": "PASSED",
    "TestPShellCommand.test_shell_entry_points": "PASSED",
    "TestPShellCommand.test_shell_ordering": "PASSED",
    "TestPShellCommand.test_shell_override": "PASSED",
    "Test_python_shell_runner.test_it": "PASSED",
    "TestPTweensCommand.test__get_tweens": "PASSED",
    "TestPTweensCommand.test_command_implicit_and_explicit_tweens": "PASSED",
    "TestPTweensCommand.test_command_implicit_tweens_only": "PASSED",
    "TestPTweensCommand.test_command_no_tweens": "PASSED",
    "TestPViewsCommand.test__find_multi_routes_all_match": "PASSED",
    "TestPViewsCommand.test__find_multi_routes_none_match": "PASSED",
    "TestPViewsCommand.test__find_multi_routes_some_match": "PASSED",
    "TestPViewsCommand.test__find_view_no_match": "PASSED",
    "TestPViewsCommand.test__find_view_no_match_multiview_registered": "PASSED",
    "TestPViewsCommand.test__find_view_route_multiview": "PASSED",
    "TestPViewsCommand.test__find_view_route_multiview_no_view_registered": "PASSED",
    "TestPViewsCommand.test__find_view_route_no_multiview": "PASSED",
    "TestPViewsCommand.test__find_view_traversal": "PASSED",
    "TestPViewsCommand.test__find_view_traversal_multiview": "PASSED",
    "TestPViewsCommand.test_views_command_not_found": "PASSED",
    "TestPViewsCommand.test_views_command_not_found_url_starts_without_slash": "PASSED",
    "TestCallbackAuthenticationPolicyDebugging.test_authenticated_userid_fails_cleaning_as_Authenticated": "FAILED",
    "TestCallbackAuthenticationPolicyDebugging.test_authenticated_userid_fails_cleaning_as_Everyone": "FAILED",
    "TestCallbackAuthenticationPolicyDebugging.test_authenticated_userid_no_callback": "FAILED",
    "TestCallbackAuthenticationPolicyDebugging.test_authenticated_userid_no_unauthenticated_userid": "FAILED",
    "TestCallbackAuthenticationPolicyDebugging.test_authenticated_userid_with_callback_fail": "FAILED",
    "TestCallbackAuthenticationPolicyDebugging.test_authenticated_userid_with_callback_success": "FAILED",
    "TestCallbackAuthenticationPolicyDebugging.test_effective_principals_no_callback": "FAILED",
    "TestCallbackAuthenticationPolicyDebugging.test_effective_principals_no_unauthenticated_userid": "FAILED",
    "TestCallbackAuthenticationPolicyDebugging.test_effective_principals_with_callback_fail": "FAILED",
    "TestCallbackAuthenticationPolicyDebugging.test_effective_principals_with_callback_success": "FAILED",
    "TestCallbackAuthenticationPolicyDebugging.test_effective_principals_with_unclean_principal_Authenticated": "FAILED",
    "TestCallbackAuthenticationPolicyDebugging.test_effective_principals_with_unclean_principal_Everyone": "FAILED",
    "AdaptersConfiguratorMixinTests.test_add_resource_url_adapter_dotted_names": "FAILED",
    "AdaptersConfiguratorMixinTests.test_add_resource_url_adapter_introspectables": "FAILED",
    "AdaptersConfiguratorMixinTests.test_add_traverser_dotted_names": "FAILED",
    "TestAssetsConfiguratorMixin.test_override_asset_directory_with_directory": "FAILED",
    "TestAssetsConfiguratorMixin.test_override_asset_directory_with_package": "FAILED",
    "TestAssetsConfiguratorMixin.test_override_asset_file_with_file": "FAILED",
    "TestAssetsConfiguratorMixin.test_override_asset_package_with_directory": "FAILED",
    "TestAssetsConfiguratorMixin.test_override_asset_package_with_package": "FAILED",
    "TestOverrideProvider.test_get_resource_filename_no_overrides": "FAILED",
    "TestOverrideProvider.test_get_resource_filename_override_returns_None": "FAILED",
    "TestPackageAssetSource.test_get_filename": "FAILED",
    "TestPackageAssetSource.test_get_filename_with_prefix": "FAILED",
    "TestFactoriesMixin.test_set_request_factory_dottedname": "FAILED",
    "TestFactoriesMixin.test_set_response_factory_dottedname": "FAILED",
    "TestFactoriesMixin.test_set_root_factory_dottedname": "FAILED",
    "TestFactoriesMixin.test_set_session_factory_dottedname": "FAILED",
    "TestI18NConfiguratorMixin.test_add_translation_dirs_abspath": "FAILED",
    "TestI18NConfiguratorMixin.test_add_translation_dirs_asset_spec": "FAILED",
    "TestI18NConfiguratorMixin.test_add_translation_dirs_asset_spec_existing_translation_dirs": "FAILED",
    "TestI18NConfiguratorMixin.test_add_translation_dirs_doesnt_use_override_w_autocommit": "FAILED",
    "TestI18NConfiguratorMixin.test_add_translation_dirs_multiple_specs": "FAILED",
    "TestI18NConfiguratorMixin.test_add_translation_dirs_multiple_specs_multiple_calls": "FAILED",
    "TestI18NConfiguratorMixin.test_add_translation_dirs_override_multiple_specs_multiple_calls": "FAILED",
    "TestI18NConfiguratorMixin.test_add_translation_dirs_uses_override_out_of_order": "FAILED",
    "TestI18NConfiguratorMixin.test_add_translation_dirs_uses_override_w_autocommit": "FAILED",
    "TestI18NConfiguratorMixin.test_set_locale_negotiator_dottedname": "FAILED",
    "ConfiguratorTests.test_ctor_no_registry": "FAILED",
    "ConfiguratorTests.test_ctor_noreg_debug_logger_None_default": "FAILED",
    "ConfiguratorTests.test_include_constant_root_package": "FAILED",
    "ConfiguratorTests.test_include_with_python_callable": "FAILED",
    "ConfiguratorTests.test_setup_registry_debug_logger_None_default": "FAILED",
    "ConfiguratorTests.test_setup_registry_tweens": "FAILED",
    "ConfiguratorTests.test_with_package_module": "FAILED",
    "TestConfigurator_add_directive.test_add_directive_with_custom_callable": "FAILED",
    "TestConfigurator_add_directive.test_add_directive_with_partial": "FAILED",
    "TestConfigurator_add_directive.test_extend_with_dotted_name": "FAILED",
    "TestConfigurator_add_directive.test_extend_with_python_callable": "FAILED",
    "TestConfigurator__add_predicate.test_factory_as_dotted_name": "FAILED",
    "RoutesConfiguratorMixinTests.test_add_route_with_factory_dottedname": "FAILED",
    "TestingConfiguratorMixinTests.test_testing_add_subscriber_dottedname": "FAILED",
    "TestTweensConfiguratorMixin.test_add_tween_dottedname": "FAILED",
    "TestTweensConfiguratorMixin.test_add_tweens_names_distinct": "FAILED",
    "TestTweensConfiguratorMixin.test_add_tweens_names_with_underover": "FAILED",
    "TestViewsConfigurationMixin.test_add_exception_view_with_view_defaults": "FAILED",
    "TestViewsConfigurationMixin.test_add_forbidden_view_with_view_defaults": "FAILED",
    "TestViewsConfigurationMixin.test_add_notfound_view_with_view_defaults": "FAILED",
    "TestViewsConfigurationMixin.test_add_static_view_package_here_relative": "FAILED",
    "TestViewsConfigurationMixin.test_add_view_context_as_dottedname": "FAILED",
    "TestViewsConfigurationMixin.test_add_view_for__as_dottedname": "FAILED",
    "TestViewsConfigurationMixin.test_add_view_with_containment_dottedname": "FAILED",
    "TestViewsConfigurationMixin.test_add_view_with_template_renderer": "FAILED",
    "TestViewsConfigurationMixin.test_add_view_with_template_renderer_no_callable": "FAILED",
    "TestViewsConfigurationMixin.test_add_view_with_view_defaults": "FAILED",
    "TestViewsConfigurationMixin.test_add_view_with_view_defaults_viewname_is_dottedname_kwarg": "FAILED",
    "TestViewsConfigurationMixin.test_add_view_with_view_defaults_viewname_is_dottedname_nonkwarg": "FAILED",
    "TestStaticURLInfo.test_generate_url_cachebust_with_overrides": "FAILED",
    "Test_view_description.test_without_text": "FAILED",
    "TestPRoutesCommand.test_class_view": "FAILED",
    "TestPRoutesCommand.test_one_route_all_methods_view_only_post": "FAILED",
    "TestPRoutesCommand.test_one_route_only_post_view_all_methods": "FAILED",
    "TestPRoutesCommand.test_one_route_only_post_view_post_and_get": "FAILED",
    "TestPRoutesCommand.test_one_route_with_long_name_one_view_registered": "FAILED",
    "TestPRoutesCommand.test_route_is_get_view_request_method_not_post": "FAILED",
    "TestPRoutesCommand.test_route_request_method_mismatch": "FAILED",
    "TestPRoutesCommand.test_route_static_views": "FAILED",
    "TestPRoutesCommand.test_single_route_multiview_registered": "FAILED",
    "TestPRoutesCommand.test_single_route_one_view_registered": "FAILED",
    "TestPRoutesCommand.test_view_glob": "FAILED",
    "TestPRoutesCommand.test_view_request_method_not_post": "FAILED",
    "TestPServeCommand.test_config_file_finds_watch_files": "FAILED",
    "TestPViewsCommand.test_views_command_multi_view_nested": "FAILED",
    "TestPViewsCommand.test_views_command_multiview": "FAILED",
    "TestPViewsCommand.test_views_command_multiview_with_permission": "FAILED",
    "TestPViewsCommand.test_views_command_multiview_with_predicates": "FAILED",
    "TestPViewsCommand.test_views_command_single_view_function_traversal": "FAILED",
    "TestPViewsCommand.test_views_command_single_view_route": "FAILED",
    "TestPViewsCommand.test_views_command_single_view_route_with_route_predicates": "FAILED",
    "TestPViewsCommand.test_views_command_single_view_traversal": "FAILED",
    "TestPViewsCommand.test_views_command_single_view_traversal_with_permission": "FAILED",
    "TestPViewsCommand.test_views_command_single_view_traversal_with_predicates": "FAILED"
}
diff --git a/src/pyramid/authentication.py b/src/pyramid/authentication.py
index 47570d5fc..1bddc1ff3 100644
--- a/src/pyramid/authentication.py
+++ b/src/pyramid/authentication.py
@@ -1035,8 +1035,8 @@ class AuthTktCookieHelper:
                 domains.append('.' + cur_domain.split('.', 1)[1])
             else:
                 domains.append(None)
-                domains.append(cur_domain)
                 if self.wild_domain:
+                    domains.append(cur_domain)
                     domains.append('.' + cur_domain)
 
         profile = self.cookie_profile(request)

{"src/pyramid/authentication.py": "import base64\nimport binascii\nfrom codecs import utf_8_decode, utf_8_encode\nfrom collections import namedtuple\nimport hashlib\nimport re\nimport time as time_mod\nfrom urllib.parse import quote, unquote\nimport warnings\nfrom webob.cookies import CookieProfile\nfrom zope.interface import implementer\n\nfrom pyramid.authorization import Authenticated, Everyone\nfrom pyramid.interfaces import IAuthenticationPolicy, IDebugLogger\nfrom pyramid.util import (\n    SimpleSerializer,\n    ascii_,\n    bytes_,\n    strings_differ,\n    text_,\n)\n\nVALID_TOKEN = re.compile(r\"^[A-Za-z][A-Za-z0-9+_-]*$\")\n\n\nclass CallbackAuthenticationPolicy:\n    \"\"\" Abstract class \"\"\"\n\n    debug = False\n    callback = None\n\n    def _log(self, msg, methodname, request):\n        logger = request.registry.queryUtility(IDebugLogger)\n        if logger:\n            cls = self.__class__\n            classname = cls.__module__ + '.' + cls.__name__\n            methodname = classname + '.' + methodname\n            logger.debug(methodname + ': ' + msg)\n\n    def _clean_principal(self, princid):\n        if princid in (Authenticated, Everyone):\n            princid = None\n        return princid\n\n    def authenticated_userid(self, request):\n        \"\"\" Return the authenticated userid or ``None``.\n\n        If no callback is registered, this will be the same as\n        ``unauthenticated_userid``.\n\n        If a ``callback`` is registered, this will return the userid if\n        and only if the callback returns a value that is not ``None``.\n\n        \"\"\"\n        debug = self.debug\n        userid = self.unauthenticated_userid(request)\n        if userid is None:\n            debug and self._log(\n                'call to unauthenticated_userid returned None; returning None',\n                'authenticated_userid',\n                request,\n            )\n            return None\n        if self._clean_principal(userid) is None:\n            debug and self._log(\n                (\n                    'use of userid %r is disallowed by any built-in Pyramid '\n                    'security policy, returning None' % userid\n                ),\n                'authenticated_userid',\n                request,\n            )\n            return None\n\n        if self.callback is None:\n            debug and self._log(\n                'there was no groupfinder callback; returning %r' % (userid,),\n                'authenticated_userid',\n                request,\n            )\n            return userid\n        callback_ok = self.callback(userid, request)\n        if callback_ok is not None:  # is not None!\n            debug and self._log(\n                'groupfinder callback returned %r; returning %r'\n                % (callback_ok, userid),\n                'authenticated_userid',\n                request,\n            )\n            return userid\n        debug and self._log(\n            'groupfinder callback returned None; returning None',\n            'authenticated_userid',\n            request,\n        )\n\n    def effective_principals(self, request):\n        \"\"\" A list of effective principals derived from request.\n\n        This will return a list of principals including, at least,\n        :data:`pyramid.authorization.Everyone`. If there is no authenticated\n        userid, or the ``callback`` returns ``None``, this will be the\n        only principal:\n\n        .. code-block:: python\n\n            return [Everyone]\n\n        If the ``callback`` does not return ``None`` and an authenticated\n        userid is found, then the principals will include\n        :data:`pyramid.authorization.Authenticated`, the\n        ``authenticated_userid`` and the list of principals returned by the\n        ``callback``:\n\n        .. code-block:: python\n\n            extra_principals = callback(userid, request)\n            return [Everyone, Authenticated, userid] + extra_principals\n\n        \"\"\"\n        debug = self.debug\n        effective_principals = [Everyone]\n        userid = self.unauthenticated_userid(request)\n\n        if userid is None:\n            debug and self._log(\n                'unauthenticated_userid returned %r; returning %r'\n                % (userid, effective_principals),\n                'effective_principals',\n                request,\n            )\n            return effective_principals\n\n        if self._clean_principal(userid) is None:\n            debug and self._log(\n                (\n                    'unauthenticated_userid returned disallowed %r; returning '\n                    '%r as if it was None' % (userid, effective_principals)\n                ),\n                'effective_principals',\n                request,\n            )\n            return effective_principals\n\n        if self.callback is None:\n            debug and self._log(\n                'groupfinder callback is None, so groups is []',\n                'effective_principals',\n                request,\n            )\n            groups = []\n        else:\n            groups = self.callback(userid, request)\n            debug and self._log(\n                'groupfinder callback returned %r as groups' % (groups,),\n                'effective_principals',\n                request,\n            )\n\n        if groups is None:  # is None!\n            debug and self._log(\n                'returning effective principals: %r' % (effective_principals,),\n                'effective_principals',\n                request,\n            )\n            return effective_principals\n\n        effective_principals.append(Authenticated)\n        effective_principals.append(userid)\n        effective_principals.extend(groups)\n\n        debug and self._log(\n            'returning effective principals: %r' % (effective_principals,),\n            'effective_principals',\n            request,\n        )\n        return effective_principals\n\n\n@implementer(IAuthenticationPolicy)\nclass RepozeWho1AuthenticationPolicy(CallbackAuthenticationPolicy):\n    \"\"\" A :app:`Pyramid` :term:`authentication policy` which\n    obtains data from the :mod:`repoze.who` 1.X WSGI 'API' (the\n    ``repoze.who.identity`` key in the WSGI environment).\n\n    Constructor Arguments\n\n    ``identifier_name``\n\n       Default: ``auth_tkt``.  The :mod:`repoze.who` plugin name that\n       performs remember/forget.  Optional.\n\n    ``callback``\n\n        Default: ``None``.  A callback passed the :mod:`repoze.who` identity\n        and the :term:`request`, expected to return ``None`` if the user\n        represented by the identity doesn't exist or a sequence of principal\n        identifiers (possibly empty) representing groups if the user does\n        exist.  If ``callback`` is None, the userid will be assumed to exist\n        with no group principals.\n\n    Objects of this class implement the interface described by\n    :class:`pyramid.interfaces.IAuthenticationPolicy`.\n    \"\"\"\n\n    def __init__(self, identifier_name='auth_tkt', callback=None):\n        self.identifier_name = identifier_name\n        self.callback = callback\n\n    def _get_identity(self, request):\n        return request.environ.get('repoze.who.identity')\n\n    def _get_identifier(self, request):\n        plugins = request.environ.get('repoze.who.plugins')\n        if plugins is None:\n            return None\n        identifier = plugins[self.identifier_name]\n        return identifier\n\n    def authenticated_userid(self, request):\n        \"\"\" Return the authenticated userid or ``None``.\n\n        If no callback is registered, this will be the same as\n        ``unauthenticated_userid``.\n\n        If a ``callback`` is registered, this will return the userid if\n        and only if the callback returns a value that is not ``None``.\n\n        \"\"\"\n        identity = self._get_identity(request)\n\n        if identity is None:\n            self.debug and self._log(\n                'repoze.who identity is None, returning None',\n                'authenticated_userid',\n                request,\n            )\n            return None\n\n        userid = identity['repoze.who.userid']\n\n        if userid is None:\n            self.debug and self._log(\n                'repoze.who.userid is None, returning None' % userid,\n                'authenticated_userid',\n                request,\n            )\n            return None\n\n        if self._clean_principal(userid) is None:\n            self.debug and self._log(\n                (\n                    'use of userid %r is disallowed by any built-in Pyramid '\n                    'security policy, returning None' % userid\n                ),\n                'authenticated_userid',\n                request,\n            )\n            return None\n\n        if self.callback is None:\n            return userid\n\n        if self.callback(identity, request) is not None:  # is not None!\n            return userid\n\n    def unauthenticated_userid(self, request):\n        \"\"\" Return the ``repoze.who.userid`` key from the detected identity.\"\"\"\n        identity = self._get_identity(request)\n        if identity is None:\n            return None\n        return identity['repoze.who.userid']\n\n    def effective_principals(self, request):\n        \"\"\" A list of effective principals derived from the identity.\n\n        This will return a list of principals including, at least,\n        :data:`pyramid.authorization.Everyone`. If there is no identity, or\n        the ``callback`` returns ``None``, this will be the only principal.\n\n        If the ``callback`` does not return ``None`` and an identity is\n        found, then the principals will include\n        :data:`pyramid.authorization.Authenticated`, the\n        ``authenticated_userid`` and the list of principals returned by the\n        ``callback``.\n\n        \"\"\"\n        effective_principals = [Everyone]\n        identity = self._get_identity(request)\n\n        if identity is None:\n            self.debug and self._log(\n                (\n                    'repoze.who identity was None; returning %r'\n                    % effective_principals\n                ),\n                'effective_principals',\n                request,\n            )\n            return effective_principals\n\n        if self.callback is None:\n            groups = []\n        else:\n            groups = self.callback(identity, request)\n\n        if groups is None:  # is None!\n            self.debug and self._log(\n                (\n                    'security policy groups callback returned None; returning '\n                    '%r' % effective_principals\n                ),\n                'effective_principals',\n                request,\n            )\n            return effective_principals\n\n        userid = identity['repoze.who.userid']\n\n        if userid is None:\n            self.debug and self._log(\n                (\n                    'repoze.who.userid was None; returning %r'\n                    % effective_principals\n                ),\n                'effective_principals',\n                request,\n            )\n            return effective_principals\n\n        if self._clean_principal(userid) is None:\n            self.debug and self._log(\n                (\n                    'unauthenticated_userid returned disallowed %r; returning '\n                    '%r as if it was None' % (userid, effective_principals)\n                ),\n                'effective_principals',\n                request,\n            )\n            return effective_principals\n\n        effective_principals.append(Authenticated)\n        effective_principals.append(userid)\n        effective_principals.extend(groups)\n        return effective_principals\n\n    def remember(self, request, userid, **kw):\n        \"\"\" Store the ``userid`` as ``repoze.who.userid``.\n\n        The identity to authenticated to :mod:`repoze.who`\n        will contain the given userid as ``userid``, and\n        provide all keyword arguments as additional identity\n        keys. Useful keys could be ``max_age`` or ``userdata``.\n        \"\"\"\n        identifier = self._get_identifier(request)\n        if identifier is None:\n            return []\n        environ = request.environ\n        identity = kw\n        identity['repoze.who.userid'] = userid\n        return identifier.remember(environ, identity)\n\n    def forget(self, request):\n        \"\"\" Forget the current authenticated user.\n\n        Return headers that, if included in a response, will delete the\n        cookie responsible for tracking the current user.\n\n        \"\"\"\n        identifier = self._get_identifier(request)\n        if identifier is None:\n            return []\n        identity = self._get_identity(request)\n        return identifier.forget(request.environ, identity)\n\n\n@implementer(IAuthenticationPolicy)\nclass RemoteUserAuthenticationPolicy(CallbackAuthenticationPolicy):\n    \"\"\" A :app:`Pyramid` :term:`authentication policy` which\n    obtains data from the ``REMOTE_USER`` WSGI environment variable.\n\n    Constructor Arguments\n\n    ``environ_key``\n\n        Default: ``REMOTE_USER``.  The key in the WSGI environ which\n        provides the userid.\n\n    ``callback``\n\n        Default: ``None``.  A callback passed the userid and the request,\n        expected to return None if the userid doesn't exist or a sequence of\n        principal identifiers (possibly empty) representing groups if the\n        user does exist.  If ``callback`` is None, the userid will be assumed\n        to exist with no group principals.\n\n    ``debug``\n\n        Default: ``False``.  If ``debug`` is ``True``, log messages to the\n        Pyramid debug logger about the results of various authentication\n        steps.  The output from debugging is useful for reporting to maillist\n        or IRC channels when asking for support.\n\n    Objects of this class implement the interface described by\n    :class:`pyramid.interfaces.IAuthenticationPolicy`.\n    \"\"\"\n\n    def __init__(self, environ_key='REMOTE_USER', callback=None, debug=False):\n        self.environ_key = environ_key\n        self.callback = callback\n        self.debug = debug\n\n    def unauthenticated_userid(self, request):\n        \"\"\" The ``REMOTE_USER`` value found within the ``environ``.\"\"\"\n        return request.environ.get(self.environ_key)\n\n    def remember(self, request, userid, **kw):\n        \"\"\" A no-op. The ``REMOTE_USER`` does not provide a protocol for\n        remembering the user. This will be application-specific and can\n        be done somewhere else or in a subclass.\"\"\"\n        return []\n\n    def forget(self, request):\n        \"\"\" A no-op. The ``REMOTE_USER`` does not provide a protocol for\n        forgetting the user. This will be application-specific and can\n        be done somewhere else or in a subclass.\"\"\"\n        return []\n\n\n@implementer(IAuthenticationPolicy)\nclass AuthTktAuthenticationPolicy(CallbackAuthenticationPolicy):\n    \"\"\"A :app:`Pyramid` :term:`authentication policy` which\n    obtains data from a Pyramid \"auth ticket\" cookie.\n\n    Constructor Arguments\n\n    ``secret``\n\n       The secret (a string) used for auth_tkt cookie signing.  This value\n       should be unique across all values provided to Pyramid for various\n       subsystem secrets (see :ref:`admonishment_against_secret_sharing`).\n       Required.\n\n    ``callback``\n\n       Default: ``None``.  A callback passed the userid and the\n       request, expected to return ``None`` if the userid doesn't\n       exist or a sequence of principal identifiers (possibly empty) if\n       the user does exist.  If ``callback`` is ``None``, the userid\n       will be assumed to exist with no principals.  Optional.\n\n    ``cookie_name``\n\n       Default: ``auth_tkt``.  The cookie name used\n       (string).  Optional.\n\n    ``secure``\n\n       Default: ``False``.  Only send the cookie back over a secure\n       conn.  Optional.\n\n    ``include_ip``\n\n       Default: ``False``.  Make the requesting IP address part of\n       the authentication data in the cookie.  Optional.\n\n       For IPv6 this option is not recommended. The ``mod_auth_tkt``\n       specification does not specify how to handle IPv6 addresses, so using\n       this option in combination with IPv6 addresses may cause an\n       incompatible cookie. It ties the authentication ticket to that\n       individual's IPv6 address.\n\n    ``timeout``\n\n       Default: ``None``.  Maximum number of seconds which a newly\n       issued ticket will be considered valid.  After this amount of\n       time, the ticket will expire (effectively logging the user\n       out).  If this value is ``None``, the ticket never expires.\n       Optional.\n\n    ``reissue_time``\n\n       Default: ``None``.  If this parameter is set, it represents the number\n       of seconds that must pass before an authentication token cookie is\n       automatically reissued as the result of a request which requires\n       authentication.  The duration is measured as the number of seconds\n       since the last auth_tkt cookie was issued and 'now'.  If this value is\n       ``0``, a new ticket cookie will be reissued on every request which\n       requires authentication.\n\n       A good rule of thumb: if you want auto-expired cookies based on\n       inactivity: set the ``timeout`` value to 1200 (20 mins) and set the\n       ``reissue_time`` value to perhaps a tenth of the ``timeout`` value\n       (120 or 2 mins).  It's nonsensical to set the ``timeout`` value lower\n       than the ``reissue_time`` value, as the ticket will never be reissued\n       if so.  However, such a configuration is not explicitly prevented.\n\n       Optional.\n\n    ``max_age``\n\n       Default: ``None``.  The max age of the auth_tkt cookie, in\n       seconds.  This differs from ``timeout`` inasmuch as ``timeout``\n       represents the lifetime of the ticket contained in the cookie,\n       while this value represents the lifetime of the cookie itself.\n       When this value is set, the cookie's ``Max-Age`` and\n       ``Expires`` settings will be set, allowing the auth_tkt cookie\n       to last between browser sessions.  It is typically nonsensical\n       to set this to a value that is lower than ``timeout`` or\n       ``reissue_time``, although it is not explicitly prevented.\n       Optional.\n\n    ``path``\n\n       Default: ``/``. The path for which the auth_tkt cookie is valid.\n       May be desirable if the application only serves part of a domain.\n       Optional.\n\n    ``http_only``\n\n       Default: ``False``. Hide cookie from JavaScript by setting the\n       HttpOnly flag. Not honored by all browsers.\n       Optional.\n\n    ``wild_domain``\n\n       Default: ``True``. An auth_tkt cookie will be generated for the\n       wildcard domain. If your site is hosted as ``example.com`` this\n       will make the cookie available for sites underneath ``example.com``\n       such as ``www.example.com``.\n       Optional.\n\n    ``parent_domain``\n\n       Default: ``False``. An auth_tkt cookie will be generated for the\n       parent domain of the current site. For example if your site is\n       hosted under ``www.example.com`` a cookie will be generated for\n       ``.example.com``. This can be useful if you have multiple sites\n       sharing the same domain. This option supercedes the ``wild_domain``\n       option.\n       Optional.\n\n    ``domain``\n\n       Default: ``None``. If provided the auth_tkt cookie will only be\n       set for this domain. This option is not compatible with ``wild_domain``\n       and ``parent_domain``.\n       Optional.\n\n    ``hashalg``\n\n       Default: ``sha512`` (the literal string).\n\n       Any hash algorithm supported by Python's ``hashlib.new()`` function\n       can be used as the ``hashalg``.\n\n       Cookies generated by different instances of AuthTktAuthenticationPolicy\n       using different ``hashalg`` options are not compatible. Switching the\n       ``hashalg`` will imply that all existing users with a valid cookie will\n       be required to re-login.\n\n       Optional.\n\n    ``debug``\n\n        Default: ``False``.  If ``debug`` is ``True``, log messages to the\n        Pyramid debug logger about the results of various authentication\n        steps.  The output from debugging is useful for reporting to maillist\n        or IRC channels when asking for support.\n\n    ``samesite``\n\n        Default: ``'Lax'``.  The 'samesite' option of the session cookie. Set\n        the value to ``None`` to turn off the samesite option.\n\n    .. versionchanged:: 1.4\n\n       Added the ``hashalg`` option, defaulting to ``sha512``.\n\n    .. versionchanged:: 1.5\n\n       Added the ``domain`` option.\n\n       Added the ``parent_domain`` option.\n\n    .. versionchanged:: 1.10\n\n       Added the ``samesite`` option and made the default ``'Lax'``.\n\n    Objects of this class implement the interface described by\n    :class:`pyramid.interfaces.IAuthenticationPolicy`.\n\n    \"\"\"\n\n    def __init__(\n        self,\n        secret,\n        callback=None,\n        cookie_name='auth_tkt',\n        secure=False,\n        include_ip=False,\n        timeout=None,\n        reissue_time=None,\n        max_age=None,\n        path=\"/\",\n        http_only=False,\n        wild_domain=True,\n        debug=False,\n        hashalg='sha512',\n        parent_domain=False,\n        domain=None,\n        samesite='Lax',\n    ):\n        self.cookie = AuthTktCookieHelper(\n            secret,\n            cookie_name=cookie_name,\n            secure=secure,\n            include_ip=include_ip,\n            timeout=timeout,\n            reissue_time=reissue_time,\n            max_age=max_age,\n            http_only=http_only,\n            path=path,\n            wild_domain=wild_domain,\n            hashalg=hashalg,\n            parent_domain=parent_domain,\n            domain=domain,\n            samesite=samesite,\n        )\n        self.callback = callback\n        self.debug = debug\n\n    def unauthenticated_userid(self, request):\n        \"\"\" The userid key within the auth_tkt cookie.\"\"\"\n        result = self.cookie.identify(request)\n        if result:\n            return result['userid']\n\n    def remember(self, request, userid, **kw):\n        \"\"\" Accepts the following kw args: ``max_age=<int-seconds>,\n        ``tokens=<sequence-of-ascii-strings>``.\n\n        Return a list of headers which will set appropriate cookies on\n        the response.\n\n        \"\"\"\n        return self.cookie.remember(request, userid, **kw)\n\n    def forget(self, request):\n        \"\"\" A list of headers which will delete appropriate cookies.\"\"\"\n        return self.cookie.forget(request)\n\n\ndef b64encode(v):\n    return base64.b64encode(bytes_(v)).strip().replace(b'\\n', b'')\n\n\ndef b64decode(v):\n    return base64.b64decode(bytes_(v))\n\n\n# this class licensed under the MIT license (stolen from Paste)\nclass AuthTicket:\n    \"\"\"\n    This class represents an authentication token.  You must pass in\n    the shared secret, the userid, and the IP address.  Optionally you\n    can include tokens (a list of strings, representing role names),\n    'user_data', which is arbitrary data available for your own use in\n    later scripts.  Lastly, you can override the cookie name and\n    timestamp.\n\n    Once you provide all the arguments, use .cookie_value() to\n    generate the appropriate authentication ticket.\n\n    Usage::\n\n        token = AuthTicket('sharedsecret', 'username',\n            os.environ['REMOTE_ADDR'], tokens=['admin'])\n        val = token.cookie_value()\n\n    \"\"\"\n\n    def __init__(\n        self,\n        secret,\n        userid,\n        ip,\n        tokens=(),\n        user_data='',\n        time=None,\n        cookie_name='auth_tkt',\n        secure=False,\n        hashalg='md5',\n    ):\n        self.secret = secret\n        self.userid = userid\n        self.ip = ip\n        self.tokens = ','.join(tokens)\n        self.user_data = user_data\n        if time is None:\n            self.time = time_mod.time()\n        else:\n            self.time = time\n        self.cookie_name = cookie_name\n        self.secure = secure\n        self.hashalg = hashalg\n\n    def digest(self):\n        return calculate_digest(\n            self.ip,\n            self.time,\n            self.secret,\n            self.userid,\n            self.tokens,\n            self.user_data,\n            self.hashalg,\n        )\n\n    def cookie_value(self):\n        v = '%s%08x%s!' % (self.digest(), int(self.time), quote(self.userid))\n        if self.tokens:\n            v += self.tokens + '!'\n        v += self.user_data\n        return v\n\n\n# this class licensed under the MIT license (stolen from Paste)\nclass BadTicket(Exception):\n    \"\"\"\n    Exception raised when a ticket can't be parsed.  If we get far enough to\n    determine what the expected digest should have been, expected is set.\n    This should not be shown by default, but can be useful for debugging.\n    \"\"\"\n\n    def __init__(self, msg, expected=None):\n        self.expected = expected\n        Exception.__init__(self, msg)\n\n\n# this function licensed under the MIT license (stolen from Paste)\ndef parse_ticket(secret, ticket, ip, hashalg='md5'):\n    \"\"\"\n    Parse the ticket, returning (timestamp, userid, tokens, user_data).\n\n    If the ticket cannot be parsed, a ``BadTicket`` exception will be raised\n    with an explanation.\n    \"\"\"\n    ticket = text_(ticket).strip('\"')\n    digest_size = hashlib.new(hashalg).digest_size * 2\n    digest = ticket[:digest_size]\n    try:\n        timestamp = int(ticket[digest_size : digest_size + 8], 16)\n    except ValueError as e:\n        raise BadTicket('Timestamp is not a hex integer: %s' % e)\n    try:\n        userid, data = ticket[digest_size + 8 :].split('!', 1)\n    except ValueError:\n        raise BadTicket('userid is not followed by !')\n    userid = unquote(userid)\n    if '!' in data:\n        tokens, user_data = data.split('!', 1)\n    else:  # pragma: no cover (never generated)\n        # @@: Is this the right order?\n        tokens = ''\n        user_data = data\n\n    expected = calculate_digest(\n        ip, timestamp, secret, userid, tokens, user_data, hashalg\n    )\n\n    # Avoid timing attacks (see\n    # http://seb.dbzteam.org/crypto/python-oauth-timing-hmac.pdf)\n    if strings_differ(expected, digest):\n        raise BadTicket(\n            'Digest signature is not correct', expected=(expected, digest)\n        )\n\n    tokens = tokens.split(',')\n\n    return (timestamp, userid, tokens, user_data)\n\n\n# this function licensed under the MIT license (stolen from Paste)\ndef calculate_digest(\n    ip, timestamp, secret, userid, tokens, user_data, hashalg='md5'\n):\n    secret = bytes_(secret, 'utf-8')\n    userid = bytes_(userid, 'utf-8')\n    tokens = bytes_(tokens, 'utf-8')\n    user_data = bytes_(user_data, 'utf-8')\n    hash_obj = hashlib.new(hashalg)\n\n    # Check to see if this is an IPv6 address\n    if ':' in ip:\n        ip_timestamp = ip + str(int(timestamp))\n        ip_timestamp = bytes_(ip_timestamp)\n    else:\n        # encode_ip_timestamp not required, left in for backwards compatibility\n        ip_timestamp = encode_ip_timestamp(ip, timestamp)\n\n    hash_obj.update(\n        ip_timestamp + secret + userid + b'\\0' + tokens + b'\\0' + user_data\n    )\n    digest = hash_obj.hexdigest()\n    hash_obj2 = hashlib.new(hashalg)\n    hash_obj2.update(bytes_(digest) + secret)\n    return hash_obj2.hexdigest()\n\n\n# this function licensed under the MIT license (stolen from Paste)\ndef encode_ip_timestamp(ip, timestamp):\n    ip_chars = ''.join(map(chr, map(int, ip.split('.'))))\n    t = int(timestamp)\n    ts = (\n        (t & 0xFF000000) >> 24,\n        (t & 0xFF0000) >> 16,\n        (t & 0xFF00) >> 8,\n        t & 0xFF,\n    )\n    ts_chars = ''.join(map(chr, ts))\n    return bytes_(ip_chars + ts_chars)\n\n\nclass AuthTktCookieHelper:\n    \"\"\"\n    A helper class for security policies that obtains data from an \"auth\n    ticket\" cookie.\n\n    Constructor Arguments\n\n    ``secret``\n\n       The secret (a string) used for auth_tkt cookie signing.  This value\n       should be unique across all values provided to Pyramid for various\n       subsystem secrets (see :ref:`admonishment_against_secret_sharing`).\n       Required.\n\n    ``cookie_name``\n\n       Default: ``auth_tkt``.  The cookie name used\n       (string).  Optional.\n\n    ``secure``\n\n       Default: ``False``.  Only send the cookie back over a secure\n       conn.  Optional.\n\n    ``include_ip``\n\n       Default: ``False``.  Make the requesting IP address part of\n       the authentication data in the cookie.  Optional.\n\n       For IPv6 this option is not recommended. The ``mod_auth_tkt``\n       specification does not specify how to handle IPv6 addresses, so using\n       this option in combination with IPv6 addresses may cause an\n       incompatible cookie. It ties the authentication ticket to that\n       individual's IPv6 address.\n\n    ``timeout``\n\n       Default: ``None``.  Maximum number of seconds which a newly\n       issued ticket will be considered valid.  After this amount of\n       time, the ticket will expire (effectively logging the user\n       out).  If this value is ``None``, the ticket never expires.\n       Optional.\n\n    ``reissue_time``\n\n       Default: ``None``.  If this parameter is set, it represents the number\n       of seconds that must pass before an authentication token cookie is\n       automatically reissued as the result of a request which requires\n       authentication.  The duration is measured as the number of seconds\n       since the last auth_tkt cookie was issued and 'now'.  If this value is\n       ``0``, a new ticket cookie will be reissued on every request which\n       requires authentication.\n\n       A good rule of thumb: if you want auto-expired cookies based on\n       inactivity: set the ``timeout`` value to 1200 (20 mins) and set the\n       ``reissue_time`` value to perhaps a tenth of the ``timeout`` value\n       (120 or 2 mins).  It's nonsensical to set the ``timeout`` value lower\n       than the ``reissue_time`` value, as the ticket will never be reissued\n       if so.  However, such a configuration is not explicitly prevented.\n\n       Optional.\n\n    ``max_age``\n\n       Default: ``None``.  The max age of the auth_tkt cookie, in\n       seconds.  This differs from ``timeout`` inasmuch as ``timeout``\n       represents the lifetime of the ticket contained in the cookie,\n       while this value represents the lifetime of the cookie itself.\n       When this value is set, the cookie's ``Max-Age`` and\n       ``Expires`` settings will be set, allowing the auth_tkt cookie\n       to last between browser sessions.  It is typically nonsensical\n       to set this to a value that is lower than ``timeout`` or\n       ``reissue_time``, although it is not explicitly prevented.\n       Optional.\n\n    ``path``\n\n       Default: ``/``. The path for which the auth_tkt cookie is valid.\n       May be desirable if the application only serves part of a domain.\n       Optional.\n\n    ``http_only``\n\n       Default: ``False``. Hide cookie from JavaScript by setting the\n       HttpOnly flag. Not honored by all browsers.\n       Optional.\n\n    ``wild_domain``\n\n       Default: ``True``. An auth_tkt cookie will be generated for the\n       wildcard domain. If your site is hosted as ``example.com`` this\n       will make the cookie available for sites underneath ``example.com``\n       such as ``www.example.com``.\n       Optional.\n\n    ``parent_domain``\n\n       Default: ``False``. An auth_tkt cookie will be generated for the\n       parent domain of the current site. For example if your site is\n       hosted under ``www.example.com`` a cookie will be generated for\n       ``.example.com``. This can be useful if you have multiple sites\n       sharing the same domain. This option supercedes the ``wild_domain``\n       option.\n       Optional.\n\n    ``domain``\n\n       Default: ``None``. If provided the auth_tkt cookie will only be\n       set for this domain. This option is not compatible with ``wild_domain``\n       and ``parent_domain``.\n       Optional.\n\n    ``hashalg``\n\n       Default: ``sha512`` (the literal string).\n\n       Any hash algorithm supported by Python's ``hashlib.new()`` function\n       can be used as the ``hashalg``.\n\n       Cookies generated by different instances of AuthTktAuthenticationPolicy\n       using different ``hashalg`` options are not compatible. Switching the\n       ``hashalg`` will imply that all existing users with a valid cookie will\n       be required to re-login.\n\n       Optional.\n\n    ``debug``\n\n        Default: ``False``.  If ``debug`` is ``True``, log messages to the\n        Pyramid debug logger about the results of various authentication\n        steps.  The output from debugging is useful for reporting to maillist\n        or IRC channels when asking for support. Optional.\n\n    ``samesite``\n\n        Default: ``'Lax'``.  The 'samesite' option of the session cookie. Set\n        the value to ``None`` to turn off the samesite option. Optional.\n\n    .. versionchanged:: 2.0\n\n        The default ``hashalg`` was changed from ``md5`` to ``sha512``.\n\n    \"\"\"\n\n    parse_ticket = staticmethod(parse_ticket)  # for tests\n    AuthTicket = AuthTicket  # for tests\n    BadTicket = BadTicket  # for tests\n    now = None  # for tests\n\n    userid_type_decoders = {\n        'int': int,\n        'unicode': lambda x: utf_8_decode(x)[0],  # bw compat for old cookies\n        'b64unicode': lambda x: utf_8_decode(b64decode(x))[0],\n        'b64str': lambda x: b64decode(x),\n    }\n\n    userid_type_encoders = {\n        int: ('int', str),\n        str: ('b64unicode', lambda x: b64encode(utf_8_encode(x)[0])),\n        bytes: ('b64str', lambda x: b64encode(x)),\n    }\n\n    def __init__(\n        self,\n        secret,\n        cookie_name='auth_tkt',\n        secure=False,\n        include_ip=False,\n        timeout=None,\n        reissue_time=None,\n        max_age=None,\n        http_only=False,\n        path=\"/\",\n        wild_domain=True,\n        hashalg='sha512',\n        parent_domain=False,\n        domain=None,\n        samesite='Lax',\n    ):\n        self.cookie_profile = CookieProfile(\n            cookie_name=cookie_name,\n            secure=secure,\n            max_age=max_age,\n            httponly=http_only,\n            path=path,\n            serializer=SimpleSerializer(),\n            samesite=samesite,\n        )\n\n        self.secret = secret\n        self.cookie_name = cookie_name\n        self.secure = secure\n        self.include_ip = include_ip\n        self.timeout = timeout if timeout is None else int(timeout)\n        self.reissue_time = (\n            reissue_time if reissue_time is None else int(reissue_time)\n        )\n        self.max_age = max_age if max_age is None else int(max_age)\n        self.wild_domain = wild_domain\n        self.parent_domain = parent_domain\n        self.domain = domain\n        self.hashalg = hashalg\n\n    def _get_cookies(self, request, value, max_age=None):\n        cur_domain = request.domain\n\n        domains = []\n        if self.domain:\n            domains.append(self.domain)\n        else:\n            if self.parent_domain and cur_domain.count('.') > 1:\n                domains.append('.' + cur_domain.split('.', 1)[1])\n            else:\n                domains.append(None)\n                domains.append(cur_domain)\n                if self.wild_domain:\n                    domains.append('.' + cur_domain)\n\n        profile = self.cookie_profile(request)\n\n        kw = {}\n        kw['domains'] = domains\n        if max_age is not None:\n            kw['max_age'] = max_age\n\n        headers = profile.get_headers(value, **kw)\n        return headers\n\n    def identify(self, request):\n        \"\"\" Return a dictionary with authentication information, or ``None``\n        if no valid auth_tkt is attached to ``request``\"\"\"\n        environ = request.environ\n        cookie = request.cookies.get(self.cookie_name)\n\n        if cookie is None:\n            return None\n\n        if self.include_ip:\n            remote_addr = environ['REMOTE_ADDR']\n        else:\n            remote_addr = '0.0.0.0'\n\n        try:\n            timestamp, userid, tokens, user_data = self.parse_ticket(\n                self.secret, cookie, remote_addr, self.hashalg\n            )\n        except self.BadTicket:\n            return None\n\n        now = self.now  # service tests\n\n        if now is None:\n            now = time_mod.time()\n\n        if self.timeout and ((timestamp + self.timeout) < now):\n            # the auth_tkt data has expired\n            return None\n\n        userid_typename = 'userid_type:'\n        user_data_info = user_data.split('|')\n        for datum in filter(None, user_data_info):\n            if datum.startswith(userid_typename):\n                userid_type = datum[len(userid_typename) :]\n                decoder = self.userid_type_decoders.get(userid_type)\n                if decoder:\n                    userid = decoder(userid)\n\n        reissue = self.reissue_time is not None\n\n        if reissue and not hasattr(request, '_authtkt_reissued'):\n            if (now - timestamp) > self.reissue_time:\n                # See https://github.com/Pylons/pyramid/issues#issue/108\n                tokens = list(filter(None, tokens))\n                headers = self.remember(\n                    request, userid, max_age=self.max_age, tokens=tokens\n                )\n\n                def reissue_authtkt(request, response):\n                    if not hasattr(request, '_authtkt_reissue_revoked'):\n                        for k, v in headers:\n                            response.headerlist.append((k, v))\n\n                request.add_response_callback(reissue_authtkt)\n                request._authtkt_reissued = True\n\n        environ['REMOTE_USER_TOKENS'] = tokens\n        environ['REMOTE_USER_DATA'] = user_data\n        environ['AUTH_TYPE'] = 'cookie'\n\n        identity = {}\n        identity['timestamp'] = timestamp\n        identity['userid'] = userid\n        identity['tokens'] = tokens\n        identity['userdata'] = user_data\n        return identity\n\n    def forget(self, request):\n        \"\"\" Return a set of expires Set-Cookie headers, which will destroy\n        any existing auth_tkt cookie when attached to a response\"\"\"\n        request._authtkt_reissue_revoked = True\n        return self._get_cookies(request, None)\n\n    def remember(self, request, userid, max_age=None, tokens=()):\n        \"\"\" Return a set of Set-Cookie headers; when set into a response,\n        these headers will represent a valid authentication ticket.\n\n        ``max_age``\n          The max age of the auth_tkt cookie, in seconds.  When this value is\n          set, the cookie's ``Max-Age`` and ``Expires`` settings will be set,\n          allowing the auth_tkt cookie to last between browser sessions.  If\n          this value is ``None``, the ``max_age`` value provided to the\n          helper itself will be used as the ``max_age`` value.  Default:\n          ``None``.\n\n        ``tokens``\n          A sequence of strings that will be placed into the auth_tkt tokens\n          field.  Each string in the sequence must be of the Python ``str``\n          type and must match the regex ``^[A-Za-z][A-Za-z0-9+_-]*$``.\n          Tokens are available in the returned identity when an auth_tkt is\n          found in the request and unpacked.  Default: ``()``.\n        \"\"\"\n        max_age = self.max_age if max_age is None else int(max_age)\n\n        environ = request.environ\n\n        if self.include_ip:\n            remote_addr = environ['REMOTE_ADDR']\n        else:\n            remote_addr = '0.0.0.0'\n\n        user_data = ''\n\n        encoding_data = self.userid_type_encoders.get(type(userid))\n\n        if encoding_data:\n            encoding, encoder = encoding_data\n        else:\n            warnings.warn(\n                \"userid is of type {}, and is not supported by the \"\n                \"AuthTktAuthenticationPolicy. Explicitly converting to string \"\n                \"and storing as base64. Subsequent requests will receive a \"\n                \"string as the userid, it will not be decoded back to the \"\n                \"type provided.\".format(type(userid)),\n                RuntimeWarning,\n            )\n            encoding, encoder = self.userid_type_encoders.get(str)\n            userid = str(userid)\n\n        userid = encoder(userid)\n        user_data = 'userid_type:%s' % encoding\n\n        new_tokens = []\n        for token in tokens:\n            if isinstance(token, str):\n                try:\n                    token = ascii_(token)\n                except UnicodeEncodeError:\n                    raise ValueError(\"Invalid token %r\" % (token,))\n            if not (isinstance(token, str) and VALID_TOKEN.match(token)):\n                raise ValueError(\"Invalid token %r\" % (token,))\n            new_tokens.append(token)\n        tokens = tuple(new_tokens)\n\n        if hasattr(request, '_authtkt_reissued'):\n            request._authtkt_reissue_revoked = True\n\n        ticket = self.AuthTicket(\n            self.secret,\n            userid,\n            remote_addr,\n            tokens=tokens,\n            user_data=user_data,\n            cookie_name=self.cookie_name,\n            secure=self.secure,\n            hashalg=self.hashalg,\n        )\n\n        cookie_value = ticket.cookie_value()\n        return self._get_cookies(request, cookie_value, max_age)\n\n\n@implementer(IAuthenticationPolicy)\nclass SessionAuthenticationPolicy(CallbackAuthenticationPolicy):\n    \"\"\" A :app:`Pyramid` authentication policy which gets its data from the\n    configured :term:`session`.  For this authentication policy to work, you\n    will have to follow the instructions in the :ref:`sessions_chapter` to\n    configure a :term:`session factory`.\n\n    Constructor Arguments\n\n    ``prefix``\n\n       A prefix used when storing the authentication parameters in the\n       session. Defaults to 'auth.'. Optional.\n\n    ``callback``\n\n       Default: ``None``.  A callback passed the userid and the\n       request, expected to return ``None`` if the userid doesn't\n       exist or a sequence of principal identifiers (possibly empty) if\n       the user does exist.  If ``callback`` is ``None``, the userid\n       will be assumed to exist with no principals.  Optional.\n\n    ``debug``\n\n        Default: ``False``.  If ``debug`` is ``True``, log messages to the\n        Pyramid debug logger about the results of various authentication\n        steps.  The output from debugging is useful for reporting to maillist\n        or IRC channels when asking for support.\n\n    \"\"\"\n\n    def __init__(self, prefix='auth.', callback=None, debug=False):\n        self.callback = callback\n        self.debug = debug\n        self.helper = SessionAuthenticationHelper(prefix)\n\n    def remember(self, request, userid, **kw):\n        \"\"\" Store a userid in the session.\"\"\"\n        return self.helper.remember(request, userid, **kw)\n\n    def forget(self, request):\n        \"\"\" Remove the stored userid from the session.\"\"\"\n        return self.helper.forget(request)\n\n    def unauthenticated_userid(self, request):\n        return self.helper.authenticated_userid(request)\n\n\nclass SessionAuthenticationHelper:\n    \"\"\" A helper for use with a :term:`security policy` which stores user data\n    in the configured :term:`session`.\n\n    Constructor Arguments\n\n    ``prefix``\n\n       A prefix used when storing the authentication parameters in the\n       session. Defaults to 'auth.'. Optional.\n\n    \"\"\"\n\n    def __init__(self, prefix='auth.'):\n        self.userid_key = prefix + 'userid'\n\n    def remember(self, request, userid, **kw):\n        \"\"\" Store a userid in the session.\"\"\"\n        request.session[self.userid_key] = userid\n        return []\n\n    def forget(self, request, **kw):\n        \"\"\" Remove the stored userid from the session.\"\"\"\n        if self.userid_key in request.session:\n            del request.session[self.userid_key]\n        return []\n\n    def authenticated_userid(self, request):\n        \"\"\" Return the stored userid.\"\"\"\n        return request.session.get(self.userid_key)\n\n\n@implementer(IAuthenticationPolicy)\nclass BasicAuthAuthenticationPolicy(CallbackAuthenticationPolicy):\n    \"\"\" A :app:`Pyramid` authentication policy which uses HTTP standard basic\n    authentication protocol to authenticate users.  To use this policy you will\n    need to provide a callback which checks the supplied user credentials\n    against your source of login data.\n\n    Constructor Arguments\n\n    ``check``\n\n       A callback function passed a username, password and request, in that\n       order as positional arguments.  Expected to return ``None`` if the\n       userid doesn't exist or a sequence of principal identifiers (possibly\n       empty) if the user does exist.\n\n    ``realm``\n\n       Default: ``\"Realm\"``.  The Basic Auth Realm string.  Usually displayed\n       to the user by the browser in the login dialog.\n\n    ``debug``\n\n        Default: ``False``.  If ``debug`` is ``True``, log messages to the\n        Pyramid debug logger about the results of various authentication\n        steps.  The output from debugging is useful for reporting to maillist\n        or IRC channels when asking for support.\n\n    **Issuing a challenge**\n\n    Regular browsers will not send username/password credentials unless they\n    first receive a challenge from the server.  The following recipe will\n    register a view that will send a Basic Auth challenge to the user whenever\n    there is an attempt to call a view which results in a Forbidden response::\n\n        from pyramid.httpexceptions import HTTPUnauthorized\n        from pyramid.security import forget\n        from pyramid.view import forbidden_view_config\n\n        @forbidden_view_config()\n        def forbidden_view(request):\n            if request.authenticated_userid is None:\n                response = HTTPUnauthorized()\n                response.headers.update(forget(request))\n                return response\n            return HTTPForbidden()\n    \"\"\"\n\n    def __init__(self, check, realm='Realm', debug=False):\n        self.check = check\n        self.realm = realm\n        self.debug = debug\n\n    def unauthenticated_userid(self, request):\n        \"\"\" The userid parsed from the ``Authorization`` request header.\"\"\"\n        credentials = extract_http_basic_credentials(request)\n        if credentials:\n            return credentials.username\n\n    def remember(self, request, userid, **kw):\n        \"\"\" A no-op. Basic authentication does not provide a protocol for\n        remembering the user. Credentials are sent on every request.\n\n        \"\"\"\n        return []\n\n    def forget(self, request):\n        \"\"\" Returns challenge headers. This should be attached to a response\n        to indicate that credentials are required.\"\"\"\n        return [('WWW-Authenticate', 'Basic realm=\"%s\"' % self.realm)]\n\n    def callback(self, username, request):\n        # Username arg is ignored. Unfortunately\n        # extract_http_basic_credentials winds up getting called twice when\n        # authenticated_userid is called. Avoiding that, however,\n        # winds up duplicating logic from the superclass.\n        credentials = extract_http_basic_credentials(request)\n        if credentials:\n            username, password = credentials\n            return self.check(username, password, request)\n\n\nHTTPBasicCredentials = namedtuple(\n    'HTTPBasicCredentials', ['username', 'password']\n)\n\n\ndef extract_http_basic_credentials(request):\n    \"\"\" A helper function for extraction of HTTP Basic credentials\n    from a given :term:`request`.\n\n    Returns a :class:`.HTTPBasicCredentials` 2-tuple with ``username`` and\n    ``password`` attributes or ``None`` if no credentials could be found.\n\n    \"\"\"\n    authorization = request.headers.get('Authorization')\n    if not authorization:\n        return None\n\n    try:\n        authmeth, auth = authorization.split(' ', 1)\n    except ValueError:  # not enough values to unpack\n        return None\n\n    if authmeth.lower() != 'basic':\n        return None\n\n    try:\n        authbytes = b64decode(auth.strip())\n    except (TypeError, binascii.Error):  # can't decode\n        return None\n\n    # try utf-8 first, then latin-1; see discussion in\n    # https://github.com/Pylons/pyramid/issues/898\n    try:\n        auth = authbytes.decode('utf-8')\n    except UnicodeDecodeError:\n        auth = authbytes.decode('latin-1')\n\n    try:\n        username, password = auth.split(':', 1)\n    except ValueError:  # not enough values to unpack\n        return None\n\n    return HTTPBasicCredentials(username, password)\n"}
A user will ask you to solve a task. You should first draft your thinking process (inner monologue). Then, generate the solution.

Your response format must follow the template below:
<think>
Your thoughts or/and draft, like working through an exercise on scratch paper. Be as casual and as long as you want until you are confident to generate a correct solution.
</think>
<solution>
Final solution presented to the user.
</solution>
system
We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
[ISSUE]
**Title:** Multiple Set-Cookie Headers Added When `wild_domain` is Disabled

**Description:**
When creating authentication tickets with `wild_domain` set to `False`, the system unexpectedly adds multiple `Set-Cookie` headers. This behavior leads to redundant cookies being set, which can cause confusion and potential security issues.

**Example Code:**
```python
helper = AuthTktCookieHelper('secret', wild_domain=False)
request = make_request()
result = helper.remember(request, 'other')
# Expected to have 1 Set-Cookie header
# Actual result contains 2 Set-Cookie headers
```

**Expected Behavior:**
Only a single `Set-Cookie` header should be added when `wild_domain` is disabled to ensure that cookies are set correctly and efficiently.

**Actual Behavior:**
Two `Set-Cookie` headers are added, despite `wild_domain` being set to `False`, resulting in unnecessary duplication of cookies.
[/ISSUE]
--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.

--- BEGIN FILE ---
```
### src/pyramid/authentication.py
import base64
import binascii
from codecs import utf_8_decode, utf_8_encode
from collections import namedtuple
import hashlib
import re
import time as time_mod
from urllib.parse import quote, unquote
import warnings
from webob.cookies import CookieProfile
from zope.interface import implementer

from pyramid.authorization import Authenticated, Everyone
from pyramid.interfaces import IAuthenticationPolicy, IDebugLogger
from pyramid.util import (
    SimpleSerializer,
    ascii_,
    bytes_,
    strings_differ,
    text_,
)

VALID_TOKEN = re.compile(r"^[A-Za-z][A-Za-z0-9+_-]*$")


class CallbackAuthenticationPolicy:
    """ Abstract class """

    debug = False
    callback = None

    def _log(self, msg, methodname, request):
        logger = request.registry.queryUtility(IDebugLogger)
        if logger:
            cls = self.__class__
            classname = cls.__module__ + '.' + cls.__name__
            methodname = classname + '.' + methodname
            logger.debug(methodname + ': ' + msg)

    def _clean_principal(self, princid):
        if princid in (Authenticated, Everyone):
            princid = None
        return princid

    def authenticated_userid(self, request):
        """ Return the authenticated userid or ``None``.

        If no callback is registered, this will be the same as
        ``unauthenticated_userid``.

        If a ``callback`` is registered, this will return the userid if
        and only if the callback returns a value that is not ``None``.

        """
        debug = self.debug
        userid = self.unauthenticated_userid(request)
        if userid is None:
            debug and self._log(
                'call to unauthenticated_userid returned None; returning None',
                'authenticated_userid',
                request,
            )
            return None
        if self._clean_principal(userid) is None:
            debug and self._log(
                (
                    'use of userid %r is disallowed by any built-in Pyramid '
                    'security policy, returning None' % userid
                ),
                'authenticated_userid',
                request,
            )
            return None

        if self.callback is None:
            debug and self._log(
                'there was no groupfinder callback; returning %r' % (userid,),
                'authenticated_userid',
                request,
            )
            return userid
        callback_ok = self.callback(userid, request)
        if callback_ok is not None:  # is not None!
            debug and self._log(
                'groupfinder callback returned %r; returning %r'
                % (callback_ok, userid),
                'authenticated_userid',
                request,
            )
            return userid
        debug and self._log(
            'groupfinder callback returned None; returning None',
            'authenticated_userid',
            request,
        )

    def effective_principals(self, request):
        """ A list of effective principals derived from request.

        This will return a list of principals including, at least,
        :data:`pyramid.authorization.Everyone`. If there is no authenticated
        userid, or the ``callback`` returns ``None``, this will be the
        only principal:

        .. code-block:: python

            return [Everyone]

        If the ``callback`` does not return ``None`` and an authenticated
        userid is found, then the principals will include
        :data:`pyramid.authorization.Authenticated`, the
        ``authenticated_userid`` and the list of principals returned by the
        ``callback``:

        .. code-block:: python

            extra_principals = callback(userid, request)
            return [Everyone, Authenticated, userid] + extra_principals

        """
        debug = self.debug
        effective_principals = [Everyone]
        userid = self.unauthenticated_userid(request)

        if userid is None:
            debug and self._log(
                'unauthenticated_userid returned %r; returning %r'
                % (userid, effective_principals),
                'effective_principals',
                request,
            )
            return effective_principals

        if self._clean_principal(userid) is None:
            debug and self._log(
                (
                    'unauthenticated_userid returned disallowed %r; returning '
                    '%r as if it was None' % (userid, effective_principals)
                ),
                'effective_principals',
                request,
            )
            return effective_principals

        if self.callback is None:
            debug and self._log(
                'groupfinder callback is None, so groups is []',
                'effective_principals',
                request,
            )
            groups = []
        else:
            groups = self.callback(userid, request)
            debug and self._log(
                'groupfinder callback returned %r as groups' % (groups,),
                'effective_principals',
                request,
            )

        if groups is None:  # is None!
            debug and self._log(
                'returning effective principals: %r' % (effective_principals,),
                'effective_principals',
                request,
            )
            return effective_principals

        effective_principals.append(Authenticated)
        effective_principals.append(userid)
        effective_principals.extend(groups)

        debug and self._log(
            'returning effective principals: %r' % (effective_principals,),
            'effective_principals',
            request,
        )
        return effective_principals


@implementer(IAuthenticationPolicy)
class RepozeWho1AuthenticationPolicy(CallbackAuthenticationPolicy):
    """ A :app:`Pyramid` :term:`authentication policy` which
    obtains data from the :mod:`repoze.who` 1.X WSGI 'API' (the
    ``repoze.who.identity`` key in the WSGI environment).

    Constructor Arguments

    ``identifier_name``

       Default: ``auth_tkt``.  The :mod:`repoze.who` plugin name that
       performs remember/forget.  Optional.

    ``callback``

        Default: ``None``.  A callback passed the :mod:`repoze.who` identity
        and the :term:`request`, expected to return ``None`` if the user
        represented by the identity doesn't exist or a sequence of principal
        identifiers (possibly empty) representing groups if the user does
        exist.  If ``callback`` is None, the userid will be assumed to exist
        with no group principals.

    Objects of this class implement the interface described by
    :class:`pyramid.interfaces.IAuthenticationPolicy`.
    """

    def __init__(self, identifier_name='auth_tkt', callback=None):
        self.identifier_name = identifier_name
        self.callback = callback

    def _get_identity(self, request):
        return request.environ.get('repoze.who.identity')

    def _get_identifier(self, request):
        plugins = request.environ.get('repoze.who.plugins')
        if plugins is None:
            return None
        identifier = plugins[self.identifier_name]
        return identifier

    def authenticated_userid(self, request):
        """ Return the authenticated userid or ``None``.

        If no callback is registered, this will be the same as
        ``unauthenticated_userid``.

        If a ``callback`` is registered, this will return the userid if
        and only if the callback returns a value that is not ``None``.

        """
        identity = self._get_identity(request)

        if identity is None:
            self.debug and self._log(
                'repoze.who identity is None, returning None',
                'authenticated_userid',
                request,
            )
            return None

        userid = identity['repoze.who.userid']

        if userid is None:
            self.debug and self._log(
                'repoze.who.userid is None, returning None' % userid,
                'authenticated_userid',
                request,
            )
            return None

        if self._clean_principal(userid) is None:
            self.debug and self._log(
                (
                    'use of userid %r is disallowed by any built-in Pyramid '
                    'security policy, returning None' % userid
                ),
                'authenticated_userid',
                request,
            )
            return None

        if self.callback is None:
            return userid

        if self.callback(identity, request) is not None:  # is not None!
            return userid

    def unauthenticated_userid(self, request):
        """ Return the ``repoze.who.userid`` key from the detected identity."""
        identity = self._get_identity(request)
        if identity is None:
            return None
        return identity['repoze.who.userid']

    def effective_principals(self, request):
        """ A list of effective principals derived from the identity.

        This will return a list of principals including, at least,
        :data:`pyramid.authorization.Everyone`. If there is no identity, or
        the ``callback`` returns ``None``, this will be the only principal.

        If the ``callback`` does not return ``None`` and an identity is
        found, then the principals will include
        :data:`pyramid.authorization.Authenticated`, the
        ``authenticated_userid`` and the list of principals returned by the
        ``callback``.

        """
        effective_principals = [Everyone]
        identity = self._get_identity(request)

        if identity is None:
            self.debug and self._log(
                (
                    'repoze.who identity was None; returning %r'
                    % effective_principals
                ),
                'effective_principals',
                request,
            )
            return effective_principals

        if self.callback is None:
            groups = []
        else:
            groups = self.callback(identity, request)

        if groups is None:  # is None!
            self.debug and self._log(
                (
                    'security policy groups callback returned None; returning '
                    '%r' % effective_principals
                ),
                'effective_principals',
                request,
            )
            return effective_principals

        userid = identity['repoze.who.userid']

        if userid is None:
            self.debug and self._log(
                (
                    'repoze.who.userid was None; returning %r'
                    % effective_principals
                ),
                'effective_principals',
                request,
            )
            return effective_principals

        if self._clean_principal(userid) is None:
            self.debug and self._log(
                (
                    'unauthenticated_userid returned disallowed %r; returning '
                    '%r as if it was None' % (userid, effective_principals)
                ),
                'effective_principals',
                request,
            )
            return effective_principals

        effective_principals.append(Authenticated)
        effective_principals.append(userid)
        effective_principals.extend(groups)
        return effective_principals

    def remember(self, request, userid, **kw):
        """ Store the ``userid`` as ``repoze.who.userid``.

        The identity to authenticated to :mod:`repoze.who`
        will contain the given userid as ``userid``, and
        provide all keyword arguments as additional identity
        keys. Useful keys could be ``max_age`` or ``userdata``.
        """
        identifier = self._get_identifier(request)
        if identifier is None:
            return []
        environ = request.environ
        identity = kw
        identity['repoze.who.userid'] = userid
        return identifier.remember(environ, identity)

    def forget(self, request):
        """ Forget the current authenticated user.

        Return headers that, if included in a response, will delete the
        cookie responsible for tracking the current user.

        """
        identifier = self._get_identifier(request)
        if identifier is None:
            return []
        identity = self._get_identity(request)
        return identifier.forget(request.environ, identity)


@implementer(IAuthenticationPolicy)
class RemoteUserAuthenticationPolicy(CallbackAuthenticationPolicy):
    """ A :app:`Pyramid` :term:`authentication policy` which
    obtains data from the ``REMOTE_USER`` WSGI environment variable.

    Constructor Arguments

    ``environ_key``

        Default: ``REMOTE_USER``.  The key in the WSGI environ which
        provides the userid.

    ``callback``

        Default: ``None``.  A callback passed the userid and the request,
        expected to return None if the userid doesn't exist or a sequence of
        principal identifiers (possibly empty) representing groups if the
        user does exist.  If ``callback`` is None, the userid will be assumed
        to exist with no group principals.

    ``debug``

        Default: ``False``.  If ``debug`` is ``True``, log messages to the
        Pyramid debug logger about the results of various authentication
        steps.  The output from debugging is useful for reporting to maillist
        or IRC channels when asking for support.

    Objects of this class implement the interface described by
    :class:`pyramid.interfaces.IAuthenticationPolicy`.
    """

    def __init__(self, environ_key='REMOTE_USER', callback=None, debug=False):
        self.environ_key = environ_key
        self.callback = callback
        self.debug = debug

    def unauthenticated_userid(self, request):
        """ The ``REMOTE_USER`` value found within the ``environ``."""
        return request.environ.get(self.environ_key)

    def remember(self, request, userid, **kw):
        """ A no-op. The ``REMOTE_USER`` does not provide a protocol for
        remembering the user. This will be application-specific and can
        be done somewhere else or in a subclass."""
        return []

    def forget(self, request):
        """ A no-op. The ``REMOTE_USER`` does not provide a protocol for
        forgetting the user. This will be application-specific and can
        be done somewhere else or in a subclass."""
        return []


@implementer(IAuthenticationPolicy)
class AuthTktAuthenticationPolicy(CallbackAuthenticationPolicy):
    """A :app:`Pyramid` :term:`authentication policy` which
    obtains data from a Pyramid "auth ticket" cookie.

    Constructor Arguments

    ``secret``

       The secret (a string) used for auth_tkt cookie signing.  This value
       should be unique across all values provided to Pyramid for various
       subsystem secrets (see :ref:`admonishment_against_secret_sharing`).
       Required.

    ``callback``

       Default: ``None``.  A callback passed the userid and the
       request, expected to return ``None`` if the userid doesn't
       exist or a sequence of principal identifiers (possibly empty) if
       the user does exist.  If ``callback`` is ``None``, the userid
       will be assumed to exist with no principals.  Optional.

    ``cookie_name``

       Default: ``auth_tkt``.  The cookie name used
       (string).  Optional.

    ``secure``

       Default: ``False``.  Only send the cookie back over a secure
       conn.  Optional.

    ``include_ip``

       Default: ``False``.  Make the requesting IP address part of
       the authentication data in the cookie.  Optional.

       For IPv6 this option is not recommended. The ``mod_auth_tkt``
       specification does not specify how to handle IPv6 addresses, so using
       this option in combination with IPv6 addresses may cause an
       incompatible cookie. It ties the authentication ticket to that
       individual's IPv6 address.

    ``timeout``

       Default: ``None``.  Maximum number of seconds which a newly
       issued ticket will be considered valid.  After this amount of
       time, the ticket will expire (effectively logging the user
       out).  If this value is ``None``, the ticket never expires.
       Optional.

    ``reissue_time``

       Default: ``None``.  If this parameter is set, it represents the number
       of seconds that must pass before an authentication token cookie is
       automatically reissued as the result of a request which requires
       authentication.  The duration is measured as the number of seconds
       since the last auth_tkt cookie was issued and 'now'.  If this value is
       ``0``, a new ticket cookie will be reissued on every request which
       requires authentication.

       A good rule of thumb: if you want auto-expired cookies based on
       inactivity: set the ``timeout`` value to 1200 (20 mins) and set the
       ``reissue_time`` value to perhaps a tenth of the ``timeout`` value
       (120 or 2 mins).  It's nonsensical to set the ``timeout`` value lower
       than the ``reissue_time`` value, as the ticket will never be reissued
       if so.  However, such a configuration is not explicitly prevented.

       Optional.

    ``max_age``

       Default: ``None``.  The max age of the auth_tkt cookie, in
       seconds.  This differs from ``timeout`` inasmuch as ``timeout``
       represents the lifetime of the ticket contained in the cookie,
       while this value represents the lifetime of the cookie itself.
       When this value is set, the cookie's ``Max-Age`` and
       ``Expires`` settings will be set, allowing the auth_tkt cookie
       to last between browser sessions.  It is typically nonsensical
       to set this to a value that is lower than ``timeout`` or
       ``reissue_time``, although it is not explicitly prevented.
       Optional.

    ``path``

       Default: ``/``. The path for which the auth_tkt cookie is valid.
       May be desirable if the application only serves part of a domain.
       Optional.

    ``http_only``

       Default: ``False``. Hide cookie from JavaScript by setting the
       HttpOnly flag. Not honored by all browsers.
       Optional.

    ``wild_domain``

       Default: ``True``. An auth_tkt cookie will be generated for the
       wildcard domain. If your site is hosted as ``example.com`` this
       will make the cookie available for sites underneath ``example.com``
       such as ``www.example.com``.
       Optional.

    ``parent_domain``

       Default: ``False``. An auth_tkt cookie will be generated for the
       parent domain of the current site. For example if your site is
       hosted under ``www.example.com`` a cookie will be generated for
       ``.example.com``. This can be useful if you have multiple sites
       sharing the same domain. This option supercedes the ``wild_domain``
       option.
       Optional.

    ``domain``

       Default: ``None``. If provided the auth_tkt cookie will only be
       set for this domain. This option is not compatible with ``wild_domain``
       and ``parent_domain``.
       Optional.

    ``hashalg``

       Default: ``sha512`` (the literal string).

       Any hash algorithm supported by Python's ``hashlib.new()`` function
       can be used as the ``hashalg``.

       Cookies generated by different instances of AuthTktAuthenticationPolicy
       using different ``hashalg`` options are not compatible. Switching the
       ``hashalg`` will imply that all existing users with a valid cookie will
       be required to re-login.

       Optional.

    ``debug``

        Default: ``False``.  If ``debug`` is ``True``, log messages to the
        Pyramid debug logger about the results of various authentication
        steps.  The output from debugging is useful for reporting to maillist
        or IRC channels when asking for support.

    ``samesite``

        Default: ``'Lax'``.  The 'samesite' option of the session cookie. Set
        the value to ``None`` to turn off the samesite option.

    .. versionchanged:: 1.4

       Added the ``hashalg`` option, defaulting to ``sha512``.

    .. versionchanged:: 1.5

       Added the ``domain`` option.

       Added the ``parent_domain`` option.

    .. versionchanged:: 1.10

       Added the ``samesite`` option and made the default ``'Lax'``.

    Objects of this class implement the interface described by
    :class:`pyramid.interfaces.IAuthenticationPolicy`.

    """

    def __init__(
        self,
        secret,
        callback=None,
        cookie_name='auth_tkt',
        secure=False,
        include_ip=False,
        timeout=None,
        reissue_time=None,
        max_age=None,
        path="/",
        http_only=False,
        wild_domain=True,
        debug=False,
        hashalg='sha512',
        parent_domain=False,
        domain=None,
        samesite='Lax',
    ):
        self.cookie = AuthTktCookieHelper(
            secret,
            cookie_name=cookie_name,
            secure=secure,
            include_ip=include_ip,
            timeout=timeout,
            reissue_time=reissue_time,
            max_age=max_age,
            http_only=http_only,
            path=path,
            wild_domain=wild_domain,
            hashalg=hashalg,
            parent_domain=parent_domain,
            domain=domain,
            samesite=samesite,
        )
        self.callback = callback
        self.debug = debug

    def unauthenticated_userid(self, request):
        """ The userid key within the auth_tkt cookie."""
        result = self.cookie.identify(request)
        if result:
            return result['userid']

    def remember(self, request, userid, **kw):
        """ Accepts the following kw args: ``max_age=<int-seconds>,
        ``tokens=<sequence-of-ascii-strings>``.

        Return a list of headers which will set appropriate cookies on
        the response.

        """
        return self.cookie.remember(request, userid, **kw)

    def forget(self, request):
        """ A list of headers which will delete appropriate cookies."""
        return self.cookie.forget(request)


def b64encode(v):
    return base64.b64encode(bytes_(v)).strip().replace(b'\n', b'')


def b64decode(v):
    return base64.b64decode(bytes_(v))


# this class licensed under the MIT license (stolen from Paste)
class AuthTicket:
    """
    This class represents an authentication token.  You must pass in
    the shared secret, the userid, and the IP address.  Optionally you
    can include tokens (a list of strings, representing role names),
    'user_data', which is arbitrary data available for your own use in
    later scripts.  Lastly, you can override the cookie name and
    timestamp.

    Once you provide all the arguments, use .cookie_value() to
    generate the appropriate authentication ticket.

    Usage::

        token = AuthTicket('sharedsecret', 'username',
            os.environ['REMOTE_ADDR'], tokens=['admin'])
        val = token.cookie_value()

    """

    def __init__(
        self,
        secret,
        userid,
        ip,
        tokens=(),
        user_data='',
        time=None,
        cookie_name='auth_tkt',
        secure=False,
        hashalg='md5',
    ):
        self.secret = secret
        self.userid = userid
        self.ip = ip
        self.tokens = ','.join(tokens)
        self.user_data = user_data
        if time is None:
            self.time = time_mod.time()
        else:
            self.time = time
        self.cookie_name = cookie_name
        self.secure = secure
        self.hashalg = hashalg

    def digest(self):
        return calculate_digest(
            self.ip,
            self.time,
            self.secret,
            self.userid,
            self.tokens,
            self.user_data,
            self.hashalg,
        )

    def cookie_value(self):
        v = '%s%08x%s!' % (self.digest(), int(self.time), quote(self.userid))
        if self.tokens:
            v += self.tokens + '!'
        v += self.user_data
        return v


# this class licensed under the MIT license (stolen from Paste)
class BadTicket(Exception):
    """
    Exception raised when a ticket can't be parsed.  If we get far enough to
    determine what the expected digest should have been, expected is set.
    This should not be shown by default, but can be useful for debugging.
    """

    def __init__(self, msg, expected=None):
        self.expected = expected
        Exception.__init__(self, msg)


# this function licensed under the MIT license (stolen from Paste)
def parse_ticket(secret, ticket, ip, hashalg='md5'):
    """
    Parse the ticket, returning (timestamp, userid, tokens, user_data).

    If the ticket cannot be parsed, a ``BadTicket`` exception will be raised
    with an explanation.
    """
    ticket = text_(ticket).strip('"')
    digest_size = hashlib.new(hashalg).digest_size * 2
    digest = ticket[:digest_size]
    try:
        timestamp = int(ticket[digest_size : digest_size + 8], 16)
    except ValueError as e:
        raise BadTicket('Timestamp is not a hex integer: %s' % e)
    try:
        userid, data = ticket[digest_size + 8 :].split('!', 1)
    except ValueError:
        raise BadTicket('userid is not followed by !')
    userid = unquote(userid)
    if '!' in data:
        tokens, user_data = data.split('!', 1)
    else:  # pragma: no cover (never generated)
        # @@: Is this the right order?
        tokens = ''
        user_data = data

    expected = calculate_digest(
        ip, timestamp, secret, userid, tokens, user_data, hashalg
    )

    # Avoid timing attacks (see
    # http://seb.dbzteam.org/crypto/python-oauth-timing-hmac.pdf)
    if strings_differ(expected, digest):
        raise BadTicket(
            'Digest signature is not correct', expected=(expected, digest)
        )

    tokens = tokens.split(',')

    return (timestamp, userid, tokens, user_data)


# this function licensed under the MIT license (stolen from Paste)
def calculate_digest(
    ip, timestamp, secret, userid, tokens, user_data, hashalg='md5'
):
    secret = bytes_(secret, 'utf-8')
    userid = bytes_(userid, 'utf-8')
    tokens = bytes_(tokens, 'utf-8')
    user_data = bytes_(user_data, 'utf-8')
    hash_obj = hashlib.new(hashalg)

    # Check to see if this is an IPv6 address
    if ':' in ip:
        ip_timestamp = ip + str(int(timestamp))
        ip_timestamp = bytes_(ip_timestamp)
    else:
        # encode_ip_timestamp not required, left in for backwards compatibility
        ip_timestamp = encode_ip_timestamp(ip, timestamp)

    hash_obj.update(
        ip_timestamp + secret + userid + b'\0' + tokens + b'\0' + user_data
    )
    digest = hash_obj.hexdigest()
    hash_obj2 = hashlib.new(hashalg)
    hash_obj2.update(bytes_(digest) + secret)
    return hash_obj2.hexdigest()


# this function licensed under the MIT license (stolen from Paste)
def encode_ip_timestamp(ip, timestamp):
    ip_chars = ''.join(map(chr, map(int, ip.split('.'))))
    t = int(timestamp)
    ts = (
        (t & 0xFF000000) >> 24,
        (t & 0xFF0000) >> 16,
        (t & 0xFF00) >> 8,
        t & 0xFF,
    )
    ts_chars = ''.join(map(chr, ts))
    return bytes_(ip_chars + ts_chars)


class AuthTktCookieHelper:
    """
    A helper class for security policies that obtains data from an "auth
    ticket" cookie.

    Constructor Arguments

    ``secret``

       The secret (a string) used for auth_tkt cookie signing.  This value
       should be unique across all values provided to Pyramid for various
       subsystem secrets (see :ref:`admonishment_against_secret_sharing`).
       Required.

    ``cookie_name``

       Default: ``auth_tkt``.  The cookie name used
       (string).  Optional.

    ``secure``

       Default: ``False``.  Only send the cookie back over a secure
       conn.  Optional.

    ``include_ip``

       Default: ``False``.  Make the requesting IP address part of
       the authentication data in the cookie.  Optional.

       For IPv6 this option is not recommended. The ``mod_auth_tkt``
       specification does not specify how to handle IPv6 addresses, so using
       this option in combination with IPv6 addresses may cause an
       incompatible cookie. It ties the authentication ticket to that
       individual's IPv6 address.

    ``timeout``

       Default: ``None``.  Maximum number of seconds which a newly
       issued ticket will be considered valid.  After this amount of
       time, the ticket will expire (effectively logging the user
       out).  If this value is ``None``, the ticket never expires.
       Optional.

    ``reissue_time``

       Default: ``None``.  If this parameter is set, it represents the number
       of seconds that must pass before an authentication token cookie is
       automatically reissued as the result of a request which requires
       authentication.  The duration is measured as the number of seconds
       since the last auth_tkt cookie was issued and 'now'.  If this value is
       ``0``, a new ticket cookie will be reissued on every request which
       requires authentication.

       A good rule of thumb: if you want auto-expired cookies based on
       inactivity: set the ``timeout`` value to 1200 (20 mins) and set the
       ``reissue_time`` value to perhaps a tenth of the ``timeout`` value
       (120 or 2 mins).  It's nonsensical to set the ``timeout`` value lower
       than the ``reissue_time`` value, as the ticket will never be reissued
       if so.  However, such a configuration is not explicitly prevented.

       Optional.

    ``max_age``

       Default: ``None``.  The max age of the auth_tkt cookie, in
       seconds.  This differs from ``timeout`` inasmuch as ``timeout``
       represents the lifetime of the ticket contained in the cookie,
       while this value represents the lifetime of the cookie itself.
       When this value is set, the cookie's ``Max-Age`` and
       ``Expires`` settings will be set, allowing the auth_tkt cookie
       to last between browser sessions.  It is typically nonsensical
       to set this to a value that is lower than ``timeout`` or
       ``reissue_time``, although it is not explicitly prevented.
       Optional.

    ``path``

       Default: ``/``. The path for which the auth_tkt cookie is valid.
       May be desirable if the application only serves part of a domain.
       Optional.

    ``http_only``

       Default: ``False``. Hide cookie from JavaScript by setting the
       HttpOnly flag. Not honored by all browsers.
       Optional.

    ``wild_domain``

       Default: ``True``. An auth_tkt cookie will be generated for the
       wildcard domain. If your site is hosted as ``example.com`` this
       will make the cookie available for sites underneath ``example.com``
       such as ``www.example.com``.
       Optional.

    ``parent_domain``

       Default: ``False``. An auth_tkt cookie will be generated for the
       parent domain of the current site. For example if your site is
       hosted under ``www.example.com`` a cookie will be generated for
       ``.example.com``. This can be useful if you have multiple sites
       sharing the same domain. This option supercedes the ``wild_domain``
       option.
       Optional.

    ``domain``

       Default: ``None``. If provided the auth_tkt cookie will only be
       set for this domain. This option is not compatible with ``wild_domain``
       and ``parent_domain``.
       Optional.

    ``hashalg``

       Default: ``sha512`` (the literal string).

       Any hash algorithm supported by Python's ``hashlib.new()`` function
       can be used as the ``hashalg``.

       Cookies generated by different instances of AuthTktAuthenticationPolicy
       using different ``hashalg`` options are not compatible. Switching the
       ``hashalg`` will imply that all existing users with a valid cookie will
       be required to re-login.

       Optional.

    ``debug``

        Default: ``False``.  If ``debug`` is ``True``, log messages to the
        Pyramid debug logger about the results of various authentication
        steps.  The output from debugging is useful for reporting to maillist
        or IRC channels when asking for support. Optional.

    ``samesite``

        Default: ``'Lax'``.  The 'samesite' option of the session cookie. Set
        the value to ``None`` to turn off the samesite option. Optional.

    .. versionchanged:: 2.0

        The default ``hashalg`` was changed from ``md5`` to ``sha512``.

    """

    parse_ticket = staticmethod(parse_ticket)  # for tests
    AuthTicket = AuthTicket  # for tests
    BadTicket = BadTicket  # for tests
    now = None  # for tests

    userid_type_decoders = {
        'int': int,
        'unicode': lambda x: utf_8_decode(x)[0],  # bw compat for old cookies
        'b64unicode': lambda x: utf_8_decode(b64decode(x))[0],
        'b64str': lambda x: b64decode(x),
    }

    userid_type_encoders = {
        int: ('int', str),
        str: ('b64unicode', lambda x: b64encode(utf_8_encode(x)[0])),
        bytes: ('b64str', lambda x: b64encode(x)),
    }

    def __init__(
        self,
        secret,
        cookie_name='auth_tkt',
        secure=False,
        include_ip=False,
        timeout=None,
        reissue_time=None,
        max_age=None,
        http_only=False,
        path="/",
        wild_domain=True,
        hashalg='sha512',
        parent_domain=False,
        domain=None,
        samesite='Lax',
    ):
        self.cookie_profile = CookieProfile(
            cookie_name=cookie_name,
            secure=secure,
            max_age=max_age,
            httponly=http_only,
            path=path,
            serializer=SimpleSerializer(),
            samesite=samesite,
        )

        self.secret = secret
        self.cookie_name = cookie_name
        self.secure = secure
        self.include_ip = include_ip
        self.timeout = timeout if timeout is None else int(timeout)
        self.reissue_time = (
            reissue_time if reissue_time is None else int(reissue_time)
        )
        self.max_age = max_age if max_age is None else int(max_age)
        self.wild_domain = wild_domain
        self.parent_domain = parent_domain
        self.domain = domain
        self.hashalg = hashalg

    def _get_cookies(self, request, value, max_age=None):
        cur_domain = request.domain

        domains = []
        if self.domain:
            domains.append(self.domain)
        else:
            if self.parent_domain and cur_domain.count('.') > 1:
                domains.append('.' + cur_domain.split('.', 1)[1])
            else:
                domains.append(None)
                domains.append(cur_domain)
                if self.wild_domain:
                    domains.append('.' + cur_domain)

        profile = self.cookie_profile(request)

        kw = {}
        kw['domains'] = domains
        if max_age is not None:
            kw['max_age'] = max_age

        headers = profile.get_headers(value, **kw)
        return headers

    def identify(self, request):
        """ Return a dictionary with authentication information, or ``None``
        if no valid auth_tkt is attached to ``request``"""
        environ = request.environ
        cookie = request.cookies.get(self.cookie_name)

        if cookie is None:
            return None

        if self.include_ip:
            remote_addr = environ['REMOTE_ADDR']
        else:
            remote_addr = '0.0.0.0'

        try:
            timestamp, userid, tokens, user_data = self.parse_ticket(
                self.secret, cookie, remote_addr, self.hashalg
            )
        except self.BadTicket:
            return None

        now = self.now  # service tests

        if now is None:
            now = time_mod.time()

        if self.timeout and ((timestamp + self.timeout) < now):
            # the auth_tkt data has expired
            return None

        userid_typename = 'userid_type:'
        user_data_info = user_data.split('|')
        for datum in filter(None, user_data_info):
            if datum.startswith(userid_typename):
                userid_type = datum[len(userid_typename) :]
                decoder = self.userid_type_decoders.get(userid_type)
                if decoder:
                    userid = decoder(userid)

        reissue = self.reissue_time is not None

        if reissue and not hasattr(request, '_authtkt_reissued'):
            if (now - timestamp) > self.reissue_time:
                # See https://github.com/Pylons/pyramid/issues#issue/108
                tokens = list(filter(None, tokens))
                headers = self.remember(
                    request, userid, max_age=self.max_age, tokens=tokens
                )

                def reissue_authtkt(request, response):
                    if not hasattr(request, '_authtkt_reissue_revoked'):
                        for k, v in headers:
                            response.headerlist.append((k, v))

                request.add_response_callback(reissue_authtkt)
                request._authtkt_reissued = True

        environ['REMOTE_USER_TOKENS'] = tokens
        environ['REMOTE_USER_DATA'] = user_data
        environ['AUTH_TYPE'] = 'cookie'

        identity = {}
        identity['timestamp'] = timestamp
        identity['userid'] = userid
        identity['tokens'] = tokens
        identity['userdata'] = user_data
        return identity

    def forget(self, request):
        """ Return a set of expires Set-Cookie headers, which will destroy
        any existing auth_tkt cookie when attached to a response"""
        request._authtkt_reissue_revoked = True
        return self._get_cookies(request, None)

    def remember(self, request, userid, max_age=None, tokens=()):
        """ Return a set of Set-Cookie headers; when set into a response,
        these headers will represent a valid authentication ticket.

        ``max_age``
          The max age of the auth_tkt cookie, in seconds.  When this value is
          set, the cookie's ``Max-Age`` and ``Expires`` settings will be set,
          allowing the auth_tkt cookie to last between browser sessions.  If
          this value is ``None``, the ``max_age`` value provided to the
          helper itself will be used as the ``max_age`` value.  Default:
          ``None``.

        ``tokens``
          A sequence of strings that will be placed into the auth_tkt tokens
          field.  Each string in the sequence must be of the Python ``str``
          type and must match the regex ``^[A-Za-z][A-Za-z0-9+_-]*$``.
          Tokens are available in the returned identity when an auth_tkt is
          found in the request and unpacked.  Default: ``()``.
        """
        max_age = self.max_age if max_age is None else int(max_age)

        environ = request.environ

        if self.include_ip:
            remote_addr = environ['REMOTE_ADDR']
        else:
            remote_addr = '0.0.0.0'

        user_data = ''

        encoding_data = self.userid_type_encoders.get(type(userid))

        if encoding_data:
            encoding, encoder = encoding_data
        else:
            warnings.warn(
                "userid is of type {}, and is not supported by the "
                "AuthTktAuthenticationPolicy. Explicitly converting to string "
                "and storing as base64. Subsequent requests will receive a "
                "string as the userid, it will not be decoded back to the "
                "type provided.".format(type(userid)),
                RuntimeWarning,
            )
            encoding, encoder = self.userid_type_encoders.get(str)
            userid = str(userid)

        userid = encoder(userid)
        user_data = 'userid_type:%s' % encoding

        new_tokens = []
        for token in tokens:
            if isinstance(token, str):
                try:
                    token = ascii_(token)
                except UnicodeEncodeError:
                    raise ValueError("Invalid token %r" % (token,))
            if not (isinstance(token, str) and VALID_TOKEN.match(token)):
                raise ValueError("Invalid token %r" % (token,))
            new_tokens.append(token)
        tokens = tuple(new_tokens)

        if hasattr(request, '_authtkt_reissued'):
            request._authtkt_reissue_revoked = True

        ticket = self.AuthTicket(
            self.secret,
            userid,
            remote_addr,
            tokens=tokens,
            user_data=user_data,
            cookie_name=self.cookie_name,
            secure=self.secure,
            hashalg=self.hashalg,
        )

        cookie_value = ticket.cookie_value()
        return self._get_cookies(request, cookie_value, max_age)


@implementer(IAuthenticationPolicy)
class SessionAuthenticationPolicy(CallbackAuthenticationPolicy):
    """ A :app:`Pyramid` authentication policy which gets its data from the
    configured :term:`session`.  For this authentication policy to work, you
    will have to follow the instructions in the :ref:`sessions_chapter` to
    configure a :term:`session factory`.

    Constructor Arguments

    ``prefix``

       A prefix used when storing the authentication parameters in the
       session. Defaults to 'auth.'. Optional.

    ``callback``

       Default: ``None``.  A callback passed the userid and the
       request, expected to return ``None`` if the userid doesn't
       exist or a sequence of principal identifiers (possibly empty) if
       the user does exist.  If ``callback`` is ``None``, the userid
       will be assumed to exist with no principals.  Optional.

    ``debug``

        Default: ``False``.  If ``debug`` is ``True``, log messages to the
        Pyramid debug logger about the results of various authentication
        steps.  The output from debugging is useful for reporting to maillist
        or IRC channels when asking for support.

    """

    def __init__(self, prefix='auth.', callback=None, debug=False):
        self.callback = callback
        self.debug = debug
        self.helper = SessionAuthenticationHelper(prefix)

    def remember(self, request, userid, **kw):
        """ Store a userid in the session."""
        return self.helper.remember(request, userid, **kw)

    def forget(self, request):
        """ Remove the stored userid from the session."""
        return self.helper.forget(request)

    def unauthenticated_userid(self, request):
        return self.helper.authenticated_userid(request)


class SessionAuthenticationHelper:
    """ A helper for use with a :term:`security policy` which stores user data
    in the configured :term:`session`.

    Constructor Arguments

    ``prefix``

       A prefix used when storing the authentication parameters in the
       session. Defaults to 'auth.'. Optional.

    """

    def __init__(self, prefix='auth.'):
        self.userid_key = prefix + 'userid'

    def remember(self, request, userid, **kw):
        """ Store a userid in the session."""
        request.session[self.userid_key] = userid
        return []

    def forget(self, request, **kw):
        """ Remove the stored userid from the session."""
        if self.userid_key in request.session:
            del request.session[self.userid_key]
        return []

    def authenticated_userid(self, request):
        """ Return the stored userid."""
        return request.session.get(self.userid_key)


@implementer(IAuthenticationPolicy)
class BasicAuthAuthenticationPolicy(CallbackAuthenticationPolicy):
    """ A :app:`Pyramid` authentication policy which uses HTTP standard basic
    authentication protocol to authenticate users.  To use this policy you will
    need to provide a callback which checks the supplied user credentials
    against your source of login data.

    Constructor Arguments

    ``check``

       A callback function passed a username, password and request, in that
       order as positional arguments.  Expected to return ``None`` if the
       userid doesn't exist or a sequence of principal identifiers (possibly
       empty) if the user does exist.

    ``realm``

       Default: ``"Realm"``.  The Basic Auth Realm string.  Usually displayed
       to the user by the browser in the login dialog.

    ``debug``

        Default: ``False``.  If ``debug`` is ``True``, log messages to the
        Pyramid debug logger about the results of various authentication
        steps.  The output from debugging is useful for reporting to maillist
        or IRC channels when asking for support.

    **Issuing a challenge**

    Regular browsers will not send username/password credentials unless they
    first receive a challenge from the server.  The following recipe will
    register a view that will send a Basic Auth challenge to the user whenever
    there is an attempt to call a view which results in a Forbidden response::

        from pyramid.httpexceptions import HTTPUnauthorized
        from pyramid.security import forget
        from pyramid.view import forbidden_view_config

        @forbidden_view_config()
        def forbidden_view(request):
            if request.authenticated_userid is None:
                response = HTTPUnauthorized()
                response.headers.update(forget(request))
                return response
            return HTTPForbidden()
    """

    def __init__(self, check, realm='Realm', debug=False):
        self.check = check
        self.realm = realm
        self.debug = debug

    def unauthenticated_userid(self, request):
        """ The userid parsed from the ``Authorization`` request header."""
        credentials = extract_http_basic_credentials(request)
        if credentials:
            return credentials.username

    def remember(self, request, userid, **kw):
        """ A no-op. Basic authentication does not provide a protocol for
        remembering the user. Credentials are sent on every request.

        """
        return []

    def forget(self, request):
        """ Returns challenge headers. This should be attached to a response
        to indicate that credentials are required."""
        return [('WWW-Authenticate', 'Basic realm="%s"' % self.realm)]

    def callback(self, username, request):
        # Username arg is ignored. Unfortunately
        # extract_http_basic_credentials winds up getting called twice when
        # authenticated_userid is called. Avoiding that, however,
        # winds up duplicating logic from the superclass.
        credentials = extract_http_basic_credentials(request)
        if credentials:
            username, password = credentials
            return self.check(username, password, request)


HTTPBasicCredentials = namedtuple(
    'HTTPBasicCredentials', ['username', 'password']
)


def extract_http_basic_credentials(request):
    """ A helper function for extraction of HTTP Basic credentials
    from a given :term:`request`.

    Returns a :class:`.HTTPBasicCredentials` 2-tuple with ``username`` and
    ``password`` attributes or ``None`` if no credentials could be found.

    """
    authorization = request.headers.get('Authorization')
    if not authorization:
        return None

    try:
        authmeth, auth = authorization.split(' ', 1)
    except ValueError:  # not enough values to unpack
        return None

    if authmeth.lower() != 'basic':
        return None

    try:
        authbytes = b64decode(auth.strip())
    except (TypeError, binascii.Error):  # can't decode
        return None

    # try utf-8 first, then latin-1; see discussion in
    # https://github.com/Pylons/pyramid/issues/898
    try:
        auth = authbytes.decode('utf-8')
    except UnicodeDecodeError:
        auth = authbytes.decode('latin-1')

    try:
        username, password = auth.split(':', 1)
    except ValueError:  # not enough values to unpack
        return None

    return HTTPBasicCredentials(username, password)

```
--- END FILE ---

Please first localize the bug based on the issue statement, and then generate *SEARCH/REPLACE* edits to fix the issue.

Every *SEARCH/REPLACE* edit must use this format:
1. The file path
2. The start of search block: <<<<<<< SEARCH
3. A contiguous chunk of lines to search for in the existing source code
4. The dividing line: =======
5. The lines to replace into the source code
6. The end of the replace block: >>>>>>> REPLACE

Here is an example:

```python
### mathweb/flask/app.py
<<<<<<< SEARCH
from flask import Flask
=======
import math
from flask import Flask
>>>>>>> REPLACE
```
</solution>

Please note that the *SEARCH/REPLACE* edit REQUIRES PROPER INDENTATION. If you would like to add the line '        print(x)', you must fully write that out, with all those spaces before the code!
Wrap each *SEARCH/REPLACE* edit in a code block as shown in the example above. If you have multiple *SEARCH/REPLACE* edits, use a separate code block for each one.
user