/*++

Copyright (c) 1995  Microsoft Corporation

Module Name:

    itlgsm.c

Abstract:

    This module contains the test functions for lineGetStatusMessages

Author:

    Oliver Wallace (OliverW)    10-Sep-1995

Revision History:

--*/


#include "windows.h"
#include "malloc.h"
#include "string.h"
#include "tapi.h"
#include "ttest.h"
#include "doline.h"
#include "tcore.h"
#include "tline.h"


#define ALL_LINEDEVSTATES        (LINEDEVSTATE_OTHER            | \
                                  LINEDEVSTATE_RINGING          | \
                                  LINEDEVSTATE_CONNECTED        | \
                                  LINEDEVSTATE_DISCONNECTED     | \
                                  LINEDEVSTATE_MSGWAITON        | \
                                  LINEDEVSTATE_INSERVICE        | \
                                  LINEDEVSTATE_OUTOFSERVICE     | \
                                  LINEDEVSTATE_MAINTENANCE      | \
                                  LINEDEVSTATE_OPEN             | \
                                  LINEDEVSTATE_CLOSE            | \
                                  LINEDEVSTATE_NUMCALLS         | \
                                  LINEDEVSTATE_NUMCOMPLETIONS   | \
                                  LINEDEVSTATE_TERMINALS        | \
                                  LINEDEVSTATE_ROAMMODE         | \
                                  LINEDEVSTATE_BATTERY          | \
                                  LINEDEVSTATE_SIGNAL           | \
                                  LINEDEVSTATE_DEVSPECIFIC      | \
                                  LINEDEVSTATE_REINIT           | \
                                  LINEDEVSTATE_LOCK             | \
                                  LINEDEVSTATE_CAPSCHANGE       | \
                                  LINEDEVSTATE_CONFIGCHANGE     | \
                                  LINEDEVSTATE_TRANSLATECHANGE  | \
                                  LINEDEVSTATE_COMPLCANCEL      | \
                                  LINEDEVSTATE_REMOVED)

#define ALL_ADDRESSSTATES        (LINEADDRESSSTATE_OTHER        | \
                                  LINEADDRESSSTATE_DEVSPECIFIC  | \
                                  LINEADDRESSSTATE_INUSEZERO    | \
                                  LINEADDRESSSTATE_INUSEONE     | \
                                  LINEADDRESSSTATE_INUSEMANY    | \
                                  LINEADDRESSSTATE_NUMCALLS     | \
                                  LINEADDRESSSTATE_FORWARD      | \
                                  LINEADDRESSSTATE_TERMINALS    | \
                                  LINEADDRESSSTATE_CAPSCHANGE)


//  lineGetStatusMessages
//
//  The following tests are made:
//
//  -------------------------------------------------------------------------
//  *  1)  Uninitialized (called before any lines are initialized)
//     2)  Invalid hLines
//     3)  Test invalid dwLineStates pointers
//     4)  Test invalid dwAddressStates pointers
//     5)  Solicit SPI errors (NOMEM, OPERATIONFAILED, RESOURCEUNAVAIL,
//         OPERATIONUNAVAIL) (not implemented here)
//     6)  Perform a couple of lineSetStatusMessages/lineGetStatusMessages
//         combinations (eventually, more combinations should be tested)
//
//  *  =   Stand-alone test

BOOL TestLineGetStatusMessages(BOOL fQuietMode, BOOL fStandAloneTest)
{
    LPTAPILINETESTINFO  lpTapiLineTestInfo;
    INT                 n;
    ESPDEVSPECIFICINFO info;
    BOOL                fTestPassed       = TRUE;
    CHAR                szTestFunc[]      = "lineGetStatusMessages";
    DWORD dwLineStates;

	 InitTestNumber();

    TapiLineTestInit();

    lpTapiLineTestInfo                      = GetLineTestInfo();
    lpTapiLineTestInfo->lpExtID             = (LPLINEEXTENSIONID)
                                              AllocFromTestHeap(
                                                  sizeof(LINEEXTENSIONID)
                                                  );
    lpTapiLineTestInfo->dwCallbackInstance  = (DWORD) GetCallbackParams();
    strcpy(lpTapiLineTestInfo->szTestFunc, szTestFunc);

    lpTapiLineTestInfo->dwCallbackInstance  =
            (DWORD) GetCallbackParams();

    TapiLogDetail(
            DBUG_SHOW_PASS,
            ">>>>>>>>  Begin testing lineGetStatusMessages  <<<<<<<<"
            );

            
    // Call lineGetStatusMessages before any lines are initialized
    // Note:  This test must be run in a stand-alone mode
    if (fStandAloneTest)
    {
        TapiLogDetail(
                DBUG_SHOW_PASS,
                ">> Test Case %ld: uninitialized state", dwTestCase + 1);
        if (! DoLineGetStatusMessages(
                lpTapiLineTestInfo,
                LINEERR_UNINITIALIZED))
        {
            TLINE_FAIL();
        }
    fTestPassed = ShowTestCase(fTestPassed);

    }

    lpTapiLineTestInfo->lpLineInitializeExParams =
         (LPLINEINITIALIZEEXPARAMS) AllocFromTestHeap (
         sizeof(LINEINITIALIZEEXPARAMS));
    lpTapiLineTestInfo->lpLineInitializeExParams->dwTotalSize =
         sizeof(LINEINITIALIZEEXPARAMS);
    lpTapiLineTestInfo->lpLineInitializeExParams->dwOptions =
         LINEINITIALIZEEXOPTION_USEHIDDENWINDOW;

 
    lpTapiLineTestInfo->lpdwAPIVersion = &lpTapiLineTestInfo->dwAPIVersion;
    lpTapiLineTestInfo->dwAPIVersion = TAPI_VERSION2_0;
    lpTapiLineTestInfo->dwAPILowVersion  = LOW_APIVERSION;
    lpTapiLineTestInfo->dwAPIHighVersion = HIGH_APIVERSION;
    lpTapiLineTestInfo->lpLineDevCaps = (LPLINEDEVCAPS) AllocFromTestHeap(
            sizeof(LINEDEVCAPS));
    lpTapiLineTestInfo->lpLineDevCaps->dwTotalSize = sizeof(LINEDEVCAPS);
    lpTapiLineTestInfo->dwMediaModes = LINEMEDIAMODE_DATAMODEM;
// BUGBUG
//            lpTapiLineTestInfo->lpLineDevCaps->dwMediaModes;
    lpTapiLineTestInfo->dwPrivileges = LINECALLPRIVILEGE_OWNER;
    lpTapiLineTestInfo->dwLineStates    = 0x00000000;
    lpTapiLineTestInfo->dwAddressStates = 0x00000000;


    // Test invalid line handles
    TapiLogDetail(
            DBUG_SHOW_PASS,
            ">> Test Case %ld: invalid hLines", dwTestCase + 1
            );

    if (! DoTapiLineFuncs(
            lpTapiLineTestInfo,
            LINITIALIZEEX | LNEGOTIATEAPIVERSION | LGETDEVCAPS | LOPEN
            ))
    {
        TLINE_FAIL();
    }
    
    // Store the valid line handle and try some invalid ones
    lpTapiLineTestInfo->hLine_Orig      = *lpTapiLineTestInfo->lphLine;
    for (n = 0; n < NUMINVALIDHANDLES; n++)
    {
        *lpTapiLineTestInfo->lphLine = (HLINE) gdwInvalidHandles[n];
        if (! DoLineGetStatusMessages(
                lpTapiLineTestInfo,
                LINEERR_INVALLINEHANDLE
                ))
        {
            TLINE_FAIL();
        }
    }
    fTestPassed = ShowTestCase(fTestPassed);

    // Restore valid line handle
    *lpTapiLineTestInfo->lphLine = lpTapiLineTestInfo->hLine_Orig;

    // Shutdown to isolate the test case
    if (! DoTapiLineFuncs(
            lpTapiLineTestInfo,
            LCLOSE | LSHUTDOWN
            ))
    {
        TLINE_FAIL();
    }

    
    // Test invalid lpdwLineStates pointers
    TapiLogDetail(
            DBUG_SHOW_PASS,
            ">> Test Case %ld: invalid lpdwLineStates pointers", dwTestCase + 1
            );

    lpTapiLineTestInfo->lpdwAPIVersion = &lpTapiLineTestInfo->dwAPIVersion;
    lpTapiLineTestInfo->dwAPIVersion = TAPI_VERSION2_0;
    lpTapiLineTestInfo->dwAPILowVersion  = LOW_APIVERSION;
    lpTapiLineTestInfo->dwAPIHighVersion = HIGH_APIVERSION;
    lpTapiLineTestInfo->lpLineDevCaps = (LPLINEDEVCAPS) AllocFromTestHeap(
            sizeof(LINEDEVCAPS));
    lpTapiLineTestInfo->lpLineDevCaps->dwTotalSize = sizeof(LINEDEVCAPS);
    lpTapiLineTestInfo->dwMediaModes = LINEMEDIAMODE_DATAMODEM;
// BUGBUG
//            lpTapiLineTestInfo->lpLineDevCaps->dwMediaModes;
    lpTapiLineTestInfo->dwPrivileges = LINECALLPRIVILEGE_OWNER;
    lpTapiLineTestInfo->dwLineStates    = 0x00000000;
    lpTapiLineTestInfo->dwAddressStates = 0x00000000;
    lpTapiLineTestInfo->lpdwAddressStates =
            &lpTapiLineTestInfo->dwAddressStates;

    // XYD add 2/27/96
    if (! DoTapiLineFuncs(
            lpTapiLineTestInfo,
            LINITIALIZEEX | LNEGOTIATEAPIVERSION | LGETDEVCAPS | LOPEN
            ))
    {
        TLINE_FAIL();
    }
    
 
    for (n = 0; n < NUMINVALIDPOINTERS; n++)
    {
        TapiLogDetail(
        DBUG_SHOW_DETAIL,
        "n= %ld", n);
         lpTapiLineTestInfo->lpdwLineStates = (LPDWORD) gdwInvalidPointers[n];
        if (! DoLineGetStatusMessages(
                lpTapiLineTestInfo,
                LINEERR_INVALPOINTER
                ))
        {
            TLINE_FAIL();
        }
    }

    fTestPassed = ShowTestCase(fTestPassed);

    // Restore lpdwLineStates pointer
    lpTapiLineTestInfo->lpdwLineStates = &lpTapiLineTestInfo->dwLineStates;

    // Shutdown to isolate the test case
    if (! DoTapiLineFuncs(
            lpTapiLineTestInfo,
            LCLOSE | LSHUTDOWN
            ))
    {
        TLINE_FAIL();
    }



    TapiLogDetail(
            DBUG_SHOW_PASS,
            ">> Test Case %ld: lpdwLineStates == lpdwAddressStates", dwTestCase + 1
            );

    lpTapiLineTestInfo->lpdwAPIVersion = &lpTapiLineTestInfo->dwAPIVersion;
    lpTapiLineTestInfo->dwAPIVersion = TAPI_VERSION2_0;
    lpTapiLineTestInfo->dwAPILowVersion  = LOW_APIVERSION;
    lpTapiLineTestInfo->dwAPIHighVersion = HIGH_APIVERSION;
    lpTapiLineTestInfo->dwMediaModes = LINEMEDIAMODE_DATAMODEM;
    lpTapiLineTestInfo->dwPrivileges = LINECALLPRIVILEGE_OWNER;
    lpTapiLineTestInfo->dwLineStates    = 0x00000000;
    lpTapiLineTestInfo->dwAddressStates = 0x00000000;
    lpTapiLineTestInfo->lpdwAddressStates =
            &lpTapiLineTestInfo->dwAddressStates;

    // XYD add 2/27/96
    if (! DoTapiLineFuncs(
            lpTapiLineTestInfo,
            LINITIALIZEEX | LNEGOTIATEAPIVERSION | LGETDEVCAPS | LOPEN
            ))
    {
        TLINE_FAIL();
    }
    
 
   lpTapiLineTestInfo->lpdwLineStates = (LPDWORD) lpTapiLineTestInfo->lpdwAddressStates;
   if (! DoLineGetStatusMessages(
                lpTapiLineTestInfo,
                LINEERR_INVALPOINTER
                ))
        {
            TLINE_FAIL();
        }

    fTestPassed = ShowTestCase(fTestPassed);

    // Restore lpdwLineStates pointer
    lpTapiLineTestInfo->lpdwLineStates = &lpTapiLineTestInfo->dwLineStates;

    // Shutdown to isolate the test case
    if (! DoTapiLineFuncs(
            lpTapiLineTestInfo,
            LCLOSE | LSHUTDOWN
            ))
    {
        TLINE_FAIL();
    }

     
    // Test invalid lpdwAddressStates pointers
    TapiLogDetail(
            DBUG_SHOW_PASS,
            ">> Test Case %ld: invalid lpdwAddressStates pointers", dwTestCase + 1
            );

    lpTapiLineTestInfo->lpdwAPIVersion = &lpTapiLineTestInfo->dwAPIVersion;
    lpTapiLineTestInfo->dwAPIVersion = TAPI_VERSION2_0;
    lpTapiLineTestInfo->dwAPILowVersion  = LOW_APIVERSION;
    lpTapiLineTestInfo->dwAPIHighVersion = HIGH_APIVERSION;
    lpTapiLineTestInfo->lpLineDevCaps = (LPLINEDEVCAPS) AllocFromTestHeap(
            sizeof(LINEDEVCAPS));
    lpTapiLineTestInfo->lpLineDevCaps->dwTotalSize = sizeof(LINEDEVCAPS);
    lpTapiLineTestInfo->dwMediaModes = LINEMEDIAMODE_DATAMODEM;
// BUGBUG
//            lpTapiLineTestInfo->lpLineDevCaps->dwMediaModes;
    lpTapiLineTestInfo->dwPrivileges = LINECALLPRIVILEGE_OWNER;
    lpTapiLineTestInfo->dwLineStates    = 0x00000000;
    lpTapiLineTestInfo->dwAddressStates = 0x00000000;
    lpTapiLineTestInfo->lpdwLineStates =
            &lpTapiLineTestInfo->dwLineStates;

    // XYD add 2/27/96
    if (! DoTapiLineFuncs(
            lpTapiLineTestInfo,
            LINITIALIZEEX | LNEGOTIATEAPIVERSION | LGETDEVCAPS | LOPEN
            ))
    {
        TLINE_FAIL();
    }
 
    for (n = 0; n < NUMINVALIDPOINTERS; n++)
    {
        TapiLogDetail(
        DBUG_SHOW_DETAIL,
        "n= %ld", n);
         lpTapiLineTestInfo->lpdwAddressStates =
                (LPDWORD) gdwInvalidPointers[n];
        if (! DoLineGetStatusMessages(
                lpTapiLineTestInfo,
                LINEERR_INVALPOINTER
                ))
        {
            TLINE_FAIL();
        }
    }
    fTestPassed = ShowTestCase(fTestPassed);

    // Restore lpdwAddressStates pointer 
    lpTapiLineTestInfo->lpdwAddressStates =
            &lpTapiLineTestInfo->dwAddressStates;

    // Shutdown to isolate the test case
    if (! DoTapiLineFuncs(
            lpTapiLineTestInfo,
            LCLOSE | LSHUTDOWN
            ))
    {
        TLINE_FAIL();
    }

    
    // Perform a sanity check by performing a couple of Get/SetStatusMessages
    // calls.

    TapiLogDetail(
            DBUG_SHOW_PASS,
            ">> Test Case %ld: valid Get/SetStatusMessages combinations and verify\r\n" \
            ">> the returned data", dwTestCase + 1
            );

    lpTapiLineTestInfo->lpdwAPIVersion = &lpTapiLineTestInfo->dwAPIVersion;
    lpTapiLineTestInfo->dwAPIVersion = TAPI_VERSION2_0;
    lpTapiLineTestInfo->dwAPILowVersion  = LOW_APIVERSION;
    lpTapiLineTestInfo->dwAPIHighVersion = HIGH_APIVERSION;
    lpTapiLineTestInfo->lpLineDevCaps = (LPLINEDEVCAPS) AllocFromTestHeap(
            sizeof(LINEDEVCAPS));
    lpTapiLineTestInfo->lpLineDevCaps->dwTotalSize = sizeof(LINEDEVCAPS);
    lpTapiLineTestInfo->dwMediaModes = LINEMEDIAMODE_DATAMODEM;
// BUGBUG
//            lpTapiLineTestInfo->lpLineDevCaps->dwMediaModes;
    lpTapiLineTestInfo->dwPrivileges = LINECALLPRIVILEGE_OWNER;

    lpTapiLineTestInfo->dwLineStates    = LINEDEVSTATE_DISCONNECTED |
                                          LINEDEVSTATE_CONNECTED;
    lpTapiLineTestInfo->dwAddressStates = LINEADDRESSSTATE_NUMCALLS;
 
    // XYD add 2/27/96
    if (! DoTapiLineFuncs(
            lpTapiLineTestInfo,
            LINITIALIZEEX | LNEGOTIATEAPIVERSION | LGETDEVCAPS | LOPEN
            ))
    {
        TLINE_FAIL();
    }

    // Store the values used
    lpTapiLineTestInfo->dwLineStates_Orig = lpTapiLineTestInfo->dwLineStates;
    lpTapiLineTestInfo->dwAddressStates_Orig = 
            lpTapiLineTestInfo->dwAddressStates;

    if (! DoLineSetStatusMessages(lpTapiLineTestInfo, TAPISUCCESS))
    {
        TLINE_FAIL();
    }

    // XYD, add REINIT to dwLineStates
    if(! (lpTapiLineTestInfo->dwLineStates_Orig & LINEDEVSTATE_REINIT))
		dwLineStates = lpTapiLineTestInfo->dwLineStates_Orig | LINEDEVSTATE_REINIT;

    // Verify the results by calling lineGetStatusMessages
    if (! DoLineGetStatusMessages(lpTapiLineTestInfo, TAPISUCCESS) ||
            *lpTapiLineTestInfo->lpdwAddressStates !=
                    lpTapiLineTestInfo->dwAddressStates_Orig       ||
            *lpTapiLineTestInfo->lpdwLineStates !=
    //                lpTapiLineTestInfo->dwLineStates_Orig
                      dwLineStates
            )
    {
        TLINE_FAIL();
    }


   TapiLogDetail (
		DBUG_SHOW_DETAIL,
		"Set: dwAddressState = %lx, dwLineStates = %lx",
		lpTapiLineTestInfo->dwAddressStates_Orig, 
		lpTapiLineTestInfo->dwLineStates_Orig);

   TapiLogDetail (
		DBUG_SHOW_DETAIL,
		"Get: dwAddressState = %lx, dwLineStates = %lx",
		*lpTapiLineTestInfo->lpdwAddressStates, 
		*lpTapiLineTestInfo->lpdwLineStates);

    fTestPassed = ShowTestCase(fTestPassed);

    TapiLogDetail(
            DBUG_SHOW_PASS,
            ">> Test Case %ld: Success, valid Get/SetStatusMessages combinations and verify\r\n" \
            ">> the returned data", dwTestCase + 1
            );

    lpTapiLineTestInfo->dwLineStates    = ALL_LINEDEVSTATES;
    lpTapiLineTestInfo->dwAddressStates = ALL_ADDRESSSTATES;
    // Store the values used
    lpTapiLineTestInfo->dwLineStates_Orig = lpTapiLineTestInfo->dwLineStates;
    lpTapiLineTestInfo->dwAddressStates_Orig = 
            lpTapiLineTestInfo->dwAddressStates;

    if (! DoLineSetStatusMessages(lpTapiLineTestInfo, TAPISUCCESS))
    {
        TLINE_FAIL();
    }
    // Verify the results by calling lineGetStatusMessages
    if (! DoLineGetStatusMessages(lpTapiLineTestInfo, TAPISUCCESS) ||
            *lpTapiLineTestInfo->lpdwAddressStates !=
                    lpTapiLineTestInfo->dwAddressStates_Orig       ||
            *lpTapiLineTestInfo->lpdwLineStates !=
                    lpTapiLineTestInfo->dwLineStates_Orig
            )
    {
        TLINE_FAIL();
    }
    fTestPassed = ShowTestCase(fTestPassed);

    // Shutdown to isolate the test case
    if (! DoTapiLineFuncs(
            lpTapiLineTestInfo,
            LCLOSE | LSHUTDOWN
            ))
    {
        TLINE_FAIL();
    }
    	
    FreeTestHeap();


	 TapiLogDetail(
      DBUG_SHOW_PASS,
      "@@ lineGetStatusMessages: Total Test Case = %ld, Passed = %ld, Failed = %ld",
      dwTestCase, dwTestCasePassed, dwTestCaseFailed);
	 TapiLogDetail(
      DBUG_SHOW_PASS,
      "@@ Total Test Case = %ld, Passed = %ld, Failed = %ld",
      dwglTestCase, dwglTestCasePassed, dwglTestCaseFailed);
     if(dwTestCaseFailed > 0)
      fTestPassed = FALSE;

     TapiLogDetail(
            DBUG_SHOW_PASS,
            ">>>>>>>>  End testing lineGetStatusMessages  <<<<<<<<"
            );
            
    return fTestPassed;
}