Skip to content

Latest commit

 

History

History
38 lines (32 loc) · 1.38 KB

responses_callback_isolation_issue.md

File metadata and controls

38 lines (32 loc) · 1.38 KB

Problem:

  1. responses.start()
  2. rex_a.async_get(url_a)
  3. rex_b.async_get(url_b)
  4. rex_a.result()
  5. requests.get(url_a)
  6. responses triggers callback
  7. pytest_vts.vts.record._callback()
  8. responses.stop()
  9. requests.get(url_a)
  10. greenlet switches to gevent main loop gevent main loop picks another greenlet to run. Let's assume resumes with 1.
  11. rex_b.result() 3. requests.get(url_a) 3. because of greenlet 2. stopping responses this requests goes through 3. greenlet switches to gevent main loop gevent main loop picks another greenlet to run. Let's assume resumes 2.
  12. requests.get(url_a) finishes
  13. recorded to the cassette track
  14. responses.start()
  15. greenlet ends and switches to gevent main loop gevent main loop picks another greenlet to run. Let's assume resumes 3. 3. requests.get(url_b) finishes 3. since it wasn't executed in responses callback registered by vts => no cassette 3. greenlet ends and switches to gevent main loop

The above example uses greenlets, but the same is valid for threads, maybe even worse since threads are scheduled by OS and can switch anywhere not only in blocking operations.

Solution:

Instead of using requests to make the http call which should bypass responses, use something else (e.g. urllib3) which is not patched by responses. That way we can avoid stop-ing() start-ing() responses.