Merge pull request #4118 from petertiedemann/fix-bug-48516
[mono.git] / mcs / class / System / Test / System.Net.Sockets / MulticastOptionTest.cs
1 // System.Net.Sockets.MulticastOptionTest.cs
2 //
3 // Authors:
4 //      Gert Driesen (drieseng@users.sourceforge.net)
5 //
6 // Copyright (c) 2009 Gert Driesen
7 //
8
9 using System;
10 using System.Net;
11 using System.Net.Sockets;
12
13 using NUnit.Framework;
14
15 namespace MonoTests.System.Net.Sockets
16 {
17         [TestFixture]
18         public class MulticastOptionTest
19         {
20                 [Test] // .ctor (IPAddress)
21                 public void Constructor1 ()
22                 {
23                         MulticastOption option;
24                         IPAddress group;
25
26                         group = IPAddress.Parse ("239.255.255.250");
27                         option = new MulticastOption (group);
28                         Assert.AreSame (group, option.Group, "#A:Group");
29                         Assert.AreEqual (0, option.InterfaceIndex, "#A:InterfaceIndex");
30                         Assert.AreEqual (IPAddress.Any, option.LocalAddress, "#A:LocalAddress");
31
32                         group = IPAddress.Parse ("ff02::1");
33                         option = new MulticastOption (group);
34                         Assert.AreSame (group, option.Group, "#B:Group");
35                         Assert.AreEqual (0, option.InterfaceIndex, "#B:InterfaceIndex");
36                         Assert.AreEqual (IPAddress.Any, option.LocalAddress, "#B:LocalAddress");
37                 }
38
39                 [Test] // .ctor (IPAddress)
40                 public void Constructor1_Group_Null ()
41                 {
42                         try {
43                                 new MulticastOption ((IPAddress) null);
44                                 Assert.Fail ("#1");
45                         } catch (ArgumentNullException ex) {
46                                 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
47                                 Assert.IsNull (ex.InnerException, "#3");
48                                 Assert.IsNotNull (ex.Message, "#4");
49                                 Assert.AreEqual ("group", ex.ParamName, "#5");
50                         }
51                 }
52
53                 [Test] // .ctor (IPAddress, IPAddress)
54                 public void Constructor2 ()
55                 {
56                         MulticastOption option;
57                         IPAddress group;
58                         IPAddress mcint;
59
60                         group = IPAddress.Parse ("239.255.255.250");
61                         mcint = IPAddress.Any;
62                         option = new MulticastOption (group, mcint);
63                         Assert.AreSame (group, option.Group, "#A:Group");
64                         Assert.AreEqual (0, option.InterfaceIndex, "#A:InterfaceIndex");
65                         Assert.AreEqual (mcint, option.LocalAddress, "#A:LocalAddress");
66
67                         group = IPAddress.Parse ("ff02::1");
68                         mcint = IPAddress.IPv6Any;
69                         option = new MulticastOption (group, mcint);
70                         Assert.AreSame (group, option.Group, "#B:Group");
71                         Assert.AreEqual (0, option.InterfaceIndex, "#B:InterfaceIndex");
72                         Assert.AreEqual (mcint, option.LocalAddress, "#B:LocalAddress");
73                 }
74
75                 [Test] // .ctor (IPAddress, IPAddress)
76                 public void Constructor2_Group_Null ()
77                 {
78                         IPAddress group = null;
79                         IPAddress mcint = IPAddress.Any;
80
81                         try {
82                                 new MulticastOption (group, mcint);
83                                 Assert.Fail ("#1");
84                         } catch (ArgumentNullException ex) {
85                                 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
86                                 Assert.IsNull (ex.InnerException, "#3");
87                                 Assert.IsNotNull (ex.Message, "#4");
88                                 Assert.AreEqual ("group", ex.ParamName, "#5");
89                         }
90                 }
91
92                 [Test] // .ctor (IPAddress, IPAddress)
93                 public void Constructor2_Mcint_Null ()
94                 {
95                         IPAddress group = IPAddress.Parse ("239.255.255.250");
96                         IPAddress mcint = null;
97
98                         try {
99                                 new MulticastOption (group, mcint);
100                                 Assert.Fail ("#1");
101                         } catch (ArgumentNullException ex) {
102                                 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
103                                 Assert.IsNull (ex.InnerException, "#3");
104                                 Assert.IsNotNull (ex.Message, "#4");
105                                 Assert.AreEqual ("mcint", ex.ParamName, "#5");
106                         }
107                 }
108
109                 [Test] // .ctor (IPAddress, Int32)
110                 public void Constructor3 ()
111                 {
112                         MulticastOption option;
113                         IPAddress group;
114                         int interfaceIndex;
115
116                         group = IPAddress.Parse ("239.255.255.250");
117                         interfaceIndex = 0;
118                         option = new MulticastOption (group, interfaceIndex);
119                         Assert.AreSame (group, option.Group, "#A:Group");
120                         Assert.AreEqual (interfaceIndex, option.InterfaceIndex, "#A:InterfaceIndex");
121                         Assert.AreEqual (null, option.LocalAddress, "#A:LocalAddress");
122
123                         group = IPAddress.Parse ("ff02::1");
124                         interfaceIndex = 0;
125                         option = new MulticastOption (group, interfaceIndex);
126                         Assert.AreSame (group, option.Group, "#B:Group");
127                         Assert.AreEqual (interfaceIndex, option.InterfaceIndex, "#B:InterfaceIndex");
128                         Assert.AreEqual (null, option.LocalAddress, "#B:LocalAddress");
129
130                         group = IPAddress.Parse ("239.255.255.250");
131                         interfaceIndex = 124;
132                         option = new MulticastOption (group, interfaceIndex);
133                         Assert.AreSame (group, option.Group, "#C:Group");
134                         Assert.AreEqual (interfaceIndex, option.InterfaceIndex, "#C:InterfaceIndex");
135                         Assert.AreEqual (null, option.LocalAddress, "#C:LocalAddress");
136
137                         group = IPAddress.Parse ("ff02::1");
138                         interfaceIndex = 124;
139                         option = new MulticastOption (group, interfaceIndex);
140                         Assert.AreSame (group, option.Group, "#D:Group");
141                         Assert.AreEqual (interfaceIndex, option.InterfaceIndex, "#D:InterfaceIndex");
142                         Assert.AreEqual (null, option.LocalAddress, "#D:LocalAddress");
143
144                         group = IPAddress.Parse ("239.255.255.250");
145                         interfaceIndex = 0xFFFFFF;
146                         option = new MulticastOption (group, interfaceIndex);
147                         Assert.AreSame (group, option.Group, "#E:Group");
148                         Assert.AreEqual (interfaceIndex, option.InterfaceIndex, "#E:InterfaceIndex");
149                         Assert.AreEqual (null, option.LocalAddress, "#E:LocalAddress");
150
151                         group = IPAddress.Parse ("ff02::1");
152                         interfaceIndex = 0xFFFFFF;
153                         option = new MulticastOption (group, interfaceIndex);
154                         Assert.AreSame (group, option.Group, "#F:Group");
155                         Assert.AreEqual (interfaceIndex, option.InterfaceIndex, "#F:InterfaceIndex");
156                         Assert.AreEqual (null, option.LocalAddress, "#F:LocalAddress");
157                 }
158
159                 [Test] // .ctor (IPAddress, Int32)
160                 public void Constructor3_Group_Null ()
161                 {
162                         IPAddress group = null;
163
164                         try {
165                                 new MulticastOption (group, int.MaxValue);
166                                 Assert.Fail ("#1");
167                         } catch (ArgumentNullException ex) {
168                                 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
169                                 Assert.IsNull (ex.InnerException, "#3");
170                                 Assert.IsNotNull (ex.Message, "#4");
171                                 Assert.AreEqual ("group", ex.ParamName, "#5");
172                         }
173                 }
174
175                 [Test] // .ctor (IPAddress, Int32)
176                 public void Constructor3_InterfaceIndex_OutOfRange ()
177                 {
178                         IPAddress group = IPAddress.Parse ("239.255.255.250");
179
180                         try {
181                                 new MulticastOption (group, -1);
182                                 Assert.Fail ("#A1");
183                         } catch (ArgumentOutOfRangeException ex) {
184                                 // Specified argument was out of the range of valid values
185                                 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2");
186                                 Assert.IsNull (ex.InnerException, "#A3");
187                                 Assert.IsNotNull (ex.Message, "#A4");
188                                 Assert.AreEqual ("interfaceIndex", ex.ParamName, "#A5");
189                         }
190
191                         try {
192                                 new MulticastOption (group, 0x1000000);
193                                 Assert.Fail ("#B1");
194                         } catch (ArgumentOutOfRangeException ex) {
195                                 // Specified argument was out of the range of valid values
196                                 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2");
197                                 Assert.IsNull (ex.InnerException, "#B3");
198                                 Assert.IsNotNull (ex.Message, "#B4");
199                                 Assert.AreEqual ("interfaceIndex", ex.ParamName, "#B5");
200                         }
201                 }
202
203                 [Test]
204                 public void Group ()
205                 {
206                         IPAddress group;
207                         IPAddress local;
208                         MulticastOption option;
209
210                         local = Dns.GetHostEntry (string.Empty).AddressList [0];
211                         group = IPAddress.Parse ("239.255.255.250");
212                         option = new MulticastOption (group, local);
213                         group = IPAddress.Parse ("224.0.0.23");
214                         option.Group = group;
215                         Assert.AreSame (group, option.Group, "#A1");
216                         Assert.AreSame (local, option.LocalAddress, "#A2");
217                         group = IPAddress.Parse ("239.255.255.250");
218                         option.Group = group;
219                         Assert.AreSame (group, option.Group, "#B1");
220                         Assert.AreSame (local, option.LocalAddress, "#B2");
221                         group = IPAddress.Parse ("ff02::1");
222                         option.Group = group;
223                         Assert.AreSame (group, option.Group, "#C1");
224                         Assert.AreSame (local, option.LocalAddress, "#C2");
225                         option.Group = null;
226                         Assert.IsNull (option.Group, "#D1");
227                         Assert.AreSame (local, option.LocalAddress, "#D2");
228                         option = new MulticastOption (group, 5);
229                         group = IPAddress.Parse ("224.0.0.23");
230                         option.Group = group;
231                         Assert.AreSame (group, option.Group, "#E1");
232                         Assert.AreEqual (5, option.InterfaceIndex, "#E2");
233                         Assert.IsNull (option.LocalAddress, "#E3");
234                 }
235
236                 [Test]
237                 public void InterfaceIndex ()
238                 {
239                         IPAddress group;
240                         IPAddress local;
241                         MulticastOption option;
242                 
243                         group = IPAddress.Parse ("239.255.255.250");
244                         option = new MulticastOption (group, 10);
245                         option.InterfaceIndex = 0;
246                         Assert.AreSame (group, option.Group, "#A1");
247                         Assert.AreEqual (0, option.InterfaceIndex, "#A2");
248                         Assert.IsNull (option.LocalAddress, "#A3");
249                         option.InterfaceIndex = 124;
250                         Assert.AreSame (group, option.Group, "#B1");
251                         Assert.AreEqual (124, option.InterfaceIndex, "#B2");
252                         Assert.IsNull (option.LocalAddress, "#B3");
253                         option.InterfaceIndex = 0xFFFFFF;
254                         Assert.AreSame (group, option.Group, "#C1");
255                         Assert.AreEqual (0xFFFFFF, option.InterfaceIndex, "#C2");
256                         Assert.IsNull (option.LocalAddress, "#C3");
257
258                         local = Dns.GetHostEntry (string.Empty).AddressList [0];
259                         option = new MulticastOption (group, local);
260                         option.InterfaceIndex = 10;
261                         Assert.AreSame (group, option.Group, "#D1");
262                         Assert.AreEqual (10, option.InterfaceIndex, "#D2");
263                         Assert.IsNull (option.LocalAddress, "#D3");
264                 }
265
266                 [Test]
267                 public void InterfaceIndex_Value_OutOfRange ()
268                 {
269                         IPAddress group = IPAddress.Parse ("239.255.255.250");
270                         MulticastOption option = new MulticastOption (group, 10);
271
272                         try {
273                                 option.InterfaceIndex = -1;
274                                 Assert.Fail ("#A1");
275                         } catch (ArgumentOutOfRangeException ex) {
276                                 // Specified argument was out of the range of valid values
277                                 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#A2");
278                                 Assert.IsNull (ex.InnerException, "#A3");
279                                 Assert.IsNotNull (ex.Message, "#A4");
280                                 Assert.AreEqual ("value", ex.ParamName, "#A5");
281                         }
282
283                         try {
284                                 option.InterfaceIndex = 0x1000000;
285                                 Assert.Fail ("#B1");
286                         } catch (ArgumentOutOfRangeException ex) {
287                                 // Specified argument was out of the range of valid values
288                                 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#B2");
289                                 Assert.IsNull (ex.InnerException, "#B3");
290                                 Assert.IsNotNull (ex.Message, "#B4");
291                                 Assert.AreEqual ("value", ex.ParamName, "#B5");
292                         }
293
294                         // ensure original value was retained
295                         Assert.AreEqual (10, option.InterfaceIndex, "#C");
296                 }
297
298                 [Test]
299                 public void LocalAddress ()
300                 {
301                         IPAddress group;
302                         IPAddress local;
303                         MulticastOption option;
304
305                         local = Dns.GetHostEntry (string.Empty).AddressList [0];
306                         group = IPAddress.Parse ("239.255.255.250");
307                         option = new MulticastOption (group, local);
308                         local = IPAddress.Loopback;
309                         option.LocalAddress = local;
310                         Assert.AreSame (group, option.Group, "#A1");
311                         Assert.AreEqual (0, option.InterfaceIndex, "#A2");
312                         Assert.AreSame (local, option.LocalAddress, "#A3");
313                         local = Dns.GetHostEntry (string.Empty).AddressList [0];
314                         option.LocalAddress = local;
315                         Assert.AreSame (group, option.Group, "#B1");
316                         Assert.AreEqual (0, option.InterfaceIndex, "#B2");
317                         Assert.AreSame (local, option.LocalAddress, "#B3");
318                         option.LocalAddress = null;
319                         Assert.AreSame (group, option.Group, "#C1");
320                         Assert.AreEqual (0, option.InterfaceIndex, "#C2");
321                         Assert.IsNull (option.LocalAddress, "#C3");
322                         option = new MulticastOption (group, 5);
323                         local = IPAddress.Loopback;
324                         option.LocalAddress = local;
325                         Assert.AreSame (group, option.Group, "#D1");
326                         Assert.AreEqual (0, option.InterfaceIndex, "#D2");
327                         Assert.AreSame (local, option.LocalAddress, "#D3");
328                 }
329         }
330 }