def test_sanitize_py2_fixup(self):
        if PY3:
            return

        old = dict.__new__(AudioFile)
        dict.__init__(
            old, {
                b"foo": b"bar",
                u"öäü": b"bla",
                "~#num": u"1",
                "~#num2": u"1.25",
                "~#num3": u"bla",
                "~filename": u"text",
                "~mountpoint": b"bytes",
                "~somethingdifferent": b"hello",
            })

        fixed = {
            b"foo": u"bar",
            u"öäü": u"bla",
            "~#num": 1,
            "~#num2": 1.25,
            "~#num3": 0,
            "~filename": fsnative(u"text"),
            "~mountpoint": fsnative(u"bytes"),
            "~somethingdifferent": u"hello",
        }

        data = dump_audio_files([old])
        new = load_audio_files(data)
        assert dict(new[0]) == fixed
        for v1, v2 in zip(sorted(new[0].values()), sorted(fixed.values())):
            assert type(v1) is type(v2)
Exemple #2
0
def _load_items(filename):
    """Load items from disk.

    In case of an error returns default or an empty list.
    """

    try:
        with open(filename, "rb") as fp:
            data = fp.read()
    except EnvironmentError:
        print_w("Couldn't load library file from: %r" % filename)
        return []

    try:
        items = load_audio_files(data)
    except SerializationError:
        # there are too many ways this could fail
        util.print_exc()

        # move the broken file out of the way
        try:
            shutil.copy(filename, filename + ".not-valid")
        except EnvironmentError:
            util.print_exc()

        return []

    return items
    def test_sanitized_py3(self):
        i = AudioFile.__new__(list(formats.types)[0])
        # this is something that old py2 versions could pickle
        dict.__init__(
            i, {
                b"bytes": b"bytes",
                u"unicode": u"unicode",
                b"~filename": b"somefile",
                u"~mountpoint": u"somemount",
                u"int": 42,
                b"float": 1.25,
            })
        data = pickle_dumps([i], 1)
        items = load_audio_files(data, process=True)
        i = items[0]

        if not PY3:
            return

        assert i["bytes"] == "bytes"
        assert i["unicode"] == "unicode"
        assert isinstance(i["~filename"], fsnative)
        assert isinstance(i["~mountpoint"], fsnative)
        assert i["int"] == 42
        assert i["float"] == 1.25
    def test_save_ascii_keys_as_bytes_on_py3(self):
        i = AudioFile.__new__(list(formats.types)[0])
        dict.__setitem__(i, u"foo", u"bar")
        data = dump_audio_files([i], process=True)

        items = load_audio_files(data, process=False)
        assert isinstance(list(items[0].keys())[0], bytes)
 def test_save_ascii_keys_as_bytes_on_py3(self):
     i = AudioFile.__new__(list(formats.types)[0])
     dict.__setitem__(i, u"foo", u"bar")
     data = dump_audio_files([i], process=True)
     if PY3:
         items = load_audio_files(data, process=False)
         assert isinstance(list(items[0].keys())[0], bytes)
    def test_sanitize_py2_fixup(self):
        if PY3:
            return

        old = dict.__new__(AudioFile)
        dict.__init__(old, {
            b"foo": b"bar",
            u"öäü": b"bla",
            "~#num": u"1",
            "~#num2": u"1.25",
            "~#num3": u"bla",
            "~filename": u"text",
            "~mountpoint": b"bytes",
            "~somethingdifferent": b"hello",
        })

        fixed = {
            b"foo": u"bar",
            u"öäü": u"bla",
            "~#num": 1,
            "~#num2": 1.25,
            "~#num3": 0,
            "~filename": fsnative(u"text"),
            "~mountpoint": fsnative(u"bytes"),
            "~somethingdifferent": u"hello",
        }

        data = dump_audio_files([old])
        new = load_audio_files(data)
        assert dict(new[0]) == fixed
        for v1, v2 in zip(sorted(new[0].values()), sorted(fixed.values())):
            assert type(v1) is type(v2)
Exemple #7
0
def _load_items(filename):
    """Load items from disk.

    In case of an error returns default or an empty list.
    """

    try:
        with open(filename, "rb") as fp:
            data = fp.read()
    except EnvironmentError:
        print_w("Couldn't load library file from: %r" % filename)
        return []

    try:
        items = load_audio_files(data)
    except SerializationError:
        # there are too many ways this could fail
        util.print_exc()

        # move the broken file out of the way
        try:
            shutil.copy(filename, filename + ".not-valid")
        except EnvironmentError:
            util.print_exc()

        return []

    return items
    def test_load_audio_files_missing_class(self):
        for protocol in [0, 1, 2]:
            data = pickle_dumps(self.instances, protocol)

            items = load_audio_files(data)
            self.assertEqual(len(items), len(formats.types))
            assert all(isinstance(i, AudioFile) for i in items)

            broken = data.replace(b"SPCFile", b"FooFile")
            items = load_audio_files(broken)
            self.assertEqual(len(items), len(formats.types) - 1)
            assert all(isinstance(i, AudioFile) for i in items)

            broken = data.replace(b"formats.spc", b"formats.foo")
            items = load_audio_files(broken)
            self.assertEqual(len(items), len(formats.types) - 1)
            assert all(isinstance(i, AudioFile) for i in items)
    def test_load_audio_files_missing_class(self):
        for protocol in [0, 1, 2]:
            data = pickle_dumps(self.instances, protocol)

            items = load_audio_files(data)
            self.assertEqual(len(items), len(formats.types))
            assert all(isinstance(i, AudioFile) for i in items)

            broken = data.replace(b"SPCFile", b"FooFile")
            items = load_audio_files(broken)
            self.assertEqual(len(items), len(formats.types) - 1)
            assert all(isinstance(i, AudioFile) for i in items)

            broken = data.replace(b"formats.spc", b"formats.foo")
            items = load_audio_files(broken)
            self.assertEqual(len(items), len(formats.types) - 1)
            assert all(isinstance(i, AudioFile) for i in items)
    def test_dump_audio_files(self):
        data = dump_audio_files(self.instances, process=False)
        items = load_audio_files(data, process=False)

        assert len(items) == len(self.instances)
        for a, b in zip(items, self.instances):
            a = dict(a)
            b = dict(b)
            for key in a:
                assert b[key] == a[key]
            for key in b:
                assert b[key] == a[key]
    def test_dump_audio_files(self):
        data = dump_audio_files(self.instances, process=False)
        items = load_audio_files(data, process=False)

        assert len(items) == len(self.instances)
        for a, b in zip(items, self.instances):
            a = dict(a)
            b = dict(b)
            for key in a:
                assert b[key] == a[key]
            for key in b:
                assert b[key] == a[key]
    def test_sanitize_py2_normal(self):
        if PY3:
            return

        af = AudioFile({
            b"foo": u"bar",
            u"öäü": u"bla",
            "~#num": 1,
            "~#num2": long(2),
            "~#num3": 1.25,
            "~filename": fsnative(u"filename"),
            "~mountpoint": fsnative(u"mount"),
            "~somethingdifferent": u"hello",
        })

        data = dump_audio_files([af])
        new = load_audio_files(data)
        assert dict(new[0]) == dict(af)
    def test_sanitize_py2_normal(self):
        if PY3:
            return

        af = AudioFile({
            b"foo": u"bar",
            u"öäü": u"bla",
            "~#num": 1,
            "~#num2": long(2),
            "~#num3": 1.25,
            "~filename": fsnative(u"filename"),
            "~mountpoint": fsnative(u"mount"),
            "~somethingdifferent": u"hello",
        })

        data = dump_audio_files([af])
        new = load_audio_files(data)
        assert dict(new[0]) == dict(af)
    def test_sanitized_py3(self):
        i = AudioFile.__new__(list(formats.types)[0])
        # this is something that old py2 versions could pickle
        dict.__init__(i, {
            b"bytes": b"bytes",
            u"unicode": u"unicode",
            b"~filename": b"somefile",
            u"~mountpoint": u"somemount",
            u"int": 42,
            b"float": 1.25,
        })
        data = pickle_dumps([i], 1)
        items = load_audio_files(data, process=True)
        i = items[0]

        if not PY3:
            return

        assert i["bytes"] == "bytes"
        assert i["unicode"] == "unicode"
        assert isinstance(i["~filename"], fsnative)
        assert isinstance(i["~mountpoint"], fsnative)
        assert i["int"] == 42
        assert i["float"] == 1.25
 def test_load_audio_files(self):
     for protocol in [0, 1, 2]:
         data = pickle_dumps(self.instances, protocol)
         items = load_audio_files(data)
         assert len(items) == len(formats.types)
         assert all(isinstance(i, AudioFile) for i in items)
 def test_unpickle_random_class(self):
     for protocol in [0, 1, 2]:
         data = pickle_dumps([42], protocol)
         with self.assertRaises(SerializationError):
             load_audio_files(data)
 def test_dump_empty(self):
     data = dump_audio_files([])
     assert load_audio_files(data) == []
 def test_dump_empty(self):
     data = dump_audio_files([])
     assert load_audio_files(data) == []
 def test_unpickle_random_class(self):
     for protocol in [0, 1, 2]:
         data = pickle_dumps([42], protocol)
         with self.assertRaises(SerializationError):
             load_audio_files(data)
 def test_load_audio_files(self):
     for protocol in [0, 1, 2]:
         data = pickle_dumps(self.instances, protocol)
         items = load_audio_files(data)
         assert len(items) == len(formats.types)
         assert all(isinstance(i, AudioFile) for i in items)