chiark / gitweb /
test to verify current dbversion behavior
[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
1c8f3db8
RK
119def start_daemon():
120 """start_daemon()
121Start the daemon."""
122 global daemon,errs
123 assert daemon is None
c5dbcd79
RK
124 server = None
125 print " starting daemon"
126 daemon = subprocess.Popen(["disorderd",
127 "--foreground",
128 "--config", "%s/config" % testroot],
129 stderr=errs)
130
f9635e06
RK
131def stop_daemon():
132 """stop_daemon()
c5dbcd79
RK
133
134Stop the daemon if it has not stopped already"""
135 global daemon
1c8f3db8 136 assert daemon is not None
c5dbcd79
RK
137 rc = daemon.poll()
138 if rc == None:
eee9d4b3 139 print " stopping daemon"
c5dbcd79
RK
140 os.kill(daemon.pid, 15)
141 rc = daemon.wait()
142 print " daemon has stopped"
143 daemon = None
144
145def run(test, setup=None, report=True, name=None):
1c8f3db8 146 global tests,errs
c5dbcd79
RK
147 tests += 1
148 if setup == None:
149 setup = stdtracks
1c8f3db8
RK
150 errs = open("%s.log" % test.__name__, "w") # HNGGGH. nO.
151 disorder._configfile = "%s/config" % testroot
152 disorder._userconf = False
f9635e06 153 common_setup()
c5dbcd79 154 setup()
c5dbcd79 155 try:
eee9d4b3
RK
156 try:
157 test()
158 except AssertionError, e:
159 global failures
160 failures += 1
161 print e
162 finally:
1c8f3db8
RK
163 if daemon is not None:
164 stop_daemon()
c5dbcd79
RK
165 if report:
166 if failures:
167 print " FAILED"
168 sys.exit(1)
169 else:
170 print " OK"
171
172def remove_dir(d):
173 """remove_dir(D)
174
175Recursively delete directory D"""
176 if os.path.lexists(d):
177 if os.path.isdir(d):
178 for dd in os.listdir(d):
179 remove_dir("%s/%s" % (d, dd))
180 os.rmdir(d)
181 else:
182 os.remove(d)
183
184# -----------------------------------------------------------------------------
185# Common setup
186
187tests = 0
188failures = 0
189daemon = None
190testroot = "%s/testroot" % os.getcwd()
121e3654 191tracks = "%s/tracks" % testroot
c5dbcd79 192topsrcdir = os.path.abspath(os.getenv("topsrcdir"))