windows-nt/Source/XPSP1/NT/sdktools/mtscript/scripts/test.js
2020-09-26 16:20:57 +08:00

425 lines
10 KiB
JavaScript

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()
{
}