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)
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)
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_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) == []