graphicshwdrivers/surfacemgr/test/src/tthirdprocess.cpp
changeset 0 5d03bc08d59c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graphicshwdrivers/surfacemgr/test/src/tthirdprocess.cpp	Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,208 @@
+// Copyright (c) 2007-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:
+// Surface manager multi-processed test code
+// 
+//
+
+/**
+ @file
+ @test
+ @internalComponent - Internal Symbian test code
+*/
+
+#include <e32test.h>
+#include <e32std.h>
+#include <graphics/surface.h>
+#include <graphics/surfacemanager.h>
+#include "tsmgmultprocessshared.h"
+
+LOCAL_D RTest test(_L("TThirdProcess"));
+
+
+class CTestDriverThirdProcess : public CTestDriver
+{
+public:
+	CTestDriverThirdProcess();
+	static CTestDriverThirdProcess* NewL();
+public:
+	void CloseSurface();
+	void SurfaceInfo();
+	void OpenWaitCloseOpen();
+	void OpenSurface();
+};
+
+CTestDriverThirdProcess::CTestDriverThirdProcess():CTestDriver()
+	{}
+
+
+CTestDriverThirdProcess* CTestDriverThirdProcess::NewL()
+	{
+	CTestDriverThirdProcess * driver = new (ELeave) CTestDriverThirdProcess();
+	CleanupStack::PushL(driver);
+	driver->CTestDriver::ConstructL();
+	CleanupStack::Pop(driver);
+	return driver;
+	}
+
+void CTestDriverThirdProcess::CloseSurface()
+	{
+	TSurfaceId id = iChunkWrapper->GetId();
+	// Close Surface
+	if(KErrAccessDenied == iSurfaceManager.CloseSurface(id))
+		{
+		iTestResult |= EFirstTestPassed;
+		}
+	
+	iChunkWrapper->SetThirdProcessResults(iTestResult);
+	}
+
+void CTestDriverThirdProcess::SurfaceInfo()
+	{
+	TSurfaceId id = iChunkWrapper->GetId();
+	// SurfaceInfo
+	// Call Surface Info on the surface in this process
+	RSurfaceManager::TInfoBuf infoBuf;
+	if(KErrAccessDenied == iSurfaceManager.SurfaceInfo(id,infoBuf))// This is correct?
+		{
+		iTestResult |= EFirstTestPassed;
+		}
+	
+	iChunkWrapper->SetThirdProcessResults(iTestResult);
+	}
+
+/**
+Test 25: Test surface can be accessed from third process when creating 
+			process dies and second process closes
+
+...			
+Process 3: Open Surface
+...
+Process 3: Close Surface - KErrNone
+Process 3: Open Surface - KErrArgument
+*/	
+void CTestDriverThirdProcess::OpenWaitCloseOpen()
+	{
+	TSurfaceId id = iChunkWrapper->GetId();
+	
+	// Open the surface using the surfaceId
+	if(KErrNone == iSurfaceManager.OpenSurface(id))
+		{
+		iTestResult |= EFirstTestPassed;
+		}
+	
+	// Pass control back to the first process
+    RSemaphore sem3;
+	if(KErrNone == sem3.OpenGlobal(KMultiProcessSemaphore3))
+		{
+		iTestResult |= ESecondTestPassed;
+		}
+
+    User::After(100000);
+    sem3.Signal();
+    
+    RSemaphore sem4;
+	if(KErrNone == sem4.OpenGlobal(KMultiProcessSemaphore4))
+		{
+		iTestResult |= EThirdTestPassed;
+		}
+
+    sem4.Wait();
+	
+	// Close the surface
+	if(KErrNone == iSurfaceManager.CloseSurface(id))
+		{
+		iTestResult |= EFourthTestPassed;
+		}
+	
+	// Open the surface
+	if(KErrArgument == iSurfaceManager.CloseSurface(id))
+		{
+		iTestResult |= EFifthTestPassed;
+		}
+	
+	iChunkWrapper->SetThirdProcessResults(iTestResult);
+	
+	sem3.Close();
+	sem4.Close();
+	}
+
+/**
+Test 27: Test closing on one process doesn't prevent opening on other processes, 
+			provided one process still owns surface
+
+...
+Process 3: Open Surface - KErrNone
+...
+*/	
+void CTestDriverThirdProcess::OpenSurface()
+	{	
+	TSurfaceId id = iChunkWrapper->GetId();
+	
+	// Open Surface
+	if(KErrNone == iSurfaceManager.OpenSurface(id))
+		{
+		iTestResult |= EFirstTestPassed;
+		}
+	
+	iChunkWrapper->SetThirdProcessResults(iTestResult);
+	
+	}
+
+// Real main function
+void MainL()
+	{
+	test.Title();
+
+	test.Start(_L("Staring 3rd process"));
+	TInt testCase;
+	User::GetTIntParameter(EMultiProcessSecondSlot, testCase);
+	
+	CTestDriverThirdProcess* testDriver = CTestDriverThirdProcess::NewL(); 
+
+	switch(testCase)
+		{
+	case ECloseSurface:
+		testDriver->CloseSurface();
+		break;
+	case ESurfaceInfo:
+		testDriver->SurfaceInfo();
+		break;
+	case EOpenWaitCloseOpen:
+		testDriver->OpenWaitCloseOpen();
+		break;
+	case EOpenSurface:
+		testDriver->OpenSurface();
+		break;
+	default:
+		User::Leave(KErrArgument);
+		break;
+		}
+
+	delete testDriver;
+	test.End();
+	test.Close();
+	}
+
+// Cleanup stack harness
+GLDEF_C TInt E32Main()
+	{
+	__UHEAP_MARK;
+	CTrapCleanup* cleanupStack = CTrapCleanup::New();
+	TRAPD(error, MainL());
+	_LIT(KTThirdProcessPanic,"tthirdprocessmain");
+	__ASSERT_ALWAYS(!error, User::Panic(KTThirdProcessPanic, error));
+	delete cleanupStack;
+	__UHEAP_MARKEND;
+	return 0;
+	}