1# -*- coding: utf-8 -*-
2
3import os
4
5from mutagen._compat import cBytesIO
6from mutagen.oggflac import OggFLAC, OggFLACStreamInfo, delete, error
7from mutagen.ogg import OggPage, error as OggError
8
9from tests import TestCase, DATA_DIR, get_temp_copy
10from tests.test_ogg import TOggFileTypeMixin
11from tests.test_flac import have_flac, call_flac
12
13
14class TOggFLAC(TestCase, TOggFileTypeMixin):
15    Kind = OggFLAC
16    PADDING_SUPPORT = False
17
18    def setUp(self):
19        self.filename = get_temp_copy(os.path.join(DATA_DIR, "empty.oggflac"))
20        self.audio = OggFLAC(self.filename)
21
22    def tearDown(self):
23        os.unlink(self.filename)
24
25    def test_vendor(self):
26        self.failUnless(
27            self.audio.tags.vendor.startswith("reference libFLAC"))
28        self.failUnlessRaises(KeyError, self.audio.tags.__getitem__, "vendor")
29
30    def test_streaminfo_bad_marker(self):
31        with open(self.filename, "rb") as h:
32            page = OggPage(h).write()
33        page = page.replace(b"fLaC", b"!fLa", 1)
34        self.failUnlessRaises(error, OggFLACStreamInfo, cBytesIO(page))
35
36    def test_streaminfo_too_short(self):
37        with open(self.filename, "rb") as h:
38            page = OggPage(h).write()
39        self.failUnlessRaises(OggError, OggFLACStreamInfo, cBytesIO(page[:10]))
40
41    def test_streaminfo_bad_version(self):
42        with open(self.filename, "rb") as h:
43            page = OggPage(h).write()
44        page = page.replace(b"\x01\x00", b"\x02\x00", 1)
45        self.failUnlessRaises(error, OggFLACStreamInfo, cBytesIO(page))
46
47    def test_flac_reference_simple_save(self):
48        if not have_flac:
49            return
50        self.audio.save()
51        self.scan_file()
52        self.assertEqual(call_flac("--ogg", "-t", self.filename), 0)
53
54    def test_flac_reference_really_big(self):
55        if not have_flac:
56            return
57        self.test_really_big()
58        self.audio.save()
59        self.scan_file()
60        self.assertEqual(call_flac("--ogg", "-t", self.filename), 0)
61
62    def test_module_delete(self):
63        delete(self.filename)
64        self.scan_file()
65        self.failIf(OggFLAC(self.filename).tags)
66
67    def test_flac_reference_delete(self):
68        if not have_flac:
69            return
70        self.audio.delete()
71        self.scan_file()
72        self.assertEqual(call_flac("--ogg", "-t", self.filename), 0)
73
74    def test_flac_reference_medium_sized(self):
75        if not have_flac:
76            return
77        self.audio["foobar"] = "foobar" * 1000
78        self.audio.save()
79        self.scan_file()
80        self.assertEqual(call_flac("--ogg", "-t", self.filename), 0)
81
82    def test_flac_reference_delete_readd(self):
83        if not have_flac:
84            return
85        self.audio.delete()
86        self.audio.tags.clear()
87        self.audio["foobar"] = "foobar" * 1000
88        self.audio.save()
89        self.scan_file()
90        self.assertEqual(call_flac("--ogg", "-t", self.filename), 0)
91
92    def test_not_my_ogg(self):
93        fn = os.path.join(DATA_DIR, 'empty.ogg')
94        self.failUnlessRaises(error, type(self.audio), fn)
95        self.failUnlessRaises(error, self.audio.save, fn)
96        self.failUnlessRaises(error, self.audio.delete, fn)
97
98    def test_mime(self):
99        self.failUnless("audio/x-oggflac" in self.audio.mime)
100
101    def test_info_pprint(self):
102        self.assertTrue(self.audio.info.pprint().startswith(u"Ogg FLAC"))
103