kerneltest/e32test/hcr/d_hcrut.cpp
changeset 14 5d2844f35677
parent 4 56f325a607ea
--- a/kerneltest/e32test/hcr/d_hcrut.cpp	Mon Jan 18 21:31:10 2010 +0200
+++ b/kerneltest/e32test/hcr/d_hcrut.cpp	Tue Jan 26 13:13:38 2010 +0200
@@ -24,18 +24,18 @@
 #include <platform.h>
 #include <u32hal.h>
 #include "d_hcrut.h"
-
+#include "hcr_hai.h"
 
 #include "hcr_pil.h"
 
 #include <drivers/hcr.h>
 
-
-
+#define TEST_MEMGET(s, d, l)	kumemget(d, s, l)
+#define TEST_MEMPUT(d, s, l)    kumemput(d, s, l)
 
+#include "HcrImageData_102400.h"
 // -- CLASSES -----------------------------------------------------------------
 
-
 class DHcrTestFactory : public DLogicalDevice
 	{
 public:
@@ -83,7 +83,11 @@
 	HCR::TRepository* GetCoreImgRepos();
 	HCR::TRepository* GetOverrideImgRepos();
 	
+	HCR::MVariant* GetVariant() {return iHcrInt->iVariant;};
 	TInt SwitchRepository(const TText * aFileName, const HCR::HCRInternal::TReposId aId=HCR::HCRInternal::ECoreRepos);
+	    
+	TInt CheckIntegrity(void);
+	TInt FindSetting(const TSettingId& aId, TSettingType aType, TSettingRef& aSetting);
 
 public:
 
@@ -128,6 +132,20 @@
     NKern::ThreadLeaveCS();
     return retVal;
     }
+    
+    
+TInt HCR::HCRInternalTestObserver::CheckIntegrity(void)
+    {
+    TInt retVal = iHcrInt->CheckIntegrity();
+    return retVal;    
+    }
+    
+TInt HCR::HCRInternalTestObserver::FindSetting(const TSettingId& aId, TSettingType aType, TSettingRef& aSetting)
+    {
+    TInt retVal = iHcrInt->FindSetting( aId, aType, aSetting);
+    return retVal;
+    }
+    
 // -- GLOBALS -----------------------------------------------------------------
 //
 
@@ -195,12 +213,10 @@
 	return KErrNone;
 	}
 
-TInt DHcrTestChannel::Request(TInt aReqNo, TAny*, TAny*)
+TInt DHcrTestChannel::Request(TInt aReqNo, TAny* a1, TAny* /*a2*/ )
 	{
     HCR_FUNC("DHcrTestChannel::Request");
 
-
-
 	switch(aReqNo)
 		{
 		
@@ -216,6 +232,118 @@
 
 	case RHcrTest::ECtrlGetWordSetting:
 		{
+		TAny* args[3];
+		TEST_MEMGET(a1, args, sizeof(args));
+
+		HCR::TCategoryUid category = (HCR::TCategoryUid) args[0];
+    
+		HCR::TElementId key = (HCR::TElementId) args[1];
+
+		TInt type = (TInt) args[2];
+
+		const TText * fileInSysBinName = (const TText *)"filerepos.dat";
+		TInt err = gObserver.SwitchRepository(fileInSysBinName, HCR::HCRInternal::ECoreRepos);
+		if (err != KErrNone)
+             HCR_TRACE_RETURN(err);
+
+		// Negative tests on HCR::TRepositoryFile; aNum will be 0
+		HCR::TRepository* repos = gObserver.GetCoreImgRepos();;
+		__NK_ASSERT_DEBUG(repos != NULL);
+
+
+		HCR::SSettingId* ids[1];// = new HCR::SSettingId*[1];
+
+		TInt32* vals[1];
+		TInt* errs[1];
+		HCR::TSettingType* types[1];
+		
+		NKern::ThreadEnterCS();
+		ids[0] = new HCR::SSettingId();
+		vals[0] = new TInt32();
+		errs[0] = new TInt();
+		types[0] = new HCR::TSettingType();
+
+		if(ids[0] == NULL || vals[0] == NULL || errs[0] == NULL || types[0] == NULL) 
+			{
+			delete ids[0];
+			delete vals[0];
+			delete errs[0];
+			delete types[0];
+			NKern::ThreadLeaveCS();
+			HCR_TRACE_RETURN(KErrNoMemory);
+			}
+
+		ids[0]->iCat = category;
+		ids[0]->iKey = key;
+
+		// Negative tests on HCR::TRepositoryFile; aNum will be 0
+		TInt r = repos->GetWordSettings(0, ids, vals, types, errs);
+		// only expected errors are KErrNotFound or KErrNone
+		// thest if there is other error; if yes fail the test
+		if(r != KErrNotFound && r != KErrNone && r < KErrNone)
+			{
+			delete ids[0];
+			delete vals[0];
+			delete errs[0];
+			delete types[0];
+			NKern::ThreadLeaveCS();
+			HCR_TRACE_RETURN(r);
+			}
+
+		// Negative testing on HCR::TRepositoryFile; try to get words for large value
+		if(type > HCR::ETypeLinAddr)
+			{
+			r = repos->GetWordSettings(1, ids, vals, types, errs);
+			if(r != KErrArgument && r != KErrNotFound && r < KErrNone)
+				{
+				delete ids[0];
+				delete vals[0];
+				delete errs[0];
+				delete types[0];
+				NKern::ThreadLeaveCS();
+				HCR_TRACE_RETURN(r);
+				}
+			}
+
+		HCR::TRepositoryCompiled* compiledRepos = reinterpret_cast<HCR::TRepositoryCompiled*>(gObserver.GetVariantImgRepos());
+		__NK_ASSERT_DEBUG(compiledRepos != NULL);
+
+		ids[0]->iCat = KHCRUID_TestCategory1;
+		ids[0]->iKey = key;    
+		
+		// Negative tests on HCR::TRepositoryCompiled; aNum will be 0
+		r = compiledRepos->GetWordSettings(0, ids, vals, types, errs);
+		if(r != KErrNotFound && r != KErrNone && r < KErrNone)
+			{
+			delete ids[0];
+			delete vals[0];
+			delete errs[0];
+			delete types[0];
+			NKern::ThreadLeaveCS();
+			HCR_TRACE_RETURN(r);
+			}
+
+		// Negative testing on HCR::TRepositoryFile; try to get words for large value
+		if(type > HCR::ETypeLinAddr)
+			{
+			r = compiledRepos->GetWordSettings(1, ids, vals, types, errs);
+			if(r != KErrArgument && r != KErrNotFound && r < KErrNone)
+				{
+				delete ids[0];
+				delete vals[0];
+				delete errs[0];
+				delete types[0];
+				NKern::ThreadLeaveCS();
+				HCR_TRACE_RETURN(r);
+				}
+			}
+		
+		delete ids[0];
+		delete vals[0];
+		delete errs[0];
+		delete types[0];
+		NKern::ThreadLeaveCS();
+
 		return KErrNone;
 		}
 
@@ -303,10 +431,210 @@
 		return err;
 		}
 		
-	case RHcrTest::ECtrlFreePhyscialRam:
+	case RHcrTest::ECtrlNegativeTestsLargeValues:
+		{
+		//Test that HCR::TRepositoryCompiled::GetLargeValue & HCR::TRepositoryFile::GetLargeValue return KErrArgument
+		TAny* args[1];
+		TEST_MEMGET(a1, args, sizeof(args));
+		// Retrieve structures from client
+		TInt expectedError = (TUint) args[0];
+
+		const TText * fileInSysBinName = (const TText *)"filerepos.dat";
+		TInt err = gObserver.SwitchRepository(fileInSysBinName, HCR::HCRInternal::ECoreRepos);
+		if (err != KErrNone)
+             HCR_TRACE_RETURN(err);
+
+		// Do test for HCR::TRepositoryFile
+		HCR::TRepository* repos = gObserver.GetCoreImgRepos();;
+		__NK_ASSERT_DEBUG(repos != NULL);
+		
+		HCR::UValueLarge value;
+		HCR::TSettingRef ref(0,0);
+		HCR::TSettingId id(1,1); //word setting value in repository
+		err = repos->FindSetting(id, ref);
+		if(err == KErrNone)
+		    {
+            err = repos->GetLargeValue(ref, value);
+            if(err != expectedError)
+                {
+                HCR_TRACE_RETURN(err);
+                }
+		    }
+		
+		//Do test for HCR::TRepositoryCompiled
+		HCR::TRepositoryCompiled* compiledRepos = reinterpret_cast<HCR::TRepositoryCompiled*>(gObserver.GetVariantImgRepos());
+		if (compiledRepos == 0) 
+			{ 
+		    HCR_TRACE_RETURN(KErrGeneral);
+		    }
+		    
+		id = HCR::TSettingId(KHCRUID_TestCategory1,1);
+		err = compiledRepos->FindSetting(id, ref);
+		if(err == KErrNone)
+			{
+            err = compiledRepos->GetLargeValue(ref, value);
+            if(err != expectedError)
+				{
+				HCR_TRACE_RETURN(err);
+                }
+			}
+		
+		return KErrNone;
+		}
+
+
+    case RHcrTest::ECtrlCheckOverrideReposIntegrity:
+        {
+        HCR::TRepository* overrideRepos = gObserver.GetOverrideImgRepos();  // Shadowed SMR/HCR
+        TInt err = KErrNone;
+        
+        if( 0 != overrideRepos )
+            {
+            err = overrideRepos->CheckIntegrity();
+            
+            } 
+        return err;
+        }
+        
+    case RHcrTest::ECtrlCheckOverrideRepos102400Content:
         {
-		return KErrNone;
+        HCR::TRepository* overrideRepos = gObserver.GetOverrideImgRepos();  // Shadowed SMR/HCR
+        TInt err = KErrNone;
+        
+        if( 0 != overrideRepos )
+            {
+            for( TInt index = 0; index < itemsSize; ++index)
+                {
+                HCR::TSettingId id(items[index].iCategoryUID, items[index].iElementID);
+                HCR_TRACE3("--- index:%5d, iCategoryUID:0x%08x, iElementID:0x%08x"
+                            , index
+                            , items[index].iCategoryUID
+                            , items[index].iElementID
+                            );
+                HCR::TSettingRef val(overrideRepos, 0);
+                HCR::TSettingType type = (HCR::TSettingType)items[index].iType;
+    			TInt r = gObserver.FindSetting(id, type, val);
+    			if( r != KErrNone)
+    			    {
+    			        err = KErrNotFound;
+    			        break;
+    			    }
+    			HCR::UValueWord valueWord;
+                r = overrideRepos->GetValue(val, valueWord);
+                HCR_TRACE1("--- value:0x%08x", valueWord.iUInt32); 
+                if( valueWord.iUInt32 != items[index].iValue)
+                    {
+                    err = KErrNotFound;
+    			    break;    
+                    }
+                }
+            }
+        return err;
         }
+        
+    case RHcrTest::ECtrlSwitchFileRepository:
+	    {
+	    TInt r;
+	    TAny* args[2];
+	    TEST_MEMGET(a1, args, sizeof(args));
+	    const TText* fileRepName = (TText*) args[0];
+	    
+	    r = gObserver.SwitchRepository(fileRepName, HCR::HCRInternal::ECoreRepos);
+	    if (r != KErrNone)
+	        {
+	        HCR_TRACE_RETURN(r);
+	        }
+	    else
+	        return r;
+	    }
+	    
+	case RHcrTest::ECtrlCompiledFindSettingsInCategory:
+	    {
+	    TInt r = 0;
+	    //Do test for HCR::TRepositoryCompiled
+	    TAny* args[3];
+	    
+
+	    //It's a pre-condition to enter critical section before
+	    //kernel memory allocation
+	    NKern::ThreadEnterCS();
+	    TInt32* pFirst = new TInt32;
+	    TInt32* pLast = new TInt32;
+	    //We've done with allocation, exit CS
+	    NKern::ThreadLeaveCS();
+	    
+	    if(!pFirst || !pLast)
+	        { 
+	        HCR_TRACE_RETURN(KErrNoMemory);
+	        }
+	    
+	    TEST_MEMGET(a1, args, sizeof(args));
+	    HCR::TCategoryUid catUid = (HCR::TCategoryUid)args[0];
+	    
+	    
+	    HCR::TRepositoryCompiled* compiledRepos = 
+	    reinterpret_cast<HCR::TRepositoryCompiled*>(gObserver.GetVariantImgRepos());
+	    if (compiledRepos == 0) 
+	        { 
+	        HCR_TRACE_RETURN(KErrGeneral);
+	        }
+	   
+	    //This function return the result of operation r and first element and 
+	    //last element in the category written back to the user side test code 
+	    //variable referenced by pFirst and pLast pointers
+	    r = compiledRepos->FindNumSettingsInCategory(catUid, 
+	            *pFirst, *pLast);
+	    
+	    TEST_MEMPUT(args[1], pFirst, sizeof(TInt32));
+	    TEST_MEMPUT(args[2], pLast, sizeof(TInt32));
+	    
+	    if(r < 0)
+	        {HCR_TRACE_RETURN(r);}
+	    else
+	        return r;
+	    }
+        
+	case RHcrTest::ECtrlFileFindSettingsInCategory:
+	    {
+	    TInt r;
+	    TAny* args[3];
+	    TEST_MEMGET(a1, args, sizeof(args));
+	    HCR::TCategoryUid catUid = (HCR::TCategoryUid)args[0];
+
+	    //It's a pre-condition to enter critical section before
+	    //kernel memory allocation
+	    NKern::ThreadEnterCS();
+	    TInt32* pFirst = new TInt32;
+	    TInt32* pLast = new TInt32;
+	    //We've done with allocation, exit CS
+	    NKern::ThreadLeaveCS();
+
+	    if(!pFirst || !pLast)
+	        { 
+	        HCR_TRACE_RETURN(KErrNoMemory);
+	        }
+
+
+	    // Do test for HCR::TRepositoryFile
+	    HCR::TRepository* repos = gObserver.GetCoreImgRepos();
+	    __NK_ASSERT_DEBUG(repos != NULL);
+
+	    //This function return the result of operation r and first element and 
+	    //last element in the category written back to the user side test code 
+	    //variable referenced by pFirst and pLast pointers
+	    r = repos->FindNumSettingsInCategory(catUid, 
+	            *pFirst, *pLast);
+
+	    TEST_MEMPUT(args[1], pFirst, sizeof(TInt32));
+	    TEST_MEMPUT(args[2], pLast, sizeof(TInt32));
+
+	    if(r < 0)
+	        {HCR_TRACE_RETURN(r);}
+	    else
+	        return r;
+	    }
+	    
+	           
 
 	default:
 		break;
@@ -322,16 +650,23 @@
 DECLARE_STANDARD_LDD()
 	{
     HCR_FUNC("D_HCR_DECLARE_STANDARD_LDD");
-    
+
+	// Try to initialise without a varian; KErrGeneral error should be returned
+	new(&gTestHcrInt) HCR::HCRInternal(NULL);
+	TInt err = gTestHcrInt.Initialise();
+	if (err != KErrGeneral)
+    	return 0;
+
+
     // Taken from HCR_PIL.CPP InitExtension() method
     
     HCR::MVariant* varPtr = CreateHCRVariant();
 	if (varPtr==0)
     	return 0;
-    	
+
 	new(&gTestHcrInt) HCR::HCRInternal(varPtr);
-
-	TInt err = gTestHcrInt.Initialise();
+    	
+	err = gTestHcrInt.Initialise();
 	if (err != KErrNone)
     	return 0;