def askName(self): self.log("Asking name from the server", 1) (success, data) = doApiReq("%s/getName" % self.apiUrl) if not success: self.error("Could not get client code - error from server side: " + data) return data
def sendFile(self, project, hash, url, size): self.log("Sending info about file: %s" % url) (success, data) = doApiReq("%s/addTestcase" % self.apiUrl, { 'project_id': project, 'hash': hash, 'url': url, 'size': str(size) })
def sendCoverage(self, testcaseId): f = open('temp.bbc', 'rb') content = f.read() content = array.array('B', content) f.close() pos = 3 nrOfBBs = 0 modules = {} recordedModules = {} while pos<len(content): if content[pos] == 0x1: pos += 1 pid = int(content[pos]) + int(content[pos + 1]) * 0x100 + int(content[pos + 2]) * 0x10000 + int(content[pos + 3]) * 0x1000000 pos += 4 id = content[pos] + (pid * 1000) pos += 1 moduleName = "" while content[pos] != 0x00: moduleName += chr(content[pos]) pos += 1 pos += 1 recordedModules[id] = moduleName if moduleName not in modules: modules[moduleName] = [] elif content[pos] == 0x2: pos += 1 pid = int(content[pos]) + int(content[pos + 1]) * 0x100 + int(content[pos + 2]) * 0x10000 + int(content[pos + 3]) * 0x1000000 pos += 4 id = content[pos] + (pid * 1000) pos += 1 rva = int(content[pos]) + int(content[pos + 1]) * 0x100 + int(content[pos + 2]) * 0x10000 + int(content[pos + 3]) * 0x1000000 pos += 4 moduleName = recordedModules[id] if rva not in modules[moduleName]: modules[moduleName].append(rva) nrOfBBs += 1 result = {} result['client'] = self.botName result['id'] = testcaseId result['coverage'] = [] for moduleName in modules: moduleObj = {} moduleObj['name'] = moduleName moduleObj['basicblocks'] = modules[moduleName] result['coverage'].append(moduleObj) self.log("Reporting %d modules and %d blocks" % (len(modules), nrOfBBs), 1) while True: start = time.time() (success, data) = doApiReq("%s/addCoverage" % (self.apiUrl), json.dumps(result)) end = time.time() if success: self.log("Coverage sent in %d seconds" % (end-start), 1) break self.log("Failed to send coverage: %s" % (data), 2) time.sleep(39)
def markDone(self, project, prefix): self.log("Ending search range for '%s'" % prefix, 1) (success, data) = doApiReq("%s/endRange?code=%s&search_str=%s&project_id=%s" % (self.apiUrl, self.botName, prefix, project)) if not success: self.log("Could not end search range: " + data, 2) return False return True
def getOrders(self): self.log("Asking orders from the server", 1) (success, data) = doApiReq("%s/getRange?code=%s" % (self.apiUrl, self.botName)) if not success: return None conf = { 'project': data['project_id'], 'extension': data['extension'], 'prefix': data['search_str'], 'magic': data['magic'].decode("hex") } return conf
def getCoverageTarget(self): while True: try: self.log("Asking coverage target", 0) (success, data) = doApiReq("%s/getTestcase?code=%s&project=%s" % (self.apiUrl, self.botName, self.project)) if not success: return None coverage = { 'id': data['id'], 'hash': data['hash'], 'location': data['url'] } return coverage except: self.log("Failed to ask coverage target", 1) return None
def registerName(self): self.log("Registering name '%s' to the server" % self.botName, 1) (success, data) = doApiReq("%s/registerBot?code=%s" % (self.apiUrl, self.botName)) if not success: self.error("Could not registerg client code: " + data)
def downloadList(self): (success, data) = doApiReq("%s/getLinks?project=%s&skip=%d&count=%d" % (self.apiUrl, self.project, self.skip, self.count)) if(success): self.count = len(data) self.searchesList = data