{
    "file_diffs": [
        {
            "old_file_content": "1.6 (2015-04-14)\n================\n\nBackward Incompatibilities\n--------------------------\n\n- IPython and BPython support have been removed from pshell in the core.\n  To continue using them on Pyramid 1.6+ you must install the binding\n  packages explicitly::\n\n    $ pip install pyramid_ipython\n\n    or\n\n    $ pip install pyramid_bpython\n\nFeatures\n--------\n\n- pcreate will now ask for confirmation if invoked with\n  an argument for a project name that already exists or\n  is importable in the current environment.\n  See https://github.com/Pylons/pyramid/issues/1357 and\n  https://github.com/Pylons/pyramid/pull/1837\n\n- Make it possible to subclass ``pyramid.request.Request`` and also use\n  ``pyramid.request.Request.add_request.method``.  See\n  https://github.com/Pylons/pyramid/issues/1529\n\n- The ``pyramid.config.Configurator`` has grown the ability to allow\n  actions to call other actions during a commit-cycle. This enables much more\n  logic to be placed into actions, such as the ability to invoke other actions\n  or group them for improved conflict detection. We have also exposed and\n  documented the config phases that Pyramid uses in order to further assist\n  in building conforming addons.\n  See https://github.com/Pylons/pyramid/pull/1513\n\n- Add ``pyramid.request.apply_request_extensions`` function which can be\n  used in testing to apply any request extensions configured via\n  ``config.add_request_method``. Previously it was only possible to test\n  the extensions by going through Pyramid's router.\n  See https://github.com/Pylons/pyramid/pull/1581\n\n- pcreate when run without a scaffold argument will now print information on\n  the missing flag, as well as a list of available scaffolds.\n  See https://github.com/Pylons/pyramid/pull/1566 and\n  https://github.com/Pylons/pyramid/issues/1297\n\n- Added support / testing for 'pypy3' under Tox and Travis.\n  See https://github.com/Pylons/pyramid/pull/1469\n\n- Automate code coverage metrics across py2 and py3 instead of just py2.\n  See https://github.com/Pylons/pyramid/pull/1471\n\n- Cache busting for static resources has been added and is available via a new\n  argument to ``pyramid.config.Configurator.add_static_view``: ``cachebust``.\n  Core APIs are shipped for both cache busting via query strings and\n  path segments and may be extended to fit into custom asset pipelines.\n  See https://github.com/Pylons/pyramid/pull/1380 and\n  https://github.com/Pylons/pyramid/pull/1583\n\n- Add ``pyramid.config.Configurator.root_package`` attribute and init\n  parameter to assist with includeable packages that wish to resolve\n  resources relative to the package in which the ``Configurator`` was created.\n  This is especially useful for addons that need to load asset specs from\n  settings, in which case it is may be natural for a developer to define\n  imports or assets relative to the top-level package.\n  See https://github.com/Pylons/pyramid/pull/1337\n\n- Added line numbers to the log formatters in the scaffolds to assist with\n  debugging. See https://github.com/Pylons/pyramid/pull/1326\n\n- Add new HTTP exception objects for status codes\n  ``428 Precondition Required``, ``429 Too Many Requests`` and\n  ``431 Request Header Fields Too Large`` in ``pyramid.httpexceptions``.\n  See https://github.com/Pylons/pyramid/pull/1372/files\n\n- The ``pshell`` script will now load a ``PYTHONSTARTUP`` file if one is\n  defined in the environment prior to launching the interpreter.\n  See https://github.com/Pylons/pyramid/pull/1448\n\n- Make it simple to define notfound and forbidden views that wish to use\n  the default exception-response view but with altered predicates and other\n  configuration options. The ``view`` argument is now optional in\n  ``config.add_notfound_view`` and ``config.add_forbidden_view``..\n  See https://github.com/Pylons/pyramid/issues/494\n\n- Greatly improve the readability of the ``pcreate`` shell script output.\n  See https://github.com/Pylons/pyramid/pull/1453\n\n- Improve robustness to timing attacks in the ``AuthTktCookieHelper`` and\n  the ``SignedCookieSessionFactory`` classes by using the stdlib's\n  ``hmac.compare_digest`` if it is available (such as Python 2.7.7+ and 3.3+).\n  See https://github.com/Pylons/pyramid/pull/1457\n\n- Assets can now be overidden by an absolute path on the filesystem when using\n  the ``config.override_asset`` API. This makes it possible to fully support\n  serving up static content from a mutable directory while still being able\n  to use the ``request.static_url`` API and ``config.add_static_view``.\n  Previously it was not possible to use ``config.add_static_view`` with an\n  absolute path **and** generate urls to the content. This change replaces\n  the call, ``config.add_static_view('/abs/path', 'static')``, with\n  ``config.add_static_view('myapp:static', 'static')`` and\n  ``config.override_asset(to_override='myapp:static/',\n  override_with='/abs/path/')``. The ``myapp:static`` asset spec is completely\n  made up and does not need to exist - it is used for generating urls\n  via ``request.static_url('myapp:static/foo.png')``.\n  See https://github.com/Pylons/pyramid/issues/1252\n\n- Added ``pyramid.config.Configurator.set_response_factory`` and the\n  ``response_factory`` keyword argument to the ``Configurator`` for defining\n  a factory that will return a custom ``Response`` class.\n  See https://github.com/Pylons/pyramid/pull/1499\n\n- Allow an iterator to be returned from a renderer. Previously it was only\n  possible to return bytes or unicode.\n  See https://github.com/Pylons/pyramid/pull/1417\n\n- ``pserve`` can now take a ``-b`` or ``--browser`` option to open the server\n  URL in a web browser. See https://github.com/Pylons/pyramid/pull/1533\n\n- Overall improvments for the ``proutes`` command. Added ``--format`` and\n  ``--glob`` arguments to the command, introduced the ``method``\n  column for displaying available request methods, and improved the ``view``\n  output by showing the module instead of just ``__repr__``.\n  See https://github.com/Pylons/pyramid/pull/1488\n\n- Support keyword-only arguments and function annotations in views in\n  Python 3. See https://github.com/Pylons/pyramid/pull/1556\n\n- ``request.response`` will no longer be mutated when using the\n  ``pyramid.renderers.render_to_response()`` API.  It is now necessary to\n  pass in a ``response=`` argument to ``render_to_response`` if you wish to\n  supply the renderer with a custom response object for it to use. If you\n  do not pass one then a response object will be created using the\n  application's ``IResponseFactory``. Almost all renderers\n  mutate the ``request.response`` response object (for example, the JSON\n  renderer sets ``request.response.content_type`` to ``application/json``).\n  However, when invoking ``render_to_response`` it is not expected that the\n  response object being returned would be the same one used later in the\n  request. The response object returned from ``render_to_response`` is now\n  explicitly different from ``request.response``. This does not change the\n  API of a renderer. See https://github.com/Pylons/pyramid/pull/1563\n\n- The ``append_slash`` argument of ```Configurator().add_notfound_view()`` will\n  now accept anything that implements the ``IResponse`` interface and will use\n  that as the response class instead of the default ``HTTPFound``.  See\n  https://github.com/Pylons/pyramid/pull/1610\n\n- Additional shells for ``pshell`` can now be registered as entrypoints. See\n  https://github.com/Pylons/pyramid/pull/1891 and\n  https://github.com/Pylons/pyramid/pull/2012\n\n- The variables injected into ``pshell`` are now displayed with their\n  docstrings instead of the default ``str(obj)`` when possible.\n  See https://github.com/Pylons/pyramid/pull/1929\n\nBug Fixes\n---------\n\n- Work around an issue where ``pserve --reload`` would leave terminal echo\n  disabled if it reloaded during a pdb session.\n  See https://github.com/Pylons/pyramid/pull/1577,\n  https://github.com/Pylons/pyramid/pull/1592\n\n- ``pyramid.wsgi.wsgiapp`` and ``pyramid.wsgi.wsgiapp2`` now raise\n  ``ValueError`` when accidentally passed ``None``.\n  See https://github.com/Pylons/pyramid/pull/1320\n\n- Fix an issue whereby predicates would be resolved as maybe_dotted in the\n  introspectable but not when passed for registration. This would mean that\n  ``add_route_predicate`` for example can not take a string and turn it into\n  the actual callable function.\n  See https://github.com/Pylons/pyramid/pull/1306\n\n- Fix ``pyramid.testing.setUp`` to return a ``Configurator`` with a proper\n  package. Previously it was not possible to do package-relative includes\n  using the returned ``Configurator`` during testing. There is now a\n  ``package`` argument that can override this behavior as well.\n  See https://github.com/Pylons/pyramid/pull/1322\n\n- Fix an issue where a ``pyramid.response.FileResponse`` may apply a charset\n  where it does not belong. See https://github.com/Pylons/pyramid/pull/1251\n\n- Work around a bug introduced in Python 2.7.7 on Windows where\n  ``mimetypes.guess_type`` returns Unicode rather than str for the content\n  type, unlike any previous version of Python.  See\n  https://github.com/Pylons/pyramid/issues/1360 for more information.\n\n- ``pcreate`` now normalizes the package name by converting hyphens to\n  underscores. See https://github.com/Pylons/pyramid/pull/1376\n\n- Fix an issue with the final response/finished callback being unable to\n  add another callback to the list. See\n  https://github.com/Pylons/pyramid/pull/1373\n\n- Fix a failing unittest caused by differing mimetypes across various OSs.\n  See https://github.com/Pylons/pyramid/issues/1405\n\n- Fix route generation for static view asset specifications having no path.\n  See https://github.com/Pylons/pyramid/pull/1377\n\n- Allow the ``pyramid.renderers.JSONP`` renderer to work even if there is no\n  valid request object. In this case it will not wrap the object in a\n  callback and thus behave just like the ``pyramid.renderers.JSON`` renderer.\n  See https://github.com/Pylons/pyramid/pull/1561\n\n- Prevent \"parameters to load are deprecated\" ``DeprecationWarning``\n  from setuptools>=11.3. See https://github.com/Pylons/pyramid/pull/1541\n\n- Avoiding sharing the ``IRenderer`` objects across threads when attached to\n  a view using the `renderer=` argument. These renderers were instantiated\n  at time of first render and shared between requests, causing potentially\n  subtle effects like `pyramid.reload_templates = true` failing to work\n  in `pyramid_mako`. See https://github.com/Pylons/pyramid/pull/1575\n  and https://github.com/Pylons/pyramid/issues/1268\n\n- Avoiding timing attacks against CSRF tokens.\n  See https://github.com/Pylons/pyramid/pull/1574\n\n- ``request.finished_callbacks`` and ``request.response_callbacks`` now\n  default to an iterable instead of ``None``. It may be checked for a length\n  of 0. This was the behavior in 1.5.\n\n- ``pyramid.httpexceptions.HTTPException`` now defaults to\n  ``520 Unknown Error`` instead of ``None None`` to conform with changes in\n  WebOb 1.5.\n  See https://github.com/Pylons/pyramid/pull/1865\n\n- ``pshell`` will now preserve the capitalization of variables in the\n  ``[pshell]`` section of the INI file. This makes exposing classes to the\n  shell a little more straightfoward.\n  See https://github.com/Pylons/pyramid/pull/1883\n\nDeprecations\n------------\n\n- The ``pserve`` command's daemonization features have been deprecated. This\n  includes the ``[start,stop,restart,status]`` subcommands as well as the\n  ``--daemon``, ``--stop-server``, ``--pid-file``, and ``--status`` flags.\n\n  Please use a real process manager in the future instead of relying on the\n  ``pserve`` to daemonize itself. Many options exist including your Operating\n  System's services such as Systemd or Upstart, as well as Python-based\n  solutions like Circus and Supervisor.\n\n  See https://github.com/Pylons/pyramid/pull/1641\n\n- Renamed the ``principal`` argument to ``pyramid.security.remember()`` to\n  ``userid`` in order to clarify its intended purpose.\n  See https://github.com/Pylons/pyramid/pull/1399\n\nDocs\n----\n\n- Moved the documentation for ``accept`` on ``Configurator.add_view`` to no\n  longer be part of the predicate list. See\n  https://github.com/Pylons/pyramid/issues/1391 for a bug report stating\n  ``not_`` was failing on ``accept``. Discussion with @mcdonc led to the\n  conclusion that it should not be documented as a predicate.\n  See https://github.com/Pylons/pyramid/pull/1487 for this PR\n\n- Removed logging configuration from Quick Tutorial ini files except for\n  scaffolding- and logging-related chapters to avoid needing to explain it too\n  early.\n\n- Clarify a previously-implied detail of the ``ISession.invalidate`` API\n  documentation.\n\n- Improve and clarify the documentation on what Pyramid defines as a\n  ``principal`` and a ``userid`` in its security APIs.\n  See https://github.com/Pylons/pyramid/pull/1399\n\nScaffolds\n---------\n\n- Update scaffold generating machinery to return the version of pyramid and\n  pyramid docs for use in scaffolds. Updated starter, alchemy and zodb\n  templates to have links to correctly versioned documentation and reflect\n  which pyramid was used to generate the scaffold.\n\n- Removed non-ascii copyright symbol from templates, as this was\n  causing the scaffolds to fail for project generation.\n\n- You can now run the scaffolding func tests via ``tox py2-scaffolds`` and\n  ``tox py3-scaffolds``.\n\n",
            "new_file_content": "1.6 (2015-04-14)\n================\n\nBackward Incompatibilities\n--------------------------\n\n- IPython and BPython support have been removed from pshell in the core.\n  To continue using them on Pyramid 1.6+ you must install the binding\n  packages explicitly::\n\n    $ pip install pyramid_ipython\n\n    or\n\n    $ pip install pyramid_bpython\n\nFeatures\n--------\n\n- pcreate will now ask for confirmation if invoked with\n  an argument for a project name that already exists or\n  is importable in the current environment.\n  See https://github.com/Pylons/pyramid/issues/1357 and\n  https://github.com/Pylons/pyramid/pull/1837\n\n- Make it possible to subclass ``pyramid.request.Request`` and also use\n  ``pyramid.request.Request.add_request.method``.  See\n  https://github.com/Pylons/pyramid/issues/1529\n\n- The ``pyramid.config.Configurator`` has grown the ability to allow\n  actions to call other actions during a commit-cycle. This enables much more\n  logic to be placed into actions, such as the ability to invoke other actions\n  or group them for improved conflict detection. We have also exposed and\n  documented the config phases that Pyramid uses in order to further assist\n  in building conforming addons.\n  See https://github.com/Pylons/pyramid/pull/1513\n\n- Add ``pyramid.request.apply_request_extensions`` function which can be\n  used in testing to apply any request extensions configured via\n  ``config.add_request_method``. Previously it was only possible to test\n  the extensions by going through Pyramid's router.\n  See https://github.com/Pylons/pyramid/pull/1581\n\n- pcreate when run without a scaffold argument will now print information on\n  the missing flag, as well as a list of available scaffolds.\n  See https://github.com/Pylons/pyramid/pull/1566 and\n  https://github.com/Pylons/pyramid/issues/1297\n\n- Added support / testing for 'pypy3' under Tox and Travis.\n  See https://github.com/Pylons/pyramid/pull/1469\n\n- Automate code coverage metrics across py2 and py3 instead of just py2.\n  See https://github.com/Pylons/pyramid/pull/1471\n\n- Cache busting for static resources has been added and is available via a new\n  argument to ``pyramid.config.Configurator.add_static_view``: ``cachebust``.\n  Core APIs are shipped for both cache busting via query strings and\n  path segments and may be extended to fit into custom asset pipelines.\n  See https://github.com/Pylons/pyramid/pull/1380 and\n  https://github.com/Pylons/pyramid/pull/1583\n\n- Add ``pyramid.config.Configurator.root_package`` attribute and init\n  parameter to assist with includeable packages that wish to resolve\n  resources relative to the package in which the ``Configurator`` was created.\n  This is especially useful for addons that need to load asset specs from\n  settings, in which case it is may be natural for a developer to define\n  imports or assets relative to the top-level package.\n  See https://github.com/Pylons/pyramid/pull/1337\n\n- Added line numbers to the log formatters in the scaffolds to assist with\n  debugging. See https://github.com/Pylons/pyramid/pull/1326\n\n- Add new HTTP exception objects for status codes\n  ``428 Precondition Required``, ``429 Too Many Requests`` and\n  ``431 Request Header Fields Too Large`` in ``pyramid.httpexceptions``.\n  See https://github.com/Pylons/pyramid/pull/1372/files\n\n- The ``pshell`` script will now load a ``PYTHONSTARTUP`` file if one is\n  defined in the environment prior to launching the interpreter.\n  See https://github.com/Pylons/pyramid/pull/1448\n\n- Make it simple to define notfound and forbidden views that wish to use\n  the default exception-response view but with altered predicates and other\n  configuration options. The ``view`` argument is now optional in\n  ``config.add_notfound_view`` and ``config.add_forbidden_view``..\n  See https://github.com/Pylons/pyramid/issues/494\n\n- Greatly improve the readability of the ``pcreate`` shell script output.\n  See https://github.com/Pylons/pyramid/pull/1453\n\n- Improve robustness to timing attacks in the ``AuthTktCookieHelper`` and\n  the ``SignedCookieSessionFactory`` classes by using the stdlib's\n  ``hmac.compare_digest`` if it is available (such as Python 2.7.7+ and 3.3+).\n  See https://github.com/Pylons/pyramid/pull/1457\n\n- Assets can now be overidden by an absolute path on the filesystem when using\n  the ``config.override_asset`` API. This makes it possible to fully support\n  serving up static content from a mutable directory while still being able\n  to use the ``request.static_url`` API and ``config.add_static_view``.\n  Previously it was not possible to use ``config.add_static_view`` with an\n  absolute path **and** generate urls to the content. This change replaces\n  the call, ``config.add_static_view('/abs/path', 'static')``, with\n  ``config.add_static_view('myapp:static', 'static')`` and\n  ``config.override_asset(to_override='myapp:static/',\n  override_with='/abs/path/')``. The ``myapp:static`` asset spec is completely\n  made up and does not need to exist - it is used for generating urls\n  via ``request.static_url('myapp:static/foo.png')``.\n  See https://github.com/Pylons/pyramid/issues/1252\n\n- Added ``pyramid.config.Configurator.set_response_factory`` and the\n  ``response_factory`` keyword argument to the ``Configurator`` for defining\n  a factory that will return a custom ``Response`` class.\n  See https://github.com/Pylons/pyramid/pull/1499\n\n- Allow an iterator to be returned from a renderer. Previously it was only\n  possible to return bytes or unicode.\n  See https://github.com/Pylons/pyramid/pull/1417\n\n- ``pserve`` can now take a ``-b`` or ``--browser`` option to open the server\n  URL in a web browser. See https://github.com/Pylons/pyramid/pull/1533\n\n- Overall improvments for the ``proutes`` command. Added ``--format`` and\n  ``--glob`` arguments to the command, introduced the ``method``\n  column for displaying available request methods, and improved the ``view``\n  output by showing the module instead of just ``__repr__``.\n  See https://github.com/Pylons/pyramid/pull/1488\n\n- Support keyword-only arguments and function annotations in views in\n  Python 3. See https://github.com/Pylons/pyramid/pull/1556\n\n- ``request.response`` will no longer be mutated when using the\n  ``pyramid.renderers.render_to_response()`` API.  It is now necessary to\n  pass in a ``response=`` argument to ``render_to_response`` if you wish to\n  supply the renderer with a custom response object for it to use. If you\n  do not pass one then a response object will be created using the\n  application's ``IResponseFactory``. Almost all renderers\n  mutate the ``request.response`` response object (for example, the JSON\n  renderer sets ``request.response.content_type`` to ``application/json``).\n  However, when invoking ``render_to_response`` it is not expected that the\n  response object being returned would be the same one used later in the\n  request. The response object returned from ``render_to_response`` is now\n  explicitly different from ``request.response``. This does not change the\n  API of a renderer. See https://github.com/Pylons/pyramid/pull/1563\n\n- The ``append_slash`` argument of ```Configurator().add_notfound_view()`` will\n  now accept anything that implements the ``IResponse`` interface and will use\n  that as the response class instead of the default ``HTTPFound``.  See\n  https://github.com/Pylons/pyramid/pull/1610\n\n- Additional shells for ``pshell`` can now be registered as entrypoints. See\n  https://github.com/Pylons/pyramid/pull/1891 and\n  https://github.com/Pylons/pyramid/pull/2012\n\n- The variables injected into ``pshell`` are now displayed with their\n  docstrings instead of the default ``str(obj)`` when possible.\n  See https://github.com/Pylons/pyramid/pull/1929\n\nBug Fixes\n---------\n\n- Work around an issue where ``pserve --reload`` would leave terminal echo\n  disabled if it reloaded during a pdb session.\n  See https://github.com/Pylons/pyramid/pull/1577,\n  https://github.com/Pylons/pyramid/pull/1592\n\n- ``pyramid.wsgi.wsgiapp`` and ``pyramid.wsgi.wsgiapp2`` now raise\n  ``ValueError`` when accidentally passed ``None``.\n  See https://github.com/Pylons/pyramid/pull/1320\n\n- Fix an issue whereby predicates would be resolved as maybe_dotted in the\n  introspectable but not when passed for registration. This would mean that\n  ``add_route_predicate`` for example can not take a string and turn it into\n  the actual callable function.\n  See https://github.com/Pylons/pyramid/pull/1306\n\n- Fix ``pyramid.testing.setUp`` to return a ``Configurator`` with a proper\n  package. Previously it was not possible to do package-relative includes\n  using the returned ``Configurator`` during testing. There is now a\n  ``package`` argument that can override this behavior as well.\n  See https://github.com/Pylons/pyramid/pull/1322\n\n- Fix an issue where a ``pyramid.response.FileResponse`` may apply a charset\n  where it does not belong. See https://github.com/Pylons/pyramid/pull/1251\n\n- Work around a bug introduced in Python 2.7.7 on Windows where\n  ``mimetypes.guess_type`` returns Unicode rather than str for the content\n  type, unlike any previous version of Python.  See\n  https://github.com/Pylons/pyramid/issues/1360 for more information.\n\n- ``pcreate`` now normalizes the package name by converting hyphens to\n  underscores. See https://github.com/Pylons/pyramid/pull/1376\n\n- Fix an issue with the final response/finished callback being unable to\n  add another callback to the list. See\n  https://github.com/Pylons/pyramid/pull/1373\n\n- Fix a failing unittest caused by differing mimetypes across various OSs.\n  See https://github.com/Pylons/pyramid/issues/1405\n\n- Fix route generation for static view asset specifications having no path.\n  See https://github.com/Pylons/pyramid/pull/1377\n\n- Allow the ``pyramid.renderers.JSONP`` renderer to work even if there is no\n  valid request object. In this case it will not wrap the object in a\n  callback and thus behave just like the ``pyramid.renderers.JSON`` renderer.\n  See https://github.com/Pylons/pyramid/pull/1561\n\n- Prevent \"parameters to load are deprecated\" ``DeprecationWarning``\n  from setuptools>=11.3. See https://github.com/Pylons/pyramid/pull/1541\n\n- Avoiding sharing the ``IRenderer`` objects across threads when attached to\n  a view using the `renderer=` argument. These renderers were instantiated\n  at time of first render and shared between requests, causing potentially\n  subtle effects like `pyramid.reload_templates = true` failing to work\n  in `pyramid_mako`. See https://github.com/Pylons/pyramid/pull/1575\n  and https://github.com/Pylons/pyramid/issues/1268\n\n- Avoiding timing attacks against CSRF tokens.\n  See https://github.com/Pylons/pyramid/pull/1574\n\n- ``request.finished_callbacks`` and ``request.response_callbacks`` now\n  default to an iterable instead of ``None``. It may be checked for a length\n  of 0. This was the behavior in 1.5.\n\n- ``pyramid.httpexceptions.HTTPException`` now defaults to\n  ``520 Unknown Error`` instead of ``None None`` to conform with changes in\n  WebOb 1.5.\n  See https://github.com/Pylons/pyramid/pull/1865\n\n- ``pshell`` will now preserve the capitalization of variables in the\n  ``[pshell]`` section of the INI file. This makes exposing classes to the\n  shell a little more straightfoward.\n  See https://github.com/Pylons/pyramid/pull/1883\n\n- Fix an issue when user passes unparsed strings to ``pyramid.session.CookieSession``\n  and ``pyramid.authentication.AuthTktCookieHelper`` for time related parameters\n  ``timeout``, ``reissue_time``, ``max_age`` that expect an integer value.\n  See https://github.com/Pylons/pyramid/pull/2050\n\nDeprecations\n------------\n\n- The ``pserve`` command's daemonization features have been deprecated. This\n  includes the ``[start,stop,restart,status]`` subcommands as well as the\n  ``--daemon``, ``--stop-server``, ``--pid-file``, and ``--status`` flags.\n\n  Please use a real process manager in the future instead of relying on the\n  ``pserve`` to daemonize itself. Many options exist including your Operating\n  System's services such as Systemd or Upstart, as well as Python-based\n  solutions like Circus and Supervisor.\n\n  See https://github.com/Pylons/pyramid/pull/1641\n\n- Renamed the ``principal`` argument to ``pyramid.security.remember()`` to\n  ``userid`` in order to clarify its intended purpose.\n  See https://github.com/Pylons/pyramid/pull/1399\n\nDocs\n----\n\n- Moved the documentation for ``accept`` on ``Configurator.add_view`` to no\n  longer be part of the predicate list. See\n  https://github.com/Pylons/pyramid/issues/1391 for a bug report stating\n  ``not_`` was failing on ``accept``. Discussion with @mcdonc led to the\n  conclusion that it should not be documented as a predicate.\n  See https://github.com/Pylons/pyramid/pull/1487 for this PR\n\n- Removed logging configuration from Quick Tutorial ini files except for\n  scaffolding- and logging-related chapters to avoid needing to explain it too\n  early.\n\n- Clarify a previously-implied detail of the ``ISession.invalidate`` API\n  documentation.\n\n- Improve and clarify the documentation on what Pyramid defines as a\n  ``principal`` and a ``userid`` in its security APIs.\n  See https://github.com/Pylons/pyramid/pull/1399\n\nScaffolds\n---------\n\n- Update scaffold generating machinery to return the version of pyramid and\n  pyramid docs for use in scaffolds. Updated starter, alchemy and zodb\n  templates to have links to correctly versioned documentation and reflect\n  which pyramid was used to generate the scaffold.\n\n- Removed non-ascii copyright symbol from templates, as this was\n  causing the scaffolds to fail for project generation.\n\n- You can now run the scaffolding func tests via ``tox py2-scaffolds`` and\n  ``tox py3-scaffolds``.\n\n",
            "header": {
                "file": {
                    "path": "CHANGES.txt"
                },
                "misc_line": null
            },
            "index_line": {
                "old_commit_hash": "8b63cf847",
                "new_commit_hash": "aefb166dc",
                "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": 232,
                            "length": 6
                        },
                        "new_range": {
                            "start": 232,
                            "length": 11
                        },
                        "section": "Bug Fixes"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "  shell a little more straightfoward.",
                                "type": "context"
                            },
                            {
                                "content": "  See https://github.com/Pylons/pyramid/pull/1883",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "- Fix an issue when user passes unparsed strings to ``pyramid.session.CookieSession``",
                                "type": "added"
                            },
                            {
                                "content": "  and ``pyramid.authentication.AuthTktCookieHelper`` for time related parameters",
                                "type": "added"
                            },
                            {
                                "content": "  ``timeout``, ``reissue_time``, ``max_age`` that expect an integer value.",
                                "type": "added"
                            },
                            {
                                "content": "  See https://github.com/Pylons/pyramid/pull/2050",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "Deprecations",
                                "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\n- Bert JW Regeer, 2013/02/01\n\n- Georges Dubus, 2013/03/21\n\n- Jason McKellar, 2013/03/28\n\n- Luke Cyca, 2013/05/30\n\n- Laurence Rowe, 2013/04/24\n\n- Julian P. Glass, 2013/08/10\n\n- Junaid Ali, 2013/08/10\n\n- Chris Davies, 2013/08/11\n\n- Jonathan Villemaire-Krajden, 2013/08/13\n\n- Charlie Clark, 2013/08/15\n\n- Tom Lazar, 2013/08/15\n\n- Andreas Zeidler, 2013/08/15\n\n- Matthew Wilkes, 2013/08/23\n\n- Takahiro Fujiwara, 2013/08/28\n\n- Doug Hellmann, 2013/09/06\n\n- Karl O. Pinc, 2013/09/27\n\n- Matthew Russell, 2013/10/14\n\n- Antti Haapala, 2013/11/15\n\n- Amit Mane, 2014/01/23\n\n- Fenton Travers, 2014/05/06\n\n- Randall Leeds, 2014/11/11\n\n- Hugo Branquinho, 2014/11/25\n\n- Adrian Teng, 2014/12/17\n\n- Ilja Everila, 2015/02/05\n\n- Geoffrey T. Dairiki, 2015/02/06\n\n- David Glick, 2015/02/12\n\n- Donald Stufft, 2015/03/15\n\n- Karen Dalton, 2015/06/01\n\n- Igor Stroh, 2015/06/10\n\n- Jesse Dhillon, 2015/10/07\n\n- Amos Latteier, 2015/10/22\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\n- Georges Dubus, 2013/03/21\n\n- Jason McKellar, 2013/03/28\n\n- Luke Cyca, 2013/05/30\n\n- Laurence Rowe, 2013/04/24\n\n- Julian P. Glass, 2013/08/10\n\n- Junaid Ali, 2013/08/10\n\n- Chris Davies, 2013/08/11\n\n- Jonathan Villemaire-Krajden, 2013/08/13\n\n- Charlie Clark, 2013/08/15\n\n- Tom Lazar, 2013/08/15\n\n- Andreas Zeidler, 2013/08/15\n\n- Matthew Wilkes, 2013/08/23\n\n- Takahiro Fujiwara, 2013/08/28\n\n- Doug Hellmann, 2013/09/06\n\n- Karl O. Pinc, 2013/09/27\n\n- Matthew Russell, 2013/10/14\n\n- Antti Haapala, 2013/11/15\n\n- Amit Mane, 2014/01/23\n\n- Fenton Travers, 2014/05/06\n\n- Randall Leeds, 2014/11/11\n\n- Hugo Branquinho, 2014/11/25\n\n- Adrian Teng, 2014/12/17\n\n- Ilja Everila, 2015/02/05\n\n- Geoffrey T. Dairiki, 2015/02/06\n\n- David Glick, 2015/02/12\n\n- Donald Stufft, 2015/03/15\n\n- Karen Dalton, 2015/06/01\n\n- Igor Stroh, 2015/06/10\n\n- Jesse Dhillon, 2015/10/07\n\n- Amos Latteier, 2015/10/22\n\n- Rami Chousein, 2015/10/28\n",
            "header": {
                "file": {
                    "path": "CONTRIBUTORS.txt"
                },
                "misc_line": null
            },
            "index_line": {
                "old_commit_hash": "2ef07af75",
                "new_commit_hash": "4edf1b4e9",
                "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": 254,
                            "length": 3
                        },
                        "new_range": {
                            "start": 254,
                            "length": 5
                        },
                        "section": "Contributors"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "- Jesse Dhillon, 2015/10/07",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "- Amos Latteier, 2015/10/22",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "- Rami Chousein, 2015/10/28",
                                "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 re\nimport time as time_mod\nimport warnings\n\nfrom zope.interface import implementer\n\nfrom webob.cookies import CookieProfile\n\nfrom pyramid.compat import (\n    long,\n    text_type,\n    binary_type,\n    url_unquote,\n    url_quote,\n    bytes_,\n    ascii_native_,\n    native_,\n    )\n\nfrom pyramid.interfaces import (\n    IAuthenticationPolicy,\n    IDebugLogger,\n    )\n\nfrom pyramid.security import (\n    Authenticated,\n    Everyone,\n    )\n\nfrom pyramid.util import strings_differ\n\nVALID_TOKEN = re.compile(r\"^[A-Za-z][A-Za-z0-9+_-]*$\")\n\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\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, userid, **kw):\n        \"\"\" Store the ``userid`` as ``repoze.who.userid``.\n\n        The identity to authenticated to :mod:`repoze.who`\n        will contain the given userid as ``userid``, and\n        provide all keyword arguments as additional identity\n        keys. Useful keys could be ``max_age`` or ``userdata``.\n        \"\"\"\n        identifier = self._get_identifier(request)\n        if identifier is None:\n            return []\n        environ = request.environ\n        identity = kw\n        identity['repoze.who.userid'] = userid\n        return identifier.remember(environ, identity)\n\n    def forget(self, request):\n        \"\"\" Forget the current authenticated user.\n\n        Return headers that, if included in a response, will delete the\n        cookie responsible for tracking the current user.\n\n        \"\"\"\n        identifier = self._get_identifier(request)\n        if identifier is None:\n            return []\n        identity = self._get_identity(request)\n        return identifier.forget(request.environ, identity)\n\n@implementer(IAuthenticationPolicy)\nclass RemoteUserAuthenticationPolicy(CallbackAuthenticationPolicy):\n    \"\"\" A :app:`Pyramid` :term:`authentication policy` which\n    obtains data from the ``REMOTE_USER`` WSGI environment variable.\n\n    Constructor Arguments\n\n    ``environ_key``\n\n        Default: ``REMOTE_USER``.  The key in the WSGI environ which\n        provides the userid.\n\n    ``callback``\n\n        Default: ``None``.  A callback passed the userid and the request,\n        expected to return None if the userid doesn't exist or a sequence of\n        principal identifiers (possibly empty) representing groups if the\n        user does exist.  If ``callback`` is None, the userid will be assumed\n        to exist with no group principals.\n\n    ``debug``\n\n        Default: ``False``.  If ``debug`` is ``True``, log messages to the\n        Pyramid debug logger about the results of various authentication\n        steps.  The output from debugging is useful for reporting to maillist\n        or IRC channels when asking for support.\n\n    Objects of this class implement the interface described by\n    :class:`pyramid.interfaces.IAuthenticationPolicy`.\n    \"\"\"\n\n    def __init__(self, environ_key='REMOTE_USER', callback=None, debug=False):\n        self.environ_key = environ_key\n        self.callback = callback\n        self.debug = debug\n\n    def unauthenticated_userid(self, request):\n        \"\"\" The ``REMOTE_USER`` value found within the ``environ``.\"\"\"\n        return request.environ.get(self.environ_key)\n\n    def remember(self, request, userid, **kw):\n        \"\"\" A no-op. The ``REMOTE_USER`` does not provide a protocol for\n        remembering the user. This will be application-specific and can\n        be done somewhere else or in a subclass.\"\"\"\n        return []\n\n    def forget(self, request):\n        \"\"\" A no-op. The ``REMOTE_USER`` does not provide a protocol for\n        forgetting the user. This will be application-specific and can\n        be done somewhere else or in a subclass.\"\"\"\n        return []\n\n_marker = object()\n\n@implementer(IAuthenticationPolicy)\nclass AuthTktAuthenticationPolicy(CallbackAuthenticationPolicy):\n    \"\"\"A :app:`Pyramid` :term:`authentication policy` which\n    obtains data from a Pyramid \"auth ticket\" cookie.\n\n    .. warning::\n\n       The default hash algorithm used in this policy is MD5 and has known\n       hash collision vulnerabilities. The risk of an exploit is low.\n       However, for improved authentication security, use\n       ``hashalg='sha512'``.\n\n    Constructor Arguments\n\n    ``secret``\n\n       The secret (a string) used for auth_tkt cookie signing.  This value\n       should be unique across all values provided to Pyramid for various\n       subsystem secrets (see :ref:`admonishment_against_secret_sharing`).\n       Required.\n\n    ``callback``\n\n       Default: ``None``.  A callback passed the userid and the\n       request, expected to return ``None`` if the userid doesn't\n       exist or a sequence of principal identifiers (possibly empty) if\n       the user does exist.  If ``callback`` is ``None``, the userid\n       will be assumed to exist with no principals.  Optional.\n\n    ``cookie_name``\n\n       Default: ``auth_tkt``.  The cookie name used\n       (string).  Optional.\n\n    ``secure``\n\n       Default: ``False``.  Only send the cookie back over a secure\n       conn.  Optional.\n\n    ``include_ip``\n\n       Default: ``False``.  Make the requesting IP address part of\n       the authentication data in the cookie.  Optional.\n\n       For IPv6 this option is not recommended. The ``mod_auth_tkt``\n       specification does not specify how to handle IPv6 addresses, so using\n       this option in combination with IPv6 addresses may cause an\n       incompatible cookie. It ties the authentication ticket to that\n       individual's IPv6 address.\n\n    ``timeout``\n\n       Default: ``None``.  Maximum number of seconds which a newly\n       issued ticket will be considered valid.  After this amount of\n       time, the ticket will expire (effectively logging the user\n       out).  If this value is ``None``, the ticket never expires.\n       Optional.\n\n    ``reissue_time``\n\n       Default: ``None``.  If this parameter is set, it represents the number\n       of seconds that must pass before an authentication token cookie is\n       automatically reissued as the result of a request which requires\n       authentication.  The duration is measured as the number of seconds\n       since the last auth_tkt cookie was issued and 'now'.  If this value is\n       ``0``, a new ticket cookie will be reissued on every request which\n       requires authentication.\n\n       A good rule of thumb: if you want auto-expired cookies based on\n       inactivity: set the ``timeout`` value to 1200 (20 mins) and set the\n       ``reissue_time`` value to perhaps a tenth of the ``timeout`` value\n       (120 or 2 mins).  It's nonsensical to set the ``timeout`` value lower\n       than the ``reissue_time`` value, as the ticket will never be reissued\n       if so.  However, such a configuration is not explicitly prevented.\n\n       Optional.\n\n    ``max_age``\n\n       Default: ``None``.  The max age of the auth_tkt cookie, in\n       seconds.  This differs from ``timeout`` inasmuch as ``timeout``\n       represents the lifetime of the ticket contained in the cookie,\n       while this value represents the lifetime of the cookie itself.\n       When this value is set, the cookie's ``Max-Age`` and\n       ``Expires`` settings will be set, allowing the auth_tkt cookie\n       to last between browser sessions.  It is typically nonsensical\n       to set this to a value that is lower than ``timeout`` or\n       ``reissue_time``, although it is not explicitly prevented.\n       Optional.\n\n    ``path``\n\n       Default: ``/``. The path for which the auth_tkt cookie is valid.\n       May be desirable if the application only serves part of a domain.\n       Optional.\n\n    ``http_only``\n\n       Default: ``False``. Hide cookie from JavaScript by setting the\n       HttpOnly flag. Not honored by all browsers.\n       Optional.\n\n    ``wild_domain``\n\n       Default: ``True``. An auth_tkt cookie will be generated for the\n       wildcard domain. If your site is hosted as ``example.com`` this\n       will make the cookie available for sites underneath ``example.com``\n       such as ``www.example.com``.\n       Optional.\n\n    ``parent_domain``\n\n       Default: ``False``. An auth_tkt cookie will be generated for the\n       parent domain of the current site. For example if your site is\n       hosted under ``www.example.com`` a cookie will be generated for\n       ``.example.com``. This can be useful if you have multiple sites\n       sharing the same domain. This option supercedes the ``wild_domain``\n       option.\n       Optional.\n\n       This option is available as of :app:`Pyramid` 1.5.\n\n    ``domain``\n\n       Default: ``None``. If provided the auth_tkt cookie will only be\n       set for this domain. This option is not compatible with ``wild_domain``\n       and ``parent_domain``.\n       Optional.\n\n       This option is available as of :app:`Pyramid` 1.5.\n\n    ``hashalg``\n\n       Default: ``md5`` (the literal string).\n\n       Any hash algorithm supported by Python's ``hashlib.new()`` function\n       can be used as the ``hashalg``.\n\n       Cookies generated by different instances of AuthTktAuthenticationPolicy\n       using different ``hashalg`` options are not compatible. Switching the\n       ``hashalg`` will imply that all existing users with a valid cookie will\n       be required to re-login.\n\n       A warning is emitted at startup if an explicit ``hashalg`` is not\n       passed.  This is for backwards compatibility reasons.\n\n       This option is available as of :app:`Pyramid` 1.4.\n\n       Optional.\n\n       .. note::\n\n          ``md5`` is the default for backwards compatibility reasons. However,\n          if you don't specify ``md5`` as the hashalg explicitly, a warning is\n          issued at application startup time.  An explicit value of ``sha512``\n          is recommended for improved security, and ``sha512`` will become the\n          default in a future Pyramid version.\n\n    ``debug``\n\n        Default: ``False``.  If ``debug`` is ``True``, log messages to the\n        Pyramid debug logger about the results of various authentication\n        steps.  The output from debugging is useful for reporting to maillist\n        or IRC channels when asking for support.\n\n    Objects of this class implement the interface described by\n    :class:`pyramid.interfaces.IAuthenticationPolicy`.\n    \"\"\"\n\n    def __init__(self,\n                 secret,\n                 callback=None,\n                 cookie_name='auth_tkt',\n                 secure=False,\n                 include_ip=False,\n                 timeout=None,\n                 reissue_time=None,\n                 max_age=None,\n                 path=\"/\",\n                 http_only=False,\n                 wild_domain=True,\n                 debug=False,\n                 hashalg=_marker,\n                 parent_domain=False,\n                 domain=None,\n                 ):\n        if hashalg is _marker:\n            hashalg = 'md5'\n            warnings.warn(\n                'The MD5 hash function used by default by the '\n                'AuthTktAuthenticationPolicy is known to be '\n                'susceptible to collision attacks.  It is the current default '\n                'for backwards compatibility reasons, but we recommend that '\n                'you use the SHA512 algorithm instead for improved security.  '\n                'Pass ``hashalg=\\'sha512\\'`` to the '\n                'AuthTktAuthenticationPolicy constructor to do so.\\n\\nNote '\n                'that a change to the hash algorithms will invalidate existing '\n                'auth tkt cookies set by your application.  If backwards '\n                'compatibility of existing auth tkt cookies is of greater '\n                'concern than the risk posed by the potential for a hash '\n                'collision, you\\'ll want to continue using MD5 explicitly.  '\n                'To do so, pass ``hashalg=\\'md5\\'`` in your application to '\n                'the AuthTktAuthenticationPolicy constructor.   When you do so '\n                'this warning will not be emitted again.  The default '\n                'algorithm used in this policy will change in the future, so '\n                'setting an explicit hashalg will futureproof your '\n                'application.',\n                DeprecationWarning,\n                stacklevel=2\n                )\n        self.cookie = AuthTktCookieHelper(\n            secret,\n            cookie_name=cookie_name,\n            secure=secure,\n            include_ip=include_ip,\n            timeout=timeout,\n            reissue_time=reissue_time,\n            max_age=max_age,\n            http_only=http_only,\n            path=path,\n            wild_domain=wild_domain,\n            hashalg=hashalg,\n            parent_domain=parent_domain,\n            domain=domain,\n            )\n        self.callback = callback\n        self.debug = debug\n\n    def unauthenticated_userid(self, request):\n        \"\"\" The userid key within the auth_tkt cookie.\"\"\"\n        result = self.cookie.identify(request)\n        if result:\n            return result['userid']\n\n    def remember(self, request, userid, **kw):\n        \"\"\" Accepts the following kw args: ``max_age=<int-seconds>,\n        ``tokens=<sequence-of-ascii-strings>``.\n\n        Return a list of headers which will set appropriate cookies on\n        the response.\n\n        \"\"\"\n        return self.cookie.remember(request, userid, **kw)\n\n    def forget(self, request):\n        \"\"\" A list of headers which will delete appropriate cookies.\"\"\"\n        return self.cookie.forget(request)\n\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 = native_(ticket).strip('\"')\n    digest_size = hashlib.new(hashalg).digest_size * 2\n    digest = ticket[:digest_size]\n    try:\n        timestamp = int(ticket[digest_size:digest_size + 8], 16)\n    except ValueError as e:\n        raise BadTicket('Timestamp is not a hex integer: %s' % e)\n    try:\n        userid, data = ticket[digest_size + 8:].split('!', 1)\n    except ValueError:\n        raise BadTicket('userid is not followed by !')\n    userid = url_unquote(userid)\n    if '!' in data:\n        tokens, user_data = data.split('!', 1)\n    else: # pragma: no cover (never generated)\n        # @@: Is this the right order?\n        tokens = ''\n        user_data = data\n\n    expected = calculate_digest(ip, timestamp, secret,\n                                userid, tokens, user_data, hashalg)\n\n    # Avoid timing attacks (see\n    # http://seb.dbzteam.org/crypto/python-oauth-timing-hmac.pdf)\n    if strings_differ(expected, digest):\n        raise BadTicket('Digest signature is not correct',\n                        expected=(expected, digest))\n\n    tokens = tokens.split(',')\n\n    return (timestamp, userid, tokens, user_data)\n\n# this function licensed under the MIT license (stolen from Paste)\ndef calculate_digest(ip, timestamp, secret, userid, tokens, user_data,\n                     hashalg='md5'):\n    secret = bytes_(secret, 'utf-8')\n    userid = bytes_(userid, 'utf-8')\n    tokens = bytes_(tokens, 'utf-8')\n    user_data = bytes_(user_data, 'utf-8')\n    hash_obj = hashlib.new(hashalg)\n\n    # Check to see if this is an IPv6 address\n    if ':' in ip:\n        ip_timestamp = ip + str(int(timestamp))\n        ip_timestamp = bytes_(ip_timestamp)\n    else:\n        # encode_ip_timestamp not required, left in for backwards compatibility\n        ip_timestamp = encode_ip_timestamp(ip, timestamp)\n\n    hash_obj.update(ip_timestamp + secret + userid + b'\\0' +\n            tokens + b'\\0' + user_data)\n    digest = hash_obj.hexdigest()\n    hash_obj2 = hashlib.new(hashalg)\n    hash_obj2.update(bytes_(digest) + secret)\n    return hash_obj2.hexdigest()\n\n# this function licensed under the MIT license (stolen from Paste)\ndef encode_ip_timestamp(ip, timestamp):\n    ip_chars = ''.join(map(chr, map(int, ip.split('.'))))\n    t = int(timestamp)\n    ts = ((t & 0xff000000) >> 24,\n          (t & 0xff0000) >> 16,\n          (t & 0xff00) >> 8,\n          t & 0xff)\n    ts_chars = ''.join(map(chr, ts))\n    return bytes_(ip_chars + ts_chars)\n\nclass AuthTktCookieHelper(object):\n    \"\"\"\n    A helper class for use in third-party authentication policy\n    implementations.  See\n    :class:`pyramid.authentication.AuthTktAuthenticationPolicy` for the\n    meanings of the constructor arguments.\n    \"\"\"\n    parse_ticket = staticmethod(parse_ticket) # for tests\n    AuthTicket = AuthTicket # for tests\n    BadTicket = BadTicket # for tests\n    now = None # for tests\n\n    userid_type_decoders = {\n        'int':int,\n        'unicode':lambda x: utf_8_decode(x)[0], # bw compat for old cookies\n        'b64unicode': lambda x: utf_8_decode(b64decode(x))[0],\n        'b64str': lambda x: b64decode(x),\n        }\n\n    userid_type_encoders = {\n        int: ('int', str),\n        long: ('int', str),\n        text_type: ('b64unicode', lambda x: b64encode(utf_8_encode(x)[0])),\n        binary_type: ('b64str', lambda x: b64encode(x)),\n        }\n\n    def __init__(self, secret, cookie_name='auth_tkt', secure=False,\n                 include_ip=False, timeout=None, reissue_time=None,\n                 max_age=None, http_only=False, path=\"/\", wild_domain=True,\n                 hashalg='md5', parent_domain=False, domain=None):\n\n        serializer = _SimpleSerializer()\n\n        self.cookie_profile = CookieProfile(\n            cookie_name=cookie_name,\n            secure=secure,\n            max_age=max_age,\n            httponly=http_only,\n            path=path,\n            serializer=serializer\n        )\n\n        self.secret = secret\n        self.cookie_name = cookie_name\n        self.secure = secure\n        self.include_ip = include_ip\n        self.timeout = timeout\n        self.reissue_time = reissue_time\n        self.max_age = max_age\n        self.wild_domain = wild_domain\n        self.parent_domain = parent_domain\n        self.domain = domain\n        self.hashalg = hashalg\n\n    def _get_cookies(self, request, value, max_age=None):\n        cur_domain = request.domain\n\n        domains = []\n        if self.domain:\n            domains.append(self.domain)\n        else:\n            if self.parent_domain and cur_domain.count('.') > 1:\n                domains.append('.' + cur_domain.split('.', 1)[1])\n            else:\n                domains.append(None)\n                domains.append(cur_domain)\n                if self.wild_domain:\n                    domains.append('.' + cur_domain)\n\n        profile = self.cookie_profile(request)\n\n        kw = {}\n        kw['domains'] = domains\n        if max_age is not None:\n            kw['max_age'] = max_age\n\n        headers = profile.get_headers(value, **kw)\n        return headers\n\n    def identify(self, request):\n        \"\"\" Return a dictionary with authentication information, or ``None``\n        if no valid auth_tkt is attached to ``request``\"\"\"\n        environ = request.environ\n        cookie = request.cookies.get(self.cookie_name)\n\n        if cookie is None:\n            return None\n\n        if self.include_ip:\n            remote_addr = environ['REMOTE_ADDR']\n        else:\n            remote_addr = '0.0.0.0'\n\n        try:\n            timestamp, userid, tokens, user_data = self.parse_ticket(\n                self.secret, cookie, remote_addr, self.hashalg)\n        except self.BadTicket:\n            return None\n\n        now = self.now # service tests\n\n        if now is None:\n            now = time_mod.time()\n\n        if self.timeout and ( (timestamp + self.timeout) < now ):\n            # the auth_tkt data has expired\n            return None\n\n        userid_typename = 'userid_type:'\n        user_data_info = user_data.split('|')\n        for datum in filter(None, user_data_info):\n            if datum.startswith(userid_typename):\n                userid_type = datum[len(userid_typename):]\n                decoder = self.userid_type_decoders.get(userid_type)\n                if decoder:\n                    userid = decoder(userid)\n\n        reissue = self.reissue_time is not None\n\n        if reissue and not hasattr(request, '_authtkt_reissued'):\n            if ( (now - timestamp) > self.reissue_time ):\n                # See https://github.com/Pylons/pyramid/issues#issue/108\n                tokens = list(filter(None, tokens))\n                headers = self.remember(request, userid, max_age=self.max_age,\n                                        tokens=tokens)\n                def reissue_authtkt(request, response):\n                    if not hasattr(request, '_authtkt_reissue_revoked'):\n                        for k, v in headers:\n                            response.headerlist.append((k, v))\n                request.add_response_callback(reissue_authtkt)\n                request._authtkt_reissued = True\n\n        environ['REMOTE_USER_TOKENS'] = tokens\n        environ['REMOTE_USER_DATA'] = user_data\n        environ['AUTH_TYPE'] = 'cookie'\n\n        identity = {}\n        identity['timestamp'] = timestamp\n        identity['userid'] = userid\n        identity['tokens'] = tokens\n        identity['userdata'] = user_data\n        return identity\n\n    def forget(self, request):\n        \"\"\" Return a set of expires Set-Cookie headers, which will destroy\n        any existing auth_tkt cookie when attached to a response\"\"\"\n        request._authtkt_reissue_revoked = True\n        return self._get_cookies(request, None)\n\n    def remember(self, request, userid, max_age=None, tokens=()):\n        \"\"\" Return a set of Set-Cookie headers; when set into a response,\n        these headers will represent a valid authentication ticket.\n\n        ``max_age``\n          The max age of the auth_tkt cookie, in seconds.  When this value is\n          set, the cookie's ``Max-Age`` and ``Expires`` settings will be set,\n          allowing the auth_tkt cookie to last between browser sessions.  If\n          this value is ``None``, the ``max_age`` value provided to the\n          helper itself will be used as the ``max_age`` value.  Default:\n          ``None``.\n\n        ``tokens``\n          A sequence of strings that will be placed into the auth_tkt tokens\n          field.  Each string in the sequence must be of the Python ``str``\n          type and must match the regex ``^[A-Za-z][A-Za-z0-9+_-]*$``.\n          Tokens are available in the returned identity when an auth_tkt is\n          found in the request and unpacked.  Default: ``()``.\n        \"\"\"\n        if max_age is None:\n            max_age = self.max_age\n\n        environ = request.environ\n\n        if self.include_ip:\n            remote_addr = environ['REMOTE_ADDR']\n        else:\n            remote_addr = '0.0.0.0'\n\n        user_data = ''\n\n        encoding_data = self.userid_type_encoders.get(type(userid))\n\n        if encoding_data:\n            encoding, encoder = encoding_data\n            userid = encoder(userid)\n            user_data = 'userid_type:%s' % encoding\n\n        new_tokens = []\n        for token in tokens:\n            if isinstance(token, text_type):\n                try:\n                    token = ascii_native_(token)\n                except UnicodeEncodeError:\n                    raise ValueError(\"Invalid token %r\" % (token,))\n            if not (isinstance(token, str) and VALID_TOKEN.match(token)):\n                raise ValueError(\"Invalid token %r\" % (token,))\n            new_tokens.append(token)\n        tokens = tuple(new_tokens)\n\n        if hasattr(request, '_authtkt_reissued'):\n            request._authtkt_reissue_revoked = True\n\n        ticket = self.AuthTicket(\n            self.secret,\n            userid,\n            remote_addr,\n            tokens=tokens,\n            user_data=user_data,\n            cookie_name=self.cookie_name,\n            secure=self.secure,\n            hashalg=self.hashalg\n            )\n\n        cookie_value = ticket.cookie_value()\n        return self._get_cookies(request, cookie_value, max_age)\n\n@implementer(IAuthenticationPolicy)\nclass SessionAuthenticationPolicy(CallbackAuthenticationPolicy):\n    \"\"\" A :app:`Pyramid` authentication policy which gets its data from the\n    configured :term:`session`.  For this authentication policy to work, you\n    will have to follow the instructions in the :ref:`sessions_chapter` to\n    configure a :term:`session factory`.\n\n    Constructor Arguments\n\n    ``prefix``\n\n       A prefix used when storing the authentication parameters in the\n       session. Defaults to 'auth.'. Optional.\n\n    ``callback``\n\n       Default: ``None``.  A callback passed the userid and the\n       request, expected to return ``None`` if the userid doesn't\n       exist or a sequence of principal identifiers (possibly empty) if\n       the user does exist.  If ``callback`` is ``None``, the userid\n       will be assumed to exist with no principals.  Optional.\n\n    ``debug``\n\n        Default: ``False``.  If ``debug`` is ``True``, log messages to the\n        Pyramid debug logger about the results of various authentication\n        steps.  The output from debugging is useful for reporting to maillist\n        or IRC channels when asking for support.\n\n    \"\"\"\n\n    def __init__(self, prefix='auth.', callback=None, debug=False):\n        self.callback = callback\n        self.prefix = prefix or ''\n        self.userid_key = prefix + 'userid'\n        self.debug = debug\n\n    def remember(self, request, userid, **kw):\n        \"\"\" Store a userid in the session.\"\"\"\n        request.session[self.userid_key] = userid\n        return []\n\n    def forget(self, request):\n        \"\"\" Remove the stored userid from the session.\"\"\"\n        if self.userid_key in request.session:\n            del request.session[self.userid_key]\n        return []\n\n    def 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, userid, **kw):\n        \"\"\" A no-op. Basic authentication does not provide a protocol for\n        remembering the user. Credentials are sent on every request.\n\n        \"\"\"\n        return []\n\n    def forget(self, request):\n        \"\"\" Returns challenge headers. This should be attached to a response\n        to indicate that credentials are required.\"\"\"\n        return [('WWW-Authenticate', 'Basic realm=\"%s\"' % self.realm)]\n\n    def callback(self, username, request):\n        # Username arg is ignored.  Unfortunately _get_credentials winds up\n        # getting called twice when authenticated_userid is called.  Avoiding\n        # that, however, winds up duplicating logic from the superclass.\n        credentials = self._get_credentials(request)\n        if credentials:\n            username, password = credentials\n            return self.check(username, password, request)\n\n    def _get_credentials(self, request):\n        authorization = request.headers.get('Authorization')\n        if not authorization:\n            return None\n        try:\n            authmeth, auth = authorization.split(' ', 1)\n        except ValueError: # not enough values to unpack\n            return None\n        if authmeth.lower() != 'basic':\n            return None\n\n        try:\n            authbytes = b64decode(auth.strip())\n        except (TypeError, binascii.Error): # can't decode\n            return None\n\n        # try utf-8 first, then latin-1; see discussion in\n        # https://github.com/Pylons/pyramid/issues/898\n        try:\n            auth = authbytes.decode('utf-8')\n        except UnicodeDecodeError:\n            auth = authbytes.decode('latin-1')\n\n        try:\n            username, password = auth.split(':', 1)\n        except ValueError: # not enough values to unpack\n            return None\n        return username, password\n\nclass _SimpleSerializer(object):\n    def loads(self, bstruct):\n        return native_(bstruct)\n\n    def dumps(self, appstruct):\n        return bytes_(appstruct)\n",
            "new_file_content": "import binascii\nfrom codecs import utf_8_decode\nfrom codecs import utf_8_encode\nimport hashlib\nimport base64\nimport re\nimport time as time_mod\nimport warnings\n\nfrom zope.interface import implementer\n\nfrom webob.cookies import CookieProfile\n\nfrom pyramid.compat import (\n    long,\n    text_type,\n    binary_type,\n    url_unquote,\n    url_quote,\n    bytes_,\n    ascii_native_,\n    native_,\n    )\n\nfrom pyramid.interfaces import (\n    IAuthenticationPolicy,\n    IDebugLogger,\n    )\n\nfrom pyramid.security import (\n    Authenticated,\n    Everyone,\n    )\n\nfrom pyramid.util import strings_differ\n\nVALID_TOKEN = re.compile(r\"^[A-Za-z][A-Za-z0-9+_-]*$\")\n\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\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, userid, **kw):\n        \"\"\" Store the ``userid`` as ``repoze.who.userid``.\n\n        The identity to authenticated to :mod:`repoze.who`\n        will contain the given userid as ``userid``, and\n        provide all keyword arguments as additional identity\n        keys. Useful keys could be ``max_age`` or ``userdata``.\n        \"\"\"\n        identifier = self._get_identifier(request)\n        if identifier is None:\n            return []\n        environ = request.environ\n        identity = kw\n        identity['repoze.who.userid'] = userid\n        return identifier.remember(environ, identity)\n\n    def forget(self, request):\n        \"\"\" Forget the current authenticated user.\n\n        Return headers that, if included in a response, will delete the\n        cookie responsible for tracking the current user.\n\n        \"\"\"\n        identifier = self._get_identifier(request)\n        if identifier is None:\n            return []\n        identity = self._get_identity(request)\n        return identifier.forget(request.environ, identity)\n\n@implementer(IAuthenticationPolicy)\nclass RemoteUserAuthenticationPolicy(CallbackAuthenticationPolicy):\n    \"\"\" A :app:`Pyramid` :term:`authentication policy` which\n    obtains data from the ``REMOTE_USER`` WSGI environment variable.\n\n    Constructor Arguments\n\n    ``environ_key``\n\n        Default: ``REMOTE_USER``.  The key in the WSGI environ which\n        provides the userid.\n\n    ``callback``\n\n        Default: ``None``.  A callback passed the userid and the request,\n        expected to return None if the userid doesn't exist or a sequence of\n        principal identifiers (possibly empty) representing groups if the\n        user does exist.  If ``callback`` is None, the userid will be assumed\n        to exist with no group principals.\n\n    ``debug``\n\n        Default: ``False``.  If ``debug`` is ``True``, log messages to the\n        Pyramid debug logger about the results of various authentication\n        steps.  The output from debugging is useful for reporting to maillist\n        or IRC channels when asking for support.\n\n    Objects of this class implement the interface described by\n    :class:`pyramid.interfaces.IAuthenticationPolicy`.\n    \"\"\"\n\n    def __init__(self, environ_key='REMOTE_USER', callback=None, debug=False):\n        self.environ_key = environ_key\n        self.callback = callback\n        self.debug = debug\n\n    def unauthenticated_userid(self, request):\n        \"\"\" The ``REMOTE_USER`` value found within the ``environ``.\"\"\"\n        return request.environ.get(self.environ_key)\n\n    def remember(self, request, userid, **kw):\n        \"\"\" A no-op. The ``REMOTE_USER`` does not provide a protocol for\n        remembering the user. This will be application-specific and can\n        be done somewhere else or in a subclass.\"\"\"\n        return []\n\n    def forget(self, request):\n        \"\"\" A no-op. The ``REMOTE_USER`` does not provide a protocol for\n        forgetting the user. This will be application-specific and can\n        be done somewhere else or in a subclass.\"\"\"\n        return []\n\n_marker = object()\n\n@implementer(IAuthenticationPolicy)\nclass AuthTktAuthenticationPolicy(CallbackAuthenticationPolicy):\n    \"\"\"A :app:`Pyramid` :term:`authentication policy` which\n    obtains data from a Pyramid \"auth ticket\" cookie.\n\n    .. warning::\n\n       The default hash algorithm used in this policy is MD5 and has known\n       hash collision vulnerabilities. The risk of an exploit is low.\n       However, for improved authentication security, use\n       ``hashalg='sha512'``.\n\n    Constructor Arguments\n\n    ``secret``\n\n       The secret (a string) used for auth_tkt cookie signing.  This value\n       should be unique across all values provided to Pyramid for various\n       subsystem secrets (see :ref:`admonishment_against_secret_sharing`).\n       Required.\n\n    ``callback``\n\n       Default: ``None``.  A callback passed the userid and the\n       request, expected to return ``None`` if the userid doesn't\n       exist or a sequence of principal identifiers (possibly empty) if\n       the user does exist.  If ``callback`` is ``None``, the userid\n       will be assumed to exist with no principals.  Optional.\n\n    ``cookie_name``\n\n       Default: ``auth_tkt``.  The cookie name used\n       (string).  Optional.\n\n    ``secure``\n\n       Default: ``False``.  Only send the cookie back over a secure\n       conn.  Optional.\n\n    ``include_ip``\n\n       Default: ``False``.  Make the requesting IP address part of\n       the authentication data in the cookie.  Optional.\n\n       For IPv6 this option is not recommended. The ``mod_auth_tkt``\n       specification does not specify how to handle IPv6 addresses, so using\n       this option in combination with IPv6 addresses may cause an\n       incompatible cookie. It ties the authentication ticket to that\n       individual's IPv6 address.\n\n    ``timeout``\n\n       Default: ``None``.  Maximum number of seconds which a newly\n       issued ticket will be considered valid.  After this amount of\n       time, the ticket will expire (effectively logging the user\n       out).  If this value is ``None``, the ticket never expires.\n       Optional.\n\n    ``reissue_time``\n\n       Default: ``None``.  If this parameter is set, it represents the number\n       of seconds that must pass before an authentication token cookie is\n       automatically reissued as the result of a request which requires\n       authentication.  The duration is measured as the number of seconds\n       since the last auth_tkt cookie was issued and 'now'.  If this value is\n       ``0``, a new ticket cookie will be reissued on every request which\n       requires authentication.\n\n       A good rule of thumb: if you want auto-expired cookies based on\n       inactivity: set the ``timeout`` value to 1200 (20 mins) and set the\n       ``reissue_time`` value to perhaps a tenth of the ``timeout`` value\n       (120 or 2 mins).  It's nonsensical to set the ``timeout`` value lower\n       than the ``reissue_time`` value, as the ticket will never be reissued\n       if so.  However, such a configuration is not explicitly prevented.\n\n       Optional.\n\n    ``max_age``\n\n       Default: ``None``.  The max age of the auth_tkt cookie, in\n       seconds.  This differs from ``timeout`` inasmuch as ``timeout``\n       represents the lifetime of the ticket contained in the cookie,\n       while this value represents the lifetime of the cookie itself.\n       When this value is set, the cookie's ``Max-Age`` and\n       ``Expires`` settings will be set, allowing the auth_tkt cookie\n       to last between browser sessions.  It is typically nonsensical\n       to set this to a value that is lower than ``timeout`` or\n       ``reissue_time``, although it is not explicitly prevented.\n       Optional.\n\n    ``path``\n\n       Default: ``/``. The path for which the auth_tkt cookie is valid.\n       May be desirable if the application only serves part of a domain.\n       Optional.\n\n    ``http_only``\n\n       Default: ``False``. Hide cookie from JavaScript by setting the\n       HttpOnly flag. Not honored by all browsers.\n       Optional.\n\n    ``wild_domain``\n\n       Default: ``True``. An auth_tkt cookie will be generated for the\n       wildcard domain. If your site is hosted as ``example.com`` this\n       will make the cookie available for sites underneath ``example.com``\n       such as ``www.example.com``.\n       Optional.\n\n    ``parent_domain``\n\n       Default: ``False``. An auth_tkt cookie will be generated for the\n       parent domain of the current site. For example if your site is\n       hosted under ``www.example.com`` a cookie will be generated for\n       ``.example.com``. This can be useful if you have multiple sites\n       sharing the same domain. This option supercedes the ``wild_domain``\n       option.\n       Optional.\n\n       This option is available as of :app:`Pyramid` 1.5.\n\n    ``domain``\n\n       Default: ``None``. If provided the auth_tkt cookie will only be\n       set for this domain. This option is not compatible with ``wild_domain``\n       and ``parent_domain``.\n       Optional.\n\n       This option is available as of :app:`Pyramid` 1.5.\n\n    ``hashalg``\n\n       Default: ``md5`` (the literal string).\n\n       Any hash algorithm supported by Python's ``hashlib.new()`` function\n       can be used as the ``hashalg``.\n\n       Cookies generated by different instances of AuthTktAuthenticationPolicy\n       using different ``hashalg`` options are not compatible. Switching the\n       ``hashalg`` will imply that all existing users with a valid cookie will\n       be required to re-login.\n\n       A warning is emitted at startup if an explicit ``hashalg`` is not\n       passed.  This is for backwards compatibility reasons.\n\n       This option is available as of :app:`Pyramid` 1.4.\n\n       Optional.\n\n       .. note::\n\n          ``md5`` is the default for backwards compatibility reasons. However,\n          if you don't specify ``md5`` as the hashalg explicitly, a warning is\n          issued at application startup time.  An explicit value of ``sha512``\n          is recommended for improved security, and ``sha512`` will become the\n          default in a future Pyramid version.\n\n    ``debug``\n\n        Default: ``False``.  If ``debug`` is ``True``, log messages to the\n        Pyramid debug logger about the results of various authentication\n        steps.  The output from debugging is useful for reporting to maillist\n        or IRC channels when asking for support.\n\n    Objects of this class implement the interface described by\n    :class:`pyramid.interfaces.IAuthenticationPolicy`.\n    \"\"\"\n\n    def __init__(self,\n                 secret,\n                 callback=None,\n                 cookie_name='auth_tkt',\n                 secure=False,\n                 include_ip=False,\n                 timeout=None,\n                 reissue_time=None,\n                 max_age=None,\n                 path=\"/\",\n                 http_only=False,\n                 wild_domain=True,\n                 debug=False,\n                 hashalg=_marker,\n                 parent_domain=False,\n                 domain=None,\n                 ):\n        if hashalg is _marker:\n            hashalg = 'md5'\n            warnings.warn(\n                'The MD5 hash function used by default by the '\n                'AuthTktAuthenticationPolicy is known to be '\n                'susceptible to collision attacks.  It is the current default '\n                'for backwards compatibility reasons, but we recommend that '\n                'you use the SHA512 algorithm instead for improved security.  '\n                'Pass ``hashalg=\\'sha512\\'`` to the '\n                'AuthTktAuthenticationPolicy constructor to do so.\\n\\nNote '\n                'that a change to the hash algorithms will invalidate existing '\n                'auth tkt cookies set by your application.  If backwards '\n                'compatibility of existing auth tkt cookies is of greater '\n                'concern than the risk posed by the potential for a hash '\n                'collision, you\\'ll want to continue using MD5 explicitly.  '\n                'To do so, pass ``hashalg=\\'md5\\'`` in your application to '\n                'the AuthTktAuthenticationPolicy constructor.   When you do so '\n                'this warning will not be emitted again.  The default '\n                'algorithm used in this policy will change in the future, so '\n                'setting an explicit hashalg will futureproof your '\n                'application.',\n                DeprecationWarning,\n                stacklevel=2\n                )\n        self.cookie = AuthTktCookieHelper(\n            secret,\n            cookie_name=cookie_name,\n            secure=secure,\n            include_ip=include_ip,\n            timeout=timeout,\n            reissue_time=reissue_time,\n            max_age=max_age,\n            http_only=http_only,\n            path=path,\n            wild_domain=wild_domain,\n            hashalg=hashalg,\n            parent_domain=parent_domain,\n            domain=domain,\n            )\n        self.callback = callback\n        self.debug = debug\n\n    def unauthenticated_userid(self, request):\n        \"\"\" The userid key within the auth_tkt cookie.\"\"\"\n        result = self.cookie.identify(request)\n        if result:\n            return result['userid']\n\n    def remember(self, request, userid, **kw):\n        \"\"\" Accepts the following kw args: ``max_age=<int-seconds>,\n        ``tokens=<sequence-of-ascii-strings>``.\n\n        Return a list of headers which will set appropriate cookies on\n        the response.\n\n        \"\"\"\n        return self.cookie.remember(request, userid, **kw)\n\n    def forget(self, request):\n        \"\"\" A list of headers which will delete appropriate cookies.\"\"\"\n        return self.cookie.forget(request)\n\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 = native_(ticket).strip('\"')\n    digest_size = hashlib.new(hashalg).digest_size * 2\n    digest = ticket[:digest_size]\n    try:\n        timestamp = int(ticket[digest_size:digest_size + 8], 16)\n    except ValueError as e:\n        raise BadTicket('Timestamp is not a hex integer: %s' % e)\n    try:\n        userid, data = ticket[digest_size + 8:].split('!', 1)\n    except ValueError:\n        raise BadTicket('userid is not followed by !')\n    userid = url_unquote(userid)\n    if '!' in data:\n        tokens, user_data = data.split('!', 1)\n    else: # pragma: no cover (never generated)\n        # @@: Is this the right order?\n        tokens = ''\n        user_data = data\n\n    expected = calculate_digest(ip, timestamp, secret,\n                                userid, tokens, user_data, hashalg)\n\n    # Avoid timing attacks (see\n    # http://seb.dbzteam.org/crypto/python-oauth-timing-hmac.pdf)\n    if strings_differ(expected, digest):\n        raise BadTicket('Digest signature is not correct',\n                        expected=(expected, digest))\n\n    tokens = tokens.split(',')\n\n    return (timestamp, userid, tokens, user_data)\n\n# this function licensed under the MIT license (stolen from Paste)\ndef calculate_digest(ip, timestamp, secret, userid, tokens, user_data,\n                     hashalg='md5'):\n    secret = bytes_(secret, 'utf-8')\n    userid = bytes_(userid, 'utf-8')\n    tokens = bytes_(tokens, 'utf-8')\n    user_data = bytes_(user_data, 'utf-8')\n    hash_obj = hashlib.new(hashalg)\n\n    # Check to see if this is an IPv6 address\n    if ':' in ip:\n        ip_timestamp = ip + str(int(timestamp))\n        ip_timestamp = bytes_(ip_timestamp)\n    else:\n        # encode_ip_timestamp not required, left in for backwards compatibility\n        ip_timestamp = encode_ip_timestamp(ip, timestamp)\n\n    hash_obj.update(ip_timestamp + secret + userid + b'\\0' +\n            tokens + b'\\0' + user_data)\n    digest = hash_obj.hexdigest()\n    hash_obj2 = hashlib.new(hashalg)\n    hash_obj2.update(bytes_(digest) + secret)\n    return hash_obj2.hexdigest()\n\n# this function licensed under the MIT license (stolen from Paste)\ndef encode_ip_timestamp(ip, timestamp):\n    ip_chars = ''.join(map(chr, map(int, ip.split('.'))))\n    t = int(timestamp)\n    ts = ((t & 0xff000000) >> 24,\n          (t & 0xff0000) >> 16,\n          (t & 0xff00) >> 8,\n          t & 0xff)\n    ts_chars = ''.join(map(chr, ts))\n    return bytes_(ip_chars + ts_chars)\n\nclass AuthTktCookieHelper(object):\n    \"\"\"\n    A helper class for use in third-party authentication policy\n    implementations.  See\n    :class:`pyramid.authentication.AuthTktAuthenticationPolicy` for the\n    meanings of the constructor arguments.\n    \"\"\"\n    parse_ticket = staticmethod(parse_ticket) # for tests\n    AuthTicket = AuthTicket # for tests\n    BadTicket = BadTicket # for tests\n    now = None # for tests\n\n    userid_type_decoders = {\n        'int':int,\n        'unicode':lambda x: utf_8_decode(x)[0], # bw compat for old cookies\n        'b64unicode': lambda x: utf_8_decode(b64decode(x))[0],\n        'b64str': lambda x: b64decode(x),\n        }\n\n    userid_type_encoders = {\n        int: ('int', str),\n        long: ('int', str),\n        text_type: ('b64unicode', lambda x: b64encode(utf_8_encode(x)[0])),\n        binary_type: ('b64str', lambda x: b64encode(x)),\n        }\n\n    def __init__(self, secret, cookie_name='auth_tkt', secure=False,\n                 include_ip=False, timeout=None, reissue_time=None,\n                 max_age=None, http_only=False, path=\"/\", wild_domain=True,\n                 hashalg='md5', parent_domain=False, domain=None):\n\n        serializer = _SimpleSerializer()\n\n        self.cookie_profile = CookieProfile(\n            cookie_name=cookie_name,\n            secure=secure,\n            max_age=max_age,\n            httponly=http_only,\n            path=path,\n            serializer=serializer\n        )\n\n        self.secret = secret\n        self.cookie_name = cookie_name\n        self.secure = secure\n        self.include_ip = include_ip\n        self.timeout = timeout if timeout is None else int(timeout)\n        self.reissue_time = reissue_time if reissue_time is None else int(reissue_time)\n        self.max_age = max_age if max_age is None else int(max_age)\n        self.wild_domain = wild_domain\n        self.parent_domain = parent_domain\n        self.domain = domain\n        self.hashalg = hashalg\n\n    def _get_cookies(self, request, value, max_age=None):\n        cur_domain = request.domain\n\n        domains = []\n        if self.domain:\n            domains.append(self.domain)\n        else:\n            if self.parent_domain and cur_domain.count('.') > 1:\n                domains.append('.' + cur_domain.split('.', 1)[1])\n            else:\n                domains.append(None)\n                domains.append(cur_domain)\n                if self.wild_domain:\n                    domains.append('.' + cur_domain)\n\n        profile = self.cookie_profile(request)\n\n        kw = {}\n        kw['domains'] = domains\n        if max_age is not None:\n            kw['max_age'] = max_age\n\n        headers = profile.get_headers(value, **kw)\n        return headers\n\n    def identify(self, request):\n        \"\"\" Return a dictionary with authentication information, or ``None``\n        if no valid auth_tkt is attached to ``request``\"\"\"\n        environ = request.environ\n        cookie = request.cookies.get(self.cookie_name)\n\n        if cookie is None:\n            return None\n\n        if self.include_ip:\n            remote_addr = environ['REMOTE_ADDR']\n        else:\n            remote_addr = '0.0.0.0'\n\n        try:\n            timestamp, userid, tokens, user_data = self.parse_ticket(\n                self.secret, cookie, remote_addr, self.hashalg)\n        except self.BadTicket:\n            return None\n\n        now = self.now # service tests\n\n        if now is None:\n            now = time_mod.time()\n\n        if self.timeout and ( (timestamp + self.timeout) < now ):\n            # the auth_tkt data has expired\n            return None\n\n        userid_typename = 'userid_type:'\n        user_data_info = user_data.split('|')\n        for datum in filter(None, user_data_info):\n            if datum.startswith(userid_typename):\n                userid_type = datum[len(userid_typename):]\n                decoder = self.userid_type_decoders.get(userid_type)\n                if decoder:\n                    userid = decoder(userid)\n\n        reissue = self.reissue_time is not None\n\n        if reissue and not hasattr(request, '_authtkt_reissued'):\n            if ( (now - timestamp) > self.reissue_time ):\n                # See https://github.com/Pylons/pyramid/issues#issue/108\n                tokens = list(filter(None, tokens))\n                headers = self.remember(request, userid, max_age=self.max_age,\n                                        tokens=tokens)\n                def reissue_authtkt(request, response):\n                    if not hasattr(request, '_authtkt_reissue_revoked'):\n                        for k, v in headers:\n                            response.headerlist.append((k, v))\n                request.add_response_callback(reissue_authtkt)\n                request._authtkt_reissued = True\n\n        environ['REMOTE_USER_TOKENS'] = tokens\n        environ['REMOTE_USER_DATA'] = user_data\n        environ['AUTH_TYPE'] = 'cookie'\n\n        identity = {}\n        identity['timestamp'] = timestamp\n        identity['userid'] = userid\n        identity['tokens'] = tokens\n        identity['userdata'] = user_data\n        return identity\n\n    def forget(self, request):\n        \"\"\" Return a set of expires Set-Cookie headers, which will destroy\n        any existing auth_tkt cookie when attached to a response\"\"\"\n        request._authtkt_reissue_revoked = True\n        return self._get_cookies(request, None)\n\n    def remember(self, request, userid, max_age=None, tokens=()):\n        \"\"\" Return a set of Set-Cookie headers; when set into a response,\n        these headers will represent a valid authentication ticket.\n\n        ``max_age``\n          The max age of the auth_tkt cookie, in seconds.  When this value is\n          set, the cookie's ``Max-Age`` and ``Expires`` settings will be set,\n          allowing the auth_tkt cookie to last between browser sessions.  If\n          this value is ``None``, the ``max_age`` value provided to the\n          helper itself will be used as the ``max_age`` value.  Default:\n          ``None``.\n\n        ``tokens``\n          A sequence of strings that will be placed into the auth_tkt tokens\n          field.  Each string in the sequence must be of the Python ``str``\n          type and must match the regex ``^[A-Za-z][A-Za-z0-9+_-]*$``.\n          Tokens are available in the returned identity when an auth_tkt is\n          found in the request and unpacked.  Default: ``()``.\n        \"\"\"\n        max_age = self.max_age if max_age is None else int(max_age)\n\n        environ = request.environ\n\n        if self.include_ip:\n            remote_addr = environ['REMOTE_ADDR']\n        else:\n            remote_addr = '0.0.0.0'\n\n        user_data = ''\n\n        encoding_data = self.userid_type_encoders.get(type(userid))\n\n        if encoding_data:\n            encoding, encoder = encoding_data\n            userid = encoder(userid)\n            user_data = 'userid_type:%s' % encoding\n\n        new_tokens = []\n        for token in tokens:\n            if isinstance(token, text_type):\n                try:\n                    token = ascii_native_(token)\n                except UnicodeEncodeError:\n                    raise ValueError(\"Invalid token %r\" % (token,))\n            if not (isinstance(token, str) and VALID_TOKEN.match(token)):\n                raise ValueError(\"Invalid token %r\" % (token,))\n            new_tokens.append(token)\n        tokens = tuple(new_tokens)\n\n        if hasattr(request, '_authtkt_reissued'):\n            request._authtkt_reissue_revoked = True\n\n        ticket = self.AuthTicket(\n            self.secret,\n            userid,\n            remote_addr,\n            tokens=tokens,\n            user_data=user_data,\n            cookie_name=self.cookie_name,\n            secure=self.secure,\n            hashalg=self.hashalg\n            )\n\n        cookie_value = ticket.cookie_value()\n        return self._get_cookies(request, cookie_value, max_age)\n\n@implementer(IAuthenticationPolicy)\nclass SessionAuthenticationPolicy(CallbackAuthenticationPolicy):\n    \"\"\" A :app:`Pyramid` authentication policy which gets its data from the\n    configured :term:`session`.  For this authentication policy to work, you\n    will have to follow the instructions in the :ref:`sessions_chapter` to\n    configure a :term:`session factory`.\n\n    Constructor Arguments\n\n    ``prefix``\n\n       A prefix used when storing the authentication parameters in the\n       session. Defaults to 'auth.'. Optional.\n\n    ``callback``\n\n       Default: ``None``.  A callback passed the userid and the\n       request, expected to return ``None`` if the userid doesn't\n       exist or a sequence of principal identifiers (possibly empty) if\n       the user does exist.  If ``callback`` is ``None``, the userid\n       will be assumed to exist with no principals.  Optional.\n\n    ``debug``\n\n        Default: ``False``.  If ``debug`` is ``True``, log messages to the\n        Pyramid debug logger about the results of various authentication\n        steps.  The output from debugging is useful for reporting to maillist\n        or IRC channels when asking for support.\n\n    \"\"\"\n\n    def __init__(self, prefix='auth.', callback=None, debug=False):\n        self.callback = callback\n        self.prefix = prefix or ''\n        self.userid_key = prefix + 'userid'\n        self.debug = debug\n\n    def remember(self, request, userid, **kw):\n        \"\"\" Store a userid in the session.\"\"\"\n        request.session[self.userid_key] = userid\n        return []\n\n    def forget(self, request):\n        \"\"\" Remove the stored userid from the session.\"\"\"\n        if self.userid_key in request.session:\n            del request.session[self.userid_key]\n        return []\n\n    def 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, userid, **kw):\n        \"\"\" A no-op. Basic authentication does not provide a protocol for\n        remembering the user. Credentials are sent on every request.\n\n        \"\"\"\n        return []\n\n    def forget(self, request):\n        \"\"\" Returns challenge headers. This should be attached to a response\n        to indicate that credentials are required.\"\"\"\n        return [('WWW-Authenticate', 'Basic realm=\"%s\"' % self.realm)]\n\n    def callback(self, username, request):\n        # Username arg is ignored.  Unfortunately _get_credentials winds up\n        # getting called twice when authenticated_userid is called.  Avoiding\n        # that, however, winds up duplicating logic from the superclass.\n        credentials = self._get_credentials(request)\n        if credentials:\n            username, password = credentials\n            return self.check(username, password, request)\n\n    def _get_credentials(self, request):\n        authorization = request.headers.get('Authorization')\n        if not authorization:\n            return None\n        try:\n            authmeth, auth = authorization.split(' ', 1)\n        except ValueError: # not enough values to unpack\n            return None\n        if authmeth.lower() != 'basic':\n            return None\n\n        try:\n            authbytes = b64decode(auth.strip())\n        except (TypeError, binascii.Error): # can't decode\n            return None\n\n        # try utf-8 first, then latin-1; see discussion in\n        # https://github.com/Pylons/pyramid/issues/898\n        try:\n            auth = authbytes.decode('utf-8')\n        except UnicodeDecodeError:\n            auth = authbytes.decode('latin-1')\n\n        try:\n            username, password = auth.split(':', 1)\n        except ValueError: # not enough values to unpack\n            return None\n        return username, password\n\nclass _SimpleSerializer(object):\n    def loads(self, bstruct):\n        return native_(bstruct)\n\n    def dumps(self, appstruct):\n        return bytes_(appstruct)\n",
            "header": {
                "file": {
                    "path": "pyramid/authentication.py"
                },
                "misc_line": null
            },
            "index_line": {
                "old_commit_hash": "0924b5901",
                "new_commit_hash": "9bf1de62e",
                "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": 855,
                            "length": 9
                        },
                        "new_range": {
                            "start": 855,
                            "length": 9
                        },
                        "section": "class AuthTktCookieHelper(object):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "        self.cookie_name = cookie_name",
                                "type": "context"
                            },
                            {
                                "content": "        self.secure = secure",
                                "type": "context"
                            },
                            {
                                "content": "        self.include_ip = include_ip",
                                "type": "context"
                            },
                            {
                                "content": "        self.timeout = timeout",
                                "type": "deleted"
                            },
                            {
                                "content": "        self.reissue_time = reissue_time",
                                "type": "deleted"
                            },
                            {
                                "content": "        self.max_age = max_age",
                                "type": "deleted"
                            },
                            {
                                "content": "        self.timeout = timeout if timeout is None else int(timeout)",
                                "type": "added"
                            },
                            {
                                "content": "        self.reissue_time = reissue_time if reissue_time is None else int(reissue_time)",
                                "type": "added"
                            },
                            {
                                "content": "        self.max_age = max_age if max_age is None else int(max_age)",
                                "type": "added"
                            },
                            {
                                "content": "        self.wild_domain = wild_domain",
                                "type": "context"
                            },
                            {
                                "content": "        self.parent_domain = parent_domain",
                                "type": "context"
                            },
                            {
                                "content": "        self.domain = domain",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [
                        {
                            "file_name": "pyramid/authentication.py",
                            "type": "class",
                            "name": "AuthTktCookieHelper",
                            "content": "class AuthTktCookieHelper(object):\n    \"\"\"\n    A helper class for use in third-party authentication policy\n    implementations.  See\n    :class:`pyramid.authentication.AuthTktAuthenticationPolicy` for the\n    meanings of the constructor arguments.\n    \"\"\"\n    parse_ticket = staticmethod(parse_ticket) # for tests\n    AuthTicket = AuthTicket # for tests\n    BadTicket = BadTicket # for tests\n    now = None # for tests\n\n    userid_type_decoders = {\n        'int':int,\n        'unicode':lambda x: utf_8_decode(x)[0], # bw compat for old cookies\n        'b64unicode': lambda x: utf_8_decode(b64decode(x))[0],\n        'b64str': lambda x: b64decode(x),\n        }\n\n    userid_type_encoders = {\n        int: ('int', str),\n        long: ('int', str),\n        text_type: ('b64unicode', lambda x: b64encode(utf_8_encode(x)[0])),\n        binary_type: ('b64str', lambda x: b64encode(x)),\n        }\n\n    def __init__(self, secret, cookie_name='auth_tkt', secure=False,\n                 include_ip=False, timeout=None, reissue_time=None,\n                 max_age=None, http_only=False, path=\"/\", wild_domain=True,\n                 hashalg='md5', parent_domain=False, domain=None):\n\n        serializer = _SimpleSerializer()\n\n        self.cookie_profile = CookieProfile(\n            cookie_name=cookie_name,\n            secure=secure,\n            max_age=max_age,\n            httponly=http_only,\n            path=path,\n            serializer=serializer\n        )\n\n        self.secret = secret\n        self.cookie_name = cookie_name\n        self.secure = secure\n        self.include_ip = include_ip\n        self.timeout = timeout\n        self.reissue_time = reissue_time\n        self.max_age = max_age\n        self.wild_domain = wild_domain\n        self.parent_domain = parent_domain\n        self.domain = domain\n        self.hashalg = hashalg\n\n    def _get_cookies(self, request, value, max_age=None):\n        cur_domain = request.domain\n\n        domains = []\n        if self.domain:\n            domains.append(self.domain)\n        else:\n            if self.parent_domain and cur_domain.count('.') > 1:\n                domains.append('.' + cur_domain.split('.', 1)[1])\n            else:\n                domains.append(None)\n                domains.append(cur_domain)\n                if self.wild_domain:\n                    domains.append('.' + cur_domain)\n\n        profile = self.cookie_profile(request)\n\n        kw = {}\n        kw['domains'] = domains\n        if max_age is not None:\n            kw['max_age'] = max_age\n\n        headers = profile.get_headers(value, **kw)\n        return headers\n\n    def identify(self, request):\n        \"\"\" Return a dictionary with authentication information, or ``None``\n        if no valid auth_tkt is attached to ``request``\"\"\"\n        environ = request.environ\n        cookie = request.cookies.get(self.cookie_name)\n\n        if cookie is None:\n            return None\n\n        if self.include_ip:\n            remote_addr = environ['REMOTE_ADDR']\n        else:\n            remote_addr = '0.0.0.0'\n\n        try:\n            timestamp, userid, tokens, user_data = self.parse_ticket(\n                self.secret, cookie, remote_addr, self.hashalg)\n        except self.BadTicket:\n            return None\n\n        now = self.now # service tests\n\n        if now is None:\n            now = time_mod.time()\n\n        if self.timeout and ( (timestamp + self.timeout) < now ):\n            # the auth_tkt data has expired\n            return None\n\n        userid_typename = 'userid_type:'\n        user_data_info = user_data.split('|')\n        for datum in filter(None, user_data_info):\n            if datum.startswith(userid_typename):\n                userid_type = datum[len(userid_typename):]\n                decoder = self.userid_type_decoders.get(userid_type)\n                if decoder:\n                    userid = decoder(userid)\n\n        reissue = self.reissue_time is not None\n\n        if reissue and not hasattr(request, '_authtkt_reissued'):\n            if ( (now - timestamp) > self.reissue_time ):\n                # See https://github.com/Pylons/pyramid/issues#issue/108\n                tokens = list(filter(None, tokens))\n                headers = self.remember(request, userid, max_age=self.max_age,\n                                        tokens=tokens)\n                def reissue_authtkt(request, response):\n                    if not hasattr(request, '_authtkt_reissue_revoked'):\n                        for k, v in headers:\n                            response.headerlist.append((k, v))\n                request.add_response_callback(reissue_authtkt)\n                request._authtkt_reissued = True\n\n        environ['REMOTE_USER_TOKENS'] = tokens\n        environ['REMOTE_USER_DATA'] = user_data\n        environ['AUTH_TYPE'] = 'cookie'\n\n        identity = {}\n        identity['timestamp'] = timestamp\n        identity['userid'] = userid\n        identity['tokens'] = tokens\n        identity['userdata'] = user_data\n        return identity\n\n    def forget(self, request):\n        \"\"\" Return a set of expires Set-Cookie headers, which will destroy\n        any existing auth_tkt cookie when attached to a response\"\"\"\n        request._authtkt_reissue_revoked = True\n        return self._get_cookies(request, None)\n\n    def remember(self, request, userid, max_age=None, tokens=()):\n        \"\"\" Return a set of Set-Cookie headers; when set into a response,\n        these headers will represent a valid authentication ticket.\n\n        ``max_age``\n          The max age of the auth_tkt cookie, in seconds.  When this value is\n          set, the cookie's ``Max-Age`` and ``Expires`` settings will be set,\n          allowing the auth_tkt cookie to last between browser sessions.  If\n          this value is ``None``, the ``max_age`` value provided to the\n          helper itself will be used as the ``max_age`` value.  Default:\n          ``None``.\n\n        ``tokens``\n          A sequence of strings that will be placed into the auth_tkt tokens\n          field.  Each string in the sequence must be of the Python ``str``\n          type and must match the regex ``^[A-Za-z][A-Za-z0-9+_-]*$``.\n          Tokens are available in the returned identity when an auth_tkt is\n          found in the request and unpacked.  Default: ``()``.\n        \"\"\"\n        if max_age is None:\n            max_age = self.max_age\n\n        environ = request.environ\n\n        if self.include_ip:\n            remote_addr = environ['REMOTE_ADDR']\n        else:\n            remote_addr = '0.0.0.0'\n\n        user_data = ''\n\n        encoding_data = self.userid_type_encoders.get(type(userid))\n\n        if encoding_data:\n            encoding, encoder = encoding_data\n            userid = encoder(userid)\n            user_data = 'userid_type:%s' % encoding\n\n        new_tokens = []\n        for token in tokens:\n            if isinstance(token, text_type):\n                try:\n                    token = ascii_native_(token)\n                except UnicodeEncodeError:\n                    raise ValueError(\"Invalid token %r\" % (token,))\n            if not (isinstance(token, str) and VALID_TOKEN.match(token)):\n                raise ValueError(\"Invalid token %r\" % (token,))\n            new_tokens.append(token)\n        tokens = tuple(new_tokens)\n\n        if hasattr(request, '_authtkt_reissued'):\n            request._authtkt_reissue_revoked = True\n\n        ticket = self.AuthTicket(\n            self.secret,\n            userid,\n            remote_addr,\n            tokens=tokens,\n            user_data=user_data,\n            cookie_name=self.cookie_name,\n            secure=self.secure,\n            hashalg=self.hashalg\n            )\n\n        cookie_value = ticket.cookie_value()\n        return self._get_cookies(request, cookie_value, max_age)",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 812,
                            "end_lineno": 1026,
                            "parent": null
                        },
                        {
                            "file_name": "pyramid/authentication.py",
                            "type": "method",
                            "name": "AuthTktCookieHelper.__init__",
                            "content": "class AuthTktCookieHelper(object):\n    \"\"\"\n    A helper class for use in third-party authentication policy\n    implementations.  See\n    :class:`pyramid.authentication.AuthTktAuthenticationPolicy` for the\n    meanings of the constructor arguments.\n    \"\"\"\n    parse_ticket = staticmethod(parse_ticket) # for tests\n    AuthTicket = AuthTicket # for tests\n    BadTicket = BadTicket # for tests\n    now = None # for tests\n\n    userid_type_decoders = {\n        'int':int,\n        'unicode':lambda x: utf_8_decode(x)[0], # bw compat for old cookies\n        'b64unicode': lambda x: utf_8_decode(b64decode(x))[0],\n        'b64str': lambda x: b64decode(x),\n        }\n\n    userid_type_encoders = {\n        int: ('int', str),\n        long: ('int', str),\n        text_type: ('b64unicode', lambda x: b64encode(utf_8_encode(x)[0])),\n        binary_type: ('b64str', lambda x: b64encode(x)),\n        }\n\n    def __init__(self, secret, cookie_name='auth_tkt', secure=False,\n                 include_ip=False, timeout=None, reissue_time=None,\n                 max_age=None, http_only=False, path=\"/\", wild_domain=True,\n                 hashalg='md5', parent_domain=False, domain=None):\n\n        serializer = _SimpleSerializer()\n\n        self.cookie_profile = CookieProfile(\n            cookie_name=cookie_name,\n            secure=secure,\n            max_age=max_age,\n            httponly=http_only,\n            path=path,\n            serializer=serializer\n        )\n\n        self.secret = secret\n        self.cookie_name = cookie_name\n        self.secure = secure\n        self.include_ip = include_ip\n        self.timeout = timeout\n        self.reissue_time = reissue_time\n        self.max_age = max_age\n        self.wild_domain = wild_domain\n        self.parent_domain = parent_domain\n        self.domain = domain\n        self.hashalg = hashalg\n\n    def _get_cookies(self, request, value, max_age=None):\n        cur_domain = request.domain\n\n        domains = []\n        if self.domain:\n            domains.append(self.domain)\n        else:\n            if self.parent_domain and cur_domain.count('.') > 1:\n                domains.append('.' + cur_domain.split('.', 1)[1])\n            else:\n                domains.append(None)\n                domains.append(cur_domain)\n                if self.wild_domain:\n                    domains.append('.' + cur_domain)\n\n        profile = self.cookie_profile(request)\n\n        kw = {}\n        kw['domains'] = domains\n        if max_age is not None:\n            kw['max_age'] = max_age\n\n        headers = profile.get_headers(value, **kw)\n        return headers\n\n    def identify(self, request):\n        \"\"\" Return a dictionary with authentication information, or ``None``\n        if no valid auth_tkt is attached to ``request``\"\"\"\n        environ = request.environ\n        cookie = request.cookies.get(self.cookie_name)\n\n        if cookie is None:\n            return None\n\n        if self.include_ip:\n            remote_addr = environ['REMOTE_ADDR']\n        else:\n            remote_addr = '0.0.0.0'\n\n        try:\n            timestamp, userid, tokens, user_data = self.parse_ticket(\n                self.secret, cookie, remote_addr, self.hashalg)\n        except self.BadTicket:\n            return None\n\n        now = self.now # service tests\n\n        if now is None:\n            now = time_mod.time()\n\n        if self.timeout and ( (timestamp + self.timeout) < now ):\n            # the auth_tkt data has expired\n            return None\n\n        userid_typename = 'userid_type:'\n        user_data_info = user_data.split('|')\n        for datum in filter(None, user_data_info):\n            if datum.startswith(userid_typename):\n                userid_type = datum[len(userid_typename):]\n                decoder = self.userid_type_decoders.get(userid_type)\n                if decoder:\n                    userid = decoder(userid)\n\n        reissue = self.reissue_time is not None\n\n        if reissue and not hasattr(request, '_authtkt_reissued'):\n            if ( (now - timestamp) > self.reissue_time ):\n                # See https://github.com/Pylons/pyramid/issues#issue/108\n                tokens = list(filter(None, tokens))\n                headers = self.remember(request, userid, max_age=self.max_age,\n                                        tokens=tokens)\n                def reissue_authtkt(request, response):\n                    if not hasattr(request, '_authtkt_reissue_revoked'):\n                        for k, v in headers:\n                            response.headerlist.append((k, v))\n                request.add_response_callback(reissue_authtkt)\n                request._authtkt_reissued = True\n\n        environ['REMOTE_USER_TOKENS'] = tokens\n        environ['REMOTE_USER_DATA'] = user_data\n        environ['AUTH_TYPE'] = 'cookie'\n\n        identity = {}\n        identity['timestamp'] = timestamp\n        identity['userid'] = userid\n        identity['tokens'] = tokens\n        identity['userdata'] = user_data\n        return identity\n\n    def forget(self, request):\n        \"\"\" Return a set of expires Set-Cookie headers, which will destroy\n        any existing auth_tkt cookie when attached to a response\"\"\"\n        request._authtkt_reissue_revoked = True\n        return self._get_cookies(request, None)\n\n    def remember(self, request, userid, max_age=None, tokens=()):\n        \"\"\" Return a set of Set-Cookie headers; when set into a response,\n        these headers will represent a valid authentication ticket.\n\n        ``max_age``\n          The max age of the auth_tkt cookie, in seconds.  When this value is\n          set, the cookie's ``Max-Age`` and ``Expires`` settings will be set,\n          allowing the auth_tkt cookie to last between browser sessions.  If\n          this value is ``None``, the ``max_age`` value provided to the\n          helper itself will be used as the ``max_age`` value.  Default:\n          ``None``.\n\n        ``tokens``\n          A sequence of strings that will be placed into the auth_tkt tokens\n          field.  Each string in the sequence must be of the Python ``str``\n          type and must match the regex ``^[A-Za-z][A-Za-z0-9+_-]*$``.\n          Tokens are available in the returned identity when an auth_tkt is\n          found in the request and unpacked.  Default: ``()``.\n        \"\"\"\n        if max_age is None:\n            max_age = self.max_age\n\n        environ = request.environ\n\n        if self.include_ip:\n            remote_addr = environ['REMOTE_ADDR']\n        else:\n            remote_addr = '0.0.0.0'\n\n        user_data = ''\n\n        encoding_data = self.userid_type_encoders.get(type(userid))\n\n        if encoding_data:\n            encoding, encoder = encoding_data\n            userid = encoder(userid)\n            user_data = 'userid_type:%s' % encoding\n\n        new_tokens = []\n        for token in tokens:\n            if isinstance(token, text_type):\n                try:\n                    token = ascii_native_(token)\n                except UnicodeEncodeError:\n                    raise ValueError(\"Invalid token %r\" % (token,))\n            if not (isinstance(token, str) and VALID_TOKEN.match(token)):\n                raise ValueError(\"Invalid token %r\" % (token,))\n            new_tokens.append(token)\n        tokens = tuple(new_tokens)\n\n        if hasattr(request, '_authtkt_reissued'):\n            request._authtkt_reissue_revoked = True\n\n        ticket = self.AuthTicket(\n            self.secret,\n            userid,\n            remote_addr,\n            tokens=tokens,\n            user_data=user_data,\n            cookie_name=self.cookie_name,\n            secure=self.secure,\n            hashalg=self.hashalg\n            )\n\n        cookie_value = ticket.cookie_value()\n        return self._get_cookies(request, cookie_value, max_age)",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 838,
                            "end_lineno": 864,
                            "parent": {
                                "file_name": "pyramid/authentication.py",
                                "type": "class",
                                "name": "AuthTktCookieHelper",
                                "content": "class AuthTktCookieHelper(object):\n    \"\"\"\n    A helper class for use in third-party authentication policy\n    implementations.  See\n    :class:`pyramid.authentication.AuthTktAuthenticationPolicy` for the\n    meanings of the constructor arguments.\n    \"\"\"\n    parse_ticket = staticmethod(parse_ticket) # for tests\n    AuthTicket = AuthTicket # for tests\n    BadTicket = BadTicket # for tests\n    now = None # for tests\n\n    userid_type_decoders = {\n        'int':int,\n        'unicode':lambda x: utf_8_decode(x)[0], # bw compat for old cookies\n        'b64unicode': lambda x: utf_8_decode(b64decode(x))[0],\n        'b64str': lambda x: b64decode(x),\n        }\n\n    userid_type_encoders = {\n        int: ('int', str),\n        long: ('int', str),\n        text_type: ('b64unicode', lambda x: b64encode(utf_8_encode(x)[0])),\n        binary_type: ('b64str', lambda x: b64encode(x)),\n        }\n\n    def __init__(self, secret, cookie_name='auth_tkt', secure=False,\n                 include_ip=False, timeout=None, reissue_time=None,\n                 max_age=None, http_only=False, path=\"/\", wild_domain=True,\n                 hashalg='md5', parent_domain=False, domain=None):\n\n        serializer = _SimpleSerializer()\n\n        self.cookie_profile = CookieProfile(\n            cookie_name=cookie_name,\n            secure=secure,\n            max_age=max_age,\n            httponly=http_only,\n            path=path,\n            serializer=serializer\n        )\n\n        self.secret = secret\n        self.cookie_name = cookie_name\n        self.secure = secure\n        self.include_ip = include_ip\n        self.timeout = timeout\n        self.reissue_time = reissue_time\n        self.max_age = max_age\n        self.wild_domain = wild_domain\n        self.parent_domain = parent_domain\n        self.domain = domain\n        self.hashalg = hashalg\n\n    def _get_cookies(self, request, value, max_age=None):\n        cur_domain = request.domain\n\n        domains = []\n        if self.domain:\n            domains.append(self.domain)\n        else:\n            if self.parent_domain and cur_domain.count('.') > 1:\n                domains.append('.' + cur_domain.split('.', 1)[1])\n            else:\n                domains.append(None)\n                domains.append(cur_domain)\n                if self.wild_domain:\n                    domains.append('.' + cur_domain)\n\n        profile = self.cookie_profile(request)\n\n        kw = {}\n        kw['domains'] = domains\n        if max_age is not None:\n            kw['max_age'] = max_age\n\n        headers = profile.get_headers(value, **kw)\n        return headers\n\n    def identify(self, request):\n        \"\"\" Return a dictionary with authentication information, or ``None``\n        if no valid auth_tkt is attached to ``request``\"\"\"\n        environ = request.environ\n        cookie = request.cookies.get(self.cookie_name)\n\n        if cookie is None:\n            return None\n\n        if self.include_ip:\n            remote_addr = environ['REMOTE_ADDR']\n        else:\n            remote_addr = '0.0.0.0'\n\n        try:\n            timestamp, userid, tokens, user_data = self.parse_ticket(\n                self.secret, cookie, remote_addr, self.hashalg)\n        except self.BadTicket:\n            return None\n\n        now = self.now # service tests\n\n        if now is None:\n            now = time_mod.time()\n\n        if self.timeout and ( (timestamp + self.timeout) < now ):\n            # the auth_tkt data has expired\n            return None\n\n        userid_typename = 'userid_type:'\n        user_data_info = user_data.split('|')\n        for datum in filter(None, user_data_info):\n            if datum.startswith(userid_typename):\n                userid_type = datum[len(userid_typename):]\n                decoder = self.userid_type_decoders.get(userid_type)\n                if decoder:\n                    userid = decoder(userid)\n\n        reissue = self.reissue_time is not None\n\n        if reissue and not hasattr(request, '_authtkt_reissued'):\n            if ( (now - timestamp) > self.reissue_time ):\n                # See https://github.com/Pylons/pyramid/issues#issue/108\n                tokens = list(filter(None, tokens))\n                headers = self.remember(request, userid, max_age=self.max_age,\n                                        tokens=tokens)\n                def reissue_authtkt(request, response):\n                    if not hasattr(request, '_authtkt_reissue_revoked'):\n                        for k, v in headers:\n                            response.headerlist.append((k, v))\n                request.add_response_callback(reissue_authtkt)\n                request._authtkt_reissued = True\n\n        environ['REMOTE_USER_TOKENS'] = tokens\n        environ['REMOTE_USER_DATA'] = user_data\n        environ['AUTH_TYPE'] = 'cookie'\n\n        identity = {}\n        identity['timestamp'] = timestamp\n        identity['userid'] = userid\n        identity['tokens'] = tokens\n        identity['userdata'] = user_data\n        return identity\n\n    def forget(self, request):\n        \"\"\" Return a set of expires Set-Cookie headers, which will destroy\n        any existing auth_tkt cookie when attached to a response\"\"\"\n        request._authtkt_reissue_revoked = True\n        return self._get_cookies(request, None)\n\n    def remember(self, request, userid, max_age=None, tokens=()):\n        \"\"\" Return a set of Set-Cookie headers; when set into a response,\n        these headers will represent a valid authentication ticket.\n\n        ``max_age``\n          The max age of the auth_tkt cookie, in seconds.  When this value is\n          set, the cookie's ``Max-Age`` and ``Expires`` settings will be set,\n          allowing the auth_tkt cookie to last between browser sessions.  If\n          this value is ``None``, the ``max_age`` value provided to the\n          helper itself will be used as the ``max_age`` value.  Default:\n          ``None``.\n\n        ``tokens``\n          A sequence of strings that will be placed into the auth_tkt tokens\n          field.  Each string in the sequence must be of the Python ``str``\n          type and must match the regex ``^[A-Za-z][A-Za-z0-9+_-]*$``.\n          Tokens are available in the returned identity when an auth_tkt is\n          found in the request and unpacked.  Default: ``()``.\n        \"\"\"\n        if max_age is None:\n            max_age = self.max_age\n\n        environ = request.environ\n\n        if self.include_ip:\n            remote_addr = environ['REMOTE_ADDR']\n        else:\n            remote_addr = '0.0.0.0'\n\n        user_data = ''\n\n        encoding_data = self.userid_type_encoders.get(type(userid))\n\n        if encoding_data:\n            encoding, encoder = encoding_data\n            userid = encoder(userid)\n            user_data = 'userid_type:%s' % encoding\n\n        new_tokens = []\n        for token in tokens:\n            if isinstance(token, text_type):\n                try:\n                    token = ascii_native_(token)\n                except UnicodeEncodeError:\n                    raise ValueError(\"Invalid token %r\" % (token,))\n            if not (isinstance(token, str) and VALID_TOKEN.match(token)):\n                raise ValueError(\"Invalid token %r\" % (token,))\n            new_tokens.append(token)\n        tokens = tuple(new_tokens)\n\n        if hasattr(request, '_authtkt_reissued'):\n            request._authtkt_reissue_revoked = True\n\n        ticket = self.AuthTicket(\n            self.secret,\n            userid,\n            remote_addr,\n            tokens=tokens,\n            user_data=user_data,\n            cookie_name=self.cookie_name,\n            secure=self.secure,\n            hashalg=self.hashalg\n            )\n\n        cookie_value = ticket.cookie_value()\n        return self._get_cookies(request, cookie_value, max_age)",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 812,
                                "end_lineno": 1026,
                                "parent": null
                            }
                        }
                    ],
                    "added_entities": [],
                    "deleted_entities": []
                },
                {
                    "descriptor": {
                        "old_range": {
                            "start": 977,
                            "length": 8
                        },
                        "new_range": {
                            "start": 977,
                            "length": 7
                        },
                        "section": "class AuthTktCookieHelper(object):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "          Tokens are available in the returned identity when an auth_tkt is",
                                "type": "context"
                            },
                            {
                                "content": "          found in the request and unpacked.  Default: ``()``.",
                                "type": "context"
                            },
                            {
                                "content": "        \"\"\"",
                                "type": "context"
                            },
                            {
                                "content": "        if max_age is None:",
                                "type": "deleted"
                            },
                            {
                                "content": "            max_age = self.max_age",
                                "type": "deleted"
                            },
                            {
                                "content": "        max_age = self.max_age if max_age is None else int(max_age)",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "        environ = request.environ",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [
                        {
                            "file_name": "pyramid/authentication.py",
                            "type": "class",
                            "name": "AuthTktCookieHelper",
                            "content": "class AuthTktCookieHelper(object):\n    \"\"\"\n    A helper class for use in third-party authentication policy\n    implementations.  See\n    :class:`pyramid.authentication.AuthTktAuthenticationPolicy` for the\n    meanings of the constructor arguments.\n    \"\"\"\n    parse_ticket = staticmethod(parse_ticket) # for tests\n    AuthTicket = AuthTicket # for tests\n    BadTicket = BadTicket # for tests\n    now = None # for tests\n\n    userid_type_decoders = {\n        'int':int,\n        'unicode':lambda x: utf_8_decode(x)[0], # bw compat for old cookies\n        'b64unicode': lambda x: utf_8_decode(b64decode(x))[0],\n        'b64str': lambda x: b64decode(x),\n        }\n\n    userid_type_encoders = {\n        int: ('int', str),\n        long: ('int', str),\n        text_type: ('b64unicode', lambda x: b64encode(utf_8_encode(x)[0])),\n        binary_type: ('b64str', lambda x: b64encode(x)),\n        }\n\n    def __init__(self, secret, cookie_name='auth_tkt', secure=False,\n                 include_ip=False, timeout=None, reissue_time=None,\n                 max_age=None, http_only=False, path=\"/\", wild_domain=True,\n                 hashalg='md5', parent_domain=False, domain=None):\n\n        serializer = _SimpleSerializer()\n\n        self.cookie_profile = CookieProfile(\n            cookie_name=cookie_name,\n            secure=secure,\n            max_age=max_age,\n            httponly=http_only,\n            path=path,\n            serializer=serializer\n        )\n\n        self.secret = secret\n        self.cookie_name = cookie_name\n        self.secure = secure\n        self.include_ip = include_ip\n        self.timeout = timeout\n        self.reissue_time = reissue_time\n        self.max_age = max_age\n        self.wild_domain = wild_domain\n        self.parent_domain = parent_domain\n        self.domain = domain\n        self.hashalg = hashalg\n\n    def _get_cookies(self, request, value, max_age=None):\n        cur_domain = request.domain\n\n        domains = []\n        if self.domain:\n            domains.append(self.domain)\n        else:\n            if self.parent_domain and cur_domain.count('.') > 1:\n                domains.append('.' + cur_domain.split('.', 1)[1])\n            else:\n                domains.append(None)\n                domains.append(cur_domain)\n                if self.wild_domain:\n                    domains.append('.' + cur_domain)\n\n        profile = self.cookie_profile(request)\n\n        kw = {}\n        kw['domains'] = domains\n        if max_age is not None:\n            kw['max_age'] = max_age\n\n        headers = profile.get_headers(value, **kw)\n        return headers\n\n    def identify(self, request):\n        \"\"\" Return a dictionary with authentication information, or ``None``\n        if no valid auth_tkt is attached to ``request``\"\"\"\n        environ = request.environ\n        cookie = request.cookies.get(self.cookie_name)\n\n        if cookie is None:\n            return None\n\n        if self.include_ip:\n            remote_addr = environ['REMOTE_ADDR']\n        else:\n            remote_addr = '0.0.0.0'\n\n        try:\n            timestamp, userid, tokens, user_data = self.parse_ticket(\n                self.secret, cookie, remote_addr, self.hashalg)\n        except self.BadTicket:\n            return None\n\n        now = self.now # service tests\n\n        if now is None:\n            now = time_mod.time()\n\n        if self.timeout and ( (timestamp + self.timeout) < now ):\n            # the auth_tkt data has expired\n            return None\n\n        userid_typename = 'userid_type:'\n        user_data_info = user_data.split('|')\n        for datum in filter(None, user_data_info):\n            if datum.startswith(userid_typename):\n                userid_type = datum[len(userid_typename):]\n                decoder = self.userid_type_decoders.get(userid_type)\n                if decoder:\n                    userid = decoder(userid)\n\n        reissue = self.reissue_time is not None\n\n        if reissue and not hasattr(request, '_authtkt_reissued'):\n            if ( (now - timestamp) > self.reissue_time ):\n                # See https://github.com/Pylons/pyramid/issues#issue/108\n                tokens = list(filter(None, tokens))\n                headers = self.remember(request, userid, max_age=self.max_age,\n                                        tokens=tokens)\n                def reissue_authtkt(request, response):\n                    if not hasattr(request, '_authtkt_reissue_revoked'):\n                        for k, v in headers:\n                            response.headerlist.append((k, v))\n                request.add_response_callback(reissue_authtkt)\n                request._authtkt_reissued = True\n\n        environ['REMOTE_USER_TOKENS'] = tokens\n        environ['REMOTE_USER_DATA'] = user_data\n        environ['AUTH_TYPE'] = 'cookie'\n\n        identity = {}\n        identity['timestamp'] = timestamp\n        identity['userid'] = userid\n        identity['tokens'] = tokens\n        identity['userdata'] = user_data\n        return identity\n\n    def forget(self, request):\n        \"\"\" Return a set of expires Set-Cookie headers, which will destroy\n        any existing auth_tkt cookie when attached to a response\"\"\"\n        request._authtkt_reissue_revoked = True\n        return self._get_cookies(request, None)\n\n    def remember(self, request, userid, max_age=None, tokens=()):\n        \"\"\" Return a set of Set-Cookie headers; when set into a response,\n        these headers will represent a valid authentication ticket.\n\n        ``max_age``\n          The max age of the auth_tkt cookie, in seconds.  When this value is\n          set, the cookie's ``Max-Age`` and ``Expires`` settings will be set,\n          allowing the auth_tkt cookie to last between browser sessions.  If\n          this value is ``None``, the ``max_age`` value provided to the\n          helper itself will be used as the ``max_age`` value.  Default:\n          ``None``.\n\n        ``tokens``\n          A sequence of strings that will be placed into the auth_tkt tokens\n          field.  Each string in the sequence must be of the Python ``str``\n          type and must match the regex ``^[A-Za-z][A-Za-z0-9+_-]*$``.\n          Tokens are available in the returned identity when an auth_tkt is\n          found in the request and unpacked.  Default: ``()``.\n        \"\"\"\n        if max_age is None:\n            max_age = self.max_age\n\n        environ = request.environ\n\n        if self.include_ip:\n            remote_addr = environ['REMOTE_ADDR']\n        else:\n            remote_addr = '0.0.0.0'\n\n        user_data = ''\n\n        encoding_data = self.userid_type_encoders.get(type(userid))\n\n        if encoding_data:\n            encoding, encoder = encoding_data\n            userid = encoder(userid)\n            user_data = 'userid_type:%s' % encoding\n\n        new_tokens = []\n        for token in tokens:\n            if isinstance(token, text_type):\n                try:\n                    token = ascii_native_(token)\n                except UnicodeEncodeError:\n                    raise ValueError(\"Invalid token %r\" % (token,))\n            if not (isinstance(token, str) and VALID_TOKEN.match(token)):\n                raise ValueError(\"Invalid token %r\" % (token,))\n            new_tokens.append(token)\n        tokens = tuple(new_tokens)\n\n        if hasattr(request, '_authtkt_reissued'):\n            request._authtkt_reissue_revoked = True\n\n        ticket = self.AuthTicket(\n            self.secret,\n            userid,\n            remote_addr,\n            tokens=tokens,\n            user_data=user_data,\n            cookie_name=self.cookie_name,\n            secure=self.secure,\n            hashalg=self.hashalg\n            )\n\n        cookie_value = ticket.cookie_value()\n        return self._get_cookies(request, cookie_value, max_age)",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 812,
                            "end_lineno": 1026,
                            "parent": null
                        },
                        {
                            "file_name": "pyramid/authentication.py",
                            "type": "method",
                            "name": "AuthTktCookieHelper.remember",
                            "content": "class AuthTktCookieHelper(object):\n    \"\"\"\n    A helper class for use in third-party authentication policy\n    implementations.  See\n    :class:`pyramid.authentication.AuthTktAuthenticationPolicy` for the\n    meanings of the constructor arguments.\n    \"\"\"\n    parse_ticket = staticmethod(parse_ticket) # for tests\n    AuthTicket = AuthTicket # for tests\n    BadTicket = BadTicket # for tests\n    now = None # for tests\n\n    userid_type_decoders = {\n        'int':int,\n        'unicode':lambda x: utf_8_decode(x)[0], # bw compat for old cookies\n        'b64unicode': lambda x: utf_8_decode(b64decode(x))[0],\n        'b64str': lambda x: b64decode(x),\n        }\n\n    userid_type_encoders = {\n        int: ('int', str),\n        long: ('int', str),\n        text_type: ('b64unicode', lambda x: b64encode(utf_8_encode(x)[0])),\n        binary_type: ('b64str', lambda x: b64encode(x)),\n        }\n\n    def __init__(self, secret, cookie_name='auth_tkt', secure=False,\n                 include_ip=False, timeout=None, reissue_time=None,\n                 max_age=None, http_only=False, path=\"/\", wild_domain=True,\n                 hashalg='md5', parent_domain=False, domain=None):\n\n        serializer = _SimpleSerializer()\n\n        self.cookie_profile = CookieProfile(\n            cookie_name=cookie_name,\n            secure=secure,\n            max_age=max_age,\n            httponly=http_only,\n            path=path,\n            serializer=serializer\n        )\n\n        self.secret = secret\n        self.cookie_name = cookie_name\n        self.secure = secure\n        self.include_ip = include_ip\n        self.timeout = timeout\n        self.reissue_time = reissue_time\n        self.max_age = max_age\n        self.wild_domain = wild_domain\n        self.parent_domain = parent_domain\n        self.domain = domain\n        self.hashalg = hashalg\n\n    def _get_cookies(self, request, value, max_age=None):\n        cur_domain = request.domain\n\n        domains = []\n        if self.domain:\n            domains.append(self.domain)\n        else:\n            if self.parent_domain and cur_domain.count('.') > 1:\n                domains.append('.' + cur_domain.split('.', 1)[1])\n            else:\n                domains.append(None)\n                domains.append(cur_domain)\n                if self.wild_domain:\n                    domains.append('.' + cur_domain)\n\n        profile = self.cookie_profile(request)\n\n        kw = {}\n        kw['domains'] = domains\n        if max_age is not None:\n            kw['max_age'] = max_age\n\n        headers = profile.get_headers(value, **kw)\n        return headers\n\n    def identify(self, request):\n        \"\"\" Return a dictionary with authentication information, or ``None``\n        if no valid auth_tkt is attached to ``request``\"\"\"\n        environ = request.environ\n        cookie = request.cookies.get(self.cookie_name)\n\n        if cookie is None:\n            return None\n\n        if self.include_ip:\n            remote_addr = environ['REMOTE_ADDR']\n        else:\n            remote_addr = '0.0.0.0'\n\n        try:\n            timestamp, userid, tokens, user_data = self.parse_ticket(\n                self.secret, cookie, remote_addr, self.hashalg)\n        except self.BadTicket:\n            return None\n\n        now = self.now # service tests\n\n        if now is None:\n            now = time_mod.time()\n\n        if self.timeout and ( (timestamp + self.timeout) < now ):\n            # the auth_tkt data has expired\n            return None\n\n        userid_typename = 'userid_type:'\n        user_data_info = user_data.split('|')\n        for datum in filter(None, user_data_info):\n            if datum.startswith(userid_typename):\n                userid_type = datum[len(userid_typename):]\n                decoder = self.userid_type_decoders.get(userid_type)\n                if decoder:\n                    userid = decoder(userid)\n\n        reissue = self.reissue_time is not None\n\n        if reissue and not hasattr(request, '_authtkt_reissued'):\n            if ( (now - timestamp) > self.reissue_time ):\n                # See https://github.com/Pylons/pyramid/issues#issue/108\n                tokens = list(filter(None, tokens))\n                headers = self.remember(request, userid, max_age=self.max_age,\n                                        tokens=tokens)\n                def reissue_authtkt(request, response):\n                    if not hasattr(request, '_authtkt_reissue_revoked'):\n                        for k, v in headers:\n                            response.headerlist.append((k, v))\n                request.add_response_callback(reissue_authtkt)\n                request._authtkt_reissued = True\n\n        environ['REMOTE_USER_TOKENS'] = tokens\n        environ['REMOTE_USER_DATA'] = user_data\n        environ['AUTH_TYPE'] = 'cookie'\n\n        identity = {}\n        identity['timestamp'] = timestamp\n        identity['userid'] = userid\n        identity['tokens'] = tokens\n        identity['userdata'] = user_data\n        return identity\n\n    def forget(self, request):\n        \"\"\" Return a set of expires Set-Cookie headers, which will destroy\n        any existing auth_tkt cookie when attached to a response\"\"\"\n        request._authtkt_reissue_revoked = True\n        return self._get_cookies(request, None)\n\n    def remember(self, request, userid, max_age=None, tokens=()):\n        \"\"\" Return a set of Set-Cookie headers; when set into a response,\n        these headers will represent a valid authentication ticket.\n\n        ``max_age``\n          The max age of the auth_tkt cookie, in seconds.  When this value is\n          set, the cookie's ``Max-Age`` and ``Expires`` settings will be set,\n          allowing the auth_tkt cookie to last between browser sessions.  If\n          this value is ``None``, the ``max_age`` value provided to the\n          helper itself will be used as the ``max_age`` value.  Default:\n          ``None``.\n\n        ``tokens``\n          A sequence of strings that will be placed into the auth_tkt tokens\n          field.  Each string in the sequence must be of the Python ``str``\n          type and must match the regex ``^[A-Za-z][A-Za-z0-9+_-]*$``.\n          Tokens are available in the returned identity when an auth_tkt is\n          found in the request and unpacked.  Default: ``()``.\n        \"\"\"\n        if max_age is None:\n            max_age = self.max_age\n\n        environ = request.environ\n\n        if self.include_ip:\n            remote_addr = environ['REMOTE_ADDR']\n        else:\n            remote_addr = '0.0.0.0'\n\n        user_data = ''\n\n        encoding_data = self.userid_type_encoders.get(type(userid))\n\n        if encoding_data:\n            encoding, encoder = encoding_data\n            userid = encoder(userid)\n            user_data = 'userid_type:%s' % encoding\n\n        new_tokens = []\n        for token in tokens:\n            if isinstance(token, text_type):\n                try:\n                    token = ascii_native_(token)\n                except UnicodeEncodeError:\n                    raise ValueError(\"Invalid token %r\" % (token,))\n            if not (isinstance(token, str) and VALID_TOKEN.match(token)):\n                raise ValueError(\"Invalid token %r\" % (token,))\n            new_tokens.append(token)\n        tokens = tuple(new_tokens)\n\n        if hasattr(request, '_authtkt_reissued'):\n            request._authtkt_reissue_revoked = True\n\n        ticket = self.AuthTicket(\n            self.secret,\n            userid,\n            remote_addr,\n            tokens=tokens,\n            user_data=user_data,\n            cookie_name=self.cookie_name,\n            secure=self.secure,\n            hashalg=self.hashalg\n            )\n\n        cookie_value = ticket.cookie_value()\n        return self._get_cookies(request, cookie_value, max_age)",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 961,
                            "end_lineno": 1026,
                            "parent": {
                                "file_name": "pyramid/authentication.py",
                                "type": "class",
                                "name": "AuthTktCookieHelper",
                                "content": "class AuthTktCookieHelper(object):\n    \"\"\"\n    A helper class for use in third-party authentication policy\n    implementations.  See\n    :class:`pyramid.authentication.AuthTktAuthenticationPolicy` for the\n    meanings of the constructor arguments.\n    \"\"\"\n    parse_ticket = staticmethod(parse_ticket) # for tests\n    AuthTicket = AuthTicket # for tests\n    BadTicket = BadTicket # for tests\n    now = None # for tests\n\n    userid_type_decoders = {\n        'int':int,\n        'unicode':lambda x: utf_8_decode(x)[0], # bw compat for old cookies\n        'b64unicode': lambda x: utf_8_decode(b64decode(x))[0],\n        'b64str': lambda x: b64decode(x),\n        }\n\n    userid_type_encoders = {\n        int: ('int', str),\n        long: ('int', str),\n        text_type: ('b64unicode', lambda x: b64encode(utf_8_encode(x)[0])),\n        binary_type: ('b64str', lambda x: b64encode(x)),\n        }\n\n    def __init__(self, secret, cookie_name='auth_tkt', secure=False,\n                 include_ip=False, timeout=None, reissue_time=None,\n                 max_age=None, http_only=False, path=\"/\", wild_domain=True,\n                 hashalg='md5', parent_domain=False, domain=None):\n\n        serializer = _SimpleSerializer()\n\n        self.cookie_profile = CookieProfile(\n            cookie_name=cookie_name,\n            secure=secure,\n            max_age=max_age,\n            httponly=http_only,\n            path=path,\n            serializer=serializer\n        )\n\n        self.secret = secret\n        self.cookie_name = cookie_name\n        self.secure = secure\n        self.include_ip = include_ip\n        self.timeout = timeout\n        self.reissue_time = reissue_time\n        self.max_age = max_age\n        self.wild_domain = wild_domain\n        self.parent_domain = parent_domain\n        self.domain = domain\n        self.hashalg = hashalg\n\n    def _get_cookies(self, request, value, max_age=None):\n        cur_domain = request.domain\n\n        domains = []\n        if self.domain:\n            domains.append(self.domain)\n        else:\n            if self.parent_domain and cur_domain.count('.') > 1:\n                domains.append('.' + cur_domain.split('.', 1)[1])\n            else:\n                domains.append(None)\n                domains.append(cur_domain)\n                if self.wild_domain:\n                    domains.append('.' + cur_domain)\n\n        profile = self.cookie_profile(request)\n\n        kw = {}\n        kw['domains'] = domains\n        if max_age is not None:\n            kw['max_age'] = max_age\n\n        headers = profile.get_headers(value, **kw)\n        return headers\n\n    def identify(self, request):\n        \"\"\" Return a dictionary with authentication information, or ``None``\n        if no valid auth_tkt is attached to ``request``\"\"\"\n        environ = request.environ\n        cookie = request.cookies.get(self.cookie_name)\n\n        if cookie is None:\n            return None\n\n        if self.include_ip:\n            remote_addr = environ['REMOTE_ADDR']\n        else:\n            remote_addr = '0.0.0.0'\n\n        try:\n            timestamp, userid, tokens, user_data = self.parse_ticket(\n                self.secret, cookie, remote_addr, self.hashalg)\n        except self.BadTicket:\n            return None\n\n        now = self.now # service tests\n\n        if now is None:\n            now = time_mod.time()\n\n        if self.timeout and ( (timestamp + self.timeout) < now ):\n            # the auth_tkt data has expired\n            return None\n\n        userid_typename = 'userid_type:'\n        user_data_info = user_data.split('|')\n        for datum in filter(None, user_data_info):\n            if datum.startswith(userid_typename):\n                userid_type = datum[len(userid_typename):]\n                decoder = self.userid_type_decoders.get(userid_type)\n                if decoder:\n                    userid = decoder(userid)\n\n        reissue = self.reissue_time is not None\n\n        if reissue and not hasattr(request, '_authtkt_reissued'):\n            if ( (now - timestamp) > self.reissue_time ):\n                # See https://github.com/Pylons/pyramid/issues#issue/108\n                tokens = list(filter(None, tokens))\n                headers = self.remember(request, userid, max_age=self.max_age,\n                                        tokens=tokens)\n                def reissue_authtkt(request, response):\n                    if not hasattr(request, '_authtkt_reissue_revoked'):\n                        for k, v in headers:\n                            response.headerlist.append((k, v))\n                request.add_response_callback(reissue_authtkt)\n                request._authtkt_reissued = True\n\n        environ['REMOTE_USER_TOKENS'] = tokens\n        environ['REMOTE_USER_DATA'] = user_data\n        environ['AUTH_TYPE'] = 'cookie'\n\n        identity = {}\n        identity['timestamp'] = timestamp\n        identity['userid'] = userid\n        identity['tokens'] = tokens\n        identity['userdata'] = user_data\n        return identity\n\n    def forget(self, request):\n        \"\"\" Return a set of expires Set-Cookie headers, which will destroy\n        any existing auth_tkt cookie when attached to a response\"\"\"\n        request._authtkt_reissue_revoked = True\n        return self._get_cookies(request, None)\n\n    def remember(self, request, userid, max_age=None, tokens=()):\n        \"\"\" Return a set of Set-Cookie headers; when set into a response,\n        these headers will represent a valid authentication ticket.\n\n        ``max_age``\n          The max age of the auth_tkt cookie, in seconds.  When this value is\n          set, the cookie's ``Max-Age`` and ``Expires`` settings will be set,\n          allowing the auth_tkt cookie to last between browser sessions.  If\n          this value is ``None``, the ``max_age`` value provided to the\n          helper itself will be used as the ``max_age`` value.  Default:\n          ``None``.\n\n        ``tokens``\n          A sequence of strings that will be placed into the auth_tkt tokens\n          field.  Each string in the sequence must be of the Python ``str``\n          type and must match the regex ``^[A-Za-z][A-Za-z0-9+_-]*$``.\n          Tokens are available in the returned identity when an auth_tkt is\n          found in the request and unpacked.  Default: ``()``.\n        \"\"\"\n        if max_age is None:\n            max_age = self.max_age\n\n        environ = request.environ\n\n        if self.include_ip:\n            remote_addr = environ['REMOTE_ADDR']\n        else:\n            remote_addr = '0.0.0.0'\n\n        user_data = ''\n\n        encoding_data = self.userid_type_encoders.get(type(userid))\n\n        if encoding_data:\n            encoding, encoder = encoding_data\n            userid = encoder(userid)\n            user_data = 'userid_type:%s' % encoding\n\n        new_tokens = []\n        for token in tokens:\n            if isinstance(token, text_type):\n                try:\n                    token = ascii_native_(token)\n                except UnicodeEncodeError:\n                    raise ValueError(\"Invalid token %r\" % (token,))\n            if not (isinstance(token, str) and VALID_TOKEN.match(token)):\n                raise ValueError(\"Invalid token %r\" % (token,))\n            new_tokens.append(token)\n        tokens = tuple(new_tokens)\n\n        if hasattr(request, '_authtkt_reissued'):\n            request._authtkt_reissue_revoked = True\n\n        ticket = self.AuthTicket(\n            self.secret,\n            userid,\n            remote_addr,\n            tokens=tokens,\n            user_data=user_data,\n            cookie_name=self.cookie_name,\n            secure=self.secure,\n            hashalg=self.hashalg\n            )\n\n        cookie_value = ticket.cookie_value()\n        return self._get_cookies(request, cookie_value, max_age)",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 812,
                                "end_lineno": 1026,
                                "parent": null
                            }
                        }
                    ],
                    "added_entities": [],
                    "deleted_entities": []
                }
            ]
        },
        {
            "old_file_content": "import base64\nimport binascii\nimport hashlib\nimport hmac\nimport os\nimport time\n\nfrom zope.deprecation import deprecated\nfrom zope.interface import implementer\n\nfrom webob.cookies import SignedSerializer\n\nfrom pyramid.compat import (\n    pickle,\n    PY3,\n    text_,\n    bytes_,\n    native_,\n    )\n\nfrom pyramid.exceptions import BadCSRFToken\nfrom pyramid.interfaces import ISession\nfrom pyramid.util import strings_differ\n\ndef manage_accessed(wrapped):\n    \"\"\" Decorator which causes a cookie to be renewed when an accessor\n    method is called.\"\"\"\n    def accessed(session, *arg, **kw):\n        session.accessed = now = int(time.time())\n        if session._reissue_time is not None:\n            if now - session.renewed > session._reissue_time:\n                session.changed()\n        return wrapped(session, *arg, **kw)\n    accessed.__doc__ = wrapped.__doc__\n    return accessed\n\ndef manage_changed(wrapped):\n    \"\"\" Decorator which causes a cookie to be set when a setter method\n    is called.\"\"\"\n    def changed(session, *arg, **kw):\n        session.accessed = int(time.time())\n        session.changed()\n        return wrapped(session, *arg, **kw)\n    changed.__doc__ = wrapped.__doc__\n    return changed\n\ndef signed_serialize(data, secret):\n    \"\"\" Serialize any pickleable structure (``data``) and sign it\n    using the ``secret`` (must be a string).  Return the\n    serialization, which includes the signature as its first 40 bytes.\n    The ``signed_deserialize`` method will deserialize such a value.\n\n    This function is useful for creating signed cookies.  For example:\n\n    .. code-block:: python\n\n       cookieval = signed_serialize({'a':1}, 'secret')\n       response.set_cookie('signed_cookie', cookieval)\n    \"\"\"\n    pickled = pickle.dumps(data, pickle.HIGHEST_PROTOCOL)\n    try:\n        # bw-compat with pyramid <= 1.5b1 where latin1 is the default\n        secret = bytes_(secret)\n    except UnicodeEncodeError:\n        secret = bytes_(secret, 'utf-8')\n    sig = hmac.new(secret, pickled, hashlib.sha1).hexdigest()\n    return sig + native_(base64.b64encode(pickled))\n\ndef signed_deserialize(serialized, secret, hmac=hmac):\n    \"\"\" Deserialize the value returned from ``signed_serialize``.  If\n    the value cannot be deserialized for any reason, a\n    :exc:`ValueError` exception will be raised.\n\n    This function is useful for deserializing a signed cookie value\n    created by ``signed_serialize``.  For example:\n\n    .. code-block:: python\n\n       cookieval = request.cookies['signed_cookie']\n       data = signed_deserialize(cookieval, 'secret')\n    \"\"\"\n    # hmac parameterized only for unit tests\n    try:\n        input_sig, pickled = (bytes_(serialized[:40]),\n                              base64.b64decode(bytes_(serialized[40:])))\n    except (binascii.Error, TypeError) as e:\n        # Badly formed data can make base64 die\n        raise ValueError('Badly formed base64 data: %s' % e)\n\n    try:\n        # bw-compat with pyramid <= 1.5b1 where latin1 is the default\n        secret = bytes_(secret)\n    except UnicodeEncodeError:\n        secret = bytes_(secret, 'utf-8')\n    sig = bytes_(hmac.new(secret, pickled, hashlib.sha1).hexdigest())\n\n    # Avoid timing attacks (see\n    # http://seb.dbzteam.org/crypto/python-oauth-timing-hmac.pdf)\n    if strings_differ(sig, input_sig):\n        raise ValueError('Invalid signature')\n\n    return pickle.loads(pickled)\n\ndef check_csrf_token(request,\n                     token='csrf_token',\n                     header='X-CSRF-Token',\n                     raises=True):\n    \"\"\" Check the CSRF token in the request's session against the value in\n    ``request.params.get(token)`` or ``request.headers.get(header)``.\n    If a ``token`` keyword is not supplied to this function, the string\n    ``csrf_token`` will be used to look up the token in ``request.params``.\n    If a ``header`` keyword is not supplied to this function, the string\n    ``X-CSRF-Token`` will be used to look up the token in ``request.headers``.\n\n    If the value supplied by param or by header doesn't match the value\n    supplied by ``request.session.get_csrf_token()``, and ``raises`` is\n    ``True``, this function will raise an\n    :exc:`pyramid.exceptions.BadCSRFToken` exception.\n    If the check does succeed and ``raises`` is ``False``, this\n    function will return ``False``.  If the CSRF check is successful, this\n    function will return ``True`` unconditionally.\n\n    Note that using this function requires that a :term:`session factory` is\n    configured.\n\n    .. versionadded:: 1.4a2\n    \"\"\"\n    supplied_token = request.params.get(token, request.headers.get(header, \"\"))\n    if strings_differ(request.session.get_csrf_token(), supplied_token):\n        if raises:\n            raise BadCSRFToken('check_csrf_token(): Invalid token')\n        return False\n    return True\n\nclass PickleSerializer(object):\n    \"\"\" A Webob cookie serializer that uses the pickle protocol to dump Python\n    data to bytes.\"\"\"\n    def loads(self, bstruct):\n        return pickle.loads(bstruct)\n\n    def dumps(self, appstruct):\n        return pickle.dumps(appstruct, pickle.HIGHEST_PROTOCOL)\n\ndef BaseCookieSessionFactory(\n    serializer,\n    cookie_name='session',\n    max_age=None,\n    path='/',\n    domain=None,\n    secure=False,\n    httponly=False,\n    timeout=1200,\n    reissue_time=0,\n    set_on_exception=True,\n    ):\n    \"\"\"\n    .. versionadded:: 1.5\n    \n    Configure a :term:`session factory` which will provide cookie-based\n    sessions.  The return value of this function is a :term:`session factory`,\n    which may be provided as the ``session_factory`` argument of a\n    :class:`pyramid.config.Configurator` constructor, or used as the\n    ``session_factory`` argument of the\n    :meth:`pyramid.config.Configurator.set_session_factory` method.\n\n    The session factory returned by this function will create sessions\n    which are limited to storing fewer than 4000 bytes of data (as the\n    payload must fit into a single cookie).\n\n    .. warning:\n\n       This class provides no protection from tampering and is only intended\n       to be used by framework authors to create their own cookie-based\n       session factories.\n\n    Parameters:\n\n    ``serializer``\n      An object with two methods: ``loads`` and ``dumps``.  The ``loads``\n      method should accept bytes and return a Python object.  The ``dumps``\n      method should accept a Python object and return bytes.  A ``ValueError``\n      should be raised for malformed inputs.\n\n    ``cookie_name``\n      The name of the cookie used for sessioning. Default: ``'session'``.\n\n    ``max_age``\n      The maximum age of the cookie used for sessioning (in seconds).\n      Default: ``None`` (browser scope).\n\n    ``path``\n      The path used for the session cookie. Default: ``'/'``.\n\n    ``domain``\n      The domain used for the session cookie.  Default: ``None`` (no domain).\n\n    ``secure``\n      The 'secure' flag of the session cookie. Default: ``False``.\n\n    ``httponly``\n      Hide the cookie from Javascript by setting the 'HttpOnly' flag of the\n      session cookie. Default: ``False``.\n\n    ``timeout``\n      A number of seconds of inactivity before a session times out. If\n      ``None`` then the cookie never expires. This lifetime only applies\n      to the *value* within the cookie. Meaning that if the cookie expires\n      due to a lower ``max_age``, then this setting has no effect.\n      Default: ``1200``.\n\n    ``reissue_time``\n      The number of seconds that must pass before the cookie is automatically\n      reissued as the result of a request which accesses the session. The\n      duration is measured as the number of seconds since the last session\n      cookie was issued and 'now'.  If this value is ``0``, a new cookie\n      will be reissued on every request accessing the session. If ``None``\n      then the cookie's lifetime will never be extended.\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      However, such a configuration is not explicitly prevented.\n\n      Default: ``0``.\n\n    ``set_on_exception``\n      If ``True``, set a session cookie even if an exception occurs\n      while rendering a view. Default: ``True``.\n\n    .. versionadded: 1.5a3\n    \"\"\"\n\n    @implementer(ISession)\n    class CookieSession(dict):\n        \"\"\" Dictionary-like session object \"\"\"\n\n        # configuration parameters\n        _cookie_name = cookie_name\n        _cookie_max_age = max_age\n        _cookie_path = path\n        _cookie_domain = domain\n        _cookie_secure = secure\n        _cookie_httponly = httponly\n        _cookie_on_exception = set_on_exception\n        _timeout = timeout\n        _reissue_time = reissue_time\n\n        # dirty flag\n        _dirty = False\n\n        def __init__(self, request):\n            self.request = request\n            now = time.time()\n            created = renewed = now\n            new = True\n            value = None\n            state = {}\n            cookieval = request.cookies.get(self._cookie_name)\n            if cookieval is not None:\n                try:\n                    value = serializer.loads(bytes_(cookieval))\n                except ValueError:\n                    # the cookie failed to deserialize, dropped\n                    value = None\n\n            if value is not None:\n                try:\n                    # since the value is not necessarily signed, we have\n                    # to unpack it a little carefully\n                    rval, cval, sval = value\n                    renewed = float(rval)\n                    created = float(cval)\n                    state = sval\n                    new = False\n                except (TypeError, ValueError):\n                    # value failed to unpack properly or renewed was not\n                    # a numeric type so we'll fail deserialization here\n                    state = {}\n\n            if self._timeout is not None:\n                if now - renewed > self._timeout:\n                    # expire the session because it was not renewed\n                    # before the timeout threshold\n                    state = {}\n\n            self.created = created\n            self.accessed = renewed\n            self.renewed = renewed\n            self.new = new\n            dict.__init__(self, state)\n\n        # ISession methods\n        def changed(self):\n            if not self._dirty:\n                self._dirty = True\n                def set_cookie_callback(request, response):\n                    self._set_cookie(response)\n                    self.request = None # explicitly break cycle for gc\n                self.request.add_response_callback(set_cookie_callback)\n\n        def invalidate(self):\n            self.clear() # XXX probably needs to unset cookie\n\n        # non-modifying dictionary methods\n        get = manage_accessed(dict.get)\n        __getitem__ = manage_accessed(dict.__getitem__)\n        items = manage_accessed(dict.items)\n        values = manage_accessed(dict.values)\n        keys = manage_accessed(dict.keys)\n        __contains__ = manage_accessed(dict.__contains__)\n        __len__ = manage_accessed(dict.__len__)\n        __iter__ = manage_accessed(dict.__iter__)\n\n        if not PY3:\n            iteritems = manage_accessed(dict.iteritems)\n            itervalues = manage_accessed(dict.itervalues)\n            iterkeys = manage_accessed(dict.iterkeys)\n            has_key = manage_accessed(dict.has_key)\n\n        # modifying dictionary methods\n        clear = manage_changed(dict.clear)\n        update = manage_changed(dict.update)\n        setdefault = manage_changed(dict.setdefault)\n        pop = manage_changed(dict.pop)\n        popitem = manage_changed(dict.popitem)\n        __setitem__ = manage_changed(dict.__setitem__)\n        __delitem__ = manage_changed(dict.__delitem__)\n\n        # flash API methods\n        @manage_changed\n        def flash(self, msg, queue='', allow_duplicate=True):\n            storage = self.setdefault('_f_' + queue, [])\n            if allow_duplicate or (msg not in storage):\n                storage.append(msg)\n\n        @manage_changed\n        def pop_flash(self, queue=''):\n            storage = self.pop('_f_' + queue, [])\n            return storage\n\n        @manage_accessed\n        def peek_flash(self, queue=''):\n            storage = self.get('_f_' + queue, [])\n            return storage\n\n        # CSRF API methods\n        @manage_changed\n        def new_csrf_token(self):\n            token = text_(binascii.hexlify(os.urandom(20)))\n            self['_csrft_'] = token\n            return token\n\n        @manage_accessed\n        def get_csrf_token(self):\n            token = self.get('_csrft_', None)\n            if token is None:\n                token = self.new_csrf_token()\n            return token\n\n        # non-API methods\n        def _set_cookie(self, response):\n            if not self._cookie_on_exception:\n                exception = getattr(self.request, 'exception', None)\n                if exception is not None: # dont set a cookie during exceptions\n                    return False\n            cookieval = native_(serializer.dumps(\n                (self.accessed, self.created, dict(self))\n                ))\n            if len(cookieval) > 4064:\n                raise ValueError(\n                    'Cookie value is too long to store (%s bytes)' %\n                    len(cookieval)\n                    )\n            response.set_cookie(\n                self._cookie_name,\n                value=cookieval,\n                max_age=self._cookie_max_age,\n                path=self._cookie_path,\n                domain=self._cookie_domain,\n                secure=self._cookie_secure,\n                httponly=self._cookie_httponly,\n                )\n            return True\n\n    return CookieSession\n\n\ndef UnencryptedCookieSessionFactoryConfig(\n    secret,\n    timeout=1200,\n    cookie_name='session',\n    cookie_max_age=None,\n    cookie_path='/',\n    cookie_domain=None,\n    cookie_secure=False,\n    cookie_httponly=False,\n    cookie_on_exception=True,\n    signed_serialize=signed_serialize,\n    signed_deserialize=signed_deserialize,\n    ):\n    \"\"\"\n    .. deprecated:: 1.5\n        Use :func:`pyramid.session.SignedCookieSessionFactory` instead.\n        Caveat: Cookies generated using ``SignedCookieSessionFactory`` are not\n        compatible with cookies generated using\n        ``UnencryptedCookieSessionFactory``, so existing user session data\n        will be destroyed if you switch to it.\n    \n    Configure a :term:`session factory` which will provide unencrypted\n    (but signed) cookie-based sessions.  The return value of this\n    function is a :term:`session factory`, which may be provided as\n    the ``session_factory`` argument of a\n    :class:`pyramid.config.Configurator` constructor, or used\n    as the ``session_factory`` argument of the\n    :meth:`pyramid.config.Configurator.set_session_factory`\n    method.\n\n    The session factory returned by this function will create sessions\n    which are limited to storing fewer than 4000 bytes of data (as the\n    payload must fit into a single cookie).\n\n    Parameters:\n\n    ``secret``\n      A string which is used to sign the cookie.\n\n    ``timeout``\n      A number of seconds of inactivity before a session times out.\n\n    ``cookie_name``\n      The name of the cookie used for sessioning.\n\n    ``cookie_max_age``\n      The maximum age of the cookie used for sessioning (in seconds).\n      Default: ``None`` (browser scope).\n\n    ``cookie_path``\n      The path used for the session cookie.\n\n    ``cookie_domain``\n      The domain used for the session cookie.  Default: ``None`` (no domain).\n\n    ``cookie_secure``\n      The 'secure' flag of the session cookie.\n\n    ``cookie_httponly``\n      The 'httpOnly' flag of the session cookie.\n\n    ``cookie_on_exception``\n      If ``True``, set a session cookie even if an exception occurs\n      while rendering a view.\n\n    ``signed_serialize``\n      A callable which takes more or less arbitrary Python data structure and\n      a secret and returns a signed serialization in bytes.\n      Default: ``signed_serialize`` (using pickle).\n\n    ``signed_deserialize``\n      A callable which takes a signed and serialized data structure in bytes\n      and a secret and returns the original data structure if the signature\n      is valid. Default: ``signed_deserialize`` (using pickle).\n    \"\"\"\n\n    class SerializerWrapper(object):\n        def __init__(self, secret):\n            self.secret = secret\n            \n        def loads(self, bstruct):\n            return signed_deserialize(bstruct, secret)\n\n        def dumps(self, appstruct):\n            return signed_serialize(appstruct, secret)\n\n    serializer = SerializerWrapper(secret)\n\n    return BaseCookieSessionFactory(\n        serializer,\n        cookie_name=cookie_name,\n        max_age=cookie_max_age,\n        path=cookie_path,\n        domain=cookie_domain,\n        secure=cookie_secure,\n        httponly=cookie_httponly,\n        timeout=timeout,\n        reissue_time=0, # to keep session.accessed == session.renewed\n        set_on_exception=cookie_on_exception,\n    )\n\ndeprecated(\n    'UnencryptedCookieSessionFactoryConfig',\n    'The UnencryptedCookieSessionFactoryConfig callable is deprecated as of '\n    'Pyramid 1.5.  Use ``pyramid.session.SignedCookieSessionFactory`` instead.'\n    ' Caveat: Cookies generated using SignedCookieSessionFactory are not '\n    'compatible with cookies generated using UnencryptedCookieSessionFactory, '\n    'so existing user session data will be destroyed if you switch to it.'\n    )\n\ndef SignedCookieSessionFactory(\n    secret,\n    cookie_name='session',\n    max_age=None,\n    path='/',\n    domain=None,\n    secure=False,\n    httponly=False,\n    set_on_exception=True,\n    timeout=1200,\n    reissue_time=0,\n    hashalg='sha512',\n    salt='pyramid.session.',\n    serializer=None,\n    ):\n    \"\"\"\n    .. versionadded:: 1.5\n    \n    Configure a :term:`session factory` which will provide signed\n    cookie-based sessions.  The return value of this\n    function is a :term:`session factory`, which may be provided as\n    the ``session_factory`` argument of a\n    :class:`pyramid.config.Configurator` constructor, or used\n    as the ``session_factory`` argument of the\n    :meth:`pyramid.config.Configurator.set_session_factory`\n    method.\n\n    The session factory returned by this function will create sessions\n    which are limited to storing fewer than 4000 bytes of data (as the\n    payload must fit into a single cookie).\n\n    Parameters:\n\n    ``secret``\n      A string which is used to sign the cookie. The secret should be at\n      least as long as the block size of the selected hash algorithm. For\n      ``sha512`` this would mean a 128 bit (64 character) secret.  It should\n      be unique within the set of secret values provided to Pyramid for\n      its various subsystems (see :ref:`admonishment_against_secret_sharing`).\n\n    ``hashalg``\n      The HMAC digest algorithm to use for signing. The algorithm must be\n      supported by the :mod:`hashlib` library. Default: ``'sha512'``.\n\n    ``salt``\n      A namespace to avoid collisions between different uses of a shared\n      secret. Reusing a secret for different parts of an application is\n      strongly discouraged (see :ref:`admonishment_against_secret_sharing`).\n      Default: ``'pyramid.session.'``.\n\n    ``cookie_name``\n      The name of the cookie used for sessioning. Default: ``'session'``.\n\n    ``max_age``\n      The maximum age of the cookie used for sessioning (in seconds).\n      Default: ``None`` (browser scope).\n\n    ``path``\n      The path used for the session cookie. Default: ``'/'``.\n\n    ``domain``\n      The domain used for the session cookie.  Default: ``None`` (no domain).\n\n    ``secure``\n      The 'secure' flag of the session cookie. Default: ``False``.\n\n    ``httponly``\n      Hide the cookie from Javascript by setting the 'HttpOnly' flag of the\n      session cookie. Default: ``False``.\n\n    ``timeout``\n      A number of seconds of inactivity before a session times out. If\n      ``None`` then the cookie never expires. This lifetime only applies\n      to the *value* within the cookie. Meaning that if the cookie expires\n      due to a lower ``max_age``, then this setting has no effect.\n      Default: ``1200``.\n\n    ``reissue_time``\n      The number of seconds that must pass before the cookie is automatically\n      reissued as the result of accessing the session. The\n      duration is measured as the number of seconds since the last session\n      cookie was issued and 'now'.  If this value is ``0``, a new cookie\n      will be reissued on every request accessing the session. If ``None``\n      then the cookie's lifetime will never be extended.\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      However, such a configuration is not explicitly prevented.\n\n      Default: ``0``.\n\n    ``set_on_exception``\n      If ``True``, set a session cookie even if an exception occurs\n      while rendering a view. Default: ``True``.\n\n    ``serializer``\n      An object with two methods: ``loads`` and ``dumps``.  The ``loads``\n      method should accept bytes and return a Python object.  The ``dumps``\n      method should accept a Python object and return bytes.  A ``ValueError``\n      should be raised for malformed inputs.  If a serializer is not passed,\n      the :class:`pyramid.session.PickleSerializer` serializer will be used.\n\n    .. versionadded: 1.5a3\n    \"\"\"\n    if serializer is None:\n        serializer = PickleSerializer()\n\n    signed_serializer = SignedSerializer(\n        secret,\n        salt,\n        hashalg,\n        serializer=serializer,\n        )\n\n    return BaseCookieSessionFactory(\n        signed_serializer,\n        cookie_name=cookie_name,\n        max_age=max_age,\n        path=path,\n        domain=domain,\n        secure=secure,\n        httponly=httponly,\n        timeout=timeout,\n        reissue_time=reissue_time,\n        set_on_exception=set_on_exception,\n    )\n",
            "new_file_content": "import base64\nimport binascii\nimport hashlib\nimport hmac\nimport os\nimport time\n\nfrom zope.deprecation import deprecated\nfrom zope.interface import implementer\n\nfrom webob.cookies import SignedSerializer\n\nfrom pyramid.compat import (\n    pickle,\n    PY3,\n    text_,\n    bytes_,\n    native_,\n    )\n\nfrom pyramid.exceptions import BadCSRFToken\nfrom pyramid.interfaces import ISession\nfrom pyramid.util import strings_differ\n\ndef manage_accessed(wrapped):\n    \"\"\" Decorator which causes a cookie to be renewed when an accessor\n    method is called.\"\"\"\n    def accessed(session, *arg, **kw):\n        session.accessed = now = int(time.time())\n        if session._reissue_time is not None:\n            if now - session.renewed > session._reissue_time:\n                session.changed()\n        return wrapped(session, *arg, **kw)\n    accessed.__doc__ = wrapped.__doc__\n    return accessed\n\ndef manage_changed(wrapped):\n    \"\"\" Decorator which causes a cookie to be set when a setter method\n    is called.\"\"\"\n    def changed(session, *arg, **kw):\n        session.accessed = int(time.time())\n        session.changed()\n        return wrapped(session, *arg, **kw)\n    changed.__doc__ = wrapped.__doc__\n    return changed\n\ndef signed_serialize(data, secret):\n    \"\"\" Serialize any pickleable structure (``data``) and sign it\n    using the ``secret`` (must be a string).  Return the\n    serialization, which includes the signature as its first 40 bytes.\n    The ``signed_deserialize`` method will deserialize such a value.\n\n    This function is useful for creating signed cookies.  For example:\n\n    .. code-block:: python\n\n       cookieval = signed_serialize({'a':1}, 'secret')\n       response.set_cookie('signed_cookie', cookieval)\n    \"\"\"\n    pickled = pickle.dumps(data, pickle.HIGHEST_PROTOCOL)\n    try:\n        # bw-compat with pyramid <= 1.5b1 where latin1 is the default\n        secret = bytes_(secret)\n    except UnicodeEncodeError:\n        secret = bytes_(secret, 'utf-8')\n    sig = hmac.new(secret, pickled, hashlib.sha1).hexdigest()\n    return sig + native_(base64.b64encode(pickled))\n\ndef signed_deserialize(serialized, secret, hmac=hmac):\n    \"\"\" Deserialize the value returned from ``signed_serialize``.  If\n    the value cannot be deserialized for any reason, a\n    :exc:`ValueError` exception will be raised.\n\n    This function is useful for deserializing a signed cookie value\n    created by ``signed_serialize``.  For example:\n\n    .. code-block:: python\n\n       cookieval = request.cookies['signed_cookie']\n       data = signed_deserialize(cookieval, 'secret')\n    \"\"\"\n    # hmac parameterized only for unit tests\n    try:\n        input_sig, pickled = (bytes_(serialized[:40]),\n                              base64.b64decode(bytes_(serialized[40:])))\n    except (binascii.Error, TypeError) as e:\n        # Badly formed data can make base64 die\n        raise ValueError('Badly formed base64 data: %s' % e)\n\n    try:\n        # bw-compat with pyramid <= 1.5b1 where latin1 is the default\n        secret = bytes_(secret)\n    except UnicodeEncodeError:\n        secret = bytes_(secret, 'utf-8')\n    sig = bytes_(hmac.new(secret, pickled, hashlib.sha1).hexdigest())\n\n    # Avoid timing attacks (see\n    # http://seb.dbzteam.org/crypto/python-oauth-timing-hmac.pdf)\n    if strings_differ(sig, input_sig):\n        raise ValueError('Invalid signature')\n\n    return pickle.loads(pickled)\n\ndef check_csrf_token(request,\n                     token='csrf_token',\n                     header='X-CSRF-Token',\n                     raises=True):\n    \"\"\" Check the CSRF token in the request's session against the value in\n    ``request.params.get(token)`` or ``request.headers.get(header)``.\n    If a ``token`` keyword is not supplied to this function, the string\n    ``csrf_token`` will be used to look up the token in ``request.params``.\n    If a ``header`` keyword is not supplied to this function, the string\n    ``X-CSRF-Token`` will be used to look up the token in ``request.headers``.\n\n    If the value supplied by param or by header doesn't match the value\n    supplied by ``request.session.get_csrf_token()``, and ``raises`` is\n    ``True``, this function will raise an\n    :exc:`pyramid.exceptions.BadCSRFToken` exception.\n    If the check does succeed and ``raises`` is ``False``, this\n    function will return ``False``.  If the CSRF check is successful, this\n    function will return ``True`` unconditionally.\n\n    Note that using this function requires that a :term:`session factory` is\n    configured.\n\n    .. versionadded:: 1.4a2\n    \"\"\"\n    supplied_token = request.params.get(token, request.headers.get(header, \"\"))\n    if strings_differ(request.session.get_csrf_token(), supplied_token):\n        if raises:\n            raise BadCSRFToken('check_csrf_token(): Invalid token')\n        return False\n    return True\n\nclass PickleSerializer(object):\n    \"\"\" A Webob cookie serializer that uses the pickle protocol to dump Python\n    data to bytes.\"\"\"\n    def loads(self, bstruct):\n        return pickle.loads(bstruct)\n\n    def dumps(self, appstruct):\n        return pickle.dumps(appstruct, pickle.HIGHEST_PROTOCOL)\n\ndef BaseCookieSessionFactory(\n    serializer,\n    cookie_name='session',\n    max_age=None,\n    path='/',\n    domain=None,\n    secure=False,\n    httponly=False,\n    timeout=1200,\n    reissue_time=0,\n    set_on_exception=True,\n    ):\n    \"\"\"\n    .. versionadded:: 1.5\n    \n    Configure a :term:`session factory` which will provide cookie-based\n    sessions.  The return value of this function is a :term:`session factory`,\n    which may be provided as the ``session_factory`` argument of a\n    :class:`pyramid.config.Configurator` constructor, or used as the\n    ``session_factory`` argument of the\n    :meth:`pyramid.config.Configurator.set_session_factory` method.\n\n    The session factory returned by this function will create sessions\n    which are limited to storing fewer than 4000 bytes of data (as the\n    payload must fit into a single cookie).\n\n    .. warning:\n\n       This class provides no protection from tampering and is only intended\n       to be used by framework authors to create their own cookie-based\n       session factories.\n\n    Parameters:\n\n    ``serializer``\n      An object with two methods: ``loads`` and ``dumps``.  The ``loads``\n      method should accept bytes and return a Python object.  The ``dumps``\n      method should accept a Python object and return bytes.  A ``ValueError``\n      should be raised for malformed inputs.\n\n    ``cookie_name``\n      The name of the cookie used for sessioning. Default: ``'session'``.\n\n    ``max_age``\n      The maximum age of the cookie used for sessioning (in seconds).\n      Default: ``None`` (browser scope).\n\n    ``path``\n      The path used for the session cookie. Default: ``'/'``.\n\n    ``domain``\n      The domain used for the session cookie.  Default: ``None`` (no domain).\n\n    ``secure``\n      The 'secure' flag of the session cookie. Default: ``False``.\n\n    ``httponly``\n      Hide the cookie from Javascript by setting the 'HttpOnly' flag of the\n      session cookie. Default: ``False``.\n\n    ``timeout``\n      A number of seconds of inactivity before a session times out. If\n      ``None`` then the cookie never expires. This lifetime only applies\n      to the *value* within the cookie. Meaning that if the cookie expires\n      due to a lower ``max_age``, then this setting has no effect.\n      Default: ``1200``.\n\n    ``reissue_time``\n      The number of seconds that must pass before the cookie is automatically\n      reissued as the result of a request which accesses the session. The\n      duration is measured as the number of seconds since the last session\n      cookie was issued and 'now'.  If this value is ``0``, a new cookie\n      will be reissued on every request accessing the session. If ``None``\n      then the cookie's lifetime will never be extended.\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      However, such a configuration is not explicitly prevented.\n\n      Default: ``0``.\n\n    ``set_on_exception``\n      If ``True``, set a session cookie even if an exception occurs\n      while rendering a view. Default: ``True``.\n\n    .. versionadded: 1.5a3\n    \"\"\"\n\n    @implementer(ISession)\n    class CookieSession(dict):\n        \"\"\" Dictionary-like session object \"\"\"\n\n        # configuration parameters\n        _cookie_name = cookie_name\n        _cookie_max_age = max_age if max_age is None else int(max_age)\n        _cookie_path = path\n        _cookie_domain = domain\n        _cookie_secure = secure\n        _cookie_httponly = httponly\n        _cookie_on_exception = set_on_exception\n        _timeout = timeout if timeout is None else int(timeout)\n        _reissue_time = reissue_time if reissue_time is None else int(reissue_time)\n\n        # dirty flag\n        _dirty = False\n\n        def __init__(self, request):\n            self.request = request\n            now = time.time()\n            created = renewed = now\n            new = True\n            value = None\n            state = {}\n            cookieval = request.cookies.get(self._cookie_name)\n            if cookieval is not None:\n                try:\n                    value = serializer.loads(bytes_(cookieval))\n                except ValueError:\n                    # the cookie failed to deserialize, dropped\n                    value = None\n\n            if value is not None:\n                try:\n                    # since the value is not necessarily signed, we have\n                    # to unpack it a little carefully\n                    rval, cval, sval = value\n                    renewed = float(rval)\n                    created = float(cval)\n                    state = sval\n                    new = False\n                except (TypeError, ValueError):\n                    # value failed to unpack properly or renewed was not\n                    # a numeric type so we'll fail deserialization here\n                    state = {}\n\n            if self._timeout is not None:\n                if now - renewed > self._timeout:\n                    # expire the session because it was not renewed\n                    # before the timeout threshold\n                    state = {}\n\n            self.created = created\n            self.accessed = renewed\n            self.renewed = renewed\n            self.new = new\n            dict.__init__(self, state)\n\n        # ISession methods\n        def changed(self):\n            if not self._dirty:\n                self._dirty = True\n                def set_cookie_callback(request, response):\n                    self._set_cookie(response)\n                    self.request = None # explicitly break cycle for gc\n                self.request.add_response_callback(set_cookie_callback)\n\n        def invalidate(self):\n            self.clear() # XXX probably needs to unset cookie\n\n        # non-modifying dictionary methods\n        get = manage_accessed(dict.get)\n        __getitem__ = manage_accessed(dict.__getitem__)\n        items = manage_accessed(dict.items)\n        values = manage_accessed(dict.values)\n        keys = manage_accessed(dict.keys)\n        __contains__ = manage_accessed(dict.__contains__)\n        __len__ = manage_accessed(dict.__len__)\n        __iter__ = manage_accessed(dict.__iter__)\n\n        if not PY3:\n            iteritems = manage_accessed(dict.iteritems)\n            itervalues = manage_accessed(dict.itervalues)\n            iterkeys = manage_accessed(dict.iterkeys)\n            has_key = manage_accessed(dict.has_key)\n\n        # modifying dictionary methods\n        clear = manage_changed(dict.clear)\n        update = manage_changed(dict.update)\n        setdefault = manage_changed(dict.setdefault)\n        pop = manage_changed(dict.pop)\n        popitem = manage_changed(dict.popitem)\n        __setitem__ = manage_changed(dict.__setitem__)\n        __delitem__ = manage_changed(dict.__delitem__)\n\n        # flash API methods\n        @manage_changed\n        def flash(self, msg, queue='', allow_duplicate=True):\n            storage = self.setdefault('_f_' + queue, [])\n            if allow_duplicate or (msg not in storage):\n                storage.append(msg)\n\n        @manage_changed\n        def pop_flash(self, queue=''):\n            storage = self.pop('_f_' + queue, [])\n            return storage\n\n        @manage_accessed\n        def peek_flash(self, queue=''):\n            storage = self.get('_f_' + queue, [])\n            return storage\n\n        # CSRF API methods\n        @manage_changed\n        def new_csrf_token(self):\n            token = text_(binascii.hexlify(os.urandom(20)))\n            self['_csrft_'] = token\n            return token\n\n        @manage_accessed\n        def get_csrf_token(self):\n            token = self.get('_csrft_', None)\n            if token is None:\n                token = self.new_csrf_token()\n            return token\n\n        # non-API methods\n        def _set_cookie(self, response):\n            if not self._cookie_on_exception:\n                exception = getattr(self.request, 'exception', None)\n                if exception is not None: # dont set a cookie during exceptions\n                    return False\n            cookieval = native_(serializer.dumps(\n                (self.accessed, self.created, dict(self))\n                ))\n            if len(cookieval) > 4064:\n                raise ValueError(\n                    'Cookie value is too long to store (%s bytes)' %\n                    len(cookieval)\n                    )\n            response.set_cookie(\n                self._cookie_name,\n                value=cookieval,\n                max_age=self._cookie_max_age,\n                path=self._cookie_path,\n                domain=self._cookie_domain,\n                secure=self._cookie_secure,\n                httponly=self._cookie_httponly,\n                )\n            return True\n\n    return CookieSession\n\n\ndef UnencryptedCookieSessionFactoryConfig(\n    secret,\n    timeout=1200,\n    cookie_name='session',\n    cookie_max_age=None,\n    cookie_path='/',\n    cookie_domain=None,\n    cookie_secure=False,\n    cookie_httponly=False,\n    cookie_on_exception=True,\n    signed_serialize=signed_serialize,\n    signed_deserialize=signed_deserialize,\n    ):\n    \"\"\"\n    .. deprecated:: 1.5\n        Use :func:`pyramid.session.SignedCookieSessionFactory` instead.\n        Caveat: Cookies generated using ``SignedCookieSessionFactory`` are not\n        compatible with cookies generated using\n        ``UnencryptedCookieSessionFactory``, so existing user session data\n        will be destroyed if you switch to it.\n    \n    Configure a :term:`session factory` which will provide unencrypted\n    (but signed) cookie-based sessions.  The return value of this\n    function is a :term:`session factory`, which may be provided as\n    the ``session_factory`` argument of a\n    :class:`pyramid.config.Configurator` constructor, or used\n    as the ``session_factory`` argument of the\n    :meth:`pyramid.config.Configurator.set_session_factory`\n    method.\n\n    The session factory returned by this function will create sessions\n    which are limited to storing fewer than 4000 bytes of data (as the\n    payload must fit into a single cookie).\n\n    Parameters:\n\n    ``secret``\n      A string which is used to sign the cookie.\n\n    ``timeout``\n      A number of seconds of inactivity before a session times out.\n\n    ``cookie_name``\n      The name of the cookie used for sessioning.\n\n    ``cookie_max_age``\n      The maximum age of the cookie used for sessioning (in seconds).\n      Default: ``None`` (browser scope).\n\n    ``cookie_path``\n      The path used for the session cookie.\n\n    ``cookie_domain``\n      The domain used for the session cookie.  Default: ``None`` (no domain).\n\n    ``cookie_secure``\n      The 'secure' flag of the session cookie.\n\n    ``cookie_httponly``\n      The 'httpOnly' flag of the session cookie.\n\n    ``cookie_on_exception``\n      If ``True``, set a session cookie even if an exception occurs\n      while rendering a view.\n\n    ``signed_serialize``\n      A callable which takes more or less arbitrary Python data structure and\n      a secret and returns a signed serialization in bytes.\n      Default: ``signed_serialize`` (using pickle).\n\n    ``signed_deserialize``\n      A callable which takes a signed and serialized data structure in bytes\n      and a secret and returns the original data structure if the signature\n      is valid. Default: ``signed_deserialize`` (using pickle).\n    \"\"\"\n\n    class SerializerWrapper(object):\n        def __init__(self, secret):\n            self.secret = secret\n            \n        def loads(self, bstruct):\n            return signed_deserialize(bstruct, secret)\n\n        def dumps(self, appstruct):\n            return signed_serialize(appstruct, secret)\n\n    serializer = SerializerWrapper(secret)\n\n    return BaseCookieSessionFactory(\n        serializer,\n        cookie_name=cookie_name,\n        max_age=cookie_max_age,\n        path=cookie_path,\n        domain=cookie_domain,\n        secure=cookie_secure,\n        httponly=cookie_httponly,\n        timeout=timeout,\n        reissue_time=0, # to keep session.accessed == session.renewed\n        set_on_exception=cookie_on_exception,\n    )\n\ndeprecated(\n    'UnencryptedCookieSessionFactoryConfig',\n    'The UnencryptedCookieSessionFactoryConfig callable is deprecated as of '\n    'Pyramid 1.5.  Use ``pyramid.session.SignedCookieSessionFactory`` instead.'\n    ' Caveat: Cookies generated using SignedCookieSessionFactory are not '\n    'compatible with cookies generated using UnencryptedCookieSessionFactory, '\n    'so existing user session data will be destroyed if you switch to it.'\n    )\n\ndef SignedCookieSessionFactory(\n    secret,\n    cookie_name='session',\n    max_age=None,\n    path='/',\n    domain=None,\n    secure=False,\n    httponly=False,\n    set_on_exception=True,\n    timeout=1200,\n    reissue_time=0,\n    hashalg='sha512',\n    salt='pyramid.session.',\n    serializer=None,\n    ):\n    \"\"\"\n    .. versionadded:: 1.5\n    \n    Configure a :term:`session factory` which will provide signed\n    cookie-based sessions.  The return value of this\n    function is a :term:`session factory`, which may be provided as\n    the ``session_factory`` argument of a\n    :class:`pyramid.config.Configurator` constructor, or used\n    as the ``session_factory`` argument of the\n    :meth:`pyramid.config.Configurator.set_session_factory`\n    method.\n\n    The session factory returned by this function will create sessions\n    which are limited to storing fewer than 4000 bytes of data (as the\n    payload must fit into a single cookie).\n\n    Parameters:\n\n    ``secret``\n      A string which is used to sign the cookie. The secret should be at\n      least as long as the block size of the selected hash algorithm. For\n      ``sha512`` this would mean a 128 bit (64 character) secret.  It should\n      be unique within the set of secret values provided to Pyramid for\n      its various subsystems (see :ref:`admonishment_against_secret_sharing`).\n\n    ``hashalg``\n      The HMAC digest algorithm to use for signing. The algorithm must be\n      supported by the :mod:`hashlib` library. Default: ``'sha512'``.\n\n    ``salt``\n      A namespace to avoid collisions between different uses of a shared\n      secret. Reusing a secret for different parts of an application is\n      strongly discouraged (see :ref:`admonishment_against_secret_sharing`).\n      Default: ``'pyramid.session.'``.\n\n    ``cookie_name``\n      The name of the cookie used for sessioning. Default: ``'session'``.\n\n    ``max_age``\n      The maximum age of the cookie used for sessioning (in seconds).\n      Default: ``None`` (browser scope).\n\n    ``path``\n      The path used for the session cookie. Default: ``'/'``.\n\n    ``domain``\n      The domain used for the session cookie.  Default: ``None`` (no domain).\n\n    ``secure``\n      The 'secure' flag of the session cookie. Default: ``False``.\n\n    ``httponly``\n      Hide the cookie from Javascript by setting the 'HttpOnly' flag of the\n      session cookie. Default: ``False``.\n\n    ``timeout``\n      A number of seconds of inactivity before a session times out. If\n      ``None`` then the cookie never expires. This lifetime only applies\n      to the *value* within the cookie. Meaning that if the cookie expires\n      due to a lower ``max_age``, then this setting has no effect.\n      Default: ``1200``.\n\n    ``reissue_time``\n      The number of seconds that must pass before the cookie is automatically\n      reissued as the result of accessing the session. The\n      duration is measured as the number of seconds since the last session\n      cookie was issued and 'now'.  If this value is ``0``, a new cookie\n      will be reissued on every request accessing the session. If ``None``\n      then the cookie's lifetime will never be extended.\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      However, such a configuration is not explicitly prevented.\n\n      Default: ``0``.\n\n    ``set_on_exception``\n      If ``True``, set a session cookie even if an exception occurs\n      while rendering a view. Default: ``True``.\n\n    ``serializer``\n      An object with two methods: ``loads`` and ``dumps``.  The ``loads``\n      method should accept bytes and return a Python object.  The ``dumps``\n      method should accept a Python object and return bytes.  A ``ValueError``\n      should be raised for malformed inputs.  If a serializer is not passed,\n      the :class:`pyramid.session.PickleSerializer` serializer will be used.\n\n    .. versionadded: 1.5a3\n    \"\"\"\n    if serializer is None:\n        serializer = PickleSerializer()\n\n    signed_serializer = SignedSerializer(\n        secret,\n        salt,\n        hashalg,\n        serializer=serializer,\n        )\n\n    return BaseCookieSessionFactory(\n        signed_serializer,\n        cookie_name=cookie_name,\n        max_age=max_age,\n        path=path,\n        domain=domain,\n        secure=secure,\n        httponly=httponly,\n        timeout=timeout,\n        reissue_time=reissue_time,\n        set_on_exception=set_on_exception,\n    )\n",
            "header": {
                "file": {
                    "path": "pyramid/session.py"
                },
                "misc_line": null
            },
            "index_line": {
                "old_commit_hash": "c4cfc1949",
                "new_commit_hash": "fa85fe69c",
                "mode": "100644"
            },
            "is_binary_file": false,
            "binary_line": null,
            "minus_file": {
                "path": "a/pyramid/session.py"
            },
            "plus_file": {
                "path": "b/pyramid/session.py"
            },
            "hunks": [
                {
                    "descriptor": {
                        "old_range": {
                            "start": 238,
                            "length": 14
                        },
                        "new_range": {
                            "start": 238,
                            "length": 14
                        },
                        "section": "def BaseCookieSessionFactory("
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "        # configuration parameters",
                                "type": "context"
                            },
                            {
                                "content": "        _cookie_name = cookie_name",
                                "type": "context"
                            },
                            {
                                "content": "        _cookie_max_age = max_age",
                                "type": "deleted"
                            },
                            {
                                "content": "        _cookie_max_age = max_age if max_age is None else int(max_age)",
                                "type": "added"
                            },
                            {
                                "content": "        _cookie_path = path",
                                "type": "context"
                            },
                            {
                                "content": "        _cookie_domain = domain",
                                "type": "context"
                            },
                            {
                                "content": "        _cookie_secure = secure",
                                "type": "context"
                            },
                            {
                                "content": "        _cookie_httponly = httponly",
                                "type": "context"
                            },
                            {
                                "content": "        _cookie_on_exception = set_on_exception",
                                "type": "context"
                            },
                            {
                                "content": "        _timeout = timeout",
                                "type": "deleted"
                            },
                            {
                                "content": "        _reissue_time = reissue_time",
                                "type": "deleted"
                            },
                            {
                                "content": "        _timeout = timeout if timeout is None else int(timeout)",
                                "type": "added"
                            },
                            {
                                "content": "        _reissue_time = reissue_time if reissue_time is None else int(reissue_time)",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "        # dirty flag",
                                "type": "context"
                            },
                            {
                                "content": "        _dirty = False",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [
                        {
                            "file_name": "pyramid/session.py",
                            "type": "function",
                            "name": "BaseCookieSessionFactory",
                            "content": "def BaseCookieSessionFactory(\n    serializer,\n    cookie_name='session',\n    max_age=None,\n    path='/',\n    domain=None,\n    secure=False,\n    httponly=False,\n    timeout=1200,\n    reissue_time=0,\n    set_on_exception=True,\n    ):\n    \"\"\"\n    .. versionadded:: 1.5\n    \n    Configure a :term:`session factory` which will provide cookie-based\n    sessions.  The return value of this function is a :term:`session factory`,\n    which may be provided as the ``session_factory`` argument of a\n    :class:`pyramid.config.Configurator` constructor, or used as the\n    ``session_factory`` argument of the\n    :meth:`pyramid.config.Configurator.set_session_factory` method.\n\n    The session factory returned by this function will create sessions\n    which are limited to storing fewer than 4000 bytes of data (as the\n    payload must fit into a single cookie).\n\n    .. warning:\n\n       This class provides no protection from tampering and is only intended\n       to be used by framework authors to create their own cookie-based\n       session factories.\n\n    Parameters:\n\n    ``serializer``\n      An object with two methods: ``loads`` and ``dumps``.  The ``loads``\n      method should accept bytes and return a Python object.  The ``dumps``\n      method should accept a Python object and return bytes.  A ``ValueError``\n      should be raised for malformed inputs.\n\n    ``cookie_name``\n      The name of the cookie used for sessioning. Default: ``'session'``.\n\n    ``max_age``\n      The maximum age of the cookie used for sessioning (in seconds).\n      Default: ``None`` (browser scope).\n\n    ``path``\n      The path used for the session cookie. Default: ``'/'``.\n\n    ``domain``\n      The domain used for the session cookie.  Default: ``None`` (no domain).\n\n    ``secure``\n      The 'secure' flag of the session cookie. Default: ``False``.\n\n    ``httponly``\n      Hide the cookie from Javascript by setting the 'HttpOnly' flag of the\n      session cookie. Default: ``False``.\n\n    ``timeout``\n      A number of seconds of inactivity before a session times out. If\n      ``None`` then the cookie never expires. This lifetime only applies\n      to the *value* within the cookie. Meaning that if the cookie expires\n      due to a lower ``max_age``, then this setting has no effect.\n      Default: ``1200``.\n\n    ``reissue_time``\n      The number of seconds that must pass before the cookie is automatically\n      reissued as the result of a request which accesses the session. The\n      duration is measured as the number of seconds since the last session\n      cookie was issued and 'now'.  If this value is ``0``, a new cookie\n      will be reissued on every request accessing the session. If ``None``\n      then the cookie's lifetime will never be extended.\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      However, such a configuration is not explicitly prevented.\n\n      Default: ``0``.\n\n    ``set_on_exception``\n      If ``True``, set a session cookie even if an exception occurs\n      while rendering a view. Default: ``True``.\n\n    .. versionadded: 1.5a3\n    \"\"\"\n\n    @implementer(ISession)\n    class CookieSession(dict):\n        \"\"\" Dictionary-like session object \"\"\"\n\n        # configuration parameters\n        _cookie_name = cookie_name\n        _cookie_max_age = max_age\n        _cookie_path = path\n        _cookie_domain = domain\n        _cookie_secure = secure\n        _cookie_httponly = httponly\n        _cookie_on_exception = set_on_exception\n        _timeout = timeout\n        _reissue_time = reissue_time\n\n        # dirty flag\n        _dirty = False\n\n        def __init__(self, request):\n            self.request = request\n            now = time.time()\n            created = renewed = now\n            new = True\n            value = None\n            state = {}\n            cookieval = request.cookies.get(self._cookie_name)\n            if cookieval is not None:\n                try:\n                    value = serializer.loads(bytes_(cookieval))\n                except ValueError:\n                    # the cookie failed to deserialize, dropped\n                    value = None\n\n            if value is not None:\n                try:\n                    # since the value is not necessarily signed, we have\n                    # to unpack it a little carefully\n                    rval, cval, sval = value\n                    renewed = float(rval)\n                    created = float(cval)\n                    state = sval\n                    new = False\n                except (TypeError, ValueError):\n                    # value failed to unpack properly or renewed was not\n                    # a numeric type so we'll fail deserialization here\n                    state = {}\n\n            if self._timeout is not None:\n                if now - renewed > self._timeout:\n                    # expire the session because it was not renewed\n                    # before the timeout threshold\n                    state = {}\n\n            self.created = created\n            self.accessed = renewed\n            self.renewed = renewed\n            self.new = new\n            dict.__init__(self, state)\n\n        # ISession methods\n        def changed(self):\n            if not self._dirty:\n                self._dirty = True\n                def set_cookie_callback(request, response):\n                    self._set_cookie(response)\n                    self.request = None # explicitly break cycle for gc\n                self.request.add_response_callback(set_cookie_callback)\n\n        def invalidate(self):\n            self.clear() # XXX probably needs to unset cookie\n\n        # non-modifying dictionary methods\n        get = manage_accessed(dict.get)\n        __getitem__ = manage_accessed(dict.__getitem__)\n        items = manage_accessed(dict.items)\n        values = manage_accessed(dict.values)\n        keys = manage_accessed(dict.keys)\n        __contains__ = manage_accessed(dict.__contains__)\n        __len__ = manage_accessed(dict.__len__)\n        __iter__ = manage_accessed(dict.__iter__)\n\n        if not PY3:\n            iteritems = manage_accessed(dict.iteritems)\n            itervalues = manage_accessed(dict.itervalues)\n            iterkeys = manage_accessed(dict.iterkeys)\n            has_key = manage_accessed(dict.has_key)\n\n        # modifying dictionary methods\n        clear = manage_changed(dict.clear)\n        update = manage_changed(dict.update)\n        setdefault = manage_changed(dict.setdefault)\n        pop = manage_changed(dict.pop)\n        popitem = manage_changed(dict.popitem)\n        __setitem__ = manage_changed(dict.__setitem__)\n        __delitem__ = manage_changed(dict.__delitem__)\n\n        # flash API methods\n        @manage_changed\n        def flash(self, msg, queue='', allow_duplicate=True):\n            storage = self.setdefault('_f_' + queue, [])\n            if allow_duplicate or (msg not in storage):\n                storage.append(msg)\n\n        @manage_changed\n        def pop_flash(self, queue=''):\n            storage = self.pop('_f_' + queue, [])\n            return storage\n\n        @manage_accessed\n        def peek_flash(self, queue=''):\n            storage = self.get('_f_' + queue, [])\n            return storage\n\n        # CSRF API methods\n        @manage_changed\n        def new_csrf_token(self):\n            token = text_(binascii.hexlify(os.urandom(20)))\n            self['_csrft_'] = token\n            return token\n\n        @manage_accessed\n        def get_csrf_token(self):\n            token = self.get('_csrft_', None)\n            if token is None:\n                token = self.new_csrf_token()\n            return token\n\n        # non-API methods\n        def _set_cookie(self, response):\n            if not self._cookie_on_exception:\n                exception = getattr(self.request, 'exception', None)\n                if exception is not None: # dont set a cookie during exceptions\n                    return False\n            cookieval = native_(serializer.dumps(\n                (self.accessed, self.created, dict(self))\n                ))\n            if len(cookieval) > 4064:\n                raise ValueError(\n                    'Cookie value is too long to store (%s bytes)' %\n                    len(cookieval)\n                    )\n            response.set_cookie(\n                self._cookie_name,\n                value=cookieval,\n                max_age=self._cookie_max_age,\n                path=self._cookie_path,\n                domain=self._cookie_domain,\n                secure=self._cookie_secure,\n                httponly=self._cookie_httponly,\n                )\n            return True\n\n    return CookieSession",
                            "ast_type_str": "FunctionDef",
                            "start_lineno": 144,
                            "end_lineno": 387,
                            "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_remember_kwargs(self):\n        authtkt = DummyWhoPlugin()\n        request = DummyRequest(\n            {'repoze.who.plugins':{'auth_tkt':authtkt}})\n        policy = self._makeOne()\n        result = policy.remember(request, 'fred', max_age=23)\n        self.assertEqual(result[1], {'repoze.who.userid':'fred', 'max_age': 23})\n\n    def test_forget_no_plugins(self):\n        request = DummyRequest({})\n        policy = self._makeOne()\n        result = policy.forget(request)\n        self.assertEqual(result, [])\n\n    def test_forget(self):\n        authtkt = DummyWhoPlugin()\n        request = DummyRequest(\n            {'repoze.who.plugins':{'auth_tkt':authtkt},\n             'repoze.who.identity':{'repoze.who.userid':'fred'},\n             })\n        policy = self._makeOne()\n        result = policy.forget(request)\n        self.assertEqual(result[0], request.environ)\n        self.assertEqual(result[1], request.environ['repoze.who.identity'])\n\nclass TestRemoteUserAuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import RemoteUserAuthenticationPolicy\n        return RemoteUserAuthenticationPolicy\n\n    def _makeOne(self, environ_key='REMOTE_USER', callback=None):\n        return self._getTargetClass()(environ_key, callback)\n\n    def test_class_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyClass\n        from pyramid.interfaces import IAuthenticationPolicy\n        verifyClass(IAuthenticationPolicy, self._getTargetClass())\n\n    def test_instance_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyObject\n        from pyramid.interfaces import IAuthenticationPolicy\n        verifyObject(IAuthenticationPolicy, self._makeOne())\n\n    def test_unauthenticated_userid_returns_None(self):\n        request = DummyRequest({})\n        policy = self._makeOne()\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_unauthenticated_userid(self):\n        request = DummyRequest({'REMOTE_USER':'fred'})\n        policy = self._makeOne()\n        self.assertEqual(policy.unauthenticated_userid(request), 'fred')\n\n    def test_authenticated_userid_None(self):\n        request = DummyRequest({})\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid(self):\n        request = DummyRequest({'REMOTE_USER':'fred'})\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), 'fred')\n\n    def test_effective_principals_None(self):\n        from pyramid.security import Everyone\n        request = DummyRequest({})\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals(self):\n        from pyramid.security import Everyone\n        from pyramid.security import Authenticated\n        request = DummyRequest({'REMOTE_USER':'fred'})\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request),\n                         [Everyone, Authenticated, 'fred'])\n\n    def test_remember(self):\n        request = DummyRequest({'REMOTE_USER':'fred'})\n        policy = self._makeOne()\n        result = policy.remember(request, 'fred')\n        self.assertEqual(result, [])\n\n    def test_forget(self):\n        request = DummyRequest({'REMOTE_USER':'fred'})\n        policy = self._makeOne()\n        result = policy.forget(request)\n        self.assertEqual(result, [])\n\nclass TestAuthTktAuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import AuthTktAuthenticationPolicy\n        return AuthTktAuthenticationPolicy\n\n    def _makeOne(self, callback, cookieidentity, **kw):\n        inst = self._getTargetClass()('secret', callback, **kw)\n        inst.cookie = DummyCookieHelper(cookieidentity)\n        return inst\n\n    def setUp(self):\n        self.warnings = warnings.catch_warnings()\n        self.warnings.__enter__()\n        warnings.simplefilter('ignore', DeprecationWarning)\n\n    def tearDown(self):\n        self.warnings.__exit__(None, None, None)\n\n    def test_allargs(self):\n        # pass all known args\n        inst = self._getTargetClass()(\n            'secret', callback=None, cookie_name=None, secure=False,\n            include_ip=False, timeout=None, reissue_time=None,\n            hashalg='sha512',\n            )\n        self.assertEqual(inst.callback, None)\n\n    def test_hashalg_override(self):\n        # important to ensure hashalg is passed to cookie helper\n        inst = self._getTargetClass()('secret', hashalg='sha512')\n        self.assertEqual(inst.cookie.hashalg, 'sha512')\n\n    def test_unauthenticated_userid_returns_None(self):\n        request = DummyRequest({})\n        policy = self._makeOne(None, None)\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_unauthenticated_userid(self):\n        request = DummyRequest({'REMOTE_USER':'fred'})\n        policy = self._makeOne(None, {'userid':'fred'})\n        self.assertEqual(policy.unauthenticated_userid(request), 'fred')\n\n    def test_authenticated_userid_no_cookie_identity(self):\n        request = DummyRequest({})\n        policy = self._makeOne(None, None)\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid_callback_returns_None(self):\n        request = DummyRequest({})\n        def callback(userid, request):\n            return None\n        policy = self._makeOne(callback, {'userid':'fred'})\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid(self):\n        request = DummyRequest({})\n        def callback(userid, request):\n            return True\n        policy = self._makeOne(callback, {'userid':'fred'})\n        self.assertEqual(policy.authenticated_userid(request), 'fred')\n\n    def test_effective_principals_no_cookie_identity(self):\n        from pyramid.security import Everyone\n        request = DummyRequest({})\n        policy = self._makeOne(None, None)\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals_callback_returns_None(self):\n        from pyramid.security import Everyone\n        request = DummyRequest({})\n        def callback(userid, request):\n            return None\n        policy = self._makeOne(callback, {'userid':'fred'})\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals(self):\n        from pyramid.security import Everyone\n        from pyramid.security import Authenticated\n        request = DummyRequest({})\n        def callback(userid, request):\n            return ['group.foo']\n        policy = self._makeOne(callback, {'userid':'fred'})\n        self.assertEqual(policy.effective_principals(request),\n                             [Everyone, Authenticated, 'fred', 'group.foo'])\n\n    def test_remember(self):\n        request = DummyRequest({})\n        policy = self._makeOne(None, None)\n        result = policy.remember(request, 'fred')\n        self.assertEqual(result, [])\n\n    def test_remember_with_extra_kargs(self):\n        request = DummyRequest({})\n        policy = self._makeOne(None, None)\n        result = policy.remember(request, 'fred', a=1, b=2)\n        self.assertEqual(policy.cookie.kw, {'a':1, 'b':2})\n        self.assertEqual(result, [])\n\n    def test_forget(self):\n        request = DummyRequest({})\n        policy = self._makeOne(None, None)\n        result = policy.forget(request)\n        self.assertEqual(result, [])\n\n    def test_class_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyClass\n        from pyramid.interfaces import IAuthenticationPolicy\n        verifyClass(IAuthenticationPolicy, self._getTargetClass())\n\n    def test_instance_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyObject\n        from pyramid.interfaces import IAuthenticationPolicy\n        verifyObject(IAuthenticationPolicy, self._makeOne(None, None))\n\nclass TestAuthTktCookieHelper(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import AuthTktCookieHelper\n        return AuthTktCookieHelper\n\n    def _makeOne(self, *arg, **kw):\n        helper = self._getTargetClass()(*arg, **kw)\n        # laziness after moving auth_tkt classes and funcs into\n        # authentication module\n        auth_tkt = DummyAuthTktModule()\n        helper.auth_tkt = auth_tkt\n        helper.AuthTicket = auth_tkt.AuthTicket\n        helper.parse_ticket = auth_tkt.parse_ticket\n        helper.BadTicket = auth_tkt.BadTicket\n        return helper\n\n    def _makeRequest(self, cookie=None, ipv6=False):\n        environ = {'wsgi.version': (1,0)}\n\n        if ipv6 is False:\n            environ['REMOTE_ADDR'] = '1.1.1.1'\n        else:\n            environ['REMOTE_ADDR'] = '::1'\n        environ['SERVER_NAME'] = 'localhost'\n        return DummyRequest(environ, cookie=cookie)\n\n    def _cookieValue(self, cookie):\n        items = cookie.value.split('/')\n        D = {}\n        for item in items:\n            k, v = item.split('=', 1)\n            D[k] = v\n        return D\n\n    def _parseHeaders(self, headers):\n        return [ self._parseHeader(header) for header in headers ]\n\n    def _parseHeader(self, header):\n        cookie = self._parseCookie(header[1])\n        return cookie\n\n    def _parseCookie(self, cookie):\n        from pyramid.compat import SimpleCookie\n        cookies = SimpleCookie()\n        cookies.load(cookie)\n        return cookies.get('auth_tkt')\n\n    def test_identify_nocookie(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.identify(request)\n        self.assertEqual(result, None)\n\n    def test_identify_cookie_value_is_None(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest(None)\n        result = helper.identify(request)\n        self.assertEqual(result, None)\n\n    def test_identify_good_cookie_include_ip(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 'userid')\n        self.assertEqual(result['userdata'], '')\n        self.assertEqual(result['timestamp'], 0)\n        self.assertEqual(helper.auth_tkt.value, 'ticket')\n        self.assertEqual(helper.auth_tkt.remote_addr, '1.1.1.1')\n        self.assertEqual(helper.auth_tkt.secret, 'secret')\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'],'')\n        self.assertEqual(environ['AUTH_TYPE'],'cookie')\n\n    def test_identify_good_cookie_include_ipv6(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest('ticket', ipv6=True)\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 'userid')\n        self.assertEqual(result['userdata'], '')\n        self.assertEqual(result['timestamp'], 0)\n        self.assertEqual(helper.auth_tkt.value, 'ticket')\n        self.assertEqual(helper.auth_tkt.remote_addr, '::1')\n        self.assertEqual(helper.auth_tkt.secret, 'secret')\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'],'')\n        self.assertEqual(environ['AUTH_TYPE'],'cookie')\n\n    def test_identify_good_cookie_dont_include_ip(self):\n        helper = self._makeOne('secret', include_ip=False)\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 'userid')\n        self.assertEqual(result['userdata'], '')\n        self.assertEqual(result['timestamp'], 0)\n        self.assertEqual(helper.auth_tkt.value, 'ticket')\n        self.assertEqual(helper.auth_tkt.remote_addr, '0.0.0.0')\n        self.assertEqual(helper.auth_tkt.secret, 'secret')\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'],'')\n        self.assertEqual(environ['AUTH_TYPE'],'cookie')\n\n    def test_identify_good_cookie_int_useridtype(self):\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = '1'\n        helper.auth_tkt.user_data = 'userid_type:int'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 1)\n        self.assertEqual(result['userdata'], 'userid_type:int')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'],'userid_type:int')\n        self.assertEqual(environ['AUTH_TYPE'],'cookie')\n\n    def test_identify_nonuseridtype_user_data(self):\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = '1'\n        helper.auth_tkt.user_data = 'bogus:int'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], '1')\n        self.assertEqual(result['userdata'], 'bogus:int')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'],'bogus:int')\n        self.assertEqual(environ['AUTH_TYPE'],'cookie')\n\n    def test_identify_good_cookie_unknown_useridtype(self):\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = 'abc'\n        helper.auth_tkt.user_data = 'userid_type:unknown'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], 'abc')\n        self.assertEqual(result['userdata'], 'userid_type:unknown')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'],'userid_type:unknown')\n        self.assertEqual(environ['AUTH_TYPE'],'cookie')\n\n    def test_identify_good_cookie_b64str_useridtype(self):\n        from base64 import b64encode\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = b64encode(b'encoded').strip()\n        helper.auth_tkt.user_data = 'userid_type:b64str'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], b'encoded')\n        self.assertEqual(result['userdata'], 'userid_type:b64str')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'],'userid_type:b64str')\n        self.assertEqual(environ['AUTH_TYPE'],'cookie')\n\n    def test_identify_good_cookie_b64unicode_useridtype(self):\n        from base64 import b64encode\n        helper = self._makeOne('secret', include_ip=False)\n        helper.auth_tkt.userid = b64encode(b'\\xc3\\xa9ncoded').strip()\n        helper.auth_tkt.user_data = 'userid_type:b64unicode'\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(len(result), 4)\n        self.assertEqual(result['tokens'], ())\n        self.assertEqual(result['userid'], text_(b'\\xc3\\xa9ncoded', 'utf-8'))\n        self.assertEqual(result['userdata'], 'userid_type:b64unicode')\n        self.assertEqual(result['timestamp'], 0)\n        environ = request.environ\n        self.assertEqual(environ['REMOTE_USER_TOKENS'], ())\n        self.assertEqual(environ['REMOTE_USER_DATA'],'userid_type:b64unicode')\n        self.assertEqual(environ['AUTH_TYPE'],'cookie')\n\n    def test_identify_bad_cookie(self):\n        helper = self._makeOne('secret', include_ip=True)\n        helper.auth_tkt.parse_raise = True\n        request = self._makeRequest('ticket')\n        result = helper.identify(request)\n        self.assertEqual(result, None)\n\n    def test_identify_cookie_timed_out(self):\n        helper = self._makeOne('secret', timeout=1)\n        request = self._makeRequest({'HTTP_COOKIE':'auth_tkt=bogus'})\n        result = helper.identify(request)\n        self.assertEqual(result, None)\n\n    def test_identify_cookie_reissue(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        helper.auth_tkt.tokens = (text_('a'), )\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n\n    def test_identify_cookie_reissue_already_reissued_this_request(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        request._authtkt_reissued = True\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_notyet(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=10)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_revoked_by_forget(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.forget(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_revoked_by_remember(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.remember(request, 'bob')\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_with_tokens_default(self):\n        # see https://github.com/Pylons/pyramid/issues#issue/108\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        auth_tkt = DummyAuthTktModule(tokens=[''])\n        helper.auth_tkt = auth_tkt\n        helper.AuthTicket = auth_tkt.AuthTicket\n        helper.parse_ticket = auth_tkt.parse_ticket\n        helper.BadTicket = auth_tkt.BadTicket\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](None, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=/\" in response.headerlist[0][1])\n\n    def test_remember(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_include_ip(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_path(self):\n        helper = self._makeOne('secret', include_ip=True,\n                               path=\"/cgi-bin/app.cgi/\")\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith(\n            '; Domain=localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith(\n            '; Domain=.localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_http_only(self):\n        helper = self._makeOne('secret', include_ip=True, http_only=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; HttpOnly'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_secure(self):\n        helper = self._makeOne('secret', include_ip=True, secure=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[0][1])\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_wild_domain_disabled(self):\n        helper = self._makeOne('secret', wild_domain=False)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 2)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain(self):\n        helper = self._makeOne('secret', parent_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain_supercedes_wild_domain(self):\n        helper = self._makeOne('secret', parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n\n    def test_remember_explicit_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga')\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_domain_supercedes_parent_and_wild_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga',\n                parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n\n    def test_remember_binary_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, b'userid')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(b'userid').strip()))\n        self.assertEqual(val['user_data'], 'userid_type:b64str')\n\n    def test_remember_int_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 1)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_long_userid(self):\n        from pyramid.compat import long\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, long(1))\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_unicode_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = text_(b'\\xc2\\xa9', 'utf-8')\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(userid.encode('utf-8'))))\n        self.assertEqual(val['user_data'], 'userid_type:b64unicode')\n\n    def test_remember_insane_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = object()\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        value = values[0]\n        self.assertTrue('userid' in value.value)\n\n    def test_remember_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age='500')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_tokens(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'other', tokens=('foo', 'bar'))\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[0][1])\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[1][1])\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[2][1])\n\n    def test_remember_unicode_but_ascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'foo', 'utf-8')\n        result = helper.remember(request, 'other', tokens=(la,))\n        # tokens must be str type on both Python 2 and 3\n        self.assertTrue(\"/tokens=foo/\" in result[0][1])\n\n    def test_remember_nonascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'La Pe\\xc3\\xb1a', 'utf-8')\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=(la,))\n\n    def test_remember_invalid_token_format(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('foo bar',))\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('1bar',))\n\n    def test_forget(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        headers = helper.forget(request)\n        self.assertEqual(len(headers), 3)\n        name, value = headers[0]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[1]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[2]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=.localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n\nclass TestAuthTicket(unittest.TestCase):\n    def _makeOne(self, *arg, **kw):\n        from pyramid.authentication import AuthTicket\n        return AuthTicket(*arg, **kw)\n\n    def test_ctor_with_tokens(self):\n        ticket = self._makeOne('secret', 'userid', 'ip', tokens=('a', 'b'))\n        self.assertEqual(ticket.tokens, 'a,b')\n\n    def test_ctor_with_time(self):\n        ticket = self._makeOne('secret', 'userid', 'ip', time='time')\n        self.assertEqual(ticket.time, 'time')\n\n    def test_digest(self):\n        ticket = self._makeOne('secret', 'userid', '0.0.0.0', time=10)\n        result = ticket.digest()\n        self.assertEqual(result, '126fd6224912187ee9ffa80e0b81420c')\n\n    def test_digest_sha512(self):\n        ticket = self._makeOne('secret', 'userid', '0.0.0.0',\n                               time=10, hashalg='sha512')\n        result = ticket.digest()\n        self.assertEqual(result, '74770b2e0d5b1a54c2a466ec567a40f7d7823576aa49'\\\n                                 '3c65fc3445e9b44097f4a80410319ef8cb256a2e60b9'\\\n                                 'c2002e48a9e33a3e8ee4379352c04ef96d2cb278')\n\n    def test_cookie_value(self):\n        ticket = self._makeOne('secret', 'userid', '0.0.0.0', time=10,\n                               tokens=('a', 'b'))\n        result = ticket.cookie_value()\n        self.assertEqual(result,\n                         '66f9cc3e423dc57c91df696cf3d1f0d80000000auserid!a,b!')\n\n    def test_ipv4(self):\n        ticket = self._makeOne('secret', 'userid', '198.51.100.1',\n                               time=10, hashalg='sha256')\n        result = ticket.cookie_value()\n        self.assertEqual(result, 'b3e7156db4f8abde4439c4a6499a0668f9e7ffd7fa27b'\\\n                                 '798400ecdade8d76c530000000auserid!')\n\n    def test_ipv6(self):\n        ticket = self._makeOne('secret', 'userid', '2001:db8::1',\n                               time=10, hashalg='sha256')\n        result = ticket.cookie_value()\n        self.assertEqual(result, 'd025b601a0f12ca6d008aa35ff3a22b7d8f3d1c1456c8'\\\n                                 '5becf8760cd7a2fa4910000000auserid!')\n\nclass TestBadTicket(unittest.TestCase):\n    def _makeOne(self, msg, expected=None):\n        from pyramid.authentication import BadTicket\n        return BadTicket(msg, expected)\n\n    def test_it(self):\n        exc = self._makeOne('msg', expected=True)\n        self.assertEqual(exc.expected, True)\n        self.assertTrue(isinstance(exc, Exception))\n\nclass Test_parse_ticket(unittest.TestCase):\n    def _callFUT(self, secret, ticket, ip, hashalg='md5'):\n        from pyramid.authentication import parse_ticket\n        return parse_ticket(secret, ticket, ip, hashalg)\n\n    def _assertRaisesBadTicket(self, secret, ticket, ip, hashalg='md5'):\n        from pyramid.authentication import BadTicket\n        self.assertRaises(BadTicket,self._callFUT, secret, ticket, ip, hashalg)\n\n    def test_bad_timestamp(self):\n        ticket = 'x' * 64\n        self._assertRaisesBadTicket('secret', ticket, 'ip')\n\n    def test_bad_userid_or_data(self):\n        ticket = 'x' * 32 + '11111111' + 'x' * 10\n        self._assertRaisesBadTicket('secret', ticket, 'ip')\n\n    def test_digest_sig_incorrect(self):\n        ticket = 'x' * 32 + '11111111' + 'a!b!c'\n        self._assertRaisesBadTicket('secret', ticket, '0.0.0.0')\n\n    def test_correct_with_user_data(self):\n        ticket = text_('66f9cc3e423dc57c91df696cf3d1f0d80000000auserid!a,b!')\n        result = self._callFUT('secret', ticket, '0.0.0.0')\n        self.assertEqual(result, (10, 'userid', ['a', 'b'], ''))\n\n    def test_correct_with_user_data_sha512(self):\n        ticket = text_('7d947cdef99bad55f8e3382a8bd089bb9dd0547f7925b7d189adc1'\n                       '160cab0ec0e6888faa41eba641a18522b26f19109f3ffafb769767'\n                       'ba8a26d02aaeae56599a0000000auserid!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 = text_('b3e7156db4f8abde4439c4a6499a0668f9e7ffd7fa27b798400ecd'\n                       'ade8d76c530000000auserid!')\n        result = self._callFUT('secret', ticket, '198.51.100.1', 'sha256')\n        self.assertEqual(result, (10, 'userid', [''], ''))\n\n    def test_ipv6(self):\n        ticket = text_('d025b601a0f12ca6d008aa35ff3a22b7d8f3d1c1456c85becf8760'\n                       'cd7a2fa4910000000auserid!')\n        result = self._callFUT('secret', ticket, '2001:db8::1', 'sha256')\n        self.assertEqual(result, (10, 'userid', [''], ''))\n\nclass TestSessionAuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import SessionAuthenticationPolicy\n        return SessionAuthenticationPolicy\n\n    def _makeOne(self, callback=None, prefix=''):\n        return self._getTargetClass()(prefix=prefix, callback=callback)\n\n    def test_class_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyClass\n        from pyramid.interfaces import IAuthenticationPolicy\n        verifyClass(IAuthenticationPolicy, self._getTargetClass())\n\n    def test_instance_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyObject\n        from pyramid.interfaces import IAuthenticationPolicy\n        verifyObject(IAuthenticationPolicy, self._makeOne())\n\n    def test_unauthenticated_userid_returns_None(self):\n        request = DummyRequest()\n        policy = self._makeOne()\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_unauthenticated_userid(self):\n        request = DummyRequest(session={'userid':'fred'})\n        policy = self._makeOne()\n        self.assertEqual(policy.unauthenticated_userid(request), 'fred')\n\n    def test_authenticated_userid_no_cookie_identity(self):\n        request = DummyRequest()\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid_callback_returns_None(self):\n        request = DummyRequest(session={'userid':'fred'})\n        def callback(userid, request):\n            return None\n        policy = self._makeOne(callback)\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid(self):\n        request = DummyRequest(session={'userid':'fred'})\n        def callback(userid, request):\n            return True\n        policy = self._makeOne(callback)\n        self.assertEqual(policy.authenticated_userid(request), 'fred')\n\n    def test_effective_principals_no_identity(self):\n        from pyramid.security import Everyone\n        request = DummyRequest()\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals_callback_returns_None(self):\n        from pyramid.security import Everyone\n        request = DummyRequest(session={'userid':'fred'})\n        def callback(userid, request):\n            return None\n        policy = self._makeOne(callback)\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals(self):\n        from pyramid.security import Everyone\n        from pyramid.security import Authenticated\n        request = DummyRequest(session={'userid':'fred'})\n        def callback(userid, request):\n            return ['group.foo']\n        policy = self._makeOne(callback)\n        self.assertEqual(policy.effective_principals(request),\n                         [Everyone, Authenticated, 'fred', 'group.foo'])\n\n    def test_remember(self):\n        request = DummyRequest()\n        policy = self._makeOne()\n        result = policy.remember(request, 'fred')\n        self.assertEqual(request.session.get('userid'), 'fred')\n        self.assertEqual(result, [])\n\n    def test_forget(self):\n        request = DummyRequest(session={'userid':'fred'})\n        policy = self._makeOne()\n        result = policy.forget(request)\n        self.assertEqual(request.session.get('userid'), None)\n        self.assertEqual(result, [])\n\n    def test_forget_no_identity(self):\n        request = DummyRequest()\n        policy = self._makeOne()\n        result = policy.forget(request)\n        self.assertEqual(request.session.get('userid'), None)\n        self.assertEqual(result, [])\n\nclass TestBasicAuthAuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import BasicAuthAuthenticationPolicy as cls\n        return cls\n\n    def _makeOne(self, check):\n        return self._getTargetClass()(check, realm='SomeRealm')\n\n    def test_class_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyClass\n        from pyramid.interfaces import IAuthenticationPolicy\n        verifyClass(IAuthenticationPolicy, self._getTargetClass())\n\n    def test_unauthenticated_userid(self):\n        import base64\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Basic %s' % base64.b64encode(\n            bytes_('chrisr:password')).decode('ascii')\n        policy = self._makeOne(None)\n        self.assertEqual(policy.unauthenticated_userid(request), 'chrisr')\n\n    def test_unauthenticated_userid_no_credentials(self):\n        request = testing.DummyRequest()\n        policy = self._makeOne(None)\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_unauthenticated_bad_header(self):\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = '...'\n        policy = self._makeOne(None)\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_unauthenticated_userid_not_basic(self):\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Complicated things'\n        policy = self._makeOne(None)\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_unauthenticated_userid_corrupt_base64(self):\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Basic chrisr:password'\n        policy = self._makeOne(None)\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_authenticated_userid(self):\n        import base64\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Basic %s' % base64.b64encode(\n            bytes_('chrisr:password')).decode('ascii')\n        def check(username, password, request):\n            return []\n        policy = self._makeOne(check)\n        self.assertEqual(policy.authenticated_userid(request), 'chrisr')\n\n    def test_authenticated_userid_utf8(self):\n        import base64\n        request = testing.DummyRequest()\n        inputs = (b'm\\xc3\\xb6rk\\xc3\\xb6:'\n                  b'm\\xc3\\xb6rk\\xc3\\xb6password').decode('utf-8')\n        request.headers['Authorization'] = 'Basic %s' % (\n            base64.b64encode(inputs.encode('utf-8')).decode('latin-1'))\n        def check(username, password, request):\n            return []\n        policy = self._makeOne(check)\n        self.assertEqual(policy.authenticated_userid(request),\n                         b'm\\xc3\\xb6rk\\xc3\\xb6'.decode('utf-8'))\n\n    def test_authenticated_userid_latin1(self):\n        import base64\n        request = testing.DummyRequest()\n        inputs = (b'm\\xc3\\xb6rk\\xc3\\xb6:'\n                  b'm\\xc3\\xb6rk\\xc3\\xb6password').decode('utf-8')\n        request.headers['Authorization'] = 'Basic %s' % (\n            base64.b64encode(inputs.encode('latin-1')).decode('latin-1'))\n        def check(username, password, request):\n            return []\n        policy = self._makeOne(check)\n        self.assertEqual(policy.authenticated_userid(request),\n                         b'm\\xc3\\xb6rk\\xc3\\xb6'.decode('utf-8'))\n\n    def test_unauthenticated_userid_invalid_payload(self):\n        import base64\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Basic %s' % base64.b64encode(\n            bytes_('chrisrpassword')).decode('ascii')\n        policy = self._makeOne(None)\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_remember(self):\n        policy = self._makeOne(None)\n        self.assertEqual(policy.remember(None, None), [])\n\n    def test_forget(self):\n        policy = self._makeOne(None)\n        self.assertEqual(policy.forget(None), [\n            ('WWW-Authenticate', 'Basic realm=\"SomeRealm\"')])\n\nclass TestSimpleSerializer(unittest.TestCase):\n    def _makeOne(self):\n        from pyramid.authentication import _SimpleSerializer\n        return _SimpleSerializer()\n\n    def test_loads(self):\n        inst = self._makeOne()\n        self.assertEqual(inst.loads(b'abc'), text_('abc'))\n\n    def test_dumps(self):\n        inst = self._makeOne()\n        self.assertEqual(inst.dumps('abc'), bytes_('abc'))\n        \nclass DummyContext:\n    pass\n\nclass DummyCookies(object):\n    def __init__(self, cookie):\n        self.cookie = cookie\n\n    def get(self, name):\n        return self.cookie\n\nclass DummyRequest:\n    domain = 'localhost'\n    def __init__(self, environ=None, session=None, registry=None, cookie=None):\n        self.environ = environ or {}\n        self.session = session or {}\n        self.registry = registry\n        self.callbacks = []\n        self.cookies = DummyCookies(cookie)\n\n    def add_response_callback(self, callback):\n        self.callbacks.append(callback)\n\nclass DummyWhoPlugin:\n    def remember(self, environ, identity):\n        return environ, identity\n\n    def forget(self, environ, identity):\n        return environ, identity\n\nclass DummyCookieHelper:\n    def __init__(self, result):\n        self.result = result\n\n    def identify(self, *arg, **kw):\n        return self.result\n\n    def remember(self, *arg, **kw):\n        self.kw = kw\n        return []\n\n    def forget(self, *arg):\n        return []\n\nclass DummyAuthTktModule(object):\n    def __init__(self, timestamp=0, userid='userid', tokens=(), user_data='',\n                 parse_raise=False, hashalg=\"md5\"):\n        self.timestamp = timestamp\n        self.userid = userid\n        self.tokens = tokens\n        self.user_data = user_data\n        self.parse_raise = parse_raise\n        self.hashalg = hashalg\n        def parse_ticket(secret, value, remote_addr, hashalg):\n            self.secret = secret\n            self.value = value\n            self.remote_addr = remote_addr\n            if self.parse_raise:\n                raise self.BadTicket()\n            return self.timestamp, self.userid, self.tokens, self.user_data\n        self.parse_ticket = parse_ticket\n\n        class AuthTicket(object):\n            def __init__(self, secret, userid, remote_addr, **kw):\n                self.secret = secret\n                self.userid = userid\n                self.remote_addr = remote_addr\n                self.kw = kw\n\n            def cookie_value(self):\n                result = {\n                    'secret':self.secret,\n                    'userid':self.userid,\n                    'remote_addr':self.remote_addr\n                    }\n                result.update(self.kw)\n                tokens = result.pop('tokens', None)\n                if tokens is not None:\n                    tokens = '|'.join(tokens)\n                    result['tokens'] = tokens\n                items = sorted(result.items())\n                new_items = []\n                for k, v in items:\n                    if isinstance(v, bytes):\n                        v = text_(v)\n                    new_items.append((k,v))\n                result = '/'.join(['%s=%s' % (k, v) for k,v in new_items ])\n                return result\n        self.AuthTicket = AuthTicket\n\n    class BadTicket(Exception):\n        pass\n\nclass DummyResponse:\n    def __init__(self):\n        self.headerlist = []\n\n",
            "new_file_content": "import unittest\nimport warnings\nfrom pyramid import testing\nfrom pyramid.compat import (\n    text_,\n    bytes_,\n    )\n\nclass TestCallbackAuthenticationPolicyDebugging(unittest.TestCase):\n    def setUp(self):\n        from pyramid.interfaces import IDebugLogger\n        self.config = testing.setUp()\n        self.config.registry.registerUtility(self, IDebugLogger)\n        self.messages = []\n\n    def tearDown(self):\n        del self.config\n\n    def debug(self, msg):\n        self.messages.append(msg)\n\n    def _makeOne(self, userid=None, callback=None):\n        from pyramid.authentication import CallbackAuthenticationPolicy\n        class MyAuthenticationPolicy(CallbackAuthenticationPolicy):\n            def unauthenticated_userid(self, request):\n                return userid\n        policy = MyAuthenticationPolicy()\n        policy.debug = True\n        policy.callback = callback\n        return policy\n\n    def test_authenticated_userid_no_unauthenticated_userid(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), None)\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            'pyramid.tests.test_authentication.MyAuthenticationPolicy.'\n            'authenticated_userid: call to unauthenticated_userid returned '\n            'None; returning None')\n\n    def test_authenticated_userid_no_callback(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne(userid='fred')\n        self.assertEqual(policy.authenticated_userid(request), 'fred')\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n             \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"authenticated_userid: there was no groupfinder callback; \"\n            \"returning 'fred'\")\n\n    def test_authenticated_userid_with_callback_fail(self):\n        request = DummyRequest(registry=self.config.registry)\n        def callback(userid, request):\n            return None\n        policy = self._makeOne(userid='fred', callback=callback)\n        self.assertEqual(policy.authenticated_userid(request), None)\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            'pyramid.tests.test_authentication.MyAuthenticationPolicy.'\n            'authenticated_userid: groupfinder callback returned None; '\n            'returning None')\n\n    def test_authenticated_userid_with_callback_success(self):\n        request = DummyRequest(registry=self.config.registry)\n        def callback(userid, request):\n            return []\n        policy = self._makeOne(userid='fred', callback=callback)\n        self.assertEqual(policy.authenticated_userid(request), 'fred')\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"authenticated_userid: groupfinder callback returned []; \"\n            \"returning 'fred'\")\n\n    def test_authenticated_userid_fails_cleaning_as_Authenticated(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne(userid='system.Authenticated')\n        self.assertEqual(policy.authenticated_userid(request), None)\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"authenticated_userid: use of userid 'system.Authenticated' is \"\n            \"disallowed by any built-in Pyramid security policy, returning \"\n            \"None\")\n\n    def test_authenticated_userid_fails_cleaning_as_Everyone(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne(userid='system.Everyone')\n        self.assertEqual(policy.authenticated_userid(request), None)\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"authenticated_userid: use of userid 'system.Everyone' is \"\n            \"disallowed by any built-in Pyramid security policy, returning \"\n            \"None\")\n\n    def test_effective_principals_no_unauthenticated_userid(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request),\n                         ['system.Everyone'])\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: unauthenticated_userid returned None; \"\n            \"returning ['system.Everyone']\")\n\n    def test_effective_principals_no_callback(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne(userid='fred')\n        self.assertEqual(\n            policy.effective_principals(request),\n            ['system.Everyone', 'system.Authenticated', 'fred'])\n        self.assertEqual(len(self.messages), 2)\n        self.assertEqual(\n            self.messages[0],\n            'pyramid.tests.test_authentication.MyAuthenticationPolicy.'\n            'effective_principals: groupfinder callback is None, so groups '\n            'is []')\n        self.assertEqual(\n            self.messages[1],\n            \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: returning effective principals: \"\n            \"['system.Everyone', 'system.Authenticated', 'fred']\")\n\n    def test_effective_principals_with_callback_fail(self):\n        request = DummyRequest(registry=self.config.registry)\n        def callback(userid, request):\n            return None\n        policy = self._makeOne(userid='fred', callback=callback)\n        self.assertEqual(\n            policy.effective_principals(request), ['system.Everyone'])\n        self.assertEqual(len(self.messages), 2)\n        self.assertEqual(\n            self.messages[0],\n            'pyramid.tests.test_authentication.MyAuthenticationPolicy.'\n            'effective_principals: groupfinder callback returned None as '\n            'groups')\n        self.assertEqual(\n            self.messages[1],\n            \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: returning effective principals: \"\n            \"['system.Everyone']\")\n\n    def test_effective_principals_with_callback_success(self):\n        request = DummyRequest(registry=self.config.registry)\n        def callback(userid, request):\n            return []\n        policy = self._makeOne(userid='fred', callback=callback)\n        self.assertEqual(\n            policy.effective_principals(request),\n            ['system.Everyone', 'system.Authenticated', 'fred'])\n        self.assertEqual(len(self.messages), 2)\n        self.assertEqual(\n            self.messages[0],\n            'pyramid.tests.test_authentication.MyAuthenticationPolicy.'\n            'effective_principals: groupfinder callback returned [] as groups')\n        self.assertEqual(\n            self.messages[1],\n            \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: returning effective principals: \"\n            \"['system.Everyone', 'system.Authenticated', 'fred']\")\n\n    def test_effective_principals_with_unclean_principal_Authenticated(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne(userid='system.Authenticated')\n        self.assertEqual(\n            policy.effective_principals(request),\n            ['system.Everyone'])\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: unauthenticated_userid returned disallowed \"\n            \"'system.Authenticated'; returning ['system.Everyone'] as if it \"\n            \"was None\")\n\n    def test_effective_principals_with_unclean_principal_Everyone(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne(userid='system.Everyone')\n        self.assertEqual(\n            policy.effective_principals(request),\n            ['system.Everyone'])\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: unauthenticated_userid returned disallowed \"\n            \"'system.Everyone'; returning ['system.Everyone'] as if it \"\n            \"was None\")\n\nclass TestRepozeWho1AuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import RepozeWho1AuthenticationPolicy\n        return RepozeWho1AuthenticationPolicy\n\n    def _makeOne(self, identifier_name='auth_tkt', callback=None):\n        return self._getTargetClass()(identifier_name, callback)\n\n    def test_class_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyClass\n        from pyramid.interfaces import IAuthenticationPolicy\n        verifyClass(IAuthenticationPolicy, self._getTargetClass())\n\n    def test_instance_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyObject\n        from pyramid.interfaces import IAuthenticationPolicy\n        verifyObject(IAuthenticationPolicy, self._makeOne())\n\n    def test_unauthenticated_userid_returns_None(self):\n        request = DummyRequest({})\n        policy = self._makeOne()\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_unauthenticated_userid(self):\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'fred'}})\n        policy = self._makeOne()\n        self.assertEqual(policy.unauthenticated_userid(request), 'fred')\n\n    def test_authenticated_userid_None(self):\n        request = DummyRequest({})\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid(self):\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'fred'}})\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), 'fred')\n\n    def test_authenticated_userid_repoze_who_userid_is_None(self):\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':None}})\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid_with_callback_returns_None(self):\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'fred'}})\n        def callback(identity, request):\n            return None\n        policy = self._makeOne(callback=callback)\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid_with_callback_returns_something(self):\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'fred'}})\n        def callback(identity, request):\n            return ['agroup']\n        policy = self._makeOne(callback=callback)\n        self.assertEqual(policy.authenticated_userid(request), 'fred')\n\n    def test_authenticated_userid_unclean_principal_Authenticated(self):\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'system.Authenticated'}}\n            )\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid_unclean_principal_Everyone(self):\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'system.Everyone'}}\n            )\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_effective_principals_None(self):\n        from pyramid.security import Everyone\n        request = DummyRequest({})\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals_userid_only(self):\n        from pyramid.security import Everyone\n        from pyramid.security import Authenticated\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'fred'}})\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request),\n                         [Everyone, Authenticated, 'fred'])\n\n    def test_effective_principals_userid_and_groups(self):\n        from pyramid.security import Everyone\n        from pyramid.security import Authenticated\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'fred',\n                                    'groups':['quux', 'biz']}})\n        def callback(identity, request):\n            return identity['groups']\n        policy = self._makeOne(callback=callback)\n        self.assertEqual(policy.effective_principals(request),\n                         [Everyone, Authenticated, 'fred', 'quux', 'biz'])\n\n    def test_effective_principals_userid_callback_returns_None(self):\n        from pyramid.security import Everyone\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'fred',\n                                    'groups':['quux', 'biz']}})\n        def callback(identity, request):\n            return None\n        policy = self._makeOne(callback=callback)\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals_repoze_who_userid_is_None(self):\n        from pyramid.security import Everyone\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':None}}\n            )\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals_repoze_who_userid_is_unclean_Everyone(self):\n        from pyramid.security import Everyone\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'system.Everyone'}}\n            )\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals_repoze_who_userid_is_unclean_Authenticated(\n        self):\n        from pyramid.security import Everyone\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'system.Authenticated'}}\n            )\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_remember_no_plugins(self):\n        request = DummyRequest({})\n        policy = self._makeOne()\n        result = policy.remember(request, 'fred')\n        self.assertEqual(result, [])\n\n    def test_remember(self):\n        authtkt = DummyWhoPlugin()\n        request = DummyRequest(\n            {'repoze.who.plugins':{'auth_tkt':authtkt}})\n        policy = self._makeOne()\n        result = policy.remember(request, 'fred')\n        self.assertEqual(result[0], request.environ)\n        self.assertEqual(result[1], {'repoze.who.userid':'fred'})\n\n    def test_remember_kwargs(self):\n        authtkt = DummyWhoPlugin()\n        request = DummyRequest(\n            {'repoze.who.plugins':{'auth_tkt':authtkt}})\n        policy = self._makeOne()\n        result = policy.remember(request, 'fred', max_age=23)\n        self.assertEqual(result[1], {'repoze.who.userid':'fred', 'max_age': 23})\n\n    def test_forget_no_plugins(self):\n        request = DummyRequest({})\n        policy = self._makeOne()\n        result = policy.forget(request)\n        self.assertEqual(result, [])\n\n    def test_forget(self):\n        authtkt = DummyWhoPlugin()\n        request = DummyRequest(\n            {'repoze.who.plugins':{'auth_tkt':authtkt},\n             'repoze.who.identity':{'repoze.who.userid':'fred'},\n             })\n        policy = self._makeOne()\n        result = policy.forget(request)\n        self.assertEqual(result[0], request.environ)\n        self.assertEqual(result[1], request.environ['repoze.who.identity'])\n\nclass TestRemoteUserAuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import RemoteUserAuthenticationPolicy\n        return RemoteUserAuthenticationPolicy\n\n    def _makeOne(self, environ_key='REMOTE_USER', callback=None):\n        return self._getTargetClass()(environ_key, callback)\n\n    def test_class_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyClass\n        from pyramid.interfaces import IAuthenticationPolicy\n        verifyClass(IAuthenticationPolicy, self._getTargetClass())\n\n    def test_instance_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyObject\n        from pyramid.interfaces import IAuthenticationPolicy\n        verifyObject(IAuthenticationPolicy, self._makeOne())\n\n    def test_unauthenticated_userid_returns_None(self):\n        request = DummyRequest({})\n        policy = self._makeOne()\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_unauthenticated_userid(self):\n        request = DummyRequest({'REMOTE_USER':'fred'})\n        policy = self._makeOne()\n        self.assertEqual(policy.unauthenticated_userid(request), 'fred')\n\n    def test_authenticated_userid_None(self):\n        request = DummyRequest({})\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid(self):\n        request = DummyRequest({'REMOTE_USER':'fred'})\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), 'fred')\n\n    def test_effective_principals_None(self):\n        from pyramid.security import Everyone\n        request = DummyRequest({})\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals(self):\n        from pyramid.security import Everyone\n        from pyramid.security import Authenticated\n        request = DummyRequest({'REMOTE_USER':'fred'})\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request),\n                         [Everyone, Authenticated, 'fred'])\n\n    def test_remember(self):\n        request = DummyRequest({'REMOTE_USER':'fred'})\n        policy = self._makeOne()\n        result = policy.remember(request, 'fred')\n        self.assertEqual(result, [])\n\n    def test_forget(self):\n        request = DummyRequest({'REMOTE_USER':'fred'})\n        policy = self._makeOne()\n        result = policy.forget(request)\n        self.assertEqual(result, [])\n\nclass TestAuthTktAuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import AuthTktAuthenticationPolicy\n        return AuthTktAuthenticationPolicy\n\n    def _makeOne(self, callback, cookieidentity, **kw):\n        inst = self._getTargetClass()('secret', callback, **kw)\n        inst.cookie = DummyCookieHelper(cookieidentity)\n        return inst\n\n    def setUp(self):\n        self.warnings = warnings.catch_warnings()\n        self.warnings.__enter__()\n        warnings.simplefilter('ignore', DeprecationWarning)\n\n    def tearDown(self):\n        self.warnings.__exit__(None, None, None)\n\n    def test_allargs(self):\n        # pass all known args\n        inst = self._getTargetClass()(\n            'secret', callback=None, cookie_name=None, secure=False,\n            include_ip=False, timeout=None, reissue_time=None,\n            hashalg='sha512',\n            )\n        self.assertEqual(inst.callback, None)\n\n    def test_hashalg_override(self):\n        # important to ensure hashalg is passed to cookie helper\n        inst = self._getTargetClass()('secret', hashalg='sha512')\n        self.assertEqual(inst.cookie.hashalg, 'sha512')\n\n    def test_unauthenticated_userid_returns_None(self):\n        request = DummyRequest({})\n        policy = self._makeOne(None, None)\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_unauthenticated_userid(self):\n        request = DummyRequest({'REMOTE_USER':'fred'})\n        policy = self._makeOne(None, {'userid':'fred'})\n        self.assertEqual(policy.unauthenticated_userid(request), 'fred')\n\n    def test_authenticated_userid_no_cookie_identity(self):\n        request = DummyRequest({})\n        policy = self._makeOne(None, None)\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid_callback_returns_None(self):\n        request = DummyRequest({})\n        def callback(userid, request):\n            return None\n        policy = self._makeOne(callback, {'userid':'fred'})\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid(self):\n        request = DummyRequest({})\n        def callback(userid, request):\n            return True\n        policy = self._makeOne(callback, {'userid':'fred'})\n        self.assertEqual(policy.authenticated_userid(request), 'fred')\n\n    def test_effective_principals_no_cookie_identity(self):\n        from pyramid.security import Everyone\n        request = DummyRequest({})\n        policy = self._makeOne(None, None)\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals_callback_returns_None(self):\n        from pyramid.security import Everyone\n        request = DummyRequest({})\n        def callback(userid, request):\n            return None\n        policy = self._makeOne(callback, {'userid':'fred'})\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals(self):\n        from pyramid.security import Everyone\n        from pyramid.security import Authenticated\n        request = DummyRequest({})\n        def callback(userid, request):\n            return ['group.foo']\n        policy = self._makeOne(callback, {'userid':'fred'})\n        self.assertEqual(policy.effective_principals(request),\n                             [Everyone, Authenticated, 'fred', 'group.foo'])\n\n    def test_remember(self):\n        request = DummyRequest({})\n        policy = self._makeOne(None, None)\n        result = policy.remember(request, 'fred')\n        self.assertEqual(result, [])\n\n    def test_remember_with_extra_kargs(self):\n        request = DummyRequest({})\n        policy = self._makeOne(None, None)\n        result = policy.remember(request, 'fred', a=1, b=2)\n        self.assertEqual(policy.cookie.kw, {'a':1, 'b':2})\n        self.assertEqual(result, [])\n\n    def test_forget(self):\n        request = DummyRequest({})\n        policy = self._makeOne(None, None)\n        result = policy.forget(request)\n        self.assertEqual(result, [])\n\n    def test_class_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyClass\n        from pyramid.interfaces import IAuthenticationPolicy\n        verifyClass(IAuthenticationPolicy, self._getTargetClass())\n\n    def test_instance_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyObject\n        from pyramid.interfaces import IAuthenticationPolicy\n        verifyObject(IAuthenticationPolicy, self._makeOne(None, None))\n\nclass TestAuthTktCookieHelper(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import AuthTktCookieHelper\n        return AuthTktCookieHelper\n\n    def _makeOne(self, *arg, **kw):\n        helper = self._getTargetClass()(*arg, **kw)\n        # laziness after moving auth_tkt classes and funcs into\n        # authentication module\n        auth_tkt = DummyAuthTktModule()\n        helper.auth_tkt = auth_tkt\n        helper.AuthTicket = auth_tkt.AuthTicket\n        helper.parse_ticket = auth_tkt.parse_ticket\n        helper.BadTicket = auth_tkt.BadTicket\n        return helper\n\n    def _makeRequest(self, cookie=None, ipv6=False):\n        environ = {'wsgi.version': (1,0)}\n\n        if ipv6 is False:\n            environ['REMOTE_ADDR'] = '1.1.1.1'\n        else:\n            environ['REMOTE_ADDR'] = '::1'\n        environ['SERVER_NAME'] = 'localhost'\n        return DummyRequest(environ, cookie=cookie)\n\n    def _cookieValue(self, cookie):\n        items = cookie.value.split('/')\n        D = {}\n        for item in items:\n            k, v = item.split('=', 1)\n            D[k] = v\n        return D\n\n    def _parseHeaders(self, headers):\n        return [ self._parseHeader(header) for header in headers ]\n\n    def _parseHeader(self, header):\n        cookie = self._parseCookie(header[1])\n        return cookie\n\n    def _parseCookie(self, cookie):\n        from pyramid.compat import SimpleCookie\n        cookies = SimpleCookie()\n        cookies.load(cookie)\n        return cookies.get('auth_tkt')\n\n    def test_init_cookie_str_reissue_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', reissue_time='invalid value')\n\n    def test_init_cookie_str_timeout_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', timeout='invalid value')\n\n    def test_init_cookie_str_max_age_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', max_age='invalid value')\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_str_timeout(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_str_reissue(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time='0')\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        helper.auth_tkt.tokens = (text_('a'), )\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n\n    def test_identify_cookie_reissue_already_reissued_this_request(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        request._authtkt_reissued = True\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_notyet(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=10)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_revoked_by_forget(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.forget(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_revoked_by_remember(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.remember(request, 'bob')\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_with_tokens_default(self):\n        # see https://github.com/Pylons/pyramid/issues#issue/108\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        auth_tkt = DummyAuthTktModule(tokens=[''])\n        helper.auth_tkt = auth_tkt\n        helper.AuthTicket = auth_tkt.AuthTicket\n        helper.parse_ticket = auth_tkt.parse_ticket\n        helper.BadTicket = auth_tkt.BadTicket\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](None, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=/\" in response.headerlist[0][1])\n\n    def test_remember(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_include_ip(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_path(self):\n        helper = self._makeOne('secret', include_ip=True,\n                               path=\"/cgi-bin/app.cgi/\")\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith(\n            '; Domain=localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith(\n            '; Domain=.localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_http_only(self):\n        helper = self._makeOne('secret', include_ip=True, http_only=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; HttpOnly'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_secure(self):\n        helper = self._makeOne('secret', include_ip=True, secure=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[0][1])\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_wild_domain_disabled(self):\n        helper = self._makeOne('secret', wild_domain=False)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 2)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain(self):\n        helper = self._makeOne('secret', parent_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain_supercedes_wild_domain(self):\n        helper = self._makeOne('secret', parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n\n    def test_remember_explicit_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga')\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_domain_supercedes_parent_and_wild_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga',\n                parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n\n    def test_remember_binary_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, b'userid')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(b'userid').strip()))\n        self.assertEqual(val['user_data'], 'userid_type:b64str')\n\n    def test_remember_int_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 1)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_long_userid(self):\n        from pyramid.compat import long\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, long(1))\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_unicode_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = text_(b'\\xc2\\xa9', 'utf-8')\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(userid.encode('utf-8'))))\n        self.assertEqual(val['user_data'], 'userid_type:b64unicode')\n\n    def test_remember_insane_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = object()\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        value = values[0]\n        self.assertTrue('userid' in value.value)\n\n    def test_remember_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age=500)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age='500')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age_invalid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'userid', max_age='invalid value')\n\n    def test_remember_tokens(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'other', tokens=('foo', 'bar'))\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[0][1])\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[1][1])\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[2][1])\n\n    def test_remember_unicode_but_ascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'foo', 'utf-8')\n        result = helper.remember(request, 'other', tokens=(la,))\n        # tokens must be str type on both Python 2 and 3\n        self.assertTrue(\"/tokens=foo/\" in result[0][1])\n\n    def test_remember_nonascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'La Pe\\xc3\\xb1a', 'utf-8')\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=(la,))\n\n    def test_remember_invalid_token_format(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('foo bar',))\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('1bar',))\n\n    def test_forget(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        headers = helper.forget(request)\n        self.assertEqual(len(headers), 3)\n        name, value = headers[0]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[1]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[2]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=.localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n\nclass TestAuthTicket(unittest.TestCase):\n    def _makeOne(self, *arg, **kw):\n        from pyramid.authentication import AuthTicket\n        return AuthTicket(*arg, **kw)\n\n    def test_ctor_with_tokens(self):\n        ticket = self._makeOne('secret', 'userid', 'ip', tokens=('a', 'b'))\n        self.assertEqual(ticket.tokens, 'a,b')\n\n    def test_ctor_with_time(self):\n        ticket = self._makeOne('secret', 'userid', 'ip', time='time')\n        self.assertEqual(ticket.time, 'time')\n\n    def test_digest(self):\n        ticket = self._makeOne('secret', 'userid', '0.0.0.0', time=10)\n        result = ticket.digest()\n        self.assertEqual(result, '126fd6224912187ee9ffa80e0b81420c')\n\n    def test_digest_sha512(self):\n        ticket = self._makeOne('secret', 'userid', '0.0.0.0',\n                               time=10, hashalg='sha512')\n        result = ticket.digest()\n        self.assertEqual(result, '74770b2e0d5b1a54c2a466ec567a40f7d7823576aa49'\\\n                                 '3c65fc3445e9b44097f4a80410319ef8cb256a2e60b9'\\\n                                 'c2002e48a9e33a3e8ee4379352c04ef96d2cb278')\n\n    def test_cookie_value(self):\n        ticket = self._makeOne('secret', 'userid', '0.0.0.0', time=10,\n                               tokens=('a', 'b'))\n        result = ticket.cookie_value()\n        self.assertEqual(result,\n                         '66f9cc3e423dc57c91df696cf3d1f0d80000000auserid!a,b!')\n\n    def test_ipv4(self):\n        ticket = self._makeOne('secret', 'userid', '198.51.100.1',\n                               time=10, hashalg='sha256')\n        result = ticket.cookie_value()\n        self.assertEqual(result, 'b3e7156db4f8abde4439c4a6499a0668f9e7ffd7fa27b'\\\n                                 '798400ecdade8d76c530000000auserid!')\n\n    def test_ipv6(self):\n        ticket = self._makeOne('secret', 'userid', '2001:db8::1',\n                               time=10, hashalg='sha256')\n        result = ticket.cookie_value()\n        self.assertEqual(result, 'd025b601a0f12ca6d008aa35ff3a22b7d8f3d1c1456c8'\\\n                                 '5becf8760cd7a2fa4910000000auserid!')\n\nclass TestBadTicket(unittest.TestCase):\n    def _makeOne(self, msg, expected=None):\n        from pyramid.authentication import BadTicket\n        return BadTicket(msg, expected)\n\n    def test_it(self):\n        exc = self._makeOne('msg', expected=True)\n        self.assertEqual(exc.expected, True)\n        self.assertTrue(isinstance(exc, Exception))\n\nclass Test_parse_ticket(unittest.TestCase):\n    def _callFUT(self, secret, ticket, ip, hashalg='md5'):\n        from pyramid.authentication import parse_ticket\n        return parse_ticket(secret, ticket, ip, hashalg)\n\n    def _assertRaisesBadTicket(self, secret, ticket, ip, hashalg='md5'):\n        from pyramid.authentication import BadTicket\n        self.assertRaises(BadTicket,self._callFUT, secret, ticket, ip, hashalg)\n\n    def test_bad_timestamp(self):\n        ticket = 'x' * 64\n        self._assertRaisesBadTicket('secret', ticket, 'ip')\n\n    def test_bad_userid_or_data(self):\n        ticket = 'x' * 32 + '11111111' + 'x' * 10\n        self._assertRaisesBadTicket('secret', ticket, 'ip')\n\n    def test_digest_sig_incorrect(self):\n        ticket = 'x' * 32 + '11111111' + 'a!b!c'\n        self._assertRaisesBadTicket('secret', ticket, '0.0.0.0')\n\n    def test_correct_with_user_data(self):\n        ticket = text_('66f9cc3e423dc57c91df696cf3d1f0d80000000auserid!a,b!')\n        result = self._callFUT('secret', ticket, '0.0.0.0')\n        self.assertEqual(result, (10, 'userid', ['a', 'b'], ''))\n\n    def test_correct_with_user_data_sha512(self):\n        ticket = text_('7d947cdef99bad55f8e3382a8bd089bb9dd0547f7925b7d189adc1'\n                       '160cab0ec0e6888faa41eba641a18522b26f19109f3ffafb769767'\n                       'ba8a26d02aaeae56599a0000000auserid!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 = text_('b3e7156db4f8abde4439c4a6499a0668f9e7ffd7fa27b798400ecd'\n                       'ade8d76c530000000auserid!')\n        result = self._callFUT('secret', ticket, '198.51.100.1', 'sha256')\n        self.assertEqual(result, (10, 'userid', [''], ''))\n\n    def test_ipv6(self):\n        ticket = text_('d025b601a0f12ca6d008aa35ff3a22b7d8f3d1c1456c85becf8760'\n                       'cd7a2fa4910000000auserid!')\n        result = self._callFUT('secret', ticket, '2001:db8::1', 'sha256')\n        self.assertEqual(result, (10, 'userid', [''], ''))\n\nclass TestSessionAuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import SessionAuthenticationPolicy\n        return SessionAuthenticationPolicy\n\n    def _makeOne(self, callback=None, prefix=''):\n        return self._getTargetClass()(prefix=prefix, callback=callback)\n\n    def test_class_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyClass\n        from pyramid.interfaces import IAuthenticationPolicy\n        verifyClass(IAuthenticationPolicy, self._getTargetClass())\n\n    def test_instance_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyObject\n        from pyramid.interfaces import IAuthenticationPolicy\n        verifyObject(IAuthenticationPolicy, self._makeOne())\n\n    def test_unauthenticated_userid_returns_None(self):\n        request = DummyRequest()\n        policy = self._makeOne()\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_unauthenticated_userid(self):\n        request = DummyRequest(session={'userid':'fred'})\n        policy = self._makeOne()\n        self.assertEqual(policy.unauthenticated_userid(request), 'fred')\n\n    def test_authenticated_userid_no_cookie_identity(self):\n        request = DummyRequest()\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid_callback_returns_None(self):\n        request = DummyRequest(session={'userid':'fred'})\n        def callback(userid, request):\n            return None\n        policy = self._makeOne(callback)\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid(self):\n        request = DummyRequest(session={'userid':'fred'})\n        def callback(userid, request):\n            return True\n        policy = self._makeOne(callback)\n        self.assertEqual(policy.authenticated_userid(request), 'fred')\n\n    def test_effective_principals_no_identity(self):\n        from pyramid.security import Everyone\n        request = DummyRequest()\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals_callback_returns_None(self):\n        from pyramid.security import Everyone\n        request = DummyRequest(session={'userid':'fred'})\n        def callback(userid, request):\n            return None\n        policy = self._makeOne(callback)\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals(self):\n        from pyramid.security import Everyone\n        from pyramid.security import Authenticated\n        request = DummyRequest(session={'userid':'fred'})\n        def callback(userid, request):\n            return ['group.foo']\n        policy = self._makeOne(callback)\n        self.assertEqual(policy.effective_principals(request),\n                         [Everyone, Authenticated, 'fred', 'group.foo'])\n\n    def test_remember(self):\n        request = DummyRequest()\n        policy = self._makeOne()\n        result = policy.remember(request, 'fred')\n        self.assertEqual(request.session.get('userid'), 'fred')\n        self.assertEqual(result, [])\n\n    def test_forget(self):\n        request = DummyRequest(session={'userid':'fred'})\n        policy = self._makeOne()\n        result = policy.forget(request)\n        self.assertEqual(request.session.get('userid'), None)\n        self.assertEqual(result, [])\n\n    def test_forget_no_identity(self):\n        request = DummyRequest()\n        policy = self._makeOne()\n        result = policy.forget(request)\n        self.assertEqual(request.session.get('userid'), None)\n        self.assertEqual(result, [])\n\nclass TestBasicAuthAuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import BasicAuthAuthenticationPolicy as cls\n        return cls\n\n    def _makeOne(self, check):\n        return self._getTargetClass()(check, realm='SomeRealm')\n\n    def test_class_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyClass\n        from pyramid.interfaces import IAuthenticationPolicy\n        verifyClass(IAuthenticationPolicy, self._getTargetClass())\n\n    def test_unauthenticated_userid(self):\n        import base64\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Basic %s' % base64.b64encode(\n            bytes_('chrisr:password')).decode('ascii')\n        policy = self._makeOne(None)\n        self.assertEqual(policy.unauthenticated_userid(request), 'chrisr')\n\n    def test_unauthenticated_userid_no_credentials(self):\n        request = testing.DummyRequest()\n        policy = self._makeOne(None)\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_unauthenticated_bad_header(self):\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = '...'\n        policy = self._makeOne(None)\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_unauthenticated_userid_not_basic(self):\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Complicated things'\n        policy = self._makeOne(None)\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_unauthenticated_userid_corrupt_base64(self):\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Basic chrisr:password'\n        policy = self._makeOne(None)\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_authenticated_userid(self):\n        import base64\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Basic %s' % base64.b64encode(\n            bytes_('chrisr:password')).decode('ascii')\n        def check(username, password, request):\n            return []\n        policy = self._makeOne(check)\n        self.assertEqual(policy.authenticated_userid(request), 'chrisr')\n\n    def test_authenticated_userid_utf8(self):\n        import base64\n        request = testing.DummyRequest()\n        inputs = (b'm\\xc3\\xb6rk\\xc3\\xb6:'\n                  b'm\\xc3\\xb6rk\\xc3\\xb6password').decode('utf-8')\n        request.headers['Authorization'] = 'Basic %s' % (\n            base64.b64encode(inputs.encode('utf-8')).decode('latin-1'))\n        def check(username, password, request):\n            return []\n        policy = self._makeOne(check)\n        self.assertEqual(policy.authenticated_userid(request),\n                         b'm\\xc3\\xb6rk\\xc3\\xb6'.decode('utf-8'))\n\n    def test_authenticated_userid_latin1(self):\n        import base64\n        request = testing.DummyRequest()\n        inputs = (b'm\\xc3\\xb6rk\\xc3\\xb6:'\n                  b'm\\xc3\\xb6rk\\xc3\\xb6password').decode('utf-8')\n        request.headers['Authorization'] = 'Basic %s' % (\n            base64.b64encode(inputs.encode('latin-1')).decode('latin-1'))\n        def check(username, password, request):\n            return []\n        policy = self._makeOne(check)\n        self.assertEqual(policy.authenticated_userid(request),\n                         b'm\\xc3\\xb6rk\\xc3\\xb6'.decode('utf-8'))\n\n    def test_unauthenticated_userid_invalid_payload(self):\n        import base64\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Basic %s' % base64.b64encode(\n            bytes_('chrisrpassword')).decode('ascii')\n        policy = self._makeOne(None)\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_remember(self):\n        policy = self._makeOne(None)\n        self.assertEqual(policy.remember(None, None), [])\n\n    def test_forget(self):\n        policy = self._makeOne(None)\n        self.assertEqual(policy.forget(None), [\n            ('WWW-Authenticate', 'Basic realm=\"SomeRealm\"')])\n\nclass TestSimpleSerializer(unittest.TestCase):\n    def _makeOne(self):\n        from pyramid.authentication import _SimpleSerializer\n        return _SimpleSerializer()\n\n    def test_loads(self):\n        inst = self._makeOne()\n        self.assertEqual(inst.loads(b'abc'), text_('abc'))\n\n    def test_dumps(self):\n        inst = self._makeOne()\n        self.assertEqual(inst.dumps('abc'), bytes_('abc'))\n        \nclass DummyContext:\n    pass\n\nclass DummyCookies(object):\n    def __init__(self, cookie):\n        self.cookie = cookie\n\n    def get(self, name):\n        return self.cookie\n\nclass DummyRequest:\n    domain = 'localhost'\n    def __init__(self, environ=None, session=None, registry=None, cookie=None):\n        self.environ = environ or {}\n        self.session = session or {}\n        self.registry = registry\n        self.callbacks = []\n        self.cookies = DummyCookies(cookie)\n\n    def add_response_callback(self, callback):\n        self.callbacks.append(callback)\n\nclass DummyWhoPlugin:\n    def remember(self, environ, identity):\n        return environ, identity\n\n    def forget(self, environ, identity):\n        return environ, identity\n\nclass DummyCookieHelper:\n    def __init__(self, result):\n        self.result = result\n\n    def identify(self, *arg, **kw):\n        return self.result\n\n    def remember(self, *arg, **kw):\n        self.kw = kw\n        return []\n\n    def forget(self, *arg):\n        return []\n\nclass DummyAuthTktModule(object):\n    def __init__(self, timestamp=0, userid='userid', tokens=(), user_data='',\n                 parse_raise=False, hashalg=\"md5\"):\n        self.timestamp = timestamp\n        self.userid = userid\n        self.tokens = tokens\n        self.user_data = user_data\n        self.parse_raise = parse_raise\n        self.hashalg = hashalg\n        def parse_ticket(secret, value, remote_addr, hashalg):\n            self.secret = secret\n            self.value = value\n            self.remote_addr = remote_addr\n            if self.parse_raise:\n                raise self.BadTicket()\n            return self.timestamp, self.userid, self.tokens, self.user_data\n        self.parse_ticket = parse_ticket\n\n        class AuthTicket(object):\n            def __init__(self, secret, userid, remote_addr, **kw):\n                self.secret = secret\n                self.userid = userid\n                self.remote_addr = remote_addr\n                self.kw = kw\n\n            def cookie_value(self):\n                result = {\n                    'secret':self.secret,\n                    'userid':self.userid,\n                    'remote_addr':self.remote_addr\n                    }\n                result.update(self.kw)\n                tokens = result.pop('tokens', None)\n                if tokens is not None:\n                    tokens = '|'.join(tokens)\n                    result['tokens'] = tokens\n                items = sorted(result.items())\n                new_items = []\n                for k, v in items:\n                    if isinstance(v, bytes):\n                        v = text_(v)\n                    new_items.append((k,v))\n                result = '/'.join(['%s=%s' % (k, v) for k,v in new_items ])\n                return result\n        self.AuthTicket = AuthTicket\n\n    class BadTicket(Exception):\n        pass\n\nclass DummyResponse:\n    def __init__(self):\n        self.headerlist = []\n\n",
            "header": {
                "file": {
                    "path": "pyramid/tests/test_authentication.py"
                },
                "misc_line": null
            },
            "index_line": {
                "old_commit_hash": "f1308f89e",
                "new_commit_hash": "1a367fd15",
                "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": 600,
                            "length": 6
                        },
                        "new_range": {
                            "start": 600,
                            "length": 15
                        },
                        "section": "class TestAuthTktCookieHelper(unittest.TestCase):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "        cookies.load(cookie)",
                                "type": "context"
                            },
                            {
                                "content": "        return cookies.get('auth_tkt')",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "    def test_init_cookie_str_reissue_invalid(self):",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertRaises(ValueError, self._makeOne, 'secret', reissue_time='invalid value')",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "    def test_init_cookie_str_timeout_invalid(self):",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertRaises(ValueError, self._makeOne, 'secret', timeout='invalid value')",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "    def test_init_cookie_str_max_age_invalid(self):",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertRaises(ValueError, self._makeOne, 'secret', max_age='invalid value')",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "    def test_identify_nocookie(self):",
                                "type": "context"
                            },
                            {
                                "content": "        helper = self._makeOne('secret')",
                                "type": "context"
                            },
                            {
                                "content": "        request = self._makeRequest()",
                                "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        items = cookie.value.split('/')\n        D = {}\n        for item in items:\n            k, v = item.split('=', 1)\n            D[k] = v\n        return D\n\n    def _parseHeaders(self, headers):\n        return [ self._parseHeader(header) for header in headers ]\n\n    def _parseHeader(self, header):\n        cookie = self._parseCookie(header[1])\n        return cookie\n\n    def _parseCookie(self, cookie):\n        from pyramid.compat import SimpleCookie\n        cookies = SimpleCookie()\n        cookies.load(cookie)\n        return cookies.get('auth_tkt')\n\n    def test_init_cookie_str_reissue_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', reissue_time='invalid value')\n\n    def test_init_cookie_str_timeout_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', timeout='invalid value')\n\n    def test_init_cookie_str_max_age_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', max_age='invalid value')\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_str_timeout(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_str_reissue(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time='0')\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        helper.auth_tkt.tokens = (text_('a'), )\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n\n    def test_identify_cookie_reissue_already_reissued_this_request(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        request._authtkt_reissued = True\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_notyet(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=10)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_revoked_by_forget(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.forget(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_revoked_by_remember(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.remember(request, 'bob')\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_with_tokens_default(self):\n        # see https://github.com/Pylons/pyramid/issues#issue/108\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        auth_tkt = DummyAuthTktModule(tokens=[''])\n        helper.auth_tkt = auth_tkt\n        helper.AuthTicket = auth_tkt.AuthTicket\n        helper.parse_ticket = auth_tkt.parse_ticket\n        helper.BadTicket = auth_tkt.BadTicket\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](None, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=/\" in response.headerlist[0][1])\n\n    def test_remember(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_include_ip(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_path(self):\n        helper = self._makeOne('secret', include_ip=True,\n                               path=\"/cgi-bin/app.cgi/\")\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith(\n            '; Domain=localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith(\n            '; Domain=.localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_http_only(self):\n        helper = self._makeOne('secret', include_ip=True, http_only=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; HttpOnly'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_secure(self):\n        helper = self._makeOne('secret', include_ip=True, secure=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[0][1])\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_wild_domain_disabled(self):\n        helper = self._makeOne('secret', wild_domain=False)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 2)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain(self):\n        helper = self._makeOne('secret', parent_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain_supercedes_wild_domain(self):\n        helper = self._makeOne('secret', parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n\n    def test_remember_explicit_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga')\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_domain_supercedes_parent_and_wild_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga',\n                parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n\n    def test_remember_binary_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, b'userid')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(b'userid').strip()))\n        self.assertEqual(val['user_data'], 'userid_type:b64str')\n\n    def test_remember_int_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 1)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_long_userid(self):\n        from pyramid.compat import long\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, long(1))\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_unicode_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = text_(b'\\xc2\\xa9', 'utf-8')\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(userid.encode('utf-8'))))\n        self.assertEqual(val['user_data'], 'userid_type:b64unicode')\n\n    def test_remember_insane_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = object()\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        value = values[0]\n        self.assertTrue('userid' in value.value)\n\n    def test_remember_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age=500)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age='500')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age_invalid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'userid', max_age='invalid value')\n\n    def test_remember_tokens(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'other', tokens=('foo', 'bar'))\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[0][1])\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[1][1])\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[2][1])\n\n    def test_remember_unicode_but_ascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'foo', 'utf-8')\n        result = helper.remember(request, 'other', tokens=(la,))\n        # tokens must be str type on both Python 2 and 3\n        self.assertTrue(\"/tokens=foo/\" in result[0][1])\n\n    def test_remember_nonascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'La Pe\\xc3\\xb1a', 'utf-8')\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=(la,))\n\n    def test_remember_invalid_token_format(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('foo bar',))\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('1bar',))\n\n    def test_forget(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        headers = helper.forget(request)\n        self.assertEqual(len(headers), 3)\n        name, value = headers[0]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[1]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[2]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=.localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 556,
                            "end_lineno": 1179,
                            "parent": null
                        }
                    ],
                    "added_entities": [
                        {
                            "file_name": "pyramid/tests/test_authentication.py",
                            "type": "method",
                            "name": "TestAuthTktCookieHelper.test_init_cookie_str_reissue_invalid",
                            "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        items = cookie.value.split('/')\n        D = {}\n        for item in items:\n            k, v = item.split('=', 1)\n            D[k] = v\n        return D\n\n    def _parseHeaders(self, headers):\n        return [ self._parseHeader(header) for header in headers ]\n\n    def _parseHeader(self, header):\n        cookie = self._parseCookie(header[1])\n        return cookie\n\n    def _parseCookie(self, cookie):\n        from pyramid.compat import SimpleCookie\n        cookies = SimpleCookie()\n        cookies.load(cookie)\n        return cookies.get('auth_tkt')\n\n    def test_init_cookie_str_reissue_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', reissue_time='invalid value')\n\n    def test_init_cookie_str_timeout_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', timeout='invalid value')\n\n    def test_init_cookie_str_max_age_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', max_age='invalid value')\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_str_timeout(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_str_reissue(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time='0')\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        helper.auth_tkt.tokens = (text_('a'), )\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n\n    def test_identify_cookie_reissue_already_reissued_this_request(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        request._authtkt_reissued = True\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_notyet(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=10)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_revoked_by_forget(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.forget(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_revoked_by_remember(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.remember(request, 'bob')\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_with_tokens_default(self):\n        # see https://github.com/Pylons/pyramid/issues#issue/108\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        auth_tkt = DummyAuthTktModule(tokens=[''])\n        helper.auth_tkt = auth_tkt\n        helper.AuthTicket = auth_tkt.AuthTicket\n        helper.parse_ticket = auth_tkt.parse_ticket\n        helper.BadTicket = auth_tkt.BadTicket\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](None, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=/\" in response.headerlist[0][1])\n\n    def test_remember(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_include_ip(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_path(self):\n        helper = self._makeOne('secret', include_ip=True,\n                               path=\"/cgi-bin/app.cgi/\")\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith(\n            '; Domain=localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith(\n            '; Domain=.localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_http_only(self):\n        helper = self._makeOne('secret', include_ip=True, http_only=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; HttpOnly'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_secure(self):\n        helper = self._makeOne('secret', include_ip=True, secure=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[0][1])\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_wild_domain_disabled(self):\n        helper = self._makeOne('secret', wild_domain=False)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 2)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain(self):\n        helper = self._makeOne('secret', parent_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain_supercedes_wild_domain(self):\n        helper = self._makeOne('secret', parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n\n    def test_remember_explicit_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga')\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_domain_supercedes_parent_and_wild_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga',\n                parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n\n    def test_remember_binary_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, b'userid')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(b'userid').strip()))\n        self.assertEqual(val['user_data'], 'userid_type:b64str')\n\n    def test_remember_int_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 1)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_long_userid(self):\n        from pyramid.compat import long\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, long(1))\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_unicode_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = text_(b'\\xc2\\xa9', 'utf-8')\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(userid.encode('utf-8'))))\n        self.assertEqual(val['user_data'], 'userid_type:b64unicode')\n\n    def test_remember_insane_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = object()\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        value = values[0]\n        self.assertTrue('userid' in value.value)\n\n    def test_remember_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age=500)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age='500')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age_invalid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'userid', max_age='invalid value')\n\n    def test_remember_tokens(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'other', tokens=('foo', 'bar'))\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[0][1])\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[1][1])\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[2][1])\n\n    def test_remember_unicode_but_ascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'foo', 'utf-8')\n        result = helper.remember(request, 'other', tokens=(la,))\n        # tokens must be str type on both Python 2 and 3\n        self.assertTrue(\"/tokens=foo/\" in result[0][1])\n\n    def test_remember_nonascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'La Pe\\xc3\\xb1a', 'utf-8')\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=(la,))\n\n    def test_remember_invalid_token_format(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('foo bar',))\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('1bar',))\n\n    def test_forget(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        headers = helper.forget(request)\n        self.assertEqual(len(headers), 3)\n        name, value = headers[0]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[1]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[2]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=.localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 603,
                            "end_lineno": 604,
                            "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        items = cookie.value.split('/')\n        D = {}\n        for item in items:\n            k, v = item.split('=', 1)\n            D[k] = v\n        return D\n\n    def _parseHeaders(self, headers):\n        return [ self._parseHeader(header) for header in headers ]\n\n    def _parseHeader(self, header):\n        cookie = self._parseCookie(header[1])\n        return cookie\n\n    def _parseCookie(self, cookie):\n        from pyramid.compat import SimpleCookie\n        cookies = SimpleCookie()\n        cookies.load(cookie)\n        return cookies.get('auth_tkt')\n\n    def test_init_cookie_str_reissue_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', reissue_time='invalid value')\n\n    def test_init_cookie_str_timeout_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', timeout='invalid value')\n\n    def test_init_cookie_str_max_age_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', max_age='invalid value')\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_str_timeout(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_str_reissue(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time='0')\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        helper.auth_tkt.tokens = (text_('a'), )\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n\n    def test_identify_cookie_reissue_already_reissued_this_request(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        request._authtkt_reissued = True\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_notyet(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=10)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_revoked_by_forget(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.forget(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_revoked_by_remember(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.remember(request, 'bob')\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_with_tokens_default(self):\n        # see https://github.com/Pylons/pyramid/issues#issue/108\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        auth_tkt = DummyAuthTktModule(tokens=[''])\n        helper.auth_tkt = auth_tkt\n        helper.AuthTicket = auth_tkt.AuthTicket\n        helper.parse_ticket = auth_tkt.parse_ticket\n        helper.BadTicket = auth_tkt.BadTicket\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](None, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=/\" in response.headerlist[0][1])\n\n    def test_remember(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_include_ip(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_path(self):\n        helper = self._makeOne('secret', include_ip=True,\n                               path=\"/cgi-bin/app.cgi/\")\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith(\n            '; Domain=localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith(\n            '; Domain=.localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_http_only(self):\n        helper = self._makeOne('secret', include_ip=True, http_only=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; HttpOnly'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_secure(self):\n        helper = self._makeOne('secret', include_ip=True, secure=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[0][1])\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_wild_domain_disabled(self):\n        helper = self._makeOne('secret', wild_domain=False)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 2)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain(self):\n        helper = self._makeOne('secret', parent_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain_supercedes_wild_domain(self):\n        helper = self._makeOne('secret', parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n\n    def test_remember_explicit_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga')\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_domain_supercedes_parent_and_wild_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga',\n                parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n\n    def test_remember_binary_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, b'userid')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(b'userid').strip()))\n        self.assertEqual(val['user_data'], 'userid_type:b64str')\n\n    def test_remember_int_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 1)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_long_userid(self):\n        from pyramid.compat import long\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, long(1))\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_unicode_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = text_(b'\\xc2\\xa9', 'utf-8')\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(userid.encode('utf-8'))))\n        self.assertEqual(val['user_data'], 'userid_type:b64unicode')\n\n    def test_remember_insane_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = object()\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        value = values[0]\n        self.assertTrue('userid' in value.value)\n\n    def test_remember_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age=500)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age='500')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age_invalid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'userid', max_age='invalid value')\n\n    def test_remember_tokens(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'other', tokens=('foo', 'bar'))\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[0][1])\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[1][1])\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[2][1])\n\n    def test_remember_unicode_but_ascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'foo', 'utf-8')\n        result = helper.remember(request, 'other', tokens=(la,))\n        # tokens must be str type on both Python 2 and 3\n        self.assertTrue(\"/tokens=foo/\" in result[0][1])\n\n    def test_remember_nonascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'La Pe\\xc3\\xb1a', 'utf-8')\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=(la,))\n\n    def test_remember_invalid_token_format(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('foo bar',))\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('1bar',))\n\n    def test_forget(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        headers = helper.forget(request)\n        self.assertEqual(len(headers), 3)\n        name, value = headers[0]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[1]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[2]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=.localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 556,
                                "end_lineno": 1179,
                                "parent": null
                            }
                        },
                        {
                            "file_name": "pyramid/tests/test_authentication.py",
                            "type": "method",
                            "name": "TestAuthTktCookieHelper.test_init_cookie_str_timeout_invalid",
                            "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        items = cookie.value.split('/')\n        D = {}\n        for item in items:\n            k, v = item.split('=', 1)\n            D[k] = v\n        return D\n\n    def _parseHeaders(self, headers):\n        return [ self._parseHeader(header) for header in headers ]\n\n    def _parseHeader(self, header):\n        cookie = self._parseCookie(header[1])\n        return cookie\n\n    def _parseCookie(self, cookie):\n        from pyramid.compat import SimpleCookie\n        cookies = SimpleCookie()\n        cookies.load(cookie)\n        return cookies.get('auth_tkt')\n\n    def test_init_cookie_str_reissue_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', reissue_time='invalid value')\n\n    def test_init_cookie_str_timeout_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', timeout='invalid value')\n\n    def test_init_cookie_str_max_age_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', max_age='invalid value')\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_str_timeout(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_str_reissue(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time='0')\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        helper.auth_tkt.tokens = (text_('a'), )\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n\n    def test_identify_cookie_reissue_already_reissued_this_request(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        request._authtkt_reissued = True\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_notyet(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=10)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_revoked_by_forget(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.forget(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_revoked_by_remember(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.remember(request, 'bob')\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_with_tokens_default(self):\n        # see https://github.com/Pylons/pyramid/issues#issue/108\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        auth_tkt = DummyAuthTktModule(tokens=[''])\n        helper.auth_tkt = auth_tkt\n        helper.AuthTicket = auth_tkt.AuthTicket\n        helper.parse_ticket = auth_tkt.parse_ticket\n        helper.BadTicket = auth_tkt.BadTicket\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](None, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=/\" in response.headerlist[0][1])\n\n    def test_remember(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_include_ip(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_path(self):\n        helper = self._makeOne('secret', include_ip=True,\n                               path=\"/cgi-bin/app.cgi/\")\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith(\n            '; Domain=localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith(\n            '; Domain=.localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_http_only(self):\n        helper = self._makeOne('secret', include_ip=True, http_only=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; HttpOnly'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_secure(self):\n        helper = self._makeOne('secret', include_ip=True, secure=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[0][1])\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_wild_domain_disabled(self):\n        helper = self._makeOne('secret', wild_domain=False)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 2)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain(self):\n        helper = self._makeOne('secret', parent_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain_supercedes_wild_domain(self):\n        helper = self._makeOne('secret', parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n\n    def test_remember_explicit_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga')\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_domain_supercedes_parent_and_wild_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga',\n                parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n\n    def test_remember_binary_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, b'userid')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(b'userid').strip()))\n        self.assertEqual(val['user_data'], 'userid_type:b64str')\n\n    def test_remember_int_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 1)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_long_userid(self):\n        from pyramid.compat import long\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, long(1))\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_unicode_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = text_(b'\\xc2\\xa9', 'utf-8')\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(userid.encode('utf-8'))))\n        self.assertEqual(val['user_data'], 'userid_type:b64unicode')\n\n    def test_remember_insane_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = object()\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        value = values[0]\n        self.assertTrue('userid' in value.value)\n\n    def test_remember_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age=500)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age='500')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age_invalid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'userid', max_age='invalid value')\n\n    def test_remember_tokens(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'other', tokens=('foo', 'bar'))\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[0][1])\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[1][1])\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[2][1])\n\n    def test_remember_unicode_but_ascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'foo', 'utf-8')\n        result = helper.remember(request, 'other', tokens=(la,))\n        # tokens must be str type on both Python 2 and 3\n        self.assertTrue(\"/tokens=foo/\" in result[0][1])\n\n    def test_remember_nonascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'La Pe\\xc3\\xb1a', 'utf-8')\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=(la,))\n\n    def test_remember_invalid_token_format(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('foo bar',))\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('1bar',))\n\n    def test_forget(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        headers = helper.forget(request)\n        self.assertEqual(len(headers), 3)\n        name, value = headers[0]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[1]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[2]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=.localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 606,
                            "end_lineno": 607,
                            "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        items = cookie.value.split('/')\n        D = {}\n        for item in items:\n            k, v = item.split('=', 1)\n            D[k] = v\n        return D\n\n    def _parseHeaders(self, headers):\n        return [ self._parseHeader(header) for header in headers ]\n\n    def _parseHeader(self, header):\n        cookie = self._parseCookie(header[1])\n        return cookie\n\n    def _parseCookie(self, cookie):\n        from pyramid.compat import SimpleCookie\n        cookies = SimpleCookie()\n        cookies.load(cookie)\n        return cookies.get('auth_tkt')\n\n    def test_init_cookie_str_reissue_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', reissue_time='invalid value')\n\n    def test_init_cookie_str_timeout_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', timeout='invalid value')\n\n    def test_init_cookie_str_max_age_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', max_age='invalid value')\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_str_timeout(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_str_reissue(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time='0')\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        helper.auth_tkt.tokens = (text_('a'), )\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n\n    def test_identify_cookie_reissue_already_reissued_this_request(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        request._authtkt_reissued = True\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_notyet(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=10)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_revoked_by_forget(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.forget(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_revoked_by_remember(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.remember(request, 'bob')\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_with_tokens_default(self):\n        # see https://github.com/Pylons/pyramid/issues#issue/108\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        auth_tkt = DummyAuthTktModule(tokens=[''])\n        helper.auth_tkt = auth_tkt\n        helper.AuthTicket = auth_tkt.AuthTicket\n        helper.parse_ticket = auth_tkt.parse_ticket\n        helper.BadTicket = auth_tkt.BadTicket\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](None, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=/\" in response.headerlist[0][1])\n\n    def test_remember(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_include_ip(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_path(self):\n        helper = self._makeOne('secret', include_ip=True,\n                               path=\"/cgi-bin/app.cgi/\")\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith(\n            '; Domain=localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith(\n            '; Domain=.localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_http_only(self):\n        helper = self._makeOne('secret', include_ip=True, http_only=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; HttpOnly'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_secure(self):\n        helper = self._makeOne('secret', include_ip=True, secure=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[0][1])\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_wild_domain_disabled(self):\n        helper = self._makeOne('secret', wild_domain=False)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 2)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain(self):\n        helper = self._makeOne('secret', parent_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain_supercedes_wild_domain(self):\n        helper = self._makeOne('secret', parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n\n    def test_remember_explicit_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga')\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_domain_supercedes_parent_and_wild_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga',\n                parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n\n    def test_remember_binary_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, b'userid')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(b'userid').strip()))\n        self.assertEqual(val['user_data'], 'userid_type:b64str')\n\n    def test_remember_int_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 1)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_long_userid(self):\n        from pyramid.compat import long\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, long(1))\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_unicode_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = text_(b'\\xc2\\xa9', 'utf-8')\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(userid.encode('utf-8'))))\n        self.assertEqual(val['user_data'], 'userid_type:b64unicode')\n\n    def test_remember_insane_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = object()\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        value = values[0]\n        self.assertTrue('userid' in value.value)\n\n    def test_remember_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age=500)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age='500')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age_invalid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'userid', max_age='invalid value')\n\n    def test_remember_tokens(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'other', tokens=('foo', 'bar'))\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[0][1])\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[1][1])\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[2][1])\n\n    def test_remember_unicode_but_ascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'foo', 'utf-8')\n        result = helper.remember(request, 'other', tokens=(la,))\n        # tokens must be str type on both Python 2 and 3\n        self.assertTrue(\"/tokens=foo/\" in result[0][1])\n\n    def test_remember_nonascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'La Pe\\xc3\\xb1a', 'utf-8')\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=(la,))\n\n    def test_remember_invalid_token_format(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('foo bar',))\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('1bar',))\n\n    def test_forget(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        headers = helper.forget(request)\n        self.assertEqual(len(headers), 3)\n        name, value = headers[0]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[1]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[2]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=.localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 556,
                                "end_lineno": 1179,
                                "parent": null
                            }
                        },
                        {
                            "file_name": "pyramid/tests/test_authentication.py",
                            "type": "method",
                            "name": "TestAuthTktCookieHelper.test_init_cookie_str_max_age_invalid",
                            "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        items = cookie.value.split('/')\n        D = {}\n        for item in items:\n            k, v = item.split('=', 1)\n            D[k] = v\n        return D\n\n    def _parseHeaders(self, headers):\n        return [ self._parseHeader(header) for header in headers ]\n\n    def _parseHeader(self, header):\n        cookie = self._parseCookie(header[1])\n        return cookie\n\n    def _parseCookie(self, cookie):\n        from pyramid.compat import SimpleCookie\n        cookies = SimpleCookie()\n        cookies.load(cookie)\n        return cookies.get('auth_tkt')\n\n    def test_init_cookie_str_reissue_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', reissue_time='invalid value')\n\n    def test_init_cookie_str_timeout_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', timeout='invalid value')\n\n    def test_init_cookie_str_max_age_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', max_age='invalid value')\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_str_timeout(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_str_reissue(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time='0')\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        helper.auth_tkt.tokens = (text_('a'), )\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n\n    def test_identify_cookie_reissue_already_reissued_this_request(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        request._authtkt_reissued = True\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_notyet(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=10)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_revoked_by_forget(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.forget(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_revoked_by_remember(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.remember(request, 'bob')\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_with_tokens_default(self):\n        # see https://github.com/Pylons/pyramid/issues#issue/108\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        auth_tkt = DummyAuthTktModule(tokens=[''])\n        helper.auth_tkt = auth_tkt\n        helper.AuthTicket = auth_tkt.AuthTicket\n        helper.parse_ticket = auth_tkt.parse_ticket\n        helper.BadTicket = auth_tkt.BadTicket\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](None, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=/\" in response.headerlist[0][1])\n\n    def test_remember(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_include_ip(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_path(self):\n        helper = self._makeOne('secret', include_ip=True,\n                               path=\"/cgi-bin/app.cgi/\")\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith(\n            '; Domain=localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith(\n            '; Domain=.localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_http_only(self):\n        helper = self._makeOne('secret', include_ip=True, http_only=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; HttpOnly'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_secure(self):\n        helper = self._makeOne('secret', include_ip=True, secure=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[0][1])\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_wild_domain_disabled(self):\n        helper = self._makeOne('secret', wild_domain=False)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 2)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain(self):\n        helper = self._makeOne('secret', parent_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain_supercedes_wild_domain(self):\n        helper = self._makeOne('secret', parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n\n    def test_remember_explicit_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga')\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_domain_supercedes_parent_and_wild_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga',\n                parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n\n    def test_remember_binary_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, b'userid')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(b'userid').strip()))\n        self.assertEqual(val['user_data'], 'userid_type:b64str')\n\n    def test_remember_int_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 1)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_long_userid(self):\n        from pyramid.compat import long\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, long(1))\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_unicode_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = text_(b'\\xc2\\xa9', 'utf-8')\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(userid.encode('utf-8'))))\n        self.assertEqual(val['user_data'], 'userid_type:b64unicode')\n\n    def test_remember_insane_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = object()\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        value = values[0]\n        self.assertTrue('userid' in value.value)\n\n    def test_remember_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age=500)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age='500')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age_invalid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'userid', max_age='invalid value')\n\n    def test_remember_tokens(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'other', tokens=('foo', 'bar'))\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[0][1])\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[1][1])\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[2][1])\n\n    def test_remember_unicode_but_ascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'foo', 'utf-8')\n        result = helper.remember(request, 'other', tokens=(la,))\n        # tokens must be str type on both Python 2 and 3\n        self.assertTrue(\"/tokens=foo/\" in result[0][1])\n\n    def test_remember_nonascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'La Pe\\xc3\\xb1a', 'utf-8')\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=(la,))\n\n    def test_remember_invalid_token_format(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('foo bar',))\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('1bar',))\n\n    def test_forget(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        headers = helper.forget(request)\n        self.assertEqual(len(headers), 3)\n        name, value = headers[0]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[1]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[2]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=.localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 609,
                            "end_lineno": 610,
                            "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        items = cookie.value.split('/')\n        D = {}\n        for item in items:\n            k, v = item.split('=', 1)\n            D[k] = v\n        return D\n\n    def _parseHeaders(self, headers):\n        return [ self._parseHeader(header) for header in headers ]\n\n    def _parseHeader(self, header):\n        cookie = self._parseCookie(header[1])\n        return cookie\n\n    def _parseCookie(self, cookie):\n        from pyramid.compat import SimpleCookie\n        cookies = SimpleCookie()\n        cookies.load(cookie)\n        return cookies.get('auth_tkt')\n\n    def test_init_cookie_str_reissue_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', reissue_time='invalid value')\n\n    def test_init_cookie_str_timeout_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', timeout='invalid value')\n\n    def test_init_cookie_str_max_age_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', max_age='invalid value')\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_str_timeout(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_str_reissue(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time='0')\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        helper.auth_tkt.tokens = (text_('a'), )\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n\n    def test_identify_cookie_reissue_already_reissued_this_request(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        request._authtkt_reissued = True\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_notyet(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=10)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_revoked_by_forget(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.forget(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_revoked_by_remember(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.remember(request, 'bob')\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_with_tokens_default(self):\n        # see https://github.com/Pylons/pyramid/issues#issue/108\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        auth_tkt = DummyAuthTktModule(tokens=[''])\n        helper.auth_tkt = auth_tkt\n        helper.AuthTicket = auth_tkt.AuthTicket\n        helper.parse_ticket = auth_tkt.parse_ticket\n        helper.BadTicket = auth_tkt.BadTicket\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](None, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=/\" in response.headerlist[0][1])\n\n    def test_remember(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_include_ip(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_path(self):\n        helper = self._makeOne('secret', include_ip=True,\n                               path=\"/cgi-bin/app.cgi/\")\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith(\n            '; Domain=localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith(\n            '; Domain=.localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_http_only(self):\n        helper = self._makeOne('secret', include_ip=True, http_only=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; HttpOnly'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_secure(self):\n        helper = self._makeOne('secret', include_ip=True, secure=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[0][1])\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_wild_domain_disabled(self):\n        helper = self._makeOne('secret', wild_domain=False)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 2)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain(self):\n        helper = self._makeOne('secret', parent_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain_supercedes_wild_domain(self):\n        helper = self._makeOne('secret', parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n\n    def test_remember_explicit_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga')\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_domain_supercedes_parent_and_wild_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga',\n                parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n\n    def test_remember_binary_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, b'userid')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(b'userid').strip()))\n        self.assertEqual(val['user_data'], 'userid_type:b64str')\n\n    def test_remember_int_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 1)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_long_userid(self):\n        from pyramid.compat import long\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, long(1))\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_unicode_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = text_(b'\\xc2\\xa9', 'utf-8')\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(userid.encode('utf-8'))))\n        self.assertEqual(val['user_data'], 'userid_type:b64unicode')\n\n    def test_remember_insane_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = object()\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        value = values[0]\n        self.assertTrue('userid' in value.value)\n\n    def test_remember_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age=500)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age='500')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age_invalid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'userid', max_age='invalid value')\n\n    def test_remember_tokens(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'other', tokens=('foo', 'bar'))\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[0][1])\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[1][1])\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[2][1])\n\n    def test_remember_unicode_but_ascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'foo', 'utf-8')\n        result = helper.remember(request, 'other', tokens=(la,))\n        # tokens must be str type on both Python 2 and 3\n        self.assertTrue(\"/tokens=foo/\" in result[0][1])\n\n    def test_remember_nonascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'La Pe\\xc3\\xb1a', 'utf-8')\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=(la,))\n\n    def test_remember_invalid_token_format(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('foo bar',))\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('1bar',))\n\n    def test_forget(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        headers = helper.forget(request)\n        self.assertEqual(len(headers), 3)\n        name, value = headers[0]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[1]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[2]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=.localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 556,
                                "end_lineno": 1179,
                                "parent": null
                            }
                        }
                    ],
                    "deleted_entities": []
                },
                {
                    "descriptor": {
                        "old_range": {
                            "start": 758,
                            "length": 6
                        },
                        "new_range": {
                            "start": 767,
                            "length": 12
                        },
                        "section": "class TestAuthTktCookieHelper(unittest.TestCase):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "        result = helper.identify(request)",
                                "type": "context"
                            },
                            {
                                "content": "        self.assertEqual(result, None)",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "    def test_identify_cookie_str_timeout(self):",
                                "type": "added"
                            },
                            {
                                "content": "        helper = self._makeOne('secret', timeout='1')",
                                "type": "added"
                            },
                            {
                                "content": "        request = self._makeRequest({'HTTP_COOKIE':'auth_tkt=bogus'})",
                                "type": "added"
                            },
                            {
                                "content": "        result = helper.identify(request)",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertEqual(result, None)",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "    def test_identify_cookie_reissue(self):",
                                "type": "context"
                            },
                            {
                                "content": "        import time",
                                "type": "context"
                            },
                            {
                                "content": "        helper = self._makeOne('secret', timeout=10, reissue_time=0)",
                                "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        items = cookie.value.split('/')\n        D = {}\n        for item in items:\n            k, v = item.split('=', 1)\n            D[k] = v\n        return D\n\n    def _parseHeaders(self, headers):\n        return [ self._parseHeader(header) for header in headers ]\n\n    def _parseHeader(self, header):\n        cookie = self._parseCookie(header[1])\n        return cookie\n\n    def _parseCookie(self, cookie):\n        from pyramid.compat import SimpleCookie\n        cookies = SimpleCookie()\n        cookies.load(cookie)\n        return cookies.get('auth_tkt')\n\n    def test_init_cookie_str_reissue_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', reissue_time='invalid value')\n\n    def test_init_cookie_str_timeout_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', timeout='invalid value')\n\n    def test_init_cookie_str_max_age_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', max_age='invalid value')\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_str_timeout(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_str_reissue(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time='0')\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        helper.auth_tkt.tokens = (text_('a'), )\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n\n    def test_identify_cookie_reissue_already_reissued_this_request(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        request._authtkt_reissued = True\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_notyet(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=10)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_revoked_by_forget(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.forget(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_revoked_by_remember(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.remember(request, 'bob')\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_with_tokens_default(self):\n        # see https://github.com/Pylons/pyramid/issues#issue/108\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        auth_tkt = DummyAuthTktModule(tokens=[''])\n        helper.auth_tkt = auth_tkt\n        helper.AuthTicket = auth_tkt.AuthTicket\n        helper.parse_ticket = auth_tkt.parse_ticket\n        helper.BadTicket = auth_tkt.BadTicket\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](None, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=/\" in response.headerlist[0][1])\n\n    def test_remember(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_include_ip(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_path(self):\n        helper = self._makeOne('secret', include_ip=True,\n                               path=\"/cgi-bin/app.cgi/\")\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith(\n            '; Domain=localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith(\n            '; Domain=.localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_http_only(self):\n        helper = self._makeOne('secret', include_ip=True, http_only=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; HttpOnly'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_secure(self):\n        helper = self._makeOne('secret', include_ip=True, secure=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[0][1])\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_wild_domain_disabled(self):\n        helper = self._makeOne('secret', wild_domain=False)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 2)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain(self):\n        helper = self._makeOne('secret', parent_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain_supercedes_wild_domain(self):\n        helper = self._makeOne('secret', parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n\n    def test_remember_explicit_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga')\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_domain_supercedes_parent_and_wild_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga',\n                parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n\n    def test_remember_binary_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, b'userid')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(b'userid').strip()))\n        self.assertEqual(val['user_data'], 'userid_type:b64str')\n\n    def test_remember_int_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 1)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_long_userid(self):\n        from pyramid.compat import long\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, long(1))\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_unicode_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = text_(b'\\xc2\\xa9', 'utf-8')\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(userid.encode('utf-8'))))\n        self.assertEqual(val['user_data'], 'userid_type:b64unicode')\n\n    def test_remember_insane_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = object()\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        value = values[0]\n        self.assertTrue('userid' in value.value)\n\n    def test_remember_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age=500)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age='500')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age_invalid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'userid', max_age='invalid value')\n\n    def test_remember_tokens(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'other', tokens=('foo', 'bar'))\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[0][1])\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[1][1])\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[2][1])\n\n    def test_remember_unicode_but_ascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'foo', 'utf-8')\n        result = helper.remember(request, 'other', tokens=(la,))\n        # tokens must be str type on both Python 2 and 3\n        self.assertTrue(\"/tokens=foo/\" in result[0][1])\n\n    def test_remember_nonascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'La Pe\\xc3\\xb1a', 'utf-8')\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=(la,))\n\n    def test_remember_invalid_token_format(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('foo bar',))\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('1bar',))\n\n    def test_forget(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        headers = helper.forget(request)\n        self.assertEqual(len(headers), 3)\n        name, value = headers[0]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[1]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[2]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=.localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 556,
                            "end_lineno": 1179,
                            "parent": null
                        }
                    ],
                    "added_entities": [
                        {
                            "file_name": "pyramid/tests/test_authentication.py",
                            "type": "method",
                            "name": "TestAuthTktCookieHelper.test_identify_cookie_str_timeout",
                            "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        items = cookie.value.split('/')\n        D = {}\n        for item in items:\n            k, v = item.split('=', 1)\n            D[k] = v\n        return D\n\n    def _parseHeaders(self, headers):\n        return [ self._parseHeader(header) for header in headers ]\n\n    def _parseHeader(self, header):\n        cookie = self._parseCookie(header[1])\n        return cookie\n\n    def _parseCookie(self, cookie):\n        from pyramid.compat import SimpleCookie\n        cookies = SimpleCookie()\n        cookies.load(cookie)\n        return cookies.get('auth_tkt')\n\n    def test_init_cookie_str_reissue_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', reissue_time='invalid value')\n\n    def test_init_cookie_str_timeout_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', timeout='invalid value')\n\n    def test_init_cookie_str_max_age_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', max_age='invalid value')\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_str_timeout(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_str_reissue(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time='0')\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        helper.auth_tkt.tokens = (text_('a'), )\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n\n    def test_identify_cookie_reissue_already_reissued_this_request(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        request._authtkt_reissued = True\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_notyet(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=10)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_revoked_by_forget(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.forget(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_revoked_by_remember(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.remember(request, 'bob')\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_with_tokens_default(self):\n        # see https://github.com/Pylons/pyramid/issues#issue/108\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        auth_tkt = DummyAuthTktModule(tokens=[''])\n        helper.auth_tkt = auth_tkt\n        helper.AuthTicket = auth_tkt.AuthTicket\n        helper.parse_ticket = auth_tkt.parse_ticket\n        helper.BadTicket = auth_tkt.BadTicket\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](None, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=/\" in response.headerlist[0][1])\n\n    def test_remember(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_include_ip(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_path(self):\n        helper = self._makeOne('secret', include_ip=True,\n                               path=\"/cgi-bin/app.cgi/\")\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith(\n            '; Domain=localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith(\n            '; Domain=.localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_http_only(self):\n        helper = self._makeOne('secret', include_ip=True, http_only=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; HttpOnly'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_secure(self):\n        helper = self._makeOne('secret', include_ip=True, secure=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[0][1])\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_wild_domain_disabled(self):\n        helper = self._makeOne('secret', wild_domain=False)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 2)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain(self):\n        helper = self._makeOne('secret', parent_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain_supercedes_wild_domain(self):\n        helper = self._makeOne('secret', parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n\n    def test_remember_explicit_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga')\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_domain_supercedes_parent_and_wild_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga',\n                parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n\n    def test_remember_binary_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, b'userid')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(b'userid').strip()))\n        self.assertEqual(val['user_data'], 'userid_type:b64str')\n\n    def test_remember_int_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 1)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_long_userid(self):\n        from pyramid.compat import long\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, long(1))\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_unicode_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = text_(b'\\xc2\\xa9', 'utf-8')\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(userid.encode('utf-8'))))\n        self.assertEqual(val['user_data'], 'userid_type:b64unicode')\n\n    def test_remember_insane_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = object()\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        value = values[0]\n        self.assertTrue('userid' in value.value)\n\n    def test_remember_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age=500)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age='500')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age_invalid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'userid', max_age='invalid value')\n\n    def test_remember_tokens(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'other', tokens=('foo', 'bar'))\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[0][1])\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[1][1])\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[2][1])\n\n    def test_remember_unicode_but_ascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'foo', 'utf-8')\n        result = helper.remember(request, 'other', tokens=(la,))\n        # tokens must be str type on both Python 2 and 3\n        self.assertTrue(\"/tokens=foo/\" in result[0][1])\n\n    def test_remember_nonascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'La Pe\\xc3\\xb1a', 'utf-8')\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=(la,))\n\n    def test_remember_invalid_token_format(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('foo bar',))\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('1bar',))\n\n    def test_forget(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        headers = helper.forget(request)\n        self.assertEqual(len(headers), 3)\n        name, value = headers[0]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[1]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[2]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=.localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 770,
                            "end_lineno": 774,
                            "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        items = cookie.value.split('/')\n        D = {}\n        for item in items:\n            k, v = item.split('=', 1)\n            D[k] = v\n        return D\n\n    def _parseHeaders(self, headers):\n        return [ self._parseHeader(header) for header in headers ]\n\n    def _parseHeader(self, header):\n        cookie = self._parseCookie(header[1])\n        return cookie\n\n    def _parseCookie(self, cookie):\n        from pyramid.compat import SimpleCookie\n        cookies = SimpleCookie()\n        cookies.load(cookie)\n        return cookies.get('auth_tkt')\n\n    def test_init_cookie_str_reissue_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', reissue_time='invalid value')\n\n    def test_init_cookie_str_timeout_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', timeout='invalid value')\n\n    def test_init_cookie_str_max_age_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', max_age='invalid value')\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_str_timeout(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_str_reissue(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time='0')\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        helper.auth_tkt.tokens = (text_('a'), )\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n\n    def test_identify_cookie_reissue_already_reissued_this_request(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        request._authtkt_reissued = True\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_notyet(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=10)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_revoked_by_forget(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.forget(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_revoked_by_remember(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.remember(request, 'bob')\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_with_tokens_default(self):\n        # see https://github.com/Pylons/pyramid/issues#issue/108\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        auth_tkt = DummyAuthTktModule(tokens=[''])\n        helper.auth_tkt = auth_tkt\n        helper.AuthTicket = auth_tkt.AuthTicket\n        helper.parse_ticket = auth_tkt.parse_ticket\n        helper.BadTicket = auth_tkt.BadTicket\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](None, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=/\" in response.headerlist[0][1])\n\n    def test_remember(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_include_ip(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_path(self):\n        helper = self._makeOne('secret', include_ip=True,\n                               path=\"/cgi-bin/app.cgi/\")\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith(\n            '; Domain=localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith(\n            '; Domain=.localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_http_only(self):\n        helper = self._makeOne('secret', include_ip=True, http_only=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; HttpOnly'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_secure(self):\n        helper = self._makeOne('secret', include_ip=True, secure=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[0][1])\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_wild_domain_disabled(self):\n        helper = self._makeOne('secret', wild_domain=False)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 2)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain(self):\n        helper = self._makeOne('secret', parent_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain_supercedes_wild_domain(self):\n        helper = self._makeOne('secret', parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n\n    def test_remember_explicit_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga')\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_domain_supercedes_parent_and_wild_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga',\n                parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n\n    def test_remember_binary_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, b'userid')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(b'userid').strip()))\n        self.assertEqual(val['user_data'], 'userid_type:b64str')\n\n    def test_remember_int_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 1)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_long_userid(self):\n        from pyramid.compat import long\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, long(1))\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_unicode_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = text_(b'\\xc2\\xa9', 'utf-8')\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(userid.encode('utf-8'))))\n        self.assertEqual(val['user_data'], 'userid_type:b64unicode')\n\n    def test_remember_insane_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = object()\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        value = values[0]\n        self.assertTrue('userid' in value.value)\n\n    def test_remember_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age=500)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age='500')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age_invalid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'userid', max_age='invalid value')\n\n    def test_remember_tokens(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'other', tokens=('foo', 'bar'))\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[0][1])\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[1][1])\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[2][1])\n\n    def test_remember_unicode_but_ascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'foo', 'utf-8')\n        result = helper.remember(request, 'other', tokens=(la,))\n        # tokens must be str type on both Python 2 and 3\n        self.assertTrue(\"/tokens=foo/\" in result[0][1])\n\n    def test_remember_nonascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'La Pe\\xc3\\xb1a', 'utf-8')\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=(la,))\n\n    def test_remember_invalid_token_format(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('foo bar',))\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('1bar',))\n\n    def test_forget(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        headers = helper.forget(request)\n        self.assertEqual(len(headers), 3)\n        name, value = headers[0]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[1]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[2]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=.localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 556,
                                "end_lineno": 1179,
                                "parent": null
                            }
                        }
                    ],
                    "deleted_entities": []
                },
                {
                    "descriptor": {
                        "old_range": {
                            "start": 774,
                            "length": 6
                        },
                        "new_range": {
                            "start": 789,
                            "length": 22
                        },
                        "section": "class TestAuthTktCookieHelper(unittest.TestCase):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "        self.assertEqual(len(response.headerlist), 3)",
                                "type": "context"
                            },
                            {
                                "content": "        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "    def test_identify_cookie_str_reissue(self):",
                                "type": "added"
                            },
                            {
                                "content": "        import time",
                                "type": "added"
                            },
                            {
                                "content": "        helper = self._makeOne('secret', timeout=10, reissue_time='0')",
                                "type": "added"
                            },
                            {
                                "content": "        now = time.time()",
                                "type": "added"
                            },
                            {
                                "content": "        helper.auth_tkt.timestamp = now",
                                "type": "added"
                            },
                            {
                                "content": "        helper.now = now + 1",
                                "type": "added"
                            },
                            {
                                "content": "        helper.auth_tkt.tokens = (text_('a'), )",
                                "type": "added"
                            },
                            {
                                "content": "        request = self._makeRequest('bogus')",
                                "type": "added"
                            },
                            {
                                "content": "        result = helper.identify(request)",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertTrue(result)",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertEqual(len(request.callbacks), 1)",
                                "type": "added"
                            },
                            {
                                "content": "        response = DummyResponse()",
                                "type": "added"
                            },
                            {
                                "content": "        request.callbacks[0](request, response)",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertEqual(len(response.headerlist), 3)",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "    def test_identify_cookie_reissue_already_reissued_this_request(self):",
                                "type": "context"
                            },
                            {
                                "content": "        import time",
                                "type": "context"
                            },
                            {
                                "content": "        helper = self._makeOne('secret', timeout=10, reissue_time=0)",
                                "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        items = cookie.value.split('/')\n        D = {}\n        for item in items:\n            k, v = item.split('=', 1)\n            D[k] = v\n        return D\n\n    def _parseHeaders(self, headers):\n        return [ self._parseHeader(header) for header in headers ]\n\n    def _parseHeader(self, header):\n        cookie = self._parseCookie(header[1])\n        return cookie\n\n    def _parseCookie(self, cookie):\n        from pyramid.compat import SimpleCookie\n        cookies = SimpleCookie()\n        cookies.load(cookie)\n        return cookies.get('auth_tkt')\n\n    def test_init_cookie_str_reissue_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', reissue_time='invalid value')\n\n    def test_init_cookie_str_timeout_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', timeout='invalid value')\n\n    def test_init_cookie_str_max_age_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', max_age='invalid value')\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_str_timeout(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_str_reissue(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time='0')\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        helper.auth_tkt.tokens = (text_('a'), )\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n\n    def test_identify_cookie_reissue_already_reissued_this_request(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        request._authtkt_reissued = True\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_notyet(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=10)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_revoked_by_forget(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.forget(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_revoked_by_remember(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.remember(request, 'bob')\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_with_tokens_default(self):\n        # see https://github.com/Pylons/pyramid/issues#issue/108\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        auth_tkt = DummyAuthTktModule(tokens=[''])\n        helper.auth_tkt = auth_tkt\n        helper.AuthTicket = auth_tkt.AuthTicket\n        helper.parse_ticket = auth_tkt.parse_ticket\n        helper.BadTicket = auth_tkt.BadTicket\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](None, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=/\" in response.headerlist[0][1])\n\n    def test_remember(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_include_ip(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_path(self):\n        helper = self._makeOne('secret', include_ip=True,\n                               path=\"/cgi-bin/app.cgi/\")\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith(\n            '; Domain=localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith(\n            '; Domain=.localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_http_only(self):\n        helper = self._makeOne('secret', include_ip=True, http_only=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; HttpOnly'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_secure(self):\n        helper = self._makeOne('secret', include_ip=True, secure=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[0][1])\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_wild_domain_disabled(self):\n        helper = self._makeOne('secret', wild_domain=False)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 2)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain(self):\n        helper = self._makeOne('secret', parent_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain_supercedes_wild_domain(self):\n        helper = self._makeOne('secret', parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n\n    def test_remember_explicit_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga')\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_domain_supercedes_parent_and_wild_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga',\n                parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n\n    def test_remember_binary_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, b'userid')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(b'userid').strip()))\n        self.assertEqual(val['user_data'], 'userid_type:b64str')\n\n    def test_remember_int_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 1)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_long_userid(self):\n        from pyramid.compat import long\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, long(1))\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_unicode_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = text_(b'\\xc2\\xa9', 'utf-8')\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(userid.encode('utf-8'))))\n        self.assertEqual(val['user_data'], 'userid_type:b64unicode')\n\n    def test_remember_insane_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = object()\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        value = values[0]\n        self.assertTrue('userid' in value.value)\n\n    def test_remember_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age=500)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age='500')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age_invalid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'userid', max_age='invalid value')\n\n    def test_remember_tokens(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'other', tokens=('foo', 'bar'))\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[0][1])\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[1][1])\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[2][1])\n\n    def test_remember_unicode_but_ascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'foo', 'utf-8')\n        result = helper.remember(request, 'other', tokens=(la,))\n        # tokens must be str type on both Python 2 and 3\n        self.assertTrue(\"/tokens=foo/\" in result[0][1])\n\n    def test_remember_nonascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'La Pe\\xc3\\xb1a', 'utf-8')\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=(la,))\n\n    def test_remember_invalid_token_format(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('foo bar',))\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('1bar',))\n\n    def test_forget(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        headers = helper.forget(request)\n        self.assertEqual(len(headers), 3)\n        name, value = headers[0]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[1]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[2]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=.localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 556,
                            "end_lineno": 1179,
                            "parent": null
                        }
                    ],
                    "added_entities": [
                        {
                            "file_name": "pyramid/tests/test_authentication.py",
                            "type": "method",
                            "name": "TestAuthTktCookieHelper.test_identify_cookie_str_reissue",
                            "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        items = cookie.value.split('/')\n        D = {}\n        for item in items:\n            k, v = item.split('=', 1)\n            D[k] = v\n        return D\n\n    def _parseHeaders(self, headers):\n        return [ self._parseHeader(header) for header in headers ]\n\n    def _parseHeader(self, header):\n        cookie = self._parseCookie(header[1])\n        return cookie\n\n    def _parseCookie(self, cookie):\n        from pyramid.compat import SimpleCookie\n        cookies = SimpleCookie()\n        cookies.load(cookie)\n        return cookies.get('auth_tkt')\n\n    def test_init_cookie_str_reissue_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', reissue_time='invalid value')\n\n    def test_init_cookie_str_timeout_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', timeout='invalid value')\n\n    def test_init_cookie_str_max_age_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', max_age='invalid value')\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_str_timeout(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_str_reissue(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time='0')\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        helper.auth_tkt.tokens = (text_('a'), )\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n\n    def test_identify_cookie_reissue_already_reissued_this_request(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        request._authtkt_reissued = True\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_notyet(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=10)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_revoked_by_forget(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.forget(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_revoked_by_remember(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.remember(request, 'bob')\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_with_tokens_default(self):\n        # see https://github.com/Pylons/pyramid/issues#issue/108\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        auth_tkt = DummyAuthTktModule(tokens=[''])\n        helper.auth_tkt = auth_tkt\n        helper.AuthTicket = auth_tkt.AuthTicket\n        helper.parse_ticket = auth_tkt.parse_ticket\n        helper.BadTicket = auth_tkt.BadTicket\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](None, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=/\" in response.headerlist[0][1])\n\n    def test_remember(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_include_ip(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_path(self):\n        helper = self._makeOne('secret', include_ip=True,\n                               path=\"/cgi-bin/app.cgi/\")\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith(\n            '; Domain=localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith(\n            '; Domain=.localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_http_only(self):\n        helper = self._makeOne('secret', include_ip=True, http_only=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; HttpOnly'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_secure(self):\n        helper = self._makeOne('secret', include_ip=True, secure=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[0][1])\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_wild_domain_disabled(self):\n        helper = self._makeOne('secret', wild_domain=False)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 2)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain(self):\n        helper = self._makeOne('secret', parent_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain_supercedes_wild_domain(self):\n        helper = self._makeOne('secret', parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n\n    def test_remember_explicit_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga')\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_domain_supercedes_parent_and_wild_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga',\n                parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n\n    def test_remember_binary_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, b'userid')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(b'userid').strip()))\n        self.assertEqual(val['user_data'], 'userid_type:b64str')\n\n    def test_remember_int_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 1)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_long_userid(self):\n        from pyramid.compat import long\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, long(1))\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_unicode_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = text_(b'\\xc2\\xa9', 'utf-8')\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(userid.encode('utf-8'))))\n        self.assertEqual(val['user_data'], 'userid_type:b64unicode')\n\n    def test_remember_insane_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = object()\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        value = values[0]\n        self.assertTrue('userid' in value.value)\n\n    def test_remember_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age=500)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age='500')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age_invalid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'userid', max_age='invalid value')\n\n    def test_remember_tokens(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'other', tokens=('foo', 'bar'))\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[0][1])\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[1][1])\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[2][1])\n\n    def test_remember_unicode_but_ascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'foo', 'utf-8')\n        result = helper.remember(request, 'other', tokens=(la,))\n        # tokens must be str type on both Python 2 and 3\n        self.assertTrue(\"/tokens=foo/\" in result[0][1])\n\n    def test_remember_nonascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'La Pe\\xc3\\xb1a', 'utf-8')\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=(la,))\n\n    def test_remember_invalid_token_format(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('foo bar',))\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('1bar',))\n\n    def test_forget(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        headers = helper.forget(request)\n        self.assertEqual(len(headers), 3)\n        name, value = headers[0]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[1]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[2]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=.localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 792,
                            "end_lineno": 806,
                            "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        items = cookie.value.split('/')\n        D = {}\n        for item in items:\n            k, v = item.split('=', 1)\n            D[k] = v\n        return D\n\n    def _parseHeaders(self, headers):\n        return [ self._parseHeader(header) for header in headers ]\n\n    def _parseHeader(self, header):\n        cookie = self._parseCookie(header[1])\n        return cookie\n\n    def _parseCookie(self, cookie):\n        from pyramid.compat import SimpleCookie\n        cookies = SimpleCookie()\n        cookies.load(cookie)\n        return cookies.get('auth_tkt')\n\n    def test_init_cookie_str_reissue_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', reissue_time='invalid value')\n\n    def test_init_cookie_str_timeout_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', timeout='invalid value')\n\n    def test_init_cookie_str_max_age_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', max_age='invalid value')\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_str_timeout(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_str_reissue(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time='0')\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        helper.auth_tkt.tokens = (text_('a'), )\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n\n    def test_identify_cookie_reissue_already_reissued_this_request(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        request._authtkt_reissued = True\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_notyet(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=10)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_revoked_by_forget(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.forget(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_revoked_by_remember(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.remember(request, 'bob')\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_with_tokens_default(self):\n        # see https://github.com/Pylons/pyramid/issues#issue/108\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        auth_tkt = DummyAuthTktModule(tokens=[''])\n        helper.auth_tkt = auth_tkt\n        helper.AuthTicket = auth_tkt.AuthTicket\n        helper.parse_ticket = auth_tkt.parse_ticket\n        helper.BadTicket = auth_tkt.BadTicket\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](None, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=/\" in response.headerlist[0][1])\n\n    def test_remember(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_include_ip(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_path(self):\n        helper = self._makeOne('secret', include_ip=True,\n                               path=\"/cgi-bin/app.cgi/\")\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith(\n            '; Domain=localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith(\n            '; Domain=.localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_http_only(self):\n        helper = self._makeOne('secret', include_ip=True, http_only=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; HttpOnly'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_secure(self):\n        helper = self._makeOne('secret', include_ip=True, secure=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[0][1])\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_wild_domain_disabled(self):\n        helper = self._makeOne('secret', wild_domain=False)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 2)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain(self):\n        helper = self._makeOne('secret', parent_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain_supercedes_wild_domain(self):\n        helper = self._makeOne('secret', parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n\n    def test_remember_explicit_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga')\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_domain_supercedes_parent_and_wild_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga',\n                parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n\n    def test_remember_binary_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, b'userid')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(b'userid').strip()))\n        self.assertEqual(val['user_data'], 'userid_type:b64str')\n\n    def test_remember_int_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 1)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_long_userid(self):\n        from pyramid.compat import long\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, long(1))\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_unicode_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = text_(b'\\xc2\\xa9', 'utf-8')\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(userid.encode('utf-8'))))\n        self.assertEqual(val['user_data'], 'userid_type:b64unicode')\n\n    def test_remember_insane_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = object()\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        value = values[0]\n        self.assertTrue('userid' in value.value)\n\n    def test_remember_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age=500)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age='500')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age_invalid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'userid', max_age='invalid value')\n\n    def test_remember_tokens(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'other', tokens=('foo', 'bar'))\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[0][1])\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[1][1])\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[2][1])\n\n    def test_remember_unicode_but_ascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'foo', 'utf-8')\n        result = helper.remember(request, 'other', tokens=(la,))\n        # tokens must be str type on both Python 2 and 3\n        self.assertTrue(\"/tokens=foo/\" in result[0][1])\n\n    def test_remember_nonascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'La Pe\\xc3\\xb1a', 'utf-8')\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=(la,))\n\n    def test_remember_invalid_token_format(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('foo bar',))\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('1bar',))\n\n    def test_forget(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        headers = helper.forget(request)\n        self.assertEqual(len(headers), 3)\n        name, value = headers[0]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[1]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[2]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=.localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 556,
                                "end_lineno": 1179,
                                "parent": null
                            }
                        }
                    ],
                    "deleted_entities": []
                },
                {
                    "descriptor": {
                        "old_range": {
                            "start": 1058,
                            "length": 6
                        },
                        "new_range": {
                            "start": 1089,
                            "length": 16
                        },
                        "section": "class TestAuthTktCookieHelper(unittest.TestCase):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "        self.assertTrue('userid' in value.value)",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "    def test_remember_max_age(self):",
                                "type": "context"
                            },
                            {
                                "content": "        helper = self._makeOne('secret')",
                                "type": "added"
                            },
                            {
                                "content": "        request = self._makeRequest()",
                                "type": "added"
                            },
                            {
                                "content": "        result = helper.remember(request, 'userid', max_age=500)",
                                "type": "added"
                            },
                            {
                                "content": "        values = self._parseHeaders(result)",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertEqual(len(result), 3)",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertEqual(values[0]['max-age'], '500')",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertTrue(values[0]['expires'])",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "    def test_remember_str_max_age(self):",
                                "type": "added"
                            },
                            {
                                "content": "        helper = self._makeOne('secret')",
                                "type": "context"
                            },
                            {
                                "content": "        request = self._makeRequest()",
                                "type": "context"
                            },
                            {
                                "content": "        result = helper.remember(request, 'userid', max_age='500')",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [
                        {
                            "file_name": "pyramid/tests/test_authentication.py",
                            "type": "method",
                            "name": "TestAuthTktCookieHelper.test_remember_max_age",
                            "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        items = cookie.value.split('/')\n        D = {}\n        for item in items:\n            k, v = item.split('=', 1)\n            D[k] = v\n        return D\n\n    def _parseHeaders(self, headers):\n        return [ self._parseHeader(header) for header in headers ]\n\n    def _parseHeader(self, header):\n        cookie = self._parseCookie(header[1])\n        return cookie\n\n    def _parseCookie(self, cookie):\n        from pyramid.compat import SimpleCookie\n        cookies = SimpleCookie()\n        cookies.load(cookie)\n        return cookies.get('auth_tkt')\n\n    def test_init_cookie_str_reissue_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', reissue_time='invalid value')\n\n    def test_init_cookie_str_timeout_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', timeout='invalid value')\n\n    def test_init_cookie_str_max_age_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', max_age='invalid value')\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_str_timeout(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_str_reissue(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time='0')\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        helper.auth_tkt.tokens = (text_('a'), )\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n\n    def test_identify_cookie_reissue_already_reissued_this_request(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        request._authtkt_reissued = True\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_notyet(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=10)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_revoked_by_forget(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.forget(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_revoked_by_remember(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.remember(request, 'bob')\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_with_tokens_default(self):\n        # see https://github.com/Pylons/pyramid/issues#issue/108\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        auth_tkt = DummyAuthTktModule(tokens=[''])\n        helper.auth_tkt = auth_tkt\n        helper.AuthTicket = auth_tkt.AuthTicket\n        helper.parse_ticket = auth_tkt.parse_ticket\n        helper.BadTicket = auth_tkt.BadTicket\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](None, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=/\" in response.headerlist[0][1])\n\n    def test_remember(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_include_ip(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_path(self):\n        helper = self._makeOne('secret', include_ip=True,\n                               path=\"/cgi-bin/app.cgi/\")\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith(\n            '; Domain=localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith(\n            '; Domain=.localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_http_only(self):\n        helper = self._makeOne('secret', include_ip=True, http_only=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; HttpOnly'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_secure(self):\n        helper = self._makeOne('secret', include_ip=True, secure=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[0][1])\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_wild_domain_disabled(self):\n        helper = self._makeOne('secret', wild_domain=False)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 2)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain(self):\n        helper = self._makeOne('secret', parent_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain_supercedes_wild_domain(self):\n        helper = self._makeOne('secret', parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n\n    def test_remember_explicit_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga')\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_domain_supercedes_parent_and_wild_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga',\n                parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n\n    def test_remember_binary_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, b'userid')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(b'userid').strip()))\n        self.assertEqual(val['user_data'], 'userid_type:b64str')\n\n    def test_remember_int_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 1)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_long_userid(self):\n        from pyramid.compat import long\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, long(1))\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_unicode_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = text_(b'\\xc2\\xa9', 'utf-8')\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(userid.encode('utf-8'))))\n        self.assertEqual(val['user_data'], 'userid_type:b64unicode')\n\n    def test_remember_insane_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = object()\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        value = values[0]\n        self.assertTrue('userid' in value.value)\n\n    def test_remember_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age=500)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age='500')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age_invalid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'userid', max_age='invalid value')\n\n    def test_remember_tokens(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'other', tokens=('foo', 'bar'))\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[0][1])\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[1][1])\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[2][1])\n\n    def test_remember_unicode_but_ascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'foo', 'utf-8')\n        result = helper.remember(request, 'other', tokens=(la,))\n        # tokens must be str type on both Python 2 and 3\n        self.assertTrue(\"/tokens=foo/\" in result[0][1])\n\n    def test_remember_nonascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'La Pe\\xc3\\xb1a', 'utf-8')\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=(la,))\n\n    def test_remember_invalid_token_format(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('foo bar',))\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('1bar',))\n\n    def test_forget(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        headers = helper.forget(request)\n        self.assertEqual(len(headers), 3)\n        name, value = headers[0]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[1]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[2]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=.localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 1091,
                            "end_lineno": 1099,
                            "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        items = cookie.value.split('/')\n        D = {}\n        for item in items:\n            k, v = item.split('=', 1)\n            D[k] = v\n        return D\n\n    def _parseHeaders(self, headers):\n        return [ self._parseHeader(header) for header in headers ]\n\n    def _parseHeader(self, header):\n        cookie = self._parseCookie(header[1])\n        return cookie\n\n    def _parseCookie(self, cookie):\n        from pyramid.compat import SimpleCookie\n        cookies = SimpleCookie()\n        cookies.load(cookie)\n        return cookies.get('auth_tkt')\n\n    def test_init_cookie_str_reissue_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', reissue_time='invalid value')\n\n    def test_init_cookie_str_timeout_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', timeout='invalid value')\n\n    def test_init_cookie_str_max_age_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', max_age='invalid value')\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_str_timeout(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_str_reissue(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time='0')\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        helper.auth_tkt.tokens = (text_('a'), )\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n\n    def test_identify_cookie_reissue_already_reissued_this_request(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        request._authtkt_reissued = True\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_notyet(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=10)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_revoked_by_forget(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.forget(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_revoked_by_remember(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.remember(request, 'bob')\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_with_tokens_default(self):\n        # see https://github.com/Pylons/pyramid/issues#issue/108\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        auth_tkt = DummyAuthTktModule(tokens=[''])\n        helper.auth_tkt = auth_tkt\n        helper.AuthTicket = auth_tkt.AuthTicket\n        helper.parse_ticket = auth_tkt.parse_ticket\n        helper.BadTicket = auth_tkt.BadTicket\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](None, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=/\" in response.headerlist[0][1])\n\n    def test_remember(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_include_ip(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_path(self):\n        helper = self._makeOne('secret', include_ip=True,\n                               path=\"/cgi-bin/app.cgi/\")\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith(\n            '; Domain=localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith(\n            '; Domain=.localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_http_only(self):\n        helper = self._makeOne('secret', include_ip=True, http_only=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; HttpOnly'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_secure(self):\n        helper = self._makeOne('secret', include_ip=True, secure=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[0][1])\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_wild_domain_disabled(self):\n        helper = self._makeOne('secret', wild_domain=False)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 2)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain(self):\n        helper = self._makeOne('secret', parent_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain_supercedes_wild_domain(self):\n        helper = self._makeOne('secret', parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n\n    def test_remember_explicit_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga')\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_domain_supercedes_parent_and_wild_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga',\n                parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n\n    def test_remember_binary_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, b'userid')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(b'userid').strip()))\n        self.assertEqual(val['user_data'], 'userid_type:b64str')\n\n    def test_remember_int_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 1)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_long_userid(self):\n        from pyramid.compat import long\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, long(1))\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_unicode_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = text_(b'\\xc2\\xa9', 'utf-8')\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(userid.encode('utf-8'))))\n        self.assertEqual(val['user_data'], 'userid_type:b64unicode')\n\n    def test_remember_insane_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = object()\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        value = values[0]\n        self.assertTrue('userid' in value.value)\n\n    def test_remember_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age=500)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age='500')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age_invalid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'userid', max_age='invalid value')\n\n    def test_remember_tokens(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'other', tokens=('foo', 'bar'))\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[0][1])\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[1][1])\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[2][1])\n\n    def test_remember_unicode_but_ascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'foo', 'utf-8')\n        result = helper.remember(request, 'other', tokens=(la,))\n        # tokens must be str type on both Python 2 and 3\n        self.assertTrue(\"/tokens=foo/\" in result[0][1])\n\n    def test_remember_nonascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'La Pe\\xc3\\xb1a', 'utf-8')\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=(la,))\n\n    def test_remember_invalid_token_format(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('foo bar',))\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('1bar',))\n\n    def test_forget(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        headers = helper.forget(request)\n        self.assertEqual(len(headers), 3)\n        name, value = headers[0]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[1]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[2]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=.localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 556,
                                "end_lineno": 1179,
                                "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, ipv6=False):\n        environ = {'wsgi.version': (1,0)}\n\n        if ipv6 is False:\n            environ['REMOTE_ADDR'] = '1.1.1.1'\n        else:\n            environ['REMOTE_ADDR'] = '::1'\n        environ['SERVER_NAME'] = 'localhost'\n        return DummyRequest(environ, cookie=cookie)\n\n    def _cookieValue(self, cookie):\n        items = cookie.value.split('/')\n        D = {}\n        for item in items:\n            k, v = item.split('=', 1)\n            D[k] = v\n        return D\n\n    def _parseHeaders(self, headers):\n        return [ self._parseHeader(header) for header in headers ]\n\n    def _parseHeader(self, header):\n        cookie = self._parseCookie(header[1])\n        return cookie\n\n    def _parseCookie(self, cookie):\n        from pyramid.compat import SimpleCookie\n        cookies = SimpleCookie()\n        cookies.load(cookie)\n        return cookies.get('auth_tkt')\n\n    def test_init_cookie_str_reissue_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', reissue_time='invalid value')\n\n    def test_init_cookie_str_timeout_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', timeout='invalid value')\n\n    def test_init_cookie_str_max_age_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', max_age='invalid value')\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_str_timeout(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_str_reissue(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time='0')\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        helper.auth_tkt.tokens = (text_('a'), )\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n\n    def test_identify_cookie_reissue_already_reissued_this_request(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        request._authtkt_reissued = True\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_notyet(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=10)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_revoked_by_forget(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.forget(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_revoked_by_remember(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.remember(request, 'bob')\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_with_tokens_default(self):\n        # see https://github.com/Pylons/pyramid/issues#issue/108\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        auth_tkt = DummyAuthTktModule(tokens=[''])\n        helper.auth_tkt = auth_tkt\n        helper.AuthTicket = auth_tkt.AuthTicket\n        helper.parse_ticket = auth_tkt.parse_ticket\n        helper.BadTicket = auth_tkt.BadTicket\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](None, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=/\" in response.headerlist[0][1])\n\n    def test_remember(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_include_ip(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_path(self):\n        helper = self._makeOne('secret', include_ip=True,\n                               path=\"/cgi-bin/app.cgi/\")\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith(\n            '; Domain=localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith(\n            '; Domain=.localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_http_only(self):\n        helper = self._makeOne('secret', include_ip=True, http_only=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; HttpOnly'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_secure(self):\n        helper = self._makeOne('secret', include_ip=True, secure=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[0][1])\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_wild_domain_disabled(self):\n        helper = self._makeOne('secret', wild_domain=False)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 2)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain(self):\n        helper = self._makeOne('secret', parent_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain_supercedes_wild_domain(self):\n        helper = self._makeOne('secret', parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n\n    def test_remember_explicit_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga')\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_domain_supercedes_parent_and_wild_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga',\n                parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n\n    def test_remember_binary_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, b'userid')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(b'userid').strip()))\n        self.assertEqual(val['user_data'], 'userid_type:b64str')\n\n    def test_remember_int_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 1)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_long_userid(self):\n        from pyramid.compat import long\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, long(1))\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_unicode_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = text_(b'\\xc2\\xa9', 'utf-8')\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(userid.encode('utf-8'))))\n        self.assertEqual(val['user_data'], 'userid_type:b64unicode')\n\n    def test_remember_insane_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = object()\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        value = values[0]\n        self.assertTrue('userid' in value.value)\n\n    def test_remember_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age=500)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age='500')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age_invalid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'userid', max_age='invalid value')\n\n    def test_remember_tokens(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'other', tokens=('foo', 'bar'))\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[0][1])\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[1][1])\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[2][1])\n\n    def test_remember_unicode_but_ascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'foo', 'utf-8')\n        result = helper.remember(request, 'other', tokens=(la,))\n        # tokens must be str type on both Python 2 and 3\n        self.assertTrue(\"/tokens=foo/\" in result[0][1])\n\n    def test_remember_nonascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'La Pe\\xc3\\xb1a', 'utf-8')\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=(la,))\n\n    def test_remember_invalid_token_format(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('foo bar',))\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('1bar',))\n\n    def test_forget(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        headers = helper.forget(request)\n        self.assertEqual(len(headers), 3)\n        name, value = headers[0]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[1]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[2]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=.localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 556,
                            "end_lineno": 1179,
                            "parent": null
                        }
                    ],
                    "added_entities": [
                        {
                            "file_name": "pyramid/tests/test_authentication.py",
                            "type": "method",
                            "name": "TestAuthTktCookieHelper.test_remember_str_max_age",
                            "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        items = cookie.value.split('/')\n        D = {}\n        for item in items:\n            k, v = item.split('=', 1)\n            D[k] = v\n        return D\n\n    def _parseHeaders(self, headers):\n        return [ self._parseHeader(header) for header in headers ]\n\n    def _parseHeader(self, header):\n        cookie = self._parseCookie(header[1])\n        return cookie\n\n    def _parseCookie(self, cookie):\n        from pyramid.compat import SimpleCookie\n        cookies = SimpleCookie()\n        cookies.load(cookie)\n        return cookies.get('auth_tkt')\n\n    def test_init_cookie_str_reissue_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', reissue_time='invalid value')\n\n    def test_init_cookie_str_timeout_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', timeout='invalid value')\n\n    def test_init_cookie_str_max_age_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', max_age='invalid value')\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_str_timeout(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_str_reissue(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time='0')\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        helper.auth_tkt.tokens = (text_('a'), )\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n\n    def test_identify_cookie_reissue_already_reissued_this_request(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        request._authtkt_reissued = True\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_notyet(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=10)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_revoked_by_forget(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.forget(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_revoked_by_remember(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.remember(request, 'bob')\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_with_tokens_default(self):\n        # see https://github.com/Pylons/pyramid/issues#issue/108\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        auth_tkt = DummyAuthTktModule(tokens=[''])\n        helper.auth_tkt = auth_tkt\n        helper.AuthTicket = auth_tkt.AuthTicket\n        helper.parse_ticket = auth_tkt.parse_ticket\n        helper.BadTicket = auth_tkt.BadTicket\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](None, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=/\" in response.headerlist[0][1])\n\n    def test_remember(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_include_ip(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_path(self):\n        helper = self._makeOne('secret', include_ip=True,\n                               path=\"/cgi-bin/app.cgi/\")\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith(\n            '; Domain=localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith(\n            '; Domain=.localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_http_only(self):\n        helper = self._makeOne('secret', include_ip=True, http_only=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; HttpOnly'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_secure(self):\n        helper = self._makeOne('secret', include_ip=True, secure=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[0][1])\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_wild_domain_disabled(self):\n        helper = self._makeOne('secret', wild_domain=False)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 2)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain(self):\n        helper = self._makeOne('secret', parent_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain_supercedes_wild_domain(self):\n        helper = self._makeOne('secret', parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n\n    def test_remember_explicit_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga')\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_domain_supercedes_parent_and_wild_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga',\n                parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n\n    def test_remember_binary_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, b'userid')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(b'userid').strip()))\n        self.assertEqual(val['user_data'], 'userid_type:b64str')\n\n    def test_remember_int_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 1)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_long_userid(self):\n        from pyramid.compat import long\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, long(1))\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_unicode_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = text_(b'\\xc2\\xa9', 'utf-8')\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(userid.encode('utf-8'))))\n        self.assertEqual(val['user_data'], 'userid_type:b64unicode')\n\n    def test_remember_insane_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = object()\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        value = values[0]\n        self.assertTrue('userid' in value.value)\n\n    def test_remember_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age=500)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age='500')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age_invalid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'userid', max_age='invalid value')\n\n    def test_remember_tokens(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'other', tokens=('foo', 'bar'))\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[0][1])\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[1][1])\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[2][1])\n\n    def test_remember_unicode_but_ascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'foo', 'utf-8')\n        result = helper.remember(request, 'other', tokens=(la,))\n        # tokens must be str type on both Python 2 and 3\n        self.assertTrue(\"/tokens=foo/\" in result[0][1])\n\n    def test_remember_nonascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'La Pe\\xc3\\xb1a', 'utf-8')\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=(la,))\n\n    def test_remember_invalid_token_format(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('foo bar',))\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('1bar',))\n\n    def test_forget(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        headers = helper.forget(request)\n        self.assertEqual(len(headers), 3)\n        name, value = headers[0]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[1]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[2]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=.localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 1101,
                            "end_lineno": 1109,
                            "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        items = cookie.value.split('/')\n        D = {}\n        for item in items:\n            k, v = item.split('=', 1)\n            D[k] = v\n        return D\n\n    def _parseHeaders(self, headers):\n        return [ self._parseHeader(header) for header in headers ]\n\n    def _parseHeader(self, header):\n        cookie = self._parseCookie(header[1])\n        return cookie\n\n    def _parseCookie(self, cookie):\n        from pyramid.compat import SimpleCookie\n        cookies = SimpleCookie()\n        cookies.load(cookie)\n        return cookies.get('auth_tkt')\n\n    def test_init_cookie_str_reissue_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', reissue_time='invalid value')\n\n    def test_init_cookie_str_timeout_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', timeout='invalid value')\n\n    def test_init_cookie_str_max_age_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', max_age='invalid value')\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_str_timeout(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_str_reissue(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time='0')\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        helper.auth_tkt.tokens = (text_('a'), )\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n\n    def test_identify_cookie_reissue_already_reissued_this_request(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        request._authtkt_reissued = True\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_notyet(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=10)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_revoked_by_forget(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.forget(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_revoked_by_remember(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.remember(request, 'bob')\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_with_tokens_default(self):\n        # see https://github.com/Pylons/pyramid/issues#issue/108\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        auth_tkt = DummyAuthTktModule(tokens=[''])\n        helper.auth_tkt = auth_tkt\n        helper.AuthTicket = auth_tkt.AuthTicket\n        helper.parse_ticket = auth_tkt.parse_ticket\n        helper.BadTicket = auth_tkt.BadTicket\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](None, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=/\" in response.headerlist[0][1])\n\n    def test_remember(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_include_ip(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_path(self):\n        helper = self._makeOne('secret', include_ip=True,\n                               path=\"/cgi-bin/app.cgi/\")\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith(\n            '; Domain=localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith(\n            '; Domain=.localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_http_only(self):\n        helper = self._makeOne('secret', include_ip=True, http_only=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; HttpOnly'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_secure(self):\n        helper = self._makeOne('secret', include_ip=True, secure=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[0][1])\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_wild_domain_disabled(self):\n        helper = self._makeOne('secret', wild_domain=False)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 2)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain(self):\n        helper = self._makeOne('secret', parent_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain_supercedes_wild_domain(self):\n        helper = self._makeOne('secret', parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n\n    def test_remember_explicit_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga')\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_domain_supercedes_parent_and_wild_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga',\n                parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n\n    def test_remember_binary_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, b'userid')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(b'userid').strip()))\n        self.assertEqual(val['user_data'], 'userid_type:b64str')\n\n    def test_remember_int_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 1)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_long_userid(self):\n        from pyramid.compat import long\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, long(1))\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_unicode_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = text_(b'\\xc2\\xa9', 'utf-8')\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(userid.encode('utf-8'))))\n        self.assertEqual(val['user_data'], 'userid_type:b64unicode')\n\n    def test_remember_insane_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = object()\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        value = values[0]\n        self.assertTrue('userid' in value.value)\n\n    def test_remember_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age=500)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age='500')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age_invalid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'userid', max_age='invalid value')\n\n    def test_remember_tokens(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'other', tokens=('foo', 'bar'))\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[0][1])\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[1][1])\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[2][1])\n\n    def test_remember_unicode_but_ascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'foo', 'utf-8')\n        result = helper.remember(request, 'other', tokens=(la,))\n        # tokens must be str type on both Python 2 and 3\n        self.assertTrue(\"/tokens=foo/\" in result[0][1])\n\n    def test_remember_nonascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'La Pe\\xc3\\xb1a', 'utf-8')\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=(la,))\n\n    def test_remember_invalid_token_format(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('foo bar',))\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('1bar',))\n\n    def test_forget(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        headers = helper.forget(request)\n        self.assertEqual(len(headers), 3)\n        name, value = headers[0]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[1]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[2]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=.localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 556,
                                "end_lineno": 1179,
                                "parent": null
                            }
                        }
                    ],
                    "deleted_entities": []
                },
                {
                    "descriptor": {
                        "old_range": {
                            "start": 1067,
                            "length": 6
                        },
                        "new_range": {
                            "start": 1108,
                            "length": 11
                        },
                        "section": "class TestAuthTktCookieHelper(unittest.TestCase):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "        self.assertEqual(values[0]['max-age'], '500')",
                                "type": "context"
                            },
                            {
                                "content": "        self.assertTrue(values[0]['expires'])",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "    def test_remember_str_max_age_invalid(self):",
                                "type": "added"
                            },
                            {
                                "content": "        helper = self._makeOne('secret')",
                                "type": "added"
                            },
                            {
                                "content": "        request = self._makeRequest()",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertRaises(ValueError, helper.remember, request, 'userid', max_age='invalid value')",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "    def test_remember_tokens(self):",
                                "type": "context"
                            },
                            {
                                "content": "        helper = self._makeOne('secret')",
                                "type": "context"
                            },
                            {
                                "content": "        request = self._makeRequest()",
                                "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        items = cookie.value.split('/')\n        D = {}\n        for item in items:\n            k, v = item.split('=', 1)\n            D[k] = v\n        return D\n\n    def _parseHeaders(self, headers):\n        return [ self._parseHeader(header) for header in headers ]\n\n    def _parseHeader(self, header):\n        cookie = self._parseCookie(header[1])\n        return cookie\n\n    def _parseCookie(self, cookie):\n        from pyramid.compat import SimpleCookie\n        cookies = SimpleCookie()\n        cookies.load(cookie)\n        return cookies.get('auth_tkt')\n\n    def test_init_cookie_str_reissue_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', reissue_time='invalid value')\n\n    def test_init_cookie_str_timeout_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', timeout='invalid value')\n\n    def test_init_cookie_str_max_age_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', max_age='invalid value')\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_str_timeout(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_str_reissue(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time='0')\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        helper.auth_tkt.tokens = (text_('a'), )\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n\n    def test_identify_cookie_reissue_already_reissued_this_request(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        request._authtkt_reissued = True\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_notyet(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=10)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_revoked_by_forget(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.forget(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_revoked_by_remember(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.remember(request, 'bob')\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_with_tokens_default(self):\n        # see https://github.com/Pylons/pyramid/issues#issue/108\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        auth_tkt = DummyAuthTktModule(tokens=[''])\n        helper.auth_tkt = auth_tkt\n        helper.AuthTicket = auth_tkt.AuthTicket\n        helper.parse_ticket = auth_tkt.parse_ticket\n        helper.BadTicket = auth_tkt.BadTicket\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](None, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=/\" in response.headerlist[0][1])\n\n    def test_remember(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_include_ip(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_path(self):\n        helper = self._makeOne('secret', include_ip=True,\n                               path=\"/cgi-bin/app.cgi/\")\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith(\n            '; Domain=localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith(\n            '; Domain=.localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_http_only(self):\n        helper = self._makeOne('secret', include_ip=True, http_only=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; HttpOnly'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_secure(self):\n        helper = self._makeOne('secret', include_ip=True, secure=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[0][1])\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_wild_domain_disabled(self):\n        helper = self._makeOne('secret', wild_domain=False)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 2)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain(self):\n        helper = self._makeOne('secret', parent_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain_supercedes_wild_domain(self):\n        helper = self._makeOne('secret', parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n\n    def test_remember_explicit_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga')\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_domain_supercedes_parent_and_wild_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga',\n                parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n\n    def test_remember_binary_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, b'userid')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(b'userid').strip()))\n        self.assertEqual(val['user_data'], 'userid_type:b64str')\n\n    def test_remember_int_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 1)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_long_userid(self):\n        from pyramid.compat import long\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, long(1))\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_unicode_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = text_(b'\\xc2\\xa9', 'utf-8')\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(userid.encode('utf-8'))))\n        self.assertEqual(val['user_data'], 'userid_type:b64unicode')\n\n    def test_remember_insane_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = object()\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        value = values[0]\n        self.assertTrue('userid' in value.value)\n\n    def test_remember_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age=500)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age='500')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age_invalid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'userid', max_age='invalid value')\n\n    def test_remember_tokens(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'other', tokens=('foo', 'bar'))\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[0][1])\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[1][1])\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[2][1])\n\n    def test_remember_unicode_but_ascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'foo', 'utf-8')\n        result = helper.remember(request, 'other', tokens=(la,))\n        # tokens must be str type on both Python 2 and 3\n        self.assertTrue(\"/tokens=foo/\" in result[0][1])\n\n    def test_remember_nonascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'La Pe\\xc3\\xb1a', 'utf-8')\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=(la,))\n\n    def test_remember_invalid_token_format(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('foo bar',))\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('1bar',))\n\n    def test_forget(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        headers = helper.forget(request)\n        self.assertEqual(len(headers), 3)\n        name, value = headers[0]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[1]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[2]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=.localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 556,
                            "end_lineno": 1179,
                            "parent": null
                        }
                    ],
                    "added_entities": [
                        {
                            "file_name": "pyramid/tests/test_authentication.py",
                            "type": "method",
                            "name": "TestAuthTktCookieHelper.test_remember_str_max_age_invalid",
                            "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        items = cookie.value.split('/')\n        D = {}\n        for item in items:\n            k, v = item.split('=', 1)\n            D[k] = v\n        return D\n\n    def _parseHeaders(self, headers):\n        return [ self._parseHeader(header) for header in headers ]\n\n    def _parseHeader(self, header):\n        cookie = self._parseCookie(header[1])\n        return cookie\n\n    def _parseCookie(self, cookie):\n        from pyramid.compat import SimpleCookie\n        cookies = SimpleCookie()\n        cookies.load(cookie)\n        return cookies.get('auth_tkt')\n\n    def test_init_cookie_str_reissue_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', reissue_time='invalid value')\n\n    def test_init_cookie_str_timeout_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', timeout='invalid value')\n\n    def test_init_cookie_str_max_age_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', max_age='invalid value')\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_str_timeout(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_str_reissue(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time='0')\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        helper.auth_tkt.tokens = (text_('a'), )\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n\n    def test_identify_cookie_reissue_already_reissued_this_request(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        request._authtkt_reissued = True\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_notyet(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=10)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_revoked_by_forget(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.forget(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_revoked_by_remember(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.remember(request, 'bob')\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_with_tokens_default(self):\n        # see https://github.com/Pylons/pyramid/issues#issue/108\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        auth_tkt = DummyAuthTktModule(tokens=[''])\n        helper.auth_tkt = auth_tkt\n        helper.AuthTicket = auth_tkt.AuthTicket\n        helper.parse_ticket = auth_tkt.parse_ticket\n        helper.BadTicket = auth_tkt.BadTicket\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](None, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=/\" in response.headerlist[0][1])\n\n    def test_remember(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_include_ip(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_path(self):\n        helper = self._makeOne('secret', include_ip=True,\n                               path=\"/cgi-bin/app.cgi/\")\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith(\n            '; Domain=localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith(\n            '; Domain=.localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_http_only(self):\n        helper = self._makeOne('secret', include_ip=True, http_only=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; HttpOnly'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_secure(self):\n        helper = self._makeOne('secret', include_ip=True, secure=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[0][1])\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_wild_domain_disabled(self):\n        helper = self._makeOne('secret', wild_domain=False)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 2)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain(self):\n        helper = self._makeOne('secret', parent_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain_supercedes_wild_domain(self):\n        helper = self._makeOne('secret', parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n\n    def test_remember_explicit_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga')\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_domain_supercedes_parent_and_wild_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga',\n                parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n\n    def test_remember_binary_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, b'userid')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(b'userid').strip()))\n        self.assertEqual(val['user_data'], 'userid_type:b64str')\n\n    def test_remember_int_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 1)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_long_userid(self):\n        from pyramid.compat import long\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, long(1))\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_unicode_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = text_(b'\\xc2\\xa9', 'utf-8')\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(userid.encode('utf-8'))))\n        self.assertEqual(val['user_data'], 'userid_type:b64unicode')\n\n    def test_remember_insane_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = object()\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        value = values[0]\n        self.assertTrue('userid' in value.value)\n\n    def test_remember_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age=500)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age='500')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age_invalid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'userid', max_age='invalid value')\n\n    def test_remember_tokens(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'other', tokens=('foo', 'bar'))\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[0][1])\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[1][1])\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[2][1])\n\n    def test_remember_unicode_but_ascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'foo', 'utf-8')\n        result = helper.remember(request, 'other', tokens=(la,))\n        # tokens must be str type on both Python 2 and 3\n        self.assertTrue(\"/tokens=foo/\" in result[0][1])\n\n    def test_remember_nonascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'La Pe\\xc3\\xb1a', 'utf-8')\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=(la,))\n\n    def test_remember_invalid_token_format(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('foo bar',))\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('1bar',))\n\n    def test_forget(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        headers = helper.forget(request)\n        self.assertEqual(len(headers), 3)\n        name, value = headers[0]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[1]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[2]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=.localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 1111,
                            "end_lineno": 1114,
                            "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        items = cookie.value.split('/')\n        D = {}\n        for item in items:\n            k, v = item.split('=', 1)\n            D[k] = v\n        return D\n\n    def _parseHeaders(self, headers):\n        return [ self._parseHeader(header) for header in headers ]\n\n    def _parseHeader(self, header):\n        cookie = self._parseCookie(header[1])\n        return cookie\n\n    def _parseCookie(self, cookie):\n        from pyramid.compat import SimpleCookie\n        cookies = SimpleCookie()\n        cookies.load(cookie)\n        return cookies.get('auth_tkt')\n\n    def test_init_cookie_str_reissue_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', reissue_time='invalid value')\n\n    def test_init_cookie_str_timeout_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', timeout='invalid value')\n\n    def test_init_cookie_str_max_age_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', max_age='invalid value')\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_str_timeout(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_str_reissue(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time='0')\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        helper.auth_tkt.tokens = (text_('a'), )\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n\n    def test_identify_cookie_reissue_already_reissued_this_request(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        request._authtkt_reissued = True\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_notyet(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=10)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_revoked_by_forget(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.forget(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_revoked_by_remember(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.remember(request, 'bob')\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_with_tokens_default(self):\n        # see https://github.com/Pylons/pyramid/issues#issue/108\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        auth_tkt = DummyAuthTktModule(tokens=[''])\n        helper.auth_tkt = auth_tkt\n        helper.AuthTicket = auth_tkt.AuthTicket\n        helper.parse_ticket = auth_tkt.parse_ticket\n        helper.BadTicket = auth_tkt.BadTicket\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](None, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=/\" in response.headerlist[0][1])\n\n    def test_remember(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_include_ip(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_path(self):\n        helper = self._makeOne('secret', include_ip=True,\n                               path=\"/cgi-bin/app.cgi/\")\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith(\n            '; Domain=localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith(\n            '; Domain=.localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_http_only(self):\n        helper = self._makeOne('secret', include_ip=True, http_only=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; HttpOnly'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_secure(self):\n        helper = self._makeOne('secret', include_ip=True, secure=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[0][1])\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_wild_domain_disabled(self):\n        helper = self._makeOne('secret', wild_domain=False)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 2)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain(self):\n        helper = self._makeOne('secret', parent_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain_supercedes_wild_domain(self):\n        helper = self._makeOne('secret', parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n\n    def test_remember_explicit_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga')\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_domain_supercedes_parent_and_wild_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga',\n                parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n\n    def test_remember_binary_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, b'userid')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(b'userid').strip()))\n        self.assertEqual(val['user_data'], 'userid_type:b64str')\n\n    def test_remember_int_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 1)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_long_userid(self):\n        from pyramid.compat import long\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, long(1))\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_unicode_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = text_(b'\\xc2\\xa9', 'utf-8')\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(userid.encode('utf-8'))))\n        self.assertEqual(val['user_data'], 'userid_type:b64unicode')\n\n    def test_remember_insane_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = object()\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        value = values[0]\n        self.assertTrue('userid' in value.value)\n\n    def test_remember_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age=500)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age='500')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age_invalid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'userid', max_age='invalid value')\n\n    def test_remember_tokens(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'other', tokens=('foo', 'bar'))\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[0][1])\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[1][1])\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[2][1])\n\n    def test_remember_unicode_but_ascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'foo', 'utf-8')\n        result = helper.remember(request, 'other', tokens=(la,))\n        # tokens must be str type on both Python 2 and 3\n        self.assertTrue(\"/tokens=foo/\" in result[0][1])\n\n    def test_remember_nonascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'La Pe\\xc3\\xb1a', 'utf-8')\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=(la,))\n\n    def test_remember_invalid_token_format(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('foo bar',))\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('1bar',))\n\n    def test_forget(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        headers = helper.forget(request)\n        self.assertEqual(len(headers), 3)\n        name, value = headers[0]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[1]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[2]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=.localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 556,
                                "end_lineno": 1179,
                                "parent": null
                            }
                        }
                    ],
                    "deleted_entities": []
                }
            ]
        },
        {
            "old_file_content": "import base64\nimport json\nimport unittest\nfrom pyramid import testing\n\nclass SharedCookieSessionTests(object):\n\n    def test_ctor_no_cookie(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        self.assertEqual(dict(session), {})\n\n    def test_instance_conforms(self):\n        from zope.interface.verify import verifyObject\n        from pyramid.interfaces import ISession\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        verifyObject(ISession, session)\n\n    def test_ctor_with_cookie_still_valid(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request)\n        self.assertEqual(dict(session), {'state':1})\n\n    def test_ctor_with_cookie_expired(self):\n        request = testing.DummyRequest()\n        cookieval = self._serialize((0, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request)\n        self.assertEqual(dict(session), {})\n\n    def test_ctor_with_bad_cookie_cannot_deserialize(self):\n        request = testing.DummyRequest()\n        request.cookies['session'] = 'abc'\n        session = self._makeOne(request)\n        self.assertEqual(dict(session), {})\n\n    def test_ctor_with_bad_cookie_not_tuple(self):\n        request = testing.DummyRequest()\n        cookieval = self._serialize('abc')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request)\n        self.assertEqual(dict(session), {})\n\n    def test_timeout(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 5, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, timeout=1)\n        self.assertEqual(dict(session), {})\n\n    def test_timeout_never(self):\n        import time\n        request = testing.DummyRequest()\n        LONG_TIME = 31536000\n        cookieval = self._serialize((time.time() + LONG_TIME, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, timeout=None)\n        self.assertEqual(dict(session), {'state': 1})\n\n    def test_changed(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        self.assertEqual(session.changed(), None)\n        self.assertTrue(session._dirty)\n\n    def test_invalidate(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session['a'] = 1\n        self.assertEqual(session.invalidate(), None)\n        self.assertFalse('a' in session)\n\n    def test_reissue_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 2, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request)\n        self.assertEqual(session['state'], 1)\n        self.assertTrue(session._dirty)\n\n    def test__set_cookie_on_exception(self):\n        request = testing.DummyRequest()\n        request.exception = True\n        session = self._makeOne(request)\n        session._cookie_on_exception = False\n        response = DummyResponse()\n        self.assertEqual(session._set_cookie(response), False)\n\n    def test__set_cookie_on_exception_no_request_exception(self):\n        import webob\n        request = testing.DummyRequest()\n        request.exception = None\n        session = self._makeOne(request)\n        session._cookie_on_exception = False\n        response = webob.Response()\n        self.assertEqual(session._set_cookie(response), True)\n        self.assertEqual(response.headerlist[-1][0], 'Set-Cookie')\n\n    def test__set_cookie_cookieval_too_long(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session['abc'] = 'x'*100000\n        response = DummyResponse()\n        self.assertRaises(ValueError, session._set_cookie, response)\n\n    def test__set_cookie_real_webob_response(self):\n        import webob\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session['abc'] = 'x'\n        response = webob.Response()\n        self.assertEqual(session._set_cookie(response), True)\n        self.assertEqual(response.headerlist[-1][0], 'Set-Cookie')\n\n    def test__set_cookie_options(self):\n        from pyramid.response import Response\n        request = testing.DummyRequest()\n        request.exception = None\n        session = self._makeOne(request,\n                                cookie_name='abc',\n                                path='/foo',\n                                domain='localhost',\n                                secure=True,\n                                httponly=True,\n                                )\n        session['abc'] = 'x'\n        response = Response()\n        self.assertEqual(session._set_cookie(response), True)\n        cookieval = response.headerlist[-1][1]\n        val, domain, path, secure, httponly = [x.strip() for x in\n                                               cookieval.split(';')]\n        self.assertTrue(val.startswith('abc='))\n        self.assertEqual(domain, 'Domain=localhost')\n        self.assertEqual(path, 'Path=/foo')\n        self.assertEqual(secure, 'secure')\n        self.assertEqual(httponly, 'HttpOnly')\n\n    def test_flash_default(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session.flash('msg1')\n        session.flash('msg2')\n        self.assertEqual(session['_f_'], ['msg1', 'msg2'])\n\n    def test_flash_allow_duplicate_false(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session.flash('msg1')\n        session.flash('msg1', allow_duplicate=False)\n        self.assertEqual(session['_f_'], ['msg1'])\n\n    def test_flash_allow_duplicate_true_and_msg_not_in_storage(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session.flash('msg1', allow_duplicate=True)\n        self.assertEqual(session['_f_'], ['msg1'])\n\n    def test_flash_allow_duplicate_false_and_msg_not_in_storage(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session.flash('msg1', allow_duplicate=False)\n        self.assertEqual(session['_f_'], ['msg1'])\n\n    def test_flash_mixed(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session.flash('warn1', 'warn')\n        session.flash('warn2', 'warn')\n        session.flash('err1', 'error')\n        session.flash('err2', 'error')\n        self.assertEqual(session['_f_warn'], ['warn1', 'warn2'])\n\n    def test_pop_flash_default_queue(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        queue = ['one', 'two']\n        session['_f_'] = queue\n        result = session.pop_flash()\n        self.assertEqual(result, queue)\n        self.assertEqual(session.get('_f_'), None)\n\n    def test_pop_flash_nodefault_queue(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        queue = ['one', 'two']\n        session['_f_error'] = queue\n        result = session.pop_flash('error')\n        self.assertEqual(result, queue)\n        self.assertEqual(session.get('_f_error'), None)\n\n    def test_peek_flash_default_queue(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        queue = ['one', 'two']\n        session['_f_'] = queue\n        result = session.peek_flash()\n        self.assertEqual(result, queue)\n        self.assertEqual(session.get('_f_'), queue)\n\n    def test_peek_flash_nodefault_queue(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        queue = ['one', 'two']\n        session['_f_error'] = queue\n        result = session.peek_flash('error')\n        self.assertEqual(result, queue)\n        self.assertEqual(session.get('_f_error'), queue)\n\n    def test_new_csrf_token(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        token = session.new_csrf_token()\n        self.assertEqual(token, session['_csrft_'])\n\n    def test_get_csrf_token(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session['_csrft_'] = 'token'\n        token = session.get_csrf_token()\n        self.assertEqual(token, 'token')\n        self.assertTrue('_csrft_' in session)\n\n    def test_get_csrf_token_new(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        token = session.get_csrf_token()\n        self.assertTrue(token)\n        self.assertTrue('_csrft_' in session)\n\n    def test_no_set_cookie_with_exception(self):\n        import webob\n        request = testing.DummyRequest()\n        request.exception = True\n        session = self._makeOne(request, set_on_exception=False)\n        session['a'] = 1\n        callbacks = request.response_callbacks\n        self.assertEqual(len(callbacks), 1)\n        response = webob.Response()\n        result = callbacks[0](request, response)\n        self.assertEqual(result, None)\n        self.assertFalse('Set-Cookie' in dict(response.headerlist))\n\n    def test_set_cookie_with_exception(self):\n        import webob\n        request = testing.DummyRequest()\n        request.exception = True\n        session = self._makeOne(request)\n        session['a'] = 1\n        callbacks = request.response_callbacks\n        self.assertEqual(len(callbacks), 1)\n        response = webob.Response()\n        result = callbacks[0](request, response)\n        self.assertEqual(result, None)\n        self.assertTrue('Set-Cookie' in dict(response.headerlist))\n\n    def test_cookie_is_set(self):\n        import webob\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session['a'] = 1\n        callbacks = request.response_callbacks\n        self.assertEqual(len(callbacks), 1)\n        response = webob.Response()\n        result = callbacks[0](request, response)\n        self.assertEqual(result, None)\n        self.assertTrue('Set-Cookie' in dict(response.headerlist))\n\nclass TestBaseCookieSession(SharedCookieSessionTests, unittest.TestCase):\n    def _makeOne(self, request, **kw):\n        from pyramid.session import BaseCookieSessionFactory\n        serializer = DummySerializer()\n        return BaseCookieSessionFactory(serializer, **kw)(request)\n\n    def _serialize(self, value):\n        return base64.b64encode(json.dumps(value).encode('utf-8'))\n\n    def test_reissue_not_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time=1)\n        self.assertEqual(session['state'], 1)\n        self.assertFalse(session._dirty)\n\n    def test_reissue_never(self):\n        request = testing.DummyRequest()\n        cookieval = self._serialize((0, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time=None, timeout=None)\n        self.assertEqual(session['state'], 1)\n        self.assertFalse(session._dirty)\n\nclass TestSignedCookieSession(SharedCookieSessionTests, unittest.TestCase):\n    def _makeOne(self, request, **kw):\n        from pyramid.session import SignedCookieSessionFactory\n        kw.setdefault('secret', 'secret')\n        return SignedCookieSessionFactory(**kw)(request)\n\n    def _serialize(self, value, salt=b'pyramid.session.', hashalg='sha512'):\n        import base64\n        import hashlib\n        import hmac\n        import pickle\n\n        digestmod = lambda: hashlib.new(hashalg)\n        cstruct = pickle.dumps(value, pickle.HIGHEST_PROTOCOL)\n        sig = hmac.new(salt + b'secret', cstruct, digestmod).digest()\n        return base64.urlsafe_b64encode(sig + cstruct).rstrip(b'=')\n\n    def test_reissue_not_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time=1)\n        self.assertEqual(session['state'], 1)\n        self.assertFalse(session._dirty)\n\n    def test_reissue_never(self):\n        request = testing.DummyRequest()\n        cookieval = self._serialize((0, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time=None, timeout=None)\n        self.assertEqual(session['state'], 1)\n        self.assertFalse(session._dirty)\n\n    def test_custom_salt(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}), salt=b'f.')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, salt=b'f.')\n        self.assertEqual(session['state'], 1)\n\n    def test_salt_mismatch(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}), salt=b'f.')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, salt=b'g.')\n        self.assertEqual(session, {})\n\n    def test_custom_hashalg(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}),\n                                    hashalg='sha1')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, hashalg='sha1')\n        self.assertEqual(session['state'], 1)\n\n    def test_hashalg_mismatch(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}),\n                                    hashalg='sha1')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, hashalg='sha256')\n        self.assertEqual(session, {})\n\n    def test_secret_mismatch(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, secret='evilsecret')\n        self.assertEqual(session, {})\n\n    def test_custom_serializer(self):\n        import base64\n        from hashlib import sha512\n        import hmac\n        import time\n        request = testing.DummyRequest()\n        serializer = DummySerializer()\n        cstruct = serializer.dumps((time.time(), 0, {'state': 1}))\n        sig = hmac.new(b'pyramid.session.secret', cstruct, sha512).digest()\n        cookieval = base64.urlsafe_b64encode(sig + cstruct).rstrip(b'=')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, serializer=serializer)\n        self.assertEqual(session['state'], 1)\n\n    def test_invalid_data_size(self):\n        from hashlib import sha512\n        import base64\n        request = testing.DummyRequest()\n        num_bytes = sha512().digest_size - 1\n        cookieval = base64.b64encode(b' ' * num_bytes)\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request)\n        self.assertEqual(session, {})\n\n    def test_very_long_key(self):\n        verylongkey = b'a' * 1024\n        import webob\n        request = testing.DummyRequest()\n        session = self._makeOne(request, secret=verylongkey)\n        session['a'] = 1\n        callbacks = request.response_callbacks\n        self.assertEqual(len(callbacks), 1)\n        response = webob.Response()\n\n        try:\n            result = callbacks[0](request, response)\n        except TypeError: # pragma: no cover\n            self.fail('HMAC failed to initialize due to key length.')\n\n        self.assertEqual(result, None)\n        self.assertTrue('Set-Cookie' in dict(response.headerlist))\n\nclass TestUnencryptedCookieSession(SharedCookieSessionTests, unittest.TestCase):\n    def setUp(self):\n        super(TestUnencryptedCookieSession, self).setUp()\n        from zope.deprecation import __show__\n        __show__.off()\n\n    def tearDown(self):\n        super(TestUnencryptedCookieSession, self).tearDown()\n        from zope.deprecation import __show__\n        __show__.on()\n        \n    def _makeOne(self, request, **kw):\n        from pyramid.session import UnencryptedCookieSessionFactoryConfig\n        self._rename_cookie_var(kw, 'path', 'cookie_path')\n        self._rename_cookie_var(kw, 'domain', 'cookie_domain')\n        self._rename_cookie_var(kw, 'secure', 'cookie_secure')\n        self._rename_cookie_var(kw, 'httponly', 'cookie_httponly')\n        self._rename_cookie_var(kw, 'set_on_exception', 'cookie_on_exception')\n        return UnencryptedCookieSessionFactoryConfig('secret', **kw)(request)\n\n    def _rename_cookie_var(self, kw, src, dest):\n        if src in kw:\n            kw.setdefault(dest, kw.pop(src))\n\n    def _serialize(self, value):\n        from pyramid.compat import bytes_\n        from pyramid.session import signed_serialize\n        return bytes_(signed_serialize(value, 'secret'))\n\n    def test_serialize_option(self):\n        from pyramid.response import Response\n        secret = 'secret'\n        request = testing.DummyRequest()\n        session = self._makeOne(request,\n            signed_serialize=dummy_signed_serialize)\n        session['key'] = 'value'\n        response = Response()\n        self.assertEqual(session._set_cookie(response), True)\n        cookie = response.headerlist[-1][1]\n        expected_cookieval = dummy_signed_serialize(\n            (session.accessed, session.created, {'key': 'value'}), secret)\n        response = Response()\n        response.set_cookie('session', expected_cookieval)\n        expected_cookie = response.headerlist[-1][1]\n        self.assertEqual(cookie, expected_cookie)\n\n    def test_deserialize_option(self):\n        import time\n        secret = 'secret'\n        request = testing.DummyRequest()\n        accessed = time.time()\n        state = {'key': 'value'}\n        cookieval = dummy_signed_serialize((accessed, accessed, state), secret)\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request,\n            signed_deserialize=dummy_signed_deserialize)\n        self.assertEqual(dict(session), state)\n\ndef dummy_signed_serialize(data, secret):\n    import base64\n    from pyramid.compat import pickle, bytes_\n    pickled = pickle.dumps(data)\n    return base64.b64encode(bytes_(secret)) + base64.b64encode(pickled)\n\ndef dummy_signed_deserialize(serialized, secret):\n    import base64\n    from pyramid.compat import pickle, bytes_\n    serialized_data = base64.b64decode(\n        serialized[len(base64.b64encode(bytes_(secret))):])\n    return pickle.loads(serialized_data)\n\nclass Test_manage_accessed(unittest.TestCase):\n    def _makeOne(self, wrapped):\n        from pyramid.session import manage_accessed\n        return manage_accessed(wrapped)\n\n    def test_accessed_set(self):\n        request = testing.DummyRequest()\n        session = DummySessionFactory(request)\n        session.renewed = 0\n        wrapper = self._makeOne(session.__class__.get)\n        wrapper(session, 'a')\n        self.assertNotEqual(session.accessed, None)\n        self.assertTrue(session._dirty)\n\n    def test_accessed_without_renew(self):\n        import time\n        request = testing.DummyRequest()\n        session = DummySessionFactory(request)\n        session._reissue_time = 5\n        session.renewed = time.time()\n        wrapper = self._makeOne(session.__class__.get)\n        wrapper(session, 'a')\n        self.assertNotEqual(session.accessed, None)\n        self.assertFalse(session._dirty)\n\n    def test_already_dirty(self):\n        request = testing.DummyRequest()\n        session = DummySessionFactory(request)\n        session.renewed = 0\n        session._dirty = True\n        session['a'] = 1\n        wrapper = self._makeOne(session.__class__.get)\n        self.assertEqual(wrapper.__doc__, session.get.__doc__)\n        result = wrapper(session, 'a')\n        self.assertEqual(result, 1)\n        callbacks = request.response_callbacks\n        if callbacks is not None: self.assertEqual(len(callbacks), 0)\n\nclass Test_manage_changed(unittest.TestCase):\n    def _makeOne(self, wrapped):\n        from pyramid.session import manage_changed\n        return manage_changed(wrapped)\n\n    def test_it(self):\n        request = testing.DummyRequest()\n        session = DummySessionFactory(request)\n        wrapper = self._makeOne(session.__class__.__setitem__)\n        wrapper(session, 'a', 1)\n        self.assertNotEqual(session.accessed, None)\n        self.assertTrue(session._dirty)\n\ndef serialize(data, secret):\n    import hmac\n    import base64\n    from hashlib import sha1\n    from pyramid.compat import bytes_\n    from pyramid.compat import native_\n    from pyramid.compat import pickle\n    pickled = pickle.dumps(data, pickle.HIGHEST_PROTOCOL)\n    sig = hmac.new(bytes_(secret, 'utf-8'), pickled, sha1).hexdigest()\n    return sig + native_(base64.b64encode(pickled))\n\nclass Test_signed_serialize(unittest.TestCase):\n    def _callFUT(self, data, secret):\n        from pyramid.session import signed_serialize\n        return signed_serialize(data, secret)\n\n    def test_it(self):\n        expected = serialize('123', 'secret')\n        result = self._callFUT('123', 'secret')\n        self.assertEqual(result, expected)\n\n    def test_it_with_highorder_secret(self):\n        secret = b'\\xce\\xb1\\xce\\xb2\\xce\\xb3\\xce\\xb4'.decode('utf-8')\n        expected = serialize('123', secret)\n        result = self._callFUT('123', secret)\n        self.assertEqual(result, expected)\n\n    def test_it_with_latin1_secret(self):\n        secret = b'La Pe\\xc3\\xb1a'\n        expected = serialize('123', secret)\n        result = self._callFUT('123', secret.decode('latin-1'))\n        self.assertEqual(result, expected)\n        \nclass Test_signed_deserialize(unittest.TestCase):\n    def _callFUT(self, serialized, secret, hmac=None):\n        if hmac is None:\n            import hmac\n        from pyramid.session import signed_deserialize\n        return signed_deserialize(serialized, secret, hmac=hmac)\n\n    def test_it(self):\n        serialized = serialize('123', 'secret')\n        result = self._callFUT(serialized, 'secret')\n        self.assertEqual(result, '123')\n\n    def test_invalid_bits(self):\n        serialized = serialize('123', 'secret')\n        self.assertRaises(ValueError, self._callFUT, serialized, 'seekrit')\n\n    def test_invalid_len(self):\n        class hmac(object):\n            def new(self, *arg):\n                return self\n            def hexdigest(self):\n                return '1234'\n        serialized = serialize('123', 'secret123')\n        self.assertRaises(ValueError, self._callFUT, serialized, 'secret',\n                          hmac=hmac())\n        \n    def test_it_bad_encoding(self):\n        serialized = 'bad' + serialize('123', 'secret')\n        self.assertRaises(ValueError, self._callFUT, serialized, 'secret')\n\n    def test_it_with_highorder_secret(self):\n        secret = b'\\xce\\xb1\\xce\\xb2\\xce\\xb3\\xce\\xb4'.decode('utf-8')\n        serialized = serialize('123', secret)\n        result = self._callFUT(serialized, secret)\n        self.assertEqual(result, '123')\n\n    # bwcompat with pyramid <= 1.5b1 where latin1 is the default\n    def test_it_with_latin1_secret(self):\n        secret = b'La Pe\\xc3\\xb1a'\n        serialized = serialize('123', secret)\n        result = self._callFUT(serialized, secret.decode('latin-1'))\n        self.assertEqual(result, '123')\n\nclass Test_check_csrf_token(unittest.TestCase):\n    def _callFUT(self, *args, **kwargs):\n        from ..session import check_csrf_token\n        return check_csrf_token(*args, **kwargs)\n\n    def test_success_token(self):\n        request = testing.DummyRequest()\n        request.params['csrf_token'] = request.session.get_csrf_token()\n        self.assertEqual(self._callFUT(request, token='csrf_token'), True)\n\n    def test_success_header(self):\n        request = testing.DummyRequest()\n        request.headers['X-CSRF-Token'] = request.session.get_csrf_token()\n        self.assertEqual(self._callFUT(request, header='X-CSRF-Token'), True)\n\n    def test_success_default_token(self):\n        request = testing.DummyRequest()\n        request.params['csrf_token'] = request.session.get_csrf_token()\n        self.assertEqual(self._callFUT(request), True)\n\n    def test_success_default_header(self):\n        request = testing.DummyRequest()\n        request.headers['X-CSRF-Token'] = request.session.get_csrf_token()\n        self.assertEqual(self._callFUT(request), True)\n\n    def test_failure_raises(self):\n        from pyramid.exceptions import BadCSRFToken\n        request = testing.DummyRequest()\n        self.assertRaises(BadCSRFToken, self._callFUT, request,\n                          'csrf_token')\n\n    def test_failure_no_raises(self):\n        request = testing.DummyRequest()\n        result = self._callFUT(request, 'csrf_token', raises=False)\n        self.assertEqual(result, False)\n\nclass DummySerializer(object):\n    def dumps(self, value):\n        return base64.b64encode(json.dumps(value).encode('utf-8'))\n\n    def loads(self, value):\n        try:\n            return json.loads(base64.b64decode(value).decode('utf-8'))\n\n        # base64.b64decode raises a TypeError on py2 instead of a ValueError\n        # and a ValueError is required for the session to handle it properly\n        except TypeError:\n            raise ValueError\n\nclass DummySessionFactory(dict):\n    _dirty = False\n    _cookie_name = 'session'\n    _cookie_max_age = None\n    _cookie_path = '/'\n    _cookie_domain = None\n    _cookie_secure = False\n    _cookie_httponly = False\n    _timeout = 1200\n    _reissue_time = 0\n\n    def __init__(self, request):\n        self.request = request\n        dict.__init__(self, {})\n\n    def changed(self):\n        self._dirty = True\n\nclass DummyResponse(object):\n    def __init__(self):\n        self.headerlist = []\n",
            "new_file_content": "import base64\nimport json\nimport unittest\nfrom pyramid import testing\n\nclass SharedCookieSessionTests(object):\n\n    def test_ctor_no_cookie(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        self.assertEqual(dict(session), {})\n\n    def test_instance_conforms(self):\n        from zope.interface.verify import verifyObject\n        from pyramid.interfaces import ISession\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        verifyObject(ISession, session)\n\n    def test_ctor_with_cookie_still_valid(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request)\n        self.assertEqual(dict(session), {'state':1})\n\n    def test_ctor_with_cookie_expired(self):\n        request = testing.DummyRequest()\n        cookieval = self._serialize((0, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request)\n        self.assertEqual(dict(session), {})\n\n    def test_ctor_with_bad_cookie_cannot_deserialize(self):\n        request = testing.DummyRequest()\n        request.cookies['session'] = 'abc'\n        session = self._makeOne(request)\n        self.assertEqual(dict(session), {})\n\n    def test_ctor_with_bad_cookie_not_tuple(self):\n        request = testing.DummyRequest()\n        cookieval = self._serialize('abc')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request)\n        self.assertEqual(dict(session), {})\n\n    def test_timeout(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 5, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, timeout=1)\n        self.assertEqual(dict(session), {})\n\n    def test_timeout_never(self):\n        import time\n        request = testing.DummyRequest()\n        LONG_TIME = 31536000\n        cookieval = self._serialize((time.time() + LONG_TIME, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, timeout=None)\n        self.assertEqual(dict(session), {'state': 1})\n\n    def test_timeout_str(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 5, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, timeout='1')\n        self.assertEqual(dict(session), {})\n\n    def test_timeout_invalid(self):\n        request = testing.DummyRequest()\n        self.assertRaises(ValueError, self._makeOne, request, timeout='Invalid value')\n\n    def test_changed(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        self.assertEqual(session.changed(), None)\n        self.assertTrue(session._dirty)\n\n    def test_invalidate(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session['a'] = 1\n        self.assertEqual(session.invalidate(), None)\n        self.assertFalse('a' in session)\n\n    def test_reissue_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 2, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request)\n        self.assertEqual(session['state'], 1)\n        self.assertTrue(session._dirty)\n\n    def test__set_cookie_on_exception(self):\n        request = testing.DummyRequest()\n        request.exception = True\n        session = self._makeOne(request)\n        session._cookie_on_exception = False\n        response = DummyResponse()\n        self.assertEqual(session._set_cookie(response), False)\n\n    def test__set_cookie_on_exception_no_request_exception(self):\n        import webob\n        request = testing.DummyRequest()\n        request.exception = None\n        session = self._makeOne(request)\n        session._cookie_on_exception = False\n        response = webob.Response()\n        self.assertEqual(session._set_cookie(response), True)\n        self.assertEqual(response.headerlist[-1][0], 'Set-Cookie')\n\n    def test__set_cookie_cookieval_too_long(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session['abc'] = 'x'*100000\n        response = DummyResponse()\n        self.assertRaises(ValueError, session._set_cookie, response)\n\n    def test__set_cookie_real_webob_response(self):\n        import webob\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session['abc'] = 'x'\n        response = webob.Response()\n        self.assertEqual(session._set_cookie(response), True)\n        self.assertEqual(response.headerlist[-1][0], 'Set-Cookie')\n\n    def test__set_cookie_options(self):\n        from pyramid.response import Response\n        request = testing.DummyRequest()\n        request.exception = None\n        session = self._makeOne(request,\n                                cookie_name='abc',\n                                path='/foo',\n                                domain='localhost',\n                                secure=True,\n                                httponly=True,\n                                )\n        session['abc'] = 'x'\n        response = Response()\n        self.assertEqual(session._set_cookie(response), True)\n        cookieval = response.headerlist[-1][1]\n        val, domain, path, secure, httponly = [x.strip() for x in\n                                               cookieval.split(';')]\n        self.assertTrue(val.startswith('abc='))\n        self.assertEqual(domain, 'Domain=localhost')\n        self.assertEqual(path, 'Path=/foo')\n        self.assertEqual(secure, 'secure')\n        self.assertEqual(httponly, 'HttpOnly')\n\n    def test_flash_default(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session.flash('msg1')\n        session.flash('msg2')\n        self.assertEqual(session['_f_'], ['msg1', 'msg2'])\n\n    def test_flash_allow_duplicate_false(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session.flash('msg1')\n        session.flash('msg1', allow_duplicate=False)\n        self.assertEqual(session['_f_'], ['msg1'])\n\n    def test_flash_allow_duplicate_true_and_msg_not_in_storage(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session.flash('msg1', allow_duplicate=True)\n        self.assertEqual(session['_f_'], ['msg1'])\n\n    def test_flash_allow_duplicate_false_and_msg_not_in_storage(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session.flash('msg1', allow_duplicate=False)\n        self.assertEqual(session['_f_'], ['msg1'])\n\n    def test_flash_mixed(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session.flash('warn1', 'warn')\n        session.flash('warn2', 'warn')\n        session.flash('err1', 'error')\n        session.flash('err2', 'error')\n        self.assertEqual(session['_f_warn'], ['warn1', 'warn2'])\n\n    def test_pop_flash_default_queue(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        queue = ['one', 'two']\n        session['_f_'] = queue\n        result = session.pop_flash()\n        self.assertEqual(result, queue)\n        self.assertEqual(session.get('_f_'), None)\n\n    def test_pop_flash_nodefault_queue(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        queue = ['one', 'two']\n        session['_f_error'] = queue\n        result = session.pop_flash('error')\n        self.assertEqual(result, queue)\n        self.assertEqual(session.get('_f_error'), None)\n\n    def test_peek_flash_default_queue(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        queue = ['one', 'two']\n        session['_f_'] = queue\n        result = session.peek_flash()\n        self.assertEqual(result, queue)\n        self.assertEqual(session.get('_f_'), queue)\n\n    def test_peek_flash_nodefault_queue(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        queue = ['one', 'two']\n        session['_f_error'] = queue\n        result = session.peek_flash('error')\n        self.assertEqual(result, queue)\n        self.assertEqual(session.get('_f_error'), queue)\n\n    def test_new_csrf_token(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        token = session.new_csrf_token()\n        self.assertEqual(token, session['_csrft_'])\n\n    def test_get_csrf_token(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session['_csrft_'] = 'token'\n        token = session.get_csrf_token()\n        self.assertEqual(token, 'token')\n        self.assertTrue('_csrft_' in session)\n\n    def test_get_csrf_token_new(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        token = session.get_csrf_token()\n        self.assertTrue(token)\n        self.assertTrue('_csrft_' in session)\n\n    def test_no_set_cookie_with_exception(self):\n        import webob\n        request = testing.DummyRequest()\n        request.exception = True\n        session = self._makeOne(request, set_on_exception=False)\n        session['a'] = 1\n        callbacks = request.response_callbacks\n        self.assertEqual(len(callbacks), 1)\n        response = webob.Response()\n        result = callbacks[0](request, response)\n        self.assertEqual(result, None)\n        self.assertFalse('Set-Cookie' in dict(response.headerlist))\n\n    def test_set_cookie_with_exception(self):\n        import webob\n        request = testing.DummyRequest()\n        request.exception = True\n        session = self._makeOne(request)\n        session['a'] = 1\n        callbacks = request.response_callbacks\n        self.assertEqual(len(callbacks), 1)\n        response = webob.Response()\n        result = callbacks[0](request, response)\n        self.assertEqual(result, None)\n        self.assertTrue('Set-Cookie' in dict(response.headerlist))\n\n    def test_cookie_is_set(self):\n        import webob\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session['a'] = 1\n        callbacks = request.response_callbacks\n        self.assertEqual(len(callbacks), 1)\n        response = webob.Response()\n        result = callbacks[0](request, response)\n        self.assertEqual(result, None)\n        self.assertTrue('Set-Cookie' in dict(response.headerlist))\n\nclass TestBaseCookieSession(SharedCookieSessionTests, unittest.TestCase):\n    def _makeOne(self, request, **kw):\n        from pyramid.session import BaseCookieSessionFactory\n        serializer = DummySerializer()\n        return BaseCookieSessionFactory(serializer, **kw)(request)\n\n    def _serialize(self, value):\n        return base64.b64encode(json.dumps(value).encode('utf-8'))\n\n    def test_reissue_not_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time=1)\n        self.assertEqual(session['state'], 1)\n        self.assertFalse(session._dirty)\n\n    def test_reissue_never(self):\n        request = testing.DummyRequest()\n        cookieval = self._serialize((0, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time=None, timeout=None)\n        self.assertEqual(session['state'], 1)\n        self.assertFalse(session._dirty)\n\n    def test_reissue_str_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 2, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time='0')\n        self.assertEqual(session['state'], 1)\n        self.assertTrue(session._dirty)\n\n    def test_reissue_invalid(self):\n        request = testing.DummyRequest()\n        self.assertRaises(ValueError, self._makeOne, request, reissue_time='invalid value')\n\n    def test_cookie_max_age_invalid(self):\n        request = testing.DummyRequest()\n        self.assertRaises(ValueError, self._makeOne, request, max_age='invalid value')\n\nclass TestSignedCookieSession(SharedCookieSessionTests, unittest.TestCase):\n    def _makeOne(self, request, **kw):\n        from pyramid.session import SignedCookieSessionFactory\n        kw.setdefault('secret', 'secret')\n        return SignedCookieSessionFactory(**kw)(request)\n\n    def _serialize(self, value, salt=b'pyramid.session.', hashalg='sha512'):\n        import base64\n        import hashlib\n        import hmac\n        import pickle\n\n        digestmod = lambda: hashlib.new(hashalg)\n        cstruct = pickle.dumps(value, pickle.HIGHEST_PROTOCOL)\n        sig = hmac.new(salt + b'secret', cstruct, digestmod).digest()\n        return base64.urlsafe_b64encode(sig + cstruct).rstrip(b'=')\n\n    def test_reissue_not_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time=1)\n        self.assertEqual(session['state'], 1)\n        self.assertFalse(session._dirty)\n\n    def test_reissue_never(self):\n        request = testing.DummyRequest()\n        cookieval = self._serialize((0, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time=None, timeout=None)\n        self.assertEqual(session['state'], 1)\n        self.assertFalse(session._dirty)\n\n    def test_reissue_str_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 2, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time='0')\n        self.assertEqual(session['state'], 1)\n        self.assertTrue(session._dirty)\n\n    def test_reissue_invalid(self):\n        request = testing.DummyRequest()\n        self.assertRaises(ValueError, self._makeOne, request, reissue_time='invalid value')\n\n    def test_cookie_max_age_invalid(self):\n        request = testing.DummyRequest()\n        self.assertRaises(ValueError, self._makeOne, request, max_age='invalid value')\n\n    def test_custom_salt(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}), salt=b'f.')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, salt=b'f.')\n        self.assertEqual(session['state'], 1)\n\n    def test_salt_mismatch(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}), salt=b'f.')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, salt=b'g.')\n        self.assertEqual(session, {})\n\n    def test_custom_hashalg(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}),\n                                    hashalg='sha1')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, hashalg='sha1')\n        self.assertEqual(session['state'], 1)\n\n    def test_hashalg_mismatch(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}),\n                                    hashalg='sha1')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, hashalg='sha256')\n        self.assertEqual(session, {})\n\n    def test_secret_mismatch(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, secret='evilsecret')\n        self.assertEqual(session, {})\n\n    def test_custom_serializer(self):\n        import base64\n        from hashlib import sha512\n        import hmac\n        import time\n        request = testing.DummyRequest()\n        serializer = DummySerializer()\n        cstruct = serializer.dumps((time.time(), 0, {'state': 1}))\n        sig = hmac.new(b'pyramid.session.secret', cstruct, sha512).digest()\n        cookieval = base64.urlsafe_b64encode(sig + cstruct).rstrip(b'=')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, serializer=serializer)\n        self.assertEqual(session['state'], 1)\n\n    def test_invalid_data_size(self):\n        from hashlib import sha512\n        import base64\n        request = testing.DummyRequest()\n        num_bytes = sha512().digest_size - 1\n        cookieval = base64.b64encode(b' ' * num_bytes)\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request)\n        self.assertEqual(session, {})\n\n    def test_very_long_key(self):\n        verylongkey = b'a' * 1024\n        import webob\n        request = testing.DummyRequest()\n        session = self._makeOne(request, secret=verylongkey)\n        session['a'] = 1\n        callbacks = request.response_callbacks\n        self.assertEqual(len(callbacks), 1)\n        response = webob.Response()\n\n        try:\n            result = callbacks[0](request, response)\n        except TypeError: # pragma: no cover\n            self.fail('HMAC failed to initialize due to key length.')\n\n        self.assertEqual(result, None)\n        self.assertTrue('Set-Cookie' in dict(response.headerlist))\n\nclass TestUnencryptedCookieSession(SharedCookieSessionTests, unittest.TestCase):\n    def setUp(self):\n        super(TestUnencryptedCookieSession, self).setUp()\n        from zope.deprecation import __show__\n        __show__.off()\n\n    def tearDown(self):\n        super(TestUnencryptedCookieSession, self).tearDown()\n        from zope.deprecation import __show__\n        __show__.on()\n        \n    def _makeOne(self, request, **kw):\n        from pyramid.session import UnencryptedCookieSessionFactoryConfig\n        self._rename_cookie_var(kw, 'path', 'cookie_path')\n        self._rename_cookie_var(kw, 'domain', 'cookie_domain')\n        self._rename_cookie_var(kw, 'secure', 'cookie_secure')\n        self._rename_cookie_var(kw, 'httponly', 'cookie_httponly')\n        self._rename_cookie_var(kw, 'set_on_exception', 'cookie_on_exception')\n        return UnencryptedCookieSessionFactoryConfig('secret', **kw)(request)\n\n    def _rename_cookie_var(self, kw, src, dest):\n        if src in kw:\n            kw.setdefault(dest, kw.pop(src))\n\n    def _serialize(self, value):\n        from pyramid.compat import bytes_\n        from pyramid.session import signed_serialize\n        return bytes_(signed_serialize(value, 'secret'))\n\n    def test_serialize_option(self):\n        from pyramid.response import Response\n        secret = 'secret'\n        request = testing.DummyRequest()\n        session = self._makeOne(request,\n            signed_serialize=dummy_signed_serialize)\n        session['key'] = 'value'\n        response = Response()\n        self.assertEqual(session._set_cookie(response), True)\n        cookie = response.headerlist[-1][1]\n        expected_cookieval = dummy_signed_serialize(\n            (session.accessed, session.created, {'key': 'value'}), secret)\n        response = Response()\n        response.set_cookie('session', expected_cookieval)\n        expected_cookie = response.headerlist[-1][1]\n        self.assertEqual(cookie, expected_cookie)\n\n    def test_deserialize_option(self):\n        import time\n        secret = 'secret'\n        request = testing.DummyRequest()\n        accessed = time.time()\n        state = {'key': 'value'}\n        cookieval = dummy_signed_serialize((accessed, accessed, state), secret)\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request,\n            signed_deserialize=dummy_signed_deserialize)\n        self.assertEqual(dict(session), state)\n\ndef dummy_signed_serialize(data, secret):\n    import base64\n    from pyramid.compat import pickle, bytes_\n    pickled = pickle.dumps(data)\n    return base64.b64encode(bytes_(secret)) + base64.b64encode(pickled)\n\ndef dummy_signed_deserialize(serialized, secret):\n    import base64\n    from pyramid.compat import pickle, bytes_\n    serialized_data = base64.b64decode(\n        serialized[len(base64.b64encode(bytes_(secret))):])\n    return pickle.loads(serialized_data)\n\nclass Test_manage_accessed(unittest.TestCase):\n    def _makeOne(self, wrapped):\n        from pyramid.session import manage_accessed\n        return manage_accessed(wrapped)\n\n    def test_accessed_set(self):\n        request = testing.DummyRequest()\n        session = DummySessionFactory(request)\n        session.renewed = 0\n        wrapper = self._makeOne(session.__class__.get)\n        wrapper(session, 'a')\n        self.assertNotEqual(session.accessed, None)\n        self.assertTrue(session._dirty)\n\n    def test_accessed_without_renew(self):\n        import time\n        request = testing.DummyRequest()\n        session = DummySessionFactory(request)\n        session._reissue_time = 5\n        session.renewed = time.time()\n        wrapper = self._makeOne(session.__class__.get)\n        wrapper(session, 'a')\n        self.assertNotEqual(session.accessed, None)\n        self.assertFalse(session._dirty)\n\n    def test_already_dirty(self):\n        request = testing.DummyRequest()\n        session = DummySessionFactory(request)\n        session.renewed = 0\n        session._dirty = True\n        session['a'] = 1\n        wrapper = self._makeOne(session.__class__.get)\n        self.assertEqual(wrapper.__doc__, session.get.__doc__)\n        result = wrapper(session, 'a')\n        self.assertEqual(result, 1)\n        callbacks = request.response_callbacks\n        if callbacks is not None: self.assertEqual(len(callbacks), 0)\n\nclass Test_manage_changed(unittest.TestCase):\n    def _makeOne(self, wrapped):\n        from pyramid.session import manage_changed\n        return manage_changed(wrapped)\n\n    def test_it(self):\n        request = testing.DummyRequest()\n        session = DummySessionFactory(request)\n        wrapper = self._makeOne(session.__class__.__setitem__)\n        wrapper(session, 'a', 1)\n        self.assertNotEqual(session.accessed, None)\n        self.assertTrue(session._dirty)\n\ndef serialize(data, secret):\n    import hmac\n    import base64\n    from hashlib import sha1\n    from pyramid.compat import bytes_\n    from pyramid.compat import native_\n    from pyramid.compat import pickle\n    pickled = pickle.dumps(data, pickle.HIGHEST_PROTOCOL)\n    sig = hmac.new(bytes_(secret, 'utf-8'), pickled, sha1).hexdigest()\n    return sig + native_(base64.b64encode(pickled))\n\nclass Test_signed_serialize(unittest.TestCase):\n    def _callFUT(self, data, secret):\n        from pyramid.session import signed_serialize\n        return signed_serialize(data, secret)\n\n    def test_it(self):\n        expected = serialize('123', 'secret')\n        result = self._callFUT('123', 'secret')\n        self.assertEqual(result, expected)\n\n    def test_it_with_highorder_secret(self):\n        secret = b'\\xce\\xb1\\xce\\xb2\\xce\\xb3\\xce\\xb4'.decode('utf-8')\n        expected = serialize('123', secret)\n        result = self._callFUT('123', secret)\n        self.assertEqual(result, expected)\n\n    def test_it_with_latin1_secret(self):\n        secret = b'La Pe\\xc3\\xb1a'\n        expected = serialize('123', secret)\n        result = self._callFUT('123', secret.decode('latin-1'))\n        self.assertEqual(result, expected)\n        \nclass Test_signed_deserialize(unittest.TestCase):\n    def _callFUT(self, serialized, secret, hmac=None):\n        if hmac is None:\n            import hmac\n        from pyramid.session import signed_deserialize\n        return signed_deserialize(serialized, secret, hmac=hmac)\n\n    def test_it(self):\n        serialized = serialize('123', 'secret')\n        result = self._callFUT(serialized, 'secret')\n        self.assertEqual(result, '123')\n\n    def test_invalid_bits(self):\n        serialized = serialize('123', 'secret')\n        self.assertRaises(ValueError, self._callFUT, serialized, 'seekrit')\n\n    def test_invalid_len(self):\n        class hmac(object):\n            def new(self, *arg):\n                return self\n            def hexdigest(self):\n                return '1234'\n        serialized = serialize('123', 'secret123')\n        self.assertRaises(ValueError, self._callFUT, serialized, 'secret',\n                          hmac=hmac())\n        \n    def test_it_bad_encoding(self):\n        serialized = 'bad' + serialize('123', 'secret')\n        self.assertRaises(ValueError, self._callFUT, serialized, 'secret')\n\n    def test_it_with_highorder_secret(self):\n        secret = b'\\xce\\xb1\\xce\\xb2\\xce\\xb3\\xce\\xb4'.decode('utf-8')\n        serialized = serialize('123', secret)\n        result = self._callFUT(serialized, secret)\n        self.assertEqual(result, '123')\n\n    # bwcompat with pyramid <= 1.5b1 where latin1 is the default\n    def test_it_with_latin1_secret(self):\n        secret = b'La Pe\\xc3\\xb1a'\n        serialized = serialize('123', secret)\n        result = self._callFUT(serialized, secret.decode('latin-1'))\n        self.assertEqual(result, '123')\n\nclass Test_check_csrf_token(unittest.TestCase):\n    def _callFUT(self, *args, **kwargs):\n        from ..session import check_csrf_token\n        return check_csrf_token(*args, **kwargs)\n\n    def test_success_token(self):\n        request = testing.DummyRequest()\n        request.params['csrf_token'] = request.session.get_csrf_token()\n        self.assertEqual(self._callFUT(request, token='csrf_token'), True)\n\n    def test_success_header(self):\n        request = testing.DummyRequest()\n        request.headers['X-CSRF-Token'] = request.session.get_csrf_token()\n        self.assertEqual(self._callFUT(request, header='X-CSRF-Token'), True)\n\n    def test_success_default_token(self):\n        request = testing.DummyRequest()\n        request.params['csrf_token'] = request.session.get_csrf_token()\n        self.assertEqual(self._callFUT(request), True)\n\n    def test_success_default_header(self):\n        request = testing.DummyRequest()\n        request.headers['X-CSRF-Token'] = request.session.get_csrf_token()\n        self.assertEqual(self._callFUT(request), True)\n\n    def test_failure_raises(self):\n        from pyramid.exceptions import BadCSRFToken\n        request = testing.DummyRequest()\n        self.assertRaises(BadCSRFToken, self._callFUT, request,\n                          'csrf_token')\n\n    def test_failure_no_raises(self):\n        request = testing.DummyRequest()\n        result = self._callFUT(request, 'csrf_token', raises=False)\n        self.assertEqual(result, False)\n\nclass DummySerializer(object):\n    def dumps(self, value):\n        return base64.b64encode(json.dumps(value).encode('utf-8'))\n\n    def loads(self, value):\n        try:\n            return json.loads(base64.b64decode(value).decode('utf-8'))\n\n        # base64.b64decode raises a TypeError on py2 instead of a ValueError\n        # and a ValueError is required for the session to handle it properly\n        except TypeError:\n            raise ValueError\n\nclass DummySessionFactory(dict):\n    _dirty = False\n    _cookie_name = 'session'\n    _cookie_max_age = None\n    _cookie_path = '/'\n    _cookie_domain = None\n    _cookie_secure = False\n    _cookie_httponly = False\n    _timeout = 1200\n    _reissue_time = 0\n\n    def __init__(self, request):\n        self.request = request\n        dict.__init__(self, {})\n\n    def changed(self):\n        self._dirty = True\n\nclass DummyResponse(object):\n    def __init__(self):\n        self.headerlist = []\n",
            "header": {
                "file": {
                    "path": "pyramid/tests/test_session.py"
                },
                "misc_line": null
            },
            "index_line": {
                "old_commit_hash": "eac6593d9",
                "new_commit_hash": "82e4fb001",
                "mode": "100644"
            },
            "is_binary_file": false,
            "binary_line": null,
            "minus_file": {
                "path": "a/pyramid/tests/test_session.py"
            },
            "plus_file": {
                "path": "b/pyramid/tests/test_session.py"
            },
            "hunks": [
                {
                    "descriptor": {
                        "old_range": {
                            "start": 62,
                            "length": 6
                        },
                        "new_range": {
                            "start": 62,
                            "length": 18
                        },
                        "section": "class SharedCookieSessionTests(object):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "        session = self._makeOne(request, timeout=None)",
                                "type": "context"
                            },
                            {
                                "content": "        self.assertEqual(dict(session), {'state': 1})",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "    def test_timeout_str(self):",
                                "type": "added"
                            },
                            {
                                "content": "        import time",
                                "type": "added"
                            },
                            {
                                "content": "        request = testing.DummyRequest()",
                                "type": "added"
                            },
                            {
                                "content": "        cookieval = self._serialize((time.time() - 5, 0, {'state': 1}))",
                                "type": "added"
                            },
                            {
                                "content": "        request.cookies['session'] = cookieval",
                                "type": "added"
                            },
                            {
                                "content": "        session = self._makeOne(request, timeout='1')",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertEqual(dict(session), {})",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "    def test_timeout_invalid(self):",
                                "type": "added"
                            },
                            {
                                "content": "        request = testing.DummyRequest()",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertRaises(ValueError, self._makeOne, request, timeout='Invalid value')",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "    def test_changed(self):",
                                "type": "context"
                            },
                            {
                                "content": "        request = testing.DummyRequest()",
                                "type": "context"
                            },
                            {
                                "content": "        session = self._makeOne(request)",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [
                        {
                            "file_name": "pyramid/tests/test_session.py",
                            "type": "class",
                            "name": "SharedCookieSessionTests",
                            "content": "class SharedCookieSessionTests(object):\n\n    def test_ctor_no_cookie(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        self.assertEqual(dict(session), {})\n\n    def test_instance_conforms(self):\n        from zope.interface.verify import verifyObject\n        from pyramid.interfaces import ISession\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        verifyObject(ISession, session)\n\n    def test_ctor_with_cookie_still_valid(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request)\n        self.assertEqual(dict(session), {'state':1})\n\n    def test_ctor_with_cookie_expired(self):\n        request = testing.DummyRequest()\n        cookieval = self._serialize((0, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request)\n        self.assertEqual(dict(session), {})\n\n    def test_ctor_with_bad_cookie_cannot_deserialize(self):\n        request = testing.DummyRequest()\n        request.cookies['session'] = 'abc'\n        session = self._makeOne(request)\n        self.assertEqual(dict(session), {})\n\n    def test_ctor_with_bad_cookie_not_tuple(self):\n        request = testing.DummyRequest()\n        cookieval = self._serialize('abc')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request)\n        self.assertEqual(dict(session), {})\n\n    def test_timeout(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 5, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, timeout=1)\n        self.assertEqual(dict(session), {})\n\n    def test_timeout_never(self):\n        import time\n        request = testing.DummyRequest()\n        LONG_TIME = 31536000\n        cookieval = self._serialize((time.time() + LONG_TIME, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, timeout=None)\n        self.assertEqual(dict(session), {'state': 1})\n\n    def test_timeout_str(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 5, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, timeout='1')\n        self.assertEqual(dict(session), {})\n\n    def test_timeout_invalid(self):\n        request = testing.DummyRequest()\n        self.assertRaises(ValueError, self._makeOne, request, timeout='Invalid value')\n\n    def test_changed(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        self.assertEqual(session.changed(), None)\n        self.assertTrue(session._dirty)\n\n    def test_invalidate(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session['a'] = 1\n        self.assertEqual(session.invalidate(), None)\n        self.assertFalse('a' in session)\n\n    def test_reissue_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 2, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request)\n        self.assertEqual(session['state'], 1)\n        self.assertTrue(session._dirty)\n\n    def test__set_cookie_on_exception(self):\n        request = testing.DummyRequest()\n        request.exception = True\n        session = self._makeOne(request)\n        session._cookie_on_exception = False\n        response = DummyResponse()\n        self.assertEqual(session._set_cookie(response), False)\n\n    def test__set_cookie_on_exception_no_request_exception(self):\n        import webob\n        request = testing.DummyRequest()\n        request.exception = None\n        session = self._makeOne(request)\n        session._cookie_on_exception = False\n        response = webob.Response()\n        self.assertEqual(session._set_cookie(response), True)\n        self.assertEqual(response.headerlist[-1][0], 'Set-Cookie')\n\n    def test__set_cookie_cookieval_too_long(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session['abc'] = 'x'*100000\n        response = DummyResponse()\n        self.assertRaises(ValueError, session._set_cookie, response)\n\n    def test__set_cookie_real_webob_response(self):\n        import webob\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session['abc'] = 'x'\n        response = webob.Response()\n        self.assertEqual(session._set_cookie(response), True)\n        self.assertEqual(response.headerlist[-1][0], 'Set-Cookie')\n\n    def test__set_cookie_options(self):\n        from pyramid.response import Response\n        request = testing.DummyRequest()\n        request.exception = None\n        session = self._makeOne(request,\n                                cookie_name='abc',\n                                path='/foo',\n                                domain='localhost',\n                                secure=True,\n                                httponly=True,\n                                )\n        session['abc'] = 'x'\n        response = Response()\n        self.assertEqual(session._set_cookie(response), True)\n        cookieval = response.headerlist[-1][1]\n        val, domain, path, secure, httponly = [x.strip() for x in\n                                               cookieval.split(';')]\n        self.assertTrue(val.startswith('abc='))\n        self.assertEqual(domain, 'Domain=localhost')\n        self.assertEqual(path, 'Path=/foo')\n        self.assertEqual(secure, 'secure')\n        self.assertEqual(httponly, 'HttpOnly')\n\n    def test_flash_default(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session.flash('msg1')\n        session.flash('msg2')\n        self.assertEqual(session['_f_'], ['msg1', 'msg2'])\n\n    def test_flash_allow_duplicate_false(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session.flash('msg1')\n        session.flash('msg1', allow_duplicate=False)\n        self.assertEqual(session['_f_'], ['msg1'])\n\n    def test_flash_allow_duplicate_true_and_msg_not_in_storage(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session.flash('msg1', allow_duplicate=True)\n        self.assertEqual(session['_f_'], ['msg1'])\n\n    def test_flash_allow_duplicate_false_and_msg_not_in_storage(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session.flash('msg1', allow_duplicate=False)\n        self.assertEqual(session['_f_'], ['msg1'])\n\n    def test_flash_mixed(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session.flash('warn1', 'warn')\n        session.flash('warn2', 'warn')\n        session.flash('err1', 'error')\n        session.flash('err2', 'error')\n        self.assertEqual(session['_f_warn'], ['warn1', 'warn2'])\n\n    def test_pop_flash_default_queue(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        queue = ['one', 'two']\n        session['_f_'] = queue\n        result = session.pop_flash()\n        self.assertEqual(result, queue)\n        self.assertEqual(session.get('_f_'), None)\n\n    def test_pop_flash_nodefault_queue(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        queue = ['one', 'two']\n        session['_f_error'] = queue\n        result = session.pop_flash('error')\n        self.assertEqual(result, queue)\n        self.assertEqual(session.get('_f_error'), None)\n\n    def test_peek_flash_default_queue(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        queue = ['one', 'two']\n        session['_f_'] = queue\n        result = session.peek_flash()\n        self.assertEqual(result, queue)\n        self.assertEqual(session.get('_f_'), queue)\n\n    def test_peek_flash_nodefault_queue(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        queue = ['one', 'two']\n        session['_f_error'] = queue\n        result = session.peek_flash('error')\n        self.assertEqual(result, queue)\n        self.assertEqual(session.get('_f_error'), queue)\n\n    def test_new_csrf_token(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        token = session.new_csrf_token()\n        self.assertEqual(token, session['_csrft_'])\n\n    def test_get_csrf_token(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session['_csrft_'] = 'token'\n        token = session.get_csrf_token()\n        self.assertEqual(token, 'token')\n        self.assertTrue('_csrft_' in session)\n\n    def test_get_csrf_token_new(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        token = session.get_csrf_token()\n        self.assertTrue(token)\n        self.assertTrue('_csrft_' in session)\n\n    def test_no_set_cookie_with_exception(self):\n        import webob\n        request = testing.DummyRequest()\n        request.exception = True\n        session = self._makeOne(request, set_on_exception=False)\n        session['a'] = 1\n        callbacks = request.response_callbacks\n        self.assertEqual(len(callbacks), 1)\n        response = webob.Response()\n        result = callbacks[0](request, response)\n        self.assertEqual(result, None)\n        self.assertFalse('Set-Cookie' in dict(response.headerlist))\n\n    def test_set_cookie_with_exception(self):\n        import webob\n        request = testing.DummyRequest()\n        request.exception = True\n        session = self._makeOne(request)\n        session['a'] = 1\n        callbacks = request.response_callbacks\n        self.assertEqual(len(callbacks), 1)\n        response = webob.Response()\n        result = callbacks[0](request, response)\n        self.assertEqual(result, None)\n        self.assertTrue('Set-Cookie' in dict(response.headerlist))\n\n    def test_cookie_is_set(self):\n        import webob\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session['a'] = 1\n        callbacks = request.response_callbacks\n        self.assertEqual(len(callbacks), 1)\n        response = webob.Response()\n        result = callbacks[0](request, response)\n        self.assertEqual(result, None)\n        self.assertTrue('Set-Cookie' in dict(response.headerlist))",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 6,
                            "end_lineno": 284,
                            "parent": null
                        }
                    ],
                    "added_entities": [
                        {
                            "file_name": "pyramid/tests/test_session.py",
                            "type": "method",
                            "name": "SharedCookieSessionTests.test_timeout_str",
                            "content": "class SharedCookieSessionTests(object):\n\n    def test_ctor_no_cookie(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        self.assertEqual(dict(session), {})\n\n    def test_instance_conforms(self):\n        from zope.interface.verify import verifyObject\n        from pyramid.interfaces import ISession\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        verifyObject(ISession, session)\n\n    def test_ctor_with_cookie_still_valid(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request)\n        self.assertEqual(dict(session), {'state':1})\n\n    def test_ctor_with_cookie_expired(self):\n        request = testing.DummyRequest()\n        cookieval = self._serialize((0, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request)\n        self.assertEqual(dict(session), {})\n\n    def test_ctor_with_bad_cookie_cannot_deserialize(self):\n        request = testing.DummyRequest()\n        request.cookies['session'] = 'abc'\n        session = self._makeOne(request)\n        self.assertEqual(dict(session), {})\n\n    def test_ctor_with_bad_cookie_not_tuple(self):\n        request = testing.DummyRequest()\n        cookieval = self._serialize('abc')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request)\n        self.assertEqual(dict(session), {})\n\n    def test_timeout(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 5, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, timeout=1)\n        self.assertEqual(dict(session), {})\n\n    def test_timeout_never(self):\n        import time\n        request = testing.DummyRequest()\n        LONG_TIME = 31536000\n        cookieval = self._serialize((time.time() + LONG_TIME, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, timeout=None)\n        self.assertEqual(dict(session), {'state': 1})\n\n    def test_timeout_str(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 5, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, timeout='1')\n        self.assertEqual(dict(session), {})\n\n    def test_timeout_invalid(self):\n        request = testing.DummyRequest()\n        self.assertRaises(ValueError, self._makeOne, request, timeout='Invalid value')\n\n    def test_changed(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        self.assertEqual(session.changed(), None)\n        self.assertTrue(session._dirty)\n\n    def test_invalidate(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session['a'] = 1\n        self.assertEqual(session.invalidate(), None)\n        self.assertFalse('a' in session)\n\n    def test_reissue_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 2, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request)\n        self.assertEqual(session['state'], 1)\n        self.assertTrue(session._dirty)\n\n    def test__set_cookie_on_exception(self):\n        request = testing.DummyRequest()\n        request.exception = True\n        session = self._makeOne(request)\n        session._cookie_on_exception = False\n        response = DummyResponse()\n        self.assertEqual(session._set_cookie(response), False)\n\n    def test__set_cookie_on_exception_no_request_exception(self):\n        import webob\n        request = testing.DummyRequest()\n        request.exception = None\n        session = self._makeOne(request)\n        session._cookie_on_exception = False\n        response = webob.Response()\n        self.assertEqual(session._set_cookie(response), True)\n        self.assertEqual(response.headerlist[-1][0], 'Set-Cookie')\n\n    def test__set_cookie_cookieval_too_long(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session['abc'] = 'x'*100000\n        response = DummyResponse()\n        self.assertRaises(ValueError, session._set_cookie, response)\n\n    def test__set_cookie_real_webob_response(self):\n        import webob\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session['abc'] = 'x'\n        response = webob.Response()\n        self.assertEqual(session._set_cookie(response), True)\n        self.assertEqual(response.headerlist[-1][0], 'Set-Cookie')\n\n    def test__set_cookie_options(self):\n        from pyramid.response import Response\n        request = testing.DummyRequest()\n        request.exception = None\n        session = self._makeOne(request,\n                                cookie_name='abc',\n                                path='/foo',\n                                domain='localhost',\n                                secure=True,\n                                httponly=True,\n                                )\n        session['abc'] = 'x'\n        response = Response()\n        self.assertEqual(session._set_cookie(response), True)\n        cookieval = response.headerlist[-1][1]\n        val, domain, path, secure, httponly = [x.strip() for x in\n                                               cookieval.split(';')]\n        self.assertTrue(val.startswith('abc='))\n        self.assertEqual(domain, 'Domain=localhost')\n        self.assertEqual(path, 'Path=/foo')\n        self.assertEqual(secure, 'secure')\n        self.assertEqual(httponly, 'HttpOnly')\n\n    def test_flash_default(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session.flash('msg1')\n        session.flash('msg2')\n        self.assertEqual(session['_f_'], ['msg1', 'msg2'])\n\n    def test_flash_allow_duplicate_false(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session.flash('msg1')\n        session.flash('msg1', allow_duplicate=False)\n        self.assertEqual(session['_f_'], ['msg1'])\n\n    def test_flash_allow_duplicate_true_and_msg_not_in_storage(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session.flash('msg1', allow_duplicate=True)\n        self.assertEqual(session['_f_'], ['msg1'])\n\n    def test_flash_allow_duplicate_false_and_msg_not_in_storage(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session.flash('msg1', allow_duplicate=False)\n        self.assertEqual(session['_f_'], ['msg1'])\n\n    def test_flash_mixed(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session.flash('warn1', 'warn')\n        session.flash('warn2', 'warn')\n        session.flash('err1', 'error')\n        session.flash('err2', 'error')\n        self.assertEqual(session['_f_warn'], ['warn1', 'warn2'])\n\n    def test_pop_flash_default_queue(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        queue = ['one', 'two']\n        session['_f_'] = queue\n        result = session.pop_flash()\n        self.assertEqual(result, queue)\n        self.assertEqual(session.get('_f_'), None)\n\n    def test_pop_flash_nodefault_queue(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        queue = ['one', 'two']\n        session['_f_error'] = queue\n        result = session.pop_flash('error')\n        self.assertEqual(result, queue)\n        self.assertEqual(session.get('_f_error'), None)\n\n    def test_peek_flash_default_queue(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        queue = ['one', 'two']\n        session['_f_'] = queue\n        result = session.peek_flash()\n        self.assertEqual(result, queue)\n        self.assertEqual(session.get('_f_'), queue)\n\n    def test_peek_flash_nodefault_queue(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        queue = ['one', 'two']\n        session['_f_error'] = queue\n        result = session.peek_flash('error')\n        self.assertEqual(result, queue)\n        self.assertEqual(session.get('_f_error'), queue)\n\n    def test_new_csrf_token(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        token = session.new_csrf_token()\n        self.assertEqual(token, session['_csrft_'])\n\n    def test_get_csrf_token(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session['_csrft_'] = 'token'\n        token = session.get_csrf_token()\n        self.assertEqual(token, 'token')\n        self.assertTrue('_csrft_' in session)\n\n    def test_get_csrf_token_new(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        token = session.get_csrf_token()\n        self.assertTrue(token)\n        self.assertTrue('_csrft_' in session)\n\n    def test_no_set_cookie_with_exception(self):\n        import webob\n        request = testing.DummyRequest()\n        request.exception = True\n        session = self._makeOne(request, set_on_exception=False)\n        session['a'] = 1\n        callbacks = request.response_callbacks\n        self.assertEqual(len(callbacks), 1)\n        response = webob.Response()\n        result = callbacks[0](request, response)\n        self.assertEqual(result, None)\n        self.assertFalse('Set-Cookie' in dict(response.headerlist))\n\n    def test_set_cookie_with_exception(self):\n        import webob\n        request = testing.DummyRequest()\n        request.exception = True\n        session = self._makeOne(request)\n        session['a'] = 1\n        callbacks = request.response_callbacks\n        self.assertEqual(len(callbacks), 1)\n        response = webob.Response()\n        result = callbacks[0](request, response)\n        self.assertEqual(result, None)\n        self.assertTrue('Set-Cookie' in dict(response.headerlist))\n\n    def test_cookie_is_set(self):\n        import webob\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session['a'] = 1\n        callbacks = request.response_callbacks\n        self.assertEqual(len(callbacks), 1)\n        response = webob.Response()\n        result = callbacks[0](request, response)\n        self.assertEqual(result, None)\n        self.assertTrue('Set-Cookie' in dict(response.headerlist))",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 65,
                            "end_lineno": 71,
                            "parent": {
                                "file_name": "pyramid/tests/test_session.py",
                                "type": "class",
                                "name": "SharedCookieSessionTests",
                                "content": "class SharedCookieSessionTests(object):\n\n    def test_ctor_no_cookie(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        self.assertEqual(dict(session), {})\n\n    def test_instance_conforms(self):\n        from zope.interface.verify import verifyObject\n        from pyramid.interfaces import ISession\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        verifyObject(ISession, session)\n\n    def test_ctor_with_cookie_still_valid(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request)\n        self.assertEqual(dict(session), {'state':1})\n\n    def test_ctor_with_cookie_expired(self):\n        request = testing.DummyRequest()\n        cookieval = self._serialize((0, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request)\n        self.assertEqual(dict(session), {})\n\n    def test_ctor_with_bad_cookie_cannot_deserialize(self):\n        request = testing.DummyRequest()\n        request.cookies['session'] = 'abc'\n        session = self._makeOne(request)\n        self.assertEqual(dict(session), {})\n\n    def test_ctor_with_bad_cookie_not_tuple(self):\n        request = testing.DummyRequest()\n        cookieval = self._serialize('abc')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request)\n        self.assertEqual(dict(session), {})\n\n    def test_timeout(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 5, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, timeout=1)\n        self.assertEqual(dict(session), {})\n\n    def test_timeout_never(self):\n        import time\n        request = testing.DummyRequest()\n        LONG_TIME = 31536000\n        cookieval = self._serialize((time.time() + LONG_TIME, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, timeout=None)\n        self.assertEqual(dict(session), {'state': 1})\n\n    def test_timeout_str(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 5, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, timeout='1')\n        self.assertEqual(dict(session), {})\n\n    def test_timeout_invalid(self):\n        request = testing.DummyRequest()\n        self.assertRaises(ValueError, self._makeOne, request, timeout='Invalid value')\n\n    def test_changed(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        self.assertEqual(session.changed(), None)\n        self.assertTrue(session._dirty)\n\n    def test_invalidate(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session['a'] = 1\n        self.assertEqual(session.invalidate(), None)\n        self.assertFalse('a' in session)\n\n    def test_reissue_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 2, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request)\n        self.assertEqual(session['state'], 1)\n        self.assertTrue(session._dirty)\n\n    def test__set_cookie_on_exception(self):\n        request = testing.DummyRequest()\n        request.exception = True\n        session = self._makeOne(request)\n        session._cookie_on_exception = False\n        response = DummyResponse()\n        self.assertEqual(session._set_cookie(response), False)\n\n    def test__set_cookie_on_exception_no_request_exception(self):\n        import webob\n        request = testing.DummyRequest()\n        request.exception = None\n        session = self._makeOne(request)\n        session._cookie_on_exception = False\n        response = webob.Response()\n        self.assertEqual(session._set_cookie(response), True)\n        self.assertEqual(response.headerlist[-1][0], 'Set-Cookie')\n\n    def test__set_cookie_cookieval_too_long(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session['abc'] = 'x'*100000\n        response = DummyResponse()\n        self.assertRaises(ValueError, session._set_cookie, response)\n\n    def test__set_cookie_real_webob_response(self):\n        import webob\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session['abc'] = 'x'\n        response = webob.Response()\n        self.assertEqual(session._set_cookie(response), True)\n        self.assertEqual(response.headerlist[-1][0], 'Set-Cookie')\n\n    def test__set_cookie_options(self):\n        from pyramid.response import Response\n        request = testing.DummyRequest()\n        request.exception = None\n        session = self._makeOne(request,\n                                cookie_name='abc',\n                                path='/foo',\n                                domain='localhost',\n                                secure=True,\n                                httponly=True,\n                                )\n        session['abc'] = 'x'\n        response = Response()\n        self.assertEqual(session._set_cookie(response), True)\n        cookieval = response.headerlist[-1][1]\n        val, domain, path, secure, httponly = [x.strip() for x in\n                                               cookieval.split(';')]\n        self.assertTrue(val.startswith('abc='))\n        self.assertEqual(domain, 'Domain=localhost')\n        self.assertEqual(path, 'Path=/foo')\n        self.assertEqual(secure, 'secure')\n        self.assertEqual(httponly, 'HttpOnly')\n\n    def test_flash_default(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session.flash('msg1')\n        session.flash('msg2')\n        self.assertEqual(session['_f_'], ['msg1', 'msg2'])\n\n    def test_flash_allow_duplicate_false(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session.flash('msg1')\n        session.flash('msg1', allow_duplicate=False)\n        self.assertEqual(session['_f_'], ['msg1'])\n\n    def test_flash_allow_duplicate_true_and_msg_not_in_storage(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session.flash('msg1', allow_duplicate=True)\n        self.assertEqual(session['_f_'], ['msg1'])\n\n    def test_flash_allow_duplicate_false_and_msg_not_in_storage(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session.flash('msg1', allow_duplicate=False)\n        self.assertEqual(session['_f_'], ['msg1'])\n\n    def test_flash_mixed(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session.flash('warn1', 'warn')\n        session.flash('warn2', 'warn')\n        session.flash('err1', 'error')\n        session.flash('err2', 'error')\n        self.assertEqual(session['_f_warn'], ['warn1', 'warn2'])\n\n    def test_pop_flash_default_queue(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        queue = ['one', 'two']\n        session['_f_'] = queue\n        result = session.pop_flash()\n        self.assertEqual(result, queue)\n        self.assertEqual(session.get('_f_'), None)\n\n    def test_pop_flash_nodefault_queue(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        queue = ['one', 'two']\n        session['_f_error'] = queue\n        result = session.pop_flash('error')\n        self.assertEqual(result, queue)\n        self.assertEqual(session.get('_f_error'), None)\n\n    def test_peek_flash_default_queue(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        queue = ['one', 'two']\n        session['_f_'] = queue\n        result = session.peek_flash()\n        self.assertEqual(result, queue)\n        self.assertEqual(session.get('_f_'), queue)\n\n    def test_peek_flash_nodefault_queue(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        queue = ['one', 'two']\n        session['_f_error'] = queue\n        result = session.peek_flash('error')\n        self.assertEqual(result, queue)\n        self.assertEqual(session.get('_f_error'), queue)\n\n    def test_new_csrf_token(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        token = session.new_csrf_token()\n        self.assertEqual(token, session['_csrft_'])\n\n    def test_get_csrf_token(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session['_csrft_'] = 'token'\n        token = session.get_csrf_token()\n        self.assertEqual(token, 'token')\n        self.assertTrue('_csrft_' in session)\n\n    def test_get_csrf_token_new(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        token = session.get_csrf_token()\n        self.assertTrue(token)\n        self.assertTrue('_csrft_' in session)\n\n    def test_no_set_cookie_with_exception(self):\n        import webob\n        request = testing.DummyRequest()\n        request.exception = True\n        session = self._makeOne(request, set_on_exception=False)\n        session['a'] = 1\n        callbacks = request.response_callbacks\n        self.assertEqual(len(callbacks), 1)\n        response = webob.Response()\n        result = callbacks[0](request, response)\n        self.assertEqual(result, None)\n        self.assertFalse('Set-Cookie' in dict(response.headerlist))\n\n    def test_set_cookie_with_exception(self):\n        import webob\n        request = testing.DummyRequest()\n        request.exception = True\n        session = self._makeOne(request)\n        session['a'] = 1\n        callbacks = request.response_callbacks\n        self.assertEqual(len(callbacks), 1)\n        response = webob.Response()\n        result = callbacks[0](request, response)\n        self.assertEqual(result, None)\n        self.assertTrue('Set-Cookie' in dict(response.headerlist))\n\n    def test_cookie_is_set(self):\n        import webob\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session['a'] = 1\n        callbacks = request.response_callbacks\n        self.assertEqual(len(callbacks), 1)\n        response = webob.Response()\n        result = callbacks[0](request, response)\n        self.assertEqual(result, None)\n        self.assertTrue('Set-Cookie' in dict(response.headerlist))",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 6,
                                "end_lineno": 284,
                                "parent": null
                            }
                        },
                        {
                            "file_name": "pyramid/tests/test_session.py",
                            "type": "method",
                            "name": "SharedCookieSessionTests.test_timeout_invalid",
                            "content": "class SharedCookieSessionTests(object):\n\n    def test_ctor_no_cookie(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        self.assertEqual(dict(session), {})\n\n    def test_instance_conforms(self):\n        from zope.interface.verify import verifyObject\n        from pyramid.interfaces import ISession\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        verifyObject(ISession, session)\n\n    def test_ctor_with_cookie_still_valid(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request)\n        self.assertEqual(dict(session), {'state':1})\n\n    def test_ctor_with_cookie_expired(self):\n        request = testing.DummyRequest()\n        cookieval = self._serialize((0, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request)\n        self.assertEqual(dict(session), {})\n\n    def test_ctor_with_bad_cookie_cannot_deserialize(self):\n        request = testing.DummyRequest()\n        request.cookies['session'] = 'abc'\n        session = self._makeOne(request)\n        self.assertEqual(dict(session), {})\n\n    def test_ctor_with_bad_cookie_not_tuple(self):\n        request = testing.DummyRequest()\n        cookieval = self._serialize('abc')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request)\n        self.assertEqual(dict(session), {})\n\n    def test_timeout(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 5, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, timeout=1)\n        self.assertEqual(dict(session), {})\n\n    def test_timeout_never(self):\n        import time\n        request = testing.DummyRequest()\n        LONG_TIME = 31536000\n        cookieval = self._serialize((time.time() + LONG_TIME, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, timeout=None)\n        self.assertEqual(dict(session), {'state': 1})\n\n    def test_timeout_str(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 5, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, timeout='1')\n        self.assertEqual(dict(session), {})\n\n    def test_timeout_invalid(self):\n        request = testing.DummyRequest()\n        self.assertRaises(ValueError, self._makeOne, request, timeout='Invalid value')\n\n    def test_changed(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        self.assertEqual(session.changed(), None)\n        self.assertTrue(session._dirty)\n\n    def test_invalidate(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session['a'] = 1\n        self.assertEqual(session.invalidate(), None)\n        self.assertFalse('a' in session)\n\n    def test_reissue_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 2, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request)\n        self.assertEqual(session['state'], 1)\n        self.assertTrue(session._dirty)\n\n    def test__set_cookie_on_exception(self):\n        request = testing.DummyRequest()\n        request.exception = True\n        session = self._makeOne(request)\n        session._cookie_on_exception = False\n        response = DummyResponse()\n        self.assertEqual(session._set_cookie(response), False)\n\n    def test__set_cookie_on_exception_no_request_exception(self):\n        import webob\n        request = testing.DummyRequest()\n        request.exception = None\n        session = self._makeOne(request)\n        session._cookie_on_exception = False\n        response = webob.Response()\n        self.assertEqual(session._set_cookie(response), True)\n        self.assertEqual(response.headerlist[-1][0], 'Set-Cookie')\n\n    def test__set_cookie_cookieval_too_long(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session['abc'] = 'x'*100000\n        response = DummyResponse()\n        self.assertRaises(ValueError, session._set_cookie, response)\n\n    def test__set_cookie_real_webob_response(self):\n        import webob\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session['abc'] = 'x'\n        response = webob.Response()\n        self.assertEqual(session._set_cookie(response), True)\n        self.assertEqual(response.headerlist[-1][0], 'Set-Cookie')\n\n    def test__set_cookie_options(self):\n        from pyramid.response import Response\n        request = testing.DummyRequest()\n        request.exception = None\n        session = self._makeOne(request,\n                                cookie_name='abc',\n                                path='/foo',\n                                domain='localhost',\n                                secure=True,\n                                httponly=True,\n                                )\n        session['abc'] = 'x'\n        response = Response()\n        self.assertEqual(session._set_cookie(response), True)\n        cookieval = response.headerlist[-1][1]\n        val, domain, path, secure, httponly = [x.strip() for x in\n                                               cookieval.split(';')]\n        self.assertTrue(val.startswith('abc='))\n        self.assertEqual(domain, 'Domain=localhost')\n        self.assertEqual(path, 'Path=/foo')\n        self.assertEqual(secure, 'secure')\n        self.assertEqual(httponly, 'HttpOnly')\n\n    def test_flash_default(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session.flash('msg1')\n        session.flash('msg2')\n        self.assertEqual(session['_f_'], ['msg1', 'msg2'])\n\n    def test_flash_allow_duplicate_false(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session.flash('msg1')\n        session.flash('msg1', allow_duplicate=False)\n        self.assertEqual(session['_f_'], ['msg1'])\n\n    def test_flash_allow_duplicate_true_and_msg_not_in_storage(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session.flash('msg1', allow_duplicate=True)\n        self.assertEqual(session['_f_'], ['msg1'])\n\n    def test_flash_allow_duplicate_false_and_msg_not_in_storage(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session.flash('msg1', allow_duplicate=False)\n        self.assertEqual(session['_f_'], ['msg1'])\n\n    def test_flash_mixed(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session.flash('warn1', 'warn')\n        session.flash('warn2', 'warn')\n        session.flash('err1', 'error')\n        session.flash('err2', 'error')\n        self.assertEqual(session['_f_warn'], ['warn1', 'warn2'])\n\n    def test_pop_flash_default_queue(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        queue = ['one', 'two']\n        session['_f_'] = queue\n        result = session.pop_flash()\n        self.assertEqual(result, queue)\n        self.assertEqual(session.get('_f_'), None)\n\n    def test_pop_flash_nodefault_queue(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        queue = ['one', 'two']\n        session['_f_error'] = queue\n        result = session.pop_flash('error')\n        self.assertEqual(result, queue)\n        self.assertEqual(session.get('_f_error'), None)\n\n    def test_peek_flash_default_queue(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        queue = ['one', 'two']\n        session['_f_'] = queue\n        result = session.peek_flash()\n        self.assertEqual(result, queue)\n        self.assertEqual(session.get('_f_'), queue)\n\n    def test_peek_flash_nodefault_queue(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        queue = ['one', 'two']\n        session['_f_error'] = queue\n        result = session.peek_flash('error')\n        self.assertEqual(result, queue)\n        self.assertEqual(session.get('_f_error'), queue)\n\n    def test_new_csrf_token(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        token = session.new_csrf_token()\n        self.assertEqual(token, session['_csrft_'])\n\n    def test_get_csrf_token(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session['_csrft_'] = 'token'\n        token = session.get_csrf_token()\n        self.assertEqual(token, 'token')\n        self.assertTrue('_csrft_' in session)\n\n    def test_get_csrf_token_new(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        token = session.get_csrf_token()\n        self.assertTrue(token)\n        self.assertTrue('_csrft_' in session)\n\n    def test_no_set_cookie_with_exception(self):\n        import webob\n        request = testing.DummyRequest()\n        request.exception = True\n        session = self._makeOne(request, set_on_exception=False)\n        session['a'] = 1\n        callbacks = request.response_callbacks\n        self.assertEqual(len(callbacks), 1)\n        response = webob.Response()\n        result = callbacks[0](request, response)\n        self.assertEqual(result, None)\n        self.assertFalse('Set-Cookie' in dict(response.headerlist))\n\n    def test_set_cookie_with_exception(self):\n        import webob\n        request = testing.DummyRequest()\n        request.exception = True\n        session = self._makeOne(request)\n        session['a'] = 1\n        callbacks = request.response_callbacks\n        self.assertEqual(len(callbacks), 1)\n        response = webob.Response()\n        result = callbacks[0](request, response)\n        self.assertEqual(result, None)\n        self.assertTrue('Set-Cookie' in dict(response.headerlist))\n\n    def test_cookie_is_set(self):\n        import webob\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session['a'] = 1\n        callbacks = request.response_callbacks\n        self.assertEqual(len(callbacks), 1)\n        response = webob.Response()\n        result = callbacks[0](request, response)\n        self.assertEqual(result, None)\n        self.assertTrue('Set-Cookie' in dict(response.headerlist))",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 73,
                            "end_lineno": 75,
                            "parent": {
                                "file_name": "pyramid/tests/test_session.py",
                                "type": "class",
                                "name": "SharedCookieSessionTests",
                                "content": "class SharedCookieSessionTests(object):\n\n    def test_ctor_no_cookie(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        self.assertEqual(dict(session), {})\n\n    def test_instance_conforms(self):\n        from zope.interface.verify import verifyObject\n        from pyramid.interfaces import ISession\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        verifyObject(ISession, session)\n\n    def test_ctor_with_cookie_still_valid(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request)\n        self.assertEqual(dict(session), {'state':1})\n\n    def test_ctor_with_cookie_expired(self):\n        request = testing.DummyRequest()\n        cookieval = self._serialize((0, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request)\n        self.assertEqual(dict(session), {})\n\n    def test_ctor_with_bad_cookie_cannot_deserialize(self):\n        request = testing.DummyRequest()\n        request.cookies['session'] = 'abc'\n        session = self._makeOne(request)\n        self.assertEqual(dict(session), {})\n\n    def test_ctor_with_bad_cookie_not_tuple(self):\n        request = testing.DummyRequest()\n        cookieval = self._serialize('abc')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request)\n        self.assertEqual(dict(session), {})\n\n    def test_timeout(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 5, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, timeout=1)\n        self.assertEqual(dict(session), {})\n\n    def test_timeout_never(self):\n        import time\n        request = testing.DummyRequest()\n        LONG_TIME = 31536000\n        cookieval = self._serialize((time.time() + LONG_TIME, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, timeout=None)\n        self.assertEqual(dict(session), {'state': 1})\n\n    def test_timeout_str(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 5, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, timeout='1')\n        self.assertEqual(dict(session), {})\n\n    def test_timeout_invalid(self):\n        request = testing.DummyRequest()\n        self.assertRaises(ValueError, self._makeOne, request, timeout='Invalid value')\n\n    def test_changed(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        self.assertEqual(session.changed(), None)\n        self.assertTrue(session._dirty)\n\n    def test_invalidate(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session['a'] = 1\n        self.assertEqual(session.invalidate(), None)\n        self.assertFalse('a' in session)\n\n    def test_reissue_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 2, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request)\n        self.assertEqual(session['state'], 1)\n        self.assertTrue(session._dirty)\n\n    def test__set_cookie_on_exception(self):\n        request = testing.DummyRequest()\n        request.exception = True\n        session = self._makeOne(request)\n        session._cookie_on_exception = False\n        response = DummyResponse()\n        self.assertEqual(session._set_cookie(response), False)\n\n    def test__set_cookie_on_exception_no_request_exception(self):\n        import webob\n        request = testing.DummyRequest()\n        request.exception = None\n        session = self._makeOne(request)\n        session._cookie_on_exception = False\n        response = webob.Response()\n        self.assertEqual(session._set_cookie(response), True)\n        self.assertEqual(response.headerlist[-1][0], 'Set-Cookie')\n\n    def test__set_cookie_cookieval_too_long(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session['abc'] = 'x'*100000\n        response = DummyResponse()\n        self.assertRaises(ValueError, session._set_cookie, response)\n\n    def test__set_cookie_real_webob_response(self):\n        import webob\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session['abc'] = 'x'\n        response = webob.Response()\n        self.assertEqual(session._set_cookie(response), True)\n        self.assertEqual(response.headerlist[-1][0], 'Set-Cookie')\n\n    def test__set_cookie_options(self):\n        from pyramid.response import Response\n        request = testing.DummyRequest()\n        request.exception = None\n        session = self._makeOne(request,\n                                cookie_name='abc',\n                                path='/foo',\n                                domain='localhost',\n                                secure=True,\n                                httponly=True,\n                                )\n        session['abc'] = 'x'\n        response = Response()\n        self.assertEqual(session._set_cookie(response), True)\n        cookieval = response.headerlist[-1][1]\n        val, domain, path, secure, httponly = [x.strip() for x in\n                                               cookieval.split(';')]\n        self.assertTrue(val.startswith('abc='))\n        self.assertEqual(domain, 'Domain=localhost')\n        self.assertEqual(path, 'Path=/foo')\n        self.assertEqual(secure, 'secure')\n        self.assertEqual(httponly, 'HttpOnly')\n\n    def test_flash_default(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session.flash('msg1')\n        session.flash('msg2')\n        self.assertEqual(session['_f_'], ['msg1', 'msg2'])\n\n    def test_flash_allow_duplicate_false(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session.flash('msg1')\n        session.flash('msg1', allow_duplicate=False)\n        self.assertEqual(session['_f_'], ['msg1'])\n\n    def test_flash_allow_duplicate_true_and_msg_not_in_storage(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session.flash('msg1', allow_duplicate=True)\n        self.assertEqual(session['_f_'], ['msg1'])\n\n    def test_flash_allow_duplicate_false_and_msg_not_in_storage(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session.flash('msg1', allow_duplicate=False)\n        self.assertEqual(session['_f_'], ['msg1'])\n\n    def test_flash_mixed(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session.flash('warn1', 'warn')\n        session.flash('warn2', 'warn')\n        session.flash('err1', 'error')\n        session.flash('err2', 'error')\n        self.assertEqual(session['_f_warn'], ['warn1', 'warn2'])\n\n    def test_pop_flash_default_queue(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        queue = ['one', 'two']\n        session['_f_'] = queue\n        result = session.pop_flash()\n        self.assertEqual(result, queue)\n        self.assertEqual(session.get('_f_'), None)\n\n    def test_pop_flash_nodefault_queue(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        queue = ['one', 'two']\n        session['_f_error'] = queue\n        result = session.pop_flash('error')\n        self.assertEqual(result, queue)\n        self.assertEqual(session.get('_f_error'), None)\n\n    def test_peek_flash_default_queue(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        queue = ['one', 'two']\n        session['_f_'] = queue\n        result = session.peek_flash()\n        self.assertEqual(result, queue)\n        self.assertEqual(session.get('_f_'), queue)\n\n    def test_peek_flash_nodefault_queue(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        queue = ['one', 'two']\n        session['_f_error'] = queue\n        result = session.peek_flash('error')\n        self.assertEqual(result, queue)\n        self.assertEqual(session.get('_f_error'), queue)\n\n    def test_new_csrf_token(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        token = session.new_csrf_token()\n        self.assertEqual(token, session['_csrft_'])\n\n    def test_get_csrf_token(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session['_csrft_'] = 'token'\n        token = session.get_csrf_token()\n        self.assertEqual(token, 'token')\n        self.assertTrue('_csrft_' in session)\n\n    def test_get_csrf_token_new(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        token = session.get_csrf_token()\n        self.assertTrue(token)\n        self.assertTrue('_csrft_' in session)\n\n    def test_no_set_cookie_with_exception(self):\n        import webob\n        request = testing.DummyRequest()\n        request.exception = True\n        session = self._makeOne(request, set_on_exception=False)\n        session['a'] = 1\n        callbacks = request.response_callbacks\n        self.assertEqual(len(callbacks), 1)\n        response = webob.Response()\n        result = callbacks[0](request, response)\n        self.assertEqual(result, None)\n        self.assertFalse('Set-Cookie' in dict(response.headerlist))\n\n    def test_set_cookie_with_exception(self):\n        import webob\n        request = testing.DummyRequest()\n        request.exception = True\n        session = self._makeOne(request)\n        session['a'] = 1\n        callbacks = request.response_callbacks\n        self.assertEqual(len(callbacks), 1)\n        response = webob.Response()\n        result = callbacks[0](request, response)\n        self.assertEqual(result, None)\n        self.assertTrue('Set-Cookie' in dict(response.headerlist))\n\n    def test_cookie_is_set(self):\n        import webob\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session['a'] = 1\n        callbacks = request.response_callbacks\n        self.assertEqual(len(callbacks), 1)\n        response = webob.Response()\n        result = callbacks[0](request, response)\n        self.assertEqual(result, None)\n        self.assertTrue('Set-Cookie' in dict(response.headerlist))",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 6,
                                "end_lineno": 284,
                                "parent": null
                            }
                        }
                    ],
                    "deleted_entities": []
                },
                {
                    "descriptor": {
                        "old_range": {
                            "start": 297,
                            "length": 6
                        },
                        "new_range": {
                            "start": 309,
                            "length": 23
                        },
                        "section": "class TestBaseCookieSession(SharedCookieSessionTests, unittest.TestCase):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "        self.assertEqual(session['state'], 1)",
                                "type": "context"
                            },
                            {
                                "content": "        self.assertFalse(session._dirty)",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "    def test_reissue_str_triggered(self):",
                                "type": "added"
                            },
                            {
                                "content": "        import time",
                                "type": "added"
                            },
                            {
                                "content": "        request = testing.DummyRequest()",
                                "type": "added"
                            },
                            {
                                "content": "        cookieval = self._serialize((time.time() - 2, 0, {'state': 1}))",
                                "type": "added"
                            },
                            {
                                "content": "        request.cookies['session'] = cookieval",
                                "type": "added"
                            },
                            {
                                "content": "        session = self._makeOne(request, reissue_time='0')",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertEqual(session['state'], 1)",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertTrue(session._dirty)",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "    def test_reissue_invalid(self):",
                                "type": "added"
                            },
                            {
                                "content": "        request = testing.DummyRequest()",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertRaises(ValueError, self._makeOne, request, reissue_time='invalid value')",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "    def test_cookie_max_age_invalid(self):",
                                "type": "added"
                            },
                            {
                                "content": "        request = testing.DummyRequest()",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertRaises(ValueError, self._makeOne, request, max_age='invalid value')",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "class TestSignedCookieSession(SharedCookieSessionTests, unittest.TestCase):",
                                "type": "context"
                            },
                            {
                                "content": "    def _makeOne(self, request, **kw):",
                                "type": "context"
                            },
                            {
                                "content": "        from pyramid.session import SignedCookieSessionFactory",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [
                        {
                            "file_name": "pyramid/tests/test_session.py",
                            "type": "class",
                            "name": "TestBaseCookieSession",
                            "content": "class TestBaseCookieSession(SharedCookieSessionTests, unittest.TestCase):\n    def _makeOne(self, request, **kw):\n        from pyramid.session import BaseCookieSessionFactory\n        serializer = DummySerializer()\n        return BaseCookieSessionFactory(serializer, **kw)(request)\n\n    def _serialize(self, value):\n        return base64.b64encode(json.dumps(value).encode('utf-8'))\n\n    def test_reissue_not_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time=1)\n        self.assertEqual(session['state'], 1)\n        self.assertFalse(session._dirty)\n\n    def test_reissue_never(self):\n        request = testing.DummyRequest()\n        cookieval = self._serialize((0, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time=None, timeout=None)\n        self.assertEqual(session['state'], 1)\n        self.assertFalse(session._dirty)\n\n    def test_reissue_str_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 2, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time='0')\n        self.assertEqual(session['state'], 1)\n        self.assertTrue(session._dirty)\n\n    def test_reissue_invalid(self):\n        request = testing.DummyRequest()\n        self.assertRaises(ValueError, self._makeOne, request, reissue_time='invalid value')\n\n    def test_cookie_max_age_invalid(self):\n        request = testing.DummyRequest()\n        self.assertRaises(ValueError, self._makeOne, request, max_age='invalid value')",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 286,
                            "end_lineno": 327,
                            "parent": null
                        }
                    ],
                    "added_entities": [
                        {
                            "file_name": "pyramid/tests/test_session.py",
                            "type": "method",
                            "name": "TestBaseCookieSession.test_cookie_max_age_invalid",
                            "content": "class TestBaseCookieSession(SharedCookieSessionTests, unittest.TestCase):\n    def _makeOne(self, request, **kw):\n        from pyramid.session import BaseCookieSessionFactory\n        serializer = DummySerializer()\n        return BaseCookieSessionFactory(serializer, **kw)(request)\n\n    def _serialize(self, value):\n        return base64.b64encode(json.dumps(value).encode('utf-8'))\n\n    def test_reissue_not_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time=1)\n        self.assertEqual(session['state'], 1)\n        self.assertFalse(session._dirty)\n\n    def test_reissue_never(self):\n        request = testing.DummyRequest()\n        cookieval = self._serialize((0, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time=None, timeout=None)\n        self.assertEqual(session['state'], 1)\n        self.assertFalse(session._dirty)\n\n    def test_reissue_str_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 2, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time='0')\n        self.assertEqual(session['state'], 1)\n        self.assertTrue(session._dirty)\n\n    def test_reissue_invalid(self):\n        request = testing.DummyRequest()\n        self.assertRaises(ValueError, self._makeOne, request, reissue_time='invalid value')\n\n    def test_cookie_max_age_invalid(self):\n        request = testing.DummyRequest()\n        self.assertRaises(ValueError, self._makeOne, request, max_age='invalid value')",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 325,
                            "end_lineno": 327,
                            "parent": {
                                "file_name": "pyramid/tests/test_session.py",
                                "type": "class",
                                "name": "TestBaseCookieSession",
                                "content": "class TestBaseCookieSession(SharedCookieSessionTests, unittest.TestCase):\n    def _makeOne(self, request, **kw):\n        from pyramid.session import BaseCookieSessionFactory\n        serializer = DummySerializer()\n        return BaseCookieSessionFactory(serializer, **kw)(request)\n\n    def _serialize(self, value):\n        return base64.b64encode(json.dumps(value).encode('utf-8'))\n\n    def test_reissue_not_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time=1)\n        self.assertEqual(session['state'], 1)\n        self.assertFalse(session._dirty)\n\n    def test_reissue_never(self):\n        request = testing.DummyRequest()\n        cookieval = self._serialize((0, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time=None, timeout=None)\n        self.assertEqual(session['state'], 1)\n        self.assertFalse(session._dirty)\n\n    def test_reissue_str_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 2, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time='0')\n        self.assertEqual(session['state'], 1)\n        self.assertTrue(session._dirty)\n\n    def test_reissue_invalid(self):\n        request = testing.DummyRequest()\n        self.assertRaises(ValueError, self._makeOne, request, reissue_time='invalid value')\n\n    def test_cookie_max_age_invalid(self):\n        request = testing.DummyRequest()\n        self.assertRaises(ValueError, self._makeOne, request, max_age='invalid value')",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 286,
                                "end_lineno": 327,
                                "parent": null
                            }
                        },
                        {
                            "file_name": "pyramid/tests/test_session.py",
                            "type": "method",
                            "name": "TestBaseCookieSession.test_reissue_str_triggered",
                            "content": "class TestBaseCookieSession(SharedCookieSessionTests, unittest.TestCase):\n    def _makeOne(self, request, **kw):\n        from pyramid.session import BaseCookieSessionFactory\n        serializer = DummySerializer()\n        return BaseCookieSessionFactory(serializer, **kw)(request)\n\n    def _serialize(self, value):\n        return base64.b64encode(json.dumps(value).encode('utf-8'))\n\n    def test_reissue_not_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time=1)\n        self.assertEqual(session['state'], 1)\n        self.assertFalse(session._dirty)\n\n    def test_reissue_never(self):\n        request = testing.DummyRequest()\n        cookieval = self._serialize((0, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time=None, timeout=None)\n        self.assertEqual(session['state'], 1)\n        self.assertFalse(session._dirty)\n\n    def test_reissue_str_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 2, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time='0')\n        self.assertEqual(session['state'], 1)\n        self.assertTrue(session._dirty)\n\n    def test_reissue_invalid(self):\n        request = testing.DummyRequest()\n        self.assertRaises(ValueError, self._makeOne, request, reissue_time='invalid value')\n\n    def test_cookie_max_age_invalid(self):\n        request = testing.DummyRequest()\n        self.assertRaises(ValueError, self._makeOne, request, max_age='invalid value')",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 312,
                            "end_lineno": 319,
                            "parent": {
                                "file_name": "pyramid/tests/test_session.py",
                                "type": "class",
                                "name": "TestBaseCookieSession",
                                "content": "class TestBaseCookieSession(SharedCookieSessionTests, unittest.TestCase):\n    def _makeOne(self, request, **kw):\n        from pyramid.session import BaseCookieSessionFactory\n        serializer = DummySerializer()\n        return BaseCookieSessionFactory(serializer, **kw)(request)\n\n    def _serialize(self, value):\n        return base64.b64encode(json.dumps(value).encode('utf-8'))\n\n    def test_reissue_not_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time=1)\n        self.assertEqual(session['state'], 1)\n        self.assertFalse(session._dirty)\n\n    def test_reissue_never(self):\n        request = testing.DummyRequest()\n        cookieval = self._serialize((0, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time=None, timeout=None)\n        self.assertEqual(session['state'], 1)\n        self.assertFalse(session._dirty)\n\n    def test_reissue_str_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 2, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time='0')\n        self.assertEqual(session['state'], 1)\n        self.assertTrue(session._dirty)\n\n    def test_reissue_invalid(self):\n        request = testing.DummyRequest()\n        self.assertRaises(ValueError, self._makeOne, request, reissue_time='invalid value')\n\n    def test_cookie_max_age_invalid(self):\n        request = testing.DummyRequest()\n        self.assertRaises(ValueError, self._makeOne, request, max_age='invalid value')",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 286,
                                "end_lineno": 327,
                                "parent": null
                            }
                        },
                        {
                            "file_name": "pyramid/tests/test_session.py",
                            "type": "method",
                            "name": "TestBaseCookieSession.test_reissue_invalid",
                            "content": "class TestBaseCookieSession(SharedCookieSessionTests, unittest.TestCase):\n    def _makeOne(self, request, **kw):\n        from pyramid.session import BaseCookieSessionFactory\n        serializer = DummySerializer()\n        return BaseCookieSessionFactory(serializer, **kw)(request)\n\n    def _serialize(self, value):\n        return base64.b64encode(json.dumps(value).encode('utf-8'))\n\n    def test_reissue_not_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time=1)\n        self.assertEqual(session['state'], 1)\n        self.assertFalse(session._dirty)\n\n    def test_reissue_never(self):\n        request = testing.DummyRequest()\n        cookieval = self._serialize((0, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time=None, timeout=None)\n        self.assertEqual(session['state'], 1)\n        self.assertFalse(session._dirty)\n\n    def test_reissue_str_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 2, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time='0')\n        self.assertEqual(session['state'], 1)\n        self.assertTrue(session._dirty)\n\n    def test_reissue_invalid(self):\n        request = testing.DummyRequest()\n        self.assertRaises(ValueError, self._makeOne, request, reissue_time='invalid value')\n\n    def test_cookie_max_age_invalid(self):\n        request = testing.DummyRequest()\n        self.assertRaises(ValueError, self._makeOne, request, max_age='invalid value')",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 321,
                            "end_lineno": 323,
                            "parent": {
                                "file_name": "pyramid/tests/test_session.py",
                                "type": "class",
                                "name": "TestBaseCookieSession",
                                "content": "class TestBaseCookieSession(SharedCookieSessionTests, unittest.TestCase):\n    def _makeOne(self, request, **kw):\n        from pyramid.session import BaseCookieSessionFactory\n        serializer = DummySerializer()\n        return BaseCookieSessionFactory(serializer, **kw)(request)\n\n    def _serialize(self, value):\n        return base64.b64encode(json.dumps(value).encode('utf-8'))\n\n    def test_reissue_not_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time=1)\n        self.assertEqual(session['state'], 1)\n        self.assertFalse(session._dirty)\n\n    def test_reissue_never(self):\n        request = testing.DummyRequest()\n        cookieval = self._serialize((0, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time=None, timeout=None)\n        self.assertEqual(session['state'], 1)\n        self.assertFalse(session._dirty)\n\n    def test_reissue_str_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 2, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time='0')\n        self.assertEqual(session['state'], 1)\n        self.assertTrue(session._dirty)\n\n    def test_reissue_invalid(self):\n        request = testing.DummyRequest()\n        self.assertRaises(ValueError, self._makeOne, request, reissue_time='invalid value')\n\n    def test_cookie_max_age_invalid(self):\n        request = testing.DummyRequest()\n        self.assertRaises(ValueError, self._makeOne, request, max_age='invalid value')",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 286,
                                "end_lineno": 327,
                                "parent": null
                            }
                        }
                    ],
                    "deleted_entities": []
                },
                {
                    "descriptor": {
                        "old_range": {
                            "start": 331,
                            "length": 6
                        },
                        "new_range": {
                            "start": 360,
                            "length": 23
                        },
                        "section": "class TestSignedCookieSession(SharedCookieSessionTests, unittest.TestCase):"
                    },
                    "line_group": {
                        "all_lines": [
                            {
                                "content": "        self.assertEqual(session['state'], 1)",
                                "type": "context"
                            },
                            {
                                "content": "        self.assertFalse(session._dirty)",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            },
                            {
                                "content": "    def test_reissue_str_triggered(self):",
                                "type": "added"
                            },
                            {
                                "content": "        import time",
                                "type": "added"
                            },
                            {
                                "content": "        request = testing.DummyRequest()",
                                "type": "added"
                            },
                            {
                                "content": "        cookieval = self._serialize((time.time() - 2, 0, {'state': 1}))",
                                "type": "added"
                            },
                            {
                                "content": "        request.cookies['session'] = cookieval",
                                "type": "added"
                            },
                            {
                                "content": "        session = self._makeOne(request, reissue_time='0')",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertEqual(session['state'], 1)",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertTrue(session._dirty)",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "    def test_reissue_invalid(self):",
                                "type": "added"
                            },
                            {
                                "content": "        request = testing.DummyRequest()",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertRaises(ValueError, self._makeOne, request, reissue_time='invalid value')",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "    def test_cookie_max_age_invalid(self):",
                                "type": "added"
                            },
                            {
                                "content": "        request = testing.DummyRequest()",
                                "type": "added"
                            },
                            {
                                "content": "        self.assertRaises(ValueError, self._makeOne, request, max_age='invalid value')",
                                "type": "added"
                            },
                            {
                                "content": "",
                                "type": "added"
                            },
                            {
                                "content": "    def test_custom_salt(self):",
                                "type": "context"
                            },
                            {
                                "content": "        import time",
                                "type": "context"
                            },
                            {
                                "content": "        request = testing.DummyRequest()",
                                "type": "context"
                            },
                            {
                                "content": "",
                                "type": "context"
                            }
                        ]
                    },
                    "modified_entities": [
                        {
                            "file_name": "pyramid/tests/test_session.py",
                            "type": "class",
                            "name": "TestSignedCookieSession",
                            "content": "class TestSignedCookieSession(SharedCookieSessionTests, unittest.TestCase):\n    def _makeOne(self, request, **kw):\n        from pyramid.session import SignedCookieSessionFactory\n        kw.setdefault('secret', 'secret')\n        return SignedCookieSessionFactory(**kw)(request)\n\n    def _serialize(self, value, salt=b'pyramid.session.', hashalg='sha512'):\n        import base64\n        import hashlib\n        import hmac\n        import pickle\n\n        digestmod = lambda: hashlib.new(hashalg)\n        cstruct = pickle.dumps(value, pickle.HIGHEST_PROTOCOL)\n        sig = hmac.new(salt + b'secret', cstruct, digestmod).digest()\n        return base64.urlsafe_b64encode(sig + cstruct).rstrip(b'=')\n\n    def test_reissue_not_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time=1)\n        self.assertEqual(session['state'], 1)\n        self.assertFalse(session._dirty)\n\n    def test_reissue_never(self):\n        request = testing.DummyRequest()\n        cookieval = self._serialize((0, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time=None, timeout=None)\n        self.assertEqual(session['state'], 1)\n        self.assertFalse(session._dirty)\n\n    def test_reissue_str_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 2, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time='0')\n        self.assertEqual(session['state'], 1)\n        self.assertTrue(session._dirty)\n\n    def test_reissue_invalid(self):\n        request = testing.DummyRequest()\n        self.assertRaises(ValueError, self._makeOne, request, reissue_time='invalid value')\n\n    def test_cookie_max_age_invalid(self):\n        request = testing.DummyRequest()\n        self.assertRaises(ValueError, self._makeOne, request, max_age='invalid value')\n\n    def test_custom_salt(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}), salt=b'f.')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, salt=b'f.')\n        self.assertEqual(session['state'], 1)\n\n    def test_salt_mismatch(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}), salt=b'f.')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, salt=b'g.')\n        self.assertEqual(session, {})\n\n    def test_custom_hashalg(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}),\n                                    hashalg='sha1')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, hashalg='sha1')\n        self.assertEqual(session['state'], 1)\n\n    def test_hashalg_mismatch(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}),\n                                    hashalg='sha1')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, hashalg='sha256')\n        self.assertEqual(session, {})\n\n    def test_secret_mismatch(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, secret='evilsecret')\n        self.assertEqual(session, {})\n\n    def test_custom_serializer(self):\n        import base64\n        from hashlib import sha512\n        import hmac\n        import time\n        request = testing.DummyRequest()\n        serializer = DummySerializer()\n        cstruct = serializer.dumps((time.time(), 0, {'state': 1}))\n        sig = hmac.new(b'pyramid.session.secret', cstruct, sha512).digest()\n        cookieval = base64.urlsafe_b64encode(sig + cstruct).rstrip(b'=')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, serializer=serializer)\n        self.assertEqual(session['state'], 1)\n\n    def test_invalid_data_size(self):\n        from hashlib import sha512\n        import base64\n        request = testing.DummyRequest()\n        num_bytes = sha512().digest_size - 1\n        cookieval = base64.b64encode(b' ' * num_bytes)\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request)\n        self.assertEqual(session, {})\n\n    def test_very_long_key(self):\n        verylongkey = b'a' * 1024\n        import webob\n        request = testing.DummyRequest()\n        session = self._makeOne(request, secret=verylongkey)\n        session['a'] = 1\n        callbacks = request.response_callbacks\n        self.assertEqual(len(callbacks), 1)\n        response = webob.Response()\n\n        try:\n            result = callbacks[0](request, response)\n        except TypeError: # pragma: no cover\n            self.fail('HMAC failed to initialize due to key length.')\n\n        self.assertEqual(result, None)\n        self.assertTrue('Set-Cookie' in dict(response.headerlist))",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 329,
                            "end_lineno": 462,
                            "parent": null
                        }
                    ],
                    "added_entities": [
                        {
                            "file_name": "pyramid/tests/test_session.py",
                            "type": "method",
                            "name": "TestSignedCookieSession.test_reissue_str_triggered",
                            "content": "class TestSignedCookieSession(SharedCookieSessionTests, unittest.TestCase):\n    def _makeOne(self, request, **kw):\n        from pyramid.session import SignedCookieSessionFactory\n        kw.setdefault('secret', 'secret')\n        return SignedCookieSessionFactory(**kw)(request)\n\n    def _serialize(self, value, salt=b'pyramid.session.', hashalg='sha512'):\n        import base64\n        import hashlib\n        import hmac\n        import pickle\n\n        digestmod = lambda: hashlib.new(hashalg)\n        cstruct = pickle.dumps(value, pickle.HIGHEST_PROTOCOL)\n        sig = hmac.new(salt + b'secret', cstruct, digestmod).digest()\n        return base64.urlsafe_b64encode(sig + cstruct).rstrip(b'=')\n\n    def test_reissue_not_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time=1)\n        self.assertEqual(session['state'], 1)\n        self.assertFalse(session._dirty)\n\n    def test_reissue_never(self):\n        request = testing.DummyRequest()\n        cookieval = self._serialize((0, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time=None, timeout=None)\n        self.assertEqual(session['state'], 1)\n        self.assertFalse(session._dirty)\n\n    def test_reissue_str_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 2, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time='0')\n        self.assertEqual(session['state'], 1)\n        self.assertTrue(session._dirty)\n\n    def test_reissue_invalid(self):\n        request = testing.DummyRequest()\n        self.assertRaises(ValueError, self._makeOne, request, reissue_time='invalid value')\n\n    def test_cookie_max_age_invalid(self):\n        request = testing.DummyRequest()\n        self.assertRaises(ValueError, self._makeOne, request, max_age='invalid value')\n\n    def test_custom_salt(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}), salt=b'f.')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, salt=b'f.')\n        self.assertEqual(session['state'], 1)\n\n    def test_salt_mismatch(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}), salt=b'f.')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, salt=b'g.')\n        self.assertEqual(session, {})\n\n    def test_custom_hashalg(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}),\n                                    hashalg='sha1')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, hashalg='sha1')\n        self.assertEqual(session['state'], 1)\n\n    def test_hashalg_mismatch(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}),\n                                    hashalg='sha1')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, hashalg='sha256')\n        self.assertEqual(session, {})\n\n    def test_secret_mismatch(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, secret='evilsecret')\n        self.assertEqual(session, {})\n\n    def test_custom_serializer(self):\n        import base64\n        from hashlib import sha512\n        import hmac\n        import time\n        request = testing.DummyRequest()\n        serializer = DummySerializer()\n        cstruct = serializer.dumps((time.time(), 0, {'state': 1}))\n        sig = hmac.new(b'pyramid.session.secret', cstruct, sha512).digest()\n        cookieval = base64.urlsafe_b64encode(sig + cstruct).rstrip(b'=')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, serializer=serializer)\n        self.assertEqual(session['state'], 1)\n\n    def test_invalid_data_size(self):\n        from hashlib import sha512\n        import base64\n        request = testing.DummyRequest()\n        num_bytes = sha512().digest_size - 1\n        cookieval = base64.b64encode(b' ' * num_bytes)\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request)\n        self.assertEqual(session, {})\n\n    def test_very_long_key(self):\n        verylongkey = b'a' * 1024\n        import webob\n        request = testing.DummyRequest()\n        session = self._makeOne(request, secret=verylongkey)\n        session['a'] = 1\n        callbacks = request.response_callbacks\n        self.assertEqual(len(callbacks), 1)\n        response = webob.Response()\n\n        try:\n            result = callbacks[0](request, response)\n        except TypeError: # pragma: no cover\n            self.fail('HMAC failed to initialize due to key length.')\n\n        self.assertEqual(result, None)\n        self.assertTrue('Set-Cookie' in dict(response.headerlist))",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 363,
                            "end_lineno": 370,
                            "parent": {
                                "file_name": "pyramid/tests/test_session.py",
                                "type": "class",
                                "name": "TestSignedCookieSession",
                                "content": "class TestSignedCookieSession(SharedCookieSessionTests, unittest.TestCase):\n    def _makeOne(self, request, **kw):\n        from pyramid.session import SignedCookieSessionFactory\n        kw.setdefault('secret', 'secret')\n        return SignedCookieSessionFactory(**kw)(request)\n\n    def _serialize(self, value, salt=b'pyramid.session.', hashalg='sha512'):\n        import base64\n        import hashlib\n        import hmac\n        import pickle\n\n        digestmod = lambda: hashlib.new(hashalg)\n        cstruct = pickle.dumps(value, pickle.HIGHEST_PROTOCOL)\n        sig = hmac.new(salt + b'secret', cstruct, digestmod).digest()\n        return base64.urlsafe_b64encode(sig + cstruct).rstrip(b'=')\n\n    def test_reissue_not_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time=1)\n        self.assertEqual(session['state'], 1)\n        self.assertFalse(session._dirty)\n\n    def test_reissue_never(self):\n        request = testing.DummyRequest()\n        cookieval = self._serialize((0, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time=None, timeout=None)\n        self.assertEqual(session['state'], 1)\n        self.assertFalse(session._dirty)\n\n    def test_reissue_str_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 2, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time='0')\n        self.assertEqual(session['state'], 1)\n        self.assertTrue(session._dirty)\n\n    def test_reissue_invalid(self):\n        request = testing.DummyRequest()\n        self.assertRaises(ValueError, self._makeOne, request, reissue_time='invalid value')\n\n    def test_cookie_max_age_invalid(self):\n        request = testing.DummyRequest()\n        self.assertRaises(ValueError, self._makeOne, request, max_age='invalid value')\n\n    def test_custom_salt(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}), salt=b'f.')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, salt=b'f.')\n        self.assertEqual(session['state'], 1)\n\n    def test_salt_mismatch(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}), salt=b'f.')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, salt=b'g.')\n        self.assertEqual(session, {})\n\n    def test_custom_hashalg(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}),\n                                    hashalg='sha1')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, hashalg='sha1')\n        self.assertEqual(session['state'], 1)\n\n    def test_hashalg_mismatch(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}),\n                                    hashalg='sha1')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, hashalg='sha256')\n        self.assertEqual(session, {})\n\n    def test_secret_mismatch(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, secret='evilsecret')\n        self.assertEqual(session, {})\n\n    def test_custom_serializer(self):\n        import base64\n        from hashlib import sha512\n        import hmac\n        import time\n        request = testing.DummyRequest()\n        serializer = DummySerializer()\n        cstruct = serializer.dumps((time.time(), 0, {'state': 1}))\n        sig = hmac.new(b'pyramid.session.secret', cstruct, sha512).digest()\n        cookieval = base64.urlsafe_b64encode(sig + cstruct).rstrip(b'=')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, serializer=serializer)\n        self.assertEqual(session['state'], 1)\n\n    def test_invalid_data_size(self):\n        from hashlib import sha512\n        import base64\n        request = testing.DummyRequest()\n        num_bytes = sha512().digest_size - 1\n        cookieval = base64.b64encode(b' ' * num_bytes)\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request)\n        self.assertEqual(session, {})\n\n    def test_very_long_key(self):\n        verylongkey = b'a' * 1024\n        import webob\n        request = testing.DummyRequest()\n        session = self._makeOne(request, secret=verylongkey)\n        session['a'] = 1\n        callbacks = request.response_callbacks\n        self.assertEqual(len(callbacks), 1)\n        response = webob.Response()\n\n        try:\n            result = callbacks[0](request, response)\n        except TypeError: # pragma: no cover\n            self.fail('HMAC failed to initialize due to key length.')\n\n        self.assertEqual(result, None)\n        self.assertTrue('Set-Cookie' in dict(response.headerlist))",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 329,
                                "end_lineno": 462,
                                "parent": null
                            }
                        },
                        {
                            "file_name": "pyramid/tests/test_session.py",
                            "type": "method",
                            "name": "TestSignedCookieSession.test_reissue_invalid",
                            "content": "class TestSignedCookieSession(SharedCookieSessionTests, unittest.TestCase):\n    def _makeOne(self, request, **kw):\n        from pyramid.session import SignedCookieSessionFactory\n        kw.setdefault('secret', 'secret')\n        return SignedCookieSessionFactory(**kw)(request)\n\n    def _serialize(self, value, salt=b'pyramid.session.', hashalg='sha512'):\n        import base64\n        import hashlib\n        import hmac\n        import pickle\n\n        digestmod = lambda: hashlib.new(hashalg)\n        cstruct = pickle.dumps(value, pickle.HIGHEST_PROTOCOL)\n        sig = hmac.new(salt + b'secret', cstruct, digestmod).digest()\n        return base64.urlsafe_b64encode(sig + cstruct).rstrip(b'=')\n\n    def test_reissue_not_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time=1)\n        self.assertEqual(session['state'], 1)\n        self.assertFalse(session._dirty)\n\n    def test_reissue_never(self):\n        request = testing.DummyRequest()\n        cookieval = self._serialize((0, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time=None, timeout=None)\n        self.assertEqual(session['state'], 1)\n        self.assertFalse(session._dirty)\n\n    def test_reissue_str_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 2, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time='0')\n        self.assertEqual(session['state'], 1)\n        self.assertTrue(session._dirty)\n\n    def test_reissue_invalid(self):\n        request = testing.DummyRequest()\n        self.assertRaises(ValueError, self._makeOne, request, reissue_time='invalid value')\n\n    def test_cookie_max_age_invalid(self):\n        request = testing.DummyRequest()\n        self.assertRaises(ValueError, self._makeOne, request, max_age='invalid value')\n\n    def test_custom_salt(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}), salt=b'f.')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, salt=b'f.')\n        self.assertEqual(session['state'], 1)\n\n    def test_salt_mismatch(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}), salt=b'f.')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, salt=b'g.')\n        self.assertEqual(session, {})\n\n    def test_custom_hashalg(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}),\n                                    hashalg='sha1')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, hashalg='sha1')\n        self.assertEqual(session['state'], 1)\n\n    def test_hashalg_mismatch(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}),\n                                    hashalg='sha1')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, hashalg='sha256')\n        self.assertEqual(session, {})\n\n    def test_secret_mismatch(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, secret='evilsecret')\n        self.assertEqual(session, {})\n\n    def test_custom_serializer(self):\n        import base64\n        from hashlib import sha512\n        import hmac\n        import time\n        request = testing.DummyRequest()\n        serializer = DummySerializer()\n        cstruct = serializer.dumps((time.time(), 0, {'state': 1}))\n        sig = hmac.new(b'pyramid.session.secret', cstruct, sha512).digest()\n        cookieval = base64.urlsafe_b64encode(sig + cstruct).rstrip(b'=')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, serializer=serializer)\n        self.assertEqual(session['state'], 1)\n\n    def test_invalid_data_size(self):\n        from hashlib import sha512\n        import base64\n        request = testing.DummyRequest()\n        num_bytes = sha512().digest_size - 1\n        cookieval = base64.b64encode(b' ' * num_bytes)\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request)\n        self.assertEqual(session, {})\n\n    def test_very_long_key(self):\n        verylongkey = b'a' * 1024\n        import webob\n        request = testing.DummyRequest()\n        session = self._makeOne(request, secret=verylongkey)\n        session['a'] = 1\n        callbacks = request.response_callbacks\n        self.assertEqual(len(callbacks), 1)\n        response = webob.Response()\n\n        try:\n            result = callbacks[0](request, response)\n        except TypeError: # pragma: no cover\n            self.fail('HMAC failed to initialize due to key length.')\n\n        self.assertEqual(result, None)\n        self.assertTrue('Set-Cookie' in dict(response.headerlist))",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 372,
                            "end_lineno": 374,
                            "parent": {
                                "file_name": "pyramid/tests/test_session.py",
                                "type": "class",
                                "name": "TestSignedCookieSession",
                                "content": "class TestSignedCookieSession(SharedCookieSessionTests, unittest.TestCase):\n    def _makeOne(self, request, **kw):\n        from pyramid.session import SignedCookieSessionFactory\n        kw.setdefault('secret', 'secret')\n        return SignedCookieSessionFactory(**kw)(request)\n\n    def _serialize(self, value, salt=b'pyramid.session.', hashalg='sha512'):\n        import base64\n        import hashlib\n        import hmac\n        import pickle\n\n        digestmod = lambda: hashlib.new(hashalg)\n        cstruct = pickle.dumps(value, pickle.HIGHEST_PROTOCOL)\n        sig = hmac.new(salt + b'secret', cstruct, digestmod).digest()\n        return base64.urlsafe_b64encode(sig + cstruct).rstrip(b'=')\n\n    def test_reissue_not_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time=1)\n        self.assertEqual(session['state'], 1)\n        self.assertFalse(session._dirty)\n\n    def test_reissue_never(self):\n        request = testing.DummyRequest()\n        cookieval = self._serialize((0, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time=None, timeout=None)\n        self.assertEqual(session['state'], 1)\n        self.assertFalse(session._dirty)\n\n    def test_reissue_str_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 2, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time='0')\n        self.assertEqual(session['state'], 1)\n        self.assertTrue(session._dirty)\n\n    def test_reissue_invalid(self):\n        request = testing.DummyRequest()\n        self.assertRaises(ValueError, self._makeOne, request, reissue_time='invalid value')\n\n    def test_cookie_max_age_invalid(self):\n        request = testing.DummyRequest()\n        self.assertRaises(ValueError, self._makeOne, request, max_age='invalid value')\n\n    def test_custom_salt(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}), salt=b'f.')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, salt=b'f.')\n        self.assertEqual(session['state'], 1)\n\n    def test_salt_mismatch(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}), salt=b'f.')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, salt=b'g.')\n        self.assertEqual(session, {})\n\n    def test_custom_hashalg(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}),\n                                    hashalg='sha1')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, hashalg='sha1')\n        self.assertEqual(session['state'], 1)\n\n    def test_hashalg_mismatch(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}),\n                                    hashalg='sha1')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, hashalg='sha256')\n        self.assertEqual(session, {})\n\n    def test_secret_mismatch(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, secret='evilsecret')\n        self.assertEqual(session, {})\n\n    def test_custom_serializer(self):\n        import base64\n        from hashlib import sha512\n        import hmac\n        import time\n        request = testing.DummyRequest()\n        serializer = DummySerializer()\n        cstruct = serializer.dumps((time.time(), 0, {'state': 1}))\n        sig = hmac.new(b'pyramid.session.secret', cstruct, sha512).digest()\n        cookieval = base64.urlsafe_b64encode(sig + cstruct).rstrip(b'=')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, serializer=serializer)\n        self.assertEqual(session['state'], 1)\n\n    def test_invalid_data_size(self):\n        from hashlib import sha512\n        import base64\n        request = testing.DummyRequest()\n        num_bytes = sha512().digest_size - 1\n        cookieval = base64.b64encode(b' ' * num_bytes)\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request)\n        self.assertEqual(session, {})\n\n    def test_very_long_key(self):\n        verylongkey = b'a' * 1024\n        import webob\n        request = testing.DummyRequest()\n        session = self._makeOne(request, secret=verylongkey)\n        session['a'] = 1\n        callbacks = request.response_callbacks\n        self.assertEqual(len(callbacks), 1)\n        response = webob.Response()\n\n        try:\n            result = callbacks[0](request, response)\n        except TypeError: # pragma: no cover\n            self.fail('HMAC failed to initialize due to key length.')\n\n        self.assertEqual(result, None)\n        self.assertTrue('Set-Cookie' in dict(response.headerlist))",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 329,
                                "end_lineno": 462,
                                "parent": null
                            }
                        },
                        {
                            "file_name": "pyramid/tests/test_session.py",
                            "type": "method",
                            "name": "TestSignedCookieSession.test_cookie_max_age_invalid",
                            "content": "class TestSignedCookieSession(SharedCookieSessionTests, unittest.TestCase):\n    def _makeOne(self, request, **kw):\n        from pyramid.session import SignedCookieSessionFactory\n        kw.setdefault('secret', 'secret')\n        return SignedCookieSessionFactory(**kw)(request)\n\n    def _serialize(self, value, salt=b'pyramid.session.', hashalg='sha512'):\n        import base64\n        import hashlib\n        import hmac\n        import pickle\n\n        digestmod = lambda: hashlib.new(hashalg)\n        cstruct = pickle.dumps(value, pickle.HIGHEST_PROTOCOL)\n        sig = hmac.new(salt + b'secret', cstruct, digestmod).digest()\n        return base64.urlsafe_b64encode(sig + cstruct).rstrip(b'=')\n\n    def test_reissue_not_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time=1)\n        self.assertEqual(session['state'], 1)\n        self.assertFalse(session._dirty)\n\n    def test_reissue_never(self):\n        request = testing.DummyRequest()\n        cookieval = self._serialize((0, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time=None, timeout=None)\n        self.assertEqual(session['state'], 1)\n        self.assertFalse(session._dirty)\n\n    def test_reissue_str_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 2, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time='0')\n        self.assertEqual(session['state'], 1)\n        self.assertTrue(session._dirty)\n\n    def test_reissue_invalid(self):\n        request = testing.DummyRequest()\n        self.assertRaises(ValueError, self._makeOne, request, reissue_time='invalid value')\n\n    def test_cookie_max_age_invalid(self):\n        request = testing.DummyRequest()\n        self.assertRaises(ValueError, self._makeOne, request, max_age='invalid value')\n\n    def test_custom_salt(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}), salt=b'f.')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, salt=b'f.')\n        self.assertEqual(session['state'], 1)\n\n    def test_salt_mismatch(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}), salt=b'f.')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, salt=b'g.')\n        self.assertEqual(session, {})\n\n    def test_custom_hashalg(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}),\n                                    hashalg='sha1')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, hashalg='sha1')\n        self.assertEqual(session['state'], 1)\n\n    def test_hashalg_mismatch(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}),\n                                    hashalg='sha1')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, hashalg='sha256')\n        self.assertEqual(session, {})\n\n    def test_secret_mismatch(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, secret='evilsecret')\n        self.assertEqual(session, {})\n\n    def test_custom_serializer(self):\n        import base64\n        from hashlib import sha512\n        import hmac\n        import time\n        request = testing.DummyRequest()\n        serializer = DummySerializer()\n        cstruct = serializer.dumps((time.time(), 0, {'state': 1}))\n        sig = hmac.new(b'pyramid.session.secret', cstruct, sha512).digest()\n        cookieval = base64.urlsafe_b64encode(sig + cstruct).rstrip(b'=')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, serializer=serializer)\n        self.assertEqual(session['state'], 1)\n\n    def test_invalid_data_size(self):\n        from hashlib import sha512\n        import base64\n        request = testing.DummyRequest()\n        num_bytes = sha512().digest_size - 1\n        cookieval = base64.b64encode(b' ' * num_bytes)\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request)\n        self.assertEqual(session, {})\n\n    def test_very_long_key(self):\n        verylongkey = b'a' * 1024\n        import webob\n        request = testing.DummyRequest()\n        session = self._makeOne(request, secret=verylongkey)\n        session['a'] = 1\n        callbacks = request.response_callbacks\n        self.assertEqual(len(callbacks), 1)\n        response = webob.Response()\n\n        try:\n            result = callbacks[0](request, response)\n        except TypeError: # pragma: no cover\n            self.fail('HMAC failed to initialize due to key length.')\n\n        self.assertEqual(result, None)\n        self.assertTrue('Set-Cookie' in dict(response.headerlist))",
                            "ast_type_str": "ClassDef",
                            "start_lineno": 376,
                            "end_lineno": 378,
                            "parent": {
                                "file_name": "pyramid/tests/test_session.py",
                                "type": "class",
                                "name": "TestSignedCookieSession",
                                "content": "class TestSignedCookieSession(SharedCookieSessionTests, unittest.TestCase):\n    def _makeOne(self, request, **kw):\n        from pyramid.session import SignedCookieSessionFactory\n        kw.setdefault('secret', 'secret')\n        return SignedCookieSessionFactory(**kw)(request)\n\n    def _serialize(self, value, salt=b'pyramid.session.', hashalg='sha512'):\n        import base64\n        import hashlib\n        import hmac\n        import pickle\n\n        digestmod = lambda: hashlib.new(hashalg)\n        cstruct = pickle.dumps(value, pickle.HIGHEST_PROTOCOL)\n        sig = hmac.new(salt + b'secret', cstruct, digestmod).digest()\n        return base64.urlsafe_b64encode(sig + cstruct).rstrip(b'=')\n\n    def test_reissue_not_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time=1)\n        self.assertEqual(session['state'], 1)\n        self.assertFalse(session._dirty)\n\n    def test_reissue_never(self):\n        request = testing.DummyRequest()\n        cookieval = self._serialize((0, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time=None, timeout=None)\n        self.assertEqual(session['state'], 1)\n        self.assertFalse(session._dirty)\n\n    def test_reissue_str_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 2, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time='0')\n        self.assertEqual(session['state'], 1)\n        self.assertTrue(session._dirty)\n\n    def test_reissue_invalid(self):\n        request = testing.DummyRequest()\n        self.assertRaises(ValueError, self._makeOne, request, reissue_time='invalid value')\n\n    def test_cookie_max_age_invalid(self):\n        request = testing.DummyRequest()\n        self.assertRaises(ValueError, self._makeOne, request, max_age='invalid value')\n\n    def test_custom_salt(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}), salt=b'f.')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, salt=b'f.')\n        self.assertEqual(session['state'], 1)\n\n    def test_salt_mismatch(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}), salt=b'f.')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, salt=b'g.')\n        self.assertEqual(session, {})\n\n    def test_custom_hashalg(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}),\n                                    hashalg='sha1')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, hashalg='sha1')\n        self.assertEqual(session['state'], 1)\n\n    def test_hashalg_mismatch(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}),\n                                    hashalg='sha1')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, hashalg='sha256')\n        self.assertEqual(session, {})\n\n    def test_secret_mismatch(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, secret='evilsecret')\n        self.assertEqual(session, {})\n\n    def test_custom_serializer(self):\n        import base64\n        from hashlib import sha512\n        import hmac\n        import time\n        request = testing.DummyRequest()\n        serializer = DummySerializer()\n        cstruct = serializer.dumps((time.time(), 0, {'state': 1}))\n        sig = hmac.new(b'pyramid.session.secret', cstruct, sha512).digest()\n        cookieval = base64.urlsafe_b64encode(sig + cstruct).rstrip(b'=')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, serializer=serializer)\n        self.assertEqual(session['state'], 1)\n\n    def test_invalid_data_size(self):\n        from hashlib import sha512\n        import base64\n        request = testing.DummyRequest()\n        num_bytes = sha512().digest_size - 1\n        cookieval = base64.b64encode(b' ' * num_bytes)\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request)\n        self.assertEqual(session, {})\n\n    def test_very_long_key(self):\n        verylongkey = b'a' * 1024\n        import webob\n        request = testing.DummyRequest()\n        session = self._makeOne(request, secret=verylongkey)\n        session['a'] = 1\n        callbacks = request.response_callbacks\n        self.assertEqual(len(callbacks), 1)\n        response = webob.Response()\n\n        try:\n            result = callbacks[0](request, response)\n        except TypeError: # pragma: no cover\n            self.fail('HMAC failed to initialize due to key length.')\n\n        self.assertEqual(result, None)\n        self.assertTrue('Set-Cookie' in dict(response.headerlist))",
                                "ast_type_str": "ClassDef",
                                "start_lineno": 329,
                                "end_lineno": 462,
                                "parent": null
                            }
                        }
                    ],
                    "deleted_entities": []
                }
            ]
        }
    ],
    "old_commit_hash": "2c27c33e45350d98f577bf3e14fda7d66b79904d^",
    "new_commit_hash": "2c27c33e45350d98f577bf3e14fda7d66b79904d",
    "commit_message": "Merge pull request #2050",
    "commit_date": "2015-11-12T21:45:19-07:00",
    "metadata": {}
}
{
    "repo_name": "pyramid",
    "new_commit_hash": "2c27c33e45350d98f577bf3e14fda7d66b79904d",
    "test_file_codes": [
        "import base64\nimport json\nimport unittest\nfrom pyramid import testing\n\nclass SharedCookieSessionTests(object):\n\n    def test_ctor_no_cookie(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        self.assertEqual(dict(session), {})\n\n    def test_instance_conforms(self):\n        from zope.interface.verify import verifyObject\n        from pyramid.interfaces import ISession\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        verifyObject(ISession, session)\n\n    def test_ctor_with_cookie_still_valid(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request)\n        self.assertEqual(dict(session), {'state':1})\n\n    def test_ctor_with_cookie_expired(self):\n        request = testing.DummyRequest()\n        cookieval = self._serialize((0, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request)\n        self.assertEqual(dict(session), {})\n\n    def test_ctor_with_bad_cookie_cannot_deserialize(self):\n        request = testing.DummyRequest()\n        request.cookies['session'] = 'abc'\n        session = self._makeOne(request)\n        self.assertEqual(dict(session), {})\n\n    def test_ctor_with_bad_cookie_not_tuple(self):\n        request = testing.DummyRequest()\n        cookieval = self._serialize('abc')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request)\n        self.assertEqual(dict(session), {})\n\n    def test_timeout(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 5, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, timeout=1)\n        self.assertEqual(dict(session), {})\n\n    def test_timeout_never(self):\n        import time\n        request = testing.DummyRequest()\n        LONG_TIME = 31536000\n        cookieval = self._serialize((time.time() + LONG_TIME, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, timeout=None)\n        self.assertEqual(dict(session), {'state': 1})\n\n    def test_timeout_str(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 5, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, timeout='1')\n        self.assertEqual(dict(session), {})\n\n    def test_timeout_invalid(self):\n        request = testing.DummyRequest()\n        self.assertRaises(ValueError, self._makeOne, request, timeout='Invalid value')\n\n    def test_changed(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        self.assertEqual(session.changed(), None)\n        self.assertTrue(session._dirty)\n\n    def test_invalidate(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session['a'] = 1\n        self.assertEqual(session.invalidate(), None)\n        self.assertFalse('a' in session)\n\n    def test_reissue_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 2, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request)\n        self.assertEqual(session['state'], 1)\n        self.assertTrue(session._dirty)\n\n    def test__set_cookie_on_exception(self):\n        request = testing.DummyRequest()\n        request.exception = True\n        session = self._makeOne(request)\n        session._cookie_on_exception = False\n        response = DummyResponse()\n        self.assertEqual(session._set_cookie(response), False)\n\n    def test__set_cookie_on_exception_no_request_exception(self):\n        import webob\n        request = testing.DummyRequest()\n        request.exception = None\n        session = self._makeOne(request)\n        session._cookie_on_exception = False\n        response = webob.Response()\n        self.assertEqual(session._set_cookie(response), True)\n        self.assertEqual(response.headerlist[-1][0], 'Set-Cookie')\n\n    def test__set_cookie_cookieval_too_long(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session['abc'] = 'x'*100000\n        response = DummyResponse()\n        self.assertRaises(ValueError, session._set_cookie, response)\n\n    def test__set_cookie_real_webob_response(self):\n        import webob\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session['abc'] = 'x'\n        response = webob.Response()\n        self.assertEqual(session._set_cookie(response), True)\n        self.assertEqual(response.headerlist[-1][0], 'Set-Cookie')\n\n    def test__set_cookie_options(self):\n        from pyramid.response import Response\n        request = testing.DummyRequest()\n        request.exception = None\n        session = self._makeOne(request,\n                                cookie_name='abc',\n                                path='/foo',\n                                domain='localhost',\n                                secure=True,\n                                httponly=True,\n                                )\n        session['abc'] = 'x'\n        response = Response()\n        self.assertEqual(session._set_cookie(response), True)\n        cookieval = response.headerlist[-1][1]\n        val, domain, path, secure, httponly = [x.strip() for x in\n                                               cookieval.split(';')]\n        self.assertTrue(val.startswith('abc='))\n        self.assertEqual(domain, 'Domain=localhost')\n        self.assertEqual(path, 'Path=/foo')\n        self.assertEqual(secure, 'secure')\n        self.assertEqual(httponly, 'HttpOnly')\n\n    def test_flash_default(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session.flash('msg1')\n        session.flash('msg2')\n        self.assertEqual(session['_f_'], ['msg1', 'msg2'])\n\n    def test_flash_allow_duplicate_false(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session.flash('msg1')\n        session.flash('msg1', allow_duplicate=False)\n        self.assertEqual(session['_f_'], ['msg1'])\n\n    def test_flash_allow_duplicate_true_and_msg_not_in_storage(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session.flash('msg1', allow_duplicate=True)\n        self.assertEqual(session['_f_'], ['msg1'])\n\n    def test_flash_allow_duplicate_false_and_msg_not_in_storage(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session.flash('msg1', allow_duplicate=False)\n        self.assertEqual(session['_f_'], ['msg1'])\n\n    def test_flash_mixed(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session.flash('warn1', 'warn')\n        session.flash('warn2', 'warn')\n        session.flash('err1', 'error')\n        session.flash('err2', 'error')\n        self.assertEqual(session['_f_warn'], ['warn1', 'warn2'])\n\n    def test_pop_flash_default_queue(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        queue = ['one', 'two']\n        session['_f_'] = queue\n        result = session.pop_flash()\n        self.assertEqual(result, queue)\n        self.assertEqual(session.get('_f_'), None)\n\n    def test_pop_flash_nodefault_queue(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        queue = ['one', 'two']\n        session['_f_error'] = queue\n        result = session.pop_flash('error')\n        self.assertEqual(result, queue)\n        self.assertEqual(session.get('_f_error'), None)\n\n    def test_peek_flash_default_queue(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        queue = ['one', 'two']\n        session['_f_'] = queue\n        result = session.peek_flash()\n        self.assertEqual(result, queue)\n        self.assertEqual(session.get('_f_'), queue)\n\n    def test_peek_flash_nodefault_queue(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        queue = ['one', 'two']\n        session['_f_error'] = queue\n        result = session.peek_flash('error')\n        self.assertEqual(result, queue)\n        self.assertEqual(session.get('_f_error'), queue)\n\n    def test_new_csrf_token(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        token = session.new_csrf_token()\n        self.assertEqual(token, session['_csrft_'])\n\n    def test_get_csrf_token(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session['_csrft_'] = 'token'\n        token = session.get_csrf_token()\n        self.assertEqual(token, 'token')\n        self.assertTrue('_csrft_' in session)\n\n    def test_get_csrf_token_new(self):\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        token = session.get_csrf_token()\n        self.assertTrue(token)\n        self.assertTrue('_csrft_' in session)\n\n    def test_no_set_cookie_with_exception(self):\n        import webob\n        request = testing.DummyRequest()\n        request.exception = True\n        session = self._makeOne(request, set_on_exception=False)\n        session['a'] = 1\n        callbacks = request.response_callbacks\n        self.assertEqual(len(callbacks), 1)\n        response = webob.Response()\n        result = callbacks[0](request, response)\n        self.assertEqual(result, None)\n        self.assertFalse('Set-Cookie' in dict(response.headerlist))\n\n    def test_set_cookie_with_exception(self):\n        import webob\n        request = testing.DummyRequest()\n        request.exception = True\n        session = self._makeOne(request)\n        session['a'] = 1\n        callbacks = request.response_callbacks\n        self.assertEqual(len(callbacks), 1)\n        response = webob.Response()\n        result = callbacks[0](request, response)\n        self.assertEqual(result, None)\n        self.assertTrue('Set-Cookie' in dict(response.headerlist))\n\n    def test_cookie_is_set(self):\n        import webob\n        request = testing.DummyRequest()\n        session = self._makeOne(request)\n        session['a'] = 1\n        callbacks = request.response_callbacks\n        self.assertEqual(len(callbacks), 1)\n        response = webob.Response()\n        result = callbacks[0](request, response)\n        self.assertEqual(result, None)\n        self.assertTrue('Set-Cookie' in dict(response.headerlist))\n\nclass TestBaseCookieSession(SharedCookieSessionTests, unittest.TestCase):\n    def _makeOne(self, request, **kw):\n        from pyramid.session import BaseCookieSessionFactory\n        serializer = DummySerializer()\n        return BaseCookieSessionFactory(serializer, **kw)(request)\n\n    def _serialize(self, value):\n        return base64.b64encode(json.dumps(value).encode('utf-8'))\n\n    def test_reissue_not_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time=1)\n        self.assertEqual(session['state'], 1)\n        self.assertFalse(session._dirty)\n\n    def test_reissue_never(self):\n        request = testing.DummyRequest()\n        cookieval = self._serialize((0, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time=None, timeout=None)\n        self.assertEqual(session['state'], 1)\n        self.assertFalse(session._dirty)\n\n    def test_reissue_str_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 2, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time='0')\n        self.assertEqual(session['state'], 1)\n        self.assertTrue(session._dirty)\n\n    def test_reissue_invalid(self):\n        request = testing.DummyRequest()\n        self.assertRaises(ValueError, self._makeOne, request, reissue_time='invalid value')\n\n    def test_cookie_max_age_invalid(self):\n        request = testing.DummyRequest()\n        self.assertRaises(ValueError, self._makeOne, request, max_age='invalid value')\n\nclass TestSignedCookieSession(SharedCookieSessionTests, unittest.TestCase):\n    def _makeOne(self, request, **kw):\n        from pyramid.session import SignedCookieSessionFactory\n        kw.setdefault('secret', 'secret')\n        return SignedCookieSessionFactory(**kw)(request)\n\n    def _serialize(self, value, salt=b'pyramid.session.', hashalg='sha512'):\n        import base64\n        import hashlib\n        import hmac\n        import pickle\n\n        digestmod = lambda: hashlib.new(hashalg)\n        cstruct = pickle.dumps(value, pickle.HIGHEST_PROTOCOL)\n        sig = hmac.new(salt + b'secret', cstruct, digestmod).digest()\n        return base64.urlsafe_b64encode(sig + cstruct).rstrip(b'=')\n\n    def test_reissue_not_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time=1)\n        self.assertEqual(session['state'], 1)\n        self.assertFalse(session._dirty)\n\n    def test_reissue_never(self):\n        request = testing.DummyRequest()\n        cookieval = self._serialize((0, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time=None, timeout=None)\n        self.assertEqual(session['state'], 1)\n        self.assertFalse(session._dirty)\n\n    def test_reissue_str_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 2, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time='0')\n        self.assertEqual(session['state'], 1)\n        self.assertTrue(session._dirty)\n\n    def test_reissue_invalid(self):\n        request = testing.DummyRequest()\n        self.assertRaises(ValueError, self._makeOne, request, reissue_time='invalid value')\n\n    def test_cookie_max_age_invalid(self):\n        request = testing.DummyRequest()\n        self.assertRaises(ValueError, self._makeOne, request, max_age='invalid value')\n\n    def test_custom_salt(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}), salt=b'f.')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, salt=b'f.')\n        self.assertEqual(session['state'], 1)\n\n    def test_salt_mismatch(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}), salt=b'f.')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, salt=b'g.')\n        self.assertEqual(session, {})\n\n    def test_custom_hashalg(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}),\n                                    hashalg='sha1')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, hashalg='sha1')\n        self.assertEqual(session['state'], 1)\n\n    def test_hashalg_mismatch(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}),\n                                    hashalg='sha1')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, hashalg='sha256')\n        self.assertEqual(session, {})\n\n    def test_secret_mismatch(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time(), 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, secret='evilsecret')\n        self.assertEqual(session, {})\n\n    def test_custom_serializer(self):\n        import base64\n        from hashlib import sha512\n        import hmac\n        import time\n        request = testing.DummyRequest()\n        serializer = DummySerializer()\n        cstruct = serializer.dumps((time.time(), 0, {'state': 1}))\n        sig = hmac.new(b'pyramid.session.secret', cstruct, sha512).digest()\n        cookieval = base64.urlsafe_b64encode(sig + cstruct).rstrip(b'=')\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, serializer=serializer)\n        self.assertEqual(session['state'], 1)\n\n    def test_invalid_data_size(self):\n        from hashlib import sha512\n        import base64\n        request = testing.DummyRequest()\n        num_bytes = sha512().digest_size - 1\n        cookieval = base64.b64encode(b' ' * num_bytes)\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request)\n        self.assertEqual(session, {})\n\n    def test_very_long_key(self):\n        verylongkey = b'a' * 1024\n        import webob\n        request = testing.DummyRequest()\n        session = self._makeOne(request, secret=verylongkey)\n        session['a'] = 1\n        callbacks = request.response_callbacks\n        self.assertEqual(len(callbacks), 1)\n        response = webob.Response()\n\n        try:\n            result = callbacks[0](request, response)\n        except TypeError: # pragma: no cover\n            self.fail('HMAC failed to initialize due to key length.')\n\n        self.assertEqual(result, None)\n        self.assertTrue('Set-Cookie' in dict(response.headerlist))\n\nclass TestUnencryptedCookieSession(SharedCookieSessionTests, unittest.TestCase):\n    def setUp(self):\n        super(TestUnencryptedCookieSession, self).setUp()\n        from zope.deprecation import __show__\n        __show__.off()\n\n    def tearDown(self):\n        super(TestUnencryptedCookieSession, self).tearDown()\n        from zope.deprecation import __show__\n        __show__.on()\n        \n    def _makeOne(self, request, **kw):\n        from pyramid.session import UnencryptedCookieSessionFactoryConfig\n        self._rename_cookie_var(kw, 'path', 'cookie_path')\n        self._rename_cookie_var(kw, 'domain', 'cookie_domain')\n        self._rename_cookie_var(kw, 'secure', 'cookie_secure')\n        self._rename_cookie_var(kw, 'httponly', 'cookie_httponly')\n        self._rename_cookie_var(kw, 'set_on_exception', 'cookie_on_exception')\n        return UnencryptedCookieSessionFactoryConfig('secret', **kw)(request)\n\n    def _rename_cookie_var(self, kw, src, dest):\n        if src in kw:\n            kw.setdefault(dest, kw.pop(src))\n\n    def _serialize(self, value):\n        from pyramid.compat import bytes_\n        from pyramid.session import signed_serialize\n        return bytes_(signed_serialize(value, 'secret'))\n\n    def test_serialize_option(self):\n        from pyramid.response import Response\n        secret = 'secret'\n        request = testing.DummyRequest()\n        session = self._makeOne(request,\n            signed_serialize=dummy_signed_serialize)\n        session['key'] = 'value'\n        response = Response()\n        self.assertEqual(session._set_cookie(response), True)\n        cookie = response.headerlist[-1][1]\n        expected_cookieval = dummy_signed_serialize(\n            (session.accessed, session.created, {'key': 'value'}), secret)\n        response = Response()\n        response.set_cookie('session', expected_cookieval)\n        expected_cookie = response.headerlist[-1][1]\n        self.assertEqual(cookie, expected_cookie)\n\n    def test_deserialize_option(self):\n        import time\n        secret = 'secret'\n        request = testing.DummyRequest()\n        accessed = time.time()\n        state = {'key': 'value'}\n        cookieval = dummy_signed_serialize((accessed, accessed, state), secret)\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request,\n            signed_deserialize=dummy_signed_deserialize)\n        self.assertEqual(dict(session), state)\n\ndef dummy_signed_serialize(data, secret):\n    import base64\n    from pyramid.compat import pickle, bytes_\n    pickled = pickle.dumps(data)\n    return base64.b64encode(bytes_(secret)) + base64.b64encode(pickled)\n\ndef dummy_signed_deserialize(serialized, secret):\n    import base64\n    from pyramid.compat import pickle, bytes_\n    serialized_data = base64.b64decode(\n        serialized[len(base64.b64encode(bytes_(secret))):])\n    return pickle.loads(serialized_data)\n\nclass Test_manage_accessed(unittest.TestCase):\n    def _makeOne(self, wrapped):\n        from pyramid.session import manage_accessed\n        return manage_accessed(wrapped)\n\n    def test_accessed_set(self):\n        request = testing.DummyRequest()\n        session = DummySessionFactory(request)\n        session.renewed = 0\n        wrapper = self._makeOne(session.__class__.get)\n        wrapper(session, 'a')\n        self.assertNotEqual(session.accessed, None)\n        self.assertTrue(session._dirty)\n\n    def test_accessed_without_renew(self):\n        import time\n        request = testing.DummyRequest()\n        session = DummySessionFactory(request)\n        session._reissue_time = 5\n        session.renewed = time.time()\n        wrapper = self._makeOne(session.__class__.get)\n        wrapper(session, 'a')\n        self.assertNotEqual(session.accessed, None)\n        self.assertFalse(session._dirty)\n\n    def test_already_dirty(self):\n        request = testing.DummyRequest()\n        session = DummySessionFactory(request)\n        session.renewed = 0\n        session._dirty = True\n        session['a'] = 1\n        wrapper = self._makeOne(session.__class__.get)\n        self.assertEqual(wrapper.__doc__, session.get.__doc__)\n        result = wrapper(session, 'a')\n        self.assertEqual(result, 1)\n        callbacks = request.response_callbacks\n        if callbacks is not None: self.assertEqual(len(callbacks), 0)\n\nclass Test_manage_changed(unittest.TestCase):\n    def _makeOne(self, wrapped):\n        from pyramid.session import manage_changed\n        return manage_changed(wrapped)\n\n    def test_it(self):\n        request = testing.DummyRequest()\n        session = DummySessionFactory(request)\n        wrapper = self._makeOne(session.__class__.__setitem__)\n        wrapper(session, 'a', 1)\n        self.assertNotEqual(session.accessed, None)\n        self.assertTrue(session._dirty)\n\ndef serialize(data, secret):\n    import hmac\n    import base64\n    from hashlib import sha1\n    from pyramid.compat import bytes_\n    from pyramid.compat import native_\n    from pyramid.compat import pickle\n    pickled = pickle.dumps(data, pickle.HIGHEST_PROTOCOL)\n    sig = hmac.new(bytes_(secret, 'utf-8'), pickled, sha1).hexdigest()\n    return sig + native_(base64.b64encode(pickled))\n\nclass Test_signed_serialize(unittest.TestCase):\n    def _callFUT(self, data, secret):\n        from pyramid.session import signed_serialize\n        return signed_serialize(data, secret)\n\n    def test_it(self):\n        expected = serialize('123', 'secret')\n        result = self._callFUT('123', 'secret')\n        self.assertEqual(result, expected)\n\n    def test_it_with_highorder_secret(self):\n        secret = b'\\xce\\xb1\\xce\\xb2\\xce\\xb3\\xce\\xb4'.decode('utf-8')\n        expected = serialize('123', secret)\n        result = self._callFUT('123', secret)\n        self.assertEqual(result, expected)\n\n    def test_it_with_latin1_secret(self):\n        secret = b'La Pe\\xc3\\xb1a'\n        expected = serialize('123', secret)\n        result = self._callFUT('123', secret.decode('latin-1'))\n        self.assertEqual(result, expected)\n        \nclass Test_signed_deserialize(unittest.TestCase):\n    def _callFUT(self, serialized, secret, hmac=None):\n        if hmac is None:\n            import hmac\n        from pyramid.session import signed_deserialize\n        return signed_deserialize(serialized, secret, hmac=hmac)\n\n    def test_it(self):\n        serialized = serialize('123', 'secret')\n        result = self._callFUT(serialized, 'secret')\n        self.assertEqual(result, '123')\n\n    def test_invalid_bits(self):\n        serialized = serialize('123', 'secret')\n        self.assertRaises(ValueError, self._callFUT, serialized, 'seekrit')\n\n    def test_invalid_len(self):\n        class hmac(object):\n            def new(self, *arg):\n                return self\n            def hexdigest(self):\n                return '1234'\n        serialized = serialize('123', 'secret123')\n        self.assertRaises(ValueError, self._callFUT, serialized, 'secret',\n                          hmac=hmac())\n        \n    def test_it_bad_encoding(self):\n        serialized = 'bad' + serialize('123', 'secret')\n        self.assertRaises(ValueError, self._callFUT, serialized, 'secret')\n\n    def test_it_with_highorder_secret(self):\n        secret = b'\\xce\\xb1\\xce\\xb2\\xce\\xb3\\xce\\xb4'.decode('utf-8')\n        serialized = serialize('123', secret)\n        result = self._callFUT(serialized, secret)\n        self.assertEqual(result, '123')\n\n    # bwcompat with pyramid <= 1.5b1 where latin1 is the default\n    def test_it_with_latin1_secret(self):\n        secret = b'La Pe\\xc3\\xb1a'\n        serialized = serialize('123', secret)\n        result = self._callFUT(serialized, secret.decode('latin-1'))\n        self.assertEqual(result, '123')\n\nclass Test_check_csrf_token(unittest.TestCase):\n    def _callFUT(self, *args, **kwargs):\n        from ..session import check_csrf_token\n        return check_csrf_token(*args, **kwargs)\n\n    def test_success_token(self):\n        request = testing.DummyRequest()\n        request.params['csrf_token'] = request.session.get_csrf_token()\n        self.assertEqual(self._callFUT(request, token='csrf_token'), True)\n\n    def test_success_header(self):\n        request = testing.DummyRequest()\n        request.headers['X-CSRF-Token'] = request.session.get_csrf_token()\n        self.assertEqual(self._callFUT(request, header='X-CSRF-Token'), True)\n\n    def test_success_default_token(self):\n        request = testing.DummyRequest()\n        request.params['csrf_token'] = request.session.get_csrf_token()\n        self.assertEqual(self._callFUT(request), True)\n\n    def test_success_default_header(self):\n        request = testing.DummyRequest()\n        request.headers['X-CSRF-Token'] = request.session.get_csrf_token()\n        self.assertEqual(self._callFUT(request), True)\n\n    def test_failure_raises(self):\n        from pyramid.exceptions import BadCSRFToken\n        request = testing.DummyRequest()\n        self.assertRaises(BadCSRFToken, self._callFUT, request,\n                          'csrf_token')\n\n    def test_failure_no_raises(self):\n        request = testing.DummyRequest()\n        result = self._callFUT(request, 'csrf_token', raises=False)\n        self.assertEqual(result, False)\n\nclass DummySerializer(object):\n    def dumps(self, value):\n        return base64.b64encode(json.dumps(value).encode('utf-8'))\n\n    def loads(self, value):\n        try:\n            return json.loads(base64.b64decode(value).decode('utf-8'))\n\n        # base64.b64decode raises a TypeError on py2 instead of a ValueError\n        # and a ValueError is required for the session to handle it properly\n        except TypeError:\n            raise ValueError\n\nclass DummySessionFactory(dict):\n    _dirty = False\n    _cookie_name = 'session'\n    _cookie_max_age = None\n    _cookie_path = '/'\n    _cookie_domain = None\n    _cookie_secure = False\n    _cookie_httponly = False\n    _timeout = 1200\n    _reissue_time = 0\n\n    def __init__(self, request):\n        self.request = request\n        dict.__init__(self, {})\n\n    def changed(self):\n        self._dirty = True\n\nclass DummyResponse(object):\n    def __init__(self):\n        self.headerlist = []\n",
        "import unittest\nimport warnings\nfrom pyramid import testing\nfrom pyramid.compat import (\n    text_,\n    bytes_,\n    )\n\nclass TestCallbackAuthenticationPolicyDebugging(unittest.TestCase):\n    def setUp(self):\n        from pyramid.interfaces import IDebugLogger\n        self.config = testing.setUp()\n        self.config.registry.registerUtility(self, IDebugLogger)\n        self.messages = []\n\n    def tearDown(self):\n        del self.config\n\n    def debug(self, msg):\n        self.messages.append(msg)\n\n    def _makeOne(self, userid=None, callback=None):\n        from pyramid.authentication import CallbackAuthenticationPolicy\n        class MyAuthenticationPolicy(CallbackAuthenticationPolicy):\n            def unauthenticated_userid(self, request):\n                return userid\n        policy = MyAuthenticationPolicy()\n        policy.debug = True\n        policy.callback = callback\n        return policy\n\n    def test_authenticated_userid_no_unauthenticated_userid(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), None)\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            'pyramid.tests.test_authentication.MyAuthenticationPolicy.'\n            'authenticated_userid: call to unauthenticated_userid returned '\n            'None; returning None')\n\n    def test_authenticated_userid_no_callback(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne(userid='fred')\n        self.assertEqual(policy.authenticated_userid(request), 'fred')\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n             \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"authenticated_userid: there was no groupfinder callback; \"\n            \"returning 'fred'\")\n\n    def test_authenticated_userid_with_callback_fail(self):\n        request = DummyRequest(registry=self.config.registry)\n        def callback(userid, request):\n            return None\n        policy = self._makeOne(userid='fred', callback=callback)\n        self.assertEqual(policy.authenticated_userid(request), None)\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            'pyramid.tests.test_authentication.MyAuthenticationPolicy.'\n            'authenticated_userid: groupfinder callback returned None; '\n            'returning None')\n\n    def test_authenticated_userid_with_callback_success(self):\n        request = DummyRequest(registry=self.config.registry)\n        def callback(userid, request):\n            return []\n        policy = self._makeOne(userid='fred', callback=callback)\n        self.assertEqual(policy.authenticated_userid(request), 'fred')\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"authenticated_userid: groupfinder callback returned []; \"\n            \"returning 'fred'\")\n\n    def test_authenticated_userid_fails_cleaning_as_Authenticated(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne(userid='system.Authenticated')\n        self.assertEqual(policy.authenticated_userid(request), None)\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"authenticated_userid: use of userid 'system.Authenticated' is \"\n            \"disallowed by any built-in Pyramid security policy, returning \"\n            \"None\")\n\n    def test_authenticated_userid_fails_cleaning_as_Everyone(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne(userid='system.Everyone')\n        self.assertEqual(policy.authenticated_userid(request), None)\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"authenticated_userid: use of userid 'system.Everyone' is \"\n            \"disallowed by any built-in Pyramid security policy, returning \"\n            \"None\")\n\n    def test_effective_principals_no_unauthenticated_userid(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request),\n                         ['system.Everyone'])\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: unauthenticated_userid returned None; \"\n            \"returning ['system.Everyone']\")\n\n    def test_effective_principals_no_callback(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne(userid='fred')\n        self.assertEqual(\n            policy.effective_principals(request),\n            ['system.Everyone', 'system.Authenticated', 'fred'])\n        self.assertEqual(len(self.messages), 2)\n        self.assertEqual(\n            self.messages[0],\n            'pyramid.tests.test_authentication.MyAuthenticationPolicy.'\n            'effective_principals: groupfinder callback is None, so groups '\n            'is []')\n        self.assertEqual(\n            self.messages[1],\n            \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: returning effective principals: \"\n            \"['system.Everyone', 'system.Authenticated', 'fred']\")\n\n    def test_effective_principals_with_callback_fail(self):\n        request = DummyRequest(registry=self.config.registry)\n        def callback(userid, request):\n            return None\n        policy = self._makeOne(userid='fred', callback=callback)\n        self.assertEqual(\n            policy.effective_principals(request), ['system.Everyone'])\n        self.assertEqual(len(self.messages), 2)\n        self.assertEqual(\n            self.messages[0],\n            'pyramid.tests.test_authentication.MyAuthenticationPolicy.'\n            'effective_principals: groupfinder callback returned None as '\n            'groups')\n        self.assertEqual(\n            self.messages[1],\n            \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: returning effective principals: \"\n            \"['system.Everyone']\")\n\n    def test_effective_principals_with_callback_success(self):\n        request = DummyRequest(registry=self.config.registry)\n        def callback(userid, request):\n            return []\n        policy = self._makeOne(userid='fred', callback=callback)\n        self.assertEqual(\n            policy.effective_principals(request),\n            ['system.Everyone', 'system.Authenticated', 'fred'])\n        self.assertEqual(len(self.messages), 2)\n        self.assertEqual(\n            self.messages[0],\n            'pyramid.tests.test_authentication.MyAuthenticationPolicy.'\n            'effective_principals: groupfinder callback returned [] as groups')\n        self.assertEqual(\n            self.messages[1],\n            \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: returning effective principals: \"\n            \"['system.Everyone', 'system.Authenticated', 'fred']\")\n\n    def test_effective_principals_with_unclean_principal_Authenticated(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne(userid='system.Authenticated')\n        self.assertEqual(\n            policy.effective_principals(request),\n            ['system.Everyone'])\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: unauthenticated_userid returned disallowed \"\n            \"'system.Authenticated'; returning ['system.Everyone'] as if it \"\n            \"was None\")\n\n    def test_effective_principals_with_unclean_principal_Everyone(self):\n        request = DummyRequest(registry=self.config.registry)\n        policy = self._makeOne(userid='system.Everyone')\n        self.assertEqual(\n            policy.effective_principals(request),\n            ['system.Everyone'])\n        self.assertEqual(len(self.messages), 1)\n        self.assertEqual(\n            self.messages[0],\n            \"pyramid.tests.test_authentication.MyAuthenticationPolicy.\"\n            \"effective_principals: unauthenticated_userid returned disallowed \"\n            \"'system.Everyone'; returning ['system.Everyone'] as if it \"\n            \"was None\")\n\nclass TestRepozeWho1AuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import RepozeWho1AuthenticationPolicy\n        return RepozeWho1AuthenticationPolicy\n\n    def _makeOne(self, identifier_name='auth_tkt', callback=None):\n        return self._getTargetClass()(identifier_name, callback)\n\n    def test_class_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyClass\n        from pyramid.interfaces import IAuthenticationPolicy\n        verifyClass(IAuthenticationPolicy, self._getTargetClass())\n\n    def test_instance_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyObject\n        from pyramid.interfaces import IAuthenticationPolicy\n        verifyObject(IAuthenticationPolicy, self._makeOne())\n\n    def test_unauthenticated_userid_returns_None(self):\n        request = DummyRequest({})\n        policy = self._makeOne()\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_unauthenticated_userid(self):\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'fred'}})\n        policy = self._makeOne()\n        self.assertEqual(policy.unauthenticated_userid(request), 'fred')\n\n    def test_authenticated_userid_None(self):\n        request = DummyRequest({})\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid(self):\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'fred'}})\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), 'fred')\n\n    def test_authenticated_userid_repoze_who_userid_is_None(self):\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':None}})\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid_with_callback_returns_None(self):\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'fred'}})\n        def callback(identity, request):\n            return None\n        policy = self._makeOne(callback=callback)\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid_with_callback_returns_something(self):\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'fred'}})\n        def callback(identity, request):\n            return ['agroup']\n        policy = self._makeOne(callback=callback)\n        self.assertEqual(policy.authenticated_userid(request), 'fred')\n\n    def test_authenticated_userid_unclean_principal_Authenticated(self):\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'system.Authenticated'}}\n            )\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid_unclean_principal_Everyone(self):\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'system.Everyone'}}\n            )\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_effective_principals_None(self):\n        from pyramid.security import Everyone\n        request = DummyRequest({})\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals_userid_only(self):\n        from pyramid.security import Everyone\n        from pyramid.security import Authenticated\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'fred'}})\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request),\n                         [Everyone, Authenticated, 'fred'])\n\n    def test_effective_principals_userid_and_groups(self):\n        from pyramid.security import Everyone\n        from pyramid.security import Authenticated\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'fred',\n                                    'groups':['quux', 'biz']}})\n        def callback(identity, request):\n            return identity['groups']\n        policy = self._makeOne(callback=callback)\n        self.assertEqual(policy.effective_principals(request),\n                         [Everyone, Authenticated, 'fred', 'quux', 'biz'])\n\n    def test_effective_principals_userid_callback_returns_None(self):\n        from pyramid.security import Everyone\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'fred',\n                                    'groups':['quux', 'biz']}})\n        def callback(identity, request):\n            return None\n        policy = self._makeOne(callback=callback)\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals_repoze_who_userid_is_None(self):\n        from pyramid.security import Everyone\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':None}}\n            )\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals_repoze_who_userid_is_unclean_Everyone(self):\n        from pyramid.security import Everyone\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'system.Everyone'}}\n            )\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals_repoze_who_userid_is_unclean_Authenticated(\n        self):\n        from pyramid.security import Everyone\n        request = DummyRequest(\n            {'repoze.who.identity':{'repoze.who.userid':'system.Authenticated'}}\n            )\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_remember_no_plugins(self):\n        request = DummyRequest({})\n        policy = self._makeOne()\n        result = policy.remember(request, 'fred')\n        self.assertEqual(result, [])\n\n    def test_remember(self):\n        authtkt = DummyWhoPlugin()\n        request = DummyRequest(\n            {'repoze.who.plugins':{'auth_tkt':authtkt}})\n        policy = self._makeOne()\n        result = policy.remember(request, 'fred')\n        self.assertEqual(result[0], request.environ)\n        self.assertEqual(result[1], {'repoze.who.userid':'fred'})\n\n    def test_remember_kwargs(self):\n        authtkt = DummyWhoPlugin()\n        request = DummyRequest(\n            {'repoze.who.plugins':{'auth_tkt':authtkt}})\n        policy = self._makeOne()\n        result = policy.remember(request, 'fred', max_age=23)\n        self.assertEqual(result[1], {'repoze.who.userid':'fred', 'max_age': 23})\n\n    def test_forget_no_plugins(self):\n        request = DummyRequest({})\n        policy = self._makeOne()\n        result = policy.forget(request)\n        self.assertEqual(result, [])\n\n    def test_forget(self):\n        authtkt = DummyWhoPlugin()\n        request = DummyRequest(\n            {'repoze.who.plugins':{'auth_tkt':authtkt},\n             'repoze.who.identity':{'repoze.who.userid':'fred'},\n             })\n        policy = self._makeOne()\n        result = policy.forget(request)\n        self.assertEqual(result[0], request.environ)\n        self.assertEqual(result[1], request.environ['repoze.who.identity'])\n\nclass TestRemoteUserAuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import RemoteUserAuthenticationPolicy\n        return RemoteUserAuthenticationPolicy\n\n    def _makeOne(self, environ_key='REMOTE_USER', callback=None):\n        return self._getTargetClass()(environ_key, callback)\n\n    def test_class_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyClass\n        from pyramid.interfaces import IAuthenticationPolicy\n        verifyClass(IAuthenticationPolicy, self._getTargetClass())\n\n    def test_instance_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyObject\n        from pyramid.interfaces import IAuthenticationPolicy\n        verifyObject(IAuthenticationPolicy, self._makeOne())\n\n    def test_unauthenticated_userid_returns_None(self):\n        request = DummyRequest({})\n        policy = self._makeOne()\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_unauthenticated_userid(self):\n        request = DummyRequest({'REMOTE_USER':'fred'})\n        policy = self._makeOne()\n        self.assertEqual(policy.unauthenticated_userid(request), 'fred')\n\n    def test_authenticated_userid_None(self):\n        request = DummyRequest({})\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid(self):\n        request = DummyRequest({'REMOTE_USER':'fred'})\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), 'fred')\n\n    def test_effective_principals_None(self):\n        from pyramid.security import Everyone\n        request = DummyRequest({})\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals(self):\n        from pyramid.security import Everyone\n        from pyramid.security import Authenticated\n        request = DummyRequest({'REMOTE_USER':'fred'})\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request),\n                         [Everyone, Authenticated, 'fred'])\n\n    def test_remember(self):\n        request = DummyRequest({'REMOTE_USER':'fred'})\n        policy = self._makeOne()\n        result = policy.remember(request, 'fred')\n        self.assertEqual(result, [])\n\n    def test_forget(self):\n        request = DummyRequest({'REMOTE_USER':'fred'})\n        policy = self._makeOne()\n        result = policy.forget(request)\n        self.assertEqual(result, [])\n\nclass TestAuthTktAuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import AuthTktAuthenticationPolicy\n        return AuthTktAuthenticationPolicy\n\n    def _makeOne(self, callback, cookieidentity, **kw):\n        inst = self._getTargetClass()('secret', callback, **kw)\n        inst.cookie = DummyCookieHelper(cookieidentity)\n        return inst\n\n    def setUp(self):\n        self.warnings = warnings.catch_warnings()\n        self.warnings.__enter__()\n        warnings.simplefilter('ignore', DeprecationWarning)\n\n    def tearDown(self):\n        self.warnings.__exit__(None, None, None)\n\n    def test_allargs(self):\n        # pass all known args\n        inst = self._getTargetClass()(\n            'secret', callback=None, cookie_name=None, secure=False,\n            include_ip=False, timeout=None, reissue_time=None,\n            hashalg='sha512',\n            )\n        self.assertEqual(inst.callback, None)\n\n    def test_hashalg_override(self):\n        # important to ensure hashalg is passed to cookie helper\n        inst = self._getTargetClass()('secret', hashalg='sha512')\n        self.assertEqual(inst.cookie.hashalg, 'sha512')\n\n    def test_unauthenticated_userid_returns_None(self):\n        request = DummyRequest({})\n        policy = self._makeOne(None, None)\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_unauthenticated_userid(self):\n        request = DummyRequest({'REMOTE_USER':'fred'})\n        policy = self._makeOne(None, {'userid':'fred'})\n        self.assertEqual(policy.unauthenticated_userid(request), 'fred')\n\n    def test_authenticated_userid_no_cookie_identity(self):\n        request = DummyRequest({})\n        policy = self._makeOne(None, None)\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid_callback_returns_None(self):\n        request = DummyRequest({})\n        def callback(userid, request):\n            return None\n        policy = self._makeOne(callback, {'userid':'fred'})\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid(self):\n        request = DummyRequest({})\n        def callback(userid, request):\n            return True\n        policy = self._makeOne(callback, {'userid':'fred'})\n        self.assertEqual(policy.authenticated_userid(request), 'fred')\n\n    def test_effective_principals_no_cookie_identity(self):\n        from pyramid.security import Everyone\n        request = DummyRequest({})\n        policy = self._makeOne(None, None)\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals_callback_returns_None(self):\n        from pyramid.security import Everyone\n        request = DummyRequest({})\n        def callback(userid, request):\n            return None\n        policy = self._makeOne(callback, {'userid':'fred'})\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals(self):\n        from pyramid.security import Everyone\n        from pyramid.security import Authenticated\n        request = DummyRequest({})\n        def callback(userid, request):\n            return ['group.foo']\n        policy = self._makeOne(callback, {'userid':'fred'})\n        self.assertEqual(policy.effective_principals(request),\n                             [Everyone, Authenticated, 'fred', 'group.foo'])\n\n    def test_remember(self):\n        request = DummyRequest({})\n        policy = self._makeOne(None, None)\n        result = policy.remember(request, 'fred')\n        self.assertEqual(result, [])\n\n    def test_remember_with_extra_kargs(self):\n        request = DummyRequest({})\n        policy = self._makeOne(None, None)\n        result = policy.remember(request, 'fred', a=1, b=2)\n        self.assertEqual(policy.cookie.kw, {'a':1, 'b':2})\n        self.assertEqual(result, [])\n\n    def test_forget(self):\n        request = DummyRequest({})\n        policy = self._makeOne(None, None)\n        result = policy.forget(request)\n        self.assertEqual(result, [])\n\n    def test_class_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyClass\n        from pyramid.interfaces import IAuthenticationPolicy\n        verifyClass(IAuthenticationPolicy, self._getTargetClass())\n\n    def test_instance_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyObject\n        from pyramid.interfaces import IAuthenticationPolicy\n        verifyObject(IAuthenticationPolicy, self._makeOne(None, None))\n\nclass TestAuthTktCookieHelper(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import AuthTktCookieHelper\n        return AuthTktCookieHelper\n\n    def _makeOne(self, *arg, **kw):\n        helper = self._getTargetClass()(*arg, **kw)\n        # laziness after moving auth_tkt classes and funcs into\n        # authentication module\n        auth_tkt = DummyAuthTktModule()\n        helper.auth_tkt = auth_tkt\n        helper.AuthTicket = auth_tkt.AuthTicket\n        helper.parse_ticket = auth_tkt.parse_ticket\n        helper.BadTicket = auth_tkt.BadTicket\n        return helper\n\n    def _makeRequest(self, cookie=None, ipv6=False):\n        environ = {'wsgi.version': (1,0)}\n\n        if ipv6 is False:\n            environ['REMOTE_ADDR'] = '1.1.1.1'\n        else:\n            environ['REMOTE_ADDR'] = '::1'\n        environ['SERVER_NAME'] = 'localhost'\n        return DummyRequest(environ, cookie=cookie)\n\n    def _cookieValue(self, cookie):\n        items = cookie.value.split('/')\n        D = {}\n        for item in items:\n            k, v = item.split('=', 1)\n            D[k] = v\n        return D\n\n    def _parseHeaders(self, headers):\n        return [ self._parseHeader(header) for header in headers ]\n\n    def _parseHeader(self, header):\n        cookie = self._parseCookie(header[1])\n        return cookie\n\n    def _parseCookie(self, cookie):\n        from pyramid.compat import SimpleCookie\n        cookies = SimpleCookie()\n        cookies.load(cookie)\n        return cookies.get('auth_tkt')\n\n    def test_init_cookie_str_reissue_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', reissue_time='invalid value')\n\n    def test_init_cookie_str_timeout_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', timeout='invalid value')\n\n    def test_init_cookie_str_max_age_invalid(self):\n        self.assertRaises(ValueError, self._makeOne, 'secret', max_age='invalid value')\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_str_timeout(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_str_reissue(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time='0')\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        helper.auth_tkt.tokens = (text_('a'), )\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n\n    def test_identify_cookie_reissue_already_reissued_this_request(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        request._authtkt_reissued = True\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_notyet(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=10)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 0)\n\n    def test_identify_cookie_reissue_revoked_by_forget(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.forget(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_revoked_by_remember(self):\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        result = helper.remember(request, 'bob')\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](request, response)\n        self.assertEqual(len(response.headerlist), 0)\n\n    def test_identify_cookie_reissue_with_tokens_default(self):\n        # see https://github.com/Pylons/pyramid/issues#issue/108\n        import time\n        helper = self._makeOne('secret', timeout=10, reissue_time=0)\n        auth_tkt = DummyAuthTktModule(tokens=[''])\n        helper.auth_tkt = auth_tkt\n        helper.AuthTicket = auth_tkt.AuthTicket\n        helper.parse_ticket = auth_tkt.parse_ticket\n        helper.BadTicket = auth_tkt.BadTicket\n        now = time.time()\n        helper.auth_tkt.timestamp = now\n        helper.now = now + 1\n        request = self._makeRequest('bogus')\n        result = helper.identify(request)\n        self.assertTrue(result)\n        self.assertEqual(len(request.callbacks), 1)\n        response = DummyResponse()\n        request.callbacks[0](None, response)\n        self.assertEqual(len(response.headerlist), 3)\n        self.assertEqual(response.headerlist[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=/\" in response.headerlist[0][1])\n\n    def test_remember(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_include_ip(self):\n        helper = self._makeOne('secret', include_ip=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith('; Domain=.localhost; Path=/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_path(self):\n        helper = self._makeOne('secret', include_ip=True,\n                               path=\"/cgi-bin/app.cgi/\")\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith(\n            '; Domain=localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(result[2][1].endswith(\n            '; Domain=.localhost; Path=/cgi-bin/app.cgi/'))\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_http_only(self):\n        helper = self._makeOne('secret', include_ip=True, http_only=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; HttpOnly'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; HttpOnly' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_secure(self):\n        helper = self._makeOne('secret', include_ip=True, secure=True)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[0][1])\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[1][1])\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue('; secure' in result[2][1])\n        self.assertTrue(result[2][1].startswith('auth_tkt='))\n\n    def test_remember_wild_domain_disabled(self):\n        helper = self._makeOne('secret', wild_domain=False)\n        request = self._makeRequest()\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 2)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(result[1][1].endswith('; Domain=localhost; Path=/'))\n        self.assertTrue(result[1][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain(self):\n        helper = self._makeOne('secret', parent_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_parent_domain_supercedes_wild_domain(self):\n        helper = self._makeOne('secret', parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith('; Domain=.example.com; Path=/'))\n\n    def test_remember_explicit_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga')\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n        self.assertTrue(result[0][1].startswith('auth_tkt='))\n\n    def test_remember_domain_supercedes_parent_and_wild_domain(self):\n        helper = self._makeOne('secret', domain='pyramid.bazinga',\n                parent_domain=True, wild_domain=True)\n        request = self._makeRequest()\n        request.domain = 'www.example.com'\n        result = helper.remember(request, 'other')\n        self.assertEqual(len(result), 1)\n        self.assertTrue(result[0][1].endswith(\n                '; Domain=pyramid.bazinga; Path=/'))\n\n    def test_remember_binary_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, b'userid')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(b'userid').strip()))\n        self.assertEqual(val['user_data'], 'userid_type:b64str')\n\n    def test_remember_int_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 1)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_long_userid(self):\n        from pyramid.compat import long\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, long(1))\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'], '1')\n        self.assertEqual(val['user_data'], 'userid_type:int')\n\n    def test_remember_unicode_userid(self):\n        import base64\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = text_(b'\\xc2\\xa9', 'utf-8')\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        val = self._cookieValue(values[0])\n        self.assertEqual(val['userid'],\n                         text_(base64.b64encode(userid.encode('utf-8'))))\n        self.assertEqual(val['user_data'], 'userid_type:b64unicode')\n\n    def test_remember_insane_userid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        userid = object()\n        result = helper.remember(request, userid)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n        value = values[0]\n        self.assertTrue('userid' in value.value)\n\n    def test_remember_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age=500)\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'userid', max_age='500')\n        values = self._parseHeaders(result)\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(values[0]['max-age'], '500')\n        self.assertTrue(values[0]['expires'])\n\n    def test_remember_str_max_age_invalid(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'userid', max_age='invalid value')\n\n    def test_remember_tokens(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        result = helper.remember(request, 'other', tokens=('foo', 'bar'))\n        self.assertEqual(len(result), 3)\n\n        self.assertEqual(result[0][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[0][1])\n\n        self.assertEqual(result[1][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[1][1])\n\n        self.assertEqual(result[2][0], 'Set-Cookie')\n        self.assertTrue(\"/tokens=foo|bar/\" in result[2][1])\n\n    def test_remember_unicode_but_ascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'foo', 'utf-8')\n        result = helper.remember(request, 'other', tokens=(la,))\n        # tokens must be str type on both Python 2 and 3\n        self.assertTrue(\"/tokens=foo/\" in result[0][1])\n\n    def test_remember_nonascii_token(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        la = text_(b'La Pe\\xc3\\xb1a', 'utf-8')\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=(la,))\n\n    def test_remember_invalid_token_format(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('foo bar',))\n        self.assertRaises(ValueError, helper.remember, request, 'other',\n                          tokens=('1bar',))\n\n    def test_forget(self):\n        helper = self._makeOne('secret')\n        request = self._makeRequest()\n        headers = helper.forget(request)\n        self.assertEqual(len(headers), 3)\n        name, value = headers[0]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[1]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n        name, value = headers[2]\n        self.assertEqual(name, 'Set-Cookie')\n        self.assertEqual(\n            value,\n            'auth_tkt=; Domain=.localhost; Max-Age=0; Path=/; '\n            'expires=Wed, 31-Dec-97 23:59:59 GMT'\n            )\n\nclass TestAuthTicket(unittest.TestCase):\n    def _makeOne(self, *arg, **kw):\n        from pyramid.authentication import AuthTicket\n        return AuthTicket(*arg, **kw)\n\n    def test_ctor_with_tokens(self):\n        ticket = self._makeOne('secret', 'userid', 'ip', tokens=('a', 'b'))\n        self.assertEqual(ticket.tokens, 'a,b')\n\n    def test_ctor_with_time(self):\n        ticket = self._makeOne('secret', 'userid', 'ip', time='time')\n        self.assertEqual(ticket.time, 'time')\n\n    def test_digest(self):\n        ticket = self._makeOne('secret', 'userid', '0.0.0.0', time=10)\n        result = ticket.digest()\n        self.assertEqual(result, '126fd6224912187ee9ffa80e0b81420c')\n\n    def test_digest_sha512(self):\n        ticket = self._makeOne('secret', 'userid', '0.0.0.0',\n                               time=10, hashalg='sha512')\n        result = ticket.digest()\n        self.assertEqual(result, '74770b2e0d5b1a54c2a466ec567a40f7d7823576aa49'\\\n                                 '3c65fc3445e9b44097f4a80410319ef8cb256a2e60b9'\\\n                                 'c2002e48a9e33a3e8ee4379352c04ef96d2cb278')\n\n    def test_cookie_value(self):\n        ticket = self._makeOne('secret', 'userid', '0.0.0.0', time=10,\n                               tokens=('a', 'b'))\n        result = ticket.cookie_value()\n        self.assertEqual(result,\n                         '66f9cc3e423dc57c91df696cf3d1f0d80000000auserid!a,b!')\n\n    def test_ipv4(self):\n        ticket = self._makeOne('secret', 'userid', '198.51.100.1',\n                               time=10, hashalg='sha256')\n        result = ticket.cookie_value()\n        self.assertEqual(result, 'b3e7156db4f8abde4439c4a6499a0668f9e7ffd7fa27b'\\\n                                 '798400ecdade8d76c530000000auserid!')\n\n    def test_ipv6(self):\n        ticket = self._makeOne('secret', 'userid', '2001:db8::1',\n                               time=10, hashalg='sha256')\n        result = ticket.cookie_value()\n        self.assertEqual(result, 'd025b601a0f12ca6d008aa35ff3a22b7d8f3d1c1456c8'\\\n                                 '5becf8760cd7a2fa4910000000auserid!')\n\nclass TestBadTicket(unittest.TestCase):\n    def _makeOne(self, msg, expected=None):\n        from pyramid.authentication import BadTicket\n        return BadTicket(msg, expected)\n\n    def test_it(self):\n        exc = self._makeOne('msg', expected=True)\n        self.assertEqual(exc.expected, True)\n        self.assertTrue(isinstance(exc, Exception))\n\nclass Test_parse_ticket(unittest.TestCase):\n    def _callFUT(self, secret, ticket, ip, hashalg='md5'):\n        from pyramid.authentication import parse_ticket\n        return parse_ticket(secret, ticket, ip, hashalg)\n\n    def _assertRaisesBadTicket(self, secret, ticket, ip, hashalg='md5'):\n        from pyramid.authentication import BadTicket\n        self.assertRaises(BadTicket,self._callFUT, secret, ticket, ip, hashalg)\n\n    def test_bad_timestamp(self):\n        ticket = 'x' * 64\n        self._assertRaisesBadTicket('secret', ticket, 'ip')\n\n    def test_bad_userid_or_data(self):\n        ticket = 'x' * 32 + '11111111' + 'x' * 10\n        self._assertRaisesBadTicket('secret', ticket, 'ip')\n\n    def test_digest_sig_incorrect(self):\n        ticket = 'x' * 32 + '11111111' + 'a!b!c'\n        self._assertRaisesBadTicket('secret', ticket, '0.0.0.0')\n\n    def test_correct_with_user_data(self):\n        ticket = text_('66f9cc3e423dc57c91df696cf3d1f0d80000000auserid!a,b!')\n        result = self._callFUT('secret', ticket, '0.0.0.0')\n        self.assertEqual(result, (10, 'userid', ['a', 'b'], ''))\n\n    def test_correct_with_user_data_sha512(self):\n        ticket = text_('7d947cdef99bad55f8e3382a8bd089bb9dd0547f7925b7d189adc1'\n                       '160cab0ec0e6888faa41eba641a18522b26f19109f3ffafb769767'\n                       'ba8a26d02aaeae56599a0000000auserid!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 = text_('b3e7156db4f8abde4439c4a6499a0668f9e7ffd7fa27b798400ecd'\n                       'ade8d76c530000000auserid!')\n        result = self._callFUT('secret', ticket, '198.51.100.1', 'sha256')\n        self.assertEqual(result, (10, 'userid', [''], ''))\n\n    def test_ipv6(self):\n        ticket = text_('d025b601a0f12ca6d008aa35ff3a22b7d8f3d1c1456c85becf8760'\n                       'cd7a2fa4910000000auserid!')\n        result = self._callFUT('secret', ticket, '2001:db8::1', 'sha256')\n        self.assertEqual(result, (10, 'userid', [''], ''))\n\nclass TestSessionAuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import SessionAuthenticationPolicy\n        return SessionAuthenticationPolicy\n\n    def _makeOne(self, callback=None, prefix=''):\n        return self._getTargetClass()(prefix=prefix, callback=callback)\n\n    def test_class_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyClass\n        from pyramid.interfaces import IAuthenticationPolicy\n        verifyClass(IAuthenticationPolicy, self._getTargetClass())\n\n    def test_instance_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyObject\n        from pyramid.interfaces import IAuthenticationPolicy\n        verifyObject(IAuthenticationPolicy, self._makeOne())\n\n    def test_unauthenticated_userid_returns_None(self):\n        request = DummyRequest()\n        policy = self._makeOne()\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_unauthenticated_userid(self):\n        request = DummyRequest(session={'userid':'fred'})\n        policy = self._makeOne()\n        self.assertEqual(policy.unauthenticated_userid(request), 'fred')\n\n    def test_authenticated_userid_no_cookie_identity(self):\n        request = DummyRequest()\n        policy = self._makeOne()\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid_callback_returns_None(self):\n        request = DummyRequest(session={'userid':'fred'})\n        def callback(userid, request):\n            return None\n        policy = self._makeOne(callback)\n        self.assertEqual(policy.authenticated_userid(request), None)\n\n    def test_authenticated_userid(self):\n        request = DummyRequest(session={'userid':'fred'})\n        def callback(userid, request):\n            return True\n        policy = self._makeOne(callback)\n        self.assertEqual(policy.authenticated_userid(request), 'fred')\n\n    def test_effective_principals_no_identity(self):\n        from pyramid.security import Everyone\n        request = DummyRequest()\n        policy = self._makeOne()\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals_callback_returns_None(self):\n        from pyramid.security import Everyone\n        request = DummyRequest(session={'userid':'fred'})\n        def callback(userid, request):\n            return None\n        policy = self._makeOne(callback)\n        self.assertEqual(policy.effective_principals(request), [Everyone])\n\n    def test_effective_principals(self):\n        from pyramid.security import Everyone\n        from pyramid.security import Authenticated\n        request = DummyRequest(session={'userid':'fred'})\n        def callback(userid, request):\n            return ['group.foo']\n        policy = self._makeOne(callback)\n        self.assertEqual(policy.effective_principals(request),\n                         [Everyone, Authenticated, 'fred', 'group.foo'])\n\n    def test_remember(self):\n        request = DummyRequest()\n        policy = self._makeOne()\n        result = policy.remember(request, 'fred')\n        self.assertEqual(request.session.get('userid'), 'fred')\n        self.assertEqual(result, [])\n\n    def test_forget(self):\n        request = DummyRequest(session={'userid':'fred'})\n        policy = self._makeOne()\n        result = policy.forget(request)\n        self.assertEqual(request.session.get('userid'), None)\n        self.assertEqual(result, [])\n\n    def test_forget_no_identity(self):\n        request = DummyRequest()\n        policy = self._makeOne()\n        result = policy.forget(request)\n        self.assertEqual(request.session.get('userid'), None)\n        self.assertEqual(result, [])\n\nclass TestBasicAuthAuthenticationPolicy(unittest.TestCase):\n    def _getTargetClass(self):\n        from pyramid.authentication import BasicAuthAuthenticationPolicy as cls\n        return cls\n\n    def _makeOne(self, check):\n        return self._getTargetClass()(check, realm='SomeRealm')\n\n    def test_class_implements_IAuthenticationPolicy(self):\n        from zope.interface.verify import verifyClass\n        from pyramid.interfaces import IAuthenticationPolicy\n        verifyClass(IAuthenticationPolicy, self._getTargetClass())\n\n    def test_unauthenticated_userid(self):\n        import base64\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Basic %s' % base64.b64encode(\n            bytes_('chrisr:password')).decode('ascii')\n        policy = self._makeOne(None)\n        self.assertEqual(policy.unauthenticated_userid(request), 'chrisr')\n\n    def test_unauthenticated_userid_no_credentials(self):\n        request = testing.DummyRequest()\n        policy = self._makeOne(None)\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_unauthenticated_bad_header(self):\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = '...'\n        policy = self._makeOne(None)\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_unauthenticated_userid_not_basic(self):\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Complicated things'\n        policy = self._makeOne(None)\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_unauthenticated_userid_corrupt_base64(self):\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Basic chrisr:password'\n        policy = self._makeOne(None)\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_authenticated_userid(self):\n        import base64\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Basic %s' % base64.b64encode(\n            bytes_('chrisr:password')).decode('ascii')\n        def check(username, password, request):\n            return []\n        policy = self._makeOne(check)\n        self.assertEqual(policy.authenticated_userid(request), 'chrisr')\n\n    def test_authenticated_userid_utf8(self):\n        import base64\n        request = testing.DummyRequest()\n        inputs = (b'm\\xc3\\xb6rk\\xc3\\xb6:'\n                  b'm\\xc3\\xb6rk\\xc3\\xb6password').decode('utf-8')\n        request.headers['Authorization'] = 'Basic %s' % (\n            base64.b64encode(inputs.encode('utf-8')).decode('latin-1'))\n        def check(username, password, request):\n            return []\n        policy = self._makeOne(check)\n        self.assertEqual(policy.authenticated_userid(request),\n                         b'm\\xc3\\xb6rk\\xc3\\xb6'.decode('utf-8'))\n\n    def test_authenticated_userid_latin1(self):\n        import base64\n        request = testing.DummyRequest()\n        inputs = (b'm\\xc3\\xb6rk\\xc3\\xb6:'\n                  b'm\\xc3\\xb6rk\\xc3\\xb6password').decode('utf-8')\n        request.headers['Authorization'] = 'Basic %s' % (\n            base64.b64encode(inputs.encode('latin-1')).decode('latin-1'))\n        def check(username, password, request):\n            return []\n        policy = self._makeOne(check)\n        self.assertEqual(policy.authenticated_userid(request),\n                         b'm\\xc3\\xb6rk\\xc3\\xb6'.decode('utf-8'))\n\n    def test_unauthenticated_userid_invalid_payload(self):\n        import base64\n        request = testing.DummyRequest()\n        request.headers['Authorization'] = 'Basic %s' % base64.b64encode(\n            bytes_('chrisrpassword')).decode('ascii')\n        policy = self._makeOne(None)\n        self.assertEqual(policy.unauthenticated_userid(request), None)\n\n    def test_remember(self):\n        policy = self._makeOne(None)\n        self.assertEqual(policy.remember(None, None), [])\n\n    def test_forget(self):\n        policy = self._makeOne(None)\n        self.assertEqual(policy.forget(None), [\n            ('WWW-Authenticate', 'Basic realm=\"SomeRealm\"')])\n\nclass TestSimpleSerializer(unittest.TestCase):\n    def _makeOne(self):\n        from pyramid.authentication import _SimpleSerializer\n        return _SimpleSerializer()\n\n    def test_loads(self):\n        inst = self._makeOne()\n        self.assertEqual(inst.loads(b'abc'), text_('abc'))\n\n    def test_dumps(self):\n        inst = self._makeOne()\n        self.assertEqual(inst.dumps('abc'), bytes_('abc'))\n        \nclass DummyContext:\n    pass\n\nclass DummyCookies(object):\n    def __init__(self, cookie):\n        self.cookie = cookie\n\n    def get(self, name):\n        return self.cookie\n\nclass DummyRequest:\n    domain = 'localhost'\n    def __init__(self, environ=None, session=None, registry=None, cookie=None):\n        self.environ = environ or {}\n        self.session = session or {}\n        self.registry = registry\n        self.callbacks = []\n        self.cookies = DummyCookies(cookie)\n\n    def add_response_callback(self, callback):\n        self.callbacks.append(callback)\n\nclass DummyWhoPlugin:\n    def remember(self, environ, identity):\n        return environ, identity\n\n    def forget(self, environ, identity):\n        return environ, identity\n\nclass DummyCookieHelper:\n    def __init__(self, result):\n        self.result = result\n\n    def identify(self, *arg, **kw):\n        return self.result\n\n    def remember(self, *arg, **kw):\n        self.kw = kw\n        return []\n\n    def forget(self, *arg):\n        return []\n\nclass DummyAuthTktModule(object):\n    def __init__(self, timestamp=0, userid='userid', tokens=(), user_data='',\n                 parse_raise=False, hashalg=\"md5\"):\n        self.timestamp = timestamp\n        self.userid = userid\n        self.tokens = tokens\n        self.user_data = user_data\n        self.parse_raise = parse_raise\n        self.hashalg = hashalg\n        def parse_ticket(secret, value, remote_addr, hashalg):\n            self.secret = secret\n            self.value = value\n            self.remote_addr = remote_addr\n            if self.parse_raise:\n                raise self.BadTicket()\n            return self.timestamp, self.userid, self.tokens, self.user_data\n        self.parse_ticket = parse_ticket\n\n        class AuthTicket(object):\n            def __init__(self, secret, userid, remote_addr, **kw):\n                self.secret = secret\n                self.userid = userid\n                self.remote_addr = remote_addr\n                self.kw = kw\n\n            def cookie_value(self):\n                result = {\n                    'secret':self.secret,\n                    'userid':self.userid,\n                    'remote_addr':self.remote_addr\n                    }\n                result.update(self.kw)\n                tokens = result.pop('tokens', None)\n                if tokens is not None:\n                    tokens = '|'.join(tokens)\n                    result['tokens'] = tokens\n                items = sorted(result.items())\n                new_items = []\n                for k, v in items:\n                    if isinstance(v, bytes):\n                        v = text_(v)\n                    new_items.append((k,v))\n                result = '/'.join(['%s=%s' % (k, v) for k,v in new_items ])\n                return result\n        self.AuthTicket = AuthTicket\n\n    class BadTicket(Exception):\n        pass\n\nclass DummyResponse:\n    def __init__(self):\n        self.headerlist = []\n\n"
    ],
    "test_file_names": [
        "test_1.py",
        "test_2.py"
    ],
    "setup_res_code": 0,
    "setup_res_stdout": "",
    "setup_res_stderr": "Using CPython 3.8.20\nCreating virtual environment at: .venv\nActivate with: source .venv/bin/activate\nResolved 9 packages in 712ms\nPrepared 1 package in 923ms\nInstalled 9 packages in 19ms\n + pastedeploy==3.1.0\n + pyramid==1.7.dev0 (from file:///home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d)\n + repoze-lru==0.7\n + setuptools==75.3.0\n + translationstring==1.4\n + venusian==3.1.1\n + webob==1.8.9\n + zope-deprecation==5.0\n + zope-interface==7.2\nResolved 19 packages in 29ms\nInstalled 10 packages in 10ms\n + beautifulsoup4==4.12.3\n + coverage==7.6.1\n + distlib==0.3.9\n + filelock==3.16.1\n + nose==1.3.7\n + platformdirs==4.3.6\n + soupsieve==2.6\n + virtualenv==20.29.0\n + waitress==3.0.0\n + webtest==3.0.1\nResolved 16 packages in 6ms\nInstalled 12 packages in 9ms\n + cachetools==5.5.0\n + chardet==5.2.0\n + colorama==0.4.6\n + exceptiongroup==1.2.2\n + iniconfig==2.0.0\n + packaging==24.2\n + pluggy==1.5.0\n + pyproject-api==1.8.0\n + pytest==8.3.4\n + tomli==2.2.1\n + tox==4.23.2\n + typing-extensions==4.12.2\n",
    "new_commit_res_code": 1,
    "new_commit_res_stdout": "============================= test session starts ==============================\nplatform linux -- Python 3.8.20, pytest-8.3.4, pluggy-1.5.0\nrootdir: /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d\ncollected 1225 items\n\nr2e_tests/test_1.py .................................................... [  4%]\n........................................................................ [ 10%]\n........FFFFFF                                                           [ 11%]\nr2e_tests/test_2.py FFFFFFFFFFFF........................................ [ 15%]\n........................................................................ [ 21%]\n........................                                                 [ 23%]\nr2e_tests/test_config/test_adapters.py .FF..............F...             [ 25%]\nr2e_tests/test_config/test_assets.py ....F.F...F...FF.FF................ [ 27%]\n.....................................F.F................................ [ 33%]\n                                                                         [ 33%]\nr2e_tests/test_config/test_factories.py .....................            [ 35%]\nr2e_tests/test_config/test_i18n.py FFF.FF...                             [ 36%]\nr2e_tests/test_config/test_init.py ..................................... [ 39%]\n...F..F.......F.............F...........F.....................FF...FFF.. [ 45%]\n......................                                                   [ 46%]\nr2e_tests/test_config/test_predicates.py ............................... [ 49%]\n........................................                                 [ 52%]\nr2e_tests/test_config/test_rendering.py ...                              [ 52%]\nr2e_tests/test_config/test_routes.py ........................            [ 54%]\nr2e_tests/test_config/test_security.py ..........                        [ 55%]\nr2e_tests/test_config/test_settings.py ........................          [ 57%]\nr2e_tests/test_config/test_testing.py ............                       [ 58%]\nr2e_tests/test_config/test_tweens.py .................................   [ 61%]\nr2e_tests/test_config/test_util.py ..................................... [ 64%]\n..............                                                           [ 65%]\nr2e_tests/test_config/test_views.py ........................F........... [ 68%]\n........................................................................ [ 74%]\n......FF................................................................ [ 80%]\n...........FF.........F...F....F........................................ [ 86%]\n........................F                                                [ 88%]\nr2e_tests/test_scripts/test_common.py ...                                [ 88%]\nr2e_tests/test_scripts/test_pcreate.py ....................              [ 90%]\nr2e_tests/test_scripts/test_pdistreport.py ..                            [ 90%]\nr2e_tests/test_scripts/test_prequest.py F.FFF.FFFFFF.F.FFF.              [ 91%]\nr2e_tests/test_scripts/test_proutes.py ...FFF....FFFF.F.FF....F..FF.     [ 94%]\nr2e_tests/test_scripts/test_pserve.py ............................       [ 96%]\nr2e_tests/test_scripts/test_pshell.py ................                   [ 97%]\nr2e_tests/test_scripts/test_ptweens.py .....                             [ 98%]\nr2e_tests/test_scripts/test_pviews.py ................F......            [100%]\n\n=================================== FAILURES ===================================\n_________________ Test_check_csrf_token.test_failure_no_raises _________________\n\nself = <r2e_tests.test_1.Test_check_csrf_token testMethod=test_failure_no_raises>\n\n    def test_failure_no_raises(self):\n        request = testing.DummyRequest()\n>       result = self._callFUT(request, 'csrf_token', raises=False)\n\nr2e_tests/test_1.py:695: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <r2e_tests.test_1.Test_check_csrf_token testMethod=test_failure_no_raises>\nargs = (<pyramid.testing.DummyRequest object at 0x775887f1b550>, 'csrf_token')\nkwargs = {'raises': False}\n\n    def _callFUT(self, *args, **kwargs):\n>       from ..session import check_csrf_token\nE       ValueError: attempted relative import beyond top-level package\n\nr2e_tests/test_1.py:664: ValueError\n__________________ Test_check_csrf_token.test_failure_raises ___________________\n\nself = <r2e_tests.test_1.Test_check_csrf_token testMethod=test_failure_raises>\n\n    def test_failure_raises(self):\n        from pyramid.exceptions import BadCSRFToken\n        request = testing.DummyRequest()\n>       self.assertRaises(BadCSRFToken, self._callFUT, request,\n                          'csrf_token')\n\nr2e_tests/test_1.py:690: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\n    def _callFUT(self, *args, **kwargs):\n>       from ..session import check_csrf_token\nE       ValueError: attempted relative import beyond top-level package\n\nr2e_tests/test_1.py:664: ValueError\n______________ Test_check_csrf_token.test_success_default_header _______________\n\nself = <r2e_tests.test_1.Test_check_csrf_token testMethod=test_success_default_header>\n\n    def test_success_default_header(self):\n        request = testing.DummyRequest()\n        request.headers['X-CSRF-Token'] = request.session.get_csrf_token()\n>       self.assertEqual(self._callFUT(request), True)\n\nr2e_tests/test_1.py:685: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <r2e_tests.test_1.Test_check_csrf_token testMethod=test_success_default_header>\nargs = (<pyramid.testing.DummyRequest object at 0x775887f21af0>,), kwargs = {}\n\n    def _callFUT(self, *args, **kwargs):\n>       from ..session import check_csrf_token\nE       ValueError: attempted relative import beyond top-level package\n\nr2e_tests/test_1.py:664: ValueError\n_______________ Test_check_csrf_token.test_success_default_token _______________\n\nself = <r2e_tests.test_1.Test_check_csrf_token testMethod=test_success_default_token>\n\n    def test_success_default_token(self):\n        request = testing.DummyRequest()\n        request.params['csrf_token'] = request.session.get_csrf_token()\n>       self.assertEqual(self._callFUT(request), True)\n\nr2e_tests/test_1.py:680: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <r2e_tests.test_1.Test_check_csrf_token testMethod=test_success_default_token>\nargs = (<pyramid.testing.DummyRequest object at 0x7758875d1970>,), kwargs = {}\n\n    def _callFUT(self, *args, **kwargs):\n>       from ..session import check_csrf_token\nE       ValueError: attempted relative import beyond top-level package\n\nr2e_tests/test_1.py:664: ValueError\n__________________ Test_check_csrf_token.test_success_header ___________________\n\nself = <r2e_tests.test_1.Test_check_csrf_token testMethod=test_success_header>\n\n    def test_success_header(self):\n        request = testing.DummyRequest()\n        request.headers['X-CSRF-Token'] = request.session.get_csrf_token()\n>       self.assertEqual(self._callFUT(request, header='X-CSRF-Token'), True)\n\nr2e_tests/test_1.py:675: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <r2e_tests.test_1.Test_check_csrf_token testMethod=test_success_header>\nargs = (<pyramid.testing.DummyRequest object at 0x77588758b730>,)\nkwargs = {'header': 'X-CSRF-Token'}\n\n    def _callFUT(self, *args, **kwargs):\n>       from ..session import check_csrf_token\nE       ValueError: attempted relative import beyond top-level package\n\nr2e_tests/test_1.py:664: ValueError\n___________________ Test_check_csrf_token.test_success_token ___________________\n\nself = <r2e_tests.test_1.Test_check_csrf_token testMethod=test_success_token>\n\n    def test_success_token(self):\n        request = testing.DummyRequest()\n        request.params['csrf_token'] = request.session.get_csrf_token()\n>       self.assertEqual(self._callFUT(request, token='csrf_token'), True)\n\nr2e_tests/test_1.py:670: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <r2e_tests.test_1.Test_check_csrf_token testMethod=test_success_token>\nargs = (<pyramid.testing.DummyRequest object at 0x7758873aa220>,)\nkwargs = {'token': 'csrf_token'}\n\n    def _callFUT(self, *args, **kwargs):\n>       from ..session import check_csrf_token\nE       ValueError: attempted relative import beyond top-level package\n\nr2e_tests/test_1.py:664: ValueError\n_ TestCallbackAuthenticationPolicyDebugging.test_authenticated_userid_fails_cleaning_as_Authenticated _\n\nself = <r2e_tests.test_2.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_2.MyAuthenticationPolicy.a[123 chars]None\" != \"pyramid.tests.test_authentication.MyAuthe[140 chars]None\"\nE       - r2e_tests.test_2.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_2.py:85: AssertionError\n_ TestCallbackAuthenticationPolicyDebugging.test_authenticated_userid_fails_cleaning_as_Everyone _\n\nself = <r2e_tests.test_2.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_2.MyAuthenticationPolicy.a[118 chars]None\" != \"pyramid.tests.test_authentication.MyAuthe[135 chars]None\"\nE       - r2e_tests.test_2.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_2.py:97: AssertionError\n_ TestCallbackAuthenticationPolicyDebugging.test_authenticated_userid_no_callback _\n\nself = <r2e_tests.test_2.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_2.MyAuthenticationPolicy.a[68 chars]red'\" != \"pyramid.tests.test_authentication.MyAuthe[85 chars]red'\"\nE       - r2e_tests.test_2.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_2.py:48: AssertionError\n_ TestCallbackAuthenticationPolicyDebugging.test_authenticated_userid_no_unauthenticated_userid _\n\nself = <r2e_tests.test_2.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_2.MyAuthenticationPolicy.a[77 chars]None' != 'pyramid.tests.test_authentication.MyAuthe[94 chars]None'\nE       - r2e_tests.test_2.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_2.py:37: AssertionError\n_ TestCallbackAuthenticationPolicyDebugging.test_authenticated_userid_with_callback_fail _\n\nself = <r2e_tests.test_2.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_2.MyAuthenticationPolicy.a[67 chars]None' != 'pyramid.tests.test_authentication.MyAuthe[84 chars]None'\nE       - r2e_tests.test_2.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_2.py:61: AssertionError\n_ TestCallbackAuthenticationPolicyDebugging.test_authenticated_userid_with_callback_success _\n\nself = <r2e_tests.test_2.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_2.MyAuthenticationPolicy.a[67 chars]red'\" != \"pyramid.tests.test_authentication.MyAuthe[84 chars]red'\"\nE       - r2e_tests.test_2.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_2.py:74: AssertionError\n_ TestCallbackAuthenticationPolicyDebugging.test_effective_principals_no_callback _\n\nself = <r2e_tests.test_2.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_2.MyAuthenticationPolicy.e[62 chars]s []' != 'pyramid.tests.test_authentication.MyAuthe[79 chars]s []'\nE       - r2e_tests.test_2.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_2.py:123: AssertionError\n_ TestCallbackAuthenticationPolicyDebugging.test_effective_principals_no_unauthenticated_userid _\n\nself = <r2e_tests.test_2.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_2.MyAuthenticationPolicy.e[84 chars]ne']\" != \"pyramid.tests.test_authentication.MyAuthe[101 chars]ne']\"\nE       - r2e_tests.test_2.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_2.py:110: AssertionError\n_ TestCallbackAuthenticationPolicyDebugging.test_effective_principals_with_callback_fail _\n\nself = <r2e_tests.test_2.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_2.MyAuthenticationPolicy.e[61 chars]oups' != 'pyramid.tests.test_authentication.MyAuthe[78 chars]oups'\nE       - r2e_tests.test_2.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_2.py:142: AssertionError\n_ TestCallbackAuthenticationPolicyDebugging.test_effective_principals_with_callback_success _\n\nself = <r2e_tests.test_2.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_2.MyAuthenticationPolicy.e[59 chars]oups' != 'pyramid.tests.test_authentication.MyAuthe[76 chars]oups'\nE       - r2e_tests.test_2.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_2.py:162: AssertionError\n_ TestCallbackAuthenticationPolicyDebugging.test_effective_principals_with_unclean_principal_Authenticated _\n\nself = <r2e_tests.test_2.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_2.MyAuthenticationPolicy.e[131 chars]None\" != \"pyramid.tests.test_authentication.MyAuthe[148 chars]None\"\nE       - r2e_tests.test_2.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_2.py:179: AssertionError\n_ TestCallbackAuthenticationPolicyDebugging.test_effective_principals_with_unclean_principal_Everyone _\n\nself = <r2e_tests.test_2.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_2.MyAuthenticationPolicy.e[126 chars]None\" != \"pyramid.tests.test_authentication.MyAuthe[143 chars]None\"\nE       - r2e_tests.test_2.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_2.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 0x775887a034c0>, <r2e_tests.test_config.test_adapters.DummyIface object at 0x775887a034c0>)\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 0x775887a034c0>, <r2e_tests.test_config.test_adapters.DummyIface object at 0x775887a034c0>), <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 0x7758876bab20>\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 0x7758876bab20>, <InterfaceClass pyramid.interfaces.ITraverser>, '')\n\n.venv/lib/python3.8/site-packages/zope/interface/registry.py:368: ComponentLookupError\n___ TestAssetsConfiguratorMixin.test_override_asset_directory_with_directory ___\n\nself = <r2e_tests.test_config.test_assets.TestAssetsConfiguratorMixin testMethod=test_override_asset_directory_with_directory>\n\n    def test_override_asset_directory_with_directory(self):\n        from pyramid.config.assets import PackageAssetSource\n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'pyramid.tests.test_config.pkgs.asset:templates/',\n            'pyramid.tests.test_config.pkgs.asset.subpackage:templates/',\n            _override=override)\n        from pyramid.tests.test_config.pkgs import asset\n        from pyramid.tests.test_config.pkgs.asset import subpackage\n        self.assertEqual(override.package, asset)\n        self.assertEqual(override.path, 'templates/')\n        source = override.source\n        self.assertTrue(isinstance(source, PackageAssetSource))\n        self.assertEqual(source.package, subpackage)\n        self.assertEqual(source.prefix, 'templates/')\n    \n        resource_name = 'bar.pt'\n        expected = os.path.join(here, 'pkgs', 'asset',\n                                'subpackage', 'templates', 'bar.pt')\n>       self.assertEqual(override.source.get_filename(resource_name),\n                         expected)\nE       AssertionError: '/hom[90 chars]904d/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]904d/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:106: AssertionError\n____ TestAssetsConfiguratorMixin.test_override_asset_directory_with_package ____\n\nself = <r2e_tests.test_config.test_assets.TestAssetsConfiguratorMixin testMethod=test_override_asset_directory_with_package>\n\n    def test_override_asset_directory_with_package(self):\n        from pyramid.config.assets import PackageAssetSource\n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'pyramid.tests.test_config.pkgs.asset:templates/',\n            'pyramid.tests.test_config.pkgs.asset.subpackage',\n            _override=override)\n        from pyramid.tests.test_config.pkgs import asset\n        from pyramid.tests.test_config.pkgs.asset import subpackage\n        self.assertEqual(override.package, asset)\n        self.assertEqual(override.path, 'templates/')\n        source = override.source\n        self.assertTrue(isinstance(source, PackageAssetSource))\n        self.assertEqual(source.package, subpackage)\n        self.assertEqual(source.prefix, '')\n    \n        resource_name = 'templates/bar.pt'\n        expected = os.path.join(here, 'pkgs', 'asset',\n                                'subpackage', 'templates', 'bar.pt')\n>       self.assertEqual(override.source.get_filename(resource_name),\n                         expected)\nE       AssertionError: '/hom[90 chars]904d/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]904d/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:129: AssertionError\n________ TestAssetsConfiguratorMixin.test_override_asset_file_with_file ________\n\nself = <r2e_tests.test_config.test_assets.TestAssetsConfiguratorMixin testMethod=test_override_asset_file_with_file>\n\n    def test_override_asset_file_with_file(self):\n        from pyramid.config.assets import PackageAssetSource\n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'pyramid.tests.test_config.pkgs.asset:templates/foo.pt',\n            'pyramid.tests.test_config.pkgs.asset.subpackage:templates/bar.pt',\n            _override=override)\n        from pyramid.tests.test_config.pkgs import asset\n        from pyramid.tests.test_config.pkgs.asset import subpackage\n        self.assertEqual(override.package, asset)\n        self.assertEqual(override.path, 'templates/foo.pt')\n        source = override.source\n        self.assertTrue(isinstance(source, PackageAssetSource))\n        self.assertEqual(source.package, subpackage)\n        self.assertEqual(source.prefix, 'templates/bar.pt')\n    \n        resource_name = ''\n        expected = os.path.join(here, 'pkgs', 'asset',\n                                'subpackage', 'templates', 'bar.pt')\n>       self.assertEqual(override.source.get_filename(resource_name),\n                         expected)\nE       AssertionError: '/hom[90 chars]904d/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]904d/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:60: AssertionError\n____ TestAssetsConfiguratorMixin.test_override_asset_package_with_directory ____\n\nself = <r2e_tests.test_config.test_assets.TestAssetsConfiguratorMixin testMethod=test_override_asset_package_with_directory>\n\n    def test_override_asset_package_with_directory(self):\n        from pyramid.config.assets import PackageAssetSource\n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'pyramid.tests.test_config.pkgs.asset',\n            'pyramid.tests.test_config.pkgs.asset.subpackage:templates/',\n            _override=override)\n        from pyramid.tests.test_config.pkgs import asset\n        from pyramid.tests.test_config.pkgs.asset import subpackage\n        self.assertEqual(override.package, asset)\n        self.assertEqual(override.path, '')\n        source = override.source\n        self.assertTrue(isinstance(source, PackageAssetSource))\n        self.assertEqual(source.package, subpackage)\n        self.assertEqual(source.prefix, 'templates/')\n    \n        resource_name = 'bar.pt'\n        expected = os.path.join(here, 'pkgs', 'asset',\n                                'subpackage', 'templates', 'bar.pt')\n>       self.assertEqual(override.source.get_filename(resource_name),\n                         expected)\nE       AssertionError: '/hom[90 chars]904d/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]904d/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:152: AssertionError\n_____ TestAssetsConfiguratorMixin.test_override_asset_package_with_package _____\n\nself = <r2e_tests.test_config.test_assets.TestAssetsConfiguratorMixin testMethod=test_override_asset_package_with_package>\n\n    def test_override_asset_package_with_package(self):\n        from pyramid.config.assets import PackageAssetSource\n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'pyramid.tests.test_config.pkgs.asset',\n            'pyramid.tests.test_config.pkgs.asset.subpackage',\n            _override=override)\n        from pyramid.tests.test_config.pkgs import asset\n        from pyramid.tests.test_config.pkgs.asset import subpackage\n        self.assertEqual(override.package, asset)\n        self.assertEqual(override.path, '')\n        source = override.source\n        self.assertTrue(isinstance(source, PackageAssetSource))\n        self.assertEqual(source.package, subpackage)\n        self.assertEqual(source.prefix, '')\n    \n        resource_name = 'templates/bar.pt'\n        expected = os.path.join(here, 'pkgs', 'asset',\n                                'subpackage', 'templates', 'bar.pt')\n>       self.assertEqual(override.source.get_filename(resource_name),\n                         expected)\nE       AssertionError: '/hom[90 chars]904d/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]904d/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:83: AssertionError\n_________ TestOverrideProvider.test_get_resource_filename_no_overrides _________\n\nself = <r2e_tests.test_config.test_assets.TestOverrideProvider testMethod=test_get_resource_filename_no_overrides>\n\n    def test_get_resource_filename_no_overrides(self):\n        resource_name = 'test_assets.py'\n        import pyramid.tests.test_config\n        provider = self._makeOne(pyramid.tests.test_config)\n        expected = os.path.join(here, resource_name)\n        result = provider.get_resource_filename(None, resource_name)\n>       self.assertEqual(result, expected)\nE       AssertionError: '/hom[73 chars]7bf3e14fda7d66b79904d/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]7bf3e14fda7d66b79904d/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:297: AssertionError\n____ TestOverrideProvider.test_get_resource_filename_override_returns_None _____\n\nself = <r2e_tests.test_config.test_assets.TestOverrideProvider testMethod=test_get_resource_filename_override_returns_None>\n\n    def test_get_resource_filename_override_returns_None(self):\n        overrides = DummyOverrides(None)\n        self._registerOverrides(overrides)\n        resource_name = 'test_assets.py'\n        import pyramid.tests.test_config\n        provider = self._makeOne(pyramid.tests.test_config)\n        expected = os.path.join(here, resource_name)\n        result = provider.get_resource_filename(None, resource_name)\n>       self.assertEqual(result, expected)\nE       AssertionError: '/hom[73 chars]7bf3e14fda7d66b79904d/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]7bf3e14fda7d66b79904d/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:345: AssertionError\n___________________ TestPackageAssetSource.test_get_filename ___________________\n\nself = <r2e_tests.test_config.test_assets.TestPackageAssetSource testMethod=test_get_filename>\n\n    def test_get_filename(self):\n        source = self._makeOne('')\n>       self.assertEqual(source.get_filename('test_assets.py'),\n                         os.path.join(here, 'test_assets.py'))\nE       AssertionError: '/hom[73 chars]7bf3e14fda7d66b79904d/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]7bf3e14fda7d66b79904d/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:716: AssertionError\n_____________ TestPackageAssetSource.test_get_filename_with_prefix _____________\n\nself = <r2e_tests.test_config.test_assets.TestPackageAssetSource testMethod=test_get_filename_with_prefix>\n\n    def test_get_filename_with_prefix(self):\n        source = self._makeOne('test_assets.py')\n>       self.assertEqual(source.get_filename(''),\n                         os.path.join(here, 'test_assets.py'))\nE       AssertionError: '/hom[73 chars]7bf3e14fda7d66b79904d/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]7bf3e14fda7d66b79904d/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:721: AssertionError\n_________ TestI18NConfiguratorMixin.test_add_translation_dirs_abspath __________\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_abspath>\n\n    def test_add_translation_dirs_abspath(self):\n        from pyramid.interfaces import ITranslationDirectories\n        config = self._makeOne(autocommit=True)\n>       config.add_translation_dirs(locale)\n\nr2e_tests/test_config/test_i18n.py:86: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \npyramid/util.py:570: in wrapper\n    result = wrapped(self, *arg, **kw)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <pyramid.config.Configurator object at 0x775887a1c610>\nspecs = ('/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/r2e_tests/pkgs/localeapp/locale',)\nintrospectables = []\nspec = '/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/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_2c27c33e45350d98f577bf3e14fda7d66b79904d/r2e_tests/pkgs/localeapp/locale\" is not a directory\n\npyramid/config/i18n.py:86: ConfigurationError\n________ TestI18NConfiguratorMixin.test_add_translation_dirs_asset_spec ________\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_asset_spec>\n\n    def test_add_translation_dirs_asset_spec(self):\n        from pyramid.interfaces import ITranslationDirectories\n        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale')\n>       self.assertEqual(config.registry.getUtility(ITranslationDirectories),\n                         [locale])\nE       AssertionError: Lists differ: ['/ho[70 chars]8f577bf3e14fda7d66b79904d/pyramid/tests/pkgs/localeapp/locale'] != ['/ho[70 chars]8f577bf3e14fda7d66b79904d/r2e_tests/pkgs/localeapp/locale']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]98f577bf3e14fda7d66b79904d/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]98f577bf3e14fda7d66b79904d/r2e_tests/pkgs/localeapp/locale'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/pyramid/tests/pkgs/localeapp/locale']\nE       ?                                                                                                      -- ^^^^^\nE       \nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/r2e_tests/pkgs/localeapp/locale']\nE       ?                                                                                                       ^^^\n\nr2e_tests/test_config/test_i18n.py:54: AssertionError\n_ TestI18NConfiguratorMixin.test_add_translation_dirs_asset_spec_existing_translation_dirs _\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_asset_spec_existing_translation_dirs>\n\n    def test_add_translation_dirs_asset_spec_existing_translation_dirs(self):\n        from pyramid.interfaces import ITranslationDirectories\n        config = self._makeOne(autocommit=True)\n        directories = ['abc']\n        config.registry.registerUtility(directories, ITranslationDirectories)\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale')\n        result = config.registry.getUtility(ITranslationDirectories)\n>       self.assertEqual(result, [locale, 'abc'])\nE       AssertionError: Lists differ: ['/ho[77 chars]3e14fda7d66b79904d/pyramid/tests/pkgs/localeapp/locale', 'abc'] != ['/ho[77 chars]3e14fda7d66b79904d/r2e_tests/pkgs/localeapp/locale', 'abc']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]98f577bf3e14fda7d66b79904d/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]98f577bf3e14fda7d66b79904d/r2e_tests/pkgs/localeapp/locale'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/pyramid/tests/pkgs/localeapp/locale',\nE       ?                                                                                                      -- ^^^^^\nE       \nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/r2e_tests/pkgs/localeapp/locale',\nE       ?                                                                                                       ^^^\nE       \nE          'abc']\n\nr2e_tests/test_config/test_i18n.py:64: AssertionError\n______ TestI18NConfiguratorMixin.test_add_translation_dirs_multiple_specs ______\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_multiple_specs>\n\n    def test_add_translation_dirs_multiple_specs(self):\n        from pyramid.interfaces import ITranslationDirectories\n        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale',\n                                    'pyramid.tests.pkgs.localeapp:locale2')\n>       self.assertEqual(config.registry.getUtility(ITranslationDirectories),\n                         [locale, locale2])\nE       AssertionError: Lists differ: ['/ho[91 chars]904d/pyramid/tests/pkgs/localeapp/locale', '/h[130 chars]le2'] != ['/ho[91 chars]904d/r2e_tests/pkgs/localeapp/locale', '/home/[122 chars]le2']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]98f577bf3e14fda7d66b79904d/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]98f577bf3e14fda7d66b79904d/r2e_tests/pkgs/localeapp/locale'\nE       \nE       Diff is 1002 characters long. Set self.maxDiff to None to see it.\n\nr2e_tests/test_config/test_i18n.py:71: AssertionError\n_ TestI18NConfiguratorMixin.test_add_translation_dirs_multiple_specs_multiple_calls _\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_multiple_specs_multiple_calls>\n\n    def test_add_translation_dirs_multiple_specs_multiple_calls(self):\n        from pyramid.interfaces import ITranslationDirectories\n        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale',\n                                    'pyramid.tests.pkgs.localeapp:locale2')\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale3')\n>       self.assertEqual(config.registry.getUtility(ITranslationDirectories),\n                         [locale3, locale, locale2])\nE       AssertionError: Lists differ: ['/ho[91 chars]904d/pyramid/tests/pkgs/localeapp/locale3', '/[269 chars]le2'] != ['/ho[91 chars]904d/r2e_tests/pkgs/localeapp/locale3', '/home[257 chars]le2']\nE       \nE       First differing element 0:\nE       '/hom[69 chars]8f577bf3e14fda7d66b79904d/pyramid/tests/pkgs/localeapp/locale3'\nE       '/hom[69 chars]8f577bf3e14fda7d66b79904d/r2e_tests/pkgs/localeapp/locale3'\nE       \nE       Diff is 1504 characters long. Set self.maxDiff to None to see it.\n\nr2e_tests/test_config/test_i18n.py:80: AssertionError\n___________________ ConfiguratorTests.test_ctor_no_registry ____________________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_ctor_no_registry>\n\n    def test_ctor_no_registry(self):\n        import sys\n        from pyramid.interfaces import ISettings\n        from pyramid.config import Configurator\n        from pyramid.interfaces import IRendererFactory\n        config = Configurator()\n        this_pkg = sys.modules['pyramid.tests.test_config']\n        self.assertTrue(config.registry.getUtility(ISettings))\n>       self.assertEqual(config.package, this_pkg)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_init.py: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:124: AssertionError\n_____________ ConfiguratorTests.test_include_constant_root_package _____________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_include_constant_root_package>\n\n    def test_include_constant_root_package(self):\n        from pyramid import tests\n        from pyramid.tests import test_config\n        config = self._makeOne(root_package=tests)\n        results = {}\n        def include(config):\n            results['package'] = config.package\n            results['root_package'] = config.root_package\n        config.include(include)\n        self.assertEqual(results['root_package'], tests)\n>       self.assertEqual(results['package'], test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_init.py:777: 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:1039: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \npyramid/config/__init__.py:652: in commit\n    self.action_state.execute_actions(introspector=self.introspector)\npyramid/config/__init__.py:1161: in execute_actions\n    action = next(pending_actions, None)\npyramid/config/__init__.py:1119: in resume\n    for a, b in zip_longest(actions, executed_actions):\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nactions = [{'args': (), 'callable': <function ViewsConfiguratorMixin.add_view.<locals>.register at 0x7758876ceca0>, 'discriminat...58870a4160>, 'discriminator': ('view', None, 'two', None, 'd41d8cd98f00b204e9800998ecf8427e'), 'includepath': (), ...}]\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 or  # not a prefix\n                            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_2c27c33e45350d98f577bf3e14fda7d66b79904d/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_2c27c33e45350d98f577bf3e14fda7d66b79904d/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_2c27c33e45350d98f577bf3e14fda7d66b79904d/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_2c27c33e45350d98f577bf3e14fda7d66b79904d/pyramid/tests/test_config/pkgs/selfscan/another.py:\nE                       def two(request):\n\npyramid/config/__init__.py:1297: 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:1048: 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:444: 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:1247: 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:1234: 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:1221: 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:1260: AssertionError\n_________ TestConfigurator__add_predicate.test_factory_as_dotted_name __________\n\nself = <r2e_tests.test_config.test_init.TestConfigurator__add_predicate testMethod=test_factory_as_dotted_name>\n\n    def test_factory_as_dotted_name(self):\n        config = self._makeOne()\n    \n        def _fakeAction(discriminator, callable=None, args=(),\n                        kw=None, order=0, introspectables=(), **extra):\n            self.assertEqual(len(introspectables), 1)\n            self.assertEqual(introspectables[0]['name'], 'testing')\n            self.assertEqual(introspectables[0]['factory'], DummyPredicate)\n    \n        config.action = _fakeAction\n>       config._add_predicate(\n            'route',\n            'testing',\n            'pyramid.tests.test_config.test_init.DummyPredicate'\n            )\n\nr2e_tests/test_config/test_init.py:1324: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \npyramid/config/__init__.py:541: in _add_predicate\n    self.action(discriminator, register, introspectables=(intr,),\nr2e_tests/test_config/test_init.py:1321: in _fakeAction\n    self.assertEqual(introspectables[0]['factory'], DummyPredicate)\nE   AssertionError: <class 'pyramid.tests.test_config.test_init.DummyPredicate'> != <class 'r2e_tests.test_config.test_init.DummyPredicate'>\n____ TestViewsConfigurationMixin.test_add_static_view_package_here_relative ____\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_static_view_package_here_relative>\n\n    def test_add_static_view_package_here_relative(self):\n        from pyramid.interfaces import IStaticURLInfo\n        info = DummyStaticURLInfo()\n        config = self._makeOne(autocommit=True)\n        config.registry.registerUtility(info, IStaticURLInfo)\n        config.add_static_view('static', 'files')\n>       self.assertEqual(\n            info.added,\n            [(config, 'static', 'pyramid.tests.test_config:files', {})])\nE       AssertionError: Lists differ: [(<py[39 chars]7588726e280>, 'static', 'r2e_tests.test_config:files', {})] != [(<py[39 chars]7588726e280>, 'static', 'pyramid.tests.test_config:files', {})]\nE       \nE       First differing element 0:\nE       (<pyr[37 chars]77588726e280>, 'static', 'r2e_tests.test_config:files', {})\nE       (<pyr[37 chars]77588726e280>, 'static', 'pyramid.tests.test_config:files', {})\nE       \nE         [(<pyramid.config.Configurator object at 0x77588726e280>,\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:1841: AssertionError\n_______ TestViewsConfigurationMixin.test_add_view_with_template_renderer _______\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_with_template_renderer>\n\n    def test_add_view_with_template_renderer(self):\n        from pyramid.tests import test_config\n        from pyramid.interfaces import ISettings\n        class view(object):\n            def __init__(self, context, request):\n                self.request = request\n                self.context = context\n    \n            def __call__(self):\n                return {'a':'1'}\n        config = self._makeOne(autocommit=True)\n        renderer = self._registerRenderer(config)\n        fixture = 'pyramid.tests.test_config:files/minimal.txt'\n        config.introspection = False\n        config.add_view(view=view, renderer=fixture)\n        wrapper = self._getViewCallable(config)\n        request = self._makeRequest(config)\n        result = wrapper(None, request)\n        self.assertEqual(result.body, b'Hello!')\n        settings = config.registry.queryUtility(ISettings)\n        result = renderer.info\n        self.assertEqual(result.registry, config.registry)\n        self.assertEqual(result.type, '.txt')\n>       self.assertEqual(result.package, test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_views.py:1142: AssertionError\n_ TestViewsConfigurationMixin.test_add_view_with_template_renderer_no_callable _\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_with_template_renderer_no_callable>\n\n    def test_add_view_with_template_renderer_no_callable(self):\n        from pyramid.tests import test_config\n        from pyramid.interfaces import ISettings\n        config = self._makeOne(autocommit=True)\n        renderer = self._registerRenderer(config)\n        fixture = 'pyramid.tests.test_config:files/minimal.txt'\n        config.introspection = False\n        config.add_view(view=None, renderer=fixture)\n        wrapper = self._getViewCallable(config)\n        request = self._makeRequest(config)\n        result = wrapper(None, request)\n        self.assertEqual(result.body, b'Hello!')\n        settings = config.registry.queryUtility(ISettings)\n        result = renderer.info\n        self.assertEqual(result.registry, config.registry)\n        self.assertEqual(result.type, '.txt')\n>       self.assertEqual(result.package, test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_views.py:1183: 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:2506: \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:411: 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:2508: 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:2525: \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:411: 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:2527: 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:2546: \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 0x775886aa4e50> 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:411: 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:2549: 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:2592: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = None\nrequest = <r2e_tests.test_config.test_views.DummyRequest object at 0x775887043c10>\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:411: 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:2594: 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:2616: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = None\nrequest = <r2e_tests.test_config.test_views.DummyRequest object at 0x77588739ca30>\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:411: 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:2618: 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:4139: AssertionError\n_______________ TestPRequestCommand.test_command_display_headers _______________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_display_headers>\n\n    def test_command_display_headers(self):\n        command = self._makeOne(\n            ['', '--display-headers', 'development.ini', '/'])\n        command.run()\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(\n            self._out,\n            ['200 OK', 'Content-Type: text/html; charset=UTF-8', 'abc'])\nE       AssertionError: Lists differ: ['200 OK', b'abc'] != ['200 OK', 'Content-Type: text/html; charset=UTF-8', 'abc']\nE       \nE       First differing element 1:\nE       b'abc'\nE       'Content-Type: text/html; charset=UTF-8'\nE       \nE       Second list contains 1 additional elements.\nE       First extra element 2:\nE       'abc'\nE       \nE       - ['200 OK', b'abc']\nE       + ['200 OK', 'Content-Type: text/html; charset=UTF-8', 'abc']\n\nr2e_tests/test_scripts/test_prequest.py:202: AssertionError\n_________ TestPRequestCommand.test_command_has_content_type_header_var _________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_has_content_type_header_var>\n\n    def test_command_has_content_type_header_var(self):\n        command = self._makeOne(\n            ['', '--header=content-type:app/foo','development.ini', '/'])\n        command.run()\n        self.assertEqual(self._environ['CONTENT_TYPE'], 'app/foo')\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:92: AssertionError\n_____________ TestPRequestCommand.test_command_has_good_header_var _____________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_has_good_header_var>\n\n    def test_command_has_good_header_var(self):\n        command = self._makeOne(\n            ['', '--header=name:value','development.ini', '/'])\n        command.run()\n        self.assertEqual(self._environ['HTTP_NAME'], 'value')\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:69: AssertionError\n__________ TestPRequestCommand.test_command_has_multiple_header_vars ___________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_has_multiple_header_vars>\n\n    def test_command_has_multiple_header_vars(self):\n        command = self._makeOne(\n            ['',\n             '--header=name:value',\n             '--header=name2:value2',\n             'development.ini',\n             '/'])\n        command.run()\n        self.assertEqual(self._environ['HTTP_NAME'], 'value')\n        self.assertEqual(self._environ['HTTP_NAME2'], 'value2')\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:107: AssertionError\n_________________ TestPRequestCommand.test_command_method_get __________________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_method_get>\n\n    def test_command_method_get(self):\n        command = self._makeOne(['', '--method=GET', 'development.ini', '/'])\n        command.run()\n        self.assertEqual(self._environ['REQUEST_METHOD'], 'GET')\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:116: AssertionError\n_______________ TestPRequestCommand.test_command_method_options ________________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_method_options>\n\n    def test_command_method_options(self):\n        from pyramid.compat import NativeIO\n        command = self._makeOne(['', '--method=OPTIONS', 'development.ini',\n                                '/'])\n        stdin = NativeIO()\n        command.stdin = stdin\n        command.run()\n        self.assertEqual(self._environ['REQUEST_METHOD'], 'OPTIONS')\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:184: AssertionError\n________________ TestPRequestCommand.test_command_method_patch _________________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_method_patch>\n\n    def test_command_method_patch(self):\n        from pyramid.compat import NativeIO\n        command = self._makeOne(['', '--method=PATCH', 'development.ini', '/'])\n        stdin = NativeIO()\n        command.stdin = stdin\n        command.run()\n        self.assertEqual(self._environ['REQUEST_METHOD'], 'PATCH')\n        self.assertEqual(self._environ['CONTENT_LENGTH'], '-1')\n        self.assertEqual(self._environ['wsgi.input'], stdin)\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:158: AssertionError\n_________________ TestPRequestCommand.test_command_method_post _________________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_method_post>\n\n    def test_command_method_post(self):\n        from pyramid.compat import NativeIO\n        command = self._makeOne(['', '--method=POST', 'development.ini', '/'])\n        stdin = NativeIO()\n        command.stdin = stdin\n        command.run()\n        self.assertEqual(self._environ['REQUEST_METHOD'], 'POST')\n        self.assertEqual(self._environ['CONTENT_LENGTH'], '-1')\n        self.assertEqual(self._environ['wsgi.input'], stdin)\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:130: AssertionError\n_______________ TestPRequestCommand.test_command_method_propfind _______________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_method_propfind>\n\n    def test_command_method_propfind(self):\n        from pyramid.compat import NativeIO\n        command = self._makeOne(['', '--method=PROPFIND', 'development.ini',\n                                '/'])\n        stdin = NativeIO()\n        command.stdin = stdin\n        command.run()\n        self.assertEqual(self._environ['REQUEST_METHOD'], 'PROPFIND')\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:171: AssertionError\n_________________ TestPRequestCommand.test_command_method_put __________________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_method_put>\n\n    def test_command_method_put(self):\n        from pyramid.compat import NativeIO\n        command = self._makeOne(['', '--method=PUT', 'development.ini', '/'])\n        stdin = NativeIO()\n        command.stdin = stdin\n        command.run()\n        self.assertEqual(self._environ['REQUEST_METHOD'], 'PUT')\n        self.assertEqual(self._environ['CONTENT_LENGTH'], '-1')\n        self.assertEqual(self._environ['wsgi.input'], stdin)\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:144: AssertionError\n________ TestPRequestCommand.test_command_path_doesnt_start_with_slash _________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_path_doesnt_start_with_slash>\n\n    def test_command_path_doesnt_start_with_slash(self):\n        command = self._makeOne(['', 'development.ini', 'abc'])\n        command.run()\n        self.assertEqual(self._path_info, '/abc')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:50: AssertionError\n__________________ TestPRequestCommand.test_command_two_args ___________________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_two_args>\n\n    def test_command_two_args(self):\n        command = self._makeOne(['', 'development.ini', '/'])\n        command.run()\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:42: AssertionError\n________________ TestPRequestCommand.test_command_w_basic_auth _________________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_w_basic_auth>\n\n    def test_command_w_basic_auth(self):\n        command = self._makeOne(\n            ['', '--login=user:password',\n                 '--header=name:value','development.ini', '/'])\n        command.run()\n        self.assertEqual(self._environ['HTTP_NAME'], 'value')\n        self.assertEqual(self._environ['HTTP_AUTHORIZATION'],\n                        'Basic dXNlcjpwYXNzd29yZA==')\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:82: AssertionError\n______________ TestPRequestCommand.test_command_with_query_string ______________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_with_query_string>\n\n    def test_command_with_query_string(self):\n        command = self._makeOne(['', 'development.ini', '/abc?a=1&b=2&c'])\n        command.run()\n        self.assertEqual(self._environ['QUERY_STRING'], 'a=1&b=2&c')\n        self.assertEqual(self._path_info, '/abc')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:193: AssertionError\n_______________ TestPRoutesCommand.test_config_format_ini_commas _______________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_config_format_ini_commas>\n\n    def test_config_format_ini_commas(self):\n        from pyramid.renderers import null_renderer as nr\n        from pyramid.config import not_\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method=not_('POST')\n        )\n    \n        command = self._makeOne()\n    \n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        config_factory = dummy.DummyConfigParserFactory()\n        command.ConfigParser = config_factory\n        config_factory.items = [('format', 'method,name')]\n    \n        result = command.run()\n>       self.assertEqual(result, 0)\nE       AssertionError: 2 != 0\n\nr2e_tests/test_scripts/test_proutes.py:726: AssertionError\n______________ TestPRoutesCommand.test_config_format_ini_newlines ______________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_config_format_ini_newlines>\n\n    def test_config_format_ini_newlines(self):\n        from pyramid.renderers import null_renderer as nr\n        from pyramid.config import not_\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method=not_('POST')\n        )\n    \n        command = self._makeOne()\n    \n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        config_factory = dummy.DummyConfigParserFactory()\n        command.ConfigParser = config_factory\n        config_factory.items = [('format', 'method\\nname')]\n    \n        result = command.run()\n>       self.assertEqual(result, 0)\nE       AssertionError: 2 != 0\n\nr2e_tests/test_scripts/test_proutes.py:660: AssertionError\n_______________ TestPRoutesCommand.test_config_format_ini_spaces _______________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_config_format_ini_spaces>\n\n    def test_config_format_ini_spaces(self):\n        from pyramid.renderers import null_renderer as nr\n        from pyramid.config import not_\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method=not_('POST')\n        )\n    \n        command = self._makeOne()\n    \n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        config_factory = dummy.DummyConfigParserFactory()\n        command.ConfigParser = config_factory\n        config_factory.items = [('format', 'method name')]\n    \n        result = command.run()\n>       self.assertEqual(result, 0)\nE       AssertionError: 2 != 0\n\nr2e_tests/test_scripts/test_proutes.py:693: AssertionError\n_________ TestPRoutesCommand.test_one_route_all_methods_view_only_post _________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_one_route_all_methods_view_only_post>\n\n    def test_one_route_all_methods_view_only_post(self):\n        from pyramid.renderers import null_renderer as nr\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method='POST'\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo', '/a/b',\n            'pyramid.tests.test_scripts.test_proutes.view1', 'POST'\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST'] != ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'POST']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'pyramid.tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST']\nE       ?                   ^^^\nE       \nE       + ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'POST']\nE       ?                  ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:309: AssertionError\n_________ TestPRoutesCommand.test_one_route_only_post_view_all_methods _________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_one_route_only_post_view_all_methods>\n\n    def test_one_route_only_post_view_all_methods(self):\n        from pyramid.renderers import null_renderer as nr\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b', request_method='POST')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo', '/a/b',\n            'pyramid.tests.test_scripts.test_proutes.view1', 'POST'\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST'] != ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'POST']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'pyramid.tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST']\nE       ?                   ^^^\nE       \nE       + ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'POST']\nE       ?                  ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:336: AssertionError\n________ TestPRoutesCommand.test_one_route_only_post_view_post_and_get _________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_one_route_only_post_view_post_and_get>\n\n    def test_one_route_only_post_view_post_and_get(self):\n        from pyramid.renderers import null_renderer as nr\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b', request_method='POST')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method=('POST', 'GET')\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo', '/a/b',\n            'pyramid.tests.test_scripts.test_proutes.view1', 'POST'\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST'] != ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'POST']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'pyramid.tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST']\nE       ?                   ^^^\nE       \nE       + ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'POST']\nE       ?                  ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:364: AssertionError\n_____ TestPRoutesCommand.test_one_route_with_long_name_one_view_registered _____\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_one_route_with_long_name_one_view_registered>\n\n    def test_one_route_with_long_name_one_view_registered(self):\n        from zope.interface import Interface\n        from pyramid.interfaces import IRouteRequest\n        from pyramid.interfaces import IViewClassifier\n        from pyramid.interfaces import IView\n        registry = self._makeRegistry()\n    \n        def view():pass\n    \n        class IMyRoute(Interface):\n            pass\n    \n        registry.registerAdapter(\n            view,\n            (IViewClassifier, IMyRoute, Interface),\n            IView, ''\n        )\n    \n        registry.registerUtility(IMyRoute, IRouteRequest,\n                                 name='very_long_name_123')\n    \n        command = self._makeOne()\n        route = dummy.DummyRoute(\n            'very_long_name_123',\n            '/and_very_long_pattern_as_well'\n        )\n        mapper = dummy.DummyMapper(route)\n        command._get_mapper = lambda *arg: mapper\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()[:3]\n>       self.assertEqual(\n            compare_to,\n            ['very_long_name_123',\n             '/and_very_long_pattern_as_well',\n             'pyramid.tests.test_scripts.test_proutes.view']\n        )\nE       AssertionError: Lists differ: ['ver[36 chars]ttern_as_well', 'r2e_tests.test_scripts.test_proutes.view'] != ['ver[36 chars]ttern_as_well', 'pyramid.tests.test_scripts.test_proutes.view']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view'\nE       'pyramid.tests.test_scripts.test_proutes.view'\nE       \nE         ['very_long_name_123',\nE          '/and_very_long_pattern_as_well',\nE       -  'r2e_tests.test_scripts.test_proutes.view']\nE       ?    ^^^\nE       \nE       +  'pyramid.tests.test_scripts.test_proutes.view']\nE       ?   ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:195: AssertionError\n______ TestPRoutesCommand.test_route_is_get_view_request_method_not_post _______\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_route_is_get_view_request_method_not_post>\n\n    def test_route_is_get_view_request_method_not_post(self):\n        from pyramid.renderers import null_renderer as nr\n        from pyramid.config import not_\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b', request_method='GET')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method=not_('POST')\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo', '/a/b',\n            'pyramid.tests.test_scripts.test_proutes.view1',\n            'GET'\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'GET'] != ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'GET']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'pyramid.tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'GET']\nE       ?                   ^^^\nE       \nE       + ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'GET']\nE       ?                  ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:503: AssertionError\n____________ TestPRoutesCommand.test_route_request_method_mismatch _____________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_route_request_method_mismatch>\n\n    def test_route_request_method_mismatch(self):\n        from pyramid.renderers import null_renderer as nr\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b', request_method='POST')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method='GET'\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo', '/a/b',\n            'pyramid.tests.test_scripts.test_proutes.view1',\n            '<route', 'mismatch>'\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1[20 chars]ch>'] != ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.v[24 chars]ch>']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'pyramid.tests.test_scripts.test_proutes.view1'\nE       \nE         ['foo',\nE          '/a/b',\nE       -  'r2e_tests.test_scripts.test_proutes.view1',\nE       ?    ^^^\nE       \nE       +  'pyramid.tests.test_scripts.test_proutes.view1',\nE       ?   ++ ^^^^^\nE       \nE          '<route',\nE          'mismatch>']\n\nr2e_tests/test_scripts/test_proutes.py:393: AssertionError\n__________________ TestPRoutesCommand.test_route_static_views __________________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_route_static_views>\n\n    def test_route_static_views(self):\n        from pyramid.renderers import null_renderer as nr\n        config = self._makeConfig(autocommit=True)\n        config.add_static_view('static', 'static', cache_max_age=3600)\n        config.add_static_view(name='static2', path='/var/www/static')\n        config.add_static_view(\n            name='pyramid_scaffold',\n            path='pyramid:scaffolds/starter/+package+/static'\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 5)\n    \n        expected = [\n            ['__static/', '/static/*subpath',\n             'pyramid.tests.test_scripts:static/', '*'],\n            ['__static2/', '/static2/*subpath', '/var/www/static/', '*'],\n            ['__pyramid_scaffold/', '/pyramid_scaffold/*subpath',\n             'pyramid:scaffolds/starter/+package+/static/',  '*'],\n        ]\n    \n        for index, line in enumerate(L[2:]):\n            data = line.split()\n>           self.assertEqual(data, expected[index])\nE           AssertionError: Lists differ: ['__static/', '/static/*subpath', 'r2e_tests.test_scripts:static/', '*'] != ['__static/', '/static/*subpath', 'pyramid.tests.test_scripts:static/', '*']\nE           \nE           First differing element 2:\nE           'r2e_tests.test_scripts:static/'\nE           'pyramid.tests.test_scripts:static/'\nE           \nE           - ['__static/', '/static/*subpath', 'r2e_tests.test_scripts:static/', '*']\nE           ?                                     ^^^\nE           \nE           + ['__static/', '/static/*subpath', 'pyramid.tests.test_scripts:static/', '*']\nE           ?                                    ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:423: AssertionError\n___________ TestPRoutesCommand.test_single_route_one_view_registered ___________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_single_route_one_view_registered>\n\n    def test_single_route_one_view_registered(self):\n        from zope.interface import Interface\n        from pyramid.interfaces import IRouteRequest\n        from pyramid.interfaces import IViewClassifier\n        from pyramid.interfaces import IView\n        registry = self._makeRegistry()\n    \n        def view():pass\n        class IMyRoute(Interface):\n            pass\n        registry.registerAdapter(view,\n                                 (IViewClassifier, IMyRoute, Interface),\n                                 IView, '')\n        registry.registerUtility(IMyRoute, IRouteRequest, name='a')\n        command = self._makeOne()\n        route = dummy.DummyRoute('a', '/a')\n        mapper = dummy.DummyMapper(route)\n        command._get_mapper = lambda *arg: mapper\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()[:3]\n>       self.assertEqual(\n            compare_to,\n            ['a', '/a', 'pyramid.tests.test_scripts.test_proutes.view']\n        )\nE       AssertionError: Lists differ: ['a', '/a', 'r2e_tests.test_scripts.test_proutes.view'] != ['a', '/a', 'pyramid.tests.test_scripts.test_proutes.view']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view'\nE       'pyramid.tests.test_scripts.test_proutes.view'\nE       \nE       - ['a', '/a', 'r2e_tests.test_scripts.test_proutes.view']\nE       ?               ^^^\nE       \nE       + ['a', '/a', 'pyramid.tests.test_scripts.test_proutes.view']\nE       ?              ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:155: AssertionError\n______________________ TestPRoutesCommand.test_view_glob _______________________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_view_glob>\n\n    def test_view_glob(self):\n        from pyramid.renderers import null_renderer as nr\n        from pyramid.config import not_\n    \n        def view1(context, request): return 'view1'\n        def view2(context, request): return 'view2'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method=not_('POST')\n        )\n    \n        config.add_route('bar', '/b/a')\n        config.add_view(\n            route_name='bar',\n            view=view2,\n            renderer=nr,\n            request_method=not_('POST')\n        )\n    \n        command = self._makeOne()\n        command.options.glob = '*foo*'\n    \n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo', '/a/b',\n            'pyramid.tests.test_scripts.test_proutes.view1',\n            '!POST,*'\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', '!POST,*'] != ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', '!POST,*']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'pyramid.tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', '!POST,*']\nE       ?                   ^^^\nE       \nE       + ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', '!POST,*']\nE       ?                  ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:574: AssertionError\n_____________ TestPRoutesCommand.test_view_request_method_not_post _____________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_view_request_method_not_post>\n\n    def test_view_request_method_not_post(self):\n        from pyramid.renderers import null_renderer as nr\n        from pyramid.config import not_\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method=not_('POST')\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo', '/a/b',\n            'pyramid.tests.test_scripts.test_proutes.view1',\n            '!POST,*'\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', '!POST,*'] != ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', '!POST,*']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'pyramid.tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', '!POST,*']\nE       ?                   ^^^\nE       \nE       + ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', '!POST,*']\nE       ?                  ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:533: AssertionError\n_____ TestPViewsCommand.test_views_command_single_view_function_traversal ______\n\nself = <r2e_tests.test_scripts.test_pviews.TestPViewsCommand testMethod=test_views_command_single_view_function_traversal>\n\n    def test_views_command_single_view_function_traversal(self):\n        from pyramid.registry import Registry\n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n        def view(): pass\n        view.__request_attrs__ = {'context': 'context', 'view_name': 'a'}\n        command._find_view = lambda arg1: view\n        command.args = ('/foo/bar/myapp.ini#myapp', '/a')\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(L[1], 'URL = /a')\n        self.assertEqual(L[3], '    context: context')\n        self.assertEqual(L[4], '    view name: a')\n>       self.assertEqual(L[8],\n                         '    pyramid.tests.test_scripts.test_pviews.view')\nE       AssertionError: '    r2e_tests.test_scripts.test_pviews.view' != '    pyramid.tests.test_scripts.test_pviews.view'\nE       -     r2e_tests.test_scripts.test_pviews.view\nE       ?      ^^^\nE       +     pyramid.tests.test_scripts.test_pviews.view\nE       ?     ++ ^^^^^\n\nr2e_tests/test_scripts/test_pviews.py:296: AssertionError\n==================================== PASSES ====================================\n=========================== short test summary info ============================\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test__set_cookie_cookieval_too_long\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test__set_cookie_on_exception\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test__set_cookie_on_exception_no_request_exception\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test__set_cookie_options\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test__set_cookie_real_webob_response\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_changed\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_cookie_is_set\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_cookie_max_age_invalid\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_ctor_no_cookie\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_ctor_with_bad_cookie_cannot_deserialize\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_ctor_with_bad_cookie_not_tuple\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_ctor_with_cookie_expired\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_ctor_with_cookie_still_valid\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_flash_allow_duplicate_false\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_flash_allow_duplicate_false_and_msg_not_in_storage\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_flash_allow_duplicate_true_and_msg_not_in_storage\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_flash_default\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_flash_mixed\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_get_csrf_token\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_get_csrf_token_new\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_instance_conforms\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_invalidate\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_new_csrf_token\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_no_set_cookie_with_exception\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_peek_flash_default_queue\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_peek_flash_nodefault_queue\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_pop_flash_default_queue\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_pop_flash_nodefault_queue\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_reissue_invalid\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_reissue_never\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_reissue_not_triggered\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_reissue_str_triggered\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_reissue_triggered\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_set_cookie_with_exception\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_timeout\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_timeout_invalid\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_timeout_never\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_timeout_str\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test__set_cookie_cookieval_too_long\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test__set_cookie_on_exception\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test__set_cookie_on_exception_no_request_exception\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test__set_cookie_options\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test__set_cookie_real_webob_response\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_changed\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_cookie_is_set\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_cookie_max_age_invalid\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_ctor_no_cookie\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_ctor_with_bad_cookie_cannot_deserialize\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_ctor_with_bad_cookie_not_tuple\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_ctor_with_cookie_expired\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_ctor_with_cookie_still_valid\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_custom_hashalg\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_custom_salt\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_custom_serializer\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_flash_allow_duplicate_false\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_flash_allow_duplicate_false_and_msg_not_in_storage\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_flash_allow_duplicate_true_and_msg_not_in_storage\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_flash_default\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_flash_mixed\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_get_csrf_token\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_get_csrf_token_new\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_hashalg_mismatch\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_instance_conforms\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_invalid_data_size\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_invalidate\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_new_csrf_token\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_no_set_cookie_with_exception\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_peek_flash_default_queue\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_peek_flash_nodefault_queue\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_pop_flash_default_queue\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_pop_flash_nodefault_queue\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_reissue_invalid\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_reissue_never\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_reissue_not_triggered\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_reissue_str_triggered\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_reissue_triggered\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_salt_mismatch\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_secret_mismatch\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_set_cookie_with_exception\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_timeout\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_timeout_invalid\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_timeout_never\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_timeout_str\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_very_long_key\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test__set_cookie_cookieval_too_long\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test__set_cookie_on_exception\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test__set_cookie_on_exception_no_request_exception\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test__set_cookie_options\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test__set_cookie_real_webob_response\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_changed\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_cookie_is_set\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_ctor_no_cookie\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_ctor_with_bad_cookie_cannot_deserialize\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_ctor_with_bad_cookie_not_tuple\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_ctor_with_cookie_expired\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_ctor_with_cookie_still_valid\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_deserialize_option\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_flash_allow_duplicate_false\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_flash_allow_duplicate_false_and_msg_not_in_storage\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_flash_allow_duplicate_true_and_msg_not_in_storage\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_flash_default\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_flash_mixed\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_get_csrf_token\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_get_csrf_token_new\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_instance_conforms\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_invalidate\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_new_csrf_token\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_no_set_cookie_with_exception\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_peek_flash_default_queue\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_peek_flash_nodefault_queue\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_pop_flash_default_queue\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_pop_flash_nodefault_queue\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_reissue_triggered\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_serialize_option\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_set_cookie_with_exception\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_timeout\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_timeout_invalid\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_timeout_never\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_timeout_str\nPASSED r2e_tests/test_1.py::Test_manage_accessed::test_accessed_set\nPASSED r2e_tests/test_1.py::Test_manage_accessed::test_accessed_without_renew\nPASSED r2e_tests/test_1.py::Test_manage_accessed::test_already_dirty\nPASSED r2e_tests/test_1.py::Test_manage_changed::test_it\nPASSED r2e_tests/test_1.py::Test_signed_serialize::test_it\nPASSED r2e_tests/test_1.py::Test_signed_serialize::test_it_with_highorder_secret\nPASSED r2e_tests/test_1.py::Test_signed_serialize::test_it_with_latin1_secret\nPASSED r2e_tests/test_1.py::Test_signed_deserialize::test_invalid_bits\nPASSED r2e_tests/test_1.py::Test_signed_deserialize::test_invalid_len\nPASSED r2e_tests/test_1.py::Test_signed_deserialize::test_it\nPASSED r2e_tests/test_1.py::Test_signed_deserialize::test_it_bad_encoding\nPASSED r2e_tests/test_1.py::Test_signed_deserialize::test_it_with_highorder_secret\nPASSED r2e_tests/test_1.py::Test_signed_deserialize::test_it_with_latin1_secret\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_authenticated_userid\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_authenticated_userid_None\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_authenticated_userid_repoze_who_userid_is_None\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_authenticated_userid_unclean_principal_Authenticated\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_authenticated_userid_unclean_principal_Everyone\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_authenticated_userid_with_callback_returns_None\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_authenticated_userid_with_callback_returns_something\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_class_implements_IAuthenticationPolicy\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_effective_principals_None\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_effective_principals_repoze_who_userid_is_None\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_effective_principals_repoze_who_userid_is_unclean_Authenticated\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_effective_principals_repoze_who_userid_is_unclean_Everyone\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_effective_principals_userid_and_groups\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_effective_principals_userid_callback_returns_None\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_effective_principals_userid_only\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_forget\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_forget_no_plugins\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_instance_implements_IAuthenticationPolicy\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_remember\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_remember_kwargs\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_remember_no_plugins\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_unauthenticated_userid\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_unauthenticated_userid_returns_None\nPASSED r2e_tests/test_2.py::TestRemoteUserAuthenticationPolicy::test_authenticated_userid\nPASSED r2e_tests/test_2.py::TestRemoteUserAuthenticationPolicy::test_authenticated_userid_None\nPASSED r2e_tests/test_2.py::TestRemoteUserAuthenticationPolicy::test_class_implements_IAuthenticationPolicy\nPASSED r2e_tests/test_2.py::TestRemoteUserAuthenticationPolicy::test_effective_principals\nPASSED r2e_tests/test_2.py::TestRemoteUserAuthenticationPolicy::test_effective_principals_None\nPASSED r2e_tests/test_2.py::TestRemoteUserAuthenticationPolicy::test_forget\nPASSED r2e_tests/test_2.py::TestRemoteUserAuthenticationPolicy::test_instance_implements_IAuthenticationPolicy\nPASSED r2e_tests/test_2.py::TestRemoteUserAuthenticationPolicy::test_remember\nPASSED r2e_tests/test_2.py::TestRemoteUserAuthenticationPolicy::test_unauthenticated_userid\nPASSED r2e_tests/test_2.py::TestRemoteUserAuthenticationPolicy::test_unauthenticated_userid_returns_None\nPASSED r2e_tests/test_2.py::TestAuthTktAuthenticationPolicy::test_allargs\nPASSED r2e_tests/test_2.py::TestAuthTktAuthenticationPolicy::test_authenticated_userid\nPASSED r2e_tests/test_2.py::TestAuthTktAuthenticationPolicy::test_authenticated_userid_callback_returns_None\nPASSED r2e_tests/test_2.py::TestAuthTktAuthenticationPolicy::test_authenticated_userid_no_cookie_identity\nPASSED r2e_tests/test_2.py::TestAuthTktAuthenticationPolicy::test_class_implements_IAuthenticationPolicy\nPASSED r2e_tests/test_2.py::TestAuthTktAuthenticationPolicy::test_effective_principals\nPASSED r2e_tests/test_2.py::TestAuthTktAuthenticationPolicy::test_effective_principals_callback_returns_None\nPASSED r2e_tests/test_2.py::TestAuthTktAuthenticationPolicy::test_effective_principals_no_cookie_identity\nPASSED r2e_tests/test_2.py::TestAuthTktAuthenticationPolicy::test_forget\nPASSED r2e_tests/test_2.py::TestAuthTktAuthenticationPolicy::test_hashalg_override\nPASSED r2e_tests/test_2.py::TestAuthTktAuthenticationPolicy::test_instance_implements_IAuthenticationPolicy\nPASSED r2e_tests/test_2.py::TestAuthTktAuthenticationPolicy::test_remember\nPASSED r2e_tests/test_2.py::TestAuthTktAuthenticationPolicy::test_remember_with_extra_kargs\nPASSED r2e_tests/test_2.py::TestAuthTktAuthenticationPolicy::test_unauthenticated_userid\nPASSED r2e_tests/test_2.py::TestAuthTktAuthenticationPolicy::test_unauthenticated_userid_returns_None\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_forget\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_identify_bad_cookie\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_identify_cookie_reissue\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_identify_cookie_reissue_already_reissued_this_request\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_identify_cookie_reissue_notyet\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_identify_cookie_reissue_revoked_by_forget\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_identify_cookie_reissue_revoked_by_remember\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_identify_cookie_reissue_with_tokens_default\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_identify_cookie_str_reissue\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_identify_cookie_str_timeout\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_identify_cookie_timed_out\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_identify_cookie_value_is_None\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_identify_good_cookie_b64str_useridtype\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_identify_good_cookie_b64unicode_useridtype\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_identify_good_cookie_dont_include_ip\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_identify_good_cookie_include_ip\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_identify_good_cookie_include_ipv6\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_identify_good_cookie_int_useridtype\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_identify_good_cookie_unknown_useridtype\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_identify_nocookie\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_identify_nonuseridtype_user_data\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_init_cookie_str_max_age_invalid\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_init_cookie_str_reissue_invalid\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_init_cookie_str_timeout_invalid\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_remember\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_remember_binary_userid\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_remember_domain_supercedes_parent_and_wild_domain\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_remember_explicit_domain\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_remember_http_only\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_remember_include_ip\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_remember_insane_userid\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_remember_int_userid\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_remember_invalid_token_format\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_remember_long_userid\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_remember_max_age\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_remember_nonascii_token\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_remember_parent_domain\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_remember_parent_domain_supercedes_wild_domain\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_remember_path\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_remember_secure\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_remember_str_max_age\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_remember_str_max_age_invalid\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_remember_tokens\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_remember_unicode_but_ascii_token\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_remember_unicode_userid\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_remember_wild_domain_disabled\nPASSED r2e_tests/test_2.py::TestAuthTicket::test_cookie_value\nPASSED r2e_tests/test_2.py::TestAuthTicket::test_ctor_with_time\nPASSED r2e_tests/test_2.py::TestAuthTicket::test_ctor_with_tokens\nPASSED r2e_tests/test_2.py::TestAuthTicket::test_digest\nPASSED r2e_tests/test_2.py::TestAuthTicket::test_digest_sha512\nPASSED r2e_tests/test_2.py::TestAuthTicket::test_ipv4\nPASSED r2e_tests/test_2.py::TestAuthTicket::test_ipv6\nPASSED r2e_tests/test_2.py::TestBadTicket::test_it\nPASSED r2e_tests/test_2.py::Test_parse_ticket::test_bad_timestamp\nPASSED r2e_tests/test_2.py::Test_parse_ticket::test_bad_userid_or_data\nPASSED r2e_tests/test_2.py::Test_parse_ticket::test_correct_with_user_data\nPASSED r2e_tests/test_2.py::Test_parse_ticket::test_correct_with_user_data_sha512\nPASSED r2e_tests/test_2.py::Test_parse_ticket::test_digest_sig_incorrect\nPASSED r2e_tests/test_2.py::Test_parse_ticket::test_ipv4\nPASSED r2e_tests/test_2.py::Test_parse_ticket::test_ipv6\nPASSED r2e_tests/test_2.py::TestSessionAuthenticationPolicy::test_authenticated_userid\nPASSED r2e_tests/test_2.py::TestSessionAuthenticationPolicy::test_authenticated_userid_callback_returns_None\nPASSED r2e_tests/test_2.py::TestSessionAuthenticationPolicy::test_authenticated_userid_no_cookie_identity\nPASSED r2e_tests/test_2.py::TestSessionAuthenticationPolicy::test_class_implements_IAuthenticationPolicy\nPASSED r2e_tests/test_2.py::TestSessionAuthenticationPolicy::test_effective_principals\nPASSED r2e_tests/test_2.py::TestSessionAuthenticationPolicy::test_effective_principals_callback_returns_None\nPASSED r2e_tests/test_2.py::TestSessionAuthenticationPolicy::test_effective_principals_no_identity\nPASSED r2e_tests/test_2.py::TestSessionAuthenticationPolicy::test_forget\nPASSED r2e_tests/test_2.py::TestSessionAuthenticationPolicy::test_forget_no_identity\nPASSED r2e_tests/test_2.py::TestSessionAuthenticationPolicy::test_instance_implements_IAuthenticationPolicy\nPASSED r2e_tests/test_2.py::TestSessionAuthenticationPolicy::test_remember\nPASSED r2e_tests/test_2.py::TestSessionAuthenticationPolicy::test_unauthenticated_userid\nPASSED r2e_tests/test_2.py::TestSessionAuthenticationPolicy::test_unauthenticated_userid_returns_None\nPASSED r2e_tests/test_2.py::TestBasicAuthAuthenticationPolicy::test_authenticated_userid\nPASSED r2e_tests/test_2.py::TestBasicAuthAuthenticationPolicy::test_authenticated_userid_latin1\nPASSED r2e_tests/test_2.py::TestBasicAuthAuthenticationPolicy::test_authenticated_userid_utf8\nPASSED r2e_tests/test_2.py::TestBasicAuthAuthenticationPolicy::test_class_implements_IAuthenticationPolicy\nPASSED r2e_tests/test_2.py::TestBasicAuthAuthenticationPolicy::test_forget\nPASSED r2e_tests/test_2.py::TestBasicAuthAuthenticationPolicy::test_remember\nPASSED r2e_tests/test_2.py::TestBasicAuthAuthenticationPolicy::test_unauthenticated_bad_header\nPASSED r2e_tests/test_2.py::TestBasicAuthAuthenticationPolicy::test_unauthenticated_userid\nPASSED r2e_tests/test_2.py::TestBasicAuthAuthenticationPolicy::test_unauthenticated_userid_corrupt_base64\nPASSED r2e_tests/test_2.py::TestBasicAuthAuthenticationPolicy::test_unauthenticated_userid_invalid_payload\nPASSED r2e_tests/test_2.py::TestBasicAuthAuthenticationPolicy::test_unauthenticated_userid_no_credentials\nPASSED r2e_tests/test_2.py::TestBasicAuthAuthenticationPolicy::test_unauthenticated_userid_not_basic\nPASSED r2e_tests/test_2.py::TestSimpleSerializer::test_dumps\nPASSED r2e_tests/test_2.py::TestSimpleSerializer::test_loads\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_object_event_subscriber\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_resource_url_default_resource_iface_means_Interface\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_resource_url_nodefault_resource_iface\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_response_adapter\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_response_adapter_dottednames\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_response_adapter_self\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_defaults\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_dottednames\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_iface_specified\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_predicate\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_with_default_type_predicates_False\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_with_default_type_predicates_True\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_with_specific_type_and_predicates_False\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_with_specific_type_and_predicates_True\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_traverser_default_iface_means_Interface\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_traverser_introspectables\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_traverser_nondefault_iface\nPASSED r2e_tests/test_config/test_adapters.py::Test_eventonly::test_defaults\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test__override_already_registered\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test__override_not_yet_registered\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_directory_with_absdirectory\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_directory_with_absfile\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_directory_with_file\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_absdirectory\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_absfile\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_directory\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_missing_abspath\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_package\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_package_with_absdirectory\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_samename\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_filename_override_returns_value\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_stream_no_overrides\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_stream_override_returns_None\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_stream_override_returns_value\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_string_no_overrides\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_string_override_returns_None\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_string_override_returns_value\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_has_resource_no_overrides\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_has_resource_override_returns_None\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_has_resource_override_returns_True\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_isdir_no_overrides\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_isdir_override_returns_False\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_isdir_override_returns_None\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_listdir_no_overrides\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_listdir_override_returns_None\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_listdir_override_returns_values\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_class_conforms_to_IPEP302Loader\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_class_conforms_to_IPackageOverrides\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_ctor_package_already_has_loader_of_different_type\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_ctor_package_already_has_loader_of_same_type\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_ctor_registers_loader_type\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_ctor_sets_loader\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_ctor_sets_local_state\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_filtered_sources\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_code_pkg_has___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_code_pkg_has_no___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_data_pkg_has___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_data_pkg_has_no___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_filename\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_filename_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_source_pkg_has___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_source_pkg_has_no___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_stream\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_stream_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_string\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_string_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_has_resource\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_has_resource_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_insert_directory\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_insert_emptystring\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_insert_file\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_instance_conforms_to_IPEP302Loader\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_instance_conforms_to_IPackageOverrides\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_is_package_pkg_has___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_is_package_pkg_has_no___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_isdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_isdir_false\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_isdir_true\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_listdir\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_listdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_exists\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_exists_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_exists_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_filename_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_stream\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_stream_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_stream_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_string\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_string_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_string_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_isdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_isdir_false\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_isdir_true\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_listdir\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_listdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_exists\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_exists_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_exists_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_filename\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_filename_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_filename_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_stream\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_stream_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_stream_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_string\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_string_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_string_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_isdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_isdir_false\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_isdir_true\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_listdir\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_listdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestDirectoryOverride::test_it_match\nPASSED r2e_tests/test_config/test_assets.py::TestDirectoryOverride::test_it_no_match\nPASSED r2e_tests/test_config/test_assets.py::TestFileOverride::test_it_match\nPASSED r2e_tests/test_config/test_assets.py::TestFileOverride::test_it_no_match\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_None_callable\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_None_callable_and_no_name\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_None_callable_conflict\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_callable\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_text_type_name\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_unnamed_callable\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_multiple_request_methods_conflict\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_request_factory\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_request_factory_dottedname\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_response_factory\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_response_factory_dottedname\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_root_factory\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_root_factory_as_None\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_root_factory_dottedname\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_session_factory\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_session_factory_dottedname\nPASSED r2e_tests/test_config/test_factories.py::TestDeprecatedFactoriesMixinMethods::test_set_multiple_request_properties\nPASSED r2e_tests/test_config/test_factories.py::TestDeprecatedFactoriesMixinMethods::test_set_multiple_request_properties_conflict\nPASSED r2e_tests/test_config/test_factories.py::TestDeprecatedFactoriesMixinMethods::test_set_request_property_with_callable\nPASSED r2e_tests/test_config/test_factories.py::TestDeprecatedFactoriesMixinMethods::test_set_request_property_with_property\nPASSED r2e_tests/test_config/test_factories.py::TestDeprecatedFactoriesMixinMethods::test_set_request_property_with_unnamed_callable\nPASSED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_missing_dir\nPASSED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_no_specs\nPASSED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_set_locale_negotiator\nPASSED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_set_locale_negotiator_dottedname\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test___getattr__matches\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test___getattr__matches_no_action_wrap\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test___getattr__missing_when_directives_dont_exist\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test___getattr__missing_when_directives_exist\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_adds__lock\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_adds_clear_view_lookup_cache\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_has_listeners\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_notify\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_queryAdapterOrSelf\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_registerSelfAdapter\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_absolute_asset_spec_already_absolute\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_absolute_asset_spec_notastring\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_absolute_asset_spec_relative\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_autocommit_with_introspectables\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_autocommit_with_introspectables_introspection_off\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_branching_kw_is_None\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_branching_kw_is_not_None\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_branching_nonautocommit_with_config_info\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_branching_nonautocommit_with_introspectables\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_branching_nonautocommit_without_config_info\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_nonautocommit_with_introspectables_introspection_off\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_autocommit_no_conflicts\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_begin\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_begin_with_request\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_commit_conflict_resolved_with_include\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_commit_conflict_resolved_with_two_includes_and_local\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_commit_conflict_simple\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_commit_conflict_with_two_includes\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_conflict_set_forbidden_view\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_conflict_set_notfound_view\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_alternate_renderers\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_authentication_policy\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_authorization_policy_only\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_default_permission\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_default_renderers\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_default_view_mapper\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_default_webob_response_adapter_registered\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_exceptionresponse_view_None\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_exceptionresponse_view_custom\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_httpexception_view_default\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_no_root_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_noreg_custom_settings\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_noreg_debug_logger_non_None\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_session_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_with_introspection\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_with_package_registry\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_with_root_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_end\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_hook_zca\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_dotted_name\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_missing_source_file\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_module_defaults_to_includeme\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_module_defaults_to_includeme_missing\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_nested_route_prefix\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_python_callable\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_route_prefix\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_introspector_decorator\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_make_wsgi_app\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_maybe_dotted_notstring_success\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_maybe_dotted_string_fail\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_maybe_dotted_string_success\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration_dottedname_package\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration_with_extra_kw\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration_with_ignore\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration_with_onerror\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_alternate_renderers\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authentication_policy\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authentication_policy_dottedname\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authorization_policy_dottedname\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authorization_policy_only\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_calls_fix_registry\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_custom_settings\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_debug_logger_name\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_debug_logger_non_None\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_default_permission\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_dottedname_root_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_explicit_notfound_trumps_iexceptionresponse\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_includes\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_includes_spaces\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_locale_negotiator\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_locale_negotiator_dottedname\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_no_default_root_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_registers_default_exceptionresponse_views\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_registers_default_view_predicates\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_registers_default_webob_iresponse_adapter\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_request_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_request_factory_dottedname\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_response_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_tweens\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_unhook_zca\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_with_package\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_with_package_module\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_with_package_package\nPASSED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_directive_persists_across_configurator_creations\nPASSED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_extend_action_method_successful\nPASSED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_extend_same_name_doesnt_conflict\nPASSED r2e_tests/test_config/test_init.py::TestConfigurator__add_predicate::test_factory_as_object\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_simple\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_with_includepath\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_with_includepath_and_info\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_with_info\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_with_introspectables\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_with_order\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_execute_actions_dicts\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_execute_actions_error\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_execute_actions_tuples\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_execute_actions_with_introspectable_no_callable\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_execute_actions_with_introspectables\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_it\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_processSpec\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_reentrant_action\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_reentrant_action_error\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_reentrant_action_without_clear\nPASSED r2e_tests/test_config/test_init.py::Test_reentrant_action_functional::test_functional\nPASSED r2e_tests/test_config/test_init.py::Test_resolveConflicts::test_it_conflict\nPASSED r2e_tests/test_config/test_init.py::Test_resolveConflicts::test_it_success_dicts\nPASSED r2e_tests/test_config/test_init.py::Test_resolveConflicts::test_it_success_tuples\nPASSED r2e_tests/test_config/test_init.py::Test_resolveConflicts::test_it_with_actions_grouped_by_order\nPASSED r2e_tests/test_config/test_init.py::TestGlobalRegistriesIntegration::test_global_registries\nPASSED r2e_tests/test_config/test_init.py::TestGlobalRegistriesIntegration::test_global_registries_empty\nPASSED r2e_tests/test_config/test_predicates.py::TestXHRPredicate::test___call___false\nPASSED r2e_tests/test_config/test_predicates.py::TestXHRPredicate::test___call___true\nPASSED r2e_tests/test_config/test_predicates.py::TestXHRPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::TestXHRPredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestMethodPredicate::test___call___false\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestMethodPredicate::test___call___true_multi\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestMethodPredicate::test___call___true_single\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestMethodPredicate::test_ctor_get_but_no_head\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestMethodPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestMethodPredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::TestPathInfoPredicate::test___call___false\nPASSED r2e_tests/test_config/test_predicates.py::TestPathInfoPredicate::test___call___true\nPASSED r2e_tests/test_config/test_predicates.py::TestPathInfoPredicate::test_ctor_compilefail\nPASSED r2e_tests/test_config/test_predicates.py::TestPathInfoPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::TestPathInfoPredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test___call___false\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test___call___false_multi\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test___call___true_exists\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test___call___true_multi\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test___call___true_withval\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test_phash_exists\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test_phash_withval\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test_text_exists\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test_text_multi\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test_text_withval\nPASSED r2e_tests/test_config/test_predicates.py::TestMatchParamPredicate::test___call___false\nPASSED r2e_tests/test_config/test_predicates.py::TestMatchParamPredicate::test___call___matchdict_is_None\nPASSED r2e_tests/test_config/test_predicates.py::TestMatchParamPredicate::test___call___true_multi\nPASSED r2e_tests/test_config/test_predicates.py::TestMatchParamPredicate::test___call___true_single\nPASSED r2e_tests/test_config/test_predicates.py::TestMatchParamPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::TestMatchParamPredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::TestCustomPredicate::test___call___false\nPASSED r2e_tests/test_config/test_predicates.py::TestCustomPredicate::test___call___true\nPASSED r2e_tests/test_config/test_predicates.py::TestCustomPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::TestCustomPredicate::test_text_func_has___text__\nPASSED r2e_tests/test_config/test_predicates.py::TestCustomPredicate::test_text_func_repr\nPASSED r2e_tests/test_config/test_predicates.py::TestTraversePredicate::test___call__traverse_has_remainder_already\nPASSED r2e_tests/test_config/test_predicates.py::TestTraversePredicate::test___call__traverse_matches\nPASSED r2e_tests/test_config/test_predicates.py::TestTraversePredicate::test___call__traverse_matches_with_highorder_chars\nPASSED r2e_tests/test_config/test_predicates.py::TestTraversePredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::TestTraversePredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::Test_CheckCSRFTokenPredicate::test_it_call_val_False\nPASSED r2e_tests/test_config/test_predicates.py::Test_CheckCSRFTokenPredicate::test_it_call_val_True\nPASSED r2e_tests/test_config/test_predicates.py::Test_CheckCSRFTokenPredicate::test_it_call_val_str\nPASSED r2e_tests/test_config/test_predicates.py::Test_CheckCSRFTokenPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::Test_CheckCSRFTokenPredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test___call___false\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test___call___false_withregex\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test___call___true_exists\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test___call___true_withregex\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test___call___true_withval\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test_phash_exists\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test_phash_withregex\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test_phash_withval\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test_text_exists\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test_text_withregex\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test_text_withval\nPASSED r2e_tests/test_config/test_predicates.py::Test_PhysicalPathPredicate::test_it_call_False\nPASSED r2e_tests/test_config/test_predicates.py::Test_PhysicalPathPredicate::test_it_call_context_has_no_name\nPASSED r2e_tests/test_config/test_predicates.py::Test_PhysicalPathPredicate::test_it_call_val_list_True\nPASSED r2e_tests/test_config/test_predicates.py::Test_PhysicalPathPredicate::test_it_call_val_str_True\nPASSED r2e_tests/test_config/test_predicates.py::Test_PhysicalPathPredicate::test_it_call_val_tuple_True\nPASSED r2e_tests/test_config/test_predicates.py::Test_PhysicalPathPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::Test_PhysicalPathPredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::Test_EffectivePrincipalsPredicate::test_it_call_authentication_policy_doesnt_provide_superset\nPASSED r2e_tests/test_config/test_predicates.py::Test_EffectivePrincipalsPredicate::test_it_call_authentication_policy_provides_superset\nPASSED r2e_tests/test_config/test_predicates.py::Test_EffectivePrincipalsPredicate::test_it_call_authentication_policy_provides_superset_implicit\nPASSED r2e_tests/test_config/test_predicates.py::Test_EffectivePrincipalsPredicate::test_it_call_no_authentication_policy\nPASSED r2e_tests/test_config/test_predicates.py::Test_EffectivePrincipalsPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::Test_EffectivePrincipalsPredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::Test_EffectivePrincipalsPredicate::test_text_noniter\nPASSED r2e_tests/test_config/test_rendering.py::TestRenderingConfiguratorMixin::test_add_default_renderers\nPASSED r2e_tests/test_config/test_rendering.py::TestRenderingConfiguratorMixin::test_add_renderer\nPASSED r2e_tests/test_config/test_rendering.py::TestRenderingConfiguratorMixin::test_add_renderer_dottedname_factory\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_defaults\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_discriminator\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_path_no_pattern\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_pattern_with_path\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_view_with_view_attr\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_view_with_view_context\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_view_with_view_permission\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_view_with_view_renderer\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_accept\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_custom_predicates\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_factory\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_factory_dottedname\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_header\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_path_info\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_path_info_highorder\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_path_info_regex\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_pregenerator\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_request_method\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_request_param\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_route_prefix\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_static\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_xhr\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_get_routes_mapper_already_registered\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_get_routes_mapper_not_yet_registered\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_add_permission\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authentication_policy_no_authz_policy\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authentication_policy_no_authz_policy_autocommit\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authentication_policy_with_authz_policy\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authentication_policy_with_authz_policy_autocommit\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authorization_policy_no_authn_policy\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authorization_policy_no_authn_policy_autocommit\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authorization_policy_with_authn_policy\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authorization_policy_with_authn_policy_autocommit\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_default_permission\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test__set_settings_as_None\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test__set_settings_as_dictwithvalues\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test_add_settings_settings_None\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test_add_settings_settings_already_registered\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test_add_settings_settings_not_yet_registered\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test_get_settings_nosettings\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test_get_settings_withsettings\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_debug_all\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_debug_authorization\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_debug_notfound\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_debug_routematch\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_debug_templates\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_default_locale_name\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_getattr_fail\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_getattr_raises_attribute_error\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_getattr_success\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_noargs\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_originals_kept\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_prevent_cachebust\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_prevent_http_cache\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_reload_all\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_reload_assets\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_reload_resources\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_reload_templates\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_renderer\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_renderer_explicitrenderer\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_renderer_twice\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_subscriber_defaults\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_subscriber_dottedname\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_subscriber_multiple\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_subscriber_single\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_template\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_resources\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_securitypolicy\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_securitypolicy_forget_result\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_securitypolicy_remember_result\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_dottedname\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_instance\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_name_ingress\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_name_main\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_over_ingress\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_over_ingress_iterable\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_under_main\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_under_main_iterable\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_unsuitable\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tweens_conflict\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tweens_names_distinct\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tweens_names_with_over_nonstringoriter\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tweens_names_with_under_nonstringoriter\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tweens_names_with_underover\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test___call___explicit\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test___call___implicit\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_add_explicit\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_add_implicit\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_1\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_2\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_3\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_4\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_5\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_conflict_direct\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_conflict_indirect\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_missing_over_and_under_partials\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_missing_over_partial\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_missing_over_partial_with_fallback\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_missing_under_partial\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_missing_under_partial_with_fallback\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_with_missing_fallbacks\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_with_multiple_matching_fallbacks\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_with_partial_fallbacks\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_custom_predicates_can_affect_traversal\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_different_custom_predicates_with_same_hash\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_match_param_from_dict\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_match_param_from_dict_fails\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_match_param_from_string\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_match_param_from_string_fails\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_notted\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_ordering_importance_and_number\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_ordering_importance_of_predicates\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_ordering_number_of_predicates\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_ordering_xhr_and_request_method_trump_only_containment\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_predicate_text_is_correct\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_request_method_ordering_hashes_same\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_request_method_sequence\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_traverse_has_remainder_already\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_traverse_matches\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_traverse_matches_with_highorder_chars\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_unknown_predicate\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_annotations\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_defaultargs_firstname_not_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_defaultargs_firstname_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_noargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_onearg_named_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_onearg_named_somethingelse\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_toomanyargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_with_attr_false\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_with_attr_true\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_defaultargs_firstname_not_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_defaultargs_firstname_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_defaultargs_onearg_named_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_defaultargs_onearg_named_somethingelse\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_nocall\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_toomanyargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_method_onearg_named_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_newstyle_class_init_defaultargs_firstname_not_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_newstyle_class_init_defaultargs_firstname_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_newstyle_class_init_firstname_request_with_secondname\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_newstyle_class_init_noargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_newstyle_class_init_onearg_named_somethingelse\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_defaultargs_firstname_not_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_defaultargs_firstname_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_noargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_onearg_named_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_onearg_named_somethingelse\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_toomanyargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_no_init\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_requestonly_newstyle_class_init_onearg_named_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_requestonly_newstyle_class_init_toomanyargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_requestonly_newstyle_class_no_init\nPASSED r2e_tests/test_config/test_util.py::TestNotted::test_it_with_phash_val\nPASSED r2e_tests/test_config/test_util.py::TestNotted::test_it_without_phash_val\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_allows_other_predicates\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_disallows_context\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_disallows_for_\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_disallows_http_cache\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_disallows_name\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_disallows_permission\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_no_view_argument\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_with_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_with_view_defaults\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_allows_other_predicates\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_append_slash\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_append_slash_custom_response\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_disallows_context\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_disallows_for_\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_disallows_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_no_view_argument\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_with_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_with_view_defaults\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_static_view_absolute\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_static_view_here_no_utility_registered\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_static_view_package_relative\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_instance\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_instance_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_instancemethod\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_instancemethod_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_oldstyle_class\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_oldstyle_class_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_class_method_no_attr\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_context_as_class\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_context_as_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_tmpl_renderer_factory_introspector_missing\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_tmpl_renderer_factory_no_renderer_factory\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_tmpl_renderer_factory_with_renderer_factory\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_config_and_view_defaults_conflicts\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_config_and_view_defaults_doesnt_conflict\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_defaults\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_defaults_viewname_is_dottedname_kwarg\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_defaults_viewname_is_dottedname_nonkwarg\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_xhr_false\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_xhr_true\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_wrapped_view_is_decorated\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_views_with_accept_multiview_replaces_existing\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_derive_view_dottedname\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_derive_view_function\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_derive_view_with_default_renderer_no_explicit_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_derive_view_with_default_renderer_with_explicit_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_set_view_mapper\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_set_view_mapper_dottedname\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_view_with_most_specific_predicate\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_view_with_most_specific_predicate_with_mismatch\nPASSED r2e_tests/test_config/test_views.py::Test_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_cachebust_custom\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_cachebust_prevented\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_package_root\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_url_noendslash\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_url_noscheme\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_url_withendslash\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_context\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_for_\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_permission\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_renderer\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_route_prefix\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_missing\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_quoting\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_registration_miss\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_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_cachebust\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_quoted_remote\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_unquoted_local\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_with_custom_anchor\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_with_custom_query\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_verifyClass\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_verifyObject\nPASSED r2e_tests/test_config/test_views.py::Test_view_description::test_with_text\nPASSED r2e_tests/test_scripts/test_common.py::Test_logging_file_config::test_it\nPASSED r2e_tests/test_scripts/test_common.py::TestParseVars::test_parse_vars_bad\nPASSED r2e_tests/test_scripts/test_common.py::TestParseVars::test_parse_vars_good\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_confirm_override_conflicting_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_force_override_conflicting_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_force_override_site_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_known_scaffold_absolute_path\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_known_scaffold_multiple_rendered\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_known_scaffold_single_rendered\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_known_scaffold_with_path_as_project_target_rendered\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_no_project_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_run_no_scaffold_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_run_no_scaffold_no_args\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_scaffold_with_dev_pyramid_long_version\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_scaffold_with_dev_pyramid_version\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_scaffold_with_hyphen_in_project_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_scaffold_with_prod_pyramid_long_version\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_scaffold_with_prod_pyramid_unparsable_version\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_scaffold_with_prod_pyramid_version\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_unknown_scaffold_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_pdistreport.py::TestPDistReportCommand::test_no_dists\nPASSED r2e_tests/test_scripts/test_pdistreport.py::TestPDistReportCommand::test_with_dists\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_has_bad_config_header\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_configures_logging\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_bad_format\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_good_args\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_good_format\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_no_mapper\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_no_routes\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_as_wsgiapp\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_no_view\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_with_no_slash_prefix\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_single_route_multiview_registered\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_single_route_no_route_registered\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_single_route_no_views_registered\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_single_route_one_view_registered_with_factory\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_static_routes_included_in_list\nPASSED r2e_tests/test_scripts/test_proutes.py::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_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_default_shell_option\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_errors_with_unknown_shell\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_check_variable_override_order\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_custom_items\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_default_shell\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_ipython\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_pythonstartup\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_setup_from_options\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_setup\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_list_shells\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_shell_entry_points\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_shell_ordering\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_shell_override\nPASSED r2e_tests/test_scripts/test_pshell.py::Test_python_shell_runner::test_it\nPASSED r2e_tests/test_scripts/test_pshell.py::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_ptweens.py::TestPTweensCommand::test__get_tweens\nPASSED r2e_tests/test_scripts/test_ptweens.py::TestPTweensCommand::test_command_implicit_and_explicit_tweens\nPASSED r2e_tests/test_scripts/test_ptweens.py::TestPTweensCommand::test_command_implicit_tweens_only\nPASSED r2e_tests/test_scripts/test_ptweens.py::TestPTweensCommand::test_command_no_tweens\nPASSED r2e_tests/test_scripts/test_ptweens.py::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_multi_routes_all_match\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_multi_routes_none_match\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_multi_routes_some_match\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_no_match\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_no_match_multiview_registered\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_route_multiview\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_route_multiview_no_view_registered\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_route_no_multiview\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_traversal\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_traversal_multiview\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_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::Test_check_csrf_token::test_failure_no_raises - V...\nFAILED r2e_tests/test_1.py::Test_check_csrf_token::test_failure_raises - Valu...\nFAILED r2e_tests/test_1.py::Test_check_csrf_token::test_success_default_header\nFAILED r2e_tests/test_1.py::Test_check_csrf_token::test_success_default_token\nFAILED r2e_tests/test_1.py::Test_check_csrf_token::test_success_header - Valu...\nFAILED r2e_tests/test_1.py::Test_check_csrf_token::test_success_token - Value...\nFAILED r2e_tests/test_2.py::TestCallbackAuthenticationPolicyDebugging::test_authenticated_userid_fails_cleaning_as_Authenticated\nFAILED r2e_tests/test_2.py::TestCallbackAuthenticationPolicyDebugging::test_authenticated_userid_fails_cleaning_as_Everyone\nFAILED r2e_tests/test_2.py::TestCallbackAuthenticationPolicyDebugging::test_authenticated_userid_no_callback\nFAILED r2e_tests/test_2.py::TestCallbackAuthenticationPolicyDebugging::test_authenticated_userid_no_unauthenticated_userid\nFAILED r2e_tests/test_2.py::TestCallbackAuthenticationPolicyDebugging::test_authenticated_userid_with_callback_fail\nFAILED r2e_tests/test_2.py::TestCallbackAuthenticationPolicyDebugging::test_authenticated_userid_with_callback_success\nFAILED r2e_tests/test_2.py::TestCallbackAuthenticationPolicyDebugging::test_effective_principals_no_callback\nFAILED r2e_tests/test_2.py::TestCallbackAuthenticationPolicyDebugging::test_effective_principals_no_unauthenticated_userid\nFAILED r2e_tests/test_2.py::TestCallbackAuthenticationPolicyDebugging::test_effective_principals_with_callback_fail\nFAILED r2e_tests/test_2.py::TestCallbackAuthenticationPolicyDebugging::test_effective_principals_with_callback_success\nFAILED r2e_tests/test_2.py::TestCallbackAuthenticationPolicyDebugging::test_effective_principals_with_unclean_principal_Authenticated\nFAILED r2e_tests/test_2.py::TestCallbackAuthenticationPolicyDebugging::test_effective_principals_with_unclean_principal_Everyone\nFAILED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_resource_url_adapter_dotted_names\nFAILED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_resource_url_adapter_introspectables\nFAILED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_traverser_dotted_names\nFAILED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_directory_with_directory\nFAILED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_directory_with_package\nFAILED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_file\nFAILED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_package_with_directory\nFAILED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_package_with_package\nFAILED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_filename_no_overrides\nFAILED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_filename_override_returns_None\nFAILED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_filename\nFAILED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_filename_with_prefix\nFAILED r2e_tests/test_config/test_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_include_constant_root_package\nFAILED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration_conflict\nFAILED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_debug_logger_None_default\nFAILED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_add_directive_with_custom_callable\nFAILED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_add_directive_with_partial\nFAILED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_extend_with_dotted_name\nFAILED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_extend_with_python_callable\nFAILED r2e_tests/test_config/test_init.py::TestConfigurator__add_predicate::test_factory_as_dotted_name\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_static_view_package_here_relative\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_template_renderer\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_template_renderer_no_callable\nFAILED r2e_tests/test_config/test_views.py::TestViewDeriver::test_function_returns_non_adaptable\nFAILED r2e_tests/test_config/test_views.py::TestViewDeriver::test_function_returns_non_adaptable_dict\nFAILED r2e_tests/test_config/test_views.py::TestViewDeriver::test_instance_returns_non_adaptable\nFAILED r2e_tests/test_config/test_views.py::TestViewDeriver::test_requestonly_default_method_returns_non_adaptable\nFAILED r2e_tests/test_config/test_views.py::TestViewDeriver::test_requestonly_nondefault_method_returns_non_adaptable\nFAILED r2e_tests/test_config/test_views.py::Test_view_description::test_without_text\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_display_headers\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_has_content_type_header_var\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_has_good_header_var\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_has_multiple_header_vars\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_get\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_options\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_patch\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_post\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_propfind\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_put\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_path_doesnt_start_with_slash\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_two_args\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_w_basic_auth\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_with_query_string\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_config_format_ini_commas\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_config_format_ini_newlines\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_config_format_ini_spaces\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_one_route_all_methods_view_only_post\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_one_route_only_post_view_all_methods\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_one_route_only_post_view_post_and_get\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_one_route_with_long_name_one_view_registered\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_is_get_view_request_method_not_post\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_request_method_mismatch\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_static_views\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_single_route_one_view_registered\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_view_glob\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_view_request_method_not_post\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_function_traversal\n======================= 82 failed, 1143 passed in 6.81s ========================\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_2c27c33e45350d98f577bf3e14fda7d66b79904d\ncollected 1225 items\n\nr2e_tests/test_1.py .......F....................F..F...F.F.......F...... [  4%]\n...................F..F.....F.F.................................F.F..... [ 10%]\n........FFFFFF                                                           [ 11%]\nr2e_tests/test_2.py FFFFFFFFFFFF........................................ [ 15%]\n................FF...........FFF........................................ [ 21%]\n........................                                                 [ 23%]\nr2e_tests/test_config/test_adapters.py .FF..............F...             [ 25%]\nr2e_tests/test_config/test_assets.py ....F.F...F...FF.FF................ [ 27%]\n.....................................F.F................................ [ 33%]\n                                                                         [ 33%]\nr2e_tests/test_config/test_factories.py .....................            [ 35%]\nr2e_tests/test_config/test_i18n.py FFF.FF...                             [ 36%]\nr2e_tests/test_config/test_init.py ..................................... [ 39%]\n...F..F.......F.............F...........F.....................FF...FFF.. [ 45%]\n......................                                                   [ 46%]\nr2e_tests/test_config/test_predicates.py ............................... [ 49%]\n........................................                                 [ 52%]\nr2e_tests/test_config/test_rendering.py ...                              [ 52%]\nr2e_tests/test_config/test_routes.py ........................            [ 54%]\nr2e_tests/test_config/test_security.py ..........                        [ 55%]\nr2e_tests/test_config/test_settings.py ........................          [ 57%]\nr2e_tests/test_config/test_testing.py ............                       [ 58%]\nr2e_tests/test_config/test_tweens.py .................................   [ 61%]\nr2e_tests/test_config/test_util.py ..................................... [ 64%]\n..............                                                           [ 65%]\nr2e_tests/test_config/test_views.py ........................F........... [ 68%]\n........................................................................ [ 74%]\n......FF................................................................ [ 80%]\n...........FF.........F...F....F........................................ [ 86%]\n........................F                                                [ 88%]\nr2e_tests/test_scripts/test_common.py ...                                [ 88%]\nr2e_tests/test_scripts/test_pcreate.py ....................              [ 90%]\nr2e_tests/test_scripts/test_pdistreport.py ..                            [ 90%]\nr2e_tests/test_scripts/test_prequest.py F.FFF.FFFFFF.F.FFF.              [ 91%]\nr2e_tests/test_scripts/test_proutes.py ...FFF....FFFF.F.FF....F..FF.     [ 94%]\nr2e_tests/test_scripts/test_pserve.py ............................       [ 96%]\nr2e_tests/test_scripts/test_pshell.py ................                   [ 97%]\nr2e_tests/test_scripts/test_ptweens.py .....                             [ 98%]\nr2e_tests/test_scripts/test_pviews.py ................F......            [100%]\n\n=================================== FAILURES ===================================\n______________ TestBaseCookieSession.test_cookie_max_age_invalid _______________\n\nself = <r2e_tests.test_1.TestBaseCookieSession testMethod=test_cookie_max_age_invalid>\n\n    def test_cookie_max_age_invalid(self):\n        request = testing.DummyRequest()\n>       self.assertRaises(ValueError, self._makeOne, request, max_age='invalid value')\nE       AssertionError: ValueError not raised by _makeOne\n\nr2e_tests/test_1.py:327: AssertionError\n__________________ TestBaseCookieSession.test_reissue_invalid __________________\n\nself = <r2e_tests.test_1.TestBaseCookieSession testMethod=test_reissue_invalid>\n\n    def test_reissue_invalid(self):\n        request = testing.DummyRequest()\n>       self.assertRaises(ValueError, self._makeOne, request, reissue_time='invalid value')\nE       AssertionError: ValueError not raised by _makeOne\n\nr2e_tests/test_1.py:323: AssertionError\n_______________ TestBaseCookieSession.test_reissue_str_triggered _______________\n\nself = <r2e_tests.test_1.TestBaseCookieSession testMethod=test_reissue_str_triggered>\n\n    def test_reissue_str_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 2, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time='0')\n>       self.assertEqual(session['state'], 1)\n\nr2e_tests/test_1.py:318: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nsession = {'state': 1}, arg = ('state',), kw = {}, now = 1737083636\n\n    def accessed(session, *arg, **kw):\n        session.accessed = now = int(time.time())\n        if session._reissue_time is not None:\n>           if now - session.renewed > session._reissue_time:\nE           TypeError: '>' not supported between instances of 'float' and 'str'\n\npyramid/session.py:31: TypeError\n__________________ TestBaseCookieSession.test_timeout_invalid __________________\n\nself = <r2e_tests.test_1.TestBaseCookieSession testMethod=test_timeout_invalid>\n\n    def test_timeout_invalid(self):\n        request = testing.DummyRequest()\n>       self.assertRaises(ValueError, self._makeOne, request, timeout='Invalid value')\n\nr2e_tests/test_1.py:75: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nr2e_tests/test_1.py:290: in _makeOne\n    return BaseCookieSessionFactory(serializer, **kw)(request)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\n    def __init__(self, request):\n        self.request = request\n        now = time.time()\n        created = renewed = now\n        new = True\n        value = None\n        state = {}\n        cookieval = request.cookies.get(self._cookie_name)\n        if cookieval is not None:\n            try:\n                value = serializer.loads(bytes_(cookieval))\n            except ValueError:\n                # the cookie failed to deserialize, dropped\n                value = None\n    \n        if value is not None:\n            try:\n                # since the value is not necessarily signed, we have\n                # to unpack it a little carefully\n                rval, cval, sval = value\n                renewed = float(rval)\n                created = float(cval)\n                state = sval\n                new = False\n            except (TypeError, ValueError):\n                # value failed to unpack properly or renewed was not\n                # a numeric type so we'll fail deserialization here\n                state = {}\n    \n        if self._timeout is not None:\n>           if now - renewed > self._timeout:\nE           TypeError: '>' not supported between instances of 'float' and 'str'\n\npyramid/session.py:283: TypeError\n____________________ TestBaseCookieSession.test_timeout_str ____________________\n\nself = <r2e_tests.test_1.TestBaseCookieSession testMethod=test_timeout_str>\n\n    def test_timeout_str(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 5, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n>       session = self._makeOne(request, timeout='1')\n\nr2e_tests/test_1.py:70: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nr2e_tests/test_1.py:290: in _makeOne\n    return BaseCookieSessionFactory(serializer, **kw)(request)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = {}, request = <pyramid.testing.DummyRequest object at 0x738e522a6a00>\n\n    def __init__(self, request):\n        self.request = request\n        now = time.time()\n        created = renewed = now\n        new = True\n        value = None\n        state = {}\n        cookieval = request.cookies.get(self._cookie_name)\n        if cookieval is not None:\n            try:\n                value = serializer.loads(bytes_(cookieval))\n            except ValueError:\n                # the cookie failed to deserialize, dropped\n                value = None\n    \n        if value is not None:\n            try:\n                # since the value is not necessarily signed, we have\n                # to unpack it a little carefully\n                rval, cval, sval = value\n                renewed = float(rval)\n                created = float(cval)\n                state = sval\n                new = False\n            except (TypeError, ValueError):\n                # value failed to unpack properly or renewed was not\n                # a numeric type so we'll fail deserialization here\n                state = {}\n    \n        if self._timeout is not None:\n>           if now - renewed > self._timeout:\nE           TypeError: '>' not supported between instances of 'float' and 'str'\n\npyramid/session.py:283: TypeError\n_____________ TestSignedCookieSession.test_cookie_max_age_invalid ______________\n\nself = <r2e_tests.test_1.TestSignedCookieSession testMethod=test_cookie_max_age_invalid>\n\n    def test_cookie_max_age_invalid(self):\n        request = testing.DummyRequest()\n>       self.assertRaises(ValueError, self._makeOne, request, max_age='invalid value')\nE       AssertionError: ValueError not raised by _makeOne\n\nr2e_tests/test_1.py:378: AssertionError\n_________________ TestSignedCookieSession.test_reissue_invalid _________________\n\nself = <r2e_tests.test_1.TestSignedCookieSession testMethod=test_reissue_invalid>\n\n    def test_reissue_invalid(self):\n        request = testing.DummyRequest()\n>       self.assertRaises(ValueError, self._makeOne, request, reissue_time='invalid value')\nE       AssertionError: ValueError not raised by _makeOne\n\nr2e_tests/test_1.py:374: AssertionError\n______________ TestSignedCookieSession.test_reissue_str_triggered ______________\n\nself = <r2e_tests.test_1.TestSignedCookieSession testMethod=test_reissue_str_triggered>\n\n    def test_reissue_str_triggered(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 2, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n        session = self._makeOne(request, reissue_time='0')\n>       self.assertEqual(session['state'], 1)\n\nr2e_tests/test_1.py:369: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nsession = {'state': 1}, arg = ('state',), kw = {}, now = 1737083636\n\n    def accessed(session, *arg, **kw):\n        session.accessed = now = int(time.time())\n        if session._reissue_time is not None:\n>           if now - session.renewed > session._reissue_time:\nE           TypeError: '>' not supported between instances of 'float' and 'str'\n\npyramid/session.py:31: TypeError\n_________________ TestSignedCookieSession.test_timeout_invalid _________________\n\nself = <r2e_tests.test_1.TestSignedCookieSession testMethod=test_timeout_invalid>\n\n    def test_timeout_invalid(self):\n        request = testing.DummyRequest()\n>       self.assertRaises(ValueError, self._makeOne, request, timeout='Invalid value')\n\nr2e_tests/test_1.py:75: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nr2e_tests/test_1.py:333: in _makeOne\n    return SignedCookieSessionFactory(**kw)(request)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\n    def __init__(self, request):\n        self.request = request\n        now = time.time()\n        created = renewed = now\n        new = True\n        value = None\n        state = {}\n        cookieval = request.cookies.get(self._cookie_name)\n        if cookieval is not None:\n            try:\n                value = serializer.loads(bytes_(cookieval))\n            except ValueError:\n                # the cookie failed to deserialize, dropped\n                value = None\n    \n        if value is not None:\n            try:\n                # since the value is not necessarily signed, we have\n                # to unpack it a little carefully\n                rval, cval, sval = value\n                renewed = float(rval)\n                created = float(cval)\n                state = sval\n                new = False\n            except (TypeError, ValueError):\n                # value failed to unpack properly or renewed was not\n                # a numeric type so we'll fail deserialization here\n                state = {}\n    \n        if self._timeout is not None:\n>           if now - renewed > self._timeout:\nE           TypeError: '>' not supported between instances of 'float' and 'str'\n\npyramid/session.py:283: TypeError\n___________________ TestSignedCookieSession.test_timeout_str ___________________\n\nself = <r2e_tests.test_1.TestSignedCookieSession testMethod=test_timeout_str>\n\n    def test_timeout_str(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 5, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n>       session = self._makeOne(request, timeout='1')\n\nr2e_tests/test_1.py:70: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nr2e_tests/test_1.py:333: in _makeOne\n    return SignedCookieSessionFactory(**kw)(request)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = {}, request = <pyramid.testing.DummyRequest object at 0x738e52281a00>\n\n    def __init__(self, request):\n        self.request = request\n        now = time.time()\n        created = renewed = now\n        new = True\n        value = None\n        state = {}\n        cookieval = request.cookies.get(self._cookie_name)\n        if cookieval is not None:\n            try:\n                value = serializer.loads(bytes_(cookieval))\n            except ValueError:\n                # the cookie failed to deserialize, dropped\n                value = None\n    \n        if value is not None:\n            try:\n                # since the value is not necessarily signed, we have\n                # to unpack it a little carefully\n                rval, cval, sval = value\n                renewed = float(rval)\n                created = float(cval)\n                state = sval\n                new = False\n            except (TypeError, ValueError):\n                # value failed to unpack properly or renewed was not\n                # a numeric type so we'll fail deserialization here\n                state = {}\n    \n        if self._timeout is not None:\n>           if now - renewed > self._timeout:\nE           TypeError: '>' not supported between instances of 'float' and 'str'\n\npyramid/session.py:283: TypeError\n______________ TestUnencryptedCookieSession.test_timeout_invalid _______________\n\nself = <r2e_tests.test_1.TestUnencryptedCookieSession testMethod=test_timeout_invalid>\n\n    def test_timeout_invalid(self):\n        request = testing.DummyRequest()\n>       self.assertRaises(ValueError, self._makeOne, request, timeout='Invalid value')\n\nr2e_tests/test_1.py:75: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nr2e_tests/test_1.py:482: in _makeOne\n    return UnencryptedCookieSessionFactoryConfig('secret', **kw)(request)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\n    def __init__(self, request):\n        self.request = request\n        now = time.time()\n        created = renewed = now\n        new = True\n        value = None\n        state = {}\n        cookieval = request.cookies.get(self._cookie_name)\n        if cookieval is not None:\n            try:\n                value = serializer.loads(bytes_(cookieval))\n            except ValueError:\n                # the cookie failed to deserialize, dropped\n                value = None\n    \n        if value is not None:\n            try:\n                # since the value is not necessarily signed, we have\n                # to unpack it a little carefully\n                rval, cval, sval = value\n                renewed = float(rval)\n                created = float(cval)\n                state = sval\n                new = False\n            except (TypeError, ValueError):\n                # value failed to unpack properly or renewed was not\n                # a numeric type so we'll fail deserialization here\n                state = {}\n    \n        if self._timeout is not None:\n>           if now - renewed > self._timeout:\nE           TypeError: '>' not supported between instances of 'float' and 'str'\n\npyramid/session.py:283: TypeError\n________________ TestUnencryptedCookieSession.test_timeout_str _________________\n\nself = <r2e_tests.test_1.TestUnencryptedCookieSession testMethod=test_timeout_str>\n\n    def test_timeout_str(self):\n        import time\n        request = testing.DummyRequest()\n        cookieval = self._serialize((time.time() - 5, 0, {'state': 1}))\n        request.cookies['session'] = cookieval\n>       session = self._makeOne(request, timeout='1')\n\nr2e_tests/test_1.py:70: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \nr2e_tests/test_1.py:482: in _makeOne\n    return UnencryptedCookieSessionFactoryConfig('secret', **kw)(request)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = {}, request = <pyramid.testing.DummyRequest object at 0x738e5212ae80>\n\n    def __init__(self, request):\n        self.request = request\n        now = time.time()\n        created = renewed = now\n        new = True\n        value = None\n        state = {}\n        cookieval = request.cookies.get(self._cookie_name)\n        if cookieval is not None:\n            try:\n                value = serializer.loads(bytes_(cookieval))\n            except ValueError:\n                # the cookie failed to deserialize, dropped\n                value = None\n    \n        if value is not None:\n            try:\n                # since the value is not necessarily signed, we have\n                # to unpack it a little carefully\n                rval, cval, sval = value\n                renewed = float(rval)\n                created = float(cval)\n                state = sval\n                new = False\n            except (TypeError, ValueError):\n                # value failed to unpack properly or renewed was not\n                # a numeric type so we'll fail deserialization here\n                state = {}\n    \n        if self._timeout is not None:\n>           if now - renewed > self._timeout:\nE           TypeError: '>' not supported between instances of 'float' and 'str'\n\npyramid/session.py:283: TypeError\n_________________ Test_check_csrf_token.test_failure_no_raises _________________\n\nself = <r2e_tests.test_1.Test_check_csrf_token testMethod=test_failure_no_raises>\n\n    def test_failure_no_raises(self):\n        request = testing.DummyRequest()\n>       result = self._callFUT(request, 'csrf_token', raises=False)\n\nr2e_tests/test_1.py:695: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <r2e_tests.test_1.Test_check_csrf_token testMethod=test_failure_no_raises>\nargs = (<pyramid.testing.DummyRequest object at 0x738e520e8760>, 'csrf_token')\nkwargs = {'raises': False}\n\n    def _callFUT(self, *args, **kwargs):\n>       from ..session import check_csrf_token\nE       ValueError: attempted relative import beyond top-level package\n\nr2e_tests/test_1.py:664: ValueError\n__________________ Test_check_csrf_token.test_failure_raises ___________________\n\nself = <r2e_tests.test_1.Test_check_csrf_token testMethod=test_failure_raises>\n\n    def test_failure_raises(self):\n        from pyramid.exceptions import BadCSRFToken\n        request = testing.DummyRequest()\n>       self.assertRaises(BadCSRFToken, self._callFUT, request,\n                          'csrf_token')\n\nr2e_tests/test_1.py:690: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\n    def _callFUT(self, *args, **kwargs):\n>       from ..session import check_csrf_token\nE       ValueError: attempted relative import beyond top-level package\n\nr2e_tests/test_1.py:664: ValueError\n______________ Test_check_csrf_token.test_success_default_header _______________\n\nself = <r2e_tests.test_1.Test_check_csrf_token testMethod=test_success_default_header>\n\n    def test_success_default_header(self):\n        request = testing.DummyRequest()\n        request.headers['X-CSRF-Token'] = request.session.get_csrf_token()\n>       self.assertEqual(self._callFUT(request), True)\n\nr2e_tests/test_1.py:685: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <r2e_tests.test_1.Test_check_csrf_token testMethod=test_success_default_header>\nargs = (<pyramid.testing.DummyRequest object at 0x738e5217fd30>,), kwargs = {}\n\n    def _callFUT(self, *args, **kwargs):\n>       from ..session import check_csrf_token\nE       ValueError: attempted relative import beyond top-level package\n\nr2e_tests/test_1.py:664: ValueError\n_______________ Test_check_csrf_token.test_success_default_token _______________\n\nself = <r2e_tests.test_1.Test_check_csrf_token testMethod=test_success_default_token>\n\n    def test_success_default_token(self):\n        request = testing.DummyRequest()\n        request.params['csrf_token'] = request.session.get_csrf_token()\n>       self.assertEqual(self._callFUT(request), True)\n\nr2e_tests/test_1.py:680: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <r2e_tests.test_1.Test_check_csrf_token testMethod=test_success_default_token>\nargs = (<pyramid.testing.DummyRequest object at 0x738e5229d160>,), kwargs = {}\n\n    def _callFUT(self, *args, **kwargs):\n>       from ..session import check_csrf_token\nE       ValueError: attempted relative import beyond top-level package\n\nr2e_tests/test_1.py:664: ValueError\n__________________ Test_check_csrf_token.test_success_header ___________________\n\nself = <r2e_tests.test_1.Test_check_csrf_token testMethod=test_success_header>\n\n    def test_success_header(self):\n        request = testing.DummyRequest()\n        request.headers['X-CSRF-Token'] = request.session.get_csrf_token()\n>       self.assertEqual(self._callFUT(request, header='X-CSRF-Token'), True)\n\nr2e_tests/test_1.py:675: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <r2e_tests.test_1.Test_check_csrf_token testMethod=test_success_header>\nargs = (<pyramid.testing.DummyRequest object at 0x738e5213cd30>,)\nkwargs = {'header': 'X-CSRF-Token'}\n\n    def _callFUT(self, *args, **kwargs):\n>       from ..session import check_csrf_token\nE       ValueError: attempted relative import beyond top-level package\n\nr2e_tests/test_1.py:664: ValueError\n___________________ Test_check_csrf_token.test_success_token ___________________\n\nself = <r2e_tests.test_1.Test_check_csrf_token testMethod=test_success_token>\n\n    def test_success_token(self):\n        request = testing.DummyRequest()\n        request.params['csrf_token'] = request.session.get_csrf_token()\n>       self.assertEqual(self._callFUT(request, token='csrf_token'), True)\n\nr2e_tests/test_1.py:670: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <r2e_tests.test_1.Test_check_csrf_token testMethod=test_success_token>\nargs = (<pyramid.testing.DummyRequest object at 0x738e52148df0>,)\nkwargs = {'token': 'csrf_token'}\n\n    def _callFUT(self, *args, **kwargs):\n>       from ..session import check_csrf_token\nE       ValueError: attempted relative import beyond top-level package\n\nr2e_tests/test_1.py:664: ValueError\n_ TestCallbackAuthenticationPolicyDebugging.test_authenticated_userid_fails_cleaning_as_Authenticated _\n\nself = <r2e_tests.test_2.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_2.MyAuthenticationPolicy.a[123 chars]None\" != \"pyramid.tests.test_authentication.MyAuthe[140 chars]None\"\nE       - r2e_tests.test_2.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_2.py:85: AssertionError\n_ TestCallbackAuthenticationPolicyDebugging.test_authenticated_userid_fails_cleaning_as_Everyone _\n\nself = <r2e_tests.test_2.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_2.MyAuthenticationPolicy.a[118 chars]None\" != \"pyramid.tests.test_authentication.MyAuthe[135 chars]None\"\nE       - r2e_tests.test_2.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_2.py:97: AssertionError\n_ TestCallbackAuthenticationPolicyDebugging.test_authenticated_userid_no_callback _\n\nself = <r2e_tests.test_2.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_2.MyAuthenticationPolicy.a[68 chars]red'\" != \"pyramid.tests.test_authentication.MyAuthe[85 chars]red'\"\nE       - r2e_tests.test_2.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_2.py:48: AssertionError\n_ TestCallbackAuthenticationPolicyDebugging.test_authenticated_userid_no_unauthenticated_userid _\n\nself = <r2e_tests.test_2.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_2.MyAuthenticationPolicy.a[77 chars]None' != 'pyramid.tests.test_authentication.MyAuthe[94 chars]None'\nE       - r2e_tests.test_2.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_2.py:37: AssertionError\n_ TestCallbackAuthenticationPolicyDebugging.test_authenticated_userid_with_callback_fail _\n\nself = <r2e_tests.test_2.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_2.MyAuthenticationPolicy.a[67 chars]None' != 'pyramid.tests.test_authentication.MyAuthe[84 chars]None'\nE       - r2e_tests.test_2.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_2.py:61: AssertionError\n_ TestCallbackAuthenticationPolicyDebugging.test_authenticated_userid_with_callback_success _\n\nself = <r2e_tests.test_2.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_2.MyAuthenticationPolicy.a[67 chars]red'\" != \"pyramid.tests.test_authentication.MyAuthe[84 chars]red'\"\nE       - r2e_tests.test_2.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_2.py:74: AssertionError\n_ TestCallbackAuthenticationPolicyDebugging.test_effective_principals_no_callback _\n\nself = <r2e_tests.test_2.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_2.MyAuthenticationPolicy.e[62 chars]s []' != 'pyramid.tests.test_authentication.MyAuthe[79 chars]s []'\nE       - r2e_tests.test_2.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_2.py:123: AssertionError\n_ TestCallbackAuthenticationPolicyDebugging.test_effective_principals_no_unauthenticated_userid _\n\nself = <r2e_tests.test_2.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_2.MyAuthenticationPolicy.e[84 chars]ne']\" != \"pyramid.tests.test_authentication.MyAuthe[101 chars]ne']\"\nE       - r2e_tests.test_2.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_2.py:110: AssertionError\n_ TestCallbackAuthenticationPolicyDebugging.test_effective_principals_with_callback_fail _\n\nself = <r2e_tests.test_2.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_2.MyAuthenticationPolicy.e[61 chars]oups' != 'pyramid.tests.test_authentication.MyAuthe[78 chars]oups'\nE       - r2e_tests.test_2.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_2.py:142: AssertionError\n_ TestCallbackAuthenticationPolicyDebugging.test_effective_principals_with_callback_success _\n\nself = <r2e_tests.test_2.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_2.MyAuthenticationPolicy.e[59 chars]oups' != 'pyramid.tests.test_authentication.MyAuthe[76 chars]oups'\nE       - r2e_tests.test_2.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_2.py:162: AssertionError\n_ TestCallbackAuthenticationPolicyDebugging.test_effective_principals_with_unclean_principal_Authenticated _\n\nself = <r2e_tests.test_2.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_2.MyAuthenticationPolicy.e[131 chars]None\" != \"pyramid.tests.test_authentication.MyAuthe[148 chars]None\"\nE       - r2e_tests.test_2.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_2.py:179: AssertionError\n_ TestCallbackAuthenticationPolicyDebugging.test_effective_principals_with_unclean_principal_Everyone _\n\nself = <r2e_tests.test_2.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_2.MyAuthenticationPolicy.e[126 chars]None\" != \"pyramid.tests.test_authentication.MyAuthe[143 chars]None\"\nE       - r2e_tests.test_2.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_2.py:193: AssertionError\n___________ TestAuthTktCookieHelper.test_identify_cookie_str_reissue ___________\n\nself = <r2e_tests.test_2.TestAuthTktCookieHelper testMethod=test_identify_cookie_str_reissue>\n\n    def test_identify_cookie_str_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\nr2e_tests/test_2.py:800: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <pyramid.authentication.AuthTktCookieHelper object at 0x738e52070ca0>\nrequest = <r2e_tests.test_2.DummyRequest object at 0x738e52070a00>\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 ):\nE           TypeError: '>' not supported between instances of 'float' and 'str'\n\npyramid/authentication.py:932: TypeError\n___________ TestAuthTktCookieHelper.test_identify_cookie_str_timeout ___________\n\nself = <r2e_tests.test_2.TestAuthTktCookieHelper testMethod=test_identify_cookie_str_timeout>\n\n    def test_identify_cookie_str_timeout(self):\n        helper = self._makeOne('secret', timeout='1')\n        request = self._makeRequest({'HTTP_COOKIE':'auth_tkt=bogus'})\n>       result = helper.identify(request)\n\nr2e_tests/test_2.py:773: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <pyramid.authentication.AuthTktCookieHelper object at 0x738e51d3b430>\nrequest = <r2e_tests.test_2.DummyRequest object at 0x738e51d3b640>\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 ):\nE       TypeError: unsupported operand type(s) for +: 'int' and 'str'\n\npyramid/authentication.py:916: TypeError\n_________ TestAuthTktCookieHelper.test_init_cookie_str_max_age_invalid _________\n\nself = <r2e_tests.test_2.TestAuthTktCookieHelper testMethod=test_init_cookie_str_max_age_invalid>\n\n    def test_init_cookie_str_max_age_invalid(self):\n>       self.assertRaises(ValueError, self._makeOne, 'secret', max_age='invalid value')\nE       AssertionError: ValueError not raised by _makeOne\n\nr2e_tests/test_2.py:610: AssertionError\n_________ TestAuthTktCookieHelper.test_init_cookie_str_reissue_invalid _________\n\nself = <r2e_tests.test_2.TestAuthTktCookieHelper testMethod=test_init_cookie_str_reissue_invalid>\n\n    def test_init_cookie_str_reissue_invalid(self):\n>       self.assertRaises(ValueError, self._makeOne, 'secret', reissue_time='invalid value')\nE       AssertionError: ValueError not raised by _makeOne\n\nr2e_tests/test_2.py:604: AssertionError\n_________ TestAuthTktCookieHelper.test_init_cookie_str_timeout_invalid _________\n\nself = <r2e_tests.test_2.TestAuthTktCookieHelper testMethod=test_init_cookie_str_timeout_invalid>\n\n    def test_init_cookie_str_timeout_invalid(self):\n>       self.assertRaises(ValueError, self._makeOne, 'secret', timeout='invalid value')\nE       AssertionError: ValueError not raised by _makeOne\n\nr2e_tests/test_2.py:607: 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 0x738e528dba60>, <r2e_tests.test_config.test_adapters.DummyIface object at 0x738e528dba60>)\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 0x738e528dba60>, <r2e_tests.test_config.test_adapters.DummyIface object at 0x738e528dba60>), <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 0x738e52171850>\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 0x738e52171850>, <InterfaceClass pyramid.interfaces.ITraverser>, '')\n\n.venv/lib/python3.8/site-packages/zope/interface/registry.py:368: ComponentLookupError\n___ TestAssetsConfiguratorMixin.test_override_asset_directory_with_directory ___\n\nself = <r2e_tests.test_config.test_assets.TestAssetsConfiguratorMixin testMethod=test_override_asset_directory_with_directory>\n\n    def test_override_asset_directory_with_directory(self):\n        from pyramid.config.assets import PackageAssetSource\n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'pyramid.tests.test_config.pkgs.asset:templates/',\n            'pyramid.tests.test_config.pkgs.asset.subpackage:templates/',\n            _override=override)\n        from pyramid.tests.test_config.pkgs import asset\n        from pyramid.tests.test_config.pkgs.asset import subpackage\n        self.assertEqual(override.package, asset)\n        self.assertEqual(override.path, 'templates/')\n        source = override.source\n        self.assertTrue(isinstance(source, PackageAssetSource))\n        self.assertEqual(source.package, subpackage)\n        self.assertEqual(source.prefix, 'templates/')\n    \n        resource_name = 'bar.pt'\n        expected = os.path.join(here, 'pkgs', 'asset',\n                                'subpackage', 'templates', 'bar.pt')\n>       self.assertEqual(override.source.get_filename(resource_name),\n                         expected)\nE       AssertionError: '/hom[90 chars]904d/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]904d/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:106: AssertionError\n____ TestAssetsConfiguratorMixin.test_override_asset_directory_with_package ____\n\nself = <r2e_tests.test_config.test_assets.TestAssetsConfiguratorMixin testMethod=test_override_asset_directory_with_package>\n\n    def test_override_asset_directory_with_package(self):\n        from pyramid.config.assets import PackageAssetSource\n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'pyramid.tests.test_config.pkgs.asset:templates/',\n            'pyramid.tests.test_config.pkgs.asset.subpackage',\n            _override=override)\n        from pyramid.tests.test_config.pkgs import asset\n        from pyramid.tests.test_config.pkgs.asset import subpackage\n        self.assertEqual(override.package, asset)\n        self.assertEqual(override.path, 'templates/')\n        source = override.source\n        self.assertTrue(isinstance(source, PackageAssetSource))\n        self.assertEqual(source.package, subpackage)\n        self.assertEqual(source.prefix, '')\n    \n        resource_name = 'templates/bar.pt'\n        expected = os.path.join(here, 'pkgs', 'asset',\n                                'subpackage', 'templates', 'bar.pt')\n>       self.assertEqual(override.source.get_filename(resource_name),\n                         expected)\nE       AssertionError: '/hom[90 chars]904d/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]904d/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:129: AssertionError\n________ TestAssetsConfiguratorMixin.test_override_asset_file_with_file ________\n\nself = <r2e_tests.test_config.test_assets.TestAssetsConfiguratorMixin testMethod=test_override_asset_file_with_file>\n\n    def test_override_asset_file_with_file(self):\n        from pyramid.config.assets import PackageAssetSource\n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'pyramid.tests.test_config.pkgs.asset:templates/foo.pt',\n            'pyramid.tests.test_config.pkgs.asset.subpackage:templates/bar.pt',\n            _override=override)\n        from pyramid.tests.test_config.pkgs import asset\n        from pyramid.tests.test_config.pkgs.asset import subpackage\n        self.assertEqual(override.package, asset)\n        self.assertEqual(override.path, 'templates/foo.pt')\n        source = override.source\n        self.assertTrue(isinstance(source, PackageAssetSource))\n        self.assertEqual(source.package, subpackage)\n        self.assertEqual(source.prefix, 'templates/bar.pt')\n    \n        resource_name = ''\n        expected = os.path.join(here, 'pkgs', 'asset',\n                                'subpackage', 'templates', 'bar.pt')\n>       self.assertEqual(override.source.get_filename(resource_name),\n                         expected)\nE       AssertionError: '/hom[90 chars]904d/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]904d/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:60: AssertionError\n____ TestAssetsConfiguratorMixin.test_override_asset_package_with_directory ____\n\nself = <r2e_tests.test_config.test_assets.TestAssetsConfiguratorMixin testMethod=test_override_asset_package_with_directory>\n\n    def test_override_asset_package_with_directory(self):\n        from pyramid.config.assets import PackageAssetSource\n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'pyramid.tests.test_config.pkgs.asset',\n            'pyramid.tests.test_config.pkgs.asset.subpackage:templates/',\n            _override=override)\n        from pyramid.tests.test_config.pkgs import asset\n        from pyramid.tests.test_config.pkgs.asset import subpackage\n        self.assertEqual(override.package, asset)\n        self.assertEqual(override.path, '')\n        source = override.source\n        self.assertTrue(isinstance(source, PackageAssetSource))\n        self.assertEqual(source.package, subpackage)\n        self.assertEqual(source.prefix, 'templates/')\n    \n        resource_name = 'bar.pt'\n        expected = os.path.join(here, 'pkgs', 'asset',\n                                'subpackage', 'templates', 'bar.pt')\n>       self.assertEqual(override.source.get_filename(resource_name),\n                         expected)\nE       AssertionError: '/hom[90 chars]904d/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]904d/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:152: AssertionError\n_____ TestAssetsConfiguratorMixin.test_override_asset_package_with_package _____\n\nself = <r2e_tests.test_config.test_assets.TestAssetsConfiguratorMixin testMethod=test_override_asset_package_with_package>\n\n    def test_override_asset_package_with_package(self):\n        from pyramid.config.assets import PackageAssetSource\n        config = self._makeOne(autocommit=True)\n        override = DummyUnderOverride()\n        config.override_asset(\n            'pyramid.tests.test_config.pkgs.asset',\n            'pyramid.tests.test_config.pkgs.asset.subpackage',\n            _override=override)\n        from pyramid.tests.test_config.pkgs import asset\n        from pyramid.tests.test_config.pkgs.asset import subpackage\n        self.assertEqual(override.package, asset)\n        self.assertEqual(override.path, '')\n        source = override.source\n        self.assertTrue(isinstance(source, PackageAssetSource))\n        self.assertEqual(source.package, subpackage)\n        self.assertEqual(source.prefix, '')\n    \n        resource_name = 'templates/bar.pt'\n        expected = os.path.join(here, 'pkgs', 'asset',\n                                'subpackage', 'templates', 'bar.pt')\n>       self.assertEqual(override.source.get_filename(resource_name),\n                         expected)\nE       AssertionError: '/hom[90 chars]904d/pyramid/tests/test_config/pkgs/asset/subp[19 chars]r.pt' != '/hom[90 chars]904d/r2e_tests/test_config/pkgs/asset/subpacka[15 chars]r.pt'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/pyramid/tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/r2e_tests/test_config/pkgs/asset/subpackage/templates/bar.pt\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:83: AssertionError\n_________ TestOverrideProvider.test_get_resource_filename_no_overrides _________\n\nself = <r2e_tests.test_config.test_assets.TestOverrideProvider testMethod=test_get_resource_filename_no_overrides>\n\n    def test_get_resource_filename_no_overrides(self):\n        resource_name = 'test_assets.py'\n        import pyramid.tests.test_config\n        provider = self._makeOne(pyramid.tests.test_config)\n        expected = os.path.join(here, resource_name)\n        result = provider.get_resource_filename(None, resource_name)\n>       self.assertEqual(result, expected)\nE       AssertionError: '/hom[73 chars]7bf3e14fda7d66b79904d/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]7bf3e14fda7d66b79904d/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:297: AssertionError\n____ TestOverrideProvider.test_get_resource_filename_override_returns_None _____\n\nself = <r2e_tests.test_config.test_assets.TestOverrideProvider testMethod=test_get_resource_filename_override_returns_None>\n\n    def test_get_resource_filename_override_returns_None(self):\n        overrides = DummyOverrides(None)\n        self._registerOverrides(overrides)\n        resource_name = 'test_assets.py'\n        import pyramid.tests.test_config\n        provider = self._makeOne(pyramid.tests.test_config)\n        expected = os.path.join(here, resource_name)\n        result = provider.get_resource_filename(None, resource_name)\n>       self.assertEqual(result, expected)\nE       AssertionError: '/hom[73 chars]7bf3e14fda7d66b79904d/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]7bf3e14fda7d66b79904d/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:345: AssertionError\n___________________ TestPackageAssetSource.test_get_filename ___________________\n\nself = <r2e_tests.test_config.test_assets.TestPackageAssetSource testMethod=test_get_filename>\n\n    def test_get_filename(self):\n        source = self._makeOne('')\n>       self.assertEqual(source.get_filename('test_assets.py'),\n                         os.path.join(here, 'test_assets.py'))\nE       AssertionError: '/hom[73 chars]7bf3e14fda7d66b79904d/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]7bf3e14fda7d66b79904d/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:716: AssertionError\n_____________ TestPackageAssetSource.test_get_filename_with_prefix _____________\n\nself = <r2e_tests.test_config.test_assets.TestPackageAssetSource testMethod=test_get_filename_with_prefix>\n\n    def test_get_filename_with_prefix(self):\n        source = self._makeOne('test_assets.py')\n>       self.assertEqual(source.get_filename(''),\n                         os.path.join(here, 'test_assets.py'))\nE       AssertionError: '/hom[73 chars]7bf3e14fda7d66b79904d/pyramid/tests/test_config/test_assets.py' != '/hom[73 chars]7bf3e14fda7d66b79904d/r2e_tests/test_config/test_assets.py'\nE       - /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/pyramid/tests/test_config/test_assets.py\nE       ?                                                                                                    -- ^^^^^\nE       + /home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/r2e_tests/test_config/test_assets.py\nE       ?                                                                                                     ^^^\n\nr2e_tests/test_config/test_assets.py:721: AssertionError\n_________ TestI18NConfiguratorMixin.test_add_translation_dirs_abspath __________\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_abspath>\n\n    def test_add_translation_dirs_abspath(self):\n        from pyramid.interfaces import ITranslationDirectories\n        config = self._makeOne(autocommit=True)\n>       config.add_translation_dirs(locale)\n\nr2e_tests/test_config/test_i18n.py:86: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \npyramid/util.py:570: in wrapper\n    result = wrapped(self, *arg, **kw)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself = <pyramid.config.Configurator object at 0x738e526ec550>\nspecs = ('/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/r2e_tests/pkgs/localeapp/locale',)\nintrospectables = []\nspec = '/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/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_2c27c33e45350d98f577bf3e14fda7d66b79904d/r2e_tests/pkgs/localeapp/locale\" is not a directory\n\npyramid/config/i18n.py:86: ConfigurationError\n________ TestI18NConfiguratorMixin.test_add_translation_dirs_asset_spec ________\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_asset_spec>\n\n    def test_add_translation_dirs_asset_spec(self):\n        from pyramid.interfaces import ITranslationDirectories\n        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale')\n>       self.assertEqual(config.registry.getUtility(ITranslationDirectories),\n                         [locale])\nE       AssertionError: Lists differ: ['/ho[70 chars]8f577bf3e14fda7d66b79904d/pyramid/tests/pkgs/localeapp/locale'] != ['/ho[70 chars]8f577bf3e14fda7d66b79904d/r2e_tests/pkgs/localeapp/locale']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]98f577bf3e14fda7d66b79904d/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]98f577bf3e14fda7d66b79904d/r2e_tests/pkgs/localeapp/locale'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/pyramid/tests/pkgs/localeapp/locale']\nE       ?                                                                                                      -- ^^^^^\nE       \nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/r2e_tests/pkgs/localeapp/locale']\nE       ?                                                                                                       ^^^\n\nr2e_tests/test_config/test_i18n.py:54: AssertionError\n_ TestI18NConfiguratorMixin.test_add_translation_dirs_asset_spec_existing_translation_dirs _\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_asset_spec_existing_translation_dirs>\n\n    def test_add_translation_dirs_asset_spec_existing_translation_dirs(self):\n        from pyramid.interfaces import ITranslationDirectories\n        config = self._makeOne(autocommit=True)\n        directories = ['abc']\n        config.registry.registerUtility(directories, ITranslationDirectories)\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale')\n        result = config.registry.getUtility(ITranslationDirectories)\n>       self.assertEqual(result, [locale, 'abc'])\nE       AssertionError: Lists differ: ['/ho[77 chars]3e14fda7d66b79904d/pyramid/tests/pkgs/localeapp/locale', 'abc'] != ['/ho[77 chars]3e14fda7d66b79904d/r2e_tests/pkgs/localeapp/locale', 'abc']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]98f577bf3e14fda7d66b79904d/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]98f577bf3e14fda7d66b79904d/r2e_tests/pkgs/localeapp/locale'\nE       \nE       - ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/pyramid/tests/pkgs/localeapp/locale',\nE       ?                                                                                                      -- ^^^^^\nE       \nE       + ['/home/gcpuser/buckets/local_repoeval_bucket/repos/pyramid_2c27c33e45350d98f577bf3e14fda7d66b79904d/r2e_tests/pkgs/localeapp/locale',\nE       ?                                                                                                       ^^^\nE       \nE          'abc']\n\nr2e_tests/test_config/test_i18n.py:64: AssertionError\n______ TestI18NConfiguratorMixin.test_add_translation_dirs_multiple_specs ______\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_multiple_specs>\n\n    def test_add_translation_dirs_multiple_specs(self):\n        from pyramid.interfaces import ITranslationDirectories\n        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale',\n                                    'pyramid.tests.pkgs.localeapp:locale2')\n>       self.assertEqual(config.registry.getUtility(ITranslationDirectories),\n                         [locale, locale2])\nE       AssertionError: Lists differ: ['/ho[91 chars]904d/pyramid/tests/pkgs/localeapp/locale', '/h[130 chars]le2'] != ['/ho[91 chars]904d/r2e_tests/pkgs/localeapp/locale', '/home/[122 chars]le2']\nE       \nE       First differing element 0:\nE       '/hom[68 chars]98f577bf3e14fda7d66b79904d/pyramid/tests/pkgs/localeapp/locale'\nE       '/hom[68 chars]98f577bf3e14fda7d66b79904d/r2e_tests/pkgs/localeapp/locale'\nE       \nE       Diff is 1002 characters long. Set self.maxDiff to None to see it.\n\nr2e_tests/test_config/test_i18n.py:71: AssertionError\n_ TestI18NConfiguratorMixin.test_add_translation_dirs_multiple_specs_multiple_calls _\n\nself = <r2e_tests.test_config.test_i18n.TestI18NConfiguratorMixin testMethod=test_add_translation_dirs_multiple_specs_multiple_calls>\n\n    def test_add_translation_dirs_multiple_specs_multiple_calls(self):\n        from pyramid.interfaces import ITranslationDirectories\n        config = self._makeOne(autocommit=True)\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale',\n                                    'pyramid.tests.pkgs.localeapp:locale2')\n        config.add_translation_dirs('pyramid.tests.pkgs.localeapp:locale3')\n>       self.assertEqual(config.registry.getUtility(ITranslationDirectories),\n                         [locale3, locale, locale2])\nE       AssertionError: Lists differ: ['/ho[91 chars]904d/pyramid/tests/pkgs/localeapp/locale3', '/[269 chars]le2'] != ['/ho[91 chars]904d/r2e_tests/pkgs/localeapp/locale3', '/home[257 chars]le2']\nE       \nE       First differing element 0:\nE       '/hom[69 chars]8f577bf3e14fda7d66b79904d/pyramid/tests/pkgs/localeapp/locale3'\nE       '/hom[69 chars]8f577bf3e14fda7d66b79904d/r2e_tests/pkgs/localeapp/locale3'\nE       \nE       Diff is 1504 characters long. Set self.maxDiff to None to see it.\n\nr2e_tests/test_config/test_i18n.py:80: AssertionError\n___________________ ConfiguratorTests.test_ctor_no_registry ____________________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_ctor_no_registry>\n\n    def test_ctor_no_registry(self):\n        import sys\n        from pyramid.interfaces import ISettings\n        from pyramid.config import Configurator\n        from pyramid.interfaces import IRendererFactory\n        config = Configurator()\n        this_pkg = sys.modules['pyramid.tests.test_config']\n        self.assertTrue(config.registry.getUtility(ISettings))\n>       self.assertEqual(config.package, this_pkg)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_init.py: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:124: AssertionError\n_____________ ConfiguratorTests.test_include_constant_root_package _____________\n\nself = <r2e_tests.test_config.test_init.ConfiguratorTests testMethod=test_include_constant_root_package>\n\n    def test_include_constant_root_package(self):\n        from pyramid import tests\n        from pyramid.tests import test_config\n        config = self._makeOne(root_package=tests)\n        results = {}\n        def include(config):\n            results['package'] = config.package\n            results['root_package'] = config.root_package\n        config.include(include)\n        self.assertEqual(results['root_package'], tests)\n>       self.assertEqual(results['package'], test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_init.py:777: 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:1039: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \npyramid/config/__init__.py:652: in commit\n    self.action_state.execute_actions(introspector=self.introspector)\npyramid/config/__init__.py:1161: in execute_actions\n    action = next(pending_actions, None)\npyramid/config/__init__.py:1119: in resume\n    for a, b in zip_longest(actions, executed_actions):\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nactions = [{'args': (), 'callable': <function ViewsConfiguratorMixin.add_view.<locals>.register at 0x738e51f9d550>, 'discriminat...8e51f9da60>, 'discriminator': ('view', None, 'two', None, 'd41d8cd98f00b204e9800998ecf8427e'), 'includepath': (), ...}]\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 or  # not a prefix\n                            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_2c27c33e45350d98f577bf3e14fda7d66b79904d/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_2c27c33e45350d98f577bf3e14fda7d66b79904d/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_2c27c33e45350d98f577bf3e14fda7d66b79904d/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_2c27c33e45350d98f577bf3e14fda7d66b79904d/pyramid/tests/test_config/pkgs/selfscan/another.py:\nE                       def two(request):\n\npyramid/config/__init__.py:1297: 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:1048: 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:444: 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:1247: 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:1234: 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:1221: 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:1260: AssertionError\n_________ TestConfigurator__add_predicate.test_factory_as_dotted_name __________\n\nself = <r2e_tests.test_config.test_init.TestConfigurator__add_predicate testMethod=test_factory_as_dotted_name>\n\n    def test_factory_as_dotted_name(self):\n        config = self._makeOne()\n    \n        def _fakeAction(discriminator, callable=None, args=(),\n                        kw=None, order=0, introspectables=(), **extra):\n            self.assertEqual(len(introspectables), 1)\n            self.assertEqual(introspectables[0]['name'], 'testing')\n            self.assertEqual(introspectables[0]['factory'], DummyPredicate)\n    \n        config.action = _fakeAction\n>       config._add_predicate(\n            'route',\n            'testing',\n            'pyramid.tests.test_config.test_init.DummyPredicate'\n            )\n\nr2e_tests/test_config/test_init.py:1324: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \npyramid/config/__init__.py:541: in _add_predicate\n    self.action(discriminator, register, introspectables=(intr,),\nr2e_tests/test_config/test_init.py:1321: in _fakeAction\n    self.assertEqual(introspectables[0]['factory'], DummyPredicate)\nE   AssertionError: <class 'pyramid.tests.test_config.test_init.DummyPredicate'> != <class 'r2e_tests.test_config.test_init.DummyPredicate'>\n____ TestViewsConfigurationMixin.test_add_static_view_package_here_relative ____\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_static_view_package_here_relative>\n\n    def test_add_static_view_package_here_relative(self):\n        from pyramid.interfaces import IStaticURLInfo\n        info = DummyStaticURLInfo()\n        config = self._makeOne(autocommit=True)\n        config.registry.registerUtility(info, IStaticURLInfo)\n        config.add_static_view('static', 'files')\n>       self.assertEqual(\n            info.added,\n            [(config, 'static', 'pyramid.tests.test_config:files', {})])\nE       AssertionError: Lists differ: [(<py[39 chars]38e520e8a00>, 'static', 'r2e_tests.test_config:files', {})] != [(<py[39 chars]38e520e8a00>, 'static', 'pyramid.tests.test_config:files', {})]\nE       \nE       First differing element 0:\nE       (<pyr[37 chars]738e520e8a00>, 'static', 'r2e_tests.test_config:files', {})\nE       (<pyr[37 chars]738e520e8a00>, 'static', 'pyramid.tests.test_config:files', {})\nE       \nE         [(<pyramid.config.Configurator object at 0x738e520e8a00>,\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:1841: AssertionError\n_______ TestViewsConfigurationMixin.test_add_view_with_template_renderer _______\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_with_template_renderer>\n\n    def test_add_view_with_template_renderer(self):\n        from pyramid.tests import test_config\n        from pyramid.interfaces import ISettings\n        class view(object):\n            def __init__(self, context, request):\n                self.request = request\n                self.context = context\n    \n            def __call__(self):\n                return {'a':'1'}\n        config = self._makeOne(autocommit=True)\n        renderer = self._registerRenderer(config)\n        fixture = 'pyramid.tests.test_config:files/minimal.txt'\n        config.introspection = False\n        config.add_view(view=view, renderer=fixture)\n        wrapper = self._getViewCallable(config)\n        request = self._makeRequest(config)\n        result = wrapper(None, request)\n        self.assertEqual(result.body, b'Hello!')\n        settings = config.registry.queryUtility(ISettings)\n        result = renderer.info\n        self.assertEqual(result.registry, config.registry)\n        self.assertEqual(result.type, '.txt')\n>       self.assertEqual(result.package, test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_views.py:1142: AssertionError\n_ TestViewsConfigurationMixin.test_add_view_with_template_renderer_no_callable _\n\nself = <r2e_tests.test_config.test_views.TestViewsConfigurationMixin testMethod=test_add_view_with_template_renderer_no_callable>\n\n    def test_add_view_with_template_renderer_no_callable(self):\n        from pyramid.tests import test_config\n        from pyramid.interfaces import ISettings\n        config = self._makeOne(autocommit=True)\n        renderer = self._registerRenderer(config)\n        fixture = 'pyramid.tests.test_config:files/minimal.txt'\n        config.introspection = False\n        config.add_view(view=None, renderer=fixture)\n        wrapper = self._getViewCallable(config)\n        request = self._makeRequest(config)\n        result = wrapper(None, request)\n        self.assertEqual(result.body, b'Hello!')\n        settings = config.registry.queryUtility(ISettings)\n        result = renderer.info\n        self.assertEqual(result.registry, config.registry)\n        self.assertEqual(result.type, '.txt')\n>       self.assertEqual(result.package, test_config)\nE       AssertionError: <module 'r2e_tests.test_config' from '/home/gcpuse[117 chars].py'> != <module 'pyramid.tests.test_config' from '/home/gc[125 chars].py'>\n\nr2e_tests/test_config/test_views.py:1183: 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:2506: \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:411: 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:2508: 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:2525: \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:411: 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:2527: 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:2546: \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 0x738e51fa2af0> 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:411: 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:2549: 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:2592: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = None\nrequest = <r2e_tests.test_config.test_views.DummyRequest object at 0x738e51cd6ee0>\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:411: 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:2594: 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:2616: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\ncontext = None\nrequest = <r2e_tests.test_config.test_views.DummyRequest object at 0x738e52166a60>\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:411: 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:2618: 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:4139: AssertionError\n_______________ TestPRequestCommand.test_command_display_headers _______________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_display_headers>\n\n    def test_command_display_headers(self):\n        command = self._makeOne(\n            ['', '--display-headers', 'development.ini', '/'])\n        command.run()\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(\n            self._out,\n            ['200 OK', 'Content-Type: text/html; charset=UTF-8', 'abc'])\nE       AssertionError: Lists differ: ['200 OK', b'abc'] != ['200 OK', 'Content-Type: text/html; charset=UTF-8', 'abc']\nE       \nE       First differing element 1:\nE       b'abc'\nE       'Content-Type: text/html; charset=UTF-8'\nE       \nE       Second list contains 1 additional elements.\nE       First extra element 2:\nE       'abc'\nE       \nE       - ['200 OK', b'abc']\nE       + ['200 OK', 'Content-Type: text/html; charset=UTF-8', 'abc']\n\nr2e_tests/test_scripts/test_prequest.py:202: AssertionError\n_________ TestPRequestCommand.test_command_has_content_type_header_var _________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_has_content_type_header_var>\n\n    def test_command_has_content_type_header_var(self):\n        command = self._makeOne(\n            ['', '--header=content-type:app/foo','development.ini', '/'])\n        command.run()\n        self.assertEqual(self._environ['CONTENT_TYPE'], 'app/foo')\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:92: AssertionError\n_____________ TestPRequestCommand.test_command_has_good_header_var _____________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_has_good_header_var>\n\n    def test_command_has_good_header_var(self):\n        command = self._makeOne(\n            ['', '--header=name:value','development.ini', '/'])\n        command.run()\n        self.assertEqual(self._environ['HTTP_NAME'], 'value')\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:69: AssertionError\n__________ TestPRequestCommand.test_command_has_multiple_header_vars ___________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_has_multiple_header_vars>\n\n    def test_command_has_multiple_header_vars(self):\n        command = self._makeOne(\n            ['',\n             '--header=name:value',\n             '--header=name2:value2',\n             'development.ini',\n             '/'])\n        command.run()\n        self.assertEqual(self._environ['HTTP_NAME'], 'value')\n        self.assertEqual(self._environ['HTTP_NAME2'], 'value2')\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:107: AssertionError\n_________________ TestPRequestCommand.test_command_method_get __________________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_method_get>\n\n    def test_command_method_get(self):\n        command = self._makeOne(['', '--method=GET', 'development.ini', '/'])\n        command.run()\n        self.assertEqual(self._environ['REQUEST_METHOD'], 'GET')\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:116: AssertionError\n_______________ TestPRequestCommand.test_command_method_options ________________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_method_options>\n\n    def test_command_method_options(self):\n        from pyramid.compat import NativeIO\n        command = self._makeOne(['', '--method=OPTIONS', 'development.ini',\n                                '/'])\n        stdin = NativeIO()\n        command.stdin = stdin\n        command.run()\n        self.assertEqual(self._environ['REQUEST_METHOD'], 'OPTIONS')\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:184: AssertionError\n________________ TestPRequestCommand.test_command_method_patch _________________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_method_patch>\n\n    def test_command_method_patch(self):\n        from pyramid.compat import NativeIO\n        command = self._makeOne(['', '--method=PATCH', 'development.ini', '/'])\n        stdin = NativeIO()\n        command.stdin = stdin\n        command.run()\n        self.assertEqual(self._environ['REQUEST_METHOD'], 'PATCH')\n        self.assertEqual(self._environ['CONTENT_LENGTH'], '-1')\n        self.assertEqual(self._environ['wsgi.input'], stdin)\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:158: AssertionError\n_________________ TestPRequestCommand.test_command_method_post _________________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_method_post>\n\n    def test_command_method_post(self):\n        from pyramid.compat import NativeIO\n        command = self._makeOne(['', '--method=POST', 'development.ini', '/'])\n        stdin = NativeIO()\n        command.stdin = stdin\n        command.run()\n        self.assertEqual(self._environ['REQUEST_METHOD'], 'POST')\n        self.assertEqual(self._environ['CONTENT_LENGTH'], '-1')\n        self.assertEqual(self._environ['wsgi.input'], stdin)\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:130: AssertionError\n_______________ TestPRequestCommand.test_command_method_propfind _______________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_method_propfind>\n\n    def test_command_method_propfind(self):\n        from pyramid.compat import NativeIO\n        command = self._makeOne(['', '--method=PROPFIND', 'development.ini',\n                                '/'])\n        stdin = NativeIO()\n        command.stdin = stdin\n        command.run()\n        self.assertEqual(self._environ['REQUEST_METHOD'], 'PROPFIND')\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:171: AssertionError\n_________________ TestPRequestCommand.test_command_method_put __________________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_method_put>\n\n    def test_command_method_put(self):\n        from pyramid.compat import NativeIO\n        command = self._makeOne(['', '--method=PUT', 'development.ini', '/'])\n        stdin = NativeIO()\n        command.stdin = stdin\n        command.run()\n        self.assertEqual(self._environ['REQUEST_METHOD'], 'PUT')\n        self.assertEqual(self._environ['CONTENT_LENGTH'], '-1')\n        self.assertEqual(self._environ['wsgi.input'], stdin)\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:144: AssertionError\n________ TestPRequestCommand.test_command_path_doesnt_start_with_slash _________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_path_doesnt_start_with_slash>\n\n    def test_command_path_doesnt_start_with_slash(self):\n        command = self._makeOne(['', 'development.ini', 'abc'])\n        command.run()\n        self.assertEqual(self._path_info, '/abc')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:50: AssertionError\n__________________ TestPRequestCommand.test_command_two_args ___________________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_two_args>\n\n    def test_command_two_args(self):\n        command = self._makeOne(['', 'development.ini', '/'])\n        command.run()\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:42: AssertionError\n________________ TestPRequestCommand.test_command_w_basic_auth _________________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_w_basic_auth>\n\n    def test_command_w_basic_auth(self):\n        command = self._makeOne(\n            ['', '--login=user:password',\n                 '--header=name:value','development.ini', '/'])\n        command.run()\n        self.assertEqual(self._environ['HTTP_NAME'], 'value')\n        self.assertEqual(self._environ['HTTP_AUTHORIZATION'],\n                        'Basic dXNlcjpwYXNzd29yZA==')\n        self.assertEqual(self._path_info, '/')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:82: AssertionError\n______________ TestPRequestCommand.test_command_with_query_string ______________\n\nself = <r2e_tests.test_scripts.test_prequest.TestPRequestCommand testMethod=test_command_with_query_string>\n\n    def test_command_with_query_string(self):\n        command = self._makeOne(['', 'development.ini', '/abc?a=1&b=2&c'])\n        command.run()\n        self.assertEqual(self._environ['QUERY_STRING'], 'a=1&b=2&c')\n        self.assertEqual(self._path_info, '/abc')\n        self.assertEqual(self._spec, 'development.ini')\n        self.assertEqual(self._app_name, None)\n>       self.assertEqual(self._out, ['abc'])\nE       AssertionError: Lists differ: [b'abc'] != ['abc']\nE       \nE       First differing element 0:\nE       b'abc'\nE       'abc'\nE       \nE       - [b'abc']\nE       ?  -\nE       \nE       + ['abc']\n\nr2e_tests/test_scripts/test_prequest.py:193: AssertionError\n_______________ TestPRoutesCommand.test_config_format_ini_commas _______________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_config_format_ini_commas>\n\n    def test_config_format_ini_commas(self):\n        from pyramid.renderers import null_renderer as nr\n        from pyramid.config import not_\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method=not_('POST')\n        )\n    \n        command = self._makeOne()\n    \n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        config_factory = dummy.DummyConfigParserFactory()\n        command.ConfigParser = config_factory\n        config_factory.items = [('format', 'method,name')]\n    \n        result = command.run()\n>       self.assertEqual(result, 0)\nE       AssertionError: 2 != 0\n\nr2e_tests/test_scripts/test_proutes.py:726: AssertionError\n______________ TestPRoutesCommand.test_config_format_ini_newlines ______________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_config_format_ini_newlines>\n\n    def test_config_format_ini_newlines(self):\n        from pyramid.renderers import null_renderer as nr\n        from pyramid.config import not_\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method=not_('POST')\n        )\n    \n        command = self._makeOne()\n    \n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        config_factory = dummy.DummyConfigParserFactory()\n        command.ConfigParser = config_factory\n        config_factory.items = [('format', 'method\\nname')]\n    \n        result = command.run()\n>       self.assertEqual(result, 0)\nE       AssertionError: 2 != 0\n\nr2e_tests/test_scripts/test_proutes.py:660: AssertionError\n_______________ TestPRoutesCommand.test_config_format_ini_spaces _______________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_config_format_ini_spaces>\n\n    def test_config_format_ini_spaces(self):\n        from pyramid.renderers import null_renderer as nr\n        from pyramid.config import not_\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method=not_('POST')\n        )\n    \n        command = self._makeOne()\n    \n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        config_factory = dummy.DummyConfigParserFactory()\n        command.ConfigParser = config_factory\n        config_factory.items = [('format', 'method name')]\n    \n        result = command.run()\n>       self.assertEqual(result, 0)\nE       AssertionError: 2 != 0\n\nr2e_tests/test_scripts/test_proutes.py:693: AssertionError\n_________ TestPRoutesCommand.test_one_route_all_methods_view_only_post _________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_one_route_all_methods_view_only_post>\n\n    def test_one_route_all_methods_view_only_post(self):\n        from pyramid.renderers import null_renderer as nr\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method='POST'\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo', '/a/b',\n            'pyramid.tests.test_scripts.test_proutes.view1', 'POST'\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST'] != ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'POST']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'pyramid.tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST']\nE       ?                   ^^^\nE       \nE       + ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'POST']\nE       ?                  ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:309: AssertionError\n_________ TestPRoutesCommand.test_one_route_only_post_view_all_methods _________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_one_route_only_post_view_all_methods>\n\n    def test_one_route_only_post_view_all_methods(self):\n        from pyramid.renderers import null_renderer as nr\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b', request_method='POST')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo', '/a/b',\n            'pyramid.tests.test_scripts.test_proutes.view1', 'POST'\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST'] != ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'POST']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'pyramid.tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST']\nE       ?                   ^^^\nE       \nE       + ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'POST']\nE       ?                  ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:336: AssertionError\n________ TestPRoutesCommand.test_one_route_only_post_view_post_and_get _________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_one_route_only_post_view_post_and_get>\n\n    def test_one_route_only_post_view_post_and_get(self):\n        from pyramid.renderers import null_renderer as nr\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b', request_method='POST')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method=('POST', 'GET')\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo', '/a/b',\n            'pyramid.tests.test_scripts.test_proutes.view1', 'POST'\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST'] != ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'POST']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'pyramid.tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'POST']\nE       ?                   ^^^\nE       \nE       + ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'POST']\nE       ?                  ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:364: AssertionError\n_____ TestPRoutesCommand.test_one_route_with_long_name_one_view_registered _____\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_one_route_with_long_name_one_view_registered>\n\n    def test_one_route_with_long_name_one_view_registered(self):\n        from zope.interface import Interface\n        from pyramid.interfaces import IRouteRequest\n        from pyramid.interfaces import IViewClassifier\n        from pyramid.interfaces import IView\n        registry = self._makeRegistry()\n    \n        def view():pass\n    \n        class IMyRoute(Interface):\n            pass\n    \n        registry.registerAdapter(\n            view,\n            (IViewClassifier, IMyRoute, Interface),\n            IView, ''\n        )\n    \n        registry.registerUtility(IMyRoute, IRouteRequest,\n                                 name='very_long_name_123')\n    \n        command = self._makeOne()\n        route = dummy.DummyRoute(\n            'very_long_name_123',\n            '/and_very_long_pattern_as_well'\n        )\n        mapper = dummy.DummyMapper(route)\n        command._get_mapper = lambda *arg: mapper\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()[:3]\n>       self.assertEqual(\n            compare_to,\n            ['very_long_name_123',\n             '/and_very_long_pattern_as_well',\n             'pyramid.tests.test_scripts.test_proutes.view']\n        )\nE       AssertionError: Lists differ: ['ver[36 chars]ttern_as_well', 'r2e_tests.test_scripts.test_proutes.view'] != ['ver[36 chars]ttern_as_well', 'pyramid.tests.test_scripts.test_proutes.view']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view'\nE       'pyramid.tests.test_scripts.test_proutes.view'\nE       \nE         ['very_long_name_123',\nE          '/and_very_long_pattern_as_well',\nE       -  'r2e_tests.test_scripts.test_proutes.view']\nE       ?    ^^^\nE       \nE       +  'pyramid.tests.test_scripts.test_proutes.view']\nE       ?   ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:195: AssertionError\n______ TestPRoutesCommand.test_route_is_get_view_request_method_not_post _______\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_route_is_get_view_request_method_not_post>\n\n    def test_route_is_get_view_request_method_not_post(self):\n        from pyramid.renderers import null_renderer as nr\n        from pyramid.config import not_\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b', request_method='GET')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method=not_('POST')\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo', '/a/b',\n            'pyramid.tests.test_scripts.test_proutes.view1',\n            'GET'\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'GET'] != ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'GET']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'pyramid.tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', 'GET']\nE       ?                   ^^^\nE       \nE       + ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', 'GET']\nE       ?                  ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:503: AssertionError\n____________ TestPRoutesCommand.test_route_request_method_mismatch _____________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_route_request_method_mismatch>\n\n    def test_route_request_method_mismatch(self):\n        from pyramid.renderers import null_renderer as nr\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b', request_method='POST')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method='GET'\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo', '/a/b',\n            'pyramid.tests.test_scripts.test_proutes.view1',\n            '<route', 'mismatch>'\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1[20 chars]ch>'] != ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.v[24 chars]ch>']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'pyramid.tests.test_scripts.test_proutes.view1'\nE       \nE         ['foo',\nE          '/a/b',\nE       -  'r2e_tests.test_scripts.test_proutes.view1',\nE       ?    ^^^\nE       \nE       +  'pyramid.tests.test_scripts.test_proutes.view1',\nE       ?   ++ ^^^^^\nE       \nE          '<route',\nE          'mismatch>']\n\nr2e_tests/test_scripts/test_proutes.py:393: AssertionError\n__________________ TestPRoutesCommand.test_route_static_views __________________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_route_static_views>\n\n    def test_route_static_views(self):\n        from pyramid.renderers import null_renderer as nr\n        config = self._makeConfig(autocommit=True)\n        config.add_static_view('static', 'static', cache_max_age=3600)\n        config.add_static_view(name='static2', path='/var/www/static')\n        config.add_static_view(\n            name='pyramid_scaffold',\n            path='pyramid:scaffolds/starter/+package+/static'\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 5)\n    \n        expected = [\n            ['__static/', '/static/*subpath',\n             'pyramid.tests.test_scripts:static/', '*'],\n            ['__static2/', '/static2/*subpath', '/var/www/static/', '*'],\n            ['__pyramid_scaffold/', '/pyramid_scaffold/*subpath',\n             'pyramid:scaffolds/starter/+package+/static/',  '*'],\n        ]\n    \n        for index, line in enumerate(L[2:]):\n            data = line.split()\n>           self.assertEqual(data, expected[index])\nE           AssertionError: Lists differ: ['__static/', '/static/*subpath', 'r2e_tests.test_scripts:static/', '*'] != ['__static/', '/static/*subpath', 'pyramid.tests.test_scripts:static/', '*']\nE           \nE           First differing element 2:\nE           'r2e_tests.test_scripts:static/'\nE           'pyramid.tests.test_scripts:static/'\nE           \nE           - ['__static/', '/static/*subpath', 'r2e_tests.test_scripts:static/', '*']\nE           ?                                     ^^^\nE           \nE           + ['__static/', '/static/*subpath', 'pyramid.tests.test_scripts:static/', '*']\nE           ?                                    ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:423: AssertionError\n___________ TestPRoutesCommand.test_single_route_one_view_registered ___________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_single_route_one_view_registered>\n\n    def test_single_route_one_view_registered(self):\n        from zope.interface import Interface\n        from pyramid.interfaces import IRouteRequest\n        from pyramid.interfaces import IViewClassifier\n        from pyramid.interfaces import IView\n        registry = self._makeRegistry()\n    \n        def view():pass\n        class IMyRoute(Interface):\n            pass\n        registry.registerAdapter(view,\n                                 (IViewClassifier, IMyRoute, Interface),\n                                 IView, '')\n        registry.registerUtility(IMyRoute, IRouteRequest, name='a')\n        command = self._makeOne()\n        route = dummy.DummyRoute('a', '/a')\n        mapper = dummy.DummyMapper(route)\n        command._get_mapper = lambda *arg: mapper\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()[:3]\n>       self.assertEqual(\n            compare_to,\n            ['a', '/a', 'pyramid.tests.test_scripts.test_proutes.view']\n        )\nE       AssertionError: Lists differ: ['a', '/a', 'r2e_tests.test_scripts.test_proutes.view'] != ['a', '/a', 'pyramid.tests.test_scripts.test_proutes.view']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view'\nE       'pyramid.tests.test_scripts.test_proutes.view'\nE       \nE       - ['a', '/a', 'r2e_tests.test_scripts.test_proutes.view']\nE       ?               ^^^\nE       \nE       + ['a', '/a', 'pyramid.tests.test_scripts.test_proutes.view']\nE       ?              ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:155: AssertionError\n______________________ TestPRoutesCommand.test_view_glob _______________________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_view_glob>\n\n    def test_view_glob(self):\n        from pyramid.renderers import null_renderer as nr\n        from pyramid.config import not_\n    \n        def view1(context, request): return 'view1'\n        def view2(context, request): return 'view2'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method=not_('POST')\n        )\n    \n        config.add_route('bar', '/b/a')\n        config.add_view(\n            route_name='bar',\n            view=view2,\n            renderer=nr,\n            request_method=not_('POST')\n        )\n    \n        command = self._makeOne()\n        command.options.glob = '*foo*'\n    \n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo', '/a/b',\n            'pyramid.tests.test_scripts.test_proutes.view1',\n            '!POST,*'\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', '!POST,*'] != ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', '!POST,*']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'pyramid.tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', '!POST,*']\nE       ?                   ^^^\nE       \nE       + ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', '!POST,*']\nE       ?                  ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:574: AssertionError\n_____________ TestPRoutesCommand.test_view_request_method_not_post _____________\n\nself = <r2e_tests.test_scripts.test_proutes.TestPRoutesCommand testMethod=test_view_request_method_not_post>\n\n    def test_view_request_method_not_post(self):\n        from pyramid.renderers import null_renderer as nr\n        from pyramid.config import not_\n    \n        def view1(context, request): return 'view1'\n    \n        config = self._makeConfig(autocommit=True)\n        config.add_route('foo', '/a/b')\n        config.add_view(\n            route_name='foo',\n            view=view1,\n            renderer=nr,\n            request_method=not_('POST')\n        )\n    \n        command = self._makeOne()\n        L = []\n        command.out = L.append\n        command.bootstrap = (dummy.DummyBootstrap(registry=config.registry),)\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(len(L), 3)\n        compare_to = L[-1].split()\n        expected = [\n            'foo', '/a/b',\n            'pyramid.tests.test_scripts.test_proutes.view1',\n            '!POST,*'\n        ]\n>       self.assertEqual(compare_to, expected)\nE       AssertionError: Lists differ: ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', '!POST,*'] != ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', '!POST,*']\nE       \nE       First differing element 2:\nE       'r2e_tests.test_scripts.test_proutes.view1'\nE       'pyramid.tests.test_scripts.test_proutes.view1'\nE       \nE       - ['foo', '/a/b', 'r2e_tests.test_scripts.test_proutes.view1', '!POST,*']\nE       ?                   ^^^\nE       \nE       + ['foo', '/a/b', 'pyramid.tests.test_scripts.test_proutes.view1', '!POST,*']\nE       ?                  ++ ^^^^^\n\nr2e_tests/test_scripts/test_proutes.py:533: AssertionError\n_____ TestPViewsCommand.test_views_command_single_view_function_traversal ______\n\nself = <r2e_tests.test_scripts.test_pviews.TestPViewsCommand testMethod=test_views_command_single_view_function_traversal>\n\n    def test_views_command_single_view_function_traversal(self):\n        from pyramid.registry import Registry\n        registry = Registry()\n        command = self._makeOne(registry=registry)\n        L = []\n        command.out = L.append\n        def view(): pass\n        view.__request_attrs__ = {'context': 'context', 'view_name': 'a'}\n        command._find_view = lambda arg1: view\n        command.args = ('/foo/bar/myapp.ini#myapp', '/a')\n        result = command.run()\n        self.assertEqual(result, 0)\n        self.assertEqual(L[1], 'URL = /a')\n        self.assertEqual(L[3], '    context: context')\n        self.assertEqual(L[4], '    view name: a')\n>       self.assertEqual(L[8],\n                         '    pyramid.tests.test_scripts.test_pviews.view')\nE       AssertionError: '    r2e_tests.test_scripts.test_pviews.view' != '    pyramid.tests.test_scripts.test_pviews.view'\nE       -     r2e_tests.test_scripts.test_pviews.view\nE       ?      ^^^\nE       +     pyramid.tests.test_scripts.test_pviews.view\nE       ?     ++ ^^^^^\n\nr2e_tests/test_scripts/test_pviews.py:296: AssertionError\n==================================== PASSES ====================================\n=========================== short test summary info ============================\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test__set_cookie_cookieval_too_long\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test__set_cookie_on_exception\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test__set_cookie_on_exception_no_request_exception\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test__set_cookie_options\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test__set_cookie_real_webob_response\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_changed\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_cookie_is_set\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_ctor_no_cookie\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_ctor_with_bad_cookie_cannot_deserialize\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_ctor_with_bad_cookie_not_tuple\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_ctor_with_cookie_expired\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_ctor_with_cookie_still_valid\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_flash_allow_duplicate_false\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_flash_allow_duplicate_false_and_msg_not_in_storage\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_flash_allow_duplicate_true_and_msg_not_in_storage\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_flash_default\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_flash_mixed\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_get_csrf_token\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_get_csrf_token_new\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_instance_conforms\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_invalidate\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_new_csrf_token\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_no_set_cookie_with_exception\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_peek_flash_default_queue\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_peek_flash_nodefault_queue\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_pop_flash_default_queue\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_pop_flash_nodefault_queue\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_reissue_never\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_reissue_not_triggered\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_reissue_triggered\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_set_cookie_with_exception\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_timeout\nPASSED r2e_tests/test_1.py::TestBaseCookieSession::test_timeout_never\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test__set_cookie_cookieval_too_long\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test__set_cookie_on_exception\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test__set_cookie_on_exception_no_request_exception\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test__set_cookie_options\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test__set_cookie_real_webob_response\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_changed\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_cookie_is_set\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_ctor_no_cookie\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_ctor_with_bad_cookie_cannot_deserialize\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_ctor_with_bad_cookie_not_tuple\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_ctor_with_cookie_expired\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_ctor_with_cookie_still_valid\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_custom_hashalg\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_custom_salt\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_custom_serializer\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_flash_allow_duplicate_false\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_flash_allow_duplicate_false_and_msg_not_in_storage\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_flash_allow_duplicate_true_and_msg_not_in_storage\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_flash_default\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_flash_mixed\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_get_csrf_token\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_get_csrf_token_new\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_hashalg_mismatch\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_instance_conforms\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_invalid_data_size\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_invalidate\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_new_csrf_token\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_no_set_cookie_with_exception\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_peek_flash_default_queue\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_peek_flash_nodefault_queue\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_pop_flash_default_queue\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_pop_flash_nodefault_queue\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_reissue_never\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_reissue_not_triggered\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_reissue_triggered\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_salt_mismatch\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_secret_mismatch\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_set_cookie_with_exception\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_timeout\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_timeout_never\nPASSED r2e_tests/test_1.py::TestSignedCookieSession::test_very_long_key\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test__set_cookie_cookieval_too_long\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test__set_cookie_on_exception\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test__set_cookie_on_exception_no_request_exception\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test__set_cookie_options\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test__set_cookie_real_webob_response\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_changed\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_cookie_is_set\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_ctor_no_cookie\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_ctor_with_bad_cookie_cannot_deserialize\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_ctor_with_bad_cookie_not_tuple\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_ctor_with_cookie_expired\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_ctor_with_cookie_still_valid\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_deserialize_option\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_flash_allow_duplicate_false\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_flash_allow_duplicate_false_and_msg_not_in_storage\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_flash_allow_duplicate_true_and_msg_not_in_storage\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_flash_default\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_flash_mixed\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_get_csrf_token\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_get_csrf_token_new\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_instance_conforms\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_invalidate\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_new_csrf_token\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_no_set_cookie_with_exception\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_peek_flash_default_queue\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_peek_flash_nodefault_queue\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_pop_flash_default_queue\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_pop_flash_nodefault_queue\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_reissue_triggered\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_serialize_option\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_set_cookie_with_exception\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_timeout\nPASSED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_timeout_never\nPASSED r2e_tests/test_1.py::Test_manage_accessed::test_accessed_set\nPASSED r2e_tests/test_1.py::Test_manage_accessed::test_accessed_without_renew\nPASSED r2e_tests/test_1.py::Test_manage_accessed::test_already_dirty\nPASSED r2e_tests/test_1.py::Test_manage_changed::test_it\nPASSED r2e_tests/test_1.py::Test_signed_serialize::test_it\nPASSED r2e_tests/test_1.py::Test_signed_serialize::test_it_with_highorder_secret\nPASSED r2e_tests/test_1.py::Test_signed_serialize::test_it_with_latin1_secret\nPASSED r2e_tests/test_1.py::Test_signed_deserialize::test_invalid_bits\nPASSED r2e_tests/test_1.py::Test_signed_deserialize::test_invalid_len\nPASSED r2e_tests/test_1.py::Test_signed_deserialize::test_it\nPASSED r2e_tests/test_1.py::Test_signed_deserialize::test_it_bad_encoding\nPASSED r2e_tests/test_1.py::Test_signed_deserialize::test_it_with_highorder_secret\nPASSED r2e_tests/test_1.py::Test_signed_deserialize::test_it_with_latin1_secret\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_authenticated_userid\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_authenticated_userid_None\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_authenticated_userid_repoze_who_userid_is_None\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_authenticated_userid_unclean_principal_Authenticated\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_authenticated_userid_unclean_principal_Everyone\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_authenticated_userid_with_callback_returns_None\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_authenticated_userid_with_callback_returns_something\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_class_implements_IAuthenticationPolicy\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_effective_principals_None\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_effective_principals_repoze_who_userid_is_None\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_effective_principals_repoze_who_userid_is_unclean_Authenticated\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_effective_principals_repoze_who_userid_is_unclean_Everyone\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_effective_principals_userid_and_groups\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_effective_principals_userid_callback_returns_None\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_effective_principals_userid_only\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_forget\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_forget_no_plugins\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_instance_implements_IAuthenticationPolicy\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_remember\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_remember_kwargs\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_remember_no_plugins\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_unauthenticated_userid\nPASSED r2e_tests/test_2.py::TestRepozeWho1AuthenticationPolicy::test_unauthenticated_userid_returns_None\nPASSED r2e_tests/test_2.py::TestRemoteUserAuthenticationPolicy::test_authenticated_userid\nPASSED r2e_tests/test_2.py::TestRemoteUserAuthenticationPolicy::test_authenticated_userid_None\nPASSED r2e_tests/test_2.py::TestRemoteUserAuthenticationPolicy::test_class_implements_IAuthenticationPolicy\nPASSED r2e_tests/test_2.py::TestRemoteUserAuthenticationPolicy::test_effective_principals\nPASSED r2e_tests/test_2.py::TestRemoteUserAuthenticationPolicy::test_effective_principals_None\nPASSED r2e_tests/test_2.py::TestRemoteUserAuthenticationPolicy::test_forget\nPASSED r2e_tests/test_2.py::TestRemoteUserAuthenticationPolicy::test_instance_implements_IAuthenticationPolicy\nPASSED r2e_tests/test_2.py::TestRemoteUserAuthenticationPolicy::test_remember\nPASSED r2e_tests/test_2.py::TestRemoteUserAuthenticationPolicy::test_unauthenticated_userid\nPASSED r2e_tests/test_2.py::TestRemoteUserAuthenticationPolicy::test_unauthenticated_userid_returns_None\nPASSED r2e_tests/test_2.py::TestAuthTktAuthenticationPolicy::test_allargs\nPASSED r2e_tests/test_2.py::TestAuthTktAuthenticationPolicy::test_authenticated_userid\nPASSED r2e_tests/test_2.py::TestAuthTktAuthenticationPolicy::test_authenticated_userid_callback_returns_None\nPASSED r2e_tests/test_2.py::TestAuthTktAuthenticationPolicy::test_authenticated_userid_no_cookie_identity\nPASSED r2e_tests/test_2.py::TestAuthTktAuthenticationPolicy::test_class_implements_IAuthenticationPolicy\nPASSED r2e_tests/test_2.py::TestAuthTktAuthenticationPolicy::test_effective_principals\nPASSED r2e_tests/test_2.py::TestAuthTktAuthenticationPolicy::test_effective_principals_callback_returns_None\nPASSED r2e_tests/test_2.py::TestAuthTktAuthenticationPolicy::test_effective_principals_no_cookie_identity\nPASSED r2e_tests/test_2.py::TestAuthTktAuthenticationPolicy::test_forget\nPASSED r2e_tests/test_2.py::TestAuthTktAuthenticationPolicy::test_hashalg_override\nPASSED r2e_tests/test_2.py::TestAuthTktAuthenticationPolicy::test_instance_implements_IAuthenticationPolicy\nPASSED r2e_tests/test_2.py::TestAuthTktAuthenticationPolicy::test_remember\nPASSED r2e_tests/test_2.py::TestAuthTktAuthenticationPolicy::test_remember_with_extra_kargs\nPASSED r2e_tests/test_2.py::TestAuthTktAuthenticationPolicy::test_unauthenticated_userid\nPASSED r2e_tests/test_2.py::TestAuthTktAuthenticationPolicy::test_unauthenticated_userid_returns_None\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_forget\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_identify_bad_cookie\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_identify_cookie_reissue\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_identify_cookie_reissue_already_reissued_this_request\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_identify_cookie_reissue_notyet\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_identify_cookie_reissue_revoked_by_forget\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_identify_cookie_reissue_revoked_by_remember\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_identify_cookie_reissue_with_tokens_default\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_identify_cookie_timed_out\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_identify_cookie_value_is_None\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_identify_good_cookie_b64str_useridtype\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_identify_good_cookie_b64unicode_useridtype\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_identify_good_cookie_dont_include_ip\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_identify_good_cookie_include_ip\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_identify_good_cookie_include_ipv6\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_identify_good_cookie_int_useridtype\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_identify_good_cookie_unknown_useridtype\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_identify_nocookie\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_identify_nonuseridtype_user_data\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_remember\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_remember_binary_userid\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_remember_domain_supercedes_parent_and_wild_domain\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_remember_explicit_domain\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_remember_http_only\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_remember_include_ip\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_remember_insane_userid\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_remember_int_userid\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_remember_invalid_token_format\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_remember_long_userid\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_remember_max_age\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_remember_nonascii_token\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_remember_parent_domain\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_remember_parent_domain_supercedes_wild_domain\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_remember_path\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_remember_secure\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_remember_str_max_age\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_remember_str_max_age_invalid\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_remember_tokens\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_remember_unicode_but_ascii_token\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_remember_unicode_userid\nPASSED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_remember_wild_domain_disabled\nPASSED r2e_tests/test_2.py::TestAuthTicket::test_cookie_value\nPASSED r2e_tests/test_2.py::TestAuthTicket::test_ctor_with_time\nPASSED r2e_tests/test_2.py::TestAuthTicket::test_ctor_with_tokens\nPASSED r2e_tests/test_2.py::TestAuthTicket::test_digest\nPASSED r2e_tests/test_2.py::TestAuthTicket::test_digest_sha512\nPASSED r2e_tests/test_2.py::TestAuthTicket::test_ipv4\nPASSED r2e_tests/test_2.py::TestAuthTicket::test_ipv6\nPASSED r2e_tests/test_2.py::TestBadTicket::test_it\nPASSED r2e_tests/test_2.py::Test_parse_ticket::test_bad_timestamp\nPASSED r2e_tests/test_2.py::Test_parse_ticket::test_bad_userid_or_data\nPASSED r2e_tests/test_2.py::Test_parse_ticket::test_correct_with_user_data\nPASSED r2e_tests/test_2.py::Test_parse_ticket::test_correct_with_user_data_sha512\nPASSED r2e_tests/test_2.py::Test_parse_ticket::test_digest_sig_incorrect\nPASSED r2e_tests/test_2.py::Test_parse_ticket::test_ipv4\nPASSED r2e_tests/test_2.py::Test_parse_ticket::test_ipv6\nPASSED r2e_tests/test_2.py::TestSessionAuthenticationPolicy::test_authenticated_userid\nPASSED r2e_tests/test_2.py::TestSessionAuthenticationPolicy::test_authenticated_userid_callback_returns_None\nPASSED r2e_tests/test_2.py::TestSessionAuthenticationPolicy::test_authenticated_userid_no_cookie_identity\nPASSED r2e_tests/test_2.py::TestSessionAuthenticationPolicy::test_class_implements_IAuthenticationPolicy\nPASSED r2e_tests/test_2.py::TestSessionAuthenticationPolicy::test_effective_principals\nPASSED r2e_tests/test_2.py::TestSessionAuthenticationPolicy::test_effective_principals_callback_returns_None\nPASSED r2e_tests/test_2.py::TestSessionAuthenticationPolicy::test_effective_principals_no_identity\nPASSED r2e_tests/test_2.py::TestSessionAuthenticationPolicy::test_forget\nPASSED r2e_tests/test_2.py::TestSessionAuthenticationPolicy::test_forget_no_identity\nPASSED r2e_tests/test_2.py::TestSessionAuthenticationPolicy::test_instance_implements_IAuthenticationPolicy\nPASSED r2e_tests/test_2.py::TestSessionAuthenticationPolicy::test_remember\nPASSED r2e_tests/test_2.py::TestSessionAuthenticationPolicy::test_unauthenticated_userid\nPASSED r2e_tests/test_2.py::TestSessionAuthenticationPolicy::test_unauthenticated_userid_returns_None\nPASSED r2e_tests/test_2.py::TestBasicAuthAuthenticationPolicy::test_authenticated_userid\nPASSED r2e_tests/test_2.py::TestBasicAuthAuthenticationPolicy::test_authenticated_userid_latin1\nPASSED r2e_tests/test_2.py::TestBasicAuthAuthenticationPolicy::test_authenticated_userid_utf8\nPASSED r2e_tests/test_2.py::TestBasicAuthAuthenticationPolicy::test_class_implements_IAuthenticationPolicy\nPASSED r2e_tests/test_2.py::TestBasicAuthAuthenticationPolicy::test_forget\nPASSED r2e_tests/test_2.py::TestBasicAuthAuthenticationPolicy::test_remember\nPASSED r2e_tests/test_2.py::TestBasicAuthAuthenticationPolicy::test_unauthenticated_bad_header\nPASSED r2e_tests/test_2.py::TestBasicAuthAuthenticationPolicy::test_unauthenticated_userid\nPASSED r2e_tests/test_2.py::TestBasicAuthAuthenticationPolicy::test_unauthenticated_userid_corrupt_base64\nPASSED r2e_tests/test_2.py::TestBasicAuthAuthenticationPolicy::test_unauthenticated_userid_invalid_payload\nPASSED r2e_tests/test_2.py::TestBasicAuthAuthenticationPolicy::test_unauthenticated_userid_no_credentials\nPASSED r2e_tests/test_2.py::TestBasicAuthAuthenticationPolicy::test_unauthenticated_userid_not_basic\nPASSED r2e_tests/test_2.py::TestSimpleSerializer::test_dumps\nPASSED r2e_tests/test_2.py::TestSimpleSerializer::test_loads\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_object_event_subscriber\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_resource_url_default_resource_iface_means_Interface\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_resource_url_nodefault_resource_iface\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_response_adapter\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_response_adapter_dottednames\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_response_adapter_self\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_defaults\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_dottednames\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_iface_specified\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_predicate\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_with_default_type_predicates_False\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_with_default_type_predicates_True\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_with_specific_type_and_predicates_False\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_subscriber_with_specific_type_and_predicates_True\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_traverser_default_iface_means_Interface\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_traverser_introspectables\nPASSED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_traverser_nondefault_iface\nPASSED r2e_tests/test_config/test_adapters.py::Test_eventonly::test_defaults\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test__override_already_registered\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test__override_not_yet_registered\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_directory_with_absdirectory\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_directory_with_absfile\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_directory_with_file\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_absdirectory\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_absfile\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_directory\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_missing_abspath\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_package\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_package_with_absdirectory\nPASSED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_samename\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_filename_override_returns_value\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_stream_no_overrides\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_stream_override_returns_None\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_stream_override_returns_value\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_string_no_overrides\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_string_override_returns_None\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_string_override_returns_value\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_has_resource_no_overrides\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_has_resource_override_returns_None\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_has_resource_override_returns_True\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_isdir_no_overrides\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_isdir_override_returns_False\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_isdir_override_returns_None\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_listdir_no_overrides\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_listdir_override_returns_None\nPASSED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_resource_listdir_override_returns_values\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_class_conforms_to_IPEP302Loader\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_class_conforms_to_IPackageOverrides\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_ctor_package_already_has_loader_of_different_type\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_ctor_package_already_has_loader_of_same_type\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_ctor_registers_loader_type\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_ctor_sets_loader\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_ctor_sets_local_state\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_filtered_sources\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_code_pkg_has___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_code_pkg_has_no___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_data_pkg_has___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_data_pkg_has_no___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_filename\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_filename_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_source_pkg_has___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_source_pkg_has_no___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_stream\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_stream_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_string\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_get_string_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_has_resource\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_has_resource_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_insert_directory\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_insert_emptystring\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_insert_file\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_instance_conforms_to_IPEP302Loader\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_instance_conforms_to_IPackageOverrides\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_is_package_pkg_has___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_is_package_pkg_has_no___loader__\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_isdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_isdir_false\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_isdir_true\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_listdir\nPASSED r2e_tests/test_config/test_assets.py::TestPackageOverrides::test_listdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_exists\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_exists_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_exists_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_filename_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_stream\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_stream_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_stream_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_string\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_string_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_string_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_isdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_isdir_false\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_isdir_true\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_listdir\nPASSED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_listdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_exists\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_exists_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_exists_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_filename\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_filename_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_filename_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_stream\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_stream_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_stream_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_string\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_string_file_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_get_string_with_prefix\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_isdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_isdir_false\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_isdir_true\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_listdir\nPASSED r2e_tests/test_config/test_assets.py::TestFSAssetSource::test_listdir_doesnt_exist\nPASSED r2e_tests/test_config/test_assets.py::TestDirectoryOverride::test_it_match\nPASSED r2e_tests/test_config/test_assets.py::TestDirectoryOverride::test_it_no_match\nPASSED r2e_tests/test_config/test_assets.py::TestFileOverride::test_it_match\nPASSED r2e_tests/test_config/test_assets.py::TestFileOverride::test_it_no_match\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_None_callable\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_None_callable_and_no_name\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_None_callable_conflict\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_callable\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_text_type_name\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_add_request_method_with_unnamed_callable\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_multiple_request_methods_conflict\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_request_factory\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_request_factory_dottedname\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_response_factory\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_response_factory_dottedname\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_root_factory\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_root_factory_as_None\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_root_factory_dottedname\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_session_factory\nPASSED r2e_tests/test_config/test_factories.py::TestFactoriesMixin::test_set_session_factory_dottedname\nPASSED r2e_tests/test_config/test_factories.py::TestDeprecatedFactoriesMixinMethods::test_set_multiple_request_properties\nPASSED r2e_tests/test_config/test_factories.py::TestDeprecatedFactoriesMixinMethods::test_set_multiple_request_properties_conflict\nPASSED r2e_tests/test_config/test_factories.py::TestDeprecatedFactoriesMixinMethods::test_set_request_property_with_callable\nPASSED r2e_tests/test_config/test_factories.py::TestDeprecatedFactoriesMixinMethods::test_set_request_property_with_property\nPASSED r2e_tests/test_config/test_factories.py::TestDeprecatedFactoriesMixinMethods::test_set_request_property_with_unnamed_callable\nPASSED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_missing_dir\nPASSED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_add_translation_dirs_no_specs\nPASSED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_set_locale_negotiator\nPASSED r2e_tests/test_config/test_i18n.py::TestI18NConfiguratorMixin::test_set_locale_negotiator_dottedname\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test___getattr__matches\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test___getattr__matches_no_action_wrap\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test___getattr__missing_when_directives_dont_exist\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test___getattr__missing_when_directives_exist\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_adds__lock\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_adds_clear_view_lookup_cache\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_has_listeners\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_notify\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_queryAdapterOrSelf\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test__fix_registry_registerSelfAdapter\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_absolute_asset_spec_already_absolute\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_absolute_asset_spec_notastring\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_absolute_asset_spec_relative\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_autocommit_with_introspectables\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_autocommit_with_introspectables_introspection_off\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_branching_kw_is_None\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_branching_kw_is_not_None\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_branching_nonautocommit_with_config_info\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_branching_nonautocommit_with_introspectables\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_branching_nonautocommit_without_config_info\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_action_nonautocommit_with_introspectables_introspection_off\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_autocommit_no_conflicts\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_begin\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_begin_with_request\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_commit_conflict_resolved_with_include\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_commit_conflict_resolved_with_two_includes_and_local\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_commit_conflict_simple\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_commit_conflict_with_two_includes\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_conflict_set_forbidden_view\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_conflict_set_notfound_view\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_alternate_renderers\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_authentication_policy\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_authorization_policy_only\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_default_permission\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_default_renderers\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_default_view_mapper\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_default_webob_response_adapter_registered\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_exceptionresponse_view_None\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_exceptionresponse_view_custom\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_httpexception_view_default\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_no_root_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_noreg_custom_settings\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_noreg_debug_logger_non_None\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_session_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_with_introspection\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_with_package_registry\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_ctor_with_root_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_end\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_hook_zca\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_dotted_name\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_missing_source_file\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_module_defaults_to_includeme\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_module_defaults_to_includeme_missing\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_nested_route_prefix\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_python_callable\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_include_with_route_prefix\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_introspector_decorator\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_make_wsgi_app\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_maybe_dotted_notstring_success\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_maybe_dotted_string_fail\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_maybe_dotted_string_success\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration_dottedname_package\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration_with_extra_kw\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration_with_ignore\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration_with_onerror\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_alternate_renderers\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authentication_policy\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authentication_policy_dottedname\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authorization_policy_dottedname\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_authorization_policy_only\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_calls_fix_registry\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_custom_settings\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_debug_logger_name\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_debug_logger_non_None\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_default_permission\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_dottedname_root_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_explicit_notfound_trumps_iexceptionresponse\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_includes\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_includes_spaces\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_locale_negotiator\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_locale_negotiator_dottedname\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_no_default_root_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_registers_default_exceptionresponse_views\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_registers_default_view_predicates\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_registers_default_webob_iresponse_adapter\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_request_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_request_factory_dottedname\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_response_factory\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_tweens\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_unhook_zca\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_with_package\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_with_package_module\nPASSED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_with_package_package\nPASSED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_directive_persists_across_configurator_creations\nPASSED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_extend_action_method_successful\nPASSED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_extend_same_name_doesnt_conflict\nPASSED r2e_tests/test_config/test_init.py::TestConfigurator__add_predicate::test_factory_as_object\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_simple\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_with_includepath\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_with_includepath_and_info\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_with_info\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_with_introspectables\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_action_with_order\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_execute_actions_dicts\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_execute_actions_error\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_execute_actions_tuples\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_execute_actions_with_introspectable_no_callable\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_execute_actions_with_introspectables\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_it\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_processSpec\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_reentrant_action\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_reentrant_action_error\nPASSED r2e_tests/test_config/test_init.py::TestActionState::test_reentrant_action_without_clear\nPASSED r2e_tests/test_config/test_init.py::Test_reentrant_action_functional::test_functional\nPASSED r2e_tests/test_config/test_init.py::Test_resolveConflicts::test_it_conflict\nPASSED r2e_tests/test_config/test_init.py::Test_resolveConflicts::test_it_success_dicts\nPASSED r2e_tests/test_config/test_init.py::Test_resolveConflicts::test_it_success_tuples\nPASSED r2e_tests/test_config/test_init.py::Test_resolveConflicts::test_it_with_actions_grouped_by_order\nPASSED r2e_tests/test_config/test_init.py::TestGlobalRegistriesIntegration::test_global_registries\nPASSED r2e_tests/test_config/test_init.py::TestGlobalRegistriesIntegration::test_global_registries_empty\nPASSED r2e_tests/test_config/test_predicates.py::TestXHRPredicate::test___call___false\nPASSED r2e_tests/test_config/test_predicates.py::TestXHRPredicate::test___call___true\nPASSED r2e_tests/test_config/test_predicates.py::TestXHRPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::TestXHRPredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestMethodPredicate::test___call___false\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestMethodPredicate::test___call___true_multi\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestMethodPredicate::test___call___true_single\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestMethodPredicate::test_ctor_get_but_no_head\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestMethodPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestMethodPredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::TestPathInfoPredicate::test___call___false\nPASSED r2e_tests/test_config/test_predicates.py::TestPathInfoPredicate::test___call___true\nPASSED r2e_tests/test_config/test_predicates.py::TestPathInfoPredicate::test_ctor_compilefail\nPASSED r2e_tests/test_config/test_predicates.py::TestPathInfoPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::TestPathInfoPredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test___call___false\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test___call___false_multi\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test___call___true_exists\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test___call___true_multi\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test___call___true_withval\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test_phash_exists\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test_phash_withval\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test_text_exists\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test_text_multi\nPASSED r2e_tests/test_config/test_predicates.py::TestRequestParamPredicate::test_text_withval\nPASSED r2e_tests/test_config/test_predicates.py::TestMatchParamPredicate::test___call___false\nPASSED r2e_tests/test_config/test_predicates.py::TestMatchParamPredicate::test___call___matchdict_is_None\nPASSED r2e_tests/test_config/test_predicates.py::TestMatchParamPredicate::test___call___true_multi\nPASSED r2e_tests/test_config/test_predicates.py::TestMatchParamPredicate::test___call___true_single\nPASSED r2e_tests/test_config/test_predicates.py::TestMatchParamPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::TestMatchParamPredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::TestCustomPredicate::test___call___false\nPASSED r2e_tests/test_config/test_predicates.py::TestCustomPredicate::test___call___true\nPASSED r2e_tests/test_config/test_predicates.py::TestCustomPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::TestCustomPredicate::test_text_func_has___text__\nPASSED r2e_tests/test_config/test_predicates.py::TestCustomPredicate::test_text_func_repr\nPASSED r2e_tests/test_config/test_predicates.py::TestTraversePredicate::test___call__traverse_has_remainder_already\nPASSED r2e_tests/test_config/test_predicates.py::TestTraversePredicate::test___call__traverse_matches\nPASSED r2e_tests/test_config/test_predicates.py::TestTraversePredicate::test___call__traverse_matches_with_highorder_chars\nPASSED r2e_tests/test_config/test_predicates.py::TestTraversePredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::TestTraversePredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::Test_CheckCSRFTokenPredicate::test_it_call_val_False\nPASSED r2e_tests/test_config/test_predicates.py::Test_CheckCSRFTokenPredicate::test_it_call_val_True\nPASSED r2e_tests/test_config/test_predicates.py::Test_CheckCSRFTokenPredicate::test_it_call_val_str\nPASSED r2e_tests/test_config/test_predicates.py::Test_CheckCSRFTokenPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::Test_CheckCSRFTokenPredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test___call___false\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test___call___false_withregex\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test___call___true_exists\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test___call___true_withregex\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test___call___true_withval\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test_phash_exists\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test_phash_withregex\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test_phash_withval\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test_text_exists\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test_text_withregex\nPASSED r2e_tests/test_config/test_predicates.py::TestHeaderPredicate::test_text_withval\nPASSED r2e_tests/test_config/test_predicates.py::Test_PhysicalPathPredicate::test_it_call_False\nPASSED r2e_tests/test_config/test_predicates.py::Test_PhysicalPathPredicate::test_it_call_context_has_no_name\nPASSED r2e_tests/test_config/test_predicates.py::Test_PhysicalPathPredicate::test_it_call_val_list_True\nPASSED r2e_tests/test_config/test_predicates.py::Test_PhysicalPathPredicate::test_it_call_val_str_True\nPASSED r2e_tests/test_config/test_predicates.py::Test_PhysicalPathPredicate::test_it_call_val_tuple_True\nPASSED r2e_tests/test_config/test_predicates.py::Test_PhysicalPathPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::Test_PhysicalPathPredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::Test_EffectivePrincipalsPredicate::test_it_call_authentication_policy_doesnt_provide_superset\nPASSED r2e_tests/test_config/test_predicates.py::Test_EffectivePrincipalsPredicate::test_it_call_authentication_policy_provides_superset\nPASSED r2e_tests/test_config/test_predicates.py::Test_EffectivePrincipalsPredicate::test_it_call_authentication_policy_provides_superset_implicit\nPASSED r2e_tests/test_config/test_predicates.py::Test_EffectivePrincipalsPredicate::test_it_call_no_authentication_policy\nPASSED r2e_tests/test_config/test_predicates.py::Test_EffectivePrincipalsPredicate::test_phash\nPASSED r2e_tests/test_config/test_predicates.py::Test_EffectivePrincipalsPredicate::test_text\nPASSED r2e_tests/test_config/test_predicates.py::Test_EffectivePrincipalsPredicate::test_text_noniter\nPASSED r2e_tests/test_config/test_rendering.py::TestRenderingConfiguratorMixin::test_add_default_renderers\nPASSED r2e_tests/test_config/test_rendering.py::TestRenderingConfiguratorMixin::test_add_renderer\nPASSED r2e_tests/test_config/test_rendering.py::TestRenderingConfiguratorMixin::test_add_renderer_dottedname_factory\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_defaults\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_discriminator\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_path_no_pattern\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_pattern_with_path\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_view_with_view_attr\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_view_with_view_context\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_view_with_view_permission\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_no_view_with_view_renderer\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_accept\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_custom_predicates\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_factory\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_factory_dottedname\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_header\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_path_info\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_path_info_highorder\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_path_info_regex\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_pregenerator\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_request_method\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_request_param\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_route_prefix\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_static\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_add_route_with_xhr\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_get_routes_mapper_already_registered\nPASSED r2e_tests/test_config/test_routes.py::RoutesConfiguratorMixinTests::test_get_routes_mapper_not_yet_registered\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_add_permission\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authentication_policy_no_authz_policy\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authentication_policy_no_authz_policy_autocommit\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authentication_policy_with_authz_policy\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authentication_policy_with_authz_policy_autocommit\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authorization_policy_no_authn_policy\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authorization_policy_no_authn_policy_autocommit\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authorization_policy_with_authn_policy\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_authorization_policy_with_authn_policy_autocommit\nPASSED r2e_tests/test_config/test_security.py::ConfiguratorSecurityMethodsTests::test_set_default_permission\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test__set_settings_as_None\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test__set_settings_as_dictwithvalues\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test_add_settings_settings_None\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test_add_settings_settings_already_registered\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test_add_settings_settings_not_yet_registered\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test_get_settings_nosettings\nPASSED r2e_tests/test_config/test_settings.py::TestSettingsConfiguratorMixin::test_get_settings_withsettings\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_debug_all\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_debug_authorization\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_debug_notfound\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_debug_routematch\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_debug_templates\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_default_locale_name\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_getattr_fail\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_getattr_raises_attribute_error\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_getattr_success\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_noargs\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_originals_kept\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_prevent_cachebust\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_prevent_http_cache\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_reload_all\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_reload_assets\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_reload_resources\nPASSED r2e_tests/test_config/test_settings.py::TestSettings::test_reload_templates\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_renderer\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_renderer_explicitrenderer\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_renderer_twice\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_subscriber_defaults\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_subscriber_dottedname\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_subscriber_multiple\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_subscriber_single\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_add_template\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_resources\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_securitypolicy\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_securitypolicy_forget_result\nPASSED r2e_tests/test_config/test_testing.py::TestingConfiguratorMixinTests::test_testing_securitypolicy_remember_result\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_dottedname\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_instance\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_name_ingress\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_name_main\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_over_ingress\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_over_ingress_iterable\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_under_main\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_under_main_iterable\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tween_unsuitable\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tweens_conflict\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tweens_names_distinct\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tweens_names_with_over_nonstringoriter\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tweens_names_with_under_nonstringoriter\nPASSED r2e_tests/test_config/test_tweens.py::TestTweensConfiguratorMixin::test_add_tweens_names_with_underover\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test___call___explicit\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test___call___implicit\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_add_explicit\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_add_implicit\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_1\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_2\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_3\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_4\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_5\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_conflict_direct\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_conflict_indirect\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_missing_over_and_under_partials\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_missing_over_partial\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_missing_over_partial_with_fallback\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_missing_under_partial\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_missing_under_partial_with_fallback\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_with_missing_fallbacks\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_with_multiple_matching_fallbacks\nPASSED r2e_tests/test_config/test_tweens.py::TestTweens::test_implicit_ordering_with_partial_fallbacks\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_custom_predicates_can_affect_traversal\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_different_custom_predicates_with_same_hash\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_match_param_from_dict\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_match_param_from_dict_fails\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_match_param_from_string\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_match_param_from_string_fails\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_notted\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_ordering_importance_and_number\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_ordering_importance_of_predicates\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_ordering_number_of_predicates\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_ordering_xhr_and_request_method_trump_only_containment\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_predicate_text_is_correct\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_request_method_ordering_hashes_same\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_request_method_sequence\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_traverse_has_remainder_already\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_traverse_matches\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_traverse_matches_with_highorder_chars\nPASSED r2e_tests/test_config/test_util.py::TestPredicateList::test_unknown_predicate\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_annotations\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_defaultargs_firstname_not_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_defaultargs_firstname_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_noargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_onearg_named_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_onearg_named_somethingelse\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_toomanyargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_with_attr_false\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_function_with_attr_true\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_defaultargs_firstname_not_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_defaultargs_firstname_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_defaultargs_onearg_named_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_defaultargs_onearg_named_somethingelse\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_nocall\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_instance_toomanyargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_method_onearg_named_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_newstyle_class_init_defaultargs_firstname_not_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_newstyle_class_init_defaultargs_firstname_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_newstyle_class_init_firstname_request_with_secondname\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_newstyle_class_init_noargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_newstyle_class_init_onearg_named_somethingelse\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_defaultargs_firstname_not_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_defaultargs_firstname_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_noargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_onearg_named_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_onearg_named_somethingelse\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_init_toomanyargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_oldstyle_class_no_init\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_requestonly_newstyle_class_init_onearg_named_request\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_requestonly_newstyle_class_init_toomanyargs\nPASSED r2e_tests/test_config/test_util.py::Test_takes_one_arg::test_requestonly_newstyle_class_no_init\nPASSED r2e_tests/test_config/test_util.py::TestNotted::test_it_with_phash_val\nPASSED r2e_tests/test_config/test_util.py::TestNotted::test_it_without_phash_val\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_allows_other_predicates\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_disallows_context\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_disallows_for_\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_disallows_http_cache\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_disallows_name\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_disallows_permission\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_no_view_argument\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_with_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_forbidden_view_with_view_defaults\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_allows_other_predicates\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_append_slash\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_append_slash_custom_response\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_disallows_context\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_disallows_for_\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_disallows_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_no_view_argument\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_with_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_notfound_view_with_view_defaults\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_static_view_absolute\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_static_view_here_no_utility_registered\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_static_view_package_relative\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_instance\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_instance_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_instancemethod\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_instancemethod_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_oldstyle_class\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_as_oldstyle_class_requestonly\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_class_method_no_attr\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_context_as_class\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_context_as_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_tmpl_renderer_factory_introspector_missing\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_tmpl_renderer_factory_no_renderer_factory\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_tmpl_renderer_factory_with_renderer_factory\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_config_and_view_defaults_conflicts\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_config_and_view_defaults_doesnt_conflict\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_defaults\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_defaults_viewname_is_dottedname_kwarg\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_view_defaults_viewname_is_dottedname_nonkwarg\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_xhr_false\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_xhr_true\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_wrapped_view_is_decorated\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_views_with_accept_multiview_replaces_existing\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_derive_view_dottedname\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_derive_view_function\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_derive_view_with_default_renderer_no_explicit_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_derive_view_with_default_renderer_with_explicit_renderer\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_set_view_mapper\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_set_view_mapper_dottedname\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_view_with_most_specific_predicate\nPASSED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_view_with_most_specific_predicate_with_mismatch\nPASSED r2e_tests/test_config/test_views.py::Test_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_cachebust_custom\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_cachebust_prevented\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_package_root\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_url_noendslash\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_url_noscheme\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_url_withendslash\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_context\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_for_\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_permission\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_renderer\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_add_viewname_with_route_prefix\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_missing\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_quoting\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_registration_miss\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_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_cachebust\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_quoted_remote\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_unquoted_local\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_with_custom_anchor\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_generate_url_with_custom_query\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_verifyClass\nPASSED r2e_tests/test_config/test_views.py::TestStaticURLInfo::test_verifyObject\nPASSED r2e_tests/test_config/test_views.py::Test_view_description::test_with_text\nPASSED r2e_tests/test_scripts/test_common.py::Test_logging_file_config::test_it\nPASSED r2e_tests/test_scripts/test_common.py::TestParseVars::test_parse_vars_bad\nPASSED r2e_tests/test_scripts/test_common.py::TestParseVars::test_parse_vars_good\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_confirm_override_conflicting_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_force_override_conflicting_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_force_override_site_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_known_scaffold_absolute_path\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_known_scaffold_multiple_rendered\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_known_scaffold_single_rendered\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_known_scaffold_with_path_as_project_target_rendered\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_no_project_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_run_no_scaffold_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_run_no_scaffold_no_args\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_scaffold_with_dev_pyramid_long_version\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_scaffold_with_dev_pyramid_version\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_scaffold_with_hyphen_in_project_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_scaffold_with_prod_pyramid_long_version\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_scaffold_with_prod_pyramid_unparsable_version\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_scaffold_with_prod_pyramid_version\nPASSED r2e_tests/test_scripts/test_pcreate.py::TestPCreateCommand::test_unknown_scaffold_name\nPASSED r2e_tests/test_scripts/test_pcreate.py::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_pdistreport.py::TestPDistReportCommand::test_no_dists\nPASSED r2e_tests/test_scripts/test_pdistreport.py::TestPDistReportCommand::test_with_dists\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_has_bad_config_header\nPASSED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_configures_logging\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_bad_format\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_good_args\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_good_format\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_no_mapper\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_no_routes\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_as_wsgiapp\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_no_view\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_with_no_slash_prefix\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_single_route_multiview_registered\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_single_route_no_route_registered\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_single_route_no_views_registered\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_single_route_one_view_registered_with_factory\nPASSED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_static_routes_included_in_list\nPASSED r2e_tests/test_scripts/test_proutes.py::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_pserve.py::TestPServeCommand::test_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_default_shell_option\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_errors_with_unknown_shell\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_check_variable_override_order\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_custom_items\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_default_shell\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_ipython\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_pythonstartup\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_loads_setup_from_options\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_command_setup\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_list_shells\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_shell_entry_points\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_shell_ordering\nPASSED r2e_tests/test_scripts/test_pshell.py::TestPShellCommand::test_shell_override\nPASSED r2e_tests/test_scripts/test_pshell.py::Test_python_shell_runner::test_it\nPASSED r2e_tests/test_scripts/test_pshell.py::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_ptweens.py::TestPTweensCommand::test__get_tweens\nPASSED r2e_tests/test_scripts/test_ptweens.py::TestPTweensCommand::test_command_implicit_and_explicit_tweens\nPASSED r2e_tests/test_scripts/test_ptweens.py::TestPTweensCommand::test_command_implicit_tweens_only\nPASSED r2e_tests/test_scripts/test_ptweens.py::TestPTweensCommand::test_command_no_tweens\nPASSED r2e_tests/test_scripts/test_ptweens.py::Test_main::test_it\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_multi_routes_all_match\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_multi_routes_none_match\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_multi_routes_some_match\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_no_match\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_no_match_multiview_registered\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_route_multiview\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_route_multiview_no_view_registered\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_route_no_multiview\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_traversal\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test__find_view_traversal_multiview\nPASSED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_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::TestBaseCookieSession::test_cookie_max_age_invalid\nFAILED r2e_tests/test_1.py::TestBaseCookieSession::test_reissue_invalid - Ass...\nFAILED r2e_tests/test_1.py::TestBaseCookieSession::test_reissue_str_triggered\nFAILED r2e_tests/test_1.py::TestBaseCookieSession::test_timeout_invalid - Typ...\nFAILED r2e_tests/test_1.py::TestBaseCookieSession::test_timeout_str - TypeErr...\nFAILED r2e_tests/test_1.py::TestSignedCookieSession::test_cookie_max_age_invalid\nFAILED r2e_tests/test_1.py::TestSignedCookieSession::test_reissue_invalid - A...\nFAILED r2e_tests/test_1.py::TestSignedCookieSession::test_reissue_str_triggered\nFAILED r2e_tests/test_1.py::TestSignedCookieSession::test_timeout_invalid - T...\nFAILED r2e_tests/test_1.py::TestSignedCookieSession::test_timeout_str - TypeE...\nFAILED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_timeout_invalid\nFAILED r2e_tests/test_1.py::TestUnencryptedCookieSession::test_timeout_str - ...\nFAILED r2e_tests/test_1.py::Test_check_csrf_token::test_failure_no_raises - V...\nFAILED r2e_tests/test_1.py::Test_check_csrf_token::test_failure_raises - Valu...\nFAILED r2e_tests/test_1.py::Test_check_csrf_token::test_success_default_header\nFAILED r2e_tests/test_1.py::Test_check_csrf_token::test_success_default_token\nFAILED r2e_tests/test_1.py::Test_check_csrf_token::test_success_header - Valu...\nFAILED r2e_tests/test_1.py::Test_check_csrf_token::test_success_token - Value...\nFAILED r2e_tests/test_2.py::TestCallbackAuthenticationPolicyDebugging::test_authenticated_userid_fails_cleaning_as_Authenticated\nFAILED r2e_tests/test_2.py::TestCallbackAuthenticationPolicyDebugging::test_authenticated_userid_fails_cleaning_as_Everyone\nFAILED r2e_tests/test_2.py::TestCallbackAuthenticationPolicyDebugging::test_authenticated_userid_no_callback\nFAILED r2e_tests/test_2.py::TestCallbackAuthenticationPolicyDebugging::test_authenticated_userid_no_unauthenticated_userid\nFAILED r2e_tests/test_2.py::TestCallbackAuthenticationPolicyDebugging::test_authenticated_userid_with_callback_fail\nFAILED r2e_tests/test_2.py::TestCallbackAuthenticationPolicyDebugging::test_authenticated_userid_with_callback_success\nFAILED r2e_tests/test_2.py::TestCallbackAuthenticationPolicyDebugging::test_effective_principals_no_callback\nFAILED r2e_tests/test_2.py::TestCallbackAuthenticationPolicyDebugging::test_effective_principals_no_unauthenticated_userid\nFAILED r2e_tests/test_2.py::TestCallbackAuthenticationPolicyDebugging::test_effective_principals_with_callback_fail\nFAILED r2e_tests/test_2.py::TestCallbackAuthenticationPolicyDebugging::test_effective_principals_with_callback_success\nFAILED r2e_tests/test_2.py::TestCallbackAuthenticationPolicyDebugging::test_effective_principals_with_unclean_principal_Authenticated\nFAILED r2e_tests/test_2.py::TestCallbackAuthenticationPolicyDebugging::test_effective_principals_with_unclean_principal_Everyone\nFAILED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_identify_cookie_str_reissue\nFAILED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_identify_cookie_str_timeout\nFAILED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_init_cookie_str_max_age_invalid\nFAILED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_init_cookie_str_reissue_invalid\nFAILED r2e_tests/test_2.py::TestAuthTktCookieHelper::test_init_cookie_str_timeout_invalid\nFAILED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_resource_url_adapter_dotted_names\nFAILED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_resource_url_adapter_introspectables\nFAILED r2e_tests/test_config/test_adapters.py::AdaptersConfiguratorMixinTests::test_add_traverser_dotted_names\nFAILED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_directory_with_directory\nFAILED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_directory_with_package\nFAILED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_file_with_file\nFAILED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_package_with_directory\nFAILED r2e_tests/test_config/test_assets.py::TestAssetsConfiguratorMixin::test_override_asset_package_with_package\nFAILED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_filename_no_overrides\nFAILED r2e_tests/test_config/test_assets.py::TestOverrideProvider::test_get_resource_filename_override_returns_None\nFAILED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_filename\nFAILED r2e_tests/test_config/test_assets.py::TestPackageAssetSource::test_get_filename_with_prefix\nFAILED r2e_tests/test_config/test_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_include_constant_root_package\nFAILED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_scan_integration_conflict\nFAILED r2e_tests/test_config/test_init.py::ConfiguratorTests::test_setup_registry_debug_logger_None_default\nFAILED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_add_directive_with_custom_callable\nFAILED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_add_directive_with_partial\nFAILED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_extend_with_dotted_name\nFAILED r2e_tests/test_config/test_init.py::TestConfigurator_add_directive::test_extend_with_python_callable\nFAILED r2e_tests/test_config/test_init.py::TestConfigurator__add_predicate::test_factory_as_dotted_name\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_static_view_package_here_relative\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_template_renderer\nFAILED r2e_tests/test_config/test_views.py::TestViewsConfigurationMixin::test_add_view_with_template_renderer_no_callable\nFAILED r2e_tests/test_config/test_views.py::TestViewDeriver::test_function_returns_non_adaptable\nFAILED r2e_tests/test_config/test_views.py::TestViewDeriver::test_function_returns_non_adaptable_dict\nFAILED r2e_tests/test_config/test_views.py::TestViewDeriver::test_instance_returns_non_adaptable\nFAILED r2e_tests/test_config/test_views.py::TestViewDeriver::test_requestonly_default_method_returns_non_adaptable\nFAILED r2e_tests/test_config/test_views.py::TestViewDeriver::test_requestonly_nondefault_method_returns_non_adaptable\nFAILED r2e_tests/test_config/test_views.py::Test_view_description::test_without_text\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_display_headers\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_has_content_type_header_var\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_has_good_header_var\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_has_multiple_header_vars\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_get\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_options\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_patch\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_post\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_propfind\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_method_put\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_path_doesnt_start_with_slash\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_two_args\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_w_basic_auth\nFAILED r2e_tests/test_scripts/test_prequest.py::TestPRequestCommand::test_command_with_query_string\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_config_format_ini_commas\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_config_format_ini_newlines\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_config_format_ini_spaces\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_one_route_all_methods_view_only_post\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_one_route_only_post_view_all_methods\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_one_route_only_post_view_post_and_get\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_one_route_with_long_name_one_view_registered\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_is_get_view_request_method_not_post\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_request_method_mismatch\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_route_static_views\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_single_route_one_view_registered\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_view_glob\nFAILED r2e_tests/test_scripts/test_proutes.py::TestPRoutesCommand::test_view_request_method_not_post\nFAILED r2e_tests/test_scripts/test_pviews.py::TestPViewsCommand::test_views_command_single_view_function_traversal\n======================= 99 failed, 1126 passed in 6.18s ========================\n",
    "old_commit_res_stderr": ""
}
CHANGES.txt CONTRIBUTORS.txt pyramid/authentication.py pyramid/session.py pyramid/tests/test_authentication.py pyramid/tests/test_session.py
We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
[ISSUE]

**Title:** Passing String Values for `timeout` Causes TypeError in Session Handling

**Description:**
When initializing a session with the `timeout` parameter as a string, the session handling logic fails due to type mismatch. The system expects `timeout` to be an integer, but if a string is provided, it leads to runtime errors during numerical operations.

**Example Buggy Code:**
```python
from pyramid.session import BaseCookieSessionFactory
from pyramid.request import Request

# Initialize session with timeout as a string
session_factory = BaseCookieSessionFactory('secret', timeout='30')
request = Request.blank('/')
session = session_factory(request)

# Later in the code, a numerical operation is performed
if request.session.renewed and (current_time - request.session.renewed > request.session.timeout):
    # Intended to renew session
    pass
```

**Expected Behavior:**
The session should correctly handle the `timeout` parameter when provided as a string by converting it to an integer. This ensures that all numerical operations involving `timeout` execute without errors.

**Actual Behavior:**
Providing `timeout` as a string results in a `TypeError` during numerical comparisons, such as `current_time - request.session.renewed > request.session.timeout`, because the system attempts to compare a float with a string.

**Error Message:**
```
TypeError: '>' not supported between instances of 'float' and 'str'
```

[/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 re
import time as time_mod
import warnings

from zope.interface import implementer

from webob.cookies import CookieProfile

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

from pyramid.interfaces import (
    IAuthenticationPolicy,
    IDebugLogger,
    )

from pyramid.security import (
    Authenticated,
    Everyone,
    )

from pyramid.util import strings_differ

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


class CallbackAuthenticationPolicy(object):
    """ Abstract class """

    debug = False
    callback = None

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

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

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

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

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

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

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

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

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

        .. code-block:: python

            return [Everyone]

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

        .. code-block:: python

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

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

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

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

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

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

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

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


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

    Constructor Arguments

    ``identifier_name``

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

    ``callback``

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

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

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

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

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

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

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

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

        """
        identity = self._get_identity(request)

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

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

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

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

        if self.callback is None:
            return userid

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Constructor Arguments

    ``environ_key``

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

    ``callback``

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

    ``debug``

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

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

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

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

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

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

_marker = object()

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

    .. warning::

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

    Constructor Arguments

    ``secret``

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

    ``callback``

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

    ``cookie_name``

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

    ``secure``

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

    ``include_ip``

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

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

    ``timeout``

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

    ``reissue_time``

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

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

       Optional.

    ``max_age``

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

    ``path``

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

    ``http_only``

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

    ``wild_domain``

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

    ``parent_domain``

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

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

    ``domain``

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

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

    ``hashalg``

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

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

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

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

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

       Optional.

       .. note::

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

    ``debug``

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

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

    def __init__(self,
                 secret,
                 callback=None,
                 cookie_name='auth_tkt',
                 secure=False,
                 include_ip=False,
                 timeout=None,
                 reissue_time=None,
                 max_age=None,
                 path="/",
                 http_only=False,
                 wild_domain=True,
                 debug=False,
                 hashalg=_marker,
                 parent_domain=False,
                 domain=None,
                 ):
        if hashalg is _marker:
            hashalg = 'md5'
            warnings.warn(
                'The MD5 hash function used by default by the '
                'AuthTktAuthenticationPolicy is known to be '
                'susceptible to collision attacks.  It is the current default '
                'for backwards compatibility reasons, but we recommend that '
                'you use the SHA512 algorithm instead for improved security.  '
                'Pass ``hashalg=\'sha512\'`` to the '
                'AuthTktAuthenticationPolicy constructor to do so.\n\nNote '
                'that a change to the hash algorithms will invalidate existing '
                'auth tkt cookies set by your application.  If backwards '
                'compatibility of existing auth tkt cookies is of greater '
                'concern than the risk posed by the potential for a hash '
                'collision, you\'ll want to continue using MD5 explicitly.  '
                'To do so, pass ``hashalg=\'md5\'`` in your application to '
                'the AuthTktAuthenticationPolicy constructor.   When you do so '
                'this warning will not be emitted again.  The default '
                'algorithm used in this policy will change in the future, so '
                'setting an explicit hashalg will futureproof your '
                'application.',
                DeprecationWarning,
                stacklevel=2
                )
        self.cookie = AuthTktCookieHelper(
            secret,
            cookie_name=cookie_name,
            secure=secure,
            include_ip=include_ip,
            timeout=timeout,
            reissue_time=reissue_time,
            max_age=max_age,
            http_only=http_only,
            path=path,
            wild_domain=wild_domain,
            hashalg=hashalg,
            parent_domain=parent_domain,
            domain=domain,
            )
        self.callback = callback
        self.debug = debug

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

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

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

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

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

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

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

# this class licensed under the MIT license (stolen from Paste)
class AuthTicket(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 = native_(ticket).strip('"')
    digest_size = hashlib.new(hashalg).digest_size * 2
    digest = ticket[:digest_size]
    try:
        timestamp = int(ticket[digest_size:digest_size + 8], 16)
    except ValueError as e:
        raise BadTicket('Timestamp is not a hex integer: %s' % e)
    try:
        userid, data = ticket[digest_size + 8:].split('!', 1)
    except ValueError:
        raise BadTicket('userid is not followed by !')
    userid = url_unquote(userid)
    if '!' in data:
        tokens, user_data = data.split('!', 1)
    else: # pragma: no cover (never generated)
        # @@: Is this the right order?
        tokens = ''
        user_data = data

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

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

    tokens = tokens.split(',')

    return (timestamp, userid, tokens, user_data)

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

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

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

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

class AuthTktCookieHelper(object):
    """
    A helper class for use in third-party authentication policy
    implementations.  See
    :class:`pyramid.authentication.AuthTktAuthenticationPolicy` for the
    meanings of the constructor arguments.
    """
    parse_ticket = staticmethod(parse_ticket) # for tests
    AuthTicket = AuthTicket # for tests
    BadTicket = BadTicket # for tests
    now = None # for tests

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

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

    def __init__(self, secret, cookie_name='auth_tkt', secure=False,
                 include_ip=False, timeout=None, reissue_time=None,
                 max_age=None, http_only=False, path="/", wild_domain=True,
                 hashalg='md5', parent_domain=False, domain=None):

        serializer = _SimpleSerializer()

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

        self.secret = secret
        self.cookie_name = cookie_name
        self.secure = secure
        self.include_ip = include_ip
        self.timeout = timeout
        self.reissue_time = reissue_time
        self.max_age = max_age
        self.wild_domain = wild_domain
        self.parent_domain = parent_domain
        self.domain = domain
        self.hashalg = hashalg

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

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

        profile = self.cookie_profile(request)

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

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

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

        if cookie is None:
            return None

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

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

        now = self.now # service tests

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

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

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

        reissue = self.reissue_time is not None

        if reissue and not hasattr(request, '_authtkt_reissued'):
            if ( (now - timestamp) > self.reissue_time ):
                # See https://github.com/Pylons/pyramid/issues#issue/108
                tokens = list(filter(None, tokens))
                headers = self.remember(request, userid, max_age=self.max_age,
                                        tokens=tokens)
                def reissue_authtkt(request, response):
                    if not hasattr(request, '_authtkt_reissue_revoked'):
                        for k, v in headers:
                            response.headerlist.append((k, v))
                request.add_response_callback(reissue_authtkt)
                request._authtkt_reissued = True

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

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

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

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

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

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

        environ = request.environ

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

        user_data = ''

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

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

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

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

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

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

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

    Constructor Arguments

    ``prefix``

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

    ``callback``

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

    ``debug``

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

    """

    def __init__(self, prefix='auth.', callback=None, debug=False):
        self.callback = callback
        self.prefix = prefix or ''
        self.userid_key = prefix + 'userid'
        self.debug = debug

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

    def forget(self, request):
        """ Remove the stored userid 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, userid, **kw):
        """ A no-op. Basic authentication does not provide a protocol for
        remembering the user. Credentials are sent on every request.

        """
        return []

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

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

    def _get_credentials(self, request):
        authorization = request.headers.get('Authorization')
        if not authorization:
            return None
        try:
            authmeth, auth = authorization.split(' ', 1)
        except ValueError: # not enough values to unpack
            return None
        if authmeth.lower() != 'basic':
            return None

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

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

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

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

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


### pyramid/session.py
import base64
import binascii
import hashlib
import hmac
import os
import time

from zope.deprecation import deprecated
from zope.interface import implementer

from webob.cookies import SignedSerializer

from pyramid.compat import (
    pickle,
    PY3,
    text_,
    bytes_,
    native_,
    )

from pyramid.exceptions import BadCSRFToken
from pyramid.interfaces import ISession
from pyramid.util import strings_differ

def manage_accessed(wrapped):
    """ Decorator which causes a cookie to be renewed when an accessor
    method is called."""
    def accessed(session, *arg, **kw):
        session.accessed = now = int(time.time())
        if session._reissue_time is not None:
            if now - session.renewed > session._reissue_time:
                session.changed()
        return wrapped(session, *arg, **kw)
    accessed.__doc__ = wrapped.__doc__
    return accessed

def manage_changed(wrapped):
    """ Decorator which causes a cookie to be set when a setter method
    is called."""
    def changed(session, *arg, **kw):
        session.accessed = int(time.time())
        session.changed()
        return wrapped(session, *arg, **kw)
    changed.__doc__ = wrapped.__doc__
    return changed

def signed_serialize(data, secret):
    """ Serialize any pickleable structure (``data``) and sign it
    using the ``secret`` (must be a string).  Return the
    serialization, which includes the signature as its first 40 bytes.
    The ``signed_deserialize`` method will deserialize such a value.

    This function is useful for creating signed cookies.  For example:

    .. code-block:: python

       cookieval = signed_serialize({'a':1}, 'secret')
       response.set_cookie('signed_cookie', cookieval)
    """
    pickled = pickle.dumps(data, pickle.HIGHEST_PROTOCOL)
    try:
        # bw-compat with pyramid <= 1.5b1 where latin1 is the default
        secret = bytes_(secret)
    except UnicodeEncodeError:
        secret = bytes_(secret, 'utf-8')
    sig = hmac.new(secret, pickled, hashlib.sha1).hexdigest()
    return sig + native_(base64.b64encode(pickled))

def signed_deserialize(serialized, secret, hmac=hmac):
    """ Deserialize the value returned from ``signed_serialize``.  If
    the value cannot be deserialized for any reason, a
    :exc:`ValueError` exception will be raised.

    This function is useful for deserializing a signed cookie value
    created by ``signed_serialize``.  For example:

    .. code-block:: python

       cookieval = request.cookies['signed_cookie']
       data = signed_deserialize(cookieval, 'secret')
    """
    # hmac parameterized only for unit tests
    try:
        input_sig, pickled = (bytes_(serialized[:40]),
                              base64.b64decode(bytes_(serialized[40:])))
    except (binascii.Error, TypeError) as e:
        # Badly formed data can make base64 die
        raise ValueError('Badly formed base64 data: %s' % e)

    try:
        # bw-compat with pyramid <= 1.5b1 where latin1 is the default
        secret = bytes_(secret)
    except UnicodeEncodeError:
        secret = bytes_(secret, 'utf-8')
    sig = bytes_(hmac.new(secret, pickled, hashlib.sha1).hexdigest())

    # Avoid timing attacks (see
    # http://seb.dbzteam.org/crypto/python-oauth-timing-hmac.pdf)
    if strings_differ(sig, input_sig):
        raise ValueError('Invalid signature')

    return pickle.loads(pickled)

def check_csrf_token(request,
                     token='csrf_token',
                     header='X-CSRF-Token',
                     raises=True):
    """ Check the CSRF token in the request's session against the value in
    ``request.params.get(token)`` or ``request.headers.get(header)``.
    If a ``token`` keyword is not supplied to this function, the string
    ``csrf_token`` will be used to look up the token in ``request.params``.
    If a ``header`` keyword is not supplied to this function, the string
    ``X-CSRF-Token`` will be used to look up the token in ``request.headers``.

    If the value supplied by param or by header doesn't match the value
    supplied by ``request.session.get_csrf_token()``, and ``raises`` is
    ``True``, this function will raise an
    :exc:`pyramid.exceptions.BadCSRFToken` exception.
    If the check does succeed and ``raises`` is ``False``, this
    function will return ``False``.  If the CSRF check is successful, this
    function will return ``True`` unconditionally.

    Note that using this function requires that a :term:`session factory` is
    configured.

    .. versionadded:: 1.4a2
    """
    supplied_token = request.params.get(token, request.headers.get(header, ""))
    if strings_differ(request.session.get_csrf_token(), supplied_token):
        if raises:
            raise BadCSRFToken('check_csrf_token(): Invalid token')
        return False
    return True

class PickleSerializer(object):
    """ A Webob cookie serializer that uses the pickle protocol to dump Python
    data to bytes."""
    def loads(self, bstruct):
        return pickle.loads(bstruct)

    def dumps(self, appstruct):
        return pickle.dumps(appstruct, pickle.HIGHEST_PROTOCOL)

def BaseCookieSessionFactory(
    serializer,
    cookie_name='session',
    max_age=None,
    path='/',
    domain=None,
    secure=False,
    httponly=False,
    timeout=1200,
    reissue_time=0,
    set_on_exception=True,
    ):
    """
    .. versionadded:: 1.5
    
    Configure a :term:`session factory` which will provide cookie-based
    sessions.  The return value of this function is a :term:`session factory`,
    which may be provided as the ``session_factory`` argument of a
    :class:`pyramid.config.Configurator` constructor, or used as the
    ``session_factory`` argument of the
    :meth:`pyramid.config.Configurator.set_session_factory` method.

    The session factory returned by this function will create sessions
    which are limited to storing fewer than 4000 bytes of data (as the
    payload must fit into a single cookie).

    .. warning:

       This class provides no protection from tampering and is only intended
       to be used by framework authors to create their own cookie-based
       session factories.

    Parameters:

    ``serializer``
      An object with two methods: ``loads`` and ``dumps``.  The ``loads``
      method should accept bytes and return a Python object.  The ``dumps``
      method should accept a Python object and return bytes.  A ``ValueError``
      should be raised for malformed inputs.

    ``cookie_name``
      The name of the cookie used for sessioning. Default: ``'session'``.

    ``max_age``
      The maximum age of the cookie used for sessioning (in seconds).
      Default: ``None`` (browser scope).

    ``path``
      The path used for the session cookie. Default: ``'/'``.

    ``domain``
      The domain used for the session cookie.  Default: ``None`` (no domain).

    ``secure``
      The 'secure' flag of the session cookie. Default: ``False``.

    ``httponly``
      Hide the cookie from Javascript by setting the 'HttpOnly' flag of the
      session cookie. Default: ``False``.

    ``timeout``
      A number of seconds of inactivity before a session times out. If
      ``None`` then the cookie never expires. This lifetime only applies
      to the *value* within the cookie. Meaning that if the cookie expires
      due to a lower ``max_age``, then this setting has no effect.
      Default: ``1200``.

    ``reissue_time``
      The number of seconds that must pass before the cookie is automatically
      reissued as the result of a request which accesses the session. The
      duration is measured as the number of seconds since the last session
      cookie was issued and 'now'.  If this value is ``0``, a new cookie
      will be reissued on every request accessing the session. If ``None``
      then the cookie's lifetime will never be extended.

      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.
      However, such a configuration is not explicitly prevented.

      Default: ``0``.

    ``set_on_exception``
      If ``True``, set a session cookie even if an exception occurs
      while rendering a view. Default: ``True``.

    .. versionadded: 1.5a3
    """

    @implementer(ISession)
    class CookieSession(dict):
        """ Dictionary-like session object """

        # configuration parameters
        _cookie_name = cookie_name
        _cookie_max_age = max_age
        _cookie_path = path
        _cookie_domain = domain
        _cookie_secure = secure
        _cookie_httponly = httponly
        _cookie_on_exception = set_on_exception
        _timeout = timeout
        _reissue_time = reissue_time

        # dirty flag
        _dirty = False

        def __init__(self, request):
            self.request = request
            now = time.time()
            created = renewed = now
            new = True
            value = None
            state = {}
            cookieval = request.cookies.get(self._cookie_name)
            if cookieval is not None:
                try:
                    value = serializer.loads(bytes_(cookieval))
                except ValueError:
                    # the cookie failed to deserialize, dropped
                    value = None

            if value is not None:
                try:
                    # since the value is not necessarily signed, we have
                    # to unpack it a little carefully
                    rval, cval, sval = value
                    renewed = float(rval)
                    created = float(cval)
                    state = sval
                    new = False
                except (TypeError, ValueError):
                    # value failed to unpack properly or renewed was not
                    # a numeric type so we'll fail deserialization here
                    state = {}

            if self._timeout is not None:
                if now - renewed > self._timeout:
                    # expire the session because it was not renewed
                    # before the timeout threshold
                    state = {}

            self.created = created
            self.accessed = renewed
            self.renewed = renewed
            self.new = new
            dict.__init__(self, state)

        # ISession methods
        def changed(self):
            if not self._dirty:
                self._dirty = True
                def set_cookie_callback(request, response):
                    self._set_cookie(response)
                    self.request = None # explicitly break cycle for gc
                self.request.add_response_callback(set_cookie_callback)

        def invalidate(self):
            self.clear() # XXX probably needs to unset cookie

        # non-modifying dictionary methods
        get = manage_accessed(dict.get)
        __getitem__ = manage_accessed(dict.__getitem__)
        items = manage_accessed(dict.items)
        values = manage_accessed(dict.values)
        keys = manage_accessed(dict.keys)
        __contains__ = manage_accessed(dict.__contains__)
        __len__ = manage_accessed(dict.__len__)
        __iter__ = manage_accessed(dict.__iter__)

        if not PY3:
            iteritems = manage_accessed(dict.iteritems)
            itervalues = manage_accessed(dict.itervalues)
            iterkeys = manage_accessed(dict.iterkeys)
            has_key = manage_accessed(dict.has_key)

        # modifying dictionary methods
        clear = manage_changed(dict.clear)
        update = manage_changed(dict.update)
        setdefault = manage_changed(dict.setdefault)
        pop = manage_changed(dict.pop)
        popitem = manage_changed(dict.popitem)
        __setitem__ = manage_changed(dict.__setitem__)
        __delitem__ = manage_changed(dict.__delitem__)

        # flash API methods
        @manage_changed
        def flash(self, msg, queue='', allow_duplicate=True):
            storage = self.setdefault('_f_' + queue, [])
            if allow_duplicate or (msg not in storage):
                storage.append(msg)

        @manage_changed
        def pop_flash(self, queue=''):
            storage = self.pop('_f_' + queue, [])
            return storage

        @manage_accessed
        def peek_flash(self, queue=''):
            storage = self.get('_f_' + queue, [])
            return storage

        # CSRF API methods
        @manage_changed
        def new_csrf_token(self):
            token = text_(binascii.hexlify(os.urandom(20)))
            self['_csrft_'] = token
            return token

        @manage_accessed
        def get_csrf_token(self):
            token = self.get('_csrft_', None)
            if token is None:
                token = self.new_csrf_token()
            return token

        # non-API methods
        def _set_cookie(self, response):
            if not self._cookie_on_exception:
                exception = getattr(self.request, 'exception', None)
                if exception is not None: # dont set a cookie during exceptions
                    return False
            cookieval = native_(serializer.dumps(
                (self.accessed, self.created, dict(self))
                ))
            if len(cookieval) > 4064:
                raise ValueError(
                    'Cookie value is too long to store (%s bytes)' %
                    len(cookieval)
                    )
            response.set_cookie(
                self._cookie_name,
                value=cookieval,
                max_age=self._cookie_max_age,
                path=self._cookie_path,
                domain=self._cookie_domain,
                secure=self._cookie_secure,
                httponly=self._cookie_httponly,
                )
            return True

    return CookieSession


def UnencryptedCookieSessionFactoryConfig(
    secret,
    timeout=1200,
    cookie_name='session',
    cookie_max_age=None,
    cookie_path='/',
    cookie_domain=None,
    cookie_secure=False,
    cookie_httponly=False,
    cookie_on_exception=True,
    signed_serialize=signed_serialize,
    signed_deserialize=signed_deserialize,
    ):
    """
    .. deprecated:: 1.5
        Use :func:`pyramid.session.SignedCookieSessionFactory` instead.
        Caveat: Cookies generated using ``SignedCookieSessionFactory`` are not
        compatible with cookies generated using
        ``UnencryptedCookieSessionFactory``, so existing user session data
        will be destroyed if you switch to it.
    
    Configure a :term:`session factory` which will provide unencrypted
    (but signed) cookie-based sessions.  The return value of this
    function is a :term:`session factory`, which may be provided as
    the ``session_factory`` argument of a
    :class:`pyramid.config.Configurator` constructor, or used
    as the ``session_factory`` argument of the
    :meth:`pyramid.config.Configurator.set_session_factory`
    method.

    The session factory returned by this function will create sessions
    which are limited to storing fewer than 4000 bytes of data (as the
    payload must fit into a single cookie).

    Parameters:

    ``secret``
      A string which is used to sign the cookie.

    ``timeout``
      A number of seconds of inactivity before a session times out.

    ``cookie_name``
      The name of the cookie used for sessioning.

    ``cookie_max_age``
      The maximum age of the cookie used for sessioning (in seconds).
      Default: ``None`` (browser scope).

    ``cookie_path``
      The path used for the session cookie.

    ``cookie_domain``
      The domain used for the session cookie.  Default: ``None`` (no domain).

    ``cookie_secure``
      The 'secure' flag of the session cookie.

    ``cookie_httponly``
      The 'httpOnly' flag of the session cookie.

    ``cookie_on_exception``
      If ``True``, set a session cookie even if an exception occurs
      while rendering a view.

    ``signed_serialize``
      A callable which takes more or less arbitrary Python data structure and
      a secret and returns a signed serialization in bytes.
      Default: ``signed_serialize`` (using pickle).

    ``signed_deserialize``
      A callable which takes a signed and serialized data structure in bytes
      and a secret and returns the original data structure if the signature
      is valid. Default: ``signed_deserialize`` (using pickle).
    """

    class SerializerWrapper(object):
        def __init__(self, secret):
            self.secret = secret
            
        def loads(self, bstruct):
            return signed_deserialize(bstruct, secret)

        def dumps(self, appstruct):
            return signed_serialize(appstruct, secret)

    serializer = SerializerWrapper(secret)

    return BaseCookieSessionFactory(
        serializer,
        cookie_name=cookie_name,
        max_age=cookie_max_age,
        path=cookie_path,
        domain=cookie_domain,
        secure=cookie_secure,
        httponly=cookie_httponly,
        timeout=timeout,
        reissue_time=0, # to keep session.accessed == session.renewed
        set_on_exception=cookie_on_exception,
    )

deprecated(
    'UnencryptedCookieSessionFactoryConfig',
    'The UnencryptedCookieSessionFactoryConfig callable is deprecated as of '
    'Pyramid 1.5.  Use ``pyramid.session.SignedCookieSessionFactory`` instead.'
    ' Caveat: Cookies generated using SignedCookieSessionFactory are not '
    'compatible with cookies generated using UnencryptedCookieSessionFactory, '
    'so existing user session data will be destroyed if you switch to it.'
    )

def SignedCookieSessionFactory(
    secret,
    cookie_name='session',
    max_age=None,
    path='/',
    domain=None,
    secure=False,
    httponly=False,
    set_on_exception=True,
    timeout=1200,
    reissue_time=0,
    hashalg='sha512',
    salt='pyramid.session.',
    serializer=None,
    ):
    """
    .. versionadded:: 1.5
    
    Configure a :term:`session factory` which will provide signed
    cookie-based sessions.  The return value of this
    function is a :term:`session factory`, which may be provided as
    the ``session_factory`` argument of a
    :class:`pyramid.config.Configurator` constructor, or used
    as the ``session_factory`` argument of the
    :meth:`pyramid.config.Configurator.set_session_factory`
    method.

    The session factory returned by this function will create sessions
    which are limited to storing fewer than 4000 bytes of data (as the
    payload must fit into a single cookie).

    Parameters:

    ``secret``
      A string which is used to sign the cookie. The secret should be at
      least as long as the block size of the selected hash algorithm. For
      ``sha512`` this would mean a 128 bit (64 character) secret.  It should
      be unique within the set of secret values provided to Pyramid for
      its various subsystems (see :ref:`admonishment_against_secret_sharing`).

    ``hashalg``
      The HMAC digest algorithm to use for signing. The algorithm must be
      supported by the :mod:`hashlib` library. Default: ``'sha512'``.

    ``salt``
      A namespace to avoid collisions between different uses of a shared
      secret. Reusing a secret for different parts of an application is
      strongly discouraged (see :ref:`admonishment_against_secret_sharing`).
      Default: ``'pyramid.session.'``.

    ``cookie_name``
      The name of the cookie used for sessioning. Default: ``'session'``.

    ``max_age``
      The maximum age of the cookie used for sessioning (in seconds).
      Default: ``None`` (browser scope).

    ``path``
      The path used for the session cookie. Default: ``'/'``.

    ``domain``
      The domain used for the session cookie.  Default: ``None`` (no domain).

    ``secure``
      The 'secure' flag of the session cookie. Default: ``False``.

    ``httponly``
      Hide the cookie from Javascript by setting the 'HttpOnly' flag of the
      session cookie. Default: ``False``.

    ``timeout``
      A number of seconds of inactivity before a session times out. If
      ``None`` then the cookie never expires. This lifetime only applies
      to the *value* within the cookie. Meaning that if the cookie expires
      due to a lower ``max_age``, then this setting has no effect.
      Default: ``1200``.

    ``reissue_time``
      The number of seconds that must pass before the cookie is automatically
      reissued as the result of accessing the session. The
      duration is measured as the number of seconds since the last session
      cookie was issued and 'now'.  If this value is ``0``, a new cookie
      will be reissued on every request accessing the session. If ``None``
      then the cookie's lifetime will never be extended.

      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.
      However, such a configuration is not explicitly prevented.

      Default: ``0``.

    ``set_on_exception``
      If ``True``, set a session cookie even if an exception occurs
      while rendering a view. Default: ``True``.

    ``serializer``
      An object with two methods: ``loads`` and ``dumps``.  The ``loads``
      method should accept bytes and return a Python object.  The ``dumps``
      method should accept a Python object and return bytes.  A ``ValueError``
      should be raised for malformed inputs.  If a serializer is not passed,
      the :class:`pyramid.session.PickleSerializer` serializer will be used.

    .. versionadded: 1.5a3
    """
    if serializer is None:
        serializer = PickleSerializer()

    signed_serializer = SignedSerializer(
        secret,
        salt,
        hashalg,
        serializer=serializer,
        )

    return BaseCookieSessionFactory(
        signed_serializer,
        cookie_name=cookie_name,
        max_age=max_age,
        path=path,
        domain=domain,
        secure=secure,
        httponly=httponly,
        timeout=timeout,
        reissue_time=reissue_time,
        set_on_exception=set_on_exception,
    )

```
--- 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:** Passing String Values for `timeout` Causes TypeError in Session Handling

**Description:**
When initializing a session with the `timeout` parameter as a string, the session handling logic fails due to type mismatch. The system expects `timeout` to be an integer, but if a string is provided, it leads to runtime errors during numerical operations.

**Example Buggy Code:**
```python
from pyramid.session import BaseCookieSessionFactory
from pyramid.request import Request

# Initialize session with timeout as a string
session_factory = BaseCookieSessionFactory('secret', timeout='30')
request = Request.blank('/')
session = session_factory(request)

# Later in the code, a numerical operation is performed
if request.session.renewed and (current_time - request.session.renewed > request.session.timeout):
    # Intended to renew session
    pass
```

**Expected Behavior:**
The session should correctly handle the `timeout` parameter when provided as a string by converting it to an integer. This ensures that all numerical operations involving `timeout` execute without errors.

**Actual Behavior:**
Providing `timeout` as a string results in a `TypeError` during numerical comparisons, such as `current_time - request.session.renewed > request.session.timeout`, because the system attempts to compare a float with a string.

**Error Message:**
```
TypeError: '>' not supported between instances of 'float' and 'str'
```

[/ISSUE]
{
    "TestBaseCookieSession.test__set_cookie_cookieval_too_long": "PASSED",
    "TestBaseCookieSession.test__set_cookie_on_exception": "PASSED",
    "TestBaseCookieSession.test__set_cookie_on_exception_no_request_exception": "PASSED",
    "TestBaseCookieSession.test__set_cookie_options": "PASSED",
    "TestBaseCookieSession.test__set_cookie_real_webob_response": "PASSED",
    "TestBaseCookieSession.test_changed": "PASSED",
    "TestBaseCookieSession.test_cookie_is_set": "PASSED",
    "TestBaseCookieSession.test_cookie_max_age_invalid": "PASSED",
    "TestBaseCookieSession.test_ctor_no_cookie": "PASSED",
    "TestBaseCookieSession.test_ctor_with_bad_cookie_cannot_deserialize": "PASSED",
    "TestBaseCookieSession.test_ctor_with_bad_cookie_not_tuple": "PASSED",
    "TestBaseCookieSession.test_ctor_with_cookie_expired": "PASSED",
    "TestBaseCookieSession.test_ctor_with_cookie_still_valid": "PASSED",
    "TestBaseCookieSession.test_flash_allow_duplicate_false": "PASSED",
    "TestBaseCookieSession.test_flash_allow_duplicate_false_and_msg_not_in_storage": "PASSED",
    "TestBaseCookieSession.test_flash_allow_duplicate_true_and_msg_not_in_storage": "PASSED",
    "TestBaseCookieSession.test_flash_default": "PASSED",
    "TestBaseCookieSession.test_flash_mixed": "PASSED",
    "TestBaseCookieSession.test_get_csrf_token": "PASSED",
    "TestBaseCookieSession.test_get_csrf_token_new": "PASSED",
    "TestBaseCookieSession.test_instance_conforms": "PASSED",
    "TestBaseCookieSession.test_invalidate": "PASSED",
    "TestBaseCookieSession.test_new_csrf_token": "PASSED",
    "TestBaseCookieSession.test_no_set_cookie_with_exception": "PASSED",
    "TestBaseCookieSession.test_peek_flash_default_queue": "PASSED",
    "TestBaseCookieSession.test_peek_flash_nodefault_queue": "PASSED",
    "TestBaseCookieSession.test_pop_flash_default_queue": "PASSED",
    "TestBaseCookieSession.test_pop_flash_nodefault_queue": "PASSED",
    "TestBaseCookieSession.test_reissue_invalid": "PASSED",
    "TestBaseCookieSession.test_reissue_never": "PASSED",
    "TestBaseCookieSession.test_reissue_not_triggered": "PASSED",
    "TestBaseCookieSession.test_reissue_str_triggered": "PASSED",
    "TestBaseCookieSession.test_reissue_triggered": "PASSED",
    "TestBaseCookieSession.test_set_cookie_with_exception": "PASSED",
    "TestBaseCookieSession.test_timeout": "PASSED",
    "TestBaseCookieSession.test_timeout_invalid": "PASSED",
    "TestBaseCookieSession.test_timeout_never": "PASSED",
    "TestBaseCookieSession.test_timeout_str": "PASSED",
    "TestSignedCookieSession.test__set_cookie_cookieval_too_long": "PASSED",
    "TestSignedCookieSession.test__set_cookie_on_exception": "PASSED",
    "TestSignedCookieSession.test__set_cookie_on_exception_no_request_exception": "PASSED",
    "TestSignedCookieSession.test__set_cookie_options": "PASSED",
    "TestSignedCookieSession.test__set_cookie_real_webob_response": "PASSED",
    "TestSignedCookieSession.test_changed": "PASSED",
    "TestSignedCookieSession.test_cookie_is_set": "PASSED",
    "TestSignedCookieSession.test_cookie_max_age_invalid": "PASSED",
    "TestSignedCookieSession.test_ctor_no_cookie": "PASSED",
    "TestSignedCookieSession.test_ctor_with_bad_cookie_cannot_deserialize": "PASSED",
    "TestSignedCookieSession.test_ctor_with_bad_cookie_not_tuple": "PASSED",
    "TestSignedCookieSession.test_ctor_with_cookie_expired": "PASSED",
    "TestSignedCookieSession.test_ctor_with_cookie_still_valid": "PASSED",
    "TestSignedCookieSession.test_custom_hashalg": "PASSED",
    "TestSignedCookieSession.test_custom_salt": "PASSED",
    "TestSignedCookieSession.test_custom_serializer": "PASSED",
    "TestSignedCookieSession.test_flash_allow_duplicate_false": "PASSED",
    "TestSignedCookieSession.test_flash_allow_duplicate_false_and_msg_not_in_storage": "PASSED",
    "TestSignedCookieSession.test_flash_allow_duplicate_true_and_msg_not_in_storage": "PASSED",
    "TestSignedCookieSession.test_flash_default": "PASSED",
    "TestSignedCookieSession.test_flash_mixed": "PASSED",
    "TestSignedCookieSession.test_get_csrf_token": "PASSED",
    "TestSignedCookieSession.test_get_csrf_token_new": "PASSED",
    "TestSignedCookieSession.test_hashalg_mismatch": "PASSED",
    "TestSignedCookieSession.test_instance_conforms": "PASSED",
    "TestSignedCookieSession.test_invalid_data_size": "PASSED",
    "TestSignedCookieSession.test_invalidate": "PASSED",
    "TestSignedCookieSession.test_new_csrf_token": "PASSED",
    "TestSignedCookieSession.test_no_set_cookie_with_exception": "PASSED",
    "TestSignedCookieSession.test_peek_flash_default_queue": "PASSED",
    "TestSignedCookieSession.test_peek_flash_nodefault_queue": "PASSED",
    "TestSignedCookieSession.test_pop_flash_default_queue": "PASSED",
    "TestSignedCookieSession.test_pop_flash_nodefault_queue": "PASSED",
    "TestSignedCookieSession.test_reissue_invalid": "PASSED",
    "TestSignedCookieSession.test_reissue_never": "PASSED",
    "TestSignedCookieSession.test_reissue_not_triggered": "PASSED",
    "TestSignedCookieSession.test_reissue_str_triggered": "PASSED",
    "TestSignedCookieSession.test_reissue_triggered": "PASSED",
    "TestSignedCookieSession.test_salt_mismatch": "PASSED",
    "TestSignedCookieSession.test_secret_mismatch": "PASSED",
    "TestSignedCookieSession.test_set_cookie_with_exception": "PASSED",
    "TestSignedCookieSession.test_timeout": "PASSED",
    "TestSignedCookieSession.test_timeout_invalid": "PASSED",
    "TestSignedCookieSession.test_timeout_never": "PASSED",
    "TestSignedCookieSession.test_timeout_str": "PASSED",
    "TestSignedCookieSession.test_very_long_key": "PASSED",
    "TestUnencryptedCookieSession.test__set_cookie_cookieval_too_long": "PASSED",
    "TestUnencryptedCookieSession.test__set_cookie_on_exception": "PASSED",
    "TestUnencryptedCookieSession.test__set_cookie_on_exception_no_request_exception": "PASSED",
    "TestUnencryptedCookieSession.test__set_cookie_options": "PASSED",
    "TestUnencryptedCookieSession.test__set_cookie_real_webob_response": "PASSED",
    "TestUnencryptedCookieSession.test_changed": "PASSED",
    "TestUnencryptedCookieSession.test_cookie_is_set": "PASSED",
    "TestUnencryptedCookieSession.test_ctor_no_cookie": "PASSED",
    "TestUnencryptedCookieSession.test_ctor_with_bad_cookie_cannot_deserialize": "PASSED",
    "TestUnencryptedCookieSession.test_ctor_with_bad_cookie_not_tuple": "PASSED",
    "TestUnencryptedCookieSession.test_ctor_with_cookie_expired": "PASSED",
    "TestUnencryptedCookieSession.test_ctor_with_cookie_still_valid": "PASSED",
    "TestUnencryptedCookieSession.test_deserialize_option": "PASSED",
    "TestUnencryptedCookieSession.test_flash_allow_duplicate_false": "PASSED",
    "TestUnencryptedCookieSession.test_flash_allow_duplicate_false_and_msg_not_in_storage": "PASSED",
    "TestUnencryptedCookieSession.test_flash_allow_duplicate_true_and_msg_not_in_storage": "PASSED",
    "TestUnencryptedCookieSession.test_flash_default": "PASSED",
    "TestUnencryptedCookieSession.test_flash_mixed": "PASSED",
    "TestUnencryptedCookieSession.test_get_csrf_token": "PASSED",
    "TestUnencryptedCookieSession.test_get_csrf_token_new": "PASSED",
    "TestUnencryptedCookieSession.test_instance_conforms": "PASSED",
    "TestUnencryptedCookieSession.test_invalidate": "PASSED",
    "TestUnencryptedCookieSession.test_new_csrf_token": "PASSED",
    "TestUnencryptedCookieSession.test_no_set_cookie_with_exception": "PASSED",
    "TestUnencryptedCookieSession.test_peek_flash_default_queue": "PASSED",
    "TestUnencryptedCookieSession.test_peek_flash_nodefault_queue": "PASSED",
    "TestUnencryptedCookieSession.test_pop_flash_default_queue": "PASSED",
    "TestUnencryptedCookieSession.test_pop_flash_nodefault_queue": "PASSED",
    "TestUnencryptedCookieSession.test_reissue_triggered": "PASSED",
    "TestUnencryptedCookieSession.test_serialize_option": "PASSED",
    "TestUnencryptedCookieSession.test_set_cookie_with_exception": "PASSED",
    "TestUnencryptedCookieSession.test_timeout": "PASSED",
    "TestUnencryptedCookieSession.test_timeout_invalid": "PASSED",
    "TestUnencryptedCookieSession.test_timeout_never": "PASSED",
    "TestUnencryptedCookieSession.test_timeout_str": "PASSED",
    "Test_manage_accessed.test_accessed_set": "PASSED",
    "Test_manage_accessed.test_accessed_without_renew": "PASSED",
    "Test_manage_accessed.test_already_dirty": "PASSED",
    "Test_manage_changed.test_it": "PASSED",
    "Test_signed_serialize.test_it": "PASSED",
    "Test_signed_serialize.test_it_with_highorder_secret": "PASSED",
    "Test_signed_serialize.test_it_with_latin1_secret": "PASSED",
    "Test_signed_deserialize.test_invalid_bits": "PASSED",
    "Test_signed_deserialize.test_invalid_len": "PASSED",
    "Test_signed_deserialize.test_it": "PASSED",
    "Test_signed_deserialize.test_it_bad_encoding": "PASSED",
    "Test_signed_deserialize.test_it_with_highorder_secret": "PASSED",
    "Test_signed_deserialize.test_it_with_latin1_secret": "PASSED",
    "TestRepozeWho1AuthenticationPolicy.test_authenticated_userid": "PASSED",
    "TestRepozeWho1AuthenticationPolicy.test_authenticated_userid_None": "PASSED",
    "TestRepozeWho1AuthenticationPolicy.test_authenticated_userid_repoze_who_userid_is_None": "PASSED",
    "TestRepozeWho1AuthenticationPolicy.test_authenticated_userid_unclean_principal_Authenticated": "PASSED",
    "TestRepozeWho1AuthenticationPolicy.test_authenticated_userid_unclean_principal_Everyone": "PASSED",
    "TestRepozeWho1AuthenticationPolicy.test_authenticated_userid_with_callback_returns_None": "PASSED",
    "TestRepozeWho1AuthenticationPolicy.test_authenticated_userid_with_callback_returns_something": "PASSED",
    "TestRepozeWho1AuthenticationPolicy.test_class_implements_IAuthenticationPolicy": "PASSED",
    "TestRepozeWho1AuthenticationPolicy.test_effective_principals_None": "PASSED",
    "TestRepozeWho1AuthenticationPolicy.test_effective_principals_repoze_who_userid_is_None": "PASSED",
    "TestRepozeWho1AuthenticationPolicy.test_effective_principals_repoze_who_userid_is_unclean_Authenticated": "PASSED",
    "TestRepozeWho1AuthenticationPolicy.test_effective_principals_repoze_who_userid_is_unclean_Everyone": "PASSED",
    "TestRepozeWho1AuthenticationPolicy.test_effective_principals_userid_and_groups": "PASSED",
    "TestRepozeWho1AuthenticationPolicy.test_effective_principals_userid_callback_returns_None": "PASSED",
    "TestRepozeWho1AuthenticationPolicy.test_effective_principals_userid_only": "PASSED",
    "TestRepozeWho1AuthenticationPolicy.test_forget": "PASSED",
    "TestRepozeWho1AuthenticationPolicy.test_forget_no_plugins": "PASSED",
    "TestRepozeWho1AuthenticationPolicy.test_instance_implements_IAuthenticationPolicy": "PASSED",
    "TestRepozeWho1AuthenticationPolicy.test_remember": "PASSED",
    "TestRepozeWho1AuthenticationPolicy.test_remember_kwargs": "PASSED",
    "TestRepozeWho1AuthenticationPolicy.test_remember_no_plugins": "PASSED",
    "TestRepozeWho1AuthenticationPolicy.test_unauthenticated_userid": "PASSED",
    "TestRepozeWho1AuthenticationPolicy.test_unauthenticated_userid_returns_None": "PASSED",
    "TestRemoteUserAuthenticationPolicy.test_authenticated_userid": "PASSED",
    "TestRemoteUserAuthenticationPolicy.test_authenticated_userid_None": "PASSED",
    "TestRemoteUserAuthenticationPolicy.test_class_implements_IAuthenticationPolicy": "PASSED",
    "TestRemoteUserAuthenticationPolicy.test_effective_principals": "PASSED",
    "TestRemoteUserAuthenticationPolicy.test_effective_principals_None": "PASSED",
    "TestRemoteUserAuthenticationPolicy.test_forget": "PASSED",
    "TestRemoteUserAuthenticationPolicy.test_instance_implements_IAuthenticationPolicy": "PASSED",
    "TestRemoteUserAuthenticationPolicy.test_remember": "PASSED",
    "TestRemoteUserAuthenticationPolicy.test_unauthenticated_userid": "PASSED",
    "TestRemoteUserAuthenticationPolicy.test_unauthenticated_userid_returns_None": "PASSED",
    "TestAuthTktAuthenticationPolicy.test_allargs": "PASSED",
    "TestAuthTktAuthenticationPolicy.test_authenticated_userid": "PASSED",
    "TestAuthTktAuthenticationPolicy.test_authenticated_userid_callback_returns_None": "PASSED",
    "TestAuthTktAuthenticationPolicy.test_authenticated_userid_no_cookie_identity": "PASSED",
    "TestAuthTktAuthenticationPolicy.test_class_implements_IAuthenticationPolicy": "PASSED",
    "TestAuthTktAuthenticationPolicy.test_effective_principals": "PASSED",
    "TestAuthTktAuthenticationPolicy.test_effective_principals_callback_returns_None": "PASSED",
    "TestAuthTktAuthenticationPolicy.test_effective_principals_no_cookie_identity": "PASSED",
    "TestAuthTktAuthenticationPolicy.test_forget": "PASSED",
    "TestAuthTktAuthenticationPolicy.test_hashalg_override": "PASSED",
    "TestAuthTktAuthenticationPolicy.test_instance_implements_IAuthenticationPolicy": "PASSED",
    "TestAuthTktAuthenticationPolicy.test_remember": "PASSED",
    "TestAuthTktAuthenticationPolicy.test_remember_with_extra_kargs": "PASSED",
    "TestAuthTktAuthenticationPolicy.test_unauthenticated_userid": "PASSED",
    "TestAuthTktAuthenticationPolicy.test_unauthenticated_userid_returns_None": "PASSED",
    "TestAuthTktCookieHelper.test_forget": "PASSED",
    "TestAuthTktCookieHelper.test_identify_bad_cookie": "PASSED",
    "TestAuthTktCookieHelper.test_identify_cookie_reissue": "PASSED",
    "TestAuthTktCookieHelper.test_identify_cookie_reissue_already_reissued_this_request": "PASSED",
    "TestAuthTktCookieHelper.test_identify_cookie_reissue_notyet": "PASSED",
    "TestAuthTktCookieHelper.test_identify_cookie_reissue_revoked_by_forget": "PASSED",
    "TestAuthTktCookieHelper.test_identify_cookie_reissue_revoked_by_remember": "PASSED",
    "TestAuthTktCookieHelper.test_identify_cookie_reissue_with_tokens_default": "PASSED",
    "TestAuthTktCookieHelper.test_identify_cookie_str_reissue": "PASSED",
    "TestAuthTktCookieHelper.test_identify_cookie_str_timeout": "PASSED",
    "TestAuthTktCookieHelper.test_identify_cookie_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_init_cookie_str_max_age_invalid": "PASSED",
    "TestAuthTktCookieHelper.test_init_cookie_str_reissue_invalid": "PASSED",
    "TestAuthTktCookieHelper.test_init_cookie_str_timeout_invalid": "PASSED",
    "TestAuthTktCookieHelper.test_remember": "PASSED",
    "TestAuthTktCookieHelper.test_remember_binary_userid": "PASSED",
    "TestAuthTktCookieHelper.test_remember_domain_supercedes_parent_and_wild_domain": "PASSED",
    "TestAuthTktCookieHelper.test_remember_explicit_domain": "PASSED",
    "TestAuthTktCookieHelper.test_remember_http_only": "PASSED",
    "TestAuthTktCookieHelper.test_remember_include_ip": "PASSED",
    "TestAuthTktCookieHelper.test_remember_insane_userid": "PASSED",
    "TestAuthTktCookieHelper.test_remember_int_userid": "PASSED",
    "TestAuthTktCookieHelper.test_remember_invalid_token_format": "PASSED",
    "TestAuthTktCookieHelper.test_remember_long_userid": "PASSED",
    "TestAuthTktCookieHelper.test_remember_max_age": "PASSED",
    "TestAuthTktCookieHelper.test_remember_nonascii_token": "PASSED",
    "TestAuthTktCookieHelper.test_remember_parent_domain": "PASSED",
    "TestAuthTktCookieHelper.test_remember_parent_domain_supercedes_wild_domain": "PASSED",
    "TestAuthTktCookieHelper.test_remember_path": "PASSED",
    "TestAuthTktCookieHelper.test_remember_secure": "PASSED",
    "TestAuthTktCookieHelper.test_remember_str_max_age": "PASSED",
    "TestAuthTktCookieHelper.test_remember_str_max_age_invalid": "PASSED",
    "TestAuthTktCookieHelper.test_remember_tokens": "PASSED",
    "TestAuthTktCookieHelper.test_remember_unicode_but_ascii_token": "PASSED",
    "TestAuthTktCookieHelper.test_remember_unicode_userid": "PASSED",
    "TestAuthTktCookieHelper.test_remember_wild_domain_disabled": "PASSED",
    "TestAuthTicket.test_cookie_value": "PASSED",
    "TestAuthTicket.test_ctor_with_time": "PASSED",
    "TestAuthTicket.test_ctor_with_tokens": "PASSED",
    "TestAuthTicket.test_digest": "PASSED",
    "TestAuthTicket.test_digest_sha512": "PASSED",
    "TestAuthTicket.test_ipv4": "PASSED",
    "TestAuthTicket.test_ipv6": "PASSED",
    "TestBadTicket.test_it": "PASSED",
    "Test_parse_ticket.test_bad_timestamp": "PASSED",
    "Test_parse_ticket.test_bad_userid_or_data": "PASSED",
    "Test_parse_ticket.test_correct_with_user_data": "PASSED",
    "Test_parse_ticket.test_correct_with_user_data_sha512": "PASSED",
    "Test_parse_ticket.test_digest_sig_incorrect": "PASSED",
    "Test_parse_ticket.test_ipv4": "PASSED",
    "Test_parse_ticket.test_ipv6": "PASSED",
    "TestSessionAuthenticationPolicy.test_authenticated_userid": "PASSED",
    "TestSessionAuthenticationPolicy.test_authenticated_userid_callback_returns_None": "PASSED",
    "TestSessionAuthenticationPolicy.test_authenticated_userid_no_cookie_identity": "PASSED",
    "TestSessionAuthenticationPolicy.test_class_implements_IAuthenticationPolicy": "PASSED",
    "TestSessionAuthenticationPolicy.test_effective_principals": "PASSED",
    "TestSessionAuthenticationPolicy.test_effective_principals_callback_returns_None": "PASSED",
    "TestSessionAuthenticationPolicy.test_effective_principals_no_identity": "PASSED",
    "TestSessionAuthenticationPolicy.test_forget": "PASSED",
    "TestSessionAuthenticationPolicy.test_forget_no_identity": "PASSED",
    "TestSessionAuthenticationPolicy.test_instance_implements_IAuthenticationPolicy": "PASSED",
    "TestSessionAuthenticationPolicy.test_remember": "PASSED",
    "TestSessionAuthenticationPolicy.test_unauthenticated_userid": "PASSED",
    "TestSessionAuthenticationPolicy.test_unauthenticated_userid_returns_None": "PASSED",
    "TestBasicAuthAuthenticationPolicy.test_authenticated_userid": "PASSED",
    "TestBasicAuthAuthenticationPolicy.test_authenticated_userid_latin1": "PASSED",
    "TestBasicAuthAuthenticationPolicy.test_authenticated_userid_utf8": "PASSED",
    "TestBasicAuthAuthenticationPolicy.test_class_implements_IAuthenticationPolicy": "PASSED",
    "TestBasicAuthAuthenticationPolicy.test_forget": "PASSED",
    "TestBasicAuthAuthenticationPolicy.test_remember": "PASSED",
    "TestBasicAuthAuthenticationPolicy.test_unauthenticated_bad_header": "PASSED",
    "TestBasicAuthAuthenticationPolicy.test_unauthenticated_userid": "PASSED",
    "TestBasicAuthAuthenticationPolicy.test_unauthenticated_userid_corrupt_base64": "PASSED",
    "TestBasicAuthAuthenticationPolicy.test_unauthenticated_userid_invalid_payload": "PASSED",
    "TestBasicAuthAuthenticationPolicy.test_unauthenticated_userid_no_credentials": "PASSED",
    "TestBasicAuthAuthenticationPolicy.test_unauthenticated_userid_not_basic": "PASSED",
    "TestSimpleSerializer.test_dumps": "PASSED",
    "TestSimpleSerializer.test_loads": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_object_event_subscriber": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_resource_url_default_resource_iface_means_Interface": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_resource_url_nodefault_resource_iface": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_response_adapter": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_response_adapter_dottednames": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_response_adapter_self": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_subscriber_defaults": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_subscriber_dottednames": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_subscriber_iface_specified": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_subscriber_predicate": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_subscriber_with_default_type_predicates_False": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_subscriber_with_default_type_predicates_True": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_subscriber_with_specific_type_and_predicates_False": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_subscriber_with_specific_type_and_predicates_True": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_traverser_default_iface_means_Interface": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_traverser_introspectables": "PASSED",
    "AdaptersConfiguratorMixinTests.test_add_traverser_nondefault_iface": "PASSED",
    "Test_eventonly.test_defaults": "PASSED",
    "TestAssetsConfiguratorMixin.test__override_already_registered": "PASSED",
    "TestAssetsConfiguratorMixin.test__override_not_yet_registered": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_directory_with_absdirectory": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_directory_with_absfile": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_directory_with_file": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_file_with_absdirectory": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_file_with_absfile": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_file_with_directory": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_file_with_missing_abspath": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_file_with_package": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_package_with_absdirectory": "PASSED",
    "TestAssetsConfiguratorMixin.test_override_asset_samename": "PASSED",
    "TestOverrideProvider.test_get_resource_filename_override_returns_value": "PASSED",
    "TestOverrideProvider.test_get_resource_stream_no_overrides": "PASSED",
    "TestOverrideProvider.test_get_resource_stream_override_returns_None": "PASSED",
    "TestOverrideProvider.test_get_resource_stream_override_returns_value": "PASSED",
    "TestOverrideProvider.test_get_resource_string_no_overrides": "PASSED",
    "TestOverrideProvider.test_get_resource_string_override_returns_None": "PASSED",
    "TestOverrideProvider.test_get_resource_string_override_returns_value": "PASSED",
    "TestOverrideProvider.test_has_resource_no_overrides": "PASSED",
    "TestOverrideProvider.test_has_resource_override_returns_None": "PASSED",
    "TestOverrideProvider.test_has_resource_override_returns_True": "PASSED",
    "TestOverrideProvider.test_resource_isdir_no_overrides": "PASSED",
    "TestOverrideProvider.test_resource_isdir_override_returns_False": "PASSED",
    "TestOverrideProvider.test_resource_isdir_override_returns_None": "PASSED",
    "TestOverrideProvider.test_resource_listdir_no_overrides": "PASSED",
    "TestOverrideProvider.test_resource_listdir_override_returns_None": "PASSED",
    "TestOverrideProvider.test_resource_listdir_override_returns_values": "PASSED",
    "TestPackageOverrides.test_class_conforms_to_IPEP302Loader": "PASSED",
    "TestPackageOverrides.test_class_conforms_to_IPackageOverrides": "PASSED",
    "TestPackageOverrides.test_ctor_package_already_has_loader_of_different_type": "PASSED",
    "TestPackageOverrides.test_ctor_package_already_has_loader_of_same_type": "PASSED",
    "TestPackageOverrides.test_ctor_registers_loader_type": "PASSED",
    "TestPackageOverrides.test_ctor_sets_loader": "PASSED",
    "TestPackageOverrides.test_ctor_sets_local_state": "PASSED",
    "TestPackageOverrides.test_filtered_sources": "PASSED",
    "TestPackageOverrides.test_get_code_pkg_has___loader__": "PASSED",
    "TestPackageOverrides.test_get_code_pkg_has_no___loader__": "PASSED",
    "TestPackageOverrides.test_get_data_pkg_has___loader__": "PASSED",
    "TestPackageOverrides.test_get_data_pkg_has_no___loader__": "PASSED",
    "TestPackageOverrides.test_get_filename": "PASSED",
    "TestPackageOverrides.test_get_filename_file_doesnt_exist": "PASSED",
    "TestPackageOverrides.test_get_source_pkg_has___loader__": "PASSED",
    "TestPackageOverrides.test_get_source_pkg_has_no___loader__": "PASSED",
    "TestPackageOverrides.test_get_stream": "PASSED",
    "TestPackageOverrides.test_get_stream_file_doesnt_exist": "PASSED",
    "TestPackageOverrides.test_get_string": "PASSED",
    "TestPackageOverrides.test_get_string_file_doesnt_exist": "PASSED",
    "TestPackageOverrides.test_has_resource": "PASSED",
    "TestPackageOverrides.test_has_resource_file_doesnt_exist": "PASSED",
    "TestPackageOverrides.test_insert_directory": "PASSED",
    "TestPackageOverrides.test_insert_emptystring": "PASSED",
    "TestPackageOverrides.test_insert_file": "PASSED",
    "TestPackageOverrides.test_instance_conforms_to_IPEP302Loader": "PASSED",
    "TestPackageOverrides.test_instance_conforms_to_IPackageOverrides": "PASSED",
    "TestPackageOverrides.test_is_package_pkg_has___loader__": "PASSED",
    "TestPackageOverrides.test_is_package_pkg_has_no___loader__": "PASSED",
    "TestPackageOverrides.test_isdir_doesnt_exist": "PASSED",
    "TestPackageOverrides.test_isdir_false": "PASSED",
    "TestPackageOverrides.test_isdir_true": "PASSED",
    "TestPackageOverrides.test_listdir": "PASSED",
    "TestPackageOverrides.test_listdir_doesnt_exist": "PASSED",
    "TestPackageAssetSource.test_exists": "PASSED",
    "TestPackageAssetSource.test_exists_file_doesnt_exist": "PASSED",
    "TestPackageAssetSource.test_exists_with_prefix": "PASSED",
    "TestPackageAssetSource.test_get_filename_file_doesnt_exist": "PASSED",
    "TestPackageAssetSource.test_get_stream": "PASSED",
    "TestPackageAssetSource.test_get_stream_file_doesnt_exist": "PASSED",
    "TestPackageAssetSource.test_get_stream_with_prefix": "PASSED",
    "TestPackageAssetSource.test_get_string": "PASSED",
    "TestPackageAssetSource.test_get_string_file_doesnt_exist": "PASSED",
    "TestPackageAssetSource.test_get_string_with_prefix": "PASSED",
    "TestPackageAssetSource.test_isdir_doesnt_exist": "PASSED",
    "TestPackageAssetSource.test_isdir_false": "PASSED",
    "TestPackageAssetSource.test_isdir_true": "PASSED",
    "TestPackageAssetSource.test_listdir": "PASSED",
    "TestPackageAssetSource.test_listdir_doesnt_exist": "PASSED",
    "TestFSAssetSource.test_exists": "PASSED",
    "TestFSAssetSource.test_exists_file_doesnt_exist": "PASSED",
    "TestFSAssetSource.test_exists_with_prefix": "PASSED",
    "TestFSAssetSource.test_get_filename": "PASSED",
    "TestFSAssetSource.test_get_filename_file_doesnt_exist": "PASSED",
    "TestFSAssetSource.test_get_filename_with_prefix": "PASSED",
    "TestFSAssetSource.test_get_stream": "PASSED",
    "TestFSAssetSource.test_get_stream_file_doesnt_exist": "PASSED",
    "TestFSAssetSource.test_get_stream_with_prefix": "PASSED",
    "TestFSAssetSource.test_get_string": "PASSED",
    "TestFSAssetSource.test_get_string_file_doesnt_exist": "PASSED",
    "TestFSAssetSource.test_get_string_with_prefix": "PASSED",
    "TestFSAssetSource.test_isdir_doesnt_exist": "PASSED",
    "TestFSAssetSource.test_isdir_false": "PASSED",
    "TestFSAssetSource.test_isdir_true": "PASSED",
    "TestFSAssetSource.test_listdir": "PASSED",
    "TestFSAssetSource.test_listdir_doesnt_exist": "PASSED",
    "TestDirectoryOverride.test_it_match": "PASSED",
    "TestDirectoryOverride.test_it_no_match": "PASSED",
    "TestFileOverride.test_it_match": "PASSED",
    "TestFileOverride.test_it_no_match": "PASSED",
    "TestFactoriesMixin.test_add_request_method_with_None_callable": "PASSED",
    "TestFactoriesMixin.test_add_request_method_with_None_callable_and_no_name": "PASSED",
    "TestFactoriesMixin.test_add_request_method_with_None_callable_conflict": "PASSED",
    "TestFactoriesMixin.test_add_request_method_with_callable": "PASSED",
    "TestFactoriesMixin.test_add_request_method_with_text_type_name": "PASSED",
    "TestFactoriesMixin.test_add_request_method_with_unnamed_callable": "PASSED",
    "TestFactoriesMixin.test_set_multiple_request_methods_conflict": "PASSED",
    "TestFactoriesMixin.test_set_request_factory": "PASSED",
    "TestFactoriesMixin.test_set_request_factory_dottedname": "PASSED",
    "TestFactoriesMixin.test_set_response_factory": "PASSED",
    "TestFactoriesMixin.test_set_response_factory_dottedname": "PASSED",
    "TestFactoriesMixin.test_set_root_factory": "PASSED",
    "TestFactoriesMixin.test_set_root_factory_as_None": "PASSED",
    "TestFactoriesMixin.test_set_root_factory_dottedname": "PASSED",
    "TestFactoriesMixin.test_set_session_factory": "PASSED",
    "TestFactoriesMixin.test_set_session_factory_dottedname": "PASSED",
    "TestDeprecatedFactoriesMixinMethods.test_set_multiple_request_properties": "PASSED",
    "TestDeprecatedFactoriesMixinMethods.test_set_multiple_request_properties_conflict": "PASSED",
    "TestDeprecatedFactoriesMixinMethods.test_set_request_property_with_callable": "PASSED",
    "TestDeprecatedFactoriesMixinMethods.test_set_request_property_with_property": "PASSED",
    "TestDeprecatedFactoriesMixinMethods.test_set_request_property_with_unnamed_callable": "PASSED",
    "TestI18NConfiguratorMixin.test_add_translation_dirs_missing_dir": "PASSED",
    "TestI18NConfiguratorMixin.test_add_translation_dirs_no_specs": "PASSED",
    "TestI18NConfiguratorMixin.test_set_locale_negotiator": "PASSED",
    "TestI18NConfiguratorMixin.test_set_locale_negotiator_dottedname": "PASSED",
    "ConfiguratorTests.test___getattr__matches": "PASSED",
    "ConfiguratorTests.test___getattr__matches_no_action_wrap": "PASSED",
    "ConfiguratorTests.test___getattr__missing_when_directives_dont_exist": "PASSED",
    "ConfiguratorTests.test___getattr__missing_when_directives_exist": "PASSED",
    "ConfiguratorTests.test__fix_registry_adds__lock": "PASSED",
    "ConfiguratorTests.test__fix_registry_adds_clear_view_lookup_cache": "PASSED",
    "ConfiguratorTests.test__fix_registry_has_listeners": "PASSED",
    "ConfiguratorTests.test__fix_registry_notify": "PASSED",
    "ConfiguratorTests.test__fix_registry_queryAdapterOrSelf": "PASSED",
    "ConfiguratorTests.test__fix_registry_registerSelfAdapter": "PASSED",
    "ConfiguratorTests.test_absolute_asset_spec_already_absolute": "PASSED",
    "ConfiguratorTests.test_absolute_asset_spec_notastring": "PASSED",
    "ConfiguratorTests.test_absolute_asset_spec_relative": "PASSED",
    "ConfiguratorTests.test_action_autocommit_with_introspectables": "PASSED",
    "ConfiguratorTests.test_action_autocommit_with_introspectables_introspection_off": "PASSED",
    "ConfiguratorTests.test_action_branching_kw_is_None": "PASSED",
    "ConfiguratorTests.test_action_branching_kw_is_not_None": "PASSED",
    "ConfiguratorTests.test_action_branching_nonautocommit_with_config_info": "PASSED",
    "ConfiguratorTests.test_action_branching_nonautocommit_with_introspectables": "PASSED",
    "ConfiguratorTests.test_action_branching_nonautocommit_without_config_info": "PASSED",
    "ConfiguratorTests.test_action_nonautocommit_with_introspectables_introspection_off": "PASSED",
    "ConfiguratorTests.test_autocommit_no_conflicts": "PASSED",
    "ConfiguratorTests.test_begin": "PASSED",
    "ConfiguratorTests.test_begin_with_request": "PASSED",
    "ConfiguratorTests.test_commit_conflict_resolved_with_include": "PASSED",
    "ConfiguratorTests.test_commit_conflict_resolved_with_two_includes_and_local": "PASSED",
    "ConfiguratorTests.test_commit_conflict_simple": "PASSED",
    "ConfiguratorTests.test_commit_conflict_with_two_includes": "PASSED",
    "ConfiguratorTests.test_conflict_set_forbidden_view": "PASSED",
    "ConfiguratorTests.test_conflict_set_notfound_view": "PASSED",
    "ConfiguratorTests.test_ctor_alternate_renderers": "PASSED",
    "ConfiguratorTests.test_ctor_authentication_policy": "PASSED",
    "ConfiguratorTests.test_ctor_authorization_policy_only": "PASSED",
    "ConfiguratorTests.test_ctor_default_permission": "PASSED",
    "ConfiguratorTests.test_ctor_default_renderers": "PASSED",
    "ConfiguratorTests.test_ctor_default_view_mapper": "PASSED",
    "ConfiguratorTests.test_ctor_default_webob_response_adapter_registered": "PASSED",
    "ConfiguratorTests.test_ctor_exceptionresponse_view_None": "PASSED",
    "ConfiguratorTests.test_ctor_exceptionresponse_view_custom": "PASSED",
    "ConfiguratorTests.test_ctor_httpexception_view_default": "PASSED",
    "ConfiguratorTests.test_ctor_no_root_factory": "PASSED",
    "ConfiguratorTests.test_ctor_noreg_custom_settings": "PASSED",
    "ConfiguratorTests.test_ctor_noreg_debug_logger_non_None": "PASSED",
    "ConfiguratorTests.test_ctor_session_factory": "PASSED",
    "ConfiguratorTests.test_ctor_with_introspection": "PASSED",
    "ConfiguratorTests.test_ctor_with_package_registry": "PASSED",
    "ConfiguratorTests.test_ctor_with_root_factory": "PASSED",
    "ConfiguratorTests.test_end": "PASSED",
    "ConfiguratorTests.test_hook_zca": "PASSED",
    "ConfiguratorTests.test_include_with_dotted_name": "PASSED",
    "ConfiguratorTests.test_include_with_missing_source_file": "PASSED",
    "ConfiguratorTests.test_include_with_module_defaults_to_includeme": "PASSED",
    "ConfiguratorTests.test_include_with_module_defaults_to_includeme_missing": "PASSED",
    "ConfiguratorTests.test_include_with_nested_route_prefix": "PASSED",
    "ConfiguratorTests.test_include_with_python_callable": "PASSED",
    "ConfiguratorTests.test_include_with_route_prefix": "PASSED",
    "ConfiguratorTests.test_introspector_decorator": "PASSED",
    "ConfiguratorTests.test_make_wsgi_app": "PASSED",
    "ConfiguratorTests.test_maybe_dotted_notstring_success": "PASSED",
    "ConfiguratorTests.test_maybe_dotted_string_fail": "PASSED",
    "ConfiguratorTests.test_maybe_dotted_string_success": "PASSED",
    "ConfiguratorTests.test_scan_integration": "PASSED",
    "ConfiguratorTests.test_scan_integration_dottedname_package": "PASSED",
    "ConfiguratorTests.test_scan_integration_with_extra_kw": "PASSED",
    "ConfiguratorTests.test_scan_integration_with_ignore": "PASSED",
    "ConfiguratorTests.test_scan_integration_with_onerror": "PASSED",
    "ConfiguratorTests.test_setup_registry_alternate_renderers": "PASSED",
    "ConfiguratorTests.test_setup_registry_authentication_policy": "PASSED",
    "ConfiguratorTests.test_setup_registry_authentication_policy_dottedname": "PASSED",
    "ConfiguratorTests.test_setup_registry_authorization_policy_dottedname": "PASSED",
    "ConfiguratorTests.test_setup_registry_authorization_policy_only": "PASSED",
    "ConfiguratorTests.test_setup_registry_calls_fix_registry": "PASSED",
    "ConfiguratorTests.test_setup_registry_custom_settings": "PASSED",
    "ConfiguratorTests.test_setup_registry_debug_logger_name": "PASSED",
    "ConfiguratorTests.test_setup_registry_debug_logger_non_None": "PASSED",
    "ConfiguratorTests.test_setup_registry_default_permission": "PASSED",
    "ConfiguratorTests.test_setup_registry_dottedname_root_factory": "PASSED",
    "ConfiguratorTests.test_setup_registry_explicit_notfound_trumps_iexceptionresponse": "PASSED",
    "ConfiguratorTests.test_setup_registry_includes": "PASSED",
    "ConfiguratorTests.test_setup_registry_includes_spaces": "PASSED",
    "ConfiguratorTests.test_setup_registry_locale_negotiator": "PASSED",
    "ConfiguratorTests.test_setup_registry_locale_negotiator_dottedname": "PASSED",
    "ConfiguratorTests.test_setup_registry_no_default_root_factory": "PASSED",
    "ConfiguratorTests.test_setup_registry_registers_default_exceptionresponse_views": "PASSED",
    "ConfiguratorTests.test_setup_registry_registers_default_view_predicates": "PASSED",
    "ConfiguratorTests.test_setup_registry_registers_default_webob_iresponse_adapter": "PASSED",
    "ConfiguratorTests.test_setup_registry_request_factory": "PASSED",
    "ConfiguratorTests.test_setup_registry_request_factory_dottedname": "PASSED",
    "ConfiguratorTests.test_setup_registry_response_factory": "PASSED",
    "ConfiguratorTests.test_setup_registry_tweens": "PASSED",
    "ConfiguratorTests.test_unhook_zca": "PASSED",
    "ConfiguratorTests.test_with_package": "PASSED",
    "ConfiguratorTests.test_with_package_module": "PASSED",
    "ConfiguratorTests.test_with_package_package": "PASSED",
    "TestConfigurator_add_directive.test_directive_persists_across_configurator_creations": "PASSED",
    "TestConfigurator_add_directive.test_extend_action_method_successful": "PASSED",
    "TestConfigurator_add_directive.test_extend_same_name_doesnt_conflict": "PASSED",
    "TestConfigurator__add_predicate.test_factory_as_object": "PASSED",
    "TestActionState.test_action_simple": "PASSED",
    "TestActionState.test_action_with_includepath": "PASSED",
    "TestActionState.test_action_with_includepath_and_info": "PASSED",
    "TestActionState.test_action_with_info": "PASSED",
    "TestActionState.test_action_with_introspectables": "PASSED",
    "TestActionState.test_action_with_order": "PASSED",
    "TestActionState.test_execute_actions_dicts": "PASSED",
    "TestActionState.test_execute_actions_error": "PASSED",
    "TestActionState.test_execute_actions_tuples": "PASSED",
    "TestActionState.test_execute_actions_with_introspectable_no_callable": "PASSED",
    "TestActionState.test_execute_actions_with_introspectables": "PASSED",
    "TestActionState.test_it": "PASSED",
    "TestActionState.test_processSpec": "PASSED",
    "TestActionState.test_reentrant_action": "PASSED",
    "TestActionState.test_reentrant_action_error": "PASSED",
    "TestActionState.test_reentrant_action_without_clear": "PASSED",
    "Test_reentrant_action_functional.test_functional": "PASSED",
    "Test_resolveConflicts.test_it_conflict": "PASSED",
    "Test_resolveConflicts.test_it_success_dicts": "PASSED",
    "Test_resolveConflicts.test_it_success_tuples": "PASSED",
    "Test_resolveConflicts.test_it_with_actions_grouped_by_order": "PASSED",
    "TestGlobalRegistriesIntegration.test_global_registries": "PASSED",
    "TestGlobalRegistriesIntegration.test_global_registries_empty": "PASSED",
    "TestXHRPredicate.test___call___false": "PASSED",
    "TestXHRPredicate.test___call___true": "PASSED",
    "TestXHRPredicate.test_phash": "PASSED",
    "TestXHRPredicate.test_text": "PASSED",
    "TestRequestMethodPredicate.test___call___false": "PASSED",
    "TestRequestMethodPredicate.test___call___true_multi": "PASSED",
    "TestRequestMethodPredicate.test___call___true_single": "PASSED",
    "TestRequestMethodPredicate.test_ctor_get_but_no_head": "PASSED",
    "TestRequestMethodPredicate.test_phash": "PASSED",
    "TestRequestMethodPredicate.test_text": "PASSED",
    "TestPathInfoPredicate.test___call___false": "PASSED",
    "TestPathInfoPredicate.test___call___true": "PASSED",
    "TestPathInfoPredicate.test_ctor_compilefail": "PASSED",
    "TestPathInfoPredicate.test_phash": "PASSED",
    "TestPathInfoPredicate.test_text": "PASSED",
    "TestRequestParamPredicate.test___call___false": "PASSED",
    "TestRequestParamPredicate.test___call___false_multi": "PASSED",
    "TestRequestParamPredicate.test___call___true_exists": "PASSED",
    "TestRequestParamPredicate.test___call___true_multi": "PASSED",
    "TestRequestParamPredicate.test___call___true_withval": "PASSED",
    "TestRequestParamPredicate.test_phash_exists": "PASSED",
    "TestRequestParamPredicate.test_phash_withval": "PASSED",
    "TestRequestParamPredicate.test_text_exists": "PASSED",
    "TestRequestParamPredicate.test_text_multi": "PASSED",
    "TestRequestParamPredicate.test_text_withval": "PASSED",
    "TestMatchParamPredicate.test___call___false": "PASSED",
    "TestMatchParamPredicate.test___call___matchdict_is_None": "PASSED",
    "TestMatchParamPredicate.test___call___true_multi": "PASSED",
    "TestMatchParamPredicate.test___call___true_single": "PASSED",
    "TestMatchParamPredicate.test_phash": "PASSED",
    "TestMatchParamPredicate.test_text": "PASSED",
    "TestCustomPredicate.test___call___false": "PASSED",
    "TestCustomPredicate.test___call___true": "PASSED",
    "TestCustomPredicate.test_phash": "PASSED",
    "TestCustomPredicate.test_text_func_has___text__": "PASSED",
    "TestCustomPredicate.test_text_func_repr": "PASSED",
    "TestTraversePredicate.test___call__traverse_has_remainder_already": "PASSED",
    "TestTraversePredicate.test___call__traverse_matches": "PASSED",
    "TestTraversePredicate.test___call__traverse_matches_with_highorder_chars": "PASSED",
    "TestTraversePredicate.test_phash": "PASSED",
    "TestTraversePredicate.test_text": "PASSED",
    "Test_CheckCSRFTokenPredicate.test_it_call_val_False": "PASSED",
    "Test_CheckCSRFTokenPredicate.test_it_call_val_True": "PASSED",
    "Test_CheckCSRFTokenPredicate.test_it_call_val_str": "PASSED",
    "Test_CheckCSRFTokenPredicate.test_phash": "PASSED",
    "Test_CheckCSRFTokenPredicate.test_text": "PASSED",
    "TestHeaderPredicate.test___call___false": "PASSED",
    "TestHeaderPredicate.test___call___false_withregex": "PASSED",
    "TestHeaderPredicate.test___call___true_exists": "PASSED",
    "TestHeaderPredicate.test___call___true_withregex": "PASSED",
    "TestHeaderPredicate.test___call___true_withval": "PASSED",
    "TestHeaderPredicate.test_phash_exists": "PASSED",
    "TestHeaderPredicate.test_phash_withregex": "PASSED",
    "TestHeaderPredicate.test_phash_withval": "PASSED",
    "TestHeaderPredicate.test_text_exists": "PASSED",
    "TestHeaderPredicate.test_text_withregex": "PASSED",
    "TestHeaderPredicate.test_text_withval": "PASSED",
    "Test_PhysicalPathPredicate.test_it_call_False": "PASSED",
    "Test_PhysicalPathPredicate.test_it_call_context_has_no_name": "PASSED",
    "Test_PhysicalPathPredicate.test_it_call_val_list_True": "PASSED",
    "Test_PhysicalPathPredicate.test_it_call_val_str_True": "PASSED",
    "Test_PhysicalPathPredicate.test_it_call_val_tuple_True": "PASSED",
    "Test_PhysicalPathPredicate.test_phash": "PASSED",
    "Test_PhysicalPathPredicate.test_text": "PASSED",
    "Test_EffectivePrincipalsPredicate.test_it_call_authentication_policy_doesnt_provide_superset": "PASSED",
    "Test_EffectivePrincipalsPredicate.test_it_call_authentication_policy_provides_superset": "PASSED",
    "Test_EffectivePrincipalsPredicate.test_it_call_authentication_policy_provides_superset_implicit": "PASSED",
    "Test_EffectivePrincipalsPredicate.test_it_call_no_authentication_policy": "PASSED",
    "Test_EffectivePrincipalsPredicate.test_phash": "PASSED",
    "Test_EffectivePrincipalsPredicate.test_text": "PASSED",
    "Test_EffectivePrincipalsPredicate.test_text_noniter": "PASSED",
    "TestRenderingConfiguratorMixin.test_add_default_renderers": "PASSED",
    "TestRenderingConfiguratorMixin.test_add_renderer": "PASSED",
    "TestRenderingConfiguratorMixin.test_add_renderer_dottedname_factory": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_defaults": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_discriminator": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_no_path_no_pattern": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_no_pattern_with_path": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_no_view_with_view_attr": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_no_view_with_view_context": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_no_view_with_view_permission": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_no_view_with_view_renderer": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_accept": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_custom_predicates": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_factory": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_factory_dottedname": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_header": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_path_info": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_path_info_highorder": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_path_info_regex": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_pregenerator": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_request_method": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_request_param": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_route_prefix": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_static": "PASSED",
    "RoutesConfiguratorMixinTests.test_add_route_with_xhr": "PASSED",
    "RoutesConfiguratorMixinTests.test_get_routes_mapper_already_registered": "PASSED",
    "RoutesConfiguratorMixinTests.test_get_routes_mapper_not_yet_registered": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_add_permission": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_set_authentication_policy_no_authz_policy": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_set_authentication_policy_no_authz_policy_autocommit": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_set_authentication_policy_with_authz_policy": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_set_authentication_policy_with_authz_policy_autocommit": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_set_authorization_policy_no_authn_policy": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_set_authorization_policy_no_authn_policy_autocommit": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_set_authorization_policy_with_authn_policy": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_set_authorization_policy_with_authn_policy_autocommit": "PASSED",
    "ConfiguratorSecurityMethodsTests.test_set_default_permission": "PASSED",
    "TestSettingsConfiguratorMixin.test__set_settings_as_None": "PASSED",
    "TestSettingsConfiguratorMixin.test__set_settings_as_dictwithvalues": "PASSED",
    "TestSettingsConfiguratorMixin.test_add_settings_settings_None": "PASSED",
    "TestSettingsConfiguratorMixin.test_add_settings_settings_already_registered": "PASSED",
    "TestSettingsConfiguratorMixin.test_add_settings_settings_not_yet_registered": "PASSED",
    "TestSettingsConfiguratorMixin.test_get_settings_nosettings": "PASSED",
    "TestSettingsConfiguratorMixin.test_get_settings_withsettings": "PASSED",
    "TestSettings.test_debug_all": "PASSED",
    "TestSettings.test_debug_authorization": "PASSED",
    "TestSettings.test_debug_notfound": "PASSED",
    "TestSettings.test_debug_routematch": "PASSED",
    "TestSettings.test_debug_templates": "PASSED",
    "TestSettings.test_default_locale_name": "PASSED",
    "TestSettings.test_getattr_fail": "PASSED",
    "TestSettings.test_getattr_raises_attribute_error": "PASSED",
    "TestSettings.test_getattr_success": "PASSED",
    "TestSettings.test_noargs": "PASSED",
    "TestSettings.test_originals_kept": "PASSED",
    "TestSettings.test_prevent_cachebust": "PASSED",
    "TestSettings.test_prevent_http_cache": "PASSED",
    "TestSettings.test_reload_all": "PASSED",
    "TestSettings.test_reload_assets": "PASSED",
    "TestSettings.test_reload_resources": "PASSED",
    "TestSettings.test_reload_templates": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_add_renderer": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_add_renderer_explicitrenderer": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_add_renderer_twice": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_add_subscriber_defaults": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_add_subscriber_dottedname": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_add_subscriber_multiple": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_add_subscriber_single": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_add_template": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_resources": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_securitypolicy": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_securitypolicy_forget_result": "PASSED",
    "TestingConfiguratorMixinTests.test_testing_securitypolicy_remember_result": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tween_dottedname": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tween_instance": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tween_name_ingress": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tween_name_main": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tween_over_ingress": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tween_over_ingress_iterable": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tween_under_main": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tween_under_main_iterable": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tween_unsuitable": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tweens_conflict": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tweens_names_distinct": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tweens_names_with_over_nonstringoriter": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tweens_names_with_under_nonstringoriter": "PASSED",
    "TestTweensConfiguratorMixin.test_add_tweens_names_with_underover": "PASSED",
    "TestTweens.test___call___explicit": "PASSED",
    "TestTweens.test___call___implicit": "PASSED",
    "TestTweens.test_add_explicit": "PASSED",
    "TestTweens.test_add_implicit": "PASSED",
    "TestTweens.test_implicit_ordering_1": "PASSED",
    "TestTweens.test_implicit_ordering_2": "PASSED",
    "TestTweens.test_implicit_ordering_3": "PASSED",
    "TestTweens.test_implicit_ordering_4": "PASSED",
    "TestTweens.test_implicit_ordering_5": "PASSED",
    "TestTweens.test_implicit_ordering_conflict_direct": "PASSED",
    "TestTweens.test_implicit_ordering_conflict_indirect": "PASSED",
    "TestTweens.test_implicit_ordering_missing_over_and_under_partials": "PASSED",
    "TestTweens.test_implicit_ordering_missing_over_partial": "PASSED",
    "TestTweens.test_implicit_ordering_missing_over_partial_with_fallback": "PASSED",
    "TestTweens.test_implicit_ordering_missing_under_partial": "PASSED",
    "TestTweens.test_implicit_ordering_missing_under_partial_with_fallback": "PASSED",
    "TestTweens.test_implicit_ordering_with_missing_fallbacks": "PASSED",
    "TestTweens.test_implicit_ordering_with_multiple_matching_fallbacks": "PASSED",
    "TestTweens.test_implicit_ordering_with_partial_fallbacks": "PASSED",
    "TestPredicateList.test_custom_predicates_can_affect_traversal": "PASSED",
    "TestPredicateList.test_different_custom_predicates_with_same_hash": "PASSED",
    "TestPredicateList.test_match_param_from_dict": "PASSED",
    "TestPredicateList.test_match_param_from_dict_fails": "PASSED",
    "TestPredicateList.test_match_param_from_string": "PASSED",
    "TestPredicateList.test_match_param_from_string_fails": "PASSED",
    "TestPredicateList.test_notted": "PASSED",
    "TestPredicateList.test_ordering_importance_and_number": "PASSED",
    "TestPredicateList.test_ordering_importance_of_predicates": "PASSED",
    "TestPredicateList.test_ordering_number_of_predicates": "PASSED",
    "TestPredicateList.test_ordering_xhr_and_request_method_trump_only_containment": "PASSED",
    "TestPredicateList.test_predicate_text_is_correct": "PASSED",
    "TestPredicateList.test_request_method_ordering_hashes_same": "PASSED",
    "TestPredicateList.test_request_method_sequence": "PASSED",
    "TestPredicateList.test_traverse_has_remainder_already": "PASSED",
    "TestPredicateList.test_traverse_matches": "PASSED",
    "TestPredicateList.test_traverse_matches_with_highorder_chars": "PASSED",
    "TestPredicateList.test_unknown_predicate": "PASSED",
    "Test_takes_one_arg.test_function_annotations": "PASSED",
    "Test_takes_one_arg.test_function_defaultargs_firstname_not_request": "PASSED",
    "Test_takes_one_arg.test_function_defaultargs_firstname_request": "PASSED",
    "Test_takes_one_arg.test_function_noargs": "PASSED",
    "Test_takes_one_arg.test_function_onearg_named_request": "PASSED",
    "Test_takes_one_arg.test_function_onearg_named_somethingelse": "PASSED",
    "Test_takes_one_arg.test_function_toomanyargs": "PASSED",
    "Test_takes_one_arg.test_function_with_attr_false": "PASSED",
    "Test_takes_one_arg.test_function_with_attr_true": "PASSED",
    "Test_takes_one_arg.test_instance_defaultargs_firstname_not_request": "PASSED",
    "Test_takes_one_arg.test_instance_defaultargs_firstname_request": "PASSED",
    "Test_takes_one_arg.test_instance_defaultargs_onearg_named_request": "PASSED",
    "Test_takes_one_arg.test_instance_defaultargs_onearg_named_somethingelse": "PASSED",
    "Test_takes_one_arg.test_instance_nocall": "PASSED",
    "Test_takes_one_arg.test_instance_toomanyargs": "PASSED",
    "Test_takes_one_arg.test_method_onearg_named_request": "PASSED",
    "Test_takes_one_arg.test_newstyle_class_init_defaultargs_firstname_not_request": "PASSED",
    "Test_takes_one_arg.test_newstyle_class_init_defaultargs_firstname_request": "PASSED",
    "Test_takes_one_arg.test_newstyle_class_init_firstname_request_with_secondname": "PASSED",
    "Test_takes_one_arg.test_newstyle_class_init_noargs": "PASSED",
    "Test_takes_one_arg.test_newstyle_class_init_onearg_named_somethingelse": "PASSED",
    "Test_takes_one_arg.test_oldstyle_class_init_defaultargs_firstname_not_request": "PASSED",
    "Test_takes_one_arg.test_oldstyle_class_init_defaultargs_firstname_request": "PASSED",
    "Test_takes_one_arg.test_oldstyle_class_init_noargs": "PASSED",
    "Test_takes_one_arg.test_oldstyle_class_init_onearg_named_request": "PASSED",
    "Test_takes_one_arg.test_oldstyle_class_init_onearg_named_somethingelse": "PASSED",
    "Test_takes_one_arg.test_oldstyle_class_init_toomanyargs": "PASSED",
    "Test_takes_one_arg.test_oldstyle_class_no_init": "PASSED",
    "Test_takes_one_arg.test_requestonly_newstyle_class_init_onearg_named_request": "PASSED",
    "Test_takes_one_arg.test_requestonly_newstyle_class_init_toomanyargs": "PASSED",
    "Test_takes_one_arg.test_requestonly_newstyle_class_no_init": "PASSED",
    "TestNotted.test_it_with_phash_val": "PASSED",
    "TestNotted.test_it_without_phash_val": "PASSED",
    "TestViewsConfigurationMixin.test_add_forbidden_view": "PASSED",
    "TestViewsConfigurationMixin.test_add_forbidden_view_allows_other_predicates": "PASSED",
    "TestViewsConfigurationMixin.test_add_forbidden_view_disallows_context": "PASSED",
    "TestViewsConfigurationMixin.test_add_forbidden_view_disallows_for_": "PASSED",
    "TestViewsConfigurationMixin.test_add_forbidden_view_disallows_http_cache": "PASSED",
    "TestViewsConfigurationMixin.test_add_forbidden_view_disallows_name": "PASSED",
    "TestViewsConfigurationMixin.test_add_forbidden_view_disallows_permission": "PASSED",
    "TestViewsConfigurationMixin.test_add_forbidden_view_no_view_argument": "PASSED",
    "TestViewsConfigurationMixin.test_add_forbidden_view_with_renderer": "PASSED",
    "TestViewsConfigurationMixin.test_add_forbidden_view_with_view_defaults": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_allows_other_predicates": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_append_slash": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_append_slash_custom_response": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_disallows_context": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_disallows_for_": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_disallows_http_cache": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_disallows_name": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_disallows_permission": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_no_view_argument": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_with_renderer": "PASSED",
    "TestViewsConfigurationMixin.test_add_notfound_view_with_view_defaults": "PASSED",
    "TestViewsConfigurationMixin.test_add_static_view_absolute": "PASSED",
    "TestViewsConfigurationMixin.test_add_static_view_here_no_utility_registered": "PASSED",
    "TestViewsConfigurationMixin.test_add_static_view_package_relative": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_as_instance": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_as_instance_requestonly": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_as_instancemethod": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_as_instancemethod_requestonly": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_as_oldstyle_class": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_as_oldstyle_class_requestonly": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_class_method_no_attr": "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_tmpl_renderer_factory_introspector_missing": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_tmpl_renderer_factory_no_renderer_factory": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_tmpl_renderer_factory_with_renderer_factory": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_view_config_and_view_defaults_conflicts": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_view_config_and_view_defaults_doesnt_conflict": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_view_defaults": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_view_defaults_viewname_is_dottedname_kwarg": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_view_defaults_viewname_is_dottedname_nonkwarg": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_xhr_false": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_with_xhr_true": "PASSED",
    "TestViewsConfigurationMixin.test_add_view_wrapped_view_is_decorated": "PASSED",
    "TestViewsConfigurationMixin.test_add_views_with_accept_multiview_replaces_existing": "PASSED",
    "TestViewsConfigurationMixin.test_derive_view_dottedname": "PASSED",
    "TestViewsConfigurationMixin.test_derive_view_function": "PASSED",
    "TestViewsConfigurationMixin.test_derive_view_with_default_renderer_no_explicit_renderer": "PASSED",
    "TestViewsConfigurationMixin.test_derive_view_with_default_renderer_with_explicit_renderer": "PASSED",
    "TestViewsConfigurationMixin.test_set_view_mapper": "PASSED",
    "TestViewsConfigurationMixin.test_set_view_mapper_dottedname": "PASSED",
    "TestViewsConfigurationMixin.test_view_with_most_specific_predicate": "PASSED",
    "TestViewsConfigurationMixin.test_view_with_most_specific_predicate_with_mismatch": "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_cachebust_custom": "PASSED",
    "TestStaticURLInfo.test_add_cachebust_prevented": "PASSED",
    "TestStaticURLInfo.test_add_package_root": "PASSED",
    "TestStaticURLInfo.test_add_url_noendslash": "PASSED",
    "TestStaticURLInfo.test_add_url_noscheme": "PASSED",
    "TestStaticURLInfo.test_add_url_withendslash": "PASSED",
    "TestStaticURLInfo.test_add_viewname": "PASSED",
    "TestStaticURLInfo.test_add_viewname_with_context": "PASSED",
    "TestStaticURLInfo.test_add_viewname_with_for_": "PASSED",
    "TestStaticURLInfo.test_add_viewname_with_permission": "PASSED",
    "TestStaticURLInfo.test_add_viewname_with_renderer": "PASSED",
    "TestStaticURLInfo.test_add_viewname_with_route_prefix": "PASSED",
    "TestStaticURLInfo.test_generate_missing": "PASSED",
    "TestStaticURLInfo.test_generate_quoting": "PASSED",
    "TestStaticURLInfo.test_generate_registration_miss": "PASSED",
    "TestStaticURLInfo.test_generate_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_cachebust": "PASSED",
    "TestStaticURLInfo.test_generate_url_quoted_remote": "PASSED",
    "TestStaticURLInfo.test_generate_url_unquoted_local": "PASSED",
    "TestStaticURLInfo.test_generate_url_with_custom_anchor": "PASSED",
    "TestStaticURLInfo.test_generate_url_with_custom_query": "PASSED",
    "TestStaticURLInfo.test_verifyClass": "PASSED",
    "TestStaticURLInfo.test_verifyObject": "PASSED",
    "Test_view_description.test_with_text": "PASSED",
    "Test_logging_file_config.test_it": "PASSED",
    "TestParseVars.test_parse_vars_bad": "PASSED",
    "TestParseVars.test_parse_vars_good": "PASSED",
    "TestPCreateCommand.test_confirm_override_conflicting_name": "PASSED",
    "TestPCreateCommand.test_force_override_conflicting_name": "PASSED",
    "TestPCreateCommand.test_force_override_site_name": "PASSED",
    "TestPCreateCommand.test_known_scaffold_absolute_path": "PASSED",
    "TestPCreateCommand.test_known_scaffold_multiple_rendered": "PASSED",
    "TestPCreateCommand.test_known_scaffold_single_rendered": "PASSED",
    "TestPCreateCommand.test_known_scaffold_with_path_as_project_target_rendered": "PASSED",
    "TestPCreateCommand.test_no_project_name": "PASSED",
    "TestPCreateCommand.test_run_no_scaffold_name": "PASSED",
    "TestPCreateCommand.test_run_no_scaffold_no_args": "PASSED",
    "TestPCreateCommand.test_run_show_scaffolds_exist": "PASSED",
    "TestPCreateCommand.test_run_show_scaffolds_none_exist": "PASSED",
    "TestPCreateCommand.test_scaffold_with_dev_pyramid_long_version": "PASSED",
    "TestPCreateCommand.test_scaffold_with_dev_pyramid_version": "PASSED",
    "TestPCreateCommand.test_scaffold_with_hyphen_in_project_name": "PASSED",
    "TestPCreateCommand.test_scaffold_with_prod_pyramid_long_version": "PASSED",
    "TestPCreateCommand.test_scaffold_with_prod_pyramid_unparsable_version": "PASSED",
    "TestPCreateCommand.test_scaffold_with_prod_pyramid_version": "PASSED",
    "TestPCreateCommand.test_unknown_scaffold_name": "PASSED",
    "Test_main.test_it": "PASSED",
    "TestPDistReportCommand.test_no_dists": "PASSED",
    "TestPDistReportCommand.test_with_dists": "PASSED",
    "TestPRequestCommand.test_command_has_bad_config_header": "PASSED",
    "TestPRequestCommand.test_command_method_configures_logging": "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_bad_format": "PASSED",
    "TestPRoutesCommand.test_good_args": "PASSED",
    "TestPRoutesCommand.test_good_format": "PASSED",
    "TestPRoutesCommand.test_no_mapper": "PASSED",
    "TestPRoutesCommand.test_no_routes": "PASSED",
    "TestPRoutesCommand.test_route_as_wsgiapp": "PASSED",
    "TestPRoutesCommand.test_route_no_view": "PASSED",
    "TestPRoutesCommand.test_route_with_no_slash_prefix": "PASSED",
    "TestPRoutesCommand.test_single_route_multiview_registered": "PASSED",
    "TestPRoutesCommand.test_single_route_no_route_registered": "PASSED",
    "TestPRoutesCommand.test_single_route_no_views_registered": "PASSED",
    "TestPRoutesCommand.test_single_route_one_view_registered_with_factory": "PASSED",
    "TestPRoutesCommand.test_static_routes_included_in_list": "PASSED",
    "TestPServeCommand.test_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_default_shell_option": "PASSED",
    "TestPShellCommand.test_command_errors_with_unknown_shell": "PASSED",
    "TestPShellCommand.test_command_loads_check_variable_override_order": "PASSED",
    "TestPShellCommand.test_command_loads_custom_items": "PASSED",
    "TestPShellCommand.test_command_loads_default_shell": "PASSED",
    "TestPShellCommand.test_command_loads_ipython": "PASSED",
    "TestPShellCommand.test_command_loads_pythonstartup": "PASSED",
    "TestPShellCommand.test_command_loads_setup_from_options": "PASSED",
    "TestPShellCommand.test_command_setup": "PASSED",
    "TestPShellCommand.test_list_shells": "PASSED",
    "TestPShellCommand.test_shell_entry_points": "PASSED",
    "TestPShellCommand.test_shell_ordering": "PASSED",
    "TestPShellCommand.test_shell_override": "PASSED",
    "Test_python_shell_runner.test_it": "PASSED",
    "TestPTweensCommand.test__get_tweens": "PASSED",
    "TestPTweensCommand.test_command_implicit_and_explicit_tweens": "PASSED",
    "TestPTweensCommand.test_command_implicit_tweens_only": "PASSED",
    "TestPTweensCommand.test_command_no_tweens": "PASSED",
    "TestPViewsCommand.test__find_multi_routes_all_match": "PASSED",
    "TestPViewsCommand.test__find_multi_routes_none_match": "PASSED",
    "TestPViewsCommand.test__find_multi_routes_some_match": "PASSED",
    "TestPViewsCommand.test__find_view_no_match": "PASSED",
    "TestPViewsCommand.test__find_view_no_match_multiview_registered": "PASSED",
    "TestPViewsCommand.test__find_view_route_multiview": "PASSED",
    "TestPViewsCommand.test__find_view_route_multiview_no_view_registered": "PASSED",
    "TestPViewsCommand.test__find_view_route_no_multiview": "PASSED",
    "TestPViewsCommand.test__find_view_traversal": "PASSED",
    "TestPViewsCommand.test__find_view_traversal_multiview": "PASSED",
    "TestPViewsCommand.test_views_command_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",
    "Test_check_csrf_token.test_failure_no_raises": "FAILED",
    "Test_check_csrf_token.test_failure_raises": "FAILED",
    "Test_check_csrf_token.test_success_default_header": "FAILED",
    "Test_check_csrf_token.test_success_default_token": "FAILED",
    "Test_check_csrf_token.test_success_header": "FAILED",
    "Test_check_csrf_token.test_success_token": "FAILED",
    "TestCallbackAuthenticationPolicyDebugging.test_authenticated_userid_fails_cleaning_as_Authenticated": "FAILED",
    "TestCallbackAuthenticationPolicyDebugging.test_authenticated_userid_fails_cleaning_as_Everyone": "FAILED",
    "TestCallbackAuthenticationPolicyDebugging.test_authenticated_userid_no_callback": "FAILED",
    "TestCallbackAuthenticationPolicyDebugging.test_authenticated_userid_no_unauthenticated_userid": "FAILED",
    "TestCallbackAuthenticationPolicyDebugging.test_authenticated_userid_with_callback_fail": "FAILED",
    "TestCallbackAuthenticationPolicyDebugging.test_authenticated_userid_with_callback_success": "FAILED",
    "TestCallbackAuthenticationPolicyDebugging.test_effective_principals_no_callback": "FAILED",
    "TestCallbackAuthenticationPolicyDebugging.test_effective_principals_no_unauthenticated_userid": "FAILED",
    "TestCallbackAuthenticationPolicyDebugging.test_effective_principals_with_callback_fail": "FAILED",
    "TestCallbackAuthenticationPolicyDebugging.test_effective_principals_with_callback_success": "FAILED",
    "TestCallbackAuthenticationPolicyDebugging.test_effective_principals_with_unclean_principal_Authenticated": "FAILED",
    "TestCallbackAuthenticationPolicyDebugging.test_effective_principals_with_unclean_principal_Everyone": "FAILED",
    "AdaptersConfiguratorMixinTests.test_add_resource_url_adapter_dotted_names": "FAILED",
    "AdaptersConfiguratorMixinTests.test_add_resource_url_adapter_introspectables": "FAILED",
    "AdaptersConfiguratorMixinTests.test_add_traverser_dotted_names": "FAILED",
    "TestAssetsConfiguratorMixin.test_override_asset_directory_with_directory": "FAILED",
    "TestAssetsConfiguratorMixin.test_override_asset_directory_with_package": "FAILED",
    "TestAssetsConfiguratorMixin.test_override_asset_file_with_file": "FAILED",
    "TestAssetsConfiguratorMixin.test_override_asset_package_with_directory": "FAILED",
    "TestAssetsConfiguratorMixin.test_override_asset_package_with_package": "FAILED",
    "TestOverrideProvider.test_get_resource_filename_no_overrides": "FAILED",
    "TestOverrideProvider.test_get_resource_filename_override_returns_None": "FAILED",
    "TestPackageAssetSource.test_get_filename": "FAILED",
    "TestPackageAssetSource.test_get_filename_with_prefix": "FAILED",
    "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_include_constant_root_package": "FAILED",
    "ConfiguratorTests.test_scan_integration_conflict": "FAILED",
    "ConfiguratorTests.test_setup_registry_debug_logger_None_default": "FAILED",
    "TestConfigurator_add_directive.test_add_directive_with_custom_callable": "FAILED",
    "TestConfigurator_add_directive.test_add_directive_with_partial": "FAILED",
    "TestConfigurator_add_directive.test_extend_with_dotted_name": "FAILED",
    "TestConfigurator_add_directive.test_extend_with_python_callable": "FAILED",
    "TestConfigurator__add_predicate.test_factory_as_dotted_name": "FAILED",
    "TestViewsConfigurationMixin.test_add_static_view_package_here_relative": "FAILED",
    "TestViewsConfigurationMixin.test_add_view_with_template_renderer": "FAILED",
    "TestViewsConfigurationMixin.test_add_view_with_template_renderer_no_callable": "FAILED",
    "TestViewDeriver.test_function_returns_non_adaptable": "FAILED",
    "TestViewDeriver.test_function_returns_non_adaptable_dict": "FAILED",
    "TestViewDeriver.test_instance_returns_non_adaptable": "FAILED",
    "TestViewDeriver.test_requestonly_default_method_returns_non_adaptable": "FAILED",
    "TestViewDeriver.test_requestonly_nondefault_method_returns_non_adaptable": "FAILED",
    "Test_view_description.test_without_text": "FAILED",
    "TestPRequestCommand.test_command_display_headers": "FAILED",
    "TestPRequestCommand.test_command_has_content_type_header_var": "FAILED",
    "TestPRequestCommand.test_command_has_good_header_var": "FAILED",
    "TestPRequestCommand.test_command_has_multiple_header_vars": "FAILED",
    "TestPRequestCommand.test_command_method_get": "FAILED",
    "TestPRequestCommand.test_command_method_options": "FAILED",
    "TestPRequestCommand.test_command_method_patch": "FAILED",
    "TestPRequestCommand.test_command_method_post": "FAILED",
    "TestPRequestCommand.test_command_method_propfind": "FAILED",
    "TestPRequestCommand.test_command_method_put": "FAILED",
    "TestPRequestCommand.test_command_path_doesnt_start_with_slash": "FAILED",
    "TestPRequestCommand.test_command_two_args": "FAILED",
    "TestPRequestCommand.test_command_w_basic_auth": "FAILED",
    "TestPRequestCommand.test_command_with_query_string": "FAILED",
    "TestPRoutesCommand.test_config_format_ini_commas": "FAILED",
    "TestPRoutesCommand.test_config_format_ini_newlines": "FAILED",
    "TestPRoutesCommand.test_config_format_ini_spaces": "FAILED",
    "TestPRoutesCommand.test_one_route_all_methods_view_only_post": "FAILED",
    "TestPRoutesCommand.test_one_route_only_post_view_all_methods": "FAILED",
    "TestPRoutesCommand.test_one_route_only_post_view_post_and_get": "FAILED",
    "TestPRoutesCommand.test_one_route_with_long_name_one_view_registered": "FAILED",
    "TestPRoutesCommand.test_route_is_get_view_request_method_not_post": "FAILED",
    "TestPRoutesCommand.test_route_request_method_mismatch": "FAILED",
    "TestPRoutesCommand.test_route_static_views": "FAILED",
    "TestPRoutesCommand.test_single_route_one_view_registered": "FAILED",
    "TestPRoutesCommand.test_view_glob": "FAILED",
    "TestPRoutesCommand.test_view_request_method_not_post": "FAILED",
    "TestPViewsCommand.test_views_command_single_view_function_traversal": "FAILED"
}
diff --git a/pyramid/authentication.py b/pyramid/authentication.py
index 0924b5901..9bf1de62e 100644
--- a/pyramid/authentication.py
+++ b/pyramid/authentication.py
@@ -855,9 +855,9 @@ class AuthTktCookieHelper(object):
         self.cookie_name = cookie_name
         self.secure = secure
         self.include_ip = include_ip
-        self.timeout = timeout
-        self.reissue_time = reissue_time
-        self.max_age = max_age
+        self.timeout = timeout if timeout is None else int(timeout)
+        self.reissue_time = reissue_time if reissue_time is None else int(reissue_time)
+        self.max_age = max_age if max_age is None else int(max_age)
         self.wild_domain = wild_domain
         self.parent_domain = parent_domain
         self.domain = domain
@@ -977,8 +977,7 @@ class AuthTktCookieHelper(object):
           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
+        max_age = self.max_age if max_age is None else int(max_age)
 
         environ = request.environ
 
diff --git a/pyramid/session.py b/pyramid/session.py
index c4cfc1949..fa85fe69c 100644
--- a/pyramid/session.py
+++ b/pyramid/session.py
@@ -238,14 +238,14 @@ def BaseCookieSessionFactory(
 
         # configuration parameters
         _cookie_name = cookie_name
-        _cookie_max_age = max_age
+        _cookie_max_age = max_age if max_age is None else int(max_age)
         _cookie_path = path
         _cookie_domain = domain
         _cookie_secure = secure
         _cookie_httponly = httponly
         _cookie_on_exception = set_on_exception
-        _timeout = timeout
-        _reissue_time = reissue_time
+        _timeout = timeout if timeout is None else int(timeout)
+        _reissue_time = reissue_time if reissue_time is None else int(reissue_time)
 
         # dirty flag
         _dirty = False

{"pyramid/authentication.py": "import binascii\nfrom codecs import utf_8_decode\nfrom codecs import utf_8_encode\nimport hashlib\nimport base64\nimport re\nimport time as time_mod\nimport warnings\n\nfrom zope.interface import implementer\n\nfrom webob.cookies import CookieProfile\n\nfrom pyramid.compat import (\n    long,\n    text_type,\n    binary_type,\n    url_unquote,\n    url_quote,\n    bytes_,\n    ascii_native_,\n    native_,\n    )\n\nfrom pyramid.interfaces import (\n    IAuthenticationPolicy,\n    IDebugLogger,\n    )\n\nfrom pyramid.security import (\n    Authenticated,\n    Everyone,\n    )\n\nfrom pyramid.util import strings_differ\n\nVALID_TOKEN = re.compile(r\"^[A-Za-z][A-Za-z0-9+_-]*$\")\n\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\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, userid, **kw):\n        \"\"\" Store the ``userid`` as ``repoze.who.userid``.\n\n        The identity to authenticated to :mod:`repoze.who`\n        will contain the given userid as ``userid``, and\n        provide all keyword arguments as additional identity\n        keys. Useful keys could be ``max_age`` or ``userdata``.\n        \"\"\"\n        identifier = self._get_identifier(request)\n        if identifier is None:\n            return []\n        environ = request.environ\n        identity = kw\n        identity['repoze.who.userid'] = userid\n        return identifier.remember(environ, identity)\n\n    def forget(self, request):\n        \"\"\" Forget the current authenticated user.\n\n        Return headers that, if included in a response, will delete the\n        cookie responsible for tracking the current user.\n\n        \"\"\"\n        identifier = self._get_identifier(request)\n        if identifier is None:\n            return []\n        identity = self._get_identity(request)\n        return identifier.forget(request.environ, identity)\n\n@implementer(IAuthenticationPolicy)\nclass RemoteUserAuthenticationPolicy(CallbackAuthenticationPolicy):\n    \"\"\" A :app:`Pyramid` :term:`authentication policy` which\n    obtains data from the ``REMOTE_USER`` WSGI environment variable.\n\n    Constructor Arguments\n\n    ``environ_key``\n\n        Default: ``REMOTE_USER``.  The key in the WSGI environ which\n        provides the userid.\n\n    ``callback``\n\n        Default: ``None``.  A callback passed the userid and the request,\n        expected to return None if the userid doesn't exist or a sequence of\n        principal identifiers (possibly empty) representing groups if the\n        user does exist.  If ``callback`` is None, the userid will be assumed\n        to exist with no group principals.\n\n    ``debug``\n\n        Default: ``False``.  If ``debug`` is ``True``, log messages to the\n        Pyramid debug logger about the results of various authentication\n        steps.  The output from debugging is useful for reporting to maillist\n        or IRC channels when asking for support.\n\n    Objects of this class implement the interface described by\n    :class:`pyramid.interfaces.IAuthenticationPolicy`.\n    \"\"\"\n\n    def __init__(self, environ_key='REMOTE_USER', callback=None, debug=False):\n        self.environ_key = environ_key\n        self.callback = callback\n        self.debug = debug\n\n    def unauthenticated_userid(self, request):\n        \"\"\" The ``REMOTE_USER`` value found within the ``environ``.\"\"\"\n        return request.environ.get(self.environ_key)\n\n    def remember(self, request, userid, **kw):\n        \"\"\" A no-op. The ``REMOTE_USER`` does not provide a protocol for\n        remembering the user. This will be application-specific and can\n        be done somewhere else or in a subclass.\"\"\"\n        return []\n\n    def forget(self, request):\n        \"\"\" A no-op. The ``REMOTE_USER`` does not provide a protocol for\n        forgetting the user. This will be application-specific and can\n        be done somewhere else or in a subclass.\"\"\"\n        return []\n\n_marker = object()\n\n@implementer(IAuthenticationPolicy)\nclass AuthTktAuthenticationPolicy(CallbackAuthenticationPolicy):\n    \"\"\"A :app:`Pyramid` :term:`authentication policy` which\n    obtains data from a Pyramid \"auth ticket\" cookie.\n\n    .. warning::\n\n       The default hash algorithm used in this policy is MD5 and has known\n       hash collision vulnerabilities. The risk of an exploit is low.\n       However, for improved authentication security, use\n       ``hashalg='sha512'``.\n\n    Constructor Arguments\n\n    ``secret``\n\n       The secret (a string) used for auth_tkt cookie signing.  This value\n       should be unique across all values provided to Pyramid for various\n       subsystem secrets (see :ref:`admonishment_against_secret_sharing`).\n       Required.\n\n    ``callback``\n\n       Default: ``None``.  A callback passed the userid and the\n       request, expected to return ``None`` if the userid doesn't\n       exist or a sequence of principal identifiers (possibly empty) if\n       the user does exist.  If ``callback`` is ``None``, the userid\n       will be assumed to exist with no principals.  Optional.\n\n    ``cookie_name``\n\n       Default: ``auth_tkt``.  The cookie name used\n       (string).  Optional.\n\n    ``secure``\n\n       Default: ``False``.  Only send the cookie back over a secure\n       conn.  Optional.\n\n    ``include_ip``\n\n       Default: ``False``.  Make the requesting IP address part of\n       the authentication data in the cookie.  Optional.\n\n       For IPv6 this option is not recommended. The ``mod_auth_tkt``\n       specification does not specify how to handle IPv6 addresses, so using\n       this option in combination with IPv6 addresses may cause an\n       incompatible cookie. It ties the authentication ticket to that\n       individual's IPv6 address.\n\n    ``timeout``\n\n       Default: ``None``.  Maximum number of seconds which a newly\n       issued ticket will be considered valid.  After this amount of\n       time, the ticket will expire (effectively logging the user\n       out).  If this value is ``None``, the ticket never expires.\n       Optional.\n\n    ``reissue_time``\n\n       Default: ``None``.  If this parameter is set, it represents the number\n       of seconds that must pass before an authentication token cookie is\n       automatically reissued as the result of a request which requires\n       authentication.  The duration is measured as the number of seconds\n       since the last auth_tkt cookie was issued and 'now'.  If this value is\n       ``0``, a new ticket cookie will be reissued on every request which\n       requires authentication.\n\n       A good rule of thumb: if you want auto-expired cookies based on\n       inactivity: set the ``timeout`` value to 1200 (20 mins) and set the\n       ``reissue_time`` value to perhaps a tenth of the ``timeout`` value\n       (120 or 2 mins).  It's nonsensical to set the ``timeout`` value lower\n       than the ``reissue_time`` value, as the ticket will never be reissued\n       if so.  However, such a configuration is not explicitly prevented.\n\n       Optional.\n\n    ``max_age``\n\n       Default: ``None``.  The max age of the auth_tkt cookie, in\n       seconds.  This differs from ``timeout`` inasmuch as ``timeout``\n       represents the lifetime of the ticket contained in the cookie,\n       while this value represents the lifetime of the cookie itself.\n       When this value is set, the cookie's ``Max-Age`` and\n       ``Expires`` settings will be set, allowing the auth_tkt cookie\n       to last between browser sessions.  It is typically nonsensical\n       to set this to a value that is lower than ``timeout`` or\n       ``reissue_time``, although it is not explicitly prevented.\n       Optional.\n\n    ``path``\n\n       Default: ``/``. The path for which the auth_tkt cookie is valid.\n       May be desirable if the application only serves part of a domain.\n       Optional.\n\n    ``http_only``\n\n       Default: ``False``. Hide cookie from JavaScript by setting the\n       HttpOnly flag. Not honored by all browsers.\n       Optional.\n\n    ``wild_domain``\n\n       Default: ``True``. An auth_tkt cookie will be generated for the\n       wildcard domain. If your site is hosted as ``example.com`` this\n       will make the cookie available for sites underneath ``example.com``\n       such as ``www.example.com``.\n       Optional.\n\n    ``parent_domain``\n\n       Default: ``False``. An auth_tkt cookie will be generated for the\n       parent domain of the current site. For example if your site is\n       hosted under ``www.example.com`` a cookie will be generated for\n       ``.example.com``. This can be useful if you have multiple sites\n       sharing the same domain. This option supercedes the ``wild_domain``\n       option.\n       Optional.\n\n       This option is available as of :app:`Pyramid` 1.5.\n\n    ``domain``\n\n       Default: ``None``. If provided the auth_tkt cookie will only be\n       set for this domain. This option is not compatible with ``wild_domain``\n       and ``parent_domain``.\n       Optional.\n\n       This option is available as of :app:`Pyramid` 1.5.\n\n    ``hashalg``\n\n       Default: ``md5`` (the literal string).\n\n       Any hash algorithm supported by Python's ``hashlib.new()`` function\n       can be used as the ``hashalg``.\n\n       Cookies generated by different instances of AuthTktAuthenticationPolicy\n       using different ``hashalg`` options are not compatible. Switching the\n       ``hashalg`` will imply that all existing users with a valid cookie will\n       be required to re-login.\n\n       A warning is emitted at startup if an explicit ``hashalg`` is not\n       passed.  This is for backwards compatibility reasons.\n\n       This option is available as of :app:`Pyramid` 1.4.\n\n       Optional.\n\n       .. note::\n\n          ``md5`` is the default for backwards compatibility reasons. However,\n          if you don't specify ``md5`` as the hashalg explicitly, a warning is\n          issued at application startup time.  An explicit value of ``sha512``\n          is recommended for improved security, and ``sha512`` will become the\n          default in a future Pyramid version.\n\n    ``debug``\n\n        Default: ``False``.  If ``debug`` is ``True``, log messages to the\n        Pyramid debug logger about the results of various authentication\n        steps.  The output from debugging is useful for reporting to maillist\n        or IRC channels when asking for support.\n\n    Objects of this class implement the interface described by\n    :class:`pyramid.interfaces.IAuthenticationPolicy`.\n    \"\"\"\n\n    def __init__(self,\n                 secret,\n                 callback=None,\n                 cookie_name='auth_tkt',\n                 secure=False,\n                 include_ip=False,\n                 timeout=None,\n                 reissue_time=None,\n                 max_age=None,\n                 path=\"/\",\n                 http_only=False,\n                 wild_domain=True,\n                 debug=False,\n                 hashalg=_marker,\n                 parent_domain=False,\n                 domain=None,\n                 ):\n        if hashalg is _marker:\n            hashalg = 'md5'\n            warnings.warn(\n                'The MD5 hash function used by default by the '\n                'AuthTktAuthenticationPolicy is known to be '\n                'susceptible to collision attacks.  It is the current default '\n                'for backwards compatibility reasons, but we recommend that '\n                'you use the SHA512 algorithm instead for improved security.  '\n                'Pass ``hashalg=\\'sha512\\'`` to the '\n                'AuthTktAuthenticationPolicy constructor to do so.\\n\\nNote '\n                'that a change to the hash algorithms will invalidate existing '\n                'auth tkt cookies set by your application.  If backwards '\n                'compatibility of existing auth tkt cookies is of greater '\n                'concern than the risk posed by the potential for a hash '\n                'collision, you\\'ll want to continue using MD5 explicitly.  '\n                'To do so, pass ``hashalg=\\'md5\\'`` in your application to '\n                'the AuthTktAuthenticationPolicy constructor.   When you do so '\n                'this warning will not be emitted again.  The default '\n                'algorithm used in this policy will change in the future, so '\n                'setting an explicit hashalg will futureproof your '\n                'application.',\n                DeprecationWarning,\n                stacklevel=2\n                )\n        self.cookie = AuthTktCookieHelper(\n            secret,\n            cookie_name=cookie_name,\n            secure=secure,\n            include_ip=include_ip,\n            timeout=timeout,\n            reissue_time=reissue_time,\n            max_age=max_age,\n            http_only=http_only,\n            path=path,\n            wild_domain=wild_domain,\n            hashalg=hashalg,\n            parent_domain=parent_domain,\n            domain=domain,\n            )\n        self.callback = callback\n        self.debug = debug\n\n    def unauthenticated_userid(self, request):\n        \"\"\" The userid key within the auth_tkt cookie.\"\"\"\n        result = self.cookie.identify(request)\n        if result:\n            return result['userid']\n\n    def remember(self, request, userid, **kw):\n        \"\"\" Accepts the following kw args: ``max_age=<int-seconds>,\n        ``tokens=<sequence-of-ascii-strings>``.\n\n        Return a list of headers which will set appropriate cookies on\n        the response.\n\n        \"\"\"\n        return self.cookie.remember(request, userid, **kw)\n\n    def forget(self, request):\n        \"\"\" A list of headers which will delete appropriate cookies.\"\"\"\n        return self.cookie.forget(request)\n\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 = native_(ticket).strip('\"')\n    digest_size = hashlib.new(hashalg).digest_size * 2\n    digest = ticket[:digest_size]\n    try:\n        timestamp = int(ticket[digest_size:digest_size + 8], 16)\n    except ValueError as e:\n        raise BadTicket('Timestamp is not a hex integer: %s' % e)\n    try:\n        userid, data = ticket[digest_size + 8:].split('!', 1)\n    except ValueError:\n        raise BadTicket('userid is not followed by !')\n    userid = url_unquote(userid)\n    if '!' in data:\n        tokens, user_data = data.split('!', 1)\n    else: # pragma: no cover (never generated)\n        # @@: Is this the right order?\n        tokens = ''\n        user_data = data\n\n    expected = calculate_digest(ip, timestamp, secret,\n                                userid, tokens, user_data, hashalg)\n\n    # Avoid timing attacks (see\n    # http://seb.dbzteam.org/crypto/python-oauth-timing-hmac.pdf)\n    if strings_differ(expected, digest):\n        raise BadTicket('Digest signature is not correct',\n                        expected=(expected, digest))\n\n    tokens = tokens.split(',')\n\n    return (timestamp, userid, tokens, user_data)\n\n# this function licensed under the MIT license (stolen from Paste)\ndef calculate_digest(ip, timestamp, secret, userid, tokens, user_data,\n                     hashalg='md5'):\n    secret = bytes_(secret, 'utf-8')\n    userid = bytes_(userid, 'utf-8')\n    tokens = bytes_(tokens, 'utf-8')\n    user_data = bytes_(user_data, 'utf-8')\n    hash_obj = hashlib.new(hashalg)\n\n    # Check to see if this is an IPv6 address\n    if ':' in ip:\n        ip_timestamp = ip + str(int(timestamp))\n        ip_timestamp = bytes_(ip_timestamp)\n    else:\n        # encode_ip_timestamp not required, left in for backwards compatibility\n        ip_timestamp = encode_ip_timestamp(ip, timestamp)\n\n    hash_obj.update(ip_timestamp + secret + userid + b'\\0' +\n            tokens + b'\\0' + user_data)\n    digest = hash_obj.hexdigest()\n    hash_obj2 = hashlib.new(hashalg)\n    hash_obj2.update(bytes_(digest) + secret)\n    return hash_obj2.hexdigest()\n\n# this function licensed under the MIT license (stolen from Paste)\ndef encode_ip_timestamp(ip, timestamp):\n    ip_chars = ''.join(map(chr, map(int, ip.split('.'))))\n    t = int(timestamp)\n    ts = ((t & 0xff000000) >> 24,\n          (t & 0xff0000) >> 16,\n          (t & 0xff00) >> 8,\n          t & 0xff)\n    ts_chars = ''.join(map(chr, ts))\n    return bytes_(ip_chars + ts_chars)\n\nclass AuthTktCookieHelper(object):\n    \"\"\"\n    A helper class for use in third-party authentication policy\n    implementations.  See\n    :class:`pyramid.authentication.AuthTktAuthenticationPolicy` for the\n    meanings of the constructor arguments.\n    \"\"\"\n    parse_ticket = staticmethod(parse_ticket) # for tests\n    AuthTicket = AuthTicket # for tests\n    BadTicket = BadTicket # for tests\n    now = None # for tests\n\n    userid_type_decoders = {\n        'int':int,\n        'unicode':lambda x: utf_8_decode(x)[0], # bw compat for old cookies\n        'b64unicode': lambda x: utf_8_decode(b64decode(x))[0],\n        'b64str': lambda x: b64decode(x),\n        }\n\n    userid_type_encoders = {\n        int: ('int', str),\n        long: ('int', str),\n        text_type: ('b64unicode', lambda x: b64encode(utf_8_encode(x)[0])),\n        binary_type: ('b64str', lambda x: b64encode(x)),\n        }\n\n    def __init__(self, secret, cookie_name='auth_tkt', secure=False,\n                 include_ip=False, timeout=None, reissue_time=None,\n                 max_age=None, http_only=False, path=\"/\", wild_domain=True,\n                 hashalg='md5', parent_domain=False, domain=None):\n\n        serializer = _SimpleSerializer()\n\n        self.cookie_profile = CookieProfile(\n            cookie_name=cookie_name,\n            secure=secure,\n            max_age=max_age,\n            httponly=http_only,\n            path=path,\n            serializer=serializer\n        )\n\n        self.secret = secret\n        self.cookie_name = cookie_name\n        self.secure = secure\n        self.include_ip = include_ip\n        self.timeout = timeout\n        self.reissue_time = reissue_time\n        self.max_age = max_age\n        self.wild_domain = wild_domain\n        self.parent_domain = parent_domain\n        self.domain = domain\n        self.hashalg = hashalg\n\n    def _get_cookies(self, request, value, max_age=None):\n        cur_domain = request.domain\n\n        domains = []\n        if self.domain:\n            domains.append(self.domain)\n        else:\n            if self.parent_domain and cur_domain.count('.') > 1:\n                domains.append('.' + cur_domain.split('.', 1)[1])\n            else:\n                domains.append(None)\n                domains.append(cur_domain)\n                if self.wild_domain:\n                    domains.append('.' + cur_domain)\n\n        profile = self.cookie_profile(request)\n\n        kw = {}\n        kw['domains'] = domains\n        if max_age is not None:\n            kw['max_age'] = max_age\n\n        headers = profile.get_headers(value, **kw)\n        return headers\n\n    def identify(self, request):\n        \"\"\" Return a dictionary with authentication information, or ``None``\n        if no valid auth_tkt is attached to ``request``\"\"\"\n        environ = request.environ\n        cookie = request.cookies.get(self.cookie_name)\n\n        if cookie is None:\n            return None\n\n        if self.include_ip:\n            remote_addr = environ['REMOTE_ADDR']\n        else:\n            remote_addr = '0.0.0.0'\n\n        try:\n            timestamp, userid, tokens, user_data = self.parse_ticket(\n                self.secret, cookie, remote_addr, self.hashalg)\n        except self.BadTicket:\n            return None\n\n        now = self.now # service tests\n\n        if now is None:\n            now = time_mod.time()\n\n        if self.timeout and ( (timestamp + self.timeout) < now ):\n            # the auth_tkt data has expired\n            return None\n\n        userid_typename = 'userid_type:'\n        user_data_info = user_data.split('|')\n        for datum in filter(None, user_data_info):\n            if datum.startswith(userid_typename):\n                userid_type = datum[len(userid_typename):]\n                decoder = self.userid_type_decoders.get(userid_type)\n                if decoder:\n                    userid = decoder(userid)\n\n        reissue = self.reissue_time is not None\n\n        if reissue and not hasattr(request, '_authtkt_reissued'):\n            if ( (now - timestamp) > self.reissue_time ):\n                # See https://github.com/Pylons/pyramid/issues#issue/108\n                tokens = list(filter(None, tokens))\n                headers = self.remember(request, userid, max_age=self.max_age,\n                                        tokens=tokens)\n                def reissue_authtkt(request, response):\n                    if not hasattr(request, '_authtkt_reissue_revoked'):\n                        for k, v in headers:\n                            response.headerlist.append((k, v))\n                request.add_response_callback(reissue_authtkt)\n                request._authtkt_reissued = True\n\n        environ['REMOTE_USER_TOKENS'] = tokens\n        environ['REMOTE_USER_DATA'] = user_data\n        environ['AUTH_TYPE'] = 'cookie'\n\n        identity = {}\n        identity['timestamp'] = timestamp\n        identity['userid'] = userid\n        identity['tokens'] = tokens\n        identity['userdata'] = user_data\n        return identity\n\n    def forget(self, request):\n        \"\"\" Return a set of expires Set-Cookie headers, which will destroy\n        any existing auth_tkt cookie when attached to a response\"\"\"\n        request._authtkt_reissue_revoked = True\n        return self._get_cookies(request, None)\n\n    def remember(self, request, userid, max_age=None, tokens=()):\n        \"\"\" Return a set of Set-Cookie headers; when set into a response,\n        these headers will represent a valid authentication ticket.\n\n        ``max_age``\n          The max age of the auth_tkt cookie, in seconds.  When this value is\n          set, the cookie's ``Max-Age`` and ``Expires`` settings will be set,\n          allowing the auth_tkt cookie to last between browser sessions.  If\n          this value is ``None``, the ``max_age`` value provided to the\n          helper itself will be used as the ``max_age`` value.  Default:\n          ``None``.\n\n        ``tokens``\n          A sequence of strings that will be placed into the auth_tkt tokens\n          field.  Each string in the sequence must be of the Python ``str``\n          type and must match the regex ``^[A-Za-z][A-Za-z0-9+_-]*$``.\n          Tokens are available in the returned identity when an auth_tkt is\n          found in the request and unpacked.  Default: ``()``.\n        \"\"\"\n        if max_age is None:\n            max_age = self.max_age\n\n        environ = request.environ\n\n        if self.include_ip:\n            remote_addr = environ['REMOTE_ADDR']\n        else:\n            remote_addr = '0.0.0.0'\n\n        user_data = ''\n\n        encoding_data = self.userid_type_encoders.get(type(userid))\n\n        if encoding_data:\n            encoding, encoder = encoding_data\n            userid = encoder(userid)\n            user_data = 'userid_type:%s' % encoding\n\n        new_tokens = []\n        for token in tokens:\n            if isinstance(token, text_type):\n                try:\n                    token = ascii_native_(token)\n                except UnicodeEncodeError:\n                    raise ValueError(\"Invalid token %r\" % (token,))\n            if not (isinstance(token, str) and VALID_TOKEN.match(token)):\n                raise ValueError(\"Invalid token %r\" % (token,))\n            new_tokens.append(token)\n        tokens = tuple(new_tokens)\n\n        if hasattr(request, '_authtkt_reissued'):\n            request._authtkt_reissue_revoked = True\n\n        ticket = self.AuthTicket(\n            self.secret,\n            userid,\n            remote_addr,\n            tokens=tokens,\n            user_data=user_data,\n            cookie_name=self.cookie_name,\n            secure=self.secure,\n            hashalg=self.hashalg\n            )\n\n        cookie_value = ticket.cookie_value()\n        return self._get_cookies(request, cookie_value, max_age)\n\n@implementer(IAuthenticationPolicy)\nclass SessionAuthenticationPolicy(CallbackAuthenticationPolicy):\n    \"\"\" A :app:`Pyramid` authentication policy which gets its data from the\n    configured :term:`session`.  For this authentication policy to work, you\n    will have to follow the instructions in the :ref:`sessions_chapter` to\n    configure a :term:`session factory`.\n\n    Constructor Arguments\n\n    ``prefix``\n\n       A prefix used when storing the authentication parameters in the\n       session. Defaults to 'auth.'. Optional.\n\n    ``callback``\n\n       Default: ``None``.  A callback passed the userid and the\n       request, expected to return ``None`` if the userid doesn't\n       exist or a sequence of principal identifiers (possibly empty) if\n       the user does exist.  If ``callback`` is ``None``, the userid\n       will be assumed to exist with no principals.  Optional.\n\n    ``debug``\n\n        Default: ``False``.  If ``debug`` is ``True``, log messages to the\n        Pyramid debug logger about the results of various authentication\n        steps.  The output from debugging is useful for reporting to maillist\n        or IRC channels when asking for support.\n\n    \"\"\"\n\n    def __init__(self, prefix='auth.', callback=None, debug=False):\n        self.callback = callback\n        self.prefix = prefix or ''\n        self.userid_key = prefix + 'userid'\n        self.debug = debug\n\n    def remember(self, request, userid, **kw):\n        \"\"\" Store a userid in the session.\"\"\"\n        request.session[self.userid_key] = userid\n        return []\n\n    def forget(self, request):\n        \"\"\" Remove the stored userid from the session.\"\"\"\n        if self.userid_key in request.session:\n            del request.session[self.userid_key]\n        return []\n\n    def 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, userid, **kw):\n        \"\"\" A no-op. Basic authentication does not provide a protocol for\n        remembering the user. Credentials are sent on every request.\n\n        \"\"\"\n        return []\n\n    def forget(self, request):\n        \"\"\" Returns challenge headers. This should be attached to a response\n        to indicate that credentials are required.\"\"\"\n        return [('WWW-Authenticate', 'Basic realm=\"%s\"' % self.realm)]\n\n    def callback(self, username, request):\n        # Username arg is ignored.  Unfortunately _get_credentials winds up\n        # getting called twice when authenticated_userid is called.  Avoiding\n        # that, however, winds up duplicating logic from the superclass.\n        credentials = self._get_credentials(request)\n        if credentials:\n            username, password = credentials\n            return self.check(username, password, request)\n\n    def _get_credentials(self, request):\n        authorization = request.headers.get('Authorization')\n        if not authorization:\n            return None\n        try:\n            authmeth, auth = authorization.split(' ', 1)\n        except ValueError: # not enough values to unpack\n            return None\n        if authmeth.lower() != 'basic':\n            return None\n\n        try:\n            authbytes = b64decode(auth.strip())\n        except (TypeError, binascii.Error): # can't decode\n            return None\n\n        # try utf-8 first, then latin-1; see discussion in\n        # https://github.com/Pylons/pyramid/issues/898\n        try:\n            auth = authbytes.decode('utf-8')\n        except UnicodeDecodeError:\n            auth = authbytes.decode('latin-1')\n\n        try:\n            username, password = auth.split(':', 1)\n        except ValueError: # not enough values to unpack\n            return None\n        return username, password\n\nclass _SimpleSerializer(object):\n    def loads(self, bstruct):\n        return native_(bstruct)\n\n    def dumps(self, appstruct):\n        return bytes_(appstruct)\n", "pyramid/session.py": "import base64\nimport binascii\nimport hashlib\nimport hmac\nimport os\nimport time\n\nfrom zope.deprecation import deprecated\nfrom zope.interface import implementer\n\nfrom webob.cookies import SignedSerializer\n\nfrom pyramid.compat import (\n    pickle,\n    PY3,\n    text_,\n    bytes_,\n    native_,\n    )\n\nfrom pyramid.exceptions import BadCSRFToken\nfrom pyramid.interfaces import ISession\nfrom pyramid.util import strings_differ\n\ndef manage_accessed(wrapped):\n    \"\"\" Decorator which causes a cookie to be renewed when an accessor\n    method is called.\"\"\"\n    def accessed(session, *arg, **kw):\n        session.accessed = now = int(time.time())\n        if session._reissue_time is not None:\n            if now - session.renewed > session._reissue_time:\n                session.changed()\n        return wrapped(session, *arg, **kw)\n    accessed.__doc__ = wrapped.__doc__\n    return accessed\n\ndef manage_changed(wrapped):\n    \"\"\" Decorator which causes a cookie to be set when a setter method\n    is called.\"\"\"\n    def changed(session, *arg, **kw):\n        session.accessed = int(time.time())\n        session.changed()\n        return wrapped(session, *arg, **kw)\n    changed.__doc__ = wrapped.__doc__\n    return changed\n\ndef signed_serialize(data, secret):\n    \"\"\" Serialize any pickleable structure (``data``) and sign it\n    using the ``secret`` (must be a string).  Return the\n    serialization, which includes the signature as its first 40 bytes.\n    The ``signed_deserialize`` method will deserialize such a value.\n\n    This function is useful for creating signed cookies.  For example:\n\n    .. code-block:: python\n\n       cookieval = signed_serialize({'a':1}, 'secret')\n       response.set_cookie('signed_cookie', cookieval)\n    \"\"\"\n    pickled = pickle.dumps(data, pickle.HIGHEST_PROTOCOL)\n    try:\n        # bw-compat with pyramid <= 1.5b1 where latin1 is the default\n        secret = bytes_(secret)\n    except UnicodeEncodeError:\n        secret = bytes_(secret, 'utf-8')\n    sig = hmac.new(secret, pickled, hashlib.sha1).hexdigest()\n    return sig + native_(base64.b64encode(pickled))\n\ndef signed_deserialize(serialized, secret, hmac=hmac):\n    \"\"\" Deserialize the value returned from ``signed_serialize``.  If\n    the value cannot be deserialized for any reason, a\n    :exc:`ValueError` exception will be raised.\n\n    This function is useful for deserializing a signed cookie value\n    created by ``signed_serialize``.  For example:\n\n    .. code-block:: python\n\n       cookieval = request.cookies['signed_cookie']\n       data = signed_deserialize(cookieval, 'secret')\n    \"\"\"\n    # hmac parameterized only for unit tests\n    try:\n        input_sig, pickled = (bytes_(serialized[:40]),\n                              base64.b64decode(bytes_(serialized[40:])))\n    except (binascii.Error, TypeError) as e:\n        # Badly formed data can make base64 die\n        raise ValueError('Badly formed base64 data: %s' % e)\n\n    try:\n        # bw-compat with pyramid <= 1.5b1 where latin1 is the default\n        secret = bytes_(secret)\n    except UnicodeEncodeError:\n        secret = bytes_(secret, 'utf-8')\n    sig = bytes_(hmac.new(secret, pickled, hashlib.sha1).hexdigest())\n\n    # Avoid timing attacks (see\n    # http://seb.dbzteam.org/crypto/python-oauth-timing-hmac.pdf)\n    if strings_differ(sig, input_sig):\n        raise ValueError('Invalid signature')\n\n    return pickle.loads(pickled)\n\ndef check_csrf_token(request,\n                     token='csrf_token',\n                     header='X-CSRF-Token',\n                     raises=True):\n    \"\"\" Check the CSRF token in the request's session against the value in\n    ``request.params.get(token)`` or ``request.headers.get(header)``.\n    If a ``token`` keyword is not supplied to this function, the string\n    ``csrf_token`` will be used to look up the token in ``request.params``.\n    If a ``header`` keyword is not supplied to this function, the string\n    ``X-CSRF-Token`` will be used to look up the token in ``request.headers``.\n\n    If the value supplied by param or by header doesn't match the value\n    supplied by ``request.session.get_csrf_token()``, and ``raises`` is\n    ``True``, this function will raise an\n    :exc:`pyramid.exceptions.BadCSRFToken` exception.\n    If the check does succeed and ``raises`` is ``False``, this\n    function will return ``False``.  If the CSRF check is successful, this\n    function will return ``True`` unconditionally.\n\n    Note that using this function requires that a :term:`session factory` is\n    configured.\n\n    .. versionadded:: 1.4a2\n    \"\"\"\n    supplied_token = request.params.get(token, request.headers.get(header, \"\"))\n    if strings_differ(request.session.get_csrf_token(), supplied_token):\n        if raises:\n            raise BadCSRFToken('check_csrf_token(): Invalid token')\n        return False\n    return True\n\nclass PickleSerializer(object):\n    \"\"\" A Webob cookie serializer that uses the pickle protocol to dump Python\n    data to bytes.\"\"\"\n    def loads(self, bstruct):\n        return pickle.loads(bstruct)\n\n    def dumps(self, appstruct):\n        return pickle.dumps(appstruct, pickle.HIGHEST_PROTOCOL)\n\ndef BaseCookieSessionFactory(\n    serializer,\n    cookie_name='session',\n    max_age=None,\n    path='/',\n    domain=None,\n    secure=False,\n    httponly=False,\n    timeout=1200,\n    reissue_time=0,\n    set_on_exception=True,\n    ):\n    \"\"\"\n    .. versionadded:: 1.5\n    \n    Configure a :term:`session factory` which will provide cookie-based\n    sessions.  The return value of this function is a :term:`session factory`,\n    which may be provided as the ``session_factory`` argument of a\n    :class:`pyramid.config.Configurator` constructor, or used as the\n    ``session_factory`` argument of the\n    :meth:`pyramid.config.Configurator.set_session_factory` method.\n\n    The session factory returned by this function will create sessions\n    which are limited to storing fewer than 4000 bytes of data (as the\n    payload must fit into a single cookie).\n\n    .. warning:\n\n       This class provides no protection from tampering and is only intended\n       to be used by framework authors to create their own cookie-based\n       session factories.\n\n    Parameters:\n\n    ``serializer``\n      An object with two methods: ``loads`` and ``dumps``.  The ``loads``\n      method should accept bytes and return a Python object.  The ``dumps``\n      method should accept a Python object and return bytes.  A ``ValueError``\n      should be raised for malformed inputs.\n\n    ``cookie_name``\n      The name of the cookie used for sessioning. Default: ``'session'``.\n\n    ``max_age``\n      The maximum age of the cookie used for sessioning (in seconds).\n      Default: ``None`` (browser scope).\n\n    ``path``\n      The path used for the session cookie. Default: ``'/'``.\n\n    ``domain``\n      The domain used for the session cookie.  Default: ``None`` (no domain).\n\n    ``secure``\n      The 'secure' flag of the session cookie. Default: ``False``.\n\n    ``httponly``\n      Hide the cookie from Javascript by setting the 'HttpOnly' flag of the\n      session cookie. Default: ``False``.\n\n    ``timeout``\n      A number of seconds of inactivity before a session times out. If\n      ``None`` then the cookie never expires. This lifetime only applies\n      to the *value* within the cookie. Meaning that if the cookie expires\n      due to a lower ``max_age``, then this setting has no effect.\n      Default: ``1200``.\n\n    ``reissue_time``\n      The number of seconds that must pass before the cookie is automatically\n      reissued as the result of a request which accesses the session. The\n      duration is measured as the number of seconds since the last session\n      cookie was issued and 'now'.  If this value is ``0``, a new cookie\n      will be reissued on every request accessing the session. If ``None``\n      then the cookie's lifetime will never be extended.\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      However, such a configuration is not explicitly prevented.\n\n      Default: ``0``.\n\n    ``set_on_exception``\n      If ``True``, set a session cookie even if an exception occurs\n      while rendering a view. Default: ``True``.\n\n    .. versionadded: 1.5a3\n    \"\"\"\n\n    @implementer(ISession)\n    class CookieSession(dict):\n        \"\"\" Dictionary-like session object \"\"\"\n\n        # configuration parameters\n        _cookie_name = cookie_name\n        _cookie_max_age = max_age\n        _cookie_path = path\n        _cookie_domain = domain\n        _cookie_secure = secure\n        _cookie_httponly = httponly\n        _cookie_on_exception = set_on_exception\n        _timeout = timeout\n        _reissue_time = reissue_time\n\n        # dirty flag\n        _dirty = False\n\n        def __init__(self, request):\n            self.request = request\n            now = time.time()\n            created = renewed = now\n            new = True\n            value = None\n            state = {}\n            cookieval = request.cookies.get(self._cookie_name)\n            if cookieval is not None:\n                try:\n                    value = serializer.loads(bytes_(cookieval))\n                except ValueError:\n                    # the cookie failed to deserialize, dropped\n                    value = None\n\n            if value is not None:\n                try:\n                    # since the value is not necessarily signed, we have\n                    # to unpack it a little carefully\n                    rval, cval, sval = value\n                    renewed = float(rval)\n                    created = float(cval)\n                    state = sval\n                    new = False\n                except (TypeError, ValueError):\n                    # value failed to unpack properly or renewed was not\n                    # a numeric type so we'll fail deserialization here\n                    state = {}\n\n            if self._timeout is not None:\n                if now - renewed > self._timeout:\n                    # expire the session because it was not renewed\n                    # before the timeout threshold\n                    state = {}\n\n            self.created = created\n            self.accessed = renewed\n            self.renewed = renewed\n            self.new = new\n            dict.__init__(self, state)\n\n        # ISession methods\n        def changed(self):\n            if not self._dirty:\n                self._dirty = True\n                def set_cookie_callback(request, response):\n                    self._set_cookie(response)\n                    self.request = None # explicitly break cycle for gc\n                self.request.add_response_callback(set_cookie_callback)\n\n        def invalidate(self):\n            self.clear() # XXX probably needs to unset cookie\n\n        # non-modifying dictionary methods\n        get = manage_accessed(dict.get)\n        __getitem__ = manage_accessed(dict.__getitem__)\n        items = manage_accessed(dict.items)\n        values = manage_accessed(dict.values)\n        keys = manage_accessed(dict.keys)\n        __contains__ = manage_accessed(dict.__contains__)\n        __len__ = manage_accessed(dict.__len__)\n        __iter__ = manage_accessed(dict.__iter__)\n\n        if not PY3:\n            iteritems = manage_accessed(dict.iteritems)\n            itervalues = manage_accessed(dict.itervalues)\n            iterkeys = manage_accessed(dict.iterkeys)\n            has_key = manage_accessed(dict.has_key)\n\n        # modifying dictionary methods\n        clear = manage_changed(dict.clear)\n        update = manage_changed(dict.update)\n        setdefault = manage_changed(dict.setdefault)\n        pop = manage_changed(dict.pop)\n        popitem = manage_changed(dict.popitem)\n        __setitem__ = manage_changed(dict.__setitem__)\n        __delitem__ = manage_changed(dict.__delitem__)\n\n        # flash API methods\n        @manage_changed\n        def flash(self, msg, queue='', allow_duplicate=True):\n            storage = self.setdefault('_f_' + queue, [])\n            if allow_duplicate or (msg not in storage):\n                storage.append(msg)\n\n        @manage_changed\n        def pop_flash(self, queue=''):\n            storage = self.pop('_f_' + queue, [])\n            return storage\n\n        @manage_accessed\n        def peek_flash(self, queue=''):\n            storage = self.get('_f_' + queue, [])\n            return storage\n\n        # CSRF API methods\n        @manage_changed\n        def new_csrf_token(self):\n            token = text_(binascii.hexlify(os.urandom(20)))\n            self['_csrft_'] = token\n            return token\n\n        @manage_accessed\n        def get_csrf_token(self):\n            token = self.get('_csrft_', None)\n            if token is None:\n                token = self.new_csrf_token()\n            return token\n\n        # non-API methods\n        def _set_cookie(self, response):\n            if not self._cookie_on_exception:\n                exception = getattr(self.request, 'exception', None)\n                if exception is not None: # dont set a cookie during exceptions\n                    return False\n            cookieval = native_(serializer.dumps(\n                (self.accessed, self.created, dict(self))\n                ))\n            if len(cookieval) > 4064:\n                raise ValueError(\n                    'Cookie value is too long to store (%s bytes)' %\n                    len(cookieval)\n                    )\n            response.set_cookie(\n                self._cookie_name,\n                value=cookieval,\n                max_age=self._cookie_max_age,\n                path=self._cookie_path,\n                domain=self._cookie_domain,\n                secure=self._cookie_secure,\n                httponly=self._cookie_httponly,\n                )\n            return True\n\n    return CookieSession\n\n\ndef UnencryptedCookieSessionFactoryConfig(\n    secret,\n    timeout=1200,\n    cookie_name='session',\n    cookie_max_age=None,\n    cookie_path='/',\n    cookie_domain=None,\n    cookie_secure=False,\n    cookie_httponly=False,\n    cookie_on_exception=True,\n    signed_serialize=signed_serialize,\n    signed_deserialize=signed_deserialize,\n    ):\n    \"\"\"\n    .. deprecated:: 1.5\n        Use :func:`pyramid.session.SignedCookieSessionFactory` instead.\n        Caveat: Cookies generated using ``SignedCookieSessionFactory`` are not\n        compatible with cookies generated using\n        ``UnencryptedCookieSessionFactory``, so existing user session data\n        will be destroyed if you switch to it.\n    \n    Configure a :term:`session factory` which will provide unencrypted\n    (but signed) cookie-based sessions.  The return value of this\n    function is a :term:`session factory`, which may be provided as\n    the ``session_factory`` argument of a\n    :class:`pyramid.config.Configurator` constructor, or used\n    as the ``session_factory`` argument of the\n    :meth:`pyramid.config.Configurator.set_session_factory`\n    method.\n\n    The session factory returned by this function will create sessions\n    which are limited to storing fewer than 4000 bytes of data (as the\n    payload must fit into a single cookie).\n\n    Parameters:\n\n    ``secret``\n      A string which is used to sign the cookie.\n\n    ``timeout``\n      A number of seconds of inactivity before a session times out.\n\n    ``cookie_name``\n      The name of the cookie used for sessioning.\n\n    ``cookie_max_age``\n      The maximum age of the cookie used for sessioning (in seconds).\n      Default: ``None`` (browser scope).\n\n    ``cookie_path``\n      The path used for the session cookie.\n\n    ``cookie_domain``\n      The domain used for the session cookie.  Default: ``None`` (no domain).\n\n    ``cookie_secure``\n      The 'secure' flag of the session cookie.\n\n    ``cookie_httponly``\n      The 'httpOnly' flag of the session cookie.\n\n    ``cookie_on_exception``\n      If ``True``, set a session cookie even if an exception occurs\n      while rendering a view.\n\n    ``signed_serialize``\n      A callable which takes more or less arbitrary Python data structure and\n      a secret and returns a signed serialization in bytes.\n      Default: ``signed_serialize`` (using pickle).\n\n    ``signed_deserialize``\n      A callable which takes a signed and serialized data structure in bytes\n      and a secret and returns the original data structure if the signature\n      is valid. Default: ``signed_deserialize`` (using pickle).\n    \"\"\"\n\n    class SerializerWrapper(object):\n        def __init__(self, secret):\n            self.secret = secret\n            \n        def loads(self, bstruct):\n            return signed_deserialize(bstruct, secret)\n\n        def dumps(self, appstruct):\n            return signed_serialize(appstruct, secret)\n\n    serializer = SerializerWrapper(secret)\n\n    return BaseCookieSessionFactory(\n        serializer,\n        cookie_name=cookie_name,\n        max_age=cookie_max_age,\n        path=cookie_path,\n        domain=cookie_domain,\n        secure=cookie_secure,\n        httponly=cookie_httponly,\n        timeout=timeout,\n        reissue_time=0, # to keep session.accessed == session.renewed\n        set_on_exception=cookie_on_exception,\n    )\n\ndeprecated(\n    'UnencryptedCookieSessionFactoryConfig',\n    'The UnencryptedCookieSessionFactoryConfig callable is deprecated as of '\n    'Pyramid 1.5.  Use ``pyramid.session.SignedCookieSessionFactory`` instead.'\n    ' Caveat: Cookies generated using SignedCookieSessionFactory are not '\n    'compatible with cookies generated using UnencryptedCookieSessionFactory, '\n    'so existing user session data will be destroyed if you switch to it.'\n    )\n\ndef SignedCookieSessionFactory(\n    secret,\n    cookie_name='session',\n    max_age=None,\n    path='/',\n    domain=None,\n    secure=False,\n    httponly=False,\n    set_on_exception=True,\n    timeout=1200,\n    reissue_time=0,\n    hashalg='sha512',\n    salt='pyramid.session.',\n    serializer=None,\n    ):\n    \"\"\"\n    .. versionadded:: 1.5\n    \n    Configure a :term:`session factory` which will provide signed\n    cookie-based sessions.  The return value of this\n    function is a :term:`session factory`, which may be provided as\n    the ``session_factory`` argument of a\n    :class:`pyramid.config.Configurator` constructor, or used\n    as the ``session_factory`` argument of the\n    :meth:`pyramid.config.Configurator.set_session_factory`\n    method.\n\n    The session factory returned by this function will create sessions\n    which are limited to storing fewer than 4000 bytes of data (as the\n    payload must fit into a single cookie).\n\n    Parameters:\n\n    ``secret``\n      A string which is used to sign the cookie. The secret should be at\n      least as long as the block size of the selected hash algorithm. For\n      ``sha512`` this would mean a 128 bit (64 character) secret.  It should\n      be unique within the set of secret values provided to Pyramid for\n      its various subsystems (see :ref:`admonishment_against_secret_sharing`).\n\n    ``hashalg``\n      The HMAC digest algorithm to use for signing. The algorithm must be\n      supported by the :mod:`hashlib` library. Default: ``'sha512'``.\n\n    ``salt``\n      A namespace to avoid collisions between different uses of a shared\n      secret. Reusing a secret for different parts of an application is\n      strongly discouraged (see :ref:`admonishment_against_secret_sharing`).\n      Default: ``'pyramid.session.'``.\n\n    ``cookie_name``\n      The name of the cookie used for sessioning. Default: ``'session'``.\n\n    ``max_age``\n      The maximum age of the cookie used for sessioning (in seconds).\n      Default: ``None`` (browser scope).\n\n    ``path``\n      The path used for the session cookie. Default: ``'/'``.\n\n    ``domain``\n      The domain used for the session cookie.  Default: ``None`` (no domain).\n\n    ``secure``\n      The 'secure' flag of the session cookie. Default: ``False``.\n\n    ``httponly``\n      Hide the cookie from Javascript by setting the 'HttpOnly' flag of the\n      session cookie. Default: ``False``.\n\n    ``timeout``\n      A number of seconds of inactivity before a session times out. If\n      ``None`` then the cookie never expires. This lifetime only applies\n      to the *value* within the cookie. Meaning that if the cookie expires\n      due to a lower ``max_age``, then this setting has no effect.\n      Default: ``1200``.\n\n    ``reissue_time``\n      The number of seconds that must pass before the cookie is automatically\n      reissued as the result of accessing the session. The\n      duration is measured as the number of seconds since the last session\n      cookie was issued and 'now'.  If this value is ``0``, a new cookie\n      will be reissued on every request accessing the session. If ``None``\n      then the cookie's lifetime will never be extended.\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      However, such a configuration is not explicitly prevented.\n\n      Default: ``0``.\n\n    ``set_on_exception``\n      If ``True``, set a session cookie even if an exception occurs\n      while rendering a view. Default: ``True``.\n\n    ``serializer``\n      An object with two methods: ``loads`` and ``dumps``.  The ``loads``\n      method should accept bytes and return a Python object.  The ``dumps``\n      method should accept a Python object and return bytes.  A ``ValueError``\n      should be raised for malformed inputs.  If a serializer is not passed,\n      the :class:`pyramid.session.PickleSerializer` serializer will be used.\n\n    .. versionadded: 1.5a3\n    \"\"\"\n    if serializer is None:\n        serializer = PickleSerializer()\n\n    signed_serializer = SignedSerializer(\n        secret,\n        salt,\n        hashalg,\n        serializer=serializer,\n        )\n\n    return BaseCookieSessionFactory(\n        signed_serializer,\n        cookie_name=cookie_name,\n        max_age=max_age,\n        path=path,\n        domain=domain,\n        secure=secure,\n        httponly=httponly,\n        timeout=timeout,\n        reissue_time=reissue_time,\n        set_on_exception=set_on_exception,\n    )\n"}
A user will ask you to solve a task. You should first draft your thinking process (inner monologue). Then, generate the solution.

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

**Title:** Passing String Values for `timeout` Causes TypeError in Session Handling

**Description:**
When initializing a session with the `timeout` parameter as a string, the session handling logic fails due to type mismatch. The system expects `timeout` to be an integer, but if a string is provided, it leads to runtime errors during numerical operations.

**Example Buggy Code:**
```python
from pyramid.session import BaseCookieSessionFactory
from pyramid.request import Request

# Initialize session with timeout as a string
session_factory = BaseCookieSessionFactory('secret', timeout='30')
request = Request.blank('/')
session = session_factory(request)

# Later in the code, a numerical operation is performed
if request.session.renewed and (current_time - request.session.renewed > request.session.timeout):
    # Intended to renew session
    pass
```

**Expected Behavior:**
The session should correctly handle the `timeout` parameter when provided as a string by converting it to an integer. This ensures that all numerical operations involving `timeout` execute without errors.

**Actual Behavior:**
Providing `timeout` as a string results in a `TypeError` during numerical comparisons, such as `current_time - request.session.renewed > request.session.timeout`, because the system attempts to compare a float with a string.

**Error Message:**
```
TypeError: '>' not supported between instances of 'float' and 'str'
```

[/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 re
import time as time_mod
import warnings

from zope.interface import implementer

from webob.cookies import CookieProfile

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

from pyramid.interfaces import (
    IAuthenticationPolicy,
    IDebugLogger,
    )

from pyramid.security import (
    Authenticated,
    Everyone,
    )

from pyramid.util import strings_differ

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


class CallbackAuthenticationPolicy(object):
    """ Abstract class """

    debug = False
    callback = None

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

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

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

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

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

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

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

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

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

        .. code-block:: python

            return [Everyone]

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

        .. code-block:: python

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

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

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

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

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

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

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

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


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

    Constructor Arguments

    ``identifier_name``

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

    ``callback``

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

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

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

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

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

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

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

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

        """
        identity = self._get_identity(request)

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

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

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

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

        if self.callback is None:
            return userid

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Constructor Arguments

    ``environ_key``

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

    ``callback``

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

    ``debug``

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

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

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

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

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

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

_marker = object()

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

    .. warning::

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

    Constructor Arguments

    ``secret``

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

    ``callback``

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

    ``cookie_name``

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

    ``secure``

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

    ``include_ip``

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

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

    ``timeout``

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

    ``reissue_time``

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

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

       Optional.

    ``max_age``

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

    ``path``

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

    ``http_only``

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

    ``wild_domain``

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

    ``parent_domain``

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

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

    ``domain``

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

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

    ``hashalg``

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

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

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

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

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

       Optional.

       .. note::

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

    ``debug``

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

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

    def __init__(self,
                 secret,
                 callback=None,
                 cookie_name='auth_tkt',
                 secure=False,
                 include_ip=False,
                 timeout=None,
                 reissue_time=None,
                 max_age=None,
                 path="/",
                 http_only=False,
                 wild_domain=True,
                 debug=False,
                 hashalg=_marker,
                 parent_domain=False,
                 domain=None,
                 ):
        if hashalg is _marker:
            hashalg = 'md5'
            warnings.warn(
                'The MD5 hash function used by default by the '
                'AuthTktAuthenticationPolicy is known to be '
                'susceptible to collision attacks.  It is the current default '
                'for backwards compatibility reasons, but we recommend that '
                'you use the SHA512 algorithm instead for improved security.  '
                'Pass ``hashalg=\'sha512\'`` to the '
                'AuthTktAuthenticationPolicy constructor to do so.\n\nNote '
                'that a change to the hash algorithms will invalidate existing '
                'auth tkt cookies set by your application.  If backwards '
                'compatibility of existing auth tkt cookies is of greater '
                'concern than the risk posed by the potential for a hash '
                'collision, you\'ll want to continue using MD5 explicitly.  '
                'To do so, pass ``hashalg=\'md5\'`` in your application to '
                'the AuthTktAuthenticationPolicy constructor.   When you do so '
                'this warning will not be emitted again.  The default '
                'algorithm used in this policy will change in the future, so '
                'setting an explicit hashalg will futureproof your '
                'application.',
                DeprecationWarning,
                stacklevel=2
                )
        self.cookie = AuthTktCookieHelper(
            secret,
            cookie_name=cookie_name,
            secure=secure,
            include_ip=include_ip,
            timeout=timeout,
            reissue_time=reissue_time,
            max_age=max_age,
            http_only=http_only,
            path=path,
            wild_domain=wild_domain,
            hashalg=hashalg,
            parent_domain=parent_domain,
            domain=domain,
            )
        self.callback = callback
        self.debug = debug

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

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

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

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

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

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

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

# this class licensed under the MIT license (stolen from Paste)
class AuthTicket(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 = native_(ticket).strip('"')
    digest_size = hashlib.new(hashalg).digest_size * 2
    digest = ticket[:digest_size]
    try:
        timestamp = int(ticket[digest_size:digest_size + 8], 16)
    except ValueError as e:
        raise BadTicket('Timestamp is not a hex integer: %s' % e)
    try:
        userid, data = ticket[digest_size + 8:].split('!', 1)
    except ValueError:
        raise BadTicket('userid is not followed by !')
    userid = url_unquote(userid)
    if '!' in data:
        tokens, user_data = data.split('!', 1)
    else: # pragma: no cover (never generated)
        # @@: Is this the right order?
        tokens = ''
        user_data = data

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

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

    tokens = tokens.split(',')

    return (timestamp, userid, tokens, user_data)

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

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

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

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

class AuthTktCookieHelper(object):
    """
    A helper class for use in third-party authentication policy
    implementations.  See
    :class:`pyramid.authentication.AuthTktAuthenticationPolicy` for the
    meanings of the constructor arguments.
    """
    parse_ticket = staticmethod(parse_ticket) # for tests
    AuthTicket = AuthTicket # for tests
    BadTicket = BadTicket # for tests
    now = None # for tests

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

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

    def __init__(self, secret, cookie_name='auth_tkt', secure=False,
                 include_ip=False, timeout=None, reissue_time=None,
                 max_age=None, http_only=False, path="/", wild_domain=True,
                 hashalg='md5', parent_domain=False, domain=None):

        serializer = _SimpleSerializer()

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

        self.secret = secret
        self.cookie_name = cookie_name
        self.secure = secure
        self.include_ip = include_ip
        self.timeout = timeout
        self.reissue_time = reissue_time
        self.max_age = max_age
        self.wild_domain = wild_domain
        self.parent_domain = parent_domain
        self.domain = domain
        self.hashalg = hashalg

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

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

        profile = self.cookie_profile(request)

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

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

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

        if cookie is None:
            return None

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

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

        now = self.now # service tests

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

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

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

        reissue = self.reissue_time is not None

        if reissue and not hasattr(request, '_authtkt_reissued'):
            if ( (now - timestamp) > self.reissue_time ):
                # See https://github.com/Pylons/pyramid/issues#issue/108
                tokens = list(filter(None, tokens))
                headers = self.remember(request, userid, max_age=self.max_age,
                                        tokens=tokens)
                def reissue_authtkt(request, response):
                    if not hasattr(request, '_authtkt_reissue_revoked'):
                        for k, v in headers:
                            response.headerlist.append((k, v))
                request.add_response_callback(reissue_authtkt)
                request._authtkt_reissued = True

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

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

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

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

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

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

        environ = request.environ

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

        user_data = ''

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

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

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

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

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

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

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

    Constructor Arguments

    ``prefix``

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

    ``callback``

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

    ``debug``

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

    """

    def __init__(self, prefix='auth.', callback=None, debug=False):
        self.callback = callback
        self.prefix = prefix or ''
        self.userid_key = prefix + 'userid'
        self.debug = debug

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

    def forget(self, request):
        """ Remove the stored userid 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, userid, **kw):
        """ A no-op. Basic authentication does not provide a protocol for
        remembering the user. Credentials are sent on every request.

        """
        return []

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

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

    def _get_credentials(self, request):
        authorization = request.headers.get('Authorization')
        if not authorization:
            return None
        try:
            authmeth, auth = authorization.split(' ', 1)
        except ValueError: # not enough values to unpack
            return None
        if authmeth.lower() != 'basic':
            return None

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

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

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

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

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


### pyramid/session.py
import base64
import binascii
import hashlib
import hmac
import os
import time

from zope.deprecation import deprecated
from zope.interface import implementer

from webob.cookies import SignedSerializer

from pyramid.compat import (
    pickle,
    PY3,
    text_,
    bytes_,
    native_,
    )

from pyramid.exceptions import BadCSRFToken
from pyramid.interfaces import ISession
from pyramid.util import strings_differ

def manage_accessed(wrapped):
    """ Decorator which causes a cookie to be renewed when an accessor
    method is called."""
    def accessed(session, *arg, **kw):
        session.accessed = now = int(time.time())
        if session._reissue_time is not None:
            if now - session.renewed > session._reissue_time:
                session.changed()
        return wrapped(session, *arg, **kw)
    accessed.__doc__ = wrapped.__doc__
    return accessed

def manage_changed(wrapped):
    """ Decorator which causes a cookie to be set when a setter method
    is called."""
    def changed(session, *arg, **kw):
        session.accessed = int(time.time())
        session.changed()
        return wrapped(session, *arg, **kw)
    changed.__doc__ = wrapped.__doc__
    return changed

def signed_serialize(data, secret):
    """ Serialize any pickleable structure (``data``) and sign it
    using the ``secret`` (must be a string).  Return the
    serialization, which includes the signature as its first 40 bytes.
    The ``signed_deserialize`` method will deserialize such a value.

    This function is useful for creating signed cookies.  For example:

    .. code-block:: python

       cookieval = signed_serialize({'a':1}, 'secret')
       response.set_cookie('signed_cookie', cookieval)
    """
    pickled = pickle.dumps(data, pickle.HIGHEST_PROTOCOL)
    try:
        # bw-compat with pyramid <= 1.5b1 where latin1 is the default
        secret = bytes_(secret)
    except UnicodeEncodeError:
        secret = bytes_(secret, 'utf-8')
    sig = hmac.new(secret, pickled, hashlib.sha1).hexdigest()
    return sig + native_(base64.b64encode(pickled))

def signed_deserialize(serialized, secret, hmac=hmac):
    """ Deserialize the value returned from ``signed_serialize``.  If
    the value cannot be deserialized for any reason, a
    :exc:`ValueError` exception will be raised.

    This function is useful for deserializing a signed cookie value
    created by ``signed_serialize``.  For example:

    .. code-block:: python

       cookieval = request.cookies['signed_cookie']
       data = signed_deserialize(cookieval, 'secret')
    """
    # hmac parameterized only for unit tests
    try:
        input_sig, pickled = (bytes_(serialized[:40]),
                              base64.b64decode(bytes_(serialized[40:])))
    except (binascii.Error, TypeError) as e:
        # Badly formed data can make base64 die
        raise ValueError('Badly formed base64 data: %s' % e)

    try:
        # bw-compat with pyramid <= 1.5b1 where latin1 is the default
        secret = bytes_(secret)
    except UnicodeEncodeError:
        secret = bytes_(secret, 'utf-8')
    sig = bytes_(hmac.new(secret, pickled, hashlib.sha1).hexdigest())

    # Avoid timing attacks (see
    # http://seb.dbzteam.org/crypto/python-oauth-timing-hmac.pdf)
    if strings_differ(sig, input_sig):
        raise ValueError('Invalid signature')

    return pickle.loads(pickled)

def check_csrf_token(request,
                     token='csrf_token',
                     header='X-CSRF-Token',
                     raises=True):
    """ Check the CSRF token in the request's session against the value in
    ``request.params.get(token)`` or ``request.headers.get(header)``.
    If a ``token`` keyword is not supplied to this function, the string
    ``csrf_token`` will be used to look up the token in ``request.params``.
    If a ``header`` keyword is not supplied to this function, the string
    ``X-CSRF-Token`` will be used to look up the token in ``request.headers``.

    If the value supplied by param or by header doesn't match the value
    supplied by ``request.session.get_csrf_token()``, and ``raises`` is
    ``True``, this function will raise an
    :exc:`pyramid.exceptions.BadCSRFToken` exception.
    If the check does succeed and ``raises`` is ``False``, this
    function will return ``False``.  If the CSRF check is successful, this
    function will return ``True`` unconditionally.

    Note that using this function requires that a :term:`session factory` is
    configured.

    .. versionadded:: 1.4a2
    """
    supplied_token = request.params.get(token, request.headers.get(header, ""))
    if strings_differ(request.session.get_csrf_token(), supplied_token):
        if raises:
            raise BadCSRFToken('check_csrf_token(): Invalid token')
        return False
    return True

class PickleSerializer(object):
    """ A Webob cookie serializer that uses the pickle protocol to dump Python
    data to bytes."""
    def loads(self, bstruct):
        return pickle.loads(bstruct)

    def dumps(self, appstruct):
        return pickle.dumps(appstruct, pickle.HIGHEST_PROTOCOL)

def BaseCookieSessionFactory(
    serializer,
    cookie_name='session',
    max_age=None,
    path='/',
    domain=None,
    secure=False,
    httponly=False,
    timeout=1200,
    reissue_time=0,
    set_on_exception=True,
    ):
    """
    .. versionadded:: 1.5
    
    Configure a :term:`session factory` which will provide cookie-based
    sessions.  The return value of this function is a :term:`session factory`,
    which may be provided as the ``session_factory`` argument of a
    :class:`pyramid.config.Configurator` constructor, or used as the
    ``session_factory`` argument of the
    :meth:`pyramid.config.Configurator.set_session_factory` method.

    The session factory returned by this function will create sessions
    which are limited to storing fewer than 4000 bytes of data (as the
    payload must fit into a single cookie).

    .. warning:

       This class provides no protection from tampering and is only intended
       to be used by framework authors to create their own cookie-based
       session factories.

    Parameters:

    ``serializer``
      An object with two methods: ``loads`` and ``dumps``.  The ``loads``
      method should accept bytes and return a Python object.  The ``dumps``
      method should accept a Python object and return bytes.  A ``ValueError``
      should be raised for malformed inputs.

    ``cookie_name``
      The name of the cookie used for sessioning. Default: ``'session'``.

    ``max_age``
      The maximum age of the cookie used for sessioning (in seconds).
      Default: ``None`` (browser scope).

    ``path``
      The path used for the session cookie. Default: ``'/'``.

    ``domain``
      The domain used for the session cookie.  Default: ``None`` (no domain).

    ``secure``
      The 'secure' flag of the session cookie. Default: ``False``.

    ``httponly``
      Hide the cookie from Javascript by setting the 'HttpOnly' flag of the
      session cookie. Default: ``False``.

    ``timeout``
      A number of seconds of inactivity before a session times out. If
      ``None`` then the cookie never expires. This lifetime only applies
      to the *value* within the cookie. Meaning that if the cookie expires
      due to a lower ``max_age``, then this setting has no effect.
      Default: ``1200``.

    ``reissue_time``
      The number of seconds that must pass before the cookie is automatically
      reissued as the result of a request which accesses the session. The
      duration is measured as the number of seconds since the last session
      cookie was issued and 'now'.  If this value is ``0``, a new cookie
      will be reissued on every request accessing the session. If ``None``
      then the cookie's lifetime will never be extended.

      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.
      However, such a configuration is not explicitly prevented.

      Default: ``0``.

    ``set_on_exception``
      If ``True``, set a session cookie even if an exception occurs
      while rendering a view. Default: ``True``.

    .. versionadded: 1.5a3
    """

    @implementer(ISession)
    class CookieSession(dict):
        """ Dictionary-like session object """

        # configuration parameters
        _cookie_name = cookie_name
        _cookie_max_age = max_age
        _cookie_path = path
        _cookie_domain = domain
        _cookie_secure = secure
        _cookie_httponly = httponly
        _cookie_on_exception = set_on_exception
        _timeout = timeout
        _reissue_time = reissue_time

        # dirty flag
        _dirty = False

        def __init__(self, request):
            self.request = request
            now = time.time()
            created = renewed = now
            new = True
            value = None
            state = {}
            cookieval = request.cookies.get(self._cookie_name)
            if cookieval is not None:
                try:
                    value = serializer.loads(bytes_(cookieval))
                except ValueError:
                    # the cookie failed to deserialize, dropped
                    value = None

            if value is not None:
                try:
                    # since the value is not necessarily signed, we have
                    # to unpack it a little carefully
                    rval, cval, sval = value
                    renewed = float(rval)
                    created = float(cval)
                    state = sval
                    new = False
                except (TypeError, ValueError):
                    # value failed to unpack properly or renewed was not
                    # a numeric type so we'll fail deserialization here
                    state = {}

            if self._timeout is not None:
                if now - renewed > self._timeout:
                    # expire the session because it was not renewed
                    # before the timeout threshold
                    state = {}

            self.created = created
            self.accessed = renewed
            self.renewed = renewed
            self.new = new
            dict.__init__(self, state)

        # ISession methods
        def changed(self):
            if not self._dirty:
                self._dirty = True
                def set_cookie_callback(request, response):
                    self._set_cookie(response)
                    self.request = None # explicitly break cycle for gc
                self.request.add_response_callback(set_cookie_callback)

        def invalidate(self):
            self.clear() # XXX probably needs to unset cookie

        # non-modifying dictionary methods
        get = manage_accessed(dict.get)
        __getitem__ = manage_accessed(dict.__getitem__)
        items = manage_accessed(dict.items)
        values = manage_accessed(dict.values)
        keys = manage_accessed(dict.keys)
        __contains__ = manage_accessed(dict.__contains__)
        __len__ = manage_accessed(dict.__len__)
        __iter__ = manage_accessed(dict.__iter__)

        if not PY3:
            iteritems = manage_accessed(dict.iteritems)
            itervalues = manage_accessed(dict.itervalues)
            iterkeys = manage_accessed(dict.iterkeys)
            has_key = manage_accessed(dict.has_key)

        # modifying dictionary methods
        clear = manage_changed(dict.clear)
        update = manage_changed(dict.update)
        setdefault = manage_changed(dict.setdefault)
        pop = manage_changed(dict.pop)
        popitem = manage_changed(dict.popitem)
        __setitem__ = manage_changed(dict.__setitem__)
        __delitem__ = manage_changed(dict.__delitem__)

        # flash API methods
        @manage_changed
        def flash(self, msg, queue='', allow_duplicate=True):
            storage = self.setdefault('_f_' + queue, [])
            if allow_duplicate or (msg not in storage):
                storage.append(msg)

        @manage_changed
        def pop_flash(self, queue=''):
            storage = self.pop('_f_' + queue, [])
            return storage

        @manage_accessed
        def peek_flash(self, queue=''):
            storage = self.get('_f_' + queue, [])
            return storage

        # CSRF API methods
        @manage_changed
        def new_csrf_token(self):
            token = text_(binascii.hexlify(os.urandom(20)))
            self['_csrft_'] = token
            return token

        @manage_accessed
        def get_csrf_token(self):
            token = self.get('_csrft_', None)
            if token is None:
                token = self.new_csrf_token()
            return token

        # non-API methods
        def _set_cookie(self, response):
            if not self._cookie_on_exception:
                exception = getattr(self.request, 'exception', None)
                if exception is not None: # dont set a cookie during exceptions
                    return False
            cookieval = native_(serializer.dumps(
                (self.accessed, self.created, dict(self))
                ))
            if len(cookieval) > 4064:
                raise ValueError(
                    'Cookie value is too long to store (%s bytes)' %
                    len(cookieval)
                    )
            response.set_cookie(
                self._cookie_name,
                value=cookieval,
                max_age=self._cookie_max_age,
                path=self._cookie_path,
                domain=self._cookie_domain,
                secure=self._cookie_secure,
                httponly=self._cookie_httponly,
                )
            return True

    return CookieSession


def UnencryptedCookieSessionFactoryConfig(
    secret,
    timeout=1200,
    cookie_name='session',
    cookie_max_age=None,
    cookie_path='/',
    cookie_domain=None,
    cookie_secure=False,
    cookie_httponly=False,
    cookie_on_exception=True,
    signed_serialize=signed_serialize,
    signed_deserialize=signed_deserialize,
    ):
    """
    .. deprecated:: 1.5
        Use :func:`pyramid.session.SignedCookieSessionFactory` instead.
        Caveat: Cookies generated using ``SignedCookieSessionFactory`` are not
        compatible with cookies generated using
        ``UnencryptedCookieSessionFactory``, so existing user session data
        will be destroyed if you switch to it.
    
    Configure a :term:`session factory` which will provide unencrypted
    (but signed) cookie-based sessions.  The return value of this
    function is a :term:`session factory`, which may be provided as
    the ``session_factory`` argument of a
    :class:`pyramid.config.Configurator` constructor, or used
    as the ``session_factory`` argument of the
    :meth:`pyramid.config.Configurator.set_session_factory`
    method.

    The session factory returned by this function will create sessions
    which are limited to storing fewer than 4000 bytes of data (as the
    payload must fit into a single cookie).

    Parameters:

    ``secret``
      A string which is used to sign the cookie.

    ``timeout``
      A number of seconds of inactivity before a session times out.

    ``cookie_name``
      The name of the cookie used for sessioning.

    ``cookie_max_age``
      The maximum age of the cookie used for sessioning (in seconds).
      Default: ``None`` (browser scope).

    ``cookie_path``
      The path used for the session cookie.

    ``cookie_domain``
      The domain used for the session cookie.  Default: ``None`` (no domain).

    ``cookie_secure``
      The 'secure' flag of the session cookie.

    ``cookie_httponly``
      The 'httpOnly' flag of the session cookie.

    ``cookie_on_exception``
      If ``True``, set a session cookie even if an exception occurs
      while rendering a view.

    ``signed_serialize``
      A callable which takes more or less arbitrary Python data structure and
      a secret and returns a signed serialization in bytes.
      Default: ``signed_serialize`` (using pickle).

    ``signed_deserialize``
      A callable which takes a signed and serialized data structure in bytes
      and a secret and returns the original data structure if the signature
      is valid. Default: ``signed_deserialize`` (using pickle).
    """

    class SerializerWrapper(object):
        def __init__(self, secret):
            self.secret = secret
            
        def loads(self, bstruct):
            return signed_deserialize(bstruct, secret)

        def dumps(self, appstruct):
            return signed_serialize(appstruct, secret)

    serializer = SerializerWrapper(secret)

    return BaseCookieSessionFactory(
        serializer,
        cookie_name=cookie_name,
        max_age=cookie_max_age,
        path=cookie_path,
        domain=cookie_domain,
        secure=cookie_secure,
        httponly=cookie_httponly,
        timeout=timeout,
        reissue_time=0, # to keep session.accessed == session.renewed
        set_on_exception=cookie_on_exception,
    )

deprecated(
    'UnencryptedCookieSessionFactoryConfig',
    'The UnencryptedCookieSessionFactoryConfig callable is deprecated as of '
    'Pyramid 1.5.  Use ``pyramid.session.SignedCookieSessionFactory`` instead.'
    ' Caveat: Cookies generated using SignedCookieSessionFactory are not '
    'compatible with cookies generated using UnencryptedCookieSessionFactory, '
    'so existing user session data will be destroyed if you switch to it.'
    )

def SignedCookieSessionFactory(
    secret,
    cookie_name='session',
    max_age=None,
    path='/',
    domain=None,
    secure=False,
    httponly=False,
    set_on_exception=True,
    timeout=1200,
    reissue_time=0,
    hashalg='sha512',
    salt='pyramid.session.',
    serializer=None,
    ):
    """
    .. versionadded:: 1.5
    
    Configure a :term:`session factory` which will provide signed
    cookie-based sessions.  The return value of this
    function is a :term:`session factory`, which may be provided as
    the ``session_factory`` argument of a
    :class:`pyramid.config.Configurator` constructor, or used
    as the ``session_factory`` argument of the
    :meth:`pyramid.config.Configurator.set_session_factory`
    method.

    The session factory returned by this function will create sessions
    which are limited to storing fewer than 4000 bytes of data (as the
    payload must fit into a single cookie).

    Parameters:

    ``secret``
      A string which is used to sign the cookie. The secret should be at
      least as long as the block size of the selected hash algorithm. For
      ``sha512`` this would mean a 128 bit (64 character) secret.  It should
      be unique within the set of secret values provided to Pyramid for
      its various subsystems (see :ref:`admonishment_against_secret_sharing`).

    ``hashalg``
      The HMAC digest algorithm to use for signing. The algorithm must be
      supported by the :mod:`hashlib` library. Default: ``'sha512'``.

    ``salt``
      A namespace to avoid collisions between different uses of a shared
      secret. Reusing a secret for different parts of an application is
      strongly discouraged (see :ref:`admonishment_against_secret_sharing`).
      Default: ``'pyramid.session.'``.

    ``cookie_name``
      The name of the cookie used for sessioning. Default: ``'session'``.

    ``max_age``
      The maximum age of the cookie used for sessioning (in seconds).
      Default: ``None`` (browser scope).

    ``path``
      The path used for the session cookie. Default: ``'/'``.

    ``domain``
      The domain used for the session cookie.  Default: ``None`` (no domain).

    ``secure``
      The 'secure' flag of the session cookie. Default: ``False``.

    ``httponly``
      Hide the cookie from Javascript by setting the 'HttpOnly' flag of the
      session cookie. Default: ``False``.

    ``timeout``
      A number of seconds of inactivity before a session times out. If
      ``None`` then the cookie never expires. This lifetime only applies
      to the *value* within the cookie. Meaning that if the cookie expires
      due to a lower ``max_age``, then this setting has no effect.
      Default: ``1200``.

    ``reissue_time``
      The number of seconds that must pass before the cookie is automatically
      reissued as the result of accessing the session. The
      duration is measured as the number of seconds since the last session
      cookie was issued and 'now'.  If this value is ``0``, a new cookie
      will be reissued on every request accessing the session. If ``None``
      then the cookie's lifetime will never be extended.

      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.
      However, such a configuration is not explicitly prevented.

      Default: ``0``.

    ``set_on_exception``
      If ``True``, set a session cookie even if an exception occurs
      while rendering a view. Default: ``True``.

    ``serializer``
      An object with two methods: ``loads`` and ``dumps``.  The ``loads``
      method should accept bytes and return a Python object.  The ``dumps``
      method should accept a Python object and return bytes.  A ``ValueError``
      should be raised for malformed inputs.  If a serializer is not passed,
      the :class:`pyramid.session.PickleSerializer` serializer will be used.

    .. versionadded: 1.5a3
    """
    if serializer is None:
        serializer = PickleSerializer()

    signed_serializer = SignedSerializer(
        secret,
        salt,
        hashalg,
        serializer=serializer,
        )

    return BaseCookieSessionFactory(
        signed_serializer,
        cookie_name=cookie_name,
        max_age=max_age,
        path=path,
        domain=domain,
        secure=secure,
        httponly=httponly,
        timeout=timeout,
        reissue_time=reissue_time,
        set_on_exception=set_on_exception,
    )

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