示例#1
0
def test_set_error_sanity():
    event = RunnerEventMock()
    trace = trace_factory.get_or_create_trace()
    trace.clear_events()
    trace.set_runner(event)
    msg = 'oops'
    trace.set_error(ValueError(msg))

    assert trace.to_dict()['events'][0]['exception']['message'] == msg
    assert len(trace.to_dict()['events'][0]['exception']['traceback']) > 1
示例#2
0
def test_set_error_string():
    event = RunnerEventMock()
    trace = trace_factory.get_or_create_trace()
    trace.clear_events()
    trace.set_runner(event)
    msg = 'oops'
    trace.set_error(msg)

    assert trace.to_dict()['events'][0]['exception']['message'] == msg
    assert trace.to_dict()['events'][0]['exception']['type'] == (
        EpsagonException.__name__)
示例#3
0
def test_set_error_with_traceback():
    event = RunnerEventMock()
    trace = trace_factory.get_or_create_trace()
    trace.clear_events()
    trace.set_runner(event)
    msg = 'oops'
    traceback_data = 'test_value'
    trace.set_error(ValueError(msg), traceback_data=traceback_data)

    assert trace.to_dict()['events'][0]['exception']['message'] == msg
    assert (trace.to_dict()['events'][0]['exception']['traceback'] ==
            traceback_data)
示例#4
0
def test_return_value_key_to_ignore(wrapped_post):
    key_to_ignore = 'key_to_ignore_in_return_value'
    os.environ['EPSAGON_IGNORED_KEYS'] = key_to_ignore
    keys_to_ignore = [key_to_ignore]
    # reset traces created at setup function
    trace_factory.traces = {}
    epsagon.utils.init(token='token',
                       app_name='app-name',
                       collector_url='collector',
                       metadata_only=False)

    trace = trace_factory.get_or_create_trace()
    return_value = {
        key_to_ignore: 'f',
        's': {
            'a': 1,
            'b': 2,
            'c': {
                'f': 1,
                key_to_ignore: '1',
                'g': {
                    key_to_ignore: '1'
                }
            }
        }
    }
    copied_return_value = return_value.copy()
    runner = ReturnValueEventMock(return_value)
    trace.set_runner(runner)
    trace.token = 'a'
    trace_factory.send_traces()

    assert len(trace.to_dict()['events']) == 1
    event = trace.to_dict()['events'][0]
    assert event['origin'] == 'runner'
    actual_return_value = event['resource']['metadata']['return_value']
    _assert_key_not_exist(actual_return_value, key_to_ignore)
    # check that original return value hasn't been changed
    assert copied_return_value == return_value

    wrapped_post.assert_called_with(
        'collector',
        data=json.dumps(trace.to_dict()),
        timeout=epsagon.constants.SEND_TIMEOUT,
        headers={'Authorization': 'Bearer {}'.format(trace.token)})
    os.environ.pop('EPSAGON_IGNORED_KEYS')
def test_send_invalid_return_value(wrapped_post):
    trace = trace_factory.get_or_create_trace()
    runner = InvalidReturnValueEventMock()
    trace.set_runner(runner)
    trace_factory.send_traces()

    assert len(trace.to_dict()['events']) == 1
    event = trace.to_dict()['events'][0]
    assert event['origin'] == 'runner'
    actual_return_value = event['resource']['metadata']['return_value']
    assert actual_return_value == FAILED_TO_SERIALIZE_MESSAGE

    wrapped_post.assert_called_with(
        'POST',
        'collector',
        body=json.dumps(trace.to_dict()),
        timeout=epsagon.constants.SEND_TIMEOUT,
    )
def test_send_traces_sanity(wrapped_post):
    trace = trace_factory.get_or_create_trace()
    trace_factory.send_traces()
    wrapped_post.assert_called_with(
        'POST',
        'collector',
        body=json.dumps(trace.to_dict()),
        timeout=epsagon.constants.SEND_TIMEOUT,
    )
示例#7
0
def test_send_traces_sanity(wrapped_post):
    trace = trace_factory.get_or_create_trace()
    trace.token = 'a'
    trace_factory.send_traces()
    wrapped_post.assert_called_with(
        '',
        data=json.dumps(trace.to_dict()),
        timeout=epsagon.constants.SEND_TIMEOUT,
        headers={'Authorization': 'Bearer {}'.format(trace.token)})
示例#8
0
def test_send_invalid_return_value(wrapped_post):
    trace = trace_factory.get_or_create_trace()
    runner = InvalidReturnValueEventMock()
    trace.set_runner(runner)
    trace.token = 'a'
    trace_factory.send_traces()

    assert len(trace.to_dict()['events']) == 1
    event = trace.to_dict()['events'][0]
    assert event['origin'] == 'runner'
    actual_return_value = event['resource']['metadata']['return_value']
    assert actual_return_value == FAILED_TO_SERIALIZE_MESSAGE

    wrapped_post.assert_called_with(
        '',
        data=json.dumps(trace.to_dict()),
        timeout=epsagon.constants.SEND_TIMEOUT,
        headers={'Authorization': 'Bearer {}'.format(trace.token)})
def test_send_traces_unicode(wrapped_post):
    trace = trace_factory.get_or_create_trace()
    runner = UnicodeReturnValueEventMock()
    trace.set_runner(runner)
    trace_factory.send_traces()
    wrapped_post.assert_called_with(
        'POST',
        'collector',
        body=json.dumps(trace.to_dict(), ensure_ascii=False),
        timeout=epsagon.constants.SEND_TIMEOUT,
    )
示例#10
0
def test_to_dict():
    trace = epsagon.trace.Trace()
    expected_dict = {
        'token': 'token',
        'app_name': 'app_name',
        'events': [EventMockWithCounter(i) for i in range(10)],
        'exceptions': 'exceptions',
        'version': 'version',
        'platform': 'platform'
    }

    trace.token = expected_dict['token']
    trace.app_name = expected_dict['app_name']
    for event in [EventMockWithCounter(i) for i in range(10)]:
        trace.add_event(event)
    trace.exceptions = expected_dict['exceptions']
    trace.version = expected_dict['version']
    trace.platform = expected_dict['platform']
    trace_dict = trace.to_dict()
    assert trace_dict == trace.to_dict()
示例#11
0
def test_custom_labels_override_trace():
    event = RunnerEventMock()
    trace = trace_factory.get_or_create_trace()
    trace.clear_events()
    trace.set_runner(event)
    trace.add_label('test_label', 'test_value1')
    trace.add_label('test_label', 'test_value2')
    trace_metadata = trace.to_dict()['events'][0]['resource']['metadata']

    assert trace_metadata.get('labels') is not None
    assert json.loads(trace_metadata['labels']) == {'test_label': 'test_value2'}
示例#12
0
def test_metadata_field_too_big(wrapped_post):
    trace = trace_factory.get_or_create_trace()
    max_size = MAX_METADATA_FIELD_SIZE_LIMIT
    return_value = {'1': 'a' * (max_size + 1)}
    runner = ReturnValueEventMock(return_value)
    trace.set_runner(runner)
    trace.token = 'a'
    trace_factory.send_traces()

    assert len(trace.to_dict()['events']) == 1
    event = trace.to_dict()['events'][0]
    assert event['origin'] == 'runner'
    actual_return_value = event['resource']['metadata']['return_value']
    assert actual_return_value == json.dumps(return_value)[:max_size]

    wrapped_post.assert_called_with(
        '',
        data=json.dumps(trace.to_dict()),
        timeout=epsagon.constants.SEND_TIMEOUT,
        headers={'Authorization': 'Bearer {}'.format(trace.token)})
def test_send_big_trace(wrapped_post):
    trace = trace_factory.get_or_create_trace()
    runner = RunnerEventMock()

    trace.set_runner(runner)

    for _ in range(2):
        trace.add_event(BigEventMock())
    trace_factory.send_traces()

    assert len(trace.to_dict()['events']) == 3
    for event in trace.to_dict()['events']:
        if event['origin'] == 'runner':
            assert event['resource']['metadata']['is_trimmed']

    wrapped_post.assert_called_with(
        'POST',
        'collector',
        body=json.dumps(trace.to_dict()),
        timeout=epsagon.constants.SEND_TIMEOUT,
    )
示例#14
0
def test_send_big_trace(wrapped_post):
    trace = trace_factory.get_or_create_trace()
    runner = RunnerEventMock()

    trace.set_runner(runner)
    trace.token = 'a'

    for _ in range(2):
        trace.add_event(BigEventMock())
    trace_factory.send_traces()

    assert len(trace.to_dict()['events']) == 3
    for event in trace.to_dict()['events']:
        if event['origin'] == 'runner':
            assert event['resource']['metadata']['is_trimmed']

    wrapped_post.assert_called_with(
        '',
        data=json.dumps(trace.to_dict()),
        timeout=epsagon.constants.SEND_TIMEOUT,
        headers={'Authorization': 'Bearer {}'.format(trace.token)})
示例#15
0
def test_event_with_datetime(wrapped_post):
    trace = trace_factory.get_or_create_trace()

    trace.token = 'a'
    event = EventMock()
    event.resource['metadata'] = datetime.fromtimestamp(1000)
    trace.add_event(event)
    trace_factory.send_traces()
    wrapped_post.assert_called_with(
        '',
        data=json.dumps(trace.to_dict(), cls=TraceEncoder),
        timeout=epsagon.constants.SEND_TIMEOUT,
        headers={'Authorization': 'Bearer {}'.format(trace.token)})
def test_return_value_key_to_ignore(wrapped_post):
    key_to_ignore = 'key_to_ignore_in_return_value'
    os.environ['EPSAGON_IGNORED_KEYS'] = key_to_ignore
    epsagon.utils.init(
        token='token',
        app_name='app-name',
        collector_url='collector',
        metadata_only=False
    )

    trace = trace_factory.get_or_create_trace()
    return_value = {
        key_to_ignore: 'f',
        's': {
            'a': 1,
            'b': 2,
            'c': {
                'f': 1,
                key_to_ignore: '1',
                'g': {
                    key_to_ignore: '1'
                }
            }
        }
    }
    copied_return_value = return_value.copy()
    runner = ReturnValueEventMock(return_value)
    trace.set_runner(runner)
    trace_factory.send_traces()

    assert len(trace.to_dict()['events']) == 1
    event = trace.to_dict()['events'][0]
    assert event['origin'] == 'runner'
    actual_return_value = event['resource']['metadata']['return_value']
    _assert_key_not_exist(actual_return_value, key_to_ignore)
    # check that original return value hasn't been changed
    assert copied_return_value == return_value

    os.environ.pop('EPSAGON_IGNORED_KEYS')
示例#17
0
def test_to_dict_empty():
    trace = epsagon.trace.Trace()
    assert trace.to_dict() == {
        'token':
        '',
        'app_name':
        '',
        'events': [],
        'exceptions': [],
        'version':
        epsagon.constants.__version__,
        'platform':
        'Python {}.{}'.format(sys.version_info.major, sys.version_info.minor)
    }
def test_event_with_datetime(wrapped_post):
    epsagon.utils.init(token='token', app_name='app-name', collector_url='collector')
    trace = trace_factory.get_or_create_trace()

    event = EventMock()
    event.resource['metadata'] = datetime.fromtimestamp(1000)
    trace.add_event(event)
    trace_factory.send_traces()
    wrapped_post.assert_called_with(
        'POST',
        'collector',
        body=json.dumps(trace.to_dict(), cls=TraceEncoder),
        timeout=epsagon.constants.SEND_TIMEOUT,
    )
示例#19
0
def test_multi_value_labels_sanity():
    event = RunnerEventMock()
    trace = trace_factory.get_or_create_trace()
    trace.clear_events()
    trace.set_runner(event)
    trace.add_label('test_label', {
        'test2_label': 15,
        'test3_label': 'test',
        4: 'hey'
    })
    trace_metadata = trace.to_dict()['events'][0]['resource']['metadata']
    assert trace_metadata.get('labels') is not None
    assert json.loads(trace_metadata['labels']) == {
        'test_label.test2_label': '15',
        'test_label.test3_label': 'test',
        'test_label.4': 'hey',
    }
示例#20
0
def test_custom_labels_sanity():
    event = RunnerEventMock()
    trace = trace_factory.get_or_create_trace()
    trace.clear_events()
    trace.set_runner(event)
    trace.add_label('test_label', 'test_value')
    trace.add_label('test_label_2', 42)
    trace.add_label('test_label_3', 42.2)
    trace.add_label('test_label_invalid', {})
    trace_metadata = trace.to_dict()['events'][0]['resource']['metadata']

    assert trace_metadata.get('labels') is not None
    assert json.loads(trace_metadata['labels']) == {
        'test_label': 'test_value',
        'test_label_2': '42',
        'test_label_3': '42.2',
    }
def test_custom_labels_sanity():
    event = RunnerEventMock()
    trace = trace_factory.get_or_create_trace()
    trace.clear_events()
    trace.set_runner(event)
    trace.add_label('test_label', 'test_value')
    trace.add_label('test_label_2', 42)
    trace.add_label('test_label_3', 42.2)
    trace.add_label('test_label_4', True)
    # This is not an invalid label, but it won't be added because dict is empty.
    trace.add_label('test_label_invalid', {})
    trace_metadata = trace.to_dict()['events'][0]['resource']['metadata']

    assert trace_metadata.get('labels') is not None
    assert json.loads(trace_metadata['labels']) == {
        'test_label': 'test_value',
        'test_label_2': 42,
        'test_label_3': 42.2,
        'test_label_4': True,
    }
def test_whitelist_full_flow(wrapped_post):
    key_to_allow = 'key_to_allow_in_return_value'
    os.environ['EPSAGON_ALLOWED_KEYS'] = key_to_allow
    epsagon.utils.init(
        token='token',
        app_name='app-name',
        collector_url='collector',
        metadata_only=False
    )

    trace = trace_factory.get_or_create_trace()
    input_dict, expected_dict = (
        {
            key_to_allow: 'b',
            'a': {
                key_to_allow: 'end-of-branch',
                'd': {
                    'e': {
                        'f': 'end-of-branch'
                    }
                },
                'e': {
                    key_to_allow: {
                        'g': 'end-of-branch'
                    },
                    'g': {
                        'h': 'end-of-branch',
                        'i': {
                            key_to_allow: 'end-of-branch'
                        },
                        'j': {
                            'k': {
                                'l': 'end-of-branch'
                            }
                        }
                    }
                }
            }
        },
        {
            key_to_allow: 'b',
            'a': {
                key_to_allow: 'end-of-branch',
                'e': {
                    key_to_allow: {
                        'g': 'end-of-branch'
                    },
                    'g': {
                        'i': {
                            key_to_allow: 'end-of-branch'
                        },
                    }
                }
            }
        }
    )
    copied_input_dict = input_dict.copy()
    runner = ReturnValueEventMock(input_dict)
    trace.set_runner(runner)
    trace_factory.send_traces()

    assert len(trace.to_dict()['events']) == 1
    event = trace.to_dict()['events'][0]
    assert event['origin'] == 'runner'
    actual_return_value = event['resource']['metadata']['return_value']
    assert actual_return_value == expected_dict
    # check that original return value hasn't been changed
    assert copied_input_dict == input_dict

    wrapped_post.assert_called_with(
        'POST',
        'collector',
        body=json.dumps(trace.to_dict()),
        timeout=epsagon.constants.SEND_TIMEOUT,
    )

    os.environ.pop('EPSAGON_ALLOWED_KEYS')