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()
Beispiel #2
0
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()
Beispiel #3
0
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()
Beispiel #4
0
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()