{
    "file_diffs": [
        {
            "old_file_content": "next release\n============\n\nFeatures\n--------\n\n- ``ACLAuthorizationPolicy`` supports ``__acl__`` as a callable. This\n  removes the ambiguity between the potential ``AttributeError`` that would\n  be raised on the ``context`` when the property was not defined and the\n  ``AttributeError`` that could be raised from any user-defined code within\n  a dynamic property. It is recommended to define a dynamic ACL as a callable\n  to avoid this ambiguity. See https://github.com/Pylons/pyramid/issues/735.\n\n- Allow a protocol-relative URL (e.g. ``//example.com/images``) to be passed to\n  ``pyramid.config.Configurator.add_static_view``. This allows\n  externally-hosted static URLs to be generated based on the current protocol.\n\nBug Fixes\n---------\n\n- View lookup will now search for valid views based on the inheritance\n  hierarchy of the context. It tries to find views based on the most\n  specific context first, and upon predicate failure, will move up the\n  inheritance chain to test views found by the super-type of the context.\n  In the past, only the most specific type containing views would be checked\n  and if no matching view could be found then a PredicateMismatch would be\n  raised. Now predicate mismatches don't hide valid views registered on\n  super-types. Here's an example that now works::\n\n  .. code-block:: python\n\n     class IResource(Interface):\n         ...\n\n     @view_config(context=IResource)\n     def get(context, request):\n         ...\n\n     @view_config(context=IResource, request_method='POST')\n     def post(context, request):\n         ...\n\n     @view_config(context=IResource, request_method='DELETE')\n     def delete(context, request):\n         ...\n\n     @implementor(IResource)\n     class MyResource:\n         ...\n\n     @view_config(context=MyResource, request_method='POST')\n     def override_post(context, request):\n         ...\n\n  Previously the override_post view registration would hide the get\n  and delete views in the context of MyResource -- leading to a\n  predicate mismatch error when trying to use GET or DELETE\n  methods. Now the views are found and no predicate mismatch is\n  raised.\n\n1.4 (2012-12-18)\n================\n\nDocs\n----\n\n- Fix functional tests in the ZODB tutorial\n\n1.4b3 (2012-12-10)\n==================\n\n- Packaging release only, no code changes.  1.4b2 was a brownbag release due to\n  missing directories in the tarball.\n\n1.4b2 (2012-12-10)\n==================\n\nDocs\n----\n\n- Scaffolding is now PEP-8 compliant (at least for a brief shining moment).\n\n- Tutorial improvements.\n\nBackwards Incompatibilities\n---------------------------\n\n- Modified the ``_depth`` argument to ``pyramid.view.view_config`` to accept\n  a value relative to the invocation of ``view_config`` itself. Thus, when it\n  was previously expecting a value of ``1`` or greater, to reflect that\n  the caller of ``view_config`` is 1 stack frame away from ``venusian.attach``,\n  this implementation detail is now hidden.\n\n- Modified the ``_backframes`` argument to ``pyramid.util.action_method`` in a\n  similar way to the changes described to ``_depth`` above.  This argument\n  remains undocumented, but might be used in the wild by some insane person.\n\n1.4b1 (2012-11-21)\n==================\n\nFeatures\n--------\n\n- Small microspeed enhancement which anticipates that a\n  ``pyramid.response.Response`` object is likely to be returned from a view.\n  Some code is shortcut if the class of the object returned by a view is this\n  class.  A similar microoptimization was done to\n  ``pyramid.request.Request.is_response``.\n\n- Make it possible to use variable arguments on ``p*`` commands (``pserve``,\n  ``pshell``, ``pviews``, etc) in the form ``a=1 b=2`` so you can fill in\n  values in parameterized ``.ini`` file, e.g. ``pshell etc/development.ini\n  http_port=8080``.  See https://github.com/Pylons/pyramid/pull/714\n\n- A somewhat advanced and obscure feature of Pyramid event handlers is their\n  ability to handle \"multi-interface\" notifications.  These notifications have\n  traditionally presented multiple objects to the subscriber callable.  For\n  instance, if an event was sent by code like this::\n\n     registry.notify(event, context)\n\n  In the past, in order to catch such an event, you were obligated to write and\n  register an event subscriber that mentioned both the event and the context in\n  its argument list::\n\n     @subscriber([SomeEvent, SomeContextType])\n     def asubscriber(event, context):\n         pass\n\n  In many subscriber callables registered this way, it was common for the logic\n  in the subscriber callable to completely ignore the second and following\n  arguments (e.g. ``context`` in the above example might be ignored), because\n  they usually existed as attributes of the event anyway.  You could usually\n  get the same value by doing ``event.context`` or similar.\n\n  The fact that you needed to put an extra argument which you usually ignored\n  in the subscriber callable body was only a minor annoyance until we added\n  \"subscriber predicates\", used to narrow the set of circumstances under which\n  a subscriber will be executed, in a prior 1.4 alpha release.  Once those were\n  added, the annoyance was escalated, because subscriber predicates needed to\n  accept the same argument list and arity as the subscriber callables that they\n  were configured against.  So, for example, if you had these two subscriber\n  registrations in your code::\n\n     @subscriber([SomeEvent, SomeContextType])\n     def asubscriber(event, context):\n         pass\n\n     @subscriber(SomeOtherEvent)\n     def asubscriber(event):\n         pass\n \n  And you wanted to use a subscriber predicate::\n\n     @subscriber([SomeEvent, SomeContextType], mypredicate=True)\n     def asubscriber1(event, context):\n         pass\n\n     @subscriber(SomeOtherEvent, mypredicate=True)\n     def asubscriber2(event):\n         pass\n\n  If an existing ``mypredicate`` subscriber predicate had been written in such\n  a way that it accepted only one argument in its ``__call__``, you could not\n  use it against a subscription which named more than one interface in its\n  subscriber interface list.  Similarly, if you had written a subscriber\n  predicate that accepted two arguments, you couldn't use it against a\n  registration that named only a single interface type.\n\n  For example, if you created this predicate::\n\n    class MyPredicate(object):\n        # portions elided...\n        def __call__(self, event):\n            return self.val == event.context.foo\n\n  It would not work against a multi-interface-registered subscription, so in\n  the above example, when you attempted to use it against ``asubscriber1``, it\n  would fail at runtime with a TypeError, claiming something was attempting to\n  call it with too many arguments.\n\n  To hack around this limitation, you were obligated to design the\n  ``mypredicate`` predicate to expect to receive in its ``__call__`` either a\n  single ``event`` argument (a SomeOtherEvent object) *or* a pair of arguments\n  (a SomeEvent object and a SomeContextType object), presumably by doing\n  something like this::\n\n    class MyPredicate(object):\n        # portions elided...\n        def __call__(self, event, context=None):\n            return self.val == event.context.foo\n\n  This was confusing and bad.\n\n  In order to allow people to ignore unused arguments to subscriber callables\n  and to normalize the relationship between event subscribers and subscriber\n  predicates, we now allow both subscribers and subscriber predicates to accept\n  only a single ``event`` argument even if they've been subscribed for\n  notifications that involve multiple interfaces.  Subscribers and subscriber\n  predicates that accept only one argument will receive the first object passed\n  to ``notify``; this is typically (but not always) the event object.  The\n  other objects involved in the subscription lookup will be discarded.  You can\n  now write an event subscriber that accepts only ``event`` even if it\n  subscribes to multiple interfaces::\n\n     @subscriber([SomeEvent, SomeContextType])\n     def asubscriber(event):\n         # this will work!\n\n  This prevents you from needing to match the subscriber callable parameters to\n  the subscription type unnecessarily, especially when you don't make use of\n  any argument in your subscribers except for the event object itself.\n\n  Note, however, that if the event object is not the first\n  object in the call to ``notify``, you'll run into trouble.  For example, if\n  notify is called with the context argument first::\n\n     registry.notify(context, event)\n\n  You won't be able to take advantage of the event-only feature.  It will\n  \"work\", but the object received by your event handler won't be the event\n  object, it will be the context object, which won't be very useful::\n\n     @subscriber([SomeContextType, SomeEvent])\n     def asubscriber(event):\n         # bzzt! you'll be getting the context here as ``event``, and it'll \n         # be useless\n\n  Existing multiple-argument subscribers continue to work without issue, so you\n  should continue use those if your system notifies using multiple interfaces\n  and the first interface is not the event interface.  For example::\n\n     @subscriber([SomeContextType, SomeEvent])\n     def asubscriber(context, event):\n         # this will still work!\n\n  The event-only feature makes it possible to use a subscriber predicate that\n  accepts only a request argument within both multiple-interface subscriber\n  registrations and single-interface subscriber registrations.  You needn't\n  make slightly different variations of predicates depending on the\n  subscription type arguments.  Instead, just write all your subscriber\n  predicates so they only accept ``event`` in their ``__call__`` and they'll be\n  useful across all registrations for subscriptions that use an event as their\n  first argument, even ones which accept more than just ``event``.\n\n  However, the same caveat applies to predicates as to subscriber callables: if\n  you're subscribing to a multi-interface event, and the first interface is not\n  the event interface, the predicate won't work properly.  In such a case,\n  you'll need to match the predicate ``__call__`` argument ordering and\n  composition to the ordering of the interfaces.  For example, if the\n  registration for the subscription uses ``[SomeContext, SomeEvent]``, you'll\n  need to reflect that in the ordering of the parameters of the predicate's\n  ``__call__`` method::\n\n        def __call__(self, context, event):\n            return event.request.path.startswith(self.val)\n\n  tl;dr: 1) When using multi-interface subscriptions, always use the event type\n  as the first subscription registration argument and 2) When 1 is true, use\n  only ``event`` in your subscriber and subscriber predicate parameter lists,\n  no matter how many interfaces the subscriber is notified with.  This\n  combination will result in the maximum amount of reusability of subscriber\n  predicates and the least amount of thought on your part.  Drink responsibly.\n\nBug Fixes\n---------\n\n- A failure when trying to locate the attribute ``__text__`` on route and view\n  predicates existed when the ``debug_routematch`` setting was true or when the\n  ``pviews`` command was used. See https://github.com/Pylons/pyramid/pull/727\n\nDocumentation\n-------------\n\n- Sync up tutorial source files with the files that are rendered by the\n  scaffold that each uses.\n\n1.4a4 (2012-11-14)\n==================\n\nFeatures\n--------\n\n- ``pyramid.authentication.AuthTktAuthenticationPolicy`` has been updated to\n  support newer hashing algorithms such as ``sha512``. Existing applications\n  should consider updating if possible for improved security over the default\n  md5 hashing.\n\n- Added an ``effective_principals`` route and view predicate.\n\n- Do not allow the userid returned from the ``authenticated_userid`` or the\n  userid that is one of the list of principals returned by\n  ``effective_principals`` to be either of the strings ``system.Everyone`` or\n  ``system.Authenticated`` when any of the built-in authorization policies that\n  live in ``pyramid.authentication`` are in use.  These two strings are\n  reserved for internal usage by Pyramid and they will not be accepted as valid\n  userids.\n\n- Slightly better debug logging from\n  ``pyramid.authentication.RepozeWho1AuthenticationPolicy``.\n\n- ``pyramid.security.view_execution_permitted`` used to return ``True`` if no\n  view could be found. It now raises a ``TypeError`` exception in that case, as\n  it doesn't make sense to assert that a nonexistent view is\n  execution-permitted. See https://github.com/Pylons/pyramid/issues/299.\n\n- Allow a ``_depth`` argument to ``pyramid.view.view_config``, which will\n  permit limited composition reuse of the decorator by other software that\n  wants to provide custom decorators that are much like view_config.\n\n- Allow an iterable of decorators to be passed to\n  ``pyramid.config.Configurator.add_view``. This allows views to be wrapped\n  by more than one decorator without requiring combining the decorators\n  yourself.\n\nBug Fixes\n---------\n\n- In the past if a renderer returned ``None``, the body of the resulting\n  response would be set explicitly to the empty string.  Instead, now, the body\n  is left unchanged, which allows the renderer to set a body itself by using\n  e.g. ``request.response.body = b'foo'``.  The body set by the renderer will\n  be unmolested on the way out.  See\n  https://github.com/Pylons/pyramid/issues/709\n\n- In uncommon cases, the ``pyramid_excview_tween_factory`` might have\n  inadvertently raised a ``KeyError`` looking for ``request_iface`` as an\n  attribute of the request.  It no longer fails in this case.  See\n  https://github.com/Pylons/pyramid/issues/700\n\n- Be more tolerant of potential error conditions in ``match_param`` and\n  ``physical_path`` predicate implementations; instead of raising an exception,\n  return False.\n\n- ``pyramid.view.render_view`` was not functioning properly under Python 3.x\n  due to a byte/unicode discrepancy. See\n  https://github.com/Pylons/pyramid/issues/721\n\nDeprecations\n------------\n\n- ``pyramid.authentication.AuthTktAuthenticationPolicy`` will emit a warning if\n  an application is using the policy without explicitly passing a ``hashalg``\n  argument. This is because the default is \"md5\" which is considered\n  theoretically subject to collision attacks. If you really want \"md5\" then you\n  must specify it explicitly to get rid of the warning.\n\nDocumentation\n-------------\n\n- All of the tutorials that use\n  ``pyramid.authentication.AuthTktAuthenticationPolicy`` now explicitly pass\n  ``sha512`` as a ``hashalg`` argument.\n\n\nInternals\n---------\n\n- Move ``TopologicalSorter`` from ``pyramid.config.util`` to ``pyramid.util``,\n  move ``CyclicDependencyError`` from ``pyramid.config.util`` to\n  ``pyramid.exceptions``, rename ``Singleton`` to ``Sentinel`` and move from\n  ``pyramid.config.util`` to ``pyramid.util``; this is in an effort to\n  move that stuff that may be an API one day out of ``pyramid.config.util``,\n  because that package should never be imported from non-Pyramid code.\n  TopologicalSorter is still not an API, but may become one.\n\n- Get rid of shady monkeypatching of ``pyramid.request.Request`` and\n  ``pyramid.response.Response`` done within the ``__init__.py`` of Pyramid.\n  Webob no longer relies on this being done.  Instead, the ResponseClass\n  attribute of the Pyramid Request class is assigned to the Pyramid response\n  class; that's enough to satisfy WebOb and behave as it did before with the\n  monkeypatching.\n\n1.4a3 (2012-10-26)\n==================\n\nBug Fixes\n---------\n\n- The match_param predicate's text method was fixed to sort its values.\n  Part of https://github.com/Pylons/pyramid/pull/705\n\n- 1.4a ``pyramid.scripting.prepare`` behaved differently than 1.3 series\n  function of same name.  In particular, if passed a request, it would not\n  set the ``registry`` attribute of the request like 1.3 did.  A symptom\n  would be that passing a request to ``pyramid.paster.bootstrap`` (which uses\n  the function) that did not have a ``registry`` attribute could assume that\n  the registry would be attached to the request by Pyramid.  This assumption\n  could be made in 1.3, but not in 1.4.  The assumption can now be made in\n  1.4 too (a registry is attached to a request passed to bootstrap or\n  prepare).\n\n- When registering a view configuration that named a Chameleon ZPT renderer\n  with a macro name in it (e.g. ``renderer='some/template#somemacro.pt``) as\n  well as a view configuration without a macro name in it that pointed to the\n  same template (e.g. ``renderer='some/template.pt'``), internal caching could\n  confuse the two, and your code might have rendered one instead of the\n  other.\n\nFeatures\n--------\n\n- Allow multiple values to be specified to the ``request_param`` view/route\n  predicate as a sequence.  Previously only a single string value was allowed.\n  See https://github.com/Pylons/pyramid/pull/705\n\n- Comments with references to documentation sections placed in scaffold\n  ``.ini`` files.\n\n- Added an HTTP Basic authentication policy\n  at ``pyramid.authentication.BasicAuthAuthenticationPolicy``.\n\n- The Configurator ``testing_securitypolicy`` method now returns the policy\n  object it creates.\n\n- The Configurator ``testing_securitypolicy`` method accepts two new\n  arguments: ``remember_result`` and ``forget_result``.  If supplied, these\n  values influence the result of the policy's ``remember`` and ``forget``\n  methods, respectively.\n\n- The DummySecurityPolicy created by ``testing_securitypolicy`` now sets a\n  ``forgotten`` value on the policy (the value ``True``) when its ``forget``\n  method is called.\n\n- The DummySecurityPolicy created by ``testing_securitypolicy`` now sets a\n  ``remembered`` value on the policy, which is the value of the ``principal``\n  argument it's called with when its ``remember`` method is called.\n\n- New ``physical_path`` view predicate.  If specified, this value should be a\n  string or a tuple representing the physical traversal path of the context\n  found via traversal for this predicate to match as true.  For example:\n  ``physical_path='/'`` or ``physical_path='/a/b/c'`` or ``physical_path=('',\n  'a', 'b', 'c')``.  This is not a path prefix match or a regex, it's a\n  whole-path match.  It's useful when you want to always potentially show a\n  view when some object is traversed to, but you can't be sure about what kind\n  of object it will be, so you can't use the ``context`` predicate.  The\n  individual path elements inbetween slash characters or in tuple elements\n  should be the Unicode representation of the name of the resource and should\n  not be encoded in any way.\n\n1.4a2 (2012-09-27)\n==================\n\nBug Fixes\n---------\n\n- When trying to determine Mako defnames and Chameleon macro names in asset\n  specifications, take into account that the filename may have a hyphen in\n  it.  See https://github.com/Pylons/pyramid/pull/692\n\nFeatures\n--------\n\n- A new ``pyramid.session.check_csrf_token`` convenience function was added.\n\n- A ``check_csrf`` view predicate was added.  For example, you can now do\n  ``config.add_view(someview, check_csrf=True)``.  When the predicate is\n  checked, if the ``csrf_token`` value in ``request.params`` matches the CSRF\n  token in the request's session, the view will be permitted to execute.\n  Otherwise, it will not be permitted to execute.\n\n- Add ``Base.metadata.bind = engine`` to alchemy template, so that tables\n  defined imperatively will work.\n\nDocumentation\n-------------\n\n- update wiki2 SQLA tutorial with the changes required after inserting\n  ``Base.metadata.bind = engine`` into the alchemy scaffold.\n\n1.4a1 (2012-09-16)\n==================\n\nBug Fixes\n---------\n\n- Forward port from 1.3 branch: When no authentication policy was configured,\n  a call to ``pyramid.security.effective_principals`` would unconditionally\n  return the empty list.  This was incorrect, it should have unconditionally\n  returned ``[Everyone]``, and now does.\n\n- Explicit url dispatch regexes can now contain colons.\n  https://github.com/Pylons/pyramid/issues/629\n\n- On at least one 64-bit Ubuntu system under Python 3.2, using the\n  ``view_config`` decorator caused a ``RuntimeError: dictionary changed size\n  during iteration`` exception.  It no longer does.  See\n  https://github.com/Pylons/pyramid/issues/635 for more information.\n\n- In Mako Templates lookup, check if the uri is already adjusted and bring\n  it back to an asset spec. Normally occurs with inherited templates or\n  included components.\n  https://github.com/Pylons/pyramid/issues/606\n  https://github.com/Pylons/pyramid/issues/607\n\n- In Mako Templates lookup, check for absolute uri (using mako directories) \n  when mixing up inheritance with asset specs.\n  https://github.com/Pylons/pyramid/issues/662\n\n- HTTP Accept headers were not being normalized causing potentially\n  conflicting view registrations to go unnoticed. Two views that only\n  differ in the case ('text/html' vs. 'text/HTML') will now raise an error.\n  https://github.com/Pylons/pyramid/pull/620\n\n- Forward-port from 1.3 branch: when registering multiple views with an\n  ``accept`` predicate in a Pyramid application runing under Python 3, you\n  might have received a ``TypeError: unorderable types: function() <\n  function()`` exception.\n\nFeatures\n--------\n\n- Configurator.add_directive now accepts arbitrary callables like partials or\n  objects implementing ``__call__`` which dont have ``__name__`` and\n  ``__doc__`` attributes.  See https://github.com/Pylons/pyramid/issues/621\n  and https://github.com/Pylons/pyramid/pull/647.\n\n- Third-party custom view, route, and subscriber predicates can now be added\n  for use by view authors via\n  ``pyramid.config.Configurator.add_view_predicate``,\n  ``pyramid.config.Configurator.add_route_predicate`` and\n  ``pyramid.config.Configurator.add_subscriber_predicate``.  So, for example,\n  doing this::\n\n     config.add_view_predicate('abc', my.package.ABCPredicate)\n\n  Might allow a view author to do this in an application that configured that\n  predicate::\n\n     @view_config(abc=1)\n\n  Similar features exist for ``add_route``, and ``add_subscriber``.  See\n  \"Adding A Third Party View, Route, or Subscriber Predicate\" in the Hooks\n  chapter for more information.\n\n  Note that changes made to support the above feature now means that only\n  actions registered using the same \"order\" can conflict with one another.\n  It used to be the case that actions registered at different orders could\n  potentially conflict, but to my knowledge nothing ever depended on this\n  behavior (it was a bit silly).\n\n- Custom objects can be made easily JSON-serializable in Pyramid by defining\n  a ``__json__`` method on the object's class. This method should return\n  values natively serializable by ``json.dumps`` (such as ints, lists,\n  dictionaries, strings, and so forth).\n\n- The JSON renderer now allows for the definition of custom type adapters to\n  convert unknown objects to JSON serializations.\n\n- As of this release, the ``request_method`` predicate, when used, will also\n  imply that ``HEAD`` is implied when you use ``GET``.  For example, using\n  ``@view_config(request_method='GET')`` is equivalent to using\n  ``@view_config(request_method=('GET', 'HEAD'))``.  Using\n  ``@view_config(request_method=('GET', 'POST')`` is equivalent to using\n  ``@view_config(request_method=('GET', 'HEAD', 'POST')``.  This is because\n  HEAD is a variant of GET that omits the body, and WebOb has special support\n  to return an empty body when a HEAD is used.\n\n- ``config.add_request_method`` has been introduced to support extending\n  request objects with arbitrary callables. This method expands on the\n  previous ``config.set_request_property`` by supporting methods as well as\n  properties. This method now causes less code to be executed at\n  request construction time than ``config.set_request_property`` in\n  version 1.3.\n\n- Don't add a ``?`` to URLs generated by ``request.resource_url`` if the\n  ``query`` argument is provided but empty.\n\n- Don't add a ``?`` to URLs generated by ``request.route_url`` if the\n  ``_query`` argument is provided but empty.\n\n- The static view machinery now raises (rather than returns) ``HTTPNotFound``\n  and ``HTTPMovedPermanently`` exceptions, so these can be caught by the\n  Not Found View (and other exception views).\n\n- The Mako renderer now supports a def name in an asset spec.  When the def\n  name is present in the asset spec, the system will render the template def\n  within the template and will return the result. An example asset spec is\n  ``package:path/to/template#defname.mako``. This will render the def named\n  ``defname`` inside the ``template.mako`` template instead of rendering the\n  entire template.  The old way of returning a tuple in the form\n  ``('defname', {})`` from the view is supported for backward compatibility,\n\n- The Chameleon ZPT renderer now accepts a macro name in an asset spec.  When\n  the macro name is present in the asset spec, the system will render the\n  macro listed as a ``define-macro`` and return the result instead of\n  rendering the entire template.  An example asset spec:\n  ``package:path/to/template#macroname.pt``.  This will render the macro\n  defined as ``macroname`` within the ``template.pt`` template instead of the\n  entire templae.\n\n- When there is a predicate mismatch exception (seen when no view matches for\n  a given request due to predicates not working), the exception now contains\n  a textual description of the predicate which didn't match.\n\n- An ``add_permission`` directive method was added to the Configurator.  This\n  directive registers a free-standing permission introspectable into the\n  Pyramid introspection system.  Frameworks built atop Pyramid can thus use\n  the ``permissions`` introspectable category data to build a\n  comprehensive list of permissions supported by a running system.  Before\n  this method was added, permissions were already registered in this\n  introspectable category as a side effect of naming them in an ``add_view``\n  call, this method just makes it possible to arrange for a permission to be\n  put into the ``permissions`` introspectable category without naming it\n  along with an associated view.  Here's an example of usage of\n  ``add_permission``::\n\n      config = Configurator()\n      config.add_permission('view')\n\n- The ``UnencryptedCookieSessionFactoryConfig`` now accepts\n  ``signed_serialize`` and ``signed_deserialize`` hooks which may be used\n  to influence how the sessions are marshalled (by default this is done\n  with HMAC+pickle).\n\n- ``pyramid.testing.DummyRequest`` now supports methods supplied by the\n  ``pyramid.util.InstancePropertyMixin`` class such as ``set_property``.\n\n- Request properties and methods added via ``config.set_request_property`` or\n  ``config.add_request_method`` are now available to tweens.\n\n- Request properties and methods added via ``config.set_request_property`` or\n  ``config.add_request_method`` are now available in the request object\n  returned from ``pyramid.paster.bootstrap``.\n\n- ``request.context`` of environment request during ``bootstrap`` is now the\n  root object if a context isn't already set on a provided request.\n\n- The ``pyramid.decorator.reify`` function is now an API, and was added to\n  the API documentation.\n\n- Added the ``pyramid.testing.testConfig`` context manager, which can be used\n  to generate a configurator in a test, e.g. ``with testing.testConfig(...):``.\n\n- Users can now invoke a subrequest from within view code using a new\n  ``request.invoke_subrequest`` API.\n\nDeprecations\n------------\n\n- The ``pyramid.config.Configurator.set_request_property`` has been\n  documentation-deprecated.  The method remains usable but the more\n  featureful ``pyramid.config.Configurator.add_request_method`` should be\n  used in its place (it has all of the same capabilities but can also extend\n  the request object with methods).\n\nBackwards Incompatibilities\n---------------------------\n\n- The Pyramid router no longer adds the values ``bfg.routes.route`` or\n  ``bfg.routes.matchdict`` to the request's WSGI environment dictionary.\n  These values were docs-deprecated in ``repoze.bfg`` 1.0 (effectively seven\n  minor releases ago).  If your code depended on these values, use\n  request.matched_route and request.matchdict instead.\n\n- It is no longer possible to pass an environ dictionary directly to\n  ``pyramid.traversal.ResourceTreeTraverser.__call__`` (aka\n  ``ModelGraphTraverser.__call__``).  Instead, you must pass a request\n  object.  Passing an environment instead of a request has generated a\n  deprecation warning since Pyramid 1.1.\n\n- Pyramid will no longer work properly if you use the\n  ``webob.request.LegacyRequest`` as a request factory.  Instances of the\n  LegacyRequest class have a ``request.path_info`` which return a string.\n  This Pyramid release assumes that ``request.path_info`` will\n  unconditionally be Unicode.\n\n- The functions from ``pyramid.chameleon_zpt`` and ``pyramid.chameleon_text``\n  named ``get_renderer``, ``get_template``, ``render_template``, and\n  ``render_template_to_response`` have been removed.  These have issued a\n  deprecation warning upon import since Pyramid 1.0.  Use\n  ``pyramid.renderers.get_renderer()``,\n  ``pyramid.renderers.get_renderer().implementation()``,\n  ``pyramid.renderers.render()`` or ``pyramid.renderers.render_to_response``\n  respectively instead of these functions.\n\n- The ``pyramid.configuration`` module was removed.  It had been deprecated\n  since Pyramid 1.0 and printed a deprecation warning upon its use.  Use\n  ``pyramid.config`` instead.\n\n- The ``pyramid.paster.PyramidTemplate`` API was removed.  It had been\n  deprecated since Pyramid 1.1 and issued a warning on import.  If your code\n  depended on this, adjust your code to import\n  ``pyramid.scaffolds.PyramidTemplate`` instead.\n\n- The ``pyramid.settings.get_settings()`` API was removed.  It had been\n  printing a deprecation warning since Pyramid 1.0.  If your code depended on\n  this API, use ``pyramid.threadlocal.get_current_registry().settings``\n  instead or use the ``settings`` attribute of the registry available from\n  the request (``request.registry.settings``).\n\n- These APIs from the ``pyramid.testing`` module were removed.  They have\n  been printing deprecation warnings since Pyramid 1.0:\n\n  * ``registerDummySecurityPolicy``, use\n    ``pyramid.config.Configurator.testing_securitypolicy`` instead.\n\n  * ``registerResources`` (aka ``registerModels``, use\n    ``pyramid.config.Configurator.testing_resources`` instead.\n\n  * ``registerEventListener``, use\n    ``pyramid.config.Configurator.testing_add_subscriber`` instead.\n\n  * ``registerTemplateRenderer`` (aka `registerDummyRenderer``), use\n    ``pyramid.config.Configurator.testing_add_template`` instead.\n\n  * ``registerView``, use ``pyramid.config.Configurator.add_view`` instead.\n\n  * ``registerUtility``, use\n    ``pyramid.config.Configurator.registry.registerUtility`` instead.\n\n  * ``registerAdapter``, use\n    ``pyramid.config.Configurator.registry.registerAdapter`` instead.\n\n  * ``registerSubscriber``, use \n    ``pyramid.config.Configurator.add_subscriber`` instead.\n\n  * ``registerRoute``, use \n    ``pyramid.config.Configurator.add_route`` instead.\n\n  * ``registerSettings``, use \n    ``pyramid.config.Configurator.add_settings`` instead.\n\n- In Pyramid 1.3 and previous, the ``__call__`` method of a Response object\n  was invoked before any finished callbacks were executed.  As of this\n  release, the ``__call__`` method of a Response object is invoked *after*\n  finished callbacks are executed.  This is in support of the\n  ``request.invoke_subrequest`` feature.\n\nDocumentation\n-------------\n\n- Added an \"Upgrading Pyramid\" chapter to the narrative documentation.  It\n  describes how to cope with deprecations and removals of Pyramid APIs and\n  how to show Pyramid-generated deprecation warnings while running tests and\n  while running a server.\n\n- Added a \"Invoking a Subrequest\" chapter to the documentation.  It describes\n  how to use the new ``request.invoke_subrequest`` API.\n\nDependencies\n------------\n\n- Pyramid now requires WebOb 1.2b3+ (the prior Pyramid release only relied on\n  1.2dev+).  This is to ensure that we obtain a version of WebOb that returns\n  ``request.path_info`` as text.\n\n",
            "new_file_content": "next release\n============\n\nFeatures\n--------\n\n- ``ACLAuthorizationPolicy`` supports ``__acl__`` as a callable. This\n  removes the ambiguity between the potential ``AttributeError`` that would\n  be raised on the ``context`` when the property was not defined and the\n  ``AttributeError`` that could be raised from any user-defined code within\n  a dynamic property. It is recommended to define a dynamic ACL as a callable\n  to avoid this ambiguity. See https://github.com/Pylons/pyramid/issues/735.\n\n- Allow a protocol-relative URL (e.g. ``//example.com/images``) to be passed to\n  ``pyramid.config.Configurator.add_static_view``. This allows\n  externally-hosted static URLs to be generated based on the current protocol.\n\n- The ``AuthTktAuthenticationPolicy`` now supports IPv6 addresses when using\n  the ``include_ip=True`` option. This is possibly incompatible with\n  alternative ``auth_tkt`` implementations, as the specification does not\n  define how to properly handle IPv6. See\n  https://github.com/Pylons/pyramid/issues/831.\n\nBug Fixes\n---------\n\n- View lookup will now search for valid views based on the inheritance\n  hierarchy of the context. It tries to find views based on the most\n  specific context first, and upon predicate failure, will move up the\n  inheritance chain to test views found by the super-type of the context.\n  In the past, only the most specific type containing views would be checked\n  and if no matching view could be found then a PredicateMismatch would be\n  raised. Now predicate mismatches don't hide valid views registered on\n  super-types. Here's an example that now works::\n\n  .. code-block:: python\n\n     class IResource(Interface):\n         ...\n\n     @view_config(context=IResource)\n     def get(context, request):\n         ...\n\n     @view_config(context=IResource, request_method='POST')\n     def post(context, request):\n         ...\n\n     @view_config(context=IResource, request_method='DELETE')\n     def delete(context, request):\n         ...\n\n     @implementor(IResource)\n     class MyResource:\n         ...\n\n     @view_config(context=MyResource, request_method='POST')\n     def override_post(context, request):\n         ...\n\n  Previously the override_post view registration would hide the get\n  and delete views in the context of MyResource -- leading to a\n  predicate mismatch error when trying to use GET or DELETE\n  methods. Now the views are found and no predicate mismatch is\n  raised.\n\n1.4 (2012-12-18)\n================\n\nDocs\n----\n\n- Fix functional tests in the ZODB tutorial\n\n1.4b3 (2012-12-10)\n==================\n\n- Packaging release only, no code changes.  1.4b2 was a brownbag release due to\n  missing directories in the tarball.\n\n1.4b2 (2012-12-10)\n==================\n\nDocs\n----\n\n- Scaffolding is now PEP-8 compliant (at least for a brief shining moment).\n\n- Tutorial improvements.\n\nBackwards Incompatibilities\n---------------------------\n\n- Modified the ``_depth`` argument to ``pyramid.view.view_config`` to accept\n  a value relative to the invocation of ``view_config`` itself. Thus, when it\n  was previously expecting a value of ``1`` or greater, to reflect that\n  the caller of ``view_config`` is 1 stack frame away from ``venusian.attach``,\n  this implementation detail is now hidden.\n\n- Modified the ``_backframes`` argument to ``pyramid.util.action_method`` in a\n  similar way to the changes described to ``_depth`` above.  This argument\n  remains undocumented, but might be used in the wild by some insane person.\n\n1.4b1 (2012-11-21)\n==================\n\nFeatures\n--------\n\n- Small microspeed enhancement which anticipates that a\n  ``pyramid.response.Response`` object is likely to be returned from a view.\n  Some code is shortcut if the class of the object returned by a view is this\n  class.  A similar microoptimization was done to\n  ``pyramid.request.Request.is_response``.\n\n- Make it possible to use variable arguments on ``p*`` commands (``pserve``,\n  ``pshell``, ``pviews``, etc) in the form ``a=1 b=2`` so you can fill in\n  values in parameterized ``.ini`` file, e.g. ``pshell etc/development.ini\n  http_port=8080``.  See https://github.com/Pylons/pyramid/pull/714\n\n- A somewhat advanced and obscure feature of Pyramid event handlers is their\n  ability to handle \"multi-interface\" notifications.  These notifications have\n  traditionally presented multiple objects to the subscriber callable.  For\n  instance, if an event was sent by code like this::\n\n     registry.notify(event, context)\n\n  In the past, in order to catch such an event, you were obligated to write and\n  register an event subscriber that mentioned both the event and the context in\n  its argument list::\n\n     @subscriber([SomeEvent, SomeContextType])\n     def asubscriber(event, context):\n         pass\n\n  In many subscriber callables registered this way, it was common for the logic\n  in the subscriber callable to completely ignore the second and following\n  arguments (e.g. ``context`` in the above example might be ignored), because\n  they usually existed as attributes of the event anyway.  You could usually\n  get the same value by doing ``event.context`` or similar.\n\n  The fact that you needed to put an extra argument which you usually ignored\n  in the subscriber callable body was only a minor annoyance until we added\n  \"subscriber predicates\", used to narrow the set of circumstances under which\n  a subscriber will be executed, in a prior 1.4 alpha release.  Once those were\n  added, the annoyance was escalated, because subscriber predicates needed to\n  accept the same argument list and arity as the subscriber callables that they\n  were configured against.  So, for example, if you had these two subscriber\n  registrations in your code::\n\n     @subscriber([SomeEvent, SomeContextType])\n     def asubscriber(event, context):\n         pass\n\n     @subscriber(SomeOtherEvent)\n     def asubscriber(event):\n         pass\n \n  And you wanted to use a subscriber predicate::\n\n     @subscriber([SomeEvent, SomeContextType], mypredicate=True)\n     def asubscriber1(event, context):\n         pass\n\n     @subscriber(SomeOtherEvent, mypredicate=True)\n     def asubscriber2(event):\n         pass\n\n  If an existing ``mypredicate`` subscriber predicate had been written in such\n  a way that it accepted only one argument in its ``__call__``, you could not\n  use it against a subscription which named more than one interface in its\n  subscriber interface list.  Similarly, if you had written a subscriber\n  predicate that accepted two arguments, you couldn't use it against a\n  registration that named only a single interface type.\n\n  For example, if you created this predicate::\n\n    class MyPredicate(object):\n        # portions elided...\n        def __call__(self, event):\n            return self.val == event.context.foo\n\n  It would not work against a multi-interface-registered subscription, so in\n  the above example, when you attempted to use it against ``asubscriber1``, it\n  would fail at runtime with a TypeError, claiming something was attempting to\n  call it with too many arguments.\n\n  To hack around this limitation, you were obligated to design the\n  ``mypredicate`` predicate to expect to receive in its ``__call__`` either a\n  single ``event`` argument (a SomeOtherEvent object) *or* a pair of arguments\n  (a SomeEvent object and a SomeContextType object), presumably by doing\n  something like this::\n\n    class MyPredicate(object):\n        # portions elided...\n        def __call__(self, event, context=None):\n            return self.val == event.context.foo\n\n  This was confusing and bad.\n\n  In order to allow people to ignore unused arguments to subscriber callables\n  and to normalize the relationship between event subscribers and subscriber\n  predicates, we now allow both subscribers and subscriber predicates to accept\n  only a single ``event`` argument even if they've been subscribed for\n  notifications that involve multiple interfaces.  Subscribers and subscriber\n  predicates that accept only one argument will receive the first object passed\n  to ``notify``; this is typically (but not always) the event object.  The\n  other objects involved in the subscription lookup will be discarded.  You can\n  now write an event subscriber that accepts only ``event`` even if it\n  subscribes to multiple interfaces::\n\n     @subscriber([SomeEvent, SomeContextType])\n     def asubscriber(event):\n         # this will work!\n\n  This prevents you from needing to match the subscriber callable parameters to\n  the subscription type unnecessarily, especially when you don't make use of\n  any argument in your subscribers except for the event object itself.\n\n  Note, however, that if the event object is not the first\n  object in the call to ``notify``, you'll run into trouble.  For example, if\n  notify is called with the context argument first::\n\n     registry.notify(context, event)\n\n  You won't be able to take advantage of the event-only feature.  It will\n  \"work\", but the object received by your event handler won't be the event\n  object, it will be the context object, which won't be very useful::\n\n     @subscriber([SomeContextType, SomeEvent])\n     def asubscriber(event):\n         # bzzt! you'll be getting the context here as ``event``, and it'll \n         # be useless\n\n  Existing multiple-argument subscribers continue to work without issue, so you\n  should continue use those if your system notifies using multiple interfaces\n  and the first interface is not the event interface.  For example::\n\n     @subscriber([SomeContextType, SomeEvent])\n     def asubscriber(context, event):\n         # this will still work!\n\n  The event-only feature makes it possible to use a subscriber predicate that\n  accepts only a request argument within both multiple-interface subscriber\n  registrations and single-interface subscriber registrations.  You needn't\n  make slightly different variations of predicates depending on the\n  subscription type arguments.  Instead, just write all your subscriber\n  predicates so they only accept ``event`` in their ``__call__`` and they'll be\n  useful across all registrations for subscriptions that use an event as their\n  first argument, even ones which accept more than just ``event``.\n\n  However, the same caveat applies to predicates as to subscriber callables: if\n  you're subscribing to a multi-interface event, and the first interface is not\n  the event interface, the predicate won't work properly.  In such a case,\n  you'll need to match the predicate ``__call__`` argument ordering and\n  composition to the ordering of the interfaces.  For example, if the\n  registration for the subscription uses ``[SomeContext, SomeEvent]``, you'll\n  need to reflect that in the ordering of the parameters of the predicate's\n  ``__call__`` method::\n\n        def __call__(self, context, event):\n            return event.request.path.startswith(self.val)\n\n  tl;dr: 1) When using multi-interface subscriptions, always use the event type\n  as the first subscription registration argument and 2) When 1 is true, use\n  only ``event`` in your subscriber and subscriber predicate parameter lists,\n  no matter how many interfaces the subscriber is notified with.  This\n  combination will result in the maximum amount of reusability of subscriber\n  predicates and the least amount of thought on your part.  Drink responsibly.\n\nBug Fixes\n---------\n\n- A failure when trying to locate the attribute ``__text__`` on route and view\n  predicates existed when the ``debug_routematch`` setting was true or when the\n  ``pviews`` command was used. See https://github.com/Pylons/pyramid/pull/727\n\nDocumentation\n-------------\n\n- Sync up tutorial source files with the files that are rendered by the\n  scaffold that each uses.\n\n1.4a4 (2012-11-14)\n==================\n\nFeatures\n--------\n\n- ``pyramid.authentication.AuthTktAuthenticationPolicy`` has been updated to\n  support newer hashing algorithms such as ``sha512``. Existing applications\n  should consider updating if possible for improved security over the default\n  md5 hashing.\n\n- Added an ``effective_principals`` route and view predicate.\n\n- Do not allow the userid returned from the ``authenticated_userid`` or the\n  userid that is one of the list of principals returned by\n  ``effective_principals`` to be either of the strings ``system.Everyone`` or\n  ``system.Authenticated`` when any of the built-in authorization policies that\n  live in ``pyramid.authentication`` are in use.  These two strings are\n  reserved for internal usage by Pyramid and they will not be accepted as valid\n  userids.\n\n- Slightly better debug logging from\n  ``pyramid.authentication.RepozeWho1AuthenticationPolicy``.\n\n- ``pyramid.security.view_execution_permitted`` used to return ``True`` if no\n  view could be found. It now raises a ``TypeError`` exception in that case, as\n  it doesn't make sense to assert that a nonexistent view is\n  execution-permitted. See https://github.com/Pylons/pyramid/issues/299.\n\n- Allow a ``_depth`` argument to ``pyramid.view.view_config``, which will\n  permit limited composition reuse of the decorator by other software that\n  wants to provide custom decorators that are much like view_config.\n\n- Allow an iterable of decorators to be passed to\n  ``pyramid.config.Configurator.add_view``. This allows views to be wrapped\n  by more than one decorator without requiring combining the decorators\n  yourself.\n\nBug Fixes\n---------\n\n- In the past if a renderer returned ``None``, the body of the resulting\n  response would be set explicitly to the empty string.  Instead, now, the body\n  is left unchanged, which allows the renderer to set a body itself by using\n  e.g. ``request.response.body = b'foo'``.  The body set by the renderer will\n  be unmolested on the way out.  See\n  https://github.com/Pylons/pyramid/issues/709\n\n- In uncommon cases, the ``pyramid_excview_tween_factory`` might have\n  inadvertently raised a ``KeyError`` looking for ``request_iface`` as an\n  attribute of the request.  It no longer fails in this case.  See\n  https://github.com/Pylons/pyramid/issues/700\n\n- Be more tolerant of potential error conditions in ``match_param`` and\n  ``physical_path`` predicate implementations; instead of raising an exception,\n  return False.\n\n- ``pyramid.view.render_view`` was not functioning properly under Python 3.x\n  due to a byte/unicode discrepancy. See\n  https://github.com/Pylons/pyramid/issues/721\n\nDeprecations\n------------\n\n- ``pyramid.authentication.AuthTktAuthenticationPolicy`` will emit a warning if\n  an application is using the policy without explicitly passing a ``hashalg``\n  argument. This is because the default is \"md5\" which is considered\n  theoretically subject to collision attacks. If you really want \"md5\" then you\n  must specify it explicitly to get rid of the warning.\n\nDocumentation\n-------------\n\n- All of the tutorials that use\n  ``pyramid.authentication.AuthTktAuthenticationPolicy`` now explicitly pass\n  ``sha512`` as a ``hashalg`` argument.\n\n\nInternals\n---------\n\n- Move ``TopologicalSorter`` from ``pyramid.config.util`` to ``pyramid.util``,\n  move ``CyclicDependencyError`` from ``pyramid.config.util`` to\n  ``pyramid.exceptions``, rename ``Singleton`` to ``Sentinel`` and move from\n  ``pyramid.config.util`` to ``pyramid.util``; this is in an effort to\n  move that stuff that may be an API one day out of ``pyramid.config.util``,\n  because that package should never be imported from non-Pyramid code.\n  TopologicalSorter is still not an API, but may become one.\n\n- Get rid of shady monkeypatching of ``pyramid.request.Request`` and\n  ``pyramid.response.Response`` done within the ``__init__.py`` of Pyramid.\n  Webob no longer relies on this being done.  Instead, the ResponseClass\n  attribute of the Pyramid Request class is assigned to the Pyramid response\n  class; that's enough to satisfy WebOb and behave as it did before with the\n  monkeypatching.\n\n1.4a3 (2012-10-26)\n==================\n\nBug Fixes\n---------\n\n- The match_param predicate's text method was fixed to sort its values.\n  Part of https://github.com/Pylons/pyramid/pull/705\n\n- 1.4a ``pyramid.scripting.prepare`` behaved differently than 1.3 series\n  function of same name.  In particular, if passed a request, it would not\n  set the ``registry`` attribute of the request like 1.3 did.  A symptom\n  would be that passing a request to ``pyramid.paster.bootstrap`` (which uses\n  the function) that did not have a ``registry`` attribute could assume that\n  the registry would be attached to the request by Pyramid.  This assumption\n  could be made in 1.3, but not in 1.4.  The assumption can now be made in\n  1.4 too (a registry is attached to a request passed to bootstrap or\n  prepare).\n\n- When registering a view configuration that named a Chameleon ZPT renderer\n  with a macro name in it (e.g. ``renderer='some/template#somemacro.pt``) as\n  well as a view configuration without a macro name in it that pointed to the\n  same template (e.g. ``renderer='some/template.pt'``), internal caching could\n  confuse the two, and your code might have rendered one instead of the\n  other.\n\nFeatures\n--------\n\n- Allow multiple values to be specified to the ``request_param`` view/route\n  predicate as a sequence.  Previously only a single string value was allowed.\n  See https://github.com/Pylons/pyramid/pull/705\n\n- Comments with references to documentation sections placed in scaffold\n  ``.ini`` files.\n\n- Added an HTTP Basic authentication policy\n  at ``pyramid.authentication.BasicAuthAuthenticationPolicy``.\n\n- The Configurator ``testing_securitypolicy`` method now returns the policy\n  object it creates.\n\n- The Configurator ``testing_securitypolicy`` method accepts two new\n  arguments: ``remember_result`` and ``forget_result``.  If supplied, these\n  values influence the result of the policy's ``remember`` and ``forget``\n  methods, respectively.\n\n- The DummySecurityPolicy created by ``testing_securitypolicy`` now sets a\n  ``forgotten`` value on the policy (the value ``True``) when its ``forget``\n  method is called.\n\n- The DummySecurityPolicy created by ``testing_securitypolicy`` now sets a\n  ``remembered`` value on the policy, which is the value of the ``principal``\n  argument it's called with when its ``remember`` method is called.\n\n- New ``physical_path`` view predicate.  If specified, this value should be a\n  string or a tuple representing the physical traversal path of the context\n  found via traversal for this predicate to match as true.  For example:\n  ``physical_path='/'`` or ``physical_path='/a/b/c'`` or ``physical_path=('',\n  'a', 'b', 'c')``.  This is not a path prefix match or a regex, it's a\n  whole-path match.  It's useful when you want to always potentially show a\n  view when some object is traversed to, but you can't be sure about what kind\n  of object it will be, so you can't use the ``context`` predicate.  The\n  individual path elements inbetween slash characters or in tuple elements\n  should be the Unicode representation of the name of the resource and should\n  not be encoded in any way.\n\n1.4a2 (2012-09-27)\n==================\n\nBug Fixes\n---------\n\n- When trying to determine Mako defnames and Chameleon macro names in asset\n  specifications, take into account that the filename may have a hyphen in\n  it.  See https://github.com/Pylons/pyramid/pull/692\n\nFeatures\n--------\n\n- A new ``pyramid.session.check_csrf_token`` convenience function was added.\n\n- A ``check_csrf`` view predicate was added.  For example, you can now do\n  ``config.add_view(someview, check_csrf=True)``.  When the predicate is\n  checked, if the ``csrf_token`` value in ``request.params`` matches the CSRF\n  token in the request's session, the view will be permitted to execute.\n  Otherwise, it will not be permitted to execute.\n\n- Add ``Base.metadata.bind = engine`` to alchemy template, so that tables\n  defined imperatively will work.\n\nDocumentation\n-------------\n\n- update wiki2 SQLA tutorial with the changes required after inserting\n  ``Base.metadata.bind = engine`` into the alchemy scaffold.\n\n1.4a1 (2012-09-16)\n==================\n\nBug Fixes\n---------\n\n- Forward port from 1.3 branch: When no authentication policy was configured,\n  a call to ``pyramid.security.effective_principals`` would unconditionally\n  return the empty list.  This was incorrect, it should have unconditionally\n  returned ``[Everyone]``, and now does.\n\n- Explicit url dispatch regexes can now contain colons.\n  https://github.com/Pylons/pyramid/issues/629\n\n- On at least one 64-bit Ubuntu system under Python 3.2, using the\n  ``view_config`` decorator caused a ``RuntimeError: dictionary changed size\n  during iteration`` exception.  It no longer does.  See\n  https://github.com/Pylons/pyramid/issues/635 for more information.\n\n- In Mako Templates lookup, check if the uri is already adjusted and bring\n  it back to an asset spec. Normally occurs with inherited templates or\n  included components.\n  https://github.com/Pylons/pyramid/issues/606\n  https://github.com/Pylons/pyramid/issues/607\n\n- In Mako Templates lookup, check for absolute uri (using mako directories) \n  when mixing up inheritance with asset specs.\n  https://github.com/Pylons/pyramid/issues/662\n\n- HTTP Accept headers were not being normalized causing potentially\n  conflicting view registrations to go unnoticed. Two views that only\n  differ in the case ('text/html' vs. 'text/HTML') will now raise an error.\n  https://github.com/Pylons/pyramid/pull/620\n\n- Forward-port from 1.3 branch: when registering multiple views with an\n  ``accept`` predicate in a Pyramid application runing under Python 3, you\n  might have received a ``TypeError: unorderable types: function() <\n  function()`` exception.\n\nFeatures\n--------\n\n- Configurator.add_directive now accepts arbitrary callables like partials or\n  objects implementing ``__call__`` which dont have ``__name__`` and\n  ``__doc__`` attributes.  See https://github.com/Pylons/pyramid/issues/621\n  and https://github.com/Pylons/pyramid/pull/647.\n\n- Third-party custom view, route, and subscriber predicates can now be added\n  for use by view authors via\n  ``pyramid.config.Configurator.add_view_predicate``,\n  ``pyramid.config.Configurator.add_route_predicate`` and\n  ``pyramid.config.Configurator.add_subscriber_predicate``.  So, for example,\n  doing this::\n\n     config.add_view_predicate('abc', my.package.ABCPredicate)\n\n  Might allow a view author to do this in an application that configured that\n  predicate::\n\n     @view_config(abc=1)\n\n  Similar features exist for ``add_route``, and ``add_subscriber``.  See\n  \"Adding A Third Party View, Route, or Subscriber Predicate\" in the Hooks\n  chapter for more information.\n\n  Note that changes made to support the above feature now means that only\n  actions registered using the same \"order\" can conflict with one another.\n  It used to be the case that actions registered at different orders could\n  potentially conflict, but to my knowledge nothing ever depended on this\n  behavior (it was a bit silly).\n\n- Custom objects can be made easily JSON-serializable in Pyramid by defining\n  a ``__json__`` method on the object's class. This method should return\n  values natively serializable by ``json.dumps`` (such as ints, lists,\n  dictionaries, strings, and so forth).\n\n- The JSON renderer now allows for the definition of custom type adapters to\n  convert unknown objects to JSON serializations.\n\n- As of this release, the ``request_method`` predicate, when used, will also\n  imply that ``HEAD`` is implied when you use ``GET``.  For example, using\n  ``@view_config(request_method='GET')`` is equivalent to using\n  ``@view_config(request_method=('GET', 'HEAD'))``.  Using\n  ``@view_config(request_method=('GET', 'POST')`` is equivalent to using\n  ``@view_config(request_method=('GET', 'HEAD', 'POST')``.  This is because\n  HEAD is a variant of GET that omits the body, and WebOb has special support\n  to return an empty body when a HEAD is used.\n\n- ``config.add_request_method`` has been introduced to support extending\n  request objects with arbitrary callables. This method expands on the\n  previous ``config.set_request_property`` by supporting methods as well as\n  properties. This method now causes less code to be executed at\n  request construction time than ``config.set_request_property`` in\n  version 1.3.\n\n- Don't add a ``?`` to URLs generated by ``request.resource_url`` if the\n  ``query`` argument is provided but empty.\n\n- Don't add a ``?`` to URLs generated by ``request.route_url`` if the\n  ``_query`` argument is provided but empty.\n\n- The static view machinery now raises (rather than returns) ``HTTPNotFound``\n  and ``HTTPMovedPermanently`` exceptions, so these can be caught by the\n  Not Found View (and other exception views).\n\n- The Mako renderer now supports a def name in an asset spec.  When the def\n  name is present in the asset spec, the system will render the template def\n  within the template and will return the result. An example asset spec is\n  ``package:path/to/template#defname.mako``. This will render the def named\n  ``defname`` inside the ``template.mako`` template instead of rendering the\n  entire template.  The old way of returning a tuple in the form\n  ``('defname', {})`` from the view is supported for backward compatibility,\n\n- The Chameleon ZPT renderer now accepts a macro name in an asset spec.  When\n  the macro name is present in the asset spec, the system will render the\n  macro listed as a ``define-macro`` and return the result instead of\n  rendering the entire template.  An example asset spec:\n  ``package:path/to/template#macroname.pt``.  This will render the macro\n  defined as ``macroname`` within the ``template.pt`` template instead of the\n  entire templae.\n\n- When there is a predicate mismatch exception (seen when no view matches for\n  a given request due to predicates not working), the exception now contains\n  a textual description of the predicate which didn't match.\n\n- An ``add_permission`` directive method was added to the Configurator.  This\n  directive registers a free-standing permission introspectable into the\n  Pyramid introspection system.  Frameworks built atop Pyramid can thus use\n  the ``permissions`` introspectable category data to build a\n  comprehensive list of permissions supported by a running system.  Before\n  this method was added, permissions were already registered in this\n  introspectable category as a side effect of naming them in an ``add_view``\n  call, this method just makes it possible to arrange for a permission to be\n  put into the ``permissions`` introspectable category without naming it\n  along with an associated view.  Here's an example of usage of\n  ``add_permission``::\n\n      config = Configurator()\n      config.add_permission('view')\n\n- The ``UnencryptedCookieSessionFactoryConfig`` now accepts\n  ``signed_serialize`` and ``signed_deserialize`` hooks which may be used\n  to influence how the sessions are marshalled (by default this is done\n  with HMAC+pickle).\n\n- ``pyramid.testing.DummyRequest`` now supports methods supplied by the\n  ``pyramid.util.InstancePropertyMixin`` class such as ``set_property``.\n\n- Request properties and methods added via ``config.set_request_property`` or\n  ``config.add_request_method`` are now available to tweens.\n\n- Request properties and methods added via ``config.set_request_property`` or\n  ``config.add_request_method`` are now available in the request object\n  returned from ``pyramid.paster.bootstrap``.\n\n- ``request.context`` of environment request during ``bootstrap`` is now the\n  root object if a context isn't already set on a provided request.\n\n- The ``pyramid.decorator.reify`` function is now an API, and was added to\n  the API documentation.\n\n- Added the ``pyramid.testing.testConfig`` context manager, which can be used\n  to generate a configurator in a test, e.g. ``with testing.testConfig(...):``.\n\n- Users can now invoke a subrequest from within view code using a new\n  ``request.invoke_subrequest`` API.\n\nDeprecations\n------------\n\n- The ``pyramid.config.Configurator.set_request_property`` has been\n  documentation-deprecated.  The method remains usable but the more\n  featureful ``pyramid.config.Configurator.add_request_method`` should be\n  used in its place (it has all of the same capabilities but can also extend\n  the request object with methods).\n\nBackwards Incompatibilities\n---------------------------\n\n- The Pyramid router no longer adds the values ``bfg.routes.route`` or\n  ``bfg.routes.matchdict`` to the request's WSGI environment dictionary.\n  These values were docs-deprecated in ``repoze.bfg`` 1.0 (effectively seven\n  minor releases ago).  If your code depended on these values, use\n  request.matched_route and request.matchdict instead.\n\n- It is no longer possible to pass an environ dictionary directly to\n  ``pyramid.traversal.ResourceTreeTraverser.__call__`` (aka\n  ``ModelGraphTraverser.__call__``).  Instead, you must pass a request\n  object.  Passing an environment instead of a request has generated a\n  deprecation warning since Pyramid 1.1.\n\n- Pyramid will no longer work properly if you use the\n  ``webob.request.LegacyRequest`` as a request factory.  Instances of the\n  LegacyRequest class have a ``request.path_info`` which return a string.\n  This Pyramid release assumes that ``request.path_info`` will\n  unconditionally be Unicode.\n\n- The functions from ``pyramid.chameleon_zpt`` and ``pyramid.chameleon_text``\n  named ``get_renderer``, ``get_template``, ``render_template``, and\n  ``render_template_to_response`` have been removed.  These have issued a\n  deprecation warning upon import since Pyramid 1.0.  Use\n  ``pyramid.renderers.get_renderer()``,\n  ``pyramid.renderers.get_renderer().implementation()``,\n  ``pyramid.renderers.render()`` or ``pyramid.renderers.render_to_response``\n  respectively instead of these functions.\n\n- The ``pyramid.configuration`` module was removed.  It had been deprecated\n  since Pyramid 1.0 and printed a deprecation warning upon its use.  Use\n  ``pyramid.config`` instead.\n\n- The ``pyramid.paster.PyramidTemplate`` API was removed.  It had been\n  deprecated since Pyramid 1.1 and issued a warning on import.  If your code\n  depended on this, adjust your code to import\n  ``pyramid.scaffolds.PyramidTemplate`` instead.\n\n- The ``pyramid.settings.get_settings()`` API was removed.  It had been\n  printing a deprecation warning since Pyramid 1.0.  If your code depended on\n  this API, use ``pyramid.threadlocal.get_current_registry().settings``\n  instead or use the ``settings`` attribute of the registry available from\n  the request (``request.registry.settings``).\n\n- These APIs from the ``pyramid.testing`` module were removed.  They have\n  been printing deprecation warnings since Pyramid 1.0:\n\n  * ``registerDummySecurityPolicy``, use\n    ``pyramid.config.Configurator.testing_securitypolicy`` instead.\n\n  * ``registerResources`` (aka ``registerModels``, use\n    ``pyramid.config.Configurator.testing_resources`` instead.\n\n  * ``registerEventListener``, use\n    ``pyramid.config.Configurator.testing_add_subscriber`` instead.\n\n  * ``registerTemplateRenderer`` (aka `registerDummyRenderer``), use\n    ``pyramid.config.Configurator.testing_add_template`` instead.\n\n  * ``registerView``, use ``pyramid.config.Configurator.add_view`` instead.\n\n  * ``registerUtility``, use\n    ``pyramid.config.Configurator.registry.registerUtility`` instead.\n\n  * ``registerAdapter``, use\n    ``pyramid.config.Configurator.registry.registerAdapter`` instead.\n\n  * ``registerSubscriber``, use \n    ``pyramid.config.Configurator.add_subscriber`` instead.\n\n  * ``registerRoute``, use \n    ``pyramid.config.Configurator.add_route`` instead.\n\n  * ``registerSettings``, use \n    ``pyramid.config.Configurator.add_settings`` instead.\n\n- In Pyramid 1.3 and previous, the ``__call__`` method of a Response object\n  was invoked before any finished callbacks were executed.  As of this\n  release, the ``__call__`` method of a Response object is invoked *after*\n  finished callbacks are executed.  This is in support of the\n  ``request.invoke_subrequest`` feature.\n\nDocumentation\n-------------\n\n- Added an \"Upgrading Pyramid\" chapter to the narrative documentation.  It\n  describes how to cope with deprecations and removals of Pyramid APIs and\n  how to show Pyramid-generated deprecation warnings while running tests and\n  while running a server.\n\n- Added a \"Invoking a Subrequest\" chapter to the documentation.  It describes\n  how to use the new ``request.invoke_subrequest`` API.\n\nDependencies\n------------\n\n- Pyramid now requires WebOb 1.2b3+ (the prior Pyramid release only relied on\n  1.2dev+).  This is to ensure that we obtain a version of WebOb that returns\n  ``request.path_info`` as text.\n\n",
            "header": {
                "file": {
                    "path": "CHANGES.txt"
                },
                "misc_line": null
            },
            "index_line": {
                "old_commit_hash": "d087bf43b",
                "new_commit_hash": "86257cc22",
                "mode": "100644"
            },
            "is_binary_file": false,
            "binary_line": null,
            "minus_file": {
                "path": "a/CHANGES.txt"
            },
            "plus_file": {
                "path": "b/CHANGES.txt"
            },
            "hunks": [
                {
                    "descriptor": {
                        "old_range": {
                            "start": 15,
                            "length": 6
                        },
                        "new_range": {
                            "start": 15,
                            "length": 12
                        },
                        "section": "Features"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "  ``pyramid.config.Configurator.add_static_view``. This allows",
                                "type": "context"
                            },
                            {
                                "content": "  externally-hosted static URLs to be generated based on the current protocol.",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "- The ``AuthTktAuthenticationPolicy`` now supports IPv6 addresses when using",
                                "type": "added"
                            },
                            {
                                "content": "  the ``include_ip=True`` option. This is possibly incompatible with",
                                "type": "added"
                            },
                            {
                                "content": "  alternative ``auth_tkt`` implementations, as the specification does not",
                                "type": "added"
                            },
                            {
                                "content": "  define how to properly handle IPv6. See",
                                "type": "added"
                            },
                            {
                                "content": "  https://github.com/Pylons/pyramid/issues/831.",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "Bug Fixes",
                                "type": "context"
                            },
                            {
                                "content": "---------",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [],
                    "added_entities": [],
                    "deleted_entities": []
                }
            ]
        },
        {
            "old_file_content": "Pylons Project Contributor Agreement\n====================================\n\nThe submitter agrees by adding his or her name within the section below named\n\"Contributors\" and submitting the resulting modified document to the\ncanonical shared repository location for this software project (whether\ndirectly, as a user with \"direct commit access\", or via a \"pull request\"), he\nor she is signing a contract electronically.  The submitter becomes a\nContributor after a) he or she signs this document by adding their name\nbeneath the \"Contributors\" section below, and b) the resulting document is\naccepted into the canonical version control repository.\n\nTreatment of Account\n---------------------\n\nContributor will not allow anyone other than the Contributor to use his or\nher username or source repository login to submit code to a Pylons Project\nsource repository. Should Contributor become aware of any such use,\nContributor will immediately notify Agendaless Consulting.\nNotification must be performed by sending an email to\nwebmaster@agendaless.com.  Until such notice is received, Contributor will be\npresumed to have taken all actions made through Contributor's account. If the\nContributor has direct commit access, Agendaless Consulting will have\ncomplete control and discretion over capabilities assigned to Contributor's\naccount, and may disable Contributor's account for any reason at any time.\n\nLegal Effect of Contribution\n----------------------------\n\nUpon submitting a change or new work to a Pylons Project source Repository (a\n\"Contribution\"), you agree to assign, and hereby do assign, a one-half\ninterest of all right, title and interest in and to copyright and other\nintellectual property rights with respect to your new and original portions\nof the Contribution to Agendaless Consulting. You and Agendaless Consulting\neach agree that the other shall be free to exercise any and all exclusive\nrights in and to the Contribution, without accounting to one another,\nincluding without limitation, the right to license the Contribution to others\nunder the Repoze Public License. This agreement shall run with title to the\nContribution. Agendaless Consulting does not convey to you any right, title\nor interest in or to the Program or such portions of the Contribution that\nwere taken from the Program. Your transmission of a submission to the Pylons\nProject source Repository and marks of identification concerning the\nContribution itself constitute your intent to contribute and your assignment\nof the work in accordance with the provisions of this Agreement.\n\nLicense Terms\n-------------\n\nCode committed to the Pylons Project source repository (Committed Code) must\nbe governed by the Repoze Public License (http://repoze.org/LICENSE.txt, aka\n\"the RPL\") or another license acceptable to Agendaless Consulting.  Until\nAgendaless Consulting declares in writing an acceptable license other than\nthe RPL, only the RPL shall be used.  A list of exceptions is detailed within\nthe \"Licensing Exceptions\" section of this document, if one exists.\n\nRepresentations, Warranty, and Indemnification\n----------------------------------------------\n\nContributor represents and warrants that the Committed Code does not violate\nthe rights of any person or entity, and that the Contributor has legal\nauthority to enter into this Agreement and legal authority over Contributed\nCode. Further, Contributor indemnifies Agendaless Consulting against\nviolations.\n\nCryptography\n------------\n\nContributor understands that cryptographic code may be subject to government\nregulations with which Agendaless Consulting and/or entities using Committed\nCode must comply. Any code which contains any of the items listed below must\nnot be checked-in until Agendaless Consulting staff has been notified and has\napproved such contribution in writing.\n\n- Cryptographic capabilities or features\n\n- Calls to cryptographic features\n\n- User interface elements which provide context relating to cryptography\n\n- Code which may, under casual inspection, appear to be cryptographic.\n\nNotices\n-------\n\nContributor confirms that any notices required will be included in any\nCommitted Code.\n\nLicensing Exceptions\n====================\n\nCode committed within the ``docs/`` subdirectory of the Pyramid source\ncontrol repository and \"docstrings\" which appear in the documentation\ngenerated by running \"make\" within this directory is licensed under the\nCreative Commons Attribution-Noncommercial-Share Alike 3.0 United States\nLicense (http://creativecommons.org/licenses/by-nc-sa/3.0/us/).\n\nList of Contributors\n====================\n\nThe below-signed are contributors to a code repository that is part of the\nproject named \"Pyramid\".  Each below-signed contributor has read, understand\nand agrees to the terms above in the section within this document entitled\n\"Pylons Project Contributor Agreement\" as of the date beside his or her name.\n\nContributors\n------------\n\n- Chris McDonough, 2010/11/08\n\n- Tres Seaver, 2010/11/09\n\n- Ben Bangert, 2010/11/09\n\n- Blaise Laflamme, 2010/11/09\n\n- Chris Rossi, 2010/11/10\n\n- Casey Duncan, 2010/12/27\n\n- Rob Miller, 2010/12/28\n\n- Marius Gedminas, 2010/12/31\n\n- Marcin Lulek, 2011/01/02\n\n- John Shipman, 2011/01/15\n\n- Wichert Akkerman, 2011/01/19\n\n- Christopher Lambacher, 2011/02/12\n\n- Malthe Borch, 2011/02/28\n\n- Carlos de la Guardia, 2011/03/29\n\n- Joel Bohman, 2011/04/16\n\n- Juliusz Gonera, 2011/04/17\n\n- Philip Jenvey, 2011/04/24\n\n- Michael Merickel, 2011/5/25\n\n- Christoph Zwerschke, 2011/06/07\n\n- Atsushi Odagiri, 2011/07/02\n\n- Shane Hathaway, 2011/07/22\n\n- Manuel Hermann, 2011/07/11\n\n- Richard Barrell, 2011/11/07\n\n- Chris Shenton, 2011/11/07\n\n- Ken Manheimer, 2011/11/07\n\n- Reed O'Brien, 2011/11/07\n\n- Klee Dienes, 2011/10/30\n\n- Michael Ryabushin, 2011/12/14\n\n- Mike Orr, 2012/02/14\n\n- Paul M. Winkler, 2012/02/22\n\n- Martijn Pieters, 2012/03/02\n\n- Steve Piercy, 2012/03/27\n\n- Wayne Witzel III, 2012/03/27\n\n- Marin Rukavina, 2012/05/03\n\n- Lorenzo M. Catucci, 2012/06/08\n\n- Marc Abramowitz, 2012/06/13\n\n- Brian Sutherland, 2012/06/16\n\n- Jeff Cook, 2012/06/16\n\n- Ian Wilson, 2012/06/17\n\n- Roman Kozlovskyi, 2012/08/11\n\n- Domen Kozar, 2012/09/11\n\n- David Gay, 2012/09/16\n\n- Robert Jackiewicz, 2012/11/12\n\n- John Anderson, 2012/11/14\n",
            "new_file_content": "Pylons Project Contributor Agreement\n====================================\n\nThe submitter agrees by adding his or her name within the section below named\n\"Contributors\" and submitting the resulting modified document to the\ncanonical shared repository location for this software project (whether\ndirectly, as a user with \"direct commit access\", or via a \"pull request\"), he\nor she is signing a contract electronically.  The submitter becomes a\nContributor after a) he or she signs this document by adding their name\nbeneath the \"Contributors\" section below, and b) the resulting document is\naccepted into the canonical version control repository.\n\nTreatment of Account\n---------------------\n\nContributor will not allow anyone other than the Contributor to use his or\nher username or source repository login to submit code to a Pylons Project\nsource repository. Should Contributor become aware of any such use,\nContributor will immediately notify Agendaless Consulting.\nNotification must be performed by sending an email to\nwebmaster@agendaless.com.  Until such notice is received, Contributor will be\npresumed to have taken all actions made through Contributor's account. If the\nContributor has direct commit access, Agendaless Consulting will have\ncomplete control and discretion over capabilities assigned to Contributor's\naccount, and may disable Contributor's account for any reason at any time.\n\nLegal Effect of Contribution\n----------------------------\n\nUpon submitting a change or new work to a Pylons Project source Repository (a\n\"Contribution\"), you agree to assign, and hereby do assign, a one-half\ninterest of all right, title and interest in and to copyright and other\nintellectual property rights with respect to your new and original portions\nof the Contribution to Agendaless Consulting. You and Agendaless Consulting\neach agree that the other shall be free to exercise any and all exclusive\nrights in and to the Contribution, without accounting to one another,\nincluding without limitation, the right to license the Contribution to others\nunder the Repoze Public License. This agreement shall run with title to the\nContribution. Agendaless Consulting does not convey to you any right, title\nor interest in or to the Program or such portions of the Contribution that\nwere taken from the Program. Your transmission of a submission to the Pylons\nProject source Repository and marks of identification concerning the\nContribution itself constitute your intent to contribute and your assignment\nof the work in accordance with the provisions of this Agreement.\n\nLicense Terms\n-------------\n\nCode committed to the Pylons Project source repository (Committed Code) must\nbe governed by the Repoze Public License (http://repoze.org/LICENSE.txt, aka\n\"the RPL\") or another license acceptable to Agendaless Consulting.  Until\nAgendaless Consulting declares in writing an acceptable license other than\nthe RPL, only the RPL shall be used.  A list of exceptions is detailed within\nthe \"Licensing Exceptions\" section of this document, if one exists.\n\nRepresentations, Warranty, and Indemnification\n----------------------------------------------\n\nContributor represents and warrants that the Committed Code does not violate\nthe rights of any person or entity, and that the Contributor has legal\nauthority to enter into this Agreement and legal authority over Contributed\nCode. Further, Contributor indemnifies Agendaless Consulting against\nviolations.\n\nCryptography\n------------\n\nContributor understands that cryptographic code may be subject to government\nregulations with which Agendaless Consulting and/or entities using Committed\nCode must comply. Any code which contains any of the items listed below must\nnot be checked-in until Agendaless Consulting staff has been notified and has\napproved such contribution in writing.\n\n- Cryptographic capabilities or features\n\n- Calls to cryptographic features\n\n- User interface elements which provide context relating to cryptography\n\n- Code which may, under casual inspection, appear to be cryptographic.\n\nNotices\n-------\n\nContributor confirms that any notices required will be included in any\nCommitted Code.\n\nLicensing Exceptions\n====================\n\nCode committed within the ``docs/`` subdirectory of the Pyramid source\ncontrol repository and \"docstrings\" which appear in the documentation\ngenerated by running \"make\" within this directory is licensed under the\nCreative Commons Attribution-Noncommercial-Share Alike 3.0 United States\nLicense (http://creativecommons.org/licenses/by-nc-sa/3.0/us/).\n\nList of Contributors\n====================\n\nThe below-signed are contributors to a code repository that is part of the\nproject named \"Pyramid\".  Each below-signed contributor has read, understand\nand agrees to the terms above in the section within this document entitled\n\"Pylons Project Contributor Agreement\" as of the date beside his or her name.\n\nContributors\n------------\n\n- Chris McDonough, 2010/11/08\n\n- Tres Seaver, 2010/11/09\n\n- Ben Bangert, 2010/11/09\n\n- Blaise Laflamme, 2010/11/09\n\n- Chris Rossi, 2010/11/10\n\n- Casey Duncan, 2010/12/27\n\n- Rob Miller, 2010/12/28\n\n- Marius Gedminas, 2010/12/31\n\n- Marcin Lulek, 2011/01/02\n\n- John Shipman, 2011/01/15\n\n- Wichert Akkerman, 2011/01/19\n\n- Christopher Lambacher, 2011/02/12\n\n- Malthe Borch, 2011/02/28\n\n- Carlos de la Guardia, 2011/03/29\n\n- Joel Bohman, 2011/04/16\n\n- Juliusz Gonera, 2011/04/17\n\n- Philip Jenvey, 2011/04/24\n\n- Michael Merickel, 2011/5/25\n\n- Christoph Zwerschke, 2011/06/07\n\n- Atsushi Odagiri, 2011/07/02\n\n- Shane Hathaway, 2011/07/22\n\n- Manuel Hermann, 2011/07/11\n\n- Richard Barrell, 2011/11/07\n\n- Chris Shenton, 2011/11/07\n\n- Ken Manheimer, 2011/11/07\n\n- Reed O'Brien, 2011/11/07\n\n- Klee Dienes, 2011/10/30\n\n- Michael Ryabushin, 2011/12/14\n\n- Mike Orr, 2012/02/14\n\n- Paul M. Winkler, 2012/02/22\n\n- Martijn Pieters, 2012/03/02\n\n- Steve Piercy, 2012/03/27\n\n- Wayne Witzel III, 2012/03/27\n\n- Marin Rukavina, 2012/05/03\n\n- Lorenzo M. Catucci, 2012/06/08\n\n- Marc Abramowitz, 2012/06/13\n\n- Brian Sutherland, 2012/06/16\n\n- Jeff Cook, 2012/06/16\n\n- Ian Wilson, 2012/06/17\n\n- Roman Kozlovskyi, 2012/08/11\n\n- Domen Kozar, 2012/09/11\n\n- David Gay, 2012/09/16\n\n- Robert Jackiewicz, 2012/11/12\n\n- John Anderson, 2012/11/14\n\n- Bert JW Regeer, 2013/02/01\n",
            "header": {
                "file": {
                    "path": "CONTRIBUTORS.txt"
                },
                "misc_line": null
            },
            "index_line": {
                "old_commit_hash": "971c172f8",
                "new_commit_hash": "02fb81528",
                "mode": "100644"
            },
            "is_binary_file": false,
            "binary_line": null,
            "minus_file": {
                "path": "a/CONTRIBUTORS.txt"
            },
            "plus_file": {
                "path": "b/CONTRIBUTORS.txt"
            },
            "hunks": [
                {
                    "descriptor": {
                        "old_range": {
                            "start": 192,
                            "length": 3
                        },
                        "new_range": {
                            "start": 192,
                            "length": 5
                        },
                        "section": "Contributors"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "- Robert Jackiewicz, 2012/11/12",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "- John Anderson, 2012/11/14",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "- Bert JW Regeer, 2013/02/01",
                                "type": "added"
                            }
                        ]
                    },
                    "modified_entities": [],
                    "added_entities": [],
                    "deleted_entities": []
                }
            ]
        },
        {
            "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 pyramid.compat import (\n    long,\n    text_type,\n    binary_type,\n    url_unquote,\n    url_quote,\n    bytes_,\n    ascii_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.\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    ``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.\n       Optional.\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                 ):\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            )\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    hash_obj.update(\n        encode_ip_timestamp(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\nEXPIRE = object()\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'):\n        self.secret = secret\n        self.cookie_name = cookie_name\n        self.include_ip = include_ip\n        self.secure = secure\n        self.timeout = timeout\n        self.reissue_time = reissue_time\n        self.max_age = max_age\n        self.http_only = http_only\n        self.path = path\n        self.wild_domain = wild_domain\n        self.hashalg = hashalg\n\n        static_flags = []\n        if self.secure:\n            static_flags.append('; Secure')\n        if self.http_only:\n            static_flags.append('; HttpOnly')\n        self.static_flags = \"\".join(static_flags)\n\n    def _get_cookies(self, environ, value, max_age=None):\n        if max_age is EXPIRE:\n            max_age = \"; Max-Age=0; Expires=Wed, 31-Dec-97 23:59:59 GMT\"\n        elif max_age is not None:\n            later = datetime.datetime.utcnow() + datetime.timedelta(\n                seconds=int(max_age))\n            # Wdy, DD-Mon-YY HH:MM:SS GMT\n            expires = later.strftime('%a, %d %b %Y %H:%M:%S GMT')\n            # the Expires header is *required* at least for IE7 (IE7 does\n            # not respect Max-Age)\n            max_age = \"; Max-Age=%s; Expires=%s\" % (max_age, expires)\n        else:\n            max_age = ''\n\n        cur_domain = environ.get('HTTP_HOST', environ.get('SERVER_NAME'))\n\n        # While Chrome, IE, and Firefox can cope, Opera (at least) cannot\n        # cope with a port number in the cookie domain when the URL it\n        # receives the cookie from does not also have that port number in it\n        # (e.g via a proxy).  In the meantime, HTTP_HOST is sent with port\n        # number, and neither Firefox nor Chrome do anything with the\n        # information when it's provided in a cookie domain except strip it\n        # out.  So we strip out any port number from the cookie domain\n        # aggressively to avoid problems.  See also\n        # https://github.com/Pylons/pyramid/issues/131\n        if ':' in cur_domain:\n            cur_domain = cur_domain.split(':', 1)[0]\n\n        cookies = [\n            ('Set-Cookie', '%s=\"%s\"; Path=%s%s%s' % (\n            self.cookie_name, value, self.path, max_age, self.static_flags)),\n            ('Set-Cookie', '%s=\"%s\"; Path=%s; Domain=%s%s%s' % (\n            self.cookie_name, value, self.path, cur_domain, max_age,\n                self.static_flags)),\n            ]\n\n        if self.wild_domain:\n            wild_domain = '.' + cur_domain\n            cookies.append(('Set-Cookie', '%s=\"%s\"; Path=%s; Domain=%s%s%s' % (\n                self.cookie_name, value, self.path, wild_domain, max_age,\n                self.static_flags)))\n\n        return cookies\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        environ = request.environ\n        request._authtkt_reissue_revoked = True\n        return self._get_cookies(environ, '', max_age=EXPIRE)\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(environ, 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        try:\n            auth = b64decode(auth.strip()).decode('ascii')\n        except (TypeError, binascii.Error): # can't decode\n            return None\n        try:\n            username, password = auth.split(':', 1)\n        except ValueError: # not enough values to unpack\n            return None\n        return username, password\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 pyramid.compat import (\n    long,\n    text_type,\n    binary_type,\n    url_unquote,\n    url_quote,\n    bytes_,\n    ascii_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.\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.\n       Optional.\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                 ):\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            )\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\nEXPIRE = object()\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'):\n        self.secret = secret\n        self.cookie_name = cookie_name\n        self.include_ip = include_ip\n        self.secure = secure\n        self.timeout = timeout\n        self.reissue_time = reissue_time\n        self.max_age = max_age\n        self.http_only = http_only\n        self.path = path\n        self.wild_domain = wild_domain\n        self.hashalg = hashalg\n\n        static_flags = []\n        if self.secure:\n            static_flags.append('; Secure')\n        if self.http_only:\n            static_flags.append('; HttpOnly')\n        self.static_flags = \"\".join(static_flags)\n\n    def _get_cookies(self, environ, value, max_age=None):\n        if max_age is EXPIRE:\n            max_age = \"; Max-Age=0; Expires=Wed, 31-Dec-97 23:59:59 GMT\"\n        elif max_age is not None:\n            later = datetime.datetime.utcnow() + datetime.timedelta(\n                seconds=int(max_age))\n            # Wdy, DD-Mon-YY HH:MM:SS GMT\n            expires = later.strftime('%a, %d %b %Y %H:%M:%S GMT')\n            # the Expires header is *required* at least for IE7 (IE7 does\n            # not respect Max-Age)\n            max_age = \"; Max-Age=%s; Expires=%s\" % (max_age, expires)\n        else:\n            max_age = ''\n\n        cur_domain = environ.get('HTTP_HOST', environ.get('SERVER_NAME'))\n\n        # While Chrome, IE, and Firefox can cope, Opera (at least) cannot\n        # cope with a port number in the cookie domain when the URL it\n        # receives the cookie from does not also have that port number in it\n        # (e.g via a proxy).  In the meantime, HTTP_HOST is sent with port\n        # number, and neither Firefox nor Chrome do anything with the\n        # information when it's provided in a cookie domain except strip it\n        # out.  So we strip out any port number from the cookie domain\n        # aggressively to avoid problems.  See also\n        # https://github.com/Pylons/pyramid/issues/131\n        if ':' in cur_domain:\n            cur_domain = cur_domain.split(':', 1)[0]\n\n        cookies = [\n            ('Set-Cookie', '%s=\"%s\"; Path=%s%s%s' % (\n            self.cookie_name, value, self.path, max_age, self.static_flags)),\n            ('Set-Cookie', '%s=\"%s\"; Path=%s; Domain=%s%s%s' % (\n            self.cookie_name, value, self.path, cur_domain, max_age,\n                self.static_flags)),\n            ]\n\n        if self.wild_domain:\n            wild_domain = '.' + cur_domain\n            cookies.append(('Set-Cookie', '%s=\"%s\"; Path=%s; Domain=%s%s%s' % (\n                self.cookie_name, value, self.path, wild_domain, max_age,\n                self.static_flags)))\n\n        return cookies\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        environ = request.environ\n        request._authtkt_reissue_revoked = True\n        return self._get_cookies(environ, '', max_age=EXPIRE)\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(environ, 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        try:\n            auth = b64decode(auth.strip()).decode('ascii')\n        except (TypeError, binascii.Error): # can't decode\n            return None\n        try:\n            username, password = auth.split(':', 1)\n        except ValueError: # not enough values to unpack\n            return None\n        return username, password\n",
            "header": {
                "file": {
                    "path": "pyramid/authentication.py"
                },
                "misc_line": null
            },
            "index_line": {
                "old_commit_hash": "4f6ed2c1d",
                "new_commit_hash": "bc0286ed3",
                "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": 450,
                            "length": 6
                        },
                        "new_range": {
                            "start": 450,
                            "length": 12
                        },
                        "section": "class AuthTktAuthenticationPolicy(CallbackAuthenticationPolicy):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "       Default: ``False``.  Make the requesting IP address part of",
                                "type": "context"
                            },
                            {
                                "content": "       the authentication data in the cookie.  Optional.",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "       For IPv6 this option is not recommended. The ``mod_auth_tkt``",
                                "type": "added"
                            },
                            {
                                "content": "       specification does not specify how to handle IPv6 addresses, so using",
                                "type": "added"
                            },
                            {
                                "content": "       this option in combination with IPv6 addresses may cause an",
                                "type": "added"
                            },
                            {
                                "content": "       incompatible cookie. It ties the authentication ticket to that",
                                "type": "added"
                            },
                            {
                                "content": "       individual's IPv6 address.",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "    ``timeout``",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "       Default: ``None``.  Maximum number of seconds which a newly",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [
                        {
                            "file_name": "pyramid/authentication.py",
                            "type": "class",
                            "name": "AuthTktAuthenticationPolicy",
                            "content": "class 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.\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.\n       Optional.\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                 ):\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            )\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)",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 412,
                            "end_lineno": 628,
                            "parent": null
                        }
                    ],
                    "added_entities": [],
                    "deleted_entities": []
                },
                {
                    "descriptor": {
                        "old_range": {
                            "start": 736,
                            "length": 9
                        },
                        "new_range": {
                            "start": 742,
                            "length": 17
                        },
                        "section": "def calculate_digest(ip, timestamp, secret, userid, tokens, user_data,"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "    tokens = bytes_(tokens, 'utf-8')",
                                "type": "context"
                            },
                            {
                                "content": "    user_data = bytes_(user_data, 'utf-8')",
                                "type": "context"
                            },
                            {
                                "content": "    hash_obj = hashlib.new(hashalg)",
                                "type": "context"
                            },
                            {
                                "content": "    hash_obj.update(",
                                "type": "deleted"
                            },
                            {
                                "content": "        encode_ip_timestamp(ip, timestamp) + secret + userid + b'\\0'",
                                "type": "deleted"
                            },
                            {
                                "content": "        + tokens + b'\\0' + user_data)",
                                "type": "deleted"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "    # Check to see if this is an IPv6 address",
                                "type": "added"
                            },
                            {
                                "content": "    if ':' in ip:",
                                "type": "added"
                            },
                            {
                                "content": "        ip_timestamp = ip + str(int(timestamp))",
                                "type": "added"
                            },
                            {
                                "content": "        ip_timestamp = bytes_(ip_timestamp)",
                                "type": "added"
                            },
                            {
                                "content": "    else:",
                                "type": "added"
                            },
                            {
                                "content": "        # encode_ip_timestamp not required, left in for backwards compatibility",
                                "type": "added"
                            },
                            {
                                "content": "        ip_timestamp = encode_ip_timestamp(ip, timestamp)",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "    hash_obj.update(ip_timestamp + secret + userid + b'\\0' +",
                                "type": "added"
                            },
                            {
                                "content": "            tokens + b'\\0' + user_data)",
                                "type": "added"
                            },
                            {
                                "content": "    digest = hash_obj.hexdigest()",
                                "type": "context"
                            },
                            {
                                "content": "    hash_obj2 = hashlib.new(hashalg)",
                                "type": "context"
                            },
                            {
                                "content": "    hash_obj2.update(bytes_(digest) + secret)",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [
                        {
                            "file_name": "pyramid/authentication.py",
                            "type": "function",
                            "name": "calculate_digest",
                            "content": "def 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    hash_obj.update(\n        encode_ip_timestamp(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()",
                            "ast_type_str": "FunctionDef",
                            "start_lineno": 732,
                            "end_lineno": 745,
                            "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):\n        environ = {'wsgi.version': (1,0)}\n        environ['REMOTE_ADDR'] = '1.1.1.1'\n        environ['SERVER_NAME'] = 'localhost'\n        return DummyRequest(environ, cookie=cookie)\n\n    def _cookieValue(self, cookie):\n        return eval(cookie.value)\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_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('; Path=/; Domain=localhost'))\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('; Path=/; Domain=.localhost'))\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('; Path=/; Domain=localhost'))\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('; Path=/; Domain=.localhost'))\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            '; Path=/cgi-bin/app.cgi/; Domain=localhost'))\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            '; Path=/cgi-bin/app.cgi/; Domain=.localhost'))\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(result[1][1].endswith('; HttpOnly'))\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('; HttpOnly'))\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('; Path=/; Domain=localhost'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n    def test_remember_domain_has_port(self):\n        helper = self._makeOne('secret', wild_domain=False)\n        request = self._makeRequest()\n        request.environ['HTTP_HOST'] = 'example.com:80'\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('; Path=/; Domain=example.com'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\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                         bytes_(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                         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(value,\n          'auth_tkt=\"\"; Path=/; Max-Age=0; Expires=Wed, 31-Dec-97 23:59:59 GMT')\n        name, value = headers[1]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(value,\n                         'auth_tkt=\"\"; Path=/; Domain=localhost; Max-Age=0; '\n                         'Expires=Wed, 31-Dec-97 23:59:59 GMT')\n        name, value = headers[2]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(value,\n                         'auth_tkt=\"\"; Path=/; Domain=.localhost; Max-Age=0; '\n                         'Expires=Wed, 31-Dec-97 23:59:59 GMT')\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\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\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_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\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    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 = {'secret':self.secret, 'userid':self.userid,\n                          'remote_addr':self.remote_addr}\n                result.update(self.kw)\n                result = repr(result)\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_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        return eval(cookie.value)\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('; Path=/; Domain=localhost'))\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('; Path=/; Domain=.localhost'))\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('; Path=/; Domain=localhost'))\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('; Path=/; Domain=.localhost'))\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            '; Path=/cgi-bin/app.cgi/; Domain=localhost'))\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            '; Path=/cgi-bin/app.cgi/; Domain=.localhost'))\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(result[1][1].endswith('; HttpOnly'))\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('; HttpOnly'))\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('; Path=/; Domain=localhost'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n    def test_remember_domain_has_port(self):\n        helper = self._makeOne('secret', wild_domain=False)\n        request = self._makeRequest()\n        request.environ['HTTP_HOST'] = 'example.com:80'\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('; Path=/; Domain=example.com'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\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                         bytes_(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                         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(value,\n          'auth_tkt=\"\"; Path=/; Max-Age=0; Expires=Wed, 31-Dec-97 23:59:59 GMT')\n        name, value = headers[1]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(value,\n                         'auth_tkt=\"\"; Path=/; Domain=localhost; Max-Age=0; '\n                         'Expires=Wed, 31-Dec-97 23:59:59 GMT')\n        name, value = headers[2]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(value,\n                         'auth_tkt=\"\"; Path=/; Domain=.localhost; Max-Age=0; '\n                         'Expires=Wed, 31-Dec-97 23:59:59 GMT')\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_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\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    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 = {'secret':self.secret, 'userid':self.userid,\n                          'remote_addr':self.remote_addr}\n                result.update(self.kw)\n                result = repr(result)\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": "123e4f9f5",
                "new_commit_hash": "cfabf9a9d",
                "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": 561,
                            "length": 9
                        },
                        "new_range": {
                            "start": 561,
                            "length": 13
                        },
                        "section": "class TestAuthTktCookieHelper(unittest.TestCase):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "        helper.BadTicket = auth_tkt.BadTicket",
                                "type": "context"
                            },
                            {
                                "content": "        return helper",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "    def _makeRequest(self, cookie=None):",
                                "type": "deleted"
                            },
                            {
                                "content": "    def _makeRequest(self, cookie=None, ipv6=False):",
                                "type": "added"
                            },
                            {
                                "content": "        environ = {'wsgi.version': (1,0)}",
                                "type": "context"
                            },
                            {
                                "content": "        environ['REMOTE_ADDR'] = '1.1.1.1'",
                                "type": "deleted"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "        if ipv6 is False:",
                                "type": "added"
                            },
                            {
                                "content": "            environ['REMOTE_ADDR'] = '1.1.1.1'",
                                "type": "added"
                            },
                            {
                                "content": "        else:",
                                "type": "added"
                            },
                            {
                                "content": "            environ['REMOTE_ADDR'] = '::1'",
                                "type": "added"
                            },
                            {
                                "content": "        environ['SERVER_NAME'] = 'localhost'",
                                "type": "context"
                            },
                            {
                                "content": "        return DummyRequest(environ, cookie=cookie)",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [
                        {
                            "file_name": "pyramid/tests/test_authentication.py",
                            "type": "method",
                            "name": "TestAuthTktCookieHelper._makeRequest",
                            "content": "class 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):\n        environ = {'wsgi.version': (1,0)}\n        environ['REMOTE_ADDR'] = '1.1.1.1'\n        environ['SERVER_NAME'] = 'localhost'\n        return DummyRequest(environ, cookie=cookie)\n\n    def _cookieValue(self, cookie):\n        return eval(cookie.value)\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_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('; Path=/; Domain=localhost'))\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('; Path=/; Domain=.localhost'))\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('; Path=/; Domain=localhost'))\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('; Path=/; Domain=.localhost'))\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            '; Path=/cgi-bin/app.cgi/; Domain=localhost'))\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            '; Path=/cgi-bin/app.cgi/; Domain=.localhost'))\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(result[1][1].endswith('; HttpOnly'))\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('; HttpOnly'))\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('; Path=/; Domain=localhost'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n    def test_remember_domain_has_port(self):\n        helper = self._makeOne('secret', wild_domain=False)\n        request = self._makeRequest()\n        request.environ['HTTP_HOST'] = 'example.com:80'\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('; Path=/; Domain=example.com'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\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                         bytes_(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                         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(value,\n          'auth_tkt=\"\"; Path=/; Max-Age=0; Expires=Wed, 31-Dec-97 23:59:59 GMT')\n        name, value = headers[1]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(value,\n                         'auth_tkt=\"\"; Path=/; Domain=localhost; Max-Age=0; '\n                         'Expires=Wed, 31-Dec-97 23:59:59 GMT')\n        name, value = headers[2]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(value,\n                         'auth_tkt=\"\"; Path=/; Domain=.localhost; Max-Age=0; '\n                         'Expires=Wed, 31-Dec-97 23:59:59 GMT')",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 564,
                            "end_lineno": 568,
                            "parent": {
                                "file_name": "pyramid/tests/test_authentication.py",
                                "type": "class",
                                "name": "TestAuthTktCookieHelper",
                                "content": "class 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):\n        environ = {'wsgi.version': (1,0)}\n        environ['REMOTE_ADDR'] = '1.1.1.1'\n        environ['SERVER_NAME'] = 'localhost'\n        return DummyRequest(environ, cookie=cookie)\n\n    def _cookieValue(self, cookie):\n        return eval(cookie.value)\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_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('; Path=/; Domain=localhost'))\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('; Path=/; Domain=.localhost'))\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('; Path=/; Domain=localhost'))\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('; Path=/; Domain=.localhost'))\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            '; Path=/cgi-bin/app.cgi/; Domain=localhost'))\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            '; Path=/cgi-bin/app.cgi/; Domain=.localhost'))\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(result[1][1].endswith('; HttpOnly'))\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('; HttpOnly'))\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('; Path=/; Domain=localhost'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n    def test_remember_domain_has_port(self):\n        helper = self._makeOne('secret', wild_domain=False)\n        request = self._makeRequest()\n        request.environ['HTTP_HOST'] = 'example.com:80'\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('; Path=/; Domain=example.com'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\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                         bytes_(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                         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(value,\n          'auth_tkt=\"\"; Path=/; Max-Age=0; Expires=Wed, 31-Dec-97 23:59:59 GMT')\n        name, value = headers[1]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(value,\n                         'auth_tkt=\"\"; Path=/; Domain=localhost; Max-Age=0; '\n                         'Expires=Wed, 31-Dec-97 23:59:59 GMT')\n        name, value = headers[2]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(value,\n                         'auth_tkt=\"\"; Path=/; Domain=.localhost; Max-Age=0; '\n                         'Expires=Wed, 31-Dec-97 23:59:59 GMT')",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 548,
                                "end_lineno": 1066,
                                "parent": null
                            }
                        },
                        {
                            "file_name": "pyramid/tests/test_authentication.py",
                            "type": "class",
                            "name": "TestAuthTktCookieHelper",
                            "content": "class 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):\n        environ = {'wsgi.version': (1,0)}\n        environ['REMOTE_ADDR'] = '1.1.1.1'\n        environ['SERVER_NAME'] = 'localhost'\n        return DummyRequest(environ, cookie=cookie)\n\n    def _cookieValue(self, cookie):\n        return eval(cookie.value)\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_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('; Path=/; Domain=localhost'))\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('; Path=/; Domain=.localhost'))\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('; Path=/; Domain=localhost'))\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('; Path=/; Domain=.localhost'))\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            '; Path=/cgi-bin/app.cgi/; Domain=localhost'))\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            '; Path=/cgi-bin/app.cgi/; Domain=.localhost'))\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(result[1][1].endswith('; HttpOnly'))\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('; HttpOnly'))\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('; Path=/; Domain=localhost'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n    def test_remember_domain_has_port(self):\n        helper = self._makeOne('secret', wild_domain=False)\n        request = self._makeRequest()\n        request.environ['HTTP_HOST'] = 'example.com:80'\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('; Path=/; Domain=example.com'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\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                         bytes_(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                         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(value,\n          'auth_tkt=\"\"; Path=/; Max-Age=0; Expires=Wed, 31-Dec-97 23:59:59 GMT')\n        name, value = headers[1]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(value,\n                         'auth_tkt=\"\"; Path=/; Domain=localhost; Max-Age=0; '\n                         'Expires=Wed, 31-Dec-97 23:59:59 GMT')\n        name, value = headers[2]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(value,\n                         'auth_tkt=\"\"; Path=/; Domain=.localhost; Max-Age=0; '\n                         'Expires=Wed, 31-Dec-97 23:59:59 GMT')",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 548,
                            "end_lineno": 1066,
                            "parent": null
                        }
                    ],
                    "added_entities": [],
                    "deleted_entities": []
                },
                {
                    "descriptor": {
                        "old_range": {
                            "start": 612,
                            "length": 6
                        },
                        "new_range": {
                            "start": 616,
                            "length": 23
                        },
                        "section": "class TestAuthTktCookieHelper(unittest.TestCase):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "        self.assertEqual(environ['REMOTE_USER_DATA'],'')",
                                "type": "context"
                            },
                            {
                                "content": "        self.assertEqual(environ['AUTH_TYPE'],'cookie')",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "    def test_identify_good_cookie_include_ipv6(self):",
                                "type": "added"
                            },
                            {
                                "content": "        helper = self._makeOne('secret', include_ip=True)",
                                "type": "added"
                            },
                            {
                                "content": "        request = self._makeRequest('ticket', ipv6=True)",
                                "type": "added"
                            },
                            {
                                "content": "        result = helper.identify(request)",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertEqual(len(result), 4)",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertEqual(result['tokens'], ())",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertEqual(result['userid'], 'userid')",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertEqual(result['userdata'], '')",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertEqual(result['timestamp'], 0)",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertEqual(helper.auth_tkt.value, 'ticket')",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertEqual(helper.auth_tkt.remote_addr, '::1')",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertEqual(helper.auth_tkt.secret, 'secret')",
                                "type": "added"
                            },
                            {
                                "content": "        environ = request.environ",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertEqual(environ['REMOTE_USER_DATA'],'')",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertEqual(environ['AUTH_TYPE'],'cookie')",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "    def test_identify_good_cookie_dont_include_ip(self):",
                                "type": "context"
                            },
                            {
                                "content": "        helper = self._makeOne('secret', include_ip=False)",
                                "type": "context"
                            },
                            {
                                "content": "        request = self._makeRequest('ticket')",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [
                        {
                            "file_name": "pyramid/tests/test_authentication.py",
                            "type": "class",
                            "name": "TestAuthTktCookieHelper",
                            "content": "class 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        return eval(cookie.value)\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('; Path=/; Domain=localhost'))\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('; Path=/; Domain=.localhost'))\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('; Path=/; Domain=localhost'))\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('; Path=/; Domain=.localhost'))\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            '; Path=/cgi-bin/app.cgi/; Domain=localhost'))\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            '; Path=/cgi-bin/app.cgi/; Domain=.localhost'))\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(result[1][1].endswith('; HttpOnly'))\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('; HttpOnly'))\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('; Path=/; Domain=localhost'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n    def test_remember_domain_has_port(self):\n        helper = self._makeOne('secret', wild_domain=False)\n        request = self._makeRequest()\n        request.environ['HTTP_HOST'] = 'example.com:80'\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('; Path=/; Domain=example.com'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\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                         bytes_(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                         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(value,\n          'auth_tkt=\"\"; Path=/; Max-Age=0; Expires=Wed, 31-Dec-97 23:59:59 GMT')\n        name, value = headers[1]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(value,\n                         'auth_tkt=\"\"; Path=/; Domain=localhost; Max-Age=0; '\n                         'Expires=Wed, 31-Dec-97 23:59:59 GMT')\n        name, value = headers[2]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(value,\n                         'auth_tkt=\"\"; Path=/; Domain=.localhost; Max-Age=0; '\n                         'Expires=Wed, 31-Dec-97 23:59:59 GMT')",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 548,
                            "end_lineno": 1087,
                            "parent": null
                        }
                    ],
                    "added_entities": [
                        {
                            "file_name": "pyramid/tests/test_authentication.py",
                            "type": "method",
                            "name": "TestAuthTktCookieHelper.test_identify_good_cookie_include_ipv6",
                            "content": "class 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        return eval(cookie.value)\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('; Path=/; Domain=localhost'))\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('; Path=/; Domain=.localhost'))\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('; Path=/; Domain=localhost'))\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('; Path=/; Domain=.localhost'))\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            '; Path=/cgi-bin/app.cgi/; Domain=localhost'))\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            '; Path=/cgi-bin/app.cgi/; Domain=.localhost'))\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(result[1][1].endswith('; HttpOnly'))\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('; HttpOnly'))\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('; Path=/; Domain=localhost'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n    def test_remember_domain_has_port(self):\n        helper = self._makeOne('secret', wild_domain=False)\n        request = self._makeRequest()\n        request.environ['HTTP_HOST'] = 'example.com:80'\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('; Path=/; Domain=example.com'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\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                         bytes_(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                         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(value,\n          'auth_tkt=\"\"; Path=/; Max-Age=0; Expires=Wed, 31-Dec-97 23:59:59 GMT')\n        name, value = headers[1]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(value,\n                         'auth_tkt=\"\"; Path=/; Domain=localhost; Max-Age=0; '\n                         'Expires=Wed, 31-Dec-97 23:59:59 GMT')\n        name, value = headers[2]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(value,\n                         'auth_tkt=\"\"; Path=/; Domain=.localhost; Max-Age=0; '\n                         'Expires=Wed, 31-Dec-97 23:59:59 GMT')",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 619,
                            "end_lineno": 634,
                            "parent": {
                                "file_name": "pyramid/tests/test_authentication.py",
                                "type": "class",
                                "name": "TestAuthTktCookieHelper",
                                "content": "class 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        return eval(cookie.value)\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('; Path=/; Domain=localhost'))\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('; Path=/; Domain=.localhost'))\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('; Path=/; Domain=localhost'))\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('; Path=/; Domain=.localhost'))\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            '; Path=/cgi-bin/app.cgi/; Domain=localhost'))\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            '; Path=/cgi-bin/app.cgi/; Domain=.localhost'))\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(result[1][1].endswith('; HttpOnly'))\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('; HttpOnly'))\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('; Path=/; Domain=localhost'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n    def test_remember_domain_has_port(self):\n        helper = self._makeOne('secret', wild_domain=False)\n        request = self._makeRequest()\n        request.environ['HTTP_HOST'] = 'example.com:80'\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('; Path=/; Domain=example.com'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\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                         bytes_(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                         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(value,\n          'auth_tkt=\"\"; Path=/; Max-Age=0; Expires=Wed, 31-Dec-97 23:59:59 GMT')\n        name, value = headers[1]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(value,\n                         'auth_tkt=\"\"; Path=/; Domain=localhost; Max-Age=0; '\n                         'Expires=Wed, 31-Dec-97 23:59:59 GMT')\n        name, value = headers[2]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(value,\n                         'auth_tkt=\"\"; Path=/; Domain=.localhost; Max-Age=0; '\n                         'Expires=Wed, 31-Dec-97 23:59:59 GMT')",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 548,
                                "end_lineno": 1087,
                                "parent": null
                            }
                        }
                    ],
                    "deleted_entities": []
                },
                {
                    "descriptor": {
                        "old_range": {
                            "start": 1098,
                            "length": 6
                        },
                        "new_range": {
                            "start": 1119,
                            "length": 20
                        },
                        "section": "class TestAuthTicket(unittest.TestCase):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "        self.assertEqual(result,",
                                "type": "context"
                            },
                            {
                                "content": "                         '66f9cc3e423dc57c91df696cf3d1f0d80000000auserid!a,b!')",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "    def test_ipv4(self):",
                                "type": "added"
                            },
                            {
                                "content": "        ticket = self._makeOne('secret', 'userid', '198.51.100.1',",
                                "type": "added"
                            },
                            {
                                "content": "                               time=10, hashalg='sha256')",
                                "type": "added"
                            },
                            {
                                "content": "        result = ticket.cookie_value()",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertEqual(result, 'b3e7156db4f8abde4439c4a6499a0668f9e7ffd7fa27b'\\",
                                "type": "added"
                            },
                            {
                                "content": "                                 '798400ecdade8d76c530000000auserid!')",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "    def test_ipv6(self):",
                                "type": "added"
                            },
                            {
                                "content": "        ticket = self._makeOne('secret', 'userid', '2001:db8::1',",
                                "type": "added"
                            },
                            {
                                "content": "                               time=10, hashalg='sha256')",
                                "type": "added"
                            },
                            {
                                "content": "        result = ticket.cookie_value()",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertEqual(result, 'd025b601a0f12ca6d008aa35ff3a22b7d8f3d1c1456c8'\\",
                                "type": "added"
                            },
                            {
                                "content": "                                 '5becf8760cd7a2fa4910000000auserid!')",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "class TestBadTicket(unittest.TestCase):",
                                "type": "context"
                            },
                            {
                                "content": "    def _makeOne(self, msg, expected=None):",
                                "type": "context"
                            },
                            {
                                "content": "        from pyramid.authentication import BadTicket",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [
                        {
                            "file_name": "pyramid/tests/test_authentication.py",
                            "type": "class",
                            "name": "TestAuthTicket",
                            "content": "class 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!')",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 1089,
                            "end_lineno": 1134,
                            "parent": null
                        }
                    ],
                    "added_entities": [
                        {
                            "file_name": "pyramid/tests/test_authentication.py",
                            "type": "method",
                            "name": "TestAuthTicket.test_ipv4",
                            "content": "class 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!')",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 1122,
                            "end_lineno": 1127,
                            "parent": {
                                "file_name": "pyramid/tests/test_authentication.py",
                                "type": "class",
                                "name": "TestAuthTicket",
                                "content": "class 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!')",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 1089,
                                "end_lineno": 1134,
                                "parent": null
                            }
                        },
                        {
                            "file_name": "pyramid/tests/test_authentication.py",
                            "type": "method",
                            "name": "TestAuthTicket.test_ipv6",
                            "content": "class 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!')",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 1129,
                            "end_lineno": 1134,
                            "parent": {
                                "file_name": "pyramid/tests/test_authentication.py",
                                "type": "class",
                                "name": "TestAuthTicket",
                                "content": "class 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!')",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 1089,
                                "end_lineno": 1134,
                                "parent": null
                            }
                        }
                    ],
                    "deleted_entities": []
                },
                {
                    "descriptor": {
                        "old_range": {
                            "start": 1141,
                            "length": 6
                        },
                        "new_range": {
                            "start": 1176,
                            "length": 19
                        },
                        "section": "class Test_parse_ticket(unittest.TestCase):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "        result = self._callFUT('secret', ticket, '0.0.0.0', 'sha512')",
                                "type": "context"
                            },
                            {
                                "content": "        self.assertEqual(result, (10, 'userid', ['a', 'b'], ''))",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "    def test_ipv4(self):",
                                "type": "added"
                            },
                            {
                                "content": "        ticket = 'b3e7156db4f8abde4439c4a6499a0668f9e7ffd7fa27b798400ecdade8d7'\\",
                                "type": "added"
                            },
                            {
                                "content": "                 '6c530000000auserid!'",
                                "type": "added"
                            },
                            {
                                "content": "        result = self._callFUT('secret', ticket, '198.51.100.1', 'sha256')",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertEqual(result, (10, 'userid', [''], ''))",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "    def test_ipv6(self):",
                                "type": "added"
                            },
                            {
                                "content": "        ticket = 'd025b601a0f12ca6d008aa35ff3a22b7d8f3d1c1456c85becf8760cd7a2f'\\",
                                "type": "added"
                            },
                            {
                                "content": "                 'a4910000000auserid!'",
                                "type": "added"
                            },
                            {
                                "content": "        result = self._callFUT('secret', ticket, '2001:db8::1', 'sha256')",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertEqual(result, (10, 'userid', [''], ''))",
                                "type": "added"
                            },
                            {
                                "content": "        pass",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "class TestSessionAuthenticationPolicy(unittest.TestCase):",
                                "type": "context"
                            },
                            {
                                "content": "    def _getTargetClass(self):",
                                "type": "context"
                            },
                            {
                                "content": "        from pyramid.authentication import SessionAuthenticationPolicy",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [
                        {
                            "file_name": "pyramid/tests/test_authentication.py",
                            "type": "class",
                            "name": "Test_parse_ticket",
                            "content": "class 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",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 1146,
                            "end_lineno": 1190,
                            "parent": null
                        }
                    ],
                    "added_entities": [
                        {
                            "file_name": "pyramid/tests/test_authentication.py",
                            "type": "method",
                            "name": "Test_parse_ticket.test_ipv4",
                            "content": "class 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",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 1179,
                            "end_lineno": 1183,
                            "parent": {
                                "file_name": "pyramid/tests/test_authentication.py",
                                "type": "class",
                                "name": "Test_parse_ticket",
                                "content": "class 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",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 1146,
                                "end_lineno": 1190,
                                "parent": null
                            }
                        },
                        {
                            "file_name": "pyramid/tests/test_authentication.py",
                            "type": "method",
                            "name": "Test_parse_ticket.test_ipv6",
                            "content": "class 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",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 1185,
                            "end_lineno": 1190,
                            "parent": {
                                "file_name": "pyramid/tests/test_authentication.py",
                                "type": "class",
                                "name": "Test_parse_ticket",
                                "content": "class 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",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 1146,
                                "end_lineno": 1190,
                                "parent": null
                            }
                        }
                    ],
                    "deleted_entities": []
                }
            ]
        }
    ],
    "old_commit_hash": "411acbba3402aba9d09856a0c4cb88f572ba77da^",
    "new_commit_hash": "411acbba3402aba9d09856a0c4cb88f572ba77da",
    "commit_message": "Merge branch 'fix.831'",
    "commit_date": "2013-03-19T16:20:11-07:00",
    "metadata": {}
}
{
    "repo_name": "pyramid",
    "new_commit_hash": "411acbba3402aba9d09856a0c4cb88f572ba77da",
    "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_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        return eval(cookie.value)\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('; Path=/; Domain=localhost'))\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('; Path=/; Domain=.localhost'))\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('; Path=/; Domain=localhost'))\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('; Path=/; Domain=.localhost'))\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            '; Path=/cgi-bin/app.cgi/; Domain=localhost'))\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            '; Path=/cgi-bin/app.cgi/; Domain=.localhost'))\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(result[1][1].endswith('; HttpOnly'))\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('; HttpOnly'))\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('; Path=/; Domain=localhost'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n    def test_remember_domain_has_port(self):\n        helper = self._makeOne('secret', wild_domain=False)\n        request = self._makeRequest()\n        request.environ['HTTP_HOST'] = 'example.com:80'\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('; Path=/; Domain=example.com'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\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                         bytes_(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                         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(value,\n          'auth_tkt=\"\"; Path=/; Max-Age=0; Expires=Wed, 31-Dec-97 23:59:59 GMT')\n        name, value = headers[1]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(value,\n                         'auth_tkt=\"\"; Path=/; Domain=localhost; Max-Age=0; '\n                         'Expires=Wed, 31-Dec-97 23:59:59 GMT')\n        name, value = headers[2]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(value,\n                         'auth_tkt=\"\"; Path=/; Domain=.localhost; Max-Age=0; '\n                         'Expires=Wed, 31-Dec-97 23:59:59 GMT')\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_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\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    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 = {'secret':self.secret, 'userid':self.userid,\n                          'remote_addr':self.remote_addr}\n                result.update(self.kw)\n                result = repr(result)\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 15 packages in 621ms\nPrepared 1 package in 891ms\nInstalled 15 packages in 12ms\n + chameleon==4.4.4\n + importlib-metadata==8.5.0\n + importlib-resources==6.4.5\n + mako==1.3.8\n + markupsafe==2.1.5\n + pastedeploy==3.1.0\n + pyramid==1.4 (from file:///home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_411acbba3402aba9d09856a0c4cb88f572ba77da)\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 + zipp==3.20.2\n + zope-deprecation==5.0\n + zope-interface==7.2\nResolved 25 packages in 20ms\nInstalled 10 packages in 8ms\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 7ms\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_411acbba3402aba9d09856a0c4cb88f572ba77da\ncollected 967 items\n\nr2e_tests/test_1.py FFFFFFFFFFFF........................................ [  5%]\n........................................................................ [ 12%]\n.........                                                                [ 13%]\nr2e_tests/test_config/test_adapters.py .FF..............F...             [ 15%]\nr2e_tests/test_config/test_assets.py ...........FF.....................F [ 19%]\n....................                                                     [ 21%]\nr2e_tests/test_config/test_factories.py ..................               [ 23%]\nr2e_tests/test_config/test_i18n.py FFF.FF....                            [ 24%]\nr2e_tests/test_config/test_init.py ..................................... [ 28%]\nF..F....................F...........F.................................FF [ 35%]\n...FF...................                                                 [ 38%]\nr2e_tests/test_config/test_predicates.py ............................... [ 41%]\n........................................                                 [ 45%]\nr2e_tests/test_config/test_rendering.py ....                             [ 46%]\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 ............                       [ 53%]\nr2e_tests/test_config/test_tweens.py .................................   [ 56%]\nr2e_tests/test_config/test_util.py ..................................... [ 60%]\n..........                                                               [ 61%]\nr2e_tests/test_config/test_views.py ...................F................ [ 65%]\n........................................................................ [ 72%]\nFF...................................................................... [ 80%]\nFF.........F...F....F................................................... [ 87%]\n...........F                                                             [ 88%]\nr2e_tests/test_scripts/test_common.py ...                                [ 89%]\nr2e_tests/test_scripts/test_pcreate.py .........                         [ 89%]\nr2e_tests/test_scripts/test_prequest.py F.FFFFF.F.FF.                    [ 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 0x79dd111cd940>, <r2e_tests.test_config.test_adapters.DummyIface object at 0x79dd111cd940>)\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 0x79dd111cd940>, <r2e_tests.test_config.test_adapters.DummyIface object at 0x79dd111cd940>), <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 0x79dd1127d490>\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 0x79dd1127d490>, <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]856a0c4cb88f572ba77da/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]856a0c4cb88f572ba77da/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_411acbba3402aba9d09856a0c4cb88f572ba77da/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_411acbba3402aba9d09856a0c4cb88f572ba77da/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]856a0c4cb88f572ba77da/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]856a0c4cb88f572ba77da/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_411acbba3402aba9d09856a0c4cb88f572ba77da/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_411acbba3402aba9d09856a0c4cb88f572ba77da/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]856a0c4cb88f572ba77da/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]856a0c4cb88f572ba77da/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_411acbba3402aba9d09856a0c4cb88f572ba77da/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_411acbba3402aba9d09856a0c4cb88f572ba77da/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:401: 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:102: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \npyramid/util.py:514: in wrapper\n    result = wrapped(self, *arg, **kw)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <pyramid.config.Configurator object at 0x79dd1143cd60>\nspecs = ('/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_411acbba3402aba9d09856a0c4cb88f572ba77da/r2e_tests/pkgs/localeapp/locale',)\nintrospectables = []\nspec = '/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_411acbba3402aba9d09856a0c4cb88f572ba77da/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_411acbba3402aba9d09856a0c4cb88f572ba77da/r2e_tests/pkgs/localeapp/locale\" is not a directory\n\npyramid/config/i18n.py:91: 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]9d09856a0c4cb88f572ba77da/pyramid/tests/pkgs/localeapp/locale'] != ['/ho[70 chars]9d09856a0c4cb88f572ba77da/r2e_tests/pkgs/localeapp/locale']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]a9d09856a0c4cb88f572ba77da/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]a9d09856a0c4cb88f572ba77da/r2e_tests/pkgs/localeapp/locale'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_411acbba3402aba9d09856a0c4cb88f572ba77da/pyramid/tests/pkgs/localeapp/locale']\nE       ?                                                                                                      -- ^^^^^\nE       \nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_411acbba3402aba9d09856a0c4cb88f572ba77da/r2e_tests/pkgs/localeapp/locale']\nE       ?                                                                                                       ^^^\n\nr2e_tests/test_config/test_i18n.py:57: 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]a0c4cb88f572ba77da/pyramid/tests/pkgs/localeapp/locale', 'abc'] != ['/ho[77 chars]a0c4cb88f572ba77da/r2e_tests/pkgs/localeapp/locale', 'abc']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]a9d09856a0c4cb88f572ba77da/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]a9d09856a0c4cb88f572ba77da/r2e_tests/pkgs/localeapp/locale'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_411acbba3402aba9d09856a0c4cb88f572ba77da/pyramid/tests/pkgs/localeapp/locale',\nE       ?                                                                                                      -- ^^^^^\nE       \nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_411acbba3402aba9d09856a0c4cb88f572ba77da/r2e_tests/pkgs/localeapp/locale',\nE       ?                                                                                                       ^^^\nE       \nE          'abc']\n\nr2e_tests/test_config/test_i18n.py:67: 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]77da/pyramid/tests/pkgs/localeapp/locale', '/h[130 chars]le2'] != ['/ho[91 chars]77da/r2e_tests/pkgs/localeapp/locale', '/home/[122 chars]le2']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]a9d09856a0c4cb88f572ba77da/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]a9d09856a0c4cb88f572ba77da/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:74: 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]77da/pyramid/tests/pkgs/localeapp/locale3', '/[269 chars]le2'] != ['/ho[91 chars]77da/r2e_tests/pkgs/localeapp/locale3', '/home[257 chars]le2']\nE       \nE       First differing element 0:\nE       '/hom[69 chars]9d09856a0c4cb88f572ba77da/pyramid/tests/pkgs/localeapp/locale3'\nE       '/hom[69 chars]9d09856a0c4cb88f572ba77da/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:83: 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:68: 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:129: 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:1026: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \npyramid/config/__init__.py:630: in commit\n    self.action_state.execute_actions(introspector=self.introspector)\npyramid/config/__init__.py:1068: 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_411acbba3402aba9d09856a0c4cb88f572ba77da/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_411acbba3402aba9d09856a0c4cb88f572ba77da/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_411acbba3402aba9d09856a0c4cb88f572ba77da/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_411acbba3402aba9d09856a0c4cb88f572ba77da/pyramid/tests/test_config/pkgs/selfscan/another.py:\nE                       def two(request):\n\npyramid/config/__init__.py:1196: 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:1035: 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:426: 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:1449: 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:1436: 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:1423: 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:1462: AssertionError\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]9dd11cec670>, 'static', 'r2e_tests.test_config:files', {})] != [(<py[39 chars]9dd11cec670>, 'static', 'pyramid.tests.test_config:files', {})]\nE       \nE       First differing element 0:\nE       (<pyr[37 chars]79dd11cec670>, 'static', 'r2e_tests.test_config:files', {})\nE       (<pyr[37 chars]79dd11cec670>, 'static', 'pyramid.tests.test_config:files', {})\nE       \nE         [(<pyramid.config.Configurator object at 0x79dd11cec670>,\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:1713: 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.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:1041: 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.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:1081: 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:2262: \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:394: 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:2264: 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:2281: \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:394: 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:2283: 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:2302: \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 0x79dd113c60d0> 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:394: 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:2305: 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:2348: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = None\nrequest = <r2e_tests.test_config.test_views.DummyRequest object at 0x79dd1120c610>\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:394: 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:2350: 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:2372: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = None\nrequest = <r2e_tests.test_config.test_views.DummyRequest object at 0x79dd11454b80>\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:394: 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:2374: 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:3840: 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:133: 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:79: 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:94: 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._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:102: 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['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:115: 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_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:124: 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, arg2: 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:283: 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_has_port\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_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_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_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_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_filename_file_doesnt_exist\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_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_multiple_request_properties\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_multiple_request_properties_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_request_property_with_callable\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_request_property_with_property\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_request_property_with_unnamed_callable\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_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_add_translation_dirs_registers_chameleon_translate\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_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_renderer_globals_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_renderer_globals_factory_dottedname\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::TestConfiguratorDeprecatedFeatures::test_add_route_with_for_\nPASSED r2e_tests/test_config/test_init.py::TestConfiguratorDeprecatedFeatures::test_add_route_with_view\nPASSED r2e_tests/test_config/test_init.py::TestConfiguratorDeprecatedFeatures::test_add_route_with_view_attr\nPASSED r2e_tests/test_config/test_init.py::TestConfiguratorDeprecatedFeatures::test_add_route_with_view_context\nPASSED r2e_tests/test_config/test_init.py::TestConfiguratorDeprecatedFeatures::test_add_route_with_view_exception\nPASSED r2e_tests/test_config/test_init.py::TestConfiguratorDeprecatedFeatures::test_add_route_with_view_for\nPASSED r2e_tests/test_config/test_init.py::TestConfiguratorDeprecatedFeatures::test_add_route_with_view_permission\nPASSED r2e_tests/test_config/test_init.py::TestConfiguratorDeprecatedFeatures::test_add_route_with_view_permission_alias\nPASSED r2e_tests/test_config/test_init.py::TestConfiguratorDeprecatedFeatures::test_add_route_with_view_renderer\nPASSED r2e_tests/test_config/test_init.py::TestConfiguratorDeprecatedFeatures::test_add_route_with_view_renderer_alias\nPASSED r2e_tests/test_config/test_init.py::TestConfiguratorDeprecatedFeatures::test_conflict_route_with_view\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::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_renderer\nPASSED r2e_tests/test_config/test_rendering.py::TestRenderingConfiguratorMixin::test_add_renderer_dottedname_factory\nPASSED r2e_tests/test_config/test_rendering.py::TestRenderingConfiguratorMixin::test_set_renderer_globals_factory\nPASSED r2e_tests/test_config/test_rendering.py::TestRenderingConfiguratorMixin::test_set_renderer_globals_factory_dottedname\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_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_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_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_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_custom_predicate_bests_standard_predicate\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_default_phash_overrides_default_phash\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_default_phash_overrides_no_phash\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_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_custom_predicates_match\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_custom_predicates_nomatch\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_decorator\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_decorator_tuple\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_default_permission_no_explicit_permission\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_default_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_function_callable\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_function_callable_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_badregex\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_noval_match\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_noval_nomatch\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_val_match\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_val_missing\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_val_nomatch\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_http_cache\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_mapper\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_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_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_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_add_viewname_with_view_attr\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_view_context\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_view_for\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_view_permission\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_view_renderer\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_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_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_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_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_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_views.py::TestViewsConfigurationMixin::test_add_static_view_package_here_relative\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_post\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_with_query_string\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_function_traversal\n======================== 50 failed, 917 passed in 5.61s ========================\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_411acbba3402aba9d09856a0c4cb88f572ba77da\ncollected 967 items\n\nr2e_tests/test_1.py FFFFFFFFFFFF........................................ [  5%]\n.................................................F.......F.............. [ 12%]\n.........                                                                [ 13%]\nr2e_tests/test_config/test_adapters.py .FF..............F...             [ 15%]\nr2e_tests/test_config/test_assets.py ...........FF.....................F [ 19%]\n....................                                                     [ 21%]\nr2e_tests/test_config/test_factories.py ..................               [ 23%]\nr2e_tests/test_config/test_i18n.py FFF.FF....                            [ 24%]\nr2e_tests/test_config/test_init.py ..................................... [ 28%]\nF..F....................F...........F.................................FF [ 35%]\n...FF...................                                                 [ 38%]\nr2e_tests/test_config/test_predicates.py ............................... [ 41%]\n........................................                                 [ 45%]\nr2e_tests/test_config/test_rendering.py ....                             [ 46%]\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 ............                       [ 53%]\nr2e_tests/test_config/test_tweens.py .................................   [ 56%]\nr2e_tests/test_config/test_util.py ..................................... [ 60%]\n..........                                                               [ 61%]\nr2e_tests/test_config/test_views.py ...................F................ [ 65%]\n........................................................................ [ 72%]\nFF...................................................................... [ 80%]\nFF.........F...F....F................................................... [ 87%]\n...........F                                                             [ 88%]\nr2e_tests/test_scripts/test_common.py ...                                [ 89%]\nr2e_tests/test_scripts/test_pcreate.py .........                         [ 89%]\nr2e_tests/test_scripts/test_prequest.py F.FFFFF.F.FF.                    [ 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___________________________ TestAuthTicket.test_ipv6 ___________________________\n\nself = <r2e_tests.test_1.TestAuthTicket testMethod=test_ipv6>\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\nr2e_tests/test_1.py:1132: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \npyramid/authentication.py:673: in cookie_value\n    v = '%s%08x%s!' % (self.digest(), int(self.time),\npyramid/authentication.py:668: in digest\n    return calculate_digest(\npyramid/authentication.py:740: in calculate_digest\n    encode_ip_timestamp(ip, timestamp) + secret + userid + b'\\0'\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nip = '2001:db8::1', timestamp = 10\n\n    def encode_ip_timestamp(ip, timestamp):\n>       ip_chars = ''.join(map(chr, map(int, ip.split('.'))))\nE       ValueError: invalid literal for int() with base 10: '2001:db8::1'\n\npyramid/authentication.py:749: ValueError\n_________________________ Test_parse_ticket.test_ipv6 __________________________\n\nself = <r2e_tests.test_1.Test_parse_ticket testMethod=test_ipv6>\n\n    def test_ipv6(self):\n        ticket = 'd025b601a0f12ca6d008aa35ff3a22b7d8f3d1c1456c85becf8760cd7a2f'\\\n                 'a4910000000auserid!'\n>       result = self._callFUT('secret', ticket, '2001:db8::1', 'sha256')\n\nr2e_tests/test_1.py:1188: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nr2e_tests/test_1.py:1149: in _callFUT\n    return parse_ticket(secret, ticket, ip, hashalg)\npyramid/authentication.py:718: in parse_ticket\n    expected = calculate_digest(ip, timestamp, secret,\npyramid/authentication.py:740: in calculate_digest\n    encode_ip_timestamp(ip, timestamp) + secret + userid + b'\\0'\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nip = '2001:db8::1', timestamp = 10\n\n    def encode_ip_timestamp(ip, timestamp):\n>       ip_chars = ''.join(map(chr, map(int, ip.split('.'))))\nE       ValueError: invalid literal for int() with base 10: '2001:db8::1'\n\npyramid/authentication.py:749: ValueError\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 0x7b8fa3d565b0>, <r2e_tests.test_config.test_adapters.DummyIface object at 0x7b8fa3d565b0>)\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 0x7b8fa3d565b0>, <r2e_tests.test_config.test_adapters.DummyIface object at 0x7b8fa3d565b0>), <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 0x7b8fa3ad4520>\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 0x7b8fa3ad4520>, <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]856a0c4cb88f572ba77da/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]856a0c4cb88f572ba77da/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_411acbba3402aba9d09856a0c4cb88f572ba77da/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_411acbba3402aba9d09856a0c4cb88f572ba77da/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]856a0c4cb88f572ba77da/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]856a0c4cb88f572ba77da/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_411acbba3402aba9d09856a0c4cb88f572ba77da/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_411acbba3402aba9d09856a0c4cb88f572ba77da/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]856a0c4cb88f572ba77da/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]856a0c4cb88f572ba77da/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_411acbba3402aba9d09856a0c4cb88f572ba77da/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_411acbba3402aba9d09856a0c4cb88f572ba77da/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:401: 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:102: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \npyramid/util.py:514: in wrapper\n    result = wrapped(self, *arg, **kw)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <pyramid.config.Configurator object at 0x7b8fa43a7070>\nspecs = ('/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_411acbba3402aba9d09856a0c4cb88f572ba77da/r2e_tests/pkgs/localeapp/locale',)\nintrospectables = []\nspec = '/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_411acbba3402aba9d09856a0c4cb88f572ba77da/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_411acbba3402aba9d09856a0c4cb88f572ba77da/r2e_tests/pkgs/localeapp/locale\" is not a directory\n\npyramid/config/i18n.py:91: 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]9d09856a0c4cb88f572ba77da/pyramid/tests/pkgs/localeapp/locale'] != ['/ho[70 chars]9d09856a0c4cb88f572ba77da/r2e_tests/pkgs/localeapp/locale']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]a9d09856a0c4cb88f572ba77da/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]a9d09856a0c4cb88f572ba77da/r2e_tests/pkgs/localeapp/locale'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_411acbba3402aba9d09856a0c4cb88f572ba77da/pyramid/tests/pkgs/localeapp/locale']\nE       ?                                                                                                      -- ^^^^^\nE       \nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_411acbba3402aba9d09856a0c4cb88f572ba77da/r2e_tests/pkgs/localeapp/locale']\nE       ?                                                                                                       ^^^\n\nr2e_tests/test_config/test_i18n.py:57: 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]a0c4cb88f572ba77da/pyramid/tests/pkgs/localeapp/locale', 'abc'] != ['/ho[77 chars]a0c4cb88f572ba77da/r2e_tests/pkgs/localeapp/locale', 'abc']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]a9d09856a0c4cb88f572ba77da/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]a9d09856a0c4cb88f572ba77da/r2e_tests/pkgs/localeapp/locale'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_411acbba3402aba9d09856a0c4cb88f572ba77da/pyramid/tests/pkgs/localeapp/locale',\nE       ?                                                                                                      -- ^^^^^\nE       \nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_411acbba3402aba9d09856a0c4cb88f572ba77da/r2e_tests/pkgs/localeapp/locale',\nE       ?                                                                                                       ^^^\nE       \nE          'abc']\n\nr2e_tests/test_config/test_i18n.py:67: 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]77da/pyramid/tests/pkgs/localeapp/locale', '/h[130 chars]le2'] != ['/ho[91 chars]77da/r2e_tests/pkgs/localeapp/locale', '/home/[122 chars]le2']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]a9d09856a0c4cb88f572ba77da/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]a9d09856a0c4cb88f572ba77da/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:74: 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]77da/pyramid/tests/pkgs/localeapp/locale3', '/[269 chars]le2'] != ['/ho[91 chars]77da/r2e_tests/pkgs/localeapp/locale3', '/home[257 chars]le2']\nE       \nE       First differing element 0:\nE       '/hom[69 chars]9d09856a0c4cb88f572ba77da/pyramid/tests/pkgs/localeapp/locale3'\nE       '/hom[69 chars]9d09856a0c4cb88f572ba77da/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:83: 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:68: 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:129: 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:1026: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \npyramid/config/__init__.py:630: in commit\n    self.action_state.execute_actions(introspector=self.introspector)\npyramid/config/__init__.py:1068: 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_411acbba3402aba9d09856a0c4cb88f572ba77da/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_411acbba3402aba9d09856a0c4cb88f572ba77da/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_411acbba3402aba9d09856a0c4cb88f572ba77da/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_411acbba3402aba9d09856a0c4cb88f572ba77da/pyramid/tests/test_config/pkgs/selfscan/another.py:\nE                       def two(request):\n\npyramid/config/__init__.py:1196: 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:1035: 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:426: 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:1449: 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:1436: 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:1423: 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:1462: AssertionError\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]b8fa3b67070>, 'static', 'r2e_tests.test_config:files', {})] != [(<py[39 chars]b8fa3b67070>, 'static', 'pyramid.tests.test_config:files', {})]\nE       \nE       First differing element 0:\nE       (<pyr[37 chars]7b8fa3b67070>, 'static', 'r2e_tests.test_config:files', {})\nE       (<pyr[37 chars]7b8fa3b67070>, 'static', 'pyramid.tests.test_config:files', {})\nE       \nE         [(<pyramid.config.Configurator object at 0x7b8fa3b67070>,\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:1713: 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.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:1041: 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.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:1081: 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:2262: \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:394: 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:2264: 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:2281: \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:394: 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:2283: 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:2302: \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 0x7b8fa3ab3670> 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:394: 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:2305: 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:2348: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = None\nrequest = <r2e_tests.test_config.test_views.DummyRequest object at 0x7b8fa3bed340>\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:394: 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:2350: 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:2372: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = None\nrequest = <r2e_tests.test_config.test_views.DummyRequest object at 0x7b8fa3f21880>\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:394: 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:2374: 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:3840: 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:133: 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:79: 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:94: 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._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:102: 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['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:115: 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_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:124: 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, arg2: 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:283: 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_has_port\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_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::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::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_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_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_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_filename_file_doesnt_exist\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_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_multiple_request_properties\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_multiple_request_properties_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_request_property_with_callable\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_request_property_with_property\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_request_property_with_unnamed_callable\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_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_add_translation_dirs_registers_chameleon_translate\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_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_renderer_globals_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_renderer_globals_factory_dottedname\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::TestConfiguratorDeprecatedFeatures::test_add_route_with_for_\nPASSED r2e_tests/test_config/test_init.py::TestConfiguratorDeprecatedFeatures::test_add_route_with_view\nPASSED r2e_tests/test_config/test_init.py::TestConfiguratorDeprecatedFeatures::test_add_route_with_view_attr\nPASSED r2e_tests/test_config/test_init.py::TestConfiguratorDeprecatedFeatures::test_add_route_with_view_context\nPASSED r2e_tests/test_config/test_init.py::TestConfiguratorDeprecatedFeatures::test_add_route_with_view_exception\nPASSED r2e_tests/test_config/test_init.py::TestConfiguratorDeprecatedFeatures::test_add_route_with_view_for\nPASSED r2e_tests/test_config/test_init.py::TestConfiguratorDeprecatedFeatures::test_add_route_with_view_permission\nPASSED r2e_tests/test_config/test_init.py::TestConfiguratorDeprecatedFeatures::test_add_route_with_view_permission_alias\nPASSED r2e_tests/test_config/test_init.py::TestConfiguratorDeprecatedFeatures::test_add_route_with_view_renderer\nPASSED r2e_tests/test_config/test_init.py::TestConfiguratorDeprecatedFeatures::test_add_route_with_view_renderer_alias\nPASSED r2e_tests/test_config/test_init.py::TestConfiguratorDeprecatedFeatures::test_conflict_route_with_view\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::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_renderer\nPASSED r2e_tests/test_config/test_rendering.py::TestRenderingConfiguratorMixin::test_add_renderer_dottedname_factory\nPASSED r2e_tests/test_config/test_rendering.py::TestRenderingConfiguratorMixin::test_set_renderer_globals_factory\nPASSED r2e_tests/test_config/test_rendering.py::TestRenderingConfiguratorMixin::test_set_renderer_globals_factory_dottedname\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_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_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_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_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_custom_predicate_bests_standard_predicate\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_default_phash_overrides_default_phash\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_default_phash_overrides_no_phash\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_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_custom_predicates_match\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_custom_predicates_nomatch\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_decorator\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_decorator_tuple\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_default_permission_no_explicit_permission\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_default_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_function_callable\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_function_callable_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_badregex\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_noval_match\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_noval_nomatch\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_val_match\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_val_missing\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_header_val_nomatch\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_http_cache\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_mapper\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_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_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_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_add_viewname_with_view_attr\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_view_context\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_view_for\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_view_permission\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_view_renderer\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_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_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_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_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_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::TestAuthTicket::test_ipv6 - ValueError: invalid l...\nFAILED r2e_tests/test_1.py::Test_parse_ticket::test_ipv6 - ValueError: invali...\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_views.py::TestViewsConfigurationMixin::test_add_static_view_package_here_relative\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_post\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_with_query_string\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_function_traversal\n======================== 52 failed, 915 passed in 4.98s ========================\n",
    "old_commit_res_stderr": ""
}
CHANGES.txt CONTRIBUTORS.txt 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 ---
[ISSUE]
**Title:** Authentication Fails with IPv6 Addresses Due to Improper IP Handling

**Description:**
When using IPv6 addresses with the `AuthTicketAuthenticationPolicy`, the authentication process fails because the system incorrectly attempts to handle the IPv6 address as an IPv4 address. This leads to a `ValueError` when processing the IP.

**Example Code:**
```python
from pyramid.authentication import AuthTicket

# Attempting to create an AuthTicket with an IPv6 address
ticket = AuthTicket('secret', 'userid', '2001:db8::1', time=10, hashalg='sha256')
result = ticket.cookie_value()
```

**Expected Behavior:**
The authentication system should correctly handle both IPv4 and IPv6 addresses without errors, allowing authentication tickets to be created and validated for users with IPv6 addresses.

**Actual Behavior:**
Passing an IPv6 address results in the following error because the system tries to parse it as an IPv4 address:
```
ValueError: invalid literal for int() with base 10: '2001:db8::1'
```
[/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 pyramid.compat import (
    long,
    text_type,
    binary_type,
    url_unquote,
    url_quote,
    bytes_,
    ascii_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.
       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.

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

    ``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
                 ):
        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,
            )
        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)
    hash_obj.update(
        encode_ip_timestamp(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)

EXPIRE = object()

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'):
        self.secret = secret
        self.cookie_name = cookie_name
        self.include_ip = include_ip
        self.secure = secure
        self.timeout = timeout
        self.reissue_time = reissue_time
        self.max_age = max_age
        self.http_only = http_only
        self.path = path
        self.wild_domain = wild_domain
        self.hashalg = hashalg

        static_flags = []
        if self.secure:
            static_flags.append('; Secure')
        if self.http_only:
            static_flags.append('; HttpOnly')
        self.static_flags = "".join(static_flags)

    def _get_cookies(self, environ, value, max_age=None):
        if max_age is EXPIRE:
            max_age = "; Max-Age=0; Expires=Wed, 31-Dec-97 23:59:59 GMT"
        elif max_age is not None:
            later = datetime.datetime.utcnow() + datetime.timedelta(
                seconds=int(max_age))
            # Wdy, DD-Mon-YY HH:MM:SS GMT
            expires = later.strftime('%a, %d %b %Y %H:%M:%S GMT')
            # the Expires header is *required* at least for IE7 (IE7 does
            # not respect Max-Age)
            max_age = "; Max-Age=%s; Expires=%s" % (max_age, expires)
        else:
            max_age = ''

        cur_domain = environ.get('HTTP_HOST', environ.get('SERVER_NAME'))

        # While Chrome, IE, and Firefox can cope, Opera (at least) cannot
        # cope with a port number in the cookie domain when the URL it
        # receives the cookie from does not also have that port number in it
        # (e.g via a proxy).  In the meantime, HTTP_HOST is sent with port
        # number, and neither Firefox nor Chrome do anything with the
        # information when it's provided in a cookie domain except strip it
        # out.  So we strip out any port number from the cookie domain
        # aggressively to avoid problems.  See also
        # https://github.com/Pylons/pyramid/issues/131
        if ':' in cur_domain:
            cur_domain = cur_domain.split(':', 1)[0]

        cookies = [
            ('Set-Cookie', '%s="%s"; Path=%s%s%s' % (
            self.cookie_name, value, self.path, max_age, self.static_flags)),
            ('Set-Cookie', '%s="%s"; Path=%s; Domain=%s%s%s' % (
            self.cookie_name, value, self.path, cur_domain, max_age,
                self.static_flags)),
            ]

        if self.wild_domain:
            wild_domain = '.' + cur_domain
            cookies.append(('Set-Cookie', '%s="%s"; Path=%s; Domain=%s%s%s' % (
                self.cookie_name, value, self.path, wild_domain, max_age,
                self.static_flags)))

        return cookies

    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"""
        environ = request.environ
        request._authtkt_reissue_revoked = True
        return self._get_cookies(environ, '', max_age=EXPIRE)

    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(environ, 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:
            auth = b64decode(auth.strip()).decode('ascii')
        except (TypeError, binascii.Error): # can't decode
            return None
        try:
            username, password = auth.split(':', 1)
        except ValueError: # not enough values to unpack
            return None
        return username, password

```
--- END FILE ---

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

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

Here is an example:

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

Please note that the *SEARCH/REPLACE* edit REQUIRES PROPER INDENTATION. If you would like to add the line '        print(x)', you must fully write that out, with all those spaces before the code!
Wrap each *SEARCH/REPLACE* edit in a code block as shown in the example above. If you have multiple *SEARCH/REPLACE* edits, use a separate code block for each one.
[ISSUE]
**Title:** Authentication Fails with IPv6 Addresses Due to Improper IP Handling

**Description:**
When using IPv6 addresses with the `AuthTicketAuthenticationPolicy`, the authentication process fails because the system incorrectly attempts to handle the IPv6 address as an IPv4 address. This leads to a `ValueError` when processing the IP.

**Example Code:**
```python
from pyramid.authentication import AuthTicket

# Attempting to create an AuthTicket with an IPv6 address
ticket = AuthTicket('secret', 'userid', '2001:db8::1', time=10, hashalg='sha256')
result = ticket.cookie_value()
```

**Expected Behavior:**
The authentication system should correctly handle both IPv4 and IPv6 addresses without errors, allowing authentication tickets to be created and validated for users with IPv6 addresses.

**Actual Behavior:**
Passing an IPv6 address results in the following error because the system tries to parse it as an IPv4 address:
```
ValueError: invalid literal for int() with base 10: '2001:db8::1'
```
[/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_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_has_port": "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_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_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",
    "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_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_filename_file_doesnt_exist": "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_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_multiple_request_properties": "PASSED",
    "TestFactoriesMixin.test_set_multiple_request_properties_conflict": "PASSED",
    "TestFactoriesMixin.test_set_request_factory": "PASSED",
    "TestFactoriesMixin.test_set_request_factory_dottedname": "PASSED",
    "TestFactoriesMixin.test_set_request_property_with_callable": "PASSED",
    "TestFactoriesMixin.test_set_request_property_with_property": "PASSED",
    "TestFactoriesMixin.test_set_request_property_with_unnamed_callable": "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",
    "TestI18NConfiguratorMixin.test_add_translation_dirs_missing_dir": "PASSED",
    "TestI18NConfiguratorMixin.test_add_translation_dirs_no_specs": "PASSED",
    "TestI18NConfiguratorMixin.test_add_translation_dirs_registers_chameleon_translate": "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_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_renderer_globals_factory": "PASSED",
    "ConfiguratorTests.test_setup_registry_renderer_globals_factory_dottedname": "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",
    "TestConfiguratorDeprecatedFeatures.test_add_route_with_for_": "PASSED",
    "TestConfiguratorDeprecatedFeatures.test_add_route_with_view": "PASSED",
    "TestConfiguratorDeprecatedFeatures.test_add_route_with_view_attr": "PASSED",
    "TestConfiguratorDeprecatedFeatures.test_add_route_with_view_context": "PASSED",
    "TestConfiguratorDeprecatedFeatures.test_add_route_with_view_exception": "PASSED",
    "TestConfiguratorDeprecatedFeatures.test_add_route_with_view_for": "PASSED",
    "TestConfiguratorDeprecatedFeatures.test_add_route_with_view_permission": "PASSED",
    "TestConfiguratorDeprecatedFeatures.test_add_route_with_view_permission_alias": "PASSED",
    "TestConfiguratorDeprecatedFeatures.test_add_route_with_view_renderer": "PASSED",
    "TestConfiguratorDeprecatedFeatures.test_add_route_with_view_renderer_alias": "PASSED",
    "TestConfiguratorDeprecatedFeatures.test_conflict_route_with_view": "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",
    "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_renderer": "PASSED",
    "TestRenderingConfiguratorMixin.test_add_renderer_dottedname_factory": "PASSED",
    "TestRenderingConfiguratorMixin.test_set_renderer_globals_factory": "PASSED",
    "TestRenderingConfiguratorMixin.test_set_renderer_globals_factory_dottedname": "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_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",
    "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_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_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_custom_predicate_bests_standard_predicate": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_default_phash_overrides_default_phash": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_default_phash_overrides_no_phash": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_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_custom_predicates_match": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_custom_predicates_nomatch": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_decorator": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_decorator_tuple": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_default_permission_no_explicit_permission": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_default_renderer": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_function_callable": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_function_callable_requestonly": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_header_badregex": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_header_noval_match": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_header_noval_nomatch": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_header_val_match": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_header_val_missing": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_header_val_nomatch": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_http_cache": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_mapper": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_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_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_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_add_viewname_with_view_attr": "PASSED",
    "TestStaticURLInfo.test_add_viewname_with_view_context": "PASSED",
    "TestStaticURLInfo.test_add_viewname_with_view_for": "PASSED",
    "TestStaticURLInfo.test_add_viewname_with_view_permission": "PASSED",
    "TestStaticURLInfo.test_add_viewname_with_view_renderer": "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_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_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",
    "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_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_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",
    "TestViewsConfigurationMixin.test_add_static_view_package_here_relative": "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_post": "FAILED",
    "TestPRequestCommand.test_command_path_doesnt_start_with_slash": "FAILED",
    "TestPRequestCommand.test_command_two_args": "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 4f6ed2c1d..bc0286ed3 100644
--- a/pyramid/authentication.py
+++ b/pyramid/authentication.py
@@ -450,6 +450,12 @@ class AuthTktAuthenticationPolicy(CallbackAuthenticationPolicy):
        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
@@ -736,9 +742,17 @@ def calculate_digest(ip, timestamp, secret, userid, tokens, user_data,
     tokens = bytes_(tokens, 'utf-8')
     user_data = bytes_(user_data, 'utf-8')
     hash_obj = hashlib.new(hashalg)
-    hash_obj.update(
-        encode_ip_timestamp(ip, timestamp) + secret + userid + b'\0'
-        + tokens + b'\0' + user_data)
+
+    # 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)

{"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 pyramid.compat import (\n    long,\n    text_type,\n    binary_type,\n    url_unquote,\n    url_quote,\n    bytes_,\n    ascii_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.\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    ``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.\n       Optional.\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                 ):\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            )\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    hash_obj.update(\n        encode_ip_timestamp(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\nEXPIRE = object()\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'):\n        self.secret = secret\n        self.cookie_name = cookie_name\n        self.include_ip = include_ip\n        self.secure = secure\n        self.timeout = timeout\n        self.reissue_time = reissue_time\n        self.max_age = max_age\n        self.http_only = http_only\n        self.path = path\n        self.wild_domain = wild_domain\n        self.hashalg = hashalg\n\n        static_flags = []\n        if self.secure:\n            static_flags.append('; Secure')\n        if self.http_only:\n            static_flags.append('; HttpOnly')\n        self.static_flags = \"\".join(static_flags)\n\n    def _get_cookies(self, environ, value, max_age=None):\n        if max_age is EXPIRE:\n            max_age = \"; Max-Age=0; Expires=Wed, 31-Dec-97 23:59:59 GMT\"\n        elif max_age is not None:\n            later = datetime.datetime.utcnow() + datetime.timedelta(\n                seconds=int(max_age))\n            # Wdy, DD-Mon-YY HH:MM:SS GMT\n            expires = later.strftime('%a, %d %b %Y %H:%M:%S GMT')\n            # the Expires header is *required* at least for IE7 (IE7 does\n            # not respect Max-Age)\n            max_age = \"; Max-Age=%s; Expires=%s\" % (max_age, expires)\n        else:\n            max_age = ''\n\n        cur_domain = environ.get('HTTP_HOST', environ.get('SERVER_NAME'))\n\n        # While Chrome, IE, and Firefox can cope, Opera (at least) cannot\n        # cope with a port number in the cookie domain when the URL it\n        # receives the cookie from does not also have that port number in it\n        # (e.g via a proxy).  In the meantime, HTTP_HOST is sent with port\n        # number, and neither Firefox nor Chrome do anything with the\n        # information when it's provided in a cookie domain except strip it\n        # out.  So we strip out any port number from the cookie domain\n        # aggressively to avoid problems.  See also\n        # https://github.com/Pylons/pyramid/issues/131\n        if ':' in cur_domain:\n            cur_domain = cur_domain.split(':', 1)[0]\n\n        cookies = [\n            ('Set-Cookie', '%s=\"%s\"; Path=%s%s%s' % (\n            self.cookie_name, value, self.path, max_age, self.static_flags)),\n            ('Set-Cookie', '%s=\"%s\"; Path=%s; Domain=%s%s%s' % (\n            self.cookie_name, value, self.path, cur_domain, max_age,\n                self.static_flags)),\n            ]\n\n        if self.wild_domain:\n            wild_domain = '.' + cur_domain\n            cookies.append(('Set-Cookie', '%s=\"%s\"; Path=%s; Domain=%s%s%s' % (\n                self.cookie_name, value, self.path, wild_domain, max_age,\n                self.static_flags)))\n\n        return cookies\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        environ = request.environ\n        request._authtkt_reissue_revoked = True\n        return self._get_cookies(environ, '', max_age=EXPIRE)\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(environ, 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        try:\n            auth = b64decode(auth.strip()).decode('ascii')\n        except (TypeError, binascii.Error): # can't decode\n            return None\n        try:\n            username, password = auth.split(':', 1)\n        except ValueError: # not enough values to unpack\n            return None\n        return username, password\n"}
A user will ask you to solve a task. You should first draft your thinking process (inner monologue). Then, generate the solution.

Your response format must follow the template below:
<think>
Your thoughts or/and draft, like working through an exercise on scratch paper. Be as casual and as long as you want until you are confident to generate a correct solution.
</think>
<solution>
Final solution presented to the user.
</solution>
system
We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
[ISSUE]
**Title:** Authentication Fails with IPv6 Addresses Due to Improper IP Handling

**Description:**
When using IPv6 addresses with the `AuthTicketAuthenticationPolicy`, the authentication process fails because the system incorrectly attempts to handle the IPv6 address as an IPv4 address. This leads to a `ValueError` when processing the IP.

**Example Code:**
```python
from pyramid.authentication import AuthTicket

# Attempting to create an AuthTicket with an IPv6 address
ticket = AuthTicket('secret', 'userid', '2001:db8::1', time=10, hashalg='sha256')
result = ticket.cookie_value()
```

**Expected Behavior:**
The authentication system should correctly handle both IPv4 and IPv6 addresses without errors, allowing authentication tickets to be created and validated for users with IPv6 addresses.

**Actual Behavior:**
Passing an IPv6 address results in the following error because the system tries to parse it as an IPv4 address:
```
ValueError: invalid literal for int() with base 10: '2001:db8::1'
```
[/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 pyramid.compat import (
    long,
    text_type,
    binary_type,
    url_unquote,
    url_quote,
    bytes_,
    ascii_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.
       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.

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

    ``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
                 ):
        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,
            )
        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)
    hash_obj.update(
        encode_ip_timestamp(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)

EXPIRE = object()

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'):
        self.secret = secret
        self.cookie_name = cookie_name
        self.include_ip = include_ip
        self.secure = secure
        self.timeout = timeout
        self.reissue_time = reissue_time
        self.max_age = max_age
        self.http_only = http_only
        self.path = path
        self.wild_domain = wild_domain
        self.hashalg = hashalg

        static_flags = []
        if self.secure:
            static_flags.append('; Secure')
        if self.http_only:
            static_flags.append('; HttpOnly')
        self.static_flags = "".join(static_flags)

    def _get_cookies(self, environ, value, max_age=None):
        if max_age is EXPIRE:
            max_age = "; Max-Age=0; Expires=Wed, 31-Dec-97 23:59:59 GMT"
        elif max_age is not None:
            later = datetime.datetime.utcnow() + datetime.timedelta(
                seconds=int(max_age))
            # Wdy, DD-Mon-YY HH:MM:SS GMT
            expires = later.strftime('%a, %d %b %Y %H:%M:%S GMT')
            # the Expires header is *required* at least for IE7 (IE7 does
            # not respect Max-Age)
            max_age = "; Max-Age=%s; Expires=%s" % (max_age, expires)
        else:
            max_age = ''

        cur_domain = environ.get('HTTP_HOST', environ.get('SERVER_NAME'))

        # While Chrome, IE, and Firefox can cope, Opera (at least) cannot
        # cope with a port number in the cookie domain when the URL it
        # receives the cookie from does not also have that port number in it
        # (e.g via a proxy).  In the meantime, HTTP_HOST is sent with port
        # number, and neither Firefox nor Chrome do anything with the
        # information when it's provided in a cookie domain except strip it
        # out.  So we strip out any port number from the cookie domain
        # aggressively to avoid problems.  See also
        # https://github.com/Pylons/pyramid/issues/131
        if ':' in cur_domain:
            cur_domain = cur_domain.split(':', 1)[0]

        cookies = [
            ('Set-Cookie', '%s="%s"; Path=%s%s%s' % (
            self.cookie_name, value, self.path, max_age, self.static_flags)),
            ('Set-Cookie', '%s="%s"; Path=%s; Domain=%s%s%s' % (
            self.cookie_name, value, self.path, cur_domain, max_age,
                self.static_flags)),
            ]

        if self.wild_domain:
            wild_domain = '.' + cur_domain
            cookies.append(('Set-Cookie', '%s="%s"; Path=%s; Domain=%s%s%s' % (
                self.cookie_name, value, self.path, wild_domain, max_age,
                self.static_flags)))

        return cookies

    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"""
        environ = request.environ
        request._authtkt_reissue_revoked = True
        return self._get_cookies(environ, '', max_age=EXPIRE)

    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(environ, 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:
            auth = b64decode(auth.strip()).decode('ascii')
        except (TypeError, binascii.Error): # can't decode
            return None
        try:
            username, password = auth.split(':', 1)
        except ValueError: # not enough values to unpack
            return None
        return username, password

```
--- END FILE ---

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

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

Here is an example:

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

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