def test_multiple_options(self): got_options = OrderedDict() got_options['timeout'] = '123' got_options['blksize'] = '1024' self.s = MockSession() opts = self.proto.processOptions(got_options) self.proto.applyOptions(self.s, opts) self.assertEqual(self.s.timeout, (123, 123, 123)) self.assertEqual(self.s.block_size, 1024) self.assertEqual(opts.items(), got_options.items()) got_options = OrderedDict() got_options['blksize'] = '1024' got_options['timeout'] = '123' self.s = MockSession() opts = self.proto.processOptions(got_options) self.proto.applyOptions(self.s, opts) self.assertEqual(self.s.timeout, (123, 123, 123)) self.assertEqual(self.s.block_size, 1024) self.assertEqual(opts.items(), got_options.items()) got_options = OrderedDict() got_options['blksize'] = '1024' got_options['foobar'] = 'barbaz' got_options['timeout'] = '123' self.s = MockSession() opts = self.proto.processOptions(got_options) self.proto.applyOptions(self.s, opts) self.assertEqual(self.s.timeout, (123, 123, 123)) self.assertEqual(self.s.block_size, 1024) actual_options = OrderedDict() actual_options['blksize'] = '1024' actual_options['timeout'] = '123' self.assertEqual(opts.items(), actual_options.items())
def test_multiple_options(self): got_options = OrderedDict() got_options['timeout'] = '123' got_options['blksize'] = '1024' self.s = MockSession() opts = self.proto.processOptions(got_options) self.proto.applyOptions(self.s, opts) self.assertEqual(self.s.timeout, (123, 123, 123)) self.assertEqual(self.s.block_size, 1024) self.assertEqual(opts.items(), got_options.items()) got_options = OrderedDict() got_options['blksize'] = '1024' got_options['timeout'] = '123' self.s = MockSession() opts = self.proto.processOptions(got_options) self.proto.applyOptions(self.s, opts) self.assertEqual(self.s.timeout, (123, 123, 123)) self.assertEqual(self.s.block_size, 1024) self.assertEqual(opts.items(), got_options.items()) got_options = OrderedDict() got_options['blksize'] = '1024' got_options['foobar'] = 'barbaz' got_options['timeout'] = '123' self.s = MockSession() opts = self.proto.processOptions(got_options) self.proto.applyOptions(self.s, opts) self.assertEqual(self.s.timeout, (123, 123, 123)) self.assertEqual(self.s.block_size, 1024) actual_options = OrderedDict() actual_options['blksize'] = '1024' actual_options['timeout'] = '123' self.assertEqual(opts.items(), actual_options.items())
def test_multiple_options(self): got_options = OrderedDict() got_options["timeout"] = "123" got_options["blksize"] = "1024" self.s = MockSession() opts = self.proto.processOptions(got_options) self.proto.applyOptions(self.s, opts) self.assertEqual(self.s.timeout, (123, 123, 123)) self.assertEqual(self.s.block_size, 1024) self.assertEqual(opts.items(), got_options.items()) got_options = OrderedDict() got_options["blksize"] = "1024" got_options["timeout"] = "123" self.s = MockSession() opts = self.proto.processOptions(got_options) self.proto.applyOptions(self.s, opts) self.assertEqual(self.s.timeout, (123, 123, 123)) self.assertEqual(self.s.block_size, 1024) self.assertEqual(opts.items(), got_options.items()) got_options = OrderedDict() got_options["blksize"] = "1024" got_options["foobar"] = "barbaz" got_options["timeout"] = "123" self.s = MockSession() opts = self.proto.processOptions(got_options) self.proto.applyOptions(self.s, opts) self.assertEqual(self.s.timeout, (123, 123, 123)) self.assertEqual(self.s.block_size, 1024) actual_options = OrderedDict() actual_options["blksize"] = "1024" actual_options["timeout"] = "123" self.assertEqual(opts.items(), actual_options.items())
def _groupResults(self, results, formatter): """ Group tests together based on their results. @param results: An iterable of tuples of two or more elements. The first element of each tuple is a test case. The remaining elements describe the outcome of that test case. @param formatter: A callable which turns a test case result into a string. The elements after the first of the tuples in C{results} will be passed as positional arguments to C{formatter}. @return: A C{list} of two-tuples. The first element of each tuple is a unique string describing one result from at least one of the test cases in C{results}. The second element is a list of the test cases which had that result. """ groups = OrderedDict() for content in results: case = content[0] outcome = content[1:] key = formatter(*outcome) groups.setdefault(key, []).append(case) return groups.items()
def intersect(self, other): # See RFC 3264 map1 = self.rtpmap d1 = {} for code,(e,fmt) in map1.items(): d1[rtpmap2canonical(code,e)] = e map2 = other.rtpmap outmap = OrderedDict() # XXX quadratic - make rtpmap an ordereddict for code, (e, fmt) in map2.items(): canon = rtpmap2canonical(code,e) if d1.has_key(canon): outmap[code] = (e, fmt) self.rtpmap = outmap self.formats = [ str(x) for x in self.rtpmap.keys() ] self._a['rtpmap'] = OrderedDict([ (code,e) for (code, (e, fmt)) in outmap.items() ])
def intersect(self, other): # See RFC 3264 map1 = self.rtpmap d1 = {} for code, (e, fmt) in list(map1.items()): d1[rtpmap2canonical(code, e)] = e map2 = other.rtpmap outmap = OrderedDict() # XXX quadratic - make rtpmap an ordereddict for code, (e, fmt) in list(map2.items()): canon = rtpmap2canonical(code, e) if canon in d1: outmap[code] = (e, fmt) self.rtpmap = outmap self.formats = [str(x) for x in list(self.rtpmap.keys())] self._a['rtpmap'] = OrderedDict([ (code, e) for (code, (e, fmt)) in list(outmap.items()) ])
class VoiceApp(StateMachine): _inbound = None def __init__(self, defer, appl, cookie, **kwargs): self.__cookie = cookie self.__appl = appl self.__legs = OrderedDict() self.__dict__.update(kwargs) self.__currentDTMFKey = None self.__collectedDTMFKeys = '' self.__dtmfSingleMode = True super(VoiceApp, self).__init__(defer, **kwargs) def getDefaultLeg(self): if self.__legs: return self.__legs.values()[0] def getLeg(self, cookie): return self.__legs.get(cookie) def setLeg(self, leg, cookie): self.__legs[cookie] = leg #self.leg.hijackLeg(self) def va_selectDefaultFormat(self, ptlist, callcookie): return self.getLeg(callcookie).selectDefaultFormat(ptlist) def va_incomingRTP(self, packet, callcookie): leg = self.getLeg(callcookie) if leg is None: log.msg('no leg for cookie %s for incoming RTP'%(callcookie,), system='doug') return else: return leg.leg_incomingRTP(packet) def va_outgoingRTP(self, sample, cookie=None): if cookie is None: cookie = self.__cookie self.__appl.outgoingRTP(cookie, sample) def va_start(self, args): self._start(callstart=0, args=args) def va_callstart(self, inboundLeg, args=None): if args is None: args = {} if inboundLeg is not None: self.__legs[inboundLeg.getCookie()] = inboundLeg if self._inbound is None: self._inbound = inboundLeg ce = CallStartedEvent(inboundLeg) ce.args = args self._triggerEvent(ce) def va_callanswered(self, leg=None): if leg is None: leg = self._inbound self._triggerEvent(CallAnsweredEvent(leg)) def va_callrejected(self, leg=None): if leg is None: leg = self._inbound try: del self.__legs[leg] except KeyError: log.msg("can't find leg %s, current legs: %r"%( leg, self.__legs.keys()), system='doug') self._triggerEvent(CallRejectedEvent(leg)) def _clear_legs(self): from shtoom.util import stack #print self, "clearing running legs %r"%(self.__legs.items())#,stack(8) for name, leg in self.__legs.items(): leg._stopAudio() del self.__legs[name] _cleanup = _clear_legs def va_abort(self): self.mediaStop() self._clear_legs() self._triggerEvent(CallEndedEvent(None)) def mediaPlay(self, playlist, leg=None): if leg is None: leg = self.getDefaultLeg() leg.mediaPlay(playlist) def mediaRecord(self, dest, leg=None): if leg is None: leg = self.getDefaultLeg() leg.mediaRecord(dest) def mediaStop(self, leg=None): if leg is None: leg = self.getDefaultLeg() if leg is not None: leg.mediaStop() def mediaStopRecording(self, leg=None): if leg is None: leg = self.getDefaultLeg() if leg is not None: leg.mediaStopRecording() def setTimer(self, delay): return Timer(self, delay) def isPlaying(self, leg=None): if leg is None: leg = self.getDefaultLeg() return leg.isPlaying() def isRecording(self, leg=None): if leg is None: leg = self.getDefaultLeg() return leg.isRecording() def dtmfMode(self, single=False, inband=False, timeout=0, leg=None): if leg is None: leg = self.getDefaultLeg() leg.dtmfMode(single, inband, timeout) def placeCall(self, toURI, fromURI=None): from shtoom.doug.leg import Leg nleg = Leg(cookie=None, dialog=None, voiceapp=self) self.__appl.placeCall(self.__cookie, nleg, toURI, fromURI) def va_hangupCall(self, cookie): self.__appl.dropCall(cookie) def connectLegs(self, leg1, leg2=None): from shtoom.doug.leg import Bridge if leg2 is None: leg2 = self.getDefaultLeg() if leg1 is leg2: raise ValueError, "can't join %r to itself!"%(leg1) else: b = Bridge(leg1, leg2) return b def sendDTMF(self, digits, cookie=None, duration=0.1, delay=0.05): "Send a string of DTMF keystrokes" for n,key in enumerate(digits): if key not in ',01234567890#*': raise ValueError, key if key == ',': # pause continue n = float(n) # just in case if cookie is None: cookie = self.__cookie i = 0.2 reactor.callLater(i+n*(duration+delay), lambda k=key: self.__appl.startDTMF(cookie, k)) reactor.callLater(i+n*(duration+delay)+duration, lambda k=key: self.__appl.stopDTMF(cookie, k)) def _inboundDTMFKeyPress(self, dtmf): if self.__dtmfSingleMode: self._triggerEvent(DTMFReceivedEvent(dtmf, self)) else: self.__collectedDTMFKeys += dtmf if dtmf in ('#', '*'): dtmf, self.__collectedDTMFKeys = self.__collectedDTMFKeys, '' self._triggerEvent(DTMFReceivedEvent(dtmf, self)) def va_startDTMFevent(self, dtmf, cookie=None): c = self.__currentDTMFKey if dtmf: if c is not dtmf: self.va_stopDTMFevent(c) self.__currentDTMFKey = dtmf self._inboundDTMFKeyPress(dtmf) else: # repeat pass def va_stopDTMFevent(self, dtmf, cookie=None): # For now, I only care about dtmf start events if dtmf == self.__currentDTMFKey: self.__currentDTMFKey = None
class VoiceApp(StateMachine): _inbound = None def __init__(self, defer, appl, cookie, **kwargs): self.__cookie = cookie self.__appl = appl self.__legs = OrderedDict() self.__dict__.update(kwargs) self.__currentDTMFKey = None self.__collectedDTMFKeys = '' self.__dtmfSingleMode = True super(VoiceApp, self).__init__(defer, **kwargs) def getDefaultLeg(self): if self.__legs: return self.__legs.values()[0] def getLeg(self, cookie): return self.__legs.get(cookie) def setLeg(self, leg, cookie): self.__legs[cookie] = leg #self.leg.hijackLeg(self) def va_selectDefaultFormat(self, ptlist, callcookie): return self.getLeg(callcookie).selectDefaultFormat(ptlist) def va_incomingRTP(self, packet, callcookie): leg = self.getLeg(callcookie) if leg is None: log.msg('no leg for cookie %s for incoming RTP' % (callcookie, ), system='doug') return else: return leg.leg_incomingRTP(packet) def va_outgoingRTP(self, sample, cookie=None): if cookie is None: cookie = self.__cookie self.__appl.outgoingRTP(cookie, sample) def va_start(self, args): self._start(callstart=0, args=args) def va_callstart(self, inboundLeg, args=None): if args is None: args = {} if inboundLeg is not None: self.__legs[inboundLeg.getCookie()] = inboundLeg if self._inbound is None: self._inbound = inboundLeg ce = CallStartedEvent(inboundLeg) ce.args = args self._triggerEvent(ce) def va_callanswered(self, leg=None): if leg is None: leg = self._inbound self._triggerEvent(CallAnsweredEvent(leg)) def va_callrejected(self, leg=None): if leg is None: leg = self._inbound try: del self.__legs[leg] except KeyError: log.msg("can't find leg %s, current legs: %r" % (leg, self.__legs.keys()), system='doug') self._triggerEvent(CallRejectedEvent(leg)) def _clear_legs(self): from shtoom.util import stack #print self, "clearing running legs %r"%(self.__legs.items())#,stack(8) for name, leg in self.__legs.items(): leg._stopAudio() del self.__legs[name] _cleanup = _clear_legs def va_abort(self): self.mediaStop() self._clear_legs() self._triggerEvent(CallEndedEvent(None)) def mediaPlay(self, playlist, leg=None): if leg is None: leg = self.getDefaultLeg() leg.mediaPlay(playlist) def mediaRecord(self, dest, leg=None): if leg is None: leg = self.getDefaultLeg() leg.mediaRecord(dest) def mediaStop(self, leg=None): if leg is None: leg = self.getDefaultLeg() if leg is not None: leg.mediaStop() def mediaStopRecording(self, leg=None): if leg is None: leg = self.getDefaultLeg() if leg is not None: leg.mediaStopRecording() def setTimer(self, delay): return Timer(self, delay) def isPlaying(self, leg=None): if leg is None: leg = self.getDefaultLeg() return leg.isPlaying() def isRecording(self, leg=None): if leg is None: leg = self.getDefaultLeg() return leg.isRecording() def dtmfMode(self, single=False, inband=False, timeout=0, leg=None): if leg is None: leg = self.getDefaultLeg() leg.dtmfMode(single, inband, timeout) def placeCall(self, toURI, fromURI=None): from shtoom.doug.leg import Leg nleg = Leg(cookie=None, dialog=None, voiceapp=self) self.__appl.placeCall(self.__cookie, nleg, toURI, fromURI) def va_hangupCall(self, cookie): self.__appl.dropCall(cookie) def connectLegs(self, leg1, leg2=None): from shtoom.doug.leg import Bridge if leg2 is None: leg2 = self.getDefaultLeg() if leg1 is leg2: raise ValueError, "can't join %r to itself!" % (leg1) else: b = Bridge(leg1, leg2) return b def sendDTMF(self, digits, cookie=None, duration=0.1, delay=0.05): "Send a string of DTMF keystrokes" for n, key in enumerate(digits): if key not in ',01234567890#*': raise ValueError, key if key == ',': # pause continue n = float(n) # just in case if cookie is None: cookie = self.__cookie i = 0.2 reactor.callLater(i + n * (duration + delay), lambda k=key: self.__appl.startDTMF(cookie, k)) reactor.callLater(i + n * (duration + delay) + duration, lambda k=key: self.__appl.stopDTMF(cookie, k)) def _inboundDTMFKeyPress(self, dtmf): if self.__dtmfSingleMode: self._triggerEvent(DTMFReceivedEvent(dtmf, self)) else: self.__collectedDTMFKeys += dtmf if dtmf in ('#', '*'): dtmf, self.__collectedDTMFKeys = self.__collectedDTMFKeys, '' self._triggerEvent(DTMFReceivedEvent(dtmf, self)) def va_startDTMFevent(self, dtmf, cookie=None): c = self.__currentDTMFKey if dtmf: if c is not dtmf: self.va_stopDTMFevent(c) self.__currentDTMFKey = dtmf self._inboundDTMFKeyPress(dtmf) else: # repeat pass def va_stopDTMFevent(self, dtmf, cookie=None): # For now, I only care about dtmf start events if dtmf == self.__currentDTMFKey: self.__currentDTMFKey = None