2019-07-24 07:33:15 +00:00
|
|
|
import sys
|
|
|
|
import time
|
|
|
|
import shutil
|
2019-07-30 21:01:06 +00:00
|
|
|
import json
|
2019-08-07 23:19:38 +00:00
|
|
|
import urllib2
|
2019-07-24 07:33:15 +00:00
|
|
|
from os import mkdir, unlink, utime
|
|
|
|
from os.path import join, exists, getmtime
|
|
|
|
|
|
|
|
import util
|
|
|
|
|
2019-08-07 00:32:50 +00:00
|
|
|
import requests
|
2019-07-24 07:33:15 +00:00
|
|
|
import pytest_twisted
|
|
|
|
|
|
|
|
|
|
|
|
def test_index(alice):
|
|
|
|
"""
|
|
|
|
we can download the index file
|
|
|
|
"""
|
2019-08-08 21:28:54 +00:00
|
|
|
util.web_get(alice.node_dir, "")
|
2019-07-24 07:33:15 +00:00
|
|
|
# ...and json mode is valid json
|
2019-08-08 21:28:54 +00:00
|
|
|
json.loads(util.web_get(alice.node_dir, "?t=json"))
|
2019-07-24 07:33:15 +00:00
|
|
|
|
|
|
|
|
|
|
|
def test_upload_download(alice):
|
|
|
|
"""
|
|
|
|
upload a file, then download it via readcap
|
|
|
|
"""
|
|
|
|
|
|
|
|
FILE_CONTENTS = "some contents"
|
|
|
|
|
|
|
|
readcap = util.web_post(
|
2019-08-08 21:28:54 +00:00
|
|
|
alice.node_dir,
|
2019-07-24 07:33:15 +00:00
|
|
|
"uri",
|
|
|
|
data={
|
|
|
|
"t": "upload",
|
|
|
|
"format": "mdmf",
|
|
|
|
},
|
|
|
|
files={
|
|
|
|
"file": FILE_CONTENTS,
|
|
|
|
},
|
|
|
|
)
|
|
|
|
readcap = readcap.strip()
|
|
|
|
print("readcap '{}'".format(readcap))
|
|
|
|
|
|
|
|
data = util.web_get(
|
2019-08-08 21:28:54 +00:00
|
|
|
alice.node_dir, "uri",
|
2019-07-24 07:33:15 +00:00
|
|
|
params={
|
|
|
|
"uri": readcap,
|
|
|
|
"filename": "boom",
|
|
|
|
}
|
|
|
|
)
|
|
|
|
assert data == FILE_CONTENTS
|
2019-08-07 00:17:58 +00:00
|
|
|
|
|
|
|
|
|
|
|
def test_put(alice):
|
|
|
|
"""
|
|
|
|
use PUT to create a file
|
|
|
|
"""
|
|
|
|
|
|
|
|
FILE_CONTENTS = "added via PUT"
|
|
|
|
|
|
|
|
resp = requests.put(
|
2019-08-08 21:28:54 +00:00
|
|
|
util.node_url(alice.node_dir, "uri"),
|
2019-08-07 00:17:58 +00:00
|
|
|
files={
|
|
|
|
"file": FILE_CONTENTS,
|
|
|
|
},
|
|
|
|
)
|
|
|
|
assert resp.text.strip().startswith("URI:CHK:")
|
|
|
|
assert resp.text.strip().endswith(":2:4:153")
|
|
|
|
|
|
|
|
|
|
|
|
def test_helper_status(storage_nodes):
|
|
|
|
"""
|
|
|
|
successfully GET the /helper_status page
|
|
|
|
"""
|
|
|
|
|
2019-08-08 21:28:54 +00:00
|
|
|
url = util.node_url(storage_nodes[0].node_dir, "helper_status")
|
2019-08-07 00:17:58 +00:00
|
|
|
resp = requests.get(url)
|
2019-08-07 00:32:50 +00:00
|
|
|
assert resp.status_code >= 200 and resp.status_code < 300
|
2019-08-07 23:19:38 +00:00
|
|
|
|
|
|
|
|
2019-08-07 23:53:37 +00:00
|
|
|
def test_deep_stats(alice):
|
2019-08-07 23:19:38 +00:00
|
|
|
"""
|
|
|
|
create a directory, do deep-stats on it and prove the /operations/
|
|
|
|
URIs work
|
|
|
|
"""
|
|
|
|
resp = requests.post(
|
2019-08-08 21:28:54 +00:00
|
|
|
util.node_url(alice.node_dir, "uri"),
|
2019-08-07 23:19:38 +00:00
|
|
|
params={
|
|
|
|
"format": "sdmf",
|
|
|
|
"t": "mkdir",
|
|
|
|
"redirect_to_result": "true",
|
|
|
|
},
|
|
|
|
)
|
|
|
|
assert resp.status_code >= 200 and resp.status_code < 300
|
|
|
|
|
|
|
|
# when creating a directory, we'll be re-directed to a URL
|
|
|
|
# containing our writecap.. (XXX doesn't this violate the "URLs
|
|
|
|
# leak" maxim?)
|
|
|
|
uri = urllib2.unquote(resp.url)
|
|
|
|
assert 'URI:DIR2:' in uri
|
|
|
|
dircap = uri[uri.find("URI:DIR2:"):].rstrip('/')
|
2019-08-08 21:28:54 +00:00
|
|
|
dircap_uri = util.node_url(alice.node_dir, "uri/{}".format(urllib2.quote(dircap)))
|
2019-08-07 23:19:38 +00:00
|
|
|
|
|
|
|
# POST a file into this directory
|
|
|
|
FILE_CONTENTS = "a file in a directory"
|
|
|
|
|
|
|
|
resp = requests.post(
|
|
|
|
dircap_uri,
|
|
|
|
data={
|
|
|
|
"t": "upload",
|
|
|
|
"when_done": ".",
|
|
|
|
},
|
|
|
|
files={
|
|
|
|
"file": FILE_CONTENTS,
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
|
|
|
# confirm the file is in the directory
|
|
|
|
resp = requests.get(
|
|
|
|
dircap_uri,
|
|
|
|
params={
|
|
|
|
"t": "json",
|
|
|
|
},
|
|
|
|
)
|
|
|
|
d = json.loads(resp.content)
|
|
|
|
k, data = d
|
|
|
|
assert k == "dirnode"
|
|
|
|
assert len(data['children']) == 1
|
|
|
|
k, child = data['children'].values()[0]
|
|
|
|
assert k == "filenode"
|
|
|
|
assert child['size'] == len(FILE_CONTENTS)
|
|
|
|
|
|
|
|
# perform deep-stats on it...
|
|
|
|
resp = requests.post(
|
|
|
|
dircap_uri,
|
|
|
|
data={
|
|
|
|
"t": "start-deep-stats",
|
|
|
|
"ophandle": "something_random",
|
|
|
|
},
|
|
|
|
)
|
|
|
|
assert resp.status_code >= 200 and resp.status_code < 300
|
|
|
|
|
2019-08-07 23:25:07 +00:00
|
|
|
# confirm we get information from the op .. after its done
|
|
|
|
while True:
|
|
|
|
resp = requests.get(
|
2019-08-08 21:28:54 +00:00
|
|
|
util.node_url(alice.node_dir, "operations/something_random"),
|
2019-08-07 23:25:07 +00:00
|
|
|
)
|
|
|
|
d = json.loads(resp.content)
|
|
|
|
if d['size-literal-files'] == len(FILE_CONTENTS):
|
|
|
|
print("stats completed successfully")
|
|
|
|
break
|
|
|
|
else:
|
|
|
|
print("{} != {}; waiting".format(d['size-literal-files'], len(FILE_CONTENTS)))
|
|
|
|
time.sleep(.5)
|