diff -r bbf8bed59bcb -r 2bb754abd467 kerneltest/e32test/active/t_messge.cpp --- a/kerneltest/e32test/active/t_messge.cpp Wed Jun 09 11:10:19 2010 +0300 +++ b/kerneltest/e32test/active/t_messge.cpp Mon Jun 21 17:12:14 2010 +0300 @@ -78,7 +78,8 @@ class CTestSession : public CSession2 { public: - enum {EStop,ETestInt,ETestPtr,ETestClient,ETestComplete,ETestPtrComplete,ETestCompletePanic,ETestOtherSession,ETestCompleteAfter,ETestMessageConstruction, ETestRMessagePtr2LeavingInterface}; + enum {EStop,ETestInt,ETestPtr,ETestClient,ETestComplete,ETestPtrComplete,ETestCompletePanic,ETestOtherSession,ETestCompleteAfter,ETestMessageConstruction, + ETestRMessagePtr2LeavingInterface, ETestKillCompletePanic}; //Override pure virtual IMPORT_C virtual void ServiceL(const RMessage2& aMessage); private: @@ -323,6 +324,10 @@ case ETestRMessagePtr2LeavingInterface: r=TestRMessagePtr2LeavingInterface(aMessage); break; + case ETestKillCompletePanic: + aMessage.Complete(KErrNone); + aMessage.Panic(_L("Testing Panic"),0xFF); //This will panic the server! + break; default: r=KErrNotSupported; @@ -480,7 +485,7 @@ test.Next(_L("Start ActiveScheduler and signal to client")); - test.Printf(_L(" There might be something going on beneath this window")); + test.Printf(_L(" There might be something going on beneath this window\n")); sem.Signal(); CActiveScheduler::Start(); test.Next(_L("Destroy ActiveScheduler")); @@ -522,6 +527,23 @@ session.PublicSendReceive(CTestSession::EStop, TIpcArgs());//panic should occur before this is serviced return(KErrNone); } + +TInt KillCompletePanicClientThread (TAny*) +// +// A client thread entry - signals to server to kill client after completing the message +// + { + sem.Wait(); + + TInt r=session.PublicCreateSession(_L("CTestServer"),1); + test(r==KErrNone); + + r=session.PublicSendReceive(CTestSession::ETestKillCompletePanic, TIpcArgs()); + test(r==KErrNone); + + session.PublicSendReceive(CTestSession::EStop, TIpcArgs());//panic should occur before this is serviced + return(KErrNone); + } void SimpleRMessage() // @@ -575,7 +597,86 @@ test.End(); } + +void TestServerCompleteTwicePanic(void) + { + TRequestStatus clientStat,serverStat; + + TBool justInTime=User::JustInTime(); + + test.Next(_L("Check server panics if you try to complete a message twice")); + test.Start(_L("Create client and server threads")); + clientThread.Create(_L("Client Thread1"),CompletePanicClientThread,KDefaultStackSize,KHeapMinSize,KHeapMaxSize,NULL); + serverThread.Create(_L("Server Thread"),ServerThread,KDefaultStackSize,KHeapMinSize,KHeapMaxSize,NULL); + + test.Next(_L("Logon to the threads")); + clientThread.Logon(clientStat); + serverThread.Logon(serverStat); + test.Next(_L("Start the threads")); + sem.CreateLocal(0); + User::SetJustInTime(EFalse); + clientThread.Resume(); + serverThread.Resume(); + + test.Next(_L("Wait for the threads to stop")); + User::WaitForRequest(clientStat); // + User::WaitForRequest(serverStat); + User::SetJustInTime(justInTime); + test.Next(_L("Check the exit categories")); + test(clientThread.ExitType()==EExitKill); + test(clientThread.ExitCategory().Compare(_L("Kill"))==0); + test(clientThread.ExitReason()==KErrNone); + + test(serverThread.ExitType()==EExitPanic); + test(serverThread.ExitCategory().Compare(_L("USER"))==0); + test(serverThread.ExitReason()==ETMesCompletion); + + test.Next(_L("Close the threads")); + CLOSE_AND_WAIT(serverThread); + CLOSE_AND_WAIT(clientThread); + test.End(); + } + +void TestServerKillCompletePanic(void) + { + TRequestStatus clientStat,serverStat; + + TBool justInTime=User::JustInTime(); + + test.Next(_L("Check Server panics if you try to panic a client using a completed message")); + test.Start(_L("Create client and server threads")); + clientThread.Create(_L("Client Thread2"),KillCompletePanicClientThread,KDefaultStackSize,KHeapMinSize,KHeapMaxSize,NULL); + serverThread.Create(_L("Server Thread"),ServerThread,KDefaultStackSize,KHeapMinSize,KHeapMaxSize,NULL); + + test.Next(_L("Logon to the threads")); + clientThread.Logon(clientStat); + serverThread.Logon(serverStat); + + test.Next(_L("Start the threads")); + sem.CreateLocal(0); + User::SetJustInTime(EFalse); + clientThread.Resume(); + serverThread.Resume(); + + test.Next(_L("Wait for the threads to stop")); + User::WaitForRequest(clientStat); + User::WaitForRequest(serverStat); + User::SetJustInTime(justInTime); + test.Next(_L("Check the exit categories")); + test(clientThread.ExitType()==EExitKill); + test(clientThread.ExitCategory().Compare(_L("Kill"))==0); + test(clientThread.ExitReason()==KErrNone); + + test(serverThread.ExitType()==EExitPanic); + test(serverThread.ExitCategory().Compare(_L("KERN-EXEC"))==0); + test(serverThread.ExitReason()==EBadMessageHandle); + + test.Next(_L("Close the threads")); + CLOSE_AND_WAIT(serverThread); + CLOSE_AND_WAIT(clientThread); + test.End(); + } GLDEF_C TInt E32Main() { @@ -643,41 +744,10 @@ CLOSE_AND_WAIT(serverThread); CLOSE_AND_WAIT(clientThread); test.End(); - - TBool justInTime=User::JustInTime(); - - test.Next(_L("Check it Panics if you try to Complete a message twice")); - test.Start(_L("Create client and server threads")); - clientThread.Create(_L("Client Thread1"),CompletePanicClientThread,KDefaultStackSize,KHeapMinSize,KHeapMaxSize,NULL); - serverThread.Create(_L("Server Thread"),ServerThread,KDefaultStackSize,KHeapMinSize,KHeapMaxSize,NULL); - - test.Next(_L("Logon to the threads")); - clientThread.Logon(clientStat); - serverThread.Logon(serverStat); - - test.Next(_L("Start the threads")); - sem.CreateLocal(0); - User::SetJustInTime(EFalse); - clientThread.Resume(); - serverThread.Resume(); - test.Next(_L("Wait for the threads to stop")); - User::WaitForRequest(clientStat); // - User::WaitForRequest(serverStat); - User::SetJustInTime(justInTime); - test.Next(_L("Check the exit categories")); - test(clientThread.ExitType()==EExitKill); - test(clientThread.ExitCategory().Compare(_L("Kill"))==0); - test(clientThread.ExitReason()==KErrNone); - - test(serverThread.ExitType()==EExitPanic); - test(serverThread.ExitCategory().Compare(_L("USER"))==0); - test(serverThread.ExitReason()==ETMesCompletion); - - test.Next(_L("Close the threads")); - CLOSE_AND_WAIT(serverThread); - CLOSE_AND_WAIT(clientThread); - test.End(); + TestServerCompleteTwicePanic(); + + TestServerKillCompletePanic(); test.End();