def test_https(): conn = mock.MagicMock(spec=httplib.HTTPSConnection) api = API('localhost', 8126, https=True) with mock.patch('ddtrace.compat.httplib.HTTPSConnection') as HTTPSConnection: HTTPSConnection.return_value = conn api._put('/test', '<test data>', 1) conn.request.assert_called_once() conn.close.assert_called_once()
class APITests(TestCase): def setUp(self): # DEV: Mock here instead of in tests, before we have patched `httplib.HTTPConnection` self.conn = mock.MagicMock(spec=httplib.HTTPConnection) self.api = API('localhost', 8126) def tearDown(self): del self.api del self.conn def test_typecast_port(self): api = API('localhost', u'8126') self.assertEqual(api.port, 8126) @mock.patch('logging.Logger.debug') def test_parse_response_json(self, log): tracer = get_dummy_tracer() tracer.debug_logging = True test_cases = { 'OK': dict( js=None, log= 'Cannot parse Datadog Agent response, please make sure your Datadog Agent is up to date', ), 'OK\n': dict( js=None, log= 'Cannot parse Datadog Agent response, please make sure your Datadog Agent is up to date', ), 'error:unsupported-endpoint': dict( js=None, log= 'Unable to parse Datadog Agent JSON response: .*? \'error:unsupported-endpoint\'', ), 42: dict( # int as key to trigger TypeError js=None, log='Unable to parse Datadog Agent JSON response: .*? 42', ), '{}': dict(js={}), '[]': dict(js=[]), # Priority sampling "rate_by_service" response ('{"rate_by_service": ' '{"service:,env:":0.5, "service:mcnulty,env:test":0.9, "service:postgres,env:test":0.6}}'): dict(js=dict(rate_by_service={ 'service:,env:': 0.5, 'service:mcnulty,env:test': 0.9, 'service:postgres,env:test': 0.6, }, ), ), ' [4,2,1] ': dict(js=[4, 2, 1]), } for k, v in iteritems(test_cases): log.reset_mock() r = Response.from_http_response(ResponseMock(k)) js = r.get_json() assert v['js'] == js if 'log' in v: log.assert_called_once() msg = log.call_args[0][0] % log.call_args[0][1:] assert re.match(v['log'], msg), msg @mock.patch('ddtrace.compat.httplib.HTTPConnection') def test_put_connection_close(self, HTTPConnection): """ When calling API._put we close the HTTPConnection we create """ HTTPConnection.return_value = self.conn with warnings.catch_warnings(record=True) as w: self.api._put('/test', '<test data>', 1) self.assertEqual( len(w), 0, 'Test raised unexpected warnings: {0!r}'.format(w)) self.conn.request.assert_called_once() self.conn.close.assert_called_once() @mock.patch('ddtrace.compat.httplib.HTTPConnection') def test_put_connection_close_exception(self, HTTPConnection): """ When calling API._put raises an exception we close the HTTPConnection we create """ HTTPConnection.return_value = self.conn # Ensure calling `request` raises an exception self.conn.request.side_effect = Exception with warnings.catch_warnings(record=True) as w: with self.assertRaises(Exception): self.api._put('/test', '<test data>', 1) self.assertEqual( len(w), 0, 'Test raised unexpected warnings: {0!r}'.format(w)) self.conn.request.assert_called_once() self.conn.close.assert_called_once()
class APITests(TestCase): def setUp(self): # DEV: Mock here instead of in tests, before we have patched `httplib.HTTPConnection` self.conn = mock.MagicMock(spec=httplib.HTTPConnection) self.api = API('localhost', 8126) def tearDown(self): del self.api del self.conn @mock.patch('logging.Logger.debug') def test_parse_response_json(self, log): tracer = get_dummy_tracer() tracer.debug_logging = True test_cases = { 'OK': {'js': None, 'log': "please make sure trace-agent is up to date"}, 'OK\n': {'js': None, 'log': "please make sure trace-agent is up to date"}, 'error:unsupported-endpoint': {'js': None, 'log': "unable to load JSON 'error:unsupported-endpoint'"}, 42: {'js': None, 'log': "unable to load JSON '42'"}, # int as key to trigger TypeError '{}': {'js': {}}, '[]': {'js': []}, '{"rate_by_service": {"service:,env:":0.5, "service:mcnulty,env:test":0.9, "service:postgres,env:test":0.6}}': { # noqa 'js': { 'rate_by_service': { 'service:,env:': 0.5, 'service:mcnulty,env:test': 0.9, 'service:postgres,env:test': 0.6, }, }, }, ' [4,2,1] ': {'js': [4, 2, 1]}, } for k, v in iteritems(test_cases): r = ResponseMock(k) js = _parse_response_json(r) eq_(v['js'], js) if 'log' in v: ok_( 1 <= len(log.call_args_list), 'not enough elements in call_args_list: {}'.format( log.call_args_list), ) print(log.call_args_list) args = log.call_args_list[-1][0][0] ok_(v['log'] in args, 'unable to find {} in {}'.format(v['log'], args)) @mock.patch('ddtrace.compat.httplib.HTTPConnection') def test_put_connection_close(self, HTTPConnection): """ When calling API._put we close the HTTPConnection we create """ HTTPConnection.return_value = self.conn with warnings.catch_warnings(record=True) as w: self.api._put('/test', '<test data>', 1) self.assertEqual( len(w), 0, 'Test raised unexpected warnings: {0!r}'.format(w)) self.conn.request.assert_called_once() self.conn.close.assert_called_once() @mock.patch('ddtrace.compat.httplib.HTTPConnection') def test_put_connection_close_exception(self, HTTPConnection): """ When calling API._put raises an exception we close the HTTPConnection we create """ HTTPConnection.return_value = self.conn # Ensure calling `request` raises an exception self.conn.request.side_effect = Exception with warnings.catch_warnings(record=True) as w: with self.assertRaises(Exception): self.api._put('/test', '<test data>', 1) self.assertEqual( len(w), 0, 'Test raised unexpected warnings: {0!r}'.format(w)) self.conn.request.assert_called_once() self.conn.close.assert_called_once()
class APITests(TestCase): def setUp(self): # DEV: Mock here instead of in tests, before we have patched `httplib.HTTPConnection` self.conn = mock.MagicMock(spec=httplib.HTTPConnection) self.api = API("localhost", 8126) def tearDown(self): del self.api del self.conn def test_typecast_port(self): api = API("localhost", u"8126") self.assertEqual(api.port, 8126) @mock.patch("logging.Logger.debug") def test_parse_response_json(self, log): test_cases = { "OK": dict( js=None, log= "Cannot parse Datadog Agent response, please make sure your Datadog Agent is up to date", ), "OK\n": dict( js=None, log= "Cannot parse Datadog Agent response, please make sure your Datadog Agent is up to date", ), "error:unsupported-endpoint": dict( js=None, log= "Unable to parse Datadog Agent JSON response: 'error:unsupported-endpoint'", ), 42: dict( # int as key to trigger TypeError js=None, log="Unable to parse Datadog Agent JSON response: 42", ), "{}": dict(js={}), "[]": dict(js=[]), # Priority sampling "rate_by_service" response ('{"rate_by_service": ' '{"service:,env:":0.5, "service:mcnulty,env:test":0.9, "service:postgres,env:test":0.6}}'): dict(js=dict(rate_by_service={ "service:,env:": 0.5, "service:mcnulty,env:test": 0.9, "service:postgres,env:test": 0.6, }, ), ), " [4,2,1] ": dict(js=[4, 2, 1]), } for k, v in iteritems(test_cases): log.reset_mock() r = Response.from_http_response(ResponseMock(k)) js = r.get_json() assert v["js"] == js if "log" in v: log.assert_called_once() msg = log.call_args[0][0] % log.call_args[0][1:] assert re.match(v["log"], msg), msg @mock.patch("ddtrace.compat.httplib.HTTPConnection") def test_put_connection_close(self, HTTPConnection): """ When calling API._put we close the HTTPConnection we create """ HTTPConnection.return_value = self.conn with warnings.catch_warnings(record=True) as w: self.api._put("/test", "<test data>", 1) self.assertEqual( len(w), 0, "Test raised unexpected warnings: {0!r}".format(w)) self.conn.request.assert_called_once() self.conn.close.assert_called_once() @mock.patch("ddtrace.compat.httplib.HTTPConnection") def test_put_connection_close_exception(self, HTTPConnection): """ When calling API._put raises an exception we close the HTTPConnection we create """ HTTPConnection.return_value = self.conn # Ensure calling `request` raises an exception self.conn.request.side_effect = Exception with warnings.catch_warnings(record=True) as w: with self.assertRaises(Exception): self.api._put("/test", "<test data>", 1) self.assertEqual( len(w), 0, "Test raised unexpected warnings: {0!r}".format(w)) self.conn.request.assert_called_once() self.conn.close.assert_called_once()