/tests/test_base_service.py

https://github.com/facebookincubator/FCR · Python · 152 lines · 105 code · 41 blank · 6 comment · 9 complexity · fe56c18fac9a055c8e4f26cc7b731bfd MD5 · raw file

  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. # Copyright (c) Facebook, Inc. and its affiliates.
  4. #
  5. # This source code is licensed under the MIT license found in the
  6. # LICENSE file in the root directory of this source tree.
  7. import asyncio
  8. import mock
  9. from fbnet.command_runner.base_service import PeriodicServiceTask, ServiceTask
  10. from .testutil import AsyncTestCase
  11. class TestService(AsyncTestCase):
  12. def setUp(self) -> None:
  13. super().setUp()
  14. self._mock_service = mock.Mock(loop=self._loop)
  15. def test_abstract_service(self) -> None:
  16. with self.assertRaises(TypeError):
  17. ServiceTask("RunTest", service=self._mock_service) # pyre-ignore
  18. def test_run(self) -> None:
  19. class DummyServiceTask(ServiceTask):
  20. _run_called = False
  21. _cleanup_called = False
  22. async def cleanup(self):
  23. self._cleanup_called = True
  24. async def run(self):
  25. self._run_called = True
  26. service = DummyServiceTask(self._mock_service, "RunTest")
  27. self.wait_for_tasks()
  28. self.assertTrue(service._run_called)
  29. self.assertTrue(service._cleanup_called)
  30. def test_cancel(self) -> None:
  31. class DummyServiceTask(ServiceTask):
  32. _run_called = False
  33. _run_complete = False
  34. _cleanup_called = False
  35. async def cleanup(self):
  36. self._cleanup_called = True
  37. async def run(self):
  38. self._run_called = True
  39. await asyncio.sleep(60, loop=self.service.loop)
  40. self._run_complete = True
  41. services = [
  42. DummyServiceTask(self._mock_service, "DummyServiceTask-%d" % (i))
  43. for i in range(3)
  44. ]
  45. async def cancel_services():
  46. asyncio.sleep(1)
  47. for svc in services:
  48. svc.cancel()
  49. asyncio.ensure_future(cancel_services(), loop=self._loop)
  50. self.wait_for_tasks()
  51. for svc in services:
  52. self.assertTrue(svc._run_called)
  53. self.assertFalse(svc._run_complete)
  54. self.assertTrue(svc._cleanup_called)
  55. def test_exception(self) -> None:
  56. class DummyServiceTask(ServiceTask):
  57. _run_called = False
  58. _run_complete = False
  59. _cleanup_called = False
  60. async def cleanup(self):
  61. self._cleanup_called = True
  62. async def run(self):
  63. self._run_called = True
  64. raise RuntimeError(self._objname)
  65. self._run_complete = True
  66. service = DummyServiceTask(self._mock_service, "DummyServiceTask")
  67. with self.assertRaises(RuntimeError) as ctx:
  68. self.wait_for_tasks()
  69. self.assertEqual(ctx.exception.args[0], service._objname)
  70. self.assertTrue(service._run_called)
  71. self.assertFalse(service._run_complete)
  72. self.assertTrue(service._cleanup_called)
  73. class TestPeriodicService(AsyncTestCase):
  74. def setUp(self) -> None:
  75. super().setUp()
  76. self._mock_service = mock.Mock(loop=self._loop)
  77. def test_abstract_service(self) -> None:
  78. with self.assertRaises(TypeError):
  79. PeriodicServiceTask(self._mock_service, "RunTest", 1) # pyre-ignore
  80. def test_run(self) -> None:
  81. class DummyServiceTask(PeriodicServiceTask):
  82. _run_called = 0
  83. _cleanup_called = False
  84. async def cleanup(self):
  85. self._cleanup_called = True
  86. async def run(self):
  87. assert self._run_called < 5
  88. self._run_called += 1
  89. if self._run_called == 5:
  90. self.cancel()
  91. service = DummyServiceTask(self._mock_service, "RunTest", 0.1)
  92. self.wait_for_tasks()
  93. self.assertEqual(service._run_called, 5)
  94. self.assertTrue(service._cleanup_called)
  95. def test_exception(self) -> None:
  96. class DummyServiceTask(PeriodicServiceTask):
  97. _run_called = 0
  98. _cleanup_called = False
  99. async def cleanup(self):
  100. self._cleanup_called = True
  101. async def run(self):
  102. assert self._run_called < 3
  103. self._run_called += 1
  104. if self._run_called == 3:
  105. raise RuntimeError(self._run_called)
  106. service = DummyServiceTask(self._mock_service, "RunTest", 0.1)
  107. with self.assertRaises(RuntimeError) as ctx:
  108. self.wait_for_tasks()
  109. self.assertEqual(ctx.exception.args[0], 3)
  110. self.assertEqual(service._run_called, 3)
  111. self.assertTrue(service._cleanup_called)