def setUp(self, docker_mock): self.on_change = Mock() self.docker_client_mock = Mock() docker_mock.from_env.return_value = self.docker_client_mock self.events_mock = Mock() self.docker_client_mock.events.return_value = self.events_mock self.image_observer = ImageObserver(self.on_change)
class ImageObserver_start(TestCase): @patch("samcli.lib.utils.file_observer.docker") def setUp(self, docker_mock): self.on_change = Mock() self.docker_client_mock = Mock() docker_mock.from_env.return_value = self.docker_client_mock self.events_mock = Mock() self.docker_client_mock.events.return_value = self.events_mock self.image_observer = ImageObserver(self.on_change) @patch("samcli.lib.utils.file_observer.threading") def test_successfully_start_observing(self, threading_mock): thread_mock = Mock() threading_mock.Thread.return_value = thread_mock self.image_observer.start() threading_mock.Thread.assert_called_once_with( target=self.image_observer._watch_images_events, daemon=True) thread_mock.start.assert_called_once_with() @patch("samcli.lib.utils.file_observer.threading") def test_observing_thread_start_one_time_only(self, threading_mock): thread_mock = Mock() threading_mock.Thread.return_value = thread_mock self.image_observer.start() self.image_observer.start() threading_mock.Thread.assert_called_once_with( target=self.image_observer._watch_images_events, daemon=True) thread_mock.start.assert_called_once_with()
class ImageObserver_watch(TestCase): @patch("samcli.lib.utils.file_observer.docker") def setUp(self, docker_mock): self.on_change = Mock() self.docker_client_mock = Mock() docker_mock.from_env.return_value = self.docker_client_mock self.events_mock = Mock() self.docker_client_mock.events.return_value = self.events_mock self.image_observer = ImageObserver(self.on_change) def test_successfully_watch_exist_image(self): image_name = "test_image:test_version" image_mock = Mock() id_mock = Mock() image_mock.id = id_mock self.docker_client_mock.images.get.return_value = image_mock self.image_observer.watch(image_name) self.assertEqual( { image_name: id_mock, }, self.image_observer._observed_images, ) self.docker_client_mock.images.get.assert_called_with(image_name) def test_ImageObserverException_raised_for_not_exist_image(self): image_name = "test_image:test_version" self.docker_client_mock.images.get.side_effect = ImageNotFound("") with self.assertRaises(ImageObserverException): self.image_observer.watch(image_name) self.docker_client_mock.images.get.assert_called_with(image_name)
def setUp(self, docker_mock, threading_mock): self.on_change = Mock() self.docker_client_mock = Mock() docker_mock.from_env.return_value = self.docker_client_mock self.events_mock = Mock() self.docker_client_mock.events.return_value = self.events_mock self.image_observer = ImageObserver(self.on_change) self.thread_mock = Mock() threading_mock.Thread.return_value = self.thread_mock self.image_observer.start()
def setUp(self, docker_mock): self.on_change = Mock() self.docker_client_mock = Mock() docker_mock.from_env.return_value = self.docker_client_mock self.events_mock = Mock() self.docker_client_mock.events.return_value = self.events_mock self.image_observer = ImageObserver(self.on_change) self.image_name = "test_image:test_version" image_mock = Mock() self.id_mock = Mock() image_mock.id = self.id_mock self.docker_client_mock.images.get.return_value = image_mock self.image_observer.watch(self.image_name)
class ImageObserver_stop(TestCase): @patch("samcli.lib.utils.file_observer.threading") @patch("samcli.lib.utils.file_observer.docker") def setUp(self, docker_mock, threading_mock): self.on_change = Mock() self.docker_client_mock = Mock() docker_mock.from_env.return_value = self.docker_client_mock self.events_mock = Mock() self.docker_client_mock.events.return_value = self.events_mock self.image_observer = ImageObserver(self.on_change) self.thread_mock = Mock() threading_mock.Thread.return_value = self.thread_mock self.image_observer.start() def test_successfully_stop_observing(self): self.thread_mock.is_alive.side_effect = [True, False, False] self.image_observer.stop() self.events_mock.close.assert_called_once_with() self.assertEqual(self.thread_mock.is_alive.call_count, 2)
class ImageObserver_unwatch(TestCase): @patch("samcli.lib.utils.file_observer.docker") def setUp(self, docker_mock): self.on_change = Mock() self.docker_client_mock = Mock() docker_mock.from_env.return_value = self.docker_client_mock self.events_mock = Mock() self.docker_client_mock.events.return_value = self.events_mock self.image_observer = ImageObserver(self.on_change) self.image_name = "test_image:test_version" image_mock = Mock() self.id_mock = Mock() image_mock.id = self.id_mock self.docker_client_mock.images.get.return_value = image_mock self.image_observer.watch(self.image_name) def test_successfully_unwatch_observed_image(self): self.image_observer.unwatch(self.image_name) self.assertEqual({}, self.image_observer._observed_images) def test_no_exception_unwatch_non_observed_image(self): self.image_observer.unwatch("any_image") self.assertEqual( { self.image_name: self.id_mock, }, self.image_observer._observed_images, )
def test_image_observer_initiated_successfully(self, docker_mock, threading_mock): on_change = Mock() docker_client_mock = Mock() docker_mock.from_env.return_value = docker_client_mock events_mock = Mock() docker_client_mock.events.return_value = events_mock lock_mock = Mock() threading_mock.Lock.return_value = lock_mock image_observer = ImageObserver(on_change) self.assertEqual(image_observer._observed_images, {}) self.assertEqual(image_observer._input_on_change, on_change) self.assertEqual(image_observer.docker_client, docker_client_mock) self.assertEqual(image_observer.events, events_mock) self.assertEqual(image_observer._images_observer_thread, None) self.assertEqual(image_observer._lock, lock_mock)
class ImageObserver_watch_images_events(TestCase): @patch("samcli.lib.utils.file_observer.docker") def setUp(self, docker_mock): self.on_change = Mock() self.docker_client_mock = Mock() docker_mock.from_env.return_value = self.docker_client_mock self.mocked_events_list = [] self.events_mock = iter(self.mocked_events_list) self.docker_client_mock.events.return_value = self.events_mock self.image_observer = ImageObserver(self.on_change) self.image_name = "test_image:test_version" image_mock = Mock() self.id_mock = Mock() image_mock.id = self.id_mock self.docker_client_mock.images.get.return_value = image_mock self.image_observer.watch(self.image_name) def test_invoke_input_on_change_handler_if_image_id_changed(self): new_id_mock = Mock() self.mocked_events_list += [{ "Action": "tag", "id": new_id_mock, "Actor": { "Attributes": { "name": self.image_name } } }] self.image_observer._watch_images_events() self.assertEqual({self.image_name: new_id_mock}, self.image_observer._observed_images) self.on_change.assert_called_once_with([self.image_name]) def test_input_on_change_handler_not_invoked_if_image_id_not_changed(self): self.mocked_events_list += [{ "Action": "tag", "id": self.id_mock, "Actor": { "Attributes": { "name": self.image_name } } }] self.image_observer._watch_images_events() self.assertEqual({self.image_name: self.id_mock}, self.image_observer._observed_images) self.on_change.assert_not_called() def test_skip_non_observed_images(self): image_name = "any_image" self.mocked_events_list += [{ "Action": "tag", "id": self.id_mock, "Actor": { "Attributes": { "name": image_name } } }] self.image_observer._watch_images_events() self.assertEqual({self.image_name: self.id_mock}, self.image_observer._observed_images) self.on_change.assert_not_called() def test_skip_non_tag_events(self): new_id_mock = Mock() self.mocked_events_list += [{ "Action": "Create", "id": new_id_mock, "Actor": { "Attributes": { "name": self.image_name } } }] self.image_observer._watch_images_events() self.assertEqual({self.image_name: self.id_mock}, self.image_observer._observed_images) self.on_change.assert_not_called()