egl/egltest/src/egltest_geterroranddisplay.cpp
changeset 0 5d03bc08d59c
child 26 15986eb6c500
--- /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();
+    }
+