--- /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 <test/testexecutelog.h>
+#include <s32mem.h>
+#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();
+ }
+