Merge pull request #1936 from esdrubal/DotNetRelativeOrAbsolute
[mono.git] / mcs / class / System.Web / Test / System.Web / HttpCookieTest.cs
1 //
2 // System.Web.HttpCookieTest.cs - Unit tests for System.Web.HttpCookie
3 //
4 // Author:
5 //      Chris Toshok  <toshok@novell.com>
6 //
7 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
8 //
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
16 // 
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 // 
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 //
28
29 using System;
30 using System.IO;
31 using System.Runtime.Serialization.Formatters.Binary;
32 using System.Web;
33
34 using NUnit.Framework;
35
36 namespace MonoTests.System.Web {
37
38         [TestFixture]
39         public class HttpCookieTest {
40
41                 [Test]
42                 public void DefaultProperties ()
43                 {
44                         HttpCookie cookie = new HttpCookie ("cookie");
45
46                         Assert.IsNull   (cookie.Domain, "default cookie.Domain");
47                         Assert.AreEqual (new DateTime(), cookie.Expires, "default cookie.Expires");
48                         Assert.IsFalse  (cookie.HasKeys, "default cookie.HasKeys");
49                         Assert.AreEqual ("cookie", cookie.Name, "default cookie.Name");
50                         Assert.AreEqual ("/", cookie.Path, "default cookie.Path");
51                         Assert.IsFalse  (cookie.Secure, "default cookie.Secure");
52                         Assert.AreEqual ("", cookie.Value, "default cookie.Value");
53                         Assert.AreEqual ("", cookie.Values.ToString(), "default cookie.Values");
54                 }
55
56                 [Test]
57                 public void DefaultValueProperties ()
58                 {
59                         HttpCookie cookie = new HttpCookie ("cookie", "value");
60
61                         Assert.AreEqual ("value", cookie.Value, "Value getter");
62                         Assert.AreEqual ("value", cookie.Values[null], "Values[null] getter");
63                         Assert.AreEqual ("value", cookie[null], "cookie[null] getter");
64                         Assert.AreEqual ("value", cookie.Values.ToString(), "Values getter");
65
66                         /* make sure HasKeys is still false for single valued cookies */
67                         Assert.IsFalse (cookie.HasKeys);
68                 }
69
70                 [Test (Description="Bug #553063")]
71                 public void CookieValuesSerialization ()
72                 {
73                         BinaryFormatter bf = new BinaryFormatter();
74                         HttpCookie c = new HttpCookie ("stuff", "value1");
75                 
76                         using (var ms = new MemoryStream()) {
77                                 bf.Serialize(ms, c.Values);
78                                 ms.Seek(0, SeekOrigin.Begin);
79                         }
80                 }
81                 
82                 [Test]
83                 public void PropertySetters ()
84                 {
85                         /* test the setters for settle Properties */
86                         HttpCookie cookie = new HttpCookie ("name");
87
88                         cookie.Domain = "novell.com";
89                         Assert.AreEqual ("novell.com", cookie.Domain, "Domain setter");
90
91                         DateTime dt = DateTime.Now;
92                         cookie.Expires = dt;
93                         Assert.AreEqual (dt, cookie.Expires, "Expires setter");
94
95                         cookie.Path = "/example/path";
96                         Assert.AreEqual ("/example/path", cookie.Path, "Path setter");
97
98                         cookie.Secure = true;
99                         Assert.IsTrue (cookie.Secure, "Secure setter");
100                 }
101
102                 [Test]
103                 public void MultiValued1 ()
104                 {
105                         HttpCookie cookie = new HttpCookie ("name1", "value1");
106                         cookie ["name2"] = "value2";
107
108                         Assert.IsTrue (cookie.HasKeys, "multi valued HasKeys");
109
110                         Assert.AreEqual (2, cookie.Values.Count, "Values.Count");
111
112                         Assert.AreEqual ("value1&name2=value2", cookie.Value, "Value getter");
113                         Assert.AreEqual ("value1&name2=value2", cookie.Values.ToString(), "Values getter");
114                 }
115
116                 [Test]
117                 public void SubkeysOnly ()
118                 {
119                         HttpCookie cookie = new HttpCookie ("name1");
120                         cookie ["name2"] = "value2";
121                         cookie ["name3"] = "value3";
122
123                         Assert.IsTrue (cookie.HasKeys, "multi valued HasKeys");
124
125                         Assert.AreEqual (2, cookie.Values.Count, "Values.Count");
126
127                         Assert.AreEqual ("name2=value2&name3=value3", cookie.Value, "Value getter");
128                         Assert.AreEqual ("name2=value2&name3=value3", cookie.Values.ToString(), "Values getter");
129                 }
130
131                 [Test]
132                 public void ResettingValue1 ()
133                 {
134                         HttpCookie cookie = new HttpCookie ("name1", "value1");
135                         cookie.Value = "value2";
136
137                         Assert.AreEqual ("value2", cookie.Value, "Value getter");
138                         Assert.AreEqual ("value2", cookie.Values.ToString(), "Values getter");
139
140                         /* make sure HasKeys is still false for single valued cookies */
141                         Assert.IsFalse (cookie.HasKeys);
142                 }
143
144                 [Test]
145                 public void ResettingValue2 ()
146                 {
147                         HttpCookie cookie = new HttpCookie ("name1", "value1");
148
149                         cookie["name2"] = "value2";
150                         cookie["name3"] = "value3";
151
152                         cookie.Value = "value1";
153
154                         Assert.AreEqual ("value1", cookie.Value, "Value getter");
155                         Assert.AreEqual ("value1", cookie.Values.ToString(), "Values getter");
156
157                         /* make sure HasKeys is back to false */
158                         Assert.IsFalse (cookie.HasKeys);
159                 }
160
161                 [Test]
162                 public void MultiValuedSet1 ()
163                 {
164                         HttpCookie cookie = new HttpCookie ("name1", "value1&name2=value2");
165
166                         Assert.IsTrue (cookie.HasKeys, "MultiValuedSet");
167                         Assert.AreEqual ("value1&name2=value2", cookie.Value, "cookie.Value");
168                         Assert.AreEqual ("value1", cookie.Values[null], "Values[null] getter");
169                         Assert.AreEqual ("value1", cookie[null], "cookie[null] getter");
170                         Assert.AreEqual ("value2", cookie ["name2"], "name2 getter");
171                 }
172
173                 [Test]
174                 public void MultiValuedSet2 ()
175                 {
176                         HttpCookie cookie = new HttpCookie ("name1", "value1&name2=value2&name2=value3");
177
178                         Assert.IsTrue (cookie.HasKeys, "MultiValuedSet");
179                         Assert.AreEqual ("value1&name2=value2&name2=value3", cookie.Value, "cookie.Value");
180                         Assert.AreEqual ("value1", cookie.Values[null], "Values[null] getter");
181                         Assert.AreEqual ("value1", cookie[null], "cookie[null] getter");
182                         Assert.AreEqual ("value2,value3", cookie ["name2"], "name2 getter");
183                 }
184
185                 [Test]
186                 public void MultiUnnamedSet ()
187                 {
188                         HttpCookie cookie = new HttpCookie ("name1", "value1&name2=value2&value3");
189
190                         Assert.IsTrue (cookie.HasKeys, "MultiUnnamedSet");
191                         Assert.AreEqual ("value1&value3&name2=value2", cookie.Value, "cookie.Value");
192                         Assert.AreEqual ("value1,value3", cookie.Values[null], "Values[null] getter");
193                         Assert.AreEqual ("value1,value3", cookie[null], "Values[null] getter");
194                         Assert.AreEqual ("value2", cookie ["name2"], "name2 getter");
195                 }
196
197                 [Test]
198                 public void NullSetter ()
199                 {
200                         HttpCookie cookie = new HttpCookie ("name1");
201
202                         cookie.Values[null] = "value1";
203                         Assert.AreEqual ("value1", cookie.Values.ToString(), "Values getter");
204                         Assert.AreEqual ("value1", cookie.Value, "Value getter");
205         
206                         // This strikes me as odd behavior..  We fail
207                         // this test presently, but I'm not sure if
208                         // it's because of a bug in
209                         // NameValueCollection.  If NVC doesn't
210                         // normally have the behavior of clearing the
211                         // collection when setting this[null], we can
212                         // override the behavior in our cookie
213                         // specific subclass.
214                         cookie.Value = "value1&name2=value2&value3";
215                         cookie[null] = "value1";
216                         Assert.AreEqual ("value1", cookie.Values.ToString(), "Values getter");
217                         Assert.AreEqual ("value1", cookie.Value, "Value getter");
218                         
219                         // try the same test above, but circumvent the
220                         // HttpCookie.item property.
221                         cookie.Value = "value1&name2=value2&value3";
222                         cookie.Values[null] = "value1";
223                         Assert.AreEqual ("value1", cookie.Values.ToString(), "Values getter");
224                         Assert.AreEqual ("value1", cookie.Value, "Value getter");
225                 }
226
227                 [Test]
228                 public void Encode ()
229                 {
230                         // make sure there's no encoding done on values
231                         HttpCookie cookie = new HttpCookie ("cookie");
232                         cookie["name"] = "val&ue";
233
234                         Assert.AreEqual ("val&ue", cookie["name"], "name getter");
235                         Assert.AreEqual ("name=val&ue", cookie.Value, "Value getter");
236                 }
237
238                 [Test]
239                 public void SetSecure ()
240                 {
241                         HttpCookie cookie = new HttpCookie ("cookie", "hola");
242                         cookie.Secure = true;
243                         Assert.IsTrue (cookie.Secure, "#01");
244                         cookie.Secure = false;
245                         Assert.IsFalse (cookie.Secure, "#02");
246                 }
247
248                 [Test] // bug #81333
249                 public void ToStringTest ()
250                 {
251                         HttpCookie cookie;
252
253                         cookie = new HttpCookie ("cookie1", "this x=y is the & first = cookie");
254                         Assert.AreEqual ("System.Web.HttpCookie", cookie.ToString (), "#A1");
255                         Assert.AreEqual ("this x=y is the & first = cookie", cookie.Value, "#A2");
256                         Assert.AreEqual (2, cookie.Values.Count, "#A3");
257                         Assert.AreEqual ("this x", cookie.Values.GetKey (0), "#A4");
258                         Assert.AreEqual ("y is the ", cookie.Values.Get (0), "#A5");
259                         Assert.AreEqual (" first ", cookie.Values.GetKey (1), "#A6");
260                         Assert.AreEqual (" cookie", cookie.Values.Get (1), "#A7");
261                         Assert.AreEqual ("this+x=y+is+the+&+first+=+cookie",
262                                 cookie.Values.ToString (), "#A8");
263
264                         cookie = new HttpCookie ("cookie11", cookie.Values.ToString ());
265                         Assert.AreEqual ("System.Web.HttpCookie", cookie.ToString (), "#B1");
266                         Assert.AreEqual ("this+x=y+is+the+&+first+=+cookie", cookie.Value, "#B2");
267                         Assert.AreEqual (2, cookie.Values.Count, "#B3");
268                         Assert.AreEqual ("this+x", cookie.Values.GetKey (0), "#B4");
269                         Assert.AreEqual ("y+is+the+", cookie.Values.Get (0), "#B5");
270                         Assert.AreEqual ("+first+", cookie.Values.GetKey (1), "#B6");
271                         Assert.AreEqual ("+cookie", cookie.Values.Get (1), "#B7");
272                         Assert.AreEqual ("this%2bx=y%2bis%2bthe%2b&%2bfirst%2b=%2bcookie",
273                                 cookie.Values.ToString (), "#B8");
274
275                         cookie = new HttpCookie ("cookie2");
276                         cookie.Values ["first"] = "hell=o = y";
277                         cookie.Values ["second"] = "the&re";
278                         cookie.Values ["third"] = "three";
279                         cookie.Values ["three-a"] = null;
280                         cookie.Values ["fourth"] = "last value";
281                         Assert.AreEqual ("System.Web.HttpCookie", cookie.ToString (), "#C1");
282                         Assert.AreEqual ("first=hell=o = y&second=the&re&third=three&three"
283                                 + "-a=&fourth=last value", cookie.Value, "#C2");
284                         Assert.AreEqual (5, cookie.Values.Count, "#C3");
285                         Assert.AreEqual ("first", cookie.Values.GetKey (0), "#C4");
286                         Assert.AreEqual ("hell=o = y", cookie.Values.Get (0), "#C5");
287                         Assert.AreEqual ("second", cookie.Values.GetKey (1), "#C6");
288                         Assert.AreEqual ("the&re", cookie.Values.Get (1), "#C7");
289                         Assert.AreEqual ("third", cookie.Values.GetKey (2), "#C8");
290                         Assert.AreEqual ("three", cookie.Values.Get (2), "#C9");
291                         Assert.AreEqual ("three-a", cookie.Values.GetKey (3), "#C10");
292                         Assert.IsNull (cookie.Values.Get (3), "#C11");
293                         Assert.AreEqual ("fourth", cookie.Values.GetKey (4), "#C12");
294                         Assert.AreEqual ("last value", cookie.Values.Get (4), "#C13");
295                         Assert.AreEqual ("first=hell%3do+%3d+y&second=the%26re&third=three"
296                                 + "&three-a=&fourth=last+value", cookie.Values.ToString (), "#C14");
297
298                         cookie = new HttpCookie ("cookie21", cookie.Values.ToString ());
299                         Assert.AreEqual ("System.Web.HttpCookie", cookie.ToString (), "#D1");
300                         Assert.AreEqual ("first=hell%3do+%3d+y&second=the%26re&third=three"
301                                 + "&three-a=&fourth=last+value", cookie.Value, "#D2");
302                         Assert.AreEqual (5, cookie.Values.Count, "#D3");
303                         Assert.AreEqual ("first", cookie.Values.GetKey (0), "#D4");
304                         Assert.AreEqual ("hell%3do+%3d+y", cookie.Values.Get (0), "#D5");
305                         Assert.AreEqual ("second", cookie.Values.GetKey (1), "#D6");
306                         Assert.AreEqual ("the%26re", cookie.Values.Get (1), "#D7");
307                         Assert.AreEqual ("third", cookie.Values.GetKey (2), "#D8");
308                         Assert.AreEqual ("three", cookie.Values.Get (2), "#D9");
309                         Assert.AreEqual ("three-a", cookie.Values.GetKey (3), "#D10");
310                         Assert.AreEqual ("three-a", cookie.Values.GetKey (3), "#D11");
311                         Assert.AreEqual ("fourth", cookie.Values.GetKey (4), "#D12");
312                         Assert.AreEqual ("last+value", cookie.Values.Get (4), "#D13");
313                         Assert.AreEqual ("first=hell%253do%2b%253d%2by&second=the%2526re&"
314                                 + "third=three&three-a=&fourth=last%2bvalue",
315                                 cookie.Values.ToString (), "#D14");
316
317                         cookie = new HttpCookie ("cookie3", "this is & the x=y third = cookie");
318                         cookie.Values ["first"] = "hel&l=o =y";
319                         cookie.Values ["second"] = "there";
320                         Assert.AreEqual ("System.Web.HttpCookie", cookie.ToString (), "#E1");
321                         Assert.AreEqual ("this is & the x=y third = cookie&first=hel&l=o =y"
322                                 + "&second=there", cookie.Value, "#E2");
323                         Assert.AreEqual (4, cookie.Values.Count, "#E3");
324                         Assert.IsNull (cookie.Values.GetKey (0), "#E4");
325                         Assert.AreEqual ("this is ", cookie.Values.Get (0), "#E5");
326                         Assert.AreEqual (" the x", cookie.Values.GetKey (1), "#E6");
327                         Assert.AreEqual ("y third = cookie", cookie.Values.Get (1), "#E7");
328                         Assert.AreEqual ("first", cookie.Values.GetKey (2), "#E8");
329                         Assert.AreEqual ("hel&l=o =y", cookie.Values.Get (2), "#E9");
330                         Assert.AreEqual ("second", cookie.Values.GetKey (3), "#E10");
331                         Assert.AreEqual ("there", cookie.Values.Get (3), "#E11");
332                         Assert.AreEqual ("this+is+&+the+x=y+third+%3d+cookie&first=hel%26l"
333                                 + "%3do+%3dy&second=there", cookie.Values.ToString (), "#E12");
334
335                         cookie = new HttpCookie ("cookie31", cookie.Values.ToString ());
336                         Assert.AreEqual ("System.Web.HttpCookie", cookie.ToString (), "#F1");
337                         Assert.AreEqual ("this+is+&+the+x=y+third+%3d+cookie&first=hel%26l"
338                                 + "%3do+%3dy&second=there", cookie.Value, "#F2");
339                         Assert.AreEqual (4, cookie.Values.Count, "#F3");
340                         Assert.IsNull (cookie.Values.GetKey (0), "#F4");
341                         Assert.AreEqual ("this+is+", cookie.Values.Get (0), "#F5");
342                         Assert.AreEqual ("+the+x", cookie.Values.GetKey (1), "#F6");
343                         Assert.AreEqual ("y+third+%3d+cookie", cookie.Values.Get (1), "#F7");
344                         Assert.AreEqual ("first", cookie.Values.GetKey (2), "#F8");
345                         Assert.AreEqual ("hel%26l%3do+%3dy", cookie.Values.Get (2), "#F9");
346                         Assert.AreEqual ("second", cookie.Values.GetKey (3), "#F10");
347                         Assert.AreEqual ("there", cookie.Values.Get (3), "#F11");
348                         Assert.AreEqual ("this%2bis%2b&%2bthe%2bx=y%2bthird%2b%253d%2bcookie"
349                                 + "&first=hel%2526l%253do%2b%253dy&second=there",
350                                 cookie.Values.ToString (), "#F12");
351
352                         cookie = new HttpCookie ("funkycookie", "`~!@#$%^&*()_+-=\\][{}|'\";:,<.>/?");
353                         Assert.AreEqual ("System.Web.HttpCookie", cookie.ToString (), "#G1");
354                         Assert.AreEqual ("`~!@#$%^&*()_+-=\\][{}|'\";:,<.>/?", cookie.Value, "#G2");
355                         Assert.AreEqual (2, cookie.Values.Count, "#G3");
356                         Assert.IsNull (cookie.Values.GetKey (0), "#G4");
357                         Assert.AreEqual ("`~!@#$%^", cookie.Values.Get (0), "#G5");
358                         Assert.AreEqual ("*()_+-", cookie.Values.GetKey (1), "#G6");
359                         Assert.AreEqual ("\\][{}|'\";:,<.>/?", cookie.Values.Get (1), "#G7");
360                         Assert.AreEqual ("%60%7e!%40%23%24%25%5e&*()_%2b-=%5c%5d%5b%7b%7d"
361                                 + "%7c%27%22%3b%3a%2c%3c.%3e%2f%3f", cookie.Values.ToString (), "#G8");
362
363                         cookie = new HttpCookie ("funkycookie11", cookie.Values.ToString ());
364                         Assert.AreEqual ("System.Web.HttpCookie", cookie.ToString (), "#H1");
365                         Assert.AreEqual ("%60%7e!%40%23%24%25%5e&*()_%2b-=%5c%5d%5b%7b%7d"
366                                 + "%7c%27%22%3b%3a%2c%3c.%3e%2f%3f", cookie.Value, "#H2");
367                         Assert.AreEqual (2, cookie.Values.Count, "#H3");
368                         Assert.IsNull (cookie.Values.GetKey (0), "#H4");
369                         Assert.AreEqual ("%60%7e!%40%23%24%25%5e", cookie.Values.Get (0), "#H5");
370                         Assert.AreEqual ("*()_%2b-", cookie.Values.GetKey (1), "#H6");
371                         Assert.AreEqual ("%5c%5d%5b%7b%7d%7c%27%22%3b%3a%2c%3c.%3e%2f%3f",
372                                 cookie.Values.Get (1), "#H7");
373                         Assert.AreEqual ("%2560%257e!%2540%2523%2524%2525%255e&*()_%252b-="
374                                 + "%255c%255d%255b%257b%257d%257c%2527%2522%253b%253a%252c%253c.%2"
375                                 + "53e%252f%253f", cookie.Values.ToString (), "#H8");
376
377                         cookie = new HttpCookie ("basic");
378                         cookie.Values ["one"] = "hello world";
379                         cookie.Values ["two"] = "a^2 + b^2 = c^2";
380                         cookie.Values ["three"] = "a & b";
381                         Assert.AreEqual ("System.Web.HttpCookie", cookie.ToString (), "#I1");
382                         Assert.AreEqual ("one=hello world&two=a^2 + b^2 = c^2&three=a & b",
383                                 cookie.Value, "#I2");
384                         Assert.AreEqual (3, cookie.Values.Count, "#I3");
385                         Assert.AreEqual ("one", cookie.Values.GetKey (0), "#I4");
386                         Assert.AreEqual ("hello world", cookie.Values.Get (0), "#I5");
387                         Assert.AreEqual ("two", cookie.Values.GetKey (1), "#I6");
388                         Assert.AreEqual ("a^2 + b^2 = c^2", cookie.Values.Get (1), "#I7");
389                         Assert.AreEqual ("three", cookie.Values.GetKey (2), "#I8");
390                         Assert.AreEqual ("a & b", cookie.Values.Get (2), "#I9");
391                         Assert.AreEqual ("one=hello+world&two=a%5e2+%2b+b%5e2+%3d+c%5e2&"
392                                 + "three=a+%26+b", cookie.Values.ToString (), "#I10");
393
394                         HttpCookie cookie2 = new HttpCookie ("basic2");
395                         cookie2.Value = cookie.Values.ToString ();
396                         Assert.AreEqual ("System.Web.HttpCookie", cookie2.ToString (), "#J1");
397                         Assert.AreEqual ("one=hello+world&two=a%5e2+%2b+b%5e2+%3d+c%5e2&"
398                                 + "three=a+%26+b", cookie2.Value, "#J2");
399                         Assert.AreEqual (3, cookie2.Values.Count, "#J3");
400                         Assert.AreEqual ("one", cookie.Values.GetKey (0), "#J4");
401                         Assert.AreEqual ("hello world", cookie.Values.Get (0), "#J5");
402                         Assert.AreEqual ("two", cookie.Values.GetKey (1), "#J6");
403                         Assert.AreEqual ("a^2 + b^2 = c^2", cookie.Values.Get (1), "#J7");
404                         Assert.AreEqual ("three", cookie.Values.GetKey (2), "#J8");
405                         Assert.AreEqual ("a & b", cookie.Values.Get (2), "#J9");
406                         Assert.AreEqual ("one=hello%2bworld&two=a%255e2%2b%252b%2bb%255e2"
407                                 + "%2b%253d%2bc%255e2&three=a%2b%2526%2bb",
408                                 cookie2.Values.ToString (), "#J10");
409                 }
410                 [Test]
411                 public void HttpOnly ()
412                 {
413                         HttpCookie biscuit = new HttpCookie ("mium");
414                         Assert.IsFalse (biscuit.HttpOnly, "default");
415                         biscuit.HttpOnly = true;
416                         Assert.IsTrue (biscuit.HttpOnly, "true");
417                         biscuit.HttpOnly = false;
418                         Assert.IsFalse (biscuit.HttpOnly, "false");
419                 }
420         }
421 }