From c102056ac1df178414acc8ae909fdcdc3c2dea98 Mon Sep 17 00:00:00 2001
From: david-sarah <david-sarah@jacaranda.org>
Date: Tue, 9 Aug 2011 20:05:38 -0700
Subject: [PATCH] test_client.py: add a test that the drop-uploader is
 initialized correctly by client.py. Also give the DropUploader service a
 name, which is necessary for the test. refs #1429

---
 src/allmydata/frontends/drop_upload.py |  2 +
 src/allmydata/test/test_client.py      | 62 ++++++++++++++++++++++++++
 2 files changed, 64 insertions(+)

diff --git a/src/allmydata/frontends/drop_upload.py b/src/allmydata/frontends/drop_upload.py
index b8d2a940..6f25625e 100644
--- a/src/allmydata/frontends/drop_upload.py
+++ b/src/allmydata/frontends/drop_upload.py
@@ -13,6 +13,8 @@ from allmydata.immutable.upload import FileName
 
 
 class DropUploader(service.MultiService):
+    name = 'drop-upload'
+
     def __init__(self, client, upload_dircap, local_dir_utf8, inotify=None):
         service.MultiService.__init__(self)
 
diff --git a/src/allmydata/test/test_client.py b/src/allmydata/test/test_client.py
index 9d7eb96c..3e5fdd95 100644
--- a/src/allmydata/test/test_client.py
+++ b/src/allmydata/test/test_client.py
@@ -170,6 +170,68 @@ class Basic(testutil.ReallyEqualMixin, unittest.TestCase):
         self.failUnless("node.uptime" in stats)
         self.failUnless(isinstance(stats["node.uptime"], float))
 
+    @mock.patch('allmydata.util.log.msg')
+    @mock.patch('allmydata.frontends.drop_upload.DropUploader')
+    def test_create_drop_uploader(self, mock_drop_uploader, mock_log_msg):
+        class MockDropUploader(service.MultiService):
+            name = 'drop-upload'
+
+            def __init__(self, client, upload_dircap, local_dir_utf8, inotify=None):
+                service.MultiService.__init__(self)
+                self.client = client
+                self.upload_dircap = upload_dircap
+                self.local_dir_utf8 = local_dir_utf8
+                self.inotify = inotify
+
+        mock_drop_uploader.side_effect = MockDropUploader
+
+        upload_dircap = "URI:DIR2:blah"
+        local_dir_utf8 = u"loc\u0101l_dir".encode('utf-8')
+        config = (BASECONFIG +
+                  "[storage]\n" +
+                  "enabled = false\n" +
+                  "[drop_upload]\n" +
+                  "enabled = true\n" +
+                  "upload.dircap = " + upload_dircap + "\n" +
+                  "local.directory = " + local_dir_utf8 + "\n")
+
+        basedir1 = "test_client.Basic.test_create_drop_uploader1"
+        os.mkdir(basedir1)
+        fileutil.write(os.path.join(basedir1, "tahoe.cfg"), config)
+        c1 = client.Client(basedir1)
+        uploader = c1.getServiceNamed('drop-upload')
+        self.failUnless(isinstance(uploader, MockDropUploader), uploader)
+        self.failUnlessReallyEqual(uploader.client, c1)
+        self.failUnlessReallyEqual(uploader.upload_dircap, upload_dircap)
+        self.failUnlessReallyEqual(uploader.local_dir_utf8, local_dir_utf8)
+        self.failUnless(uploader.inotify is None, uploader.inotify)
+        self.failUnless(uploader.running)
+
+        class Boom(Exception):
+            pass
+        mock_drop_uploader.side_effect = Boom("something wrong")
+
+        basedir2 = "test_client.Basic.test_create_drop_uploader2"
+        os.mkdir(basedir2)
+        fileutil.write(os.path.join(basedir2, "tahoe.cfg"),
+                       BASECONFIG +
+                       "[drop_upload]\n" +
+                       "enabled = true\n")
+        c2 = client.Client(basedir2)
+        self.failUnlessRaises(KeyError, c2.getServiceNamed, 'drop-upload')
+        self.failIf([True for arg in mock_log_msg.call_args_list if "Boom" in repr(arg) or "something wrong" in repr(arg)],
+                    mock_log_msg.call_args_list)
+        self.failUnless([True for arg in mock_log_msg.call_args_list if "upload.dircap or local.directory not specified" in repr(arg)],
+                        mock_log_msg.call_args_list)
+
+        basedir3 = "test_client.Basic.test_create_drop_uploader3"
+        os.mkdir(basedir3)
+        fileutil.write(os.path.join(basedir3, "tahoe.cfg"), config)
+        c3 = client.Client(basedir3)
+        self.failUnless([True for arg in mock_log_msg.call_args_list if "Boom" in repr(arg) and "something wrong" in repr(arg)],
+                        mock_log_msg.call_args_list)
+
+
 def flush_but_dont_ignore(res):
     d = flushEventualQueue()
     def _done(ignored):
-- 
2.45.2