Include('types.js'); Include('utils.js'); Include('robocopy.js'); var g_robocopy; var g_params; /* */ var g_robocopy; function test_js::ScriptMain() { PrivateData.fnExecScript = TestRemoteExec; SignalThreadSync('TestThreadReady'); ResetSync('TestThreadExit,DoTest'); do { nEvent = WaitForMultipleSyncs('TestThreadExit,DoTest,robocopytest', 0, 0); if (nEvent == 2) { ResetSync('DoTest'); PDtest(g_params); } if (nEvent == 3) { ResetSync('robocopytest'); robocopytest(); } } while(nEvent != 1); delete PrivateData.objPDTest; if (g_robocopy != null) g_robocopy.UnRegister(); LogMsg("TestThread exit"); } function TestRemoteExec(cmd, params) { var vRet = 'ok'; LogMsg("Test received command " + cmd); switch (cmd) { case 'terminate': SignalThreadSync('TestThreadExit'); Sleep(1000); break; case 'lock': TakeThreadLock("foo"); break; case 'test': test(); break; case 'robocopy': SignalThreadSync('robocopytest'); break; case 'pcopy': pcopytest(); break; case 'exec': var pid = RunLocalCommand(params, '', 'Test Program', false, true, false); if (pid == 0) vRet = GetLastRunLocalError(); else vRet = pid; break; case 'exec_noout': var pid = RunLocalCommand(params, '', 'Test Program', false, false, false, false, false); if (pid == 0) vRet = GetLastRunLocalError(); else vRet = pid; break; case 'getoutput': vRet = GetProcessOutput(params); break; case 'send': var args = params.split(','); vRet = SendToProcess(args[0], args[1], ''); break; case 'pdtest': // PrivateData Access test g_params = params; SignalThreadSync('DoTest'); break; case 'build': BuildExeTest(); break; default: vRet = 'invalid command: ' + cmd; } return vRet; } function test_js::OnProcessEvent(pid, evt, param) { NotifyScript('ProcEvent: ', pid+','+evt+','+param); } function DeepCopy(from) { var index; var obj = new Object(); for(index in from) { switch(typeof(from[index])) { case 'number': case 'boolean': obj[index] = from[index]; break; case 'string': obj[index] = (from[index] + "X").slice(0, -1); // make a local copy break; case 'object': if (from[index] != null) { obj[index] = DeepCopy(from[index]); } break; case 'function': LogMsg("Deepcopy - won't copy function " + index); break; case 'undefined': break; default: LogMsg("Deepcopy: Unexpected type: " + typeof(from[index])); break; } } return obj; } var j = 0; function test() { var i; for(i = j; i - j < 50; i++) { LogMsg("MESG " + i ); SignalThreadSync("MESG " + i ); } j = i } function RemoveExtension(strName) { var nDot = strName.lastIndexOf('.'); var nSlash = strName.lastIndexOf('\\'); var nColon = strName.lastIndexOf(':'); if (nDot >= 0 && nDot > nSlash && nDot > nColon) { return strName.slice(0, nDot); } return this; } function pcopytest() //function MakeNumberedBackup(strFileName) { debugger; var index; var strFileName = "E:\\PCopy.log"; var objFS; var strBase; var strExt; var strNewFileName; try { debugger; objFS = new ActiveXObject('Scripting.FileSystemObject'); if (objFS.FileExists(strFileName)) { strBase = RemoveExtension(strFileName); strExt = objFS.GetExtensionName(strFileName); if (strExt > '') strExt = '.' + strExt; index = 1; while ( objFS.FileExists(strBase + index + strExt)) { ++index; } objFS.MoveFile(stdFileName, strBase + index + strExt); } } catch(ex) { LogMsg("an error occurred while executing 'MakeNumberedBackup'\n" + ex.description); throw ex; } } /* StatusProgress() This is called as a RoboCopy member function. We use it to print 1 message per file. */ var nFiles = -5; function StatusProgress(nPercent, nSize, nCopiedBytes) { if (WaitForSync('TestThreadExit', 1) == 1) { LogMsg("ABORTING FILE COPY"); return this.RC_FAIL; } if (nPercent == 0) { if (nFiles ==0) { LogMsg("ABORT CopyFileProgress: " + this.strSrcFile + " is " + nSize + " bytes"); return this.PROGRESS_CANCEL; } nFiles--; LogMsg("CopyFileProgress: " + this.strSrcFile + " is " + nSize + " bytes"); return this.PROGRESS_QUIET; } if (nPercent == 100) LogMsg("CopyFileProgress COMPLETE: " + this.strSrcFile + " is " + nSize + " bytes"); return this.PROGRESS_STOP; return this.PROGRESS_CANCEL; return this.PROGRESS_QUIET; return this.PROGRESS_CONTINUE; } /* StatusError() This is called as a RoboCopy member function. Called when RoboCopy cannot copy a file for some reason. Log the event and continue. */ function StatusError() { // Note, that the paths printed can be inaccurate. // We only know the starting directories and the filename // of the file in question. // Since we may be doing a recursive copy, some of the // path information is not available to us. var strErrDetail = 'Unknown'; if (WaitForSync('TestThreadExit', 1) == 1) { LogMsg("ABORTING FILE COPY"); return this.RC_FAIL; } if (this.nErrorCode == 0 || this.nErrorCode == this.RCERR_RETRYING) return this.RC_CONTINUE; // Eliminate some clutter in the log file. if (this.ErrorMessages[this.nErrorCode]) strErrDetail = this.ErrorMessages[this.nErrorCode]; var strMsg = "CopyBinariesFiles error " + this.nErrorCode + "(" + strErrDetail + ")" + " copying file " + this.strSrcFile + " to " + this.strDstDir; LogMsg(strMsg); // return this.RC_FAIL; return this.RC_CONTINUE; } function StatusMessage(nErrorCode, strErrorMessage, strRoboCopyMessage, strFileName) { var strMsg = "CopyBinariesFiles message (" + nErrorCode + ": " + strErrorMessage + ") " + strRoboCopyMessage + " " + strFileName; LogMsg(strMsg); return this.RC_CONTINUE; } function robocopytest() { try { if (!RoboCopyInit()) { LogMsg("RoboCopyInit() failed"); return false; } g_robocopy.StatusProgress = StatusProgress; g_robocopy.StatusError = StatusError; g_robocopy.StatusMessage = StatusMessage; g_robocopy.CopyDir("C:\\RoboTest1\\", "C:\\RoboTest2\\", true); LogMsg("ROBOCOPY COMPLETED\n"); } catch(ex) { LogMsg("an error occurred while executing 'robocopytest'\n" + ex.description); } } function test_js::OnEventSourceEvent(RemoteObj, DispID, cmd, params) { var objRet = new Object; objRet.rc = 0; try { if (g_robocopy == null || !g_robocopy.OnEventSource(objRet, arguments)) { } } catch(ex) { JAssert(false, "an error occurred in OnEventSourceEvent() \n" + ex); } return objRet.rc; } function PDtest(params) { var aTests = [ "spin", "sleep", "hostrpc", "remoterpc" ] ; var aTests = [ "exec" ]; var nDuration = 10 * 1000; // 10 second test. var i; var nStartTime; var aStart = new Array(); PrivateData.objPDTest = new Object(); ResetSync("starttest,exittest"); for( i = 0; i < aTests.length ; ++i) { SpawnScript('pdtest.js', [aTests[i], nDuration, "starttest" + aTests[i], "exittest"].toString() ); aStart[aStart.length] = "starttest" + aTests[i]; } LogMsg("Test threads created"); for( i = 0; i < aTests.length ; ++i) WaitForSync(aTests[i] + "ThreadReady", 0); LogMsg("Test threads ready"); /*LogMsg("Test access data while threads are idle (ATest)"); nStartTime = (new Date()).getTime(); while ( (new Date()).getTime() - nStartTime < nDuration) { AccessPDTestData(aTests, "ATest"); } */ Sleep(1); for( i = 0; i < aTests.length ; ++i) { LogMsg("Test access data while thread " + aTests[i] + " is busy (BTest)"); SignalThreadSync(aStart[i]); nStartTime = (new Date()).getTime(); while ( (new Date()).getTime() - nStartTime < nDuration) { AccessPDTestData(aTests, "BTest"); } } SignalThreadSync('exittest'); LogMsg("Waiting for threads to exit"); for( i = 0; i < aTests.length ; ++i) WaitForSync(aTests[i] + "ThreadExit", 0); PrivateData.objUtil.fnDumpTimes(); } function AccessPDTestData(aTests, strPrefix) { var i; for( i = 0; i < aTests.length ; ++i) { LogMsg("Attempting to access PrivateData.objPDTest." + aTests[i]); var watch = PrivateData.objUtil.fnBeginWatch(strPrefix + "PrivateData.objPDTest." + aTests[i]); var str = PrivateData.objUtil.fnUneval( PrivateData.objPDTest[aTests[i]]); MyEval(str); watch.Stop(); } } function BuildExeTest() { }