--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/datacommsserver/esockserver/test/TE_IPCTest/Test05IPCIllegalOperations.cpp Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,288 @@
+// Copyright (c) 2004-2009 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:
+// Contains IPC Test 05
+//
+//
+
+// EPOC includes
+#include <e32base.h>
+#include <es_sock.h>
+#include <ss_std.h>
+
+#include <elements/sd_std.h>
+
+#include "Test05IPCIllegalOperations.h"
+
+using namespace Den;
+
+const TDesC& CTest05IPCIllegalOperations::GetTestName()
+ {
+ _LIT(ret,"IPCTest05");
+ return ret;
+ }
+// constructor
+CTest05IPCIllegalOperations::CTest05IPCIllegalOperations()
+ {
+ iThreadStackSize = 1024;
+ }
+
+
+// This is thread that should fail as it attempts to accept
+// with connected socket
+TInt CTest05IPCIllegalOperations::fAcceptWithConnectedSocket(TAny* aInput)
+ {
+ TInt err;
+ RSocketServ aSockServer;
+ TRequestStatus aStatAccept, aStatConnect;
+ RSocket aNewConn, aServerSock;
+ RSocket aClientSock;
+ TSockAddr aAddr;
+ CTest05IPCIllegalOperations* pTestObject =
+ (CTest05IPCIllegalOperations*)aInput;
+
+ //-------------------substep 01-----------------------------
+ // Connect to Socket server, and create client/socket connection
+ if ( (err = OptimalConnect(aSockServer)) != KErrNone )
+ return err;
+
+ if ( (err=aServerSock.Open(aSockServer, pTestObject->iProt)) != KErrNone)
+ {
+ aServerSock.Close();
+ aSockServer.Close();
+ return err;
+ }
+
+ if ( (err=aServerSock.SetLocalPort(1)) != KErrNone)
+ {
+ aServerSock.Close();
+ aSockServer.Close();
+ return err;
+ }
+
+ if ( (err=aServerSock.Listen(1)) != KErrNone)
+ {
+ aServerSock.Close();
+ aSockServer.Close();
+ return err;
+ }
+
+ if ( (err=aNewConn.Open(aSockServer)) != KErrNone)
+ {
+ aServerSock.Close();
+ aSockServer.Close();
+ return err;
+ }
+ aServerSock.Accept(aNewConn,aStatAccept);
+
+ if ( (err=aClientSock.Open(aSockServer, pTestObject->iProt)) != KErrNone)
+ {
+ aNewConn.Close();
+ aServerSock.Close();
+ aSockServer.Close();
+ return err;
+ }
+
+ aAddr.SetPort(1);
+ aClientSock.Connect(aAddr, aStatConnect);
+ User::WaitForRequest(aStatConnect);
+ User::WaitForRequest(aStatAccept);
+
+ err = aStatAccept.Int();
+ if (err != KErrNone)
+ {
+ aClientSock.Close();
+ aNewConn.Close();
+ aServerSock.Close();
+ aSockServer.Close();
+ return err;
+ }
+
+ err = aStatConnect.Int();
+ if (err != KErrNone)
+ {
+ aClientSock.Close();
+ aNewConn.Close();
+ aServerSock.Close();
+ aSockServer.Close();
+ return err;
+ }
+
+ //-------------------substep 02-----------------------------
+ // Try to assosiate the same blank socket (that is already connected
+ // to the client socket) to the server socket.
+ // This should fail and panic this thread.
+ // Main thread will then examine the exit status of this thread.
+ aServerSock.Accept(aNewConn, aStatAccept);
+
+ User::WaitForRequest(aStatAccept);
+ err = aStatAccept.Int();
+
+ aClientSock.Close();
+ aNewConn.Close();
+ aServerSock.Close();
+ aSockServer.Close();
+ return err;
+ }
+
+// This is thread that should fail as it attempts to accept
+// with unopened socket
+TInt CTest05IPCIllegalOperations::fAcceptWithUnopendSocket(TAny* aInput)
+ {
+ TInt err;
+ RSocketServ aSockServer;
+ RSocket aNewConn, aServerSock;
+ TRequestStatus aStat;
+ CTest05IPCIllegalOperations* pTestObject =
+ (CTest05IPCIllegalOperations*)aInput;
+
+ //-------------------substep 01-----------------------------
+ // Connect to Socket server, and create server socket
+ if ( (err = OptimalConnect(aSockServer)) != KErrNone )
+ return EFail;
+
+ if ( (err=aServerSock.Open(aSockServer, pTestObject->iProt)) != KErrNone)
+ {
+ aSockServer.Close();
+ return err;
+ }
+
+ if ( (err=aServerSock.SetLocalPort(1)) != KErrNone)
+ {
+ aServerSock.Close();
+ aSockServer.Close();
+ return err;
+ }
+
+ if ( (err=aServerSock.Listen(1)) != KErrNone)
+ {
+ aServerSock.Close();
+ aSockServer.Close();
+ return err;
+ }
+
+ //-------------------substep 02-----------------------------
+ // Try to accept connection with a blank socket that is not opened.
+ // This should fail and panic this thread.
+ // Main thread will then examine the exit status of this thread.
+ aServerSock.Accept(aNewConn, aStat);
+ User::WaitForRequest(aStat);
+ aServerSock.Close();
+ aSockServer.Close();
+ return KErrNone;
+ }
+
+//
+enum TVerdict CTest05IPCIllegalOperations::InternalDoTestStepL(void)
+ {
+ //-------------------substep 01-----------------------------
+ _LIT(aLog01,"01 Create and start thread that will try to accept null socket:");
+ Logger().Write(aLog01);
+
+ RThread aThread;
+ CleanupClosePushL(aThread);
+
+ TRequestStatus aStatus;
+ TInt err = aThread.Create(_L("IPCTest05Thread1"),
+ fAcceptWithUnopendSocket,
+ KDefaultStackSize,
+ KDefaultHeapSize,
+ KDefaultHeapSize,
+ (TAny*)this,
+ EOwnerProcess);
+
+ if (err != KErrNone)
+ {
+ _LIT(aLog,"Error:Could not create thread. err = %d");
+ Logger().WriteFormat(aLog, err);
+ User::Leave(EFail);
+ }
+
+ aThread.Logon(aStatus);
+ TBool aOldPanic = User::JustInTime();
+ User::SetJustInTime(EFalse);
+ aThread.Resume();
+
+ //-------------------substep 02-----------------------------
+ User::WaitForRequest(aStatus);
+ User::SetJustInTime(aOldPanic);
+
+ TPtrC testCategory;
+ testCategory.Set(aThread.ExitCategory());
+ TExitType exitType = aThread.ExitType();
+ TInt reason = aThread.ExitReason();
+
+ if (testCategory == KESockClientPanic &&
+ exitType == EExitPanic &&
+ reason == ESockBadHandle)
+ {
+ _LIT(aLog, "02 Thread panic: Category='%S', type=%d, reason=%d");
+ Logger().WriteFormat(aLog, &testCategory, exitType, reason);
+ }
+ else
+ {
+ _LIT(aLog, "02 Thread panic: Category='%S', type=%d, reason=%d <- wrong panic");
+ Logger().WriteFormat(aLog, &testCategory, exitType, reason);
+ User::Leave(EFail);
+ }
+ CleanupStack::PopAndDestroy(&aThread);
+
+ //-------------------substep 03-----------------------------
+ _LIT(aLog03,"03 Create and start thread that will try to accept already connected socket:");
+ Logger().Write(aLog03);
+
+ CleanupClosePushL(aThread);
+ err = aThread.Create(_L("IPCTest05Thread2"),
+ fAcceptWithConnectedSocket,
+ KDefaultStackSize,
+ KDefaultHeapSize,
+ KDefaultHeapSize,
+ (TAny*)this,
+ EOwnerProcess);
+ if (err != KErrNone)
+ {
+ _LIT(aLog,"Error:Could not create thread. err = %d");
+ Logger().WriteFormat(aLog, err);
+ User::Leave(EFail);
+ }
+ aThread.Logon(aStatus);
+ aOldPanic = User::JustInTime();
+ User::SetJustInTime(EFalse);
+ aThread.Resume();
+
+ //-------------------substep 04-----------------------------
+ User::WaitForRequest(aStatus);
+ User::SetJustInTime(aOldPanic);
+
+ testCategory.Set(aThread.ExitCategory());
+ exitType = aThread.ExitType();
+ reason = aThread.ExitReason();
+
+ if (testCategory == KESockClientPanic &&
+ exitType == EExitPanic &&
+ reason == EAcceptTwice)
+ {
+ _LIT(aLog, "04 Thread panic: Category='%S', type=%d, reason=%d");
+ Logger().WriteFormat(aLog, &testCategory, exitType, reason);
+ }
+ else
+ {
+ _LIT(aLog, "04 Thread panic: Category='%S', type=%d, reason=%d <- wrong panic");
+ Logger().WriteFormat(aLog, &testCategory, exitType, reason);
+ User::Leave(EFail);
+ }
+ CleanupStack::PopAndDestroy(&aThread);
+
+ return EPass;
+ }
+