/*++

   Copyright    (c)    1999    Microsoft Corporation

   Module  Name :
      tsvmap.cxx

   Abstract:
      This is a test module for the server variable map
      
   Author:

       Taylor Weiss    ( TaylorW )     19-Apr-1999

   Environment:
    
       User Mode - Win32 

   Project:

       Internet Information Services

   Functions Exported:


   Revision History:

--*/

#include <windows.h>

#include <dbgutil.h>

#include <svmap.h>
#include <stdio.h>
#include <stdlib.h>

DECLARE_DEBUG_PRINTS_OBJECT();
#ifndef _NO_TRACING_
#include <initguid.h>
DEFINE_GUID(IisTSvMapGuid, 
0x784d8939, 0xaa8c, 0x11d2, 0x92, 0x5e, 0x00, 0xc0, 0x4f, 0x72, 0xd9, 0x0e);
#else
DECLARE_DEBUG_VARIABLE();    
#endif

#define DEFINE_SV( token ) #token,

LPCSTR rgValidNames[] =
{
    ALL_SERVER_VARIABLES()
};

#undef DEFINE_SV

int cValidNames = sizeof(rgValidNames)/sizeof(rgValidNames[0]);

LPCSTR rgInvalidNames[] =
{
    "HTTP_BOGUS",
    "_HTTP_",
    "47",
    "",
    "Hello, There!",
    "0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz"
};

int cInvalidNames = sizeof(rgInvalidNames)/sizeof(rgInvalidNames[0]);

int __cdecl
main(int argc, char * argv[])
{
    int argSeen = 1;

#ifndef _NO_TRACING_
    CREATE_DEBUG_PRINT_OBJECT( argv[0], IisTSvMapGuid);
    CREATE_INITIALIZE_DEBUG();
#else
    CREATE_DEBUG_PRINT_OBJECT( argv[0]);
    SET_DEBUG_FLAGS( DEBUG_ERROR | DEBUG_INIT_CLEAN);
#endif
    
    SV_CACHE_MAP    map;

    DBG_REQUIRE( map.Initialize() );

    // Dump the table
    
    // This should be more than enough space, see
    // SV_CACHE_MAP::Print if this asserts.

    CHAR  pchBuffer[ 5000 ];
    DWORD cb = sizeof( pchBuffer );

    map.PrintToBuffer( pchBuffer, &cb );
    DBG_ASSERT( cb < sizeof(pchBuffer) );

    printf( pchBuffer );

    DWORD dwId = 0;

    // Do lookups for all valid names

    for( int i = 0; i < cValidNames; ++i )
    {
        DBG_REQUIRE( map.FindOrdinal( rgValidNames[i], 
                                      strlen( rgValidNames[i] ), 
                                      &dwId 
                                      ) );
        
        DBG_REQUIRE( strcmp( rgValidNames[i], map.FindName( dwId ) ) == 0 );
    }

    // Do lookups for invalid names

    for( int j = 0; j < cInvalidNames; ++j )
    {
        DBG_REQUIRE( map.FindOrdinal( rgInvalidNames[j],
                                      strlen( rgInvalidNames[j] ),
                                      &dwId 
                                      ) == FALSE );
    }
   
    DELETE_DEBUG_PRINT_OBJECT();

    return 1;
} // main()