def test_hls_encrypted_aes128_incorrect_block_length(self, mock_log): aesKey, aesIv, key = self.gen_key() # noinspection PyTypeChecker thread, segments = self.subject([ Playlist(0, [key] + [ SegmentEnc(0, aesKey, aesIv, append=b"?" * 1), SegmentEnc( 1, aesKey, aesIv, append=b"?" * (AES.block_size - 1)) ], end=True) ]) self.await_write(2) data = self.await_read(read_all=True) expected = self.content(segments, prop="content_plain") self.assertEqual(data, expected, "Removes garbage data from segments") self.assertIn(call("Cutting off 1 bytes of garbage before decrypting"), mock_log.debug.mock_calls) self.assertIn( call("Cutting off 15 bytes of garbage before decrypting"), mock_log.debug.mock_calls)
def test_filtered_closed(self): thread, reader, writer, segments = self.subject( [Playlist( 0, [SegmentFiltered(0), SegmentFiltered(1)])]) # mock the reader thread's filter_event.wait method, so that the main thread can wait on its call filter_event_wait_called = Event() orig_wait = reader.filter_event.wait def mocked_wait(*args, **kwargs): filter_event_wait_called.set() return orig_wait(*args, **kwargs) mock = patch.object(reader.filter_event, "wait", side_effect=mocked_wait) mock.start() # write first filtered segment and trigger the filter_event's lock self.assertTrue(reader.filter_event.is_set(), "Doesn't let the reader wait if not filtering") self.await_write() self.assertFalse(reader.filter_event.is_set(), "Lets the reader wait if filtering") # make reader read (no data available yet) thread.read_wait.set() # before calling reader.close(), wait until reader thread's filter_event.wait was called filter_event_wait_called.wait() # close stream while reader is waiting for filtering to end thread.reader.close() thread.read_done.wait() thread.read_done.clear() self.assertEqual(thread.data, [b""], "Stops reading on stream close") self.assertFalse(thread.error, "Is not a read timeout on stream close") mock.stop()
def test_hls_playlist_reload_time_no_data(self): time = self.subject([Playlist(0, [], end=True, targetduration=0)], reload_time="default") self.assertEqual( time, 15, "sets reload time to 15 seconds when no data is available")
def test_hls_playlist_reload_time_number(self): time = self.subject( [Playlist(0, self.segments, end=True, targetduration=6)], reload_time="4") self.assertEqual(time, 4, "number values override the reload time")
def test_hls_playlist_reload_time_no_target_duration(self): time = self.subject([Playlist(0, self.segments, end=True, targetduration=0)], reload_time="default") self.assertEqual(time, 8, "uses the live-edge sum if the playlist is missing the targetduration data")
def test_hls_playlist_reload_time_number_invalid(self): time = self.subject([Playlist(0, self.segments, end=True, targetduration=6)], reload_time="0") self.assertEqual(time, 6, "invalid number values set the reload time to the playlist's targetduration")
def test_hls_playlist_reload_time_live_edge(self): time = self.subject([Playlist(0, self.segments, end=True, targetduration=6)], reload_time="live-edge") self.assertEqual(time, 8, "live-edge sets the reload time to the sum of the number of segments of the live-edge")
def test_hls_playlist_reload_time_segment(self): time = self.subject([Playlist(0, self.segments, end=True, targetduration=6)], reload_time="segment") self.assertEqual(time, 3, "segment sets the reload time to the playlist's last segment")
def test_hls_playlist_reload_time_default(self): time = self.subject([Playlist(0, self.segments, end=True, targetduration=6)], reload_time="default") self.assertEqual(time, 6, "default sets the reload time to the playlist's target duration")
def test_hls_playlist_reload_time_live_edge_no_segments_no_targetduration(self): time = self.subject([Playlist(0, [], end=True, targetduration=0)], reload_time="live-edge") self.assertEqual(time, 6, "sets reload time to 6 seconds when no segments and no targetduration are available")
def test_hls_playlist_reload_time_live_edge_no_segments(self): time = self.subject([Playlist(0, [], end=True, targetduration=4)], reload_time="live-edge") self.assertEqual(time, 4, "live-edge sets the reload time to the targetduration if no segments are available")