Merge pull request #3345 from alexanderkyte/fix_mini_aot_flags
[mono.git] / mcs / class / System / Test / System.Net.Sockets / TcpListenerTest.cs
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         [Category ("RequiresBSDSockets")]
24         public class TcpListenerTest
25         {
26                 [Test]
27                 public void TcpListener ()
28                 {
29                         var port = NetworkHelpers.FindFreePort ();
30                         // listen with a new listener (IPv4 is the default)
31                         TcpListener inListener = new TcpListener (port);
32                         inListener.Start();
33                         
34
35                         // connect to it from a new socket
36                         IPHostEntry hostent = Dns.GetHostByAddress (IPAddress.Loopback);
37                         Socket outSock = null;
38
39                         foreach (IPAddress address in hostent.AddressList) {
40                                 if (address.AddressFamily == AddressFamily.InterNetwork) {
41                                         /// Only keep IPv4 addresses, our Server is in IPv4 only mode.
42                                         outSock = new Socket (address.AddressFamily, SocketType.Stream,
43                                                 ProtocolType.IP);
44                                         IPEndPoint remote = new IPEndPoint (address, port);
45                                         outSock.Connect (remote);
46                                         break;
47                                 }
48                         }
49                         
50                         // make sure the connection arrives
51                         Assert.IsTrue (inListener.Pending ());
52                         Socket inSock = inListener.AcceptSocket ();
53
54                         // now send some data and see if it comes out the other end
55                         const int len = 1024;
56                         byte[] outBuf = new Byte [len];
57                         for (int i=0; i<len; i++) 
58                                 outBuf [i] = (byte) (i % 256);
59
60                         outSock.Send (outBuf, 0, len, 0);
61
62                         byte[] inBuf = new Byte[len];
63                         int ret = inSock.Receive (inBuf, 0, len, 0);
64
65
66                         // let's see if it arrived OK
67                         Assert.IsTrue (ret != 0);
68                         for (int i=0; i<len; i++) 
69                                 Assert.IsTrue (inBuf[i] == outBuf [i]);
70
71                         // tidy up after ourselves
72                         inSock.Close ();
73
74                         inListener.Stop ();
75                 }
76
77                 [Test]
78                 public void CtorInt1 ()
79                 {
80                         int nex = 0;
81                         try { new TcpListener (-1); } catch { nex++; }
82                         new TcpListener (0);
83                         new TcpListener (65535);
84                         try { new TcpListener (65536); } catch { nex++; }
85                         try { new TcpListener (100000); } catch { nex++; }
86                         Assert.IsTrue (nex == 3);                       
87                 }
88
89                 [Test]
90                 [ExpectedException (typeof (ArgumentNullException))]
91                 public void CtorIPEndPoint ()
92                 {
93                         new TcpListener (null);
94                 }
95
96                 [Test]
97                 [ExpectedException (typeof (ArgumentNullException))]
98                 public void CtorIPAddressInt1 ()
99                 {
100                         new TcpListener (null, 100000);
101                 }
102
103                 [Test]
104                 [ExpectedException (typeof (ArgumentOutOfRangeException))]
105                 public void CtorIPAddressInt2 ()
106                 {
107                         new TcpListener (IPAddress.Any, 100000);
108                 }
109
110                 class MyListener : TcpListener
111                 {
112                         public MyListener ()
113                                 : base (IPAddress.Loopback, NetworkHelpers.FindFreePort ())
114                         {
115                         }
116
117                         public Socket GetSocket ()
118                         {
119                                 return Server;
120                         }
121
122                         public bool IsActive {
123                                 get { return Active; }
124                         }
125                 }
126
127                 [Test]
128                 public void PreStartStatus ()
129                 {
130                         MyListener listener = new MyListener ();
131                         Assert.AreEqual (false, listener.IsActive, "#01");
132                         Assert.IsTrue (null != listener.GetSocket (), "#02");
133                         try {
134                                 listener.AcceptSocket ();
135                                 Assert.Fail ("Exception not thrown");
136                         } catch (InvalidOperationException) {
137                         }
138
139                         try {
140                                 listener.AcceptTcpClient ();
141                                 Assert.Fail ("Exception not thrown");
142                         } catch (InvalidOperationException) {
143                         }
144
145                         try {
146                                 listener.Pending ();
147                                 Assert.Fail ("Exception not thrown");
148                         } catch (InvalidOperationException) {
149                         }
150
151                         listener.Stop ();
152                 }
153
154                 [Test]
155                 public void PostStartStatus ()
156                 {
157                         MyListener listener = new MyListener ();
158                         listener.Start ();
159                         Assert.AreEqual (true, listener.IsActive, "#01");
160                         Assert.IsTrue (null != listener.GetSocket (), "#02");
161                         
162                         Socket sock = listener.GetSocket ();
163                         listener.Start (); // Start called twice
164                         Assert.AreEqual (true, listener.IsActive, "#03");
165                         Assert.IsTrue (null != listener.GetSocket (), "#04");
166
167                         Assert.AreEqual (false, listener.Pending (), "#05");
168
169                         listener.Stop ();
170                         Assert.AreEqual (false, listener.IsActive, "#06");
171                         Assert.IsTrue (null != listener.GetSocket (), "#07");
172                         Assert.IsTrue (sock != listener.GetSocket (), "#08");
173                 }
174
175                 [Test]
176                 public void StartListenMoreThan5 ()
177                 {
178                         var port = NetworkHelpers.FindFreePort ();
179                         TcpListener listen = new TcpListener (IPAddress.Loopback, port);
180
181                         listen.Start (6);
182                         listen.Stop ();
183                         
184                         listen.Start (256);
185                         listen.Stop ();
186                         
187                         listen.Start (1024);
188                         listen.Stop ();
189
190                         listen.Start (32768);
191                         listen.Stop ();
192                         
193                         listen.Start (65536);
194                         listen.Stop ();
195                 }
196         }
197 }