Skip to content
Merged
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
269 changes: 154 additions & 115 deletions tests/integration/test_playstation.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ def load_dump_file(base_file_name: str):
return f.read()


def event_json(response):
def user_data_event_json(response):
return {
"event_id": response.text.replace("-", ""),
"timestamp": mock.ANY,
Expand Down Expand Up @@ -95,6 +95,114 @@ def event_json(response):
}


def playstation_event_json(sdk=mock.ANY):
return {
"event_id": mock.ANY,
"level": "fatal",
"version": mock.ANY,
"type": "error",
"logger": "",
"platform": "native",
"timestamp": mock.ANY,
"received": time_within_delta(),
"contexts": {
"app": {"app_version": "", "type": "app"},
"device": {
"name": "",
"model": "PS5",
"model_id": "5be3652dd663dbdcd044da0f2144b17f",
"arch": "x86_64",
"manufacturer": "Sony",
"type": "device",
},
"os": {
"os": "PlayStation 9.20.00.05-00.00.00.0.1",
"name": "PlayStation",
"version": "9.20.00.05-00.00.00.0.1",
"type": "os",
},
"runtime": {
"runtime": "PS5 9.20.00.05-00.00.00.0.1",
"name": "PS5",
"version": "9.20.00.05-00.00.00.0.1",
"type": "runtime",
},
},
"exception": {
"values": [
{
"type": "Minidump",
"value": "Invalid Minidump",
"mechanism": {
"type": "minidump",
"synthetic": True,
"handled": False,
},
}
]
},
"tags": [
["cpu_vendor", "Sony"],
["os.name", "PlayStation"],
["cpu_brand", "PS5 CPU"],
["runtime.name", "PS5"],
["os", "PlayStation 9.20.00.05-00.00.00.0.1"],
["runtime", "9.20.00.05-00.00.00.0.1"],
["runtime.version", "9.20.00.05-00.00.00.0.1"],
["titleId", "NPXS29997"],
["server_name", "5be3652dd663dbdcd044da0f2144b17f"],
],
"sdk": sdk,
"errors": [
{
"type": "past_timestamp",
"name": "timestamp",
"sdk_time": "2025-02-20T10:23:01+00:00",
"server_time": mock.ANY,
}
],
"key_id": "123",
"project": 42,
"grouping_config": mock.ANY,
"_metrics": mock.ANY,
"_meta": mock.ANY,
}


def attachments(
log_size=mock.ANY, generated_dump_size=mock.ANY, playstation_dump_size=mock.ANY
):
return [
{
"id": mock.ANY,
"name": "console.log",
"rate_limited": False,
"content_type": "text/plain",
"attachment_type": "event.attachment",
"size": log_size,
"chunks": 1,
},
{
"id": mock.ANY,
"name": "generated_minidump.dmp",
"rate_limited": False,
"content_type": "application/x-dmp",
"attachment_type": "event.minidump",
"size": generated_dump_size,
"chunks": 1,
},
{
"id": mock.ANY,
"name": "playstation.prosperodmp",
"rate_limited": False,
"content_type": "application/octet-stream",
"attachment_type": "playstation.prosperodump",
"size": playstation_dump_size,
"chunks": 1,
},
]


def test_playstation_no_feature_flag(
mini_sentry, relay_processing_with_playstation, outcomes_consumer
):
Expand Down Expand Up @@ -184,45 +292,13 @@ def test_playstation_with_feature_flag(
assert len(outcomes) == 0

event, payload = attachments_consumer.get_event_only()
assert event
assert payload

assert payload["type"] == "error"
assert payload["level"] == "fatal"

assert "contexts" in payload
assert "device" in payload["contexts"]
assert "os" in payload["contexts"]
assert "runtime" in payload["contexts"]

assert payload["contexts"]["device"]["model"] == "PS5"
assert payload["contexts"]["device"]["manufacturer"] == "Sony"
assert payload["contexts"]["device"]["arch"] == "x86_64"

assert payload["contexts"]["os"]["name"] == "PlayStation"
assert payload["contexts"]["runtime"]["name"] == "PS5"

tags_dict = dict(payload["tags"])
assert tags_dict["cpu_vendor"] == "Sony"
assert tags_dict["os.name"] == "PlayStation"
assert tags_dict["cpu_brand"] == "PS5 CPU"
assert "titleId" in tags_dict

assert "exception" in payload
assert len(payload["exception"]["values"]) == 1
assert payload["exception"]["values"][0]["type"] == "Minidump"
assert payload["exception"]["values"][0]["mechanism"]["type"] == "minidump"

assert "_metrics" in payload
assert payload["_metrics"]["bytes.ingested.event.minidump"] > 0
assert payload["_metrics"]["bytes.ingested.event.attachment"] > 0

assert len(event["attachments"]) == 3
assert "playstation.prosperodmp" in [
attachment["name"] for attachment in event["attachments"]
]

assert payload["sdk"]["name"] == "sentry.playstation.devkit"
assert payload == playstation_event_json(
{"name": "sentry.playstation.devkit", "version": "0.0.1"},
)
assert sorted(event["attachments"], key=lambda x: x["name"]) == attachments(
155829, 78050, 209385
)


def test_playstation_user_data_extraction(
Expand All @@ -248,7 +324,7 @@ def test_playstation_user_data_extraction(
assert len(outcomes) == 0

event, payload = attachments_consumer.get_event_only()
assert payload == event_json(response)
assert payload == user_data_event_json(response)
assert len(event["attachments"]) == 3


Expand Down Expand Up @@ -341,45 +417,13 @@ def test_playstation_attachment(
assert len(outcomes) == 0

event, payload = attachments_consumer.get_event_only()
assert event
assert payload

assert payload["type"] == "error"
assert payload["level"] == "fatal"

assert "contexts" in payload
assert "device" in payload["contexts"]
assert "os" in payload["contexts"]
assert "runtime" in payload["contexts"]

assert payload["contexts"]["device"]["model"] == "PS5"
assert payload["contexts"]["device"]["manufacturer"] == "Sony"
assert payload["contexts"]["device"]["arch"] == "x86_64"

assert payload["contexts"]["os"]["name"] == "PlayStation"
assert payload["contexts"]["runtime"]["name"] == "PS5"

tags_dict = dict(payload["tags"])
assert tags_dict["cpu_vendor"] == "Sony"
assert tags_dict["os.name"] == "PlayStation"
assert tags_dict["cpu_brand"] == "PS5 CPU"
assert "titleId" in tags_dict

assert "exception" in payload
assert len(payload["exception"]["values"]) == 1
assert payload["exception"]["values"][0]["type"] == "Minidump"
assert payload["exception"]["values"][0]["mechanism"]["type"] == "minidump"

assert "_metrics" in payload
assert payload["_metrics"]["bytes.ingested.event.minidump"] > 0
assert payload["_metrics"]["bytes.ingested.event.attachment"] > 0

assert len(event["attachments"]) == 3
assert "playstation.prosperodmp" in [
attachment["name"] for attachment in event["attachments"]
]

assert payload["sdk"]["name"] == "sentry.native.playstation"
assert payload == playstation_event_json(
{"name": "sentry.native.playstation", "version": "0.1.0"}
)
assert sorted(event["attachments"], key=lambda x: x["name"]) == attachments(
155829, 78050, 209385
)


def test_playstation_attachment_no_feature_flag(
Expand Down Expand Up @@ -420,17 +464,38 @@ def test_playstation_attachment_no_feature_flag(
relay.send_envelope(PROJECT_ID, envelope)

event, payload = attachments_consumer.get_event_only()
assert event
assert payload

assert len(event["attachments"]) == 1
attachment = event["attachments"][0]
assert attachment["attachment_type"] == "playstation.prosperodump"
assert payload == {
"event_id": mock.ANY,
"level": "error",
"version": "5",
"type": "error",
"logger": "",
"platform": "other",
"timestamp": mock.ANY,
"received": time_within_delta(),
"exception": {"values": [{"type": "ValueError", "value": "Should not happen"}]},
"sdk": {"name": "raven-node", "version": "2.6.3"},
"key_id": "123",
"project": 42,
"grouping_config": {
"enhancements": "eJybzDhxY05qemJypZWRgaGlroGxrqHRBABbEwcC",
"id": "legacy:2019-03-12",
},
"_metrics": {"bytes.ingested.event": 137},
}

assert payload["type"] == "error"
assert "exception" in payload
assert payload["exception"]["values"][0]["type"] == "ValueError"
assert payload["exception"]["values"][0]["value"] == "Should not happen"
assert event["attachments"] == (
{
"id": mock.ANY,
"name": "playstation.prosperodmp",
"rate_limited": False,
"content_type": "application/octet-stream",
"attachment_type": "playstation.prosperodump",
"size": 209385,
"chunks": 1,
},
)
Comment on lines +488 to +498
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: An assertion in test_playstation_attachment_no_feature_flag compares a list event["attachments"] with a tuple literal, causing a type mismatch and test failure.
Severity: HIGH | Confidence: 1.00

🔍 Detailed Analysis

The test_playstation_attachment_no_feature_flag test fails due to a type mismatch in an assertion. The event["attachments"] variable, which is a list, is compared against a tuple literal ({...},) using the equality operator. Python's == operator returns False when comparing a list and a tuple, even if their elements are identical, causing the assertion to fail.

💡 Suggested Fix

Modify the assertion at tests/integration/test_playstation.py:488~498 to compare event["attachments"] with a list literal [{...}] instead of a tuple ({...},), or use the attachments() helper.

🤖 Prompt for AI Agent
Fix this bug. In tests/integration/test_playstation.py at lines 488-498: The
`test_playstation_attachment_no_feature_flag` test fails due to a type mismatch in an
assertion. The `event["attachments"]` variable, which is a list, is compared against a
tuple literal `({...},)` using the equality operator. Python's `==` operator returns
`False` when comparing a list and a tuple, even if their elements are identical, causing
the assertion to fail.

Did we get this right? 👍 / 👎 to inform future reviews.



def test_data_request(mini_sentry, relay_processing_with_playstation):
Expand Down Expand Up @@ -594,32 +659,6 @@ def test_event_merging(
},
}

assert event["attachments"] == (
{
"id": mock.ANY,
"name": "playstation.prosperodmp",
"rate_limited": False,
"content_type": "application/octet-stream",
"attachment_type": "playstation.prosperodump",
"size": 210174,
"chunks": 1,
},
{
"id": mock.ANY,
"name": "console.log",
"rate_limited": False,
"content_type": "text/plain",
"attachment_type": "event.attachment",
"size": 158008,
"chunks": 1,
},
{
"id": mock.ANY,
"name": "generated_minidump.dmp",
"rate_limited": False,
"content_type": "application/x-dmp",
"attachment_type": "event.minidump",
"size": 60446,
"chunks": 1,
},
assert sorted(event["attachments"], key=lambda x: x["name"]) == attachments(
158008, 60446, 210174
)
Loading