mmappcomponents/mmmtpdataprovider/tsrc/mtpdataprovidertestmodule/src/cplaylistmtpdataprovidertester.cpp
changeset 0 a2952bb97e68
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmappcomponents/mmmtpdataprovider/tsrc/mtpdataprovidertestmodule/src/cplaylistmtpdataprovidertester.cpp	Thu Dec 17 08:55:47 2009 +0200
@@ -0,0 +1,387 @@
+/*
+* 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:  Tester class for abstractmediamtpdp plugin
+*
+*/
+
+
+#include <e32def.h>
+#include <stiftestinterface.h>
+#include <settingserverclient.h>
+#include <mtp/mtpprotocolconstants.h>
+#include <mtp/cmtptypeobjectinfo.h>
+#include <mtp/cmtptypefile.h>
+#include <mtp/cmtptypestring.h>
+#include <mtp/cmtptypearray.h>
+#include <mtp/cmtptypeobjectproplist.h>
+#include <mtp/cmtptypeobjectpropdesc.h>
+#include <bautils.h>
+#include <f32file.h>
+#include <mpxharvesterutility.h>
+#include "cabstractmediamtpdataprovidertester.h"
+#include "logging.h"
+
+#ifdef LOGGER
+#undef LOGGER
+#endif
+#define LOGGER iLog
+
+// definitions and constants for the test data
+
+const TUint32 KTestStorageId = 0x10000;
+const TInt KTestObjectsCount = 1;
+const TUint KTestDirHandle = 1;
+const TInt KTestDirDataproviderId = 0;
+const TInt KPlaylistsDirParentId = 0;
+_LIT( KTempDirPath, "C:\\mtp_testdata\\temp\\" );
+_LIT( KTestDirPath, "C:\\mtp_testdata\\temp\\TESTDIR\\" );
+_LIT( KPlaylistFileOrigPath, "C:\\mtp_testdata\\PLAYLIST.M3U" );
+_LIT( KPlaylistFileTempPath, "C:\\mtp_testdata\\temp\\PLAYLIST.m3u" );
+_LIT( KPlaylistFilePath, "C:\\mtp_testdata\\temp\\PLAYLIST.m3u" );
+_LIT( KPlaylistsDirPath, "C:\\mtp_testdata\\temp\\Playlists\\" );
+_LIT( KTestDirOrigPath, "C:\\mtp_testdata\\TESTDIR\\*" );
+_LIT( KTestDirTempPath, "C:\\mtp_testdata\\temp\\TESTDIR\\" );
+_LIT( KTestDirPhysicalStorage, "C:\\mtp_testdata\\temp\\" );
+_LIT( KTestDirLogicalStorage, "C:\\mtp_testdata\\temp\\" );
+
+// ----------------------------------------------------------------------------
+// Two-phased constructor.
+// ----------------------------------------------------------------------------
+//
+CAbstractMediaMtpDataProviderTester* CAbstractMediaMtpDataProviderTester::NewL()
+    {
+    CAbstractMediaMtpDataProviderTester* self = 
+            new ( ELeave ) CAbstractMediaMtpDataProviderTester();
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// ----------------------------------------------------------------------------
+// C++ default constructor can NOT contain any code, that might leave.
+// ----------------------------------------------------------------------------
+//
+CAbstractMediaMtpDataProviderTester::CAbstractMediaMtpDataProviderTester()
+        : CMmMtpDataProviderTester()
+    {
+    // no implementation required
+    }
+
+// ----------------------------------------------------------------------------
+// Symbian 2nd phase constructor can leave.
+// ----------------------------------------------------------------------------
+//
+void CAbstractMediaMtpDataProviderTester::ConstructL()
+    {
+    TFileName logFileName;
+    logFileName.Copy( KMtpDataProviderTestModuleLogFile );
+    
+    iLog = CStifLogger::NewL( KMtpDataProviderTestModuleLogPath, 
+                          logFileName,
+                          CStifLogger::ETxt,
+                          TRACE_TARGET,
+                          ETrue, ETrue, ETrue, EFalse, ETrue );
+    PRINTF0( ">CAbstractMediaMtpDataProviderTester::ConstructL" );
+    iActiveSchedulerWait = new ( ELeave ) CActiveSchedulerWait();
+    iFsSession.Connect();
+    iFileMan = CFileMan::NewL( iFsSession );
+    PRINTF0( "<CAbstractMediaMtpDataProviderTester::ConstructL" );
+    }
+
+// ----------------------------------------------------------------------------
+// Destructor.
+// ----------------------------------------------------------------------------
+//  
+CAbstractMediaMtpDataProviderTester::~CAbstractMediaMtpDataProviderTester()
+    {
+    PRINTF0( ">CAbstractMediaMtpDataProviderTester::~CAbstractMediaMtpDataProviderTester" );
+    delete iActiveSchedulerWait;
+    delete iFileMan;
+    iFsSession.Close();
+    PRINTF0( "<CAbstractMediaMtpDataProviderTester::~CAbstractMediaMtpDataProviderTester" );
+    delete iLog;
+    }
+
+TInt CAbstractMediaMtpDataProviderTester::PrepareEnvironmentL()
+    {
+    PRINTF0( ">CAbstractMediaMtpDataProviderTester::PrepareEnvironmentL" );
+    TInt result = KErrNone;
+    
+    result = iFileMan->RmDir( KTempDirPath );
+    if ( result == KErrNone )
+        {
+        PRINTN0( "Warning: old temp directory found, deleted" );
+        }
+    result = KErrNone;
+    
+    // create the temp dir if it doesn't exist
+    BaflUtils::EnsurePathExistsL( iFsSession, KTempDirPath );
+    
+    // copy the test data to temp dir
+    result = iFileMan->Copy( KPlaylistFileOrigPath, KPlaylistFileTempPath );
+    if ( result != KErrNone ) 
+        {
+        PRINTE1( "Failed to copy playlist file, error %d", result );
+        }
+    else
+        {
+        result = iFileMan->Copy( KTestDirOrigPath, KTestDirTempPath,
+                CFileMan::EOverWrite | CFileMan::ERecurse );
+        if ( result != KErrNone ) 
+            {
+            PRINTE1( "Failed to copy test dir, error %d", result );
+            }
+        }
+    
+    MMPXHarvesterUtility* harvester = CMPXHarvesterFactory::NewL();
+    CleanupClosePushL( *harvester );
+    PRINTN0( "Starting to import playlist to mpx" );
+    iTestObserver->SetPendingOperation( CTestObserver::EHarvesterAddObject );
+    harvester->AddFileL(KPlaylistFilePath, iTestObserver);
+    
+    // waiting for asynchronous operation to complete
+    result = iTestObserver->WaitForPendingOperation(); 
+    if ( result != KErrNone )
+        {
+        PRINTE1( "Importing playlist to mpx failed with result %d", result );
+        }
+    harvester->CloseTransactionL();
+    CleanupStack::PopAndDestroy( harvester );
+    PRINTF1( "<CAbstractMediaMtpDataProviderTester::PrepareEnvironmentL result = %d", result );
+    return result;
+    }
+
+TInt CAbstractMediaMtpDataProviderTester::CleanEnvironmentL()
+    {
+    PRINTF0( ">CAbstractMediaMtpDataProviderTester::CleanEnvironmentL" );
+    TInt result = KErrNone;
+    TMTPObjectMgrQueryParams queryParams ( KMTPStorageAll, KMTPFormatsAll,
+            KMTPHandleNone );
+    RMTPObjectMgrQueryContext context;
+    RArray<TUint> handles;
+    CleanupClosePushL( handles );
+    
+    PRINTN0( "Starting to delete entries from mpx" );
+    MMPXHarvesterUtility* harvester = CMPXHarvesterFactory::NewL();
+    CleanupClosePushL( *harvester );
+    
+    iTestObserver->ObjectMgr().GetObjectHandlesL( queryParams, context,
+            handles );
+    PRINTV1( "Handle count: %d", handles.Count() );
+    context.Close();
+    
+    CMTPObjectMetaData* metadata = CMTPObjectMetaData::NewLC();
+    for ( TInt i = 0; i < handles.Count(); i++ )
+        {
+        TUint handle = handles[i];
+        if ( handle != KTestDirHandle )
+            {
+            iTestObserver->ObjectMgr().ObjectL( handles[i], *metadata );
+            TPtrC fileName = metadata->DesC( CMTPObjectMetaData::ESuid );
+            PRINTV1( "Handle: %d", handles[i] );
+            PRINTV1( "File name: %S", &fileName );
+            
+            PRINTN0( "Starting to delete the file from mpx" );
+            iTestObserver->SetPendingOperation( CTestObserver::EHarvesterDeleteObject );
+            harvester->DeleteFileL( fileName, iTestObserver );
+            User::After( 1000000 );
+            // waiting for asynchronous operation to complete
+            result = iTestObserver->WaitForPendingOperation();
+            if ( result != KErrNone )
+                {
+                PRINTE1( "Warning: failed to delete from mpx, error %d", result );
+                result = KErrNone; // ignore for now, there are problems after DeleteObject
+                }
+            }
+        }
+    CleanupStack::PopAndDestroy( 3 ); // metadata, harvester, handles
+    PRINTN0( "Finished deleting entries from mpx" );
+    
+    if ( result == KErrNone )
+        {
+        PRINTN0( "Deleting temp directory" );
+        result = iFileMan->RmDir( KTempDirPath );
+        if ( result != KErrNone )
+            {
+            PRINTE1( "Warning: failed to delete temp directory, error %d", result );
+            result = KErrNone;
+            }
+        }
+    
+    PRINTF1( "<CAbstractMediaMtpDataProviderTester::CleanEnvironmentL result = %d", result );
+    return result;
+    }
+
+TBool CAbstractMediaMtpDataProviderTester::ObjectEnumerationL_prepare(
+        CMTPStorageMetaData* aPhysicalStorage,
+        CMTPStorageMetaData* aLogicalStorage )
+    {
+    PRINTF0( ">CAbstractMediaMtpDataProviderTester::ObjectEnumerationL_prepare" );
+    
+    TBool result = ETrue;
+    aPhysicalStorage->SetDesCL( CMTPStorageMetaData::EStorageSuid,
+            KTestDirPhysicalStorage() );
+    aPhysicalStorage->SetUint( CMTPStorageMetaData::EStorageSystemType,
+            CMTPStorageMetaData::ESystemTypeDefaultFileSystem );
+    
+    aLogicalStorage->SetDesCL( CMTPStorageMetaData::EStorageSuid,
+            KTestDirLogicalStorage() );
+    aLogicalStorage->SetUint( CMTPStorageMetaData::EStorageSystemType,
+            CMTPStorageMetaData::ESystemTypeDefaultFileSystem );
+    
+    // insert TESTDIR object manually
+    CMTPObjectMetaData* object( CMTPObjectMetaData::NewLC( 0,
+            EMTPFormatCodeAssociation, // a folder object
+            KTestStorageId, KTestDirPath ) );
+    // object is in storage root
+    object->SetInt( CMTPObjectMetaData::EParentId, KErrNotFound );
+    
+    iTestObserver->ObjectMgr().InsertObjectL( *object );
+    CleanupStack::PopAndDestroy( object );
+    
+    PRINTF1( "<CAbstractMediaMtpDataProviderTester::ObjectEnumerationL_prepare result = %d", result );
+    return result;
+    }
+
+TInt CAbstractMediaMtpDataProviderTester::ObjectEnumerationL_checkresults(
+        MMTPObjectMgr& aObjectManager )
+    {
+    PRINTF0( ">CAbstractMediaMtpDataProviderTester::ObjectEnumerationL_checkresults" );
+    
+    TInt result = KErrNone;
+    
+    TMTPObjectMgrQueryParams queryParams ( KMTPStorageAll, KMTPFormatsAll,
+            KMTPHandleNone );
+    RMTPObjectMgrQueryContext context;
+    RArray<TUint> handles;
+    CleanupClosePushL( handles );
+    MMPXHarvesterUtility* harvester = CMPXHarvesterFactory::NewL();
+    CleanupClosePushL( *harvester );
+    
+    aObjectManager.GetObjectHandlesL( queryParams, context, handles );
+    context.Close();
+    TInt count = handles.Count();
+    PRINTV1( "Handle count: %d", count );
+    if ( count != KTestObjectsCount ) 
+        {
+        PRINTE2( "Wrong number of handles: %d != %d", count, KTestObjectsCount );
+        result = KErrGeneral;
+        }
+    
+    CMTPObjectMetaData* metadata = CMTPObjectMetaData::NewLC();
+    for ( TInt i = 0; i < count; i++ )
+        {
+        TUint handle = handles[i];
+        aObjectManager.ObjectL( handle, *metadata );
+        TPtrC suid = metadata->DesC( CMTPObjectMetaData::ESuid );
+        TUint formatCode = metadata->Uint( CMTPObjectMetaData::EFormatCode );
+        TUint dataproviderId = metadata->Uint( CMTPObjectMetaData::EDataProviderId );
+        TUint storageId = metadata->Uint( CMTPObjectMetaData::EStorageId );
+        TInt parentId = metadata->Int( CMTPObjectMetaData::EParentId );
+        
+        PRINTN1( "Handle: %d", handle );
+        PRINTN1( "Suid: %S", &suid );
+        
+        if ( dataproviderId != KTestDirDataproviderId )
+            {
+            PRINTE2( "Wrong dataprovider id: %d != %d", dataproviderId, KTestDirDataproviderId );
+            result = KErrGeneral;
+            }
+        if ( storageId != KTestStorageId )
+            {
+            PRINTE2( "Wrong storage id: %d != %d", storageId, KTestStorageId );
+            result = KErrGeneral;
+            }
+        switch ( handle )
+            {
+            case 1:
+                {
+                if ( suid.Match( KTestDirPath ) != 0 )
+                    {
+                    PRINTE2( "Wrong test dir path: %S != %S", &suid, &KTestDirPath );
+                    result = KErrGeneral;
+                    }
+                if ( formatCode != EMTPFormatCodeAssociation )
+                    {
+                    PRINTE2( "Wrong format code: 0x%x != 0x%x", formatCode, EMTPFormatCodeAssociation );
+                    result = KErrGeneral;
+                    }
+                if ( parentId != KErrNotFound )
+                    {
+                    PRINTE2( "Wrong parent id: %d != %d", parentId, KErrNotFound );
+                    result = KErrGeneral;
+                    }
+                break;
+                }
+            case 2:
+                {
+                if ( suid.Match( KPlaylistsDirPath ) != 0 )
+                    {
+                    PRINTE2( "Wrong test object 1 path: %S != %S", &suid, &KPlaylistsDirPath );
+                    result = KErrGeneral;
+                    }
+                if ( formatCode != EMTPFormatCodeAssociation )
+                    {
+                    PRINTE2( "Wrong format code: 0x%x != 0x%x", formatCode, EMTPFormatCodeAssociation );
+                    result = KErrGeneral;
+                    }
+                if ( parentId != KPlaylistsDirParentId )
+                    {
+                    PRINTE2( "Wrong parent id: %d != %d", parentId, KPlaylistsDirParentId );
+                    result = KErrGeneral;
+                    }
+                break;
+                }
+            default:
+                {
+                PRINTE1( "Unexpected handle: %d", handle );
+                result = KErrGeneral;
+                }
+            }
+        /*
+        if ( ( result == KErrNone ) && ( handle != KTestDirHandle ) )
+            {
+            PRINTN0( "Starting to harvest the file" );
+            iTestObserver->SetPendingOperation( CTestObserver::EHarvesterAddObject );
+            harvester->AddFileL( metadata->DesC( CMTPObjectMetaData::ESuid ), iTestObserver );
+            PRINTN0( "Waiting for harvesting to complete" );
+            result = iTestObserver->WaitForPendingOperation();
+            if ( result != KErrNone )
+                {
+                PRINTE1( "Harvesting error: %d", result );
+                }
+            }
+        */
+        }
+    CleanupStack::PopAndDestroy( 3 ); // handles, harvester, metadata
+    PRINTF1( "<CAbstractMediaMtpDataProviderTester::ObjectEnumerationL_checkresults result = %d", result );
+    return result;
+    }
+
+TInt CAbstractMediaMtpDataProviderTester::DeleteObjectL_checkresults(
+        MMTPObjectMgr& aObjectManager )
+    {
+    PRINTF0( ">CAbstractMediaMtpDataProviderTester::DeleteObjectL_checkresults" );
+    TInt result = KErrNone;
+    // check that everything has been deleted from the file system
+    if ( BaflUtils::FileExists( iFsSession, KPlaylistFilePath ) ) 
+        {
+        PRINTE0( "Playlist file was not deleted successfully" );
+        // playlist file is not enumerated, so it cannot be deleted
+        //result = KErrGeneral;
+        }
+    PRINTF1( ">CAbstractMediaMtpDataProviderTester::DeleteObjectL_checkresults result = %d", result );
+    return result;
+    }