| 1 | from test.test_support import findfile, TESTFN, unlink
|
|---|
| 2 | import unittest
|
|---|
| 3 | import array
|
|---|
| 4 | import io
|
|---|
| 5 | import pickle
|
|---|
| 6 | import sys
|
|---|
| 7 | import base64
|
|---|
| 8 |
|
|---|
| 9 | def fromhex(s):
|
|---|
| 10 | return base64.b16decode(s.replace(' ', ''))
|
|---|
| 11 |
|
|---|
| 12 | def byteswap2(data):
|
|---|
| 13 | a = array.array('h', data)
|
|---|
| 14 | a.byteswap()
|
|---|
| 15 | return a.tostring()
|
|---|
| 16 |
|
|---|
| 17 | def byteswap3(data):
|
|---|
| 18 | ba = bytearray(data)
|
|---|
| 19 | ba[::3] = data[2::3]
|
|---|
| 20 | ba[2::3] = data[::3]
|
|---|
| 21 | return bytes(ba)
|
|---|
| 22 |
|
|---|
| 23 | def byteswap4(data):
|
|---|
| 24 | a = array.array('i', data)
|
|---|
| 25 | a.byteswap()
|
|---|
| 26 | return a.tostring()
|
|---|
| 27 |
|
|---|
| 28 |
|
|---|
| 29 | class AudioTests:
|
|---|
| 30 | close_fd = False
|
|---|
| 31 |
|
|---|
| 32 | def setUp(self):
|
|---|
| 33 | self.f = self.fout = None
|
|---|
| 34 |
|
|---|
| 35 | def tearDown(self):
|
|---|
| 36 | if self.f is not None:
|
|---|
| 37 | self.f.close()
|
|---|
| 38 | if self.fout is not None:
|
|---|
| 39 | self.fout.close()
|
|---|
| 40 | unlink(TESTFN)
|
|---|
| 41 |
|
|---|
| 42 | def check_params(self, f, nchannels, sampwidth, framerate, nframes,
|
|---|
| 43 | comptype, compname):
|
|---|
| 44 | self.assertEqual(f.getnchannels(), nchannels)
|
|---|
| 45 | self.assertEqual(f.getsampwidth(), sampwidth)
|
|---|
| 46 | self.assertEqual(f.getframerate(), framerate)
|
|---|
| 47 | self.assertEqual(f.getnframes(), nframes)
|
|---|
| 48 | self.assertEqual(f.getcomptype(), comptype)
|
|---|
| 49 | self.assertEqual(f.getcompname(), compname)
|
|---|
| 50 |
|
|---|
| 51 | params = f.getparams()
|
|---|
| 52 | self.assertEqual(params,
|
|---|
| 53 | (nchannels, sampwidth, framerate, nframes, comptype, compname))
|
|---|
| 54 |
|
|---|
| 55 | dump = pickle.dumps(params)
|
|---|
| 56 | self.assertEqual(pickle.loads(dump), params)
|
|---|
| 57 |
|
|---|
| 58 |
|
|---|
| 59 | class AudioWriteTests(AudioTests):
|
|---|
| 60 |
|
|---|
| 61 | def create_file(self, testfile):
|
|---|
| 62 | f = self.fout = self.module.open(testfile, 'wb')
|
|---|
| 63 | f.setnchannels(self.nchannels)
|
|---|
| 64 | f.setsampwidth(self.sampwidth)
|
|---|
| 65 | f.setframerate(self.framerate)
|
|---|
| 66 | f.setcomptype(self.comptype, self.compname)
|
|---|
| 67 | return f
|
|---|
| 68 |
|
|---|
| 69 | def check_file(self, testfile, nframes, frames):
|
|---|
| 70 | f = self.module.open(testfile, 'rb')
|
|---|
| 71 | try:
|
|---|
| 72 | self.assertEqual(f.getnchannels(), self.nchannels)
|
|---|
| 73 | self.assertEqual(f.getsampwidth(), self.sampwidth)
|
|---|
| 74 | self.assertEqual(f.getframerate(), self.framerate)
|
|---|
| 75 | self.assertEqual(f.getnframes(), nframes)
|
|---|
| 76 | self.assertEqual(f.readframes(nframes), frames)
|
|---|
| 77 | finally:
|
|---|
| 78 | f.close()
|
|---|
| 79 |
|
|---|
| 80 | def test_write_params(self):
|
|---|
| 81 | f = self.create_file(TESTFN)
|
|---|
| 82 | f.setnframes(self.nframes)
|
|---|
| 83 | f.writeframes(self.frames)
|
|---|
| 84 | self.check_params(f, self.nchannels, self.sampwidth, self.framerate,
|
|---|
| 85 | self.nframes, self.comptype, self.compname)
|
|---|
| 86 | f.close()
|
|---|
| 87 |
|
|---|
| 88 | def test_write(self):
|
|---|
| 89 | f = self.create_file(TESTFN)
|
|---|
| 90 | f.setnframes(self.nframes)
|
|---|
| 91 | f.writeframes(self.frames)
|
|---|
| 92 | f.close()
|
|---|
| 93 |
|
|---|
| 94 | self.check_file(TESTFN, self.nframes, self.frames)
|
|---|
| 95 |
|
|---|
| 96 | def test_incompleted_write(self):
|
|---|
| 97 | with open(TESTFN, 'wb') as testfile:
|
|---|
| 98 | testfile.write(b'ababagalamaga')
|
|---|
| 99 | f = self.create_file(testfile)
|
|---|
| 100 | f.setnframes(self.nframes + 1)
|
|---|
| 101 | f.writeframes(self.frames)
|
|---|
| 102 | f.close()
|
|---|
| 103 |
|
|---|
| 104 | with open(TESTFN, 'rb') as testfile:
|
|---|
| 105 | self.assertEqual(testfile.read(13), b'ababagalamaga')
|
|---|
| 106 | self.check_file(testfile, self.nframes, self.frames)
|
|---|
| 107 |
|
|---|
| 108 | def test_multiple_writes(self):
|
|---|
| 109 | with open(TESTFN, 'wb') as testfile:
|
|---|
| 110 | testfile.write(b'ababagalamaga')
|
|---|
| 111 | f = self.create_file(testfile)
|
|---|
| 112 | f.setnframes(self.nframes)
|
|---|
| 113 | framesize = self.nchannels * self.sampwidth
|
|---|
| 114 | f.writeframes(self.frames[:-framesize])
|
|---|
| 115 | f.writeframes(self.frames[-framesize:])
|
|---|
| 116 | f.close()
|
|---|
| 117 |
|
|---|
| 118 | with open(TESTFN, 'rb') as testfile:
|
|---|
| 119 | self.assertEqual(testfile.read(13), b'ababagalamaga')
|
|---|
| 120 | self.check_file(testfile, self.nframes, self.frames)
|
|---|
| 121 |
|
|---|
| 122 | def test_overflowed_write(self):
|
|---|
| 123 | with open(TESTFN, 'wb') as testfile:
|
|---|
| 124 | testfile.write(b'ababagalamaga')
|
|---|
| 125 | f = self.create_file(testfile)
|
|---|
| 126 | f.setnframes(self.nframes - 1)
|
|---|
| 127 | f.writeframes(self.frames)
|
|---|
| 128 | f.close()
|
|---|
| 129 |
|
|---|
| 130 | with open(TESTFN, 'rb') as testfile:
|
|---|
| 131 | self.assertEqual(testfile.read(13), b'ababagalamaga')
|
|---|
| 132 | self.check_file(testfile, self.nframes, self.frames)
|
|---|
| 133 |
|
|---|
| 134 |
|
|---|
| 135 | class AudioTestsWithSourceFile(AudioTests):
|
|---|
| 136 |
|
|---|
| 137 | @classmethod
|
|---|
| 138 | def setUpClass(cls):
|
|---|
| 139 | cls.sndfilepath = findfile(cls.sndfilename, subdir='audiodata')
|
|---|
| 140 |
|
|---|
| 141 | def test_read_params(self):
|
|---|
| 142 | f = self.f = self.module.open(self.sndfilepath)
|
|---|
| 143 | #self.assertEqual(f.getfp().name, self.sndfilepath)
|
|---|
| 144 | self.check_params(f, self.nchannels, self.sampwidth, self.framerate,
|
|---|
| 145 | self.sndfilenframes, self.comptype, self.compname)
|
|---|
| 146 |
|
|---|
| 147 | def test_close(self):
|
|---|
| 148 | with open(self.sndfilepath, 'rb') as testfile:
|
|---|
| 149 | f = self.f = self.module.open(testfile)
|
|---|
| 150 | self.assertFalse(testfile.closed)
|
|---|
| 151 | f.close()
|
|---|
| 152 | self.assertEqual(testfile.closed, self.close_fd)
|
|---|
| 153 | with open(TESTFN, 'wb') as testfile:
|
|---|
| 154 | fout = self.fout = self.module.open(testfile, 'wb')
|
|---|
| 155 | self.assertFalse(testfile.closed)
|
|---|
| 156 | with self.assertRaises(self.module.Error):
|
|---|
| 157 | fout.close()
|
|---|
| 158 | self.assertEqual(testfile.closed, self.close_fd)
|
|---|
| 159 | fout.close() # do nothing
|
|---|
| 160 |
|
|---|
| 161 | def test_read(self):
|
|---|
| 162 | framesize = self.nchannels * self.sampwidth
|
|---|
| 163 | chunk1 = self.frames[:2 * framesize]
|
|---|
| 164 | chunk2 = self.frames[2 * framesize: 4 * framesize]
|
|---|
| 165 | f = self.f = self.module.open(self.sndfilepath)
|
|---|
| 166 | self.assertEqual(f.readframes(0), b'')
|
|---|
| 167 | self.assertEqual(f.tell(), 0)
|
|---|
| 168 | self.assertEqual(f.readframes(2), chunk1)
|
|---|
| 169 | f.rewind()
|
|---|
| 170 | pos0 = f.tell()
|
|---|
| 171 | self.assertEqual(pos0, 0)
|
|---|
| 172 | self.assertEqual(f.readframes(2), chunk1)
|
|---|
| 173 | pos2 = f.tell()
|
|---|
| 174 | self.assertEqual(pos2, 2)
|
|---|
| 175 | self.assertEqual(f.readframes(2), chunk2)
|
|---|
| 176 | f.setpos(pos2)
|
|---|
| 177 | self.assertEqual(f.readframes(2), chunk2)
|
|---|
| 178 | f.setpos(pos0)
|
|---|
| 179 | self.assertEqual(f.readframes(2), chunk1)
|
|---|
| 180 | with self.assertRaises(self.module.Error):
|
|---|
| 181 | f.setpos(-1)
|
|---|
| 182 | with self.assertRaises(self.module.Error):
|
|---|
| 183 | f.setpos(f.getnframes() + 1)
|
|---|
| 184 |
|
|---|
| 185 | def test_copy(self):
|
|---|
| 186 | f = self.f = self.module.open(self.sndfilepath)
|
|---|
| 187 | fout = self.fout = self.module.open(TESTFN, 'wb')
|
|---|
| 188 | fout.setparams(f.getparams())
|
|---|
| 189 | i = 0
|
|---|
| 190 | n = f.getnframes()
|
|---|
| 191 | while n > 0:
|
|---|
| 192 | i += 1
|
|---|
| 193 | fout.writeframes(f.readframes(i))
|
|---|
| 194 | n -= i
|
|---|
| 195 | fout.close()
|
|---|
| 196 | fout = self.fout = self.module.open(TESTFN, 'rb')
|
|---|
| 197 | f.rewind()
|
|---|
| 198 | self.assertEqual(f.getparams(), fout.getparams())
|
|---|
| 199 | self.assertEqual(f.readframes(f.getnframes()),
|
|---|
| 200 | fout.readframes(fout.getnframes()))
|
|---|
| 201 |
|
|---|
| 202 | def test_read_not_from_start(self):
|
|---|
| 203 | with open(TESTFN, 'wb') as testfile:
|
|---|
| 204 | testfile.write(b'ababagalamaga')
|
|---|
| 205 | with open(self.sndfilepath, 'rb') as f:
|
|---|
| 206 | testfile.write(f.read())
|
|---|
| 207 |
|
|---|
| 208 | with open(TESTFN, 'rb') as testfile:
|
|---|
| 209 | self.assertEqual(testfile.read(13), b'ababagalamaga')
|
|---|
| 210 | f = self.module.open(testfile, 'rb')
|
|---|
| 211 | try:
|
|---|
| 212 | self.assertEqual(f.getnchannels(), self.nchannels)
|
|---|
| 213 | self.assertEqual(f.getsampwidth(), self.sampwidth)
|
|---|
| 214 | self.assertEqual(f.getframerate(), self.framerate)
|
|---|
| 215 | self.assertEqual(f.getnframes(), self.sndfilenframes)
|
|---|
| 216 | self.assertEqual(f.readframes(self.nframes), self.frames)
|
|---|
| 217 | finally:
|
|---|
| 218 | f.close()
|
|---|