/*++

Copyright (c) 1995  Microsoft Corporation

Module Name:

    itli.c

Abstract:

    This module contains the test functions for lineInitialize

Author:

    Oliver Wallace (OliverW)    1-Aug-1995

Revision History:

--*/


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


#define ESPDEVSPECIFIC_KEY  ((DWORD) 'DPSE')

#define ESP_DEVSPEC_MSG     1

//  lineInitialize
//
//  The following tests are made:
//
//                               Tested                 Notes
//  -------------------------------------------------------------------------
//    1)  Invalid lphLineApp pointers
//    2)  Invalid lpdwNumDevs pointers
//    3)  Invalid lpfnCallback pointers
//    3)  Invalid hInstance handles
//    4)  Null lpszAppName
//    5)  Invalid lpszAppName strings
//    6)  Verify hLineApp can be used
//    7)  Verify 0..dwNumDevs can be used
//    8)  Verify valid params: lphLineApp, hInstance, lpfnCallback, lpwszAppName, lpdwNumDevs
//

BOOL
TestLineInitialize(BOOL fQuietMode, BOOL fStandAlone)
{
    LPTAPILINETESTINFO  lpTapiLineTestInfo;
    INT                 n;
/*
#ifdef WUNICODE
    WCHAR                wszValidAppName[] = L"ValidApp";
    LPWSTR               lpwszAppName = wszValidAppName;
#else
*/
    CHAR                szValidAppName[] = "ValidApp";
    LPSTR               lpszAppName = szValidAppName;
//#endif
    ESPDEVSPECIFICINFO info;
    BOOL                fTestPassed   = TRUE;
    LPCALLBACKPARAMS lpCallbackParams;
    TAPIRESULT lastTapiResult;

	 InitTestNumber();

    TapiLineTestInit();
    lpTapiLineTestInfo = GetLineTestInfo();
    lpCallbackParams   = GetCallbackParams();

    TapiLogDetail(
            DBUG_SHOW_PASS,
            ">>>>>>>>  Begin testing lineInitialize  <<<<<<<<"
            );
            
    // test a valid case
/*
#ifdef WUNICODE
    TapiLogDetail(
            DBUG_SHOW_PASS,
            ">> Test Case %ld: valid params and state -- lpwszAppName not null", dwTestCase + 1);
#else
*/
    TapiLogDetail(
            DBUG_SHOW_PASS,
            ">> Test Case %ld: valid params and state -- lpszAppName not null", dwTestCase + 1);
//#endif
    if (! DoLineInitialize(lpTapiLineTestInfo, TAPISUCCESS))
    {
        TLINE_FAIL();
    }

    fTestPassed = ShowTestCase(fTestPassed);

    // Shut it down
    if (! DoLineShutdown(lpTapiLineTestInfo, TAPISUCCESS))
    {
        TLINE_FAIL();
    }

    // Check invalid lphLineApp pointers
    TapiLogDetail(
            DBUG_SHOW_PASS,
            ">> Test Case %ld: invalid lphLineApp pointers", dwTestCase + 1);
    for (n = 0; n < NUMINVALIDPOINTERS; n++)
    {
        TapiLogDetail(
        DBUG_SHOW_DETAIL,
        "n= %ld", n);
         lpTapiLineTestInfo->lphLineApp =
            (LPHLINEAPP) gdwInvalidPointers[n];
        if (! DoLineInitialize(
                           lpTapiLineTestInfo,
                           LINEERR_INVALPOINTER))
        {
            TLINE_FAIL();
        }
    }
    fTestPassed = ShowTestCase(fTestPassed);

    // Restore lphLineApp pointer
    lpTapiLineTestInfo->lphLineApp = &(lpTapiLineTestInfo->hLineApp1);


    TapiLogDetail(
            DBUG_SHOW_PASS,
            ">> Test Case %ld: lphLineApp == lpdwNumDevs", dwTestCase + 1);
    lpTapiLineTestInfo->lphLineApp = (LPHLINEAPP)lpTapiLineTestInfo->lpdwNumDevs;
    if (! DoLineInitialize(
                           lpTapiLineTestInfo,
                           LINEERR_INVALPOINTER))
        {
        TLINE_FAIL();
        GetLastTapiResult(&lastTapiResult);

        if(lastTapiResult.lActual == TAPISUCCESS)
        {
        if (! DoLineShutdown(lpTapiLineTestInfo, TAPISUCCESS))
          { 
            TLINE_FAIL();
          }
        }
        }
 
    fTestPassed = ShowTestCase(fTestPassed);

    // Restore lphLineApp pointer
    TapiLineTestInit();
    lpTapiLineTestInfo = GetLineTestInfo();
    lpCallbackParams   = GetCallbackParams();

 
    // Check invalid lpfnCallback pointers
    TapiLogDetail(
            DBUG_SHOW_PASS,
            ">> Test Case %ld: invalid lpfnCallback pointers", dwTestCase + 1);
    lpTapiLineTestInfo->lpfnCallback_Orig = lpTapiLineTestInfo->lpfnCallback;
    for (n = 0; n < NUMINVALIDPOINTERS; n++)
    {
        TapiLogDetail(
        DBUG_SHOW_DETAIL,
        "n= %ld", n);
         lpTapiLineTestInfo->lpfnCallback =
            (LINECALLBACK) gdwInvalidPointers[n];
        if (! DoLineInitialize(
                           lpTapiLineTestInfo,
                           LINEERR_INVALPOINTER))
        {
            TLINE_FAIL();
        }
    }
    fTestPassed = ShowTestCase(fTestPassed);

    // Restore lpfnCallback pointer
    lpTapiLineTestInfo->lpfnCallback = lpTapiLineTestInfo->lpfnCallback_Orig;

    // Test an invalid lpdwNumDevs pointers
    TapiLogDetail(
            DBUG_SHOW_PASS,
            ">> Test Case %ld: invalid lpdwNumDevs pointers", dwTestCase + 1);
    for (n = 0; n < NUMINVALIDPOINTERS; n++)
    {
        TapiLogDetail(
        DBUG_SHOW_DETAIL,
        "n= %ld", n);
         lpTapiLineTestInfo->lpdwNumDevs =
            (LPDWORD) gdwInvalidPointers[n];
        if (! DoLineInitialize(
                           lpTapiLineTestInfo,
                           LINEERR_INVALPOINTER))
        {
            TLINE_FAIL();
        }
    }
    fTestPassed = ShowTestCase(fTestPassed);

    // Restore lpdwNumDevs pointer
    lpTapiLineTestInfo->lpdwNumDevs = &(lpTapiLineTestInfo->dwNumDevs);

    // test invalid instance handles
    TapiLogDetail(
            DBUG_SHOW_PASS,
            ">> Test Case %ld: invalid hInstance values", dwTestCase + 1);
    lpTapiLineTestInfo->hInstance_Orig = lpTapiLineTestInfo->hInstance;
    for (n = 0; n < NUMINVALIDHANDLES; n++)
    {
        lpTapiLineTestInfo->hInstance = (HINSTANCE) gdwInvalidHandles[n];
        if(n == 0)  // XYD, it is allowed hInstance = NULL
        {       
        if (! DoLineInitialize(lpTapiLineTestInfo, TAPISUCCESS))
        {
            TLINE_FAIL();
        }
        if (! DoLineShutdown(lpTapiLineTestInfo, TAPISUCCESS))
        { 
            TLINE_FAIL();
        }
        }
        else
        {
         if (! DoLineInitialize(lpTapiLineTestInfo, LINEERR_INVALPARAM))
        {
            TLINE_FAIL();
        }
        }
    }
    fTestPassed = ShowTestCase(fTestPassed);

    // Restore original hInstance
    lpTapiLineTestInfo->hInstance = lpTapiLineTestInfo->hInstance_Orig;

// TODO:  Pass it bogus strings (e.g. a BINARY)
//  // test an invalid app name
//  lpTapiLineTestInfo->lpszAppName = INVLD_APPNAME;
//  if (! DoLineInitialize(lpTapiLineTestInfo, LINEERR_INVALAPPNAME))
//  {
//      TLINE_FAIL();
//  }
//  lpTapiLineTestInfo->lpszAppName = lpszAppName;

    // test a null app name (should work)
/*
#ifdef WUNICODE
    TapiLogDetail(
            DBUG_SHOW_PASS,
            ">> Test Case %ld: valid params and state -- lpwszAppName null", dwTestCase + 1);
    lpTapiLineTestInfo->lpwszAppName = NULL;
#else
*/
    TapiLogDetail(
            DBUG_SHOW_PASS,
            ">> Test Case %ld: valid params and state -- lpszAppName null", dwTestCase + 1);
    lpTapiLineTestInfo->lpszAppName = NULL;
//#endif
    lpTapiLineTestInfo->lphLineApp = &(lpTapiLineTestInfo->hLineApp1);
    if (! DoLineInitialize(lpTapiLineTestInfo, TAPISUCCESS))
    {
        TLINE_FAIL();
    }
    fTestPassed = ShowTestCase(fTestPassed);

    // Restore lpszAppName pointer
/*
#ifdef WUNICODE
    lpTapiLineTestInfo->lpwszAppName = lpwszAppName;
#else
*/
    lpTapiLineTestInfo->lpszAppName = lpszAppName;
//#endif

    // Verify that the initialized line app instance can be used
    TapiLogDetail(
            DBUG_SHOW_PASS,
            ">> Test Case %ld: Verifying hLineApp can be used", dwTestCase + 1);
    lpTapiLineTestInfo->dwAPILowVersion  = LOW_APIVERSION;
    lpTapiLineTestInfo->dwAPIHighVersion = HIGH_APIVERSION;
    if (! DoLineNegotiateAPIVersion(lpTapiLineTestInfo, TAPISUCCESS))
    {
        TLINE_FAIL();
    }
    fTestPassed = ShowTestCase(fTestPassed);


    // Initialize another line and verify that 0..dwNumDevs can be used
    TapiLogDetail(
            DBUG_SHOW_PASS,
            ">> Test Case %ld: Verifying 0..dwNumDevs can be used", dwTestCase + 1);
    lpTapiLineTestInfo->lphLineApp = &(lpTapiLineTestInfo->hLineApp2);
    if (! DoLineInitialize(lpTapiLineTestInfo, TAPISUCCESS))
    {
        TLINE_FAIL();
    }

    fTestPassed = ShowTestCase(fTestPassed);

    lpTapiLineTestInfo->dwDeviceID_Orig  = lpTapiLineTestInfo->dwDeviceID;
    lpTapiLineTestInfo->dwAPILowVersion  = LOW_APIVERSION;
    lpTapiLineTestInfo->dwAPIHighVersion = HIGH_APIVERSION;
    for (n = *lpTapiLineTestInfo->lpdwNumDevs - 1; n >= 0; n--)
    {
        lpTapiLineTestInfo->dwDeviceID = n;
        if (! DoLineNegotiateAPIVersion(lpTapiLineTestInfo, TAPISUCCESS))
        {
            TLINE_FAIL();
        }
    }
    lpTapiLineTestInfo->dwDeviceID = lpTapiLineTestInfo->dwDeviceID_Orig;

    // Shutdown the hLineApp
    if (! DoLineShutdown(lpTapiLineTestInfo, TAPISUCCESS))
    {
        TLINE_FAIL();
    }

    // Shutdown down the other initialized hLineApp
    lpTapiLineTestInfo->lphLineApp = &lpTapiLineTestInfo->hLineApp1;
    if (! DoLineShutdown(lpTapiLineTestInfo, TAPISUCCESS))
    {
        TLINE_FAIL();
    }

    // Test invalid app name pointers
/*
#ifdef WUNICODE
    TapiLogDetail(
            DBUG_SHOW_PASS,
            ">> Test Case %ld: invalid lpwszAppName pointers", dwTestCase + 1);
#else
*/
    TapiLogDetail(
            DBUG_SHOW_PASS,
            ">> Test Case %ld: invalid lpszAppName pointers", dwTestCase + 1);
//#endif
    for (n = 0; n < NUMINVALIDPOINTERS; n++)
    {
         TapiLogDetail(
         DBUG_SHOW_DETAIL,
         "n= %ld", n);
/*
#ifdef WUNICODE
         lpTapiLineTestInfo->lpwszAppName =
            (LPWSTR) gdwInvalidPointers[n];
#else
*/
         lpTapiLineTestInfo->lpszAppName =
            (LPSTR) gdwInvalidPointers[n];
//#endif

        // Okay.  It's expensive to check every time for the NULL value
        // in the array of pointer values to test, but efficiency isn't the
        // point of these tests.  Doing it this way allows the NULL pointer
        // value to be in the array without having to worry about where it
        // is in the array of bad pointers.
/*
#ifdef WUNICODE
        if (lpTapiLineTestInfo->lpwszAppName && ! DoLineInitialize(
                           lpTapiLineTestInfo,
                           LINEERR_INVALPOINTER))
        {
            TLINE_FAIL();
        }
#else
*/
        if (lpTapiLineTestInfo->lpszAppName && ! DoLineInitialize(
                           lpTapiLineTestInfo,
                           LINEERR_INVALPOINTER))
        {
            TLINE_FAIL();
        }
//#endif
    }
    fTestPassed = ShowTestCase(fTestPassed);

    // Restore lpszAppName pointer
/*
#ifdef WUNICODE
    lpTapiLineTestInfo->lpwszAppName = lpwszAppName;
#else
*/
    lpTapiLineTestInfo->lpszAppName = lpszAppName;
//#endif

    TapiLogDetail(
            DBUG_SHOW_PASS,
            ">> Test Case %ld: Force REINIT & verify lineInit Fail", dwTestCase + 1);

    lpTapiLineTestInfo->lphLineApp = &lpTapiLineTestInfo->hLineApp1;
    if(! DoLineInitialize(lpTapiLineTestInfo, TAPISUCCESS))
      {
         TLINE_FAIL();
      }

    lpTapiLineTestInfo->dwAPILowVersion  = LOW_APIVERSION;
    lpTapiLineTestInfo->dwAPIHighVersion = HIGH_APIVERSION;
    if (! DoLineNegotiateAPIVersion(lpTapiLineTestInfo, TAPISUCCESS))
    {
        TLINE_FAIL();
    }

    lpTapiLineTestInfo->dwPrivileges = LINECALLPRIVILEGE_OWNER;
    lpTapiLineTestInfo->dwMediaModes = LINEMEDIAMODE_DATAMODEM;
    if (! DoLineOpen(lpTapiLineTestInfo, TAPISUCCESS))
    {
        TLINE_FAIL();
    }

    if(IsESPLineDevice(lpTapiLineTestInfo))
    {
    info.dwKey  = ESPDEVSPECIFIC_KEY;
    info.dwType = ESP_DEVSPEC_MSG;

    info.u.EspMsg.dwMsg    = LINE_LINEDEVSTATE;
    info.u.EspMsg.dwParam1 = LINEDEVSTATE_REINIT;
    info.u.EspMsg.dwParam2 = 0;
    info.u.EspMsg.dwParam3 = 0;
	 lpTapiLineTestInfo->dwAddressID = 0;
    lpTapiLineTestInfo->lpParams = (LPVOID)&info;
    lpTapiLineTestInfo->dwSize = sizeof(info);
    lpTapiLineTestInfo->hCall1 = 0;
    lpTapiLineTestInfo->lphCall = &lpTapiLineTestInfo->hCall1;


    lpTapiLineTestInfo->dwLineStates = LINEDEVSTATE_REINIT;
    lpTapiLineTestInfo->dwAddressStates = LINEADDRESSSTATE_DEVSPECIFIC;

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

    AddMessage(
            LINE_LINEDEVSTATE,
            (DWORD) lpTapiLineTestInfo->hLine1,
            (DWORD) lpCallbackParams,
            LINEDEVSTATE_REINIT,
            0x00000000,
            0x00000000,
            TAPIMSG_DWMSG | TAPIMSG_DWPARAM1
            );

    if(! DoLineDevSpecific (lpTapiLineTestInfo, TAPISUCCESS, TRUE))
    {
        TLINE_FAIL();
    }

    if(lpCallbackParams->lpExpTapiMsgs != NULL)
    {
        TLINE_FAIL();
        TapiLogDetail(DBUG_SHOW_FAILURE,
                      "TestLineInitailize: Did not receive REINIT message.");
    }

    lpTapiLineTestInfo->lphLineApp = &lpTapiLineTestInfo->hLineApp2;

    if(! DoLineInitialize(lpTapiLineTestInfo, LINEERR_REINIT))
      {
         TLINE_FAIL();
          GetLastTapiResult(&lastTapiResult);

          if(lastTapiResult.lActual == TAPISUCCESS)
           {
            if (! DoLineShutdown(lpTapiLineTestInfo, TAPISUCCESS))
            {
                TLINE_FAIL();
            }
           }
       }

    lpTapiLineTestInfo->lphLineApp = &lpTapiLineTestInfo->hLineApp1;
	 }
    fTestPassed = ShowTestCase(fTestPassed);

    // Shutdown to isolate the test case
    if (! DoLineClose(lpTapiLineTestInfo, TAPISUCCESS))
    {
        TLINE_FAIL();
    }

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

/***********************(javedr - start)**********************************/
// Most of these cases are covered above by isolating each parameter.
// This case just tests the lineInitialize parameteres in one shot.
// Check valid lphLineApp pointers
// Test valid hInstance handles
// Check valid lpfnCallback pointers - N/A (see below)
// Test valid app name - lpszAppName
// Test valid lpdwNumDevs

/*
#ifdef WUNICODE
    TapiLogDetail(
            DBUG_SHOW_PASS,
            ">> Test Case %ld: valid params test: lphLineApp, hInstance, lpfnCallback, lpwszAppName, lpdwNumDevs", dwTestCase + 1);
#else
*/
    TapiLogDetail(
            DBUG_SHOW_PASS,
            ">> Test Case %ld: valid params test: lphLineApp, hInstance, lpfnCallback, lpszAppName, lpdwNumDevs", dwTestCase + 1);
//#endif
	// Initailize args to isolate test case
    TapiLineTestInit();
    lpTapiLineTestInfo = GetLineTestInfo();
    lpCallbackParams   = GetCallbackParams();

	// Set all args to valid values
    lpTapiLineTestInfo->lphLineApp = &(lpTapiLineTestInfo->hLineApp1);
	lpTapiLineTestInfo->hInstance = NULL; //default value is NULL
	// No need to do this since TapiLineTestInit() in tcore.c is already doing this.
	// lpTapiLineTestInfo->lpfnCallback = TapiCallback;
/*
#ifdef WUNICODE
    lpTapiLineTestInfo->lpwszAppName = lpwszAppName;
#else
*/
    lpTapiLineTestInfo->lpszAppName = lpszAppName;
//#endif
	lpTapiLineTestInfo->lpdwNumDevs = &(lpTapiLineTestInfo->dwNumDevs);
    if (! DoLineInitialize(lpTapiLineTestInfo, TAPISUCCESS))
    {
        TLINE_FAIL();
    }

    fTestPassed = ShowTestCase(fTestPassed);

    // // Shutdown to isolate the test case
    if (!DoLineShutdown(lpTapiLineTestInfo, TAPISUCCESS))
    {
        TLINE_FAIL();
    }
/*************************(javedr - end)********************************/

	 TapiLogDetail(
      DBUG_SHOW_PASS,
      "@@ lineInitialize: 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 lineInitialize  <<<<<<<<"
            );
            
    return fTestPassed;
}