示例#1
0
def test_copy_dirty_progress():
    size = 1024
    chunk_size = size // 4

    def fake_extents(context="zero"):
        return [
            image.DirtyExtent(0 * chunk_size, chunk_size, True),
            image.DirtyExtent(1 * chunk_size, chunk_size, False),
            image.DirtyExtent(2 * chunk_size, chunk_size, True),
            image.DirtyExtent(3 * chunk_size, chunk_size, False),
        ]

    src = memory.Backend("r", (b"x" * chunk_size + b"\0" * chunk_size +
                               b"x" * chunk_size + b"\0" * chunk_size))
    src.extents = fake_extents

    dst = memory.Backend("r+", b"\0" * size)

    p = FakeProgress()
    io.copy(src, dst, dirty=True, progress=p)

    # Report at least every extent.
    assert len(p.updates) >= 4

    # Report entire image size.
    assert sum(p.updates) == size
def test_close_error():
    def close():
        raise IOError("backend error")

    with pytest.raises(IOError):
        with memory.Backend("r+") as m:
            m.close = close
def test_size():
    m = memory.Backend("r+", b"data")
    assert m.size() == 4
    assert m.tell() == 0
    m.zero(5)
    m.seek(3)
    assert m.size() == 5
    assert m.tell() == 3
def test_create_with_bytes():
    m = memory.Backend("r", b"data")
    assert m.readable()
    assert not m.writable()

    b = bytearray(5)
    assert m.readinto(b) == 4
    assert b[:] == b"data\0"
def test_close():
    m = memory.Backend("r+")
    m.close()
    # All operations should fail now with:
    #     ValueError: I/O operation on closed file
    with pytest.raises(ValueError):
        m.write("more")
    with pytest.raises(ValueError):
        m.readinto(bytearray(10))
def test_write_to():
    size = 128
    src = memory.WriterTo("r", b"x" * size)
    dst = memory.Backend("r+", b"y" * size)
    buf = bytearray(32)
    src.write_to(dst, size, buf)

    assert src.tell() == size
    assert dst.tell() == size
    assert src.data() == dst.data()
示例#7
0
def test_copy_generic(zero):
    size = 1024
    chunk_size = size // 2

    def fake_extents(context="zero"):
        return [
            image.ZeroExtent(0 * chunk_size, chunk_size, False),
            image.ZeroExtent(1 * chunk_size, chunk_size, True),
        ]

    src = memory.Backend("r", b"x" * chunk_size + b"\0" * chunk_size)
    src.extents = fake_extents

    dst = memory.Backend("r+", (b"y" if zero else b"\0") * size)

    io.copy(src, dst, buffer_size=128, zero=zero)

    assert dst.size() == src.size()
    assert dst.data() == src.data()
def test_read_from():
    size = 128
    src = memory.Backend("r", b"x" * size)
    dst = memory.ReaderFrom("r+", b"y" * size)
    buf = bytearray(32)
    dst.read_from(src, size, buf)

    assert src.tell() == size
    assert dst.tell() == size
    assert src.data() == dst.data()
def test_propagate_user_error():
    class UserError(Exception):
        pass

    def close():
        raise IOError("backend error")

    with pytest.raises(UserError):
        with memory.Backend("r+") as m:
            m.close = close
            raise UserError("user error")
def test_open_writeonly():
    m = memory.Backend("w")
    assert not m.readable()
    assert m.writable()

    data = b"data"
    m.write(data)
    assert m.tell() == len(data)
    with pytest.raises(IOError):
        m.readinto(bytearray(10))
    m.flush()
def test_read_from_some():
    src = memory.Backend("r", b"x" * 128)
    dst = memory.ReaderFrom("r+", b"y" * 128)
    buf = bytearray(32)

    src.seek(32)
    dst.seek(32)
    dst.read_from(src, 64, buf)

    assert src.tell() == 96
    assert dst.tell() == 96
    assert dst.data() == b"y" * 32 + b"x" * 64 + b"y" * 32
示例#12
0
def test_copy_dirty():
    size = 1024
    chunk_size = size // 4

    def fake_extents(context="zero"):
        return [
            image.DirtyExtent(0 * chunk_size, chunk_size, True),
            image.DirtyExtent(1 * chunk_size, chunk_size, False),
            image.DirtyExtent(2 * chunk_size, chunk_size, True),
            image.DirtyExtent(3 * chunk_size, chunk_size, False),
        ]

    src = memory.Backend("r", (b"a" * chunk_size + b"b" * chunk_size +
                               b"c" * chunk_size + b"d" * chunk_size))
    src.extents = fake_extents

    dst = memory.Backend("r+", b"\0" * size)

    io.copy(src, dst, dirty=True)

    assert dst.data() == (b"a" * chunk_size + b"\0" * chunk_size +
                          b"c" * chunk_size + b"\0" * chunk_size)
def test_open_readonly():
    m = memory.Backend("r")
    assert m.readable()
    assert not m.writable()

    with pytest.raises(IOError):
        m.write(b"data")
    with pytest.raises(IOError):
        m.zero(4)
    assert m.tell() == 0
    b = bytearray(b"before")
    assert m.readinto(b) == 0
    assert b == b"before"
def test_write_to_some():
    size = 128
    src = memory.WriterTo("r", b"x" * size)
    dst = memory.Backend("r+", b"y" * size)
    buf = bytearray(32)

    src.seek(32)
    dst.seek(32)
    src.write_to(dst, 64, buf)

    assert src.tell() == 96
    assert dst.tell() == 96
    assert dst.data() == b"y" * 32 + b"x" * 64 + b"y" * 32
def test_open_read_write():
    m = memory.Backend("r+")
    assert m.readable()
    assert m.writable()
    assert not m.sparse

    data = b"data"
    m.write(data)
    assert m.tell() == len(data)

    m.zero(4)
    size = len(data) + 4
    assert m.tell() == size

    content = data + b"\0" * 4
    b = bytearray(size)
    m.seek(0)
    assert m.readinto(b) == size
    assert b == content
def test_dirty():
    # backend created clean
    m = memory.Backend("r+", b"data")
    assert not m.dirty

    # write ans zero dirty the backend
    m.write(b"01234")
    assert m.dirty
    m.flush()
    assert not m.dirty
    m.zero(5)
    assert m.dirty
    m.flush()
    assert not m.dirty

    # readinto, seek do not affect dirty.
    b = bytearray(10)
    m.seek(0)
    assert not m.dirty
    m.readinto(b)
    assert not m.dirty
def test_context_manager():
    with memory.Backend("r+") as m:
        m.write(b"data")
    with pytest.raises(ValueError):
        m.write("more")
def test_invalid_mode():
    with pytest.raises(ValueError):
        memory.Backend("invalid")
def test_extents():
    m = memory.Backend("r+", b"data")
    assert list(m.extents()) == [image.ZeroExtent(0, 4, False)]
def test_extents_zero():
    m = memory.Backend("r+", b"data")
    with pytest.raises(errors.UnsupportedOperation):
        list(m.extents(context="dirty"))