Exemplo n.º 1
0
class TestFSEventService(TestBase):
    BUILD_ROOT = "/build_root"
    EMPTY_EVENT = (None, None)
    FAKE_EVENT = dict(subscription="test", files=["a/BUILD", "b/BUILD"])
    FAKE_EVENT_STREAM = [
        ("ignored", ev) for ev in [FAKE_EVENT, EMPTY_EVENT, EMPTY_EVENT, FAKE_EVENT, EMPTY_EVENT]
    ]
    WORKER_COUNT = 1

    def setUp(self):
        super().setUp()
        self.mock_watchman = unittest.mock.create_autospec(Watchman, spec_set=True)
        self.service = FSEventService(self.mock_watchman, self.scheduler.scheduler, self.BUILD_ROOT)
        self.service.setup(None)

    @contextmanager
    def mocked_run(self, asserts=True):
        self.service._handle_all_files_event = unittest.mock.Mock()
        yield self.service._handle_all_files_event
        if asserts:
            self.mock_watchman.watch_project.assert_called_once_with(self.BUILD_ROOT)

    def test_run_raise_on_failure_isalive(self):
        self.mock_watchman.is_alive.return_value = False
        with self.mocked_run(False), self.assertRaises(FSEventService.ServiceError):
            self.service.run()

    def test_run(self):
        with self.mocked_run() as mock_callback:
            self.mock_watchman.subscribed.return_value = self.FAKE_EVENT_STREAM
            self.service.run()
            mock_callback.assert_has_calls(
                [unittest.mock.call(self.FAKE_EVENT), unittest.mock.call(self.FAKE_EVENT)],
                any_order=True,
            )

    def test_run_breaks_on_kill_switch(self):
        with self.mocked_run() as mock_callback:
            self.service.terminate()
            self.mock_watchman.subscribed.return_value = self.FAKE_EVENT_STREAM
            self.service.run()
            assert not mock_callback.called
Exemplo n.º 2
0
class TestFSEventService(TestBase):
    BUILD_ROOT = '/build_root'
    EMPTY_EVENT = (None, None)
    FAKE_EVENT = ('test',
                  dict(subscription='test', files=['a/BUILD', 'b/BUILD']))
    FAKE_EVENT_STREAM = [
        FAKE_EVENT, EMPTY_EVENT, EMPTY_EVENT, FAKE_EVENT, EMPTY_EVENT
    ]
    WORKER_COUNT = 1

    def setUp(self):
        super().setUp()
        self.mock_watchman = unittest.mock.create_autospec(Watchman,
                                                           spec_set=True)
        self.service = FSEventService(self.mock_watchman, self.BUILD_ROOT)
        self.service.setup(None)
        self.service.register_all_files_handler(lambda x: True, name='test')
        self.service.register_all_files_handler(lambda x: False, name='test2')

    def test_registration(self):
        # N.B. This test implicitly tests register_handler; no need to duplicate work.
        self.assertTrue('test' in self.service._handlers)
        self.assertTrue('test2' in self.service._handlers)
        self.assertIsInstance(self.service._handlers['test'],
                              Watchman.EventHandler)
        self.assertIsInstance(self.service._handlers['test2'],
                              Watchman.EventHandler)

    def test_register_handler_duplicate(self):
        with self.assertRaises(AssertionError):
            self.service.register_handler('test', 'test', lambda x: True)

        with self.assertRaises(AssertionError):
            self.service.register_handler('test', dict(test=1), lambda x: True)

    def test_fire_callback(self):
        self.assertTrue(self.service.fire_callback('test', {}))
        self.assertFalse(self.service.fire_callback('test2', {}))

    @contextmanager
    def mocked_run(self, asserts=True):
        self.service.fire_callback = unittest.mock.Mock()
        yield self.service.fire_callback
        if asserts:
            self.mock_watchman.watch_project.assert_called_once_with(
                self.BUILD_ROOT)

    def test_run_raise_on_failure_isalive(self):
        self.mock_watchman.is_alive.return_value = False
        with self.mocked_run(False), self.assertRaises(
                FSEventService.ServiceError):
            self.service.run()

    def test_run(self):
        with self.mocked_run() as mock_callback:
            self.mock_watchman.subscribed.return_value = self.FAKE_EVENT_STREAM
            self.service.run()
            mock_callback.assert_has_calls([
                unittest.mock.call(*self.FAKE_EVENT),
                unittest.mock.call(*self.FAKE_EVENT)
            ],
                                           any_order=True)

    def test_run_failed_callback(self):
        with self.mocked_run() as mock_callback:
            self.mock_watchman.subscribed.return_value = self.FAKE_EVENT_STREAM
            mock_callback.side_effect = [False, True]
            self.service.run()
            mock_callback.assert_has_calls([
                unittest.mock.call(*self.FAKE_EVENT),
                unittest.mock.call(*self.FAKE_EVENT)
            ],
                                           any_order=True)

    def test_run_breaks_on_kill_switch(self):
        with self.mocked_run() as mock_callback:
            self.service.terminate()
            self.mock_watchman.subscribed.return_value = self.FAKE_EVENT_STREAM
            self.service.run()
            assert not mock_callback.called
Exemplo n.º 3
0
class TestFSEventService(TestBase):
  BUILD_ROOT = '/build_root'
  EMPTY_EVENT = (None, None)
  FAKE_EVENT = ('test', dict(subscription='test', files=['a/BUILD', 'b/BUILD']))
  FAKE_EVENT_STREAM = [FAKE_EVENT, EMPTY_EVENT, EMPTY_EVENT, FAKE_EVENT, EMPTY_EVENT]
  WORKER_COUNT = 1

  def setUp(self):
    super(TestFSEventService, self).setUp()
    self.mock_watchman = mock.create_autospec(Watchman, spec_set=True)
    self.service = FSEventService(self.mock_watchman, self.BUILD_ROOT, self.WORKER_COUNT)
    self.service.setup(None, None, executor=TestExecutor())
    self.service.register_all_files_handler(lambda x: True, name='test')
    self.service.register_all_files_handler(lambda x: False, name='test2')

  def test_registration(self):
    # N.B. This test implicitly tests register_handler; no need to duplicate work.
    self.assertTrue('test' in self.service._handlers)
    self.assertTrue('test2' in self.service._handlers)
    self.assertIsInstance(self.service._handlers['test'], Watchman.EventHandler)
    self.assertIsInstance(self.service._handlers['test2'], Watchman.EventHandler)

  def test_register_handler_duplicate(self):
    with self.assertRaises(AssertionError):
      self.service.register_handler('test', 'test', lambda x: True)

    with self.assertRaises(AssertionError):
      self.service.register_handler('test', dict(test=1), lambda x: True)

  def test_fire_callback(self):
    self.assertTrue(self.service.fire_callback('test', {}))
    self.assertFalse(self.service.fire_callback('test2', {}))

  @contextmanager
  def mocked_run(self, asserts=True):
    self.service.fire_callback = mock.Mock()
    yield self.service.fire_callback
    if asserts:
      self.mock_watchman.watch_project.assert_called_once_with(self.BUILD_ROOT)

  def test_run_raise_on_failure_isalive(self):
    self.mock_watchman.is_alive.return_value = False
    with self.mocked_run(False), self.assertRaises(self.service.ServiceError):
      self.service.run()

  def test_run(self):
    with self.mocked_run() as mock_callback:
      self.mock_watchman.subscribed.return_value = self.FAKE_EVENT_STREAM
      self.service.run()
      mock_callback.assert_has_calls([mock.call(*self.FAKE_EVENT), mock.call(*self.FAKE_EVENT)],
                                     any_order=True)

  def test_run_failed_callback(self):
    with self.mocked_run() as mock_callback:
      self.mock_watchman.subscribed.return_value = self.FAKE_EVENT_STREAM
      mock_callback.side_effect = [False, True]
      self.service.run()
      mock_callback.assert_has_calls([mock.call(*self.FAKE_EVENT), mock.call(*self.FAKE_EVENT)],
                                     any_order=True)

  def test_run_breaks_on_kill_switch(self):
    with self.mocked_run() as mock_callback:
      self.service.terminate()
      self.mock_watchman.subscribed.return_value = self.FAKE_EVENT_STREAM
      self.service.run()
      assert not mock_callback.called
Exemplo n.º 4
0
class TestFSEventService(BaseTest):
    PATCH_OPTS = dict(autospec=True, spec_set=True)
    BUILD_ROOT = '/build_root'
    EMPTY_EVENT = (None, None)
    FAKE_EVENT = ('test',
                  dict(subscription='test', files=['a/BUILD', 'b/BUILD']))
    FAKE_EVENT_STREAM = [
        FAKE_EVENT, EMPTY_EVENT, EMPTY_EVENT, FAKE_EVENT, EMPTY_EVENT
    ]

    def setUp(self):
        BaseTest.setUp(self)
        self.service = FSEventService(self.BUILD_ROOT, TestExecutor())
        self.service.register_simple_handler('test', lambda x: True)
        self.service.register_simple_handler('test2', lambda x: False)

    def test_register_simple_handler(self):
        # N.B. This test implicitly tests register_handler; no need to duplicate work.
        self.assertTrue('test' in self.service._handlers)
        self.assertTrue('test2' in self.service._handlers)
        self.assertIsInstance(self.service._handlers['test'],
                              Watchman.EventHandler)
        self.assertIsInstance(self.service._handlers['test2'],
                              Watchman.EventHandler)

    def test_register_simple_handler_duplicate(self):
        with self.assertRaises(AssertionError):
            self.service.register_simple_handler('test', lambda x: True)

    def test_register_handler_duplicate(self):
        with self.assertRaises(AssertionError):
            self.service.register_handler('test', 'test', lambda x: True)

        with self.assertRaises(AssertionError):
            self.service.register_handler('test', dict(test=1), lambda x: True)

    def test_fire_callback(self):
        self.assertTrue(self.service.fire_callback('test', {}))
        self.assertFalse(self.service.fire_callback('test2', {}))

    @contextmanager
    def mocked_run(self, asserts=True):
        with mock.patch('pants.pantsd.service.fs_event_service.WatchmanLauncher',
                        **self.PATCH_OPTS) as mock_watchman_launcher, \
             mock.patch('pants.pantsd.service.fs_event_service.Watchman',
                        **self.PATCH_OPTS) as mock_watchman:
            mock_watchman_launcher.global_instance.return_value = mock_watchman_launcher
            mock_watchman_launcher.maybe_launch.return_value = mock_watchman
            self.service.fire_callback = mock.Mock()
            yield mock_watchman, mock_watchman_launcher, self.service.fire_callback
            if asserts:
                mock_watchman.watch_project.assert_called_once_with(
                    self.BUILD_ROOT)

    def test_run_raise_on_failure_isalive(self):
        with self.mocked_run(False) as (mock_watchman, mock_watchman_launcher,
                                        mock_callback):
            with self.assertRaises(self.service.ServiceError):
                mock_watchman.is_alive.return_value = False
                self.service.run()

    def test_run_raise_on_failure_launch(self):
        with self.mocked_run(False) as (mock_watchman, mock_watchman_launcher,
                                        mock_callback):
            with self.assertRaises(self.service.ServiceError):
                mock_watchman_launcher.maybe_launch.return_value = False
                self.service.run()

    def test_run(self):
        with self.mocked_run() as (mock_watchman, mock_watchman_launcher,
                                   mock_callback):
            mock_watchman.subscribed.return_value = self.FAKE_EVENT_STREAM
            self.service.run()
            mock_callback.assert_has_calls(
                [mock.call(*self.FAKE_EVENT),
                 mock.call(*self.FAKE_EVENT)],
                any_order=True)

    def test_run_failed_callback(self):
        with self.mocked_run() as (mock_watchman, mock_watchman_launcher,
                                   mock_callback):
            mock_watchman.subscribed.return_value = self.FAKE_EVENT_STREAM
            mock_callback.side_effect = [False, True]
            self.service.run()
            mock_callback.assert_has_calls(
                [mock.call(*self.FAKE_EVENT),
                 mock.call(*self.FAKE_EVENT)],
                any_order=True)

    def test_run_breaks_on_kill_switch(self):
        with self.mocked_run() as (mock_watchman, mock_watchman_launcher,
                                   mock_callback):
            self.service.terminate()
            mock_watchman.subscribed.return_value = self.FAKE_EVENT_STREAM
            self.service.run()
            assert not mock_callback.called
Exemplo n.º 5
0
class TestFSEventService(BaseTest):
  PATCH_OPTS = dict(autospec=True, spec_set=True)
  BUILD_ROOT = '/build_root'
  EMPTY_EVENT = (None, None)
  FAKE_EVENT = ('test', dict(subscription='test', files=['a/BUILD', 'b/BUILD']))
  FAKE_EVENT_STREAM = [FAKE_EVENT, EMPTY_EVENT, EMPTY_EVENT, FAKE_EVENT, EMPTY_EVENT]

  def setUp(self):
    BaseTest.setUp(self)
    self.service = FSEventService(self.BUILD_ROOT, TestExecutor())
    self.service.register_simple_handler('test', lambda x: True)
    self.service.register_simple_handler('test2', lambda x: False)

  def test_register_simple_handler(self):
    # N.B. This test implicitly tests register_handler; no need to duplicate work.
    self.assertTrue('test' in self.service._handlers)
    self.assertTrue('test2' in self.service._handlers)
    self.assertIsInstance(self.service._handlers['test'], Watchman.EventHandler)
    self.assertIsInstance(self.service._handlers['test2'], Watchman.EventHandler)

  def test_register_simple_handler_duplicate(self):
    with self.assertRaises(AssertionError):
      self.service.register_simple_handler('test', lambda x: True)

  def test_register_handler_duplicate(self):
    with self.assertRaises(AssertionError):
      self.service.register_handler('test', 'test', lambda x: True)

    with self.assertRaises(AssertionError):
      self.service.register_handler('test', dict(test=1), lambda x: True)

  def test_fire_callback(self):
    self.assertTrue(self.service.fire_callback('test', {}))
    self.assertFalse(self.service.fire_callback('test2', {}))

  @contextmanager
  def mocked_run(self, asserts=True):
    with mock.patch('pants.pantsd.service.fs_event_service.WatchmanLauncher',
                    **self.PATCH_OPTS) as mock_watchman_launcher, \
         mock.patch('pants.pantsd.service.fs_event_service.Watchman',
                    **self.PATCH_OPTS) as mock_watchman:
      mock_watchman_launcher.global_instance.return_value = mock_watchman_launcher
      mock_watchman_launcher.maybe_launch.return_value = mock_watchman
      self.service.fire_callback = mock.Mock()
      yield mock_watchman, mock_watchman_launcher, self.service.fire_callback
      if asserts:
        mock_watchman.watch_project.assert_called_once_with(self.BUILD_ROOT)

  def test_run_raise_on_failure_isalive(self):
    with self.mocked_run(False) as (mock_watchman, mock_watchman_launcher, mock_callback):
      with self.assertRaises(self.service.ServiceError):
        mock_watchman.is_alive.return_value = False
        self.service.run()

  def test_run_raise_on_failure_launch(self):
    with self.mocked_run(False) as (mock_watchman, mock_watchman_launcher, mock_callback):
      with self.assertRaises(self.service.ServiceError):
        mock_watchman_launcher.maybe_launch.return_value = False
        self.service.run()

  def test_run(self):
    with self.mocked_run() as (mock_watchman, mock_watchman_launcher, mock_callback):
      mock_watchman.subscribed.return_value = self.FAKE_EVENT_STREAM
      self.service.run()
      mock_callback.assert_has_calls([mock.call(*self.FAKE_EVENT), mock.call(*self.FAKE_EVENT)],
                                     any_order=True)

  def test_run_failed_callback(self):
    with self.mocked_run() as (mock_watchman, mock_watchman_launcher, mock_callback):
      mock_watchman.subscribed.return_value = self.FAKE_EVENT_STREAM
      mock_callback.side_effect = [False, True]
      self.service.run()
      mock_callback.assert_has_calls([mock.call(*self.FAKE_EVENT), mock.call(*self.FAKE_EVENT)],
                                     any_order=True)

  def test_run_breaks_on_kill_switch(self):
    with self.mocked_run() as (mock_watchman, mock_watchman_launcher, mock_callback):
      self.service.terminate()
      mock_watchman.subscribed.return_value = self.FAKE_EVENT_STREAM
      self.service.run()
      assert not mock_callback.called