#542 'tahoe create-key-generator': fix the .tac file this creates to be compatible...
authorBrian Warner <warner@allmydata.com>
Tue, 2 Dec 2008 00:47:21 +0000 (17:47 -0700)
committerBrian Warner <warner@allmydata.com>
Tue, 2 Dec 2008 00:47:21 +0000 (17:47 -0700)
src/allmydata/scripts/keygen.py
src/allmydata/test/test_runner.py

index ddc98b82a6d3e6792e7fdb75b9f840a3b3e53342..787ed271a8a8914b7ba0da5918134aa7370f68dd 100644 (file)
@@ -14,7 +14,7 @@ keygen_tac = """
 from allmydata import key_generator
 from twisted.application import service
 
-k = key_generator.KeyGeneratorService(2048)
+k = key_generator.KeyGeneratorService(default_key_size=2048)
 #k.key_generator.verbose = False
 #k.key_generator.pool_size = 16
 #k.key_generator.pool_refresh_delay = 6
@@ -40,6 +40,7 @@ def create_key_generator(config, out=sys.stdout, err=sys.stderr):
     f = open(os.path.join(basedir, "tahoe-key-generator.tac"), "wb")
     f.write(keygen_tac)
     f.close()
+    return 0
 
 subCommands = [
     ["create-key-generator", None, CreateKeyGeneratorOptions, "Create a key generator service."],
index 426163c0c2fc7001df57f18ccde9abf20e2af4d8..6d694c59b7c34680b6d79ec824df496a8a50a84b 100644 (file)
@@ -312,4 +312,81 @@ class RunNode(unittest.TestCase, pollmixin.PollMixin):
         self.failUnless("does not look like a directory at all"
                         in err.getvalue(), err.getvalue())
 
+    def test_keygen(self):
+        if runtime.platformType == "win32":
+            # twistd on windows doesn't daemonize. cygwin works normally.
+            raise unittest.SkipTest("twistd does not fork under windows")
+        basedir = self.workdir("test_keygen")
+        c1 = os.path.join(basedir, "c1")
+        argv = ["--quiet", "create-key-generator", "--basedir", c1]
+        out,err = StringIO(), StringIO()
+        rc = runner.runner(argv, stdout=out, stderr=err)
+        self.failUnlessEqual(rc, 0)
+
+        TWISTD_PID_FILE = os.path.join(c1, "twistd.pid")
+
+        d = defer.succeed(None)
+        def _start(res):
+            argv = ["--quiet", "start", c1]
+            out,err = StringIO(), StringIO()
+            rc = runner.runner(argv, stdout=out, stderr=err)
+            outs = out.getvalue() ; errs = err.getvalue()
+            errstr = "rc=%d, OUT: '%s', ERR: '%s'" % (rc, outs, errs)
+            self.failUnlessEqual(rc, 0, errstr)
+            self.failUnlessEqual(outs, "", errstr)
+            self.failUnlessEqual(errs, "", errstr)
+
+            # the parent (twistd) has exited. However, twistd writes the pid
+            # from the child, not the parent, so we can't expect twistd.pid
+            # to exist quite yet.
+
+            # the node is running, but it might not have made it past the
+            # first reactor turn yet, and if we kill it too early, it won't
+            # remove the twistd.pid file. So wait until it does something
+            # that we know it won't do until after the first turn.
 
+        d.addCallback(_start)
+
+        KEYGEN_FURL_FILE = os.path.join(c1, "key_generator.furl")
+        def _node_has_started():
+            return os.path.exists(KEYGEN_FURL_FILE)
+        d.addCallback(lambda res: self.poll(_node_has_started))
+
+        def _started(res):
+            self.failUnless(os.path.exists(TWISTD_PID_FILE))
+            # rm this so we can detect when the second incarnation is ready
+            os.unlink(KEYGEN_FURL_FILE)
+            argv = ["--quiet", "restart", c1]
+            out,err = StringIO(), StringIO()
+            rc = runner.runner(argv, stdout=out, stderr=err)
+            outs = out.getvalue() ; errs = err.getvalue()
+            errstr = "rc=%d, OUT: '%s', ERR: '%s'" % (rc, outs, errs)
+            self.failUnlessEqual(rc, 0, errstr)
+            self.failUnlessEqual(outs, "", errstr)
+            self.failUnlessEqual(errs, "", errstr)
+        d.addCallback(_started)
+
+        # again, the second incarnation of the node might not be ready yet,
+        # so poll until it is
+        d.addCallback(lambda res: self.poll(_node_has_started))
+
+        # now we can kill it. TODO: On a slow machine, the node might kill
+        # itself before we get a chance too, especially if spawning the
+        # 'tahoe stop' command takes a while.
+        def _stop(res):
+            self.failUnless(os.path.exists(TWISTD_PID_FILE))
+            argv = ["--quiet", "stop", c1]
+            out,err = StringIO(), StringIO()
+            rc = runner.runner(argv, stdout=out, stderr=err)
+            # the parent has exited by now
+            outs = out.getvalue() ; errs = err.getvalue()
+            errstr = "rc=%d, OUT: '%s', ERR: '%s'" % (rc, outs, errs)
+            self.failUnlessEqual(rc, 0, errstr)
+            self.failUnlessEqual(outs, "", errstr)
+            self.failUnlessEqual(errs, "", errstr)
+            # the parent was supposed to poll and wait until it sees
+            # twistd.pid go away before it exits, so twistd.pid should be
+            # gone by now.
+            self.failIf(os.path.exists(TWISTD_PID_FILE))
+        d.addCallback(_stop)
+        return d