2007-04-20 01:56:45 +00:00
from twisted . trial import unittest
2007-06-26 22:36:46 +00:00
from cStringIO import StringIO
2009-01-22 22:52:13 +00:00
from twisted . python import runtime
from twisted . internet import utils
2008-02-15 20:11:02 +00:00
import os . path , re
2007-12-03 22:42:35 +00:00
from allmydata . scripts import runner
2008-10-29 04:15:48 +00:00
from allmydata . util import fileutil , pollmixin
2007-04-20 01:56:45 +00:00
2009-01-22 22:38:18 +00:00
from allmydata . test import common_util
2009-01-22 22:52:40 +00:00
import allmydata
2009-01-24 01:34:37 +00:00
bintahoe = os . path . join ( os . path . dirname ( os . path . dirname ( os . path . dirname ( allmydata . __file__ ) ) ) , ' bin ' , ' tahoe ' )
2009-01-22 22:52:40 +00:00
class TheRightCode ( unittest . TestCase , common_util . SignalMixin ) :
def test_path ( self ) :
2009-01-24 01:34:37 +00:00
if not os . path . exists ( bintahoe ) :
raise unittest . SkipTest ( " The bin/tahoe script isn ' t to be found in the expected location, and I don ' t want to test a ' tahoe ' executable that I find somewhere else, in case it isn ' t the right executable for this version of tahoe. " )
d = utils . getProcessOutputAndValue ( bintahoe , args = [ " --version-and-path " ] , env = os . environ )
2009-01-22 22:52:40 +00:00
def _cb ( res ) :
out , err , rc_or_sig = res
self . failUnlessEqual ( rc_or_sig , 0 )
# Fail unless the allmydata-tahoe package is *this* version *and* was loaded from *this* source directory.
required_ver_and_path = " allmydata-tahoe: %s ( %s ) " % ( allmydata . __version__ , os . path . dirname ( os . path . dirname ( allmydata . __file__ ) ) )
self . failUnless ( out . startswith ( required_ver_and_path ) , ( out , err , rc_or_sig ) )
d . addCallback ( _cb )
return d
2009-01-22 22:38:18 +00:00
class CreateNode ( unittest . TestCase , common_util . SignalMixin ) :
2007-04-20 01:56:45 +00:00
def workdir ( self , name ) :
2007-09-17 09:25:31 +00:00
basedir = os . path . join ( " test_runner " , " CreateNode " , name )
2007-04-20 01:56:45 +00:00
fileutil . make_dirs ( basedir )
return basedir
def test_client ( self ) :
2009-01-24 01:34:37 +00:00
if not os . path . exists ( bintahoe ) :
raise unittest . SkipTest ( " The bin/tahoe script isn ' t to be found in the expected location, and I don ' t want to test a ' tahoe ' executable that I find somewhere else, in case it isn ' t the right executable for this version of tahoe. " )
2007-04-20 01:56:45 +00:00
basedir = self . workdir ( " test_client " )
c1 = os . path . join ( basedir , " c1 " )
2009-01-24 01:34:37 +00:00
d = utils . getProcessOutputAndValue ( bintahoe , args = [ " --quiet " , " create-client " , " --basedir " , c1 ] , env = os . environ )
2009-01-22 22:38:18 +00:00
def _cb ( res ) :
out , err , rc_or_sig = res
self . failUnlessEqual ( err , " " )
self . failUnlessEqual ( out , " " )
self . failUnlessEqual ( rc_or_sig , 0 )
self . failUnless ( os . path . exists ( c1 ) )
self . failUnless ( os . path . exists ( os . path . join ( c1 , " tahoe-client.tac " ) ) )
d . addCallback ( _cb )
def _then_try_again ( unused = None ) :
2009-01-24 01:34:37 +00:00
return utils . getProcessOutputAndValue ( bintahoe , args = [ " --quiet " , " create-client " , " --basedir " , c1 ] , env = os . environ )
2009-01-22 22:38:18 +00:00
d . addCallback ( _then_try_again )
def _cb2 ( res ) :
out , err , rc_or_sig = res
# creating the client a second time should throw an exception
self . failIfEqual ( rc_or_sig , 0 , str ( ( out , err , rc_or_sig ) ) )
self . failUnlessEqual ( out , " " )
self . failUnless ( " is not empty. " in err )
# Fail if there is a line that doesn't end with a PUNCTUATION MARK.
self . failIf ( re . search ( " [^ \ .!?] \n " , err ) , err )
d . addCallback ( _cb2 )
2007-06-26 23:19:18 +00:00
2007-04-24 04:28:19 +00:00
c2 = os . path . join ( basedir , " c2 " )
2009-01-22 22:38:18 +00:00
def _then_try_new_dir ( unused = None ) :
2009-01-24 01:34:37 +00:00
return utils . getProcessOutputAndValue ( bintahoe , args = [ " --quiet " , " create-client " , c2 ] , env = os . environ )
2009-01-22 22:38:18 +00:00
d . addCallback ( _then_try_new_dir )
def _cb3 ( res ) :
out , err , rc_or_sig = res
self . failUnless ( os . path . exists ( c2 ) )
self . failUnless ( os . path . exists ( os . path . join ( c2 , " tahoe-client.tac " ) ) )
d . addCallback ( _cb3 )
def _then_try_badarg ( unused = None ) :
2009-01-24 01:34:37 +00:00
return utils . getProcessOutputAndValue ( bintahoe , args = [ " create-client " , " basedir " , " extraarg " ] , env = os . environ )
2009-01-22 22:38:18 +00:00
d . addCallback ( _then_try_badarg )
def _cb4 ( res ) :
out , err , rc_or_sig = res
self . failUnlessEqual ( rc_or_sig , 1 )
self . failUnless ( out . startswith ( " Usage " ) , out )
d . addCallback ( _cb4 )
return d
2007-04-24 04:28:19 +00:00
2007-04-20 01:56:45 +00:00
def test_introducer ( self ) :
2009-01-24 01:34:37 +00:00
if not os . path . exists ( bintahoe ) :
raise unittest . SkipTest ( " The bin/tahoe script isn ' t to be found in the expected location, and I don ' t want to test a ' tahoe ' executable that I find somewhere else, in case it isn ' t the right executable for this version of tahoe. " )
2007-04-20 01:56:45 +00:00
basedir = self . workdir ( " test_introducer " )
c1 = os . path . join ( basedir , " c1 " )
2009-01-24 01:34:37 +00:00
d = utils . getProcessOutputAndValue ( bintahoe , args = [ " --quiet " , " create-introducer " , " --basedir " , c1 ] , env = os . environ )
2009-01-22 22:38:18 +00:00
def _cb ( res ) :
out , err , rc_or_sig = res
self . failUnlessEqual ( err , " " )
self . failUnlessEqual ( out , " " )
self . failUnlessEqual ( rc_or_sig , 0 )
self . failUnless ( os . path . exists ( c1 ) )
self . failUnless ( os . path . exists ( os . path . join ( c1 ,
" tahoe-introducer.tac " ) ) )
d . addCallback ( _cb )
def _then_try_again ( unused = None ) :
2009-01-24 01:34:37 +00:00
return utils . getProcessOutputAndValue ( bintahoe , args = [ " --quiet " , " create-introducer " , " --basedir " , c1 ] , env = os . environ )
2009-01-22 22:38:18 +00:00
d . addCallback ( _then_try_again )
def _cb2 ( res ) :
out , err , rc_or_sig = res
# creating the introducer a second time should throw an exception
self . failIfEqual ( rc_or_sig , 0 )
self . failUnlessEqual ( out , " " )
self . failUnless ( " is not empty " in err )
# Fail if there is a line that doesn't end with a PUNCTUATION MARK.
self . failIf ( re . search ( " [^ \ .!?] \n " , err ) , err )
d . addCallback ( _cb2 )
2007-06-26 23:19:18 +00:00
2007-04-24 04:28:19 +00:00
c2 = os . path . join ( basedir , " c2 " )
2009-01-22 22:38:18 +00:00
def _then_try_new_dir ( unused = None ) :
2009-01-24 01:34:37 +00:00
return utils . getProcessOutputAndValue ( bintahoe , args = [ " --quiet " , " create-introducer " , c2 ] , env = os . environ )
2009-01-22 22:38:18 +00:00
d . addCallback ( _then_try_new_dir )
def _cb3 ( res ) :
out , err , rc_or_sig = res
self . failUnless ( os . path . exists ( c2 ) )
self . failUnless ( os . path . exists ( os . path . join ( c2 ,
" tahoe-introducer.tac " ) ) )
d . addCallback ( _cb3 )
def _then_try_badarg ( unused = None ) :
2009-01-24 01:34:37 +00:00
return utils . getProcessOutputAndValue ( bintahoe , args = [ " create-introducer " , " basedir " , " extraarg " ] , env = os . environ )
2009-01-22 22:38:18 +00:00
d . addCallback ( _then_try_badarg )
def _cb4 ( res ) :
out , err , rc_or_sig = res
self . failUnlessEqual ( rc_or_sig , 1 )
self . failUnless ( out . startswith ( " Usage " ) , out )
d . addCallback ( _cb4 )
def _then_try_badarg_again ( unused = None ) :
2009-01-24 01:34:37 +00:00
return utils . getProcessOutputAndValue ( bintahoe , args = [ " create-introducer " ] , env = os . environ )
2009-01-22 22:38:18 +00:00
d . addCallback ( _then_try_badarg_again )
def _cb5 ( res ) :
out , err , rc_or_sig = res
self . failUnlessEqual ( rc_or_sig , 1 )
self . failUnless ( out . startswith ( " Usage " ) , out )
d . addCallback ( _cb5 )
return d
class RunNode ( unittest . TestCase , pollmixin . PollMixin , common_util . SignalMixin ) :
2007-09-17 09:25:31 +00:00
def workdir ( self , name ) :
basedir = os . path . join ( " test_runner " , " RunNode " , name )
fileutil . make_dirs ( basedir )
return basedir
2008-02-18 07:28:56 +00:00
def test_introducer ( self ) :
2009-01-24 01:34:37 +00:00
if not os . path . exists ( bintahoe ) :
raise unittest . SkipTest ( " The bin/tahoe script isn ' t to be found in the expected location, and I don ' t want to test a ' tahoe ' executable that I find somewhere else, in case it isn ' t the right executable for this version of tahoe. " )
2008-02-18 07:28:56 +00:00
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_introducer " )
c1 = os . path . join ( basedir , " c1 " )
HOTLINE_FILE = os . path . join ( c1 , " suicide_prevention_hotline " )
TWISTD_PID_FILE = os . path . join ( c1 , " twistd.pid " )
2009-01-22 22:38:18 +00:00
INTRODUCER_FURL_FILE = os . path . join ( c1 , " introducer.furl " )
2009-01-24 01:34:37 +00:00
d = utils . getProcessOutputAndValue ( bintahoe , args = [ " --quiet " , " create-introducer " , " --basedir " , c1 ] , env = os . environ )
2009-01-22 22:38:18 +00:00
def _cb ( res ) :
out , err , rc_or_sig = res
self . failUnlessEqual ( rc_or_sig , 0 )
# by writing this file, we get ten seconds before the node will
# exit. This insures that even if the test fails (and the 'stop'
# command doesn't work), the client should still terminate.
open ( HOTLINE_FILE , " w " ) . write ( " " )
# now it's safe to start the node
d . addCallback ( _cb )
def _then_start_the_node ( res ) :
2009-01-24 01:34:37 +00:00
return utils . getProcessOutputAndValue ( bintahoe , args = [ " --quiet " , " start " , c1 ] , env = os . environ )
2009-01-22 22:38:18 +00:00
d . addCallback ( _then_start_the_node )
def _cb2 ( res ) :
out , err , rc_or_sig = res
2008-02-18 07:28:56 +00:00
open ( HOTLINE_FILE , " w " ) . write ( " " )
2009-01-22 22:38:18 +00:00
errstr = " rc= %d , OUT: ' %s ' , ERR: ' %s ' " % ( rc_or_sig , out , err )
self . failUnlessEqual ( rc_or_sig , 0 , errstr )
self . failUnlessEqual ( out , " " , errstr )
self . failUnlessEqual ( err , " " , errstr )
2008-02-18 07:28:56 +00:00
# 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.
2009-01-22 22:38:18 +00:00
d . addCallback ( _cb2 )
2008-02-18 07:28:56 +00:00
def _node_has_started ( ) :
return os . path . exists ( INTRODUCER_FURL_FILE )
d . addCallback ( lambda res : self . poll ( _node_has_started ) )
def _started ( res ) :
open ( HOTLINE_FILE , " w " ) . write ( " " )
self . failUnless ( os . path . exists ( TWISTD_PID_FILE ) )
# rm this so we can detect when the second incarnation is ready
os . unlink ( INTRODUCER_FURL_FILE )
2009-01-24 01:34:37 +00:00
return utils . getProcessOutputAndValue ( bintahoe , args = [ " --quiet " , " restart " , c1 ] , env = os . environ )
2008-02-18 07:28:56 +00:00
d . addCallback ( _started )
2009-01-22 22:38:18 +00:00
def _then ( res ) :
out , err , rc_or_sig = res
open ( HOTLINE_FILE , " w " ) . write ( " " )
errstr = " rc= %d , OUT: ' %s ' , ERR: ' %s ' " % ( rc_or_sig , out , err )
self . failUnlessEqual ( rc_or_sig , 0 , errstr )
self . failUnlessEqual ( out , " " , errstr )
self . failUnlessEqual ( err , " " , errstr )
d . addCallback ( _then )
2008-02-18 07:28:56 +00:00
# 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 ) :
open ( HOTLINE_FILE , " w " ) . write ( " " )
self . failUnless ( os . path . exists ( TWISTD_PID_FILE ) )
2009-01-22 22:38:18 +00:00
2009-01-24 01:34:37 +00:00
return utils . getProcessOutputAndValue ( bintahoe , args = [ " --quiet " , " stop " , c1 ] , env = os . environ )
2009-01-22 22:38:18 +00:00
d . addCallback ( _stop )
def _after_stopping ( res ) :
out , err , rc_or_sig = res
2008-02-18 07:28:56 +00:00
open ( HOTLINE_FILE , " w " ) . write ( " " )
# the parent has exited by now
2009-01-22 22:38:18 +00:00
errstr = " rc= %d , OUT: ' %s ' , ERR: ' %s ' " % ( rc_or_sig , out , err )
self . failUnlessEqual ( rc_or_sig , 0 , errstr )
self . failUnlessEqual ( out , " " , errstr )
self . failUnlessEqual ( err , " " , errstr )
2008-02-18 07:28:56 +00:00
# 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 ) )
2009-01-22 22:38:18 +00:00
d . addCallback ( _after_stopping )
2008-02-18 07:28:56 +00:00
def _remove_hotline ( res ) :
os . unlink ( HOTLINE_FILE )
return res
d . addBoth ( _remove_hotline )
return d
2007-09-17 09:25:31 +00:00
def test_client ( self ) :
2009-01-24 01:34:37 +00:00
if not os . path . exists ( bintahoe ) :
raise unittest . SkipTest ( " The bin/tahoe script isn ' t to be found in the expected location, and I don ' t want to test a ' tahoe ' executable that I find somewhere else, in case it isn ' t the right executable for this version of tahoe. " )
2007-09-18 22:17:26 +00:00
if runtime . platformType == " win32 " :
# twistd on windows doesn't daemonize. cygwin works normally.
2007-09-17 09:25:31 +00:00
raise unittest . SkipTest ( " twistd does not fork under windows " )
basedir = self . workdir ( " test_client " )
c1 = os . path . join ( basedir , " c1 " )
2007-09-18 22:17:26 +00:00
HOTLINE_FILE = os . path . join ( c1 , " suicide_prevention_hotline " )
TWISTD_PID_FILE = os . path . join ( c1 , " twistd.pid " )
2009-01-22 22:38:18 +00:00
PORTNUMFILE = os . path . join ( c1 , " client.port " )
2009-01-24 01:34:37 +00:00
d = utils . getProcessOutputAndValue ( bintahoe , args = [ " --quiet " , " create-client " , " --basedir " , c1 , " --webport " , " 0 " ] , env = os . environ )
2009-01-22 22:38:18 +00:00
def _cb ( res ) :
out , err , rc_or_sig = res
self . failUnlessEqual ( rc_or_sig , 0 )
# By writing this file, we get forty seconds before the client will exit. This insures
# that even if the 'stop' command doesn't work (and the test fails), the client should
# still terminate.
open ( HOTLINE_FILE , " w " ) . write ( " " )
open ( os . path . join ( c1 , " introducer.furl " ) , " w " ) . write ( " pb://xrndsskn2zuuian5ltnxrte7lnuqdrkz@127.0.0.1:55617/introducer \n " )
# now it's safe to start the node
d . addCallback ( _cb )
2007-09-18 22:17:26 +00:00
2007-09-19 20:56:00 +00:00
def _start ( res ) :
2009-01-24 01:34:37 +00:00
return utils . getProcessOutputAndValue ( bintahoe , args = [ " --quiet " , " start " , c1 ] , env = os . environ )
2009-01-22 22:38:18 +00:00
d . addCallback ( _start )
def _cb2 ( res ) :
out , err , rc_or_sig = res
2007-09-19 20:56:00 +00:00
open ( HOTLINE_FILE , " w " ) . write ( " " )
2009-01-22 22:38:18 +00:00
errstr = " cc= %d , OUT: ' %s ' , ERR: ' %s ' " % ( rc_or_sig , out , err )
self . failUnlessEqual ( rc_or_sig , 0 , errstr )
self . failUnlessEqual ( out , " " , errstr )
self . failUnlessEqual ( err , " " , errstr )
2007-09-17 09:25:31 +00:00
2007-09-19 20:56:00 +00:00
# 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.
2007-09-18 22:17:26 +00:00
2007-09-19 20:56:00 +00:00
# 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.
2009-01-22 22:38:18 +00:00
d . addCallback ( _cb2 )
2007-09-19 20:56:00 +00:00
2007-09-18 22:17:26 +00:00
def _node_has_started ( ) :
return os . path . exists ( PORTNUMFILE )
2007-09-19 20:56:00 +00:00
d . addCallback ( lambda res : self . poll ( _node_has_started ) )
2007-09-18 22:17:26 +00:00
def _started ( res ) :
2007-09-19 20:56:00 +00:00
open ( HOTLINE_FILE , " w " ) . write ( " " )
2007-09-18 22:17:26 +00:00
self . failUnless ( os . path . exists ( TWISTD_PID_FILE ) )
# rm this so we can detect when the second incarnation is ready
os . unlink ( PORTNUMFILE )
2009-01-22 22:38:18 +00:00
2009-01-24 01:34:37 +00:00
return utils . getProcessOutputAndValue ( bintahoe , args = [ " --quiet " , " restart " , c1 ] , env = os . environ )
2007-09-18 22:17:26 +00:00
d . addCallback ( _started )
2009-01-22 22:38:18 +00:00
def _cb3 ( res ) :
out , err , rc_or_sig = res
open ( HOTLINE_FILE , " w " ) . write ( " " )
errstr = " rc= %d , OUT: ' %s ' , ERR: ' %s ' " % ( rc_or_sig , out , err )
self . failUnlessEqual ( rc_or_sig , 0 , errstr )
self . failUnlessEqual ( out , " " , errstr )
self . failUnlessEqual ( err , " " , errstr )
d . addCallback ( _cb3 )
2007-09-18 22:17:26 +00:00
# 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 ) )
2007-09-19 20:56:00 +00:00
# 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
2007-10-11 10:38:24 +00:00
# 'tahoe stop' command takes a while.
2007-09-18 22:17:26 +00:00
def _stop ( res ) :
2007-09-19 20:56:00 +00:00
open ( HOTLINE_FILE , " w " ) . write ( " " )
2008-12-21 22:07:52 +00:00
self . failUnless ( os . path . exists ( TWISTD_PID_FILE ) , ( TWISTD_PID_FILE , os . listdir ( os . path . dirname ( TWISTD_PID_FILE ) ) ) )
2009-01-24 01:34:37 +00:00
return utils . getProcessOutputAndValue ( bintahoe , args = [ " --quiet " , " stop " , c1 ] , env = os . environ )
2009-01-22 22:38:18 +00:00
d . addCallback ( _stop )
def _cb4 ( res ) :
out , err , rc_or_sig = res
2007-09-19 20:56:00 +00:00
open ( HOTLINE_FILE , " w " ) . write ( " " )
2007-09-18 22:17:26 +00:00
# the parent has exited by now
2009-01-22 22:38:18 +00:00
errstr = " rc= %d , OUT: ' %s ' , ERR: ' %s ' " % ( rc_or_sig , out , err )
self . failUnlessEqual ( rc_or_sig , 0 , errstr )
self . failUnlessEqual ( out , " " , errstr )
self . failUnlessEqual ( err , " " , errstr )
2007-09-18 22:17:26 +00:00
# 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 ) )
2009-01-22 22:38:18 +00:00
d . addCallback ( _cb4 )
2007-09-19 20:56:00 +00:00
def _remove_hotline ( res ) :
os . unlink ( HOTLINE_FILE )
return res
d . addBoth ( _remove_hotline )
2007-09-18 22:17:26 +00:00
return d
2007-09-17 09:25:31 +00:00
2007-09-19 08:50:27 +00:00
def test_baddir ( self ) :
2009-01-24 01:34:37 +00:00
if not os . path . exists ( bintahoe ) :
raise unittest . SkipTest ( " The bin/tahoe script isn ' t to be found in the expected location, and I don ' t want to test a ' tahoe ' executable that I find somewhere else, in case it isn ' t the right executable for this version of tahoe. " )
2007-09-19 08:50:27 +00:00
basedir = self . workdir ( " test_baddir " )
fileutil . make_dirs ( basedir )
2009-01-22 22:38:18 +00:00
2009-01-24 01:34:37 +00:00
d = utils . getProcessOutputAndValue ( bintahoe , args = [ " --quiet " , " start " , " --basedir " , basedir ] , env = os . environ )
2009-01-22 22:38:18 +00:00
def _cb ( res ) :
out , err , rc_or_sig = res
self . failUnlessEqual ( rc_or_sig , 1 )
self . failUnless ( " does not look like a node directory " in err )
d . addCallback ( _cb )
d . addCallback
2007-09-19 08:50:27 +00:00
argv = [ " --quiet " , " stop " , " --basedir " , basedir ]
out , err = StringIO ( ) , StringIO ( )
rc = runner . runner ( argv , stdout = out , stderr = err )
self . failUnlessEqual ( rc , 2 )
self . failUnless ( " does not look like a running node directory "
in err . getvalue ( ) )
not_a_dir = os . path . join ( basedir , " bogus " )
argv = [ " --quiet " , " start " , " --basedir " , not_a_dir ]
out , err = StringIO ( ) , StringIO ( )
rc = runner . runner ( argv , stdout = out , stderr = err )
self . failUnlessEqual ( rc , 1 )
2008-02-18 07:28:17 +00:00
self . failUnless ( " does not look like a directory at all "
in err . getvalue ( ) , err . getvalue ( ) )
2007-09-19 08:50:27 +00:00
2008-12-02 00:47:21 +00:00
def test_keygen ( self ) :
2009-01-24 01:34:37 +00:00
if not os . path . exists ( bintahoe ) :
raise unittest . SkipTest ( " The bin/tahoe script isn ' t to be found in the expected location, and I don ' t want to test a ' tahoe ' executable that I find somewhere else, in case it isn ' t the right executable for this version of tahoe. " )
2008-12-02 00:47:21 +00:00
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 " )
TWISTD_PID_FILE = os . path . join ( c1 , " twistd.pid " )
2009-01-22 22:38:18 +00:00
KEYGEN_FURL_FILE = os . path . join ( c1 , " key_generator.furl " )
2009-01-24 01:34:37 +00:00
d = utils . getProcessOutputAndValue ( bintahoe , args = [ " --quiet " , " create-key-generator " , " --basedir " , c1 ] , env = os . environ )
2009-01-22 22:38:18 +00:00
def _cb ( res ) :
out , err , rc_or_sig = res
self . failUnlessEqual ( rc_or_sig , 0 )
d . addCallback ( _cb )
2008-12-02 00:47:21 +00:00
def _start ( res ) :
2009-01-24 01:34:37 +00:00
return utils . getProcessOutputAndValue ( bintahoe , args = [ " --quiet " , " start " , c1 ] , env = os . environ )
2009-01-22 22:38:18 +00:00
d . addCallback ( _start )
def _cb2 ( res ) :
out , err , rc_or_sig = res
errstr = " rc= %d , OUT: ' %s ' , ERR: ' %s ' " % ( rc_or_sig , out , err )
self . failUnlessEqual ( rc_or_sig , 0 , errstr )
self . failUnlessEqual ( out , " " , errstr )
self . failUnlessEqual ( err , " " , errstr )
2008-12-02 00:47:21 +00:00
# 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.
2009-01-22 22:38:18 +00:00
d . addCallback ( _cb2 )
2007-09-17 09:25:31 +00:00
2008-12-02 00:47:21 +00:00
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 )
2009-01-24 01:34:37 +00:00
return utils . getProcessOutputAndValue ( bintahoe , args = [ " --quiet " , " restart " , c1 ] , env = os . environ )
2008-12-02 00:47:21 +00:00
d . addCallback ( _started )
2009-01-22 22:38:18 +00:00
def _cb3 ( res ) :
out , err , rc_or_sig = res
errstr = " rc= %d , OUT: ' %s ' , ERR: ' %s ' " % ( rc_or_sig , out , err )
self . failUnlessEqual ( rc_or_sig , 0 , errstr )
self . failUnlessEqual ( out , " " , errstr )
self . failUnlessEqual ( err , " " , errstr )
d . addCallback ( _cb3 )
2008-12-02 00:47:21 +00:00
# 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 ) )
2009-01-24 01:34:37 +00:00
return utils . getProcessOutputAndValue ( bintahoe , args = [ " --quiet " , " stop " , c1 ] , env = os . environ )
2009-01-22 22:38:18 +00:00
d . addCallback ( _stop )
def _cb4 ( res ) :
out , err , rc_or_sig = res
2008-12-02 00:47:21 +00:00
# the parent has exited by now
2009-01-22 22:38:18 +00:00
errstr = " rc= %d , OUT: ' %s ' , ERR: ' %s ' " % ( rc_or_sig , out , err )
self . failUnlessEqual ( rc_or_sig , 0 , errstr )
self . failUnlessEqual ( out , " " , errstr )
self . failUnlessEqual ( err , " " , errstr )
2008-12-02 00:47:21 +00:00
# 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 ) )
2009-01-22 22:38:18 +00:00
d . addCallback ( _cb4 )
2008-12-02 00:47:21 +00:00
return d