chiark / gitweb /
normalize recorded filenames so files.py passes
[disorder] / tests / dtest.py
CommitLineData
c5dbcd79
RK
1#-*-python-*-
2
3"""Utility module used by tests"""
4
7bbe944b 5import os,os.path,subprocess,sys,disorder,unicodedata
c5dbcd79
RK
6
7def copyfile(a,b):
8 """copyfile(A, B)
9Copy A to B."""
10 open(b,"w").write(open(a).read())
11
12def maketrack(s):
13 """maketrack(S)
14
15Make track with relative path S exist"""
121e3654 16 trackpath = "%s/%s" % (tracks, s)
c5dbcd79
RK
17 trackdir = os.path.dirname(trackpath)
18 if not os.path.exists(trackdir):
19 os.makedirs(trackdir)
20 copyfile("%s/sounds/slap.ogg" % topsrcdir, trackpath)
121e3654 21 # We record the tracks we created so they can be tested against
7bbe944b
RK
22 # server responses. We put them into NFC since that's what the server
23 # uses internally.
24 bits = unicodedata.normalize("NFC",
25 unicode(s, "UTF-8")).split('/')
121e3654
RK
26 dp = tracks
27 for d in bits [0:-1]:
28 dd = "%s/%s" % (dp, d)
29 if dp not in dirs_by_dir:
30 dirs_by_dir[dp] = []
31 if dd not in dirs_by_dir[dp]:
32 dirs_by_dir[dp].append(dd)
33 dp = "%s/%s" % (dp, d)
34 if dp not in files_by_dir:
35 files_by_dir[dp] = []
36 files_by_dir[dp].append("%s/%s" % (dp, bits[-1]))
c5dbcd79
RK
37
38def stdtracks():
f9635e06
RK
39 # We create some tracks with non-ASCII characters in the name and
40 # we (currently) force UTF-8.
41 #
42 # On a traditional UNIX filesystem, that treats filenames as byte strings
43 # with special significant for '/', this should just work, though the
44 # names will look wrong to ls(1) in a non UTF-8 locale.
45 #
46 # On Apple HFS+ filenames normalized to a decomposed form that isn't quite
47 # NFD, so our attempts to have both normalized and denormalized filenames
48 # is frustrated. Provided we test on traditional filesytsems too this
49 # shouldn't be a problem.
50 # (See http://developer.apple.com/qa/qa2001/qa1173.html)
121e3654
RK
51
52 global dirs_by_dir, files_by_dir
53 dirs_by_dir={}
54 files_by_dir={}
f9635e06
RK
55
56 # C3 8C = 00CC LATIN CAPITAL LETTER I WITH GRAVE
57 # (in NFC)
58 maketrack("Joe Bloggs/First Album/01:F\xC3\x8Crst track.ogg")
59
c5dbcd79 60 maketrack("Joe Bloggs/First Album/02:Second track.ogg")
f9635e06
RK
61
62 # CC 81 = 0301 COMBINING ACUTE ACCENT
63 # (giving an NFD i-acute)
64 maketrack("Joe Bloggs/First Album/03:ThI\xCC\x81rd track.ogg")
65 # ...hopefuly giving C3 8D = 00CD LATIN CAPITAL LETTER I WITH ACUTE
c5dbcd79
RK
66 maketrack("Joe Bloggs/First Album/04:Fourth track.ogg")
67 maketrack("Joe Bloggs/First Album/05:Fifth track.ogg")
c5dbcd79
RK
68 maketrack("Joe Bloggs/Second Album/01:First track.ogg")
69 maketrack("Joe Bloggs/Second Album/02:Second track.ogg")
70 maketrack("Joe Bloggs/Second Album/03:Third track.ogg")
71 maketrack("Joe Bloggs/Second Album/04:Fourth track.ogg")
72 maketrack("Joe Bloggs/Second Album/05:Fifth track.ogg")
f9635e06
RK
73 maketrack("Joe Bloggs/Third Album/01:First track.ogg")
74 maketrack("Joe Bloggs/Third Album/02:Second track.ogg")
75 maketrack("Joe Bloggs/Third Album/03:Third track.ogg")
76 maketrack("Joe Bloggs/Third Album/04:Fourth track.ogg")
77 maketrack("Joe Bloggs/Third Album/05:Fifth track.ogg")
c5dbcd79
RK
78 maketrack("Fred Smith/Boring/01:Dull.ogg")
79 maketrack("Fred Smith/Boring/02:Tedious.ogg")
80 maketrack("Fred Smith/Boring/03:Drum Solo.ogg")
81 maketrack("Fred Smith/Boring/04:Yawn.ogg")
82 maketrack("misc/blahblahblah.ogg")
83 maketrack("Various/Greatest Hits/01:Jim Whatever - Spong.ogg")
84 maketrack("Various/Greatest Hits/02:Joe Bloggs - Yadda.ogg")
85
86def notracks():
87 pass
88
f9635e06
RK
89def common_setup():
90 remove_dir(testroot)
91 os.mkdir(testroot)
92 open("%s/config" % testroot, "w").write(
93 """player *.ogg shell 'echo "$TRACK" >> %s/played.log'
b6995afb
RK
94home %s
95collection fs UTF-8 %s/tracks
96scratch %s/scratch.ogg
97gap 0
98stopword 01 02 03 04 05 06 07 08 09 10
99stopword 1 2 3 4 5 6 7 8 9
100stopword 11 12 13 14 15 16 17 18 19 20
101stopword 21 22 23 24 25 26 27 28 29 30
102stopword the a an and to too in on of we i am as im for is
103username fred
104password fredpass
105allow fred fredpass
106plugins ../plugins
107player *.mp3 execraw disorder-decode
108player *.ogg execraw disorder-decode
109player *.wav execraw disorder-decode
110player *.flac execraw disorder-decode
111tracklength *.mp3 disorder-tracklength
112tracklength *.ogg disorder-tracklength
113tracklength *.wav disorder-tracklength
114tracklength *.flac disorder-tracklength
115""" % (testroot, testroot, testroot, testroot))
f9635e06
RK
116 copyfile("%s/sounds/scratch.ogg" % topsrcdir,
117 "%s/scratch.ogg" % testroot)
118
119def start_daemon(test):
120 """start_daemon(TEST)
c5dbcd79
RK
121Start the daemon for test called TEST."""
122 global daemon
123 assert daemon == None
124 if test == None:
125 errs = sys.stderr
126 else:
f9635e06 127 errs = open("%s.log" % test, "w")
c5dbcd79
RK
128 server = None
129 print " starting daemon"
130 daemon = subprocess.Popen(["disorderd",
131 "--foreground",
132 "--config", "%s/config" % testroot],
133 stderr=errs)
eee9d4b3
RK
134 disorder._configfile = "%s/config" % testroot
135 disorder._userconf = False
c5dbcd79 136
f9635e06
RK
137def stop_daemon():
138 """stop_daemon()
c5dbcd79
RK
139
140Stop the daemon if it has not stopped already"""
141 global daemon
142 rc = daemon.poll()
143 if rc == None:
eee9d4b3 144 print " stopping daemon"
c5dbcd79
RK
145 os.kill(daemon.pid, 15)
146 rc = daemon.wait()
147 print " daemon has stopped"
148 daemon = None
149
150def run(test, setup=None, report=True, name=None):
151 global tests
152 tests += 1
153 if setup == None:
154 setup = stdtracks
f9635e06 155 common_setup()
c5dbcd79 156 setup()
f9635e06 157 start_daemon(name)
c5dbcd79 158 try:
eee9d4b3
RK
159 try:
160 test()
161 except AssertionError, e:
162 global failures
163 failures += 1
164 print e
165 finally:
f9635e06 166 stop_daemon()
c5dbcd79
RK
167 if report:
168 if failures:
169 print " FAILED"
170 sys.exit(1)
171 else:
172 print " OK"
173
174def remove_dir(d):
175 """remove_dir(D)
176
177Recursively delete directory D"""
178 if os.path.lexists(d):
179 if os.path.isdir(d):
180 for dd in os.listdir(d):
181 remove_dir("%s/%s" % (d, dd))
182 os.rmdir(d)
183 else:
184 os.remove(d)
185
186# -----------------------------------------------------------------------------
187# Common setup
188
189tests = 0
190failures = 0
191daemon = None
192testroot = "%s/testroot" % os.getcwd()
121e3654 193tracks = "%s/tracks" % testroot
c5dbcd79 194topsrcdir = os.path.abspath(os.getenv("topsrcdir"))