Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Empty file added s3fs/tests/derived/__init__.py
Empty file.
116 changes: 116 additions & 0 deletions s3fs/tests/derived/s3fs_fixtures.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
import json
import os
import pytest
import requests
import time

from fsspec.tests.abstract import AbstractFixtures
from s3fs.core import S3FileSystem


test_bucket_name = "test"
secure_bucket_name = "test-secure"
versioned_bucket_name = "test-versioned"
port = 5555
endpoint_uri = "http://127.0.0.1:%s/" % port


class S3fsFixtures(AbstractFixtures):
@pytest.fixture(scope="class")
def fs(self, _s3_base, _get_boto3_client):
print("FS")
client = _get_boto3_client
client.create_bucket(Bucket=test_bucket_name, ACL="public-read")

client.create_bucket(Bucket=versioned_bucket_name, ACL="public-read")
client.put_bucket_versioning(
Bucket=versioned_bucket_name, VersioningConfiguration={"Status": "Enabled"}
)

# initialize secure bucket
client.create_bucket(Bucket=secure_bucket_name, ACL="public-read")
policy = json.dumps(
{
"Version": "2012-10-17",
"Id": "PutObjPolicy",
"Statement": [
{
"Sid": "DenyUnEncryptedObjectUploads",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::{bucket_name}/*".format(
bucket_name=secure_bucket_name
),
"Condition": {
"StringNotEquals": {
"s3:x-amz-server-side-encryption": "aws:kms"
}
},
}
],
}
)
client.put_bucket_policy(Bucket=secure_bucket_name, Policy=policy)

S3FileSystem.clear_instance_cache()
s3 = S3FileSystem(anon=False, client_kwargs={"endpoint_url": endpoint_uri})
s3.invalidate_cache()
yield s3

@pytest.fixture
def fs_path(self):
return test_bucket_name

def supports_empty_directories(self):
return False

@pytest.fixture(scope="class")
def _get_boto3_client(self):
from botocore.session import Session

# NB: we use the sync botocore client for setup
session = Session()
return session.create_client("s3", endpoint_url=endpoint_uri)

@pytest.fixture(scope="class")
def _s3_base(self):
# writable local S3 system
import shlex
import subprocess

try:
# should fail since we didn't start server yet
r = requests.get(endpoint_uri)
except:
pass
else:
if r.ok:
raise RuntimeError("moto server already up")
if "AWS_SECRET_ACCESS_KEY" not in os.environ:
os.environ["AWS_SECRET_ACCESS_KEY"] = "foo"
if "AWS_ACCESS_KEY_ID" not in os.environ:
os.environ["AWS_ACCESS_KEY_ID"] = "foo"
proc = subprocess.Popen(
shlex.split("moto_server s3 -p %s" % port),
stderr=subprocess.DEVNULL,
stdout=subprocess.DEVNULL,
stdin=subprocess.DEVNULL,
)

timeout = 5
while timeout > 0:
try:
print("polling for moto server")
r = requests.get(endpoint_uri)
if r.ok:
break
except:
pass
timeout -= 0.1
time.sleep(0.1)
print("server up")
yield
print("moto done")
proc.terminate()
proc.wait()
14 changes: 14 additions & 0 deletions s3fs/tests/derived/s3fs_test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import fsspec.tests.abstract as abstract
from s3fs.tests.derived.s3fs_fixtures import S3fsFixtures


class TestS3fsCopy(abstract.AbstractCopyTests, S3fsFixtures):
pass


class TestS3fsGet(abstract.AbstractGetTests, S3fsFixtures):
pass


class TestS3fsPut(abstract.AbstractPutTests, S3fsFixtures):
pass