def start_system_test_file(self): if self.verbose: print(" Writing testcase xml file: {}".format( self.unit_report_name)) #self.fh = open(self.unit_report_name, "w") errors = 0 failed = 0 success = 0 from vector.apps.DataAPI.vcproject_api import VCProjectApi api = VCProjectApi(self.FullManageProjectName) for env in api.Environment.all(): if env.compiler.name == self.compiler and env.testsuite.name == self.testsuite and env.name == self.env and env.system_tests: for st in env.system_tests: if st.passed == st.total: success += 1 else: failed += 1 errors += 1 self.failed_count += 1 api.close() self.fh_data = "" self.fh_data += ("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n") self.fh_data += ("<testsuites>\n") self.fh_data += ( " <testsuite errors=\"%d\" tests=\"%d\" failures=\"%d\" name=\"%s\" id=\"1\">\n" % (errors, success + failed + errors, failed, escape(self.env, quote=False)))
def generate_full_status(manageProject): mpName = os.path.splitext(os.path.basename(manageProject))[0] report_name = mpName + "_full_report.html" try: from vector.apps.DataAPI.vcproject_api import VCProjectApi api = VCProjectApi(manageProject) from vector.apps.ReportBuilder.custom_report import CustomReport CustomReport.report_from_api(api, report_type="MANAGE_STATUS_FULL_REPORT", formats=["HTML"], output_file=report_name, environments=api.Environment.all(), levels = [] ) shutil.copy(report_name,report_name + "_tmp") fixup_reports.fixup_2020_reports(report_name + "_tmp") api.close() except: from managewait import ManageWait cmd = "--project " + manageProject + " --full-status=" + report_name manageWait = ManageWait(False, cmd, 30, 1) out_mgt = manageWait.exec_manage(True) shutil.copy(report_name,report_name + "_tmp") return out_mgt
def __init__(self): self.manageProject = None self.lock = Lock() parser = argparse.ArgumentParser() parser.add_argument('--project', '-p', help='Manager Project Name') parser.add_argument('--dryrun', help='Dry Run without build/execute', action="store_true") parser.add_argument('--jobs', '-j', help='Number of concurrent jobs', default="1") parser.add_argument('--verbose', help='Dry Run without build/execute', action="store_true") parser.add_argument('--ci', help='Use CI Licenses', action="store_true", default=False) args = parser.parse_args() if args.ci: self.useCI = " --ci " else: self.useCI = "" try: self.manageProject = os.environ['VCV_ENVIRONMENT_FILE'] except: self.manageProject = args.project self.dryrun = args.dryrun if self.manageProject is None: print( "\n** Use either --project [Manage Project Name] or enviroment variable VCV_ENVIRONMENT_FILE to specify the manage project name" ) sys.exit() if not os.path.isfile( self.manageProject) and not os.path.isfile(self.manageProject + ".vcm"): raise IOError(self.manageProject + ' does not exist') return if args.verbose: self.verbose = True else: self.verbose = False self.mpName = self.manageProject.replace(".vcm", "") self.reportName = os.path.basename(self.manageProject).replace( ".vcm", "") self.buildSemaphore = Semaphore(int(args.jobs)) print("Disabling range check globally") try: self.api = VCProjectApi(self.manageProject) except: statusCmd = VCD + "/manage --project " + self.manageProject + self.useCI + " --status" self.runManageCmd(statusCmd) self.api = VCProjectApi(self.manageProject) self.oldRangeCheck = self.api.project.options["enums"]["RANGE_CHECK"][ 0] self.api.close() buildCmd = VCD + "/manage --project " + self.manageProject + self.useCI + " --config=RANGE_CHECK=NONE" self.runManageCmd(buildCmd) self.api = VCProjectApi(self.manageProject)
class ParallelBuild(object): def __init__(self): self.manageProject = None self.lock = Lock() parser = argparse.ArgumentParser() parser.add_argument('--project', '-p', help='Manager Project Name') parser.add_argument('--dryrun', help='Dry Run without build/execute', action="store_true") parser.add_argument('--jobs', '-j', help='Number of concurrent jobs', default="1") parser.add_argument('--verbose', help='Dry Run without build/execute', action="store_true") parser.add_argument('--ci', help='Use CI Licenses', action="store_true", default=False) args = parser.parse_args() if args.ci: self.useCI = " --ci " else: self.useCI = "" try: self.manageProject = os.environ['VCV_ENVIRONMENT_FILE'] except: self.manageProject = args.project self.dryrun = args.dryrun if self.manageProject is None: print( "\n** Use either --project [Manage Project Name] or enviroment variable VCV_ENVIRONMENT_FILE to specify the manage project name" ) sys.exit() if not os.path.isfile( self.manageProject) and not os.path.isfile(self.manageProject + ".vcm"): raise IOError(self.manageProject + ' does not exist') return if args.verbose: self.verbose = True else: self.verbose = False self.mpName = self.manageProject.replace(".vcm", "") self.reportName = os.path.basename(self.manageProject).replace( ".vcm", "") self.buildSemaphore = Semaphore(int(args.jobs)) print("Disabling range check globally") try: self.api = VCProjectApi(self.manageProject) except: statusCmd = VCD + "/manage --project " + self.manageProject + self.useCI + " --status" self.runManageCmd(statusCmd) self.api = VCProjectApi(self.manageProject) self.oldRangeCheck = self.api.project.options["enums"]["RANGE_CHECK"][ 0] self.api.close() buildCmd = VCD + "/manage --project " + self.manageProject + self.useCI + " --config=RANGE_CHECK=NONE" self.runManageCmd(buildCmd) self.api = VCProjectApi(self.manageProject) def __enter__(self): return self def __exit__(self, exct_type, exce_value, traceback): self.api.close() print("Clearing disable of range check globally") buildCmd = VCD + "/manage --project " + self.manageProject + self.useCI + " --config=RANGE_CHECK=" + self.oldRangeCheck self.runManageCmd(buildCmd) build_log_data = "" for file in glob.glob("build*.log"): build_log_data += " ".join(open(file, "r").readlines()) os.remove(file) try: open("complete_build.log", "w", encoding="utf-8").write(unicode(build_log_data)) except: open("complete_build.log", "w").write(build_log_data) print(build_log_data) def th_Print(self, str): self.lock.acquire() print(str) self.lock.release() def runManageCmd(self, cmd, env=None): if self.verbose: self.th_Print(cmd) if self.dryrun: return if env: logName = "build_" + self.reportName + "_" + env.compiler.name + "_" + env.testsuite.name + "_" + env.name + ".log" build_log = open(logName, "w") process = subprocess.Popen(cmd, shell=True, stdout=build_log, stderr=build_log) process.wait() build_log.close() else: process = subprocess.Popen(cmd, shell=True) process.wait() def build_env(self, env): if not self.verbose: self.th_Print("Building: " + env.compiler.name + "/" + env.testsuite.name + "/" + env.name) buildCmd = VCD + "/manage --project " + self.manageProject + self.useCI + " --build --level " + env.compiler.name + "/" + env.testsuite.name + " --environment " + env.name self.runManageCmd(buildCmd, env) self.buildSemaphore.release() def doit(self): buildingList = [] for env in self.api.Environment.all(): if env.system_tests: print("Building System Test: " + env.compiler.name + "/" + env.testsuite.name + "/" + env.name) buildCmd = VCD + "/manage --project " + self.manageProject + self.useCI + " --build --level " + env.compiler.name + "/" + env.testsuite.name + " --environment " + env.name self.runManageCmd(buildCmd, env) continue self.buildSemaphore.acquire() t = Thread(target=self.build_env, args=[env]) t.daemon = True # thread dies with the program t.start() buildingList.append(t) checkThreads = True while checkThreads: checkThreads = False for t in buildingList: if t.is_alive(): time.sleep(1) checkThreads = True break
def generate_unit(self): if isinstance(self.api, CoverApi): try: from vector.apps.DataAPI.vcproject_api import VCProjectApi self.start_system_test_file() api = VCProjectApi(self.FullManageProjectName) for env in api.Environment.all(): if env.compiler.name == self.compiler and env.testsuite.name == self.testsuite and env.name == self.env and env.system_tests: for st in env.system_tests: #pprint(vars(st)) pass_fail_rerun = "" if st.run_needed and st.type == 2: #SystemTestType.MANUAL: pass_fail_rerun = ": Manual system tests can't be run in Jenkins" elif st.run_needed: pass_fail_rerun = ": Needs to be executed" elif st.passed: pass_fail_rerun = ": Passed" else: pass_fail_rerun = ": Failed" level = env.compiler.name + "/" + env.testsuite.name + "/" + env.name if self.verbose: print(level, st.name, pass_fail_rerun) self.write_testcase(st, level, st.name) from generate_qa_results_xml import saveQATestStatus saveQATestStatus(self.FullManageProjectName) api.close() except ImportError as e: from generate_qa_results_xml import genQATestResults self.failed_count += genQATestResults( self.FullManageProjectName, self.compiler + "/" + self.testsuite, self.env, True) return else: try: self.start_unit_test_file() self.add_compound_tests() self.add_init_tests() for unit in self.api.Unit.all(): if unit.is_uut: for func in unit.functions: if not func.is_non_testable_stub: for tc in func.testcases: try: vctMap = tc.is_vct_map except: vctMap = False if not tc.is_csv_map and not vctMap: if not tc.for_compound_only or tc.testcase_status == "TCR_STRICT_IMPORT_FAILED": self.write_testcase( tc, tc.function.unit.name, tc.function.display_name) except AttributeError as e: parse_traceback.parse(traceback.format_exc(), self.verbose, self.compiler, self.testsuite, self.env, self.build_dir) self.end_test_results_file()
if args.incremental: useCBT = "--incremental" else: useCBT = "" yaml_start = """stages: [build-execute, reporting, check-logs] variables: GIT_CLEAN_FLAGS: none VC_Manage_Project: "%s" VC_UseCILicense: "%s" VC_useCBT: "%s" """ % (args.ManageProject.replace("\\", "/"), useCI, useCBT) api = VCProjectApi(args.ManageProject) # individual build stages build_stage_template = """%s: stage: build-execute script: """ + script_cmds + """ tags: - %s """ build_stage = "" for env in api.Environment.all(): if env.compiler.is_enabled: jobName = "build-execute-" + env.compiler.name.lower( ) + "-" + env.testsuite.name.lower() + "-" + env.name.lower() build_stage += build_stage_template % (jobName, env.compiler.name,