egl/egltest/src/egltest_geterroranddisplay.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 01:47:50 +0200
changeset 0 5d03bc08d59c
child 26 15986eb6c500
permissions -rw-r--r--
Revision: 201003 Kit: 201005

// 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();
    }