os/ossrv/lowlevellibsandfws/apputils/multipartparser/test/tef/smoketest/src/mppsmoketestlib.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
sl@0
     2
// All rights reserved.
sl@0
     3
// This component and the accompanying materials are made available
sl@0
     4
// under the terms of "Eclipse Public License v1.0"
sl@0
     5
// which accompanies this distribution, and is available
sl@0
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
sl@0
     7
//
sl@0
     8
// Initial Contributors:
sl@0
     9
// Nokia Corporation - initial contribution.
sl@0
    10
//
sl@0
    11
// Contributors:
sl@0
    12
//
sl@0
    13
// Description:
sl@0
    14
//
sl@0
    15
sl@0
    16
sl@0
    17
#include "mppsmoketestlib.h"
sl@0
    18
#include <flogger.h>
sl@0
    19
//#include "xmlengtesterdef.h"
sl@0
    20
//#include <utils/xmlengxestd.h>
sl@0
    21
sl@0
    22
/**
sl@0
    23
 * Utility fcn to compare two files ( skip or not skip white space ).
sl@0
    24
 * @param aSrcFile full filename of a file you want to check/compare.
sl@0
    25
 * @param aVerificationFile fill filename of a correct output file, aSrcFile will be compared to this to verify it's validity.
sl@0
    26
 * @param aSkipWhiteSpace do not include whitespace when comparing the two files.
sl@0
    27
 * @return Symbian OS error code.
sl@0
    28
 */
sl@0
    29
TInt CMultipartTestContainer::CompareFilesL( TPtrC aSrcFile, TPtrC aVerificationFile,
sl@0
    30
																				 TBool aSkipWhiteSpace)
sl@0
    31
{
sl@0
    32
    _LIT(KSourceFileError,"Source file error.");
sl@0
    33
    _LIT(KPatternFileError,"Pattern file error.");
sl@0
    34
    _LIT(KComparePassed,"Files compare test PASSED.");
sl@0
    35
    _LIT(KCompareFailed,"Files compare test FAILED.");
sl@0
    36
    
sl@0
    37
    TInt nResult = KErrNone;
sl@0
    38
    
sl@0
    39
    TBool skipWhite = FALSE;
sl@0
    40
    TBool foundRes = FALSE;
sl@0
    41
    TBool foundRef = FALSE;
sl@0
    42
    
sl@0
    43
    RFs fs;
sl@0
    44
	User::LeaveIfError(fs.Connect());
sl@0
    45
	CleanupClosePushL(fs);
sl@0
    46
    
sl@0
    47
    RFile srcFile;
sl@0
    48
    RFile referenceFile;
sl@0
    49
sl@0
    50
    TFileName srcFileName;
sl@0
    51
	TFileName referenceFileName;
sl@0
    52
    
sl@0
    53
  TPtrC SrcFile = aSrcFile;
sl@0
    54
  TPtrC ReferenceFile = aVerificationFile;
sl@0
    55
	if (aSkipWhiteSpace)
sl@0
    56
	 {
sl@0
    57
		 skipWhite = TRUE;
sl@0
    58
	 }	
sl@0
    59
    
sl@0
    60
    if ( nResult == KErrNone )
sl@0
    61
	{
sl@0
    62
		srcFileName.Copy(SrcFile);
sl@0
    63
		referenceFileName.Copy(ReferenceFile);
sl@0
    64
sl@0
    65
	    if(srcFile.Open(fs, srcFileName, EFileStream|EFileRead) == KErrNone)
sl@0
    66
		{
sl@0
    67
			// Does reference file exist.
sl@0
    68
			if(referenceFile.Open(fs, referenceFileName, EFileStream|EFileRead) == KErrNone)
sl@0
    69
		    {
sl@0
    70
		        // Integer variables for compare to length of files (result and reference).
sl@0
    71
		        TInt resSize;
sl@0
    72
		        TInt refSize;
sl@0
    73
sl@0
    74
		        srcFile.Size(resSize);
sl@0
    75
		        referenceFile.Size(refSize);
sl@0
    76
sl@0
    77
	            // Next compare one letter at the time, but only if files have same length.
sl@0
    78
	            if(skipWhite)
sl@0
    79
		        {
sl@0
    80
			        TBuf8<1> resBuf;
sl@0
    81
			        TBuf8<1> refBuf;
sl@0
    82
			        nResult = KErrNone;
sl@0
    83
			        TInt j = 0;
sl@0
    84
			        TInt i = 0;
sl@0
    85
			        
sl@0
    86
			        //for(TInt i = 0; i < Size; i++)
sl@0
    87
			        while (TRUE)
sl@0
    88
				    {
sl@0
    89
				    	foundRes = FALSE;
sl@0
    90
				    	foundRef = FALSE;
sl@0
    91
				        // Read result file
sl@0
    92
				        while(i < (resSize + 1))
sl@0
    93
				        {
sl@0
    94
				        	i++;
sl@0
    95
				        	srcFile.Read(resBuf);
sl@0
    96
				        	resBuf.Trim();	
sl@0
    97
				        	if ( resBuf.Length() > 0)
sl@0
    98
				        	{
sl@0
    99
				        		foundRes = TRUE;
sl@0
   100
				        		break;
sl@0
   101
				        	}
sl@0
   102
				        }
sl@0
   103
						
sl@0
   104
						// Read reference file
sl@0
   105
				        while(j < (refSize + 1))
sl@0
   106
				        {
sl@0
   107
				        	j++;
sl@0
   108
				        	referenceFile.Read(refBuf);
sl@0
   109
				        	refBuf.Trim();
sl@0
   110
				        	if ( refBuf.Length() > 0)
sl@0
   111
				        	{
sl@0
   112
				        		foundRef = TRUE;
sl@0
   113
				        		break;
sl@0
   114
				        	}
sl@0
   115
				        }
sl@0
   116
				        
sl@0
   117
				        // Compare single letter at the time.
sl@0
   118
				        if( ( i < resSize ) && ( j < refSize ) && (resBuf[0] != refBuf[0]) )
sl@0
   119
				        {
sl@0
   120
					        nResult = KErrGeneral;
sl@0
   121
					        break;
sl@0
   122
					    }
sl@0
   123
					    if( (i == (resSize + 1)) && (j < refSize) && foundRef)
sl@0
   124
				    	{
sl@0
   125
					    	nResult = KErrGeneral;
sl@0
   126
					        break;
sl@0
   127
				    	}
sl@0
   128
					    if( (i < resSize) && (j == (refSize + 1)) && foundRes)
sl@0
   129
				    	{
sl@0
   130
					    	nResult = KErrGeneral;
sl@0
   131
					        break;
sl@0
   132
				    	}
sl@0
   133
				    	if ((i > resSize) && (j > refSize))
sl@0
   134
				    		break;
sl@0
   135
				    }
sl@0
   136
			    }
sl@0
   137
		        else
sl@0
   138
			    {
sl@0
   139
			        if (resSize != refSize)
sl@0
   140
			       		nResult = KErrGeneral;
sl@0
   141
			        else
sl@0
   142
		        	{
sl@0
   143
				        TBuf8<1> resBuf;
sl@0
   144
			        	TBuf8<1> refBuf;
sl@0
   145
			        	nResult = KErrNone;
sl@0
   146
			        	for(TInt i = 0; i < resSize; i++)
sl@0
   147
			        	{
sl@0
   148
				        	// Read result file
sl@0
   149
				        	srcFile.Read(resBuf);
sl@0
   150
sl@0
   151
					        // Read reference file
sl@0
   152
					        referenceFile.Read(refBuf);
sl@0
   153
sl@0
   154
					        // Compare single letter at the time.
sl@0
   155
sl@0
   156
					        if(resBuf[0] != refBuf[0])
sl@0
   157
					        {
sl@0
   158
						        nResult = KErrGeneral;
sl@0
   159
					    	    break;
sl@0
   160
				        	}
sl@0
   161
			        	}
sl@0
   162
		        	}
sl@0
   163
			    }
sl@0
   164
	            referenceFile.Close();
sl@0
   165
	            srcFile.Close();
sl@0
   166
			}
sl@0
   167
			else
sl@0
   168
			{
sl@0
   169
				nResult = KErrGeneral;
sl@0
   170
				INFO_PRINTF1(KPatternFileError);
sl@0
   171
			}
sl@0
   172
			srcFile.Close();
sl@0
   173
		}
sl@0
   174
		else
sl@0
   175
		{
sl@0
   176
			nResult = KErrGeneral;
sl@0
   177
			INFO_PRINTF1(KSourceFileError);
sl@0
   178
		}
sl@0
   179
			
sl@0
   180
	}
sl@0
   181
	
sl@0
   182
	CleanupStack::PopAndDestroy(&fs);
sl@0
   183
	
sl@0
   184
	if ( nResult == KErrNone)
sl@0
   185
		{
sl@0
   186
		INFO_PRINTF1(KComparePassed);
sl@0
   187
		}
sl@0
   188
	else
sl@0
   189
		{
sl@0
   190
		INFO_PRINTF1(KCompareFailed);
sl@0
   191
		}
sl@0
   192
sl@0
   193
	return nResult;
sl@0
   194
    }
sl@0
   195
sl@0
   196
CMultipartTestContainer::CMultipartTestContainer(CTestExecuteLogger& aLogger)
sl@0
   197
 : iLog(aLogger)
sl@0
   198
    {
sl@0
   199
    }
sl@0
   200
sl@0
   201
/**
sl@0
   202
 * @param aLogger TEF logger from CTestStep.
sl@0
   203
 */
sl@0
   204
void CMultipartTestContainer::ConstructL()
sl@0
   205
	{
sl@0
   206
	}
sl@0
   207
sl@0
   208
/**
sl@0
   209
 * @param aLogger TEF logger from CTestStep.
sl@0
   210
 */
sl@0
   211
CMultipartTestContainer* CMultipartTestContainer::NewLC(CTestExecuteLogger& aLogger)
sl@0
   212
	{
sl@0
   213
	CMultipartTestContainer* self = new (ELeave) CMultipartTestContainer(aLogger);
sl@0
   214
    
sl@0
   215
	CleanupStack::PushL( self );
sl@0
   216
	self->ConstructL();
sl@0
   217
sl@0
   218
	return self;
sl@0
   219
    
sl@0
   220
	}
sl@0
   221
    
sl@0
   222
/**
sl@0
   223
 * @param aLogger TEF logger from CTestStep.
sl@0
   224
 */
sl@0
   225
CMultipartTestContainer* CMultipartTestContainer::NewL(CTestExecuteLogger &aLogger)
sl@0
   226
	{
sl@0
   227
	CMultipartTestContainer* self = NewLC(aLogger );
sl@0
   228
	CleanupStack::Pop( self );
sl@0
   229
sl@0
   230
	return self;
sl@0
   231
    
sl@0
   232
	}
sl@0
   233
    
sl@0
   234
CMultipartTestContainer::~CMultipartTestContainer()
sl@0
   235
	{ 
sl@0
   236
	}
sl@0
   237
sl@0
   238
/**
sl@0
   239
 * Read a file from the hard drive.
sl@0
   240
 * 
sl@0
   241
 * @param aFileName full filename to read in.
sl@0
   242
 * @return contents of the file.
sl@0
   243
 */ 
sl@0
   244
HBufC8* CMultipartTestContainer::ReadFileLC(const TDesC& aFileName)
sl@0
   245
    {
sl@0
   246
    RFs rfs;
sl@0
   247
    RFile file;
sl@0
   248
    User::LeaveIfError(rfs.Connect());
sl@0
   249
    CleanupClosePushL(rfs);
sl@0
   250
    User::LeaveIfError(file.Open(rfs, aFileName, EFileRead));
sl@0
   251
    CleanupClosePushL(file);
sl@0
   252
    TInt size;
sl@0
   253
    User::LeaveIfError(file.Size(size));
sl@0
   254
    HBufC8* buf = HBufC8::NewLC(size);
sl@0
   255
    TPtr8 bufPtr(buf->Des());
sl@0
   256
    User::LeaveIfError(file.Read(bufPtr));
sl@0
   257
    CleanupStack::Pop(); // buf
sl@0
   258
    CleanupStack::PopAndDestroy(2); // file, rfs
sl@0
   259
    CleanupStack::PushL(buf);
sl@0
   260
    return buf;
sl@0
   261
    }
sl@0
   262
sl@0
   263
/**
sl@0
   264
 * Write the file to the hard drive.
sl@0
   265
 * 
sl@0
   266
 * @param aFileName 
sl@0
   267
 * @param aBodyPartArray
sl@0
   268
 */ 
sl@0
   269
void CMultipartTestContainer::WriteFileL( const TDesC& aFileName,
sl@0
   270
                                           RPointerArray<CBodyPart>& aBodyPartArray )
sl@0
   271
    {
sl@0
   272
    RFs fs;
sl@0
   273
    fs.Connect();
sl@0
   274
    CleanupClosePushL(fs);
sl@0
   275
    RFile output;
sl@0
   276
    TInt err = output.Open(fs, aFileName, EFileWrite);
sl@0
   277
    if (err == KErrNotFound)
sl@0
   278
    	{
sl@0
   279
			User::LeaveIfError(output.Create(fs, aFileName, EFileWrite));
sl@0
   280
			}		
sl@0
   281
    
sl@0
   282
    // output file
sl@0
   283
    TInt size = aBodyPartArray.Count();
sl@0
   284
    TInt i;
sl@0
   285
		_LIT8(KEol, "\r\n");
sl@0
   286
    for (i = 0; i < size; i++)
sl@0
   287
        {
sl@0
   288
sl@0
   289
        CBodyPart* bodyPart = aBodyPartArray[i];
sl@0
   290
sl@0
   291
        if( bodyPart->Url().Ptr() )
sl@0
   292
            {
sl@0
   293
            output.Write(_L8("***************Ur"));
sl@0
   294
            output.Write(KEol);
sl@0
   295
			RBuf8 narrow;
sl@0
   296
			err = narrow.Create(bodyPart->Url().Length()*2);
sl@0
   297
			if (err != KErrNone)
sl@0
   298
				{
sl@0
   299
				INFO_PRINTF1(_L("Error printing Url to output file; continueing..."));
sl@0
   300
				}						
sl@0
   301
			narrow.Copy(bodyPart->Url());
sl@0
   302
            output.Write(narrow.Left(narrow.Length()));
sl@0
   303
            output.Write(KEol);
sl@0
   304
            }
sl@0
   305
        if( bodyPart->ContentID().Ptr() )
sl@0
   306
            {
sl@0
   307
            output.Write(_L8("***************ContentID"));
sl@0
   308
            output.Write(KEol);
sl@0
   309
            output.Write(bodyPart->ContentID() );
sl@0
   310
            output.Write(KEol);
sl@0
   311
            }
sl@0
   312
        if( bodyPart->Charset().Ptr() )
sl@0
   313
            {
sl@0
   314
            output.Write(_L8("***************Charset"));
sl@0
   315
            output.Write(KEol);
sl@0
   316
            output.Write( bodyPart->Charset() );
sl@0
   317
            output.Write(KEol);
sl@0
   318
            }
sl@0
   319
        if( bodyPart->ContentType().Ptr() )
sl@0
   320
            {
sl@0
   321
            output.Write(_L8("***************ContentType"));
sl@0
   322
            output.Write(KEol);
sl@0
   323
            output.Write( bodyPart->ContentType() );
sl@0
   324
            output.Write(KEol);
sl@0
   325
            }
sl@0
   326
        if( bodyPart->Headers().Ptr() )
sl@0
   327
            {
sl@0
   328
            output.Write(_L8("***************Headers"));
sl@0
   329
            output.Write(KEol);
sl@0
   330
            output.Write(bodyPart->Headers() );
sl@0
   331
            output.Write(KEol);
sl@0
   332
            }
sl@0
   333
        if( bodyPart->Body().Ptr() )
sl@0
   334
            {
sl@0
   335
            output.Write(_L8("***************Body"));
sl@0
   336
            output.Write(KEol);
sl@0
   337
            output.Write(bodyPart->Body() );
sl@0
   338
            output.Write(KEol);
sl@0
   339
            }
sl@0
   340
        output.Write(_L8("=========================================part ends"));
sl@0
   341
        output.Write(KEol);
sl@0
   342
sl@0
   343
        } // end of loop
sl@0
   344
    
sl@0
   345
    output.Close();
sl@0
   346
    CleanupStack::PopAndDestroy(1, &fs);
sl@0
   347
    fs.Close();
sl@0
   348
		}
sl@0
   349
		
sl@0
   350
sl@0
   351
/**
sl@0
   352
 * Write the data to a file.
sl@0
   353
 * 
sl@0
   354
 * @param aFileName  filename to write the data to.
sl@0
   355
 * @param aData data to write.
sl@0
   356
 */
sl@0
   357
void CMultipartTestContainer::WriteToDiskL( const TDesC& aFileName,
sl@0
   358
                                            const TDesC8& aData )
sl@0
   359
    {
sl@0
   360
    RFs fsSession;
sl@0
   361
    RFile file;
sl@0
   362
    TInt status( KErrNone );
sl@0
   363
    User::LeaveIfError( fsSession.Connect() );
sl@0
   364
    status = file.Replace( fsSession, aFileName, EFileWrite|EFileShareAny);    
sl@0
   365
    if( status == KErrNone )
sl@0
   366
        {
sl@0
   367
        file.Write( aData );
sl@0
   368
        }
sl@0
   369
    file.Close();
sl@0
   370
    }
sl@0
   371
sl@0
   372
sl@0
   373
/**
sl@0
   374
 * Parse a file with base64 encoding.
sl@0
   375
 * 
sl@0
   376
 * @param aFile filename to be read in.
sl@0
   377
 * @param aUrl  ???  //DEBUG
sl@0
   378
 * @param aOutput name out output file.
sl@0
   379
 */ 
sl@0
   380
void CMultipartTestContainer::ParseFileL( const TDesC& aFile,
sl@0
   381
                                          const TDesC& aUrl,
sl@0
   382
                                          const TDesC& aOutput )
sl@0
   383
    {
sl@0
   384
    // body
sl@0
   385
    HBufC8* data = ReadFileLC( aFile );
sl@0
   386
    // content type
sl@0
   387
    _LIT8(KMultipartMixed, "multipart/mixed");
sl@0
   388
    // boundary
sl@0
   389
    _LIT8(KBoundary1, "KBoundary");
sl@0
   390
    // body part array
sl@0
   391
    RPointerArray<CBodyPart> bodyPartArray;  
sl@0
   392
sl@0
   393
    // parse
sl@0
   394
		TInt err;
sl@0
   395
    if( aUrl.Ptr() )
sl@0
   396
        {
sl@0
   397
        TRAP( err, MultipartParser::ParseL( *data, KMultipartMixed, KBoundary1, aUrl, bodyPartArray ) );
sl@0
   398
        }
sl@0
   399
    else
sl@0
   400
        {
sl@0
   401
        TRAP( err, MultipartParser::ParseL( *data, KMultipartMixed, KBoundary1, aFile, bodyPartArray ) );
sl@0
   402
        }
sl@0
   403
	if (err != KErrNone)
sl@0
   404
		{
sl@0
   405
		INFO_PRINTF1(_L("Error parsing file."));
sl@0
   406
		}			
sl@0
   407
sl@0
   408
    // output
sl@0
   409
    WriteFileL( aOutput, bodyPartArray);
sl@0
   410
sl@0
   411
    // clean up memory
sl@0
   412
    CleanupStack::PopAndDestroy(); // data
sl@0
   413
    // clean up body part array and its content
sl@0
   414
    TInt size = bodyPartArray.Count();
sl@0
   415
    TInt i;
sl@0
   416
    for (i = 0; i < size; i++)
sl@0
   417
        {
sl@0
   418
        delete bodyPartArray[i];
sl@0
   419
        }
sl@0
   420
    bodyPartArray.Reset();
sl@0
   421
    }