# # created: 5/4/99, a-jbilas # modified: # if (!$__IITBUILDPM ) { use iit::build; } #TODO: <- fix dependencies so only iit::env is needed use Win32::OLE; #################################################################################### # BeginBVT() # Performs startup tasks for beginning a BVT script # a-jbilas, 06/09/99 - created #################################################################################### sub BeginBVT { # our way of doing set local (reset at EndBuild()) $sOldPath = $PATH; $sOldInclude = $INCLUDE; $sOldLib = $LIB; # combine all parameters into one big list of allowed arguments push(@lAllowedArgs, @lAllowedModifiers); push(@lAllowedArgs, @lAllowedLanguages); push(@lAllowedArgs, @lAllowedBuilds); push(@lAllowedArgs, @lAllowedComponents); # parse the args and put the results in @lArgs (ParseArgs also sets $sBVTBuildNumber automagically) BuildAcceleratorLists(); @lArgs = ParseArgs(@_); # much of this stuff is duplicated from BeginBuild() (which we can't use because it does too # many build specific routines) $bNoCopy = IsMemberOf("NOCOPY", @lArgs); $nTimePasses = 10; # if TIME param passed, the average of this number of passes will be recorded $bErrorConcat = 1; # activate manual error handling $strBuildMsg .= "\n"; if (IsMemberOf("VERBOSE", @lArgs)) { $DEBUG = 1; #TODO: change all refs to this flag to $bVerbose $bVerbose = 1; } $bLocal = IsMemberOf("LOCAL", @lArgs); # buildnumber was set by SetLocalGlobalsAndBegin() and/or ParseArgs() if ($sBuildNumber eq "0000") { PrintL("\nNo build number specified, assuming today's build\n", PL_NOLOG); $sBuildNumber = GetBuildNumber(); } if (lc($USERNAME) eq $sOfficialBuildAccount || IsMemberOf("OFFICIAL", @lArgs)) { $bOfficialBuild = 1; $sDropDir =~ s/\\0000\\/\\$sBuildNumber\\/; #set the drop dir location for official build $sLogDropDir =~ s/0000/$sBuildNumber/; #set the drop dir location for official build $sRemoteBuildLog =~ s/0000/$sBuildNumber/; #set the log name for official build $sBuildLog =~ s/0000/$sBuildNumber/; #set the log name for official build if (!IsMemberOf(@lArgs, "QUIET") && IsMemberOf(@lAllowedArgs, "QUIET")) { push(@lArgs, "QUIET"); } } else { $bOfficialBuild = 0; $sDropDir =~ s/$sRootDropDir/$sTestRootDropDir/; $sLogDropDir = $sLogDir; $sRemoteBuildLog = $sBuildLog; $sRootDropDir = $sTestRootDropDir; } @lModifiers = Intersect(*lAllowedModifiers, *lArgs); # intersect the @lArgs with each 'Allowed' list to categorize the parameters we need to support if (IsMemberOf("ALLCOMP", @lModifiers)) { @lComponents = @lAllowedComponents; } else { @lComponents = Intersect(*lAllowedComponents, *lArgs); if (@lComponents == ()) { PrintL("\nNo build types specified, assuming $lAllowedComponents[0] component\n"); @lComponents = ($lAllowedComponents[0]); } } @lBuilds = Intersect(*lAllowedBuilds, *lArgs); if (@lBuilds == ()) { PrintL("\nNo build types specified, assuming $lAllowedBuilds[0] buildtype\n"); @lBuilds = ($lAllowedBuilds[0]); } if (IsMemberOf("ALLLANG", @lModifiers)) { @lLanguages = @lAllowedLanguages; } else { @lLanguages = Intersect(*lAllowedLanguages, *lArgs); if (@lLanguages == () && (@lAllowedLanguages != ())) { PrintL("\nNo languages specified, assuming ".$shtolonglang{lc($lAllowedLanguages[0])}." language\n"); @lLanguages = ($lAllowedLanguages[0]); } } # open the log file # the BVT log name contains the build number (so that multiple builds may be run from the same directory) # leave the BVT log in the current working directory EchoedUnlink($sMailfile, $sVarsLog, $sTyposLog, $sSyncLog, $sUpdateLog, $sBuildLog); $fhBuildLog = StartLog($sBuildLog, 1, ($bOfficialBuild && $bWin98)); OutputHeader($nLoggingMode); if (defined &BeginBVTCustom) { return(BeginBVTCustom() && $rc); } else { return($rc); } } #################################################################################### # EndBVT() # Performs cleanup tasks for ending a BVT script # a-jbilas, 06/09/99 - created #################################################################################### sub EndBVT() { if (defined &EndBVTCustom) { EndBVTCustom(); } OutputFooter($nLoggingMode); $strBuildMsg .= "<\/body>"; if ($nBVTFailureCount) { print("\nOne or more BVTs failed\n"); } else { print("\nAll BVTs PASS!\n"); } $fhMailFile = OpenFile($sMailfile, "write"); if ($fhMailFile) { my($tmpBuildMsg) = $strBuildMsg; my($replStr) = "

".$sBuildName." ".BuildCodeToHTML($bcStatus)."<\/b>". " - Log<\/a><\/font>

"; $strBuildMsg =~ s/<\! $sShortBuildName $nScriptStartTime SUMMARY ENTRY POINT >/$replStr/; $fhMailFile->print($strBuildMsg); CloseFile($fhMailFile); $strBuildMsg = $tmpBuildMsg; } CloseFile($fhBuildLog); if ($nLoggingMode == 2) { InsertSummaryIntoLog($sBuildLog); } if (!$bNoCopy && ($sRemoteBuildLog ne "") & $bOfficialBuild) { if (!CopyLogs()) { PrintL("Warning: ".$sShortBuildName." log failed to copy\n", PL_MSGONLY); } } if (!$bOfficialBuild && !IsMemberOf("QUIET", @lArgs)) { PrintL("\n - Launching BVT log (use 'QUIET' option next time to skip)\n"); Execute($sBuildLog); PrintL("\n"); } } sub StartLog($;$$) { my($logname, $useDHTML, $updateTOC) = @_; $fhNewLog = OpenFile($_[0], "write"); if (!$fhNewLog) { PrintL("Could not open ".$logname.", logging for this session will be disabled\n\n", PL_BIGERROR); return(""); } elsif ($useDHTML) { $fhNewLog->print(GetAllTextFromFile($sDHTMLIncFile)."\n\n\n"); if ($strBuildMsg !~ //) { PrintL("".GetAllTextFromFile($sDHTMLIncFile) ."", PL_MSGONLY); } $bDHTMLActive = 1; if ($_[2]) { UpdateLogTOC($sRemoteTOC, $sBuildLog); } } return($fhNewLog); } #################################################################################### # DoBVTs() # Do the BVTs # a-jbilas, 06/09/99 - created #################################################################################### sub DoBVTs { # define and categorize all supported parameters # each category must have at least one option selected to run a BVT (except @lAllowedModifiers and @lAllowedLanguages)) SetBVTDependentVars(); # we really shouldn't be calling this yet, but we need to init the component list foreach $component (keys(%hStandardBVTs)) { push(@lAllowedComponents, $component); } %hOptionDescription = (%hOptionDescription, # <----------------------------- SCREEN WIDTH -------------------------------------> ("Local" => " get files from local SLM project"), ("SMoke" => " include smoketests - smoketests failures will not fail runbvt"), ("SMokeOnly" => "run only smoketests - smoketests failures will fail runbvt")); $sBuildName = "BVT"; $nBVTFailureCount = 0; $sExcelPerfDoc = $sLogDropDir."\\performance\\".$sShortBuildName."perf.xls"; $sExcelPerfDocWWW = $sLogDropDir."\\performance\\".$sShortBuildName."perf.recorded.xls"; local($bLocal) = 0; # use local copies of files (see hash table above) BeginBVT(@_); if (@lLanguages == ()) { @lLanguages = (""); } # run the BVTs foreach $language (@lLanguages) { foreach $component (@lComponents) { foreach $buildType (@lBuilds) { my($bBVTRC) = 1; if (!IsMemberOf("SMOKEONLY", @lArgs)) { $bBVTRC = RunBVTSingle(\%hStandardBVTs, $component, $shtolonglang{lc($language)}, $buildType); } if (($bBVTRC && IsMemberOf("SMOKE", @lArgs)) || IsMemberOf("SMOKEONLY", @lArgs)) { my($ret) = RunBVTSingle(\%hSmokeBVTs, $component, $shtolonglang{lc($language)}, $buildType); if (!$ret && IsMemberOf("SMOKEONLY", @lArgs)) { $bBVTRC = 0; } } if (!$bBVTRC) { $bcStatus |= BC_FAILED; } } } } EndBVT(); return(!($bcStatus & BC_FAILED)); } sub RunBVTSingle { # shared 'global' variables between build functions local($hConfig, $sBVTComponent, $sBVTLanguage, $sBVTType) = @_; local($sBVTBuildNumber) = $sBuildNumber; local($bCopyFailed) = 0; local($nDiffNumber) = 0; local($rc) = 1; local($sShBVTLanguage) = $longtoshlang{lc($sBVTLanguage)}; local(@lNeededFiles) = (); #files that are needed to run BVT local(@lCopiedFiles) = (); #needed files that were copied to run BVT ResetError(); # reset the error buffer $strLanguage = $sShBVTLanguage; # BVTCompare() support if ($sBVTBuildNumber eq GetBuildNumber()) { $sBVTBuildNumber = GetBuildNumber($hConfig->{$sBVTComponent}->{"BuildStartYear"}); } SetBVTDependentVars(); # just to make refs a bit less painful (for new refs: hComponent->{"Element"}) local(*hComponent) = $hConfig->{$sBVTComponent}; $sDropDir = hComponent->{"RemoteSrcDir"}; # check to see if we should attempt to run the BVT if ($hConfig->{$sBVTComponent} eq "") { PrintL("Component does not exist: ".$sBVTComponent, PL_VERBOSE); return(1); } if ((!IsMemberOf($sShBVTLanguage, split(/ +/, hComponent->{"Languages"}))) && (split(/ +/, hComponent->{"Languages"}) != ())) { PrintL("\nLanguage ".$sBVTLanguage." not supported for component ".hComponent->{"Name"}." skipping BVT\n\n", PL_VERBOSE); return(1); # do not error } if (!$bLocal && !$bNoCopy && ($sDropDir ne "") && !IsDirectory($sDropDir)) { PrintL(hComponent->{"Name"}." ".$sBVTLanguage." ".$sBVTType." build #".$sBVTBuildNumber ." does not exist on server, cannot process BVT\n", PL_BIGWARNING); PrintMsgBlock($sDropDir." does not exist\n"); return(1); # new behavior (06/99) -> don't fail the bvt if not exist (sometimes we don't build on purpose) } PrintL("\n".hComponent->{"Name"}." BVT (".$sBVTLanguage." ".$sBVTType.", Build #".$sBVTBuildNumber. ($bLocal ? " *LOCAL*" : "").")\n", PL_SUBHEADER); PrintL(("-" x 80)."\n\n", PL_SUBHEADER); BEGIN_DHTML_NODE("(click to expand)"); $bNothingDone = 0; # (we're starting to do stuff) if ($bcStatus & BC_NOTHINGDONE) { $bcStatus -= BC_NOTHINGDONE; } # ************************* COPY PHASE ************************* # build a list of our current component's needed files my($rc) = 1; if ($bLocal && !$bNoCopy) { foreach $file (split(/ +/, hComponent->{"LocalInputFiles"})) { push(@lNeededFiles, $PROJROOT."\\".$file); } foreach $file (split(/ +/, hComponent->{"SLMInputFiles"})) { push(@lNeededFiles, $PROJROOT."\\".$file); } foreach $file (split(/ +/, hComponent->{"ExternalFiles"})) { push(@lNeededFiles, $file); } foreach $file (@lNeededFiles) { # if the file is already there, use the existing one; if not, copy and remember it # so that we can delete it later if (!-e RemovePath($file)) { $rc = EchoedCopy($file) && $rc; SetReadOnly(RemovePath($file), 0); push(@lCopiedFiles, $file); } else { PrintL("Using local copy of ".RemovePath($file)." (delete to run clean BVT)\n", PL_WARNING); } } } elsif (!$bNoCopy) { foreach $file (split(/ +/, hComponent->{"RemoteInputFiles"})) { push(@lNeededFiles, hComponent->{"RemoteSrcDir"}."\\".$file); } foreach $file (split(/ +/, hComponent->{"SLMInputFiles"})) { if (-e $sArchivedSrcDir."\\".$sBVTBuildNumber."\\".$file) { push(@lNeededFiles, $sArchivedSrcDir."\\".$sBVTBuildNumber."\\".$file); } else { push(@lNeededFiles, $sSLMServerRoot."\\".$file); } } foreach $file (split(/ +/, hComponent->{"ExternalFiles"})) { push(@lNeededFiles, $file); } foreach $file (@lNeededFiles) { if (!-e RemovePath($file)) { $rc = EchoedCopy($file) && $rc; SetReadOnly(RemovePath($file), 0); push(@lCopiedFiles, $file); } else { PrintL("Warning: Using local copy of ".$file." (delete to run clean BVT)\n", PL_WARNING); } } } # ************************* BVT-EXECUTION PHASE ************************* my $startTime = time(); if ($rc) { foreach $component (keys(%$hConfig)) { if ($sBVTComponent eq $component) { local(*BVTFunction) = hComponent->{"Function"}; $rc = BVTFunction(); } } } my($bvtTime) = FmtDeltaTime(time() - $startTime); if (!$rc) { ++$nBVTFailureCount; } # backup failed BVT files in subdir for future reference if (!$rc && !$bNoCopy) { PrintL("\n".'BVT failed, saving BVT failure src files in '.cwd().'\BVTFail'.$nBVTFailureCount."\n\n", PL_ERROR); Delnode('BVTFail'.$nBVTFailureCount); EchoedMkdir('BVTFail'.$nBVTFailureCount); foreach $file (@lNeededFiles) { if (-e RemovePath($file)) { EchoedCopy(RemovePath($file), 'BVTFail'.$nBVTFailureCount."\\".RemovePath($file)); } else { PrintL("Warning: ".RemovePath($file)." in \@lNeededFiles does not exist, clean up your list\n", PL_WARNING | PL_VERBOSE); } } foreach $file (split(/ +/, hComponent->{"OutputFiles"})) { if (-e RemovePath($file)) { EchoedCopy(RemovePath($file), 'BVTFail'.$nBVTFailureCount."\\".RemovePath($file)); } else { PrintL("Warning: ".RemovePath($file)." in \"OutputFiles\" does not exist, clean up your list\n", PL_WARNING | PL_VERBOSE); } } } # ************************* CLEAN-UP PHASE ************************* if (!$bNoCopy) { foreach $file (@lCopiedFiles) { if (RemovePath($file) !~ /(\\|\/)/i) # just to make sure (we don't want to delete anything off the servers) { EchoedUnlink(RemovePath($file)); } } foreach $file (split(/ +/, hComponent->{"OutputFiles"})) { EchoedUnlink($file); } } END_DHTML_NODE(); PrintL("\n"); if ($rc) { PrintLTip($sBVTLanguage." ".hComponent->{"Name"}." ".ucfirst(lc($sBVTType))." BVT Succeeded\n\n", "BVT Execution Time: ".$bvtTime, PL_MSG | PL_GREEN | PL_FLUSH); if ($ERROR ne "") { PrintMsgBlock($ERROR); } } else { PrintLTip($sBVTLanguage." ".hComponent->{"Name"}." ".ucfirst(lc($sBVTType))." BVT FAILED\n\n", "BVT Execution Time: ".$bvtTime, PL_BIGERROR | PL_FLUSH); PrintMsgBlock($ERROR); } return($rc); } $__NLGBVTPM = 1; 1;