sl@0: /* sl@0: * Copyright (c) 1998-2009 Nokia Corporation and/or its subsidiary(-ies). sl@0: * All rights reserved. sl@0: * This component and the accompanying materials are made available sl@0: * under the terms of the License "Eclipse Public License v1.0" sl@0: * which accompanies this distribution, and is available sl@0: * at the URL "http://www.eclipse.org/legal/epl-v10.html". sl@0: * sl@0: * Initial Contributors: sl@0: * Nokia Corporation - initial contribution. sl@0: * sl@0: * Contributors: sl@0: * sl@0: * Description: sl@0: * sl@0: */ sl@0: sl@0: sl@0: #include "SyntaxTest.h" sl@0: #include "wtlscert.h" sl@0: #include "t_input.h" sl@0: sl@0: TInt CSyntaxTest::nInstances = 0; sl@0: _LIT(KSyntaxLogFile, "X509SyntaxLog.txt"); sl@0: _LIT(KPathStart, ""); sl@0: sl@0: ////////////////////////////////////////////////////////////////////// sl@0: // Construction/Destruction sl@0: ////////////////////////////////////////////////////////////////////// sl@0: sl@0: CTestAction* CSyntaxTest::NewL(RFs& aFs, CConsoleBase& aConsole, sl@0: Output& aOut, const TTestActionSpec& aTestActionSpec) sl@0: { sl@0: CTestAction* self = CSyntaxTest::NewLC(aFs, aConsole, aOut, aTestActionSpec); sl@0: CleanupStack::Pop(self); sl@0: return self; sl@0: } sl@0: sl@0: CTestAction* CSyntaxTest::NewLC(RFs& aFs, CConsoleBase& aConsole, sl@0: Output& aOut, const TTestActionSpec& aTestActionSpec) sl@0: { sl@0: CSyntaxTest* self = new(ELeave) CSyntaxTest(aFs, aConsole, aOut); sl@0: CleanupStack::PushL(self); sl@0: self->ConstructL(aTestActionSpec); sl@0: return self; sl@0: } sl@0: sl@0: CSyntaxTest::CSyntaxTest(RFs& aFs, sl@0: CConsoleBase& aConsole, sl@0: Output& aOut) sl@0: : CTestAction(aConsole, aOut), iFs(aFs) sl@0: { sl@0: nFileNumber = 0; sl@0: } sl@0: sl@0: CSyntaxTest::~CSyntaxTest(void) sl@0: { sl@0: delete iDirList; sl@0: delete iSyntaxOut; sl@0: iLogFile.Close(); sl@0: delete iWriter; sl@0: iExpectedResults->ResetAndDestroy(); sl@0: delete iExpectedResults; sl@0: }; sl@0: sl@0: void CSyntaxTest::ConstructL(const TTestActionSpec& aTestActionSpec) sl@0: { sl@0: CTestAction::ConstructL(aTestActionSpec); sl@0: sl@0: if(nInstances==0) sl@0: { sl@0: nInstances++; sl@0: HBufC* body = HBufC::NewLC(aTestActionSpec.iActionBody.Length()); sl@0: iExpectedResults = new (ELeave)RPointerArray; sl@0: body->Des().Copy(aTestActionSpec.iActionBody); sl@0: TPtrC chainBuf = Input::ParseElement(*body, KPathStart); sl@0: iPath.Copy(chainBuf); sl@0: CleanupStack::PopAndDestroy(); sl@0: User::LeaveIfError(iLogFile.Replace(iFs,KSyntaxLogFile,EFileWrite)); sl@0: iSyntaxOut = new(ELeave) FileOutput(iLogFile); sl@0: iWriter = new(ELeave) CertWriter(iSyntaxOut); sl@0: LoadResultsL(); sl@0: } sl@0: else sl@0: { sl@0: SetScriptError(ESyntax, _L("Only one syntax test can be run in each script")); sl@0: iFinished = ETrue; sl@0: } sl@0: } sl@0: sl@0: TBool CSyntaxTest::LoadResultsL() sl@0: { sl@0: RFile resultsFile; sl@0: TFileName fullPath; sl@0: TInt err, fileSize; sl@0: HBufC8 *fileInfo; sl@0: sl@0: fullPath.Append(iPath); sl@0: fullPath.Append(KResultsFile); sl@0: sl@0: err = resultsFile.Open(iFs, fullPath, EFileRead); sl@0: if (err != KErrNone) sl@0: { sl@0: iConsole.Printf(_L("Error opening results file : ")); sl@0: iConsole.Printf(fullPath); sl@0: iConsole.Printf(_L("\n")); sl@0: return(EFalse); sl@0: } sl@0: sl@0: CleanupClosePushL(resultsFile); sl@0: resultsFile.Size(fileSize); sl@0: CleanupStack::PopAndDestroy(); // resultsFile sl@0: sl@0: fileInfo = HBufC8::NewLC(fileSize); sl@0: TPtr8 fileInfoPtr(fileInfo->Des()); sl@0: fileInfoPtr.SetLength(fileSize); sl@0: sl@0: RFileReadStream fileStream; sl@0: User::LeaveIfError(fileStream.Open(iFs, fullPath, EFileStream)); sl@0: CleanupClosePushL(fileStream); sl@0: fileStream.ReadL(fileInfoPtr, fileSize); sl@0: sl@0: TLex8 theLex(fileInfoPtr); sl@0: CSyntaxResult *syntaxResult = NULL; sl@0: sl@0: do sl@0: { sl@0: syntaxResult = CSyntaxResult::NewLC(); sl@0: syntaxResult->SetFilename(theLex.NextToken()); sl@0: syntaxResult->SetResult(theLex.NextToken()); sl@0: iExpectedResults->Append(syntaxResult); sl@0: CleanupStack::Pop(); // syntaxResult sl@0: } sl@0: while(!theLex.Eos()); sl@0: sl@0: CleanupStack::PopAndDestroy(2); // fileinfo & fileStream sl@0: return(ETrue); sl@0: }; sl@0: sl@0: sl@0: void CSyntaxTest::DoPerformPrerequisite(TRequestStatus& aStatus) sl@0: { sl@0: HBufC *searchPath = HBufC::NewLC(iPath.Size() + 1); sl@0: TPtr searchPathPtr(searchPath->Des()); sl@0: searchPathPtr.Copy(iPath); sl@0: searchPathPtr.Append(_L("*")); sl@0: TInt err = iFs.GetDir(searchPathPtr, KEntryAttNormal, ESortByName, iDirList); sl@0: if (err != KErrNone) sl@0: { sl@0: iConsole.Printf(_L("Error getting directory ")); sl@0: iConsole.Printf(searchPathPtr); sl@0: iConsole.Printf(_L("\n")); sl@0: iOut.writeString(_L("Error getting directory ")); sl@0: iOut.writeString(searchPathPtr); sl@0: iOut.writeNewLine(); sl@0: iFinished = ETrue; sl@0: TRequestStatus* status = &aStatus; sl@0: User::RequestComplete(status, KErrNone); sl@0: SetScriptError(EFileNotFound, searchPathPtr); sl@0: } sl@0: else sl@0: { sl@0: iConsole.Printf(_L("Please view ")); sl@0: iConsole.Printf(KSyntaxLogFile); sl@0: iConsole.Printf(_L(" for results\n")); sl@0: iOut.writeString(_L("Please view ")); sl@0: iOut.writeString(KSyntaxLogFile); sl@0: iOut.writeString(_L(" for results")); sl@0: iOut.writeNewLine(); sl@0: iActionState = EAction; sl@0: TRequestStatus* status = &aStatus; sl@0: User::RequestComplete(status, KErrNone); sl@0: iResult = ETrue; sl@0: } sl@0: CleanupStack::PopAndDestroy(); // searchPath sl@0: } sl@0: sl@0: void CSyntaxTest::DoPerformPostrequisite(TRequestStatus& aStatus) sl@0: { sl@0: TRequestStatus* status = &aStatus; sl@0: iFinished = ETrue; sl@0: User::RequestComplete(status, KErrNone); sl@0: } sl@0: sl@0: void CSyntaxTest::ReadAndSyntaxCheckL(const TDesC &aFilename) sl@0: { sl@0: HBufC8* buf = Input::ReadFileLC(aFilename, iPath, iFs); sl@0: CX509Certificate* cert = CX509Certificate::NewLC(buf->Des()); sl@0: iWriter->WriteCert(*cert); sl@0: sl@0: TestInternalizeExternalizeL(cert); sl@0: sl@0: CleanupStack::PopAndDestroy(2, buf); sl@0: }; sl@0: sl@0: ////////////////////////////////////////////////////////////////////////////////// sl@0: // Test fix for INC023303: CX509Certificate externalize - internalize don't work sl@0: ////////////////////////////////////////////////////////////////////////////////// sl@0: void CSyntaxTest::TestInternalizeExternalizeL(CX509Certificate* aCert) sl@0: { sl@0: RFileWriteStream newwriter; sl@0: newwriter.PushL(); sl@0: User::LeaveIfError(newwriter.Replace(iFs,_L("x509stream"),EFileStream)); sl@0: sl@0: aCert->ExternalizeL(newwriter); sl@0: newwriter.CommitL(); sl@0: CleanupStack::PopAndDestroy(1);//newwriter sl@0: sl@0: RFileReadStream newreader; sl@0: newreader.PushL(); sl@0: newreader.Open(iFs,_L("x509stream"),EFileStream); sl@0: CX509Certificate* readCert=CX509Certificate::NewLC(newreader); //Use the stream to create new cert sl@0: sl@0: if (!readCert->IsEqualL(*aCert)) sl@0: User::Leave(KErrGeneral); sl@0: sl@0: // iFs.Delete(_L("x509stream")); sl@0: CleanupStack::PopAndDestroy(2); // readCert, newreader sl@0: } sl@0: sl@0: ////////////////////////////////////////////////////////////////////////////////// sl@0: sl@0: void CSyntaxTest::PerformAction(TRequestStatus& aStatus) sl@0: { sl@0: TBuf<256> filename = (*iDirList)[nFileNumber].iName; sl@0: sl@0: // dont try and do the results.txt file sl@0: if(filename.CompareF(KResultsFile)!=0) sl@0: { sl@0: TRAPD(error, ReadAndSyntaxCheckL(filename)); sl@0: sl@0: if(error == KErrNoMemory) sl@0: User::Leave(error); sl@0: if(!CheckResult(filename, error)) sl@0: iResult = EFalse; sl@0: } sl@0: sl@0: nFileNumber++; sl@0: if(nFileNumber == iDirList->Count()) sl@0: { sl@0: iActionState = EPostrequisite; sl@0: }; sl@0: TRequestStatus* status = &aStatus; sl@0: User::RequestComplete(status, KErrNone); sl@0: } sl@0: sl@0: void CSyntaxTest::DoReportAction() sl@0: { sl@0: iConsole.Printf(_L("\n")); sl@0: } sl@0: sl@0: void CSyntaxTest::DoCheckResult(TInt /*aError*/) sl@0: { sl@0: } sl@0: sl@0: sl@0: TBool CSyntaxTest::CheckResult(const TDesC &aFilename, const TInt &aError) sl@0: { sl@0: CSyntaxResult *syntaxResult; sl@0: TPtrC filename; sl@0: sl@0: iConsole.Printf(aFilename); sl@0: iOut.writeString(aFilename); sl@0: sl@0: for(TInt element = 0; element < iExpectedResults->Count(); element++) sl@0: { sl@0: syntaxResult = (*iExpectedResults)[element]; sl@0: sl@0: syntaxResult->GetFilename(filename); sl@0: if(filename.CompareF(aFilename)==0) sl@0: { sl@0: sl@0: if(syntaxResult->Result() != aError) sl@0: { sl@0: iConsole.Printf(_L(" FAILED. Expecting ")); sl@0: iOut.writeString(_L(" FAILED. Expecting ")); sl@0: PrintError(syntaxResult->Result()); sl@0: iConsole.Printf(_L(" Recieved ")); sl@0: iOut.writeString(_L(" Recieved ")); sl@0: PrintError(aError); sl@0: iConsole.Printf(_L("\n")); sl@0: iOut.writeNewLine(); sl@0: return(EFalse); sl@0: } sl@0: else sl@0: { sl@0: iConsole.Printf(_L(" Success\n")); sl@0: iOut.writeString(_L(" Success ")); sl@0: iOut.writeNewLine(); sl@0: return(ETrue); sl@0: } sl@0: } sl@0: } sl@0: sl@0: iConsole.Printf(_L(" FAILED to find expected result\n")); sl@0: iOut.writeString(_L(" FAILED to find expected result")); sl@0: iOut.writeNewLine(); sl@0: return(EFalse); sl@0: }; sl@0: sl@0: void CSyntaxTest::PrintError(const TInt &aError) sl@0: { sl@0: switch(aError) sl@0: { sl@0: case KErrArgument: sl@0: { sl@0: iConsole.Printf(_L(" Wrongly encoded")); sl@0: iOut.writeString(_L(" Wrongly encoded")); sl@0: break; sl@0: } sl@0: case KErrNotSupported: sl@0: { sl@0: iConsole.Printf(_L(" Not Supported")); sl@0: iOut.writeString(_L(" Not Supported")); sl@0: break; sl@0: } sl@0: case KErrNone: sl@0: { sl@0: iConsole.Printf(_L(" None ")); sl@0: iOut.writeString(_L(" None ")); sl@0: break; sl@0: } sl@0: default: sl@0: { sl@0: iConsole.Printf(_L(" UNKNOWN ")); sl@0: iOut.writeString(_L(" UNKNOWN ")); sl@0: } sl@0: }; sl@0: } sl@0: sl@0: void CSyntaxTest::Reset() sl@0: { sl@0: // nothing to do sl@0: }