imagingext_pub/exif_api/tsrc/inc/ExifLibTestInc.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 09:22:31 +0200
changeset 0 469c91dae73b
permissions -rw-r--r--
Revision: 200949 Kit: 200951

/*
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "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: ExifLibTest
*
*/
#include "ExifRead.h"
#include "ExifModify.h"
#include "ExifTag.h"
#include "ExifValueTable.h"
#include <fbs.h>
#include "ExifCommon.h"


#ifdef _USE_CPPUNIT_
#include <CppUnit/Test.h>
#include <CppUnit/TestCase.h>
#include <CppUnit/TestCaller.h>
#include <CppUnit/TestSuite.h>
#else
#include "TestFrameWork/test.h"
#include "TestFrameWork/testCase.h"
#include "TestFrameWork/testCaller.h"
#include "TestFrameWork/testSuite.h"
#endif
_LIT( KRootC, "C:\\ExifLibTest\\" );
_LIT( KRootE, "F:\\testing\\data\\ExifLibTest\\" );
_LIT( KRootData, "C:\\data\\ExifLibTest\\" );

#if ( ( defined __WINS__ ) || ( defined __WINSCW__) )
_LIT(KIopDir, "C:\\ExifLibTest\\IOP\\");
_LIT( KRootOut, "C:\\ExifLibTest\\" );
#else
_LIT(KIopDir, "F:\\testing\\data\\ExifLibTest\\IOP\\");
_LIT( KRootOut, "F:\\testing\\data\\ExifLibTest\\" );
#endif

_LIT(KValidExif, "ValidExif.jpg");
_LIT(KInvalidExif1, "InvalidExif1.jpg");
_LIT(KInvalidExif2, "InvalidExif2.jpg");
_LIT(KInvalidExif3, "InvalidExif3.jpg");
_LIT(KInvalidExif4, "InvalidExif4.jpg");
_LIT(KInvalidExif5, "InvalidExif5.jpg");
_LIT(KInvalidExif6, "InvalidExif6.jpg");
_LIT(KInvalidExif7, "InvalidExif7.jpg");
_LIT(KInvalidExif8, "InvalidExif8.jpg");
_LIT(KInvalidExif9, "InvalidExif9.jpg");
_LIT(KInvalidExif10, "InvalidExif10.jpg");
_LIT(KInvalidExif11, "InvalidExif11.jpg");
_LIT(KInvalidExif12, "InvalidExif12.jpg");
_LIT(KInvalidExif13, "InvalidExif13.jpg");
_LIT(KInvalidExif14, "InvalidExif14.jpg");
_LIT(KNotSupportedExif1, "NotSupportedExif1.jpg");
_LIT(KNotSupportedExif2, "NotSupportedExif2.jpg");
_LIT(KFullExif, "FullExif.jpg");
_LIT(KFullExif3mpix, "FullExif3mpix.jpg");
_LIT(KValidJpeg, "ValidJpeg.jpg");
_LIT(KInvalidJpeg1, "InvalidJpeg1.jpg");
_LIT(KInvalidJpeg2, "InvalidJpeg2.jpg");
_LIT(KInvalidJpeg3, "InvalidJpeg3.jpg");
_LIT(KValidThumbnail, "Thumbnail.jpg");
_LIT(KNoThumbnail, "NoThumbnail.jpg");
_LIT(KCameraAPIJpeg, "CameraApi.jpg");
_LIT(KNoTagChk_IMG_AN19, "NoTagChk_IMG_AN19.jpeg");
_LIT(KNoTagChk_IMG_AN19_out, "NoTagChk_IMG_AN19_out.jpeg");
_LIT(KNoTagChk_Original, "NoTagChk_Original.jpg");
_LIT(KtagInWrongIfd, "tagInWrongIfd.jpg");
_LIT(KtagInWrongIfd_out, "tagInWrongIfd_out.jpg");
_LIT(KUnknown_tags, "DSCN1011_unknown_tags.jpg");
_LIT(KUnknown_tags_out, "DSCN1011_unknown_tags_out.jpg");


class CExifLibTestInc;

class TUtils
	{
	public:
		
		static HBufC8* ReadFileL(RFs aFs, const TDesC& aFileName) 
			{
            HBufC* fileName = HBufC::NewL( 128 );
            CleanupStack::PushL( fileName );
            fileName->Des().Append( KRootC );
            fileName->Des().Append( aFileName );
			RFile file;
      LOGTEXT2( _L( "ExifLib: TUtils::ReadFileL %s" ), fileName->Ptr());
			TInt error = file.Open(aFs,fileName->Des(),EFileShareExclusive|EFileRead);
            if ( error != KErrNone )
                {
                fileName->Des().Copy( KRootE );
                fileName->Des().Append( aFileName );
                error = file.Open(aFs,fileName->Des(),EFileShareExclusive|EFileRead);
                if ( error != KErrNone )
                    {
                    fileName->Des().Copy( KRootData );
                    fileName->Des().Append( aFileName );
                    error = file.Open(aFs,fileName->Des(),EFileShareExclusive|EFileRead);
                    if ( error != KErrNone )
                        {
                        User::LeaveIfError( file.Open(aFs,aFileName,EFileShareExclusive|EFileRead) );
                        }
                    }
                }
			CleanupClosePushL(file);
			TInt size = 0;
			file.Size(size);
			
			HBufC8* buffer = HBufC8::NewL(size);
			CleanupStack::PushL(buffer);
			TPtr8 bufferDes(buffer->Des());
			User::LeaveIfError(file.Read(bufferDes));
			CleanupStack::Pop(buffer);
			CleanupStack::PopAndDestroy();
            CleanupStack::PopAndDestroy();
			return buffer;
			};

		static HBufC8* ReadFileL(RFs aFs, const TDesC& aFileName, TUint32 aMaxRead) 
			{
            HBufC* fileName = HBufC::NewL( 128 );
            CleanupStack::PushL( fileName );
            fileName->Des().Append( KRootC );
            fileName->Des().Append( aFileName );
			RFile file;
      LOGTEXT2( _L( "ExifLib: TUtils::ReadFileL %s" ), fileName->Ptr());
			TInt error = file.Open(aFs,fileName->Des(),EFileShareExclusive|EFileRead);
            if ( error != KErrNone )
                {
                fileName->Des().Copy( KRootE );
                fileName->Des().Append( aFileName );
                error = file.Open(aFs,fileName->Des(),EFileShareExclusive|EFileRead);
                if ( error != KErrNone )
                    {
                    fileName->Des().Copy( KRootData );
                    fileName->Des().Append( aFileName );
                    error = file.Open(aFs,fileName->Des(),EFileShareExclusive|EFileRead);
                    if ( error != KErrNone )
                        {
                        User::LeaveIfError( file.Open(aFs,aFileName,EFileShareExclusive|EFileRead) );
                        }
                    }
                }
			CleanupClosePushL(file);
			TInt size = 0;
			file.Size(size);
			// read up to max size parameter
			if ( size > aMaxRead )
				size = aMaxRead;
			
			HBufC8* buffer = HBufC8::NewL(size);
			CleanupStack::PushL(buffer);
			TPtr8 bufferDes(buffer->Des());
			User::LeaveIfError(file.Read(bufferDes, size));
			CleanupStack::Pop(buffer);
			CleanupStack::PopAndDestroy();
            CleanupStack::PopAndDestroy();
			return buffer;
			};

		static HBufC8* CreateDummyBufL(TInt aSize)
			{
			HBufC8* buf = HBufC8::NewL(aSize);
			CleanupStack::PushL(buf);
			TUint8* tmp = new(ELeave) TUint8[aSize];
			CleanupStack::PushL(tmp);
			TInt i = 0;
			for(i = 0; i < aSize - (aSize % 5); i+=5)
				{
				tmp[i] = 'D';
				tmp[i+1] = 'U';
				tmp[i+2] = 'M';
				tmp[i+3] = 'M';
				tmp[i+4] = 'Y';
				}
			for(TInt j = 0; j < aSize % 5; j++)
				tmp[i + j] = 'D';
			buf->Des().Copy(tmp, aSize);
			buf->Des().SetLength(aSize);
			CleanupStack::PopAndDestroy(tmp);
			CleanupStack::Pop(buf);
			return buf;
			};

		static void GetAllTagsTestL(CExifRead* read, const TDesC& aFileName)
			{
			TInt error = 0;
	        RDebug::Print(_L("GetAllTagsTestL starts for %s"), aFileName.Ptr());
            if ( !read )
                {
                return;
                }
            HBufC8* thumbnail = NULL;
            TRAP( error, thumbnail = read->GetThumbnailL());
	        CleanupStack::PushL(thumbnail);
	        if(!error && thumbnail)
		        RDebug::Print(_L("thumbnail ok, size %d ..."), thumbnail->Des().Size());
	        else
		        RDebug::Print(_L("no thumbnail %d..."), error);
	        CleanupStack::PopAndDestroy(thumbnail);

            HBufC8* datetime  = NULL;
            TRAP( error, datetime  = read->GetDateTimeL());
	        CleanupStack::PushL(datetime);
	        if( !error && datetime)
		        RDebug::Print(_L("datetime ok, size %d ..."), datetime->Des().Size());
	        else
		        RDebug::Print(_L("no datetime %d..."), error);
	        CleanupStack::PopAndDestroy(datetime);

            HBufC8* imagedescription  = NULL;
            TRAP( error, imagedescription  = read->GetImageDescriptionL() );
	        CleanupStack::PushL(imagedescription);
	        if(!error && imagedescription)
		        RDebug::Print(_L("imagedescription ok, size %d ..."), imagedescription->Des().Size());
    	    else
	    	    RDebug::Print(_L("no imagedescription %d..."), error);
	        CleanupStack::PopAndDestroy(imagedescription);

            HBufC8* make  = NULL;
            TRAP( error, make  = read->GetMakeL() );
	        CleanupStack::PushL(make);
    	    if(!error && make)
	    	    RDebug::Print(_L("make ok, size %d ..."), make->Des().Size());
	        else
		        RDebug::Print(_L("no make %d..."), error);
    	    CleanupStack::PopAndDestroy(make);

            HBufC8* model  = NULL;
            TRAP( error, model  = read->GetModelL() );
    	    CleanupStack::PushL(model);
	        if(!error && model)
		        RDebug::Print(_L("model ok, size %d ..."), model->Des().Size());
    	    else
	    	    RDebug::Print(_L("no model %d..."), error);
	        CleanupStack::PopAndDestroy(model);

            HBufC8* software  = NULL;
            TRAP( error, software  = read->GetSoftwareL() );
	        CleanupStack::PushL(software);
    	    if(!error && software)
	    	    RDebug::Print(_L("software ok, size %d ..."), software->Des().Size());
	        else
		        RDebug::Print(_L("no software %d..."), error);
    	    CleanupStack::PopAndDestroy(software);

            HBufC8* copyright  = NULL;
            TRAP( error, copyright  = read->GetCopyrightL() );
    	    CleanupStack::PushL(copyright);
	        if(!error && copyright)
		        RDebug::Print(_L("copyright ok, size %d ..."), copyright->Des().Size());
    	    else
	    	    RDebug::Print(_L("no copyright %d..."), error);
	        CleanupStack::PopAndDestroy(copyright);

            TUint16 orientation = 0;
            TInt err = read->GetOrientation( orientation);
    	    if(!err)
	            RDebug::Print(_L("orientation ok %d ..."), orientation);
	        else
		        RDebug::Print(_L("no orientation %d..."), err);
	        
	        TUint32 gpsversion = 0;
            err = read->GetGpsVersion( gpsversion );
    	    if(!err)
	            RDebug::Print(_L("gpsversion ok 0x%x ..."), gpsversion);
	        else
		        RDebug::Print(_L("no gpsversion %d..."), err);
	        
	        TUint32 exifversion = 0;
            err = read->GetExifVersion( exifversion );
    	    if(!err)
	            RDebug::Print(_L("exifversion ok 0x%x ..."), exifversion);
	        else
		        RDebug::Print(_L("no exifversion %d..."), err);
	        
	        TUint32 flashpixversion = 0;
            err = read->GetFlashPixVersion( flashpixversion );
    	    if(!err)
	            RDebug::Print(_L("flashpixversion ok 0x%x ..."), flashpixversion);
	        else
		        RDebug::Print(_L("no flashpixversion %d..."), err);

            HBufC8* datetimeoriginal  = NULL;
            TRAP( error, datetimeoriginal  = read->GetDateTimeOriginalL() );
    	    CleanupStack::PushL(datetimeoriginal);
	        if(!error && datetimeoriginal)
		        RDebug::Print(_L("datetimeoriginal ok, size %d ..."), datetimeoriginal->Des().Size());
    	    else
	    	    RDebug::Print(_L("no datetimeoriginal %d..."), error);
	        CleanupStack::PopAndDestroy(datetimeoriginal);

            HBufC8* datetimedigitized  = NULL;
            TRAP( error, datetimedigitized  = read->GetDateTimeDigitizedL() );
    	    CleanupStack::PushL(datetimedigitized);
	        if(!error && datetimedigitized)
		        RDebug::Print(_L("datetimedigitized ok, size %d ..."), datetimedigitized->Des().Size());
    	    else
	    	    RDebug::Print(_L("no datetimedigitized %d..."), error);
	        CleanupStack::PopAndDestroy(datetimedigitized);
	        
            HBufC8* usercomment  = NULL;
            TRAP( error, usercomment  = read->GetUserCommentL() );
    	    CleanupStack::PushL(usercomment);
	        if(!error && usercomment)
		        RDebug::Print(_L("usercomment ok, size %d ..."), usercomment->Des().Size());
    	    else
	    	    RDebug::Print(_L("no usercomment %d..."), error);
	        CleanupStack::PopAndDestroy(usercomment);
	        
            HBufC8* relatedsoundfile  = NULL;
            TRAP( error, relatedsoundfile  = read->GetRelatedSoundFileL() );
    	    CleanupStack::PushL(relatedsoundfile);
	        if(!error && relatedsoundfile)
		        RDebug::Print(_L("relatedsoundfile ok, size %d ..."), relatedsoundfile->Des().Size());
    	    else
	    	    RDebug::Print(_L("no relatedsoundfile %d..."), error);
	        CleanupStack::PopAndDestroy(relatedsoundfile);
	        

/*-------------- missing test cases---------

        TInt GetXResolution( 
            TUint32& aXResolution1, 
            TUint32& aXResolution2 ) const;
    	
        TInt GetYResolution( 
            TUint32& aYResolution1, 
            TUint32& aYResolution2 ) const;
    	
        TInt GetResolutionUnit( TUint16& aResolutionUnit ) const; 
    	
        TInt GetYCbCrPositioning( TUint16& aYCbCrPositioning ) const; 
    	
        TInt GetExifIfdPointer( TUint32& aExifIfdPointer ) const; 
    	
        TInt GetGpsInfoIfdPointer( TUint32& aGpsInfoIfdPointer ) const; 

    	HBufC8* GetIsoSpeedRatingsL() const; 
    	
        HBufC8* GetMakerNoteL() const; 
    	

    	TInt GetExposureTime( 
            TUint32& aExposureTime1, 
            TUint32& aExposureTime2 ) const; 
    	
        TInt GetComponentsConfiguration( 
            TUint8& aFirstComponent, TUint8& aSecondComponent,
            TUint8& aThirdComponent, TUint8& aFourthComponent) const; 

        TInt GetFlash( TUint16& aFlash ) const; 
    	
        TInt GetColorSpace( TUint16& aColorSpace ) const; 
    	
        TInt GetPixelXDimension( TUint32& aPixelXDimension ) const; 
    	
        TInt GetPixelYDimension( TUint32& aPixelYDimension ) const; 
    	
        TInt GetExposureMode( TUint16& aExposureMode ) const; 
    	
        TInt GetWhiteBalance( TUint16& aWhiteBalance ) const; 
    	
        TInt GetSceneCaptureType( TUint16& aSceneCaptureType ) const; 
    	
        TInt GetExposureProgram( TUint16& aExposureProgram ) const;
    	
        TInt GetApertureValue( 
            TUint32& aApertureValue1, 
            TUint32& aApertureValue2 ) const; 
    	
        TInt GetExposureBiasValue( 
            TInt32& aExposureBiasValue1, 
            TInt32& aExposureBiasValue2 ) const; 
    	
        TInt GetMeteringMode( TUint16& aMeteringMode ) const; 
    	
        TInt GetLightSource( TUint16& aLightSource ) const; 
    	
        TInt GetFileSource( TInt8& aFileSource ) const; 
    	
        TInt GetDigitalZoomRatio( 
            TUint32& aDigitalZoomRatio1, 
            TUint32& aDigitalZoomRatio2 ) const; 
    	
        TInt GetContrast( TUint16& aContrast ) const; 
    	
        TInt GetSaturation( TUint16& aSaturation ) const; 
    	
        TInt GetSharpness( TUint16& aSharpness ) const; 
    	
    	
    	
        TInt GetInteroperabilityIfdPointer( 
            TUint32& aInteroperabilityIfdPointer ) const; 

    	TInt GetThumbnailXResolution( 
            TUint32& aXResolution1, 
            TUint32& aXResolution2 ) const;
    	
        TInt GetThumbnailYResolution( 
            TUint32& aYResolution1, 
            TUint32& aYResolution2 ) const;
    	
        TInt GetThumbnailResolutionUnit( TUint16& aResolutionUnit ) const;
    	
        TInt GetThumbnailCompression( TUint16& aCompression ) const; 
    	
        TInt GetJpegInterchangeFormat( TUint32& aJpegInterchangeFormat ) const; 
    	
        TInt GetJpegInterchangeFormatLength( 
            TUint32& aJpegInterchangeFormatLength ) const;

        HBufC8* GetExifAppSegmentL() const;

        TInt GetShutterSpeedValue( TInt32& aShutterSpeedValue1, 
            TInt32& aShutterSpeedValue2 ) const;

        TInt GetBrightnessValue( TInt32& aBrightnessValue1, 
            TInt32& aBrightnessValue2 ) const;

        TInt GetCustomRendered( TUint16& aCustomRendered ) const;

        TInt GetGainControl( TUint16& aGainControl ) const;



--------------*/
			return;
			};
	};

class CExifTagTest : public CTestCase
	{
	friend class CExifLibTestInc;

	RFs iFs;
	public:
		CExifTagTest(){};
		~CExifTagTest(){};
		void ExifTag001L();
		void ExifTag002L();
        // Allocate the resources for one test function
        void setUpL ()
			{
			User::LeaveIfError(iFs.Connect());
			};
        
        // Free the resources reserved in setUpL()
        void tearDown ()
			{
			iFs.Close();
			};
	};

class CExifReadTest : public CTestCase
	{
	friend class CExifLibTestInc;
	RFs iFs;

	public:
		CExifReadTest(){};
		~CExifReadTest(){};
		void ExifRead001L();
		void ExifRead002L();
		void ExifRead003L();
		void ExifRead004L();
		void ExifRead005L();
		void ExifRead006L();
		void ExifRead007L();
		void ExifRead008L();
		void ExifRead009L();
		void ExifRead010L();
		void ExifRead011L();
		void ExifRead012L();
		void ExifRead013L();
		void ExifRead014L();
		void ExifRead015L();
        void ExifRead016L();
		void ExifRead017L();
		void ExifRead018L();
		// For fast reader
		void ExifRead101L();
		void ExifRead102L();
		void ExifRead103L();
		void ExifRead104L();
		void ExifRead105L();
		void ExifRead106L();
		void ExifRead107L();
		void ExifRead108L();
		void ExifRead109L();
		void ExifRead110L();
		void ExifRead111L();
		void ExifRead112L();
		void ExifRead113L();
		void ExifRead114L();
		void ExifRead115L();
        void ExifRead116L();
		// For no tag validity checking
		void ExifRead201L();
		void ExifRead202L();
		void ExifRead203L();
		void ExifRead204L();
		void ExifRead205L();
		void ExifRead206L();
		void ExifRead207L();
		void ExifRead208L();
		void ExifRead209L();
		void ExifRead210L();
		void ExifRead211L();
		void ExifRead212L();
		void ExifRead213L();
		void ExifRead214L();
		void ExifRead215L();
        void ExifRead216L();
		
        // Allocate the resources for one test function
        void setUpL ()
			{
			User::LeaveIfError(iFs.Connect());
			};

        
        // Free the resources reserved in setUpL()
        void tearDown ()
			{
			iFs.Close();
			};
	};

class CExifCreateTest : public CTestCase
	{
	friend class CExifLibTestInc;
	RFs iFs;

	public:
		CExifCreateTest(){};
		~CExifCreateTest(){};
		void ExifCreate001L();
		void ExifCreate002L();
		void ExifCreate003L();
		void ExifCreate004L();
		void ExifCreate005L();
		void ExifCreate006L();
		void ExifCreate007L();
		void ExifCreate008L();
		void ExifCreate009L();
		void ExifCreate010L();
		void ExifCreate011L();
		void ExifCreate012L();
		void ExifCreate013L();
		//For fast test
		void ExifCreate101L();
		void ExifCreate102L();
		void ExifCreate103L();
		void ExifCreate104L();
		void ExifCreate105L();
		void ExifCreate106L();
		void ExifCreate107L();
		void ExifCreate108L();
		void ExifCreate109L();
		void ExifCreate110L();
		void ExifCreate111L();
		void ExifCreate112L();
		void ExifCreate113L();
		
        // Allocate the resources for one test function
        void setUpL ()
			{
			User::LeaveIfError(iFs.Connect());
			};
        
        // Free the resources reserved in setUpL()
        void tearDown ()
			{
			iFs.Close();
			};
	};

class CExifModifyTest : public CTestCase
	{
	friend class CExifLibTestInc;
	RFs iFs;

	public:
		CExifModifyTest(){};
		~CExifModifyTest(){};
		void ExifModify001L();
		void ExifModify002L();
		void ExifModify003L();
		void ExifModify004L();
		void ExifModify005L();
		void ExifModify006L();
		void ExifModify007L();
		void ExifModify008L();
		void ExifModify009L();
		void ExifModify010L();
		void ExifModify011L();
		void ExifModify012L();
		void ExifModify013L();
		void ExifModify014L();
		void ExifModify015L();
		void ExifModify016L();
		void ExifModify017L();
        void ExifModify018L();
        void ExifModify019L();
        void ExifModify020L();
        void ExifModify021L();
        void ExifModify022L();
        void ExifModify023L();
        // For fast modifier
		void ExifModify101L();
		void ExifModify102L();
		void ExifModify103L();
		void ExifModify104L();
		void ExifModify105L();
		void ExifModify106L();
		void ExifModify107L();
		void ExifModify108L();
		void ExifModify109L();
		void ExifModify110L();
		void ExifModify111L();
		void ExifModify112L();
		void ExifModify113L();
		void ExifModify114L();
		void ExifModify115L();
		void ExifModify116L();
		void ExifModify117L();
        void ExifModify118L();
        void ExifModify119L();
        

        // Allocate the resources for one test function
        void setUpL ()
			{
			User::LeaveIfError(iFs.Connect());
			};
        
        // Free the resources reserved in setUpL()
        void tearDown ()
			{
			iFs.Close();
			};
	};

class CExifModifyTest2 : public CTestCase
	{
	friend class CExifLibTestInc;
	RFs iFs;

	public:
		CExifModifyTest2(){};
		~CExifModifyTest2(){};
		void ExifModify001L();
		void ExifModify002L();
		void ExifModify003L();
		void ExifModify004L();
		void ExifModify005L();
		void ExifModify006L();
		void ExifModify007L();
		void ExifModify008L();
		void ExifModify009L();
		void ExifModify010L();
		void ExifModify011L();
		void ExifModify012L();
		void ExifModify013L();
		void ExifModify014L();
		void ExifModify015L();
		void ExifModify016L();
		void ExifModify017L();
        void ExifModify018L();
        void ExifModify019L();

        // Allocate the resources for one test function
        void setUpL ()
			{
			User::LeaveIfError(iFs.Connect());
			};
        
        // Free the resources reserved in setUpL()
        void tearDown ()
			{
			iFs.Close();
			};
	};

class CExifIopTest : public CTestCase
	{
	friend class CExifLibTestInc;
	RFs iFs;

	public:
		CExifIopTest(){};
		~CExifIopTest(){};
		void ExifIop001L();
		void ExifIop002L();
		void ExifIop003L();
		void ExifIop004L();
        void ExifIop005L();
        // Allocate the resources for one test function
        void setUpL ()
			{
			User::LeaveIfError(iFs.Connect());
			iWrite = ETrue;
			};
        
        // Free the resources reserved in setUpL()
        void tearDown ()
			{
			iFs.Close();
			};
	private:
		void ExifIop1L(const TDesC& aFileName);
		void ExifIop2L(const TDesC& aFileName);
		void ExifIop3L(CExifRead* aExifRead, const TDesC& aFileName);
		HBufC8* CreateDummyBufL(TInt aSize);
		void InsertGpsTagsL(CExifModify* aModify);	

		TBool iWrite;
	};

class CExifLibTestInc : public CTestCase
    {
    friend class CExifTagTest;
	friend class CExifReadTest;
	friend class CExifCreateTest;
    public:
        
        CExifLibTestInc();
        ~CExifLibTestInc();
        
        // Allocate the resources for one test function
        void setUpL ();
        
        // Free the resources reserved in setUpL()
        void tearDown ();
        
        // A function to collect and return a suite of tests
        static MTest* suiteL ();
	};