* TcpClientTest.cs: ... and disable it again, since it fails buildbot
[mono.git] / mcs / class / System / Test / System.Net.Sockets / TcpClientTest.cs
1 // System.Net.Sockets.TcpClientTest.cs\r
2 //\r
3 // Authors:\r
4 //    Phillip Pearson (pp@myelin.co.nz)\r
5 //    Martin Willemoes Hansen (mwh@sysrq.dk)\r
6 //\r
7 // (C) Copyright 2001 Phillip Pearson (http://www.myelin.co.nz)\r
8 // (C) Copyright 2003 Martin Willemoes Hansen\r
9 //\r
10 \r
11 using System;\r
12 using System.Net;\r
13 using System.Net.Sockets;\r
14 using NUnit.Framework;\r
15 \r
16 namespace MonoTests.System.Net.Sockets {\r
17 \r
18         /// <summary>\r
19         /// Tests System.Net.Sockets.TcpClient\r
20         /// </summary>\r
21         [TestFixture]\r
22         public class TcpClientTest {\r
23                 \r
24                 /// <summary>\r
25                 /// Tests the TcpClient object\r
26                 /// (from System.Net.Sockets)\r
27                 /// </summary>\r
28                 [Test]\r
29                 public void TcpClient()\r
30                 {\r
31                         // set up a listening Socket\r
32                         Socket lSock = new Socket(AddressFamily.InterNetwork,\r
33                                 SocketType.Stream, ProtocolType.Tcp);\r
34                         \r
35                         lSock.Bind(new IPEndPoint(IPAddress.Any, 8765));\r
36                         lSock.Listen(-1);\r
37 \r
38 \r
39                         // connect to it with a TcpClient\r
40                         TcpClient outClient = new TcpClient("localhost", 8765);\r
41                         Socket inSock = lSock.Accept();\r
42 \r
43                         \r
44                         // now try exchanging data\r
45                         NetworkStream stream = outClient.GetStream();\r
46 \r
47                         const int len = 1024;\r
48                         byte[] outBuf = new Byte[len];\r
49                         for (int i=0; i<len; i++) \r
50                         {\r
51                                 outBuf[i] = (byte)(i % 256);\r
52                         }\r
53 \r
54                         // send it\r
55                         stream.Write(outBuf,0,len);\r
56 \r
57                         // and see if it comes back\r
58                         byte[] inBuf = new Byte[len];\r
59                         int ret = inSock.Receive(inBuf, 0, len, 0);\r
60                         Assertion.Assert(ret != 0);\r
61 \r
62                         for (int i=0; i<len; i++) \r
63                         {\r
64                                 Assertion.Assert(inBuf[i] == outBuf[i]);\r
65                         }\r
66                         \r
67 \r
68                         // tidy up\r
69                         inSock.Close();\r
70                         outClient.Close();\r
71                         lSock.Close();\r
72                         \r
73                 }\r
74 \r
75                 [Test] // bug #81105\r
76                 [Category ("NotWorking")]\r
77 /*\r
78         This test flagged as not working as its producing this:\r
79 \r
80 1) MonoTests.System.Net.Sockets.TcpClientTest.CloseTest : System.Net.Sockets.SocketException : Address already in use\r
81   at System.Net.Sockets.Socket.Bind (System.Net.EndPoint local_end) [0x00059] in /home/cvs/mcs/class/System/System.Net.Sockets/Socket.cs:2015\r
82   at System.Net.Sockets.TcpListener.Start (Int32 backlog) [0x00023] in /home/cvs/mcs/class/System/System.Net.Sockets/TcpListener.cs:265\r
83   at System.Net.Sockets.TcpListener.Start () [0x00000] in /home/cvs/mcs/class/System/System.Net.Sockets/TcpListener.cs:240\r
84   at MonoTests.System.Net.SocketResponder.Start () [0x00011] in /home/cvs/mcs/class/System/Test/System.Net/SocketResponder.cs:67\r
85   at MonoTests.System.Net.Sockets.TcpClientTest.CloseTest () [0x0007d] in /home/cvs/mcs/class/System/Test/System.Net.Sockets/TcpClientTest.cs:111\r
86   at <0x00000> <unknown method>\r
87   at (wrapper managed-to-native) System.Reflection.MonoMethod:InternalInvoke (object,object[])\r
88   at System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00040] in /home/cvs/mcs/class/corlib/System.Reflection/MonoMethod.cs:143\r
89 */\r
90                 public void CloseTest ()\r
91                 {\r
92                         IPEndPoint localEP = new IPEndPoint (IPAddress.Loopback, 8765);\r
93                         using (SocketResponder sr = new SocketResponder (localEP, new SocketRequestHandler (CloseRequestHandler))) {\r
94                                 sr.Start ();\r
95 \r
96                                 TcpClient tcpClient = new TcpClient (IPAddress.Loopback.ToString (), 8765);\r
97                                 NetworkStream ns = tcpClient.GetStream ();\r
98                                 Assert.IsNotNull (ns, "#A1");\r
99 #if NET_2_0\r
100                                 Assert.AreEqual (0, tcpClient.Available, "#A2");\r
101                                 Assert.IsTrue (tcpClient.Connected, "#A3");\r
102                                 // Assert.IsFalse (tcpClient.ExclusiveAddressUse, "#A4");\r
103 #endif\r
104                                 tcpClient.Close ();\r
105 #if NET_2_0\r
106                                 Assert.IsNotNull (tcpClient.Client, "#A5");\r
107                                 try {\r
108                                         int available = tcpClient.Available;\r
109                                         Assert.Fail ("#A6: " + available);\r
110                                 } catch (ObjectDisposedException) {\r
111                                 }\r
112                                 Assert.IsFalse (tcpClient.Connected, "#A7");\r
113                                 // not supported on linux\r
114                                 /*\r
115                                 try {\r
116                                         bool exclusive = tcpClient.ExclusiveAddressUse;\r
117                                         Assert.Fail ("#A8: " + exclusive);\r
118                                 } catch (ObjectDisposedException) {\r
119                                 }\r
120                                 */\r
121 #endif\r
122                         }\r
123 \r
124                         using (SocketResponder sr = new SocketResponder (localEP, new SocketRequestHandler (CloseRequestHandler))) {\r
125                                 sr.Start ();\r
126 \r
127                                 TcpClient tcpClient = new TcpClient (IPAddress.Loopback.ToString (), 8765);\r
128 #if NET_2_0\r
129                                 Assert.AreEqual (0, tcpClient.Available, "#B1");\r
130                                 Assert.IsTrue (tcpClient.Connected, "#B2");\r
131                                 // Assert.IsFalse (tcpClient.ExclusiveAddressUse, "#B3");\r
132 #endif\r
133                                 tcpClient.Close ();\r
134 #if NET_2_0\r
135                                 Assert.IsNull (tcpClient.Client, "#B4");\r
136                                 try {\r
137                                         int available = tcpClient.Available;\r
138                                         Assert.Fail ("#B5: " + available);\r
139                                 } catch (NullReferenceException) {\r
140                                 }\r
141                                 try {\r
142                                         bool connected = tcpClient.Connected;\r
143                                         Assert.Fail ("#B6: " + connected);\r
144                                 } catch (NullReferenceException) {\r
145                                 }\r
146                                 // not supported on linux\r
147                                 /*\r
148                                 try {\r
149                                         bool exclusive = tcpClient.ExclusiveAddressUse;\r
150                                         Assert.Fail ("#B7: " + exclusive);\r
151                                 } catch (NullReferenceException) {\r
152                                 }\r
153                                 */\r
154 #endif\r
155                         }\r
156                 }\r
157 \r
158                 byte [] CloseRequestHandler (Socket socket)\r
159                 {\r
160                         return new byte [0];\r
161                 }\r
162 \r
163 #if NET_2_0\r
164                 [Test]\r
165                 [ExpectedException (typeof(ArgumentNullException))]\r
166                 public void ConnectMultiNull ()\r
167                 {\r
168                         TcpClient client = new TcpClient ();\r
169                         IPAddress[] ipAddresses = null;\r
170                         \r
171                         client.Connect (ipAddresses, 1234);\r
172                 }\r
173                 \r
174                 [Test]\r
175                 public void ConnectMultiAny ()\r
176                 {\r
177                         TcpClient client = new TcpClient ();\r
178                         IPAddress[] ipAddresses = new IPAddress[1];\r
179                         \r
180                         ipAddresses[0] = IPAddress.Any;\r
181                         \r
182                         try {\r
183                                 client.Connect (ipAddresses, 1234);\r
184                                 Assert.Fail ("ConnectMultiAny #1");\r
185                         } catch (SocketException ex) {\r
186                                 Assertion.AssertEquals ("ConnectMultiAny #2",\r
187                                                         10049, ex.ErrorCode);\r
188                         } catch {\r
189                                 Assert.Fail ("ConnectMultiAny #3");\r
190                         }\r
191                 }\r
192                 \r
193                 [Test]\r
194                 public void ConnectMultiRefused ()\r
195                 {\r
196                         TcpClient client = new TcpClient ();\r
197                         IPAddress[] ipAddresses = new IPAddress[1];\r
198                         \r
199                         ipAddresses[0] = IPAddress.Loopback;\r
200                         \r
201                         try {\r
202                                 client.Connect (ipAddresses, 1234);\r
203                                 Assert.Fail ("ConnectMultiRefused #1");\r
204                         } catch (SocketException ex) {\r
205                                 Assertion.AssertEquals ("ConnectMultiRefused #2", 10061, ex.ErrorCode);\r
206                         } catch {\r
207                                 Assert.Fail ("ConnectMultiRefused #3");\r
208                         }\r
209                 }\r
210                 \r
211 #endif\r
212                 \r
213         }\r
214 \r
215 }\r