an early version of chakana, an automated test framework used with COOJA

This commit is contained in:
fros4943 2007-08-21 14:39:18 +00:00
parent 9be473e4b9
commit 65533c0c00
29 changed files with 4983 additions and 0 deletions

175
tools/chakana/event.py Normal file
View file

@ -0,0 +1,175 @@
import time
import thread
from debug import *
import threads
class Eventpoint(threads.ManagedThread):
""" The Eventpoint class and its subclasses represent important events
happening in the debugged system, and are the primitives that Chakana
debugging scripts are based around. When the user calls waitFor with an
Eventpoint list argument, each Eventpoint thread is started. The
Eventpoint inserts appropriate eventpoints into COOJA or creates child
Eventpoints. An Eventpoint that is hit posts itself on a trigger queue
(Queue.Queue), where it is picked up by waitFor. The Eventpoints that
have not been triggered are then discarded by the waitFor routine."""
def __init__(self, shepherd):
threads.ManagedThread.__init__(self, shepherd.threadManager())
self._shepherd = shepherd
self._activated = 0
self._discarded = 0
self._triggerQueue = None
resourceAllocated = 0
while resourceAllocated == 0:
try:
self._isWaitingEvent = threading.Event()
resourceAllocated = 1
except thread.error:
resourceAllocated = 0
shepherd.threadManager().registerPIDerror()
def await(self, triggerQueue):
assert not self._activated, "Eventpoints can only be used once"
self._triggerQueue = triggerQueue
self._activated = 1
self.activatedHook()
self.start()
def doRun(self):
debug(Debug, "Waiting for event: " + repr(self))
if not self._discarded:
self.doWait()
debug(MinorEvent, "Event was triggered: " + repr(self))
if not self._discarded:
self._triggerQueue.put(self)
else:
debug(Debug, "Event is no longer waited for: " + repr(self))
def activatedHook(self):
pass
def doWait(self):
raise NotImplementedError()
def discard(self):
debug(Debug, "Discarding eventpoint:\n" + repr(self))
self._discarded = 1
if (not self._activated):
self.start()
for (waitingEv, event) in self.shepherd()._waitMap.values():
if waitingEv == self:
event.set()
self.join()
def isDiscarded(self):
return self._discarded
def shepherd(self):
return self._shepherd
def __repr__(self):
return "\n ".join([
"event.Eventpoint:",
"Id: %#x" % ((id(self) + (long(1) << 32)) % (long(1) << 32)),
])
class BasicEventpoint(Eventpoint):
"""Eventpoint corresponding to a single COOJA Eventpoint."""
def __init__(self, shepherd, ** kwArgs):
Eventpoint.__init__(self, shepherd, ** kwArgs)
def activatedHook(self):
self.shepherd().registerBasicEventpoint(self)
def doWait(self):
self.shepherd().waitForCoojaEventpoint(self)
self.shepherd().unregisterBasicEventpoint(self)
class Watchpoint(BasicEventpoint):
def __init__(self, shepherd, type, mote, variable, ** kwArgs):
self._type = type
self._mote = mote
self._variable = variable
BasicEventpoint.__init__(self, shepherd, ** kwArgs)
def coojaArguments(self):
return { "type" : self._type,
"mote" : self._mote,
"variable" : self._variable }
def __repr__(self):
return "\n ".join([
BasicEventpoint.__repr__(self),
"event.Watchpoint:",
"Type: " + repr(self._type),
"Mote: " + repr(self._mote),
"Variable: " + repr(self._variable)
])
class TimeEventpoint(BasicEventpoint):
def __init__(self, shepherd, time, ** kwArgs):
self._time = time
BasicEventpoint.__init__(self, shepherd, ** kwArgs)
def coojaArguments(self):
return { "type" : "time",
"time" : self._time }
def __repr__(self):
return "\n ".join([
BasicEventpoint.__repr__(self),
"event.TimeEventpoint:",
"Time: " + repr(self._time)
])
class RadioMessageCompletedEventpoint(BasicEventpoint):
def __init__(self, shepherd, count = 1, ** kwArgs):
self._count = count
BasicEventpoint.__init__(self, shepherd, ** kwArgs)
def coojaArguments(self):
return { "type" : "radiomedium",
"triggeron" : "completed",
"count" : str(self._count) }
def __repr__(self):
return "\n ".join([
BasicEventpoint.__repr__(self),
"event.RadioMessageCompletedEventpoint",
])
class MonitorEventpoint(Eventpoint):
"""Eventpoint that triggers after a monitor has finished."""
def __init__(self, monitor):
self._monitor = monitor
Eventpoint.__init__(self, monitor.shepherd())
def doWait(self):
debug(Debug, "MonitorEventpoint starting " + repr(self))
self._monitor.startMonitor()
self._monitor.waitMonitor(self)
def discard(self):
self._discarded = 1
self._monitor.discard()
if (not self._activated):
self.start()
self._monitor.startMonitor()
self._monitor.waitMonitor(self)
else:
self._monitor.waitMonitor(self)
self.join()
def __repr__(self):
return "\n ".join([
Eventpoint.__repr__(self),
"event.MonitorEventpoint:",
"Monitor: " + repr(self._monitor)
])