diff --git a/python/src/trezorlib/debuglink.py b/python/src/trezorlib/debuglink.py index 336ad7be7..824d4fe1a 100644 --- a/python/src/trezorlib/debuglink.py +++ b/python/src/trezorlib/debuglink.py @@ -606,7 +606,7 @@ class DebugLink: wait_type = DebugWaitType.IMMEDIATE else: wait_type = self.input_wait_type - return self.snapshot(wait_type) + return self._snapshot_core(wait_type) press_yes = _make_input_func(button=messages.DebugButton.YES) """Confirm current layout. See `_decision` for more details.""" @@ -649,10 +649,14 @@ class DebugLink: messages.DebugLinkDecision(x=x, y=y, hold_ms=hold_ms), wait ) - def snapshot( + def _snapshot_core( self, wait_type: DebugWaitType = DebugWaitType.IMMEDIATE ) -> LayoutContent: """Save text and image content of the screen to relevant directories.""" + # skip the snapshot if we are on T1 + if self.model is models.T1B1: + return LayoutContent([]) + # take the snapshot state = self.state(wait_type) layout = LayoutContent(state.tokens) @@ -660,8 +664,6 @@ class DebugLink: if state.tokens and self.layout_dirty: # save it, unless we already did or unless it's empty self.save_debug_screen(layout.visible_screen()) - if state.layout is not None: - self.save_screenshot(state.layout) self.layout_dirty = False # return the layout @@ -730,7 +732,16 @@ class DebugLink: def erase_sd_card(self, format: bool = True) -> messages.Success: return self._call(messages.DebugLinkEraseSdCard(format=format)) - def save_screenshot(self, data: bytes) -> None: + def snapshot_legacy(self) -> None: + """Snapshot the current state of the device.""" + if self.model is not models.T1B1: + return + + state = self.state() + if state.layout is not None: + self._save_screenshot_t1(state.layout) + + def _save_screenshot_t1(self, data: bytes) -> None: if self.t1_screenshot_directory is None: return @@ -796,7 +807,7 @@ class DebugUI: ] = None def button_request(self, br: messages.ButtonRequest) -> None: - self.debuglink.snapshot() + self.debuglink.snapshot_legacy() if self.input_flow is None: if br.code == messages.ButtonRequestType.PinEntry: @@ -817,7 +828,7 @@ class DebugUI: self.input_flow = self.INPUT_FLOW_DONE def get_pin(self, code: Optional["PinMatrixRequestType"] = None) -> str: - self.debuglink.snapshot() + self.debuglink.snapshot_legacy() if self.pins is None: raise RuntimeError("PIN requested but no sequence was configured") @@ -828,7 +839,7 @@ class DebugUI: raise AssertionError("PIN sequence ended prematurely") def get_passphrase(self, available_on_device: bool) -> str: - self.debuglink.snapshot() + self.debuglink.snapshot_legacy() return self.passphrase @@ -1224,6 +1235,29 @@ class TrezorClientDebugLink(TrezorClient): output.append(textwrap.indent(protobuf.format_message(act), " ")) raise AssertionError("\n".join(output)) + def sync_responses(self) -> None: + """Synchronize Trezor device receiving with caller. + + When a failed test does not read out the response, the next caller will write + a request, but read the previous response -- while the device had already sent + and placed into queue the new response. + + This function will call `Ping` and read responses until it locates a `Success` + with the expected text. This means that we are reading up-to-date responses. + """ + import secrets + + # Start by canceling whatever is on screen. This will work to cancel T1 PIN + # prompt, which is in TINY mode and does not respond to `Ping`. + # go to super() to avoid message filtering + super()._raw_write(messages.Cancel()) + + message = "SYNC" + secrets.token_hex(8) + super()._raw_write(messages.Ping(message=message)) + resp = None + while resp != messages.Success(message=message): + resp = super()._raw_read() + def mnemonic_callback(self, _) -> str: word, pos = self.debug.read_recovery_word() if word: diff --git a/tests/device_tests/test_busy_state.py b/tests/device_tests/test_busy_state.py index b8de77148..220903084 100644 --- a/tests/device_tests/test_busy_state.py +++ b/tests/device_tests/test_busy_state.py @@ -61,8 +61,8 @@ def test_busy_state(client: Client): assert client.features.unlocked is True -@pytest.mark.flaky(max_runs=5) -def test_busy_expiry(client: Client): +@pytest.mark.skip_t1b1 +def test_busy_expiry_core(client: Client): WAIT_TIME_MS = 1500 TOLERANCE = 1000 @@ -85,3 +85,27 @@ def test_busy_expiry(client: Client): # Also needs to come back to Homescreen (for UI tests). client.refresh_features() _assert_busy(client, False) + + +@pytest.mark.flaky(max_runs=5) +def test_busy_expiry_legacy(client: Client): + if client.model is not models.T1B1: + # TODO better skip markers + pytest.skip("Test only for T1B1") + + _assert_busy(client, False) + # Show the busy dialog. + device.set_busy(client, expiry_ms=1500) + _assert_busy(client, True) + + # Hasn't expired yet. + time.sleep(0.1) + _assert_busy(client, True) + + # Wait for it to expire. Add some tolerance to account for CI/hardware slowness. + time.sleep(4.0) + + # Check that the device is no longer busy. + # Also needs to come back to Homescreen (for UI tests). + client.refresh_features() + _assert_busy(client, False) diff --git a/tests/ui_tests/fixtures.json b/tests/ui_tests/fixtures.json index 29df777f7..313ef4d28 100644 --- a/tests/ui_tests/fixtures.json +++ b/tests/ui_tests/fixtures.json @@ -648,7 +648,7 @@ "T1_en_test_bip32_speed.py::test_cache": "55f043b3e286b778a02baea8f7c3547208849e2e18f90837bd9374a4a14c5c0b", "T1_en_test_bip32_speed.py::test_private_ckd": "55f043b3e286b778a02baea8f7c3547208849e2e18f90837bd9374a4a14c5c0b", "T1_en_test_bip32_speed.py::test_public_ckd": "55f043b3e286b778a02baea8f7c3547208849e2e18f90837bd9374a4a14c5c0b", -"T1_en_test_busy_state.py::test_busy_expiry": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", +"T1_en_test_busy_state.py::test_busy_expiry_legacy": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "T1_en_test_busy_state.py::test_busy_state": "fe7e762884268cf79e211eeb7c7ed7f85b8364e8bac27bd6790fc300f9a1429c", "T1_en_test_cancel.py::test_cancel_message_via_cancel[message0]": "de7fc40b2f35e82fa486f1b97ee3e34a96d0a67412537e8a0fddacc0b0b1649d", "T1_en_test_cancel.py::test_cancel_message_via_cancel[message1]": "af93b5d0a8ae6b297391a43ff3f6382d0bea1109f4f411f5b306e2e7ced6e814", @@ -2227,7 +2227,7 @@ "T3T1_cs_test_basic.py::test_device_id_same": "1b0c0ad21a8089c6441d577f0d15ccea46d9b2d7f77b8eb50c3d952dc0d7114d", "T3T1_cs_test_basic.py::test_features": "1b0c0ad21a8089c6441d577f0d15ccea46d9b2d7f77b8eb50c3d952dc0d7114d", "T3T1_cs_test_basic.py::test_ping": "1b0c0ad21a8089c6441d577f0d15ccea46d9b2d7f77b8eb50c3d952dc0d7114d", -"T3T1_cs_test_busy_state.py::test_busy_expiry": "5807370e36255f64722c9b70002daad3b718387eaa41102561ec6a0dcbeed20a", +"T3T1_cs_test_busy_state.py::test_busy_expiry_core": "5807370e36255f64722c9b70002daad3b718387eaa41102561ec6a0dcbeed20a", "T3T1_cs_test_busy_state.py::test_busy_state": "5aa79b7b40ea267c0abb4c1783ce2d74233b3a8dcd35e53b37ad25d8fe109469", "T3T1_cs_test_cancel.py::test_cancel_message_via_cancel[message0]": "fea263b87f3b5ccbbc7ac43de02f28a3927cc13116505a76b71047427d3b80d3", "T3T1_cs_test_cancel.py::test_cancel_message_via_cancel[message1]": "2e607dedaaff54ba045743b6cf77f83eb81608d7e5ab22c3aaadbc13bfba9cb1", @@ -3638,7 +3638,7 @@ "T3T1_de_test_basic.py::test_device_id_same": "4ed24353a7aa99e894d4ed3cb45be13f54a94577289f3919be62add4c6c36390", "T3T1_de_test_basic.py::test_features": "4ed24353a7aa99e894d4ed3cb45be13f54a94577289f3919be62add4c6c36390", "T3T1_de_test_basic.py::test_ping": "4ed24353a7aa99e894d4ed3cb45be13f54a94577289f3919be62add4c6c36390", -"T3T1_de_test_busy_state.py::test_busy_expiry": "d00c19e4be337da53afb665aa2c38784a51a91989ba65bb77aaadc8605994395", +"T3T1_de_test_busy_state.py::test_busy_expiry_core": "d00c19e4be337da53afb665aa2c38784a51a91989ba65bb77aaadc8605994395", "T3T1_de_test_busy_state.py::test_busy_state": "f1630a5a7905c765a606cfb13aa12ae7f5a4bea2e426c0cb8eff0f988d7833bf", "T3T1_de_test_cancel.py::test_cancel_message_via_cancel[message0]": "06b0b04c345ac39dbc1c07e3aab30d378443248e27761469e2d4c28d0fa359d9", "T3T1_de_test_cancel.py::test_cancel_message_via_cancel[message1]": "0f74eaf21eeb33f4926152e82f47d0c9bc62e5e6002aecb6da2f3ebd126b1f31", @@ -5049,7 +5049,7 @@ "T3T1_en_test_basic.py::test_device_id_same": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3", "T3T1_en_test_basic.py::test_features": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3", "T3T1_en_test_basic.py::test_ping": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3", -"T3T1_en_test_busy_state.py::test_busy_expiry": "6509e7c943f2d09e3a5a7c69faee74c75b321ed1614d881d1ebdb57693c7f69a", +"T3T1_en_test_busy_state.py::test_busy_expiry_core": "6509e7c943f2d09e3a5a7c69faee74c75b321ed1614d881d1ebdb57693c7f69a", "T3T1_en_test_busy_state.py::test_busy_state": "2521dbe0350a160f2e3b95512d785fb60ffd2f5db98dea9fe917d5c824623df6", "T3T1_en_test_cancel.py::test_cancel_message_via_cancel[message0]": "d702b0f90581cf17e0f77b4d318324a002deec42c2c5cb8860d51f6cb50f5739", "T3T1_en_test_cancel.py::test_cancel_message_via_cancel[message1]": "3ed24b99952d25fcf0d9bd6d307c576862fe870ddb98288fa89b227f0e192073", @@ -6460,7 +6460,7 @@ "T3T1_es_test_basic.py::test_device_id_same": "3d2d3c815bfd09c3235e3749e66769dc375f49f9cc92f13f4a7b7df38e6bcfab", "T3T1_es_test_basic.py::test_features": "3d2d3c815bfd09c3235e3749e66769dc375f49f9cc92f13f4a7b7df38e6bcfab", "T3T1_es_test_basic.py::test_ping": "3d2d3c815bfd09c3235e3749e66769dc375f49f9cc92f13f4a7b7df38e6bcfab", -"T3T1_es_test_busy_state.py::test_busy_expiry": "da280d408675fbdbaddefe467ce32f0fbd64726f8935dc5d49b9d2fe969f7585", +"T3T1_es_test_busy_state.py::test_busy_expiry_core": "da280d408675fbdbaddefe467ce32f0fbd64726f8935dc5d49b9d2fe969f7585", "T3T1_es_test_busy_state.py::test_busy_state": "0c62c74559497e860b2b20a2bc1ca173bd1a861c2d96c3cb3631a10655bd55a8", "T3T1_es_test_cancel.py::test_cancel_message_via_cancel[message0]": "1d98be5dd1e52fe5da379d1c72d6bc9065228b1d66939ee5bd2eda2fe857b679", "T3T1_es_test_cancel.py::test_cancel_message_via_cancel[message1]": "61caffa741cf81f709e6df2818a5ace7411fef1765e14aec7dd99b13f7d1322f", @@ -7871,7 +7871,7 @@ "T3T1_fr_test_basic.py::test_device_id_same": "5c03427cb7e315cb2f1e036c2edb2cc7c527ac80783c331fda0749bf306bcd94", "T3T1_fr_test_basic.py::test_features": "5c03427cb7e315cb2f1e036c2edb2cc7c527ac80783c331fda0749bf306bcd94", "T3T1_fr_test_basic.py::test_ping": "5c03427cb7e315cb2f1e036c2edb2cc7c527ac80783c331fda0749bf306bcd94", -"T3T1_fr_test_busy_state.py::test_busy_expiry": "0b142663642a8981e8fb85cf0eda771d72c9d2206cd224d170b588f32da4d8cd", +"T3T1_fr_test_busy_state.py::test_busy_expiry_core": "0b142663642a8981e8fb85cf0eda771d72c9d2206cd224d170b588f32da4d8cd", "T3T1_fr_test_busy_state.py::test_busy_state": "563885e8f60dfe6e266ddfff8e0adbae1bec7d16c2e6bee864b640274f485fad", "T3T1_fr_test_cancel.py::test_cancel_message_via_cancel[message0]": "e2146f6ece95111d17b01b0f2e0bf720c845242c7b0791ce5c8af5e9ca63249e", "T3T1_fr_test_cancel.py::test_cancel_message_via_cancel[message1]": "722d1df17cd5650880e8a634038c1f582229258661a26ee307a9a8d8737dc178", @@ -9474,7 +9474,7 @@ "TR_cs_test_basic.py::test_device_id_same": "9693b9b07c3ff5108d3d30096ff1ce9988f22465fb85eac2ab68f6ef62ddc995", "TR_cs_test_basic.py::test_features": "9693b9b07c3ff5108d3d30096ff1ce9988f22465fb85eac2ab68f6ef62ddc995", "TR_cs_test_basic.py::test_ping": "9693b9b07c3ff5108d3d30096ff1ce9988f22465fb85eac2ab68f6ef62ddc995", -"TR_cs_test_busy_state.py::test_busy_expiry": "3ada1eb6b81ca1cba6132b590848152d4f95741a58e0175443a634043b6b95b4", +"TR_cs_test_busy_state.py::test_busy_expiry_core": "3ada1eb6b81ca1cba6132b590848152d4f95741a58e0175443a634043b6b95b4", "TR_cs_test_busy_state.py::test_busy_state": "81bd8c995f8285cbf7e5d2d2195fee1c8f88407377f7f97f2695f4cb066112b8", "TR_cs_test_cancel.py::test_cancel_message_via_cancel[message0]": "b2d105102f6fb8e5fa8c3604b14801acba3d1c7ada22864953555f7ed2892f0c", "TR_cs_test_cancel.py::test_cancel_message_via_cancel[message1]": "f7d03979547d086681cd006d6fa2015afd0819f3dea983587b734d79a8942757", @@ -10847,7 +10847,7 @@ "TR_de_test_basic.py::test_device_id_same": "9bdb526d0b64a91e862ec4ba7ced36adf20382a193c8f0c5788a70564aeac23a", "TR_de_test_basic.py::test_features": "9bdb526d0b64a91e862ec4ba7ced36adf20382a193c8f0c5788a70564aeac23a", "TR_de_test_basic.py::test_ping": "9bdb526d0b64a91e862ec4ba7ced36adf20382a193c8f0c5788a70564aeac23a", -"TR_de_test_busy_state.py::test_busy_expiry": "f060bd0cb42bced5d02923279994ebadb2d6bfdac236f2bf62fb204b1f6f67c7", +"TR_de_test_busy_state.py::test_busy_expiry_core": "f060bd0cb42bced5d02923279994ebadb2d6bfdac236f2bf62fb204b1f6f67c7", "TR_de_test_busy_state.py::test_busy_state": "9e61e8b66dfe59eed520d6a216cf7309fe464a1c184ff0a8faa165bf434514c1", "TR_de_test_cancel.py::test_cancel_message_via_cancel[message0]": "c5d2fa0882792a553ba2b2ee2a1f4cca2a5e00d30b1b3dec4c95ce2717b38690", "TR_de_test_cancel.py::test_cancel_message_via_cancel[message1]": "9863194d3b2a0984312ab1e943fa53e1c5904f1abd7589f80efa6cb534a592d2", @@ -12220,7 +12220,7 @@ "TR_en_test_basic.py::test_device_id_same": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_en_test_basic.py::test_features": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", "TR_en_test_basic.py::test_ping": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095", -"TR_en_test_busy_state.py::test_busy_expiry": "0cff54da20c3c70d5b5de75a45fc265b29683fe322ad498f947656118691eeca", +"TR_en_test_busy_state.py::test_busy_expiry_core": "0cff54da20c3c70d5b5de75a45fc265b29683fe322ad498f947656118691eeca", "TR_en_test_busy_state.py::test_busy_state": "32a4b260c4ef5881e071fc04dd5b1aeac4489792191879930a3293c99a1c7cf6", "TR_en_test_cancel.py::test_cancel_message_via_cancel[message0]": "4ffbed72e7ed7fbab85f830952200adf7758af81b658b56de4672344120456a6", "TR_en_test_cancel.py::test_cancel_message_via_cancel[message1]": "67bcd312e8f0fc9739b12700419844370f78c643450942768a355bb97e5fe4ec", @@ -13593,7 +13593,7 @@ "TR_es_test_basic.py::test_device_id_same": "5e88affdb4b3898af738bfabb224b94e674c0d5b8bd6ea4f73a601c972f5858c", "TR_es_test_basic.py::test_features": "5e88affdb4b3898af738bfabb224b94e674c0d5b8bd6ea4f73a601c972f5858c", "TR_es_test_basic.py::test_ping": "5e88affdb4b3898af738bfabb224b94e674c0d5b8bd6ea4f73a601c972f5858c", -"TR_es_test_busy_state.py::test_busy_expiry": "c550a9bbdc796a989d6e46a699b8e138c1b87aef7761dbad49ce4977bff27f26", +"TR_es_test_busy_state.py::test_busy_expiry_core": "c550a9bbdc796a989d6e46a699b8e138c1b87aef7761dbad49ce4977bff27f26", "TR_es_test_busy_state.py::test_busy_state": "b0e34cf92702c911d513eb2277edf9426d6a4138d32ac21f2af24d9c3791bc74", "TR_es_test_cancel.py::test_cancel_message_via_cancel[message0]": "816ff08f20890dff7e1475ef0c34f23705c8020a8432b7751e46001015ef2bf2", "TR_es_test_cancel.py::test_cancel_message_via_cancel[message1]": "c2eca4793ad12e18f623de2d33c006ba58fa0018733b0a86b877493b6d569432", @@ -14966,7 +14966,7 @@ "TR_fr_test_basic.py::test_device_id_same": "3bbca7f9b0cc44dd18b1fb71d34dec0542b8ac69e022cf4cd1f2792a41b4fb20", "TR_fr_test_basic.py::test_features": "3bbca7f9b0cc44dd18b1fb71d34dec0542b8ac69e022cf4cd1f2792a41b4fb20", "TR_fr_test_basic.py::test_ping": "3bbca7f9b0cc44dd18b1fb71d34dec0542b8ac69e022cf4cd1f2792a41b4fb20", -"TR_fr_test_busy_state.py::test_busy_expiry": "3c4520b8aadefa089195d16d37ebc6f834963a65fa4df8eeef3fb981d7c78615", +"TR_fr_test_busy_state.py::test_busy_expiry_core": "3c4520b8aadefa089195d16d37ebc6f834963a65fa4df8eeef3fb981d7c78615", "TR_fr_test_busy_state.py::test_busy_state": "ce6644870a4f3789f5b4826291a432390f4716db3c22df87ff772b2c0463c5a8", "TR_fr_test_cancel.py::test_cancel_message_via_cancel[message0]": "8b57a6aeec4cd6699e8e58d1789366801c279aaeb35fb852098266773b8392d7", "TR_fr_test_cancel.py::test_cancel_message_via_cancel[message1]": "6cf87ca1cac84a641e4498d88b98b2d7f9af4050a4cbc7d4daf9da824cac6caa", @@ -16646,7 +16646,7 @@ "TT_cs_test_basic.py::test_device_id_same": "1b0c0ad21a8089c6441d577f0d15ccea46d9b2d7f77b8eb50c3d952dc0d7114d", "TT_cs_test_basic.py::test_features": "1b0c0ad21a8089c6441d577f0d15ccea46d9b2d7f77b8eb50c3d952dc0d7114d", "TT_cs_test_basic.py::test_ping": "1b0c0ad21a8089c6441d577f0d15ccea46d9b2d7f77b8eb50c3d952dc0d7114d", -"TT_cs_test_busy_state.py::test_busy_expiry": "5807370e36255f64722c9b70002daad3b718387eaa41102561ec6a0dcbeed20a", +"TT_cs_test_busy_state.py::test_busy_expiry_core": "5807370e36255f64722c9b70002daad3b718387eaa41102561ec6a0dcbeed20a", "TT_cs_test_busy_state.py::test_busy_state": "7c205de09a75561f3f348353acb44ee75bba08174bd93296d5bbaf49fe78283a", "TT_cs_test_cancel.py::test_cancel_message_via_cancel[message0]": "fea263b87f3b5ccbbc7ac43de02f28a3927cc13116505a76b71047427d3b80d3", "TT_cs_test_cancel.py::test_cancel_message_via_cancel[message1]": "2e607dedaaff54ba045743b6cf77f83eb81608d7e5ab22c3aaadbc13bfba9cb1", @@ -18099,7 +18099,7 @@ "TT_de_test_basic.py::test_device_id_same": "4ed24353a7aa99e894d4ed3cb45be13f54a94577289f3919be62add4c6c36390", "TT_de_test_basic.py::test_features": "4ed24353a7aa99e894d4ed3cb45be13f54a94577289f3919be62add4c6c36390", "TT_de_test_basic.py::test_ping": "4ed24353a7aa99e894d4ed3cb45be13f54a94577289f3919be62add4c6c36390", -"TT_de_test_busy_state.py::test_busy_expiry": "d00c19e4be337da53afb665aa2c38784a51a91989ba65bb77aaadc8605994395", +"TT_de_test_busy_state.py::test_busy_expiry_core": "d00c19e4be337da53afb665aa2c38784a51a91989ba65bb77aaadc8605994395", "TT_de_test_busy_state.py::test_busy_state": "a9b1c1730c697ecceb462c2717e1c3364f4f2b5fe99e4c19c0dd52409da76ea9", "TT_de_test_cancel.py::test_cancel_message_via_cancel[message0]": "06b0b04c345ac39dbc1c07e3aab30d378443248e27761469e2d4c28d0fa359d9", "TT_de_test_cancel.py::test_cancel_message_via_cancel[message1]": "0f74eaf21eeb33f4926152e82f47d0c9bc62e5e6002aecb6da2f3ebd126b1f31", @@ -19552,7 +19552,7 @@ "TT_en_test_basic.py::test_device_id_same": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3", "TT_en_test_basic.py::test_features": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3", "TT_en_test_basic.py::test_ping": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3", -"TT_en_test_busy_state.py::test_busy_expiry": "6509e7c943f2d09e3a5a7c69faee74c75b321ed1614d881d1ebdb57693c7f69a", +"TT_en_test_busy_state.py::test_busy_expiry_core": "6509e7c943f2d09e3a5a7c69faee74c75b321ed1614d881d1ebdb57693c7f69a", "TT_en_test_busy_state.py::test_busy_state": "cb4f7dfd4ed0146bf84bf43497d7b72ba8b1d2daa9699b84ae788d579fd1e8f0", "TT_en_test_cancel.py::test_cancel_message_via_cancel[message0]": "d702b0f90581cf17e0f77b4d318324a002deec42c2c5cb8860d51f6cb50f5739", "TT_en_test_cancel.py::test_cancel_message_via_cancel[message1]": "3ed24b99952d25fcf0d9bd6d307c576862fe870ddb98288fa89b227f0e192073", @@ -21023,7 +21023,7 @@ "TT_es_test_basic.py::test_device_id_same": "3d2d3c815bfd09c3235e3749e66769dc375f49f9cc92f13f4a7b7df38e6bcfab", "TT_es_test_basic.py::test_features": "3d2d3c815bfd09c3235e3749e66769dc375f49f9cc92f13f4a7b7df38e6bcfab", "TT_es_test_basic.py::test_ping": "3d2d3c815bfd09c3235e3749e66769dc375f49f9cc92f13f4a7b7df38e6bcfab", -"TT_es_test_busy_state.py::test_busy_expiry": "da280d408675fbdbaddefe467ce32f0fbd64726f8935dc5d49b9d2fe969f7585", +"TT_es_test_busy_state.py::test_busy_expiry_core": "da280d408675fbdbaddefe467ce32f0fbd64726f8935dc5d49b9d2fe969f7585", "TT_es_test_busy_state.py::test_busy_state": "ed25ea1cba88e78fce2ff28e83a0988f85cfdb708fda5ffa24f2362d4acd5925", "TT_es_test_cancel.py::test_cancel_message_via_cancel[message0]": "1d98be5dd1e52fe5da379d1c72d6bc9065228b1d66939ee5bd2eda2fe857b679", "TT_es_test_cancel.py::test_cancel_message_via_cancel[message1]": "61caffa741cf81f709e6df2818a5ace7411fef1765e14aec7dd99b13f7d1322f", @@ -22476,7 +22476,7 @@ "TT_fr_test_basic.py::test_device_id_same": "5c03427cb7e315cb2f1e036c2edb2cc7c527ac80783c331fda0749bf306bcd94", "TT_fr_test_basic.py::test_features": "5c03427cb7e315cb2f1e036c2edb2cc7c527ac80783c331fda0749bf306bcd94", "TT_fr_test_basic.py::test_ping": "5c03427cb7e315cb2f1e036c2edb2cc7c527ac80783c331fda0749bf306bcd94", -"TT_fr_test_busy_state.py::test_busy_expiry": "0b142663642a8981e8fb85cf0eda771d72c9d2206cd224d170b588f32da4d8cd", +"TT_fr_test_busy_state.py::test_busy_expiry_core": "0b142663642a8981e8fb85cf0eda771d72c9d2206cd224d170b588f32da4d8cd", "TT_fr_test_busy_state.py::test_busy_state": "89b66a8c8a331bfb0a1be406bc23f48fba01366da19d9442d0dee04785fb3dd2", "TT_fr_test_cancel.py::test_cancel_message_via_cancel[message0]": "e2146f6ece95111d17b01b0f2e0bf720c845242c7b0791ce5c8af5e9ca63249e", "TT_fr_test_cancel.py::test_cancel_message_via_cancel[message1]": "722d1df17cd5650880e8a634038c1f582229258661a26ee307a9a8d8737dc178",