def test_pickle_dumps_fail(self): class A(object): def __getstate__(self): raise Exception with self.assertRaises(PicklingError): pickle_dumps(A())
def test_protocols(self): pickle_dumps(42, 0) pickle_dumps(42, 1) pickle_dumps(42, 2) with self.assertRaises(ValueError): pickle_dumps(42, -1) with self.assertRaises(ValueError): pickle_dumps(42, 3)
def test_switch_class(self): def lookup_func(base, module, name): if name == "A": return B return base(module, name) value = pickle_loads(pickle_dumps(A()), lookup_func) assert isinstance(value, B)
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 dump_audio_files(item_list, process=True): """Pickles a list of AudioFiles Returns: bytes Raises: SerializationError """ assert isinstance(item_list, list) assert not item_list or isinstance(item_list[0], AudioFile) if process: item_list = _py3_to_py2(item_list) try: return pickle_dumps(item_list, 2) except pickle.PicklingError as e: raise SerializationError(e)
def dump_audio_files(item_list, process=True): """Pickles a list of AudioFiles Returns: bytes Raises: SerializationError """ assert isinstance(item_list, list) assert not item_list or isinstance(item_list[0], AudioFile) if PY3 and process: item_list = _py3_to_py2(item_list) try: return pickle_dumps(item_list, 2) except pickle.PicklingError as e: raise SerializationError(e)
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] 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_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_pickle_dumps(self): v = [u"foo", b"bar", 42] for protocol in [0, 1, 2]: assert pickle_loads(pickle_dumps(v)) == v
def test_pickle_load(self): data = {b"foo": u"bar", u"quux": b"baz"} for protocol in [0, 1, 2]: assert pickle_loads(pickle_dumps(data)) == data assert pickle_load(BytesIO(pickle_dumps(data))) == data
def test_pickle_load(self): data = {b"foo": u"bar", u"quux": b"baz"} for protocol in [0, 1, 2]: assert pickle_loads(pickle_dumps(data)) == data assert pickle_load(cBytesIO(pickle_dumps(data))) == data