Transaction now has limited support for PromotableSinglePhaseEnlistment
[mono.git] / mcs / class / System / Test / System.Net / CookieParserTest.cs
1 using System;
2 using System.IO;
3 using System.Threading;
4 using System.Globalization;
5 using System.Net;
6 using System.Net.Sockets;
7 using NUnit.Framework;
8
9 namespace MonoTests.System.Net
10 {
11         [TestFixture]
12         public class CookieParserTest
13         {
14                 public const string A = "Foo=Bar, expires=World; expires=Sat, 11-Oct-14 22:45:19 GMT, A=B";
15                 public const string B = "A=B=C, expires=Sat, 99-Dec-01 01:00:00 XDT; Hello=World, Foo=Bar";
16                 // Only the invariant culture is allowed.
17                 public const string C = "Foo=Bar, expires=Montag, 21. Juni 2012 23:11:45";
18                 // Only comma serves as separation character.
19                 public const string D = "A=B, C=D; E=F, G=H";
20                 public const string E = "A; C; expires=Tue, 25-Jun-19 00:51:34 GMT, E=F";
21                 public const string F = "Foo = \" A, B\"C D, E=F";
22
23                 CookieCollection DoRequest (string header)
24                 {
25                         HttpWebResponse res;
26                         using (var listener = new Listener ("Set-Cookie: " + header)) {
27                                 var req = (HttpWebRequest)HttpWebRequest.Create (listener.URI);
28                                 req.CookieContainer = new CookieContainer ();
29                                 req.Method = "POST";
30                                 res = (HttpWebResponse)req.GetResponse ();
31                         }
32
33                         Assert.AreEqual (header, res.Headers.Get ("Set-Cookie"));
34                         return res.Cookies;
35                 }
36
37                 void AssertCookie (Cookie cookie, string name, string value, long ticks)
38                 {
39                         AssertCookie (cookie, name, value);
40                         Assert.AreEqual (ticks, cookie.Expires.ToUniversalTime ().Ticks);
41                 }
42
43                 void AssertCookie (Cookie cookie, string name, string value)
44                 {
45                         Assert.AreEqual (name, cookie.Name);
46                         Assert.AreEqual (value, cookie.Value);
47                 }
48
49                 [Test]
50                 public void TestDate ()
51                 {
52                         var d1 = "Sat, 11-Oct-14 22:45:19 GMT";
53                         var d2 = "Tue, 25-Jun-19 00:51:34 GMT";
54
55                         var format = "ddd, dd'-'MMM'-'yy HH':'mm':'ss 'GMT'";
56                         var p1 = DateTime.ParseExact (d1, format, CultureInfo.InvariantCulture);
57                         p1 = DateTime.SpecifyKind (p1, DateTimeKind.Utc);
58
59                         Assert.AreEqual ("10/11/2014 22:45:19", p1.ToString ("G", CultureInfo.InvariantCulture));
60                         Assert.AreEqual (p1.Ticks, p1.ToUniversalTime ().Ticks);
61                         Assert.AreEqual (635486643190000000, p1.Ticks);
62
63                         var p2 = DateTime.ParseExact (d2, format, CultureInfo.InvariantCulture);
64                         p2 = DateTime.SpecifyKind (p2, DateTimeKind.Utc);
65                         Assert.AreEqual ("06/25/2019 00:51:34", p2.ToString ("G", CultureInfo.InvariantCulture));
66                         Assert.AreEqual (p2.Ticks, p2.ToUniversalTime ().Ticks);
67                         Assert.AreEqual (636970206940000000, p2.Ticks);
68                 }
69
70                 [Test]
71                 public void TestExpires ()
72                 {
73                         var cookies = DoRequest (A);
74                         Assert.AreEqual (3, cookies.Count);
75                         AssertCookie (cookies [0], "Foo", "Bar", 0);
76                         AssertCookie (cookies [1], "expires", "World", 635486643190000000);
77                         AssertCookie (cookies [2], "A", "B", 0);
78                 }
79
80                 [Test]
81                 public void TestInvalidCookie ()
82                 {
83                         var cookies = DoRequest (B);
84                         Assert.AreEqual (3, cookies.Count);
85                         AssertCookie (cookies [0], "A", "B=C");
86                         AssertCookie (cookies [1], "expires", "Sat");
87                         AssertCookie (cookies [2], "Foo", "Bar");
88                 }
89
90                 [Test]
91                 public void TestLocalCulture ()
92                 {
93                         var old = Thread.CurrentThread.CurrentCulture;
94                         try {
95                                 var culture = new CultureInfo ("de-DE");
96                                 Thread.CurrentThread.CurrentCulture = culture;
97
98                                 var cookies = DoRequest (C);
99                                 Assert.AreEqual (2, cookies.Count);
100                                 AssertCookie (cookies [0], "Foo", "Bar");
101                                 AssertCookie (cookies [1], "expires", "Montag");
102                         } finally {
103                                 Thread.CurrentThread.CurrentCulture = old;
104                         }
105                 }
106
107                 [Test]
108                 public void TestMultiple ()
109                 {
110                         var cookies = DoRequest (D);
111                         Assert.AreEqual (3, cookies.Count);
112                         AssertCookie (cookies [0], "A", "B");
113                         AssertCookie (cookies [1], "C", "D");
114                         AssertCookie (cookies [2], "G", "H");
115                 }
116
117                 [Test]
118                 public void TestMultiple2 ()
119                 {
120                         var cookies = DoRequest (E);
121                         Assert.AreEqual (2, cookies.Count);
122                         AssertCookie (cookies [0], "A", string.Empty, 636970206940000000);
123                         AssertCookie (cookies [1], "E", "F");
124                 }
125
126                 [Test]
127                 public void TestQuotation ()
128                 {
129                         var cookies = DoRequest (F);
130                         Assert.AreEqual (2, cookies.Count);
131                         AssertCookie (cookies [0], "Foo", "\" A, B\"");
132                         AssertCookie (cookies [1], "E", "F");
133                 }
134
135                 public class Listener : IDisposable
136                 {
137                         Socket socket;
138                         string[] headers;
139
140                         public Listener (params string[] headers)
141                         {
142                                 this.headers = headers;
143                                 Start ();
144                         }
145
146                         void Start ()
147                         {
148                                 socket = new Socket (
149                                         AddressFamily.InterNetwork, SocketType.Stream,
150                                         ProtocolType.Tcp);
151                                 socket.Bind (new IPEndPoint (IPAddress.Loopback, 0));
152                                 socket.Listen (1);
153                                 socket.BeginAccept ((result) => {
154                                         var accepted = socket.EndAccept (result);
155                                         HandleRequest (accepted);
156                                 }, null);
157                         }
158
159                         public void Dispose ()
160                         {
161                                 if (socket != null) {
162                                         socket.Close ();
163                                         socket = null;
164                                 }
165                         }
166
167                         void HandleRequest (Socket accepted)
168                         {
169                                 using (var stream = new NetworkStream (accepted)) {
170                                         using (var writer = new StreamWriter (stream)) {
171                                                 writer.WriteLine ("HTTP/1.1 200 OK");
172                                                 writer.WriteLine ("Content-Type: text/plain");
173                                                 foreach (var header in headers)
174                                                         writer.WriteLine (header);
175                                                 writer.WriteLine ();
176                                                 writer.WriteLine ("HELLO");
177                                         }
178                                 }
179                         }
180
181                         public EndPoint EndPoint {
182                                 get { return socket.LocalEndPoint; }
183                         }
184
185                         public string URI {
186                                 get { return string.Format ("http://{0}/", EndPoint); }
187                         }
188                 }
189         }
190 }