diff --git a/Lib/test/Sine-1000Hz-300ms.au b/Lib/test/Sine-1000Hz-300ms.au new file mode 100644 index 0000000000000000000000000000000000000000..a19cd1c0e5a1bd19947288cab904be5b5d32956d GIT binary patch literal 57644 zc%1FdEln&>hqaX9wi~YEZ z`^bsB$c_A;@=y8u_51ZB`^eVw^?bEmZI}DyesQumnGff~X?5nK5TE zxDhCrxB&U?!tk7O{@(B1b9+;%od2ZMyu7=5eCnQNQ%VOZlU_ddhu=&(Oxg6%?zYoD z6Ki#}I_l=Sxyjk&tX`}a3#CHoxO`k*SJ%~Etyh~hW{rNc-~77&x*xWNt=Qup@9`hG z$j4mFM^E%cZ}ea6E_Q>>VAJ?+d{39t<>%sav7K+{C$p2;>-2Sc{eJ!a{Pz5oALqxN zQD+o;+~Ym|BNzFYi}~n@zUbxW=jZ3==jZ3==jZ3==jZ3==jZ3==jZ3==jZ3==jZ3= z=jZ3==jZ3==jZ3==jZ3==jZ3==jZ3==jZ3==jZ3==jZ3==jZ3==jZ3==jZ3==jZ3= z=jZ3==jZ3==jZ3==jZ3==jZ3==jZ3==jZ3==jZ3==jZ3==jZ3==jZ3==jZ3==jZ3= z=jZ3==jZ3==jZ3==jZ3==jZ3==jZ3==jZ3==jZ3==jZ3==jZ3==jZ3==jZ3==jZ3= n=jZ3==jZ3==jZ3==jZ3==jZ3==jZ3==jZ3==jZ3={}28@9^a|) diff --git a/Lib/test/audiotests.py b/Lib/test/audiotests.py new file mode 100644 --- /dev/null +++ b/Lib/test/audiotests.py @@ -0,0 +1,235 @@ +from test.support import findfile, TESTFN, unlink +import unittest +import io +import pickle + +nchannels = 2 +sampwidth = 2 +framerate = 8000 +nframes = 100 +frames = bytes(i & 0xff for i in range(nframes * nchannels * sampwidth)) + +class UnseekableIO(io.FileIO): + def tell(self): + raise io.UnsupportedOperation + + def seek(self, *args, **kwargs): + raise io.UnsupportedOperation + + def close(self): + pass + + +class AudioTest: + comptype = 'NONE' + compname = 'not compressed' + close_fd = False + + @classmethod + def setUpClass(cls): + cls.sndfilepath = findfile(cls.sndfilename) + + 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)) + self.assertEqual(params.nchannels, nchannels) + self.assertEqual(params.sampwidth, sampwidth) + self.assertEqual(params.framerate, framerate) + self.assertEqual(params.nframes, nframes) + self.assertEqual(params.comptype, comptype) + self.assertEqual(params.compname, compname) + + dump = pickle.dumps(params) + self.assertEqual(pickle.loads(dump), params) + + def test_read_params(self): + f = self.f = self.module.open(self.sndfilepath) + #self.assertEqual(f.getfp().name, self.sndfilepath) + self.check_params(f, 2, 2, 48000, 14400, self.comptype, self.compname) + + def test_write_params(self): + f = self.create_file(TESTFN, nchannels, sampwidth, framerate) + f.setnframes(nframes) + f.writeframes(frames) + self.check_params(f, nchannels, sampwidth, framerate, nframes, + self.comptype, self.compname) + f.close() + + def test_close(self): + testfile = open(self.sndfilepath, 'rb') + f = self.f = self.module.open(testfile) + self.assertFalse(testfile.closed) + f.close() + self.assertEqual(testfile.closed, self.close_fd) + testfile = open(TESTFN, 'wb') + 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() # do nothing + + def test_write_context_manager_calls_close(self): + # Close checks for a minimum header and will raise an error + # if it is not set, so this proves that close is called. + with self.assertRaises(self.module.Error): + with self.module.open(TESTFN, 'wb'): + pass + with self.assertRaises(self.module.Error): + with open(TESTFN, 'wb') as testfile: + with self.module.open(testfile): + pass + + def test_context_manager_with_open_file(self): + with open(TESTFN, 'wb') as testfile: + with self.module.open(testfile) as f: + f.setnchannels(nchannels) + f.setsampwidth(sampwidth) + f.setframerate(framerate) + self.assertEqual(testfile.closed, self.close_fd) + with open(TESTFN, 'rb') as testfile: + with self.module.open(testfile) as f: + self.assertFalse(f.getfp().closed) + params = f.getparams() + self.assertEqual(params.nchannels, nchannels) + self.assertEqual(params.sampwidth, sampwidth) + self.assertEqual(params.framerate, framerate) + self.assertIsNone(f.getfp()) + self.assertEqual(testfile.closed, self.close_fd) + + def test_context_manager_with_filename(self): + # If the file doesn't get closed, this test won't fail, but it will + # produce a resource leak warning. + with self.module.open(TESTFN, 'wb') as f: + f.setnchannels(nchannels) + f.setsampwidth(sampwidth) + f.setframerate(framerate) + with self.module.open(TESTFN) as f: + self.assertFalse(f.getfp().closed) + params = f.getparams() + self.assertEqual(params.nchannels, nchannels) + self.assertEqual(params.sampwidth, sampwidth) + self.assertEqual(params.framerate, framerate) + self.assertIsNone(f.getfp()) + + chunk1 = b'\x00\x00\x00\x00\x0b\xd4\x0b\xd4' + chunk2 = b'\x17t\x17t"\xad"\xad' + + def test_read(self): + f = self.f = self.module.open(self.sndfilepath) + self.assertEqual(f.readframes(0), b'') + self.assertEqual(f.tell(), 0) + self.assertEqual(f.readframes(2), self.chunk1) + f.rewind() + pos0 = f.tell() + self.assertEqual(pos0, 0) + self.assertEqual(f.readframes(2), self.chunk1) + pos2 = f.tell() + self.assertEqual(pos2, 2) + self.assertEqual(f.readframes(2), self.chunk2) + f.setpos(pos2) + self.assertEqual(f.readframes(2), self.chunk2) + f.setpos(pos0) + self.assertEqual(f.readframes(2), self.chunk1) + with self.assertRaises(self.module.Error): + f.setpos(-1) + with self.assertRaises(self.module.Error): + f.setpos(f.getnframes() + 1) + + def test_write(self): + f = self.f = self.module.open(self.sndfilepath) + fout = self.fout = self.module.open(TESTFN, 'wb') + fout.setparams(f.getparams()) + for frame in range(f.getnframes()): + fout.writeframes(f.readframes(1)) + fout.close() + fout = self.fout = self.module.open(TESTFN, 'rb') + f.rewind() + self.assertEqual(f.getparams(), fout.getparams()) + self.assertEqual(f.readframes(5), fout.readframes(5)) + + def create_file(self, testfile, nchannels, sampwidth, framerate): + f = self.fout = self.module.open(testfile, 'wb') + f.setnchannels(nchannels) + f.setsampwidth(sampwidth) + f.setframerate(framerate) + f.setcomptype(self.comptype, self.compname) + return f + + def check_file(self, testfile, nchannels, sampwidth, framerate, nframes, + frames): + with self.module.open(testfile, 'rb') as f: + self.assertEqual(f.getnchannels(), nchannels) + self.assertEqual(f.getsampwidth(), sampwidth) + self.assertEqual(f.getframerate(), framerate) + self.assertEqual(f.getnframes(), nframes) + self.assertEqual(f.readframes(nframes), frames) + + def test_lin(self): + f = self.create_file(TESTFN, nchannels, sampwidth, framerate) + f.setnframes(nframes) + f.writeframes(frames) + f.close() + + self.check_file(TESTFN, + nchannels, sampwidth, framerate, nframes, frames) + + def test_incompleted_output(self): + with open(TESTFN, 'wb') as testfile: + testfile.write(b'ababagalamaga') + f = self.create_file(testfile, nchannels, sampwidth, framerate) + f.setnframes(nframes + 1) + f.writeframes(frames) + f.close() + + with open(TESTFN, 'rb') as testfile: + self.assertEqual(testfile.read(13), b'ababagalamaga') + self.check_file(testfile, + nchannels, sampwidth, framerate, nframes, frames) + + def test_multiple_output(self): + with open(TESTFN, 'wb') as testfile: + testfile.write(b'ababagalamaga') + f = self.create_file(testfile, nchannels, sampwidth, framerate) + f.setnframes(2 * nframes) + f.writeframes(frames) + f.writeframes(frames) + f.close() + + with open(TESTFN, 'rb') as testfile: + self.assertEqual(testfile.read(13), b'ababagalamaga') + self.check_file(testfile, + nchannels, sampwidth, framerate, + 2 * nframes, 2 * frames) + + def test_overflowed_output(self): + with open(TESTFN, 'wb') as testfile: + testfile.write(b'ababagalamaga') + f = self.create_file(testfile, nchannels, sampwidth, framerate) + f.setnframes(nframes - 1) + f.writeframes(frames) + f.close() + + with open(TESTFN, 'rb') as testfile: + self.assertEqual(testfile.read(13), b'ababagalamaga') + self.check_file(testfile, + nchannels, sampwidth, framerate, nframes, frames) diff --git a/Lib/test/test_aifc.py b/Lib/test/test_aifc.py --- a/Lib/test/test_aifc.py +++ b/Lib/test/test_aifc.py @@ -1,28 +1,22 @@ -from test.support import findfile, run_unittest, TESTFN, unlink +from test.support import TESTFN, unlink import unittest import os import io import struct -import pickle +from test.audiotests import AudioTest import aifc -class AIFCTest(unittest.TestCase): - - def setUp(self): - self.f = self.fout = None - self.sndfilepath = findfile('Sine-1000Hz-300ms.aif') +class AIFCTest(AudioTest, unittest.TestCase): + module = aifc + sndfilename = 'Sine-1000Hz-300ms.aif' + comptype = b'NONE' + compname = b'not compressed' + close_fd = True def tearDown(self): - if self.f is not None: - self.f.close() - if self.fout is not None: - try: - self.fout.close() - except (aifc.Error, AttributeError): - pass - unlink(TESTFN) + super().tearDown() unlink(TESTFN + '.aiff') def test_skipunknown(self): @@ -30,29 +24,6 @@ #This file contains chunk types aifc doesn't recognize. self.f = aifc.open(self.sndfilepath) - def test_params(self): - f = self.f = aifc.open(self.sndfilepath) - params = f.getparams() - self.assertEqual(f.getfp().name, self.sndfilepath) - self.assertEqual(f.getnchannels(), 2) - self.assertEqual(f.getsampwidth(), 2) - self.assertEqual(f.getframerate(), 48000) - self.assertEqual(f.getnframes(), 14400) - self.assertEqual(f.getcomptype(), b'NONE') - self.assertEqual(f.getcompname(), b'not compressed') - self.assertEqual( - f.getparams(), - (2, 2, 48000, 14400, b'NONE', b'not compressed'), - ) - - params = f.getparams() - self.assertEqual(params.nchannels, 2) - self.assertEqual(params.sampwidth, 2) - self.assertEqual(params.framerate, 48000) - self.assertEqual(params.nframes, 14400) - self.assertEqual(params.comptype, b'NONE') - self.assertEqual(params.compname, b'not compressed') - def test_params_added(self): f = self.f = aifc.open(TESTFN, 'wb') f.aiff() @@ -68,59 +39,6 @@ self.assertEqual(params.comptype, f.getcomptype()) self.assertEqual(params.compname, f.getcompname()) - def test_getparams_picklable(self): - self.f = aifc.open(self.sndfilepath) - params = self.f.getparams() - dump = pickle.dumps(params) - self.assertEqual(pickle.loads(dump), params) - self.f.close() - - def test_context_manager(self): - with open(self.sndfilepath, 'rb') as testfile: - with aifc.open(testfile) as f: - pass - self.assertEqual(testfile.closed, True) - with open(TESTFN, 'wb') as testfile: - with self.assertRaises(aifc.Error): - with aifc.open(testfile, 'wb') as fout: - pass - self.assertEqual(testfile.closed, True) - fout.close() # do nothing - - def test_read(self): - f = self.f = aifc.open(self.sndfilepath) - self.assertEqual(f.readframes(0), b'') - self.assertEqual(f.tell(), 0) - self.assertEqual(f.readframes(2), b'\x00\x00\x00\x00\x0b\xd4\x0b\xd4') - f.rewind() - pos0 = f.tell() - self.assertEqual(pos0, 0) - self.assertEqual(f.readframes(2), b'\x00\x00\x00\x00\x0b\xd4\x0b\xd4') - pos2 = f.tell() - self.assertEqual(pos2, 2) - self.assertEqual(f.readframes(2), b'\x17t\x17t"\xad"\xad') - f.setpos(pos2) - self.assertEqual(f.readframes(2), b'\x17t\x17t"\xad"\xad') - f.setpos(pos0) - self.assertEqual(f.readframes(2), b'\x00\x00\x00\x00\x0b\xd4\x0b\xd4') - with self.assertRaises(aifc.Error): - f.setpos(-1) - with self.assertRaises(aifc.Error): - f.setpos(f.getnframes() + 1) - - def test_write(self): - f = self.f = aifc.open(self.sndfilepath) - fout = self.fout = aifc.open(TESTFN, 'wb') - fout.aifc() - fout.setparams(f.getparams()) - for frame in range(f.getnframes()): - fout.writeframes(f.readframes(1)) - fout.close() - fout = self.fout = aifc.open(TESTFN, 'rb') - f.rewind() - self.assertEqual(f.getparams(), fout.getparams()) - self.assertEqual(f.readframes(5), fout.readframes(5)) - def test_compress(self): f = self.f = aifc.open(self.sndfilepath) fout = self.fout = aifc.open(TESTFN, 'wb') @@ -142,28 +60,6 @@ self.assertEqual(fout.getcomptype(), b'ULAW') self.assertEqual(fout.getcompname(), b'foo') - def test_close(self): - class Wrapfile(object): - def __init__(self, file): - self.file = open(file, 'rb') - self.closed = False - def close(self): - self.file.close() - self.closed = True - def __getattr__(self, attr): return getattr(self.file, attr) - testfile = Wrapfile(self.sndfilepath) - f = self.f = aifc.open(testfile) - self.assertEqual(testfile.closed, False) - f.close() - self.assertEqual(testfile.closed, True) - testfile = open(TESTFN, 'wb') - fout = aifc.open(testfile, 'wb') - self.assertFalse(testfile.closed) - with self.assertRaises(aifc.Error): - fout.close() - self.assertTrue(testfile.closed) - fout.close() # do nothing - def test_write_header_comptype_sampwidth(self): for comptype in (b'ULAW', b'ulaw', b'ALAW', b'alaw', b'G722'): fout = aifc.open(io.BytesIO(), 'wb') @@ -197,6 +93,9 @@ self.assertEqual(f.getmark(2), (2, 0, b'even')) self.assertRaises(aifc.Error, f.getmark, 3) + # XXX + test_unseekable_input = None + class AIFCLowLevelTest(unittest.TestCase): @@ -375,10 +274,5 @@ f.close() -def test_main(): - run_unittest(AIFCTest) - run_unittest(AIFCLowLevelTest) - - if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_sunau.py b/Lib/test/test_sunau.py --- a/Lib/test/test_sunau.py +++ b/Lib/test/test_sunau.py @@ -1,7 +1,6 @@ -from test.support import run_unittest, TESTFN +from test.support import TESTFN import unittest -import pickle -import os +from test.audiotests import AudioTest import sunau @@ -10,37 +9,10 @@ framerate = 8000 nframes = 100 -class SunAUTest(unittest.TestCase): - def setUp(self): - self.f = None - - def tearDown(self): - if self.f is not None: - self.f.close() - try: - os.remove(TESTFN) - except OSError: - pass - - def test_lin(self): - self.f = sunau.open(TESTFN, 'w') - self.f.setnchannels(nchannels) - self.f.setsampwidth(sampwidth) - self.f.setframerate(framerate) - self.f.setcomptype('NONE', 'not compressed') - output = b'\xff\x00\x12\xcc' * (nframes * nchannels * sampwidth // 4) - self.f.writeframes(output) - self.f.close() - - self.f = sunau.open(TESTFN, 'rb') - self.assertEqual(nchannels, self.f.getnchannels()) - self.assertEqual(sampwidth, self.f.getsampwidth()) - self.assertEqual(framerate, self.f.getframerate()) - self.assertEqual(nframes, self.f.getnframes()) - self.assertEqual('NONE', self.f.getcomptype()) - self.assertEqual(self.f.readframes(nframes), output) - self.f.close() +class SunAUTest(AudioTest, unittest.TestCase): + module = sunau + sndfilename = 'Sine-1000Hz-300ms.au' def test_ulaw(self): self.f = sunau.open(TESTFN, 'w') @@ -63,30 +35,6 @@ self.assertEqual(self.f.readframes(nframes), output) self.f.close() - def test_getparams(self): - self.f = sunau.open(TESTFN, 'w') - self.f.setnchannels(nchannels) - self.f.setsampwidth(sampwidth) - self.f.setframerate(framerate) - self.f.setcomptype('ULAW', '') - output = b'\0' * nframes * nchannels * sampwidth - self.f.writeframes(output) - self.f.close() - - self.f = sunau.open(TESTFN, 'rb') - params = self.f.getparams() - self.assertEqual(params.nchannels, nchannels) - self.assertEqual(params.sampwidth, sampwidth) - self.assertEqual(params.framerate, framerate) - self.assertEqual(params.nframes, nframes) - self.assertEqual(params.comptype, 'ULAW') - - dump = pickle.dumps(params) - self.assertEqual(pickle.loads(dump), params) - - -def test_main(): - run_unittest(SunAUTest) if __name__ == "__main__": unittest.main() diff --git a/Lib/test/test_wave.py b/Lib/test/test_wave.py --- a/Lib/test/test_wave.py +++ b/Lib/test/test_wave.py @@ -1,49 +1,30 @@ -from test.support import TESTFN, unlink +from test.support import TESTFN import wave -import pickle import unittest +from test.audiotests import AudioTest, frames nchannels = 2 sampwidth = 2 framerate = 8000 nframes = 100 -class TestWave(unittest.TestCase): - def setUp(self): - self.f = None - - def tearDown(self): - if self.f is not None: - self.f.close() - unlink(TESTFN) - - def test_it(self, test_rounding=False): - self.f = wave.open(TESTFN, 'wb') - self.f.setnchannels(nchannels) - self.f.setsampwidth(sampwidth) - if test_rounding: - self.f.setframerate(framerate - 0.1) - else: - self.f.setframerate(framerate) - self.f.setnframes(nframes) - output = b'\0' * nframes * nchannels * sampwidth - self.f.writeframes(output) - self.f.close() - - self.f = wave.open(TESTFN, 'rb') - self.assertEqual(nchannels, self.f.getnchannels()) - self.assertEqual(sampwidth, self.f.getsampwidth()) - self.assertEqual(framerate, self.f.getframerate()) - self.assertEqual(nframes, self.f.getnframes()) - self.assertEqual(self.f.readframes(nframes), output) +class TestWave(AudioTest, unittest.TestCase): + module = wave + sndfilename = 'Sine-1000Hz-300ms.wav' def test_fractional_framerate(self): """ Addresses [ 1512791 ] module wave does no rounding Floating point framerates should be rounded, rather than truncated. """ - self.test_it(test_rounding=True) + f = self.create_file(TESTFN, nchannels, sampwidth, framerate - 0.1) + f.setnframes(nframes) + f.writeframes(frames) + f.close() + + self.check_file(TESTFN, + nchannels, sampwidth, framerate, nframes, frames) def test_issue7681(self): self.f = wave.open(TESTFN, 'wb') @@ -54,76 +35,8 @@ output = b'\0' * nframes * nchannels * sampwidth self.f.writeframes(output) - def test_getparams(self): - self.f = wave.open(TESTFN, 'wb') - self.f.setnchannels(nchannels) - self.f.setsampwidth(sampwidth) - self.f.setframerate(framerate) - self.f.close() - - self.f = wave.open(TESTFN, 'rb') - params = self.f.getparams() - self.assertEqual(params.nchannels, self.f.getnchannels()) - self.assertEqual(params.nframes, self.f.getnframes()) - self.assertEqual(params.sampwidth, self.f.getsampwidth()) - self.assertEqual(params.framerate, self.f.getframerate()) - self.assertEqual(params.comptype, self.f.getcomptype()) - self.assertEqual(params.compname, self.f.getcompname()) - - def test_getparams_picklable(self): - self.f = wave.open(TESTFN, 'wb') - self.f.setnchannels(nchannels) - self.f.setsampwidth(sampwidth) - self.f.setframerate(framerate) - self.f.close() - - self.f = wave.open(TESTFN, 'rb') - params = self.f.getparams() - dump = pickle.dumps(params) - self.assertEqual(pickle.loads(dump), params) - - def test_wave_write_context_manager_calls_close(self): - # Close checks for a minimum header and will raise an error - # if it is not set, so this proves that close is called. - with self.assertRaises(wave.Error): - with wave.open(TESTFN, 'wb') as f: - pass - with self.assertRaises(wave.Error): - with open(TESTFN, 'wb') as testfile: - with wave.open(testfile): - pass - - def test_context_manager_with_open_file(self): - with open(TESTFN, 'wb') as testfile: - with wave.open(testfile) as f: - f.setnchannels(nchannels) - f.setsampwidth(sampwidth) - f.setframerate(framerate) - self.assertFalse(testfile.closed) - with open(TESTFN, 'rb') as testfile: - with wave.open(testfile) as f: - self.assertFalse(f.getfp().closed) - params = f.getparams() - self.assertEqual(params.nchannels, nchannels) - self.assertEqual(params.sampwidth, sampwidth) - self.assertEqual(params.framerate, framerate) - self.assertIsNone(f.getfp()) - self.assertFalse(testfile.closed) - - def test_context_manager_with_filename(self): - # If the file doesn't get closed, this test won't fail, but it will - # produce a resource leak warning. - with wave.open(TESTFN, 'wb') as f: - f.setnchannels(nchannels) - f.setsampwidth(sampwidth) - f.setframerate(framerate) - with wave.open(TESTFN) as f: - self.assertFalse(f.getfp().closed) - params = f.getparams() - self.assertEqual(params.nchannels, nchannels) - self.assertEqual(params.sampwidth, sampwidth) - self.assertEqual(params.framerate, framerate) - self.assertIsNone(f.getfp()) + chunk1 = b'\x00\x00\x00\x00\xd4\x0b\xd4\x0b' + chunk2 = b't\x17t\x17\xad"\xad"' if __name__ == '__main__':