2 // System.Web.HttpCookieTest.cs - Unit tests for System.Web.HttpCookie
5 // Chris Toshok <toshok@novell.com>
7 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
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:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
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.
31 using System.Runtime.Serialization.Formatters.Binary;
34 using NUnit.Framework;
36 namespace MonoTests.System.Web {
39 public class HttpCookieTest {
42 public void DefaultProperties ()
44 HttpCookie cookie = new HttpCookie ("cookie");
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");
57 public void DefaultValueProperties ()
59 HttpCookie cookie = new HttpCookie ("cookie", "value");
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");
66 /* make sure HasKeys is still false for single valued cookies */
67 Assert.IsFalse (cookie.HasKeys);
70 [Test (Description="Bug #553063")]
71 public void CookieValuesSerialization ()
73 BinaryFormatter bf = new BinaryFormatter();
74 HttpCookie c = new HttpCookie ("stuff", "value1");
76 using (var ms = new MemoryStream()) {
77 bf.Serialize(ms, c.Values);
78 ms.Seek(0, SeekOrigin.Begin);
83 public void PropertySetters ()
85 /* test the setters for settle Properties */
86 HttpCookie cookie = new HttpCookie ("name");
88 cookie.Domain = "novell.com";
89 Assert.AreEqual ("novell.com", cookie.Domain, "Domain setter");
91 DateTime dt = DateTime.Now;
93 Assert.AreEqual (dt, cookie.Expires, "Expires setter");
95 cookie.Path = "/example/path";
96 Assert.AreEqual ("/example/path", cookie.Path, "Path setter");
99 Assert.IsTrue (cookie.Secure, "Secure setter");
103 public void MultiValued1 ()
105 HttpCookie cookie = new HttpCookie ("name1", "value1");
106 cookie ["name2"] = "value2";
108 Assert.IsTrue (cookie.HasKeys, "multi valued HasKeys");
110 Assert.AreEqual (2, cookie.Values.Count, "Values.Count");
112 Assert.AreEqual ("value1&name2=value2", cookie.Value, "Value getter");
113 Assert.AreEqual ("value1&name2=value2", cookie.Values.ToString(), "Values getter");
117 public void SubkeysOnly ()
119 HttpCookie cookie = new HttpCookie ("name1");
120 cookie ["name2"] = "value2";
121 cookie ["name3"] = "value3";
123 Assert.IsTrue (cookie.HasKeys, "multi valued HasKeys");
125 Assert.AreEqual (2, cookie.Values.Count, "Values.Count");
127 Assert.AreEqual ("name2=value2&name3=value3", cookie.Value, "Value getter");
128 Assert.AreEqual ("name2=value2&name3=value3", cookie.Values.ToString(), "Values getter");
132 public void ResettingValue1 ()
134 HttpCookie cookie = new HttpCookie ("name1", "value1");
135 cookie.Value = "value2";
137 Assert.AreEqual ("value2", cookie.Value, "Value getter");
138 Assert.AreEqual ("value2", cookie.Values.ToString(), "Values getter");
140 /* make sure HasKeys is still false for single valued cookies */
141 Assert.IsFalse (cookie.HasKeys);
145 public void ResettingValue2 ()
147 HttpCookie cookie = new HttpCookie ("name1", "value1");
149 cookie["name2"] = "value2";
150 cookie["name3"] = "value3";
152 cookie.Value = "value1";
154 Assert.AreEqual ("value1", cookie.Value, "Value getter");
155 Assert.AreEqual ("value1", cookie.Values.ToString(), "Values getter");
157 /* make sure HasKeys is back to false */
158 Assert.IsFalse (cookie.HasKeys);
162 public void MultiValuedSet1 ()
164 HttpCookie cookie = new HttpCookie ("name1", "value1&name2=value2");
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");
174 public void MultiValuedSet2 ()
176 HttpCookie cookie = new HttpCookie ("name1", "value1&name2=value2&name2=value3");
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");
186 public void MultiUnnamedSet ()
188 HttpCookie cookie = new HttpCookie ("name1", "value1&name2=value2&value3");
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");
198 public void NullSetter ()
200 HttpCookie cookie = new HttpCookie ("name1");
202 cookie.Values[null] = "value1";
203 Assert.AreEqual ("value1", cookie.Values.ToString(), "Values getter");
204 Assert.AreEqual ("value1", cookie.Value, "Value getter");
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");
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");
228 public void Encode ()
230 // make sure there's no encoding done on values
231 HttpCookie cookie = new HttpCookie ("cookie");
232 cookie["name"] = "val&ue";
234 Assert.AreEqual ("val&ue", cookie["name"], "name getter");
235 Assert.AreEqual ("name=val&ue", cookie.Value, "Value getter");
239 public void SetSecure ()
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");
249 public void ToStringTest ()
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");
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");
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");
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");
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");
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");
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");
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");
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");
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");
411 public void HttpOnly ()
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");