Author: pschweitzer Date: Sat Dec 12 09:45:23 2015 New Revision: 70326
URL: http://svn.reactos.org/svn/reactos?rev=70326&view=rev Log: [IPHLPAPI_APITEST] Add more tests
Modified: trunk/rostests/apitests/iphlpapi/SendARP.c
Modified: trunk/rostests/apitests/iphlpapi/SendARP.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/iphlpapi/SendARP.... ============================================================================== --- trunk/rostests/apitests/iphlpapi/SendARP.c [iso-8859-1] (original) +++ trunk/rostests/apitests/iphlpapi/SendARP.c [iso-8859-1] Sat Dec 12 09:45:23 2015 @@ -14,13 +14,14 @@ #include <ndk/obfuncs.h> #include <ndk/rtlfuncs.h>
-static VOID TestUM(IPAddr * Source) +static VOID TestUM(IPAddr * Source, IPAddr * Gateway) { DWORD Err; ULONG Hw[2]; DWORD Size; BOOL Tested = FALSE; PIP_ADAPTER_ADDRESSES Addresses, Current; + PIP_ADAPTER_INFO Adapters, CurrentA;
Err = SendARP(0, 0, NULL, NULL); ok(Err == ERROR_INVALID_PARAMETER, "Expected error: ERROR_INVALID_PARAMETER. Got: %lx\n", Err); @@ -117,15 +118,126 @@ break; }
+ free(Addresses); + if (!Tested) { skip("No suitable interface found\n"); - } - - free(Addresses); + return; + } + + Size = sizeof(IP_ADAPTER_INFO); + Adapters = (PIP_ADAPTER_INFO)malloc(Size); + if (!Adapters) + { + skip("Memory failure\n"); + return; + } + + Err = GetAdaptersInfo(Adapters, &Size); + if (Err == ERROR_BUFFER_OVERFLOW) + { + free(Adapters); + Adapters = (PIP_ADAPTER_INFO)malloc(Size); + if (!Adapters) + { + skip("Memory failure\n"); + return; + } + + Err = GetAdaptersInfo(Adapters, &Size); + } + + if (Err != ERROR_SUCCESS) + { + skip("GetAdaptersInfo() failure\n"); + free(Adapters); + return; + } + + Tested = FALSE; + for (CurrentA = Adapters; CurrentA; CurrentA = CurrentA->Next) + { + IPAddr IpAddr; + NTSTATUS Status; + const CHAR * Terminator; + + Status = RtlIpv4StringToAddressA(CurrentA->IpAddressList.IpAddress.String, TRUE, &Terminator, (struct in_addr *)&IpAddr); + if (!NT_SUCCESS(Status)) + continue; + + if (IpAddr != *Source) + continue; + + Status = RtlIpv4StringToAddressA(CurrentA->GatewayList.IpAddress.String, TRUE, &Terminator, (struct in_addr *)&IpAddr); + if (NT_SUCCESS(Status)) + { + trace("Gateway found: %lu.%lu.%lu.%lu\n", IpAddr & 0xFF, (IpAddr >> 8) & 0xFF, (IpAddr >> 16) & 0xFF, (IpAddr >> 24) & 0xFF); + Tested = TRUE; + *Gateway = IpAddr; + } + + break; + } + + free(Adapters); + + if (!Tested) + { + skip("No suitable gateway found\n"); + return; + } + + Size = 4; + Err = SendARP(*Gateway, *Source, Hw, &Size); + ok(Err == ERROR_GEN_FAILURE, "Expected error: ERROR_GEN_FAILURE. Got: %lx\n", Err); + + Size = 6; + Err = SendARP(*Gateway, *Source, Hw, &Size); + ok(Err == ERROR_SUCCESS, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err); + + Size = 8; + Err = SendARP(*Gateway, *Source, Hw, &Size); + ok(Err == ERROR_SUCCESS, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err); + + Size = 4; + Err = SendARP(*Source, *Gateway, Hw, &Size); + ok(Err == ERROR_NO_SYSTEM_RESOURCES, "Expected error: ERROR_NO_SYSTEM_RESOURCES. Got: %lx\n", Err); + + Size = 6; + Err = SendARP(*Source, *Gateway, Hw, &Size); + ok(Err == ERROR_SUCCESS, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err); + + Size = 8; + Err = SendARP(*Source, *Gateway, Hw, &Size); + ok(Err == ERROR_SUCCESS, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err); + + Size = 4; + Err = SendARP(*Gateway, 0x08080808, Hw, &Size); + ok(Err == ERROR_GEN_FAILURE, "Expected error: ERROR_GEN_FAILURE. Got: %lx\n", Err); + + Size = 6; + Err = SendARP(*Gateway, 0x08080808, Hw, &Size); + ok(Err == ERROR_SUCCESS, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err); + + Size = 8; + Err = SendARP(*Gateway, 0x08080808, Hw, &Size); + ok(Err == ERROR_SUCCESS, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err); + + Size = 4; + Err = SendARP(*Source, 0x08080808, Hw, &Size); + ok(Err == ERROR_NO_SYSTEM_RESOURCES, "Expected error: ERROR_NO_SYSTEM_RESOURCES. Got: %lx\n", Err); + + Size = 6; + Err = SendARP(*Source, 0x08080808, Hw, &Size); + ok(Err == ERROR_SUCCESS, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err); + + Size = 8; + Err = SendARP(*Source, 0x08080808, Hw, &Size); + ok(Err == ERROR_SUCCESS, "Expected error: ERROR_SUCCESS. Got: %lx\n", Err); }
-static VOID TestKM(IPAddr Source) +static VOID TestKM(IPAddr Source, IPAddr Gateway) { HANDLE hDevice; NTSTATUS Status; @@ -378,6 +490,213 @@ ok(Status == STATUS_SUCCESS, "NtDeviceIoControlFile() failed with status: %lx\n", Status); ok(IoStatusBlock.Information == 6, "Excepted 6, got: %lu\n", IoStatusBlock.Information);
+ if (!Gateway) + { + skip("No suitable gateway found\n"); + CloseHandle(hEvent); + CloseHandle(hDevice); + return; + } + + Ip[0] = Gateway; + Ip[1] = Source; + ResetEvent(hEvent); + IoStatusBlock.Status = STATUS_SUCCESS; + IoStatusBlock.Information = 0; + Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), NULL, 0); + if (Status == STATUS_PENDING) + { + NtWaitForSingleObject(hEvent, FALSE, NULL); + Status = IoStatusBlock.Status; + } + ok(Status == STATUS_INVALID_BUFFER_SIZE, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status); + ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information); + + ResetEvent(hEvent); + IoStatusBlock.Status = STATUS_SUCCESS; + IoStatusBlock.Information = 0; + Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 4); + if (Status == STATUS_PENDING) + { + NtWaitForSingleObject(hEvent, FALSE, NULL); + Status = IoStatusBlock.Status; + } + ok(Status == STATUS_UNSUCCESSFUL, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status); + ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information); + + ResetEvent(hEvent); + IoStatusBlock.Status = STATUS_SUCCESS; + IoStatusBlock.Information = 0; + Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 6); + if (Status == STATUS_PENDING) + { + NtWaitForSingleObject(hEvent, FALSE, NULL); + Status = IoStatusBlock.Status; + } + ok(Status == STATUS_SUCCESS, "NtDeviceIoControlFile() failed with status: %lx\n", Status); + ok(IoStatusBlock.Information == 6, "Excepted 6, got: %lu\n", IoStatusBlock.Information); + + ResetEvent(hEvent); + IoStatusBlock.Status = STATUS_SUCCESS; + IoStatusBlock.Information = 0; + Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 8); + if (Status == STATUS_PENDING) + { + NtWaitForSingleObject(hEvent, FALSE, NULL); + Status = IoStatusBlock.Status; + } + ok(Status == STATUS_SUCCESS, "NtDeviceIoControlFile() failed with status: %lx\n", Status); + ok(IoStatusBlock.Information == 6, "Excepted 6, got: %lu\n", IoStatusBlock.Information); + + Ip[0] = Source; + Ip[1] = Gateway; + ResetEvent(hEvent); + IoStatusBlock.Status = STATUS_SUCCESS; + IoStatusBlock.Information = 0; + Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), NULL, 0); + if (Status == STATUS_PENDING) + { + NtWaitForSingleObject(hEvent, FALSE, NULL); + Status = IoStatusBlock.Status; + } + ok(Status == STATUS_INVALID_BUFFER_SIZE, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status); + ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information); + + ResetEvent(hEvent); + IoStatusBlock.Status = STATUS_SUCCESS; + IoStatusBlock.Information = 0; + Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 4); + if (Status == STATUS_PENDING) + { + NtWaitForSingleObject(hEvent, FALSE, NULL); + Status = IoStatusBlock.Status; + } + ok(Status == STATUS_INSUFFICIENT_RESOURCES, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status); + ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information); + + ResetEvent(hEvent); + IoStatusBlock.Status = STATUS_SUCCESS; + IoStatusBlock.Information = 0; + Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 6); + if (Status == STATUS_PENDING) + { + NtWaitForSingleObject(hEvent, FALSE, NULL); + Status = IoStatusBlock.Status; + } + ok(Status == STATUS_SUCCESS, "NtDeviceIoControlFile() failed with status: %lx\n", Status); + ok(IoStatusBlock.Information == 6, "Excepted 6, got: %lu\n", IoStatusBlock.Information); + + ResetEvent(hEvent); + IoStatusBlock.Status = STATUS_SUCCESS; + IoStatusBlock.Information = 0; + Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 8); + if (Status == STATUS_PENDING) + { + NtWaitForSingleObject(hEvent, FALSE, NULL); + Status = IoStatusBlock.Status; + } + ok(Status == STATUS_SUCCESS, "NtDeviceIoControlFile() failed with status: %lx\n", Status); + ok(IoStatusBlock.Information == 6, "Excepted 6, got: %lu\n", IoStatusBlock.Information); + + Ip[0] = Gateway; + Ip[1] = 0x08080808; + ResetEvent(hEvent); + IoStatusBlock.Status = STATUS_SUCCESS; + IoStatusBlock.Information = 0; + Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), NULL, 0); + if (Status == STATUS_PENDING) + { + NtWaitForSingleObject(hEvent, FALSE, NULL); + Status = IoStatusBlock.Status; + } + ok(Status == STATUS_INVALID_BUFFER_SIZE, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status); + ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information); + + ResetEvent(hEvent); + IoStatusBlock.Status = STATUS_SUCCESS; + IoStatusBlock.Information = 0; + Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 4); + if (Status == STATUS_PENDING) + { + NtWaitForSingleObject(hEvent, FALSE, NULL); + Status = IoStatusBlock.Status; + } + ok(Status == STATUS_UNSUCCESSFUL, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status); + ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information); + + ResetEvent(hEvent); + IoStatusBlock.Status = STATUS_SUCCESS; + IoStatusBlock.Information = 0; + Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 6); + if (Status == STATUS_PENDING) + { + NtWaitForSingleObject(hEvent, FALSE, NULL); + Status = IoStatusBlock.Status; + } + ok(Status == STATUS_SUCCESS, "NtDeviceIoControlFile() failed with status: %lx\n", Status); + ok(IoStatusBlock.Information == 6, "Excepted 6, got: %lu\n", IoStatusBlock.Information); + + ResetEvent(hEvent); + IoStatusBlock.Status = STATUS_SUCCESS; + IoStatusBlock.Information = 0; + Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 8); + if (Status == STATUS_PENDING) + { + NtWaitForSingleObject(hEvent, FALSE, NULL); + Status = IoStatusBlock.Status; + } + ok(Status == STATUS_SUCCESS, "NtDeviceIoControlFile() failed with status: %lx\n", Status); + ok(IoStatusBlock.Information == 6, "Excepted 6, got: %lu\n", IoStatusBlock.Information); + + Ip[0] = Source; + ResetEvent(hEvent); + IoStatusBlock.Status = STATUS_SUCCESS; + IoStatusBlock.Information = 0; + Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), NULL, 0); + if (Status == STATUS_PENDING) + { + NtWaitForSingleObject(hEvent, FALSE, NULL); + Status = IoStatusBlock.Status; + } + ok(Status == STATUS_INVALID_BUFFER_SIZE, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status); + ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information); + + ResetEvent(hEvent); + IoStatusBlock.Status = STATUS_SUCCESS; + IoStatusBlock.Information = 0; + Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 4); + if (Status == STATUS_PENDING) + { + NtWaitForSingleObject(hEvent, FALSE, NULL); + Status = IoStatusBlock.Status; + } + ok(Status == STATUS_INSUFFICIENT_RESOURCES, "NtDeviceIoControlFile() failed with unexpected status: %lx\n", Status); + ok(IoStatusBlock.Information == 0, "Excepted 0, got: %lu\n", IoStatusBlock.Information); + + ResetEvent(hEvent); + IoStatusBlock.Status = STATUS_SUCCESS; + IoStatusBlock.Information = 0; + Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 6); + if (Status == STATUS_PENDING) + { + NtWaitForSingleObject(hEvent, FALSE, NULL); + Status = IoStatusBlock.Status; + } + ok(Status == STATUS_SUCCESS, "NtDeviceIoControlFile() failed with status: %lx\n", Status); + ok(IoStatusBlock.Information == 6, "Excepted 6, got: %lu\n", IoStatusBlock.Information); + + ResetEvent(hEvent); + IoStatusBlock.Status = STATUS_SUCCESS; + IoStatusBlock.Information = 0; + Status = NtDeviceIoControlFile(hDevice, hEvent, NULL, NULL, &IoStatusBlock, IOCTL_QUERY_IP_HW_ADDRESS, Ip, sizeof(Ip), Hw, 8); + if (Status == STATUS_PENDING) + { + NtWaitForSingleObject(hEvent, FALSE, NULL); + Status = IoStatusBlock.Status; + } + ok(Status == STATUS_SUCCESS, "NtDeviceIoControlFile() failed with status: %lx\n", Status); + ok(IoStatusBlock.Information == 6, "Excepted 6, got: %lu\n", IoStatusBlock.Information); + CloseHandle(hEvent); CloseHandle(hDevice); } @@ -385,13 +704,14 @@ START_TEST(SendARP) { IPAddr Source = 0; - - TestUM(&Source); + IPAddr Gateway = 0; + + TestUM(&Source, &Gateway); if (!Source) { skip("No suitable interface found\n"); return; }
- TestKM(Source); + TestKM(Source, Gateway); }