201 lines
5.3 KiB
Python
201 lines
5.3 KiB
Python
"""Tests abstract buffered file API, using FTP implementation"""
|
|
|
|
import pickle
|
|
|
|
import pytest
|
|
|
|
from fsspec.implementations.tests.test_ftp import FTPFileSystem
|
|
|
|
data = b"hello" * 10000
|
|
|
|
|
|
def test_pickle(ftp_writable):
|
|
host, port, user, pw = ftp_writable
|
|
ftp = FTPFileSystem(host=host, port=port, username=user, password=pw)
|
|
|
|
f = ftp.open("/out", "rb")
|
|
|
|
f2 = pickle.loads(pickle.dumps(f))
|
|
assert f == f2
|
|
|
|
|
|
def test_file_read_attributes(ftp_writable):
|
|
host, port, user, pw = ftp_writable
|
|
ftp = FTPFileSystem(host=host, port=port, username=user, password=pw)
|
|
|
|
f = ftp.open("/out", "rb")
|
|
assert f.info()["size"] == len(data)
|
|
assert f.tell() == 0
|
|
assert f.seekable()
|
|
assert f.readable()
|
|
assert not f.writable()
|
|
out = bytearray(len(data))
|
|
|
|
assert f.read() == data
|
|
assert f.read() == b""
|
|
f.seek(0)
|
|
assert f.readuntil(b"l") == b"hel"
|
|
assert f.tell() == 3
|
|
|
|
f.readinto1(out)
|
|
assert out[:-3] == data[3:]
|
|
with pytest.raises(ValueError):
|
|
f.write(b"")
|
|
f.close()
|
|
with pytest.raises(ValueError):
|
|
f.read()(b"")
|
|
|
|
|
|
def test_seek(ftp_writable):
|
|
host, port, user, pw = ftp_writable
|
|
ftp = FTPFileSystem(host=host, port=port, username=user, password=pw)
|
|
|
|
f = ftp.open("/out", "rb")
|
|
|
|
assert f.seek(-10, 2) == len(data) - 10
|
|
assert f.tell() == len(data) - 10
|
|
assert f.seek(-1, 1) == len(data) - 11
|
|
with pytest.raises(ValueError):
|
|
f.seek(-1)
|
|
with pytest.raises(ValueError):
|
|
f.seek(0, 7)
|
|
|
|
|
|
def test_file_idempotent(ftp_writable):
|
|
host, port, user, pw = ftp_writable
|
|
ftp = FTPFileSystem(host=host, port=port, username=user, password=pw)
|
|
|
|
f = ftp.open("/out", "rb")
|
|
f2 = ftp.open("/out", "rb")
|
|
assert hash(f) == hash(f2)
|
|
assert f == f2
|
|
ftp.touch("/out2")
|
|
f2 = ftp.open("/out2", "rb")
|
|
assert hash(f2) != hash(f)
|
|
assert f != f2
|
|
f2 = ftp.open("/out", "wb")
|
|
assert hash(f2) != hash(f)
|
|
|
|
|
|
def test_file_text_attributes(ftp_writable):
|
|
host, port, user, pw = ftp_writable
|
|
ftp = FTPFileSystem(host=host, port=port, username=user, password=pw)
|
|
|
|
data = b"hello\n" * 1000
|
|
with ftp.open("/out2", "wb") as f:
|
|
f.write(data)
|
|
|
|
f = ftp.open("/out2", "rb")
|
|
assert f.readline() == b"hello\n"
|
|
f.seek(0)
|
|
assert list(f) == [d + b"\n" for d in data.split()]
|
|
f.seek(0)
|
|
assert f.readlines() == [d + b"\n" for d in data.split()]
|
|
|
|
f = ftp.open("/out2", "rt")
|
|
assert f.readline() == "hello\n"
|
|
assert f.encoding
|
|
|
|
|
|
def test_file_write_attributes(ftp_writable):
|
|
host, port, user, pw = ftp_writable
|
|
ftp = FTPFileSystem(host=host, port=port, username=user, password=pw)
|
|
f = ftp.open("/out2", "wb")
|
|
with pytest.raises(ValueError):
|
|
f.info()
|
|
with pytest.raises(OSError):
|
|
f.seek(0)
|
|
with pytest.raises(ValueError):
|
|
f.read(0)
|
|
assert not f.readable()
|
|
assert f.writable()
|
|
|
|
f.flush() # no-op
|
|
|
|
assert f.write(b"hello") == 5
|
|
assert f.write(b"hello") == 5
|
|
assert not f.closed
|
|
f.close()
|
|
assert f.closed
|
|
with pytest.raises(ValueError):
|
|
f.write(b"")
|
|
with pytest.raises(ValueError):
|
|
f.flush()
|
|
|
|
|
|
def test_midread_cache(ftp_writable):
|
|
host, port, user, pw = ftp_writable
|
|
fs = FTPFileSystem(host=host, port=port, username=user, password=pw)
|
|
fn = "/myfile"
|
|
with fs.open(fn, "wb") as f:
|
|
f.write(b"a" * 175627146)
|
|
with fs.open(fn, "rb") as f:
|
|
f.seek(175561610)
|
|
d1 = f.read(65536)
|
|
assert len(d1) == 65536
|
|
|
|
f.seek(4)
|
|
size = 17562198
|
|
d2 = f.read(size)
|
|
assert len(d2) == size
|
|
|
|
f.seek(17562288)
|
|
size = 17562187
|
|
d3 = f.read(size)
|
|
assert len(d3) == size
|
|
|
|
|
|
def test_read_block(ftp_writable):
|
|
# not the same as test_read_block in test_utils, this depends on the
|
|
# behaviour of the bytest caching
|
|
from fsspec.utils import read_block
|
|
|
|
host, port, user, pw = ftp_writable
|
|
fs = FTPFileSystem(host=host, port=port, username=user, password=pw)
|
|
fn = "/myfile"
|
|
with fs.open(fn, "wb") as f:
|
|
f.write(b"a,b\n1,2")
|
|
f = fs.open(fn, "rb", cache_type="bytes")
|
|
assert read_block(f, 0, 6400, b"\n") == b"a,b\n1,2"
|
|
|
|
|
|
def test_with_gzip(ftp_writable):
|
|
import gzip
|
|
|
|
data = b"some compressible stuff"
|
|
host, port, user, pw = ftp_writable
|
|
fs = FTPFileSystem(host=host, port=port, username=user, password=pw)
|
|
fn = "/myfile"
|
|
with fs.open(fn, "wb") as f:
|
|
gf = gzip.GzipFile(fileobj=f, mode="w")
|
|
gf.write(data)
|
|
gf.close()
|
|
with fs.open(fn, "rb") as f:
|
|
gf = gzip.GzipFile(fileobj=f, mode="r")
|
|
assert gf.read() == data
|
|
|
|
|
|
def test_auto_compression(m):
|
|
fs = m
|
|
with fs.open("myfile.gz", mode="wt", compression="infer") as f:
|
|
f.write("text")
|
|
with fs.open("myfile.gz", mode="rt", compression="infer") as f:
|
|
assert f.read() == "text"
|
|
|
|
|
|
def test_with_zip(ftp_writable):
|
|
import zipfile
|
|
|
|
data = b"hello zip"
|
|
host, port, user, pw = ftp_writable
|
|
fs = FTPFileSystem(host=host, port=port, username=user, password=pw)
|
|
fn = "/myfile.zip"
|
|
inner_file = "test.txt"
|
|
with fs.open(fn, "wb") as f:
|
|
zf = zipfile.ZipFile(f, mode="w")
|
|
zf.writestr(inner_file, data)
|
|
zf.close()
|
|
with fs.open(fn, "rb") as f:
|
|
zf = zipfile.ZipFile(f, mode="r")
|
|
assert zf.read(inner_file) == data
|