amine@269
|
1 import os
|
amine@267
|
2 from unittest import TestCase
|
amine@269
|
3 from tempfile import TemporaryDirectory
|
amine@267
|
4 from collections import namedtuple
|
amine@267
|
5 from genty import genty, genty_dataset
|
amine@267
|
6
|
amine@267
|
7 from auditok.cmdline_util import (
|
amine@267
|
8 LOGGER_NAME,
|
amine@267
|
9 make_kwargs,
|
amine@267
|
10 make_duration_fromatter,
|
amine@267
|
11 make_logger,
|
amine@267
|
12 initialize_workers,
|
amine@267
|
13 KeywordArguments,
|
amine@267
|
14 )
|
amine@267
|
15 from auditok.workers import StreamSaverWorker
|
amine@267
|
16 from auditok.exceptions import TimeFormatError
|
amine@267
|
17
|
amine@267
|
18 _ArgsNamespece = namedtuple(
|
amine@267
|
19 "_ArgsNamespece",
|
amine@267
|
20 [
|
amine@267
|
21 "input",
|
amine@267
|
22 "max_time",
|
amine@267
|
23 "analysis_window",
|
amine@267
|
24 "sampling_rate",
|
amine@267
|
25 "sample_width",
|
amine@267
|
26 "channels",
|
amine@267
|
27 "use_channel",
|
amine@267
|
28 "input_format",
|
amine@267
|
29 "output_format",
|
amine@267
|
30 "large_file",
|
amine@267
|
31 "frame_per_buffer",
|
amine@267
|
32 "input_device_index",
|
amine@267
|
33 "save_stream",
|
amine@267
|
34 "plot",
|
amine@267
|
35 "save_image",
|
amine@267
|
36 "min_duration",
|
amine@267
|
37 "max_duration",
|
amine@267
|
38 "max_silence",
|
amine@267
|
39 "drop_trailing_silence",
|
amine@267
|
40 "strict_min_duration",
|
amine@267
|
41 "energy_threshold",
|
amine@267
|
42 "echo",
|
amine@267
|
43 "command",
|
amine@267
|
44 "quiet",
|
amine@267
|
45 "printf",
|
amine@267
|
46 "time_format",
|
amine@267
|
47 "timestamp_format",
|
amine@267
|
48 ],
|
amine@267
|
49 )
|
amine@267
|
50
|
amine@267
|
51
|
amine@267
|
52 @genty
|
amine@268
|
53 class _TestCmdLineUtil(TestCase):
|
amine@267
|
54 @genty_dataset(
|
amine@267
|
55 no_record=("stream.ogg", False, None, "mix", "mix", False),
|
amine@267
|
56 no_record_plot=("stream.ogg", True, None, None, None, False),
|
amine@267
|
57 no_record_save_image=(
|
amine@267
|
58 "stream.ogg",
|
amine@267
|
59 True,
|
amine@267
|
60 "image.png",
|
amine@267
|
61 None,
|
amine@267
|
62 None,
|
amine@267
|
63 False,
|
amine@267
|
64 ),
|
amine@267
|
65 record_plot=(None, True, None, None, None, True),
|
amine@267
|
66 record_save_image=(None, False, "image.png", None, None, True),
|
amine@267
|
67 int_use_channel=("stream.ogg", False, None, "1", 1, False),
|
amine@267
|
68 )
|
amine@267
|
69 def test_make_kwargs(
|
amine@267
|
70 self,
|
amine@267
|
71 save_stream,
|
amine@267
|
72 plot,
|
amine@267
|
73 save_image,
|
amine@267
|
74 use_channel,
|
amine@267
|
75 exp_use_channel,
|
amine@267
|
76 exp_record,
|
amine@267
|
77 ):
|
amine@267
|
78
|
amine@267
|
79 args = (
|
amine@267
|
80 "file",
|
amine@267
|
81 30,
|
amine@267
|
82 0.01,
|
amine@267
|
83 16000,
|
amine@267
|
84 2,
|
amine@267
|
85 2,
|
amine@267
|
86 use_channel,
|
amine@267
|
87 "raw",
|
amine@267
|
88 "ogg",
|
amine@267
|
89 True,
|
amine@267
|
90 None,
|
amine@267
|
91 1,
|
amine@267
|
92 save_stream,
|
amine@267
|
93 plot,
|
amine@267
|
94 save_image,
|
amine@267
|
95 0.2,
|
amine@267
|
96 10,
|
amine@267
|
97 0.3,
|
amine@267
|
98 False,
|
amine@267
|
99 False,
|
amine@267
|
100 55,
|
amine@267
|
101 )
|
amine@267
|
102 misc = (False, None, True, None, "TIME_FORMAT", "TIMESTAMP_FORMAT")
|
amine@267
|
103
|
amine@267
|
104 args_ns = _ArgsNamespece(*(args + misc))
|
amine@267
|
105
|
amine@267
|
106 io_kwargs = {
|
amine@267
|
107 "input": "file",
|
amine@267
|
108 "max_read": 30,
|
amine@267
|
109 "block_dur": 0.01,
|
amine@267
|
110 "sampling_rate": 16000,
|
amine@267
|
111 "sample_width": 2,
|
amine@267
|
112 "channels": 2,
|
amine@267
|
113 "use_channel": exp_use_channel,
|
amine@267
|
114 "save_stream": save_stream,
|
amine@267
|
115 "audio_format": "raw",
|
amine@267
|
116 "export_format": "ogg",
|
amine@267
|
117 "large_file": True,
|
amine@267
|
118 "frames_per_buffer": None,
|
amine@267
|
119 "input_device_index": 1,
|
amine@267
|
120 "record": exp_record,
|
amine@267
|
121 }
|
amine@267
|
122
|
amine@267
|
123 split_kwargs = {
|
amine@267
|
124 "min_dur": 0.2,
|
amine@267
|
125 "max_dur": 10,
|
amine@267
|
126 "max_silence": 0.3,
|
amine@267
|
127 "drop_trailing_silence": False,
|
amine@267
|
128 "strict_min_dur": False,
|
amine@267
|
129 "energy_threshold": 55,
|
amine@267
|
130 }
|
amine@267
|
131
|
amine@267
|
132 miscellaneous = {
|
amine@267
|
133 "echo": False,
|
amine@267
|
134 "command": None,
|
amine@267
|
135 "quiet": True,
|
amine@267
|
136 "printf": None,
|
amine@267
|
137 "time_format": "TIME_FORMAT",
|
amine@267
|
138 "timestamp_format": "TIMESTAMP_FORMAT",
|
amine@267
|
139 }
|
amine@267
|
140
|
amine@267
|
141 expected = KeywordArguments(io_kwargs, split_kwargs, miscellaneous)
|
amine@267
|
142 kwargs = make_kwargs(args_ns)
|
amine@267
|
143 self.assertEqual(kwargs, expected)
|
amine@268
|
144
|
amine@268
|
145 @genty_dataset(
|
amine@268
|
146 only_seconds=("%S", 5400, "5400.000"),
|
amine@268
|
147 only_millis=("%I", 5400, "5400000"),
|
amine@268
|
148 full=("%h:%m:%s.%i", 3725.365, "01:02:05.365"),
|
amine@268
|
149 full_zero_hours=("%h:%m:%s.%i", 1925.075, "00:32:05.075"),
|
amine@268
|
150 full_zero_minutes=("%h:%m:%s.%i", 3659.075, "01:00:59.075"),
|
amine@268
|
151 full_zero_seconds=("%h:%m:%s.%i", 3720.075, "01:02:00.075"),
|
amine@268
|
152 full_zero_millis=("%h:%m:%s.%i", 3725, "01:02:05.000"),
|
amine@268
|
153 duplicate_directive=(
|
amine@268
|
154 "%h %h:%m:%s.%i %s",
|
amine@268
|
155 3725.365,
|
amine@268
|
156 "01 01:02:05.365 05",
|
amine@268
|
157 ),
|
amine@268
|
158 no_millis=("%h:%m:%s", 3725, "01:02:05"),
|
amine@268
|
159 no_seconds=("%h:%m", 3725, "01:02"),
|
amine@268
|
160 no_minutes=("%h", 3725, "01"),
|
amine@268
|
161 no_hours=("%m:%s.%i", 3725, "02:05.000"),
|
amine@268
|
162 )
|
amine@268
|
163 def test_make_duration_fromatter(self, fmt, duration, expected):
|
amine@268
|
164 formatter = make_duration_fromatter(fmt)
|
amine@268
|
165 result = formatter(duration)
|
amine@268
|
166 self.assertEqual(result, expected)
|
amine@268
|
167
|
amine@268
|
168 @genty_dataset(
|
amine@268
|
169 duplicate_only_seconds=("%S %S",),
|
amine@268
|
170 duplicate_only_millis=("%I %I",),
|
amine@268
|
171 unknown_directive=("%x",),
|
amine@268
|
172 )
|
amine@268
|
173 def test_make_duration_fromatter_error(self, fmt):
|
amine@268
|
174 with self.assertRaises(TimeFormatError):
|
amine@268
|
175 make_duration_fromatter(fmt)
|
amine@269
|
176
|
amine@269
|
177 def test_make_logger_stdout_and_file(self):
|
amine@269
|
178 with TemporaryDirectory() as tmpdir:
|
amine@269
|
179 file = os.path.join(tmpdir, "file.log")
|
amine@269
|
180 logger = make_logger(debug_stdout=True, debug_file=file)
|
amine@269
|
181 self.assertEqual(logger.name, LOGGER_NAME)
|
amine@269
|
182 self.assertEqual(len(logger.handlers), 2)
|
amine@269
|
183 self.assertEqual(logger.handlers[0].stream.name, "<stdout>")
|
amine@269
|
184 self.assertEqual(logger.handlers[1].stream.name, file)
|
amine@269
|
185
|
amine@269
|
186 def test_make_logger_None(self):
|
amine@269
|
187 logger = make_logger(debug_stdout=False, debug_file=None)
|
amine@269
|
188 self.assertIsNone(logger)
|
amine@269
|
189 del logger
|