kerneltest/f32test/bench/t_notify_perf_util.cpp
author Tom Cosgrove <tom.cosgrove@nokia.com>
Fri, 28 May 2010 16:29:07 +0100
changeset 30 8aab599e3476
parent 0 a41df078684a
permissions -rw-r--r--
Fix for bug 2283 (RVCT 4.0 support is missing from PDK 3.0.h) Have multiple extension sections in the bld.inf, one for each version of the compiler. The RVCT version building the tools will build the runtime libraries for its version, but make sure we extract all the other versions from zip archives. Also add the archive for RVCT4.

// 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;
    }