diff --git a/UnitTests/PInvoke/Ws2_32/WSATests.cs b/UnitTests/PInvoke/Ws2_32/WSATests.cs new file mode 100644 index 00000000..3613762a --- /dev/null +++ b/UnitTests/PInvoke/Ws2_32/WSATests.cs @@ -0,0 +1,107 @@ +using NUnit.Framework; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using System.Text; +using Vanara.InteropServices; +using static Vanara.PInvoke.Ws2_32; + +namespace Vanara.PInvoke.Tests +{ + [TestFixture()] + public class WSATests + { + const string saddr4 = "192.168.0.1"; + const string saddr6 = "2001:db8:aaaa:1::100"; + + public static readonly IPAddress localIP4 = Dns.GetHostEntry(Dns.GetHostName()).AddressList.FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork); + public static readonly SOCKET tcpSocket = socket(ADDRESS_FAMILY.AF_INET, SOCK.SOCK_STREAM, IPPROTO.IPPROTO_TCP); + + //[OneTimeTearDown] + //public void _OneTimeTearDown() + //{ + // WSACleanup(); + //} + + [Test] + public void WSAAddressToStringTest() + { + var addr = new SOCKADDR(localIP4); + var len = 256U; + var sb = new StringBuilder((int)len); + Assert.That(WSAAddressToString(addr, addr.Size, default, sb, ref len), ResultIs.Not.Value(-1)); + TestContext.Write(sb); + Assert.That(sb.ToString(), Is.EqualTo(localIP4.ToString())); + } + + [Test] + public void WSACreateEventTest() + { + var evt = WSACreateEvent(); + Assert.That(evt, ResultIs.ValidHandle); + Assert.That(WSAResetEvent(evt), ResultIs.Successful); + Assert.That(WSASetEvent(evt), ResultIs.Successful); + Assert.That(() => evt.Dispose(), Throws.Nothing); + } + + [Test] + public void WSAEnumNameSpaceProvidersTest() + { + var len = 0U; + Assert.That(WSAEnumNameSpaceProviders(ref len, default), ResultIs.Value(-1)); + //Assert.That(WSAGetLastError(), Is.EqualTo((Win32Error)Win32Error.WSAEFAULT)); + Assert.That(len, Is.GreaterThan(0)); + using var mem = new SafeHGlobalHandle(len); + var cnt = WSAEnumNameSpaceProviders(ref len, mem); + Assert.That(cnt, ResultIs.Not.Value(-1)); + TestContext.Write(string.Join("\n", mem.ToEnumerable(cnt).Select(n => $"{n.lpszIdentifier.ToString()}: {n.NSProviderId}, {n.dwNameSpace}, {n.fActive}"))); + } + + [Test] + public void WSAEnumNameSpaceProvidersExTest() + { + var len = 0U; + Assert.That(WSAEnumNameSpaceProvidersEx(ref len, default), ResultIs.Value(-1)); + //Assert.That(WSAGetLastError(), Is.EqualTo((Win32Error)Win32Error.WSAEFAULT)); + Assert.That(len, Is.GreaterThan(0)); + using var mem = new SafeHGlobalHandle(len); + var cnt = WSAEnumNameSpaceProvidersEx(ref len, mem); + Assert.That(cnt, ResultIs.Not.Value(-1)); + TestContext.Write(string.Join("\n", mem.ToEnumerable(cnt).Select(n => $"{n.lpszIdentifier.ToString()}: {n.NSProviderId}, {n.dwNameSpace}, {n.fActive}"))); + } + + [Test] + public void WSAEnumNetworkEventsTest() + { + var ListenSocket = tcpSocket; + var InetAddr = new SOCKADDR(IN_ADDR.INADDR_ANY, htons(27015)); + Assert.That(bind(ListenSocket, InetAddr, InetAddr.Size), ResultIs.Not.Value(-1)); + using var evt = WSACreateEvent(); + Assert.That(evt, ResultIs.ValidHandle); + Assert.That(WSAEventSelect(ListenSocket, evt, FD.FD_ACCEPT | FD.FD_CLOSE), ResultIs.Not.Value(-1)); + Assert.That(listen(ListenSocket, 10), ResultIs.Not.Value(-1)); + var EventArray = new WSAEVENT[] { evt }; + WSAWaitForMultipleEvents((uint)EventArray.Length, EventArray, true, 500, false); + Assert.That(WSAEnumNetworkEvents(ListenSocket, evt, out var nets), ResultIs.Not.Value(-1)); + } + + [Test] + public void WSAEnumProtocolsTest() + { + var len = 0U; + Assert.That(WSAEnumProtocols(null, default, ref len), ResultIs.Value(-1)); + Assert.That(len, Is.GreaterThan(0)); + using var mem = new SafeHGlobalHandle(len); + var cnt = WSAEnumProtocols(null, mem, ref len); + Assert.That(cnt, ResultIs.Not.Value(-1)); + TestContext.Write(string.Join("\n", mem.ToEnumerable(cnt).Select(p => $"{p.szProtocol}: {(ADDRESS_FAMILY)p.iAddressFamily}, {p.iSocketType}, {p.iProtocol}"))); + } + + [Test] + public void WSAHtonlTest() + { + Assert.That(WSAHtonl(tcpSocket, 0x01020304, out var ret), ResultIs.Not.Value(-1)); + Assert.That(ret, Is.EqualTo(0x04030201)); + } + } +} \ No newline at end of file diff --git a/UnitTests/PInvoke/Ws2_32/Winsock2Tests.cs b/UnitTests/PInvoke/Ws2_32/Winsock2Tests.cs new file mode 100644 index 00000000..736a41ae --- /dev/null +++ b/UnitTests/PInvoke/Ws2_32/Winsock2Tests.cs @@ -0,0 +1,139 @@ +using NUnit.Framework; +using System; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using System.Text; +using Vanara.Extensions; +using Vanara.InteropServices; +using static Vanara.PInvoke.Ws2_32; + +namespace Vanara.PInvoke.Tests +{ + [TestFixture()] + public class Winsock2Tests + { + const string saddr4 = "192.168.0.1"; + const string saddr6 = "2001:db8:aaaa:1::100"; + + public static readonly IPAddress localIP4 = Dns.GetHostEntry(Dns.GetHostName()).AddressList.FirstOrDefault(ip => ip.AddressFamily == AddressFamily.InterNetwork); + public static SafeSOCKET GetTcpSocket() => socket(ADDRESS_FAMILY.AF_INET, SOCK.SOCK_STREAM, IPPROTO.IPPROTO_TCP); + + [Test] + public void gethostnameTest() + { + var sb = new StringBuilder(256); + Assert.That(gethostname(sb, sb.Capacity), ResultIs.Not.Value(-1)); + TestContext.WriteLine(sb); + } + + [Test] + public void GetHostNameWTest() + { + var sb = new StringBuilder(256); + Assert.That(GetHostNameW(sb, sb.Capacity), ResultIs.Not.Value(-1)); + TestContext.WriteLine(sb); + } + + [Test] + public unsafe void getprotobynameTest() + { + var p = getprotobyname_unsafe("TCP"); + Assert.That((IntPtr)p, Is.Not.EqualTo(IntPtr.Zero)); + TestContext.WriteLine($"{p->p_name}: {p->p_proto}, {string.Join(",", p->Aliases)}"); + + var p2 = getprotobyname("TCP"); + Assert.That(p2, Is.Not.EqualTo(IntPtr.Zero)); + Assert.That(p2.ToStructure().p_proto, Is.EqualTo(p->p_proto)); + } + + [Test] + public unsafe void getprotobynumberTest() + { + var p = getprotobynumber_unsafe(6); + Assert.That((IntPtr)p, Is.Not.EqualTo(IntPtr.Zero)); + TestContext.WriteLine($"{p->p_name}: {p->p_proto}, {string.Join(",", p->Aliases)}"); + + var p2 = getprotobynumber(6); + Assert.That(p2, Is.Not.EqualTo(IntPtr.Zero)); + Assert.That(p2.ToStructure().p_proto, Is.EqualTo(p->p_proto)); + } + + [Test] + public unsafe void getservbynameTest() + { + const string svcName = "finger"; + var ps = getservbyname(svcName); + Assert.That(ps, Is.Not.EqualTo(IntPtr.Zero)); + var s = ps.ToStructure(); + TestContext.WriteLine($"{s.s_name}: {s.s_port}, {s.s_proto}, {string.Join(",", s.s_aliases)}"); + } + + [Test] + public unsafe void getservbyportTest() + { + const short svcPort = 20224; // finger (79 reversed) + var ps = getservbyport(svcPort, "TCP"); + Assert.That(ps, ResultIs.Not.Value(IntPtr.Zero)); + var s = ps.ToStructure(); + TestContext.WriteLine($"{s.s_name}: {s.s_port}, {s.s_proto}, {string.Join(",", s.s_aliases)}"); + } + + [Test] + public void getsocknameTest() + { + using var sckt = GetTcpSocket(); + var cname = new SOCKADDR(inet_addr("127.0.0.1"), htons(80)); + Assert.That(connect(sckt, cname, cname.Size), ResultIs.Not.Value(-1)); + var addr = SOCKADDR.Empty; + var sz = (int)addr.Size; + Assert.That(getsockname(sckt, addr, ref sz), ResultIs.Not.Value(-1)); + Assert.That(sz, Is.LessThanOrEqualTo((int)addr.Size)); + } + + [Test] + public void getsockoptTest() + { + var sz = 256; + using var sckt = GetTcpSocket(); + using var mem = new SafeHGlobalHandle(sz); + Assert.That(getsockopt(sckt, SOL_SOCKET, SO_ACCEPTCONN, mem, ref sz), ResultIs.Not.Value(-1)); + } + + [Test] + public void htonlTest() + { + Assert.That(htonl(0x04030201), Is.EqualTo(0x01020304)); + } + + [Test] + public void htonsTest() + { + Assert.That(htons(0x0201), Is.EqualTo(0x0102)); + } + + [Test] + public void inet_addrTest() + { + Assert.That(inet_addr("255.255.255.0"), Is.EqualTo(0x00FFFFFFU)); + } + + [Test] + public void inet_ntoaTest() + { + Assert.That(inet_ntoa(new IN_ADDR(0x00FFFFFFU)).ToString(), Is.EqualTo("255.255.255.0")); + } + + [Test] + public void ntohlTest() + { + Assert.That(ntohl(0x04030201), Is.EqualTo(0x01020304)); + } + + [Test] + public void ntohsTest() + { + Assert.That(ntohs(0x0201), Is.EqualTo(0x0102)); + } + } +} \ No newline at end of file diff --git a/UnitTests/PInvoke/Ws2_32/Ws2_32.csproj b/UnitTests/PInvoke/Ws2_32/Ws2_32.csproj index 81b342c5..a75ec9a5 100644 --- a/UnitTests/PInvoke/Ws2_32/Ws2_32.csproj +++ b/UnitTests/PInvoke/Ws2_32/Ws2_32.csproj @@ -62,6 +62,8 @@ + +