cli: add test coverage

This commit is contained in:
Brian Warner 2007-10-11 19:20:41 -07:00
parent 654bbbed8f
commit 8985b6565d
6 changed files with 101 additions and 17 deletions

View File

@ -106,7 +106,8 @@ def list(config, stdout, stderr):
from allmydata.scripts import tahoe_ls
rc = tahoe_ls.list(config['node-url'],
config['root-uri'],
config['vdrive_pathname'])
config['vdrive_pathname'],
stdout, stderr)
return rc
def get(config, stdout, stderr):
@ -116,7 +117,8 @@ def get(config, stdout, stderr):
rc = tahoe_get.get(config['node-url'],
config['root-uri'],
vdrive_filename,
local_filename)
local_filename,
stdout, stderr)
if rc == 0:
if local_filename is None or local_filename == "-":
# be quiet, since the file being written to stdout should be
@ -140,7 +142,8 @@ def put(config, stdout, stderr):
config['root-uri'],
local_filename,
vdrive_filename,
verbosity)
verbosity,
stdout, stderr)
return rc
def rm(config, stdout, stderr):
@ -153,7 +156,8 @@ def rm(config, stdout, stderr):
rc = tahoe_rm.rm(config['node-url'],
config['root-uri'],
vdrive_pathname,
verbosity)
verbosity,
stdout, stderr)
return rc
dispatch = {

View File

@ -2,7 +2,7 @@
import sys, urllib
def get(nodeurl, root_uri, vdrive_fname, local_file):
def get(nodeurl, root_uri, vdrive_fname, local_file, stdout, stderr):
if nodeurl[-1] != "/":
nodeurl += "/"
url = nodeurl + "uri/%s/" % urllib.quote(root_uri.replace("/","!"))
@ -10,16 +10,19 @@ def get(nodeurl, root_uri, vdrive_fname, local_file):
url += vdrive_fname
if local_file is None or local_file == "-":
outf = sys.stdout
outf = stdout
close_outf = False
else:
outf = open(local_file, "wb")
close_outf = True
inf = urllib.urlopen(url)
while True:
data = inf.read(4096)
if not data:
break
outf.write(data)
outf.close()
if close_outf:
outf.close()
return 0

View File

@ -3,7 +3,7 @@
import urllib
import simplejson
def list(nodeurl, root_uri, vdrive_pathname):
def list(nodeurl, root_uri, vdrive_pathname, stdout, stderr):
if nodeurl[-1] != "/":
nodeurl += "/"
url = nodeurl + "uri/%s/" % urllib.quote(root_uri.replace("/","!"))
@ -20,11 +20,11 @@ def list(nodeurl, root_uri, vdrive_pathname):
child = d['children'][name]
childtype = child[0]
if childtype == "dirnode":
print "%10s %s/" % ("", name)
print >>stdout, "%10s %s/" % ("", name)
else:
assert childtype == "filenode"
size = child[1]['size']
print "%10s %s" % (size, name)
print >>stdout, "%10s %s" % (size, name)

View File

@ -4,7 +4,8 @@ import re, socket, urllib
NODEURL_RE=re.compile("http://([^:]*)(:([1-9][0-9]*))?")
def put(nodeurl, root_uri, local_fname, vdrive_fname, verbosity):
def put(nodeurl, root_uri, local_fname, vdrive_fname, verbosity,
stdout, stderr):
"""
@param verbosity: 0, 1, or 2, meaning quiet, verbose, or very verbose
@ -32,7 +33,7 @@ def put(nodeurl, root_uri, local_fname, vdrive_fname, verbosity):
try:
sent = so.send(data)
except Exception, le:
print "got socket error: %s" % (le,)
print >>stderr, "got socket error: %s" % (le,)
return -1
if sent == len(data):
@ -66,10 +67,10 @@ def put(nodeurl, root_uri, local_fname, vdrive_fname, verbosity):
word = mo.group(2)
if code in (200, 201,):
print "%s %s" % (code, word,)
print >>stdout, "%s %s" % (code, word,)
return 0
print respstr[headerend:]
print >>stderr, respstr[headerend:]
return 1
def main():

View File

@ -4,7 +4,7 @@ import re, socket, urllib
NODEURL_RE=re.compile("http://([^:]*)(:([1-9][0-9]*))?")
def rm(nodeurl, root_uri, vdrive_pathname, verbosity):
def rm(nodeurl, root_uri, vdrive_pathname, verbosity, stdout, stderr):
"""
@param verbosity: 0, 1, or 2, meaning quiet, verbose, or very verbose
@ -51,10 +51,10 @@ def rm(nodeurl, root_uri, vdrive_pathname, verbosity):
word = mo.group(2)
if code == 200:
print "%s %s" % (code, word,)
print >>stdout, "%s %s" % (code, word,)
return 0
print respstr[headerend:]
print >>stderr, respstr[headerend:]
return 1
def main():

View File

@ -4,6 +4,7 @@ import os, sys
from cStringIO import StringIO
from twisted.trial import unittest
from twisted.internet import defer, reactor
from twisted.internet import threads # CLI tests use deferToThread
from twisted.application import service
from allmydata import client, uri, download, upload
from allmydata.introducer_and_vdrive import IntroducerAndVdrive
@ -289,6 +290,7 @@ class SystemTest(testutil.SignalMixin, unittest.TestCase):
d.addCallback(self._test_web)
d.addCallback(self._test_web_start)
d.addCallback(self._test_control)
d.addCallback(self._test_cli)
return d
test_vdrive.timeout = 1100
@ -690,3 +692,77 @@ class SystemTest(testutil.SignalMixin, unittest.TestCase):
d.addCallback(lambda res: rref.callRemote("measure_peer_response_time"))
return d
def _test_cli(self, res):
# run various CLI commands (in a thread, since they use blocking
# network calls)
private_uri = self.clients[0].getServiceNamed("vdrive")._private_uri
nodeargs = [
"--node-url", self.webish_url,
"--root-uri", private_uri,
]
argv = ["ls"] + nodeargs
d = self._run_cli(argv)
def _check_ls((out,err)):
self.failUnless("personal" in out)
self.failUnless("s2-ro" in out)
self.failUnless("s2-rw" in out)
self.failUnlessEqual(err, "")
d.addCallback(_check_ls)
def _put(res):
tdir = self.getdir("cli_put")
fileutil.make_dirs(tdir)
fn = os.path.join(tdir, "upload_me")
f = open(fn, "w")
f.write("I will not write the same thing over and over.\n" * 100)
f.close()
argv = ["put"] + nodeargs + [fn, "test_put/upload.txt"]
return self._run_cli(argv)
d.addCallback(_put)
def _check_put((out,err)):
self.failUnless("200 OK" in out)
self.failUnlessEqual(err, "")
vdrive0 = self.clients[0].getServiceNamed("vdrive")
d = vdrive0.get_node_at_path("~/test_put/upload.txt")
d.addCallback(lambda filenode: filenode.download_to_data())
def _check_put2(res):
self.failUnless("I will not write" in res)
d.addCallback(_check_put2)
return d
d.addCallback(_check_put)
def _get(res):
argv = ["get"] + nodeargs + ["test_put/upload.txt"]
return self._run_cli(argv)
d.addCallback(_get)
def _check_get((out,err)):
self.failUnless("I will not write" in out)
self.failUnlessEqual(err, "")
d.addCallback(_check_get)
def _rm(res):
argv = ["rm"] + nodeargs + ["test_put/upload.txt"]
return self._run_cli(argv)
d.addCallback(_rm)
def _check_rm((out,err)):
self.failUnless("200 OK" in out)
self.failUnlessEqual(err, "")
vdrive0 = self.clients[0].getServiceNamed("vdrive")
d = defer.maybeDeferred(vdrive0.get_node_at_path,
"~/test_put/upload.txt")
d.addBoth(self.shouldFail, KeyError, "test_cli._check_rm",
"unable to find child named 'upload.txt'")
return d
d.addCallback(_check_rm)
return d
def _run_cli(self, argv):
stdout, stderr = StringIO(), StringIO()
d = threads.deferToThread(runner.runner, argv, run_by_human=False,
stdout=stdout, stderr=stderr)
def _done(res):
return stdout.getvalue(), stderr.getvalue()
d.addCallback(_done)
return d