3 from zope.interface import implements
4 from twisted.trial import unittest
5 from twisted.internet import defer
6 from twisted.python import log
8 from foolscap import Tub, Referenceable
9 from foolscap.eventual import fireEventually, flushEventualQueue
10 from twisted.application import service
12 from allmydata.node import Node, formatTimeTahoeStyle
13 from allmydata.util import testutil, fileutil
14 from allmydata import logpublisher
16 class LoggingMultiService(service.MultiService):
17 def log(self, msg, **kw):
21 CERTFILE='DEFAULT_CERTFILE_BLANK'
22 PORTNUMFILE='DEFAULT_PORTNUMFILE_BLANK'
24 class TestCase(unittest.TestCase, testutil.SignalMixin):
26 self.parent = LoggingMultiService()
27 self.parent.startService()
29 log.msg("%s.tearDown" % self.__class__.__name__)
30 d = defer.succeed(None)
31 d.addCallback(lambda res: self.parent.stopService())
32 d.addCallback(flushEventualQueue)
35 def test_advertised_ip_addresses(self):
36 basedir = "test_node/test_advertised_ip_addresses"
37 fileutil.make_dirs(basedir)
38 f = open(os.path.join(basedir, 'advertised_ip_addresses'),'w')
43 n.setServiceParent(self.parent)
44 d = n.when_tub_ready()
46 def _check_addresses(ignored_result):
47 furl = n.tub.registerReference(n)
48 self.failUnless("1.2.3.4:5" in furl, furl)
50 d.addCallback(_check_addresses)
54 basedir = "test_node/test_log"
55 fileutil.make_dirs(basedir)
57 n.log("this is a message")
58 n.log("with %d %s %s", args=(2, "interpolated", "parameters"))
59 n.log("with bogus %d expansion", args=("not an integer",))
61 def test_logpublisher(self):
62 basedir = "test_node/test_logpublisher"
63 fileutil.make_dirs(basedir)
64 observer = LogObserver()
66 n.setServiceParent(self.parent)
67 d = n.when_tub_ready()
70 flogport = open(os.path.join(n.basedir,"logport.furl"), "r").read()
71 return n.tub.getReference(flogport.strip())
73 def _got_logport(logport):
74 d = logport.callRemote("get_versions")
76 self.failUnlessEqual(versions["allmydata"],
77 allmydata.__version__)
79 d.addCallback(lambda res:
80 logport.callRemote("subscribe_to_all", observer))
81 def _emit(subscription):
82 self._subscription = subscription
83 log.msg("message here")
85 d.addCallback(fireEventually)
86 d.addCallback(fireEventually)
87 def _check_observer(res):
88 msgs = observer.messages
89 self.failUnlessEqual(len(msgs), 1)
91 self.failUnlessEqual(msgs[0]["message"], ("message here",) )
92 d.addCallback(_check_observer)
94 return logport.callRemote("unsubscribe", self._subscription)
97 d.addCallback(_got_logport)
100 def test_log_gatherer(self):
102 t.setServiceParent(self.parent)
103 t.listenOn("tcp:0:interface=127.0.0.1")
104 l = t.getListeners()[0]
105 portnum = l.getPortnum()
106 t.setLocation("127.0.0.1:%d" % portnum)
107 gatherer = Gatherer()
108 gatherer.d = defer.Deferred()
109 gatherer_furl = t.registerReference(gatherer)
111 basedir = "test_node/test_log_gatherer"
112 fileutil.make_dirs(basedir)
113 f = open(os.path.join(basedir, "log_gatherer.furl"), "w")
114 f.write(gatherer_furl + "\n")
117 n = TestNode(basedir)
118 n.setServiceParent(self.parent)
119 d = n.when_tub_ready()
122 # about now, the node will be contacting the Gatherer and
123 # offering its logport.
125 d.addCallback(_ready)
128 def test_timestamp(self):
129 # this modified logger doesn't seem to get used during the tests,
130 # probably because we don't modify the LogObserver that trial
131 # installs (only the one that twistd installs). So manually exercise
133 t = formatTimeTahoeStyle("ignored", time.time())
134 self.failUnless("Z" in t)
135 t2 = formatTimeTahoeStyle("ignored", int(time.time()))
136 self.failUnless("Z" in t2)
138 class Gatherer(Referenceable):
139 implements(logpublisher.RILogGatherer)
140 def remote_logport(self, nodeid, logport):
141 d = logport.callRemote("get_versions")
142 d.addCallback(self.d.callback)
144 class LogObserver(Referenceable):
145 implements(logpublisher.RILogObserver)
148 def remote_msg(self, d):
149 self.messages.append(d)