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