From 0705f86d81fbbfd7cd34edbb9a55b6aef36a9ed7 Mon Sep 17 00:00:00 2001 From: Anna Schumaker Date: Wed, 6 Feb 2019 14:35:35 -0500 Subject: [PATCH] curds: Add a test for parallel track scanning And add code for generating a large test library to make stress testing possible. Signed-off-by: Anna Schumaker --- Makefile | 1 + curds/test_track.py | 20 +++++++++++++++++++- trier/generate_tracks.py | 18 ++++++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 226efc2..bc97877 100644 --- a/Makefile +++ b/Makefile @@ -3,6 +3,7 @@ clean: find . -type d -name __pycache__ -exec rm -r {} \+ find trier -type d -name "Test Album" -exec rm -r {} \+ + find trier -type d -name "Test Library" -exec rm -r {} \+ .PHONY: trier trier: diff --git a/curds/test_track.py b/curds/test_track.py index 88a74d7..a36fbb0 100644 --- a/curds/test_track.py +++ b/curds/test_track.py @@ -1,10 +1,13 @@ # Copyright 2019 (c) Anna Schumaker. +import asyncio +import concurrent.futures import mutagen import unittest import os import track -test_tracks = os.path.abspath("./trier/Test Album") +test_tracks = os.path.abspath("./trier/Test Album") +test_library = os.path.abspath("./trier/Test Library") class TestTrackClass(unittest.TestCase): def test_init_basic(self): @@ -50,6 +53,7 @@ class TestTrackClass(unittest.TestCase): self.assertEqual(track.Track(join(test_tracks, "10 - Test {Disc 20}.ogg")).discnumber, 20) def test_track_add(self): + track.tracklist.clear() t = track.add(os.path.join(test_tracks, "01 - Test Track.ogg")) self.assertIsNotNone(t) self.assertEqual(len(track.tracklist), 1) @@ -65,5 +69,19 @@ class TestTrackClass(unittest.TestCase): self.assertEqual(len(track.tracklist), 2) self.assertIn(u, track.tracklist) + def test_parallel_add(self): + track.tracklist.clear() + count = 0 + tracks = [ ] + with concurrent.futures.ThreadPoolExecutor(max_workers=5) as pool: + for dirname, subdirs, files in os.walk(test_library): + for f in files: + tracks.append(pool.submit(track.add, os.path.join(dirname, f))) + count += 1 + self.assertEqual(len(track.tracklist), count) + self.assertEqual(len(tracks), count) + for t in tracks: + self.assertIsNotNone(t) + if __name__ == '__main--': unittest.main() diff --git a/trier/generate_tracks.py b/trier/generate_tracks.py index eca9ec3..7b832d8 100644 --- a/trier/generate_tracks.py +++ b/trier/generate_tracks.py @@ -8,6 +8,8 @@ ffmpeg = "ffmpeg -hide_banner -nostdin -f s16le -i /dev/zero -codec libvorbis -l def generate_track(length, filename, tags={}): path = os.path.join(trier, filename) + if os.path.exists(path): + return os.makedirs(os.path.dirname(path), exist_ok=True) subprocess.run(ffmpeg + [ "-t", str(length), path ]) @@ -16,6 +18,7 @@ def generate_track(length, filename, tags={}): fileinfo[key] = value fileinfo.save() +# Create a bunch of tracks in the Test Album directory generate_track( 0, "Test Album/00 - Empty Track.ogg") generate_track(10, "Test Album/01 - Test Track.ogg", { "title" : "Test Track", "artist" : "Test Artist", @@ -43,3 +46,18 @@ generate_track(50, "Test Album/09 - Test {Disc 02}.ogg", { "Title" : "Test {Disc "album" : "Test Album {Disc 02}" }) generate_track(55, "Test Album/10 - Test {Disc 20}.ogg", { "Title" : "Test {Disc 20}", "album" : "Test Album {Disc 20}" }) + +# Create a giant library for testing +for artistno in range(1, 26): + artist = f"Test Artist {artistno:02}" + for albumno in range(1, 6): + album = f"Test Album {albumno}" + for trackno in range(1, 11): + title = f"Test Track {trackno:02}" + generate_track(trackno, f"Test Library/{artist}/{album}/{trackno:02} - {title}.ogg", + { "title" : title, + "artist" : artist, + "album" : album, + "genre" : f"Test Genre {albumno}", + "date" : str(1970 + (albumno * 3)), + "tracknumber" : f"{trackno:02}" })