annotate tests/test_cmdline_util.py @ 271:dbb12345a19f

Add tests for initialize_workers
author Amine Sehili <amine.sehili@gmail.com>
date Sun, 15 Sep 2019 18:13:07 +0100
parents 549a2b63de9f
children fe8d97a97ea5
rev   line source
amine@269 1 import os
amine@267 2 from unittest import TestCase
amine@271 3 from unittest.mock import patch
amine@269 4 from tempfile import TemporaryDirectory
amine@267 5 from collections import namedtuple
amine@267 6 from genty import genty, genty_dataset
amine@267 7
amine@267 8 from auditok.cmdline_util import (
amine@267 9 LOGGER_NAME,
amine@267 10 make_kwargs,
amine@267 11 make_duration_fromatter,
amine@267 12 make_logger,
amine@267 13 initialize_workers,
amine@267 14 KeywordArguments,
amine@267 15 )
amine@271 16 from auditok.workers import (
amine@271 17 StreamSaverWorker,
amine@271 18 RegionSaverWorker,
amine@271 19 PlayerWorker,
amine@271 20 CommandLineWorker,
amine@271 21 PrintWorker,
amine@271 22 )
amine@267 23 from auditok.exceptions import TimeFormatError
amine@267 24
amine@267 25 _ArgsNamespece = namedtuple(
amine@267 26 "_ArgsNamespece",
amine@267 27 [
amine@267 28 "input",
amine@267 29 "max_time",
amine@267 30 "analysis_window",
amine@267 31 "sampling_rate",
amine@267 32 "sample_width",
amine@267 33 "channels",
amine@267 34 "use_channel",
amine@267 35 "input_format",
amine@267 36 "output_format",
amine@267 37 "large_file",
amine@267 38 "frame_per_buffer",
amine@267 39 "input_device_index",
amine@267 40 "save_stream",
amine@267 41 "plot",
amine@267 42 "save_image",
amine@267 43 "min_duration",
amine@267 44 "max_duration",
amine@267 45 "max_silence",
amine@267 46 "drop_trailing_silence",
amine@267 47 "strict_min_duration",
amine@267 48 "energy_threshold",
amine@267 49 "echo",
amine@267 50 "command",
amine@267 51 "quiet",
amine@267 52 "printf",
amine@267 53 "time_format",
amine@267 54 "timestamp_format",
amine@267 55 ],
amine@267 56 )
amine@267 57
amine@267 58
amine@267 59 @genty
amine@268 60 class _TestCmdLineUtil(TestCase):
amine@267 61 @genty_dataset(
amine@267 62 no_record=("stream.ogg", False, None, "mix", "mix", False),
amine@267 63 no_record_plot=("stream.ogg", True, None, None, None, False),
amine@267 64 no_record_save_image=(
amine@267 65 "stream.ogg",
amine@267 66 True,
amine@267 67 "image.png",
amine@267 68 None,
amine@267 69 None,
amine@267 70 False,
amine@267 71 ),
amine@267 72 record_plot=(None, True, None, None, None, True),
amine@267 73 record_save_image=(None, False, "image.png", None, None, True),
amine@267 74 int_use_channel=("stream.ogg", False, None, "1", 1, False),
amine@267 75 )
amine@267 76 def test_make_kwargs(
amine@267 77 self,
amine@267 78 save_stream,
amine@267 79 plot,
amine@267 80 save_image,
amine@267 81 use_channel,
amine@267 82 exp_use_channel,
amine@267 83 exp_record,
amine@267 84 ):
amine@267 85
amine@267 86 args = (
amine@267 87 "file",
amine@267 88 30,
amine@267 89 0.01,
amine@267 90 16000,
amine@267 91 2,
amine@267 92 2,
amine@267 93 use_channel,
amine@267 94 "raw",
amine@267 95 "ogg",
amine@267 96 True,
amine@267 97 None,
amine@267 98 1,
amine@267 99 save_stream,
amine@267 100 plot,
amine@267 101 save_image,
amine@267 102 0.2,
amine@267 103 10,
amine@267 104 0.3,
amine@267 105 False,
amine@267 106 False,
amine@267 107 55,
amine@267 108 )
amine@267 109 misc = (False, None, True, None, "TIME_FORMAT", "TIMESTAMP_FORMAT")
amine@267 110
amine@267 111 args_ns = _ArgsNamespece(*(args + misc))
amine@267 112
amine@267 113 io_kwargs = {
amine@267 114 "input": "file",
amine@267 115 "max_read": 30,
amine@267 116 "block_dur": 0.01,
amine@267 117 "sampling_rate": 16000,
amine@267 118 "sample_width": 2,
amine@267 119 "channels": 2,
amine@267 120 "use_channel": exp_use_channel,
amine@267 121 "save_stream": save_stream,
amine@267 122 "audio_format": "raw",
amine@267 123 "export_format": "ogg",
amine@267 124 "large_file": True,
amine@267 125 "frames_per_buffer": None,
amine@267 126 "input_device_index": 1,
amine@267 127 "record": exp_record,
amine@267 128 }
amine@267 129
amine@267 130 split_kwargs = {
amine@267 131 "min_dur": 0.2,
amine@267 132 "max_dur": 10,
amine@267 133 "max_silence": 0.3,
amine@267 134 "drop_trailing_silence": False,
amine@267 135 "strict_min_dur": False,
amine@267 136 "energy_threshold": 55,
amine@267 137 }
amine@267 138
amine@267 139 miscellaneous = {
amine@267 140 "echo": False,
amine@267 141 "command": None,
amine@267 142 "quiet": True,
amine@267 143 "printf": None,
amine@267 144 "time_format": "TIME_FORMAT",
amine@267 145 "timestamp_format": "TIMESTAMP_FORMAT",
amine@267 146 }
amine@267 147
amine@267 148 expected = KeywordArguments(io_kwargs, split_kwargs, miscellaneous)
amine@267 149 kwargs = make_kwargs(args_ns)
amine@267 150 self.assertEqual(kwargs, expected)
amine@268 151
amine@268 152 @genty_dataset(
amine@268 153 only_seconds=("%S", 5400, "5400.000"),
amine@268 154 only_millis=("%I", 5400, "5400000"),
amine@268 155 full=("%h:%m:%s.%i", 3725.365, "01:02:05.365"),
amine@268 156 full_zero_hours=("%h:%m:%s.%i", 1925.075, "00:32:05.075"),
amine@268 157 full_zero_minutes=("%h:%m:%s.%i", 3659.075, "01:00:59.075"),
amine@268 158 full_zero_seconds=("%h:%m:%s.%i", 3720.075, "01:02:00.075"),
amine@268 159 full_zero_millis=("%h:%m:%s.%i", 3725, "01:02:05.000"),
amine@268 160 duplicate_directive=(
amine@268 161 "%h %h:%m:%s.%i %s",
amine@268 162 3725.365,
amine@268 163 "01 01:02:05.365 05",
amine@268 164 ),
amine@268 165 no_millis=("%h:%m:%s", 3725, "01:02:05"),
amine@268 166 no_seconds=("%h:%m", 3725, "01:02"),
amine@268 167 no_minutes=("%h", 3725, "01"),
amine@268 168 no_hours=("%m:%s.%i", 3725, "02:05.000"),
amine@268 169 )
amine@268 170 def test_make_duration_fromatter(self, fmt, duration, expected):
amine@268 171 formatter = make_duration_fromatter(fmt)
amine@268 172 result = formatter(duration)
amine@268 173 self.assertEqual(result, expected)
amine@268 174
amine@268 175 @genty_dataset(
amine@268 176 duplicate_only_seconds=("%S %S",),
amine@268 177 duplicate_only_millis=("%I %I",),
amine@268 178 unknown_directive=("%x",),
amine@268 179 )
amine@268 180 def test_make_duration_fromatter_error(self, fmt):
amine@268 181 with self.assertRaises(TimeFormatError):
amine@268 182 make_duration_fromatter(fmt)
amine@269 183
amine@269 184 def test_make_logger_stdout_and_file(self):
amine@269 185 with TemporaryDirectory() as tmpdir:
amine@269 186 file = os.path.join(tmpdir, "file.log")
amine@269 187 logger = make_logger(debug_stdout=True, debug_file=file)
amine@269 188 self.assertEqual(logger.name, LOGGER_NAME)
amine@269 189 self.assertEqual(len(logger.handlers), 2)
amine@269 190 self.assertEqual(logger.handlers[0].stream.name, "<stdout>")
amine@269 191 self.assertEqual(logger.handlers[1].stream.name, file)
amine@269 192
amine@269 193 def test_make_logger_None(self):
amine@269 194 logger = make_logger(debug_stdout=False, debug_file=None)
amine@269 195 self.assertIsNone(logger)
amine@271 196
amine@271 197 def test_initialize_workers_all(self):
amine@271 198 with patch("auditok.cmdline_util.player_for") as patched_player_for:
amine@271 199 reader, observers = initialize_workers(
amine@271 200 input="tests/data/test_16KHZ_mono_400Hz.wav",
amine@271 201 save_stream="output.wav",
amine@271 202 export_format="wave",
amine@271 203 save_detections_as="{id}.wav",
amine@271 204 echo=True,
amine@271 205 progress_bar=False,
amine@271 206 command="some command",
amine@271 207 quiet=False,
amine@271 208 printf="abcd",
amine@271 209 time_format="%S",
amine@271 210 timestamp_format="%h:%M:%S",
amine@271 211 )
amine@271 212 reader.stop()
amine@271 213 self.assertTrue(patched_player_for.called)
amine@271 214 self.assertIsInstance(reader, StreamSaverWorker)
amine@271 215 for obs, cls in zip(
amine@271 216 observers,
amine@271 217 [
amine@271 218 RegionSaverWorker,
amine@271 219 PlayerWorker,
amine@271 220 CommandLineWorker,
amine@271 221 PrintWorker,
amine@271 222 ],
amine@271 223 ):
amine@271 224 self.assertIsInstance(obs, cls)
amine@271 225
amine@271 226 def test_initialize_workers_no_RegionSaverWorker(self):
amine@271 227 with patch("auditok.cmdline_util.player_for") as patched_player_for:
amine@271 228 reader, observers = initialize_workers(
amine@271 229 input="tests/data/test_16KHZ_mono_400Hz.wav",
amine@271 230 save_stream="output.wav",
amine@271 231 export_format="wave",
amine@271 232 save_detections_as=None,
amine@271 233 echo=True,
amine@271 234 progress_bar=False,
amine@271 235 command="some command",
amine@271 236 quiet=False,
amine@271 237 printf="abcd",
amine@271 238 time_format="%S",
amine@271 239 timestamp_format="%h:%M:%S",
amine@271 240 )
amine@271 241 reader.stop()
amine@271 242 self.assertTrue(patched_player_for.called)
amine@271 243 self.assertIsInstance(reader, StreamSaverWorker)
amine@271 244 for obs, cls in zip(
amine@271 245 observers, [PlayerWorker, CommandLineWorker, PrintWorker]
amine@271 246 ):
amine@271 247 self.assertIsInstance(obs, cls)
amine@271 248
amine@271 249 def test_initialize_workers_no_PlayerWorker(self):
amine@271 250 with patch("auditok.cmdline_util.player_for") as patched_player_for:
amine@271 251 reader, observers = initialize_workers(
amine@271 252 input="tests/data/test_16KHZ_mono_400Hz.wav",
amine@271 253 save_stream="output.wav",
amine@271 254 export_format="wave",
amine@271 255 save_detections_as="{id}.wav",
amine@271 256 echo=False,
amine@271 257 progress_bar=False,
amine@271 258 command="some command",
amine@271 259 quiet=False,
amine@271 260 printf="abcd",
amine@271 261 time_format="%S",
amine@271 262 timestamp_format="%h:%M:%S",
amine@271 263 )
amine@271 264 reader.stop()
amine@271 265 self.assertFalse(patched_player_for.called)
amine@271 266 self.assertIsInstance(reader, StreamSaverWorker)
amine@271 267 for obs, cls in zip(
amine@271 268 observers, [RegionSaverWorker, CommandLineWorker, PrintWorker]
amine@271 269 ):
amine@271 270 self.assertIsInstance(obs, cls)
amine@271 271
amine@271 272 def test_initialize_workers_no_CommandLineWorker(self):
amine@271 273 with patch("auditok.cmdline_util.player_for") as patched_player_for:
amine@271 274 reader, observers = initialize_workers(
amine@271 275 input="tests/data/test_16KHZ_mono_400Hz.wav",
amine@271 276 save_stream="output.wav",
amine@271 277 export_format="wave",
amine@271 278 save_detections_as="{id}.wav",
amine@271 279 echo=True,
amine@271 280 progress_bar=False,
amine@271 281 command=None,
amine@271 282 quiet=False,
amine@271 283 printf="abcd",
amine@271 284 time_format="%S",
amine@271 285 timestamp_format="%h:%M:%S",
amine@271 286 )
amine@271 287 reader.stop()
amine@271 288 self.assertTrue(patched_player_for.called)
amine@271 289 self.assertIsInstance(reader, StreamSaverWorker)
amine@271 290 for obs, cls in zip(
amine@271 291 observers, [RegionSaverWorker, PlayerWorker, PrintWorker]
amine@271 292 ):
amine@271 293 self.assertIsInstance(obs, cls)
amine@271 294
amine@271 295 def test_initialize_workers_no_PrintWorker(self):
amine@271 296 with patch("auditok.cmdline_util.player_for") as patched_player_for:
amine@271 297 reader, observers = initialize_workers(
amine@271 298 input="tests/data/test_16KHZ_mono_400Hz.wav",
amine@271 299 save_stream="output.wav",
amine@271 300 export_format="wave",
amine@271 301 save_detections_as="{id}.wav",
amine@271 302 echo=True,
amine@271 303 progress_bar=False,
amine@271 304 command="some command",
amine@271 305 quiet=True,
amine@271 306 printf="abcd",
amine@271 307 time_format="%S",
amine@271 308 timestamp_format="%h:%M:%S",
amine@271 309 )
amine@271 310 reader.stop()
amine@271 311 self.assertTrue(patched_player_for.called)
amine@271 312 self.assertIsInstance(reader, StreamSaverWorker)
amine@271 313 for obs, cls in zip(
amine@271 314 observers, [RegionSaverWorker, PlayerWorker, CommandLineWorker]
amine@271 315 ):
amine@271 316 self.assertIsInstance(obs, cls)
amine@271 317
amine@271 318 def test_initialize_workers_no_observers(self):
amine@271 319 with patch("auditok.cmdline_util.player_for") as patched_player_for:
amine@271 320 reader, observers = initialize_workers(
amine@271 321 input="tests/data/test_16KHZ_mono_400Hz.wav",
amine@271 322 save_stream=None,
amine@271 323 export_format="wave",
amine@271 324 save_detections_as=None,
amine@271 325 echo=True,
amine@271 326 progress_bar=False,
amine@271 327 command=None,
amine@271 328 quiet=True,
amine@271 329 printf="abcd",
amine@271 330 time_format="%S",
amine@271 331 timestamp_format="%h:%M:%S",
amine@271 332 )
amine@271 333 self.assertTrue(patched_player_for.called)
amine@271 334 self.assertFalse(isinstance(reader, StreamSaverWorker))
amine@271 335 self.assertTrue(len(observers), 0)