384 lines
9.8 KiB
C++
384 lines
9.8 KiB
C++
|
// SacRunner.cpp : Defines the entry point for the console application.
|
||
|
//
|
||
|
|
||
|
#include "inclfile.h"
|
||
|
|
||
|
#include "..\SacCommunicator\SacCommunicator.h"
|
||
|
|
||
|
#include "ntlog.hxx"
|
||
|
|
||
|
#define BUFFER_SIZE 1024
|
||
|
|
||
|
LPCTSTR g_vConnectionParams[]= {"COM1", "9600", "8", "0", "1"};
|
||
|
|
||
|
BOOL g_bVerbose = FALSE;
|
||
|
|
||
|
LPCTSTR g_szInputFileName= NULL;
|
||
|
LPCTSTR g_szRespDir = NULL;
|
||
|
|
||
|
LPCTSTR g_szLogFileName = NULL;
|
||
|
LPCTSTR g_szNtLogFile = NULL;
|
||
|
LPCTSTR g_szBvtLogFile = NULL;
|
||
|
|
||
|
CNtLog g_ntlogLogger;
|
||
|
|
||
|
UINT g_nPassTotal= 0, g_nFailTotal= 0;
|
||
|
|
||
|
BOOL WriteBvtLog(LPCTSTR szBvtLogFile, double ratioPassLimit, UINT nPassTotal, UINT nFailTotal, time_t tmStart, time_t tmFinish)
|
||
|
{
|
||
|
fstream f(szBvtLogFile, std::ios::out);
|
||
|
|
||
|
if (!f.is_open())
|
||
|
return FALSE;
|
||
|
|
||
|
LPCTSTR vTestResults[]= {_T("NOCONFIG"), _T("PASS"), _T("FAIL")};
|
||
|
int nTestResult= !(nPassTotal||nFailTotal) ? 0 : (nPassTotal/(nPassTotal+nFailTotal)<ratioPassLimit)+1;
|
||
|
|
||
|
f<<"[TESTRESULT]\n";
|
||
|
f<<"\tTEST: Basic Sac Stress\n";
|
||
|
f<<"\tRESULT: "<<vTestResults[nTestResult]<<'\n';
|
||
|
f<<"\tCONTACT: ahmedt\n";
|
||
|
f<<"\tPM CONTACT: pasquale\n";
|
||
|
f<<"\tDEV PRIME: adamba\n";
|
||
|
f<<"\tDEV ALT: adamba\n";
|
||
|
f<<"\tTEST PRIME: ahmedt\n";
|
||
|
f<<"\tTEST ALT: rgeorge\n";
|
||
|
|
||
|
struct tm *ptminfoStart, *ptminfoFinish, tminfoStart, tminfoFinish;
|
||
|
ptminfoStart= localtime(&tmStart);
|
||
|
tminfoStart= *ptminfoStart;
|
||
|
|
||
|
ptminfoFinish= localtime(&tmFinish);
|
||
|
tminfoFinish= *ptminfoFinish;
|
||
|
|
||
|
f<<"\tSTART TIME:\t\t"<<tminfoStart.tm_mon<<'/'<<tminfoStart.tm_mday<<'/'<<tminfoStart.tm_year<<' '<<tminfoStart.tm_hour<<':'<<tminfoStart.tm_min<<':'<<tminfoStart.tm_sec<<'\n';
|
||
|
f<<"\tEND TIME:\t\t"<<tminfoFinish.tm_mon<<'/'<<tminfoFinish.tm_mday<<'/'<<tminfoFinish.tm_year<<' '<<tminfoFinish.tm_hour<<':'<<tminfoFinish.tm_min<<':'<<tminfoFinish.tm_sec<<'\n';
|
||
|
|
||
|
|
||
|
f<<"\n\t[Detailed Results]\n";
|
||
|
f<<"\t\tPass Count:"<< g_nPassTotal<<'\n';
|
||
|
f<<"\t\tFail Count:"<< g_nFailTotal<<'\n';
|
||
|
f<<"\t\t\tFor more info check the command log-file: "<< g_szLogFileName<<'\n';
|
||
|
f<<"\t[/Detailed Results]\n\n";
|
||
|
|
||
|
|
||
|
f<<"[/TESTRESULT]\n";
|
||
|
|
||
|
f.close();
|
||
|
|
||
|
return TRUE;
|
||
|
|
||
|
}
|
||
|
|
||
|
BOOL RunSac(LPCTSTR szFileName, int nCommPortId, DCB dcb, BOOL b2Screen, LPCTSTR szLogfileName= NULL, LPCSTR szResponseDir= NULL, LPCTSTR szNtLogFile= NULL)
|
||
|
{
|
||
|
fstream f(szFileName, std::ios::in); // opening file
|
||
|
if (!f.is_open()) // checking if open
|
||
|
return FALSE; // cannot open input file then we have nothing to do
|
||
|
|
||
|
fstream log_f; // log file
|
||
|
BOOL bLog; // whether to log or not
|
||
|
if (szLogfileName&&*szLogfileName) // if name supplied
|
||
|
log_f.open(szLogfileName, std::ios::out); // open file
|
||
|
|
||
|
bLog= log_f.is_open(); // only can log if log file is open
|
||
|
|
||
|
CSacCommunicator SacCl(nCommPortId, dcb); // creating a sac client
|
||
|
|
||
|
if (!SacCl.Connect()) // connecting to sac
|
||
|
{
|
||
|
log_f.close();
|
||
|
f.close();
|
||
|
return FALSE; // cannot init connection
|
||
|
}
|
||
|
// file is open if we r here and connected to port
|
||
|
|
||
|
BOOL bNtLog; // whether or not having an nt log
|
||
|
|
||
|
if (bNtLog= szNtLogFile!=NULL) // in order for that a file name has to be supplied
|
||
|
{
|
||
|
bNtLog= g_ntlogLogger.Init(szNtLogFile); // and intialization has to succeed so as to be able to log
|
||
|
|
||
|
if (bNtLog)
|
||
|
g_ntlogLogger.AttachThread();
|
||
|
}
|
||
|
|
||
|
|
||
|
// poke sac
|
||
|
if (!SacCl.SacCommand( SAC_STR("\r") ))
|
||
|
return FALSE;
|
||
|
|
||
|
int nLineNo= 0;
|
||
|
while (!f.eof())
|
||
|
{
|
||
|
++nLineNo; // another line
|
||
|
|
||
|
if (b2Screen)
|
||
|
std::cout<<"Line: "<<nLineNo<<'\n'; // echo line #
|
||
|
|
||
|
|
||
|
TCHAR szStaticBuffer[BUFFER_SIZE]; // reading buffer
|
||
|
LPTSTR szBuffer;
|
||
|
|
||
|
szBuffer= szStaticBuffer;
|
||
|
f.getline(szBuffer, BUFFER_SIZE-1); // reading line taking into consideration the \r appended later
|
||
|
|
||
|
|
||
|
while (*szBuffer==' '||*szBuffer=='\t')
|
||
|
szBuffer++; // eat white
|
||
|
|
||
|
if (!*szBuffer||*szBuffer=='#'||*szBuffer=='\r'||*szBuffer=='\n') // skip empty lines
|
||
|
{
|
||
|
if (b2Screen)
|
||
|
std::cout<<"\tline skipped!!"<<std::endl;
|
||
|
|
||
|
continue; // a comment or an empty line
|
||
|
}
|
||
|
|
||
|
int i= 0;
|
||
|
while (szBuffer[i]!='\0'&&szBuffer[i]!=':')
|
||
|
{
|
||
|
if (!_tcsncmp(szBuffer+i, _T("\\\\"), 2))
|
||
|
break; // rest of line comment
|
||
|
|
||
|
i++;
|
||
|
}
|
||
|
|
||
|
int nCount= 1; // default count is 1
|
||
|
if (szBuffer[i]==':') // if count present
|
||
|
{
|
||
|
int j= 1;
|
||
|
while (szBuffer[i+j]!='\0')
|
||
|
{
|
||
|
if (!_tcsncmp(szBuffer+i+j, _T("//"), 2))
|
||
|
break;
|
||
|
j++;
|
||
|
}
|
||
|
|
||
|
szBuffer[i+j]= '\0';
|
||
|
|
||
|
nCount= _ttoi(szBuffer+i+1); // get count
|
||
|
szBuffer[i]='\0'; // remove it from string
|
||
|
}
|
||
|
|
||
|
for (i= _tcslen(szBuffer); i>0&&(szBuffer[i-1]==' '||szBuffer[i-1]=='\t'); i--)
|
||
|
;
|
||
|
|
||
|
szBuffer[i]='\0';
|
||
|
|
||
|
_tcscat(szBuffer, _T("\r")); // append CR
|
||
|
|
||
|
for (i= 0; i<nCount; i++)
|
||
|
{
|
||
|
BOOL bSuccess;
|
||
|
SacString strResponse;
|
||
|
|
||
|
if (!_tcscmp(szBuffer, "Paging Off\r")) // look for special command
|
||
|
bSuccess= SacCl.PagingOff(strResponse);
|
||
|
else
|
||
|
bSuccess= SacCl.SacCommand(szBuffer, strResponse, FALSE, 5000);
|
||
|
|
||
|
g_nPassTotal+= bSuccess;
|
||
|
g_nFailTotal+= !bSuccess;
|
||
|
|
||
|
|
||
|
if (szResponseDir) // if output dir specified
|
||
|
{
|
||
|
TCHAR szResponseFileBuf[BUFFER_SIZE];
|
||
|
|
||
|
_tcscpy(szResponseFileBuf, szResponseDir);
|
||
|
sprintf(szResponseFileBuf+_tcslen(szResponseFileBuf), "\\L%d_C%d.out", nLineNo, i);
|
||
|
|
||
|
fstream out_f(szResponseFileBuf, std::ios::out);
|
||
|
if (out_f.is_open())
|
||
|
out_f<<strResponse.data(); // log out
|
||
|
|
||
|
out_f.close(); // close out file
|
||
|
}
|
||
|
|
||
|
|
||
|
LPCTSTR vstrStatus[]= { _T("FAILURE"), _T("SUCCESS") }; // status string vector
|
||
|
|
||
|
if (b2Screen)
|
||
|
std::cout<<"\tCount: "<<i+1<< " -> "<< vstrStatus[bSuccess]<< std::endl; // report 2 screen
|
||
|
|
||
|
if (bLog)
|
||
|
{
|
||
|
log_f<< "Line["<< nLineNo<< "]\\ Count[" <<i+1<<"]-> Command: ";
|
||
|
log_f<< szBuffer<< "\tStatus: "<< vstrStatus[bSuccess]<< std::endl; // report to log file
|
||
|
}
|
||
|
|
||
|
if (bNtLog)
|
||
|
if (bSuccess)
|
||
|
if (strResponse.length())
|
||
|
g_ntlogLogger.Pass("Sac Responded -> L[%d], C[%d]: %s", nLineNo, i, szBuffer);
|
||
|
else
|
||
|
g_ntlogLogger.Warn("Sac NIL Response -> L[%d], C[%d]: %s", nLineNo, i, szBuffer);
|
||
|
else
|
||
|
g_ntlogLogger.Fail("Sac Communication Failed -> L[%d], C[%d]: %s", nLineNo, i, szBuffer);
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// finally
|
||
|
goto Terminate;
|
||
|
Terminate:
|
||
|
SacCl.Disconnect(); // close connection
|
||
|
log_f.close(); // close general log
|
||
|
f.close(); // close input file
|
||
|
|
||
|
if (bNtLog)
|
||
|
{
|
||
|
g_ntlogLogger.DetachThread();
|
||
|
g_ntlogLogger.Close();
|
||
|
}
|
||
|
|
||
|
|
||
|
return TRUE; // that's it
|
||
|
}
|
||
|
|
||
|
BOOL GetArgs(int argc, LPTSTR argv[], LPCTSTR szErrBuffer= NULL)
|
||
|
{
|
||
|
|
||
|
if (*argv[1]!='-'&&*argv[1]!='/')
|
||
|
g_szInputFileName= argv[1];
|
||
|
|
||
|
for (int i= 1; i<argc; i++)
|
||
|
{
|
||
|
if (*argv[i]=='-'||*argv[i]=='/')
|
||
|
switch (*(argv[i]+1))
|
||
|
{
|
||
|
case 'I':
|
||
|
if (*(argv[i]+2))
|
||
|
g_szInputFileName= argv[i]+2;
|
||
|
else
|
||
|
g_szInputFileName= argv[++i];
|
||
|
break;
|
||
|
case 'V':
|
||
|
if (!*(argv[i]+2))
|
||
|
g_bVerbose= TRUE;
|
||
|
else
|
||
|
return FALSE;
|
||
|
|
||
|
break;
|
||
|
case 'L':
|
||
|
if (*(argv[i]+2))
|
||
|
g_szLogFileName= argv[i]+2;
|
||
|
else
|
||
|
g_szLogFileName= argv[++i];
|
||
|
break;
|
||
|
case 'N':
|
||
|
if (!_tcsncmp(argv[i]+2, _T("TL"), 2))
|
||
|
if (*(argv[i]+4))
|
||
|
g_szNtLogFile= argv[i]+4;
|
||
|
else
|
||
|
g_szNtLogFile= argv[++i];
|
||
|
break;
|
||
|
case 'B':
|
||
|
if (!_tcsncmp(argv[i]+2, _T("VTL"), 2))
|
||
|
if (*(argv[i]+5))
|
||
|
g_szBvtLogFile= argv[i]+4;
|
||
|
else
|
||
|
g_szBvtLogFile= argv[++i];
|
||
|
break;
|
||
|
case 'D':
|
||
|
if (*(argv[i]+2))
|
||
|
g_szRespDir= argv[i]+2;
|
||
|
else
|
||
|
g_szRespDir= argv[++i];
|
||
|
break;
|
||
|
case 'C': // -C 9600, 8,N, 1
|
||
|
// TCHAR* pCurr= *(argv[i]+2)? (argv[i]+2) : argv[++i];
|
||
|
TCHAR* pCurr= argv[i]+2;
|
||
|
|
||
|
for (int j= 0; j<4; j++)
|
||
|
{
|
||
|
int k;
|
||
|
|
||
|
if (!*pCurr)
|
||
|
pCurr= argv[++i];
|
||
|
|
||
|
for (k= 0; pCurr[k]&&pCurr[k]!=','; )
|
||
|
k++;
|
||
|
|
||
|
pCurr[k]= '\0';
|
||
|
|
||
|
g_vConnectionParams[j]= pCurr;
|
||
|
|
||
|
pCurr+= k+1;
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
int __cdecl main(int argc, char* argv[])
|
||
|
{
|
||
|
DCB dcb;
|
||
|
|
||
|
GetArgs(argc, argv);
|
||
|
|
||
|
if (!g_szInputFileName)
|
||
|
{
|
||
|
std::cout<< "Erorr: no input file name supplied"<< std::endl;
|
||
|
return !0;
|
||
|
}
|
||
|
|
||
|
std::cout<< "attempting to run w/ following options:"<< std::endl;
|
||
|
|
||
|
if (g_szLogFileName)
|
||
|
std::cout<< "logging to: "<< g_szLogFileName<< '\n';
|
||
|
else
|
||
|
std::cout<< "no log filename supplied, logging truned off\n";
|
||
|
|
||
|
if (g_szNtLogFile)
|
||
|
std::cout<< "nt log will be written to: "<< g_szLogFileName<< ".*\n";
|
||
|
else
|
||
|
std::cout<< "no nt-log filename supplied, nt-logging truned off\n";
|
||
|
|
||
|
if (g_szRespDir)
|
||
|
std::cout<< "sac output files will be located in: "<< g_szRespDir<< "\\\n";
|
||
|
else
|
||
|
std::cout<< "no directory specified for sac output files, using current\n";
|
||
|
|
||
|
if (g_bVerbose)
|
||
|
std::cout<< "running verbose...\n";
|
||
|
else
|
||
|
std::cout<< "running non-verbose...\n";
|
||
|
|
||
|
std::cout<<std::endl;
|
||
|
|
||
|
for (int i= 0; CSacCommunicator::s_vctrCommPorts[i]; i++)
|
||
|
if (!_tcscmp(CSacCommunicator::s_vctrCommPorts[i], g_vConnectionParams[0]))
|
||
|
break;
|
||
|
|
||
|
int nCommPort= i;
|
||
|
|
||
|
BuildCommDCB( CSacCommunicator::s_vctrCommPorts[nCommPort], &dcb);
|
||
|
dcb.BaudRate = _ttoi(g_vConnectionParams[1]); // set the baud rate
|
||
|
dcb.ByteSize = (BYTE) _ttoi(g_vConnectionParams[2]); // data size, xmit, and rcv
|
||
|
dcb.Parity = (BYTE) _ttoi(g_vConnectionParams[3]); // parity bit
|
||
|
dcb.StopBits = (BYTE) _ttoi(g_vConnectionParams[4]); // one stop bit
|
||
|
|
||
|
time_t tmStart, tmFinish;
|
||
|
BOOL bTestResult;
|
||
|
time(&tmStart);
|
||
|
bTestResult= RunSac(g_szInputFileName, nCommPort, dcb, g_bVerbose, g_szLogFileName, g_szRespDir, g_szNtLogFile);
|
||
|
time(&tmFinish);
|
||
|
|
||
|
if (bTestResult)
|
||
|
{
|
||
|
WriteBvtLog(g_szBvtLogFile, 0.5, g_nPassTotal, g_nFailTotal, tmStart, tmFinish);
|
||
|
std::cout<< "\nTEST RESULT: SUCCEEDED!!!\n";
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
WriteBvtLog(g_szBvtLogFile, 0.5, 0, 0, tmStart, tmFinish);
|
||
|
std::cout<< "\nTEST RESULT: NOCONFIG | FAILED!!!\n";
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|