diff -r afc583cfa176 -r da2ae96f639b contentmgmt/referencedrmagent/tcaf/source/OomStep.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contentmgmt/referencedrmagent/tcaf/source/OomStep.cpp Mon Oct 12 10:17:04 2009 +0300 @@ -0,0 +1,254 @@ +/* +* Copyright (c) 2003-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#include +#include +#include "cafserver.h" +#include "oomstep.h" +#include "content.h" +#include "data.h" +#include "supplier.h" +#include "cafmimeheader.h" +#include "importfile.h" +#include "supplieroutputfile.h" +#include "attribute.h" +#include "bitset.h" + +using namespace ContentAccess; + +const TInt KOomReadContent = 1; +const TInt KOomSupply = 2; + + +/* + * This step imports a DCF file into CAF + * + */ +CCafOomStep::~CCafOomStep() + { + } + +CCafOomStep::CCafOomStep(CCAFServer& aParent) : iParent(aParent) + { + SetTestStepName(KCAFOomStep); + } + + +TVerdict CCafOomStep::doTestStepL() + { + SetTestStepResult(EInconclusive); + + TInt failCount=1; + TInt ret=-1; + const TInt MaxAllocationFailures=450; + + + TInt OomTest = KErrNotFound; + GetIntFromConfig(ConfigSection(),_L("OomTest"),OomTest); + + + if(OomTest == 2) + { + INFO_PRINTF2(_L("Starting Apparc..."),failCount); + StartApparcServerL(); + User::After(500000); // Allow async libraries to unload + } + + + while(failCount < MaxAllocationFailures && OomTest > 0) + { + // Mark heap and set allocation to fail + __UHEAP_MARK; + + switch(OomTest) + { + case KOomReadContent: + INFO_PRINTF2(_L("ReadContent() __UHEAP_FAILNEXT: %d"),failCount); + __UHEAP_FAILNEXT(failCount); + TRAP(ret,OomReadContentL()); + break; + case KOomSupply: + INFO_PRINTF2(_L("Supply() __UHEAP_FAILNEXT: %d"),failCount); + __UHEAP_FAILNEXT(failCount); + TRAP(ret,OomSupplyL()); + break; + default: + INFO_PRINTF2(_L("Out of Memory test %d does not exist"),OomTest); + SetTestStepResult(EFail); + ret = KErrNone; + break; + }; + + User::After(500000); // Allow async libraries to unload + + + // Check all heap is free'd + __UHEAP_MARKEND; + + // cancel heap failure + __UHEAP_RESET; + if(ret == KErrNone) + { + // Allocation failure has been moved all the way through the test + // Succeeded after failCount allocations + return TestStepResult(); + } + else + { + // Try failing a little further into the process + failCount++; + } + } + + // We must have reached our maximum number of allocation failures + // There must be some other problem + SetTestStepResult(EFail); + + return TestStepResult(); + } + +TVerdict CCafOomStep::OomReadContentL() + { + + TBuf8<2> buffer; + TRequestStatus status; + + TPtrC uri; + GetStringFromConfig(ConfigSection(),_L("URI"),uri); + + CContent* content = CContent::NewLC(uri); + CData* data = content->OpenContentL(EPeek); + CleanupStack::PushL(data); + + TInt size = 0; + data->DataSizeL(size); + + // Seek and read from start using both CAF and RFile + TInt pos = size/4; + data->Seek(ESeekStart, pos); + data->Read(buffer); + + pos=0; + data->Seek(ESeekCurrent, pos); + + data->Read(buffer,1,status); + User::WaitForRequest(status); + + CleanupStack::PopAndDestroy(2, content); + + SetTestStepResult(EPass); + + return TestStepResult(); + } + + +TVerdict CCafOomStep::OomSupplyL() + { + SetTestStepResult(EInconclusive); + + RFs fs; + RFile file; + TBuf8 <128> readBuffer; + + TPtrC outputDirectory, sourceFileName, suggestedFileName, mimeType; + TInt expectedLeave; + + // Get parameters from INI file + GetStringFromConfig(ConfigSection(),_L("OutputPath"),outputDirectory); + GetStringFromConfig(ConfigSection(),_L("SourceFileName"),sourceFileName); + GetStringFromConfig(ConfigSection(),_L("SuggestedFileName"),suggestedFileName); + GetStringFromConfig(ConfigSection(),_L("MimeType"),mimeType); + GetIntFromConfig(ConfigSection(),_L("LeaveResult"),expectedLeave); + + + // delete any file previously supplied, don't care if this + // has errors so trap. + Delete(_L("C:\\supplied.drm")); + Delete(_L("C:\\receipt.txt")); + + + HBufC8 *mime = ConvertDes16toHBufC8LC(mimeType); + + CCafMimeHeader *header = CCafMimeHeader::NewL(mime->Des()); + CleanupStack::PushL(header); + + CSupplier *mySupplier = CSupplier::NewLC(); + mySupplier->SetOutputDirectoryL(outputDirectory); + + // ignore return value, just exercises code for CCover + mySupplier->IsImportSupported(header->StandardMimeData(EContentType)); + + CImportFile *import = NULL; + import = mySupplier->ImportFileL(*header, suggestedFileName); + CleanupStack::PushL(import); + + // read the input file and pass it to the CAF + fs.Connect(); + CleanupClosePushL(fs); + + TInt result = file.Open(fs, sourceFileName, EFileRead | EFileStream | EFileShareAny); + CleanupClosePushL(file); + while(result == KErrNone) + { + result = file.Read(readBuffer); + if(readBuffer.Length() == 0) + break; + User::LeaveIfError(import->WriteData(readBuffer)); + } + CleanupStack::PopAndDestroy(&file); + User::LeaveIfError(import->WriteDataComplete()); + + TInt n = import->OutputFileCountL(); + if(n > 0) + { + // get output file type (content or receipt) + TOutputType outputType = import->OutputFileL(0).OutputType(); + + // get output file name, but ignore it because it would cause a warning + import->OutputFileL(0).FileName(); + + // get output file mime type + TPtrC8 OutputMimeType = import->OutputFileL(0).MimeTypeL(); + HBufC *outmime = ConvertDes8toHBufC16LC(OutputMimeType ); + CleanupStack::PopAndDestroy(outmime); + + if(outputType != EContent) + { + SetTestStepResult(EFail); + } + else + { + // check an attribute, it's only a reference so no need to delete it + import->OutputFileL(0).AttributesL(ETrue); + } + } + + CleanupStack::PopAndDestroy(&fs); + CleanupStack::PopAndDestroy(import); + CleanupStack::PopAndDestroy(mySupplier); + CleanupStack::PopAndDestroy(header); + CleanupStack::PopAndDestroy(mime); + + if (TestStepResult() != EFail) + { + SetTestStepResult(EPass); + } + + return TestStepResult(); + } +