Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion sentry_sdk/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -297,7 +297,7 @@ def _walk(obj, depth):
def extract_locals(frame):
rv = {}
for key, value in frame.f_locals.items():
rv[key] = object_to_json(value)
rv[str(key)] = object_to_json(value)
return rv


Expand Down
23 changes: 15 additions & 8 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import pytest

import sentry_sdk
from sentry_sdk._compat import reraise
from sentry_sdk._compat import reraise, string_types
from sentry_sdk.transport import Transport

SEMAPHORE = "./semaphore"
Expand All @@ -31,10 +31,18 @@ def _capture_internal_exception(exc_info):

@pytest.fixture
def monkeypatch_test_transport(monkeypatch, assert_semaphore_acceptance):
def check_event(event):
def check_string_keys(map):
for key, value in map.items():
assert isinstance(key, string_types)
if isinstance(value, dict):
check_string_keys(value)

check_string_keys(event)
assert_semaphore_acceptance(event)

def inner(client):
monkeypatch.setattr(
client, "transport", TestTransport(assert_semaphore_acceptance)
)
monkeypatch.setattr(client, "transport", TestTransport(check_event))

return inner

Expand All @@ -61,10 +69,9 @@ def inner(obj):

@pytest.fixture
def assert_semaphore_acceptance(tmpdir):
if not SEMAPHORE:
return lambda event: None

def inner(event):
if not SEMAPHORE:
return
# not dealing with the subprocess API right now
file = tmpdir.join("event")
file.write(json.dumps(dict(event)))
Expand All @@ -79,7 +86,7 @@ def inner(event):


@pytest.fixture
def sentry_init(monkeypatch_test_transport, assert_semaphore_acceptance):
def sentry_init(monkeypatch_test_transport):
def inner(*a, **kw):
sentry_sdk.api._init_on_current(*a, **kw)
monkeypatch_test_transport(sentry_sdk.Hub.current.client)
Expand Down
16 changes: 16 additions & 0 deletions tests/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,19 @@ def test_abs_path():
for frame in frames:
assert os.path.abspath(frame["abs_path"]) == frame["abs_path"]
assert os.path.basename(frame["filename"]) == frame["filename"]


def test_non_string_variables():
"""There is some extremely terrible code in the wild that
inserts non-strings as variable names into `locals()`."""

try:
locals()[42] = True
1 / 0
except ZeroDivisionError:
exceptions = exceptions_from_error_tuple(sys.exc_info())

exception, = exceptions
assert exception["type"] == "ZeroDivisionError"
frame, = exception["stacktrace"]["frames"]
assert frame["vars"]["42"] == "True"