File: test_serialtrace.py

package info (click to toggle)
chirp 1%3A20251108-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 18,728 kB
  • sloc: python: 156,369; ansic: 296; sh: 219; xml: 24; makefile: 19
file content (79 lines) | stat: -rw-r--r-- 2,871 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import unittest
from unittest import mock

from chirp.wxui import serialtrace


class TestSerialTrace(unittest.TestCase):
    @mock.patch('serial.Serial.open')
    def test_open(self, mock_open):
        trace = serialtrace.SerialTrace()
        self.assertIsNone(trace._SerialTrace__tracef)
        trace.open()
        self.assertIsNotNone(trace._SerialTrace__tracef)
        self.assertTrue(trace._SerialTrace__tracef.name.endswith('.txt'))
        mock_open.assert_called_once()

    @mock.patch('os.remove')
    def test_purge_trace_files(self, mock_remove):
        from chirp.wxui import serialtrace

        for i in range(15):
            serialtrace.TRACEFILES.append('test_trace_%i.txt' % i)
        files = serialtrace.TRACEFILES[:]

        # Purge to 10 files keeps the last 10
        serialtrace.purge_trace_files(10)
        self.assertEqual(len(serialtrace.TRACEFILES), 10)
        self.assertEqual(['test_trace_%i.txt' % (i + 5) for i in range(10)],
                         serialtrace.TRACEFILES)

        # Purge to 20 does not change anything since only 10 stored
        serialtrace.purge_trace_files(20)
        self.assertEqual(10, len(serialtrace.TRACEFILES))

        # Purge to zero removes all files
        serialtrace.purge_trace_files(0)
        self.assertEqual(0, len(serialtrace.TRACEFILES))

        # Make sure we ended up removing all the files
        mock_remove.assert_has_calls([mock.call(fn) for fn in files],
                                     any_order=True)

    @mock.patch('serial.Serial.open')
    @mock.patch('serial.Serial.write')
    @mock.patch('serial.Serial.read')
    def test_log_write(self, mock_read, mock_write, mock_open):
        mock_read.side_effect = [b'123', b'']
        trace = serialtrace.SerialTrace()
        trace.open()
        fn = serialtrace.TRACEFILES[-1]
        trace.write(b'foo')
        trace.read(3)
        trace.read(5)
        trace.close()
        with open(fn, 'r') as f:
            content = f.read()
        self.assertIn('# Serial trace', content)
        self.assertIn('foo...', content)
        self.assertIn('R # timeout', content)

    @mock.patch('tempfile.NamedTemporaryFile')
    @mock.patch('serial.Serial.open')
    @mock.patch('serial.Serial.write')
    @mock.patch('serial.Serial.read')
    def test_log_write_fail(self, mock_read, mock_write, mock_open, mock_tf):
        mock_tf.return_value.writelines.side_effect = [
            None, Exception("Write error")]
        trace = serialtrace.SerialTrace()
        trace.open()
        # This should generate a write failure
        trace.read(3)

        # Make sure we don't interrupt further communication
        trace.write(b'foo')
        trace.read()
        trace.write(b'bar')

        # Before we are closed, the trace file should have been abandoned
        self.assertIsNone(trace._SerialTrace__tracef)