From 88457fbc327c180b53f5ac813d51cc5cf82c8821 Mon Sep 17 00:00:00 2001
From: Brian Warner <warner@lothar.com>
Date: Mon, 19 May 2008 23:28:52 -0700
Subject: [PATCH] test_web/test_system: improve test coverage

---
 src/allmydata/test/test_system.py |  1 +
 src/allmydata/test/test_web.py    | 67 +++++++++++++++++++++++++++++++
 2 files changed, 68 insertions(+)

diff --git a/src/allmydata/test/test_system.py b/src/allmydata/test/test_system.py
index 0d7d5873..50662db3 100644
--- a/src/allmydata/test/test_system.py
+++ b/src/allmydata/test/test_system.py
@@ -137,6 +137,7 @@ class SystemTest(testutil.SignalMixin, testutil.PollMixin, testutil.StallMixin,
                 # client[0] runs a webserver and a helper, no key_generator
                 open(os.path.join(basedir, "webport"), "w").write("tcp:0:interface=127.0.0.1")
                 open(os.path.join(basedir, "run_helper"), "w").write("yes\n")
+                open(os.path.join(basedir, "sizelimit"), "w").write("10GB\n")
             if i == 3:
                 # client[3] runs a webserver and uses a helper, uses key_generator
                 open(os.path.join(basedir, "webport"), "w").write("tcp:0:interface=127.0.0.1")
diff --git a/src/allmydata/test/test_web.py b/src/allmydata/test/test_web.py
index a76f7151..b97fdf29 100644
--- a/src/allmydata/test/test_web.py
+++ b/src/allmydata/test/test_web.py
@@ -473,6 +473,29 @@ class Web(WebMixin, unittest.TestCase):
         d.addCallback(self.failUnlessIsBarDotTxt)
         return d
 
+    def test_PUT_FILEURL_named_bad(self):
+        base = "/file/%s" % urllib.quote(self._bar_txt_uri)
+        d = self.shouldFail2(error.Error, "test_PUT_FILEURL_named_bad",
+                             "400 Bad Request",
+                             "/file can only be used with GET or HEAD",
+                             self.PUT, base + "/@@name=/blah.txt", "")
+        return d
+
+    def test_GET_DIRURL_named_bad(self):
+        base = "/file/%s" % urllib.quote(self._foo_uri)
+        d = self.shouldFail2(error.Error, "test_PUT_DIRURL_named_bad",
+                             "400 Bad Request",
+                             "is not a file-cap",
+                             self.GET, base + "/@@name=/blah.txt")
+        return d
+
+    def test_GET_slash_file_bad(self):
+        d = self.shouldFail2(error.Error, "test_GET_slash_file_bad",
+                             "404 Not Found",
+                             "/file must be followed by a file-cap and a name",
+                             self.GET, "/file")
+        return d
+
     def test_GET_unhandled_URI_named(self):
         contents, n, newuri = self.makefile(12)
         verifier_cap = n.get_verifier().to_string()
@@ -484,6 +507,17 @@ class Web(WebMixin, unittest.TestCase):
                              self.GET, base)
         return d
 
+    def test_GET_unhandled_URI(self):
+        contents, n, newuri = self.makefile(12)
+        verifier_cap = n.get_verifier().to_string()
+        base = "/uri/%s" % urllib.quote(verifier_cap)
+        # client.create_node_from_uri() can't handle verify-caps
+        d = self.shouldFail2(error.Error, "test_GET_unhandled_URI",
+                             "400 Bad Request",
+                             "is not a valid file- or directory- cap",
+                             self.GET, base)
+        return d
+
     def test_GET_FILEURL_save(self):
         d = self.GET(self.public_url + "/foo/bar.txt?filename=bar.txt&save=true")
         # TODO: look at the headers, expect a Content-Disposition: attachment
@@ -899,6 +933,33 @@ class Web(WebMixin, unittest.TestCase):
         d.addBoth(self.shouldRedirect, "/")
         return d
 
+    def shouldRedirect2(self, which, checker, callable, *args, **kwargs):
+        d = defer.maybeDeferred(callable, *args, **kwargs)
+        def done(res):
+            if isinstance(res, failure.Failure):
+                res.trap(error.PageRedirect)
+                statuscode = res.value.status
+                target = res.value.location
+                return checker(statuscode, target)
+            self.fail("%s: callable was supposed to redirect, not return '%s'"
+                      % (which, res))
+        d.addBoth(done)
+        return d
+
+    def test_POST_upload_no_link_whendone_results(self):
+        def check(statuscode, target):
+            self.failUnlessEqual(statuscode, str(http.FOUND))
+            self.failUnless(target.startswith(self.webish_url), target)
+            return client.getPage(target, method="GET")
+        d = self.shouldRedirect2("test_POST_upload_no_link_whendone_results",
+                                 check,
+                                 self.POST, "/uri", t="upload",
+                                 when_done="/uri/%(uri)s",
+                                 file=("new.txt", self.NEWFILE_CONTENTS))
+        d.addCallback(lambda res:
+                      self.failUnlessEqual(res, self.NEWFILE_CONTENTS))
+        return d
+
     def test_POST_upload_no_link_mutable(self):
         d = self.POST("/uri", t="upload", mutable="true",
                       file=("new.txt", self.NEWFILE_CONTENTS))
@@ -1463,6 +1524,12 @@ class Web(WebMixin, unittest.TestCase):
 
         return d
 
+    def test_GET_URI_form_bad(self):
+        d = self.shouldFail2(error.Error, "test_GET_URI_form_bad",
+                             "400 Bad Request", "GET /uri requires uri=",
+                             self.GET, "/uri")
+        return d
+
     def test_GET_rename_form(self):
         d = self.GET(self.public_url + "/foo?t=rename-form&name=bar.txt",
                      followRedirect=True) # XXX [ ] todo: figure out why '.../foo' doesn't work
-- 
2.45.2