[tor-commits] [ooni-probe/master] Started fixing a bug in oonicli.updateStatusBar() and runner.runTestList()
isis at torproject.org
isis at torproject.org
Tue Dec 18 05:53:46 UTC 2012
commit a6bc4d53d3288b85b9d4a2712f94f4a4c3e4862d
Author: Isis Lovecruft <isis at torproject.org>
Date: Thu Dec 13 02:20:01 2012 +0000
Started fixing a bug in oonicli.updateStatusBar() and runner.runTestList()
where the status bar hangs at 100%. It needs to be changed to use
twisted.internet.task.Cooperator and t.i.t.CooperativeTask, which means that
oonicli.updateStatusBar() still needs to be changed to be an iterator.
---
ooni/oonicli.py | 54 ++++++++++++++++++++++++++++++++++++++++--------------
ooni/runner.py | 21 +++++++++------------
2 files changed, 49 insertions(+), 26 deletions(-)
diff --git a/ooni/oonicli.py b/ooni/oonicli.py
index 9d4f783..0bf4d55 100644
--- a/ooni/oonicli.py
+++ b/ooni/oonicli.py
@@ -42,13 +42,14 @@ class Options(usage.Options):
optFlags = [["help", "h"],
["resume", "r"]]
- optParameters = [["reportfile", "o", None, "report file name"],
- ["testdeck", "i", None,
- "Specify as input a test deck: a yaml file containig the tests to run an their arguments"],
- ["collector", "c", None,
- "Address of the collector of test results. (example: http://127.0.0.1:8888)"],
- ["logfile", "l", None, "log file name"],
- ["pcapfile", "p", None, "pcap file name"]]
+ optParameters = [
+ ["reportfile", "o", None, "report file name"],
+ ["testdeck", "i", None,
+ "Specify a test deck: a yaml file containing tests and their arguments"],
+ ["collector", "c", None,
+ "Address of the collector of test results. (e.g.: http://127.0.0.1:8888)"],
+ ["logfile", "l", None, "log file name"],
+ ["pcapfile", "p", None, "pcap file name"]]
compData = usage.Completions(
extraActions=[usage.CompleteFiles(
@@ -81,14 +82,34 @@ class Options(usage.Options):
except:
raise usage.UsageError("No test filename specified!")
-def updateStatusBar():
+class CooperativeTimer(object):
+ """
+ A simple timer for the callback to functions on
+ :class:`twisted.internet.task.Cooperator <t.i.t.Cooperator>`. see
+ :meth:`oonicli.runTestList <runTestList>`.
+
+ @param seconds:
+ An integer specifying the second to wait in between updating the
+ status and ETA bars.
+ """
+ def __init__(self, seconds=5):
+ self.max_timer_interval = float(seconds)
+ self.end = time.time() + self.max_timer_interval
+
+ def __call__(self):
+ return time.time() >= self.end
+
+def updateStatusBar(stop_func):
for test_filename in config.state.keys():
# The ETA is not updated so we we will not print it out for the
# moment.
eta = config.state[test_filename].eta()
progress = config.state[test_filename].progress()
- progress_bar_frmt = "[%s] %s%%" % (test_filename, progress)
- print progress_bar_frmt
+ while progress is not None:
+ print "[%s] %s%%" % (test_filename, progress)
+ else:
+ print "[%s] All tests in file completed." % test_filename
+ stop_func()
def testsEnded(*arg, **kw):
"""You can place here all the post shutdown tasks."""
@@ -102,7 +123,7 @@ def startSniffing():
from ooni.utils.txscapy import ScapyFactory, ScapySniffer
try:
checkForRoot()
- except NotRootError:
+ except PermissionsError:
print "[!] Includepcap options requires root priviledges to run"
print " you should run ooniprobe as root or disable the options in ooniprobe.conf"
sys.exit(1)
@@ -130,9 +151,14 @@ def runTestList(none, test_list):
d2 = defer.DeferredList(deck_dl)
d2.addBoth(testsEnded)
- # Print every 5 second the list of current tests running
- l = task.LoopingCall(updateStatusBar)
- l.start(5.0)
+ try:
+ # Print every 5 second the list of current tests running
+ coop = task.Cooperator(started=False)
+ coop.cooperate(updateStatusBar) #this will need a .next() method
+ coop.start()
+ except StopIteration:
+ return d2
+
return d2
def errorRunningTests(failure):
diff --git a/ooni/runner.py b/ooni/runner.py
index 6f03e56..19dc171 100644
--- a/ooni/runner.py
+++ b/ooni/runner.py
@@ -328,9 +328,9 @@ def runTestCasesWithInput(test_cases, test_input, yaml_reporter,
reason = getattr(test_instance.__class__, 'skip')
else:
reason = txutil.acquireAttribute(test_instance._parents, 'skip', None)
+ if reason is not None:
log.warn("%s marked some tests to be skipped. Reason: %s"
% (test_instance.name, reason))
- if reason is not None:
call_skip = reactor.callLater(0, test_skip_class, reason)
d.addBoth(lambda x: call_skip.active() and call_skip.cancel() or x)
@@ -456,14 +456,14 @@ def increaseInputUnitIdx(test_filename):
config.stateDict[test_filename] += 1
yield updateResumeFile(test_filename)
-def updateProgressMeters(test_filename, input_unit_factory,
- test_case_number):
+def updateProgressMeters(test_filename, input_unit_factory, test_case_number):
"""Update the progress meters for keeping track of test state."""
log.msg("Setting up progress meters")
if not config.state.test_filename:
config.state[test_filename] = Storage()
- config.state[test_filename].per_item_average = 2.0
+ per_item_avg = float(2)
+ config.state[test_filename].per_item_average = per_item_avg
input_unit_idx = float(config.stateDict[test_filename])
input_unit_items = float(len(input_unit_factory) + 1)
@@ -471,27 +471,24 @@ def updateProgressMeters(test_filename, input_unit_factory,
total_iterations = input_unit_items * test_case_number
current_iteration = input_unit_idx * test_case_number
- log.debug("input_unit_items: %s" % input_unit_items)
- log.debug("test_case_number: %s" % test_case_number)
-
+ log.debug("Total InputUnits: %s" % input_unit_items)
log.debug("Test case number: %s" % test_case_number)
log.debug("Total iterations: %s" % total_iterations)
log.debug("Current iteration: %s" % current_iteration)
def progress():
- return (current_iteration / total_iterations) * 100.0
-
+ current_progress = (current_iteration / total_iterations) * 100.0
+ while float(current_progress) < float(100):
+ return current_progress
config.state[test_filename].progress = progress
def eta():
- return (total_iterations - current_iteration) \
- * config.state[test_filename].per_item_average
+ return (total_iterations - current_iteration) * per_item_avg
config.state[test_filename].eta = eta
config.state[test_filename].input_unit_idx = input_unit_idx
config.state[test_filename].input_unit_items = input_unit_items
-
@defer.inlineCallbacks
def runTestCases(test_cases, options, cmd_line_options):
"""
More information about the tor-commits
mailing list