Skip to content

Commit 6069d74

Browse files
committed
💚 Fix unit tests
1 parent 68ee703 commit 6069d74

File tree

2 files changed

+38
-6
lines changed

2 files changed

+38
-6
lines changed

src/octoprint/util/comm.py

+7-6
Original file line numberDiff line numberDiff line change
@@ -452,6 +452,7 @@ def __init__(self, port = None, baudrate=None, callbackObject=None, printerProfi
452452
self._sdAlwaysAvailable = settings().getBoolean(["serial", "sdAlwaysAvailable"])
453453
self._sdRelativePath = settings().getBoolean(["serial", "sdRelativePath"])
454454
self._blockWhileDwelling = settings().getBoolean(["serial", "blockWhileDwelling"])
455+
self._send_m112_on_error = settings().getBoolean(["serial", "sendM112OnError"])
455456
self._currentLine = 1
456457
self._line_mutex = threading.RLock()
457458
self._resendDelta = None
@@ -2768,8 +2769,8 @@ def _trigger_error(self, text, reason, close=True):
27682769
self._changeState(self.STATE_ERROR)
27692770
eventManager().fire(Events.ERROR, {"error": self.getErrorString(), "reason": reason})
27702771
if close:
2771-
if settings().getBoolean(["serial", "sendM112OnError"]) and not self.isSdPrinting():
2772-
self._gcode_M112_queuing("M112", close=False)
2772+
if self._send_m112_on_error and not self.isSdPrinting():
2773+
self._trigger_emergency_stop(close=False)
27732774
self.close(is_error=True)
27742775

27752776
def _readline(self):
@@ -3699,7 +3700,7 @@ def _gcode_M110_sending(self, cmd, cmd_type=None, gcode=None, subcode=None, *arg
36993700
self._lastLines.clear()
37003701
self._resendDelta = None
37013702

3702-
def _gcode_M112_queuing(self, cmd, cmd_type=None, gcode=None, subcode=None, *args, **kwargs):
3703+
def _trigger_emergency_stop(self, close=True):
37033704
self._logger.info(u"Force-sending M112 to the printer")
37043705

37053706
# emergency stop, jump the queue with the M112, regardless of whether the EMERGENCY_PARSER capability is
@@ -3723,7 +3724,7 @@ def _gcode_M112_queuing(self, cmd, cmd_type=None, gcode=None, subcode=None, *arg
37233724
error_text = "Closing serial port due to emergency stop M112."
37243725
self._log(error_text)
37253726

3726-
if kwargs.get("close", True):
3727+
if close:
37273728
self._errorValue = error_text
37283729
self.close(is_error=True)
37293730

@@ -3732,8 +3733,8 @@ def _gcode_M112_queuing(self, cmd, cmd_type=None, gcode=None, subcode=None, *arg
37323733
if gcode in gcodeToEvent:
37333734
eventManager().fire(gcodeToEvent[gcode])
37343735

3735-
# return None 1-tuple to eat the one that is queuing because we don't want to send it twice
3736-
# I hope it got it the first time because as far as I can tell, there is no way to know
3736+
def _gcode_M112_queuing(self, *args, **kwargs):
3737+
self._trigger_emergency_stop()
37373738
return None,
37383739

37393740
def _gcode_M114_queued(self, *args, **kwargs):

tests/util/test_comm.py

+31
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,14 @@ def setUp(self):
2121
self._comm._errorValue = None
2222
self._comm._clear_to_send = mock.Mock()
2323
self._comm._error_message_hooks = dict()
24+
self._comm._trigger_emergency_stop = mock.Mock()
2425

2526
# settings
2627
self._comm._ignore_errors = False
2728
self._comm._disconnect_on_errors = True
29+
self._comm._send_m112_on_error = True
2830
self._comm.isPrinting.return_value = True
31+
self._comm.isSdPrinting.return_value = False
2932
self._comm.isError.return_value = False
3033

3134
@ddt.data(
@@ -132,6 +135,7 @@ def test_other_error_disconnect(self, line):
132135
self.assertEqual(line, result)
133136

134137
# what should have happened
138+
self.assert_m112_sent()
135139
self.assert_disconnected()
136140

137141
# what should not have happened
@@ -140,6 +144,24 @@ def test_other_error_disconnect(self, line):
140144
self.assert_not_print_cancelled()
141145
self.assert_not_cleared_to_send()
142146

147+
@ddt.data("Error: Printer on fire")
148+
def test_other_error_no_m112(self, line):
149+
"""Should trigger escalation"""
150+
self._comm._send_m112_on_error = False
151+
152+
result = self._comm._handle_errors(line)
153+
self.assertEqual(line, result)
154+
155+
# what should have happened
156+
self.assert_disconnected()
157+
158+
# what should not have happened
159+
self.assert_not_handle_ok()
160+
self.assert_not_last_comm_error()
161+
self.assert_not_print_cancelled()
162+
self.assert_not_cleared_to_send()
163+
self.assert_not_m112_sent()
164+
143165
@ddt.data("Error: Printer on fire")
144166
def test_other_error_cancel(self, line):
145167
"""Should trigger print cancel"""
@@ -155,6 +177,7 @@ def test_other_error_cancel(self, line):
155177
# what should not have happened
156178
self.assert_not_handle_ok()
157179
self.assert_not_last_comm_error()
180+
self.assert_not_m112_sent()
158181
self.assert_not_disconnected()
159182

160183
@ddt.data("Error: Printer on fire")
@@ -172,6 +195,8 @@ def test_other_error_ignored(self, line):
172195
self.assert_not_handle_ok()
173196
self.assert_not_last_comm_error()
174197
self.assert_not_print_cancelled()
198+
self.assert_not_m112_sent()
199+
self.assert_not_disconnected()
175200

176201
def test_not_an_error(self):
177202
"""Should pass"""
@@ -205,6 +230,12 @@ def assert_last_comm_error(self):
205230
def assert_not_last_comm_error(self):
206231
self.assertIsNone(self._comm._lastCommError)
207232

233+
def assert_m112_sent(self):
234+
self._comm._trigger_emergency_stop.assert_called_once_with(close=False)
235+
236+
def assert_not_m112_sent(self):
237+
self._comm._trigger_emergency_stop.assert_not_called()
238+
208239
def assert_disconnected(self):
209240
self.assertIsNotNone(self._comm._errorValue)
210241
self._comm._changeState.assert_called_with(self._comm.STATE_ERROR)

0 commit comments

Comments
 (0)