123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284 |
- from test.test_support import findfile, TESTFN, unlink
- import unittest
- import array
- import io
- import pickle
- import sys
- import base64
- class UnseekableIO(file):
- def tell(self):
- raise io.UnsupportedOperation
- def seek(self, *args, **kwargs):
- raise io.UnsupportedOperation
- def fromhex(s):
- return base64.b16decode(s.replace(' ', ''))
- def byteswap2(data):
- a = array.array('h')
- a.fromstring(data)
- a.byteswap()
- return a.tostring()
- def byteswap3(data):
- ba = bytearray(data)
- ba[::3] = data[2::3]
- ba[2::3] = data[::3]
- return bytes(ba)
- def byteswap4(data):
- a = array.array('i')
- a.fromstring(data)
- a.byteswap()
- return a.tostring()
- class AudioTests:
- close_fd = False
- def setUp(self):
- self.f = self.fout = None
- def tearDown(self):
- if self.f is not None:
- self.f.close()
- if self.fout is not None:
- self.fout.close()
- unlink(TESTFN)
- def check_params(self, f, nchannels, sampwidth, framerate, nframes,
- comptype, compname):
- self.assertEqual(f.getnchannels(), nchannels)
- self.assertEqual(f.getsampwidth(), sampwidth)
- self.assertEqual(f.getframerate(), framerate)
- self.assertEqual(f.getnframes(), nframes)
- self.assertEqual(f.getcomptype(), comptype)
- self.assertEqual(f.getcompname(), compname)
- params = f.getparams()
- self.assertEqual(params,
- (nchannels, sampwidth, framerate, nframes, comptype, compname))
- for proto in range(pickle.HIGHEST_PROTOCOL + 1):
- dump = pickle.dumps(params, proto)
- self.assertEqual(pickle.loads(dump), params)
- class AudioWriteTests(AudioTests):
- def create_file(self, testfile):
- f = self.fout = self.module.open(testfile, 'wb')
- f.setnchannels(self.nchannels)
- f.setsampwidth(self.sampwidth)
- f.setframerate(self.framerate)
- f.setcomptype(self.comptype, self.compname)
- return f
- def check_file(self, testfile, nframes, frames):
- f = self.module.open(testfile, 'rb')
- try:
- self.assertEqual(f.getnchannels(), self.nchannels)
- self.assertEqual(f.getsampwidth(), self.sampwidth)
- self.assertEqual(f.getframerate(), self.framerate)
- self.assertEqual(f.getnframes(), nframes)
- self.assertEqual(f.readframes(nframes), frames)
- finally:
- f.close()
- def test_write_params(self):
- f = self.create_file(TESTFN)
- f.setnframes(self.nframes)
- f.writeframes(self.frames)
- self.check_params(f, self.nchannels, self.sampwidth, self.framerate,
- self.nframes, self.comptype, self.compname)
- f.close()
- def test_write(self):
- f = self.create_file(TESTFN)
- f.setnframes(self.nframes)
- f.writeframes(self.frames)
- f.close()
- self.check_file(TESTFN, self.nframes, self.frames)
- def test_incompleted_write(self):
- with open(TESTFN, 'wb') as testfile:
- testfile.write(b'ababagalamaga')
- f = self.create_file(testfile)
- f.setnframes(self.nframes + 1)
- f.writeframes(self.frames)
- f.close()
- with open(TESTFN, 'rb') as testfile:
- self.assertEqual(testfile.read(13), b'ababagalamaga')
- self.check_file(testfile, self.nframes, self.frames)
- def test_multiple_writes(self):
- with open(TESTFN, 'wb') as testfile:
- testfile.write(b'ababagalamaga')
- f = self.create_file(testfile)
- f.setnframes(self.nframes)
- framesize = self.nchannels * self.sampwidth
- f.writeframes(self.frames[:-framesize])
- f.writeframes(self.frames[-framesize:])
- f.close()
- with open(TESTFN, 'rb') as testfile:
- self.assertEqual(testfile.read(13), b'ababagalamaga')
- self.check_file(testfile, self.nframes, self.frames)
- def test_overflowed_write(self):
- with open(TESTFN, 'wb') as testfile:
- testfile.write(b'ababagalamaga')
- f = self.create_file(testfile)
- f.setnframes(self.nframes - 1)
- f.writeframes(self.frames)
- f.close()
- with open(TESTFN, 'rb') as testfile:
- self.assertEqual(testfile.read(13), b'ababagalamaga')
- self.check_file(testfile, self.nframes, self.frames)
- def test_unseekable_read(self):
- f = self.create_file(TESTFN)
- f.setnframes(self.nframes)
- f.writeframes(self.frames)
- f.close()
- with UnseekableIO(TESTFN, 'rb') as testfile:
- self.check_file(testfile, self.nframes, self.frames)
- def test_unseekable_write(self):
- with UnseekableIO(TESTFN, 'wb') as testfile:
- f = self.create_file(testfile)
- f.setnframes(self.nframes)
- f.writeframes(self.frames)
- f.close()
- self.fout = None
- self.check_file(TESTFN, self.nframes, self.frames)
- def test_unseekable_incompleted_write(self):
- with UnseekableIO(TESTFN, 'wb') as testfile:
- testfile.write(b'ababagalamaga')
- f = self.create_file(testfile)
- f.setnframes(self.nframes + 1)
- try:
- f.writeframes(self.frames)
- except IOError:
- pass
- try:
- f.close()
- except IOError:
- pass
- with open(TESTFN, 'rb') as testfile:
- self.assertEqual(testfile.read(13), b'ababagalamaga')
- self.check_file(testfile, self.nframes + 1, self.frames)
- def test_unseekable_overflowed_write(self):
- with UnseekableIO(TESTFN, 'wb') as testfile:
- testfile.write(b'ababagalamaga')
- f = self.create_file(testfile)
- f.setnframes(self.nframes - 1)
- try:
- f.writeframes(self.frames)
- except IOError:
- pass
- try:
- f.close()
- except IOError:
- pass
- with open(TESTFN, 'rb') as testfile:
- self.assertEqual(testfile.read(13), b'ababagalamaga')
- framesize = self.nchannels * self.sampwidth
- self.check_file(testfile, self.nframes - 1, self.frames[:-framesize])
- class AudioTestsWithSourceFile(AudioTests):
- @classmethod
- def setUpClass(cls):
- cls.sndfilepath = findfile(cls.sndfilename, subdir='audiodata')
- def test_read_params(self):
- f = self.f = self.module.open(self.sndfilepath)
-
- self.check_params(f, self.nchannels, self.sampwidth, self.framerate,
- self.sndfilenframes, self.comptype, self.compname)
- def test_close(self):
- with open(self.sndfilepath, 'rb') as testfile:
- f = self.f = self.module.open(testfile)
- self.assertFalse(testfile.closed)
- f.close()
- self.assertEqual(testfile.closed, self.close_fd)
- with open(TESTFN, 'wb') as testfile:
- fout = self.fout = self.module.open(testfile, 'wb')
- self.assertFalse(testfile.closed)
- with self.assertRaises(self.module.Error):
- fout.close()
- self.assertEqual(testfile.closed, self.close_fd)
- fout.close()
- def test_read(self):
- framesize = self.nchannels * self.sampwidth
- chunk1 = self.frames[:2 * framesize]
- chunk2 = self.frames[2 * framesize: 4 * framesize]
- f = self.f = self.module.open(self.sndfilepath)
- self.assertEqual(f.readframes(0), b'')
- self.assertEqual(f.tell(), 0)
- self.assertEqual(f.readframes(2), chunk1)
- f.rewind()
- pos0 = f.tell()
- self.assertEqual(pos0, 0)
- self.assertEqual(f.readframes(2), chunk1)
- pos2 = f.tell()
- self.assertEqual(pos2, 2)
- self.assertEqual(f.readframes(2), chunk2)
- f.setpos(pos2)
- self.assertEqual(f.readframes(2), chunk2)
- f.setpos(pos0)
- self.assertEqual(f.readframes(2), chunk1)
- with self.assertRaises(self.module.Error):
- f.setpos(-1)
- with self.assertRaises(self.module.Error):
- f.setpos(f.getnframes() + 1)
- def test_copy(self):
- f = self.f = self.module.open(self.sndfilepath)
- fout = self.fout = self.module.open(TESTFN, 'wb')
- fout.setparams(f.getparams())
- i = 0
- n = f.getnframes()
- while n > 0:
- i += 1
- fout.writeframes(f.readframes(i))
- n -= i
- fout.close()
- fout = self.fout = self.module.open(TESTFN, 'rb')
- f.rewind()
- self.assertEqual(f.getparams(), fout.getparams())
- self.assertEqual(f.readframes(f.getnframes()),
- fout.readframes(fout.getnframes()))
- def test_read_not_from_start(self):
- with open(TESTFN, 'wb') as testfile:
- testfile.write(b'ababagalamaga')
- with open(self.sndfilepath, 'rb') as f:
- testfile.write(f.read())
- with open(TESTFN, 'rb') as testfile:
- self.assertEqual(testfile.read(13), b'ababagalamaga')
- f = self.module.open(testfile, 'rb')
- try:
- self.assertEqual(f.getnchannels(), self.nchannels)
- self.assertEqual(f.getsampwidth(), self.sampwidth)
- self.assertEqual(f.getframerate(), self.framerate)
- self.assertEqual(f.getnframes(), self.sndfilenframes)
- self.assertEqual(f.readframes(self.nframes), self.frames)
- finally:
- f.close()
|