commit 3a31b613c62706d8eb9617c143981a5b1b95df0c Author: Arturo Filastò hellais@torproject.org Date: Wed May 2 21:32:37 2012 +0200
Finish a working ooniclient implementation --- oonicli.py | 95 ++++++++++++++++++++++++++++++++++++++++++++++++---- plugins/skel.py | 16 ++++----- plugoo/tests.py | 10 +---- plugoo/work.py | 16 ++++++++- unittest/tests.py | 4 +- 5 files changed, 112 insertions(+), 29 deletions(-)
diff --git a/oonicli.py b/oonicli.py index d77ad0f..0a9c1cc 100755 --- a/oonicli.py +++ b/oonicli.py @@ -8,18 +8,27 @@ # :license: see LICENSE for more details. #
-from plugoo import tests +import sys +from plugoo import tests, work
from twisted.python import usage - from twisted.plugin import getPlugins +from twisted.internet import reactor
from zope.interface.exceptions import BrokenImplementation from zope.interface.exceptions import BrokenMethodImplementation from zope.interface.verify import verifyObject +from pprint import pprint +from logo import getlogo import plugins
+__version__ = "0.0.1-prealpha" + def retrieve_plugoo(): + """ + Get all the plugins that implement the ITest interface and get the data + associated to them into a dict. + """ interface = tests.ITest d = {} error = False @@ -28,11 +37,11 @@ def retrieve_plugoo(): verifyObject(interface, p) d[p.shortName] = p except BrokenImplementation, bi: - print "Plugin Broke" + print "Plugin Broken" print bi error = True except BrokenMethodImplementation, bmi: - print "Plugin Broke" + print "Plugin Broken" error = True if error != False: print "Plugin Loaded!" @@ -40,18 +49,88 @@ def retrieve_plugoo():
plugoo = retrieve_plugoo()
+class StupidAsset(object): + def __init__(self): + self.idx = 0 + + def __iter__(self): + return self + + def next(self): + if self.idx > 30: + raise StopIteration + self.idx += 1 + return self.idx + +def runTest(test, options): + pprint(test) + wgen = work.WorkGenerator(StupidAsset, plugoo[test].__class__, + dict(options), + start=options['resume']) + + worker = work.Worker() + for x in wgen: + print "------" + print "Work unit" + print "------" + print x.serialize() + worker.push(x) + print "------" + + reactor.run() + class Options(usage.Options): tests = plugoo.keys() subCommands = [] for test in tests: - subCommands.append([test, None, plugoo[test].arguments, "Run the %s test" % test]) + subCommands.append([test, None, plugoo[test].options, "Run the %s test" % test]) + + optFlags = [ + ['local', 'l', "If the test should be run locally (without having oonid running)"], + ['status', 'x', 'Show current state'], + ['restart', 'r', 'Restart OONI'] + ]
optParameters = [ - ['status', 's', 0, 'Show current state'], - ['restart', 'r', None, 'Restart OONI'], - ['node', 'n', 'localhost:31415', 'Select target node'] + ['node', 'n', 'localhost:31415', 'Select target node'], + ['ooninet', 'o', 'localhost:4242', "Select OONI-net address for reporting"], + ['password', 'p', 'opennetwork', "Specify the password for authentication"], ]
+ def opt_version(self): + """ + Display OONI version and exit. + """ + print "OONI version:", __version__ + sys.exit(0) + + def __str__(self): + """ + Hack to get the sweet ascii art into the help output and replace the + strings "Commands" with "Tests". + """ + return getlogo() + '\n' + self.getSynopsis() + '\n' + \ + self.getUsage(width=None).replace("Commands:", "Tests:") + config = Options() config.parseOptions()
+if config['status']: + print "oonid is not running." + sys.exit(0) + +if config['restart']: + print "Restarting oonid." + sys.exit(0) + +if not config.subCommand: + print "Error! No Test Specified." + config.opt_help() + sys.exit(1) + +if config['local']: + runTest(config.subCommand, config.subOptions) + +else: + print "The test will be run on the node %s" % config['node'] + diff --git a/plugins/skel.py b/plugins/skel.py index d27932a..41420b1 100644 --- a/plugins/skel.py +++ b/plugins/skel.py @@ -1,22 +1,20 @@ from zope.interface import implements from twisted.python import usage from twisted.plugin import IPlugin -from plugoo.tests import ITest +from plugoo.tests import ITest, TwistedTest
class SkelArgs(usage.Options): optParameters = [['assets', 'a', None, 'Asset file'], - ['resume', 'r', None, 'Resume at this index']] + ['resume', 'r', 0, 'Resume at this index']]
-class SkelTest(object): +class SkelTest(TwistedTest): implements(IPlugin, ITest)
shortName = "skeleton" description = "Skeleton plugin" requirements = None - arguments = SkelArgs - - def startTest(): - pass - -skel = SkelTest() + options = SkelArgs
+# We need to instantiate it otherwise getPlugins does not detect it +# XXX Find a way to load plugins without instantiating them. +skel = SkelTest(None, None) diff --git a/plugoo/tests.py b/plugoo/tests.py index 4c3e1a1..41363ee 100644 --- a/plugoo/tests.py +++ b/plugoo/tests.py @@ -126,7 +126,7 @@ class ITest(Interface):
#deferred = Attribute("""This will be fired on test completion""") #node = Attribute("""This represents the node that will run the test""") - arguments = Attribute("""These are the arguments to be passed to the test for it's execution""") + options = Attribute("""These are the arguments to be passed to the test for it's execution""")
def startTest(): """ @@ -164,9 +164,8 @@ class HTTPRequestTest(object): pass
class TwistedTest(object): - def __init__(self, asset, node, arguments, ooninet=None): + def __init__(self, asset, arguments, ooninet=None): self.asset = asset - self.node = node self.arguments = arguments self.start_time = datetime.now() #self.ooninet = ooninet @@ -188,11 +187,6 @@ class TwistedTest(object): reactor.callLater(2.0, self.finished, result) return self.d
- -class StupidTest(TwistedTest): - def __repr__(self): - return "<StupidTest %s %s %s>" % (self.arguments, self.asset, self.node) - class TwistedTestFactory(object):
test = StupidTest diff --git a/plugoo/work.py b/plugoo/work.py index 53cb18c..809e9bd 100644 --- a/plugoo/work.py +++ b/plugoo/work.py @@ -31,10 +31,13 @@ class Worker(object): self._queued = []
def _run(self, r): + print "RUNNING" self._running -= 1 if self._running < self.maxconcurrent and self._queued: workunit, d = self._queued.pop(0) for work in workunit: + print "Going over workunits bis" + print work self._running += 1 actuald = work.startTest().addBoth(self._run) if isinstance(r, failure.Failure): @@ -48,8 +51,11 @@ class Worker(object): return r
def push(self, workunit): + print "PUSHING" if self._running < self.maxconcurrent: for work in workunit: + print "Going over work units" + print dir(work) self._running += 1 work.startTest().addBoth(self._run) return @@ -102,9 +108,15 @@ class WorkUnit(object): Launches the Unit of Work with the specified assets on the node. """ try: - asset = self.assetGenerator.next() - return self.Test(asset, self.node, self.arguments) + asset = self.assetGenerator.next() + print "Next shit.." + print asset + ret = self.Test(asset, self.arguments) + print type(ret) + print repr(ret) + return ret except StopIteration: + print "Stopped iteration!" raise StopIteration
diff --git a/unittest/tests.py b/unittest/tests.py index da7c7d0..10887b2 100644 --- a/unittest/tests.py +++ b/unittest/tests.py @@ -1,5 +1,5 @@ from twisted.internet import reactor -from plugoo import * +from plugoo import work, tests
class StupidAsset(object): def __init__(self): @@ -14,7 +14,7 @@ class StupidAsset(object): self.idx += 1 return self.idx
-wgen = work.WorkGenerator(StupidAsset, tests.StupidTest, {'bla': 'aaa'}, start=0) +wgen = work.WorkGenerator(StupidAsset, tests.StupidTest(None, None, None, None), {'bla': 'aaa'}, start=0) worker = work.Worker() for x in wgen: print "------"