test_transactions.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. from synapse.rest.client.transactions import HttpTransactionCache
  2. from synapse.rest.client.transactions import CLEANUP_PERIOD_MS
  3. from twisted.internet import defer
  4. from mock import Mock, call
  5. from tests import unittest
  6. from tests.utils import MockClock
  7. class HttpTransactionCacheTestCase(unittest.TestCase):
  8. def setUp(self):
  9. self.clock = MockClock()
  10. self.cache = HttpTransactionCache(self.clock)
  11. self.mock_http_response = (200, "GOOD JOB!")
  12. self.mock_key = "foo"
  13. @defer.inlineCallbacks
  14. def test_executes_given_function(self):
  15. cb = Mock(
  16. return_value=defer.succeed(self.mock_http_response)
  17. )
  18. res = yield self.cache.fetch_or_execute(
  19. self.mock_key, cb, "some_arg", keyword="arg"
  20. )
  21. cb.assert_called_once_with("some_arg", keyword="arg")
  22. self.assertEqual(res, self.mock_http_response)
  23. @defer.inlineCallbacks
  24. def test_deduplicates_based_on_key(self):
  25. cb = Mock(
  26. return_value=defer.succeed(self.mock_http_response)
  27. )
  28. for i in range(3): # invoke multiple times
  29. res = yield self.cache.fetch_or_execute(
  30. self.mock_key, cb, "some_arg", keyword="arg", changing_args=i
  31. )
  32. self.assertEqual(res, self.mock_http_response)
  33. # expect only a single call to do the work
  34. cb.assert_called_once_with("some_arg", keyword="arg", changing_args=0)
  35. @defer.inlineCallbacks
  36. def test_cleans_up(self):
  37. cb = Mock(
  38. return_value=defer.succeed(self.mock_http_response)
  39. )
  40. yield self.cache.fetch_or_execute(
  41. self.mock_key, cb, "an arg"
  42. )
  43. # should NOT have cleaned up yet
  44. self.clock.advance_time_msec(CLEANUP_PERIOD_MS / 2)
  45. yield self.cache.fetch_or_execute(
  46. self.mock_key, cb, "an arg"
  47. )
  48. # still using cache
  49. cb.assert_called_once_with("an arg")
  50. self.clock.advance_time_msec(CLEANUP_PERIOD_MS)
  51. yield self.cache.fetch_or_execute(
  52. self.mock_key, cb, "an arg"
  53. )
  54. # no longer using cache
  55. self.assertEqual(cb.call_count, 2)
  56. self.assertEqual(
  57. cb.call_args_list,
  58. [call("an arg",), call("an arg",)]
  59. )