From: <Or...@us...> - 2008-06-03 15:55:31
|
Revision: 204 http://acmcontester.svn.sourceforge.net/acmcontester/?rev=204&view=rev Author: Oracle_ Date: 2008-06-03 08:55:38 -0700 (Tue, 03 Jun 2008) Log Message: ----------- Added test library. Some new abilities was added to TSource. Modified Paths: -------------- ACMServer/branches/sharp tester/SourceTest/SourceTest.cpp ACMServer/branches/sharp tester/SourceTest/SourceTest.h ACMServer/branches/sharp tester/SourceTest.sln ACMServer/branches/sharp tester/tester/Program.cs Modified: ACMServer/branches/sharp tester/SourceTest/SourceTest.cpp =================================================================== --- ACMServer/branches/sharp tester/SourceTest/SourceTest.cpp 2008-06-02 21:41:52 UTC (rev 203) +++ ACMServer/branches/sharp tester/SourceTest/SourceTest.cpp 2008-06-03 15:55:38 UTC (rev 204) @@ -55,40 +55,42 @@ FState=ssNone; FCompPath=gcnew String(""); FRunAll=true; +lib=LoadLibraryA("TestLibrary.dll"); +FSecurity=new TSecure(); init(); } TSource::~TSource() { +if (lib!=NULL) + FreeLibrary(lib); +delete FSecurity; final(); } void TSource::CheckCL() { - HMODULE lib=NULL; try { lock(); - lib=LoadLibrary((LPCWSTR)"CheckCodeLimitDLL"); if (lib==NULL) { if (FSrc->Length>FLim.CodeLimit) - { FCompResult.res=crCL; - FCompResult.Details+="Used std checker for Code Limit\n"; - } + FCompResult.Details+="Used std checker for Code Limit\n"; } else { - TCheckCL prc=(TCheckCL)GetProcAddress(lib,"CheckCL"); - String^ buf; - if (prc(FSrc,buf)) FCompResult.res=crCL; - FCompResult.Details+=buf; + TCheckSrc prc=(TCheckSrc)GetProcAddress(lib,"CheckCL"); + char* buf,*bufA; + if (prc(bufA=StrToArr(FSrc),FLim.CodeLimit,buf)) FCompResult.res=crCL; + FreeArr(bufA); + FCompResult.Details+=gcnew String(buf); + TFreeFunc prc2=(TFreeFunc)GetProcAddress(lib,"FreeChar"); + prc2(buf); } FState=ssCheckedCL; }__finally { - if (lib!=NULL) - FreeLibrary(lib); unlock(); } } @@ -98,7 +100,19 @@ try { lock(); - //MAIN SOURCE + if (lib==NULL) + { + FCompResult.Details+="No checker for DF\n"; + } else + { + TCheckSrc prc=(TCheckSrc)GetProcAddress(lib,"CheckDF"); + char* buf,*bufA; + if (prc(bufA=StrToArr(FSrc),(int)FLang,buf)) FCompResult.res=crDF; + FreeArr(bufA); + FCompResult.Details+=gcnew String(buf); + TFreeFunc prc2=(TFreeFunc)GetProcAddress(lib,"FreeChar"); + prc2(buf); + } FState=ssCheckedDF; }__finally { @@ -273,13 +287,11 @@ TCheckAnsRes TSource::CheckAnswer(int index,String^ output) { - HMODULE lib=NULL; try { lock(); TTest t; LoadTest(index,t); - lib=LoadLibrary((LPCWSTR)"CheckAnswerDLL"); if (lib==NULL) { if (output!=t.output) @@ -287,13 +299,14 @@ return carAC; } else { + char* buf1,*buf2,*buf3; TCheckAnswer prc=(TCheckAnswer)GetProcAddress(lib,"CheckAnswer"); - return prc(t.input,output,t.output); + TCheckAnsRes res=(TCheckAnsRes)prc(buf1=StrToArr(t.input),buf2=StrToArr(output),buf3=StrToArr(t.output)); + FreeArr(buf1);FreeArr(buf2);FreeArr(buf3); + return res; } }__finally { - if (lib!=NULL) - FreeLibrary(lib); unlock(); } } @@ -327,12 +340,9 @@ return FALSE; if (GetLastError() == ERROR_NOT_ALL_ASSIGNED) return FALSE; - return TRUE; } - - void DeletePrivileges(HANDLE proc) { HANDLE hToken; @@ -426,7 +436,7 @@ SetErrorMode(SEM_FAILCRITICALERRORS|SEM_NOALIGNMENTFAULTEXCEPT|SEM_NOGPFAULTERRORBOX|SEM_NOOPENFILEERRORBOX); - if (!CreateProcess(NULL,bufW=StrToArrW(FExePath),NULL,NULL,TRUE,CREATE_SUSPENDED|CREATE_NO_WINDOW,NULL,NULL,&si,&pi)) + if (!FSecurity->RunProcess(bufW=StrToArrW(FExePath),TRUE,CREATE_SUSPENDED|CREATE_NO_WINDOW,&si,&pi)) { FreeArr(bufW); it->points=0; @@ -471,6 +481,9 @@ it->Details="Size of output file excided OutputLimit"; break; } + QueryInformationJobObject(job,JobObjectBasicAccountingInformation,&acc,sizeof(acc),NULL); + if (lib==NULL) + { if ((int)(GetTickCount()-start)>FLim.RealTimeLimit) { TerminateJobObject(job,0); @@ -478,7 +491,6 @@ it->Details="Real time limit"; break; } - QueryInformationJobObject(job,JobObjectBasicAccountingInformation,&acc,sizeof(acc),NULL); if ((acc.ThisPeriodTotalKernelTime.QuadPart+acc.ThisPeriodTotalUserTime.QuadPart)>FLim.TimeLimit*10000) { TerminateJobObject(job,0); @@ -486,6 +498,25 @@ it->Details="Time Limit"; break; } + } else + { + TCheckLim prc=(TCheckLim)GetProcAddress(lib,"CheckTL"); + if (prc((int)(acc.ThisPeriodTotalKernelTime.QuadPart+acc.ThisPeriodTotalUserTime.QuadPart),(int)(FLim.TimeLimit*10000))) + { + TerminateJobObject(job,0); + it->res=trTL; + it->Details="Time Limit"; + break; + } + prc=(TCheckLim)GetProcAddress(lib,"CheckRTL"); + if (prc((int)(GetTickCount()-start),FLim.RealTimeLimit)) + { + TerminateJobObject(job,0); + it->res=trTL; + it->Details="Real time Limit"; + break; + } + } unsigned long len,key; HANDLE proc; @@ -674,5 +705,26 @@ } } +//------------------------------------------------------- +//-------------SECURITY CLASS---------------------------- +//------------------------------------------------------- + +TSecure::TSecure() +{ + +} + +TSecure::~TSecure() +{ + +} + +bool TSecure::RunProcess(LPWSTR lpCommandLine,BOOL bInheritHandles,DWORD dwCreationFlags,LPSTARTUPINFOW lpStartupInfo,LPPROCESS_INFORMATION lpProcessInformation) +{ + if (CreateProcess(NULL,lpCommandLine,NULL,NULL,bInheritHandles,dwCreationFlags,NULL,NULL,lpStartupInfo,lpProcessInformation)) + return true; + return false; +} + }; Modified: ACMServer/branches/sharp tester/SourceTest/SourceTest.h =================================================================== --- ACMServer/branches/sharp tester/SourceTest/SourceTest.h 2008-06-02 21:41:52 UTC (rev 203) +++ ACMServer/branches/sharp tester/SourceTest/SourceTest.h 2008-06-03 15:55:38 UTC (rev 204) @@ -8,7 +8,7 @@ namespace SourceTest { - public ref struct TLimits + public ref struct TLimits { int OutputLimit; int TimeLimit; @@ -181,18 +181,35 @@ public enum TCheckAnsRes { - carAC, //accepted - carWA, //wrong answer - carIE, //internal error - carPE, //presentation error - carOE //output error + carAC=0, //accepted + carWA=1, //wrong answer + carIE=2, //internal error + carPE=3, //presentation error + carOE=4 //output error }; - typedef bool (*TCheckCL)(String^ src,String^ details); - typedef TCheckAnsRes (*TCheckAnswer)(String^ input, String^ output, String^ rightoutput); + public enum TLang + { + lCpp=0, + lPascal=1 + }; + typedef bool (*TCheckSrc)(char* src,int,char*& details); + typedef bool (*TCheckLim)(int,int); + typedef int (*TCheckAnswer)(char* input, char* output, char* rightoutput); + typedef void (*TFreeFunc)(char* buf); + public delegate void TTestHandler(int index, TResult^ res); + private class TSecure + { + private: + public: + TSecure(); + ~TSecure(); + bool RunProcess(LPWSTR lpCommandLine,BOOL bInheritHandles,DWORD dwCreationFlags,LPSTARTUPINFOW lpStartupInfo,LPPROCESS_INFORMATION lpProcessInformation); + }; + public ref class TSource { private: @@ -200,7 +217,7 @@ String^ FExePath; String^ FProblemPath; String^ FCompPath; - String^ FTempPath; //this is the place were temp files will be created + String^ FTempPath; //this is the place where temporary files will be created bool FRunAll; TSourceState FState; TCompResult FCompResult; @@ -208,6 +225,16 @@ TSummary FSummary; TLimits FLim; TTestHandler^ FTestHandler; + TLang FLang; + TSecure *FSecurity; + HMODULE lib; //library that must export: + //bool CheckCL(char* src, int cl, char* details) - must check codelimit + //bool CheckDF(char* src, int lang, char* details) - must check DF + //bool CheckRTL(int usedrealtime, int realtimelimit) - must check RTL + //bool CheckTL(int usedtime, int timelimit) - must check TL + //int CheckAnswer(char* input, char* output, char* rightoutput) - checks WA,OE,PE + //void FreeChar(char* buf); - must free memory used by buf + //if there is no library called TestLibrary.dll then standart check is performed CRITICAL_SECTION* cs; //for multithreading void init() @@ -548,5 +575,37 @@ } } } + + property TLang Language + { + void set(TLang value) + { + try + { + lock(); + if (FState>=ssCheckedDF) + { + throw "Can not set Language if state is higher or equal ssCheckedDF"; + return; + } + FLang=value; + } __finally + { + unlock(); + } + } + + TLang get() + { + try + { + lock(); + return FLang; + }__finally + { + unlock(); + } + } + } }; } Modified: ACMServer/branches/sharp tester/SourceTest.sln =================================================================== --- ACMServer/branches/sharp tester/SourceTest.sln 2008-06-02 21:41:52 UTC (rev 203) +++ ACMServer/branches/sharp tester/SourceTest.sln 2008-06-03 15:55:38 UTC (rev 204) @@ -5,6 +5,8 @@ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "tester", "tester\tester.csproj", "{2D663DAB-3573-4CB6-95A0-2425635CFEC3}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TestLibrary", "TestLibrary\TestLibrary.vcproj", "{2009FCA0-9B13-4D3D-8C89-DDCD3C40E4B4}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -35,6 +37,16 @@ {2D663DAB-3573-4CB6-95A0-2425635CFEC3}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {2D663DAB-3573-4CB6-95A0-2425635CFEC3}.Release|Mixed Platforms.Build.0 = Release|Any CPU {2D663DAB-3573-4CB6-95A0-2425635CFEC3}.Release|Win32.ActiveCfg = Release|Any CPU + {2009FCA0-9B13-4D3D-8C89-DDCD3C40E4B4}.Debug|Any CPU.ActiveCfg = Debug|Win32 + {2009FCA0-9B13-4D3D-8C89-DDCD3C40E4B4}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {2009FCA0-9B13-4D3D-8C89-DDCD3C40E4B4}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {2009FCA0-9B13-4D3D-8C89-DDCD3C40E4B4}.Debug|Win32.ActiveCfg = Debug|Win32 + {2009FCA0-9B13-4D3D-8C89-DDCD3C40E4B4}.Debug|Win32.Build.0 = Debug|Win32 + {2009FCA0-9B13-4D3D-8C89-DDCD3C40E4B4}.Release|Any CPU.ActiveCfg = Release|Win32 + {2009FCA0-9B13-4D3D-8C89-DDCD3C40E4B4}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {2009FCA0-9B13-4D3D-8C89-DDCD3C40E4B4}.Release|Mixed Platforms.Build.0 = Release|Win32 + {2009FCA0-9B13-4D3D-8C89-DDCD3C40E4B4}.Release|Win32.ActiveCfg = Release|Win32 + {2009FCA0-9B13-4D3D-8C89-DDCD3C40E4B4}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE Modified: ACMServer/branches/sharp tester/tester/Program.cs =================================================================== --- ACMServer/branches/sharp tester/tester/Program.cs 2008-06-02 21:41:52 UTC (rev 203) +++ ACMServer/branches/sharp tester/tester/Program.cs 2008-06-03 15:55:38 UTC (rev 204) @@ -30,8 +30,8 @@ s.Close(); c.TempPath = temp; c.TestHandler += new TTestHandler(func); + c.Language = (TLang)1; c.ProcessAll(); - c.State = (TSourceState)6; Console.WriteLine("Compile result: {0}\nCompilation details: {1}\nUsed Time for compile: {2}", TSource.CompileResultToString(c.Summary.compres.res),c.Summary.compres.Details,c.Summary.compres.UsedTime); Console.WriteLine("Test result: {0}", TSource.TestResultToString(c.Summary.res.res)); Console.WriteLine("Points: {0}", c.Summary.res.points); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |