1 // System.Net.Sockets.TcpListenerTest.cs 2 // 3 // Authors: 4 // Phillip Pearson (pp@myelin.co.nz) 5 // Martin Willemoes Hansen (mwh@sysrq.dk) 6 // Gonzalo Paniagua Javier (gonzalo@ximian.com) 7 // 8 // (C) Copyright 2001 Phillip Pearson (http://www.myelin.co.nz) 9 // (C) Copyright 2003 Martin Willemoes Hansen (mwh@sysrq.dk) 10 // (c) 2003 Ximian, Inc. (http://www.ximian.com) 11 // 12 13 using System; 14 using System.Net; 15 using System.Net.Sockets; 16 using NUnit.Framework; 17 18 using MonoTests.Helpers; 19 20 namespace MonoTests.System.Net.Sockets 21 { 22 [TestFixture] 23 public class TcpListenerTest 24 { 25 [Test] 26 #if FEATURE_NO_BSD_SOCKETS 27 [ExpectedException (typeof (PlatformNotSupportedException))] 28 #endif TcpListener()29 public void TcpListener () 30 { 31 var port = NetworkHelpers.FindFreePort (); 32 // listen with a new listener (IPv4 is the default) 33 TcpListener inListener = new TcpListener (port); 34 inListener.Start(); 35 36 37 // connect to it from a new socket 38 IPHostEntry hostent = Dns.GetHostByAddress (IPAddress.Loopback); 39 Socket outSock = null; 40 41 foreach (IPAddress address in hostent.AddressList) { 42 if (address.AddressFamily == AddressFamily.InterNetwork) { 43 /// Only keep IPv4 addresses, our Server is in IPv4 only mode. 44 outSock = new Socket (address.AddressFamily, SocketType.Stream, 45 ProtocolType.IP); 46 IPEndPoint remote = new IPEndPoint (address, port); 47 outSock.Connect (remote); 48 break; 49 } 50 } 51 52 // make sure the connection arrives 53 Assert.IsTrue (inListener.Pending ()); 54 Socket inSock = inListener.AcceptSocket (); 55 56 // now send some data and see if it comes out the other end 57 const int len = 1024; 58 byte[] outBuf = new Byte [len]; 59 for (int i=0; i<len; i++) 60 outBuf [i] = (byte) (i % 256); 61 62 outSock.Send (outBuf, 0, len, 0); 63 64 byte[] inBuf = new Byte[len]; 65 int ret = inSock.Receive (inBuf, 0, len, 0); 66 67 68 // let's see if it arrived OK 69 Assert.IsTrue (ret != 0); 70 for (int i=0; i<len; i++) 71 Assert.IsTrue (inBuf[i] == outBuf [i]); 72 73 // tidy up after ourselves 74 inSock.Close (); 75 76 inListener.Stop (); 77 } 78 79 [Test] 80 #if FEATURE_NO_BSD_SOCKETS 81 [ExpectedException (typeof (PlatformNotSupportedException))] 82 #endif CtorInt1()83 public void CtorInt1 () 84 { 85 int nex = 0; 86 try { new TcpListener (-1); } catch { nex++; } 87 new TcpListener (0); 88 new TcpListener (65535); 89 try { new TcpListener (65536); } catch { nex++; } 90 try { new TcpListener (100000); } catch { nex++; } 91 Assert.IsTrue (nex == 3); 92 } 93 94 [Test] 95 #if FEATURE_NO_BSD_SOCKETS 96 [ExpectedException (typeof (PlatformNotSupportedException))] 97 #else 98 [ExpectedException (typeof (ArgumentNullException))] 99 #endif CtorIPEndPoint()100 public void CtorIPEndPoint () 101 { 102 new TcpListener (null); 103 } 104 105 [Test] 106 #if FEATURE_NO_BSD_SOCKETS 107 [ExpectedException (typeof (PlatformNotSupportedException))] 108 #else 109 [ExpectedException (typeof (ArgumentNullException))] 110 #endif CtorIPAddressInt1()111 public void CtorIPAddressInt1 () 112 { 113 new TcpListener (null, 100000); 114 } 115 116 [Test] 117 #if FEATURE_NO_BSD_SOCKETS 118 [ExpectedException (typeof (PlatformNotSupportedException))] 119 #else 120 [ExpectedException (typeof (ArgumentOutOfRangeException))] 121 #endif CtorIPAddressInt2()122 public void CtorIPAddressInt2 () 123 { 124 new TcpListener (IPAddress.Any, 100000); 125 } 126 127 class MyListener : TcpListener 128 { MyListener()129 public MyListener () 130 : base (IPAddress.Loopback, NetworkHelpers.FindFreePort ()) 131 { 132 } 133 GetSocket()134 public Socket GetSocket () 135 { 136 return Server; 137 } 138 139 public bool IsActive { 140 get { return Active; } 141 } 142 } 143 144 [Test] 145 #if FEATURE_NO_BSD_SOCKETS 146 [ExpectedException (typeof (PlatformNotSupportedException))] 147 #endif PreStartStatus()148 public void PreStartStatus () 149 { 150 MyListener listener = new MyListener (); 151 Assert.AreEqual (false, listener.IsActive, "#01"); 152 Assert.IsTrue (null != listener.GetSocket (), "#02"); 153 try { 154 listener.AcceptSocket (); 155 Assert.Fail ("Exception not thrown"); 156 } catch (InvalidOperationException) { 157 } 158 159 try { 160 listener.AcceptTcpClient (); 161 Assert.Fail ("Exception not thrown"); 162 } catch (InvalidOperationException) { 163 } 164 165 try { 166 listener.Pending (); 167 Assert.Fail ("Exception not thrown"); 168 } catch (InvalidOperationException) { 169 } 170 171 listener.Stop (); 172 } 173 174 [Test] 175 #if FEATURE_NO_BSD_SOCKETS 176 [ExpectedException (typeof (PlatformNotSupportedException))] 177 #endif PostStartStatus()178 public void PostStartStatus () 179 { 180 MyListener listener = new MyListener (); 181 listener.Start (); 182 Assert.AreEqual (true, listener.IsActive, "#01"); 183 Assert.IsTrue (null != listener.GetSocket (), "#02"); 184 185 Socket sock = listener.GetSocket (); 186 listener.Start (); // Start called twice 187 Assert.AreEqual (true, listener.IsActive, "#03"); 188 Assert.IsTrue (null != listener.GetSocket (), "#04"); 189 190 Assert.AreEqual (false, listener.Pending (), "#05"); 191 192 listener.Stop (); 193 Assert.AreEqual (false, listener.IsActive, "#06"); 194 Assert.IsTrue (null != listener.GetSocket (), "#07"); 195 Assert.IsTrue (sock != listener.GetSocket (), "#08"); 196 } 197 198 [Test] 199 #if FEATURE_NO_BSD_SOCKETS 200 [ExpectedException (typeof (PlatformNotSupportedException))] 201 #endif StartListenMoreThan5()202 public void StartListenMoreThan5 () 203 { 204 var port = NetworkHelpers.FindFreePort (); 205 TcpListener listen = new TcpListener (IPAddress.Loopback, port); 206 207 listen.Start (6); 208 listen.Stop (); 209 210 listen.Start (256); 211 listen.Stop (); 212 213 listen.Start (1024); 214 listen.Stop (); 215 216 listen.Start (32768); 217 listen.Stop (); 218 219 listen.Start (65536); 220 listen.Stop (); 221 } 222 223 [Test] 224 #if FEATURE_NO_BSD_SOCKETS 225 [ExpectedException (typeof (PlatformNotSupportedException))] 226 #endif EndAcceptTcpClient()227 public void EndAcceptTcpClient () 228 { 229 var port = NetworkHelpers.FindFreePort (); 230 231 var listenerSocket = new TcpListener (IPAddress.Any, port); 232 listenerSocket.Start (); 233 listenerSocket.BeginAcceptTcpClient (new AsyncCallback (l => { 234 listenerSocket.EndAcceptTcpClient (l); 235 }), null); 236 237 238 using (var outClient = new TcpClient ("localhost", port)) { 239 using (var stream = outClient.GetStream ()) { 240 stream.WriteByte (3); 241 } 242 } 243 } 244 } 245 } 246