{
    "file_diffs": [
        {
            "old_file_content": "import binascii\nfrom codecs import utf_8_decode\nfrom codecs import utf_8_encode\nimport hashlib\nimport base64\nimport datetime\nimport re\nimport time as time_mod\nimport warnings\n\nfrom zope.interface import implementer\n\nfrom webob.cookies import CookieProfile\n\nfrom pyramid.compat import (\n    long,\n    text_type,\n    binary_type,\n    url_unquote,\n    url_quote,\n    bytes_,\n    ascii_native_,\n    native_,\n    )\n\nfrom pyramid.interfaces import (\n    IAuthenticationPolicy,\n    IDebugLogger,\n    )\n\nfrom pyramid.security import (\n    Authenticated,\n    Everyone,\n    )\n\nfrom pyramid.util import strings_differ\n\nVALID_TOKEN = re.compile(r\"^[A-Za-z][A-Za-z0-9+_-]*$\")\n\nclass CallbackAuthenticationPolicy(object):\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            return None\n        if self._clean_principal(userid) is None:\n            debug and self._log(\n                ('use of userid %r is disallowed by any built-in Pyramid '\n                 'security policy, returning None' % userid),\n                'authenticated_userid' ,\n                request)\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            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.security.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.security.Authenticated`, the ``authenticated_userid``\n        and the list of principals returned by the ``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                ('unauthenticated_userid returned disallowed %r; returning %r '\n                 'as if it was None' % (userid, effective_principals)),\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            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        if groups is None: # is None!\n            debug and self._log(\n                'returning effective principals: %r' % (\n                    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' % (\n                effective_principals,),\n            'effective_principals',\n            request\n             )\n        return effective_principals\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            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            return None\n            \n        if self._clean_principal(userid) is None:\n            self.debug and self._log(\n                ('use of userid %r is disallowed by any built-in Pyramid '\n                 'security policy, returning None' % userid),\n                'authenticated_userid',\n                request)\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.security.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.security.Authenticated`, the ``authenticated_userid``\n        and the list of principals returned by the ``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                ('repoze.who identity was None; returning %r' %\n                 effective_principals),\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                ('security policy groups callback returned None; returning %r' %\n                 effective_principals),\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                ('repoze.who.userid was None; returning %r' %\n                 effective_principals),\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                ('unauthenticated_userid returned disallowed %r; returning %r '\n                 'as if it was None' % (userid, 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        return effective_principals\n\n    def remember(self, request, principal, **kw):\n        \"\"\" Store the ``principal`` as ``repoze.who.userid``.\"\"\"\n        identifier = self._get_identifier(request)\n        if identifier is None:\n            return []\n        environ = request.environ\n        identity = {'repoze.who.userid':principal}\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@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, principal, **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_marker = object()\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    .. warning::\n\n       The default hash algorithm used in this policy is MD5 and has known\n       hash collision vulnerabilities. The risk of an exploit is low.\n       However, for improved authentication security, use\n       ``hashalg='sha512'``.\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       This option is available as of :app:`Pyramid` 1.5.\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       This option is available as of :app:`Pyramid` 1.5.\n\n    ``hashalg``\n\n       Default: ``md5`` (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       A warning is emitted at startup if an explicit ``hashalg`` is not\n       passed.  This is for backwards compatibility reasons.\n\n       This option is available as of :app:`Pyramid` 1.4.\n\n       Optional.\n\n       .. note::\n\n          ``md5`` is the default for backwards compatibility reasons. However,\n          if you don't specify ``md5`` as the hashalg explicitly, a warning is\n          issued at application startup time.  An explicit value of ``sha512``\n          is recommended for improved security, and ``sha512`` will become the\n          default in a future Pyramid version.\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,\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=_marker,\n                 parent_domain=False,\n                 domain=None,\n                 ):\n        if hashalg is _marker:\n            hashalg = 'md5'\n            warnings.warn(\n                'The MD5 hash function used by default by the '\n                'AuthTktAuthenticationPolicy is known to be '\n                'susceptible to collision attacks.  It is the current default '\n                'for backwards compatibility reasons, but we recommend that '\n                'you use the SHA512 algorithm instead for improved security.  '\n                'Pass ``hashalg=\\'sha512\\'`` to the '\n                'AuthTktAuthenticationPolicy constructor to do so.\\n\\nNote '\n                'that a change to the hash algorithms will invalidate existing '\n                'auth tkt cookies set by your application.  If backwards '\n                'compatibility of existing auth tkt cookies is of greater '\n                'concern than the risk posed by the potential for a hash '\n                'collision, you\\'ll want to continue using MD5 explicitly.  '\n                'To do so, pass ``hashalg=\\'md5\\'`` in your application to '\n                'the AuthTktAuthenticationPolicy constructor.   When you do so '\n                'this warning will not be emitted again.  The default '\n                'algorithm used in this policy will change in the future, so '\n                'setting an explicit hashalg will futureproof your '\n                'application.',\n                DeprecationWarning,\n                stacklevel=2\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            )\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, principal, **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, principal, **kw)\n\n    def forget(self, request):\n        \"\"\" A list of headers which will delete appropriate cookies.\"\"\"\n        return self.cookie.forget(request)\n\ndef b64encode(v):\n    return base64.b64encode(bytes_(v)).strip().replace(b'\\n', b'')\n\ndef b64decode(v):\n    return base64.b64decode(bytes_(v))\n\n# this class licensed under the MIT license (stolen from Paste)\nclass AuthTicket(object):\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__(self, secret, userid, ip, tokens=(), user_data='',\n                 time=None, cookie_name='auth_tkt', secure=False,\n                 hashalg='md5'):\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, self.time, self.secret, self.userid, self.tokens,\n            self.user_data, self.hashalg)\n\n    def cookie_value(self):\n        v = '%s%08x%s!' % (self.digest(), int(self.time),\n                           url_quote(self.userid))\n        if self.tokens:\n            v += self.tokens + '!'\n        v += self.user_data\n        return v\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    def __init__(self, msg, expected=None):\n        self.expected = expected\n        Exception.__init__(self, msg)\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 = 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 = url_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(ip, timestamp, secret,\n                                userid, tokens, user_data, hashalg)\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('Digest signature is not correct',\n                        expected=(expected, digest))\n\n    tokens = tokens.split(',')\n\n    return (timestamp, userid, tokens, user_data)\n\n# this function licensed under the MIT license (stolen from Paste)\ndef calculate_digest(ip, timestamp, secret, userid, tokens, user_data,\n                     hashalg='md5'):\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(ip_timestamp + secret + userid + b'\\0' +\n            tokens + b'\\0' + user_data)\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# 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 = ((t & 0xff000000) >> 24,\n          (t & 0xff0000) >> 16,\n          (t & 0xff00) >> 8,\n          t & 0xff)\n    ts_chars = ''.join(map(chr, ts))\n    return bytes_(ip_chars + ts_chars)\n\nclass AuthTktCookieHelper(object):\n    \"\"\"\n    A helper class for use in third-party authentication policy\n    implementations.  See\n    :class:`pyramid.authentication.AuthTktAuthenticationPolicy` for the\n    meanings of the constructor arguments.\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        long: ('int', str),\n        text_type: ('b64unicode', lambda x: b64encode(utf_8_encode(x)[0])),\n        binary_type: ('b64str', lambda x: b64encode(x)),\n        }\n\n    def __init__(self, secret, cookie_name='auth_tkt', secure=False,\n                 include_ip=False, timeout=None, reissue_time=None,\n                 max_age=None, http_only=False, path=\"/\", wild_domain=True,\n                 hashalg='md5', parent_domain=False, domain=None):\n\n        serializer = _SimpleSerializer()\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=serializer\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\n        self.reissue_time = reissue_time\n        self.max_age = 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        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                # work around https://github.com/Pylons/pyramid/issues#issue/108\n                tokens = list(filter(None, tokens))\n                headers = self.remember(request, userid, max_age=self.max_age,\n                                        tokens=tokens)\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                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        if max_age is None:\n            max_age = self.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            userid = encoder(userid)\n            user_data = 'userid_type:%s' % encoding\n\n        new_tokens = []\n        for token in tokens:\n            if isinstance(token, text_type):\n                try:\n                    token = ascii_native_(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@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.prefix = prefix or ''\n        self.userid_key = prefix + 'userid'\n        self.debug = debug\n\n    def remember(self, request, principal, **kw):\n        \"\"\" Store a principal in the session.\"\"\"\n        request.session[self.userid_key] = principal\n        return []\n\n    def forget(self, request):\n        \"\"\" Remove the stored principal from the session.\"\"\"\n        if self.userid_key in request.session:\n            del request.session[self.userid_key]\n        return []\n\n    def unauthenticated_userid(self, request):\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 to\n       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 basic_challenge(request):\n            response = HTTPUnauthorized()\n            response.headers.update(forget(request))\n            return response\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 = self._get_credentials(request)\n        if credentials:\n            return credentials[0]\n\n    def remember(self, request, principal, **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 _get_credentials winds up\n        # getting called twice when authenticated_userid is called.  Avoiding\n        # that, however, winds up duplicating logic from the superclass.\n        credentials = self._get_credentials(request)\n        if credentials:\n            username, password = credentials\n            return self.check(username, password, request)\n\n    def _get_credentials(self, request):\n        authorization = request.headers.get('Authorization')\n        if not authorization:\n            return None\n        try:\n            authmeth, auth = authorization.split(' ', 1)\n        except ValueError: # not enough values to unpack\n            return None\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        return username, password\n\nclass _SimpleSerializer(object):\n    def loads(self, bstruct):\n        return native_(bstruct)\n\n    def dumps(self, appstruct):\n        return bytes_(appstruct)\n\n",
            "new_file_content": "import binascii\nfrom codecs import utf_8_decode\nfrom codecs import utf_8_encode\nimport hashlib\nimport base64\nimport datetime\nimport re\nimport time as time_mod\nimport warnings\n\nfrom zope.interface import implementer\n\nfrom webob.cookies import CookieProfile\n\nfrom pyramid.compat import (\n    long,\n    text_type,\n    binary_type,\n    url_unquote,\n    url_quote,\n    bytes_,\n    ascii_native_,\n    native_,\n    )\n\nfrom pyramid.interfaces import (\n    IAuthenticationPolicy,\n    IDebugLogger,\n    )\n\nfrom pyramid.security import (\n    Authenticated,\n    Everyone,\n    )\n\nfrom pyramid.util import strings_differ\n\nVALID_TOKEN = re.compile(r\"^[A-Za-z][A-Za-z0-9+_-]*$\")\n\nclass CallbackAuthenticationPolicy(object):\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            return None\n        if self._clean_principal(userid) is None:\n            debug and self._log(\n                ('use of userid %r is disallowed by any built-in Pyramid '\n                 'security policy, returning None' % userid),\n                'authenticated_userid' ,\n                request)\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            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.security.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.security.Authenticated`, the ``authenticated_userid``\n        and the list of principals returned by the ``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                ('unauthenticated_userid returned disallowed %r; returning %r '\n                 'as if it was None' % (userid, effective_principals)),\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            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        if groups is None: # is None!\n            debug and self._log(\n                'returning effective principals: %r' % (\n                    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' % (\n                effective_principals,),\n            'effective_principals',\n            request\n             )\n        return effective_principals\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            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            return None\n            \n        if self._clean_principal(userid) is None:\n            self.debug and self._log(\n                ('use of userid %r is disallowed by any built-in Pyramid '\n                 'security policy, returning None' % userid),\n                'authenticated_userid',\n                request)\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.security.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.security.Authenticated`, the ``authenticated_userid``\n        and the list of principals returned by the ``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                ('repoze.who identity was None; returning %r' %\n                 effective_principals),\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                ('security policy groups callback returned None; returning %r' %\n                 effective_principals),\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                ('repoze.who.userid was None; returning %r' %\n                 effective_principals),\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                ('unauthenticated_userid returned disallowed %r; returning %r '\n                 'as if it was None' % (userid, 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        return effective_principals\n\n    def remember(self, request, principal, **kw):\n        \"\"\" Store the ``principal`` as ``repoze.who.userid``.\n        \n        The identity to authenticated to :mod:`repoze.who`\n        will contain the given principal 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'] = principal\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@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, principal, **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_marker = object()\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    .. warning::\n\n       The default hash algorithm used in this policy is MD5 and has known\n       hash collision vulnerabilities. The risk of an exploit is low.\n       However, for improved authentication security, use\n       ``hashalg='sha512'``.\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       This option is available as of :app:`Pyramid` 1.5.\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       This option is available as of :app:`Pyramid` 1.5.\n\n    ``hashalg``\n\n       Default: ``md5`` (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       A warning is emitted at startup if an explicit ``hashalg`` is not\n       passed.  This is for backwards compatibility reasons.\n\n       This option is available as of :app:`Pyramid` 1.4.\n\n       Optional.\n\n       .. note::\n\n          ``md5`` is the default for backwards compatibility reasons. However,\n          if you don't specify ``md5`` as the hashalg explicitly, a warning is\n          issued at application startup time.  An explicit value of ``sha512``\n          is recommended for improved security, and ``sha512`` will become the\n          default in a future Pyramid version.\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,\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=_marker,\n                 parent_domain=False,\n                 domain=None,\n                 ):\n        if hashalg is _marker:\n            hashalg = 'md5'\n            warnings.warn(\n                'The MD5 hash function used by default by the '\n                'AuthTktAuthenticationPolicy is known to be '\n                'susceptible to collision attacks.  It is the current default '\n                'for backwards compatibility reasons, but we recommend that '\n                'you use the SHA512 algorithm instead for improved security.  '\n                'Pass ``hashalg=\\'sha512\\'`` to the '\n                'AuthTktAuthenticationPolicy constructor to do so.\\n\\nNote '\n                'that a change to the hash algorithms will invalidate existing '\n                'auth tkt cookies set by your application.  If backwards '\n                'compatibility of existing auth tkt cookies is of greater '\n                'concern than the risk posed by the potential for a hash '\n                'collision, you\\'ll want to continue using MD5 explicitly.  '\n                'To do so, pass ``hashalg=\\'md5\\'`` in your application to '\n                'the AuthTktAuthenticationPolicy constructor.   When you do so '\n                'this warning will not be emitted again.  The default '\n                'algorithm used in this policy will change in the future, so '\n                'setting an explicit hashalg will futureproof your '\n                'application.',\n                DeprecationWarning,\n                stacklevel=2\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            )\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, principal, **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, principal, **kw)\n\n    def forget(self, request):\n        \"\"\" A list of headers which will delete appropriate cookies.\"\"\"\n        return self.cookie.forget(request)\n\ndef b64encode(v):\n    return base64.b64encode(bytes_(v)).strip().replace(b'\\n', b'')\n\ndef b64decode(v):\n    return base64.b64decode(bytes_(v))\n\n# this class licensed under the MIT license (stolen from Paste)\nclass AuthTicket(object):\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__(self, secret, userid, ip, tokens=(), user_data='',\n                 time=None, cookie_name='auth_tkt', secure=False,\n                 hashalg='md5'):\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, self.time, self.secret, self.userid, self.tokens,\n            self.user_data, self.hashalg)\n\n    def cookie_value(self):\n        v = '%s%08x%s!' % (self.digest(), int(self.time),\n                           url_quote(self.userid))\n        if self.tokens:\n            v += self.tokens + '!'\n        v += self.user_data\n        return v\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    def __init__(self, msg, expected=None):\n        self.expected = expected\n        Exception.__init__(self, msg)\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 = 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 = url_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(ip, timestamp, secret,\n                                userid, tokens, user_data, hashalg)\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('Digest signature is not correct',\n                        expected=(expected, digest))\n\n    tokens = tokens.split(',')\n\n    return (timestamp, userid, tokens, user_data)\n\n# this function licensed under the MIT license (stolen from Paste)\ndef calculate_digest(ip, timestamp, secret, userid, tokens, user_data,\n                     hashalg='md5'):\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(ip_timestamp + secret + userid + b'\\0' +\n            tokens + b'\\0' + user_data)\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# 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 = ((t & 0xff000000) >> 24,\n          (t & 0xff0000) >> 16,\n          (t & 0xff00) >> 8,\n          t & 0xff)\n    ts_chars = ''.join(map(chr, ts))\n    return bytes_(ip_chars + ts_chars)\n\nclass AuthTktCookieHelper(object):\n    \"\"\"\n    A helper class for use in third-party authentication policy\n    implementations.  See\n    :class:`pyramid.authentication.AuthTktAuthenticationPolicy` for the\n    meanings of the constructor arguments.\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        long: ('int', str),\n        text_type: ('b64unicode', lambda x: b64encode(utf_8_encode(x)[0])),\n        binary_type: ('b64str', lambda x: b64encode(x)),\n        }\n\n    def __init__(self, secret, cookie_name='auth_tkt', secure=False,\n                 include_ip=False, timeout=None, reissue_time=None,\n                 max_age=None, http_only=False, path=\"/\", wild_domain=True,\n                 hashalg='md5', parent_domain=False, domain=None):\n\n        serializer = _SimpleSerializer()\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=serializer\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\n        self.reissue_time = reissue_time\n        self.max_age = 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        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                # work around https://github.com/Pylons/pyramid/issues#issue/108\n                tokens = list(filter(None, tokens))\n                headers = self.remember(request, userid, max_age=self.max_age,\n                                        tokens=tokens)\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                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        if max_age is None:\n            max_age = self.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            userid = encoder(userid)\n            user_data = 'userid_type:%s' % encoding\n\n        new_tokens = []\n        for token in tokens:\n            if isinstance(token, text_type):\n                try:\n                    token = ascii_native_(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@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.prefix = prefix or ''\n        self.userid_key = prefix + 'userid'\n        self.debug = debug\n\n    def remember(self, request, principal, **kw):\n        \"\"\" Store a principal in the session.\"\"\"\n        request.session[self.userid_key] = principal\n        return []\n\n    def forget(self, request):\n        \"\"\" Remove the stored principal from the session.\"\"\"\n        if self.userid_key in request.session:\n            del request.session[self.userid_key]\n        return []\n\n    def unauthenticated_userid(self, request):\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 to\n       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 basic_challenge(request):\n            response = HTTPUnauthorized()\n            response.headers.update(forget(request))\n            return response\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 = self._get_credentials(request)\n        if credentials:\n            return credentials[0]\n\n    def remember(self, request, principal, **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 _get_credentials winds up\n        # getting called twice when authenticated_userid is called.  Avoiding\n        # that, however, winds up duplicating logic from the superclass.\n        credentials = self._get_credentials(request)\n        if credentials:\n            username, password = credentials\n            return self.check(username, password, request)\n\n    def _get_credentials(self, request):\n        authorization = request.headers.get('Authorization')\n        if not authorization:\n            return None\n        try:\n            authmeth, auth = authorization.split(' ', 1)\n        except ValueError: # not enough values to unpack\n            return None\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        return username, password\n\nclass _SimpleSerializer(object):\n    def loads(self, bstruct):\n        return native_(bstruct)\n\n    def dumps(self, appstruct):\n        return bytes_(appstruct)\n\n",
            "header": {
                "file": {
                    "path": "pyramid/authentication.py"
                },
                "misc_line": null
            },
            "index_line": {
                "old_commit_hash": "ba7b864f9",
                "new_commit_hash": "b84981bbc",
                "mode": "100644"
            },
            "is_binary_file": false,
            "binary_line": null,
            "minus_file": {
                "path": "a/pyramid/authentication.py"
            },
            "plus_file": {
                "path": "b/pyramid/authentication.py"
            },
            "hunks": [
                {
                    "descriptor": {
                        "old_range": {
                            "start": 336,
                            "length": 12
                        },
                        "new_range": {
                            "start": 336,
                            "length": 19
                        },
                        "section": "class RepozeWho1AuthenticationPolicy(CallbackAuthenticationPolicy):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "        return effective_principals",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "    def remember(self, request, principal, **kw):",
                                "type": "context"
                            },
                            {
                                "content": "        \"\"\" Store the ``principal`` as ``repoze.who.userid``.\"\"\"",
                                "type": "deleted"
                            },
                            {
                                "content": "        \"\"\" Store the ``principal`` as ``repoze.who.userid``.",
                                "type": "added"
                            },
                            {
                                "content": "        ",
                                "type": "added"
                            },
                            {
                                "content": "        The identity to authenticated to :mod:`repoze.who`",
                                "type": "added"
                            },
                            {
                                "content": "        will contain the given principal as ``userid``, and",
                                "type": "added"
                            },
                            {
                                "content": "        provide all keyword arguments as additional identity",
                                "type": "added"
                            },
                            {
                                "content": "        keys. Useful keys could be ``max_age`` or ``userdata``.",
                                "type": "added"
                            },
                            {
                                "content": "        \"\"\"",
                                "type": "added"
                            },
                            {
                                "content": "        identifier = self._get_identifier(request)",
                                "type": "context"
                            },
                            {
                                "content": "        if identifier is None:",
                                "type": "context"
                            },
                            {
                                "content": "            return []",
                                "type": "context"
                            },
                            {
                                "content": "        environ = request.environ",
                                "type": "context"
                            },
                            {
                                "content": "        identity = {'repoze.who.userid':principal}",
                                "type": "deleted"
                            },
                            {
                                "content": "        identity = kw",
                                "type": "added"
                            },
                            {
                                "content": "        identity['repoze.who.userid'] = principal",
                                "type": "added"
                            },
                            {
                                "content": "        return identifier.remember(environ, identity)",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "    def forget(self, request):",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [
                        {
                            "file_name": "pyramid/authentication.py",
                            "type": "class",
                            "name": "RepozeWho1AuthenticationPolicy",
                            "content": "class 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            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            return None\n            \n        if self._clean_principal(userid) is None:\n            self.debug and self._log(\n                ('use of userid %r is disallowed by any built-in Pyramid '\n                 'security policy, returning None' % userid),\n                'authenticated_userid',\n                request)\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.security.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.security.Authenticated`, the ``authenticated_userid``\n        and the list of principals returned by the ``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                ('repoze.who identity was None; returning %r' %\n                 effective_principals),\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                ('security policy groups callback returned None; returning %r' %\n                 effective_principals),\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                ('repoze.who.userid was None; returning %r' %\n                 effective_principals),\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                ('unauthenticated_userid returned disallowed %r; returning %r '\n                 'as if it was None' % (userid, 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        return effective_principals\n\n    def remember(self, request, principal, **kw):\n        \"\"\" Store the ``principal`` as ``repoze.who.userid``.\"\"\"\n        identifier = self._get_identifier(request)\n        if identifier is None:\n            return []\n        environ = request.environ\n        identity = {'repoze.who.userid':principal}\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)",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 186,
                            "end_lineno": 358,
                            "parent": null
                        },
                        {
                            "file_name": "pyramid/authentication.py",
                            "type": "method",
                            "name": "RepozeWho1AuthenticationPolicy.remember",
                            "content": "class 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            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            return None\n            \n        if self._clean_principal(userid) is None:\n            self.debug and self._log(\n                ('use of userid %r is disallowed by any built-in Pyramid '\n                 'security policy, returning None' % userid),\n                'authenticated_userid',\n                request)\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.security.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.security.Authenticated`, the ``authenticated_userid``\n        and the list of principals returned by the ``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                ('repoze.who identity was None; returning %r' %\n                 effective_principals),\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                ('security policy groups callback returned None; returning %r' %\n                 effective_principals),\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                ('repoze.who.userid was None; returning %r' %\n                 effective_principals),\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                ('unauthenticated_userid returned disallowed %r; returning %r '\n                 'as if it was None' % (userid, 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        return effective_principals\n\n    def remember(self, request, principal, **kw):\n        \"\"\" Store the ``principal`` as ``repoze.who.userid``.\"\"\"\n        identifier = self._get_identifier(request)\n        if identifier is None:\n            return []\n        environ = request.environ\n        identity = {'repoze.who.userid':principal}\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)",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 338,
                            "end_lineno": 345,
                            "parent": {
                                "file_name": "pyramid/authentication.py",
                                "type": "class",
                                "name": "RepozeWho1AuthenticationPolicy",
                                "content": "class 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            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            return None\n            \n        if self._clean_principal(userid) is None:\n            self.debug and self._log(\n                ('use of userid %r is disallowed by any built-in Pyramid '\n                 'security policy, returning None' % userid),\n                'authenticated_userid',\n                request)\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.security.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.security.Authenticated`, the ``authenticated_userid``\n        and the list of principals returned by the ``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                ('repoze.who identity was None; returning %r' %\n                 effective_principals),\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                ('security policy groups callback returned None; returning %r' %\n                 effective_principals),\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                ('repoze.who.userid was None; returning %r' %\n                 effective_principals),\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                ('unauthenticated_userid returned disallowed %r; returning %r '\n                 'as if it was None' % (userid, 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        return effective_principals\n\n    def remember(self, request, principal, **kw):\n        \"\"\" Store the ``principal`` as ``repoze.who.userid``.\"\"\"\n        identifier = self._get_identifier(request)\n        if identifier is None:\n            return []\n        environ = request.environ\n        identity = {'repoze.who.userid':principal}\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)",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 186,
                                "end_lineno": 358,
                                "parent": null
                            }
                        }
                    ],
                    "added_entities": [],
                    "deleted_entities": []
                }
            ]
        },
        {
            "old_file_content": "import unittest\nimport warnings\nfrom pyramid import testing\nfrom pyramid.compat import (\n    text_,\n    bytes_,\n    )\n\nclass TestCallbackAuthenticationPolicyDebugging(unittest.TestCase):\n    def setUp(self):\n        from pyramid.interfaces import IDebugLogger\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        class MyAuthenticationPolicy(CallbackAuthenticationPolicy):\n            def unauthenticated_userid(self, request):\n                return userid\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            'pyramid.tests.test_authentication.MyAuthenticationPolicy.'\n            'authenticated_userid: call to unauthenticated_userid returned '\n            'None; returning None')\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             \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"authenticated_userid: there was no groupfinder callback; \"\n            \"returning 'fred'\")\n\n    def test_authenticated_userid_with_callback_fail(self):\n        request = DummyRequest(registry=self.config.registry)\n        def callback(userid, request):\n            return None\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            'pyramid.tests.test_authentication.MyAuthenticationPolicy.'\n            'authenticated_userid: groupfinder callback returned None; '\n            'returning None')\n\n    def test_authenticated_userid_with_callback_success(self):\n        request = DummyRequest(registry=self.config.registry)\n        def callback(userid, request):\n            return []\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            \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"authenticated_userid: groupfinder callback returned []; \"\n            \"returning 'fred'\")\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            \"pyramid.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    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            \"pyramid.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    def test_effective_principals_no_unauthenticated_userid(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request),\n                         ['system.Everyone'])\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: unauthenticated_userid returned None; \"\n            \"returning ['system.Everyone']\")\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        self.assertEqual(len(self.messages), 2)\n        self.assertEqual(\n            self.messages[0],\n            'pyramid.tests.test_authentication.MyAuthenticationPolicy.'\n            'effective_principals: groupfinder callback is None, so groups '\n            'is []')\n        self.assertEqual(\n            self.messages[1],\n            \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: returning effective principals: \"\n            \"['system.Everyone', 'system.Authenticated', 'fred']\")\n\n    def test_effective_principals_with_callback_fail(self):\n        request = DummyRequest(registry=self.config.registry)\n        def callback(userid, request):\n            return None\n        policy = self._makeOne(userid='fred', callback=callback)\n        self.assertEqual(\n            policy.effective_principals(request), ['system.Everyone'])\n        self.assertEqual(len(self.messages), 2)\n        self.assertEqual(\n            self.messages[0],\n            'pyramid.tests.test_authentication.MyAuthenticationPolicy.'\n            'effective_principals: groupfinder callback returned None as '\n            'groups')\n        self.assertEqual(\n            self.messages[1],\n            \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: returning effective principals: \"\n            \"['system.Everyone']\")\n\n    def test_effective_principals_with_callback_success(self):\n        request = DummyRequest(registry=self.config.registry)\n        def callback(userid, request):\n            return []\n        policy = self._makeOne(userid='fred', callback=callback)\n        self.assertEqual(\n            policy.effective_principals(request),\n            ['system.Everyone', 'system.Authenticated', 'fred'])\n        self.assertEqual(len(self.messages), 2)\n        self.assertEqual(\n            self.messages[0],\n            'pyramid.tests.test_authentication.MyAuthenticationPolicy.'\n            'effective_principals: groupfinder callback returned [] as groups')\n        self.assertEqual(\n            self.messages[1],\n            \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: returning effective principals: \"\n            \"['system.Everyone', 'system.Authenticated', 'fred']\")\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),\n            ['system.Everyone'])\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            \"pyramid.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    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),\n            ['system.Everyone'])\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: unauthenticated_userid returned disallowed \"\n            \"'system.Everyone'; returning ['system.Everyone'] as if it \"\n            \"was None\")\n\nclass TestRepozeWho1AuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import RepozeWho1AuthenticationPolicy\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        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        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        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        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        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        def callback(identity, request):\n            return None\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        def callback(identity, request):\n            return ['agroup']\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            {'repoze.who.identity':{'repoze.who.userid':'system.Authenticated'}}\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.security import Everyone\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.security import Everyone\n        from pyramid.security import Authenticated\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'fred'}})\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request),\n                         [Everyone, Authenticated, 'fred'])\n\n    def test_effective_principals_userid_and_groups(self):\n        from pyramid.security import Everyone\n        from pyramid.security import Authenticated\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'fred',\n                                    'groups':['quux', 'biz']}})\n        def callback(identity, request):\n            return identity['groups']\n        policy = self._makeOne(callback=callback)\n        self.assertEqual(policy.effective_principals(request),\n                         [Everyone, Authenticated, 'fred', 'quux', 'biz'])\n\n    def test_effective_principals_userid_callback_returns_None(self):\n        from pyramid.security import Everyone\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'fred',\n                                    'groups':['quux', 'biz']}})\n        def callback(identity, request):\n            return None\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.security import Everyone\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.security import Everyone\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        from pyramid.security import Everyone\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'system.Authenticated'}}\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(\n            {'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_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            {'repoze.who.plugins':{'auth_tkt':authtkt},\n             'repoze.who.identity':{'repoze.who.userid':'fred'},\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\nclass TestRemoteUserAuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import RemoteUserAuthenticationPolicy\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        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        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.security import Everyone\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.security import Everyone\n        from pyramid.security import Authenticated\n        request = DummyRequest({'REMOTE_USER':'fred'})\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request),\n                         [Everyone, Authenticated, 'fred'])\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\nclass TestAuthTktAuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import AuthTktAuthenticationPolicy\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', callback=None, cookie_name=None, secure=False,\n            include_ip=False, timeout=None, reissue_time=None,\n            hashalg='sha512',\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        def callback(userid, request):\n            return None\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        def callback(userid, request):\n            return True\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.security import Everyone\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.security import Everyone\n        request = DummyRequest({})\n        def callback(userid, request):\n            return None\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.security import Everyone\n        from pyramid.security import Authenticated\n        request = DummyRequest({})\n        def callback(userid, request):\n            return ['group.foo']\n        policy = self._makeOne(callback, {'userid':'fred'})\n        self.assertEqual(policy.effective_principals(request),\n                             [Everyone, Authenticated, 'fred', 'group.foo'])\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        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        verifyObject(IAuthenticationPolicy, self._makeOne(None, None))\n\nclass TestAuthTktCookieHelper(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import AuthTktCookieHelper\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        from pyramid.compat import SimpleCookie\n        cookies = SimpleCookie()\n        cookies.load(cookie)\n        return cookies.get('auth_tkt')\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        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        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_timed_out(self):\n        helper = self._makeOne('secret', timeout=1)\n        request = self._makeRequest({'HTTP_COOKIE':'auth_tkt=bogus'})\n        result = helper.identify(request)\n        self.assertEqual(result, None)\n\n    def test_identify_cookie_reissue(self):\n        import time\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        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        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        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        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        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=/'))\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=/'))\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_path(self):\n        helper = self._makeOne('secret', include_ip=True,\n                               path=\"/cgi-bin/app.cgi/\")\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=/cgi-bin/app.cgi/'))\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(\n            '; Domain=localhost; Path=/cgi-bin/app.cgi/'))\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(\n            '; Domain=.localhost; Path=/cgi-bin/app.cgi/'))\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'))\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=/'))\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    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(result[0][1].endswith('; Domain=.example.com; Path=/'))\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(result[0][1].endswith('; Domain=.example.com; Path=/'))\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(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\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('secret', domain='pyramid.bazinga',\n                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(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n\n    def test_remember_binary_userid(self):\n        import base64\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(val['userid'],\n                         text_(base64.b64encode(b'userid').strip()))\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_long_userid(self):\n        from pyramid.compat import long\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, long(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        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(val['userid'],\n                         text_(base64.b64encode(userid.encode('utf-8'))))\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        result = helper.remember(request, userid)\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_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_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(ValueError, helper.remember, request, 'other',\n                          tokens=(la,))\n\n    def test_remember_invalid_token_format(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('foo bar',))\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('1bar',))\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'\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'\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'\n            )\n\nclass TestAuthTicket(unittest.TestCase):\n    def _makeOne(self, *arg, **kw):\n        from pyramid.authentication import AuthTicket\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('secret', 'userid', '0.0.0.0',\n                               time=10, hashalg='sha512')\n        result = ticket.digest()\n        self.assertEqual(result, '74770b2e0d5b1a54c2a466ec567a40f7d7823576aa49'\\\n                                 '3c65fc3445e9b44097f4a80410319ef8cb256a2e60b9'\\\n                                 'c2002e48a9e33a3e8ee4379352c04ef96d2cb278')\n\n    def test_cookie_value(self):\n        ticket = self._makeOne('secret', 'userid', '0.0.0.0', time=10,\n                               tokens=('a', 'b'))\n        result = ticket.cookie_value()\n        self.assertEqual(result,\n                         '66f9cc3e423dc57c91df696cf3d1f0d80000000auserid!a,b!')\n\n    def test_ipv4(self):\n        ticket = self._makeOne('secret', 'userid', '198.51.100.1',\n                               time=10, hashalg='sha256')\n        result = ticket.cookie_value()\n        self.assertEqual(result, 'b3e7156db4f8abde4439c4a6499a0668f9e7ffd7fa27b'\\\n                                 '798400ecdade8d76c530000000auserid!')\n\n    def test_ipv6(self):\n        ticket = self._makeOne('secret', 'userid', '2001:db8::1',\n                               time=10, hashalg='sha256')\n        result = ticket.cookie_value()\n        self.assertEqual(result, 'd025b601a0f12ca6d008aa35ff3a22b7d8f3d1c1456c8'\\\n                                 '5becf8760cd7a2fa4910000000auserid!')\n\nclass TestBadTicket(unittest.TestCase):\n    def _makeOne(self, msg, expected=None):\n        from pyramid.authentication import BadTicket\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\nclass Test_parse_ticket(unittest.TestCase):\n    def _callFUT(self, secret, ticket, ip, hashalg='md5'):\n        from pyramid.authentication import parse_ticket\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        self.assertRaises(BadTicket,self._callFUT, secret, ticket, ip, hashalg)\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 = '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 = '7d947cdef99bad55f8e3382a8bd089bb9dd0547f7925b7d189adc1160cab'\\\n                 '0ec0e6888faa41eba641a18522b26f19109f3ffafb769767ba8a26d02aae'\\\n                 'ae56599a0000000auserid!a,b!'\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 = 'b3e7156db4f8abde4439c4a6499a0668f9e7ffd7fa27b798400ecdade8d7'\\\n                 '6c530000000auserid!'\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 = 'd025b601a0f12ca6d008aa35ff3a22b7d8f3d1c1456c85becf8760cd7a2f'\\\n                 'a4910000000auserid!'\n        result = self._callFUT('secret', ticket, '2001:db8::1', 'sha256')\n        self.assertEqual(result, (10, 'userid', [''], ''))\n        pass\n\nclass TestSessionAuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import SessionAuthenticationPolicy\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        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        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        def callback(userid, request):\n            return None\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        def callback(userid, request):\n            return True\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.security import Everyone\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.security import Everyone\n        request = DummyRequest(session={'userid':'fred'})\n        def callback(userid, request):\n            return None\n        policy = self._makeOne(callback)\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals(self):\n        from pyramid.security import Everyone\n        from pyramid.security import Authenticated\n        request = DummyRequest(session={'userid':'fred'})\n        def callback(userid, request):\n            return ['group.foo']\n        policy = self._makeOne(callback)\n        self.assertEqual(policy.effective_principals(request),\n                         [Everyone, Authenticated, 'fred', 'group.foo'])\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\nclass TestBasicAuthAuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import BasicAuthAuthenticationPolicy as cls\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        verifyClass(IAuthenticationPolicy, self._getTargetClass())\n\n    def test_unauthenticated_userid(self):\n        import base64\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Basic %s' % base64.b64encode(\n            bytes_('chrisr:password')).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        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Basic %s' % base64.b64encode(\n            bytes_('chrisr:password')).decode('ascii')\n        def check(username, password, request):\n            return []\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        request = testing.DummyRequest()\n        inputs = (b'm\\xc3\\xb6rk\\xc3\\xb6:'\n                  b'm\\xc3\\xb6rk\\xc3\\xb6password').decode('utf-8')\n        request.headers['Authorization'] = 'Basic %s' % (\n            base64.b64encode(inputs.encode('utf-8')).decode('latin-1'))\n        def check(username, password, request):\n            return []\n        policy = self._makeOne(check)\n        self.assertEqual(policy.authenticated_userid(request),\n                         b'm\\xc3\\xb6rk\\xc3\\xb6'.decode('utf-8'))\n\n    def test_authenticated_userid_latin1(self):\n        import base64\n        request = testing.DummyRequest()\n        inputs = (b'm\\xc3\\xb6rk\\xc3\\xb6:'\n                  b'm\\xc3\\xb6rk\\xc3\\xb6password').decode('utf-8')\n        request.headers['Authorization'] = 'Basic %s' % (\n            base64.b64encode(inputs.encode('latin-1')).decode('latin-1'))\n        def check(username, password, request):\n            return []\n        policy = self._makeOne(check)\n        self.assertEqual(policy.authenticated_userid(request),\n                         b'm\\xc3\\xb6rk\\xc3\\xb6'.decode('utf-8'))\n\n    def test_unauthenticated_userid_invalid_payload(self):\n        import base64\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Basic %s' % base64.b64encode(\n            bytes_('chrisrpassword')).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(policy.forget(None), [\n            ('WWW-Authenticate', 'Basic realm=\"SomeRealm\"')])\n\nclass TestSimpleSerializer(unittest.TestCase):\n    def _makeOne(self):\n        from pyramid.authentication import _SimpleSerializer\n        return _SimpleSerializer()\n\n    def test_loads(self):\n        inst = self._makeOne()\n        self.assertEqual(inst.loads(b'abc'), text_('abc'))\n\n    def test_dumps(self):\n        inst = self._makeOne()\n        self.assertEqual(inst.dumps('abc'), bytes_('abc'))\n        \nclass DummyContext:\n    pass\n\nclass DummyCookies(object):\n    def __init__(self, cookie):\n        self.cookie = cookie\n\n    def get(self, name):\n        return self.cookie\n\nclass DummyRequest:\n    domain = 'localhost'\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\nclass DummyWhoPlugin:\n    def remember(self, environ, identity):\n        return environ, identity\n\n    def forget(self, environ, identity):\n        return environ, identity\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\nclass DummyAuthTktModule(object):\n    def __init__(self, timestamp=0, userid='userid', tokens=(), user_data='',\n                 parse_raise=False, hashalg=\"md5\"):\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        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        self.parse_ticket = parse_ticket\n\n        class AuthTicket(object):\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        self.AuthTicket = AuthTicket\n\n    class BadTicket(Exception):\n        pass\n\nclass DummyResponse:\n    def __init__(self):\n        self.headerlist = []\n\n",
            "new_file_content": "import unittest\nimport warnings\nfrom pyramid import testing\nfrom pyramid.compat import (\n    text_,\n    bytes_,\n    )\n\nclass TestCallbackAuthenticationPolicyDebugging(unittest.TestCase):\n    def setUp(self):\n        from pyramid.interfaces import IDebugLogger\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        class MyAuthenticationPolicy(CallbackAuthenticationPolicy):\n            def unauthenticated_userid(self, request):\n                return userid\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            'pyramid.tests.test_authentication.MyAuthenticationPolicy.'\n            'authenticated_userid: call to unauthenticated_userid returned '\n            'None; returning None')\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             \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"authenticated_userid: there was no groupfinder callback; \"\n            \"returning 'fred'\")\n\n    def test_authenticated_userid_with_callback_fail(self):\n        request = DummyRequest(registry=self.config.registry)\n        def callback(userid, request):\n            return None\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            'pyramid.tests.test_authentication.MyAuthenticationPolicy.'\n            'authenticated_userid: groupfinder callback returned None; '\n            'returning None')\n\n    def test_authenticated_userid_with_callback_success(self):\n        request = DummyRequest(registry=self.config.registry)\n        def callback(userid, request):\n            return []\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            \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"authenticated_userid: groupfinder callback returned []; \"\n            \"returning 'fred'\")\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            \"pyramid.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    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            \"pyramid.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    def test_effective_principals_no_unauthenticated_userid(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request),\n                         ['system.Everyone'])\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: unauthenticated_userid returned None; \"\n            \"returning ['system.Everyone']\")\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        self.assertEqual(len(self.messages), 2)\n        self.assertEqual(\n            self.messages[0],\n            'pyramid.tests.test_authentication.MyAuthenticationPolicy.'\n            'effective_principals: groupfinder callback is None, so groups '\n            'is []')\n        self.assertEqual(\n            self.messages[1],\n            \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: returning effective principals: \"\n            \"['system.Everyone', 'system.Authenticated', 'fred']\")\n\n    def test_effective_principals_with_callback_fail(self):\n        request = DummyRequest(registry=self.config.registry)\n        def callback(userid, request):\n            return None\n        policy = self._makeOne(userid='fred', callback=callback)\n        self.assertEqual(\n            policy.effective_principals(request), ['system.Everyone'])\n        self.assertEqual(len(self.messages), 2)\n        self.assertEqual(\n            self.messages[0],\n            'pyramid.tests.test_authentication.MyAuthenticationPolicy.'\n            'effective_principals: groupfinder callback returned None as '\n            'groups')\n        self.assertEqual(\n            self.messages[1],\n            \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: returning effective principals: \"\n            \"['system.Everyone']\")\n\n    def test_effective_principals_with_callback_success(self):\n        request = DummyRequest(registry=self.config.registry)\n        def callback(userid, request):\n            return []\n        policy = self._makeOne(userid='fred', callback=callback)\n        self.assertEqual(\n            policy.effective_principals(request),\n            ['system.Everyone', 'system.Authenticated', 'fred'])\n        self.assertEqual(len(self.messages), 2)\n        self.assertEqual(\n            self.messages[0],\n            'pyramid.tests.test_authentication.MyAuthenticationPolicy.'\n            'effective_principals: groupfinder callback returned [] as groups')\n        self.assertEqual(\n            self.messages[1],\n            \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: returning effective principals: \"\n            \"['system.Everyone', 'system.Authenticated', 'fred']\")\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),\n            ['system.Everyone'])\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            \"pyramid.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    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),\n            ['system.Everyone'])\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: unauthenticated_userid returned disallowed \"\n            \"'system.Everyone'; returning ['system.Everyone'] as if it \"\n            \"was None\")\n\nclass TestRepozeWho1AuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import RepozeWho1AuthenticationPolicy\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        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        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        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        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        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        def callback(identity, request):\n            return None\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        def callback(identity, request):\n            return ['agroup']\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            {'repoze.who.identity':{'repoze.who.userid':'system.Authenticated'}}\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.security import Everyone\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.security import Everyone\n        from pyramid.security import Authenticated\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'fred'}})\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request),\n                         [Everyone, Authenticated, 'fred'])\n\n    def test_effective_principals_userid_and_groups(self):\n        from pyramid.security import Everyone\n        from pyramid.security import Authenticated\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'fred',\n                                    'groups':['quux', 'biz']}})\n        def callback(identity, request):\n            return identity['groups']\n        policy = self._makeOne(callback=callback)\n        self.assertEqual(policy.effective_principals(request),\n                         [Everyone, Authenticated, 'fred', 'quux', 'biz'])\n\n    def test_effective_principals_userid_callback_returns_None(self):\n        from pyramid.security import Everyone\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'fred',\n                                    'groups':['quux', 'biz']}})\n        def callback(identity, request):\n            return None\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.security import Everyone\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.security import Everyone\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        from pyramid.security import Everyone\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'system.Authenticated'}}\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(\n            {'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(\n            {'repoze.who.plugins':{'auth_tkt':authtkt}})\n        policy = self._makeOne()\n        result = policy.remember(request, 'fred', max_age=23)\n        self.assertEqual(result[1], {'repoze.who.userid':'fred', 'max_age': 23})\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            {'repoze.who.plugins':{'auth_tkt':authtkt},\n             'repoze.who.identity':{'repoze.who.userid':'fred'},\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\nclass TestRemoteUserAuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import RemoteUserAuthenticationPolicy\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        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        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.security import Everyone\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.security import Everyone\n        from pyramid.security import Authenticated\n        request = DummyRequest({'REMOTE_USER':'fred'})\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request),\n                         [Everyone, Authenticated, 'fred'])\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\nclass TestAuthTktAuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import AuthTktAuthenticationPolicy\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', callback=None, cookie_name=None, secure=False,\n            include_ip=False, timeout=None, reissue_time=None,\n            hashalg='sha512',\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        def callback(userid, request):\n            return None\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        def callback(userid, request):\n            return True\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.security import Everyone\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.security import Everyone\n        request = DummyRequest({})\n        def callback(userid, request):\n            return None\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.security import Everyone\n        from pyramid.security import Authenticated\n        request = DummyRequest({})\n        def callback(userid, request):\n            return ['group.foo']\n        policy = self._makeOne(callback, {'userid':'fred'})\n        self.assertEqual(policy.effective_principals(request),\n                             [Everyone, Authenticated, 'fred', 'group.foo'])\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        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        verifyObject(IAuthenticationPolicy, self._makeOne(None, None))\n\nclass TestAuthTktCookieHelper(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import AuthTktCookieHelper\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        from pyramid.compat import SimpleCookie\n        cookies = SimpleCookie()\n        cookies.load(cookie)\n        return cookies.get('auth_tkt')\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        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        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_timed_out(self):\n        helper = self._makeOne('secret', timeout=1)\n        request = self._makeRequest({'HTTP_COOKIE':'auth_tkt=bogus'})\n        result = helper.identify(request)\n        self.assertEqual(result, None)\n\n    def test_identify_cookie_reissue(self):\n        import time\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        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        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        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        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        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=/'))\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=/'))\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_path(self):\n        helper = self._makeOne('secret', include_ip=True,\n                               path=\"/cgi-bin/app.cgi/\")\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=/cgi-bin/app.cgi/'))\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(\n            '; Domain=localhost; Path=/cgi-bin/app.cgi/'))\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(\n            '; Domain=.localhost; Path=/cgi-bin/app.cgi/'))\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'))\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=/'))\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    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(result[0][1].endswith('; Domain=.example.com; Path=/'))\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(result[0][1].endswith('; Domain=.example.com; Path=/'))\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(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\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('secret', domain='pyramid.bazinga',\n                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(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n\n    def test_remember_binary_userid(self):\n        import base64\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(val['userid'],\n                         text_(base64.b64encode(b'userid').strip()))\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_long_userid(self):\n        from pyramid.compat import long\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, long(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        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(val['userid'],\n                         text_(base64.b64encode(userid.encode('utf-8'))))\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        result = helper.remember(request, userid)\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_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_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(ValueError, helper.remember, request, 'other',\n                          tokens=(la,))\n\n    def test_remember_invalid_token_format(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('foo bar',))\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('1bar',))\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'\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'\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'\n            )\n\nclass TestAuthTicket(unittest.TestCase):\n    def _makeOne(self, *arg, **kw):\n        from pyramid.authentication import AuthTicket\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('secret', 'userid', '0.0.0.0',\n                               time=10, hashalg='sha512')\n        result = ticket.digest()\n        self.assertEqual(result, '74770b2e0d5b1a54c2a466ec567a40f7d7823576aa49'\\\n                                 '3c65fc3445e9b44097f4a80410319ef8cb256a2e60b9'\\\n                                 'c2002e48a9e33a3e8ee4379352c04ef96d2cb278')\n\n    def test_cookie_value(self):\n        ticket = self._makeOne('secret', 'userid', '0.0.0.0', time=10,\n                               tokens=('a', 'b'))\n        result = ticket.cookie_value()\n        self.assertEqual(result,\n                         '66f9cc3e423dc57c91df696cf3d1f0d80000000auserid!a,b!')\n\n    def test_ipv4(self):\n        ticket = self._makeOne('secret', 'userid', '198.51.100.1',\n                               time=10, hashalg='sha256')\n        result = ticket.cookie_value()\n        self.assertEqual(result, 'b3e7156db4f8abde4439c4a6499a0668f9e7ffd7fa27b'\\\n                                 '798400ecdade8d76c530000000auserid!')\n\n    def test_ipv6(self):\n        ticket = self._makeOne('secret', 'userid', '2001:db8::1',\n                               time=10, hashalg='sha256')\n        result = ticket.cookie_value()\n        self.assertEqual(result, 'd025b601a0f12ca6d008aa35ff3a22b7d8f3d1c1456c8'\\\n                                 '5becf8760cd7a2fa4910000000auserid!')\n\nclass TestBadTicket(unittest.TestCase):\n    def _makeOne(self, msg, expected=None):\n        from pyramid.authentication import BadTicket\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\nclass Test_parse_ticket(unittest.TestCase):\n    def _callFUT(self, secret, ticket, ip, hashalg='md5'):\n        from pyramid.authentication import parse_ticket\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        self.assertRaises(BadTicket,self._callFUT, secret, ticket, ip, hashalg)\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 = '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 = '7d947cdef99bad55f8e3382a8bd089bb9dd0547f7925b7d189adc1160cab'\\\n                 '0ec0e6888faa41eba641a18522b26f19109f3ffafb769767ba8a26d02aae'\\\n                 'ae56599a0000000auserid!a,b!'\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 = 'b3e7156db4f8abde4439c4a6499a0668f9e7ffd7fa27b798400ecdade8d7'\\\n                 '6c530000000auserid!'\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 = 'd025b601a0f12ca6d008aa35ff3a22b7d8f3d1c1456c85becf8760cd7a2f'\\\n                 'a4910000000auserid!'\n        result = self._callFUT('secret', ticket, '2001:db8::1', 'sha256')\n        self.assertEqual(result, (10, 'userid', [''], ''))\n        pass\n\nclass TestSessionAuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import SessionAuthenticationPolicy\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        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        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        def callback(userid, request):\n            return None\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        def callback(userid, request):\n            return True\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.security import Everyone\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.security import Everyone\n        request = DummyRequest(session={'userid':'fred'})\n        def callback(userid, request):\n            return None\n        policy = self._makeOne(callback)\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals(self):\n        from pyramid.security import Everyone\n        from pyramid.security import Authenticated\n        request = DummyRequest(session={'userid':'fred'})\n        def callback(userid, request):\n            return ['group.foo']\n        policy = self._makeOne(callback)\n        self.assertEqual(policy.effective_principals(request),\n                         [Everyone, Authenticated, 'fred', 'group.foo'])\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\nclass TestBasicAuthAuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import BasicAuthAuthenticationPolicy as cls\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        verifyClass(IAuthenticationPolicy, self._getTargetClass())\n\n    def test_unauthenticated_userid(self):\n        import base64\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Basic %s' % base64.b64encode(\n            bytes_('chrisr:password')).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        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Basic %s' % base64.b64encode(\n            bytes_('chrisr:password')).decode('ascii')\n        def check(username, password, request):\n            return []\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        request = testing.DummyRequest()\n        inputs = (b'm\\xc3\\xb6rk\\xc3\\xb6:'\n                  b'm\\xc3\\xb6rk\\xc3\\xb6password').decode('utf-8')\n        request.headers['Authorization'] = 'Basic %s' % (\n            base64.b64encode(inputs.encode('utf-8')).decode('latin-1'))\n        def check(username, password, request):\n            return []\n        policy = self._makeOne(check)\n        self.assertEqual(policy.authenticated_userid(request),\n                         b'm\\xc3\\xb6rk\\xc3\\xb6'.decode('utf-8'))\n\n    def test_authenticated_userid_latin1(self):\n        import base64\n        request = testing.DummyRequest()\n        inputs = (b'm\\xc3\\xb6rk\\xc3\\xb6:'\n                  b'm\\xc3\\xb6rk\\xc3\\xb6password').decode('utf-8')\n        request.headers['Authorization'] = 'Basic %s' % (\n            base64.b64encode(inputs.encode('latin-1')).decode('latin-1'))\n        def check(username, password, request):\n            return []\n        policy = self._makeOne(check)\n        self.assertEqual(policy.authenticated_userid(request),\n                         b'm\\xc3\\xb6rk\\xc3\\xb6'.decode('utf-8'))\n\n    def test_unauthenticated_userid_invalid_payload(self):\n        import base64\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Basic %s' % base64.b64encode(\n            bytes_('chrisrpassword')).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(policy.forget(None), [\n            ('WWW-Authenticate', 'Basic realm=\"SomeRealm\"')])\n\nclass TestSimpleSerializer(unittest.TestCase):\n    def _makeOne(self):\n        from pyramid.authentication import _SimpleSerializer\n        return _SimpleSerializer()\n\n    def test_loads(self):\n        inst = self._makeOne()\n        self.assertEqual(inst.loads(b'abc'), text_('abc'))\n\n    def test_dumps(self):\n        inst = self._makeOne()\n        self.assertEqual(inst.dumps('abc'), bytes_('abc'))\n        \nclass DummyContext:\n    pass\n\nclass DummyCookies(object):\n    def __init__(self, cookie):\n        self.cookie = cookie\n\n    def get(self, name):\n        return self.cookie\n\nclass DummyRequest:\n    domain = 'localhost'\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\nclass DummyWhoPlugin:\n    def remember(self, environ, identity):\n        return environ, identity\n\n    def forget(self, environ, identity):\n        return environ, identity\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\nclass DummyAuthTktModule(object):\n    def __init__(self, timestamp=0, userid='userid', tokens=(), user_data='',\n                 parse_raise=False, hashalg=\"md5\"):\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        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        self.parse_ticket = parse_ticket\n\n        class AuthTicket(object):\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        self.AuthTicket = AuthTicket\n\n    class BadTicket(Exception):\n        pass\n\nclass DummyResponse:\n    def __init__(self):\n        self.headerlist = []\n\n",
            "header": {
                "file": {
                    "path": "pyramid/tests/test_authentication.py"
                },
                "misc_line": null
            },
            "index_line": {
                "old_commit_hash": "79d2a5923",
                "new_commit_hash": "e25e9faa1",
                "mode": "100644"
            },
            "is_binary_file": false,
            "binary_line": null,
            "minus_file": {
                "path": "a/pyramid/tests/test_authentication.py"
            },
            "plus_file": {
                "path": "b/pyramid/tests/test_authentication.py"
            },
            "hunks": [
                {
                    "descriptor": {
                        "old_range": {
                            "start": 350,
                            "length": 6
                        },
                        "new_range": {
                            "start": 350,
                            "length": 14
                        },
                        "section": "class TestRepozeWho1AuthenticationPolicy(unittest.TestCase):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "        self.assertEqual(result[0], request.environ)",
                                "type": "context"
                            },
                            {
                                "content": "        self.assertEqual(result[1], {'repoze.who.userid':'fred'})",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "    def test_remember_kwargs(self):",
                                "type": "added"
                            },
                            {
                                "content": "        authtkt = DummyWhoPlugin()",
                                "type": "added"
                            },
                            {
                                "content": "        request = DummyRequest(",
                                "type": "added"
                            },
                            {
                                "content": "            {'repoze.who.plugins':{'auth_tkt':authtkt}})",
                                "type": "added"
                            },
                            {
                                "content": "        policy = self._makeOne()",
                                "type": "added"
                            },
                            {
                                "content": "        result = policy.remember(request, 'fred', max_age=23)",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertEqual(result[1], {'repoze.who.userid':'fred', 'max_age': 23})",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "    def test_forget_no_plugins(self):",
                                "type": "context"
                            },
                            {
                                "content": "        request = DummyRequest({})",
                                "type": "context"
                            },
                            {
                                "content": "        policy = self._makeOne()",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [
                        {
                            "file_name": "pyramid/tests/test_authentication.py",
                            "type": "class",
                            "name": "TestRepozeWho1AuthenticationPolicy",
                            "content": "class TestRepozeWho1AuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import RepozeWho1AuthenticationPolicy\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        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        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        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        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        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        def callback(identity, request):\n            return None\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        def callback(identity, request):\n            return ['agroup']\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            {'repoze.who.identity':{'repoze.who.userid':'system.Authenticated'}}\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.security import Everyone\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.security import Everyone\n        from pyramid.security import Authenticated\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'fred'}})\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request),\n                         [Everyone, Authenticated, 'fred'])\n\n    def test_effective_principals_userid_and_groups(self):\n        from pyramid.security import Everyone\n        from pyramid.security import Authenticated\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'fred',\n                                    'groups':['quux', 'biz']}})\n        def callback(identity, request):\n            return identity['groups']\n        policy = self._makeOne(callback=callback)\n        self.assertEqual(policy.effective_principals(request),\n                         [Everyone, Authenticated, 'fred', 'quux', 'biz'])\n\n    def test_effective_principals_userid_callback_returns_None(self):\n        from pyramid.security import Everyone\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'fred',\n                                    'groups':['quux', 'biz']}})\n        def callback(identity, request):\n            return None\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.security import Everyone\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.security import Everyone\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        from pyramid.security import Everyone\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'system.Authenticated'}}\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(\n            {'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(\n            {'repoze.who.plugins':{'auth_tkt':authtkt}})\n        policy = self._makeOne()\n        result = policy.remember(request, 'fred', max_age=23)\n        self.assertEqual(result[1], {'repoze.who.userid':'fred', 'max_age': 23})\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            {'repoze.who.plugins':{'auth_tkt':authtkt},\n             'repoze.who.identity':{'repoze.who.userid':'fred'},\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'])",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 200,
                            "end_lineno": 376,
                            "parent": null
                        }
                    ],
                    "added_entities": [
                        {
                            "file_name": "pyramid/tests/test_authentication.py",
                            "type": "method",
                            "name": "TestRepozeWho1AuthenticationPolicy.test_remember_kwargs",
                            "content": "class TestRepozeWho1AuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import RepozeWho1AuthenticationPolicy\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        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        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        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        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        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        def callback(identity, request):\n            return None\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        def callback(identity, request):\n            return ['agroup']\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            {'repoze.who.identity':{'repoze.who.userid':'system.Authenticated'}}\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.security import Everyone\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.security import Everyone\n        from pyramid.security import Authenticated\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'fred'}})\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request),\n                         [Everyone, Authenticated, 'fred'])\n\n    def test_effective_principals_userid_and_groups(self):\n        from pyramid.security import Everyone\n        from pyramid.security import Authenticated\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'fred',\n                                    'groups':['quux', 'biz']}})\n        def callback(identity, request):\n            return identity['groups']\n        policy = self._makeOne(callback=callback)\n        self.assertEqual(policy.effective_principals(request),\n                         [Everyone, Authenticated, 'fred', 'quux', 'biz'])\n\n    def test_effective_principals_userid_callback_returns_None(self):\n        from pyramid.security import Everyone\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'fred',\n                                    'groups':['quux', 'biz']}})\n        def callback(identity, request):\n            return None\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.security import Everyone\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.security import Everyone\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        from pyramid.security import Everyone\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'system.Authenticated'}}\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(\n            {'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(\n            {'repoze.who.plugins':{'auth_tkt':authtkt}})\n        policy = self._makeOne()\n        result = policy.remember(request, 'fred', max_age=23)\n        self.assertEqual(result[1], {'repoze.who.userid':'fred', 'max_age': 23})\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            {'repoze.who.plugins':{'auth_tkt':authtkt},\n             'repoze.who.identity':{'repoze.who.userid':'fred'},\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'])",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 353,
                            "end_lineno": 359,
                            "parent": {
                                "file_name": "pyramid/tests/test_authentication.py",
                                "type": "class",
                                "name": "TestRepozeWho1AuthenticationPolicy",
                                "content": "class TestRepozeWho1AuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import RepozeWho1AuthenticationPolicy\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        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        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        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        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        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        def callback(identity, request):\n            return None\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        def callback(identity, request):\n            return ['agroup']\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            {'repoze.who.identity':{'repoze.who.userid':'system.Authenticated'}}\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.security import Everyone\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.security import Everyone\n        from pyramid.security import Authenticated\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'fred'}})\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request),\n                         [Everyone, Authenticated, 'fred'])\n\n    def test_effective_principals_userid_and_groups(self):\n        from pyramid.security import Everyone\n        from pyramid.security import Authenticated\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'fred',\n                                    'groups':['quux', 'biz']}})\n        def callback(identity, request):\n            return identity['groups']\n        policy = self._makeOne(callback=callback)\n        self.assertEqual(policy.effective_principals(request),\n                         [Everyone, Authenticated, 'fred', 'quux', 'biz'])\n\n    def test_effective_principals_userid_callback_returns_None(self):\n        from pyramid.security import Everyone\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'fred',\n                                    'groups':['quux', 'biz']}})\n        def callback(identity, request):\n            return None\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.security import Everyone\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.security import Everyone\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        from pyramid.security import Everyone\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'system.Authenticated'}}\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(\n            {'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(\n            {'repoze.who.plugins':{'auth_tkt':authtkt}})\n        policy = self._makeOne()\n        result = policy.remember(request, 'fred', max_age=23)\n        self.assertEqual(result[1], {'repoze.who.userid':'fred', 'max_age': 23})\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            {'repoze.who.plugins':{'auth_tkt':authtkt},\n             'repoze.who.identity':{'repoze.who.userid':'fred'},\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'])",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 200,
                                "end_lineno": 376,
                                "parent": null
                            }
                        }
                    ],
                    "deleted_entities": []
                }
            ]
        }
    ],
    "old_commit_hash": "3063246aa418ae2008adb48ab9e5090a88be42d4^",
    "new_commit_hash": "3063246aa418ae2008adb48ab9e5090a88be42d4",
    "commit_message": "Merge pull request #1254 from rbu/repozewho1-remember-kwargs\n\nHand RepozeWho1AuthenticationPolicy.remember kwargs to repoze.who (master) #1249",
    "commit_date": "2014-03-03T11:58:29-05:00",
    "metadata": {}
}
{
    "repo_name": "pyramid",
    "new_commit_hash": "3063246aa418ae2008adb48ab9e5090a88be42d4",
    "test_file_codes": [
        "import unittest\nimport warnings\nfrom pyramid import testing\nfrom pyramid.compat import (\n    text_,\n    bytes_,\n    )\n\nclass TestCallbackAuthenticationPolicyDebugging(unittest.TestCase):\n    def setUp(self):\n        from pyramid.interfaces import IDebugLogger\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        class MyAuthenticationPolicy(CallbackAuthenticationPolicy):\n            def unauthenticated_userid(self, request):\n                return userid\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            'pyramid.tests.test_authentication.MyAuthenticationPolicy.'\n            'authenticated_userid: call to unauthenticated_userid returned '\n            'None; returning None')\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             \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"authenticated_userid: there was no groupfinder callback; \"\n            \"returning 'fred'\")\n\n    def test_authenticated_userid_with_callback_fail(self):\n        request = DummyRequest(registry=self.config.registry)\n        def callback(userid, request):\n            return None\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            'pyramid.tests.test_authentication.MyAuthenticationPolicy.'\n            'authenticated_userid: groupfinder callback returned None; '\n            'returning None')\n\n    def test_authenticated_userid_with_callback_success(self):\n        request = DummyRequest(registry=self.config.registry)\n        def callback(userid, request):\n            return []\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            \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"authenticated_userid: groupfinder callback returned []; \"\n            \"returning 'fred'\")\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            \"pyramid.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    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            \"pyramid.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    def test_effective_principals_no_unauthenticated_userid(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request),\n                         ['system.Everyone'])\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: unauthenticated_userid returned None; \"\n            \"returning ['system.Everyone']\")\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        self.assertEqual(len(self.messages), 2)\n        self.assertEqual(\n            self.messages[0],\n            'pyramid.tests.test_authentication.MyAuthenticationPolicy.'\n            'effective_principals: groupfinder callback is None, so groups '\n            'is []')\n        self.assertEqual(\n            self.messages[1],\n            \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: returning effective principals: \"\n            \"['system.Everyone', 'system.Authenticated', 'fred']\")\n\n    def test_effective_principals_with_callback_fail(self):\n        request = DummyRequest(registry=self.config.registry)\n        def callback(userid, request):\n            return None\n        policy = self._makeOne(userid='fred', callback=callback)\n        self.assertEqual(\n            policy.effective_principals(request), ['system.Everyone'])\n        self.assertEqual(len(self.messages), 2)\n        self.assertEqual(\n            self.messages[0],\n            'pyramid.tests.test_authentication.MyAuthenticationPolicy.'\n            'effective_principals: groupfinder callback returned None as '\n            'groups')\n        self.assertEqual(\n            self.messages[1],\n            \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: returning effective principals: \"\n            \"['system.Everyone']\")\n\n    def test_effective_principals_with_callback_success(self):\n        request = DummyRequest(registry=self.config.registry)\n        def callback(userid, request):\n            return []\n        policy = self._makeOne(userid='fred', callback=callback)\n        self.assertEqual(\n            policy.effective_principals(request),\n            ['system.Everyone', 'system.Authenticated', 'fred'])\n        self.assertEqual(len(self.messages), 2)\n        self.assertEqual(\n            self.messages[0],\n            'pyramid.tests.test_authentication.MyAuthenticationPolicy.'\n            'effective_principals: groupfinder callback returned [] as groups')\n        self.assertEqual(\n            self.messages[1],\n            \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: returning effective principals: \"\n            \"['system.Everyone', 'system.Authenticated', 'fred']\")\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),\n            ['system.Everyone'])\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            \"pyramid.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    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),\n            ['system.Everyone'])\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: unauthenticated_userid returned disallowed \"\n            \"'system.Everyone'; returning ['system.Everyone'] as if it \"\n            \"was None\")\n\nclass TestRepozeWho1AuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import RepozeWho1AuthenticationPolicy\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        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        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        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        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        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        def callback(identity, request):\n            return None\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        def callback(identity, request):\n            return ['agroup']\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            {'repoze.who.identity':{'repoze.who.userid':'system.Authenticated'}}\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.security import Everyone\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.security import Everyone\n        from pyramid.security import Authenticated\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'fred'}})\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request),\n                         [Everyone, Authenticated, 'fred'])\n\n    def test_effective_principals_userid_and_groups(self):\n        from pyramid.security import Everyone\n        from pyramid.security import Authenticated\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'fred',\n                                    'groups':['quux', 'biz']}})\n        def callback(identity, request):\n            return identity['groups']\n        policy = self._makeOne(callback=callback)\n        self.assertEqual(policy.effective_principals(request),\n                         [Everyone, Authenticated, 'fred', 'quux', 'biz'])\n\n    def test_effective_principals_userid_callback_returns_None(self):\n        from pyramid.security import Everyone\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'fred',\n                                    'groups':['quux', 'biz']}})\n        def callback(identity, request):\n            return None\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.security import Everyone\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.security import Everyone\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        from pyramid.security import Everyone\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'system.Authenticated'}}\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(\n            {'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(\n            {'repoze.who.plugins':{'auth_tkt':authtkt}})\n        policy = self._makeOne()\n        result = policy.remember(request, 'fred', max_age=23)\n        self.assertEqual(result[1], {'repoze.who.userid':'fred', 'max_age': 23})\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            {'repoze.who.plugins':{'auth_tkt':authtkt},\n             'repoze.who.identity':{'repoze.who.userid':'fred'},\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\nclass TestRemoteUserAuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import RemoteUserAuthenticationPolicy\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        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        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.security import Everyone\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.security import Everyone\n        from pyramid.security import Authenticated\n        request = DummyRequest({'REMOTE_USER':'fred'})\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request),\n                         [Everyone, Authenticated, 'fred'])\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\nclass TestAuthTktAuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import AuthTktAuthenticationPolicy\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', callback=None, cookie_name=None, secure=False,\n            include_ip=False, timeout=None, reissue_time=None,\n            hashalg='sha512',\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        def callback(userid, request):\n            return None\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        def callback(userid, request):\n            return True\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.security import Everyone\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.security import Everyone\n        request = DummyRequest({})\n        def callback(userid, request):\n            return None\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.security import Everyone\n        from pyramid.security import Authenticated\n        request = DummyRequest({})\n        def callback(userid, request):\n            return ['group.foo']\n        policy = self._makeOne(callback, {'userid':'fred'})\n        self.assertEqual(policy.effective_principals(request),\n                             [Everyone, Authenticated, 'fred', 'group.foo'])\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        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        verifyObject(IAuthenticationPolicy, self._makeOne(None, None))\n\nclass TestAuthTktCookieHelper(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import AuthTktCookieHelper\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        from pyramid.compat import SimpleCookie\n        cookies = SimpleCookie()\n        cookies.load(cookie)\n        return cookies.get('auth_tkt')\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        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        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_timed_out(self):\n        helper = self._makeOne('secret', timeout=1)\n        request = self._makeRequest({'HTTP_COOKIE':'auth_tkt=bogus'})\n        result = helper.identify(request)\n        self.assertEqual(result, None)\n\n    def test_identify_cookie_reissue(self):\n        import time\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        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        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        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        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        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=/'))\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=/'))\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_path(self):\n        helper = self._makeOne('secret', include_ip=True,\n                               path=\"/cgi-bin/app.cgi/\")\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=/cgi-bin/app.cgi/'))\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(\n            '; Domain=localhost; Path=/cgi-bin/app.cgi/'))\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(\n            '; Domain=.localhost; Path=/cgi-bin/app.cgi/'))\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'))\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=/'))\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    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(result[0][1].endswith('; Domain=.example.com; Path=/'))\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(result[0][1].endswith('; Domain=.example.com; Path=/'))\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(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\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('secret', domain='pyramid.bazinga',\n                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(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n\n    def test_remember_binary_userid(self):\n        import base64\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(val['userid'],\n                         text_(base64.b64encode(b'userid').strip()))\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_long_userid(self):\n        from pyramid.compat import long\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, long(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        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(val['userid'],\n                         text_(base64.b64encode(userid.encode('utf-8'))))\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        result = helper.remember(request, userid)\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_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_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(ValueError, helper.remember, request, 'other',\n                          tokens=(la,))\n\n    def test_remember_invalid_token_format(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('foo bar',))\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('1bar',))\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'\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'\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'\n            )\n\nclass TestAuthTicket(unittest.TestCase):\n    def _makeOne(self, *arg, **kw):\n        from pyramid.authentication import AuthTicket\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('secret', 'userid', '0.0.0.0',\n                               time=10, hashalg='sha512')\n        result = ticket.digest()\n        self.assertEqual(result, '74770b2e0d5b1a54c2a466ec567a40f7d7823576aa49'\\\n                                 '3c65fc3445e9b44097f4a80410319ef8cb256a2e60b9'\\\n                                 'c2002e48a9e33a3e8ee4379352c04ef96d2cb278')\n\n    def test_cookie_value(self):\n        ticket = self._makeOne('secret', 'userid', '0.0.0.0', time=10,\n                               tokens=('a', 'b'))\n        result = ticket.cookie_value()\n        self.assertEqual(result,\n                         '66f9cc3e423dc57c91df696cf3d1f0d80000000auserid!a,b!')\n\n    def test_ipv4(self):\n        ticket = self._makeOne('secret', 'userid', '198.51.100.1',\n                               time=10, hashalg='sha256')\n        result = ticket.cookie_value()\n        self.assertEqual(result, 'b3e7156db4f8abde4439c4a6499a0668f9e7ffd7fa27b'\\\n                                 '798400ecdade8d76c530000000auserid!')\n\n    def test_ipv6(self):\n        ticket = self._makeOne('secret', 'userid', '2001:db8::1',\n                               time=10, hashalg='sha256')\n        result = ticket.cookie_value()\n        self.assertEqual(result, 'd025b601a0f12ca6d008aa35ff3a22b7d8f3d1c1456c8'\\\n                                 '5becf8760cd7a2fa4910000000auserid!')\n\nclass TestBadTicket(unittest.TestCase):\n    def _makeOne(self, msg, expected=None):\n        from pyramid.authentication import BadTicket\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\nclass Test_parse_ticket(unittest.TestCase):\n    def _callFUT(self, secret, ticket, ip, hashalg='md5'):\n        from pyramid.authentication import parse_ticket\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        self.assertRaises(BadTicket,self._callFUT, secret, ticket, ip, hashalg)\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 = '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 = '7d947cdef99bad55f8e3382a8bd089bb9dd0547f7925b7d189adc1160cab'\\\n                 '0ec0e6888faa41eba641a18522b26f19109f3ffafb769767ba8a26d02aae'\\\n                 'ae56599a0000000auserid!a,b!'\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 = 'b3e7156db4f8abde4439c4a6499a0668f9e7ffd7fa27b798400ecdade8d7'\\\n                 '6c530000000auserid!'\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 = 'd025b601a0f12ca6d008aa35ff3a22b7d8f3d1c1456c85becf8760cd7a2f'\\\n                 'a4910000000auserid!'\n        result = self._callFUT('secret', ticket, '2001:db8::1', 'sha256')\n        self.assertEqual(result, (10, 'userid', [''], ''))\n        pass\n\nclass TestSessionAuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import SessionAuthenticationPolicy\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        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        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        def callback(userid, request):\n            return None\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        def callback(userid, request):\n            return True\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.security import Everyone\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.security import Everyone\n        request = DummyRequest(session={'userid':'fred'})\n        def callback(userid, request):\n            return None\n        policy = self._makeOne(callback)\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals(self):\n        from pyramid.security import Everyone\n        from pyramid.security import Authenticated\n        request = DummyRequest(session={'userid':'fred'})\n        def callback(userid, request):\n            return ['group.foo']\n        policy = self._makeOne(callback)\n        self.assertEqual(policy.effective_principals(request),\n                         [Everyone, Authenticated, 'fred', 'group.foo'])\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\nclass TestBasicAuthAuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import BasicAuthAuthenticationPolicy as cls\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        verifyClass(IAuthenticationPolicy, self._getTargetClass())\n\n    def test_unauthenticated_userid(self):\n        import base64\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Basic %s' % base64.b64encode(\n            bytes_('chrisr:password')).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        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Basic %s' % base64.b64encode(\n            bytes_('chrisr:password')).decode('ascii')\n        def check(username, password, request):\n            return []\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        request = testing.DummyRequest()\n        inputs = (b'm\\xc3\\xb6rk\\xc3\\xb6:'\n                  b'm\\xc3\\xb6rk\\xc3\\xb6password').decode('utf-8')\n        request.headers['Authorization'] = 'Basic %s' % (\n            base64.b64encode(inputs.encode('utf-8')).decode('latin-1'))\n        def check(username, password, request):\n            return []\n        policy = self._makeOne(check)\n        self.assertEqual(policy.authenticated_userid(request),\n                         b'm\\xc3\\xb6rk\\xc3\\xb6'.decode('utf-8'))\n\n    def test_authenticated_userid_latin1(self):\n        import base64\n        request = testing.DummyRequest()\n        inputs = (b'm\\xc3\\xb6rk\\xc3\\xb6:'\n                  b'm\\xc3\\xb6rk\\xc3\\xb6password').decode('utf-8')\n        request.headers['Authorization'] = 'Basic %s' % (\n            base64.b64encode(inputs.encode('latin-1')).decode('latin-1'))\n        def check(username, password, request):\n            return []\n        policy = self._makeOne(check)\n        self.assertEqual(policy.authenticated_userid(request),\n                         b'm\\xc3\\xb6rk\\xc3\\xb6'.decode('utf-8'))\n\n    def test_unauthenticated_userid_invalid_payload(self):\n        import base64\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Basic %s' % base64.b64encode(\n            bytes_('chrisrpassword')).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(policy.forget(None), [\n            ('WWW-Authenticate', 'Basic realm=\"SomeRealm\"')])\n\nclass TestSimpleSerializer(unittest.TestCase):\n    def _makeOne(self):\n        from pyramid.authentication import _SimpleSerializer\n        return _SimpleSerializer()\n\n    def test_loads(self):\n        inst = self._makeOne()\n        self.assertEqual(inst.loads(b'abc'), text_('abc'))\n\n    def test_dumps(self):\n        inst = self._makeOne()\n        self.assertEqual(inst.dumps('abc'), bytes_('abc'))\n        \nclass DummyContext:\n    pass\n\nclass DummyCookies(object):\n    def __init__(self, cookie):\n        self.cookie = cookie\n\n    def get(self, name):\n        return self.cookie\n\nclass DummyRequest:\n    domain = 'localhost'\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\nclass DummyWhoPlugin:\n    def remember(self, environ, identity):\n        return environ, identity\n\n    def forget(self, environ, identity):\n        return environ, identity\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\nclass DummyAuthTktModule(object):\n    def __init__(self, timestamp=0, userid='userid', tokens=(), user_data='',\n                 parse_raise=False, hashalg=\"md5\"):\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        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        self.parse_ticket = parse_ticket\n\n        class AuthTicket(object):\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        self.AuthTicket = AuthTicket\n\n    class BadTicket(Exception):\n        pass\n\nclass DummyResponse:\n    def __init__(self):\n        self.headerlist = []\n\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 9 packages in 591ms\nPrepared 1 package in 725ms\nInstalled 9 packages in 13ms\n + pastedeploy==3.1.0\n + pyramid==1.5b1 (from file:///home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_3063246aa418ae2008adb48ab9e5090a88be42d4)\n + repoze-lru==0.7\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 19 packages in 16ms\nInstalled 10 packages in 10ms\n + beautifulsoup4==4.12.3\n + coverage==7.6.1\n + distlib==0.3.9\n + filelock==3.16.1\n + nose==1.3.7\n + platformdirs==4.3.6\n + soupsieve==2.6\n + virtualenv==20.29.0\n + waitress==3.0.0\n + webtest==3.0.1\nResolved 16 packages in 6ms\nInstalled 12 packages in 9ms\n + cachetools==5.5.0\n + chardet==5.2.0\n + colorama==0.4.6\n + exceptiongroup==1.2.2\n + iniconfig==2.0.0\n + packaging==24.2\n + pluggy==1.5.0\n + pyproject-api==1.8.0\n + pytest==8.3.4\n + tomli==2.2.1\n + tox==4.23.2\n + typing-extensions==4.12.2\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_3063246aa418ae2008adb48ab9e5090a88be42d4\ncollected 991 items\n\nr2e_tests/test_1.py FFFFFFFFFFFF........................................ [  5%]\n........................................................................ [ 12%]\n.................                                                        [ 14%]\nr2e_tests/test_config/test_adapters.py .FF..............F...             [ 16%]\nr2e_tests/test_config/test_assets.py ...........FF...................... [ 19%]\n.....F..........................                                         [ 23%]\nr2e_tests/test_config/test_factories.py ..................               [ 24%]\nr2e_tests/test_config/test_i18n.py FFF.FF...                             [ 25%]\nr2e_tests/test_config/test_init.py ..................................... [ 29%]\n.F..F....................F...........F....................FF...FFF...... [ 36%]\n..............                                                           [ 38%]\nr2e_tests/test_config/test_predicates.py ............................... [ 41%]\n........................................                                 [ 45%]\nr2e_tests/test_config/test_rendering.py ...                              [ 45%]\nr2e_tests/test_config/test_routes.py ........................            [ 48%]\nr2e_tests/test_config/test_security.py ..........                        [ 49%]\nr2e_tests/test_config/test_settings.py .......................           [ 51%]\nr2e_tests/test_config/test_testing.py ............                       [ 52%]\nr2e_tests/test_config/test_tweens.py .................................   [ 56%]\nr2e_tests/test_config/test_util.py ..................................... [ 59%]\n.............                                                            [ 61%]\nr2e_tests/test_config/test_views.py .....................F............F. [ 64%]\n..................................FF.................................... [ 71%]\n..FF.................................................................... [ 79%]\n.....FF.........F...F....F.............................................. [ 86%]\n..............F                                                          [ 87%]\nr2e_tests/test_scripts/test_common.py ...                                [ 88%]\nr2e_tests/test_scripts/test_pcreate.py ..........                        [ 89%]\nr2e_tests/test_scripts/test_pdistreport.py ..                            [ 89%]\nr2e_tests/test_scripts/test_prequest.py F.FFFFFFFFF.F.FFF.               [ 91%]\nr2e_tests/test_scripts/test_proutes.py ...........                       [ 92%]\nr2e_tests/test_scripts/test_pserve.py ............................       [ 95%]\nr2e_tests/test_scripts/test_pshell.py ...................                [ 97%]\nr2e_tests/test_scripts/test_ptweens.py .....                             [ 97%]\nr2e_tests/test_scripts/test_pviews.py ................F......            [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            \"pyramid.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\")\nE       AssertionError: \"r2e_tests.test_1.MyAuthenticationPolicy.a[123 chars]None\" != \"pyramid.tests.test_authentication.MyAuthe[140 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       + pyramid.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:85: 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            \"pyramid.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\")\nE       AssertionError: \"r2e_tests.test_1.MyAuthenticationPolicy.a[118 chars]None\" != \"pyramid.tests.test_authentication.MyAuthe[135 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       + pyramid.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:97: 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             \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"authenticated_userid: there was no groupfinder callback; \"\n            \"returning 'fred'\")\nE       AssertionError: \"r2e_tests.test_1.MyAuthenticationPolicy.a[68 chars]red'\" != \"pyramid.tests.test_authentication.MyAuthe[85 chars]red'\"\nE       - r2e_tests.test_1.MyAuthenticationPolicy.authenticated_userid: there was no groupfinder callback; returning 'fred'\nE       ?  ^^^           ^\nE       + pyramid.tests.test_authentication.MyAuthenticationPolicy.authenticated_userid: there was no groupfinder callback; returning 'fred'\nE       ? ++ ^^^^^           ^^^^^^^^^^^^^^\n\nr2e_tests/test_1.py:48: 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            'pyramid.tests.test_authentication.MyAuthenticationPolicy.'\n            'authenticated_userid: call to unauthenticated_userid returned '\n            'None; returning None')\nE       AssertionError: 'r2e_tests.test_1.MyAuthenticationPolicy.a[77 chars]None' != 'pyramid.tests.test_authentication.MyAuthe[94 chars]None'\nE       - r2e_tests.test_1.MyAuthenticationPolicy.authenticated_userid: call to unauthenticated_userid returned None; returning None\nE       ?  ^^^           ^\nE       + pyramid.tests.test_authentication.MyAuthenticationPolicy.authenticated_userid: call to unauthenticated_userid returned None; returning None\nE       ? ++ ^^^^^           ^^^^^^^^^^^^^^\n\nr2e_tests/test_1.py:37: 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        def callback(userid, request):\n            return None\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            'pyramid.tests.test_authentication.MyAuthenticationPolicy.'\n            'authenticated_userid: groupfinder callback returned None; '\n            'returning None')\nE       AssertionError: 'r2e_tests.test_1.MyAuthenticationPolicy.a[67 chars]None' != 'pyramid.tests.test_authentication.MyAuthe[84 chars]None'\nE       - r2e_tests.test_1.MyAuthenticationPolicy.authenticated_userid: groupfinder callback returned None; returning None\nE       ?  ^^^           ^\nE       + pyramid.tests.test_authentication.MyAuthenticationPolicy.authenticated_userid: groupfinder callback returned None; returning None\nE       ? ++ ^^^^^           ^^^^^^^^^^^^^^\n\nr2e_tests/test_1.py:61: 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        def callback(userid, request):\n            return []\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            \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"authenticated_userid: groupfinder callback returned []; \"\n            \"returning 'fred'\")\nE       AssertionError: \"r2e_tests.test_1.MyAuthenticationPolicy.a[67 chars]red'\" != \"pyramid.tests.test_authentication.MyAuthe[84 chars]red'\"\nE       - r2e_tests.test_1.MyAuthenticationPolicy.authenticated_userid: groupfinder callback returned []; returning 'fred'\nE       ?  ^^^           ^\nE       + pyramid.tests.test_authentication.MyAuthenticationPolicy.authenticated_userid: groupfinder callback returned []; returning 'fred'\nE       ? ++ ^^^^^           ^^^^^^^^^^^^^^\n\nr2e_tests/test_1.py:74: 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        self.assertEqual(len(self.messages), 2)\n>       self.assertEqual(\n            self.messages[0],\n            'pyramid.tests.test_authentication.MyAuthenticationPolicy.'\n            'effective_principals: groupfinder callback is None, so groups '\n            'is []')\nE       AssertionError: 'r2e_tests.test_1.MyAuthenticationPolicy.e[62 chars]s []' != 'pyramid.tests.test_authentication.MyAuthe[79 chars]s []'\nE       - r2e_tests.test_1.MyAuthenticationPolicy.effective_principals: groupfinder callback is None, so groups is []\nE       ?  ^^^           ^\nE       + pyramid.tests.test_authentication.MyAuthenticationPolicy.effective_principals: groupfinder callback is None, so groups is []\nE       ? ++ ^^^^^           ^^^^^^^^^^^^^^\n\nr2e_tests/test_1.py:123: 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(policy.effective_principals(request),\n                         ['system.Everyone'])\n        self.assertEqual(len(self.messages), 1)\n>       self.assertEqual(\n            self.messages[0],\n            \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: unauthenticated_userid returned None; \"\n            \"returning ['system.Everyone']\")\nE       AssertionError: \"r2e_tests.test_1.MyAuthenticationPolicy.e[84 chars]ne']\" != \"pyramid.tests.test_authentication.MyAuthe[101 chars]ne']\"\nE       - r2e_tests.test_1.MyAuthenticationPolicy.effective_principals: unauthenticated_userid returned None; returning ['system.Everyone']\nE       ?  ^^^           ^\nE       + pyramid.tests.test_authentication.MyAuthenticationPolicy.effective_principals: unauthenticated_userid returned None; returning ['system.Everyone']\nE       ? ++ ^^^^^           ^^^^^^^^^^^^^^\n\nr2e_tests/test_1.py:110: 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        def callback(userid, request):\n            return None\n        policy = self._makeOne(userid='fred', callback=callback)\n        self.assertEqual(\n            policy.effective_principals(request), ['system.Everyone'])\n        self.assertEqual(len(self.messages), 2)\n>       self.assertEqual(\n            self.messages[0],\n            'pyramid.tests.test_authentication.MyAuthenticationPolicy.'\n            'effective_principals: groupfinder callback returned None as '\n            'groups')\nE       AssertionError: 'r2e_tests.test_1.MyAuthenticationPolicy.e[61 chars]oups' != 'pyramid.tests.test_authentication.MyAuthe[78 chars]oups'\nE       - r2e_tests.test_1.MyAuthenticationPolicy.effective_principals: groupfinder callback returned None as groups\nE       ?  ^^^           ^\nE       + pyramid.tests.test_authentication.MyAuthenticationPolicy.effective_principals: groupfinder callback returned None as groups\nE       ? ++ ^^^^^           ^^^^^^^^^^^^^^\n\nr2e_tests/test_1.py:142: 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        def callback(userid, request):\n            return []\n        policy = self._makeOne(userid='fred', callback=callback)\n        self.assertEqual(\n            policy.effective_principals(request),\n            ['system.Everyone', 'system.Authenticated', 'fred'])\n        self.assertEqual(len(self.messages), 2)\n>       self.assertEqual(\n            self.messages[0],\n            'pyramid.tests.test_authentication.MyAuthenticationPolicy.'\n            'effective_principals: groupfinder callback returned [] as groups')\nE       AssertionError: 'r2e_tests.test_1.MyAuthenticationPolicy.e[59 chars]oups' != 'pyramid.tests.test_authentication.MyAuthe[76 chars]oups'\nE       - r2e_tests.test_1.MyAuthenticationPolicy.effective_principals: groupfinder callback returned [] as groups\nE       ?  ^^^           ^\nE       + pyramid.tests.test_authentication.MyAuthenticationPolicy.effective_principals: groupfinder callback returned [] as groups\nE       ? ++ ^^^^^           ^^^^^^^^^^^^^^\n\nr2e_tests/test_1.py:162: 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),\n            ['system.Everyone'])\n        self.assertEqual(len(self.messages), 1)\n>       self.assertEqual(\n            self.messages[0],\n            \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: unauthenticated_userid returned disallowed \"\n            \"'system.Authenticated'; returning ['system.Everyone'] as if it \"\n            \"was None\")\nE       AssertionError: \"r2e_tests.test_1.MyAuthenticationPolicy.e[131 chars]None\" != \"pyramid.tests.test_authentication.MyAuthe[148 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       + pyramid.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:179: 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),\n            ['system.Everyone'])\n        self.assertEqual(len(self.messages), 1)\n>       self.assertEqual(\n            self.messages[0],\n            \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: unauthenticated_userid returned disallowed \"\n            \"'system.Everyone'; returning ['system.Everyone'] as if it \"\n            \"was None\")\nE       AssertionError: \"r2e_tests.test_1.MyAuthenticationPolicy.e[126 chars]None\" != \"pyramid.tests.test_authentication.MyAuthe[143 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       + pyramid.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:193: 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        config = self._makeOne(autocommit=True)\n        config.add_resource_url_adapter(\n            'pyramid.tests.test_config.test_adapters.DummyResourceURL',\n            'pyramid.tests.test_config.test_adapters.DummyIface',\n            )\n        iface = DummyIface()\n>       adapter = config.registry.getMultiAdapter((iface, iface),\n                                                    IResourceURL)\n\nr2e_tests/test_config/test_adapters.py:280: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <Registry r2e_tests.test_config>\nobjects = (<r2e_tests.test_config.test_adapters.DummyIface object at 0x79dadaa88550>, <r2e_tests.test_config.test_adapters.DummyIface object at 0x79dadaa88550>)\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 0x79dadaa88550>, <r2e_tests.test_config.test_adapters.DummyIface object at 0x79dadaa88550>), <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(intr.discriminator,\n                         ('resource url adapter', DummyIface))\n        self.assertEqual(intr.category_name, 'resource url adapters')\n>       self.assertEqual(\n            intr.title,\n            \"resource url adapter for resource iface \"\n            \"<class 'pyramid.tests.test_config.test_adapters.DummyIface'>\"\n            )\nE       AssertionError: \"reso[34 chars]e <class 'r2e_tests.test_config.test_adapters.DummyIface'>\" != \"reso[34 chars]e <class 'pyramid.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 'pyramid.tests.test_config.test_adapters.DummyIface'>\nE       ?                                                 ++ ^^^^^\n\nr2e_tests/test_config/test_adapters.py:326: 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        config = self._makeOne(autocommit=True)\n        config.add_traverser(\n            'pyramid.tests.test_config.test_adapters.DummyTraverser',\n            'pyramid.tests.test_config.test_adapters.DummyIface')\n        iface = DummyIface()\n>       traverser = config.registry.getAdapter(iface, ITraverser)\n\nr2e_tests/test_config/test_adapters.py:237: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <Registry r2e_tests.test_config>\nobject = <r2e_tests.test_config.test_adapters.DummyIface object at 0x79dadab1eaf0>\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 0x79dadab1eaf0>, <InterfaceClass pyramid.interfaces.ITraverser>, '')\n\n.venv/lib/python3.8/site-packages/zope/interface/registry.py:368: ComponentLookupError\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        import os\n        resource_name = 'test_assets.py'\n        import pyramid.tests.test_config\n        provider = self._makeOne(pyramid.tests.test_config)\n        here = os.path.dirname(os.path.abspath(__file__))\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[73 chars]db48ab9e5090a88be42d4/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]db48ab9e5090a88be42d4/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_3063246aa418ae2008adb48ab9e5090a88be42d4/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_3063246aa418ae2008adb48ab9e5090a88be42d4/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:158: 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        import os\n        resource_name = 'test_assets.py'\n        import pyramid.tests.test_config\n        provider = self._makeOne(pyramid.tests.test_config)\n        here = os.path.dirname(os.path.abspath(__file__))\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[73 chars]db48ab9e5090a88be42d4/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]db48ab9e5090a88be42d4/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_3063246aa418ae2008adb48ab9e5090a88be42d4/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_3063246aa418ae2008adb48ab9e5090a88be42d4/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:212: AssertionError\n____________________ TestPackageOverrides.test_get_filename ____________________\n\nself = <r2e_tests.test_config.test_assets.TestPackageOverrides testMethod=test_get_filename>\n\n    def test_get_filename(self):\n        import os\n        overrides = [ DummyOverride(None), DummyOverride(\n            ('pyramid.tests.test_config', 'test_assets.py'))]\n        package = DummyPackage('package')\n        po = self._makeOne(package)\n        po.overrides= overrides\n        here = os.path.dirname(os.path.abspath(__file__))\n        expected = os.path.join(here, 'test_assets.py')\n>       self.assertEqual(po.get_filename('whatever'), expected)\nE       AssertionError: '/hom[73 chars]db48ab9e5090a88be42d4/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]db48ab9e5090a88be42d4/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_3063246aa418ae2008adb48ab9e5090a88be42d4/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_3063246aa418ae2008adb48ab9e5090a88be42d4/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:425: 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        config = self._makeOne(autocommit=True)\n>       config.add_translation_dirs(locale)\n\nr2e_tests/test_config/test_i18n.py:86: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \npyramid/util.py:528: in wrapper\n    result = wrapped(self, *arg, **kw)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <pyramid.config.Configurator object at 0x79dada82d4c0>\nspecs = ('/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_3063246aa418ae2008adb48ab9e5090a88be42d4/r2e_tests/pkgs/localeapp/locale',)\nintrospectables = []\nspec = '/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_3063246aa418ae2008adb48ab9e5090a88be42d4/r2e_tests/pkgs/localeapp/locale'\npackage_name = None\n\n    @action_method\n    def add_translation_dirs(self, *specs):\n        \"\"\" Add one or more :term:`translation directory` paths to the\n        current configuration state.  The ``specs`` argument is a\n        sequence that may contain absolute directory paths\n        (e.g. ``/usr/share/locale``) or :term:`asset specification`\n        names naming a directory path (e.g. ``some.package:locale``)\n        or a combination of the two.\n    \n        Example:\n    \n        .. code-block:: python\n    \n           config.add_translation_dirs('/usr/share/locale',\n                                       'some.package:locale')\n    \n        Later calls to ``add_translation_dir`` insert directories into the\n        beginning of the list of translation directories created by earlier\n        calls.  This means that the same translation found in a directory\n        added later in the configuration process will be found before one\n        added earlier in the configuration process.  However, if multiple\n        specs are provided in a single call to ``add_translation_dirs``, the\n        directories will be inserted into the beginning of the directory list\n        in the order they're provided in the ``*specs`` list argument (items\n        earlier in the list trump ones later in the list).\n        \"\"\"\n        directories = []\n        introspectables = []\n    \n        for spec in specs[::-1]: # reversed\n            package_name, filename = self._split_spec(spec)\n            if package_name is None: # absolute filename\n                directory = filename\n            else:\n                __import__(package_name)\n                package = sys.modules[package_name]\n                directory = os.path.join(package_path(package), filename)\n    \n            if not os.path.isdir(os.path.realpath(directory)):\n>               raise ConfigurationError('\"%s\" is not a directory' %\n                                         directory)\nE               pyramid.exceptions.ConfigurationError: \"/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_3063246aa418ae2008adb48ab9e5090a88be42d4/r2e_tests/pkgs/localeapp/locale\" is not a directory\n\npyramid/config/i18n.py:86: 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        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale')\n>       self.assertEqual(config.registry.getUtility(ITranslationDirectories),\n                         [locale])\nE       AssertionError: Lists differ: ['/ho[70 chars]008adb48ab9e5090a88be42d4/pyramid/tests/pkgs/localeapp/locale'] != ['/ho[70 chars]008adb48ab9e5090a88be42d4/r2e_tests/pkgs/localeapp/locale']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]2008adb48ab9e5090a88be42d4/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]2008adb48ab9e5090a88be42d4/r2e_tests/pkgs/localeapp/locale'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_3063246aa418ae2008adb48ab9e5090a88be42d4/pyramid/tests/pkgs/localeapp/locale']\nE       ?                                                                                                      -- ^^^^^\nE       \nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_3063246aa418ae2008adb48ab9e5090a88be42d4/r2e_tests/pkgs/localeapp/locale']\nE       ?                                                                                                       ^^^\n\nr2e_tests/test_config/test_i18n.py:54: 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        config = self._makeOne(autocommit=True)\n        directories = ['abc']\n        config.registry.registerUtility(directories, ITranslationDirectories)\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale')\n        result = config.registry.getUtility(ITranslationDirectories)\n>       self.assertEqual(result, [locale, 'abc'])\nE       AssertionError: Lists differ: ['/ho[77 chars]8ab9e5090a88be42d4/pyramid/tests/pkgs/localeapp/locale', 'abc'] != ['/ho[77 chars]8ab9e5090a88be42d4/r2e_tests/pkgs/localeapp/locale', 'abc']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]2008adb48ab9e5090a88be42d4/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]2008adb48ab9e5090a88be42d4/r2e_tests/pkgs/localeapp/locale'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_3063246aa418ae2008adb48ab9e5090a88be42d4/pyramid/tests/pkgs/localeapp/locale',\nE       ?                                                                                                      -- ^^^^^\nE       \nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_3063246aa418ae2008adb48ab9e5090a88be42d4/r2e_tests/pkgs/localeapp/locale',\nE       ?                                                                                                       ^^^\nE       \nE          'abc']\n\nr2e_tests/test_config/test_i18n.py:64: 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        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale',\n                                    'pyramid.tests.pkgs.localeapp:locale2')\n>       self.assertEqual(config.registry.getUtility(ITranslationDirectories),\n                         [locale, locale2])\nE       AssertionError: Lists differ: ['/ho[91 chars]42d4/pyramid/tests/pkgs/localeapp/locale', '/h[130 chars]le2'] != ['/ho[91 chars]42d4/r2e_tests/pkgs/localeapp/locale', '/home/[122 chars]le2']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]2008adb48ab9e5090a88be42d4/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]2008adb48ab9e5090a88be42d4/r2e_tests/pkgs/localeapp/locale'\nE       \nE       Diff is 1002 characters long. Set self.maxDiff to None to see it.\n\nr2e_tests/test_config/test_i18n.py:71: 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        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale',\n                                    'pyramid.tests.pkgs.localeapp:locale2')\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale3')\n>       self.assertEqual(config.registry.getUtility(ITranslationDirectories),\n                         [locale3, locale, locale2])\nE       AssertionError: Lists differ: ['/ho[91 chars]42d4/pyramid/tests/pkgs/localeapp/locale3', '/[269 chars]le2'] != ['/ho[91 chars]42d4/r2e_tests/pkgs/localeapp/locale3', '/home[257 chars]le2']\nE       \nE       First differing element 0:\nE       '/hom[69 chars]008adb48ab9e5090a88be42d4/pyramid/tests/pkgs/localeapp/locale3'\nE       '/hom[69 chars]008adb48ab9e5090a88be42d4/r2e_tests/pkgs/localeapp/locale3'\nE       \nE       Diff is 1504 characters long. Set self.maxDiff to None to see it.\n\nr2e_tests/test_config/test_i18n.py:80: 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        config = Configurator()\n        this_pkg = sys.modules['pyramid.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 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_init.py:67: 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        config = self._makeOne()\n        logger = config.registry.getUtility(IDebugLogger)\n>       self.assertEqual(logger.name, 'pyramid.tests.test_config')\nE       AssertionError: 'r2e_tests.test_config' != 'pyramid.tests.test_config'\nE       - r2e_tests.test_config\nE       ?  ^^^\nE       + pyramid.tests.test_config\nE       ? ++ ^^^^^\n\nr2e_tests/test_config/test_init.py:123: AssertionError\n_______________ ConfiguratorTests.test_scan_integration_conflict _______________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_scan_integration_conflict>\n\n    def test_scan_integration_conflict(self):\n        from pyramid.tests.test_config.pkgs import selfscan\n        from pyramid.config import Configurator\n        c = Configurator()\n        c.scan(selfscan)\n        c.scan(selfscan)\n        try:\n>           c.commit()\n\nr2e_tests/test_config/test_init.py:999: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \npyramid/config/__init__.py:609: in commit\n    self.action_state.execute_actions(introspector=self.introspector)\npyramid/config/__init__.py:1047: in execute_actions\n    for action in resolveConflicts(self.actions):\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nactions = []\n\n    def resolveConflicts(actions):\n        \"\"\"Resolve conflicting actions\n    \n        Given an actions list, identify and try to resolve conflicting actions.\n        Actions conflict if they have the same non-None discriminator.\n        Conflicting actions can be resolved if the include path of one of\n        the actions is a prefix of the includepaths of the other\n        conflicting actions and is unequal to the include paths in the\n        other conflicting actions.\n        \"\"\"\n    \n        def orderandpos(v):\n            n, v = v\n            if not isinstance(v, dict):\n                # old-style tuple action\n                v = expand_action(*v)\n            return (v['order'] or 0, n)\n    \n        sactions = sorted(enumerate(actions), key=orderandpos)\n    \n        def orderonly(v):\n            n, v = v\n            if not isinstance(v, dict):\n                # old-style tuple action\n                v = expand_action(*v)\n            return v['order'] or 0\n    \n        for order, actiongroup in itertools.groupby(sactions, orderonly):\n            # \"order\" is an integer grouping. Actions in a lower order will be\n            # executed before actions in a higher order.  All of the actions in\n            # one grouping will be executed (its callable, if any will be called)\n            # before any of the actions in the next.\n    \n            unique = {}\n            output = []\n    \n            for i, action in actiongroup:\n                # Within an order, actions are executed sequentially based on\n                # original action ordering (\"i\").\n    \n                if not isinstance(action, dict):\n                    # old-style tuple action\n                    action = expand_action(*action)\n    \n                # \"ainfo\" is a tuple of (order, i, action) where \"order\" is a\n                # user-supplied grouping, \"i\" is an integer expressing the relative\n                # position of this action in the action list being resolved, and\n                # \"action\" is an action dictionary.  The purpose of an ainfo is to\n                # associate an \"order\" and an \"i\" with a particular action; \"order\"\n                # and \"i\" exist for sorting purposes after conflict resolution.\n                ainfo = (order, i, action)\n    \n                discriminator = undefer(action['discriminator'])\n                action['discriminator'] = discriminator\n    \n                if discriminator is None:\n                    # The discriminator is None, so this action can never conflict.\n                    # We can add it directly to the result.\n                    output.append(ainfo)\n                    continue\n    \n                L = unique.setdefault(discriminator, [])\n                L.append(ainfo)\n    \n            # Check for conflicts\n            conflicts = {}\n    \n            for discriminator, ainfos in unique.items():\n                # We use (includepath, order, i) as a sort key because we need to\n                # sort the actions by the paths so that the shortest path with a\n                # given prefix comes first.  The \"first\" action is the one with the\n                # shortest include path.  We break sorting ties using \"order\", then\n                # \"i\".\n                def bypath(ainfo):\n                    path, order, i = ainfo[2]['includepath'], ainfo[0], ainfo[1]\n                    return path, order, i\n    \n                ainfos.sort(key=bypath)\n                ainfo, rest = ainfos[0], ainfos[1:]\n                output.append(ainfo)\n                _, _, action = ainfo\n                basepath, baseinfo, discriminator = (\n                    action['includepath'],\n                    action['info'],\n                    action['discriminator'],\n                    )\n    \n                for _, _, action in rest:\n                    includepath = action['includepath']\n                    # Test whether path is a prefix of opath\n                    if (includepath[:len(basepath)] != basepath # not a prefix\n                        or includepath == basepath):\n                        L = conflicts.setdefault(discriminator, [baseinfo])\n                        L.append(action['info'])\n    \n            if conflicts:\n>               raise ConfigurationConflictError(conflicts)\nE               pyramid.exceptions.ConfigurationConflictError: Conflicting configuration actions\nE                 For: ('view', None, '', None, 'd41d8cd98f00b204e9800998ecf8427e')\nE                   Line 4 of file /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_3063246aa418ae2008adb48ab9e5090a88be42d4/pyramid/tests/test_config/pkgs/selfscan/__init__.py:\nE                       def abc(request):\nE                   Line 4 of file /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_3063246aa418ae2008adb48ab9e5090a88be42d4/pyramid/tests/test_config/pkgs/selfscan/__init__.py:\nE                       def abc(request):\nE                 For: ('view', None, 'two', None, 'd41d8cd98f00b204e9800998ecf8427e')\nE                   Line 4 of file /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_3063246aa418ae2008adb48ab9e5090a88be42d4/pyramid/tests/test_config/pkgs/selfscan/another.py:\nE                       def two(request):\nE                   Line 4 of file /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_3063246aa418ae2008adb48ab9e5090a88be42d4/pyramid/tests/test_config/pkgs/selfscan/another.py:\nE                       def two(request):\n\npyramid/config/__init__.py:1175: ConfigurationConflictError\n\nDuring handling of the above exception, another exception occurred:\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_scan_integration_conflict>\n\n    def test_scan_integration_conflict(self):\n        from pyramid.tests.test_config.pkgs import selfscan\n        from pyramid.config import Configurator\n        c = Configurator()\n        c.scan(selfscan)\n        c.scan(selfscan)\n        try:\n            c.commit()\n        except ConfigurationConflictError as why:\n            def scanconflicts(e):\n                conflicts = e._conflicts.values()\n                for conflict in conflicts:\n                    for confinst in conflict:\n                        yield confinst.src\n            which = list(scanconflicts(why))\n            self.assertEqual(len(which), 4)\n>           self.assertTrue(\"@view_config(renderer='string')\" in which)\nE           AssertionError: False is not true\n\nr2e_tests/test_config/test_init.py:1008: 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        reg = Registry()\n        config = self._makeOne(reg)\n        config.setup_registry()\n        logger = reg.getUtility(IDebugLogger)\n>       self.assertEqual(logger.name, 'pyramid.tests.test_config')\nE       AssertionError: 'r2e_tests.test_config' != 'pyramid.tests.test_config'\nE       - r2e_tests.test_config\nE       ?  ^^^\nE       + pyramid.tests.test_config\nE       ? ++ ^^^^^\n\nr2e_tests/test_config/test_init.py:428: 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 pyramid.tests import test_config\n        config = self.config\n        config.add_directive(\n                'dummy_callable', 'pyramid.tests.test_config.dummy_callable')\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 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_init.py:1207: 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 pyramid.tests import test_config\n        config = self.config\n        config.add_directive(\n                'dummy_partial', 'pyramid.tests.test_config.dummy_partial')\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 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_init.py:1194: 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 pyramid.tests import test_config\n        config = self.config\n        config.add_directive(\n            'dummy_extend', 'pyramid.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 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_init.py:1181: 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 pyramid.tests import test_config\n        config = self.config\n        config.add_directive(\n            '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 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_init.py:1220: 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(discriminator, callable=None, args=(),\n                        kw=None, order=0, introspectables=(), **extra):\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',\n            'testing',\n            'pyramid.tests.test_config.test_init.DummyPredicate'\n            )\n\nr2e_tests/test_config/test_init.py:1284: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \npyramid/config/__init__.py:498: in _add_predicate\n    self.action(discriminator, register, introspectables=(intr,),\nr2e_tests/test_config/test_init.py:1281: in _fakeAction\n    self.assertEqual(introspectables[0]['factory'], DummyPredicate)\nE   AssertionError: <class 'pyramid.tests.test_config.test_init.DummyPredicate'> != <class 'r2e_tests.test_config.test_init.DummyPredicate'>\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        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,\n            [(config, 'static', 'pyramid.tests.test_config:files', {})])\nE       AssertionError: Lists differ: [(<py[39 chars]9dadaa18b20>, 'static', 'r2e_tests.test_config:files', {})] != [(<py[39 chars]9dadaa18b20>, 'static', 'pyramid.tests.test_config:files', {})]\nE       \nE       First differing element 0:\nE       (<pyr[37 chars]79dadaa18b20>, 'static', 'r2e_tests.test_config:files', {})\nE       (<pyr[37 chars]79dadaa18b20>, 'static', 'pyramid.tests.test_config:files', {})\nE       \nE         [(<pyramid.config.Configurator object at 0x79dadaa18b20>,\nE           'static',\nE       -   'r2e_tests.test_config:files',\nE       ?     ^^^\nE       \nE       +   'pyramid.tests.test_config:files',\nE       ?    ++ ^^^^^\nE       \nE           {})]\n\nr2e_tests/test_config/test_views.py:1755: AssertionError\n_ TestViewsConfigurationMixin.test_add_view_custom_predicate_bests_standard_predicate _\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_custom_predicate_bests_standard_predicate>\n\n    def test_add_view_custom_predicate_bests_standard_predicate(self):\n        import warnings\n        from pyramid.renderers import null_renderer\n        view = lambda *arg: 'OK'\n        view2 = lambda *arg: 'NOT OK'\n        config = self._makeOne(autocommit=True)\n        def pred1(context, request):\n            return True\n        with warnings.catch_warnings(record=True) as w:\n            warnings.filterwarnings('always')\n            config.add_view(view=view, custom_predicates=(pred1,),\n                        renderer=null_renderer)\n            config.add_view(view=view2, request_method='GET',\n                            renderer=null_renderer)\n>           self.assertEqual(len(w), 1)\nE           AssertionError: 3 != 1\n\nr2e_tests/test_config/test_views.py:1471: AssertionError\n____ TestViewsConfigurationMixin.test_add_view_with_custom_predicates_match ____\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_with_custom_predicates_match>\n\n    def test_add_view_with_custom_predicates_match(self):\n        import warnings\n        from pyramid.renderers import null_renderer\n        view = lambda *arg: 'OK'\n        config = self._makeOne(autocommit=True)\n        def pred1(context, request):\n            return True\n        def pred2(context, request):\n            return True\n        predicates = (pred1, pred2)\n        with warnings.catch_warnings(record=True) as w:\n            warnings.filterwarnings('always')\n            config.add_view(view=view, custom_predicates=predicates,\n                            renderer=null_renderer)\n>           self.assertEqual(len(w), 1)\nE           AssertionError: 2 != 1\n\nr2e_tests/test_config/test_views.py:1435: AssertionError\n___ TestViewsConfigurationMixin.test_add_view_with_custom_predicates_nomatch ___\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_with_custom_predicates_nomatch>\n\n    def test_add_view_with_custom_predicates_nomatch(self):\n        import warnings\n        view = lambda *arg: 'OK'\n        config = self._makeOne(autocommit=True)\n        def pred1(context, request):\n            return True\n        def pred2(context, request):\n            return False\n        predicates = (pred1, pred2)\n        with warnings.catch_warnings(record=True) as w:\n            warnings.filterwarnings('always')\n            config.add_view(view=view, custom_predicates=predicates)\n>           self.assertEqual(len(w), 1)\nE           AssertionError: 2 != 1\n\nr2e_tests/test_config/test_views.py:1452: AssertionError\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 pyramid.tests import test_config\n        from pyramid.interfaces import ISettings\n        class view(object):\n            def __init__(self, context, request):\n                self.request = request\n                self.context = context\n    \n            def __call__(self):\n                return {'a':'1'}\n        config = self._makeOne(autocommit=True)\n        renderer = self._registerRenderer(config)\n        fixture = 'pyramid.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 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_views.py:1070: 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 pyramid.tests import test_config\n        from pyramid.interfaces import ISettings\n        config = self._makeOne(autocommit=True)\n        renderer = self._registerRenderer(config)\n        fixture = 'pyramid.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 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_views.py:1111: AssertionError\n_____________ TestViewDeriver.test_function_returns_non_adaptable ______________\n\nself = <r2e_tests.test_config.test_views.TestViewDeriver testMethod=test_function_returns_non_adaptable>\n\n    def test_function_returns_non_adaptable(self):\n        def view(request):\n            return None\n        deriver = self._makeOne()\n        result = deriver(view)\n        self.assertFalse(result is view)\n        try:\n>           result(None, None)\n\nr2e_tests/test_config/test_views.py:2366: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = None, request = None\n\n    def viewresult_to_response(context, request):\n        result = view(context, request)\n        if result.__class__ is Response: # common case\n            response = result\n        else:\n            response = registry.queryAdapterOrSelf(result, IResponse)\n            if response is None:\n                if result is None:\n                    append = (' You may have forgotten to return a value '\n                              'from the view callable.')\n                elif isinstance(result, dict):\n                    append = (' You may have forgotten to define a '\n                              'renderer in the view configuration.')\n                else:\n                    append = ''\n    \n                msg = ('Could not convert return value of the view '\n                       'callable %s into a response object. '\n                       'The value returned was %r.' + append)\n    \n>               raise ValueError(msg % (view_description(view), result))\nE               ValueError: Could not convert return value of the view callable function r2e_tests.test_config.test_views.view into a response object. The value returned was None. You may have forgotten to return a value from the view callable.\n\npyramid/config/views.py:404: ValueError\n\nDuring handling of the above exception, another exception occurred:\n\nself = <r2e_tests.test_config.test_views.TestViewDeriver testMethod=test_function_returns_non_adaptable>\n\n    def test_function_returns_non_adaptable(self):\n        def view(request):\n            return None\n        deriver = self._makeOne()\n        result = deriver(view)\n        self.assertFalse(result is view)\n        try:\n            result(None, None)\n        except ValueError as e:\n>           self.assertEqual(\n                e.args[0],\n                'Could not convert return value of the view callable function '\n                'pyramid.tests.test_config.test_views.view into a response '\n                'object. The value returned was None. You may have forgotten '\n                'to return a value from the view callable.'\n                )\nE           AssertionError: 'Coul[52 chars]tion r2e_tests.test_config.test_views.view int[110 chars]ble.' != 'Coul[52 chars]tion pyramid.tests.test_config.test_views.view[114 chars]ble.'\nE           Diff is 663 characters long. Set self.maxDiff to None to see it.\n\nr2e_tests/test_config/test_views.py:2368: AssertionError\n___________ TestViewDeriver.test_function_returns_non_adaptable_dict ___________\n\nself = <r2e_tests.test_config.test_views.TestViewDeriver testMethod=test_function_returns_non_adaptable_dict>\n\n    def test_function_returns_non_adaptable_dict(self):\n        def view(request):\n            return {'a':1}\n        deriver = self._makeOne()\n        result = deriver(view)\n        self.assertFalse(result is view)\n        try:\n>           result(None, None)\n\nr2e_tests/test_config/test_views.py:2385: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = None, request = None\n\n    def viewresult_to_response(context, request):\n        result = view(context, request)\n        if result.__class__ is Response: # common case\n            response = result\n        else:\n            response = registry.queryAdapterOrSelf(result, IResponse)\n            if response is None:\n                if result is None:\n                    append = (' You may have forgotten to return a value '\n                              'from the view callable.')\n                elif isinstance(result, dict):\n                    append = (' You may have forgotten to define a '\n                              'renderer in the view configuration.')\n                else:\n                    append = ''\n    \n                msg = ('Could not convert return value of the view '\n                       'callable %s into a response object. '\n                       'The value returned was %r.' + append)\n    \n>               raise ValueError(msg % (view_description(view), result))\nE               ValueError: Could not convert return value of the view callable function r2e_tests.test_config.test_views.view into a response object. The value returned was {'a': 1}. You may have forgotten to define a renderer in the view configuration.\n\npyramid/config/views.py:404: ValueError\n\nDuring handling of the above exception, another exception occurred:\n\nself = <r2e_tests.test_config.test_views.TestViewDeriver testMethod=test_function_returns_non_adaptable_dict>\n\n    def test_function_returns_non_adaptable_dict(self):\n        def view(request):\n            return {'a':1}\n        deriver = self._makeOne()\n        result = deriver(view)\n        self.assertFalse(result is view)\n        try:\n            result(None, None)\n        except ValueError as e:\n>           self.assertEqual(\n                e.args[0],\n                \"Could not convert return value of the view callable function \"\n                \"pyramid.tests.test_config.test_views.view into a response \"\n                \"object. The value returned was {'a': 1}. You may have \"\n                \"forgotten to define a renderer in the view configuration.\"\n                )\nE           AssertionError: \"Coul[52 chars]tion r2e_tests.test_config.test_views.view int[120 chars]ion.\" != \"Coul[52 chars]tion pyramid.tests.test_config.test_views.view[124 chars]ion.\"\nE           Diff is 683 characters long. Set self.maxDiff to None to see it.\n\nr2e_tests/test_config/test_views.py:2387: AssertionError\n_____________ TestViewDeriver.test_instance_returns_non_adaptable ______________\n\nself = <r2e_tests.test_config.test_views.TestViewDeriver testMethod=test_instance_returns_non_adaptable>\n\n    def test_instance_returns_non_adaptable(self):\n        class AView(object):\n            def __call__(self, request):\n                return None\n        view = AView()\n        deriver = self._makeOne()\n        result = deriver(view)\n        self.assertFalse(result is view)\n        try:\n>           result(None, None)\n\nr2e_tests/test_config/test_views.py:2406: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = None, request = None\n\n    def viewresult_to_response(context, request):\n        result = view(context, request)\n        if result.__class__ is Response: # common case\n            response = result\n        else:\n            response = registry.queryAdapterOrSelf(result, IResponse)\n            if response is None:\n                if result is None:\n                    append = (' You may have forgotten to return a value '\n                              'from the view callable.')\n                elif isinstance(result, dict):\n                    append = (' You may have forgotten to define a '\n                              'renderer in the view configuration.')\n                else:\n                    append = ''\n    \n                msg = ('Could not convert return value of the view '\n                       'callable %s into a response object. '\n                       'The value returned was %r.' + append)\n    \n>               raise ValueError(msg % (view_description(view), result))\nE               ValueError: Could not convert return value of the view callable object <r2e_tests.test_config.test_views.TestViewDeriver.test_instance_returns_non_adaptable.<locals>.AView object at 0x79dadac14b80> into a response object. The value returned was None. You may have forgotten to return a value from the view callable.\n\npyramid/config/views.py:404: ValueError\n\nDuring handling of the above exception, another exception occurred:\n\nself = <r2e_tests.test_config.test_views.TestViewDeriver testMethod=test_instance_returns_non_adaptable>\n\n    def test_instance_returns_non_adaptable(self):\n        class AView(object):\n            def __call__(self, request):\n                return None\n        view = AView()\n        deriver = self._makeOne()\n        result = deriver(view)\n        self.assertFalse(result is view)\n        try:\n            result(None, None)\n        except ValueError as e:\n            msg = e.args[0]\n>           self.assertTrue(msg.startswith(\n                'Could not convert return value of the view callable object '\n                '<pyramid.tests.test_config.test_views.'))\nE           AssertionError: False is not true\n\nr2e_tests/test_config/test_views.py:2409: AssertionError\n____ TestViewDeriver.test_requestonly_default_method_returns_non_adaptable _____\n\nself = <r2e_tests.test_config.test_views.TestViewDeriver testMethod=test_requestonly_default_method_returns_non_adaptable>\n\n    def test_requestonly_default_method_returns_non_adaptable(self):\n        request = DummyRequest()\n        class AView(object):\n            def __init__(self, request):\n                pass\n            def __call__(self):\n                return None\n        deriver = self._makeOne()\n        result = deriver(AView)\n        self.assertFalse(result is AView)\n        try:\n>           result(None, request)\n\nr2e_tests/test_config/test_views.py:2452: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = None\nrequest = <r2e_tests.test_config.test_views.DummyRequest object at 0x79dada9c5c10>\n\n    def viewresult_to_response(context, request):\n        result = view(context, request)\n        if result.__class__ is Response: # common case\n            response = result\n        else:\n            response = registry.queryAdapterOrSelf(result, IResponse)\n            if response is None:\n                if result is None:\n                    append = (' You may have forgotten to return a value '\n                              'from the view callable.')\n                elif isinstance(result, dict):\n                    append = (' You may have forgotten to define a '\n                              'renderer in the view configuration.')\n                else:\n                    append = ''\n    \n                msg = ('Could not convert return value of the view '\n                       'callable %s into a response object. '\n                       'The value returned was %r.' + append)\n    \n>               raise ValueError(msg % (view_description(view), result))\nE               ValueError: Could not convert return value of the view callable method __call__ of class r2e_tests.test_config.test_views.AView into a response object. The value returned was None. You may have forgotten to return a value from the view callable.\n\npyramid/config/views.py:404: ValueError\n\nDuring handling of the above exception, another exception occurred:\n\nself = <r2e_tests.test_config.test_views.TestViewDeriver testMethod=test_requestonly_default_method_returns_non_adaptable>\n\n    def test_requestonly_default_method_returns_non_adaptable(self):\n        request = DummyRequest()\n        class AView(object):\n            def __init__(self, request):\n                pass\n            def __call__(self):\n                return None\n        deriver = self._makeOne()\n        result = deriver(AView)\n        self.assertFalse(result is AView)\n        try:\n            result(None, request)\n        except ValueError as e:\n>           self.assertEqual(\n                e.args[0],\n                'Could not convert return value of the view callable '\n                'method __call__ of '\n                'class pyramid.tests.test_config.test_views.AView into a '\n                'response object. The value returned was None. You may have '\n                'forgotten to return a value from the view callable.'\n                )\nE           AssertionError: 'Coul[68 chars]lass r2e_tests.test_config.test_views.AView in[111 chars]ble.' != 'Coul[68 chars]lass pyramid.tests.test_config.test_views.AVie[115 chars]ble.'\nE           Diff is 649 characters long. Set self.maxDiff to None to see it.\n\nr2e_tests/test_config/test_views.py:2454: AssertionError\n___ TestViewDeriver.test_requestonly_nondefault_method_returns_non_adaptable ___\n\nself = <r2e_tests.test_config.test_views.TestViewDeriver testMethod=test_requestonly_nondefault_method_returns_non_adaptable>\n\n    def test_requestonly_nondefault_method_returns_non_adaptable(self):\n        request = DummyRequest()\n        class AView(object):\n            def __init__(self, request):\n                pass\n            def theviewmethod(self):\n                return None\n        deriver = self._makeOne(attr='theviewmethod')\n        result = deriver(AView)\n        self.assertFalse(result is AView)\n        try:\n>           result(None, request)\n\nr2e_tests/test_config/test_views.py:2476: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = None\nrequest = <r2e_tests.test_config.test_views.DummyRequest object at 0x79dada65e280>\n\n    def viewresult_to_response(context, request):\n        result = view(context, request)\n        if result.__class__ is Response: # common case\n            response = result\n        else:\n            response = registry.queryAdapterOrSelf(result, IResponse)\n            if response is None:\n                if result is None:\n                    append = (' You may have forgotten to return a value '\n                              'from the view callable.')\n                elif isinstance(result, dict):\n                    append = (' You may have forgotten to define a '\n                              'renderer in the view configuration.')\n                else:\n                    append = ''\n    \n                msg = ('Could not convert return value of the view '\n                       'callable %s into a response object. '\n                       'The value returned was %r.' + append)\n    \n>               raise ValueError(msg % (view_description(view), result))\nE               ValueError: Could not convert return value of the view callable method theviewmethod of class r2e_tests.test_config.test_views.AView into a response object. The value returned was None. You may have forgotten to return a value from the view callable.\n\npyramid/config/views.py:404: ValueError\n\nDuring handling of the above exception, another exception occurred:\n\nself = <r2e_tests.test_config.test_views.TestViewDeriver testMethod=test_requestonly_nondefault_method_returns_non_adaptable>\n\n    def test_requestonly_nondefault_method_returns_non_adaptable(self):\n        request = DummyRequest()\n        class AView(object):\n            def __init__(self, request):\n                pass\n            def theviewmethod(self):\n                return None\n        deriver = self._makeOne(attr='theviewmethod')\n        result = deriver(AView)\n        self.assertFalse(result is AView)\n        try:\n            result(None, request)\n        except ValueError as e:\n>           self.assertEqual(\n                e.args[0],\n                'Could not convert return value of the view callable '\n                'method theviewmethod of '\n                'class pyramid.tests.test_config.test_views.AView into a '\n                'response object. The value returned was None. You may have '\n                'forgotten to return a value from the view callable.'\n                )\nE           AssertionError: 'Coul[73 chars]lass r2e_tests.test_config.test_views.AView in[111 chars]ble.' != 'Coul[73 chars]lass pyramid.tests.test_config.test_views.AVie[115 chars]ble.'\nE           Diff is 669 characters long. Set self.maxDiff to None to see it.\n\nr2e_tests/test_config/test_views.py:2478: 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(): pass\n        result = self._callFUT(view)\n>       self.assertEqual(result,\n                         'function pyramid.tests.test_config.test_views.view')\nE       AssertionError: 'function r2e_tests.test_config.test_views.view' != 'function pyramid.tests.test_config.test_views.view'\nE       - function r2e_tests.test_config.test_views.view\nE       ?           ^^^\nE       + function pyramid.tests.test_config.test_views.view\nE       ?          ++ ^^^^^\n\nr2e_tests/test_config/test_views.py:3937: AssertionError\n_______________ TestPRequestCommand.test_command_display_headers _______________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_display_headers>\n\n    def test_command_display_headers(self):\n        command = self._makeOne(\n            ['', '--display-headers', 'development.ini', '/'])\n        command.run()\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(\n            self._out,\n            ['200 OK', 'Content-Type: text/html; charset=UTF-8', 'abc'])\nE       AssertionError: Lists differ: ['200 OK', b'abc'] != ['200 OK', 'Content-Type: text/html; charset=UTF-8', 'abc']\nE       \nE       First differing element 1:\nE       b'abc'\nE       'Content-Type: text/html; charset=UTF-8'\nE       \nE       Second list contains 1 additional elements.\nE       First extra element 2:\nE       'abc'\nE       \nE       - ['200 OK', b'abc']\nE       + ['200 OK', 'Content-Type: text/html; charset=UTF-8', 'abc']\n\nr2e_tests/test_scripts/test_prequest.py:202: AssertionError\n_________ TestPRequestCommand.test_command_has_content_type_header_var _________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_has_content_type_header_var>\n\n    def test_command_has_content_type_header_var(self):\n        command = self._makeOne(\n            ['', '--header=content-type:app/foo','development.ini', '/'])\n        command.run()\n        self.assertEqual(self._environ['CONTENT_TYPE'], 'app/foo')\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:92: AssertionError\n_____________ TestPRequestCommand.test_command_has_good_header_var _____________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_has_good_header_var>\n\n    def test_command_has_good_header_var(self):\n        command = self._makeOne(\n            ['', '--header=name:value','development.ini', '/'])\n        command.run()\n        self.assertEqual(self._environ['HTTP_NAME'], 'value')\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:69: AssertionError\n__________ TestPRequestCommand.test_command_has_multiple_header_vars ___________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_has_multiple_header_vars>\n\n    def test_command_has_multiple_header_vars(self):\n        command = self._makeOne(\n            ['',\n             '--header=name:value',\n             '--header=name2:value2',\n             'development.ini',\n             '/'])\n        command.run()\n        self.assertEqual(self._environ['HTTP_NAME'], 'value')\n        self.assertEqual(self._environ['HTTP_NAME2'], 'value2')\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:107: AssertionError\n_________________ TestPRequestCommand.test_command_method_get __________________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_method_get>\n\n    def test_command_method_get(self):\n        command = self._makeOne(['', '--method=GET', 'development.ini', '/'])\n        command.run()\n        self.assertEqual(self._environ['REQUEST_METHOD'], 'GET')\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:116: AssertionError\n_______________ TestPRequestCommand.test_command_method_options ________________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_method_options>\n\n    def test_command_method_options(self):\n        from pyramid.compat import NativeIO\n        command = self._makeOne(['', '--method=OPTIONS', 'development.ini',\n                                '/'])\n        stdin = NativeIO()\n        command.stdin = stdin\n        command.run()\n        self.assertEqual(self._environ['REQUEST_METHOD'], 'OPTIONS')\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:184: AssertionError\n________________ TestPRequestCommand.test_command_method_patch _________________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_method_patch>\n\n    def test_command_method_patch(self):\n        from pyramid.compat import NativeIO\n        command = self._makeOne(['', '--method=PATCH', 'development.ini', '/'])\n        stdin = NativeIO()\n        command.stdin = stdin\n        command.run()\n        self.assertEqual(self._environ['REQUEST_METHOD'], 'PATCH')\n        self.assertEqual(self._environ['CONTENT_LENGTH'], '-1')\n        self.assertEqual(self._environ['wsgi.input'], stdin)\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:158: AssertionError\n_________________ TestPRequestCommand.test_command_method_post _________________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_method_post>\n\n    def test_command_method_post(self):\n        from pyramid.compat import NativeIO\n        command = self._makeOne(['', '--method=POST', 'development.ini', '/'])\n        stdin = NativeIO()\n        command.stdin = stdin\n        command.run()\n        self.assertEqual(self._environ['REQUEST_METHOD'], 'POST')\n        self.assertEqual(self._environ['CONTENT_LENGTH'], '-1')\n        self.assertEqual(self._environ['wsgi.input'], stdin)\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:130: AssertionError\n_______________ TestPRequestCommand.test_command_method_propfind _______________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_method_propfind>\n\n    def test_command_method_propfind(self):\n        from pyramid.compat import NativeIO\n        command = self._makeOne(['', '--method=PROPFIND', 'development.ini',\n                                '/'])\n        stdin = NativeIO()\n        command.stdin = stdin\n        command.run()\n        self.assertEqual(self._environ['REQUEST_METHOD'], 'PROPFIND')\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:171: AssertionError\n_________________ TestPRequestCommand.test_command_method_put __________________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_method_put>\n\n    def test_command_method_put(self):\n        from pyramid.compat import NativeIO\n        command = self._makeOne(['', '--method=PUT', 'development.ini', '/'])\n        stdin = NativeIO()\n        command.stdin = stdin\n        command.run()\n        self.assertEqual(self._environ['REQUEST_METHOD'], 'PUT')\n        self.assertEqual(self._environ['CONTENT_LENGTH'], '-1')\n        self.assertEqual(self._environ['wsgi.input'], stdin)\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:144: AssertionError\n________ TestPRequestCommand.test_command_path_doesnt_start_with_slash _________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_path_doesnt_start_with_slash>\n\n    def test_command_path_doesnt_start_with_slash(self):\n        command = self._makeOne(['', 'development.ini', 'abc'])\n        command.run()\n        self.assertEqual(self._path_info, '/abc')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:50: AssertionError\n__________________ TestPRequestCommand.test_command_two_args ___________________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_two_args>\n\n    def test_command_two_args(self):\n        command = self._makeOne(['', 'development.ini', '/'])\n        command.run()\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:42: AssertionError\n________________ TestPRequestCommand.test_command_w_basic_auth _________________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_w_basic_auth>\n\n    def test_command_w_basic_auth(self):\n        command = self._makeOne(\n            ['', '--login=user:password',\n                 '--header=name:value','development.ini', '/'])\n        command.run()\n        self.assertEqual(self._environ['HTTP_NAME'], 'value')\n        self.assertEqual(self._environ['HTTP_AUTHORIZATION'],\n                        'Basic dXNlcjpwYXNzd29yZA==')\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:82: AssertionError\n______________ TestPRequestCommand.test_command_with_query_string ______________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_with_query_string>\n\n    def test_command_with_query_string(self):\n        command = self._makeOne(['', 'development.ini', '/abc?a=1&b=2&c'])\n        command.run()\n        self.assertEqual(self._environ['QUERY_STRING'], 'a=1&b=2&c')\n        self.assertEqual(self._path_info, '/abc')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:193: 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        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n        def view(): pass\n        view.__request_attrs__ = {'context': 'context', 'view_name': 'a'}\n        command._find_view = lambda arg1: view\n        command.args = ('/foo/bar/myapp.ini#myapp', '/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],\n                         '    pyramid.tests.test_scripts.test_pviews.view')\nE       AssertionError: '    r2e_tests.test_scripts.test_pviews.view' != '    pyramid.tests.test_scripts.test_pviews.view'\nE       -     r2e_tests.test_scripts.test_pviews.view\nE       ?      ^^^\nE       +     pyramid.tests.test_scripts.test_pviews.view\nE       ?     ++ ^^^^^\n\nr2e_tests/test_scripts/test_pviews.py:296: AssertionError\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_timed_out\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_remember\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_long_userid\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_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_secure\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::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::TestSimpleSerializer::test_dumps\nPASSED r2e_tests/test_1.py::TestSimpleSerializer::test_loads\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_directory\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_directory_with_package\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_file\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_directory\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_package_with_package\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_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_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::TestPackageOverrides::test_search_path\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_unnamed_callable\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_request_factory_dottedname\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_root_factory_dottedname\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_session_factory\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_session_factory_dottedname\nPASSED r2e_tests/test_config/test_factories.py::TestDeprecatedFactoriesMixinMethods::test_set_multiple_request_properties\nPASSED r2e_tests/test_config/test_factories.py::TestDeprecatedFactoriesMixinMethods::test_set_multiple_request_properties_conflict\nPASSED r2e_tests/test_config/test_factories.py::TestDeprecatedFactoriesMixinMethods::test_set_request_property_with_callable\nPASSED r2e_tests/test_config/test_factories.py::TestDeprecatedFactoriesMixinMethods::test_set_request_property_with_property\nPASSED r2e_tests/test_config/test_factories.py::TestDeprecatedFactoriesMixinMethods::test_set_request_property_with_unnamed_callable\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_i18n.py::TestI18NConfiguratorMixin::test_set_locale_negotiator_dottedname\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_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_action_autocommit_with_introspectables\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_autocommit_with_introspectables_introspection_off\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_branching_kw_is_None\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_branching_kw_is_not_None\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_branching_nonautocommit_with_config_info\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_branching_nonautocommit_with_introspectables\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_branching_nonautocommit_without_config_info\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_nonautocommit_with_introspectables_introspection_off\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_autocommit_no_conflicts\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_begin\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_begin_with_request\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_commit_conflict_resolved_with_include\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_commit_conflict_resolved_with_two_includes_and_local\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_commit_conflict_simple\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_commit_conflict_with_two_includes\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_conflict_set_forbidden_view\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_conflict_set_notfound_view\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_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_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_python_callable\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_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_tweens\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_module\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::TestActionState::test_action_simple\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_with_includepath\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_with_includepath_and_info\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_with_info\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_with_introspectables\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_with_order\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_execute_actions_dicts\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_execute_actions_error\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_execute_actions_tuples\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_execute_actions_with_introspectable_no_callable\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_execute_actions_with_introspectables\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_it\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_processSpec\nPASSED r2e_tests/test_config/test_init.py::Test_resolveConflicts::test_it_conflict\nPASSED r2e_tests/test_config/test_init.py::Test_resolveConflicts::test_it_success_dicts\nPASSED r2e_tests/test_config/test_init.py::Test_resolveConflicts::test_it_success_tuples\nPASSED r2e_tests/test_config/test_init.py::Test_resolveConflicts::test_it_with_actions_grouped_by_order\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::TestXHRPredicate::test___call___false\nPASSED r2e_tests/test_config/test_predicates.py::TestXHRPredicate::test___call___true\nPASSED r2e_tests/test_config/test_predicates.py::TestXHRPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::TestXHRPredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestMethodPredicate::test___call___false\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestMethodPredicate::test___call___true_multi\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestMethodPredicate::test___call___true_single\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestMethodPredicate::test_ctor_get_but_no_head\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestMethodPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestMethodPredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::TestPathInfoPredicate::test___call___false\nPASSED r2e_tests/test_config/test_predicates.py::TestPathInfoPredicate::test___call___true\nPASSED r2e_tests/test_config/test_predicates.py::TestPathInfoPredicate::test_ctor_compilefail\nPASSED r2e_tests/test_config/test_predicates.py::TestPathInfoPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::TestPathInfoPredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test___call___false\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test___call___false_multi\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test___call___true_exists\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test___call___true_multi\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test___call___true_withval\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test_phash_exists\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test_phash_withval\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test_text_exists\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test_text_multi\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test_text_withval\nPASSED r2e_tests/test_config/test_predicates.py::TestMatchParamPredicate::test___call___false\nPASSED r2e_tests/test_config/test_predicates.py::TestMatchParamPredicate::test___call___matchdict_is_None\nPASSED r2e_tests/test_config/test_predicates.py::TestMatchParamPredicate::test___call___true_multi\nPASSED r2e_tests/test_config/test_predicates.py::TestMatchParamPredicate::test___call___true_single\nPASSED r2e_tests/test_config/test_predicates.py::TestMatchParamPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::TestMatchParamPredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::TestCustomPredicate::test___call___false\nPASSED r2e_tests/test_config/test_predicates.py::TestCustomPredicate::test___call___true\nPASSED r2e_tests/test_config/test_predicates.py::TestCustomPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::TestCustomPredicate::test_text_func_has___text__\nPASSED r2e_tests/test_config/test_predicates.py::TestCustomPredicate::test_text_func_repr\nPASSED r2e_tests/test_config/test_predicates.py::TestTraversePredicate::test___call__traverse_has_remainder_already\nPASSED r2e_tests/test_config/test_predicates.py::TestTraversePredicate::test___call__traverse_matches\nPASSED r2e_tests/test_config/test_predicates.py::TestTraversePredicate::test___call__traverse_matches_with_highorder_chars\nPASSED r2e_tests/test_config/test_predicates.py::TestTraversePredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::TestTraversePredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::Test_CheckCSRFTokenPredicate::test_it_call_val_False\nPASSED r2e_tests/test_config/test_predicates.py::Test_CheckCSRFTokenPredicate::test_it_call_val_True\nPASSED r2e_tests/test_config/test_predicates.py::Test_CheckCSRFTokenPredicate::test_it_call_val_str\nPASSED r2e_tests/test_config/test_predicates.py::Test_CheckCSRFTokenPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::Test_CheckCSRFTokenPredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test___call___false\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test___call___false_withregex\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test___call___true_exists\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test___call___true_withregex\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test___call___true_withval\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test_phash_exists\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test_phash_withregex\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test_phash_withval\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test_text_exists\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test_text_withregex\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test_text_withval\nPASSED r2e_tests/test_config/test_predicates.py::Test_PhysicalPathPredicate::test_it_call_False\nPASSED r2e_tests/test_config/test_predicates.py::Test_PhysicalPathPredicate::test_it_call_context_has_no_name\nPASSED r2e_tests/test_config/test_predicates.py::Test_PhysicalPathPredicate::test_it_call_val_list_True\nPASSED r2e_tests/test_config/test_predicates.py::Test_PhysicalPathPredicate::test_it_call_val_str_True\nPASSED r2e_tests/test_config/test_predicates.py::Test_PhysicalPathPredicate::test_it_call_val_tuple_True\nPASSED r2e_tests/test_config/test_predicates.py::Test_PhysicalPathPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::Test_PhysicalPathPredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::Test_EffectivePrincipalsPredicate::test_it_call_authentication_policy_doesnt_provide_superset\nPASSED r2e_tests/test_config/test_predicates.py::Test_EffectivePrincipalsPredicate::test_it_call_authentication_policy_provides_superset\nPASSED r2e_tests/test_config/test_predicates.py::Test_EffectivePrincipalsPredicate::test_it_call_authentication_policy_provides_superset_implicit\nPASSED r2e_tests/test_config/test_predicates.py::Test_EffectivePrincipalsPredicate::test_it_call_no_authentication_policy\nPASSED r2e_tests/test_config/test_predicates.py::Test_EffectivePrincipalsPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::Test_EffectivePrincipalsPredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::Test_EffectivePrincipalsPredicate::test_text_noniter\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_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_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_factory_dottedname\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_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_route_prefix\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_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_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_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_permission\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_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::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_getattr_fail\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_getattr_raises_attribute_error\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_getattr_success\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_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_dottedname\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_dottedname\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_distinct\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::TestTweensConfiguratorMixin::test_add_tweens_names_with_underover\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_util.py::TestPredicateList::test_custom_predicates_can_affect_traversal\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_different_custom_predicates_with_same_hash\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_match_param_from_dict\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_match_param_from_dict_fails\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_match_param_from_string\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_match_param_from_string_fails\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_notted\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_ordering_importance_and_number\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_ordering_importance_of_predicates\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_ordering_number_of_predicates\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_ordering_xhr_and_request_method_trump_only_containment\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_predicate_text_is_correct\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_request_method_ordering_hashes_same\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_request_method_sequence\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_traverse_has_remainder_already\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_traverse_matches\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_traverse_matches_with_highorder_chars\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_unknown_predicate\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_defaultargs_firstname_not_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_defaultargs_firstname_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_noargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_onearg_named_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_onearg_named_somethingelse\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_toomanyargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_with_attr_false\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_with_attr_true\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_defaultargs_firstname_not_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_defaultargs_firstname_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_defaultargs_onearg_named_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_defaultargs_onearg_named_somethingelse\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_nocall\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_toomanyargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_method_onearg_named_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_newstyle_class_init_defaultargs_firstname_not_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_newstyle_class_init_defaultargs_firstname_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_newstyle_class_init_firstname_request_with_secondname\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_newstyle_class_init_noargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_newstyle_class_init_onearg_named_somethingelse\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_defaultargs_firstname_not_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_defaultargs_firstname_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_noargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_onearg_named_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_onearg_named_somethingelse\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_toomanyargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_no_init\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_requestonly_newstyle_class_init_onearg_named_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_requestonly_newstyle_class_init_toomanyargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_requestonly_newstyle_class_no_init\nPASSED r2e_tests/test_config/test_util.py::TestNotted::test_it_with_phash_val\nPASSED r2e_tests/test_config/test_util.py::TestNotted::test_it_without_phash_val\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_http_cache\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_with_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_with_view_defaults\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_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_http_cache\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_with_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_with_view_defaults\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_context_as_class\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_context_as_dottedname\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_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_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_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_register_secured_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_for__as_dottedname\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_dottedname\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_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_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_view_defaults\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_defaults_viewname_is_dottedname_kwarg\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_defaults_viewname_is_dottedname_nonkwarg\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_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_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::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::TestViewDeriver::test_as_function_context_and_request\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_as_function_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_as_instance_context_and_request\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_as_instance_context_and_request_attr_and_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_as_instance_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_as_instance_requestonly_attr_and_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_as_newstyle_class_context_and_request\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_as_newstyle_class_context_and_request_attr_and_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_as_newstyle_class_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_as_newstyle_class_requestonly_attr_and_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_as_oldstyle_class_context_and_request\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_as_oldstyle_class_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_as_oldstyle_cls_context_request_attr_and_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_as_oldstyle_cls_requestonly_attr_and_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_attr_wrapped_view_branching_default_phash\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_attr_wrapped_view_branching_nondefault_phash\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_class_with_attr\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_class_without_attr\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_debug_auth_permission_authpol_denied\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_debug_auth_permission_authpol_denied2\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_debug_auth_permission_authpol_overridden\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_debug_auth_permission_authpol_permitted\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_debug_auth_permission_authpol_permitted_no_request\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_function_returns_true_Response_no_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_function_returns_true_Response_with_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_http_cached_prevent_http_cache_in_settings\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_http_cached_view_bad_tuple\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_http_cached_view_integer\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_http_cached_view_prevent_auto_set\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_http_cached_view_timedelta\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_http_cached_view_tuple\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_http_cached_view_tuple_seconds_None\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_predicate_mismatch_exception_has_text_in_detail\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_predicate_mismatch_view_has_name\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_predicate_mismatch_view_has_no_name\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_requestonly_function\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_requestonly_function_with_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_requestonly_function_with_renderer_request_has_view\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_requestonly_function_with_renderer_request_override\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_secured_view_authn_policy_no_authz_policy\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_secured_view_authz_policy_no_authn_policy\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_secured_view_raises_forbidden_no_name\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_secured_view_raises_forbidden_with_name\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_with_debug_authorization_authn_policy_no_authz_policy\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_with_debug_authorization_authz_policy_no_authn_policy\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_with_debug_authorization_no_authpol\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_with_debug_authorization_no_permission\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_with_predicates_all\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_with_predicates_checker\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_with_predicates_notall\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_with_view_mapper_config_specified\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_with_view_mapper_default_mapper_specified\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_with_view_mapper_view_specified\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_with_wrapper_viewname\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_with_wrapper_viewname_notfound\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_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_registration_no_registry_on_request\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_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_scripts/test_common.py::Test_logging_file_config::test_it\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_pcreate.py::TestPCreateCommand::test_known_scaffold_absolute_path\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_known_scaffold_multiple_rendered\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_known_scaffold_single_rendered\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_known_scaffold_with_path_as_project_target_rendered\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_no_project_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_run_no_scaffold_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_run_show_scaffolds_exist\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_run_show_scaffolds_none_exist\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_unknown_scaffold_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::Test_main::test_it\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_has_bad_config_header\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_response_has_no_charset\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_good_args\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_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\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::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_get_options_no_command\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_get_options_with_command\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_record_pid_not_verbose\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_record_pid_verbose\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_remove_pid_current_pid_is_not_pid_in_file\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_remove_pid_current_pid_is_not_written_pid\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_remove_pid_file_not_verbose\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_remove_pid_file_stale_pid_write_exception\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_remove_pid_file_unlink_exception\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_remove_pid_file_verbose\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_remove_pid_no_pid_file\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_remove_pid_not_a_number\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_run_no_args\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_run_stop_daemon_bad_pid_file\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_run_stop_daemon_invalid_pid_in_file\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_run_stop_daemon_no_such_pid_file\nPASSED r2e_tests/test_scripts/test_pserve.py::Test_read_pidfile::test_read_pidfile\nPASSED r2e_tests/test_scripts/test_pserve.py::Test_read_pidfile::test_read_pidfile_no_pid_file\nPASSED r2e_tests/test_scripts/test_pserve.py::Test_read_pidfile::test_read_pidfile_not_a_number\nPASSED r2e_tests/test_scripts/test_pserve.py::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_pserve.py::TestLazyWriter::test_flush\nPASSED r2e_tests/test_scripts/test_pserve.py::TestLazyWriter::test_open\nPASSED r2e_tests/test_scripts/test_pserve.py::TestLazyWriter::test_write\nPASSED r2e_tests/test_scripts/test_pserve.py::TestLazyWriter::test_writeline\nPASSED r2e_tests/test_scripts/test_pserve.py::Test__methodwrapper::test___call__fail\nPASSED r2e_tests/test_scripts/test_pserve.py::Test__methodwrapper::test___call__succeed\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_loads_bpython_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_default_shell_with_unknown_shell\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_ipython_v0_10\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_ipython_v0_11\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_ipython_v1_1\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_make_bpython_shell\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_make_default_shell\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_make_ipython_v0_10_shell\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_make_ipython_v0_11_shell\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_make_ipython_v1_1_shell\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_shell_ipython_ordering\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_shell_ordering\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_multi_view_nested\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_multiview\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_multiview_with_permission\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_multiview_with_predicates\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::TestPViewsCommand::test_views_command_single_view_route\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_route_with_route_predicates\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_traversal\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_traversal_with_permission\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_traversal_with_predicates\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::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::TestPackageOverrides::test_get_filename\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_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_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_scan_integration_conflict\nFAILED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_debug_logger_None_default\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_views.py::TestViewsConfigurationMixin::test_add_static_view_package_here_relative\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_custom_predicate_bests_standard_predicate\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_custom_predicates_match\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_custom_predicates_nomatch\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::TestViewDeriver::test_function_returns_non_adaptable\nFAILED r2e_tests/test_config/test_views.py::TestViewDeriver::test_function_returns_non_adaptable_dict\nFAILED r2e_tests/test_config/test_views.py::TestViewDeriver::test_instance_returns_non_adaptable\nFAILED r2e_tests/test_config/test_views.py::TestViewDeriver::test_requestonly_default_method_returns_non_adaptable\nFAILED r2e_tests/test_config/test_views.py::TestViewDeriver::test_requestonly_nondefault_method_returns_non_adaptable\nFAILED r2e_tests/test_config/test_views.py::Test_view_description::test_without_text\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_display_headers\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_has_content_type_header_var\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_has_good_header_var\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_has_multiple_header_vars\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_get\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_options\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_patch\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_post\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_propfind\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_put\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_path_doesnt_start_with_slash\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_two_args\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_w_basic_auth\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_with_query_string\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_function_traversal\n======================== 59 failed, 932 passed in 5.72s ========================\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_3063246aa418ae2008adb48ab9e5090a88be42d4\ncollected 991 items\n\nr2e_tests/test_1.py FFFFFFFFFFFF...................F.................... [  5%]\n........................................................................ [ 12%]\n.................                                                        [ 14%]\nr2e_tests/test_config/test_adapters.py .FF..............F...             [ 16%]\nr2e_tests/test_config/test_assets.py ...........FF...................... [ 19%]\n.....F..........................                                         [ 23%]\nr2e_tests/test_config/test_factories.py ..................               [ 24%]\nr2e_tests/test_config/test_i18n.py FFF.FF...                             [ 25%]\nr2e_tests/test_config/test_init.py ..................................... [ 29%]\n.F..F....................F...........F....................FF...FFF...... [ 36%]\n..............                                                           [ 38%]\nr2e_tests/test_config/test_predicates.py ............................... [ 41%]\n........................................                                 [ 45%]\nr2e_tests/test_config/test_rendering.py ...                              [ 45%]\nr2e_tests/test_config/test_routes.py ........................            [ 48%]\nr2e_tests/test_config/test_security.py ..........                        [ 49%]\nr2e_tests/test_config/test_settings.py .......................           [ 51%]\nr2e_tests/test_config/test_testing.py ............                       [ 52%]\nr2e_tests/test_config/test_tweens.py .................................   [ 56%]\nr2e_tests/test_config/test_util.py ..................................... [ 59%]\n.............                                                            [ 61%]\nr2e_tests/test_config/test_views.py .....................F............F. [ 64%]\n..................................FF.................................... [ 71%]\n..FF.................................................................... [ 79%]\n.....FF.........F...F....F.............................................. [ 86%]\n..............F                                                          [ 87%]\nr2e_tests/test_scripts/test_common.py ...                                [ 88%]\nr2e_tests/test_scripts/test_pcreate.py ..........                        [ 89%]\nr2e_tests/test_scripts/test_pdistreport.py ..                            [ 89%]\nr2e_tests/test_scripts/test_prequest.py F.FFFFFFFFF.F.FFF.               [ 91%]\nr2e_tests/test_scripts/test_proutes.py ...........                       [ 92%]\nr2e_tests/test_scripts/test_pserve.py ............................       [ 95%]\nr2e_tests/test_scripts/test_pshell.py ...................                [ 97%]\nr2e_tests/test_scripts/test_ptweens.py .....                             [ 97%]\nr2e_tests/test_scripts/test_pviews.py ................F......            [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            \"pyramid.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\")\nE       AssertionError: \"r2e_tests.test_1.MyAuthenticationPolicy.a[123 chars]None\" != \"pyramid.tests.test_authentication.MyAuthe[140 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       + pyramid.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:85: 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            \"pyramid.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\")\nE       AssertionError: \"r2e_tests.test_1.MyAuthenticationPolicy.a[118 chars]None\" != \"pyramid.tests.test_authentication.MyAuthe[135 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       + pyramid.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:97: 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             \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"authenticated_userid: there was no groupfinder callback; \"\n            \"returning 'fred'\")\nE       AssertionError: \"r2e_tests.test_1.MyAuthenticationPolicy.a[68 chars]red'\" != \"pyramid.tests.test_authentication.MyAuthe[85 chars]red'\"\nE       - r2e_tests.test_1.MyAuthenticationPolicy.authenticated_userid: there was no groupfinder callback; returning 'fred'\nE       ?  ^^^           ^\nE       + pyramid.tests.test_authentication.MyAuthenticationPolicy.authenticated_userid: there was no groupfinder callback; returning 'fred'\nE       ? ++ ^^^^^           ^^^^^^^^^^^^^^\n\nr2e_tests/test_1.py:48: 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            'pyramid.tests.test_authentication.MyAuthenticationPolicy.'\n            'authenticated_userid: call to unauthenticated_userid returned '\n            'None; returning None')\nE       AssertionError: 'r2e_tests.test_1.MyAuthenticationPolicy.a[77 chars]None' != 'pyramid.tests.test_authentication.MyAuthe[94 chars]None'\nE       - r2e_tests.test_1.MyAuthenticationPolicy.authenticated_userid: call to unauthenticated_userid returned None; returning None\nE       ?  ^^^           ^\nE       + pyramid.tests.test_authentication.MyAuthenticationPolicy.authenticated_userid: call to unauthenticated_userid returned None; returning None\nE       ? ++ ^^^^^           ^^^^^^^^^^^^^^\n\nr2e_tests/test_1.py:37: 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        def callback(userid, request):\n            return None\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            'pyramid.tests.test_authentication.MyAuthenticationPolicy.'\n            'authenticated_userid: groupfinder callback returned None; '\n            'returning None')\nE       AssertionError: 'r2e_tests.test_1.MyAuthenticationPolicy.a[67 chars]None' != 'pyramid.tests.test_authentication.MyAuthe[84 chars]None'\nE       - r2e_tests.test_1.MyAuthenticationPolicy.authenticated_userid: groupfinder callback returned None; returning None\nE       ?  ^^^           ^\nE       + pyramid.tests.test_authentication.MyAuthenticationPolicy.authenticated_userid: groupfinder callback returned None; returning None\nE       ? ++ ^^^^^           ^^^^^^^^^^^^^^\n\nr2e_tests/test_1.py:61: 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        def callback(userid, request):\n            return []\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            \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"authenticated_userid: groupfinder callback returned []; \"\n            \"returning 'fred'\")\nE       AssertionError: \"r2e_tests.test_1.MyAuthenticationPolicy.a[67 chars]red'\" != \"pyramid.tests.test_authentication.MyAuthe[84 chars]red'\"\nE       - r2e_tests.test_1.MyAuthenticationPolicy.authenticated_userid: groupfinder callback returned []; returning 'fred'\nE       ?  ^^^           ^\nE       + pyramid.tests.test_authentication.MyAuthenticationPolicy.authenticated_userid: groupfinder callback returned []; returning 'fred'\nE       ? ++ ^^^^^           ^^^^^^^^^^^^^^\n\nr2e_tests/test_1.py:74: 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        self.assertEqual(len(self.messages), 2)\n>       self.assertEqual(\n            self.messages[0],\n            'pyramid.tests.test_authentication.MyAuthenticationPolicy.'\n            'effective_principals: groupfinder callback is None, so groups '\n            'is []')\nE       AssertionError: 'r2e_tests.test_1.MyAuthenticationPolicy.e[62 chars]s []' != 'pyramid.tests.test_authentication.MyAuthe[79 chars]s []'\nE       - r2e_tests.test_1.MyAuthenticationPolicy.effective_principals: groupfinder callback is None, so groups is []\nE       ?  ^^^           ^\nE       + pyramid.tests.test_authentication.MyAuthenticationPolicy.effective_principals: groupfinder callback is None, so groups is []\nE       ? ++ ^^^^^           ^^^^^^^^^^^^^^\n\nr2e_tests/test_1.py:123: 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(policy.effective_principals(request),\n                         ['system.Everyone'])\n        self.assertEqual(len(self.messages), 1)\n>       self.assertEqual(\n            self.messages[0],\n            \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: unauthenticated_userid returned None; \"\n            \"returning ['system.Everyone']\")\nE       AssertionError: \"r2e_tests.test_1.MyAuthenticationPolicy.e[84 chars]ne']\" != \"pyramid.tests.test_authentication.MyAuthe[101 chars]ne']\"\nE       - r2e_tests.test_1.MyAuthenticationPolicy.effective_principals: unauthenticated_userid returned None; returning ['system.Everyone']\nE       ?  ^^^           ^\nE       + pyramid.tests.test_authentication.MyAuthenticationPolicy.effective_principals: unauthenticated_userid returned None; returning ['system.Everyone']\nE       ? ++ ^^^^^           ^^^^^^^^^^^^^^\n\nr2e_tests/test_1.py:110: 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        def callback(userid, request):\n            return None\n        policy = self._makeOne(userid='fred', callback=callback)\n        self.assertEqual(\n            policy.effective_principals(request), ['system.Everyone'])\n        self.assertEqual(len(self.messages), 2)\n>       self.assertEqual(\n            self.messages[0],\n            'pyramid.tests.test_authentication.MyAuthenticationPolicy.'\n            'effective_principals: groupfinder callback returned None as '\n            'groups')\nE       AssertionError: 'r2e_tests.test_1.MyAuthenticationPolicy.e[61 chars]oups' != 'pyramid.tests.test_authentication.MyAuthe[78 chars]oups'\nE       - r2e_tests.test_1.MyAuthenticationPolicy.effective_principals: groupfinder callback returned None as groups\nE       ?  ^^^           ^\nE       + pyramid.tests.test_authentication.MyAuthenticationPolicy.effective_principals: groupfinder callback returned None as groups\nE       ? ++ ^^^^^           ^^^^^^^^^^^^^^\n\nr2e_tests/test_1.py:142: 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        def callback(userid, request):\n            return []\n        policy = self._makeOne(userid='fred', callback=callback)\n        self.assertEqual(\n            policy.effective_principals(request),\n            ['system.Everyone', 'system.Authenticated', 'fred'])\n        self.assertEqual(len(self.messages), 2)\n>       self.assertEqual(\n            self.messages[0],\n            'pyramid.tests.test_authentication.MyAuthenticationPolicy.'\n            'effective_principals: groupfinder callback returned [] as groups')\nE       AssertionError: 'r2e_tests.test_1.MyAuthenticationPolicy.e[59 chars]oups' != 'pyramid.tests.test_authentication.MyAuthe[76 chars]oups'\nE       - r2e_tests.test_1.MyAuthenticationPolicy.effective_principals: groupfinder callback returned [] as groups\nE       ?  ^^^           ^\nE       + pyramid.tests.test_authentication.MyAuthenticationPolicy.effective_principals: groupfinder callback returned [] as groups\nE       ? ++ ^^^^^           ^^^^^^^^^^^^^^\n\nr2e_tests/test_1.py:162: 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),\n            ['system.Everyone'])\n        self.assertEqual(len(self.messages), 1)\n>       self.assertEqual(\n            self.messages[0],\n            \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: unauthenticated_userid returned disallowed \"\n            \"'system.Authenticated'; returning ['system.Everyone'] as if it \"\n            \"was None\")\nE       AssertionError: \"r2e_tests.test_1.MyAuthenticationPolicy.e[131 chars]None\" != \"pyramid.tests.test_authentication.MyAuthe[148 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       + pyramid.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:179: 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),\n            ['system.Everyone'])\n        self.assertEqual(len(self.messages), 1)\n>       self.assertEqual(\n            self.messages[0],\n            \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: unauthenticated_userid returned disallowed \"\n            \"'system.Everyone'; returning ['system.Everyone'] as if it \"\n            \"was None\")\nE       AssertionError: \"r2e_tests.test_1.MyAuthenticationPolicy.e[126 chars]None\" != \"pyramid.tests.test_authentication.MyAuthe[143 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       + pyramid.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:193: AssertionError\n___________ TestRepozeWho1AuthenticationPolicy.test_remember_kwargs ____________\n\nself = <r2e_tests.test_1.TestRepozeWho1AuthenticationPolicy testMethod=test_remember_kwargs>\n\n    def test_remember_kwargs(self):\n        authtkt = DummyWhoPlugin()\n        request = DummyRequest(\n            {'repoze.who.plugins':{'auth_tkt':authtkt}})\n        policy = self._makeOne()\n        result = policy.remember(request, 'fred', max_age=23)\n>       self.assertEqual(result[1], {'repoze.who.userid':'fred', 'max_age': 23})\nE       AssertionError: {'repoze.who.userid': 'fred'} != {'repoze.who.userid': 'fred', 'max_age': 23}\nE       - {'repoze.who.userid': 'fred'}\nE       + {'max_age': 23, 'repoze.who.userid': 'fred'}\nE       ?  +++++++++++++++\n\nr2e_tests/test_1.py:359: 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        config = self._makeOne(autocommit=True)\n        config.add_resource_url_adapter(\n            'pyramid.tests.test_config.test_adapters.DummyResourceURL',\n            'pyramid.tests.test_config.test_adapters.DummyIface',\n            )\n        iface = DummyIface()\n>       adapter = config.registry.getMultiAdapter((iface, iface),\n                                                    IResourceURL)\n\nr2e_tests/test_config/test_adapters.py:280: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <Registry r2e_tests.test_config>\nobjects = (<r2e_tests.test_config.test_adapters.DummyIface object at 0x767008f465b0>, <r2e_tests.test_config.test_adapters.DummyIface object at 0x767008f465b0>)\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 0x767008f465b0>, <r2e_tests.test_config.test_adapters.DummyIface object at 0x767008f465b0>), <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(intr.discriminator,\n                         ('resource url adapter', DummyIface))\n        self.assertEqual(intr.category_name, 'resource url adapters')\n>       self.assertEqual(\n            intr.title,\n            \"resource url adapter for resource iface \"\n            \"<class 'pyramid.tests.test_config.test_adapters.DummyIface'>\"\n            )\nE       AssertionError: \"reso[34 chars]e <class 'r2e_tests.test_config.test_adapters.DummyIface'>\" != \"reso[34 chars]e <class 'pyramid.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 'pyramid.tests.test_config.test_adapters.DummyIface'>\nE       ?                                                 ++ ^^^^^\n\nr2e_tests/test_config/test_adapters.py:326: 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        config = self._makeOne(autocommit=True)\n        config.add_traverser(\n            'pyramid.tests.test_config.test_adapters.DummyTraverser',\n            'pyramid.tests.test_config.test_adapters.DummyIface')\n        iface = DummyIface()\n>       traverser = config.registry.getAdapter(iface, ITraverser)\n\nr2e_tests/test_config/test_adapters.py:237: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <Registry r2e_tests.test_config>\nobject = <r2e_tests.test_config.test_adapters.DummyIface object at 0x767008bdcfa0>\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 0x767008bdcfa0>, <InterfaceClass pyramid.interfaces.ITraverser>, '')\n\n.venv/lib/python3.8/site-packages/zope/interface/registry.py:368: ComponentLookupError\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        import os\n        resource_name = 'test_assets.py'\n        import pyramid.tests.test_config\n        provider = self._makeOne(pyramid.tests.test_config)\n        here = os.path.dirname(os.path.abspath(__file__))\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[73 chars]db48ab9e5090a88be42d4/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]db48ab9e5090a88be42d4/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_3063246aa418ae2008adb48ab9e5090a88be42d4/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_3063246aa418ae2008adb48ab9e5090a88be42d4/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:158: 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        import os\n        resource_name = 'test_assets.py'\n        import pyramid.tests.test_config\n        provider = self._makeOne(pyramid.tests.test_config)\n        here = os.path.dirname(os.path.abspath(__file__))\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[73 chars]db48ab9e5090a88be42d4/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]db48ab9e5090a88be42d4/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_3063246aa418ae2008adb48ab9e5090a88be42d4/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_3063246aa418ae2008adb48ab9e5090a88be42d4/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:212: AssertionError\n____________________ TestPackageOverrides.test_get_filename ____________________\n\nself = <r2e_tests.test_config.test_assets.TestPackageOverrides testMethod=test_get_filename>\n\n    def test_get_filename(self):\n        import os\n        overrides = [ DummyOverride(None), DummyOverride(\n            ('pyramid.tests.test_config', 'test_assets.py'))]\n        package = DummyPackage('package')\n        po = self._makeOne(package)\n        po.overrides= overrides\n        here = os.path.dirname(os.path.abspath(__file__))\n        expected = os.path.join(here, 'test_assets.py')\n>       self.assertEqual(po.get_filename('whatever'), expected)\nE       AssertionError: '/hom[73 chars]db48ab9e5090a88be42d4/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]db48ab9e5090a88be42d4/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_3063246aa418ae2008adb48ab9e5090a88be42d4/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_3063246aa418ae2008adb48ab9e5090a88be42d4/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:425: 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        config = self._makeOne(autocommit=True)\n>       config.add_translation_dirs(locale)\n\nr2e_tests/test_config/test_i18n.py:86: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \npyramid/util.py:528: in wrapper\n    result = wrapped(self, *arg, **kw)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <pyramid.config.Configurator object at 0x7670092169d0>\nspecs = ('/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_3063246aa418ae2008adb48ab9e5090a88be42d4/r2e_tests/pkgs/localeapp/locale',)\nintrospectables = []\nspec = '/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_3063246aa418ae2008adb48ab9e5090a88be42d4/r2e_tests/pkgs/localeapp/locale'\npackage_name = None\n\n    @action_method\n    def add_translation_dirs(self, *specs):\n        \"\"\" Add one or more :term:`translation directory` paths to the\n        current configuration state.  The ``specs`` argument is a\n        sequence that may contain absolute directory paths\n        (e.g. ``/usr/share/locale``) or :term:`asset specification`\n        names naming a directory path (e.g. ``some.package:locale``)\n        or a combination of the two.\n    \n        Example:\n    \n        .. code-block:: python\n    \n           config.add_translation_dirs('/usr/share/locale',\n                                       'some.package:locale')\n    \n        Later calls to ``add_translation_dir`` insert directories into the\n        beginning of the list of translation directories created by earlier\n        calls.  This means that the same translation found in a directory\n        added later in the configuration process will be found before one\n        added earlier in the configuration process.  However, if multiple\n        specs are provided in a single call to ``add_translation_dirs``, the\n        directories will be inserted into the beginning of the directory list\n        in the order they're provided in the ``*specs`` list argument (items\n        earlier in the list trump ones later in the list).\n        \"\"\"\n        directories = []\n        introspectables = []\n    \n        for spec in specs[::-1]: # reversed\n            package_name, filename = self._split_spec(spec)\n            if package_name is None: # absolute filename\n                directory = filename\n            else:\n                __import__(package_name)\n                package = sys.modules[package_name]\n                directory = os.path.join(package_path(package), filename)\n    \n            if not os.path.isdir(os.path.realpath(directory)):\n>               raise ConfigurationError('\"%s\" is not a directory' %\n                                         directory)\nE               pyramid.exceptions.ConfigurationError: \"/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_3063246aa418ae2008adb48ab9e5090a88be42d4/r2e_tests/pkgs/localeapp/locale\" is not a directory\n\npyramid/config/i18n.py:86: 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        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale')\n>       self.assertEqual(config.registry.getUtility(ITranslationDirectories),\n                         [locale])\nE       AssertionError: Lists differ: ['/ho[70 chars]008adb48ab9e5090a88be42d4/pyramid/tests/pkgs/localeapp/locale'] != ['/ho[70 chars]008adb48ab9e5090a88be42d4/r2e_tests/pkgs/localeapp/locale']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]2008adb48ab9e5090a88be42d4/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]2008adb48ab9e5090a88be42d4/r2e_tests/pkgs/localeapp/locale'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_3063246aa418ae2008adb48ab9e5090a88be42d4/pyramid/tests/pkgs/localeapp/locale']\nE       ?                                                                                                      -- ^^^^^\nE       \nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_3063246aa418ae2008adb48ab9e5090a88be42d4/r2e_tests/pkgs/localeapp/locale']\nE       ?                                                                                                       ^^^\n\nr2e_tests/test_config/test_i18n.py:54: 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        config = self._makeOne(autocommit=True)\n        directories = ['abc']\n        config.registry.registerUtility(directories, ITranslationDirectories)\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale')\n        result = config.registry.getUtility(ITranslationDirectories)\n>       self.assertEqual(result, [locale, 'abc'])\nE       AssertionError: Lists differ: ['/ho[77 chars]8ab9e5090a88be42d4/pyramid/tests/pkgs/localeapp/locale', 'abc'] != ['/ho[77 chars]8ab9e5090a88be42d4/r2e_tests/pkgs/localeapp/locale', 'abc']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]2008adb48ab9e5090a88be42d4/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]2008adb48ab9e5090a88be42d4/r2e_tests/pkgs/localeapp/locale'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_3063246aa418ae2008adb48ab9e5090a88be42d4/pyramid/tests/pkgs/localeapp/locale',\nE       ?                                                                                                      -- ^^^^^\nE       \nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_3063246aa418ae2008adb48ab9e5090a88be42d4/r2e_tests/pkgs/localeapp/locale',\nE       ?                                                                                                       ^^^\nE       \nE          'abc']\n\nr2e_tests/test_config/test_i18n.py:64: 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        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale',\n                                    'pyramid.tests.pkgs.localeapp:locale2')\n>       self.assertEqual(config.registry.getUtility(ITranslationDirectories),\n                         [locale, locale2])\nE       AssertionError: Lists differ: ['/ho[91 chars]42d4/pyramid/tests/pkgs/localeapp/locale', '/h[130 chars]le2'] != ['/ho[91 chars]42d4/r2e_tests/pkgs/localeapp/locale', '/home/[122 chars]le2']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]2008adb48ab9e5090a88be42d4/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]2008adb48ab9e5090a88be42d4/r2e_tests/pkgs/localeapp/locale'\nE       \nE       Diff is 1002 characters long. Set self.maxDiff to None to see it.\n\nr2e_tests/test_config/test_i18n.py:71: 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        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale',\n                                    'pyramid.tests.pkgs.localeapp:locale2')\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale3')\n>       self.assertEqual(config.registry.getUtility(ITranslationDirectories),\n                         [locale3, locale, locale2])\nE       AssertionError: Lists differ: ['/ho[91 chars]42d4/pyramid/tests/pkgs/localeapp/locale3', '/[269 chars]le2'] != ['/ho[91 chars]42d4/r2e_tests/pkgs/localeapp/locale3', '/home[257 chars]le2']\nE       \nE       First differing element 0:\nE       '/hom[69 chars]008adb48ab9e5090a88be42d4/pyramid/tests/pkgs/localeapp/locale3'\nE       '/hom[69 chars]008adb48ab9e5090a88be42d4/r2e_tests/pkgs/localeapp/locale3'\nE       \nE       Diff is 1504 characters long. Set self.maxDiff to None to see it.\n\nr2e_tests/test_config/test_i18n.py:80: 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        config = Configurator()\n        this_pkg = sys.modules['pyramid.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 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_init.py:67: 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        config = self._makeOne()\n        logger = config.registry.getUtility(IDebugLogger)\n>       self.assertEqual(logger.name, 'pyramid.tests.test_config')\nE       AssertionError: 'r2e_tests.test_config' != 'pyramid.tests.test_config'\nE       - r2e_tests.test_config\nE       ?  ^^^\nE       + pyramid.tests.test_config\nE       ? ++ ^^^^^\n\nr2e_tests/test_config/test_init.py:123: AssertionError\n_______________ ConfiguratorTests.test_scan_integration_conflict _______________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_scan_integration_conflict>\n\n    def test_scan_integration_conflict(self):\n        from pyramid.tests.test_config.pkgs import selfscan\n        from pyramid.config import Configurator\n        c = Configurator()\n        c.scan(selfscan)\n        c.scan(selfscan)\n        try:\n>           c.commit()\n\nr2e_tests/test_config/test_init.py:999: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \npyramid/config/__init__.py:609: in commit\n    self.action_state.execute_actions(introspector=self.introspector)\npyramid/config/__init__.py:1047: in execute_actions\n    for action in resolveConflicts(self.actions):\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nactions = []\n\n    def resolveConflicts(actions):\n        \"\"\"Resolve conflicting actions\n    \n        Given an actions list, identify and try to resolve conflicting actions.\n        Actions conflict if they have the same non-None discriminator.\n        Conflicting actions can be resolved if the include path of one of\n        the actions is a prefix of the includepaths of the other\n        conflicting actions and is unequal to the include paths in the\n        other conflicting actions.\n        \"\"\"\n    \n        def orderandpos(v):\n            n, v = v\n            if not isinstance(v, dict):\n                # old-style tuple action\n                v = expand_action(*v)\n            return (v['order'] or 0, n)\n    \n        sactions = sorted(enumerate(actions), key=orderandpos)\n    \n        def orderonly(v):\n            n, v = v\n            if not isinstance(v, dict):\n                # old-style tuple action\n                v = expand_action(*v)\n            return v['order'] or 0\n    \n        for order, actiongroup in itertools.groupby(sactions, orderonly):\n            # \"order\" is an integer grouping. Actions in a lower order will be\n            # executed before actions in a higher order.  All of the actions in\n            # one grouping will be executed (its callable, if any will be called)\n            # before any of the actions in the next.\n    \n            unique = {}\n            output = []\n    \n            for i, action in actiongroup:\n                # Within an order, actions are executed sequentially based on\n                # original action ordering (\"i\").\n    \n                if not isinstance(action, dict):\n                    # old-style tuple action\n                    action = expand_action(*action)\n    \n                # \"ainfo\" is a tuple of (order, i, action) where \"order\" is a\n                # user-supplied grouping, \"i\" is an integer expressing the relative\n                # position of this action in the action list being resolved, and\n                # \"action\" is an action dictionary.  The purpose of an ainfo is to\n                # associate an \"order\" and an \"i\" with a particular action; \"order\"\n                # and \"i\" exist for sorting purposes after conflict resolution.\n                ainfo = (order, i, action)\n    \n                discriminator = undefer(action['discriminator'])\n                action['discriminator'] = discriminator\n    \n                if discriminator is None:\n                    # The discriminator is None, so this action can never conflict.\n                    # We can add it directly to the result.\n                    output.append(ainfo)\n                    continue\n    \n                L = unique.setdefault(discriminator, [])\n                L.append(ainfo)\n    \n            # Check for conflicts\n            conflicts = {}\n    \n            for discriminator, ainfos in unique.items():\n                # We use (includepath, order, i) as a sort key because we need to\n                # sort the actions by the paths so that the shortest path with a\n                # given prefix comes first.  The \"first\" action is the one with the\n                # shortest include path.  We break sorting ties using \"order\", then\n                # \"i\".\n                def bypath(ainfo):\n                    path, order, i = ainfo[2]['includepath'], ainfo[0], ainfo[1]\n                    return path, order, i\n    \n                ainfos.sort(key=bypath)\n                ainfo, rest = ainfos[0], ainfos[1:]\n                output.append(ainfo)\n                _, _, action = ainfo\n                basepath, baseinfo, discriminator = (\n                    action['includepath'],\n                    action['info'],\n                    action['discriminator'],\n                    )\n    \n                for _, _, action in rest:\n                    includepath = action['includepath']\n                    # Test whether path is a prefix of opath\n                    if (includepath[:len(basepath)] != basepath # not a prefix\n                        or includepath == basepath):\n                        L = conflicts.setdefault(discriminator, [baseinfo])\n                        L.append(action['info'])\n    \n            if conflicts:\n>               raise ConfigurationConflictError(conflicts)\nE               pyramid.exceptions.ConfigurationConflictError: Conflicting configuration actions\nE                 For: ('view', None, '', None, 'd41d8cd98f00b204e9800998ecf8427e')\nE                   Line 4 of file /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_3063246aa418ae2008adb48ab9e5090a88be42d4/pyramid/tests/test_config/pkgs/selfscan/__init__.py:\nE                       def abc(request):\nE                   Line 4 of file /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_3063246aa418ae2008adb48ab9e5090a88be42d4/pyramid/tests/test_config/pkgs/selfscan/__init__.py:\nE                       def abc(request):\nE                 For: ('view', None, 'two', None, 'd41d8cd98f00b204e9800998ecf8427e')\nE                   Line 4 of file /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_3063246aa418ae2008adb48ab9e5090a88be42d4/pyramid/tests/test_config/pkgs/selfscan/another.py:\nE                       def two(request):\nE                   Line 4 of file /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_3063246aa418ae2008adb48ab9e5090a88be42d4/pyramid/tests/test_config/pkgs/selfscan/another.py:\nE                       def two(request):\n\npyramid/config/__init__.py:1175: ConfigurationConflictError\n\nDuring handling of the above exception, another exception occurred:\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_scan_integration_conflict>\n\n    def test_scan_integration_conflict(self):\n        from pyramid.tests.test_config.pkgs import selfscan\n        from pyramid.config import Configurator\n        c = Configurator()\n        c.scan(selfscan)\n        c.scan(selfscan)\n        try:\n            c.commit()\n        except ConfigurationConflictError as why:\n            def scanconflicts(e):\n                conflicts = e._conflicts.values()\n                for conflict in conflicts:\n                    for confinst in conflict:\n                        yield confinst.src\n            which = list(scanconflicts(why))\n            self.assertEqual(len(which), 4)\n>           self.assertTrue(\"@view_config(renderer='string')\" in which)\nE           AssertionError: False is not true\n\nr2e_tests/test_config/test_init.py:1008: 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        reg = Registry()\n        config = self._makeOne(reg)\n        config.setup_registry()\n        logger = reg.getUtility(IDebugLogger)\n>       self.assertEqual(logger.name, 'pyramid.tests.test_config')\nE       AssertionError: 'r2e_tests.test_config' != 'pyramid.tests.test_config'\nE       - r2e_tests.test_config\nE       ?  ^^^\nE       + pyramid.tests.test_config\nE       ? ++ ^^^^^\n\nr2e_tests/test_config/test_init.py:428: 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 pyramid.tests import test_config\n        config = self.config\n        config.add_directive(\n                'dummy_callable', 'pyramid.tests.test_config.dummy_callable')\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 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_init.py:1207: 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 pyramid.tests import test_config\n        config = self.config\n        config.add_directive(\n                'dummy_partial', 'pyramid.tests.test_config.dummy_partial')\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 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_init.py:1194: 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 pyramid.tests import test_config\n        config = self.config\n        config.add_directive(\n            'dummy_extend', 'pyramid.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 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_init.py:1181: 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 pyramid.tests import test_config\n        config = self.config\n        config.add_directive(\n            '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 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_init.py:1220: 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(discriminator, callable=None, args=(),\n                        kw=None, order=0, introspectables=(), **extra):\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',\n            'testing',\n            'pyramid.tests.test_config.test_init.DummyPredicate'\n            )\n\nr2e_tests/test_config/test_init.py:1284: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \npyramid/config/__init__.py:498: in _add_predicate\n    self.action(discriminator, register, introspectables=(intr,),\nr2e_tests/test_config/test_init.py:1281: in _fakeAction\n    self.assertEqual(introspectables[0]['factory'], DummyPredicate)\nE   AssertionError: <class 'pyramid.tests.test_config.test_init.DummyPredicate'> != <class 'r2e_tests.test_config.test_init.DummyPredicate'>\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        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,\n            [(config, 'static', 'pyramid.tests.test_config:files', {})])\nE       AssertionError: Lists differ: [(<py[39 chars]67008a1ea00>, 'static', 'r2e_tests.test_config:files', {})] != [(<py[39 chars]67008a1ea00>, 'static', 'pyramid.tests.test_config:files', {})]\nE       \nE       First differing element 0:\nE       (<pyr[37 chars]767008a1ea00>, 'static', 'r2e_tests.test_config:files', {})\nE       (<pyr[37 chars]767008a1ea00>, 'static', 'pyramid.tests.test_config:files', {})\nE       \nE         [(<pyramid.config.Configurator object at 0x767008a1ea00>,\nE           'static',\nE       -   'r2e_tests.test_config:files',\nE       ?     ^^^\nE       \nE       +   'pyramid.tests.test_config:files',\nE       ?    ++ ^^^^^\nE       \nE           {})]\n\nr2e_tests/test_config/test_views.py:1755: AssertionError\n_ TestViewsConfigurationMixin.test_add_view_custom_predicate_bests_standard_predicate _\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_custom_predicate_bests_standard_predicate>\n\n    def test_add_view_custom_predicate_bests_standard_predicate(self):\n        import warnings\n        from pyramid.renderers import null_renderer\n        view = lambda *arg: 'OK'\n        view2 = lambda *arg: 'NOT OK'\n        config = self._makeOne(autocommit=True)\n        def pred1(context, request):\n            return True\n        with warnings.catch_warnings(record=True) as w:\n            warnings.filterwarnings('always')\n            config.add_view(view=view, custom_predicates=(pred1,),\n                        renderer=null_renderer)\n            config.add_view(view=view2, request_method='GET',\n                            renderer=null_renderer)\n>           self.assertEqual(len(w), 1)\nE           AssertionError: 3 != 1\n\nr2e_tests/test_config/test_views.py:1471: AssertionError\n____ TestViewsConfigurationMixin.test_add_view_with_custom_predicates_match ____\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_with_custom_predicates_match>\n\n    def test_add_view_with_custom_predicates_match(self):\n        import warnings\n        from pyramid.renderers import null_renderer\n        view = lambda *arg: 'OK'\n        config = self._makeOne(autocommit=True)\n        def pred1(context, request):\n            return True\n        def pred2(context, request):\n            return True\n        predicates = (pred1, pred2)\n        with warnings.catch_warnings(record=True) as w:\n            warnings.filterwarnings('always')\n            config.add_view(view=view, custom_predicates=predicates,\n                            renderer=null_renderer)\n>           self.assertEqual(len(w), 1)\nE           AssertionError: 2 != 1\n\nr2e_tests/test_config/test_views.py:1435: AssertionError\n___ TestViewsConfigurationMixin.test_add_view_with_custom_predicates_nomatch ___\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_with_custom_predicates_nomatch>\n\n    def test_add_view_with_custom_predicates_nomatch(self):\n        import warnings\n        view = lambda *arg: 'OK'\n        config = self._makeOne(autocommit=True)\n        def pred1(context, request):\n            return True\n        def pred2(context, request):\n            return False\n        predicates = (pred1, pred2)\n        with warnings.catch_warnings(record=True) as w:\n            warnings.filterwarnings('always')\n            config.add_view(view=view, custom_predicates=predicates)\n>           self.assertEqual(len(w), 1)\nE           AssertionError: 2 != 1\n\nr2e_tests/test_config/test_views.py:1452: AssertionError\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 pyramid.tests import test_config\n        from pyramid.interfaces import ISettings\n        class view(object):\n            def __init__(self, context, request):\n                self.request = request\n                self.context = context\n    \n            def __call__(self):\n                return {'a':'1'}\n        config = self._makeOne(autocommit=True)\n        renderer = self._registerRenderer(config)\n        fixture = 'pyramid.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 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_views.py:1070: 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 pyramid.tests import test_config\n        from pyramid.interfaces import ISettings\n        config = self._makeOne(autocommit=True)\n        renderer = self._registerRenderer(config)\n        fixture = 'pyramid.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 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_views.py:1111: AssertionError\n_____________ TestViewDeriver.test_function_returns_non_adaptable ______________\n\nself = <r2e_tests.test_config.test_views.TestViewDeriver testMethod=test_function_returns_non_adaptable>\n\n    def test_function_returns_non_adaptable(self):\n        def view(request):\n            return None\n        deriver = self._makeOne()\n        result = deriver(view)\n        self.assertFalse(result is view)\n        try:\n>           result(None, None)\n\nr2e_tests/test_config/test_views.py:2366: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = None, request = None\n\n    def viewresult_to_response(context, request):\n        result = view(context, request)\n        if result.__class__ is Response: # common case\n            response = result\n        else:\n            response = registry.queryAdapterOrSelf(result, IResponse)\n            if response is None:\n                if result is None:\n                    append = (' You may have forgotten to return a value '\n                              'from the view callable.')\n                elif isinstance(result, dict):\n                    append = (' You may have forgotten to define a '\n                              'renderer in the view configuration.')\n                else:\n                    append = ''\n    \n                msg = ('Could not convert return value of the view '\n                       'callable %s into a response object. '\n                       'The value returned was %r.' + append)\n    \n>               raise ValueError(msg % (view_description(view), result))\nE               ValueError: Could not convert return value of the view callable function r2e_tests.test_config.test_views.view into a response object. The value returned was None. You may have forgotten to return a value from the view callable.\n\npyramid/config/views.py:404: ValueError\n\nDuring handling of the above exception, another exception occurred:\n\nself = <r2e_tests.test_config.test_views.TestViewDeriver testMethod=test_function_returns_non_adaptable>\n\n    def test_function_returns_non_adaptable(self):\n        def view(request):\n            return None\n        deriver = self._makeOne()\n        result = deriver(view)\n        self.assertFalse(result is view)\n        try:\n            result(None, None)\n        except ValueError as e:\n>           self.assertEqual(\n                e.args[0],\n                'Could not convert return value of the view callable function '\n                'pyramid.tests.test_config.test_views.view into a response '\n                'object. The value returned was None. You may have forgotten '\n                'to return a value from the view callable.'\n                )\nE           AssertionError: 'Coul[52 chars]tion r2e_tests.test_config.test_views.view int[110 chars]ble.' != 'Coul[52 chars]tion pyramid.tests.test_config.test_views.view[114 chars]ble.'\nE           Diff is 663 characters long. Set self.maxDiff to None to see it.\n\nr2e_tests/test_config/test_views.py:2368: AssertionError\n___________ TestViewDeriver.test_function_returns_non_adaptable_dict ___________\n\nself = <r2e_tests.test_config.test_views.TestViewDeriver testMethod=test_function_returns_non_adaptable_dict>\n\n    def test_function_returns_non_adaptable_dict(self):\n        def view(request):\n            return {'a':1}\n        deriver = self._makeOne()\n        result = deriver(view)\n        self.assertFalse(result is view)\n        try:\n>           result(None, None)\n\nr2e_tests/test_config/test_views.py:2385: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = None, request = None\n\n    def viewresult_to_response(context, request):\n        result = view(context, request)\n        if result.__class__ is Response: # common case\n            response = result\n        else:\n            response = registry.queryAdapterOrSelf(result, IResponse)\n            if response is None:\n                if result is None:\n                    append = (' You may have forgotten to return a value '\n                              'from the view callable.')\n                elif isinstance(result, dict):\n                    append = (' You may have forgotten to define a '\n                              'renderer in the view configuration.')\n                else:\n                    append = ''\n    \n                msg = ('Could not convert return value of the view '\n                       'callable %s into a response object. '\n                       'The value returned was %r.' + append)\n    \n>               raise ValueError(msg % (view_description(view), result))\nE               ValueError: Could not convert return value of the view callable function r2e_tests.test_config.test_views.view into a response object. The value returned was {'a': 1}. You may have forgotten to define a renderer in the view configuration.\n\npyramid/config/views.py:404: ValueError\n\nDuring handling of the above exception, another exception occurred:\n\nself = <r2e_tests.test_config.test_views.TestViewDeriver testMethod=test_function_returns_non_adaptable_dict>\n\n    def test_function_returns_non_adaptable_dict(self):\n        def view(request):\n            return {'a':1}\n        deriver = self._makeOne()\n        result = deriver(view)\n        self.assertFalse(result is view)\n        try:\n            result(None, None)\n        except ValueError as e:\n>           self.assertEqual(\n                e.args[0],\n                \"Could not convert return value of the view callable function \"\n                \"pyramid.tests.test_config.test_views.view into a response \"\n                \"object. The value returned was {'a': 1}. You may have \"\n                \"forgotten to define a renderer in the view configuration.\"\n                )\nE           AssertionError: \"Coul[52 chars]tion r2e_tests.test_config.test_views.view int[120 chars]ion.\" != \"Coul[52 chars]tion pyramid.tests.test_config.test_views.view[124 chars]ion.\"\nE           Diff is 683 characters long. Set self.maxDiff to None to see it.\n\nr2e_tests/test_config/test_views.py:2387: AssertionError\n_____________ TestViewDeriver.test_instance_returns_non_adaptable ______________\n\nself = <r2e_tests.test_config.test_views.TestViewDeriver testMethod=test_instance_returns_non_adaptable>\n\n    def test_instance_returns_non_adaptable(self):\n        class AView(object):\n            def __call__(self, request):\n                return None\n        view = AView()\n        deriver = self._makeOne()\n        result = deriver(view)\n        self.assertFalse(result is view)\n        try:\n>           result(None, None)\n\nr2e_tests/test_config/test_views.py:2406: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = None, request = None\n\n    def viewresult_to_response(context, request):\n        result = view(context, request)\n        if result.__class__ is Response: # common case\n            response = result\n        else:\n            response = registry.queryAdapterOrSelf(result, IResponse)\n            if response is None:\n                if result is None:\n                    append = (' You may have forgotten to return a value '\n                              'from the view callable.')\n                elif isinstance(result, dict):\n                    append = (' You may have forgotten to define a '\n                              'renderer in the view configuration.')\n                else:\n                    append = ''\n    \n                msg = ('Could not convert return value of the view '\n                       'callable %s into a response object. '\n                       'The value returned was %r.' + append)\n    \n>               raise ValueError(msg % (view_description(view), result))\nE               ValueError: Could not convert return value of the view callable object <r2e_tests.test_config.test_views.TestViewDeriver.test_instance_returns_non_adaptable.<locals>.AView object at 0x767008d0fca0> into a response object. The value returned was None. You may have forgotten to return a value from the view callable.\n\npyramid/config/views.py:404: ValueError\n\nDuring handling of the above exception, another exception occurred:\n\nself = <r2e_tests.test_config.test_views.TestViewDeriver testMethod=test_instance_returns_non_adaptable>\n\n    def test_instance_returns_non_adaptable(self):\n        class AView(object):\n            def __call__(self, request):\n                return None\n        view = AView()\n        deriver = self._makeOne()\n        result = deriver(view)\n        self.assertFalse(result is view)\n        try:\n            result(None, None)\n        except ValueError as e:\n            msg = e.args[0]\n>           self.assertTrue(msg.startswith(\n                'Could not convert return value of the view callable object '\n                '<pyramid.tests.test_config.test_views.'))\nE           AssertionError: False is not true\n\nr2e_tests/test_config/test_views.py:2409: AssertionError\n____ TestViewDeriver.test_requestonly_default_method_returns_non_adaptable _____\n\nself = <r2e_tests.test_config.test_views.TestViewDeriver testMethod=test_requestonly_default_method_returns_non_adaptable>\n\n    def test_requestonly_default_method_returns_non_adaptable(self):\n        request = DummyRequest()\n        class AView(object):\n            def __init__(self, request):\n                pass\n            def __call__(self):\n                return None\n        deriver = self._makeOne()\n        result = deriver(AView)\n        self.assertFalse(result is AView)\n        try:\n>           result(None, request)\n\nr2e_tests/test_config/test_views.py:2452: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = None\nrequest = <r2e_tests.test_config.test_views.DummyRequest object at 0x7670089fbbe0>\n\n    def viewresult_to_response(context, request):\n        result = view(context, request)\n        if result.__class__ is Response: # common case\n            response = result\n        else:\n            response = registry.queryAdapterOrSelf(result, IResponse)\n            if response is None:\n                if result is None:\n                    append = (' You may have forgotten to return a value '\n                              'from the view callable.')\n                elif isinstance(result, dict):\n                    append = (' You may have forgotten to define a '\n                              'renderer in the view configuration.')\n                else:\n                    append = ''\n    \n                msg = ('Could not convert return value of the view '\n                       'callable %s into a response object. '\n                       'The value returned was %r.' + append)\n    \n>               raise ValueError(msg % (view_description(view), result))\nE               ValueError: Could not convert return value of the view callable method __call__ of class r2e_tests.test_config.test_views.AView into a response object. The value returned was None. You may have forgotten to return a value from the view callable.\n\npyramid/config/views.py:404: ValueError\n\nDuring handling of the above exception, another exception occurred:\n\nself = <r2e_tests.test_config.test_views.TestViewDeriver testMethod=test_requestonly_default_method_returns_non_adaptable>\n\n    def test_requestonly_default_method_returns_non_adaptable(self):\n        request = DummyRequest()\n        class AView(object):\n            def __init__(self, request):\n                pass\n            def __call__(self):\n                return None\n        deriver = self._makeOne()\n        result = deriver(AView)\n        self.assertFalse(result is AView)\n        try:\n            result(None, request)\n        except ValueError as e:\n>           self.assertEqual(\n                e.args[0],\n                'Could not convert return value of the view callable '\n                'method __call__ of '\n                'class pyramid.tests.test_config.test_views.AView into a '\n                'response object. The value returned was None. You may have '\n                'forgotten to return a value from the view callable.'\n                )\nE           AssertionError: 'Coul[68 chars]lass r2e_tests.test_config.test_views.AView in[111 chars]ble.' != 'Coul[68 chars]lass pyramid.tests.test_config.test_views.AVie[115 chars]ble.'\nE           Diff is 649 characters long. Set self.maxDiff to None to see it.\n\nr2e_tests/test_config/test_views.py:2454: AssertionError\n___ TestViewDeriver.test_requestonly_nondefault_method_returns_non_adaptable ___\n\nself = <r2e_tests.test_config.test_views.TestViewDeriver testMethod=test_requestonly_nondefault_method_returns_non_adaptable>\n\n    def test_requestonly_nondefault_method_returns_non_adaptable(self):\n        request = DummyRequest()\n        class AView(object):\n            def __init__(self, request):\n                pass\n            def theviewmethod(self):\n                return None\n        deriver = self._makeOne(attr='theviewmethod')\n        result = deriver(AView)\n        self.assertFalse(result is AView)\n        try:\n>           result(None, request)\n\nr2e_tests/test_config/test_views.py:2476: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = None\nrequest = <r2e_tests.test_config.test_views.DummyRequest object at 0x7670085f3940>\n\n    def viewresult_to_response(context, request):\n        result = view(context, request)\n        if result.__class__ is Response: # common case\n            response = result\n        else:\n            response = registry.queryAdapterOrSelf(result, IResponse)\n            if response is None:\n                if result is None:\n                    append = (' You may have forgotten to return a value '\n                              'from the view callable.')\n                elif isinstance(result, dict):\n                    append = (' You may have forgotten to define a '\n                              'renderer in the view configuration.')\n                else:\n                    append = ''\n    \n                msg = ('Could not convert return value of the view '\n                       'callable %s into a response object. '\n                       'The value returned was %r.' + append)\n    \n>               raise ValueError(msg % (view_description(view), result))\nE               ValueError: Could not convert return value of the view callable method theviewmethod of class r2e_tests.test_config.test_views.AView into a response object. The value returned was None. You may have forgotten to return a value from the view callable.\n\npyramid/config/views.py:404: ValueError\n\nDuring handling of the above exception, another exception occurred:\n\nself = <r2e_tests.test_config.test_views.TestViewDeriver testMethod=test_requestonly_nondefault_method_returns_non_adaptable>\n\n    def test_requestonly_nondefault_method_returns_non_adaptable(self):\n        request = DummyRequest()\n        class AView(object):\n            def __init__(self, request):\n                pass\n            def theviewmethod(self):\n                return None\n        deriver = self._makeOne(attr='theviewmethod')\n        result = deriver(AView)\n        self.assertFalse(result is AView)\n        try:\n            result(None, request)\n        except ValueError as e:\n>           self.assertEqual(\n                e.args[0],\n                'Could not convert return value of the view callable '\n                'method theviewmethod of '\n                'class pyramid.tests.test_config.test_views.AView into a '\n                'response object. The value returned was None. You may have '\n                'forgotten to return a value from the view callable.'\n                )\nE           AssertionError: 'Coul[73 chars]lass r2e_tests.test_config.test_views.AView in[111 chars]ble.' != 'Coul[73 chars]lass pyramid.tests.test_config.test_views.AVie[115 chars]ble.'\nE           Diff is 669 characters long. Set self.maxDiff to None to see it.\n\nr2e_tests/test_config/test_views.py:2478: 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(): pass\n        result = self._callFUT(view)\n>       self.assertEqual(result,\n                         'function pyramid.tests.test_config.test_views.view')\nE       AssertionError: 'function r2e_tests.test_config.test_views.view' != 'function pyramid.tests.test_config.test_views.view'\nE       - function r2e_tests.test_config.test_views.view\nE       ?           ^^^\nE       + function pyramid.tests.test_config.test_views.view\nE       ?          ++ ^^^^^\n\nr2e_tests/test_config/test_views.py:3937: AssertionError\n_______________ TestPRequestCommand.test_command_display_headers _______________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_display_headers>\n\n    def test_command_display_headers(self):\n        command = self._makeOne(\n            ['', '--display-headers', 'development.ini', '/'])\n        command.run()\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(\n            self._out,\n            ['200 OK', 'Content-Type: text/html; charset=UTF-8', 'abc'])\nE       AssertionError: Lists differ: ['200 OK', b'abc'] != ['200 OK', 'Content-Type: text/html; charset=UTF-8', 'abc']\nE       \nE       First differing element 1:\nE       b'abc'\nE       'Content-Type: text/html; charset=UTF-8'\nE       \nE       Second list contains 1 additional elements.\nE       First extra element 2:\nE       'abc'\nE       \nE       - ['200 OK', b'abc']\nE       + ['200 OK', 'Content-Type: text/html; charset=UTF-8', 'abc']\n\nr2e_tests/test_scripts/test_prequest.py:202: AssertionError\n_________ TestPRequestCommand.test_command_has_content_type_header_var _________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_has_content_type_header_var>\n\n    def test_command_has_content_type_header_var(self):\n        command = self._makeOne(\n            ['', '--header=content-type:app/foo','development.ini', '/'])\n        command.run()\n        self.assertEqual(self._environ['CONTENT_TYPE'], 'app/foo')\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:92: AssertionError\n_____________ TestPRequestCommand.test_command_has_good_header_var _____________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_has_good_header_var>\n\n    def test_command_has_good_header_var(self):\n        command = self._makeOne(\n            ['', '--header=name:value','development.ini', '/'])\n        command.run()\n        self.assertEqual(self._environ['HTTP_NAME'], 'value')\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:69: AssertionError\n__________ TestPRequestCommand.test_command_has_multiple_header_vars ___________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_has_multiple_header_vars>\n\n    def test_command_has_multiple_header_vars(self):\n        command = self._makeOne(\n            ['',\n             '--header=name:value',\n             '--header=name2:value2',\n             'development.ini',\n             '/'])\n        command.run()\n        self.assertEqual(self._environ['HTTP_NAME'], 'value')\n        self.assertEqual(self._environ['HTTP_NAME2'], 'value2')\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:107: AssertionError\n_________________ TestPRequestCommand.test_command_method_get __________________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_method_get>\n\n    def test_command_method_get(self):\n        command = self._makeOne(['', '--method=GET', 'development.ini', '/'])\n        command.run()\n        self.assertEqual(self._environ['REQUEST_METHOD'], 'GET')\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:116: AssertionError\n_______________ TestPRequestCommand.test_command_method_options ________________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_method_options>\n\n    def test_command_method_options(self):\n        from pyramid.compat import NativeIO\n        command = self._makeOne(['', '--method=OPTIONS', 'development.ini',\n                                '/'])\n        stdin = NativeIO()\n        command.stdin = stdin\n        command.run()\n        self.assertEqual(self._environ['REQUEST_METHOD'], 'OPTIONS')\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:184: AssertionError\n________________ TestPRequestCommand.test_command_method_patch _________________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_method_patch>\n\n    def test_command_method_patch(self):\n        from pyramid.compat import NativeIO\n        command = self._makeOne(['', '--method=PATCH', 'development.ini', '/'])\n        stdin = NativeIO()\n        command.stdin = stdin\n        command.run()\n        self.assertEqual(self._environ['REQUEST_METHOD'], 'PATCH')\n        self.assertEqual(self._environ['CONTENT_LENGTH'], '-1')\n        self.assertEqual(self._environ['wsgi.input'], stdin)\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:158: AssertionError\n_________________ TestPRequestCommand.test_command_method_post _________________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_method_post>\n\n    def test_command_method_post(self):\n        from pyramid.compat import NativeIO\n        command = self._makeOne(['', '--method=POST', 'development.ini', '/'])\n        stdin = NativeIO()\n        command.stdin = stdin\n        command.run()\n        self.assertEqual(self._environ['REQUEST_METHOD'], 'POST')\n        self.assertEqual(self._environ['CONTENT_LENGTH'], '-1')\n        self.assertEqual(self._environ['wsgi.input'], stdin)\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:130: AssertionError\n_______________ TestPRequestCommand.test_command_method_propfind _______________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_method_propfind>\n\n    def test_command_method_propfind(self):\n        from pyramid.compat import NativeIO\n        command = self._makeOne(['', '--method=PROPFIND', 'development.ini',\n                                '/'])\n        stdin = NativeIO()\n        command.stdin = stdin\n        command.run()\n        self.assertEqual(self._environ['REQUEST_METHOD'], 'PROPFIND')\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:171: AssertionError\n_________________ TestPRequestCommand.test_command_method_put __________________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_method_put>\n\n    def test_command_method_put(self):\n        from pyramid.compat import NativeIO\n        command = self._makeOne(['', '--method=PUT', 'development.ini', '/'])\n        stdin = NativeIO()\n        command.stdin = stdin\n        command.run()\n        self.assertEqual(self._environ['REQUEST_METHOD'], 'PUT')\n        self.assertEqual(self._environ['CONTENT_LENGTH'], '-1')\n        self.assertEqual(self._environ['wsgi.input'], stdin)\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:144: AssertionError\n________ TestPRequestCommand.test_command_path_doesnt_start_with_slash _________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_path_doesnt_start_with_slash>\n\n    def test_command_path_doesnt_start_with_slash(self):\n        command = self._makeOne(['', 'development.ini', 'abc'])\n        command.run()\n        self.assertEqual(self._path_info, '/abc')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:50: AssertionError\n__________________ TestPRequestCommand.test_command_two_args ___________________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_two_args>\n\n    def test_command_two_args(self):\n        command = self._makeOne(['', 'development.ini', '/'])\n        command.run()\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:42: AssertionError\n________________ TestPRequestCommand.test_command_w_basic_auth _________________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_w_basic_auth>\n\n    def test_command_w_basic_auth(self):\n        command = self._makeOne(\n            ['', '--login=user:password',\n                 '--header=name:value','development.ini', '/'])\n        command.run()\n        self.assertEqual(self._environ['HTTP_NAME'], 'value')\n        self.assertEqual(self._environ['HTTP_AUTHORIZATION'],\n                        'Basic dXNlcjpwYXNzd29yZA==')\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:82: AssertionError\n______________ TestPRequestCommand.test_command_with_query_string ______________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_with_query_string>\n\n    def test_command_with_query_string(self):\n        command = self._makeOne(['', 'development.ini', '/abc?a=1&b=2&c'])\n        command.run()\n        self.assertEqual(self._environ['QUERY_STRING'], 'a=1&b=2&c')\n        self.assertEqual(self._path_info, '/abc')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:193: 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        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n        def view(): pass\n        view.__request_attrs__ = {'context': 'context', 'view_name': 'a'}\n        command._find_view = lambda arg1: view\n        command.args = ('/foo/bar/myapp.ini#myapp', '/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],\n                         '    pyramid.tests.test_scripts.test_pviews.view')\nE       AssertionError: '    r2e_tests.test_scripts.test_pviews.view' != '    pyramid.tests.test_scripts.test_pviews.view'\nE       -     r2e_tests.test_scripts.test_pviews.view\nE       ?      ^^^\nE       +     pyramid.tests.test_scripts.test_pviews.view\nE       ?     ++ ^^^^^\n\nr2e_tests/test_scripts/test_pviews.py:296: AssertionError\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_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_timed_out\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_remember\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_long_userid\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_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_secure\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::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::TestSimpleSerializer::test_dumps\nPASSED r2e_tests/test_1.py::TestSimpleSerializer::test_loads\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_directory\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_directory_with_package\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_file\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_directory\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_package_with_package\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_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_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::TestPackageOverrides::test_search_path\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_unnamed_callable\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_request_factory_dottedname\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_root_factory_dottedname\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_session_factory\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_session_factory_dottedname\nPASSED r2e_tests/test_config/test_factories.py::TestDeprecatedFactoriesMixinMethods::test_set_multiple_request_properties\nPASSED r2e_tests/test_config/test_factories.py::TestDeprecatedFactoriesMixinMethods::test_set_multiple_request_properties_conflict\nPASSED r2e_tests/test_config/test_factories.py::TestDeprecatedFactoriesMixinMethods::test_set_request_property_with_callable\nPASSED r2e_tests/test_config/test_factories.py::TestDeprecatedFactoriesMixinMethods::test_set_request_property_with_property\nPASSED r2e_tests/test_config/test_factories.py::TestDeprecatedFactoriesMixinMethods::test_set_request_property_with_unnamed_callable\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_i18n.py::TestI18NConfiguratorMixin::test_set_locale_negotiator_dottedname\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_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_action_autocommit_with_introspectables\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_autocommit_with_introspectables_introspection_off\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_branching_kw_is_None\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_branching_kw_is_not_None\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_branching_nonautocommit_with_config_info\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_branching_nonautocommit_with_introspectables\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_branching_nonautocommit_without_config_info\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_nonautocommit_with_introspectables_introspection_off\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_autocommit_no_conflicts\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_begin\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_begin_with_request\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_commit_conflict_resolved_with_include\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_commit_conflict_resolved_with_two_includes_and_local\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_commit_conflict_simple\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_commit_conflict_with_two_includes\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_conflict_set_forbidden_view\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_conflict_set_notfound_view\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_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_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_python_callable\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_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_tweens\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_module\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::TestActionState::test_action_simple\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_with_includepath\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_with_includepath_and_info\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_with_info\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_with_introspectables\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_with_order\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_execute_actions_dicts\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_execute_actions_error\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_execute_actions_tuples\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_execute_actions_with_introspectable_no_callable\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_execute_actions_with_introspectables\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_it\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_processSpec\nPASSED r2e_tests/test_config/test_init.py::Test_resolveConflicts::test_it_conflict\nPASSED r2e_tests/test_config/test_init.py::Test_resolveConflicts::test_it_success_dicts\nPASSED r2e_tests/test_config/test_init.py::Test_resolveConflicts::test_it_success_tuples\nPASSED r2e_tests/test_config/test_init.py::Test_resolveConflicts::test_it_with_actions_grouped_by_order\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::TestXHRPredicate::test___call___false\nPASSED r2e_tests/test_config/test_predicates.py::TestXHRPredicate::test___call___true\nPASSED r2e_tests/test_config/test_predicates.py::TestXHRPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::TestXHRPredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestMethodPredicate::test___call___false\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestMethodPredicate::test___call___true_multi\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestMethodPredicate::test___call___true_single\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestMethodPredicate::test_ctor_get_but_no_head\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestMethodPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestMethodPredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::TestPathInfoPredicate::test___call___false\nPASSED r2e_tests/test_config/test_predicates.py::TestPathInfoPredicate::test___call___true\nPASSED r2e_tests/test_config/test_predicates.py::TestPathInfoPredicate::test_ctor_compilefail\nPASSED r2e_tests/test_config/test_predicates.py::TestPathInfoPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::TestPathInfoPredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test___call___false\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test___call___false_multi\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test___call___true_exists\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test___call___true_multi\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test___call___true_withval\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test_phash_exists\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test_phash_withval\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test_text_exists\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test_text_multi\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test_text_withval\nPASSED r2e_tests/test_config/test_predicates.py::TestMatchParamPredicate::test___call___false\nPASSED r2e_tests/test_config/test_predicates.py::TestMatchParamPredicate::test___call___matchdict_is_None\nPASSED r2e_tests/test_config/test_predicates.py::TestMatchParamPredicate::test___call___true_multi\nPASSED r2e_tests/test_config/test_predicates.py::TestMatchParamPredicate::test___call___true_single\nPASSED r2e_tests/test_config/test_predicates.py::TestMatchParamPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::TestMatchParamPredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::TestCustomPredicate::test___call___false\nPASSED r2e_tests/test_config/test_predicates.py::TestCustomPredicate::test___call___true\nPASSED r2e_tests/test_config/test_predicates.py::TestCustomPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::TestCustomPredicate::test_text_func_has___text__\nPASSED r2e_tests/test_config/test_predicates.py::TestCustomPredicate::test_text_func_repr\nPASSED r2e_tests/test_config/test_predicates.py::TestTraversePredicate::test___call__traverse_has_remainder_already\nPASSED r2e_tests/test_config/test_predicates.py::TestTraversePredicate::test___call__traverse_matches\nPASSED r2e_tests/test_config/test_predicates.py::TestTraversePredicate::test___call__traverse_matches_with_highorder_chars\nPASSED r2e_tests/test_config/test_predicates.py::TestTraversePredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::TestTraversePredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::Test_CheckCSRFTokenPredicate::test_it_call_val_False\nPASSED r2e_tests/test_config/test_predicates.py::Test_CheckCSRFTokenPredicate::test_it_call_val_True\nPASSED r2e_tests/test_config/test_predicates.py::Test_CheckCSRFTokenPredicate::test_it_call_val_str\nPASSED r2e_tests/test_config/test_predicates.py::Test_CheckCSRFTokenPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::Test_CheckCSRFTokenPredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test___call___false\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test___call___false_withregex\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test___call___true_exists\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test___call___true_withregex\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test___call___true_withval\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test_phash_exists\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test_phash_withregex\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test_phash_withval\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test_text_exists\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test_text_withregex\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test_text_withval\nPASSED r2e_tests/test_config/test_predicates.py::Test_PhysicalPathPredicate::test_it_call_False\nPASSED r2e_tests/test_config/test_predicates.py::Test_PhysicalPathPredicate::test_it_call_context_has_no_name\nPASSED r2e_tests/test_config/test_predicates.py::Test_PhysicalPathPredicate::test_it_call_val_list_True\nPASSED r2e_tests/test_config/test_predicates.py::Test_PhysicalPathPredicate::test_it_call_val_str_True\nPASSED r2e_tests/test_config/test_predicates.py::Test_PhysicalPathPredicate::test_it_call_val_tuple_True\nPASSED r2e_tests/test_config/test_predicates.py::Test_PhysicalPathPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::Test_PhysicalPathPredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::Test_EffectivePrincipalsPredicate::test_it_call_authentication_policy_doesnt_provide_superset\nPASSED r2e_tests/test_config/test_predicates.py::Test_EffectivePrincipalsPredicate::test_it_call_authentication_policy_provides_superset\nPASSED r2e_tests/test_config/test_predicates.py::Test_EffectivePrincipalsPredicate::test_it_call_authentication_policy_provides_superset_implicit\nPASSED r2e_tests/test_config/test_predicates.py::Test_EffectivePrincipalsPredicate::test_it_call_no_authentication_policy\nPASSED r2e_tests/test_config/test_predicates.py::Test_EffectivePrincipalsPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::Test_EffectivePrincipalsPredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::Test_EffectivePrincipalsPredicate::test_text_noniter\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_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_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_factory_dottedname\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_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_route_prefix\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_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_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_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_permission\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_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::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_getattr_fail\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_getattr_raises_attribute_error\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_getattr_success\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_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_dottedname\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_dottedname\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_distinct\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::TestTweensConfiguratorMixin::test_add_tweens_names_with_underover\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_util.py::TestPredicateList::test_custom_predicates_can_affect_traversal\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_different_custom_predicates_with_same_hash\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_match_param_from_dict\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_match_param_from_dict_fails\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_match_param_from_string\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_match_param_from_string_fails\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_notted\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_ordering_importance_and_number\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_ordering_importance_of_predicates\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_ordering_number_of_predicates\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_ordering_xhr_and_request_method_trump_only_containment\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_predicate_text_is_correct\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_request_method_ordering_hashes_same\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_request_method_sequence\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_traverse_has_remainder_already\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_traverse_matches\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_traverse_matches_with_highorder_chars\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_unknown_predicate\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_defaultargs_firstname_not_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_defaultargs_firstname_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_noargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_onearg_named_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_onearg_named_somethingelse\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_toomanyargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_with_attr_false\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_with_attr_true\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_defaultargs_firstname_not_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_defaultargs_firstname_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_defaultargs_onearg_named_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_defaultargs_onearg_named_somethingelse\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_nocall\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_toomanyargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_method_onearg_named_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_newstyle_class_init_defaultargs_firstname_not_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_newstyle_class_init_defaultargs_firstname_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_newstyle_class_init_firstname_request_with_secondname\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_newstyle_class_init_noargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_newstyle_class_init_onearg_named_somethingelse\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_defaultargs_firstname_not_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_defaultargs_firstname_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_noargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_onearg_named_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_onearg_named_somethingelse\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_toomanyargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_no_init\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_requestonly_newstyle_class_init_onearg_named_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_requestonly_newstyle_class_init_toomanyargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_requestonly_newstyle_class_no_init\nPASSED r2e_tests/test_config/test_util.py::TestNotted::test_it_with_phash_val\nPASSED r2e_tests/test_config/test_util.py::TestNotted::test_it_without_phash_val\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_http_cache\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_with_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_with_view_defaults\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_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_http_cache\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_with_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_with_view_defaults\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_context_as_class\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_context_as_dottedname\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_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_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_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_register_secured_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_for__as_dottedname\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_dottedname\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_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_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_view_defaults\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_defaults_viewname_is_dottedname_kwarg\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_defaults_viewname_is_dottedname_nonkwarg\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_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_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::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::TestViewDeriver::test_as_function_context_and_request\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_as_function_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_as_instance_context_and_request\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_as_instance_context_and_request_attr_and_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_as_instance_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_as_instance_requestonly_attr_and_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_as_newstyle_class_context_and_request\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_as_newstyle_class_context_and_request_attr_and_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_as_newstyle_class_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_as_newstyle_class_requestonly_attr_and_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_as_oldstyle_class_context_and_request\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_as_oldstyle_class_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_as_oldstyle_cls_context_request_attr_and_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_as_oldstyle_cls_requestonly_attr_and_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_attr_wrapped_view_branching_default_phash\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_attr_wrapped_view_branching_nondefault_phash\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_class_with_attr\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_class_without_attr\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_debug_auth_permission_authpol_denied\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_debug_auth_permission_authpol_denied2\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_debug_auth_permission_authpol_overridden\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_debug_auth_permission_authpol_permitted\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_debug_auth_permission_authpol_permitted_no_request\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_function_returns_true_Response_no_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_function_returns_true_Response_with_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_http_cached_prevent_http_cache_in_settings\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_http_cached_view_bad_tuple\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_http_cached_view_integer\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_http_cached_view_prevent_auto_set\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_http_cached_view_timedelta\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_http_cached_view_tuple\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_http_cached_view_tuple_seconds_None\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_predicate_mismatch_exception_has_text_in_detail\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_predicate_mismatch_view_has_name\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_predicate_mismatch_view_has_no_name\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_requestonly_function\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_requestonly_function_with_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_requestonly_function_with_renderer_request_has_view\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_requestonly_function_with_renderer_request_override\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_secured_view_authn_policy_no_authz_policy\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_secured_view_authz_policy_no_authn_policy\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_secured_view_raises_forbidden_no_name\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_secured_view_raises_forbidden_with_name\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_with_debug_authorization_authn_policy_no_authz_policy\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_with_debug_authorization_authz_policy_no_authn_policy\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_with_debug_authorization_no_authpol\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_with_debug_authorization_no_permission\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_with_predicates_all\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_with_predicates_checker\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_with_predicates_notall\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_with_view_mapper_config_specified\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_with_view_mapper_default_mapper_specified\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_with_view_mapper_view_specified\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_with_wrapper_viewname\nPASSED r2e_tests/test_config/test_views.py::TestViewDeriver::test_with_wrapper_viewname_notfound\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_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_registration_no_registry_on_request\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_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_scripts/test_common.py::Test_logging_file_config::test_it\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_pcreate.py::TestPCreateCommand::test_known_scaffold_absolute_path\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_known_scaffold_multiple_rendered\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_known_scaffold_single_rendered\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_known_scaffold_with_path_as_project_target_rendered\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_no_project_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_run_no_scaffold_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_run_show_scaffolds_exist\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_run_show_scaffolds_none_exist\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_unknown_scaffold_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::Test_main::test_it\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_has_bad_config_header\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_response_has_no_charset\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_good_args\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_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\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::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_get_options_no_command\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_get_options_with_command\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_record_pid_not_verbose\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_record_pid_verbose\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_remove_pid_current_pid_is_not_pid_in_file\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_remove_pid_current_pid_is_not_written_pid\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_remove_pid_file_not_verbose\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_remove_pid_file_stale_pid_write_exception\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_remove_pid_file_unlink_exception\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_remove_pid_file_verbose\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_remove_pid_no_pid_file\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_remove_pid_not_a_number\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_run_no_args\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_run_stop_daemon_bad_pid_file\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_run_stop_daemon_invalid_pid_in_file\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_run_stop_daemon_no_such_pid_file\nPASSED r2e_tests/test_scripts/test_pserve.py::Test_read_pidfile::test_read_pidfile\nPASSED r2e_tests/test_scripts/test_pserve.py::Test_read_pidfile::test_read_pidfile_no_pid_file\nPASSED r2e_tests/test_scripts/test_pserve.py::Test_read_pidfile::test_read_pidfile_not_a_number\nPASSED r2e_tests/test_scripts/test_pserve.py::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_pserve.py::TestLazyWriter::test_flush\nPASSED r2e_tests/test_scripts/test_pserve.py::TestLazyWriter::test_open\nPASSED r2e_tests/test_scripts/test_pserve.py::TestLazyWriter::test_write\nPASSED r2e_tests/test_scripts/test_pserve.py::TestLazyWriter::test_writeline\nPASSED r2e_tests/test_scripts/test_pserve.py::Test__methodwrapper::test___call__fail\nPASSED r2e_tests/test_scripts/test_pserve.py::Test__methodwrapper::test___call__succeed\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_loads_bpython_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_default_shell_with_unknown_shell\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_ipython_v0_10\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_ipython_v0_11\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_ipython_v1_1\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_make_bpython_shell\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_make_default_shell\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_make_ipython_v0_10_shell\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_make_ipython_v0_11_shell\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_make_ipython_v1_1_shell\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_shell_ipython_ordering\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_shell_ordering\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_multi_view_nested\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_multiview\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_multiview_with_permission\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_multiview_with_predicates\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::TestPViewsCommand::test_views_command_single_view_route\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_route_with_route_predicates\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_traversal\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_traversal_with_permission\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_traversal_with_predicates\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::TestRepozeWho1AuthenticationPolicy::test_remember_kwargs\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::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::TestPackageOverrides::test_get_filename\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_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_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_scan_integration_conflict\nFAILED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_debug_logger_None_default\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_views.py::TestViewsConfigurationMixin::test_add_static_view_package_here_relative\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_custom_predicate_bests_standard_predicate\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_custom_predicates_match\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_custom_predicates_nomatch\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::TestViewDeriver::test_function_returns_non_adaptable\nFAILED r2e_tests/test_config/test_views.py::TestViewDeriver::test_function_returns_non_adaptable_dict\nFAILED r2e_tests/test_config/test_views.py::TestViewDeriver::test_instance_returns_non_adaptable\nFAILED r2e_tests/test_config/test_views.py::TestViewDeriver::test_requestonly_default_method_returns_non_adaptable\nFAILED r2e_tests/test_config/test_views.py::TestViewDeriver::test_requestonly_nondefault_method_returns_non_adaptable\nFAILED r2e_tests/test_config/test_views.py::Test_view_description::test_without_text\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_display_headers\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_has_content_type_header_var\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_has_good_header_var\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_has_multiple_header_vars\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_get\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_options\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_patch\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_post\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_propfind\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_put\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_path_doesnt_start_with_slash\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_two_args\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_w_basic_auth\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_with_query_string\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_function_traversal\n======================== 60 failed, 931 passed in 5.01s ========================\n",
    "old_commit_res_stderr": ""
}
pyramid/authentication.py pyramid/tests/test_authentication.py
We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
**Analysis:**

- **Key Parts:**
  - **Commit Details:** The commit modifies the `remember` method in `RepozeWho1AuthenticationPolicy` to accept `**kw` and include them in the identity dictionary.
  - **Test Results:** The test `test_remember_kwargs` fails in the old commit because the `remember` method does not include the `max_age` keyword argument in the identity dictionary. After the commit, this test passes as the method correctly includes `max_age`.
  
- **Main Problem:** The `remember` method does not handle additional keyword arguments, causing tests that expect these arguments (like `max_age`) to fail.

- **Expected Behavior:** The `remember` method should include all provided keyword arguments as part of the identity dictionary passed to `repoze.who`, allowing parameters like `max_age` to be utilized.

- **Actual Behavior:** The `remember` method only includes the `repoze.who.userid` key in the identity dictionary, ignoring any additional keyword arguments such as `max_age`.

- **Issue Description:** The `remember` method fails to include additional keyword arguments, causing certain functionalities that rely on these parameters to malfunction or tests to fail.

**Drafted Issue:**

[ISSUE]
**Title:** `RepozeWho1AuthenticationPolicy.remember` Ignoring Additional Keyword Arguments

**Description:**
When attempting to use the `remember` method with additional keyword arguments, the extra parameters are not included in the identity dictionary passed to `repoze.who`. This omission causes tests that rely on these parameters, such as `max_age`, to fail.

**Example Code:**
```python
authtkt = DummyWhoPlugin()
request = DummyRequest({'repoze.who.plugins': {'auth_tkt': authtkt}})
policy = RepozeWho1AuthenticationPolicy()
result = policy.remember(request, 'fred', max_age=23)
```

**Expected Behavior:**
The `remember` method should include all provided keyword arguments in the identity dictionary. For example, the identity should be:
```python
{'repoze.who.userid': 'fred', 'max_age': 23}
```

**Actual Behavior:**
The `remember` method only includes the `repoze.who.userid` key, resulting in the identity:
```python
{'repoze.who.userid': 'fred'}
```
This causes assertions expecting the `max_age` key to fail.
[/ISSUE]
--- END ISSUE ---

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

--- BEGIN FILE ---
```
### pyramid/authentication.py
import binascii
from codecs import utf_8_decode
from codecs import utf_8_encode
import hashlib
import base64
import datetime
import re
import time as time_mod
import warnings

from zope.interface import implementer

from webob.cookies import CookieProfile

from pyramid.compat import (
    long,
    text_type,
    binary_type,
    url_unquote,
    url_quote,
    bytes_,
    ascii_native_,
    native_,
    )

from pyramid.interfaces import (
    IAuthenticationPolicy,
    IDebugLogger,
    )

from pyramid.security import (
    Authenticated,
    Everyone,
    )

from pyramid.util import strings_differ

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

class CallbackAuthenticationPolicy(object):
    """ 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.security.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.security.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.security.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.security.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, principal, **kw):
        """ Store the ``principal`` as ``repoze.who.userid``."""
        identifier = self._get_identifier(request)
        if identifier is None:
            return []
        environ = request.environ
        identity = {'repoze.who.userid':principal}
        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, principal, **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 []

_marker = object()

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

    .. warning::

       The default hash algorithm used in this policy is MD5 and has known
       hash collision vulnerabilities. The risk of an exploit is low.
       However, for improved authentication security, use
       ``hashalg='sha512'``.

    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.

       This option is available as of :app:`Pyramid` 1.5.

    ``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.

       This option is available as of :app:`Pyramid` 1.5.

    ``hashalg``

       Default: ``md5`` (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.

       A warning is emitted at startup if an explicit ``hashalg`` is not
       passed.  This is for backwards compatibility reasons.

       This option is available as of :app:`Pyramid` 1.4.

       Optional.

       .. note::

          ``md5`` is the default for backwards compatibility reasons. However,
          if you don't specify ``md5`` as the hashalg explicitly, a warning is
          issued at application startup time.  An explicit value of ``sha512``
          is recommended for improved security, and ``sha512`` will become the
          default in a future Pyramid version.

    ``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,
                 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=_marker,
                 parent_domain=False,
                 domain=None,
                 ):
        if hashalg is _marker:
            hashalg = 'md5'
            warnings.warn(
                'The MD5 hash function used by default by the '
                'AuthTktAuthenticationPolicy is known to be '
                'susceptible to collision attacks.  It is the current default '
                'for backwards compatibility reasons, but we recommend that '
                'you use the SHA512 algorithm instead for improved security.  '
                'Pass ``hashalg=\'sha512\'`` to the '
                'AuthTktAuthenticationPolicy constructor to do so.\n\nNote '
                'that a change to the hash algorithms will invalidate existing '
                'auth tkt cookies set by your application.  If backwards '
                'compatibility of existing auth tkt cookies is of greater '
                'concern than the risk posed by the potential for a hash '
                'collision, you\'ll want to continue using MD5 explicitly.  '
                'To do so, pass ``hashalg=\'md5\'`` in your application to '
                'the AuthTktAuthenticationPolicy constructor.   When you do so '
                'this warning will not be emitted again.  The default '
                'algorithm used in this policy will change in the future, so '
                'setting an explicit hashalg will futureproof your '
                'application.',
                DeprecationWarning,
                stacklevel=2
                )
        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,
            )
        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, principal, **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, principal, **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(object):
    """
    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),
                           url_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 = 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 = url_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(object):
    """
    A helper class for use in third-party authentication policy
    implementations.  See
    :class:`pyramid.authentication.AuthTktAuthenticationPolicy` for the
    meanings of the constructor arguments.
    """
    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),
        long: ('int', str),
        text_type: ('b64unicode', lambda x: b64encode(utf_8_encode(x)[0])),
        binary_type: ('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='md5', parent_domain=False, domain=None):

        serializer = _SimpleSerializer()
            
        self.cookie_profile = CookieProfile(
            cookie_name = cookie_name,
            secure = secure,
            max_age = max_age,
            httponly = http_only,
            path = path,
            serializer=serializer
            )

        self.secret = secret
        self.cookie_name = cookie_name
        self.secure = secure
        self.include_ip = include_ip
        self.timeout = timeout
        self.reissue_time = reissue_time
        self.max_age = 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 ):
                # work around 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: ``()``.
        """
        if max_age is None:
            max_age = self.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
            userid = encoder(userid)
            user_data = 'userid_type:%s' % encoding

        new_tokens = []
        for token in tokens:
            if isinstance(token, text_type):
                try:
                    token = ascii_native_(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.prefix = prefix or ''
        self.userid_key = prefix + 'userid'
        self.debug = debug

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

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

    def unauthenticated_userid(self, request):
        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 basic_challenge(request):
            response = HTTPUnauthorized()
            response.headers.update(forget(request))
            return response
    """
    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 = self._get_credentials(request)
        if credentials:
            return credentials[0]

    def remember(self, request, principal, **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 _get_credentials winds up
        # getting called twice when authenticated_userid is called.  Avoiding
        # that, however, winds up duplicating logic from the superclass.
        credentials = self._get_credentials(request)
        if credentials:
            username, password = credentials
            return self.check(username, password, request)

    def _get_credentials(self, request):
        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 username, password

class _SimpleSerializer(object):
    def loads(self, bstruct):
        return native_(bstruct)

    def dumps(self, appstruct):
        return bytes_(appstruct)


```
--- 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.
**Analysis:**

- **Key Parts:**
  - **Commit Details:** The commit modifies the `remember` method in `RepozeWho1AuthenticationPolicy` to accept `**kw` and include them in the identity dictionary.
  - **Test Results:** The test `test_remember_kwargs` fails in the old commit because the `remember` method does not include the `max_age` keyword argument in the identity dictionary. After the commit, this test passes as the method correctly includes `max_age`.
  
- **Main Problem:** The `remember` method does not handle additional keyword arguments, causing tests that expect these arguments (like `max_age`) to fail.

- **Expected Behavior:** The `remember` method should include all provided keyword arguments as part of the identity dictionary passed to `repoze.who`, allowing parameters like `max_age` to be utilized.

- **Actual Behavior:** The `remember` method only includes the `repoze.who.userid` key in the identity dictionary, ignoring any additional keyword arguments such as `max_age`.

- **Issue Description:** The `remember` method fails to include additional keyword arguments, causing certain functionalities that rely on these parameters to malfunction or tests to fail.

**Drafted Issue:**

[ISSUE]
**Title:** `RepozeWho1AuthenticationPolicy.remember` Ignoring Additional Keyword Arguments

**Description:**
When attempting to use the `remember` method with additional keyword arguments, the extra parameters are not included in the identity dictionary passed to `repoze.who`. This omission causes tests that rely on these parameters, such as `max_age`, to fail.

**Example Code:**
```python
authtkt = DummyWhoPlugin()
request = DummyRequest({'repoze.who.plugins': {'auth_tkt': authtkt}})
policy = RepozeWho1AuthenticationPolicy()
result = policy.remember(request, 'fred', max_age=23)
```

**Expected Behavior:**
The `remember` method should include all provided keyword arguments in the identity dictionary. For example, the identity should be:
```python
{'repoze.who.userid': 'fred', 'max_age': 23}
```

**Actual Behavior:**
The `remember` method only includes the `repoze.who.userid` key, resulting in the identity:
```python
{'repoze.who.userid': 'fred'}
```
This causes assertions expecting the `max_age` key to fail.
[/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_timed_out": "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_remember": "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_long_userid": "PASSED",
    "TestAuthTktCookieHelper.test_remember_max_age": "PASSED",
    "TestAuthTktCookieHelper.test_remember_nonascii_token": "PASSED",
    "TestAuthTktCookieHelper.test_remember_parent_domain": "PASSED",
    "TestAuthTktCookieHelper.test_remember_parent_domain_supercedes_wild_domain": "PASSED",
    "TestAuthTktCookieHelper.test_remember_path": "PASSED",
    "TestAuthTktCookieHelper.test_remember_secure": "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",
    "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",
    "TestSimpleSerializer.test_dumps": "PASSED",
    "TestSimpleSerializer.test_loads": "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_directory": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_directory_with_file": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_directory_with_package": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_file_with_directory": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_file_with_file": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_file_with_package": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_package_with_directory": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_package_with_package": "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_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_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",
    "TestPackageOverrides.test_search_path": "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_unnamed_callable": "PASSED",
    "TestFactoriesMixin.test_set_multiple_request_methods_conflict": "PASSED",
    "TestFactoriesMixin.test_set_request_factory": "PASSED",
    "TestFactoriesMixin.test_set_request_factory_dottedname": "PASSED",
    "TestFactoriesMixin.test_set_root_factory": "PASSED",
    "TestFactoriesMixin.test_set_root_factory_as_None": "PASSED",
    "TestFactoriesMixin.test_set_root_factory_dottedname": "PASSED",
    "TestFactoriesMixin.test_set_session_factory": "PASSED",
    "TestFactoriesMixin.test_set_session_factory_dottedname": "PASSED",
    "TestDeprecatedFactoriesMixinMethods.test_set_multiple_request_properties": "PASSED",
    "TestDeprecatedFactoriesMixinMethods.test_set_multiple_request_properties_conflict": "PASSED",
    "TestDeprecatedFactoriesMixinMethods.test_set_request_property_with_callable": "PASSED",
    "TestDeprecatedFactoriesMixinMethods.test_set_request_property_with_property": "PASSED",
    "TestDeprecatedFactoriesMixinMethods.test_set_request_property_with_unnamed_callable": "PASSED",
    "TestI18NConfiguratorMixin.test_add_translation_dirs_missing_dir": "PASSED",
    "TestI18NConfiguratorMixin.test_add_translation_dirs_no_specs": "PASSED",
    "TestI18NConfiguratorMixin.test_set_locale_negotiator": "PASSED",
    "TestI18NConfiguratorMixin.test_set_locale_negotiator_dottedname": "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_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_action_autocommit_with_introspectables": "PASSED",
    "ConfiguratorTests.test_action_autocommit_with_introspectables_introspection_off": "PASSED",
    "ConfiguratorTests.test_action_branching_kw_is_None": "PASSED",
    "ConfiguratorTests.test_action_branching_kw_is_not_None": "PASSED",
    "ConfiguratorTests.test_action_branching_nonautocommit_with_config_info": "PASSED",
    "ConfiguratorTests.test_action_branching_nonautocommit_with_introspectables": "PASSED",
    "ConfiguratorTests.test_action_branching_nonautocommit_without_config_info": "PASSED",
    "ConfiguratorTests.test_action_nonautocommit_with_introspectables_introspection_off": "PASSED",
    "ConfiguratorTests.test_autocommit_no_conflicts": "PASSED",
    "ConfiguratorTests.test_begin": "PASSED",
    "ConfiguratorTests.test_begin_with_request": "PASSED",
    "ConfiguratorTests.test_commit_conflict_resolved_with_include": "PASSED",
    "ConfiguratorTests.test_commit_conflict_resolved_with_two_includes_and_local": "PASSED",
    "ConfiguratorTests.test_commit_conflict_simple": "PASSED",
    "ConfiguratorTests.test_commit_conflict_with_two_includes": "PASSED",
    "ConfiguratorTests.test_conflict_set_forbidden_view": "PASSED",
    "ConfiguratorTests.test_conflict_set_notfound_view": "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_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_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_python_callable": "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_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_tweens": "PASSED",
    "ConfiguratorTests.test_unhook_zca": "PASSED",
    "ConfiguratorTests.test_with_package": "PASSED",
    "ConfiguratorTests.test_with_package_module": "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",
    "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_it": "PASSED",
    "TestActionState.test_processSpec": "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",
    "TestGlobalRegistriesIntegration.test_global_registries": "PASSED",
    "TestGlobalRegistriesIntegration.test_global_registries_empty": "PASSED",
    "TestXHRPredicate.test___call___false": "PASSED",
    "TestXHRPredicate.test___call___true": "PASSED",
    "TestXHRPredicate.test_phash": "PASSED",
    "TestXHRPredicate.test_text": "PASSED",
    "TestRequestMethodPredicate.test___call___false": "PASSED",
    "TestRequestMethodPredicate.test___call___true_multi": "PASSED",
    "TestRequestMethodPredicate.test___call___true_single": "PASSED",
    "TestRequestMethodPredicate.test_ctor_get_but_no_head": "PASSED",
    "TestRequestMethodPredicate.test_phash": "PASSED",
    "TestRequestMethodPredicate.test_text": "PASSED",
    "TestPathInfoPredicate.test___call___false": "PASSED",
    "TestPathInfoPredicate.test___call___true": "PASSED",
    "TestPathInfoPredicate.test_ctor_compilefail": "PASSED",
    "TestPathInfoPredicate.test_phash": "PASSED",
    "TestPathInfoPredicate.test_text": "PASSED",
    "TestRequestParamPredicate.test___call___false": "PASSED",
    "TestRequestParamPredicate.test___call___false_multi": "PASSED",
    "TestRequestParamPredicate.test___call___true_exists": "PASSED",
    "TestRequestParamPredicate.test___call___true_multi": "PASSED",
    "TestRequestParamPredicate.test___call___true_withval": "PASSED",
    "TestRequestParamPredicate.test_phash_exists": "PASSED",
    "TestRequestParamPredicate.test_phash_withval": "PASSED",
    "TestRequestParamPredicate.test_text_exists": "PASSED",
    "TestRequestParamPredicate.test_text_multi": "PASSED",
    "TestRequestParamPredicate.test_text_withval": "PASSED",
    "TestMatchParamPredicate.test___call___false": "PASSED",
    "TestMatchParamPredicate.test___call___matchdict_is_None": "PASSED",
    "TestMatchParamPredicate.test___call___true_multi": "PASSED",
    "TestMatchParamPredicate.test___call___true_single": "PASSED",
    "TestMatchParamPredicate.test_phash": "PASSED",
    "TestMatchParamPredicate.test_text": "PASSED",
    "TestCustomPredicate.test___call___false": "PASSED",
    "TestCustomPredicate.test___call___true": "PASSED",
    "TestCustomPredicate.test_phash": "PASSED",
    "TestCustomPredicate.test_text_func_has___text__": "PASSED",
    "TestCustomPredicate.test_text_func_repr": "PASSED",
    "TestTraversePredicate.test___call__traverse_has_remainder_already": "PASSED",
    "TestTraversePredicate.test___call__traverse_matches": "PASSED",
    "TestTraversePredicate.test___call__traverse_matches_with_highorder_chars": "PASSED",
    "TestTraversePredicate.test_phash": "PASSED",
    "TestTraversePredicate.test_text": "PASSED",
    "Test_CheckCSRFTokenPredicate.test_it_call_val_False": "PASSED",
    "Test_CheckCSRFTokenPredicate.test_it_call_val_True": "PASSED",
    "Test_CheckCSRFTokenPredicate.test_it_call_val_str": "PASSED",
    "Test_CheckCSRFTokenPredicate.test_phash": "PASSED",
    "Test_CheckCSRFTokenPredicate.test_text": "PASSED",
    "TestHeaderPredicate.test___call___false": "PASSED",
    "TestHeaderPredicate.test___call___false_withregex": "PASSED",
    "TestHeaderPredicate.test___call___true_exists": "PASSED",
    "TestHeaderPredicate.test___call___true_withregex": "PASSED",
    "TestHeaderPredicate.test___call___true_withval": "PASSED",
    "TestHeaderPredicate.test_phash_exists": "PASSED",
    "TestHeaderPredicate.test_phash_withregex": "PASSED",
    "TestHeaderPredicate.test_phash_withval": "PASSED",
    "TestHeaderPredicate.test_text_exists": "PASSED",
    "TestHeaderPredicate.test_text_withregex": "PASSED",
    "TestHeaderPredicate.test_text_withval": "PASSED",
    "Test_PhysicalPathPredicate.test_it_call_False": "PASSED",
    "Test_PhysicalPathPredicate.test_it_call_context_has_no_name": "PASSED",
    "Test_PhysicalPathPredicate.test_it_call_val_list_True": "PASSED",
    "Test_PhysicalPathPredicate.test_it_call_val_str_True": "PASSED",
    "Test_PhysicalPathPredicate.test_it_call_val_tuple_True": "PASSED",
    "Test_PhysicalPathPredicate.test_phash": "PASSED",
    "Test_PhysicalPathPredicate.test_text": "PASSED",
    "Test_EffectivePrincipalsPredicate.test_it_call_authentication_policy_doesnt_provide_superset": "PASSED",
    "Test_EffectivePrincipalsPredicate.test_it_call_authentication_policy_provides_superset": "PASSED",
    "Test_EffectivePrincipalsPredicate.test_it_call_authentication_policy_provides_superset_implicit": "PASSED",
    "Test_EffectivePrincipalsPredicate.test_it_call_no_authentication_policy": "PASSED",
    "Test_EffectivePrincipalsPredicate.test_phash": "PASSED",
    "Test_EffectivePrincipalsPredicate.test_text": "PASSED",
    "Test_EffectivePrincipalsPredicate.test_text_noniter": "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_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_custom_predicates": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_factory": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_factory_dottedname": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_header": "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_route_prefix": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_static": "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_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_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_permission": "PASSED",
    "TestSettingsConfiguratorMixin.test__set_settings_as_None": "PASSED",
    "TestSettingsConfiguratorMixin.test__set_settings_as_dictwithvalues": "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",
    "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_getattr_fail": "PASSED",
    "TestSettings.test_getattr_raises_attribute_error": "PASSED",
    "TestSettings.test_getattr_success": "PASSED",
    "TestSettings.test_noargs": "PASSED",
    "TestSettings.test_originals_kept": "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_dottedname": "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_dottedname": "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_distinct": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tweens_names_with_over_nonstringoriter": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tweens_names_with_under_nonstringoriter": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tweens_names_with_underover": "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",
    "TestPredicateList.test_custom_predicates_can_affect_traversal": "PASSED",
    "TestPredicateList.test_different_custom_predicates_with_same_hash": "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_text_is_correct": "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_takes_one_arg.test_function_defaultargs_firstname_not_request": "PASSED",
    "Test_takes_one_arg.test_function_defaultargs_firstname_request": "PASSED",
    "Test_takes_one_arg.test_function_noargs": "PASSED",
    "Test_takes_one_arg.test_function_onearg_named_request": "PASSED",
    "Test_takes_one_arg.test_function_onearg_named_somethingelse": "PASSED",
    "Test_takes_one_arg.test_function_toomanyargs": "PASSED",
    "Test_takes_one_arg.test_function_with_attr_false": "PASSED",
    "Test_takes_one_arg.test_function_with_attr_true": "PASSED",
    "Test_takes_one_arg.test_instance_defaultargs_firstname_not_request": "PASSED",
    "Test_takes_one_arg.test_instance_defaultargs_firstname_request": "PASSED",
    "Test_takes_one_arg.test_instance_defaultargs_onearg_named_request": "PASSED",
    "Test_takes_one_arg.test_instance_defaultargs_onearg_named_somethingelse": "PASSED",
    "Test_takes_one_arg.test_instance_nocall": "PASSED",
    "Test_takes_one_arg.test_instance_toomanyargs": "PASSED",
    "Test_takes_one_arg.test_method_onearg_named_request": "PASSED",
    "Test_takes_one_arg.test_newstyle_class_init_defaultargs_firstname_not_request": "PASSED",
    "Test_takes_one_arg.test_newstyle_class_init_defaultargs_firstname_request": "PASSED",
    "Test_takes_one_arg.test_newstyle_class_init_firstname_request_with_secondname": "PASSED",
    "Test_takes_one_arg.test_newstyle_class_init_noargs": "PASSED",
    "Test_takes_one_arg.test_newstyle_class_init_onearg_named_somethingelse": "PASSED",
    "Test_takes_one_arg.test_oldstyle_class_init_defaultargs_firstname_not_request": "PASSED",
    "Test_takes_one_arg.test_oldstyle_class_init_defaultargs_firstname_request": "PASSED",
    "Test_takes_one_arg.test_oldstyle_class_init_noargs": "PASSED",
    "Test_takes_one_arg.test_oldstyle_class_init_onearg_named_request": "PASSED",
    "Test_takes_one_arg.test_oldstyle_class_init_onearg_named_somethingelse": "PASSED",
    "Test_takes_one_arg.test_oldstyle_class_init_toomanyargs": "PASSED",
    "Test_takes_one_arg.test_oldstyle_class_no_init": "PASSED",
    "Test_takes_one_arg.test_requestonly_newstyle_class_init_onearg_named_request": "PASSED",
    "Test_takes_one_arg.test_requestonly_newstyle_class_init_toomanyargs": "PASSED",
    "Test_takes_one_arg.test_requestonly_newstyle_class_no_init": "PASSED",
    "TestNotted.test_it_with_phash_val": "PASSED",
    "TestNotted.test_it_without_phash_val": "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_http_cache": "PASSED",
    "TestViewsConfigurationMixin.test_add_forbidden_view_disallows_name": "PASSED",
    "TestViewsConfigurationMixin.test_add_forbidden_view_disallows_permission": "PASSED",
    "TestViewsConfigurationMixin.test_add_forbidden_view_with_renderer": "PASSED",
    "TestViewsConfigurationMixin.test_add_forbidden_view_with_view_defaults": "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_disallows_context": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_disallows_for_": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_disallows_http_cache": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_disallows_name": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_disallows_permission": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_with_renderer": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_with_view_defaults": "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_context_as_class": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_context_as_dottedname": "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_default_phash_overrides_default_phash": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_default_phash_overrides_no_phash": "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_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_register_secured_view": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_for__as_dottedname": "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_dottedname": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_containment_false": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_containment_true": "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_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_view_defaults": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_view_defaults_viewname_is_dottedname_kwarg": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_view_defaults_viewname_is_dottedname_nonkwarg": "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_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_set_view_mapper": "PASSED",
    "TestViewsConfigurationMixin.test_set_view_mapper_dottedname": "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",
    "TestViewDeriver.test_as_function_context_and_request": "PASSED",
    "TestViewDeriver.test_as_function_requestonly": "PASSED",
    "TestViewDeriver.test_as_instance_context_and_request": "PASSED",
    "TestViewDeriver.test_as_instance_context_and_request_attr_and_renderer": "PASSED",
    "TestViewDeriver.test_as_instance_requestonly": "PASSED",
    "TestViewDeriver.test_as_instance_requestonly_attr_and_renderer": "PASSED",
    "TestViewDeriver.test_as_newstyle_class_context_and_request": "PASSED",
    "TestViewDeriver.test_as_newstyle_class_context_and_request_attr_and_renderer": "PASSED",
    "TestViewDeriver.test_as_newstyle_class_requestonly": "PASSED",
    "TestViewDeriver.test_as_newstyle_class_requestonly_attr_and_renderer": "PASSED",
    "TestViewDeriver.test_as_oldstyle_class_context_and_request": "PASSED",
    "TestViewDeriver.test_as_oldstyle_class_requestonly": "PASSED",
    "TestViewDeriver.test_as_oldstyle_cls_context_request_attr_and_renderer": "PASSED",
    "TestViewDeriver.test_as_oldstyle_cls_requestonly_attr_and_renderer": "PASSED",
    "TestViewDeriver.test_attr_wrapped_view_branching_default_phash": "PASSED",
    "TestViewDeriver.test_attr_wrapped_view_branching_nondefault_phash": "PASSED",
    "TestViewDeriver.test_class_with_attr": "PASSED",
    "TestViewDeriver.test_class_without_attr": "PASSED",
    "TestViewDeriver.test_debug_auth_permission_authpol_denied": "PASSED",
    "TestViewDeriver.test_debug_auth_permission_authpol_denied2": "PASSED",
    "TestViewDeriver.test_debug_auth_permission_authpol_overridden": "PASSED",
    "TestViewDeriver.test_debug_auth_permission_authpol_permitted": "PASSED",
    "TestViewDeriver.test_debug_auth_permission_authpol_permitted_no_request": "PASSED",
    "TestViewDeriver.test_function_returns_true_Response_no_renderer": "PASSED",
    "TestViewDeriver.test_function_returns_true_Response_with_renderer": "PASSED",
    "TestViewDeriver.test_http_cached_prevent_http_cache_in_settings": "PASSED",
    "TestViewDeriver.test_http_cached_view_bad_tuple": "PASSED",
    "TestViewDeriver.test_http_cached_view_integer": "PASSED",
    "TestViewDeriver.test_http_cached_view_prevent_auto_set": "PASSED",
    "TestViewDeriver.test_http_cached_view_timedelta": "PASSED",
    "TestViewDeriver.test_http_cached_view_tuple": "PASSED",
    "TestViewDeriver.test_http_cached_view_tuple_seconds_None": "PASSED",
    "TestViewDeriver.test_predicate_mismatch_exception_has_text_in_detail": "PASSED",
    "TestViewDeriver.test_predicate_mismatch_view_has_name": "PASSED",
    "TestViewDeriver.test_predicate_mismatch_view_has_no_name": "PASSED",
    "TestViewDeriver.test_requestonly_function": "PASSED",
    "TestViewDeriver.test_requestonly_function_with_renderer": "PASSED",
    "TestViewDeriver.test_requestonly_function_with_renderer_request_has_view": "PASSED",
    "TestViewDeriver.test_requestonly_function_with_renderer_request_override": "PASSED",
    "TestViewDeriver.test_secured_view_authn_policy_no_authz_policy": "PASSED",
    "TestViewDeriver.test_secured_view_authz_policy_no_authn_policy": "PASSED",
    "TestViewDeriver.test_secured_view_raises_forbidden_no_name": "PASSED",
    "TestViewDeriver.test_secured_view_raises_forbidden_with_name": "PASSED",
    "TestViewDeriver.test_with_debug_authorization_authn_policy_no_authz_policy": "PASSED",
    "TestViewDeriver.test_with_debug_authorization_authz_policy_no_authn_policy": "PASSED",
    "TestViewDeriver.test_with_debug_authorization_no_authpol": "PASSED",
    "TestViewDeriver.test_with_debug_authorization_no_permission": "PASSED",
    "TestViewDeriver.test_with_predicates_all": "PASSED",
    "TestViewDeriver.test_with_predicates_checker": "PASSED",
    "TestViewDeriver.test_with_predicates_notall": "PASSED",
    "TestViewDeriver.test_with_view_mapper_config_specified": "PASSED",
    "TestViewDeriver.test_with_view_mapper_default_mapper_specified": "PASSED",
    "TestViewDeriver.test_with_view_mapper_view_specified": "PASSED",
    "TestViewDeriver.test_with_wrapper_viewname": "PASSED",
    "TestViewDeriver.test_with_wrapper_viewname_notfound": "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_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_registration_no_registry_on_request": "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_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_logging_file_config.test_it": "PASSED",
    "TestParseVars.test_parse_vars_bad": "PASSED",
    "TestParseVars.test_parse_vars_good": "PASSED",
    "TestPCreateCommand.test_known_scaffold_absolute_path": "PASSED",
    "TestPCreateCommand.test_known_scaffold_multiple_rendered": "PASSED",
    "TestPCreateCommand.test_known_scaffold_single_rendered": "PASSED",
    "TestPCreateCommand.test_known_scaffold_with_path_as_project_target_rendered": "PASSED",
    "TestPCreateCommand.test_no_project_name": "PASSED",
    "TestPCreateCommand.test_run_no_scaffold_name": "PASSED",
    "TestPCreateCommand.test_run_show_scaffolds_exist": "PASSED",
    "TestPCreateCommand.test_run_show_scaffolds_none_exist": "PASSED",
    "TestPCreateCommand.test_unknown_scaffold_name": "PASSED",
    "Test_main.test_it": "PASSED",
    "TestPDistReportCommand.test_no_dists": "PASSED",
    "TestPDistReportCommand.test_with_dists": "PASSED",
    "TestPRequestCommand.test_command_has_bad_config_header": "PASSED",
    "TestPRequestCommand.test_command_not_enough_args": "PASSED",
    "TestPRequestCommand.test_command_response_has_no_charset": "PASSED",
    "TestPRoutesCommand.test__get_mapper": "PASSED",
    "TestPRoutesCommand.test_bad_args": "PASSED",
    "TestPRoutesCommand.test_good_args": "PASSED",
    "TestPRoutesCommand.test_no_mapper": "PASSED",
    "TestPRoutesCommand.test_no_routes": "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": "PASSED",
    "TestPRoutesCommand.test_single_route_one_view_registered_with_factory": "PASSED",
    "TestPServeCommand.test_get_options_no_command": "PASSED",
    "TestPServeCommand.test_get_options_with_command": "PASSED",
    "TestPServeCommand.test_parse_vars_bad": "PASSED",
    "TestPServeCommand.test_parse_vars_good": "PASSED",
    "TestPServeCommand.test_record_pid_not_verbose": "PASSED",
    "TestPServeCommand.test_record_pid_verbose": "PASSED",
    "TestPServeCommand.test_remove_pid_current_pid_is_not_pid_in_file": "PASSED",
    "TestPServeCommand.test_remove_pid_current_pid_is_not_written_pid": "PASSED",
    "TestPServeCommand.test_remove_pid_file_not_verbose": "PASSED",
    "TestPServeCommand.test_remove_pid_file_stale_pid_write_exception": "PASSED",
    "TestPServeCommand.test_remove_pid_file_unlink_exception": "PASSED",
    "TestPServeCommand.test_remove_pid_file_verbose": "PASSED",
    "TestPServeCommand.test_remove_pid_no_pid_file": "PASSED",
    "TestPServeCommand.test_remove_pid_not_a_number": "PASSED",
    "TestPServeCommand.test_run_no_args": "PASSED",
    "TestPServeCommand.test_run_stop_daemon_bad_pid_file": "PASSED",
    "TestPServeCommand.test_run_stop_daemon_invalid_pid_in_file": "PASSED",
    "TestPServeCommand.test_run_stop_daemon_no_such_pid_file": "PASSED",
    "Test_read_pidfile.test_read_pidfile": "PASSED",
    "Test_read_pidfile.test_read_pidfile_no_pid_file": "PASSED",
    "Test_read_pidfile.test_read_pidfile_not_a_number": "PASSED",
    "TestLazyWriter.test_flush": "PASSED",
    "TestLazyWriter.test_open": "PASSED",
    "TestLazyWriter.test_write": "PASSED",
    "TestLazyWriter.test_writeline": "PASSED",
    "Test__methodwrapper.test___call__fail": "PASSED",
    "Test__methodwrapper.test___call__succeed": "PASSED",
    "TestPShellCommand.test_command_custom_section_override": "PASSED",
    "TestPShellCommand.test_command_loads_bpython_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_default_shell_with_unknown_shell": "PASSED",
    "TestPShellCommand.test_command_loads_ipython_v0_10": "PASSED",
    "TestPShellCommand.test_command_loads_ipython_v0_11": "PASSED",
    "TestPShellCommand.test_command_loads_ipython_v1_1": "PASSED",
    "TestPShellCommand.test_command_loads_setup_from_options": "PASSED",
    "TestPShellCommand.test_command_setup": "PASSED",
    "TestPShellCommand.test_make_bpython_shell": "PASSED",
    "TestPShellCommand.test_make_default_shell": "PASSED",
    "TestPShellCommand.test_make_ipython_v0_10_shell": "PASSED",
    "TestPShellCommand.test_make_ipython_v0_11_shell": "PASSED",
    "TestPShellCommand.test_make_ipython_v1_1_shell": "PASSED",
    "TestPShellCommand.test_shell_ipython_ordering": "PASSED",
    "TestPShellCommand.test_shell_ordering": "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_multi_view_nested": "PASSED",
    "TestPViewsCommand.test_views_command_multiview": "PASSED",
    "TestPViewsCommand.test_views_command_multiview_with_permission": "PASSED",
    "TestPViewsCommand.test_views_command_multiview_with_predicates": "PASSED",
    "TestPViewsCommand.test_views_command_not_found": "PASSED",
    "TestPViewsCommand.test_views_command_not_found_url_starts_without_slash": "PASSED",
    "TestPViewsCommand.test_views_command_single_view_route": "PASSED",
    "TestPViewsCommand.test_views_command_single_view_route_with_route_predicates": "PASSED",
    "TestPViewsCommand.test_views_command_single_view_traversal": "PASSED",
    "TestPViewsCommand.test_views_command_single_view_traversal_with_permission": "PASSED",
    "TestPViewsCommand.test_views_command_single_view_traversal_with_predicates": "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",
    "TestOverrideProvider.test_get_resource_filename_no_overrides": "FAILED",
    "TestOverrideProvider.test_get_resource_filename_override_returns_None": "FAILED",
    "TestPackageOverrides.test_get_filename": "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_multiple_specs": "FAILED",
    "TestI18NConfiguratorMixin.test_add_translation_dirs_multiple_specs_multiple_calls": "FAILED",
    "ConfiguratorTests.test_ctor_no_registry": "FAILED",
    "ConfiguratorTests.test_ctor_noreg_debug_logger_None_default": "FAILED",
    "ConfiguratorTests.test_scan_integration_conflict": "FAILED",
    "ConfiguratorTests.test_setup_registry_debug_logger_None_default": "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",
    "TestViewsConfigurationMixin.test_add_static_view_package_here_relative": "FAILED",
    "TestViewsConfigurationMixin.test_add_view_custom_predicate_bests_standard_predicate": "FAILED",
    "TestViewsConfigurationMixin.test_add_view_with_custom_predicates_match": "FAILED",
    "TestViewsConfigurationMixin.test_add_view_with_custom_predicates_nomatch": "FAILED",
    "TestViewsConfigurationMixin.test_add_view_with_template_renderer": "FAILED",
    "TestViewsConfigurationMixin.test_add_view_with_template_renderer_no_callable": "FAILED",
    "TestViewDeriver.test_function_returns_non_adaptable": "FAILED",
    "TestViewDeriver.test_function_returns_non_adaptable_dict": "FAILED",
    "TestViewDeriver.test_instance_returns_non_adaptable": "FAILED",
    "TestViewDeriver.test_requestonly_default_method_returns_non_adaptable": "FAILED",
    "TestViewDeriver.test_requestonly_nondefault_method_returns_non_adaptable": "FAILED",
    "Test_view_description.test_without_text": "FAILED",
    "TestPRequestCommand.test_command_display_headers": "FAILED",
    "TestPRequestCommand.test_command_has_content_type_header_var": "FAILED",
    "TestPRequestCommand.test_command_has_good_header_var": "FAILED",
    "TestPRequestCommand.test_command_has_multiple_header_vars": "FAILED",
    "TestPRequestCommand.test_command_method_get": "FAILED",
    "TestPRequestCommand.test_command_method_options": "FAILED",
    "TestPRequestCommand.test_command_method_patch": "FAILED",
    "TestPRequestCommand.test_command_method_post": "FAILED",
    "TestPRequestCommand.test_command_method_propfind": "FAILED",
    "TestPRequestCommand.test_command_method_put": "FAILED",
    "TestPRequestCommand.test_command_path_doesnt_start_with_slash": "FAILED",
    "TestPRequestCommand.test_command_two_args": "FAILED",
    "TestPRequestCommand.test_command_w_basic_auth": "FAILED",
    "TestPRequestCommand.test_command_with_query_string": "FAILED",
    "TestPViewsCommand.test_views_command_single_view_function_traversal": "FAILED"
}
diff --git a/pyramid/authentication.py b/pyramid/authentication.py
index ba7b864f9..b84981bbc 100644
--- a/pyramid/authentication.py
+++ b/pyramid/authentication.py
@@ -336,12 +336,19 @@ class RepozeWho1AuthenticationPolicy(CallbackAuthenticationPolicy):
         return effective_principals
 
     def remember(self, request, principal, **kw):
-        """ Store the ``principal`` as ``repoze.who.userid``."""
+        """ Store the ``principal`` as ``repoze.who.userid``.
+        
+        The identity to authenticated to :mod:`repoze.who`
+        will contain the given principal 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 = {'repoze.who.userid':principal}
+        identity = kw
+        identity['repoze.who.userid'] = principal
         return identifier.remember(environ, identity)
 
     def forget(self, request):

{"pyramid/authentication.py": "import binascii\nfrom codecs import utf_8_decode\nfrom codecs import utf_8_encode\nimport hashlib\nimport base64\nimport datetime\nimport re\nimport time as time_mod\nimport warnings\n\nfrom zope.interface import implementer\n\nfrom webob.cookies import CookieProfile\n\nfrom pyramid.compat import (\n    long,\n    text_type,\n    binary_type,\n    url_unquote,\n    url_quote,\n    bytes_,\n    ascii_native_,\n    native_,\n    )\n\nfrom pyramid.interfaces import (\n    IAuthenticationPolicy,\n    IDebugLogger,\n    )\n\nfrom pyramid.security import (\n    Authenticated,\n    Everyone,\n    )\n\nfrom pyramid.util import strings_differ\n\nVALID_TOKEN = re.compile(r\"^[A-Za-z][A-Za-z0-9+_-]*$\")\n\nclass CallbackAuthenticationPolicy(object):\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            return None\n        if self._clean_principal(userid) is None:\n            debug and self._log(\n                ('use of userid %r is disallowed by any built-in Pyramid '\n                 'security policy, returning None' % userid),\n                'authenticated_userid' ,\n                request)\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            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.security.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.security.Authenticated`, the ``authenticated_userid``\n        and the list of principals returned by the ``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                ('unauthenticated_userid returned disallowed %r; returning %r '\n                 'as if it was None' % (userid, effective_principals)),\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            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        if groups is None: # is None!\n            debug and self._log(\n                'returning effective principals: %r' % (\n                    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' % (\n                effective_principals,),\n            'effective_principals',\n            request\n             )\n        return effective_principals\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            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            return None\n            \n        if self._clean_principal(userid) is None:\n            self.debug and self._log(\n                ('use of userid %r is disallowed by any built-in Pyramid '\n                 'security policy, returning None' % userid),\n                'authenticated_userid',\n                request)\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.security.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.security.Authenticated`, the ``authenticated_userid``\n        and the list of principals returned by the ``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                ('repoze.who identity was None; returning %r' %\n                 effective_principals),\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                ('security policy groups callback returned None; returning %r' %\n                 effective_principals),\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                ('repoze.who.userid was None; returning %r' %\n                 effective_principals),\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                ('unauthenticated_userid returned disallowed %r; returning %r '\n                 'as if it was None' % (userid, 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        return effective_principals\n\n    def remember(self, request, principal, **kw):\n        \"\"\" Store the ``principal`` as ``repoze.who.userid``.\"\"\"\n        identifier = self._get_identifier(request)\n        if identifier is None:\n            return []\n        environ = request.environ\n        identity = {'repoze.who.userid':principal}\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@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, principal, **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_marker = object()\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    .. warning::\n\n       The default hash algorithm used in this policy is MD5 and has known\n       hash collision vulnerabilities. The risk of an exploit is low.\n       However, for improved authentication security, use\n       ``hashalg='sha512'``.\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       This option is available as of :app:`Pyramid` 1.5.\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       This option is available as of :app:`Pyramid` 1.5.\n\n    ``hashalg``\n\n       Default: ``md5`` (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       A warning is emitted at startup if an explicit ``hashalg`` is not\n       passed.  This is for backwards compatibility reasons.\n\n       This option is available as of :app:`Pyramid` 1.4.\n\n       Optional.\n\n       .. note::\n\n          ``md5`` is the default for backwards compatibility reasons. However,\n          if you don't specify ``md5`` as the hashalg explicitly, a warning is\n          issued at application startup time.  An explicit value of ``sha512``\n          is recommended for improved security, and ``sha512`` will become the\n          default in a future Pyramid version.\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,\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=_marker,\n                 parent_domain=False,\n                 domain=None,\n                 ):\n        if hashalg is _marker:\n            hashalg = 'md5'\n            warnings.warn(\n                'The MD5 hash function used by default by the '\n                'AuthTktAuthenticationPolicy is known to be '\n                'susceptible to collision attacks.  It is the current default '\n                'for backwards compatibility reasons, but we recommend that '\n                'you use the SHA512 algorithm instead for improved security.  '\n                'Pass ``hashalg=\\'sha512\\'`` to the '\n                'AuthTktAuthenticationPolicy constructor to do so.\\n\\nNote '\n                'that a change to the hash algorithms will invalidate existing '\n                'auth tkt cookies set by your application.  If backwards '\n                'compatibility of existing auth tkt cookies is of greater '\n                'concern than the risk posed by the potential for a hash '\n                'collision, you\\'ll want to continue using MD5 explicitly.  '\n                'To do so, pass ``hashalg=\\'md5\\'`` in your application to '\n                'the AuthTktAuthenticationPolicy constructor.   When you do so '\n                'this warning will not be emitted again.  The default '\n                'algorithm used in this policy will change in the future, so '\n                'setting an explicit hashalg will futureproof your '\n                'application.',\n                DeprecationWarning,\n                stacklevel=2\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            )\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, principal, **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, principal, **kw)\n\n    def forget(self, request):\n        \"\"\" A list of headers which will delete appropriate cookies.\"\"\"\n        return self.cookie.forget(request)\n\ndef b64encode(v):\n    return base64.b64encode(bytes_(v)).strip().replace(b'\\n', b'')\n\ndef b64decode(v):\n    return base64.b64decode(bytes_(v))\n\n# this class licensed under the MIT license (stolen from Paste)\nclass AuthTicket(object):\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__(self, secret, userid, ip, tokens=(), user_data='',\n                 time=None, cookie_name='auth_tkt', secure=False,\n                 hashalg='md5'):\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, self.time, self.secret, self.userid, self.tokens,\n            self.user_data, self.hashalg)\n\n    def cookie_value(self):\n        v = '%s%08x%s!' % (self.digest(), int(self.time),\n                           url_quote(self.userid))\n        if self.tokens:\n            v += self.tokens + '!'\n        v += self.user_data\n        return v\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    def __init__(self, msg, expected=None):\n        self.expected = expected\n        Exception.__init__(self, msg)\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 = 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 = url_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(ip, timestamp, secret,\n                                userid, tokens, user_data, hashalg)\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('Digest signature is not correct',\n                        expected=(expected, digest))\n\n    tokens = tokens.split(',')\n\n    return (timestamp, userid, tokens, user_data)\n\n# this function licensed under the MIT license (stolen from Paste)\ndef calculate_digest(ip, timestamp, secret, userid, tokens, user_data,\n                     hashalg='md5'):\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(ip_timestamp + secret + userid + b'\\0' +\n            tokens + b'\\0' + user_data)\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# 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 = ((t & 0xff000000) >> 24,\n          (t & 0xff0000) >> 16,\n          (t & 0xff00) >> 8,\n          t & 0xff)\n    ts_chars = ''.join(map(chr, ts))\n    return bytes_(ip_chars + ts_chars)\n\nclass AuthTktCookieHelper(object):\n    \"\"\"\n    A helper class for use in third-party authentication policy\n    implementations.  See\n    :class:`pyramid.authentication.AuthTktAuthenticationPolicy` for the\n    meanings of the constructor arguments.\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        long: ('int', str),\n        text_type: ('b64unicode', lambda x: b64encode(utf_8_encode(x)[0])),\n        binary_type: ('b64str', lambda x: b64encode(x)),\n        }\n\n    def __init__(self, secret, cookie_name='auth_tkt', secure=False,\n                 include_ip=False, timeout=None, reissue_time=None,\n                 max_age=None, http_only=False, path=\"/\", wild_domain=True,\n                 hashalg='md5', parent_domain=False, domain=None):\n\n        serializer = _SimpleSerializer()\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=serializer\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\n        self.reissue_time = reissue_time\n        self.max_age = 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        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                # work around https://github.com/Pylons/pyramid/issues#issue/108\n                tokens = list(filter(None, tokens))\n                headers = self.remember(request, userid, max_age=self.max_age,\n                                        tokens=tokens)\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                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        if max_age is None:\n            max_age = self.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            userid = encoder(userid)\n            user_data = 'userid_type:%s' % encoding\n\n        new_tokens = []\n        for token in tokens:\n            if isinstance(token, text_type):\n                try:\n                    token = ascii_native_(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@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.prefix = prefix or ''\n        self.userid_key = prefix + 'userid'\n        self.debug = debug\n\n    def remember(self, request, principal, **kw):\n        \"\"\" Store a principal in the session.\"\"\"\n        request.session[self.userid_key] = principal\n        return []\n\n    def forget(self, request):\n        \"\"\" Remove the stored principal from the session.\"\"\"\n        if self.userid_key in request.session:\n            del request.session[self.userid_key]\n        return []\n\n    def unauthenticated_userid(self, request):\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 to\n       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 basic_challenge(request):\n            response = HTTPUnauthorized()\n            response.headers.update(forget(request))\n            return response\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 = self._get_credentials(request)\n        if credentials:\n            return credentials[0]\n\n    def remember(self, request, principal, **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 _get_credentials winds up\n        # getting called twice when authenticated_userid is called.  Avoiding\n        # that, however, winds up duplicating logic from the superclass.\n        credentials = self._get_credentials(request)\n        if credentials:\n            username, password = credentials\n            return self.check(username, password, request)\n\n    def _get_credentials(self, request):\n        authorization = request.headers.get('Authorization')\n        if not authorization:\n            return None\n        try:\n            authmeth, auth = authorization.split(' ', 1)\n        except ValueError: # not enough values to unpack\n            return None\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        return username, password\n\nclass _SimpleSerializer(object):\n    def loads(self, bstruct):\n        return native_(bstruct)\n\n    def dumps(self, appstruct):\n        return bytes_(appstruct)\n\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 ---
**Analysis:**

- **Key Parts:**
  - **Commit Details:** The commit modifies the `remember` method in `RepozeWho1AuthenticationPolicy` to accept `**kw` and include them in the identity dictionary.
  - **Test Results:** The test `test_remember_kwargs` fails in the old commit because the `remember` method does not include the `max_age` keyword argument in the identity dictionary. After the commit, this test passes as the method correctly includes `max_age`.
  
- **Main Problem:** The `remember` method does not handle additional keyword arguments, causing tests that expect these arguments (like `max_age`) to fail.

- **Expected Behavior:** The `remember` method should include all provided keyword arguments as part of the identity dictionary passed to `repoze.who`, allowing parameters like `max_age` to be utilized.

- **Actual Behavior:** The `remember` method only includes the `repoze.who.userid` key in the identity dictionary, ignoring any additional keyword arguments such as `max_age`.

- **Issue Description:** The `remember` method fails to include additional keyword arguments, causing certain functionalities that rely on these parameters to malfunction or tests to fail.

**Drafted Issue:**

[ISSUE]
**Title:** `RepozeWho1AuthenticationPolicy.remember` Ignoring Additional Keyword Arguments

**Description:**
When attempting to use the `remember` method with additional keyword arguments, the extra parameters are not included in the identity dictionary passed to `repoze.who`. This omission causes tests that rely on these parameters, such as `max_age`, to fail.

**Example Code:**
```python
authtkt = DummyWhoPlugin()
request = DummyRequest({'repoze.who.plugins': {'auth_tkt': authtkt}})
policy = RepozeWho1AuthenticationPolicy()
result = policy.remember(request, 'fred', max_age=23)
```

**Expected Behavior:**
The `remember` method should include all provided keyword arguments in the identity dictionary. For example, the identity should be:
```python
{'repoze.who.userid': 'fred', 'max_age': 23}
```

**Actual Behavior:**
The `remember` method only includes the `repoze.who.userid` key, resulting in the identity:
```python
{'repoze.who.userid': 'fred'}
```
This causes assertions expecting the `max_age` key to fail.
[/ISSUE]
--- END ISSUE ---

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

--- BEGIN FILE ---
```
### pyramid/authentication.py
import binascii
from codecs import utf_8_decode
from codecs import utf_8_encode
import hashlib
import base64
import datetime
import re
import time as time_mod
import warnings

from zope.interface import implementer

from webob.cookies import CookieProfile

from pyramid.compat import (
    long,
    text_type,
    binary_type,
    url_unquote,
    url_quote,
    bytes_,
    ascii_native_,
    native_,
    )

from pyramid.interfaces import (
    IAuthenticationPolicy,
    IDebugLogger,
    )

from pyramid.security import (
    Authenticated,
    Everyone,
    )

from pyramid.util import strings_differ

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

class CallbackAuthenticationPolicy(object):
    """ 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.security.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.security.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.security.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.security.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, principal, **kw):
        """ Store the ``principal`` as ``repoze.who.userid``."""
        identifier = self._get_identifier(request)
        if identifier is None:
            return []
        environ = request.environ
        identity = {'repoze.who.userid':principal}
        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, principal, **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 []

_marker = object()

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

    .. warning::

       The default hash algorithm used in this policy is MD5 and has known
       hash collision vulnerabilities. The risk of an exploit is low.
       However, for improved authentication security, use
       ``hashalg='sha512'``.

    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.

       This option is available as of :app:`Pyramid` 1.5.

    ``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.

       This option is available as of :app:`Pyramid` 1.5.

    ``hashalg``

       Default: ``md5`` (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.

       A warning is emitted at startup if an explicit ``hashalg`` is not
       passed.  This is for backwards compatibility reasons.

       This option is available as of :app:`Pyramid` 1.4.

       Optional.

       .. note::

          ``md5`` is the default for backwards compatibility reasons. However,
          if you don't specify ``md5`` as the hashalg explicitly, a warning is
          issued at application startup time.  An explicit value of ``sha512``
          is recommended for improved security, and ``sha512`` will become the
          default in a future Pyramid version.

    ``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,
                 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=_marker,
                 parent_domain=False,
                 domain=None,
                 ):
        if hashalg is _marker:
            hashalg = 'md5'
            warnings.warn(
                'The MD5 hash function used by default by the '
                'AuthTktAuthenticationPolicy is known to be '
                'susceptible to collision attacks.  It is the current default '
                'for backwards compatibility reasons, but we recommend that '
                'you use the SHA512 algorithm instead for improved security.  '
                'Pass ``hashalg=\'sha512\'`` to the '
                'AuthTktAuthenticationPolicy constructor to do so.\n\nNote '
                'that a change to the hash algorithms will invalidate existing '
                'auth tkt cookies set by your application.  If backwards '
                'compatibility of existing auth tkt cookies is of greater '
                'concern than the risk posed by the potential for a hash '
                'collision, you\'ll want to continue using MD5 explicitly.  '
                'To do so, pass ``hashalg=\'md5\'`` in your application to '
                'the AuthTktAuthenticationPolicy constructor.   When you do so '
                'this warning will not be emitted again.  The default '
                'algorithm used in this policy will change in the future, so '
                'setting an explicit hashalg will futureproof your '
                'application.',
                DeprecationWarning,
                stacklevel=2
                )
        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,
            )
        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, principal, **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, principal, **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(object):
    """
    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),
                           url_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 = 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 = url_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(object):
    """
    A helper class for use in third-party authentication policy
    implementations.  See
    :class:`pyramid.authentication.AuthTktAuthenticationPolicy` for the
    meanings of the constructor arguments.
    """
    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),
        long: ('int', str),
        text_type: ('b64unicode', lambda x: b64encode(utf_8_encode(x)[0])),
        binary_type: ('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='md5', parent_domain=False, domain=None):

        serializer = _SimpleSerializer()
            
        self.cookie_profile = CookieProfile(
            cookie_name = cookie_name,
            secure = secure,
            max_age = max_age,
            httponly = http_only,
            path = path,
            serializer=serializer
            )

        self.secret = secret
        self.cookie_name = cookie_name
        self.secure = secure
        self.include_ip = include_ip
        self.timeout = timeout
        self.reissue_time = reissue_time
        self.max_age = 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 ):
                # work around 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: ``()``.
        """
        if max_age is None:
            max_age = self.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
            userid = encoder(userid)
            user_data = 'userid_type:%s' % encoding

        new_tokens = []
        for token in tokens:
            if isinstance(token, text_type):
                try:
                    token = ascii_native_(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.prefix = prefix or ''
        self.userid_key = prefix + 'userid'
        self.debug = debug

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

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

    def unauthenticated_userid(self, request):
        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 basic_challenge(request):
            response = HTTPUnauthorized()
            response.headers.update(forget(request))
            return response
    """
    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 = self._get_credentials(request)
        if credentials:
            return credentials[0]

    def remember(self, request, principal, **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 _get_credentials winds up
        # getting called twice when authenticated_userid is called.  Avoiding
        # that, however, winds up duplicating logic from the superclass.
        credentials = self._get_credentials(request)
        if credentials:
            username, password = credentials
            return self.check(username, password, request)

    def _get_credentials(self, request):
        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 username, password

class _SimpleSerializer(object):
    def loads(self, bstruct):
        return native_(bstruct)

    def dumps(self, appstruct):
        return bytes_(appstruct)


```
--- 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