class TestDriver(TestCase): """ Unit-test tests of the Driver. """ def setUp(self): self.m_sck = Mock(spec=socket.socket) self.driver = EtcdDriver(self.m_sck) self.msg_reader = StubMessageReader(self.m_sck) self.msg_writer = StubMessageWriter(self.m_sck) self.driver._msg_reader = self.msg_reader self.driver._msg_writer = self.msg_writer def test_read_bad_message(self): self.msg_reader.send_msg("unknown", {}) self.assertRaises(RuntimeError, self.driver._read_from_socket) def test_read_socket_closed(self): self.msg_reader.send_exception(SocketClosed()) self.driver._read_from_socket() def test_read_driver_shutdown(self): self.msg_reader.send_exception(DriverShutdown()) self.driver._read_from_socket() def test_shutdown_before_config(self): self.driver._stop_event.set() self.assertRaises(DriverShutdown, self.driver._wait_for_config) def test_shutdown_before_ready(self): self.driver._stop_event.set() self.assertRaises(DriverShutdown, self.driver._wait_for_ready) def test_issue_etcd_request_basic_get(self): # Initialise the etcd URL. self.driver._handle_init({ MSG_KEY_ETCD_URL: "http://*****:*****@patch("time.sleep") def test_resync_http_error(self, m_sleep): self.driver._init_received.set() with patch.object(self.driver, "get_etcd_connection") as m_get: with patch("calico.etcddriver.driver.monotonic_time") as m_time: m_time.side_effect = iter([1, 10, RuntimeError()]) m_get.side_effect = HTTPError() self.assertRaises(RuntimeError, self.driver._resync_and_merge) def test_parse_snap_error_from_etcd(self): parser = ijson.parse(StringIO(json.dumps({"errorCode": 100}))) next(parser) self.assertRaises(ResyncRequired, driver._parse_map, parser, None) def test_parse_snap_bad_data(self): parser = ijson.parse(StringIO(json.dumps({"nodes": ["foo"]}))) next(parser) self.assertRaises(ValueError, driver._parse_map, parser, None) def test_join_not_stopped(self): with patch.object(self.driver._stop_event, "wait"): self.assertFalse(self.driver.join()) def test_process_events_stopped(self): self.driver._stop_event.set() self.assertRaises(DriverShutdown, self.driver._process_events_only) def test_watch_etcd_already_stopped(self): stop_event = threading.Event() stop_event.set() m_queue = Mock() self.driver.watch_etcd(10, m_queue, stop_event) self.assertEqual(m_queue.put.mock_calls, [call(None)]) def test_watch_etcd_driver_shutdown(self): stop_event = threading.Event() self.driver.get_etcd_connection = Mock() self.driver._etcd_request = Mock() self.driver._check_cluster_id = Mock(side_effect=DriverShutdown()) # Should return without exception. m_queue = Mock() self.driver.watch_etcd(10, m_queue, stop_event) # And send it's normal shutdown signal. self.assertEqual(m_queue.put.mock_calls, [call(None)])
class TestDriver(TestCase): """ Unit-test tests of the Driver. """ def setUp(self): self.m_sck = Mock(spec=socket.socket) self.driver = EtcdDriver(self.m_sck) self.msg_reader = StubMessageReader(self.m_sck) self.msg_writer = StubMessageWriter(self.m_sck) self.driver._msg_reader = self.msg_reader self.driver._msg_writer = self.msg_writer def test_read_bad_message(self): self.msg_reader.send_msg("unknown", {}) self.assertRaises(RuntimeError, self.driver._read_from_socket) def test_read_socket_closed(self): self.msg_reader.send_exception(SocketClosed()) self.driver._read_from_socket() def test_read_driver_shutdown(self): self.msg_reader.send_exception(DriverShutdown()) self.driver._read_from_socket() def test_shutdown_before_config(self): self.driver._stop_event.set() self.assertRaises(DriverShutdown, self.driver._wait_for_config) def test_shutdown_before_ready(self): self.driver._stop_event.set() self.assertRaises(DriverShutdown, self.driver._wait_for_ready) def test_issue_etcd_request_basic_get(self): # Initialise the etcd URL. self.driver._handle_init({ MSG_KEY_ETCD_URLS: ["http://*****:*****@patch("time.sleep") def test_resync_http_error(self, m_sleep): self.driver._init_received.set() with patch.object(self.driver, "get_etcd_connection") as m_get: with patch("calico.etcddriver.driver.monotonic_time") as m_time: m_time.side_effect = iter([ 1, 10, RuntimeError() ]) m_get.side_effect = HTTPError() self.assertRaises(RuntimeError, self.driver._resync_and_merge) def test_parse_snap_error_from_etcd(self): parser = ijson.parse(StringIO(json.dumps({ "errorCode": 100 }))) next(parser) self.assertRaises(ResyncRequired, driver._parse_map, parser, None) def test_parse_snap_bad_data(self): parser = ijson.parse(StringIO(json.dumps({ "nodes": [ "foo" ] }))) next(parser) self.assertRaises(ValueError, driver._parse_map, parser, None) def test_join_not_stopped(self): with patch.object(self.driver._stop_event, "wait"): self.assertFalse(self.driver.join()) def test_process_events_stopped(self): self.driver._stop_event.set() self.assertRaises(DriverShutdown, self.driver._process_events_only) def test_watch_etcd_already_stopped(self): stop_event = threading.Event() stop_event.set() m_queue = Mock() self.driver.watch_etcd(10, m_queue, stop_event) self.assertEqual(m_queue.put.mock_calls, [call(None)]) def test_watch_etcd_driver_shutdown(self): stop_event = threading.Event() self.driver.get_etcd_connection = Mock() self.driver._etcd_request = Mock() self.driver._check_cluster_id = Mock(side_effect=DriverShutdown()) # Should return without exception. m_queue = Mock() self.driver.watch_etcd(10, m_queue, stop_event) # And send it's normal shutdown signal. self.assertEqual(m_queue.put.mock_calls, [call(None)]) @patch("calico.etcddriver.driver.complete_logging", autospec=True) @patch("calico.etcddriver.driver.start_http_server", autospec=True) def test_handle_config_starts_metrics(self, start_http, compl_log): self.driver._handle_config({ MSG_KEY_LOG_FILE: "/tmp/driver.log", MSG_KEY_SEV_FILE: "DEBUG", MSG_KEY_SEV_SCREEN: "INFO", MSG_KEY_SEV_SYSLOG: "WARNING", MSG_KEY_PROM_PORT: 9092, }) start_http.assert_called_once_with(9092) compl_log.assert_called_once_with("/tmp/driver.log", file_level="DEBUG", syslog_level="WARNING", stream_level="INFO", gevent_in_use=False)