diff --git a/Lib/test/audiodata/pluck-pcm16.aiff b/Lib/test/audiodata/pluck-pcm16.aiff
new file mode 100644
index 0000000..6c8c40d
--- /dev/null
+++ b/Lib/test/audiodata/pluck-pcm16.aiff
Binary files differ
diff --git a/Lib/test/audiodata/pluck-pcm16.au b/Lib/test/audiodata/pluck-pcm16.au
new file mode 100644
index 0000000..398f07f
--- /dev/null
+++ b/Lib/test/audiodata/pluck-pcm16.au
Binary files differ
diff --git a/Lib/test/audiodata/pluck-pcm16.wav b/Lib/test/audiodata/pluck-pcm16.wav
new file mode 100644
index 0000000..cb8627d
--- /dev/null
+++ b/Lib/test/audiodata/pluck-pcm16.wav
Binary files differ
diff --git a/Lib/test/audiodata/pluck-pcm24.aiff b/Lib/test/audiodata/pluck-pcm24.aiff
new file mode 100644
index 0000000..8eba145
--- /dev/null
+++ b/Lib/test/audiodata/pluck-pcm24.aiff
Binary files differ
diff --git a/Lib/test/audiodata/pluck-pcm24.wav b/Lib/test/audiodata/pluck-pcm24.wav
new file mode 100644
index 0000000..60d92c3
--- /dev/null
+++ b/Lib/test/audiodata/pluck-pcm24.wav
Binary files differ
diff --git a/Lib/test/audiodata/pluck-pcm32.aiff b/Lib/test/audiodata/pluck-pcm32.aiff
new file mode 100644
index 0000000..46ac037
--- /dev/null
+++ b/Lib/test/audiodata/pluck-pcm32.aiff
Binary files differ
diff --git a/Lib/test/audiodata/pluck-pcm32.au b/Lib/test/audiodata/pluck-pcm32.au
new file mode 100644
index 0000000..92ee596
--- /dev/null
+++ b/Lib/test/audiodata/pluck-pcm32.au
Binary files differ
diff --git a/Lib/test/audiodata/pluck-pcm32.wav b/Lib/test/audiodata/pluck-pcm32.wav
new file mode 100644
index 0000000..846628b
--- /dev/null
+++ b/Lib/test/audiodata/pluck-pcm32.wav
Binary files differ
diff --git a/Lib/test/audiodata/pluck-pcm8.aiff b/Lib/test/audiodata/pluck-pcm8.aiff
new file mode 100644
index 0000000..5de4f3b
--- /dev/null
+++ b/Lib/test/audiodata/pluck-pcm8.aiff
Binary files differ
diff --git a/Lib/test/audiodata/pluck-pcm8.au b/Lib/test/audiodata/pluck-pcm8.au
new file mode 100644
index 0000000..b7172c8
--- /dev/null
+++ b/Lib/test/audiodata/pluck-pcm8.au
Binary files differ
diff --git a/Lib/test/audiodata/pluck-pcm8.wav b/Lib/test/audiodata/pluck-pcm8.wav
new file mode 100644
index 0000000..bb28cb8
--- /dev/null
+++ b/Lib/test/audiodata/pluck-pcm8.wav
Binary files differ
diff --git a/Lib/test/audiodata/pluck-ulaw.aifc b/Lib/test/audiodata/pluck-ulaw.aifc
new file mode 100644
index 0000000..3085cf0
--- /dev/null
+++ b/Lib/test/audiodata/pluck-ulaw.aifc
Binary files differ
diff --git a/Lib/test/audiodata/pluck-ulaw.au b/Lib/test/audiodata/pluck-ulaw.au
new file mode 100644
index 0000000..1110353
--- /dev/null
+++ b/Lib/test/audiodata/pluck-ulaw.au
Binary files differ
diff --git a/Lib/test/audiotests.py b/Lib/test/audiotests.py
new file mode 100644
index 0000000..3e18df1
--- /dev/null
+++ b/Lib/test/audiotests.py
@@ -0,0 +1,218 @@
+from test.test_support import findfile, TESTFN, unlink
+import unittest
+import array
+import io
+import pickle
+import sys
+import base64
+
+def fromhex(s):
+    return base64.b16decode(s.replace(' ', ''))
+
+def byteswap2(data):
+    a = array.array('h', 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', 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))
+
+        dump = pickle.dumps(params)
+        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)
+
+
+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.assertEqual(f.getfp().name, self.sndfilepath)
+        self.check_params(f, self.nchannels, self.sampwidth, self.framerate,
+                          self.sndfilenframes, self.comptype, self.compname)
+
+    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_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()
diff --git a/Lib/test/test_aifc.py b/Lib/test/test_aifc.py
index 62b3d18..d1e2cdc 100644
--- a/Lib/test/test_aifc.py
+++ b/Lib/test/test_aifc.py
@@ -1,118 +1,168 @@
-from test.test_support import findfile, run_unittest, TESTFN
+from test.test_support import findfile, TESTFN, unlink, run_unittest
 import unittest
+from test import audiotests
 import os
 import io
-
+import sys
+import struct
 import aifc
 
 
-class AIFCTest(unittest.TestCase):
+class AifcPCM8Test(audiotests.AudioWriteTests,
+        audiotests.AudioTestsWithSourceFile,
+        unittest.TestCase):
+    module = aifc
+    sndfilename = 'pluck-pcm8.aiff'
+    sndfilenframes = 3307
+    nchannels = 2
+    sampwidth = 1
+    framerate = 11025
+    nframes = 48
+    comptype = 'NONE'
+    compname = 'not compressed'
+    frames = audiotests.fromhex("""\
+      02FF 4B00 3104 8008 CB06 4803 BF01 03FE B8FA B4F3 29EB 1AE6 \
+      EDE4 C6E2 0EE0 EFE0 57E2 FBE8 13EF D8F7 97FB F5FC 08FB DFFB \
+      11FA 3EFB BCFC 66FF CF04 4309 C10E 5112 EE17 8216 7F14 8012 \
+      490E 520D EF0F CE0F E40C 630A 080A 2B0B 510E 8B11 B60E 440A \
+      """)
+    close_fd = True
 
-    def setUp(self):
-        self.f = self.fout = None
-        self.sndfilepath = findfile('Sine-1000Hz-300ms.aif')
 
-    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
-        try:
-            os.remove(TESTFN)
-        except OSError:
-            pass
+class AifcPCM16Test(audiotests.AudioWriteTests,
+        audiotests.AudioTestsWithSourceFile,
+        unittest.TestCase):
+    module = aifc
+    sndfilename = 'pluck-pcm16.aiff'
+    sndfilenframes = 3307
+    nchannels = 2
+    sampwidth = 2
+    framerate = 11025
+    nframes = 48
+    comptype = 'NONE'
+    compname = 'not compressed'
+    frames = audiotests.fromhex("""\
+      022EFFEA 4B5D00F6 311804EA 80E10840 CBE106B1 48A903F5 BFE601B2 036CFE7B \
+      B858FA3E B4B1F34F 299AEBCA 1A5DE6DA EDFAE491 C628E275 0E09E0B5 EF2AE029 \
+      5758E271 FB35E83F 1376EF86 D82BF727 9790FB76 F5FAFC0F 0867FB9C DF30FB43 \
+      117EFA36 3EE5FB5B BC79FCB1 66D9FF5D CF150412 431D097C C1BA0EC8 512112A1 \
+      EEE21753 82071665 7FFF1443 8004128F 49A20EAF 52BB0DBA EFB40F60 CE3C0FBF \
+      E4B30CEC 63430A5C 08C80A20 2BBB0B08 514A0E43 8BCF1139 B6F60EEB 44120A5E \
+      """)
+    close_fd = True
 
+
+class AifcPCM24Test(audiotests.AudioWriteTests,
+        audiotests.AudioTestsWithSourceFile,
+        unittest.TestCase):
+    module = aifc
+    sndfilename = 'pluck-pcm24.aiff'
+    sndfilenframes = 3307
+    nchannels = 2
+    sampwidth = 3
+    framerate = 11025
+    nframes = 48
+    comptype = 'NONE'
+    compname = 'not compressed'
+    frames = audiotests.fromhex("""\
+      022D65FFEB9D 4B5A0F00FA54 3113C304EE2B 80DCD6084303 \
+      CBDEC006B261 48A99803F2F8 BFE82401B07D 036BFBFE7B5D \
+      B85756FA3EC9 B4B055F3502B 299830EBCB62 1A5CA7E6D99A \
+      EDFA3EE491BD C625EBE27884 0E05A9E0B6CF EF2929E02922 \
+      5758D8E27067 FB3557E83E16 1377BFEF8402 D82C5BF7272A \
+      978F16FB7745 F5F865FC1013 086635FB9C4E DF30FCFB40EE \
+      117FE0FA3438 3EE6B8FB5AC3 BC77A3FCB2F4 66D6DAFF5F32 \
+      CF13B9041275 431D69097A8C C1BB600EC74E 5120B912A2BA \
+      EEDF641754C0 8207001664B7 7FFFFF14453F 8000001294E6 \
+      499C1B0EB3B2 52B73E0DBCA0 EFB2B20F5FD8 CE3CDB0FBE12 \
+      E4B49C0CEA2D 6344A80A5A7C 08C8FE0A1FFE 2BB9860B0A0E \
+      51486F0E44E1 8BCC64113B05 B6F4EC0EEB36 4413170A5B48 \
+      """)
+    close_fd = True
+
+
+class AifcPCM32Test(audiotests.AudioWriteTests,
+        audiotests.AudioTestsWithSourceFile,
+        unittest.TestCase):
+    module = aifc
+    sndfilename = 'pluck-pcm32.aiff'
+    sndfilenframes = 3307
+    nchannels = 2
+    sampwidth = 4
+    framerate = 11025
+    nframes = 48
+    comptype = 'NONE'
+    compname = 'not compressed'
+    frames = audiotests.fromhex("""\
+      022D65BCFFEB9D92 4B5A0F8000FA549C 3113C34004EE2BC0 80DCD680084303E0 \
+      CBDEC0C006B26140 48A9980003F2F8FC BFE8248001B07D92 036BFB60FE7B5D34 \
+      B8575600FA3EC920 B4B05500F3502BC0 29983000EBCB6240 1A5CA7A0E6D99A60 \
+      EDFA3E80E491BD40 C625EB80E27884A0 0E05A9A0E0B6CFE0 EF292940E0292280 \
+      5758D800E2706700 FB3557D8E83E1640 1377BF00EF840280 D82C5B80F7272A80 \
+      978F1600FB774560 F5F86510FC101364 086635A0FB9C4E20 DF30FC40FB40EE28 \
+      117FE0A0FA3438B0 3EE6B840FB5AC3F0 BC77A380FCB2F454 66D6DA80FF5F32B4 \
+      CF13B980041275B0 431D6980097A8C00 C1BB60000EC74E00 5120B98012A2BAA0 \
+      EEDF64C01754C060 820700001664B780 7FFFFFFF14453F40 800000001294E6E0 \
+      499C1B000EB3B270 52B73E000DBCA020 EFB2B2E00F5FD880 CE3CDB400FBE1270 \
+      E4B49CC00CEA2D90 6344A8800A5A7CA0 08C8FE800A1FFEE0 2BB986C00B0A0E00 \
+      51486F800E44E190 8BCC6480113B0580 B6F4EC000EEB3630 441317800A5B48A0 \
+      """)
+    close_fd = True
+
+
+class AifcULAWTest(audiotests.AudioWriteTests,
+        audiotests.AudioTestsWithSourceFile,
+        unittest.TestCase):
+    module = aifc
+    sndfilename = 'pluck-ulaw.aifc'
+    sndfilenframes = 3307
+    nchannels = 2
+    sampwidth = 2
+    framerate = 11025
+    nframes = 48
+    comptype = 'ulaw'
+    compname = ''
+    frames = audiotests.fromhex("""\
+      022CFFE8 497C0104 307C04DC 8284083C CB84069C 497C03DC BE8401AC 036CFE74 \
+      B684FA24 B684F344 2A7CEC04 19FCE704 EE04E504 C584E204 0E3CE104 EF04DF84 \
+      557CE204 FB24E804 12FCEF04 D784F744 9684FB64 F5C4FC24 083CFBA4 DF84FB24 \
+      11FCFA24 3E7CFB64 BA84FCB4 657CFF5C CF84041C 417C093C C1840EBC 517C12FC \
+      EF0416FC 828415FC 7D7C13FC 828412FC 497C0EBC 517C0DBC F0040F3C CD840FFC \
+      E5040CBC 617C0A3C 08BC0A3C 2C7C0B3C 517C0E3C 8A8410FC B6840EBC 457C0A3C \
+      """)
+    if sys.byteorder != 'big':
+        frames = audiotests.byteswap2(frames)
+    close_fd = True
+
+
+class AifcMiscTest(audiotests.AudioTests, unittest.TestCase):
     def test_skipunknown(self):
         #Issue 2245
         #This file contains chunk types aifc doesn't recognize.
-        self.f = aifc.open(self.sndfilepath)
+        self.f = aifc.open(findfile('Sine-1000Hz-300ms.aif'))
 
-    def test_params(self):
-        f = self.f = aifc.open(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(), 'NONE')
-        self.assertEqual(f.getcompname(), 'not compressed')
-        self.assertEqual(f.getparams(), (2, 2, 48000, 14400, 'NONE', 'not compressed'))
+    def test_write_markers_values(self):
+        fout = aifc.open(io.BytesIO(), 'wb')
+        self.assertEqual(fout.getmarkers(), None)
+        fout.setmark(1, 0, 'foo1')
+        fout.setmark(1, 1, 'foo2')
+        self.assertEqual(fout.getmark(1), (1, 1, 'foo2'))
+        self.assertEqual(fout.getmarkers(), [(1, 1, 'foo2')])
+        fout.initfp(None)
 
-    def test_read(self):
-        f = self.f = aifc.open(self.sndfilepath)
-        self.assertEqual(f.tell(), 0)
-        self.assertEqual(f.readframes(2), '\x00\x00\x00\x00\x0b\xd4\x0b\xd4')
-        f.rewind()
-        pos0 = f.tell()
-        self.assertEqual(pos0, 0)
-        self.assertEqual(f.readframes(2), '\x00\x00\x00\x00\x0b\xd4\x0b\xd4')
-        pos2 = f.tell()
-        self.assertEqual(pos2, 2)
-        self.assertEqual(f.readframes(2), '\x17t\x17t"\xad"\xad')
-        f.setpos(pos2)
-        self.assertEqual(f.readframes(2), '\x17t\x17t"\xad"\xad')
-        f.setpos(pos0)
-        self.assertEqual(f.readframes(2), '\x00\x00\x00\x00\x0b\xd4\x0b\xd4')
-
-    def test_write(self):
-        f = self.f = aifc.open(self.sndfilepath)
+    def test_read_markers(self):
         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.aiff()
+        fout.setparams((1, 1, 1, 1, 'NONE', ''))
+        fout.setmark(1, 0, 'odd')
+        fout.setmark(2, 0, 'even')
+        fout.writeframes('\x00')
         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')
-        fout.aifc()
-        fout.setnchannels(f.getnchannels())
-        fout.setsampwidth(f.getsampwidth())
-        fout.setframerate(f.getframerate())
-        fout.setcomptype('ULAW', 'foo')
-        for frame in range(f.getnframes()):
-            fout.writeframes(f.readframes(1))
-        fout.close()
-        self.assertLess(
-            os.stat(TESTFN).st_size,
-            os.stat(self.sndfilepath).st_size*0.75,
-            )
-        fout = self.fout = aifc.open(TESTFN, 'rb')
-        f.rewind()
-        self.assertEqual(f.getparams()[0:3], fout.getparams()[0:3])
-        self.assertEqual(fout.getcomptype(), 'ULAW')
-        self.assertEqual(fout.getcompname(), 'foo')
-        # XXX: this test fails, not sure if it should succeed or not
-        # self.assertEqual(f.readframes(5), fout.readframes(5))
-
-    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
+        f = self.f = aifc.open(TESTFN, 'rb')
+        self.assertEqual(f.getmarkers(), [(1, 0, 'odd'), (2, 0, 'even')])
+        self.assertEqual(f.getmark(1), (1, 0, 'odd'))
+        self.assertEqual(f.getmark(2), (2, 0, 'even'))
+        self.assertRaises(aifc.Error, f.getmark, 3)
 
 
 class AIFCLowLevelTest(unittest.TestCase):
@@ -127,7 +177,7 @@
             self.assertEqual(read_written(x, 'float'), x)
         for x in (float('NaN'), float('Inf')):
             self.assertEqual(read_written(x, 'float'), aifc._HUGE_VAL)
-        for x in (b'', b'foo', b'a' * 255):
+        for x in ('', 'foo', 'a' * 255):
             self.assertEqual(read_written(x, 'string'), x)
         for x in (-0x7FFFFFFF, -1, 0, 1, 0x7FFFFFFF):
             self.assertEqual(read_written(x, 'long'), x)
@@ -139,7 +189,7 @@
             self.assertEqual(read_written(x, 'ushort'), x)
 
     def test_read_raises(self):
-        f = io.BytesIO(b'\x00')
+        f = io.BytesIO('\x00')
         self.assertRaises(EOFError, aifc._read_ulong, f)
         self.assertRaises(EOFError, aifc._read_long, f)
         self.assertRaises(EOFError, aifc._read_ushort, f)
@@ -148,13 +198,149 @@
     def test_write_long_string_raises(self):
         f = io.BytesIO()
         with self.assertRaises(ValueError):
-            aifc._write_string(f, b'too long' * 255)
+            aifc._write_string(f, 'too long' * 255)
+
+    def test_wrong_open_mode(self):
+        with self.assertRaises(aifc.Error):
+            aifc.open(TESTFN, 'wrong_mode')
+
+    def test_read_wrong_form(self):
+        b1 = io.BytesIO('WRNG' + struct.pack('>L', 0))
+        b2 = io.BytesIO('FORM' + struct.pack('>L', 4) + 'WRNG')
+        self.assertRaises(aifc.Error, aifc.open, b1)
+        self.assertRaises(aifc.Error, aifc.open, b2)
+
+    def test_read_no_comm_chunk(self):
+        b = io.BytesIO('FORM' + struct.pack('>L', 4) + 'AIFF')
+        self.assertRaises(aifc.Error, aifc.open, b)
+
+    def test_read_wrong_compression_type(self):
+        b = 'FORM' + struct.pack('>L', 4) + 'AIFC'
+        b += 'COMM' + struct.pack('>LhlhhLL', 23, 0, 0, 0, 0, 0, 0)
+        b += 'WRNG' + struct.pack('B', 0)
+        self.assertRaises(aifc.Error, aifc.open, io.BytesIO(b))
+
+    def test_read_wrong_marks(self):
+        b = 'FORM' + struct.pack('>L', 4) + 'AIFF'
+        b += 'COMM' + struct.pack('>LhlhhLL', 18, 0, 0, 0, 0, 0, 0)
+        b += 'SSND' + struct.pack('>L', 8) + '\x00' * 8
+        b += 'MARK' + struct.pack('>LhB', 3, 1, 1)
+        f = aifc.open(io.BytesIO(b))
+        self.assertEqual(f.getmarkers(), None)
+
+    def test_read_comm_kludge_compname_even(self):
+        b = 'FORM' + struct.pack('>L', 4) + 'AIFC'
+        b += 'COMM' + struct.pack('>LhlhhLL', 18, 0, 0, 0, 0, 0, 0)
+        b += 'NONE' + struct.pack('B', 4) + 'even' + '\x00'
+        b += 'SSND' + struct.pack('>L', 8) + '\x00' * 8
+        f = aifc.open(io.BytesIO(b))
+        self.assertEqual(f.getcompname(), 'even')
+
+    def test_read_comm_kludge_compname_odd(self):
+        b = 'FORM' + struct.pack('>L', 4) + 'AIFC'
+        b += 'COMM' + struct.pack('>LhlhhLL', 18, 0, 0, 0, 0, 0, 0)
+        b += 'NONE' + struct.pack('B', 3) + 'odd'
+        b += 'SSND' + struct.pack('>L', 8) + '\x00' * 8
+        f = aifc.open(io.BytesIO(b))
+        self.assertEqual(f.getcompname(), 'odd')
+
+    def test_write_params_raises(self):
+        fout = aifc.open(io.BytesIO(), 'wb')
+        wrong_params = (0, 0, 0, 0, 'WRNG', '')
+        self.assertRaises(aifc.Error, fout.setparams, wrong_params)
+        self.assertRaises(aifc.Error, fout.getparams)
+        self.assertRaises(aifc.Error, fout.setnchannels, 0)
+        self.assertRaises(aifc.Error, fout.getnchannels)
+        self.assertRaises(aifc.Error, fout.setsampwidth, 0)
+        self.assertRaises(aifc.Error, fout.getsampwidth)
+        self.assertRaises(aifc.Error, fout.setframerate, 0)
+        self.assertRaises(aifc.Error, fout.getframerate)
+        self.assertRaises(aifc.Error, fout.setcomptype, 'WRNG', '')
+        fout.aiff()
+        fout.setnchannels(1)
+        fout.setsampwidth(1)
+        fout.setframerate(1)
+        fout.setnframes(1)
+        fout.writeframes('\x00')
+        self.assertRaises(aifc.Error, fout.setparams, (1, 1, 1, 1, 1, 1))
+        self.assertRaises(aifc.Error, fout.setnchannels, 1)
+        self.assertRaises(aifc.Error, fout.setsampwidth, 1)
+        self.assertRaises(aifc.Error, fout.setframerate, 1)
+        self.assertRaises(aifc.Error, fout.setnframes, 1)
+        self.assertRaises(aifc.Error, fout.setcomptype, 'NONE', '')
+        self.assertRaises(aifc.Error, fout.aiff)
+        self.assertRaises(aifc.Error, fout.aifc)
+
+    def test_write_params_singles(self):
+        fout = aifc.open(io.BytesIO(), 'wb')
+        fout.aifc()
+        fout.setnchannels(1)
+        fout.setsampwidth(2)
+        fout.setframerate(3)
+        fout.setnframes(4)
+        fout.setcomptype('NONE', 'name')
+        self.assertEqual(fout.getnchannels(), 1)
+        self.assertEqual(fout.getsampwidth(), 2)
+        self.assertEqual(fout.getframerate(), 3)
+        self.assertEqual(fout.getnframes(), 0)
+        self.assertEqual(fout.tell(), 0)
+        self.assertEqual(fout.getcomptype(), 'NONE')
+        self.assertEqual(fout.getcompname(), 'name')
+        fout.writeframes('\x00' * 4 * fout.getsampwidth() * fout.getnchannels())
+        self.assertEqual(fout.getnframes(), 4)
+        self.assertEqual(fout.tell(), 4)
+
+    def test_write_params_bunch(self):
+        fout = aifc.open(io.BytesIO(), 'wb')
+        fout.aifc()
+        p = (1, 2, 3, 4, 'NONE', 'name')
+        fout.setparams(p)
+        self.assertEqual(fout.getparams(), p)
+        fout.initfp(None)
+
+    def test_write_header_raises(self):
+        fout = aifc.open(io.BytesIO(), 'wb')
+        self.assertRaises(aifc.Error, fout.close)
+        fout = aifc.open(io.BytesIO(), 'wb')
+        fout.setnchannels(1)
+        self.assertRaises(aifc.Error, fout.close)
+        fout = aifc.open(io.BytesIO(), 'wb')
+        fout.setnchannels(1)
+        fout.setsampwidth(1)
+        self.assertRaises(aifc.Error, fout.close)
+
+    def test_write_header_comptype_raises(self):
+        for comptype in ('ULAW', 'ulaw', 'ALAW', 'alaw', 'G722'):
+            fout = aifc.open(io.BytesIO(), 'wb')
+            fout.setsampwidth(1)
+            fout.setcomptype(comptype, '')
+            self.assertRaises(aifc.Error, fout.close)
+            fout.initfp(None)
+
+    def test_write_markers_raises(self):
+        fout = aifc.open(io.BytesIO(), 'wb')
+        self.assertRaises(aifc.Error, fout.setmark, 0, 0, '')
+        self.assertRaises(aifc.Error, fout.setmark, 1, -1, '')
+        self.assertRaises(aifc.Error, fout.setmark, 1, 0, None)
+        self.assertRaises(aifc.Error, fout.getmark, 1)
+        fout.initfp(None)
+
+    def test_write_aiff_by_extension(self):
+        sampwidth = 2
+        fout = self.fout = aifc.open(TESTFN + '.aiff', 'wb')
+        fout.setparams((1, sampwidth, 1, 1, 'ULAW', ''))
+        frames = '\x00' * fout.getnchannels() * sampwidth
+        fout.writeframes(frames)
+        fout.close()
+        f = self.f = aifc.open(TESTFN + '.aiff', 'rb')
+        self.assertEqual(f.getcomptype(), 'NONE')
+        f.close()
 
 
 def test_main():
-    run_unittest(AIFCTest)
-    run_unittest(AIFCLowLevelTest)
-
+    run_unittest(AifcPCM8Test, AifcPCM16Test, AifcPCM16Test, AifcPCM24Test,
+                 AifcPCM32Test, AifcULAWTest,
+                 AifcMiscTest, AIFCLowLevelTest)
 
 if __name__ == "__main__":
-    unittest.main()
+    test_main()
diff --git a/Lib/test/test_sunau.py b/Lib/test/test_sunau.py
new file mode 100644
index 0000000..64cbebd
--- /dev/null
+++ b/Lib/test/test_sunau.py
@@ -0,0 +1,107 @@
+from test.test_support import TESTFN, run_unittest
+import unittest
+from test import audiotests
+import sys
+import sunau
+
+
+class SunauPCM8Test(audiotests.AudioWriteTests,
+        audiotests.AudioTestsWithSourceFile,
+        unittest.TestCase):
+    module = sunau
+    sndfilename = 'pluck-pcm8.au'
+    sndfilenframes = 3307
+    nchannels = 2
+    sampwidth = 1
+    framerate = 11025
+    nframes = 48
+    comptype = 'NONE'
+    compname = 'not compressed'
+    frames = audiotests.fromhex("""\
+      02FF 4B00 3104 8008 CB06 4803 BF01 03FE B8FA B4F3 29EB 1AE6 \
+      EDE4 C6E2 0EE0 EFE0 57E2 FBE8 13EF D8F7 97FB F5FC 08FB DFFB \
+      11FA 3EFB BCFC 66FF CF04 4309 C10E 5112 EE17 8216 7F14 8012 \
+      490E 520D EF0F CE0F E40C 630A 080A 2B0B 510E 8B11 B60E 440A \
+      """)
+
+
+class SunauPCM16Test(audiotests.AudioWriteTests,
+        audiotests.AudioTestsWithSourceFile,
+        unittest.TestCase):
+    module = sunau
+    sndfilename = 'pluck-pcm16.au'
+    sndfilenframes = 3307
+    nchannels = 2
+    sampwidth = 2
+    framerate = 11025
+    nframes = 48
+    comptype = 'NONE'
+    compname = 'not compressed'
+    frames = audiotests.fromhex("""\
+      022EFFEA 4B5C00F9 311404EF 80DB0844 CBE006B0 48AB03F3 BFE601B5 0367FE80 \
+      B853FA42 B4AFF351 2997EBCD 1A5AE6DC EDF9E492 C627E277 0E06E0B7 EF29E029 \
+      5759E271 FB34E83F 1377EF85 D82CF727 978EFB79 F5F7FC12 0864FB9E DF30FB40 \
+      1183FA30 3EEAFB59 BC78FCB4 66D5FF60 CF130415 431A097D C1BA0EC7 512312A0 \
+      EEE11754 82071666 7FFE1448 80001298 49990EB7 52B40DC1 EFAD0F65 CE3A0FBE \
+      E4B70CE6 63490A57 08CC0A1D 2BBC0B09 51480E46 8BCB113C B6F60EE9 44150A5A \
+      """)
+
+
+class SunauPCM32Test(audiotests.AudioWriteTests,
+        audiotests.AudioTestsWithSourceFile,
+        unittest.TestCase):
+    module = sunau
+    sndfilename = 'pluck-pcm32.au'
+    sndfilenframes = 3307
+    nchannels = 2
+    sampwidth = 4
+    framerate = 11025
+    nframes = 48
+    comptype = 'NONE'
+    compname = 'not compressed'
+    frames = audiotests.fromhex("""\
+      022D65BCFFEB9D92 4B5A0F8000FA549C 3113C34004EE2BC0 80DCD680084303E0 \
+      CBDEC0C006B26140 48A9980003F2F8FC BFE8248001B07D92 036BFB60FE7B5D34 \
+      B8575600FA3EC920 B4B05500F3502BC0 29983000EBCB6240 1A5CA7A0E6D99A60 \
+      EDFA3E80E491BD40 C625EB80E27884A0 0E05A9A0E0B6CFE0 EF292940E0292280 \
+      5758D800E2706700 FB3557D8E83E1640 1377BF00EF840280 D82C5B80F7272A80 \
+      978F1600FB774560 F5F86510FC101364 086635A0FB9C4E20 DF30FC40FB40EE28 \
+      117FE0A0FA3438B0 3EE6B840FB5AC3F0 BC77A380FCB2F454 66D6DA80FF5F32B4 \
+      CF13B980041275B0 431D6980097A8C00 C1BB60000EC74E00 5120B98012A2BAA0 \
+      EEDF64C01754C060 820700001664B780 7FFFFFFF14453F40 800000001294E6E0 \
+      499C1B000EB3B270 52B73E000DBCA020 EFB2B2E00F5FD880 CE3CDB400FBE1270 \
+      E4B49CC00CEA2D90 6344A8800A5A7CA0 08C8FE800A1FFEE0 2BB986C00B0A0E00 \
+      51486F800E44E190 8BCC6480113B0580 B6F4EC000EEB3630 441317800A5B48A0 \
+      """)
+
+
+class SunauULAWTest(audiotests.AudioWriteTests,
+        audiotests.AudioTestsWithSourceFile,
+        unittest.TestCase):
+    module = sunau
+    sndfilename = 'pluck-ulaw.au'
+    sndfilenframes = 3307
+    nchannels = 2
+    sampwidth = 2
+    framerate = 11025
+    nframes = 48
+    comptype = 'ULAW'
+    compname = 'CCITT G.711 u-law'
+    frames = audiotests.fromhex("""\
+      022CFFE8 497C00F4 307C04DC 8284083C CB84069C 497C03DC BE8401AC 036CFE74 \
+      B684FA24 B684F344 2A7CEC04 19FCE704 EE04E504 C584E204 0E3CE104 EF04DF84 \
+      557CE204 FB24E804 12FCEF04 D784F744 9684FB64 F5C4FC24 083CFBA4 DF84FB24 \
+      11FCFA24 3E7CFB64 BA84FCB4 657CFF5C CF84041C 417C09BC C1840EBC 517C12FC \
+      EF0416FC 828415FC 7D7C13FC 828412FC 497C0EBC 517C0DBC F0040F3C CD840FFC \
+      E5040CBC 617C0A3C 08BC0A3C 2C7C0B3C 517C0E3C 8A8410FC B6840EBC 457C0A3C \
+      """)
+    if sys.byteorder != 'big':
+        frames = audiotests.byteswap2(frames)
+
+
+def test_main():
+    run_unittest(SunauPCM8Test, SunauPCM16Test, SunauPCM16Test,
+                 SunauPCM32Test, SunauULAWTest)
+
+if __name__ == "__main__":
+    test_main()
diff --git a/Lib/test/test_wave.py b/Lib/test/test_wave.py
index 02f5fae..b7ba891 100644
--- a/Lib/test/test_wave.py
+++ b/Lib/test/test_wave.py
@@ -1,45 +1,112 @@
 from test.test_support import TESTFN, run_unittest
-import os
-import wave
 import unittest
+from test import audiotests
+import wave
 
-nchannels = 2
-sampwidth = 2
-framerate = 8000
-nframes = 100
 
-class TestWave(unittest.TestCase):
+class WavePCM8Test(audiotests.AudioWriteTests,
+        audiotests.AudioTestsWithSourceFile,
+        unittest.TestCase):
+    module = wave
+    sndfilename = 'pluck-pcm8.wav'
+    sndfilenframes = 3307
+    nchannels = 2
+    sampwidth = 1
+    framerate = 11025
+    nframes = 48
+    comptype = 'NONE'
+    compname = 'not compressed'
+    frames = audiotests.fromhex("""\
+      827F CB80 B184 0088 4B86 C883 3F81 837E 387A 3473 A96B 9A66 \
+      6D64 4662 8E60 6F60 D762 7B68 936F 5877 177B 757C 887B 5F7B \
+      917A BE7B 3C7C E67F 4F84 C389 418E D192 6E97 0296 FF94 0092 \
+      C98E D28D 6F8F 4E8F 648C E38A 888A AB8B D18E 0B91 368E C48A \
+      """)
 
-    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
+class WavePCM16Test(audiotests.AudioWriteTests,
+        audiotests.AudioTestsWithSourceFile,
+        unittest.TestCase):
+    module = wave
+    sndfilename = 'pluck-pcm16.wav'
+    sndfilenframes = 3307
+    nchannels = 2
+    sampwidth = 2
+    framerate = 11025
+    nframes = 48
+    comptype = 'NONE'
+    compname = 'not compressed'
+    frames = audiotests.fromhex("""\
+      022EFFEA 4B5C00F9 311404EF 80DC0843 CBDF06B2 48AA03F3 BFE701B2 036BFE7C \
+      B857FA3E B4B2F34F 2999EBCA 1A5FE6D7 EDFCE491 C626E279 0E05E0B8 EF27E02D \
+      5754E275 FB31E843 1373EF89 D827F72C 978BFB7A F5F7FC11 0866FB9C DF30FB42 \
+      117FFA36 3EE4FB5D BC75FCB6 66D5FF5F CF16040E 43220978 C1BC0EC8 511F12A4 \
+      EEDF1755 82061666 7FFF1446 80001296 499C0EB2 52BA0DB9 EFB70F5C CE400FBC \
+      E4B50CEB 63440A5A 08CA0A1F 2BBA0B0B 51460E47 8BCB113C B6F50EEA 44150A59 \
+      """)
+    frames = audiotests.byteswap2(frames)
 
-    def test_it(self):
-        self.f = wave.open(TESTFN, 'wb')
-        self.f.setnchannels(nchannels)
-        self.f.setsampwidth(sampwidth)
-        self.f.setframerate(framerate)
-        self.f.setnframes(nframes)
-        output = '\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 WavePCM24Test(audiotests.AudioWriteTests,
+        audiotests.AudioTestsWithSourceFile,
+        unittest.TestCase):
+    module = wave
+    sndfilename = 'pluck-pcm24.wav'
+    sndfilenframes = 3307
+    nchannels = 2
+    sampwidth = 3
+    framerate = 11025
+    nframes = 48
+    comptype = 'NONE'
+    compname = 'not compressed'
+    frames = audiotests.fromhex("""\
+      022D65FFEB9D 4B5A0F00FA54 3113C304EE2B 80DCD6084303 \
+      CBDEC006B261 48A99803F2F8 BFE82401B07D 036BFBFE7B5D \
+      B85756FA3EC9 B4B055F3502B 299830EBCB62 1A5CA7E6D99A \
+      EDFA3EE491BD C625EBE27884 0E05A9E0B6CF EF2929E02922 \
+      5758D8E27067 FB3557E83E16 1377BFEF8402 D82C5BF7272A \
+      978F16FB7745 F5F865FC1013 086635FB9C4E DF30FCFB40EE \
+      117FE0FA3438 3EE6B8FB5AC3 BC77A3FCB2F4 66D6DAFF5F32 \
+      CF13B9041275 431D69097A8C C1BB600EC74E 5120B912A2BA \
+      EEDF641754C0 8207001664B7 7FFFFF14453F 8000001294E6 \
+      499C1B0EB3B2 52B73E0DBCA0 EFB2B20F5FD8 CE3CDB0FBE12 \
+      E4B49C0CEA2D 6344A80A5A7C 08C8FE0A1FFE 2BB9860B0A0E \
+      51486F0E44E1 8BCC64113B05 B6F4EC0EEB36 4413170A5B48 \
+      """)
+    frames = audiotests.byteswap3(frames)
+
+
+class WavePCM32Test(audiotests.AudioWriteTests,
+        audiotests.AudioTestsWithSourceFile,
+        unittest.TestCase):
+    module = wave
+    sndfilename = 'pluck-pcm32.wav'
+    sndfilenframes = 3307
+    nchannels = 2
+    sampwidth = 4
+    framerate = 11025
+    nframes = 48
+    comptype = 'NONE'
+    compname = 'not compressed'
+    frames = audiotests.fromhex("""\
+      022D65BCFFEB9D92 4B5A0F8000FA549C 3113C34004EE2BC0 80DCD680084303E0 \
+      CBDEC0C006B26140 48A9980003F2F8FC BFE8248001B07D92 036BFB60FE7B5D34 \
+      B8575600FA3EC920 B4B05500F3502BC0 29983000EBCB6240 1A5CA7A0E6D99A60 \
+      EDFA3E80E491BD40 C625EB80E27884A0 0E05A9A0E0B6CFE0 EF292940E0292280 \
+      5758D800E2706700 FB3557D8E83E1640 1377BF00EF840280 D82C5B80F7272A80 \
+      978F1600FB774560 F5F86510FC101364 086635A0FB9C4E20 DF30FC40FB40EE28 \
+      117FE0A0FA3438B0 3EE6B840FB5AC3F0 BC77A380FCB2F454 66D6DA80FF5F32B4 \
+      CF13B980041275B0 431D6980097A8C00 C1BB60000EC74E00 5120B98012A2BAA0 \
+      EEDF64C01754C060 820700001664B780 7FFFFFFF14453F40 800000001294E6E0 \
+      499C1B000EB3B270 52B73E000DBCA020 EFB2B2E00F5FD880 CE3CDB400FBE1270 \
+      E4B49CC00CEA2D90 6344A8800A5A7CA0 08C8FE800A1FFEE0 2BB986C00B0A0E00 \
+      51486F800E44E190 8BCC6480113B0580 B6F4EC000EEB3630 441317800A5B48A0 \
+      """)
+    frames = audiotests.byteswap4(frames)
+
 
 def test_main():
-    run_unittest(TestWave)
+    run_unittest(WavePCM8Test, WavePCM16Test, WavePCM24Test, WavePCM32Test)
 
 if __name__ == '__main__':
     test_main()
