persistentstorage/centralrepository/test/t_cenrep_defects.cpp
changeset 1 c084286672be
parent 0 08ec8eefde2f
--- a/persistentstorage/centralrepository/test/t_cenrep_defects.cpp	Fri Jan 22 11:06:30 2010 +0200
+++ b/persistentstorage/centralrepository/test/t_cenrep_defects.cpp	Tue Jan 26 13:16:24 2010 +0200
@@ -2737,10 +2737,73 @@
     __UHEAP_MARKEND;
     } 
 
+LOCAL_C void ConnectStartSuicideTransL(void)
+    {
+    const TUid KLargeReposUid1 ={0xcccccc00};   
+    CRepository* repository=CRepository::NewL(KLargeReposUid1);
+    repository->StartTransaction(CRepository::EConcurrentReadWriteTransaction);
+    }
+
+LOCAL_C TInt SuicidalTransThread(TAny*)
+    {
+    CTrapCleanup* cleanup = CTrapCleanup::New();
+    if(!cleanup)
+        return KErrNoMemory;
+
+    TRAP_IGNORE(ConnectStartSuicideTransL());
+    //purposely waiting to be killed
+    User::WaitForAnyRequest();
+    return 0;
+    }
+
+LOCAL_C void DEF143352L()
+    {
+    CleanupCDriveL();    
+    __UHEAP_MARK;
+
+    const TUid KLargeReposUid1 ={0xcccccc00};
+    //create on in this thread and start transaction too
+    CRepository* rep1=CRepository::NewL(KLargeReposUid1);
+    User::LeaveIfError(rep1->StartTransaction(CRepository::EConcurrentReadWriteTransaction));
+    
+    //create thread to connect, start transaction on the same repository as previous
+    RThread testThread;
+    _LIT(KThreadName1, "Martin");
+    testThread.Create(KThreadName1, SuicidalTransThread, KDefaultStackSize, KMinHeapSize, 0x100000, NULL);
+
+    TRequestStatus requestStatus;
+    testThread.Logon(requestStatus);
+    testThread.Resume();
+
+    //wait for the first client to complete the start transaction
+    User::After(1000000);
+    
+    //opening another big keyspace to force the eviction(cache size is 100K) both repository is about 78K in the heap
+    //cccccc03 is exactly the same as cccccc00
+    const TUid KLargeReposUid2 ={0xcccccc04};
+    CRepository* rep2=CRepository::NewL(KLargeReposUid2);
+   
+    //now kill the thread we have created
+    testThread.Kill(KErrDied);
+    User::WaitForRequest(requestStatus);
+    TEST2(requestStatus.Int(), KErrDied);
+    
+    //Wait for the session to be cleaned up
+    User::After(1000000);
+    
+    //now current test thread will retry the same connection
+    //at this stage server will panic with kern-exec 3
+    CRepository* rep4=CRepository::NewL(KLargeReposUid1);
+    
+    delete rep1;
+    delete rep2;
+    delete rep4;
+    
+    __UHEAP_MARKEND;
+    }
 	
 LOCAL_C void FuncTestsL()
 	{
-
 	TheTest.Start(_L("DEF053500 - Central repository integer type key entries cannot handle hex values"));
 
 	DEF053500L();
@@ -2857,6 +2920,9 @@
 	TheTest.Next(_L("@SYMTestCaseID:PDS-CENTRALREPOSITORY-UT-4086 PDEF141518: centralrepositorysrv.exe crashes and phone doesn't boot up "));
 	PDEF141519L(); 
 
+	TheTest.Next(_L("@SYMTestCaseID:PDS-CENTRALREPOSITORY-CT-XXXX DEF143352: CentralRepository server crash in CObservable::RefreshTransactorAccessPolicies "));
+	DEF143352L();
+
 	TheTest.End();
 	}