installationservices/swinstallationfw/test/tusif/source/tsifnotifierteststep.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 31 Aug 2010 15:21:33 +0300
branchRCL_3
changeset 25 7333d7932ef7
permissions -rw-r--r--
Revision: 201033 Kit: 201035

/*
* Copyright (c) 2010 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: 
*
*/


/**
 @file
 @internalTechnology 
*/

#include "tsifnotifierteststep.h"
#include "tsifsuitedefs.h"
#include <usif/sif/sifcommon.h>
#include <usif/sif/sif.h>
#include <scs/cleanuputils.h>
#include <ct/rcpointerarray.h>

using namespace Usif;

_LIT(KOperationCount, "OperationCount");
_LIT(KOperation, "Operation");
_LIT(KGlobalCompId, "GlobalCompId");
_LIT(KComponentName, "ComponentName");
_LIT(KComponentIcon, "ComponentIcon");
_LIT(KAppNameCount, "AppNameCount");
_LIT(KAppName, "AppName");
_LIT(KAppIconCount, "AppIconCount");
_LIT(KAppIcon, "AppIcon");
_LIT(KComponentSize, "ComponentSize");
_LIT(KIconPath, "IconPath");
_LIT(KSoftwareType, "SoftwareType");
_LIT(KErrMsg, "ErrMsg");
_LIT(KErrMsgDetails, "ErrMsgDetails");
_LIT(KErrCategory, "ErrCategory");
_LIT(KErrCode, "ErrCode");
_LIT(KPhase, "Phase");
_LIT(KSubPhase, "SubPhase");
_LIT(KCurrentProgress, "CurrentProgress");
_LIT(KTotal, "Total");
_LIT(KSubscriberNumber, "SubscriberNumber");
_LIT(KKeyNumber, "KeyNumber");
_LIT (KSubscribeKey, "SubscribeKey");
_LIT (KSubscribeForProgress, "SubscribeForProgress");
_LIT (KEndData, "EndData");
_LIT (KProgressData, "ProgressData");
_LIT (KDelay, "Delay");
_LIT (KTotalStartCount, "StartCount");
_LIT (KTotalProgressCount, "ProgressCount");
_LIT (KTotalEndCount, "EndCount");
_LIT (KSubscribeShutdownTimer, "SubscribeShutdownTimer");
_LIT (KPublisherDelay, "PublisherDelay");
_LIT (KPrintDetails, "PrintDetails");
CSifSubscribeTestStep::~CSifSubscribeTestStep()
/**
* Destructor
*/
    {
    INFO_PRINTF1(_L("Cleanup in CSifSubscribeTestStep::~CSifSubscribeTestStep()"));
    }

CSifSubscribeTestStep::CSifSubscribeTestStep()
/**
* Constructor
*/
    {
    SetTestStepName(KSifSubscribeTestStep);
    }

void CSifSubscribeTestStep::ImplTestStepPreambleL()
/**
* @return - TVerdict code
* Override of base class virtual
*/
    {
    INFO_PRINTF1(_L("I am in CSifSubscribeTestStep::ImplTestStepPreambleL()."));
    iSched=new(ELeave) CActiveScheduler;
    CActiveScheduler::Install(iSched);
    SetTestStepResult(EPass);
    }


void CSifSubscribeTestStep::ImplTestStepL()
/**
* @return - TVerdict code
* Override of base class pure virtual
* Our implementation only gets called if the base class doTestStepPreambleL() did
* not leave. That being the case, the current test result value will be EPass.
*/
    {   
    //Get the  Subscriber number
    GetIntFromConfig(ConfigSection(),KSubscriberNumber, iSubscriberNum);
    
    // Delay the Startup ?
    TInt delay(0);
    //Get the  delay value if present
    GetIntFromConfig(ConfigSection(),KDelay, delay);
    if(delay !=0)
        {
        User::After(delay * 1000000);
        }
    
    
    iNotifier = CSifOperationsNotifier::NewL(*this);
    TInt shutdownTimer(0);
    GetIntFromConfig(ConfigSection(), KSubscribeShutdownTimer, shutdownTimer);
    if(shutdownTimer ==0)
        {
        shutdownTimer = 10; //default value
        }
    iTimer = CStopTimer::NewL(iNotifier, shutdownTimer* 1000000);
    CActiveScheduler::Start();

    //Verify Counts
    TInt startCount(0);
    GetIntFromConfig(ConfigSection(), KTotalStartCount, startCount);
    
    if(startCount != iStartMessageCounter)
        {
        INFO_PRINTF1(_L("Total number of start handler notifications received does not match expected value"));
        SetTestStepResult(EFail);
        }

    TInt progressCount(0);
    GetIntFromConfig(ConfigSection(), KTotalProgressCount, progressCount);
    
    if(progressCount != iProgressMessageCounter)
        {
        INFO_PRINTF1(_L("Total number of progress handler notifications received does not match expected value"));
        SetTestStepResult(EFail);
        }
    
    TInt endCount(0);
    GetIntFromConfig(ConfigSection(), KTotalEndCount, endCount);
    
    if(endCount != iEndMessageCounter)
        {
        INFO_PRINTF1(_L("Total number of end handler notifications received does not match expected value"));
        SetTestStepResult(EFail);
        }    
    
    }

void CSifSubscribeTestStep::ImplTestStepPostambleL()
/**
* @return - TVerdict code
* Override of base class virtual
*/
    {   
    INFO_PRINTF1(_L("I am in CSifPublishTestStep::ImplTestStepPostambleL()."));
    delete iNotifier;
    delete iSched;
    delete iTimer;
    }

void CSifSubscribeTestStep::StartOperationHandler(TUint aKey, const CSifOperationStartData& aStartData)
    { 
    TBuf<20> Key;
    Key = KKeyNumber;
    GenerateIndexedAttributeNameL(Key, ++iStartMessageCounter);
    TPtrC keyFromIni;
    GetStringFromConfig(ConfigSection(), Key, keyFromIni);
    HBufC* retrievedKeyFromIni = keyFromIni.AllocLC();
    
    //Received Key
    HBufC* receivedKey = HBufC::NewLC(20);
    receivedKey->Des().Format(_L("%d"), aKey );
    
    if(*receivedKey != *retrievedKeyFromIni)
        {
        INFO_PRINTF1(_L("Key Mismatch !") );
        SetTestStepResult(EFail);
        }
    else
        {
        INFO_PRINTF1(_L("Received Correct Key!") );
        }
    
    
    //Subscribe to key ?
    TBuf<20> SubscribeKey;
    SubscribeKey = KSubscribeKey;
    GenerateIndexedAttributeNameL(SubscribeKey, ++iSubscribeCounter);
    
    TPtrC SubscribeKeyFromIni;
    if(GetStringFromConfig(ConfigSection(),SubscribeKey, SubscribeKeyFromIni))
        {
        HBufC* retrievedSubscribeKeyFromIni = SubscribeKeyFromIni.AllocLC();
        
        
        if(*retrievedSubscribeKeyFromIni == *receivedKey)
            {
            INFO_PRINTF3(_L("Subscribing to Key %d from Subscriber%d ."), aKey, iSubscriberNum);
            
            TBuf<35> progressNotifier;
            progressNotifier = KSubscribeForProgress;
            GenerateIndexedAttributeNameL(progressNotifier, iSubscribeCounter);
            
            TBool progressNotifierVal;
            GetBoolFromConfig(ConfigSection(),progressNotifier, progressNotifierVal);
            iNotifier->SubscribeL(aKey, progressNotifierVal);
            }
 
        CleanupStack::PopAndDestroy(retrievedSubscribeKeyFromIni);
        }   
    
    CleanupStack::PopAndDestroy(2, retrievedKeyFromIni);
    //Global Component Id check
    TBuf<20> GlobalId;
    GlobalId = KGlobalCompId;
    GenerateIndexedAttributeNameL(GlobalId, iStartMessageCounter);
    
    TPtrC globalIdFromIni;
    GetStringFromConfig(ConfigSection(),GlobalId, globalIdFromIni);
    
    HBufC* retrievedGlobalIdFromIni = globalIdFromIni.AllocLC();
    
    
    if(*retrievedGlobalIdFromIni != aStartData.GlobalComponentId())
        {       
        INFO_PRINTF1(_L("Global Component Id mismatch !") );
        SetTestStepResult(EFail); 
        }
    else
        {
        INFO_PRINTF1(_L("Received Correct Global Component Id !") );     
        }   
    CleanupStack::PopAndDestroy(retrievedGlobalIdFromIni);
    
    //Print received data ?
    TBool print;
    if(GetBoolFromConfig(ConfigSection(),KPrintDetails, print))
        {
        INFO_PRINTF2(_L("Global Component Id : %S"),  &aStartData.GlobalComponentId());
        INFO_PRINTF2(_L("Component Name: %S"),  &aStartData.ComponentName());
        
        for(TInt i=0; i<aStartData.ApplicationNames().Count(); ++i)
            {
            INFO_PRINTF3(_L("Application name %d : %S"), i,  aStartData.ApplicationNames()[i]);
            }
        for(TInt i=0; i<aStartData.ApplicationIcons().Count(); ++i)
            {
            INFO_PRINTF3(_L("Application icons %d : %S"), i,  aStartData.ApplicationIcons()[i]);
            }       
        INFO_PRINTF2(_L("Component Size : %d"),  aStartData.ComponentSize());
        INFO_PRINTF2(_L("Icon Path : %S"),  &aStartData.IconPath());
        INFO_PRINTF2(_L("Component Icon : %S"),  &aStartData.ComponentIcon());
        INFO_PRINTF2(_L("Software Type: %S"),  &aStartData.SoftwareType());
        INFO_PRINTF2(_L("Operation Phase : %d"), (TInt)aStartData.OperationPhase());
        
        }
    }


void CSifSubscribeTestStep::EndOperationHandler(const CSifOperationEndData& aEndData)
    {
    TBuf<20> endData;
    endData = KEndData;
    GenerateIndexedAttributeNameL(endData, ++iEndMessageCounter);
    
    TPtrC endDataFromIni;
    if(GetStringFromConfig(ConfigSection(),endData, endDataFromIni))
        {
        HBufC* retrievedEndDataFromIni = endDataFromIni.AllocLC();
        
        if(*retrievedEndDataFromIni != aEndData.GlobalComponentId())
            {
            SetTestStepResult(EFail);
            INFO_PRINTF1(_L("End Data Mismatch !") );
            }
        else
            {
            INFO_PRINTF1(_L("Correct end data received !") );
            }     
        CleanupStack::PopAndDestroy(retrievedEndDataFromIni);
        }
    else
        {
        SetTestStepResult(EFail);
        INFO_PRINTF1(_L("End Data Mismatch !") );
        }
    
    //Print received data ?
    TBool print;
    if(GetBoolFromConfig(ConfigSection(),KPrintDetails, print))
        {
        INFO_PRINTF2(_L("Global Component Id : %S"),  &aEndData.GlobalComponentId());
        INFO_PRINTF2(_L("Error Category : %d"),  (TInt)aEndData.ErrorCategory());
        INFO_PRINTF2(_L("Error code : %d"),  aEndData.ErrorCode());
        INFO_PRINTF2(_L("Error message : %S"),  &aEndData.ErrorMessage());
        INFO_PRINTF2(_L("Error message details : %S"),  &aEndData.ErrorMessageDetails());
        }
    }

void CSifSubscribeTestStep::ProgressOperationHandler(const CSifOperationProgressData& aProgressData)
    {
    TBuf<20> progressData;
    progressData = KProgressData;
    GenerateIndexedAttributeNameL(progressData, ++iProgressMessageCounter);
    
    TPtrC progressDataFromIni;
    if(GetStringFromConfig(ConfigSection(),progressData, progressDataFromIni))
        {
        HBufC* retrievedprogressDataFromIni = progressDataFromIni.AllocLC();
        
        if(*retrievedprogressDataFromIni != aProgressData.GlobalComponentId())
            {
            SetTestStepResult(EFail);
            INFO_PRINTF1(_L("Progress Data Mismatch !") );
            }
        else
            {
            INFO_PRINTF1(_L("Correct progress data received !") );
            }
        
        CleanupStack::PopAndDestroy(retrievedprogressDataFromIni);       
        }
    else
        {
        SetTestStepResult(EFail);
        INFO_PRINTF1(_L("Progress Data Mismatch !") );
        }   
    
    //Print received data ?
    TBool print;
    if(GetBoolFromConfig(ConfigSection(),KPrintDetails, print))
        {
        INFO_PRINTF2(_L("Global Component Id : %S"),  &aProgressData.GlobalComponentId());
        INFO_PRINTF2(_L("Phase : %d"),  (TInt)aProgressData.Phase());
        INFO_PRINTF2(_L("Sub Phase : %d"),  (TInt)aProgressData.SubPhase());
        INFO_PRINTF2(_L("Current Progress : %d"),  aProgressData.CurrentProgress());
        INFO_PRINTF2(_L("Total Value : %d"),  aProgressData.Total());
        
        }
    }

void CSifSubscribeTestStep::GenerateIndexedAttributeNameL(TDes& aInitialAttributeName, TInt aIndex)
    {
    const TInt MAX_INT_STR_LEN = 8;
    TBuf<MAX_INT_STR_LEN> integerAppendStr;
    integerAppendStr.Format(_L("%d"), aIndex);
    aInitialAttributeName.Append(integerAppendStr);
    }

CSifPublishTestStep::~CSifPublishTestStep()
/**
* Destructor
*/
    {
    INFO_PRINTF1(_L("Cleanup in CSifPublishTestStep::~CSifPublishTestStep()"));
    delete iTimer;
    delete iPublisher;
    delete iSched;
    }

CSifPublishTestStep::CSifPublishTestStep()
/**
* Constructor
*/
    {
    SetTestStepName(KSifPublishTestStep);
    }

void CSifPublishTestStep::ImplTestStepPreambleL()
/**
* @return - TVerdict code
* Override of base class virtual
*/
    {
    INFO_PRINTF1(_L("I am in CSifPublishTestStep::ImplTestStepPreambleL()."));
    
    TInt delay(0);
    //Get the  delay value if present
    GetIntFromConfig(ConfigSection(),KDelay, delay);
    if(delay !=0)
        {
        User::After(delay * 1000000);
        }
   
    iSched=new(ELeave) CActiveScheduler;
    CActiveScheduler::Install(iSched);
    iPublisher = CPublishSifOperationInfo::NewL();
    }

void CSifPublishTestStep::GenerateIndexedAttributeNameL(TDes& aInitialAttributeName, TInt aIndex)
    {
    const TInt MAX_INT_STR_LEN = 8;
    TBuf<MAX_INT_STR_LEN> integerAppendStr;
    integerAppendStr.Format(_L("%d"), aIndex);
    aInitialAttributeName.Append(integerAppendStr);
    }

void CSifPublishTestStep::PublishDataL(HBufC* aConfigSection)
    {
    HBufC* configsection;
    if(aConfigSection == NULL)
       configsection = ConfigSection().AllocLC();
    else
       configsection = aConfigSection->AllocLC();
        
	TPtrC op;
	GetStringFromConfig(*configsection,KOperation, op);
    if(op.Compare(_L("start")) == 0)
		{
		TPtrC globalCompId, compName, compIcon, appName, appIcon, iconPath, softwareType;
		TInt appNameCount =0;
		TInt appIconCount =0;
		TInt compSize = 0;
		TInt phase = 0;
		GetStringFromConfig(*configsection,KGlobalCompId, globalCompId);
		GetStringFromConfig(*configsection,KComponentName, compName);
		GetStringFromConfig(*configsection,KComponentIcon, compIcon);
		GetIntFromConfig(*configsection, KAppNameCount, appNameCount);
		RPointerArray<HBufC> appNameArray;
		CleanupResetAndDestroyPushL(appNameArray);
		for (TUint i = 0; i < appNameCount; ++i)
			{
			TPtrC tAppName;
			TBuf<20> appName;
			appName = KAppName;
			GenerateIndexedAttributeNameL(appName, i);
			GetStringFromConfig(*configsection, appName, tAppName);
			HBufC* applicationName = tAppName.AllocLC();
			appNameArray.AppendL(applicationName);
			CleanupStack::Pop(applicationName);
			}
		GetIntFromConfig(*configsection, KAppIconCount, appIconCount);
		RPointerArray<HBufC> appIconArray;
		CleanupResetAndDestroyPushL(appIconArray);
		for (TUint i = 0; i < appIconCount; ++i)
			{
			TPtrC tAppIcon;
			TBuf<20> appIcon;
			appIcon = KAppIcon;
			GenerateIndexedAttributeNameL(appIcon, i);
			GetStringFromConfig(*configsection, appIcon, tAppIcon);
			HBufC* applicationIcon = tAppIcon.AllocLC();
			appIconArray.AppendL(applicationIcon);
			CleanupStack::Pop(applicationIcon);
			}
       
		GetIntFromConfig(*configsection, KComponentSize, compSize);
		GetStringFromConfig(*configsection, KIconPath, iconPath);
		GetStringFromConfig(*configsection, KSoftwareType, softwareType);
		GetIntFromConfig(*configsection, KPhase, phase);

		TSifOperationPhase enumPhase = static_cast<TSifOperationPhase>(phase);
        CSifOperationStartData* startdata = CSifOperationStartData::NewLC(globalCompId, compName, appNameArray, appIconArray, compSize, iconPath, compIcon, softwareType, enumPhase);
        iPublisher->PublishStartL(*startdata);   
        CleanupStack::PopAndDestroy(3, &appNameArray);
        }
    else if(op.Compare(_L("progress")) == 0)
        {
		TInt phase=0, subPhase=0, curProgress=0, total=0;
		TPtrC globalCompIdProgress;
		GetStringFromConfig(*configsection,KGlobalCompId, globalCompIdProgress);
		GetIntFromConfig(*configsection, KPhase, phase);
		GetIntFromConfig(*configsection, KSubPhase, subPhase);
		GetIntFromConfig(*configsection, KCurrentProgress, curProgress);
		GetIntFromConfig(*configsection, KTotal, total);

		TSifOperationPhase enumPhase = static_cast<TSifOperationPhase>(phase);
		TSifOperationSubPhase enumSubPhase = static_cast<TSifOperationSubPhase>(subPhase);
        CSifOperationProgressData* progressdata = CSifOperationProgressData::NewLC(globalCompIdProgress, enumPhase, enumSubPhase, curProgress, total);
        iPublisher->PublishProgressL(*progressdata);    
        CleanupStack::PopAndDestroy(progressdata);
        }
    else if(op.Compare(_L("end")) == 0)
        {
		TPtrC errMsg, errMsgDetails;
		TInt errCat, errCode;
		TPtrC globalCompIdEnd;
		GetStringFromConfig(*configsection,KGlobalCompId, globalCompIdEnd);
		GetStringFromConfig(*configsection, KErrMsg, errMsg);
		GetStringFromConfig(*configsection, KErrMsgDetails, errMsgDetails);
		GetIntFromConfig(*configsection, KErrCategory, errCat);
		GetIntFromConfig(*configsection, KErrCode, errCode);

		TErrorCategory enumErrCat = static_cast<TErrorCategory>(errCat);
		CSifOperationEndData* enddata = CSifOperationEndData::NewLC(globalCompIdEnd, enumErrCat, errCode, errMsg, errMsgDetails);
        iPublisher->PublishCompletionL(*enddata);
        CStopTimer* timer = CStopTimer::NewL(NULL, 5000000);
        CleanupStack::PushL(timer);
        CActiveScheduler::Start();    
        CleanupStack::PopAndDestroy(2, enddata);
        }   
    else if (op.Compare(_L("delay")) == 0)
        {
        TInt delay(0);
        GetIntFromConfig(*configsection, KPublisherDelay, delay);
        User::After(delay*1000000);
        }
        
        
    CleanupStack::PopAndDestroy(configsection);
    }

void CSifPublishTestStep::ImplTestStepL()
/**
* @return - TVerdict code
* Override of base class pure virtual
* Our implementation only gets called if the base class doTestStepPreambleL() did
* not leave. That being the case, the current test result value will be EPass.
*/
    {
    RSoftwareInstall sif;
    User::LeaveIfError(sif.Connect());
    CleanupClosePushL(sif);
    
    TInt operationCount = 0;
    TPtrC configSectionName(ConfigSection());
    HBufC* cnfSecName = NULL;
        
    GetIntFromConfig(ConfigSection(), KOperationCount, operationCount);
    for (TUint i = 0; i < operationCount; ++i)
        {
        TBuf<20> configSection = _L("configsection");
        GenerateIndexedAttributeNameL(configSection, i);
        GetStringFromConfig(ConfigSection(),configSection, configSectionName);
        cnfSecName = configSectionName.AllocLC();
        PublishDataL(cnfSecName);
        CleanupStack::PopAndDestroy(cnfSecName);
        }
    CStopTimer* timer = CStopTimer::NewL(NULL, 5000000);
    CleanupStack::PushL(timer);
    CActiveScheduler::Start();
    CleanupStack::PopAndDestroy(2, &sif);
    }

void CSifPublishTestStep::ImplTestStepPostambleL()
/**
* @return - TVerdict code
* Override of base class virtual
*/
    {   
    delete iPublisher;
    iPublisher=0;
    delete iSched;
    iSched=0;
    }




CStopTimer::CStopTimer(CSifOperationsNotifier* aNotifier) : 
    CTimer(-1),
    iNotifier(aNotifier)
    {
    CActiveScheduler::Add(this);
    }

CStopTimer::~CStopTimer()
    {
    Cancel();
    }

void CStopTimer::ConstructL(TInt aSeconds)
    {
    CTimer::ConstructL();
    iSeconds = aSeconds;
    Start();
    }

void CStopTimer::Start()
    {
    After(iSeconds);
    }
CStopTimer* CStopTimer::NewL(CSifOperationsNotifier* aNotifier, TInt aSeconds)
    {
    CStopTimer* self = new(ELeave) CStopTimer(aNotifier);
    CleanupStack::PushL(self);
    self->ConstructL(aSeconds);
    CleanupStack::Pop(self);
    return self;
    }

void CStopTimer::RunL()
    {
    if(iNotifier)
        {
        //To improve coverage, call cancel subscribe on a non existent key.
        iNotifier->CancelSubscribeL(123);
        
        //cancel all subscriptions.
        iNotifier->CancelSubscribeL();           
        }
    CActiveScheduler::Stop();
    }


TInt CStopTimer::RunError(TInt aError)
    {
    (void)aError;
    return KErrNone;
    }