def send(self, stack, duration=3.0): ''' Sends test messages. - self.msgSize: message size - self.msgCount: per remote message count :param stack: the stack to service :param duration: service duration to prevent hang ''' console.terse("\nMessages Sender {0} *********\n".format(stack.name)) maxTransactions = MAX_TRANSACTIONS * len(stack.remotes) for msg in data.generateMessages(name=stack.name, size=self.msgSize, count=self.msgCount): for remote in stack.remotes.values(): # send message stack.transmit(msg, uid=remote.uid) # service while there are too much transactions (but loops at least once) while True: self.serviceOne(stack, duration=0.01, step=0.01) if len(stack.transactions) <= maxTransactions: break # done, wait others self.doneCounter.inc() elapsed = 0.0 # be safe from engine unexpected stop step = 1.0 while not self.stopFlag.get() and elapsed < duration * 2: self.serviceOne(stack, duration=step, timeout=step) elapsed += step # check result console.terse("\nStack '{0}' uid={1}\n\tTransactions: {2}\n\tStats: {3}\n" .format(stack.name, stack.local.uid, stack.transactions, stack.stats)) self.assertEqual(len(stack.transactions), 0) self.assertEqual(len(stack.rxMsgs), 0)
def bidirectional(self, stack, duration=3.0): ''' Simultaneously sends and receives test messages. - self.msgSize: message size - self.msgCount: per remote message count :param stack: the stack to service :param duration: service duration to prevent hang ''' console.terse("\nMessages Bidirectional {0} *********\n".format(stack.name)) verifier = data.MessageVerifier(size=self.msgSize, msgCount=self.msgCount, remoteCount=len(stack.remotes), house='manor', queue='stuff') received = 0 expected = len(stack.remotes) * self.msgCount maxTransactions = MAX_TRANSACTIONS * len(stack.remotes) for msg in data.generateMessages(name=stack.name, size=self.msgSize, count=self.msgCount): for remote in stack.remotes.values(): # send message stack.transmit(msg, uid=remote.uid) # service while there are too much transactions (but loops at least once) while True: self.serviceOne(stack, duration=0.01, step=0.01) # check received if stack.rxMsgs: received += len(stack.rxMsgs) while stack.rxMsgs: verifier.verifyMessage(stack.rxMsgs.popleft()) # keep servicing if there are a lot of transactions if len(stack.transactions) <= maxTransactions: break # all sent, continue handle received while received < expected: self.serviceOne(stack, duration=duration, timeout=duration, exitCase=lambda: stack.rxMsgs) # if received nothing during timeout, assume we're done if not stack.rxMsgs: break received += len(stack.rxMsgs) while stack.rxMsgs: verifier.verifyMessage(stack.rxMsgs.popleft()) # wait remaining messenger transactions if any to be closed if stack.transactions: self.serviceOne(stack, duration=duration) # Done. Wait others self.doneCounter.inc() elapsed = 0.0 # be safe from engine unexpected stop step = 1.0 while not self.stopFlag.get() and elapsed < duration * 2: self.serviceOne(stack, duration=step, timeout=step) elapsed += step # check result console.terse("\nStack '{0}' uid={1}\n\tTransactions: {2}\n\trcv/exp: {3}/{4}\n\tStats: {5}\n" .format(stack.name, stack.local.uid, stack.transactions, received, expected, stack.stats)) rcvErrors = verifier.checkAllDone() if rcvErrors: console.terse("{0} received message with the following errors:\n".format(stack.name)) for s in rcvErrors: console.terse("\t{0} from {1}\n".format(stack.name, s)) self.assertEqual(len(stack.transactions), 0) self.assertEqual(len(rcvErrors), 0) self.assertEqual(received, expected)