def connectionLost(self, reason): if self.runCase: self.runCase.onConnectionLost(self.failedByMe) self.caseEnd = time.time() caseResult = {"case": self.case, "id": caseClasstoId(self.Case), "description": self.Case.DESCRIPTION, "expectation": self.Case.EXPECTATION, "agent": self.caseAgent, "started": self.caseStarted, "duration": int(round(1000. * (self.caseEnd - self.caseStart))), # case execution time in ms "reportTime": self.runCase.reportTime, # True/False switch to control report output of duration "behavior": self.runCase.behavior, "expected": self.runCase.expected, "received": self.runCase.received, "result": self.runCase.result, "wirelog": self.wirelog, "createWirelog": self.createWirelog, "failedByMe": self.failedByMe, "createStats": self.createStats, "rxOctetStats": self.rxOctetStats, "rxFrameStats": self.rxFrameStats, "txOctetStats": self.txOctetStats, "txFrameStats": self.txFrameStats} self.factory.logCase(caseResult)
def onConnect(self, connectionRequest): if self.debug: log.msg("connection received from %s speaking WebSockets protocol %d - upgrade request for host '%s', path '%s', params %s, origin '%s', protocols %s, headers %s" % (connectionRequest.peerstr, connectionRequest.version, connectionRequest.host, connectionRequest.path, str(connectionRequest.params), connectionRequest.origin, str(connectionRequest.protocols), str(connectionRequest.headers))) if connectionRequest.params.has_key("agent"): if len(connectionRequest.params["agent"]) > 1: raise Exception("multiple agents specified") self.caseAgent = connectionRequest.params["agent"][0] else: #raise Exception("no agent specified") self.caseAgent = None if connectionRequest.params.has_key("case"): if len(connectionRequest.params["case"]) > 1: raise Exception("multiple test cases specified") try: self.case = int(connectionRequest.params["case"][0]) except: raise Exception("invalid test case ID %s" % connectionRequest.params["case"][0]) if self.case: if self.case >= 1 and self.case <= len(self.factory.specCases): self.Case = CasesById[self.factory.specCases[self.case - 1]] if connectionRequest.path == "/runCase": self.runCase = self.Case(self) else: raise Exception("case %s not found" % self.case) if connectionRequest.path == "/runCase": if not self.runCase: raise Exception("need case to run") if not self.caseAgent: raise Exception("need agent to run case") self.caseStarted = utcnow() print "Running test case ID %s for agent %s from peer %s" % (caseClasstoId(self.Case), self.caseAgent, connectionRequest.peerstr) elif connectionRequest.path == "/updateReports": if not self.caseAgent: raise Exception("need agent to update reports for") print "Updating reports, requested by peer %s" % connectionRequest.peerstr elif connectionRequest.path == "/getCaseInfo": if not self.Case: raise Exception("need case to get info") elif connectionRequest.path == "/getCaseStatus": if not self.Case: raise Exception("need case to get status") if not self.caseAgent: raise Exception("need agent to get status") elif connectionRequest.path == "/getCaseCount": pass else: print "Entering direct command mode for peer %s" % connectionRequest.peerstr self.path = connectionRequest.path return None
def connectionMade(self): FuzzingProtocol.connectionMade(self) WebSocketClientProtocol.connectionMade(self) self.caseAgent = self.factory.agent self.case = self.factory.currentCaseIndex self.Case = Cases[self.case - 1] self.runCase = self.Case(self) self.caseStarted = utcnow() print "Running test case ID %s for agent %s from peer %s" % (caseClasstoId(self.Case), self.caseAgent, self.peerstr)
def onOpen(self): if self.runCase: cc_id = caseClasstoId(self.runCase.__class__) if checkAgentCaseExclude(self.factory.specExcludeAgentCases, self.caseAgent, cc_id): print "Skipping test case %s for agent %s by test configuration!" % (cc_id, self.caseAgent) self.runCase = None self.sendClose() return else: self.caseStart = time.time() self.runCase.onOpen() elif self.path == "/updateReports": self.factory.createReports() self.sendClose() elif self.path == "/getCaseCount": self.sendMessage(json.dumps(len(self.factory.specCases))) self.sendClose() elif self.path == "/getCaseStatus": def sendResults(results): self.sendMessage(json.dumps({ 'behavior':results['behavior'] })) self.sendClose() self.factory.addResultListener(self.caseAgent, caseClasstoId(self.Case), sendResults) elif self.path == "/getCaseInfo": self.sendMessage(json.dumps({ 'id':caseClasstoId(self.Case), 'description':caseClassToPrettyDescription(self.Case), })) self.sendClose() else: pass
def connectionLost(self, reason): if self.runCase: self.runCase.onConnectionLost(self.failedByMe) self.caseEnd = time.time() caseResult = { "case": self.case, "id": caseClasstoId(self.Case), "description": self.Case.DESCRIPTION, "expectation": self.Case.EXPECTATION, "agent": self.caseAgent, "started": self.caseStarted, "duration": int(round(1000.0 * (self.caseEnd - self.caseStart))), # case execution time in ms "reportTime": self.runCase.reportTime, # True/False switch to control report output of duration "behavior": self.runCase.behavior, "behaviorClose": self.runCase.behaviorClose, "expected": self.runCase.expected, "expectedClose": self.runCase.expectedClose, "received": self.runCase.received, "result": self.runCase.result, "resultClose": self.runCase.resultClose, "wirelog": self.wirelog, "createWirelog": self.createWirelog, "closedByMe": self.closedByMe, "failedByMe": self.failedByMe, "droppedByMe": self.droppedByMe, "wasClean": self.wasClean, "wasNotCleanReason": self.wasNotCleanReason, "wasServerConnectionDropTimeout": self.wasServerConnectionDropTimeout, "wasCloseHandshakeTimeout": self.wasCloseHandshakeTimeout, "localCloseCode": self.localCloseCode, "localCloseReason": self.localCloseReason, "remoteCloseCode": self.remoteCloseCode, "remoteCloseReason": self.remoteCloseReason, "isServer": self.isServer, "createStats": self.createStats, "rxOctetStats": self.rxOctetStats, "rxFrameStats": self.rxFrameStats, "txOctetStats": self.txOctetStats, "txFrameStats": self.txFrameStats, "httpRequest": self.http_request_data, "httpResponse": self.http_response_data, } self.factory.logCase(caseResult) # parent's connectionLost does useful things WebSocketProtocol.connectionLost(self, reason)
def onConnect(self, connectionRequest): if self.debug: log.msg("connection received from %s for host %s, path %s, parms %s, origin %s, protocols %s" % (connectionRequest.peerstr, connectionRequest.host, connectionRequest.path, str(connectionRequest.params), connectionRequest.origin, str(connectionRequest.protocols))) if connectionRequest.params.has_key("agent"): if len(connectionRequest.params["agent"]) > 1: raise Exception("multiple agents specified") self.caseAgent = connectionRequest.params["agent"][0] if connectionRequest.params.has_key("case"): if len(connectionRequest.params["case"]) > 1: raise Exception("multiple test cases specified") try: self.case = int(connectionRequest.params["case"][0]) except: raise Exception("invalid test case ID %s" % connectionRequest.params["case"][0]) if self.case: if self.case >= 1 and self.case <= len(Cases): self.Case = Cases[self.case - 1] self.runCase = self.Case(self) else: raise Exception("case %s not found" % self.case) if connectionRequest.path == "/runCase": if not self.runCase: raise Exception("need case to run") if not self.caseAgent: raise Exception("need agent to run case") self.caseStarted = getUtcNow() print "Running test case ID %s for agent %s from peer %s" % (caseClasstoId(self.Case), self.caseAgent, connectionRequest.peerstr) elif connectionRequest.path == "/updateReports": if not self.caseAgent: raise Exception("need agent to update reports for") print "Updating reports, requested by peer %s" % connectionRequest.peerstr elif connectionRequest.path == "/getCaseCount": pass else: print "Entering direct command mode for peer %s" % connectionRequest.peerstr self.path = connectionRequest.path return None
def onOpen(self): if self.runCase: cc_id = caseClasstoId(self.runCase.__class__) if checkAgentCaseExclude(self.factory.specExcludeAgentCases, self.caseAgent, cc_id): print "Skipping test case %s for agent %s by test configuration!" % (cc_id, self.caseAgent) self.runCase = None self.sendClose() return else: self.caseStart = time.time() self.runCase.onOpen() elif self.path == "/updateReports": self.factory.createReports() self.sendClose() elif self.path == "/getCaseCount": self.sendMessage(json.dumps(len(self.factory.specCases))) self.sendClose() else: pass
def createMasterReport(self, outdir): report_filename = "index.html" f = open(os.path.join(outdir, report_filename), 'w') f.write('<!DOCTYPE html><html><body><head><meta charset="utf-8" /><style lang="css">%s %s</style></head>' % (FuzzingFactory.css_common, FuzzingFactory.css_master)) f.write('<h1>WebSockets Protocol Test Report</h1>') f.write('<p id="intro">Test summary report generated on</p>') f.write('<p id="intro" style="margin-left: 80px;"><i>%s</i></p>' % getUtcNow()) f.write('<p id="intro">by <a href="%s">Autobahn</a> WebSockets.</p>' % "http://www.tavendo.de/autobahn") f.write('<h2>Test Results</h2>') f.write('<table id="agent_case_results">') ## sorted list of agents for which test cases where run ## agentList = sorted(self.agents.keys()) ## create list of case indexes order by case ID ## cl = [] i = 1 for c in Cases: cl.append((caseClasstoIdTuple(c) , i)) i += 1 cl = sorted(cl) caseList = [] for c in cl: caseList.append(c[1]) lastCaseCategory = None lastCaseSubCategory = None for caseNo in caseList: ## Case ID and category ## caseId = caseClasstoId(Cases[caseNo - 1]) caseCategoryIndex = caseId.split('.')[0] caseCategory = CaseCategories.get(caseCategoryIndex, "Misc") caseSubCategoryIndex = '.'.join(caseId.split('.')[:2]) caseSubCategory = CaseSubCategories.get(caseSubCategoryIndex, None) ## Category row ## if caseCategory != lastCaseCategory: f.write('<tr id="case_category_row">') f.write('<td id="case_category">%s %s</td>' % (caseCategoryIndex, caseCategory)) for agentId in agentList: f.write('<td id="agent">%s</td>' % agentId) f.write('</tr>') lastCaseCategory = caseCategory lastCaseSubCategory = None if caseSubCategory != lastCaseSubCategory: f.write('<tr id="case_subcategory_row">') f.write('<td id="case_subcategory" colspan="%d">%s %s</td>' % (len(agentList) + 1, caseSubCategoryIndex, caseSubCategory)) lastCaseSubCategory = caseSubCategory f.write('<tr id="agent_case_result_row">') f.write('<td id="case"><a href="#case_desc_%d">Case %s</a></td>' % (caseNo, caseId)) ## Agent/Case Result ## for agentId in agentList: if self.agents[agentId].has_key(caseNo): case = self.agents[agentId][caseNo] agent_case_report_file = self.makeAgentCaseReportFilename(agentId, caseNo) if case["behavior"] == Case.OK: td_text = "Pass" td_class = "case_ok" elif case["behavior"] == Case.NON_STRICT: td_text = "Non-Strict" td_class = "case_non_strict" else: td_text = "Fail" td_class = "case_failed" if case["reportTime"]: f.write('<td id="%s"><a href="%s">%s</a><br/><span id="case_duration">%s ms</span></td>' % (td_class, agent_case_report_file, td_text, case["duration"])) else: f.write('<td id="%s"><a href="%s">%s</a></td>' % (td_class, agent_case_report_file, td_text)) else: f.write('<td id="case_missing">Missing</td>') f.write("</tr>") f.write("</table>") f.write('<h2>Test Cases</h2>') for caseNo in caseList: CCase = Cases[caseNo - 1] f.write('<a name="case_desc_%d"></a>' % caseNo) f.write('<h3 id="case_desc_title">Case %s</h2>' % caseClasstoId(CCase)) f.write('<p id="case_desc"><i>Description</i><br/><br/> %s</p>' % CCase.DESCRIPTION) f.write('<p id="case_expect"><i>Expectation</i><br/><br/> %s</p>' % CCase.EXPECTATION) f.write("</body></html>") f.close() return report_filename
def makeAgentCaseReportFilename(self, agentId, caseNo): c = (caseClasstoId(Cases[caseNo - 1])).replace('.', '_') return self.cleanForFilename(agentId) + "_case_" + c + ".html"