|
|
/*++
Copyright (c) 1999, Microsoft Corporation
Module Name:
sample\test.c
Abstract:
The file contains test utilities.
--*/
#include "pchsample.h"
#pragma hdrstop
#ifdef TEST
#define TEST_NUM_IE 230
#define TEST_NUM_INTERFACE 2
#define TEST_SLEEP_TIME 3*PERIODIC_INTERVAL
#define TEST_NUM_START_STOP 2
VOID ErrorCodes() { TRACE1(DEBUG, "ERROR_CAN_NOT_COMPLETE: %u", ERROR_CAN_NOT_COMPLETE); TRACE1(DEBUG, "ERROR_INSUFFICIENT_BUFFER: %u", ERROR_INSUFFICIENT_BUFFER); TRACE1(DEBUG, "ERROR_NO_MORE_ITEMS: %u", ERROR_NO_MORE_ITEMS); TRACE1(DEBUG, "ERROR_INVALID_PARAMETER: %u", ERROR_INVALID_PARAMETER); }
VOID HT_Test() { ULONG i, ulNumDeleted = 0, ulNumGotten = 0; DWORD dwErr; PNETWORK_ENTRY pneNetworkEntry; PINTERFACE_ENTRY pieInterfaceEntry; INTERFACE_ENTRY ieKey; PLIST_ENTRY plePtr; WCHAR pwszIfName[20]; do // breakout loop
{ dwErr = NE_Create(&pneNetworkEntry); if (dwErr != NO_ERROR) { TRACE0(DEBUG, "HT_Test: Could not create NetworkEntry"); break; } for (i = 0; i < TEST_NUM_IE; i++) { swprintf(pwszIfName, L"if%u", i); dwErr = IE_Create(pwszIfName, i, IEFLAG_MULTIACCESS, &pieInterfaceEntry); if (dwErr != NO_ERROR) { TRACE1(DEBUG, "HT_Test: Could not Create %u", i); break; }
dwErr = HT_InsertEntry(pneNetworkEntry->phtInterfaceTable, &(pieInterfaceEntry->leInterfaceTableLink)); if (dwErr != NO_ERROR) { TRACE1(DEBUG, "HT_Test: Could not Insert %u", i); break; } }
TRACE1(DEBUG, "Hash Table Size %u", HT_Size(pneNetworkEntry->phtInterfaceTable)); for (i = 0; i < TEST_NUM_IE; i += 2) { ieKey.dwIfIndex = i; dwErr = HT_DeleteEntry(pneNetworkEntry->phtInterfaceTable, &(ieKey.leInterfaceTableLink), &plePtr); if (dwErr != NO_ERROR) { TRACE1(DEBUG, "HT_Test: Could not Delete %u", i); break; }
// indicate deletion
InitializeListHead(plePtr); IE_Destroy(CONTAINING_RECORD(plePtr, INTERFACE_ENTRY, leInterfaceTableLink)); ulNumDeleted++; }
TRACE2(DEBUG, "NumDeleted %u Hash Table Size %u", ulNumDeleted, HT_Size(pneNetworkEntry->phtInterfaceTable));
for (i = 0; i < TEST_NUM_IE; i++) { ieKey.dwIfIndex = i; if (HT_IsPresentEntry(pneNetworkEntry->phtInterfaceTable, &(ieKey.leInterfaceTableLink))) { dwErr = HT_GetEntry(pneNetworkEntry->phtInterfaceTable, &(ieKey.leInterfaceTableLink), &plePtr);
if (dwErr != NO_ERROR) { TRACE1(DEBUG, "HT_Test: Could not Get %u", i); break; }
ulNumGotten++; } }
TRACE1(DEBUG, "NumGotten %u", ulNumGotten); } while (FALSE); NE_Destroy(pneNetworkEntry); }
VOID MM_Test(HANDLE hEvent) { ROUTING_PROTOCOL_EVENTS rpeEvent; MESSAGE mMessage; ULONG ulSize; BYTE byBuffer[100]; PIPSAMPLE_GLOBAL_CONFIG pigc; PIPSAMPLE_IP_ADDRESS piia; PIPSAMPLE_IF_BINDING piib; PIPSAMPLE_IF_CONFIG piic; IPSAMPLE_MIB_GET_INPUT_DATA imgid; PIPSAMPLE_MIB_SET_INPUT_DATA pimsid = (PIPSAMPLE_MIB_SET_INPUT_DATA) byBuffer; PIPSAMPLE_MIB_GET_OUTPUT_DATA pimgod = (PIPSAMPLE_MIB_GET_OUTPUT_DATA) byBuffer; // mib set global configuration
pimsid->IMSID_TypeID = IPSAMPLE_GLOBAL_CONFIG_ID; pimsid->IMSID_BufferSize = sizeof(IPSAMPLE_GLOBAL_CONFIG); pigc = (PIPSAMPLE_GLOBAL_CONFIG) pimsid->IMSID_Buffer; pigc->dwLoggingLevel = IPSAMPLE_LOGGING_ERROR; MM_MibSet(pimsid); TRACE2(MIB, "MIB SET: %u %u", pimsid->IMSID_TypeID, pigc->dwLoggingLevel);
WaitForSingleObject(hEvent, INFINITE); CM_GetEventMessage(&rpeEvent, &mMessage); TRACE1(DEBUG, "SetMib %u", rpeEvent);
// mib get global configuration
ulSize = 0; imgid.IMGID_TypeID = IPSAMPLE_GLOBAL_CONFIG_ID; pigc = (PIPSAMPLE_GLOBAL_CONFIG) pimgod->IMGOD_Buffer;
MM_MibGet(&imgid, pimgod, &ulSize, GET_EXACT); TRACE3(MIB, "MIB GET: %u %u %u", ulSize, pimgod->IMGOD_TypeID, pigc->dwLoggingLevel); MM_MibGet(&imgid, pimgod, &ulSize, GET_EXACT); TRACE3(MIB, "MIB GET: %u %u %u", ulSize, pimgod->IMGOD_TypeID, pigc->dwLoggingLevel);
// mib get first interface binding
ulSize = 0; imgid.IMGID_TypeID = IPSAMPLE_IF_BINDING_ID; imgid.IMGID_IfIndex = 0; piib = (PIPSAMPLE_IF_BINDING) pimgod->IMGOD_Buffer; piia = IPSAMPLE_IF_ADDRESS_TABLE(piib); MM_MibGet(&imgid, pimgod, &ulSize, GET_FIRST); TRACE4(MIB, "MIB GET: %u %u %u %u", ulSize, pimgod->IMGOD_TypeID, piib->dwState, piib->ulCount);
MM_MibGet(&imgid, pimgod, &ulSize, GET_FIRST); TRACE5(MIB, "MIB GET: %u %u %u %u %u", ulSize, pimgod->IMGOD_TypeID, piib->dwState, piib->ulCount, piia->dwAddress);
// mib get next interface binding
ulSize = 0; MM_MibGet(&imgid, pimgod, &ulSize, GET_NEXT); TRACE4(MIB, "MIB GET: %u %u %u %u", ulSize, pimgod->IMGOD_TypeID, piib->dwState, piib->ulCount);
MM_MibGet(&imgid, pimgod, &ulSize, GET_NEXT); TRACE5(MIB, "MIB GET: %u %u %u %u %u", ulSize, pimgod->IMGOD_TypeID, piib->dwState, piib->ulCount, piia->dwAddress);
// mib set interface configuration
pimsid->IMSID_TypeID = IPSAMPLE_IF_CONFIG_ID; pimsid->IMSID_IfIndex = 0; pimsid->IMSID_BufferSize = sizeof(IPSAMPLE_IF_CONFIG); piic = (PIPSAMPLE_IF_CONFIG) pimsid->IMSID_Buffer; piic->ulMetric = 0; MM_MibSet(pimsid); TRACE1(MIB, "MIB SET: %u", pimsid->IMSID_TypeID);
WaitForSingleObject(hEvent, INFINITE); CM_GetEventMessage(&rpeEvent, &mMessage); TRACE1(DEBUG, "SetMib %u", rpeEvent);
// mib get interface configuration
ulSize = 0; imgid.IMGID_TypeID = IPSAMPLE_IF_CONFIG_ID; imgid.IMGID_IfIndex = 0; piic = (PIPSAMPLE_IF_CONFIG) pimgod->IMGOD_Buffer; MM_MibGet(&imgid, pimgod, &ulSize, GET_EXACT); TRACE3(MIB, "MIB GET: %u %u %u", ulSize, pimgod->IMGOD_TypeID, piic->ulMetric);
MM_MibGet(&imgid, pimgod, &ulSize, GET_EXACT); TRACE3(MIB, "MIB GET: %u %u %u", ulSize, pimgod->IMGOD_TypeID, piic->ulMetric); }
VOID NM_Test(HANDLE hEvent) { DWORD dwErr = NO_ERROR; ULONG i; WCHAR pwszIfName[20]; ROUTING_PROTOCOL_EVENTS rpeEvent; MESSAGE mMessage; IPSAMPLE_IF_CONFIG iic = { 1 }; PIP_ADAPTER_BINDING_INFO pBinding;
MALLOC(&pBinding, (sizeof(IP_ADAPTER_BINDING_INFO) + 3 * sizeof(IP_LOCAL_BINDING)), &dwErr); pBinding->AddressCount = 3; pBinding->Address[0].Address = 0xfffffffd; pBinding->Address[0].Mask = 0xffffffff; pBinding->Address[1].Address = INADDR_ANY; pBinding->Address[1].Mask = 0xffffffff; pBinding->Address[2].Address = 0xfffffffe; pBinding->Address[2].Mask = 0xffffffff;
// add interfaces
for (i = 0; i < TEST_NUM_INTERFACE; i++) { swprintf(pwszIfName, L"if%u", i); dwErr = NM_AddInterface(pwszIfName, i, PERMANENT, &iic); if (dwErr != NO_ERROR) { TRACE1(DEBUG, "NM_Test: Could not Add Interface %u", i); break; } } TRACE1(DEBUG, "...AddInterface %u", dwErr); CE_Display(&g_ce);
// bind interfaces
for (i = 0; i < TEST_NUM_INTERFACE; i++) { pBinding->Address[0].Address = i; dwErr = NM_InterfaceStatus(i, FALSE, RIS_INTERFACE_ADDRESS_CHANGE, (PVOID) pBinding); if (dwErr != NO_ERROR) { TRACE1(DEBUG, "NM_Test: Could not Bind Interface %u", i); break; } } TRACE1(DEBUG, "...BindInterface %u", dwErr); CE_Display(&g_ce);
// activate interfaces
for (i = 0; i < TEST_NUM_INTERFACE; i++) { dwErr = NM_InterfaceStatus(i, TRUE, RIS_INTERFACE_ENABLED, NULL); if (dwErr != NO_ERROR) { TRACE1(DEBUG, "NM_Test: Could not Activate Interface %u", i); break; } } TRACE1(DEBUG, "...ActivateInterface %u", dwErr); CE_Display(&g_ce);
for (i = 0; i < TEST_NUM_INTERFACE; i++) { dwErr = NM_DoUpdateRoutes(i); if (dwErr != NO_ERROR) { TRACE1(DEBUG, "NM_Test: Couldn't UpdateRoutes on Interface %u", i); break; } dwErr = WaitForSingleObject(hEvent, INFINITE); dwErr = CM_GetEventMessage(&rpeEvent, &mMessage); TRACE2(DEBUG, "DidUpdateRoutes %u %u", rpeEvent, dwErr); } TRACE1(DEBUG, "...DoUpdateRoutes %u", dwErr); CE_Display(&g_ce);
// interface is active (enabled and bound)
TRACE1(DEBUG, "Sleeping...", dwErr); Sleep(SECTOMILLISEC(TEST_SLEEP_TIME)); TRACE1(DEBUG, "...Awake", dwErr);
// mib manager test
MM_Test(hEvent); TRACE0(DEBUG, "...MM_Test");
// deactivate interfaces
for (i = 0; i < TEST_NUM_INTERFACE; i++) { dwErr = NM_InterfaceStatus(i, FALSE, RIS_INTERFACE_DISABLED, NULL); if (dwErr != NO_ERROR) { TRACE1(DEBUG, "NM_Test: Could not Deactivate Interface %u", i); break; } } TRACE1(DEBUG, "...DeactivateInterface %u", dwErr); CE_Display(&g_ce); // unbind interfaces
pBinding->AddressCount = 0; for (i = 0; i < TEST_NUM_INTERFACE; i++) { dwErr = NM_InterfaceStatus(i, FALSE, RIS_INTERFACE_ADDRESS_CHANGE, (PVOID) pBinding); if (dwErr != NO_ERROR) { TRACE1(DEBUG, "NM_Test: Could not Unbind Interface %u", i); break; } } TRACE1(DEBUG, "...UnbindInterface %u", dwErr); CE_Display(&g_ce);
// delete interfaces
for (i = 0; i < TEST_NUM_INTERFACE; i++) { dwErr = NM_DeleteInterface(i); if (dwErr != NO_ERROR) { TRACE1(DEBUG, "CM_Test: Could not Delete Interface %u", i); break; } } TRACE1(DEBUG, "...DeleteInterface %u", dwErr); CE_Display(&g_ce); }
VOID CM_Test() { DWORD dwErr = NO_ERROR; IPSAMPLE_GLOBAL_CONFIG igc = { IPSAMPLE_LOGGING_INFO }; ROUTING_PROTOCOL_EVENTS rpeEvent; MESSAGE mMessage; HANDLE hEvent;
hEvent = CreateEvent(NULL, FALSE, FALSE, "RouterManagerEvent");
// start protocol
dwErr = CM_StartProtocol(hEvent, NULL, (PVOID) (&igc)); TRACE1(DEBUG, "StartProtocol %u", dwErr); CE_Display(&g_ce);
// network manager test
NM_Test(hEvent); TRACE0(DEBUG, "...NM_Test");
// stop protocol
dwErr = CM_StopProtocol(); TRACE1(DEBUG, "StopProtocol %u", dwErr); CE_Display(&g_ce);
// wait for stop event
dwErr = WaitForSingleObject(hEvent, INFINITE); dwErr = CM_GetEventMessage(&rpeEvent, &mMessage); TRACE2(DEBUG, "Stopped %u %u", rpeEvent, dwErr); CE_Display(&g_ce);
CloseHandle(hEvent); }
VOID WINAPI TestProtocol(VOID) { ULONG i;
TRACE0(DEBUG, "Hello World!!!");
for (i = 0; i < TEST_NUM_START_STOP; i++) { CM_Test(); TRACE1(DEBUG, "...CM_Test (%u)", i); }
HT_Test(); TRACE0(DEBUG, "...HT_Test");
ErrorCodes(); TRACE0(DEBUG, "...ErrorCodes"); }
#else // TEST
VOID WINAPI TestProtocol(VOID) { TRACE0(ANY, "Hello World!"); }
#endif // TEST
|