kerneltest/f32test/bench/t_notify_perf_util.cpp
changeset 0 a41df078684a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kerneltest/f32test/bench/t_notify_perf_util.cpp	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,293 @@
+// 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 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:
+// f32test\bench\t_notify_perf_util.cpp
+// 
+//
+
+#include "t_notify_perf.h"
+#include "t_server.h"
+
+void DoKillThreadsL()
+    {
+    TInt count = 0;
+    while (count < gNotiThreads.Count())
+        {
+        gNotiThreads[count].Kill(KErrGeneral);
+        count++;
+        }
+    gFileThread.Kill(KErrGeneral);
+    }
+
+// Safe way of checking in sub threads, it leaves when check fails, Main thread will catch the error and exit.
+// if use test() directly in sub-threads, the threads may hang if check fails
+void SafeTestL(TBool aResult, TInt aId, TInt aLine, TText* aFile)
+    {
+    if (!aResult)
+        {
+        if (aId >= 0)
+            {
+            RDebug::Print(_L("NotificationThread%02d: Failed check in %s at line %d"), aId, aFile, aLine);
+            }
+        else if (aId == KNoThreadId)
+            {
+            RDebug::Print(_L("Failed check in %s at line %d"), aFile, aLine);
+            }
+        CTestExecutor::KillAllTestThreads();
+        }
+    }
+
+void SafeTestL(TInt aResult, TInt aExpected, TInt aId, TInt aLine, TText* aFile)
+    {
+    if (aResult != aExpected)
+        {
+        if (aId >= 0)
+            {
+            RDebug::Print(_L("NotificationThread%02d: Failed check in %s at line %d, expected %d, got %d"), aId, aFile, aLine, aExpected, aResult);
+            }
+        else if (aId == KNoThreadId)
+            {
+            RDebug::Print(_L("Failed check in %s at line %d, expected %d, got %d"), aFile, aLine, aExpected, aResult);
+            }
+        CTestExecutor::KillAllTestThreads();
+        }
+    }
+
+void SetTestPaths()
+    {
+    gTestPath.FillZ();
+    gLogFilePath.FillZ();
+    
+    gTestPath.Append(gDriveToTest);
+    gTestPath.Append(_L(":\\F32-TST\\T_Notify_Perf\\"));
+    
+#ifndef __WINSCW__
+    gLogFilePath.Append(gDriveToTest);
+#else
+    gLogFilePath.Append((TChar)'C');  //If emulator lets stick it on C: (\epoc32\wisncw\c\)
+#endif
+    if (gPerfMeasure)
+        gLogFilePath.Append(_L(":\\F32-TST\\NPTestLog\\"));
+    else
+        gLogFilePath.Append(_L(":\\F32-TST\\Temp\\"));
+    }
+
+// Mapping from file operations to notification types
+TUint OpNotifyMapping(TUint16& aOption, TInt aOperation)
+    {
+    if (aOption & EEnhanced)
+        {
+        switch(aOperation)
+            {       
+            case EOpCreate:
+            case EOpCreateDir:
+                return TFsNotification::ECreate;
+            case EOpReplace:
+            case EOpRename:
+            case EOpRenameDir:
+                return TFsNotification::ERename;
+            case EOpChgAttr:
+                return TFsNotification::EAttribute;
+            case EOpWrite:
+            case EOpResize:
+            case EOpManyChanges:
+            case EOpManyFiles:
+                return TFsNotification::EFileChange;
+            case EOpDelete:
+            case EOpDeleteDir:
+                return TFsNotification::EDelete;
+            case EOpMixed:
+                return (TUint) (TFsNotification::EAllOps & (~TFsNotification::EOverflow));
+            default:
+                return (TUint) TFsNotification::EAllOps;
+            }
+        }
+    else if (aOption & EOriginal)
+        {
+        switch(aOperation)
+            {   
+            case EOpCreate:
+            case EOpReplace:
+            case EOpRename:
+                return ENotifyFile;
+            case EOpChgAttr:
+            case EOpResize:
+                return ENotifyAttributes;
+            case EOpWrite:
+            case EOpManyChanges:
+            case EOpManyFiles:
+                return ENotifyWrite;
+            case EOpDelete:
+                return ENotifyEntry;
+            case EOpCreateDir:
+            case EOpRenameDir:
+            case EOpDeleteDir:
+                return ENotifyDir;
+            case EOpMixed:
+            default:
+                return ENotifyAll;
+            }
+        }
+    else if (aOption & EPlugin)
+        {
+        switch(aOperation)
+            {
+            case EOpCreate:
+                return EMdsFileCreated;
+            case EOpReplace:
+                return EMdsFileReplaced;
+            case EOpRename:
+                return EMdsFileRenamed;
+            case EOpDelete:
+                return EMdsFileDeleted;
+            case EOpRenameDir:
+                return EMdsDirRenamed;
+            default:
+                // All other operations are not testable
+                return EMdsFileUnknown;
+            }
+        }
+    return 0;
+    }
+
+// generate file names for testing
+void FileNameGen(TFileName& aName, TInt aNum, TBool aIsFile = ETrue)
+    {
+    aName.FillZ();
+    aName.Copy(gTestPath);
+    if (aIsFile)
+        aName.AppendFormat(_L("%04d.tst"), aNum);
+    else
+        aName.AppendFormat(_L("DIR%04d\\"), aNum);
+    }
+
+void ClearTestPathL()
+    {
+    RDebug::Print(_L("Clearing test path..."));
+    RFs fs;
+    User::LeaveIfError(fs.Connect());
+    CFileMan* fm = CFileMan::NewL(fs);
+    TInt r = fm->RmDir(gTestPath);
+    test(r==KErrNone || r==KErrPathNotFound || r==KErrNotFound);
+    r = fs.MkDirAll(gTestPath);
+    test(r==KErrNone || r==KErrAlreadyExists);
+    
+    delete fm;
+    fs.Close();
+    }
+
+void DeleteLogFilesL()
+    {
+    RDebug::Print(_L("Clearing test logs if exist..."));
+    RFs fs;
+    User::LeaveIfError(fs.Connect());
+    CFileMan* fm = CFileMan::NewL(fs);
+    
+    TFileName logFiles;
+    logFiles.Copy(gLogFilePath);
+    logFiles.Append('*');
+    logFiles.Append(gLogPostFix);
+    
+    TInt r = fm->Delete(logFiles);
+    test(r==KErrNone || r==KErrPathNotFound || r==KErrNotFound);
+    if (r != KErrNone)
+        {
+        r = fs.MkDirAll(gLogFilePath);
+        test(r==KErrNone || r==KErrAlreadyExists);
+        }
+    
+    delete fm;
+    fs.Close();
+    }
+
+// Copy log files from test drive to MMC
+void CopyLogFilesL()
+    {
+    RFs fs;
+    User::LeaveIfError(fs.Connect());
+    CFileMan* fm = CFileMan::NewL(fs);
+    
+    TFileName path;
+    path.Append(_L("D:\\NPTLogs\\"));
+    TInt r = fs.MkDirAll(path);
+    test(r == KErrNone || r == KErrAlreadyExists);
+    fm->Copy(gLogFilePath, path);
+    
+    delete fm;
+    fs.Close();
+    }
+
+// compare the name of two entries
+TBool CompareEntryName(const TEntry& aEntry1, const TEntry& aEntry2)
+    {
+    return (aEntry1.iName.Compare(aEntry2.iName) == 0);
+    }
+
+// start file operations
+void DoFileOperationL(TThreadParam* aParam)
+    {
+    CFileOperator fileOperator(aParam->iSetting, *(aParam->iLoggerArray), aParam->iSmphFT, aParam->iSmphNT);
+    fileOperator.DoChangesL();
+    }
+
+// start monitoring notification
+void DoNotificationOperationL(TThreadParam* aParam)
+    {
+    CActiveScheduler* sch = new(ELeave) CActiveScheduler(); 
+    CleanupStack::PushL(sch);
+    CActiveScheduler::Install(sch);
+    
+    CNotifyOperator notifyOperator(aParam->iSetting, aParam->iSmphFT, aParam->iSmphNT, aParam->iLogger);
+    aParam->iSmphFT->Signal();
+    notifyOperator.StartOperationL();
+    
+    CleanupStack::PopAndDestroy();
+    }
+
+// entry function of file operaton thread
+TInt FileOperationThread(TAny* aParam)
+    {
+    CTrapCleanup* cleanup;
+    cleanup = CTrapCleanup::New();
+    
+    TRAPD(r, DoFileOperationL(static_cast<TThreadParam*>(aParam)));
+
+    delete cleanup;
+    
+    return r;
+    }
+
+// entry function of notification thread
+TInt NotificationOperationThread(TAny* aParam)
+    {
+    CTrapCleanup* cleanup;
+    cleanup = CTrapCleanup::New();
+    
+    TRAPD(r, DoNotificationOperationL(static_cast<TThreadParam*>(aParam)));
+    
+    delete cleanup;
+    
+    return r;
+    }
+
+TInt KillerThread(TAny*)
+    {
+    CTrapCleanup* cleanup;
+    cleanup = CTrapCleanup::New();
+    
+    TRAPD(r, DoKillThreadsL());
+    
+    delete cleanup;
+    
+    return r;
+    }