--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/egl/egltest/src/egltest_geterroranddisplay.cpp Tue Feb 02 01:47:50 2010 +0200
@@ -0,0 +1,1276 @@
+// 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:
+//
+
+/**
+ @file
+ @test
+*/
+#include "egltest_geterroranddisplay.h"
+
+/**
+@SYMTestCaseID GRAPHICS-EGL-0507
+
+@SYMPREQ 2400
+
+@SYMTestPriority 1
+
+@SYMTestCaseDesc
+Test eglGetError behavior
+
+@SYMTestExpectedResults
+Error code is set according to EGL specification
+
+@SYMTestActions
+Call eglGetError
+Check error is EGL_SUCCESS
+
+Get default display
+Check error code is EGL_SUCCESS
+
+Query string for version
+Check return value is null and error code is EGL_NOT_INITIALIZED
+
+Call eglGetError
+Check error is EGL_SUCCESS
+
+Query string for vendor
+Check return value is null and error code is EGL_NOT_INITIALIZED
+
+Release thread
+Call eglGetError
+Check error is EGL_SUCCESS
+
+Release thread
+Check return value is true
+*/
+TVerdict CEglTest_GetError::doTestStepL()
+ {
+ SetTestStepID(_L("GRAPHICS-EGL-0507"));
+ INFO_PRINTF1(_L("CEglTest_GetError::doTestStepL"));
+
+ TEST(eglGetError() == EGL_SUCCESS);
+
+ // Create display object
+ GetDisplayL();
+ TEST(eglGetError() == EGL_SUCCESS);
+
+ // Query string for version
+ const char* strEglVersion = eglQueryString(iDisplay, EGL_VERSION);
+ TEST_EGL_ERROR(strEglVersion == NULL, EGL_NOT_INITIALIZED);
+
+ // Query string for vendor
+ const char* strEglVendor = eglQueryString(iDisplay, EGL_VENDOR);
+ TEST_EGL_ERROR(strEglVendor == NULL, EGL_NOT_INITIALIZED);
+
+ TEST_EGL_ERROR(eglReleaseThread() == EGL_TRUE, EGL_SUCCESS);
+
+ RecordTestResultL();
+ CloseTMSGraphicsStep();
+ return TestStepResult();
+ }
+
+/**
+@SYMTestCaseID GRAPHICS-EGL-0508
+
+@SYMPREQ 2400
+
+@SYMTestPriority 1
+
+@SYMTestCaseDesc
+Test eglGetError behavior and to prove that error is specific to each thread
+
+@SYMTestExpectedResults
+Error code is set according to EGL specification
+
+@SYMTestActions
+Main Thread
+Call eglGetError
+Check error is EGL_SUCCESS
+
+Get default display
+Check error code is EGL_SUCCESS
+
+Query string for version
+Check return value is null but do not check error code
+
+Launch thread A
+Wait for thread A to exit
+ Thread A
+ Call eglGetError
+ Check error is EGL_SUCCESS
+
+ Get default display
+ Check error code is EGL_SUCCESS
+
+ Release thread
+ Check return value is true
+ Exit
+
+Main Thread
+Check error code is EGL_NOT_INITIALIZED
+
+Query string for version
+Check return value is null and error code is EGL_NOT_INITIALIZED
+
+Release thread
+Check return value is true
+Exit
+*/
+TVerdict CEglTest_GetErrorMultiThread::doTestStepL()
+ {
+ SetTestStepID(_L("GRAPHICS-EGL-0508"));
+ INFO_PRINTF1(_L("CEglTest_GetErrorMultiThread::doTestStepL"));
+
+ TEST(eglGetError() == EGL_SUCCESS);
+
+ GetDisplayL();
+ TEST(eglGetError() == EGL_SUCCESS);
+
+ INFO_PRINTF1(_L("Query string for version..."));
+ const char* strEglVersion = eglQueryString(iDisplay, EGL_VERSION);
+ TEST(strEglVersion == NULL);
+
+ INFO_PRINTF1(_L("Launch thread A"));
+ Test_MultiThreadL(1, ETrue);
+
+ // Check that eglGetError is specific to each thread
+ TEST(eglGetError() == EGL_NOT_INITIALIZED);
+
+ INFO_PRINTF1(_L("Query string for vendor..."));
+ const char* strEglVendor = eglQueryString(iDisplay, EGL_VENDOR);
+ TEST_EGL_ERROR(strEglVendor == NULL, EGL_NOT_INITIALIZED);
+
+ TEST(eglReleaseThread() == EGL_TRUE);
+
+ RecordTestResultL();
+ CloseTMSGraphicsStep();
+ return TestStepResult();
+ }
+
+void CEglTest_GetErrorMultiThread::doThreadFunctionL(TInt aIdx)
+ {
+ INFO_PRINTF2(_L("CEglTest_GetErrorMultiThread::doThreadFunctionL, Thread %d"),aIdx);
+
+ TEST(eglGetError() == EGL_SUCCESS);
+
+ INFO_PRINTF2(_L("Create display object from thread: %d"), aIdx);
+ EGLDisplay dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+ TEST_EGL_ERROR(dpy == iDisplay, EGL_SUCCESS);
+
+ TEST(eglReleaseThread() == EGL_TRUE);
+ }
+
+/**
+@SYMTestCaseID GRAPHICS-EGL-0509
+
+@SYMPREQ 2400
+
+@SYMTestPriority 1
+
+@SYMTestPurpose
+Test eglGetDisplay, eglInitialize, eglTerminate and eglQueryString behaviors from a single thread
+
+@SYMTestExpectedResults
+Return value and error code shall conform to EGL specification
+
+@SYMTestCaseDesc
+Basic positive test
+
+@SYMTestActions
+Get default display
+Check the return value is not EGL_NO_DISPLAY and error code is EGL_SUCCESS
+
+Initialise display
+Check return value is true, error code is EGL_SUCCESS and version is updated
+
+Query string for vendor
+Check return value is not null and error code is EGL_SUCCESS
+
+Terminate display
+Check return value is true and error code is EGL_SUCCESS
+
+Release thread
+Check return value is true
+*/
+TVerdict CEglTest_Display_Positive_Basic::doTestStepL()
+ {
+ SetTestStepID(_L("GRAPHICS-EGL-0509"));
+ INFO_PRINTF1(_L("CEglTest_Display_Positive_Basic::doTestStepL"));
+
+ // Create display object
+ GetDisplayL();
+ TEST(eglGetError() == EGL_SUCCESS);
+
+ // Initialise display object
+ EGLint major = -1, minor = -1;
+ INFO_PRINTF1(_L("Calling eglInitialize..."));
+ TEST_EGL_ERROR(eglInitialize(iDisplay, &major, &minor), EGL_SUCCESS);
+ TEST(major != -1 && minor != -1); // Version is updated
+
+ // Query string for vendor
+ INFO_PRINTF1(_L("Query string for vendor..."));
+ const char* strEglVendor = eglQueryString(iDisplay, EGL_VENDOR);
+ TEST_EGL_ERROR(strEglVendor != NULL, EGL_SUCCESS);
+
+ // Terminate display
+ TerminateDisplayL();
+ TEST(eglGetError() == EGL_SUCCESS);
+
+ // Release thread
+ TEST(eglReleaseThread() == EGL_TRUE);
+
+ RecordTestResultL();
+ CloseTMSGraphicsStep();
+ return TestStepResult();
+ }
+
+/**
+@SYMTestCaseID GRAPHICS-EGL-0510
+@SYMPREQ 2400
+@SYMTestPriority 1
+@SYMTestPurpose
+Test eglGetDisplay, eglInitialize and eglTerminate behaviors from a single thread
+
+@SYMTestExpectedResults
+Return value and error code shall conform to EGL specification
+
+@SYMTestCaseDesc
+Invalid display test
+
+@SYMTestActions
+Get display other than default
+Check return value is EGL_NO_DISPLAY and error code is EGL_SUCCESS
+
+Initialise display
+Check return value is false, error code is EGL_BAD_DISPLAY and version is not updated
+
+Terminate display
+Check return value is false and error code is EGL_BAD_DISPLAY
+
+Release thread
+Check return value is true
+*/
+TVerdict CEglTest_Display_Negative_InvalidDisplay::doTestStepL()
+ {
+ SetTestStepID(_L("GRAPHICS-EGL-0510"));
+ INFO_PRINTF1(_L("CEglTest_Display_Negative_InvalidDisplay::doTestStepL"));
+
+ // Get display other than default
+ const NativeDisplayType nonDefaultDisplay = -1;
+ iDisplay = eglGetDisplay(nonDefaultDisplay);
+ TEST_EGL_ERROR(iDisplay == EGL_NO_DISPLAY, EGL_SUCCESS);
+
+ // Initialise display object
+ EGLint major = -1, minor = -1;
+ INFO_PRINTF1(_L("Calling eglInitialize..."));
+ TEST_EGL_ERROR(eglInitialize(iDisplay, &major, &minor) == EGL_FALSE, EGL_BAD_DISPLAY);
+ TEST(major == -1 && minor == -1); // Version is Not updated
+
+ // Terminate display
+ TEST_EGL_ERROR(eglTerminate(iDisplay) == EGL_FALSE, EGL_BAD_DISPLAY);
+
+ // Release thread
+ TEST(eglReleaseThread() == EGL_TRUE);
+
+ RecordTestResultL();
+ CloseTMSGraphicsStep();
+ return TestStepResult();
+ }
+
+/**
+@SYMTestCaseID GRAPHICS-EGL-0511
+@SYMPREQ 2400
+@SYMTestPriority 1
+@SYMTestPurpose
+Test eglGetDisplay, eglInitialize, eglTerminate and eglQueryString behaviors from a single thread
+
+@SYMTestExpectedResults
+Return value and error code shall conform to EGL specification
+
+@SYMTestCaseDesc
+Un-initialised display usage test
+
+@SYMTestActions
+Get default display
+Check return value is not EGL_NO_DISPLAY and error code is EGL_SUCCESS
+
+Query string for vendor
+Check return value is null and error code is EGL_NOT_INITIALIZED
+
+Terminate display
+Check return value is true and error code is EGL_SUCCESS
+
+Release thread
+Check return value is true
+*/
+TVerdict CEglTest_Display_Negative_NotInitializedDisplay::doTestStepL()
+ {
+ SetTestStepID(_L("GRAPHICS-EGL-0511"));
+ INFO_PRINTF1(_L("CEglTest_Display_Negative_NotInitializedDisplay::doTestStepL"));
+
+ // Create display object
+ GetDisplayL();
+ TEST(eglGetError() == EGL_SUCCESS);
+
+ // Query string for vendor
+ INFO_PRINTF1(_L("Query string for vendor"));
+ const char* strEglVendor = eglQueryString(iDisplay, EGL_VENDOR);
+ TEST_EGL_ERROR(strEglVendor == NULL, EGL_NOT_INITIALIZED);
+
+ // Terminate display
+ TerminateDisplayL();
+ TEST(eglGetError() == EGL_SUCCESS);
+
+ // Release thread
+ TEST(eglReleaseThread() == EGL_TRUE);
+
+ RecordTestResultL();
+ CloseTMSGraphicsStep();
+ return TestStepResult();
+ }
+
+/**
+@SYMTestCaseID GRAPHICS-EGL-0512
+@SYMPREQ 2400
+@SYMTestPriority 1
+@SYMTestPurpose
+Test eglGetDisplay, eglInitialize, eglTerminate and eglQueryString behaviors from a single thread
+
+@SYMTestExpectedResults
+Return value and error code shall conform to EGL specification
+
+@SYMTestCaseDesc
+Reinitialise display test
+
+@SYMTestActions
+Get default display
+Check the return value is not EGL_NO_DISPLAY and error code is EGL_SUCCESS
+
+Initialise display
+Check return value is true, error code is EGL_SUCCESS and version is updated
+
+Terminate display
+Check return value is true and error code is EGL_SUCCESS
+
+Query string for version
+Check return value is null and error code is EGL_NOT_INITIALIZED
+
+Initialise display
+Check return value is true, error code is EGL_SUCCESS and version is updated
+
+Query string for version
+Check return value is not null and error code is EGL_SUCCESS
+
+Terminate display
+Check return value is true and error code is EGL_SUCCESS
+
+Release thread
+Check return value is true
+*/
+TVerdict CEglTest_Display_Positive_ReinitializeDisplay::doTestStepL()
+ {
+ SetTestStepID(_L("GRAPHICS-EGL-0512"));
+ INFO_PRINTF1(_L("CEglTest_Display_Positive_ReinitializeDisplay::doTestStepL"));
+
+ // Create display object
+ GetDisplayL();
+ TEST(eglGetError() == EGL_SUCCESS);
+
+ // Initialise display object
+ EGLint major = -1, minor = -1;
+ INFO_PRINTF1(_L("Calling eglInitialize..."));
+ TEST_EGL_ERROR(eglInitialize(iDisplay, &major, &minor), EGL_SUCCESS);
+ TEST(major != -1 && minor != -1); // Version is updated
+
+ // Terminate display
+ INFO_PRINTF1(_L("Calling eglTerminate..."));
+ TEST_EGL_ERROR(eglTerminate(iDisplay), EGL_SUCCESS);
+
+ // Query string for version
+ INFO_PRINTF1(_L("Query string for version..."));
+ const char* strEglVersion = eglQueryString(iDisplay, EGL_VERSION);
+ TEST_EGL_ERROR(strEglVersion == NULL, EGL_NOT_INITIALIZED);
+
+ // Re-Initialise display object
+ major = -1;
+ minor = -1;
+ INFO_PRINTF1(_L("Calling eglInitialize..."));
+ TEST_EGL_ERROR(eglInitialize(iDisplay, &major, &minor), EGL_SUCCESS);
+ TEST(major != -1 && minor != -1); // Version is updated
+
+ // Query string for version
+ INFO_PRINTF1(_L("Query string for version..."));
+ strEglVersion = eglQueryString(iDisplay, EGL_VERSION);
+ TEST_EGL_ERROR(strEglVersion != NULL, EGL_SUCCESS);
+
+ // Terminate display
+ TerminateDisplayL();
+ TEST(eglGetError() == EGL_SUCCESS);
+
+ // Release thread
+ TEST(eglReleaseThread() == EGL_TRUE);
+
+ RecordTestResultL();
+ CloseTMSGraphicsStep();
+ return TestStepResult();
+ }
+
+/**
+@SYMTestCaseID GRAPHICS-EGL-0513
+@SYMPREQ 2400
+@SYMTestPriority 1
+@SYMTestPurpose
+Test eglGetDisplay, eglInitialize and eglTerminate behavior from a single thread
+
+@SYMTestExpectedResults
+Return value and error code shall conform to EGL specification
+
+@SYMTestCaseDesc
+Multiple initialisation test
+
+@SYMTestActions
+Get default display
+Check the return value is not EGL_NO_DISPLAY and error code is EGL_SUCCESS
+
+Initialise display
+Check return value is true, error code is EGL_SUCCESS and version is updated
+
+Initialise display
+Check return value is true, error code is EGL_SUCCESS and version is updated
+
+Terminate display
+Check return value is true and error code is EGL_SUCCESS
+
+Query string for version
+Check return value is null and error code is EGL_NOT_INITIALIZED
+
+Release thread
+Check return value is true
+*/
+TVerdict CEglTest_Display_Positive_MultipleInitialization::doTestStepL()
+ {
+ SetTestStepID(_L("GRAPHICS-EGL-0513"));
+ INFO_PRINTF1(_L("CEglTest_Display_Positive_MultipleInitialization::doTestStepL"));
+
+ // Create display object
+ GetDisplayL();
+ TEST(eglGetError() == EGL_SUCCESS);
+
+ // Initialise display object
+ EGLint major = -1, minor = -1;
+ INFO_PRINTF1(_L("Calling eglInitialize..."));
+ TEST_EGL_ERROR(eglInitialize(iDisplay, &major, &minor), EGL_SUCCESS);
+ TEST(major != -1 && minor != -1); // Version is updated
+
+ // Initialise display object
+ major = -1;
+ minor = -1;
+ INFO_PRINTF1(_L("Calling eglInitialize..."));
+ TEST_EGL_ERROR(eglInitialize(iDisplay, &major, &minor), EGL_SUCCESS);
+ TEST(major != -1 && minor != -1); // Version is updated
+
+ // Terminate display
+ INFO_PRINTF1(_L("Calling eglTerminate..."));
+ TEST_EGL_ERROR(eglTerminate(iDisplay), EGL_SUCCESS);
+
+ // Query string for version
+ INFO_PRINTF1(_L("Query string for version..."));
+ const char* strEglVersion = eglQueryString(iDisplay, EGL_VERSION);
+ TEST_EGL_ERROR(strEglVersion == NULL, EGL_NOT_INITIALIZED);
+
+ // Release thread
+ TEST(eglReleaseThread() == EGL_TRUE);
+
+ RecordTestResultL();
+ CloseTMSGraphicsStep();
+ return TestStepResult();
+ }
+
+/**
+@SYMTestCaseID GRAPHICS-EGL-0514
+@SYMPREQ 2400
+@SYMTestPriority 1
+@SYMTestPurpose
+Test eglGetDisplay, eglInitialize and eglTerminate behavior from a single thread
+
+@SYMTestExpectedResults
+Return value and error code shall conform to EGL specification
+
+@SYMTestCaseDesc
+Multiple termination test
+
+@SYMTestActions
+Get default display
+Check the return value is not EGL_NO_DISPLAY and error code is EGL_SUCCESS
+
+Initialise display
+Check return value is true, error code is EGL_SUCCESS and version is updated
+
+Query string for extensions
+Check return value is not null and error code is EGL_SUCCESS
+
+Terminate display
+Check return value is true and error code is EGL_SUCCESS
+
+Terminate display
+Check return value is true and error code is EGL_SUCCESS
+
+Query string for extensions
+Check return value is null and error code is EGL_NOT_INITIALIZED
+
+Release thread
+Check return value is true
+
+Release thread
+Check return value is true
+*/
+TVerdict CEglTest_Display_Positive_MultipleTermination::doTestStepL()
+ {
+ SetTestStepID(_L("GRAPHICS-EGL-0514"));
+ INFO_PRINTF1(_L("CEglTest_Display_Positive_MultipleTermination::doTestStepL"));
+
+ // Create display object
+ GetDisplayL();
+ TEST(eglGetError() == EGL_SUCCESS);
+
+ // Initialise display object
+ EGLint major = -1, minor = -1;
+ INFO_PRINTF1(_L("Calling eglInitialize..."));
+ TEST_EGL_ERROR(eglInitialize(iDisplay, &major, &minor), EGL_SUCCESS);
+ TEST(major != -1 && minor != -1); // Version is updated
+
+ // Query string for extensions
+ INFO_PRINTF1(_L("Query string for extensions..."));
+ const char* strEglExtensions = eglQueryString(iDisplay, EGL_EXTENSIONS);
+ TEST_EGL_ERROR(strEglExtensions != NULL, EGL_SUCCESS);
+
+ // Terminate display
+ INFO_PRINTF1(_L("Calling eglTerminate..."));
+ TEST_EGL_ERROR(eglTerminate(iDisplay), EGL_SUCCESS);
+
+ // Terminate display
+ INFO_PRINTF1(_L("Calling eglTerminate..."));
+ TEST_EGL_ERROR(eglTerminate(iDisplay), EGL_SUCCESS);
+
+ // Query string for extensions
+ INFO_PRINTF1(_L("Query string for extensions..."));
+ strEglExtensions = eglQueryString(iDisplay, EGL_EXTENSIONS);
+ TEST_EGL_ERROR(strEglExtensions == NULL, EGL_NOT_INITIALIZED);
+
+ // Release thread
+ TEST(eglReleaseThread() == EGL_TRUE);
+
+ RecordTestResultL();
+ CloseTMSGraphicsStep();
+ return TestStepResult();
+ }
+
+/**
+@SYMTestCaseID GRAPHICS-EGL-0515
+@SYMPREQ 2400
+@SYMTestPriority 1
+@SYMTestPurpose
+Test eglGetDisplay, eglInitialize, eglTerminate and eglQueryString behaviors from multiple threads within a process
+
+@SYMTestExpectedResults
+Return value and error code shall conform to EGL specification
+
+@SYMTestCaseDesc
+Basic multi threaded test
+
+@SYMTestActions
+Main Thread
+Get default display
+Check the return value is not EGL_NO_DISPLAY and error code is EGL_SUCCESS
+
+Initialise display
+Check return value is true, error code is EGL_SUCCESS and version is updated
+
+Query string for vendor
+Check return value is not null and error code is EGL_SUCCESS
+
+Launch thread A
+Wait for thread A to exit
+ Thread A
+ Get default display
+ Check the return value is not EGL_NO_DISPLAY and error code is EGL_SUCCESS
+
+ Initialise display
+ Check return value is true, error code is EGL_SUCCESS and version is updated
+
+ Query string for vendor
+ Check return value is not null and error code is EGL_SUCCESS
+
+ Terminate display
+ Check return value is true and error code is EGL_SUCCESS
+
+ Release thread
+ Check return value is true
+ Exit
+
+Main Thread
+Query string for vendor
+Check return value is null and error code is EGL_NOT_INITIALIZED
+
+Terminate display
+Check return value is true and error code is EGL_SUCCESS
+
+Release thread
+Check return value is true
+Exit
+*/
+TVerdict CEglTest_Display_Positive_Multithread_Basic::doTestStepL()
+ {
+ SetTestStepID(_L("GRAPHICS-EGL-0515"));
+ INFO_PRINTF1(_L("CEglTest_Display_Positive_Multithread_Basic::doTestStepL"));
+
+ // Create display object
+ GetDisplayL();
+ TEST(eglGetError() == EGL_SUCCESS);
+
+ // Initialise display object
+ EGLint major = -1, minor = -1;
+ INFO_PRINTF1(_L("Calling eglInitialize..."));
+ TEST_EGL_ERROR(eglInitialize(iDisplay, &major, &minor), EGL_SUCCESS);
+ TEST(major != -1 && minor != -1);
+
+ // Query string for vendor
+ INFO_PRINTF1(_L("Query string for vendor..."));
+ const char* strEglVendor = eglQueryString(iDisplay, EGL_VENDOR);
+ TEST_EGL_ERROR(strEglVendor != NULL, EGL_SUCCESS);
+
+ INFO_PRINTF1(_L("Launch extra thread..."));
+ Test_MultiThreadL(1, ETrue);
+
+ // Query string for vendor
+ INFO_PRINTF1(_L("Query string for vendor..."));
+ strEglVendor = eglQueryString(iDisplay, EGL_VENDOR);
+ TEST_EGL_ERROR(strEglVendor == NULL, EGL_NOT_INITIALIZED);
+
+ // Terminate display
+ TerminateDisplayL();
+ TEST(eglGetError() == EGL_SUCCESS);
+
+ // Release thread
+ TEST(eglReleaseThread() == EGL_TRUE);
+
+ RecordTestResultL();
+ CloseTMSGraphicsStep();
+ return TestStepResult();
+ }
+
+void CEglTest_Display_Positive_Multithread_Basic::doThreadFunctionL(TInt aIdx)
+ {
+ INFO_PRINTF2(_L("CEglTest_Display_Positive_Multithread_Basic::doThreadFunctionL, Thread %d"),aIdx);
+
+ INFO_PRINTF2(_L("Create display object from thread: %d"), aIdx);
+ GetDisplayL();
+ TEST(eglGetError() == EGL_SUCCESS);
+
+ // Initialise display object
+ EGLint major = -1, minor = -1;
+ INFO_PRINTF1(_L("Calling eglInitialize..."));
+ TEST_EGL_ERROR(eglInitialize(iDisplay, &major, &minor), EGL_SUCCESS);
+ TEST(major != -1 && minor != -1); // Version is updated
+
+ // Query string for vendor
+ INFO_PRINTF1(_L("Query string for vendor..."));
+ const char* strEglVendor = eglQueryString(iDisplay, EGL_VENDOR);
+ TEST_EGL_ERROR(strEglVendor != NULL, EGL_SUCCESS);
+
+ // Terminate display
+ INFO_PRINTF1(_L("Calling eglTerminate..."));
+ TEST_EGL_ERROR(eglTerminate(iDisplay), EGL_SUCCESS);
+
+ TEST_EGL_ERROR(eglReleaseThread() == EGL_TRUE, EGL_SUCCESS);
+ }
+
+/**
+@SYMTestCaseID GRAPHICS-EGL-0516
+@SYMPREQ 2400
+@SYMTestPriority 1
+@SYMTestPurpose
+Test eglGetDisplay, eglInitialize and eglTerminate behavior from multiple threads within a process
+
+@SYMTestExpectedResults
+Return value and error code shall conform to EGL specification
+
+@SYMTestCaseDesc
+Initialise and terminate display from one thread only
+
+@SYMTestActions
+Main Thread
+Launch thread A and B
+Wait for both thread A and B to exit
+
+ Thread A
+ Get default display
+ Check the return value is not EGL_NO_DISPLAY and error code is EGL_SUCCESS
+
+ Initialise display
+ Check return value is true, error code is EGL_SUCCESS and version is 1.4
+
+ Rendezvous
+
+ Thread A and B
+ Query string for vendor
+ Check return value is not null and error code is EGL_SUCCESS
+
+ Rendezvous
+
+ Thread A
+ Terminate display
+ Check return value is true and error code is EGL_SUCCESS
+
+ Rendezvous
+
+ Thread A and B
+ Query string for vendor
+ Check return value is null and error code is EGL_NOT_INITIALIZED
+
+ Release thread
+ Check return value is true
+ Exit
+
+Main Thread
+Exit
+*/
+TVerdict CEglTest_Display_Positive_Multithread_InitTerminateInOneTread::doTestStepL()
+ {
+ SetTestStepID(_L("GRAPHICS-EGL-0516"));
+ INFO_PRINTF1(_L("CEglTest_Display_Positive_Multithread_InitTerminateInOneTread::doTestStepL"));
+
+ INFO_PRINTF1(_L("Launch two threads"));
+ Test_MultiThreadL(2, ETrue);
+
+ RecordTestResultL();
+ CloseTMSGraphicsStep();
+ return TestStepResult();
+ }
+
+void CEglTest_Display_Positive_Multithread_InitTerminateInOneTread::doThreadFunctionL(TInt aIdx)
+ {
+ INFO_PRINTF2(_L("CEglTest_Display_Positive_Multithread_InitTerminateInOneTread::doThreadFunctionL, Thread %d"),aIdx);
+
+ if(aIdx == 0)
+ {
+ INFO_PRINTF2(_L("Create display object from thread: %d"), aIdx);
+ GetDisplayL();
+ TEST(eglGetError() == EGL_SUCCESS);
+
+ // Initialise display object
+ EGLint major = -1, minor = -1;
+ INFO_PRINTF2(_L("Calling eglInitialize from thread %d"),aIdx);
+ TEST_EGL_ERROR(eglInitialize(iDisplay, &major, &minor), EGL_SUCCESS);
+ TEST(major != -1 && minor != -1); // Version is updated
+ }
+
+ Rendezvous(aIdx);
+
+ // Query string for vendor
+ INFO_PRINTF2(_L("Query string for vendor from thread %d"), aIdx);
+ const char* strEglVendor = eglQueryString(iDisplay, EGL_VENDOR);
+ TEST_EGL_ERROR(strEglVendor != NULL, EGL_SUCCESS);
+
+ Rendezvous(aIdx);
+
+ if(aIdx == 0)
+ {
+ INFO_PRINTF2(_L("Calling eglTerminate... from thread: %d"), aIdx);
+ TEST_EGL_ERROR(eglTerminate(iDisplay), EGL_SUCCESS);
+ }
+
+ Rendezvous(aIdx);
+
+ // Query string for vendor
+ INFO_PRINTF2(_L("Query string for vendor from thread %d"), aIdx);
+ strEglVendor = eglQueryString(iDisplay, EGL_VENDOR);
+ TEST_EGL_ERROR(strEglVendor == NULL, EGL_NOT_INITIALIZED);
+
+ TEST_EGL_ERROR(eglReleaseThread() == EGL_TRUE, EGL_SUCCESS);
+ }
+
+/*
+@SYMTestCaseID GRAPHICS-EGL-0517
+@SYMPREQ 2400
+@SYMTestPriority 1
+@SYMTestPurpose
+Test eglGetDisplay, eglInitialize, eglTerminate and eglQueryString behaviors from multiple threads within a process
+
+@SYMTestExpectedResults
+Return value and error code shall conform to EGL specification
+
+@SYMTestCaseDesc
+Initialise display from one thread and terminate from another thread
+
+@SYMTestActions
+Main Thread
+Launch thread A and B
+Wait for both thread A and B to exit
+
+ Thread A
+ Get default display
+ Check the return value is not EGL_NO_DISPLAY and error code is EGL_SUCCESS
+
+ Initialise display
+ Check return value is true, error code is EGL_SUCCESS and version is 1.4
+
+ Rendezvous
+
+ Thread A and B
+ Query string for vendor
+ Check return value is not null and error code is EGL_SUCCESS
+
+ Rendezvous
+
+ Thread B
+ Terminate display
+ Check return value is true and error code is EGL_SUCCESS
+
+ Rendezvous
+
+ Thread A and B
+ Query string for vendor
+ Check return value is null and error code is EGL_NOT_INITIALIZED
+
+ Release thread
+ Check return value is true
+ Exit
+
+Main Thread
+Exit
+*/
+TVerdict CEglTest_Display_Positive_Multithread_InitTerminateFromDifferentThread::doTestStepL()
+ {
+ SetTestStepID(_L("GRAPHICS-EGL-0517"));
+ INFO_PRINTF1(_L("CEglTest_Display_Positive_Multithread_InitTerminateFromDifferentThread::doTestStepL"));
+
+ INFO_PRINTF1(_L("Launch two threads"));
+ Test_MultiThreadL(2, ETrue);
+
+ RecordTestResultL();
+ CloseTMSGraphicsStep();
+ return TestStepResult();
+ }
+
+void CEglTest_Display_Positive_Multithread_InitTerminateFromDifferentThread::doThreadFunctionL(TInt aIdx)
+ {
+ INFO_PRINTF2(_L("CEglTest_Display_Positive_Multithread_InitTerminateFromDifferentThread::doThreadFunctionL, Thread %d"),aIdx);
+
+ if(aIdx == 0)
+ {
+ INFO_PRINTF2(_L("Create display object from thread: %d"), aIdx);
+ GetDisplayL();
+ TEST(eglGetError() == EGL_SUCCESS);
+
+ // Initialise display object
+ EGLint major = -1, minor = -1;
+ INFO_PRINTF2(_L("Calling eglInitialize from thread %d"),aIdx);
+ TEST_EGL_ERROR(eglInitialize(iDisplay, &major, &minor), EGL_SUCCESS);
+ TEST(major != -1 && minor != -1);
+ }
+
+ Rendezvous(aIdx);
+
+ // Query string for vendor
+ INFO_PRINTF2(_L("Query string for vendor from thread %d"), aIdx);
+ const char* strEglVendor = eglQueryString(iDisplay, EGL_VENDOR);
+ TEST_EGL_ERROR(strEglVendor != NULL, EGL_SUCCESS);
+
+ Rendezvous(aIdx);
+
+ if(aIdx == 1)
+ {
+ INFO_PRINTF2(_L("Calling eglTerminate... from thread: %d"), aIdx);
+ TEST_EGL_ERROR(eglTerminate(iDisplay), EGL_SUCCESS);
+ }
+
+ Rendezvous(aIdx);
+
+ // Query string for vendor
+ INFO_PRINTF2(_L("Query string for vendor from thread %d"), aIdx);
+ strEglVendor = eglQueryString(iDisplay, EGL_VENDOR);
+ TEST_EGL_ERROR(strEglVendor == NULL, EGL_NOT_INITIALIZED);
+
+ TEST_EGL_ERROR(eglReleaseThread() == EGL_TRUE, EGL_SUCCESS);
+ }
+
+/**
+@SYMTestCaseID GRAPHICS-EGL-0518
+@SYMPREQ 2400
+@SYMTestPriority 1
+@SYMTestPurpose
+Test eglGetDisplay, eglInitialize, eglTerminate and eglQueryString behaviors from multiple threads within a process
+
+@SYMTestExpectedResults
+Return value and error code shall conform to EGL specification
+
+@SYMTestCaseDesc
+Test large number of threads
+
+@SYMTestActions
+Main thread
+Get default display
+Check the return value is not EGL_NO_DISPLAY and error code is EGL_SUCCESS
+
+Launch 100 threads
+Wait for all threads to exit
+
+From each spawned thread
+Get default display
+Check the return value is not EGL_NO_DISPLAY and error code is EGL_SUCCESS
+
+Initialise display
+Check return value is true, error code is EGL_SUCCESS and version is updated
+
+Query string for vendor
+Check return value is not null and error code is EGL_SUCCESS
+
+Release thread
+Check return value is true
+Exit
+
+Main thread
+Terminate display
+Check return value is true and error code is EGL_SUCCESS
+
+Query string for vendor
+Check return value is null and error code is EGL_NOT_INITIALIZED
+
+Release thread
+Check return value is true
+Exit
+*/
+TVerdict CEglTest_Display_Positive_Multithread_Stress::doTestStepL()
+ {
+ SetTestStepID(_L("GRAPHICS-EGL-0518"));
+ INFO_PRINTF1(_L("CEglTest_Display_Positive_Multithread_Stress::doTestStepL"));
+
+ INFO_PRINTF1(_L("Create display object from main thread"));
+ GetDisplayL();
+ TEST(eglGetError() == EGL_SUCCESS);
+
+ // launch 100 threads.
+ Test_MultiThreadL(100, EFalse);
+
+ INFO_PRINTF1(_L("Calling eglTerminate from main thread"));
+ TEST_EGL_ERROR(eglTerminate(iDisplay), EGL_SUCCESS);
+
+ // Query string for vendor
+ const char* strEglVendor = eglQueryString(iDisplay, EGL_VENDOR);
+ TEST_EGL_ERROR(strEglVendor == NULL, EGL_NOT_INITIALIZED);
+
+ TEST_EGL_ERROR(eglReleaseThread() == EGL_TRUE, EGL_SUCCESS);
+ RecordTestResultL();
+ CloseTMSGraphicsStep();
+ return TestStepResult();
+ }
+
+void CEglTest_Display_Positive_Multithread_Stress::doThreadFunctionL(TInt aIdx)
+ {
+ INFO_PRINTF2(_L("CEglTest_Display_Positive_Multithread_Stress::doThreadFunctionL, Thread %d"),aIdx);
+
+ //Create display objec
+ GetDisplayL();
+ TEST(eglGetError() == EGL_SUCCESS);
+
+ // Initialise display object
+ EGLint major = -1, minor = -1;
+ INFO_PRINTF1(_L("Calling eglInitialize..."));
+ TEST_EGL_ERROR(eglInitialize(iDisplay, &major, &minor), EGL_SUCCESS);
+ TEST(major != -1 && minor != -1); // Version is updated
+
+ // Query string for vendor
+ const char* strEglVendor = eglQueryString(iDisplay, EGL_VENDOR);
+ TEST_EGL_ERROR(strEglVendor != NULL, EGL_SUCCESS);
+
+ TEST_EGL_ERROR(eglReleaseThread() == EGL_TRUE, EGL_SUCCESS);
+ }
+
+/**
+@SYMTestCaseID GRAPHICS-EGL-0519
+@SYMPREQ 2400
+@SYMTestPriority 1
+@SYMTestPurpose
+Test eglGetDisplay, eglInitialize, eglTerminate and eglQueryString behaviors from multiple processes
+
+@SYMTestExpectedResults
+Return value and error code shall conform to EGL specification
+
+@SYMTestCaseDesc
+Basic multi process test
+
+@SYMTestActions
+Main Process
+Launch process A and B
+Wait until process A and B are terminated
+
+ Process A
+ Get default display
+ Check the return value is not EGL_NO_DISPLAY and error code is EGL_SUCCESS
+
+ Initialise display
+ Check return value is true, error code is EGL_SUCCESS and version is updated
+
+ Query string for vendor
+ Check return value is not null and error code is EGL_SUCCESS
+
+ Rendezvous
+
+ Process B
+ Get default display
+ Check the return value is not EGL_NO_DISPLAY and error code is EGL_SUCCESS
+
+ Initialise display
+ Check return value is true, error code is EGL_SUCCESS and version is updated
+
+ Query string for vendor
+ Check return value is not null and error code is EGL_SUCCESS
+
+ Terminate display
+ Check return value is true and error code is EGL_SUCCESS
+
+ Release thread
+ Check return value is true
+ Exit
+
+ Rendezvous
+
+ Process A
+ Query string for vendor
+ Check return value is not null and error code is EGL_SUCCESS
+
+ Terminate display
+ Check return value is true and error code is EGL_SUCCESS
+
+ Release thread
+ Check return value is true
+ Exit
+
+Main Process
+Exit
+*/
+TVerdict CEglTest_Display_Positive_Multiprocess_Basic::doTestStepL()
+ {
+ SetTestStepID(_L("GRAPHICS-EGL-0519"));
+ INFO_PRINTF1(_L("CEglTest_Display_Positive_Multiprocess_Basic::doTestStepL"));
+
+ INFO_PRINTF1(_L("Launch two processes"));
+ Test_MultiProcessL(KEglTestStepDllName, 2, KDisplay_Positive_Multiprocess_Basic);
+
+ RecordTestResultL();
+ CloseTMSGraphicsStep();
+ return TestStepResult();
+ }
+
+void CEglTest_Display_Positive_Multiprocess_Basic::doProcessFunctionL(TInt aIdx)
+ {
+ INFO_PRINTF2(_L("CEglTest_Display_Positive_Multiprocess_Basic::doThreadFunctionL, Thread %d"),aIdx);
+
+ if(aIdx == 0)
+ {
+ INFO_PRINTF2(_L("Create display object from Process: %d"), aIdx);
+ GetDisplayL();
+ TEST(eglGetError() == EGL_SUCCESS);
+
+ // Initialise display object
+ EGLint major = -1, minor = -1;
+ INFO_PRINTF2(_L("Calling eglInitialize from Process %d"),aIdx);
+ TEST_EGL_ERROR(eglInitialize(iDisplay, &major, &minor), EGL_SUCCESS);
+ TEST(major != -1 && minor != -1); // Version is updated
+
+ // Query string for vendor
+ INFO_PRINTF2(_L("Query string for vendor from Process %d"),aIdx);
+ const char* strEglVendor = eglQueryString(iDisplay, EGL_VENDOR);
+ TEST_EGL_ERROR(strEglVendor != NULL, EGL_SUCCESS);
+ }
+
+ Rendezvous(aIdx);
+
+ if(aIdx == 1)
+ {
+ INFO_PRINTF2(_L("Create display object from Process: %d"), aIdx);
+ GetDisplayL();
+ TEST(eglGetError() == EGL_SUCCESS);
+
+ // Initialise display object
+ EGLint major = -1, minor = -1;
+ INFO_PRINTF2(_L("Calling eglInitialize from Process %d"),aIdx);
+ TEST_EGL_ERROR(eglInitialize(iDisplay, &major, &minor), EGL_SUCCESS);
+ TEST(major != -1 && minor != -1); // Version is updated
+
+ // Query string for vendor
+ INFO_PRINTF2(_L("Query string for vendor from Process %d"),aIdx);
+ const char* strEglVendor = eglQueryString(iDisplay, EGL_VENDOR);
+ TEST_EGL_ERROR(strEglVendor != NULL, EGL_SUCCESS);
+
+ // Terminate display object
+ INFO_PRINTF2(_L("Terminate display from Process %d"),aIdx);
+ TerminateDisplayL();
+ TEST(eglGetError() == EGL_SUCCESS);
+
+ TEST_EGL_ERROR(eglReleaseThread() == EGL_TRUE, EGL_SUCCESS);
+ }
+
+ Rendezvous(aIdx);
+
+ if(aIdx == 0)
+ {
+ // Query string for vendor
+ INFO_PRINTF2(_L("Query string for vendor from Process %d"),aIdx);
+ const char* strEglVendor = eglQueryString(iDisplay, EGL_VENDOR);
+ TEST_EGL_ERROR(strEglVendor != NULL, EGL_SUCCESS);
+
+ // Terminate display object
+ INFO_PRINTF2(_L("Terminate display from Process %d"),aIdx);
+ TerminateDisplayL();
+ TEST(eglGetError() == EGL_SUCCESS);
+
+ TEST_EGL_ERROR(eglReleaseThread() == EGL_TRUE, EGL_SUCCESS);
+ }
+ }
+
+/**
+@SYMTestCaseID GRAPHICS-EGL-0520
+@SYMPREQ 2400
+@SYMTestPriority 1
+@SYMTestPurpose
+Test the behaviour of eglGetDisplay in a Client heap OOM situation.
+
+@SYMTestExpectedResults
+No memory or handle leaks.
+
+@SYMTestCaseDesc
+Client heap OOM test
+
+@SYMTestActions
+Within a for loop that iterates through increasing memory failure at failAt:
+ *mark client heap with __UHEAP_SETFAIL(RHeap::EDeterministic,failAt)
+ *mark client heap with __UHEAP_MARK
+ *call eglGetDisplay()
+ *call eglGetError()
+ *reset client heap with __UHEAP_RESET
+ *If either egl function call fails and raises EGL_BAD_ALLOC, increase the failAt and restart the loop.
+If the procedure was successful release all the resources and check the client heap for memory leaks.
+No memory or handle leaks.
+*/
+TVerdict CEglTest_Display_OOM_ClientHeap::doTestStepL()
+ {
+ SetTestStepID(_L("GRAPHICS-EGL-520"));
+ INFO_PRINTF1(_L("CEglTest_OOM_ClientHeap::doTestStepL"));
+
+ EGLint errorCode = EGL_BAD_ALLOC;
+ for(TInt failAt=1; errorCode == EGL_BAD_ALLOC; ++failAt)
+ {
+ INFO_PRINTF2(_L("Set Client heap to fail at %u allocations"), failAt);
+
+ __UHEAP_SETFAIL(RHeap::EDeterministic, failAt);
+ __UHEAP_MARK;
+ EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+ errorCode = eglGetError();
+ __UHEAP_RESET;
+
+ if(display == EGL_NO_DISPLAY)
+ {
+ // If it's not EGL_BAD_ALLOC, loop will exit naturally.
+ TEST(errorCode == EGL_BAD_ALLOC);
+ __UHEAP_MARKEND;
+ }
+ else
+ {
+ // All memory failure points have been tested. So can exit the test.
+ TEST(errorCode == EGL_SUCCESS);
+ eglReleaseThread();
+ __UHEAP_MARKEND;
+ break;
+ }
+ }
+
+ RecordTestResultL();
+ CloseTMSGraphicsStep();
+ return TestStepResult();
+ }
+
+/**
+@SYMTestCaseID GRAPHICS-EGL-0521
+@SYMPREQ 2400
+@SYMTestPriority 1
+@SYMTestPurpose
+Test the behaviour of eglInitialize in a Client heap OOM situation.
+
+@SYMTestExpectedResults
+No memory or handle leaks.
+
+@SYMTestCaseDesc
+Client heap OOM test
+
+@SYMTestActions
+Get the display without setting memory failure.
+
+Within a for loop that iterates through increasing memory failure at failAt:
+ *mark client heap with __UHEAP_SETFAIL(RHeap::EDeterministic,failAt)
+ *mark client heap with __UHEAP_MARK
+ *call eglInitialize()
+ *call eglGetError()
+ *reset client heap with __UHEAP_RESET
+ *If either egl function call fails and raises EGL_BAD_ALLOC, increase the failAt and restart the loop.
+If the procedure was successful release all the resources and check the client heap for memory leaks.
+No memory or handle leaks.
+*/
+TVerdict CEglTest_Display_OOM_ClientHeap_Initialize::doTestStepL()
+ {
+ SetTestStepID(_L("GRAPHICS-EGL-521"));
+ INFO_PRINTF1(_L("CEglTest_Display_OOM_ClientHeap_Initialize::doTestStepL"));
+
+ EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+ TEST(eglGetError() == EGL_SUCCESS);
+
+ TEST(display != EGL_NO_DISPLAY);
+ if(display != EGL_NO_DISPLAY)
+ {
+ EGLint errorCode = EGL_BAD_ALLOC;
+ for(TInt failAt=1; errorCode == EGL_BAD_ALLOC; ++failAt)
+ {
+ INFO_PRINTF2(_L("Set Client heap to fail at %u allocations"), failAt);
+ __UHEAP_SETFAIL(RHeap::EDeterministic, failAt);
+ __UHEAP_MARK;
+ EGLBoolean res = eglInitialize(display, NULL, NULL);
+ errorCode = eglGetError();
+ __UHEAP_RESET;
+
+ if(res == EGL_TRUE)
+ {
+ // All memory failure points have been tested. So can exit the test.
+ TEST(errorCode == EGL_SUCCESS);
+ TEST_EGL_ERROR(eglTerminate(display), EGL_SUCCESS);
+ __UHEAP_MARKEND;
+ break;
+ }
+ else
+ {
+ // If it's not EGL_BAD_ALLOC, loop will exit naturally.
+ TEST(errorCode == EGL_BAD_ALLOC);
+ __UHEAP_MARKEND;
+ }
+ }
+ }
+
+ eglReleaseThread();
+
+ RecordTestResultL();
+ CloseTMSGraphicsStep();
+ return TestStepResult();
+ }
+