graphicstest/uibench/src/trenderorientation.cpp
changeset 152 9f1c3fea0f87
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicstest/uibench/src/trenderorientation.cpp	Wed Aug 18 11:05:09 2010 +0300
@@ -0,0 +1,329 @@
+// 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 "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
+ @test
+ @internalComponent - Internal Nokia test code 
+*/
+
+#include <w32std.h>
+
+#include <wspublishandsubscribedata.h>
+#include "trenderorientation.h"
+
+const TInt KPublishTimeout  = 1000000;  // 1 second in microseconds
+const TInt KNumIterations   = 20;
+
+// Values for the device orientation that we receive via P&S from the Theme Server
+// Must match those in renderorientationtracker.h, and, obviously, those used by the real theme server 
+const TUid  KThemeOrientationCategory   = {0x20022E82}; // == KHbPsHardwareCoarseOrientationCategoryUid 
+const TUint KThemeOrientationKey        = 0x4F726965;   // == KHbPsHardwareCoarseOrientationKey 
+
+void CTWindowSet::ConstructL()
+    {
+    User::LeaveIfError(iWs.Connect());
+    iWs.SetAutoFlush(ETrue);
+    
+    iWindowGroup = RWindowGroup(iWs);
+    User::LeaveIfError(iWindowGroup.Construct(reinterpret_cast<TUint32>(&iWindowGroup)));
+    
+    iChildWindow = RWindow(iWs);
+    User::LeaveIfError(iChildWindow.Construct(iWindowGroup, reinterpret_cast<TUint32>(&iChildWindow)));
+    }
+
+CTWindowSet::~CTWindowSet()
+    {
+    Destroy();
+    }
+
+void CTWindowSet::Destroy()
+    {
+    iChildWindow.Close();
+    iWindowGroup.Close();
+    iWs.Close();    
+    }
+
+CTRenderOrientation::CTRenderOrientation()
+    {
+    // check that these two enums are aligned
+    __ASSERT_COMPILE(EDisplayOrientationAuto == ENumWindowSets);
+    
+    SetTestStepName(KTRenderOrientation);
+    }
+
+CTRenderOrientation::~CTRenderOrientation()
+    {
+    }
+
+/**
+Gets the Render Orientation as published by window server
+
+@return TRenderOrienation that was last publised by window server.
+ */
+TRenderOrientation CTRenderOrientation::GetRenderOrientationL()
+    {    
+    return GetOrientationL(iWsRenderOrientationProperty);    
+    }
+
+/**
+Gets the Theme Orientation as published by theme server
+
+@return TRenderOrienation that was last publised by theme server.
+ */
+TRenderOrientation CTRenderOrientation::GetThemeOrientationL()
+    {    
+    return GetOrientationL(iThemeOrientationProperty);    
+    }
+
+/**
+Gets the orientation as published to the given RProperty
+
+@return TRenderOrienation that was last publised to the given RProperty
+ */
+TRenderOrientation CTRenderOrientation::GetOrientationL(RProperty& aProperty)
+    {
+    TInt orientation=EDisplayOrientationNormal;
+    User::LeaveIfError(aProperty.Get(orientation));
+    
+    TESTL(orientation >= EDisplayOrientationNormal);
+    TESTL(orientation < EDisplayOrientationAuto);    
+    
+    return static_cast<TRenderOrientation>(orientation);    
+    }
+
+/**
+Tests each usable TRenderOrientation KNumIterations times for the given test phase / use case.
+
+@param aStepName - the test step ID to use
+@param aTestPhase - the internal test phase 
+ */
+void CTRenderOrientation::TestOrientationChangeL(const TDesC& aStepName, TTestPhase aTestPhase)
+    {
+    SetTestStepID(aStepName);
+    
+    // more preamble to toggle between timing the wserv render orienation property
+    // and the theme server orientation property
+    RProperty *orientationProperty = NULL;
+    switch(aTestPhase)
+        {          
+        case EThemeOrientationChangeOnly:
+            {
+            // render orientation ignores theme orientation
+            iWindowSet[EFirstWindowSet].Session().IndicateAppOrientation(EDisplayOrientationNormal);
+            // we want to subscribe and wait for the theme orientation published by the theme server
+            orientationProperty = &iThemeOrientationProperty;            
+            break;
+            }
+        case EThemeOrientationChange:
+            {
+            TESTL(EDisplayOrientationNormal == GetThemeOrientationL());
+            iWindowSet[EFirstWindowSet].Session().IndicateAppOrientation(EDisplayOrientationAuto);
+            }
+            // deliberate drop-through
+        default:
+            // we want to subscribe and wait for the render orientation published by WServ            
+            orientationProperty = &iWsRenderOrientationProperty;            
+            break;
+        }    
+    
+    TInt renderOrientation = GetRenderOrientationL();
+    
+    // For consistancy, check that we are starting from the same orientation
+    TESTL(EDisplayOrientationNormal == renderOrientation);    
+    
+    // Set-up the timer
+    iProfiler->InitResults();
+    iTimingsTaken = 0;    
+    
+    // repeat numerous times to get a decent average
+    for(TInt iterations=0; iterations < KNumIterations; ++iterations)
+        {
+        renderOrientation = GetRenderOrientationL();
+        // For consistancy, check that we are starting from the same orientation
+        TESTL(EDisplayOrientationNormal == renderOrientation);           
+        
+        // loop through the orientations, ending up changing back to normal
+        for(++renderOrientation; renderOrientation <= EDisplayOrientationAuto; ++renderOrientation)
+            {
+            // % can be slow, do it outside of the timing
+            TRenderOrientation testOrientation = static_cast<TRenderOrientation>(renderOrientation%EDisplayOrientationAuto);
+            
+            orientationProperty->Subscribe(iOrientationStatus);
+            
+            // start the timeout timer
+            iTimeoutTimer.After(iTimeoutStatus, KPublishTimeout);
+            // start the results timer
+            iProfiler->StartTimer();
+                        
+            switch(aTestPhase)
+                {
+                case EIndicatedOrientationChange:
+                    // Do the indicated orientation Change
+                    iWindowSet[EFirstWindowSet].Session().IndicateAppOrientation(testOrientation);
+                    break;
+                    
+                case EWindowOrdinalChange:
+                    // move the relevant window group to the front
+                    // N.B. this will go wrong if the number of orientations and windows are not equal
+                    iWindowSet[testOrientation].WindowGroup().SetOrdinalPosition(0);
+                    break;
+                    
+                case EThemeOrientationChange:
+                    // Needs the focus window to be in auto mode
+                    // deliberate drop through
+                case EThemeOrientationChangeOnly:                                        
+                    iThemeOrientationProperty.Set(testOrientation);
+                    break;
+                    
+                default:
+                    TESTL(EFalse);
+                }
+        
+            // Wait for the update to have been published ( or time out while waiting )
+            User::WaitForRequest(iOrientationStatus, iTimeoutStatus);
+            
+            iProfiler->MarkResultSetL();
+            ++iTimingsTaken;
+            
+            if(KErrNone != iOrientationStatus.Int())
+                {
+                // timed out
+                iWsRenderOrientationProperty.Cancel();                
+                TESTL(EFalse);
+                }
+            else
+                {
+                // Check that it is actually the expected orientation
+                if(EThemeOrientationChangeOnly == aTestPhase)
+                    TESTL(GetThemeOrientationL() == testOrientation);
+                else
+                    TESTL(GetRenderOrientationL() == testOrientation);                
+                }
+
+            if(KRequestPending == iTimeoutStatus.Int())
+                {
+                // as expected, so cancel the timeout timer
+                iTimeoutTimer.Cancel();
+                }
+            else
+                {
+                // timed out
+                TESTL(EFalse);
+                }
+            }
+        }    
+    
+    // wrap it up    
+    iProfiler->ResultsAnalysis(KTRenderOrientation,KErrNotFound,ENone,ENone,iTimingsTaken);
+    }
+
+TVerdict CTRenderOrientation::doTestStepL()
+    {     
+    INFO_PRINTF1(_L("Testing: Indicated Orientation Change"));
+    TestOrientationChangeL(_L("GRAPHICS-UI-BENCH-0201"), EIndicatedOrientationChange);
+    
+    INFO_PRINTF1(_L("Testing: Window Ordinal Position Change"));
+    TestOrientationChangeL(_L("GRAPHICS-UI-BENCH-0202"), EWindowOrdinalChange);
+    
+    INFO_PRINTF1(_L("Testing: Theme Orientation Change"));
+    TestOrientationChangeL(_L("GRAPHICS-UI-BENCH-0203"), EThemeOrientationChange);
+    
+    INFO_PRINTF1(_L("Testing: Theme Orientation Change Only"));
+    TestOrientationChangeL(_L("GRAPHICS-UI-BENCH-0204"), EThemeOrientationChangeOnly);    
+    
+    return TestStepResult();    
+    }
+
+_LIT(KThemeServerPropertyDefine, "twsthemeserverpropertydefine.exe");
+_LIT(KThemeServerPropertyDefineCmdDefine, "define");
+_LIT(KThemeServerPropertyDefineCmdDelete, "delete");   
+
+/**
+Uses a test executable to define or delete a test version of the theme server rotation RProperty
+ */
+void CTRenderOrientation::ThemeServerProperty(const TDesC& aCmd)
+    {
+    /* This Process called with the argument KThemeServerPropertyDefineCmdDefine defines the
+       theme server RProperty, or with KThemeServerPropertyDefineCmdDelete, deletes 
+       the theme server RProperty.
+       This is because an RProperty with this catagory UID can only be defined and deleted
+       from within a process with the same UID3 as the RProperty catogory you are trying to
+       define/delete */
+    RProcess themeServerPropertyDefine;
+    TInt err = themeServerPropertyDefine.Create(KThemeServerPropertyDefine, aCmd);
+    if (KErrNone != err)
+        {
+        _LIT(KLog, "themeServerPropertyDefine.Create() failed with error: %d");
+        INFO_PRINTF2(KLog, err);
+        TEST(EFalse);        
+        }
+    
+    // wait for themeServerPropertyDefine process to terminate
+    TRequestStatus themeServerPropertyDefineLogonStatus;
+    themeServerPropertyDefine.Logon(themeServerPropertyDefineLogonStatus);
+    themeServerPropertyDefine.Resume();
+    User::WaitForRequest(themeServerPropertyDefineLogonStatus);
+    if (themeServerPropertyDefineLogonStatus != KErrNone)
+        {
+        _LIT(KLog, "themeServerPropertyDefine.Logon() failed with error: %d");
+        INFO_PRINTF2(KLog, themeServerPropertyDefineLogonStatus);
+        TEST(EFalse);        
+        }
+    themeServerPropertyDefine.Close();    
+    }
+
+/*
+Initialise for the testing
+ */
+TVerdict CTRenderOrientation::doTestStepPreambleL()
+    {
+    // Create in reverse order so that windowSet 0 is at the front/foreground
+    for(TInt windowSet = ENumWindowSets - 1; windowSet >= 0 ; --windowSet)
+        {
+        iWindowSet[windowSet].ConstructL();
+        TRenderOrientation orientation = static_cast<TRenderOrientation>(windowSet%EDisplayOrientationAuto);
+        iWindowSet[windowSet].Session().IndicateAppOrientation(orientation);
+        iWindowSet[windowSet].WindowGroup().SetOrdinalPosition(0);
+        }
+    
+    User::LeaveIfError(iWsRenderOrientationProperty.Attach(KRenderOrientationCategory, KRenderOrientationKey));
+    
+    ThemeServerProperty(KThemeServerPropertyDefineCmdDefine);
+    User::LeaveIfError(iThemeOrientationProperty.Attach(KThemeOrientationCategory, KThemeOrientationKey));
+    
+    User::LeaveIfError(iTimeoutTimer.CreateLocal());
+    
+    return CTe_graphicsperformanceSuiteStepBase::doTestStepPreambleL();
+    }
+
+/*
+Tidy up after the testing
+ */
+TVerdict CTRenderOrientation::doTestStepPostambleL()
+    {
+    iTimeoutTimer.Close();
+    
+    iThemeOrientationProperty.Close();
+    ThemeServerProperty(KThemeServerPropertyDefineCmdDelete);    
+    iWsRenderOrientationProperty.Close();
+    
+    for(TInt windowThing = 0; windowThing < ENumWindowSets; ++windowThing)
+        {
+        iWindowSet[windowThing].Destroy();
+        }
+    
+    return CTe_graphicsperformanceSuiteStepBase::doTestStepPostambleL();
+    }