Merge pull request #1322 from StephenMcConnel/bug23532
[mono.git] / mcs / class / System.Net.Http / Test / System.Net.Http.Headers / ContentDispositionHeaderValueTest.cs
1 //
2 // ContentDispositionHeaderValueTest.cs
3 //
4 // Authors:
5 //      Marek Safar  <marek.safar@gmail.com>
6 //
7 // Copyright (C) 2012 Xamarin Inc (http://www.xamarin.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.Collections;
31 using System.Collections.Generic;
32 using NUnit.Framework;
33 using System.Net.Http.Headers;
34 using System.Linq;
35
36 namespace MonoTests.System.Net.Http.Headers
37 {
38         [TestFixture]
39         public class ContentDispositionHeaderValueTest
40         {
41                 [Test]
42                 public void Ctor_InvalidArguments ()
43                 {
44                         try {
45                                 new ContentDispositionHeaderValue (null);
46                                 Assert.Fail ("#1");
47                         } catch (ArgumentException) {
48                         }
49
50                         try {
51                                 new ContentDispositionHeaderValue ("  ");
52                                 Assert.Fail ("#2");
53                         } catch (FormatException) {
54                         }
55                 }
56
57                 [Test]
58                 /*
59                  * .NET BUG
60                  * 
61                  * Test Case Failures:
62                  * 1) MonoTests.System.Net.Http.Headers.ContentDispositionHeaderValueTest.Equals : System.NullReferenceException : Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
63                  * bei System.Net.Http.Headers.ContentDispositionHeaderValue.set_Size(Nullable`1 value)
64                  * bei MonoTests.System.Net.Http.Headers.ContentDispositionHeaderValueTest.Equals()
65                  * 
66                  */
67                 [Category ("NotDotNet")]
68                 public void Equals ()
69                 {
70                         var value = new ContentDispositionHeaderValue ("x");
71                         Assert.AreEqual (value, new ContentDispositionHeaderValue ("x"), "#1");
72                         Assert.AreNotEqual (value, new ContentDispositionHeaderValue ("y"), "#2");
73
74                         value = new ContentDispositionHeaderValue ("attachment");
75                         value.Parameters.Add (new NameValueHeaderValue ("size", "66"));
76
77                         Assert.AreEqual (value, new ContentDispositionHeaderValue ("attachment") { Size = 66 }, "#3");
78                         Assert.AreNotEqual (value, new ContentDispositionHeaderValue ("attachment"), "#4");
79                         Assert.AreNotEqual (value, new ContentDispositionHeaderValue ("attachment") { FileName="g" }, "#5");
80                 }
81
82                 [Test]
83                 public void Parse ()
84                 {
85                         var res = ContentDispositionHeaderValue.Parse ("attachment");
86                         Assert.AreEqual ("attachment", res.DispositionType, "#1");
87                         Assert.AreEqual ("attachment", res.ToString (), "#2");
88
89                         res = ContentDispositionHeaderValue.Parse ("attachmen;filename=foo;size=44;  name=n2; filename*=UTF-8''Na%C3%AFve%20file.txt; creation-date=\"Wed, 02 Oct 2002 15:00:00 +0200\";modification-date=\"Wed, 02 Oct 2002 13:00:00 GMT\";read-date=\"Wed, 02 Oct 2002 15:00:00 +0000\";other=1");
90                         Assert.AreEqual (new DateTimeOffset (2002, 10, 2, 15, 0, 0, TimeSpan.FromHours (2)), res.CreationDate, "#10");
91                         Assert.AreEqual ("attachmen", res.DispositionType, "#11");
92                         Assert.AreEqual ("foo", res.FileName, "#12");
93                         Assert.AreEqual ("Naïve file.txt", res.FileNameStar, "#13");
94                         Assert.AreEqual (new DateTimeOffset (2002, 10, 2, 13, 0, 0, TimeSpan.Zero), res.ModificationDate, "#14");
95                         Assert.AreEqual ("n2", res.Name, "#15");
96                         Assert.AreEqual (8, res.Parameters.Count, "#16");
97                         Assert.AreEqual (new DateTimeOffset (2002, 10, 2, 15, 0, 0, TimeSpan.Zero), res.ReadDate, "#17");
98                         Assert.AreEqual (44, res.Size, "#18");
99                         Assert.AreEqual ("attachmen; filename=foo; size=44; name=n2; filename*=UTF-8''Na%C3%AFve%20file.txt; creation-date=\"Wed, 02 Oct 2002 15:00:00 +0200\"; modification-date=\"Wed, 02 Oct 2002 13:00:00 GMT\"; read-date=\"Wed, 02 Oct 2002 15:00:00 +0000\"; other=1", res.ToString (), "#19");
100
101                         res = ContentDispositionHeaderValue.Parse ("attachment; filename='foo.bar'");
102                         Assert.AreEqual ("attachment", res.DispositionType, "#21");
103                         Assert.AreEqual ("'foo.bar'", res.FileName, "#22");
104                         Assert.AreEqual ("attachment; filename='foo.bar'", res.ToString (), "#23");
105
106                         ContentDispositionHeaderValue.Parse ("aa;size=a4");
107
108                         res = ContentDispositionHeaderValue.Parse ("att;filename=\"=?utf-8?B?xI0=?=\"");
109                         Assert.AreEqual ("č", res.FileName, "#31");
110                         Assert.IsNull (res.FileNameStar, "#32");
111
112                         res = ContentDispositionHeaderValue.Parse ("att;filename=\"=?utf-?B?xI0=?=\"");
113                         Assert.AreEqual ("\"=?utf-?B?xI0=?=\"", res.FileName, "#41");
114
115                         res = ContentDispositionHeaderValue.Parse ("att;filename=\"=?utf-16?b?xI0=?=\"");
116                         Assert.AreEqual ("跄", res.FileName, "#51");
117
118                         res = ContentDispositionHeaderValue.Parse ("att;filename=\"=?utf-8?B?x/I0=?=\"");
119                         Assert.AreEqual ("\"=?utf-8?B?x/I0=?=\"", res.FileName, "#61");
120
121                         res = ContentDispositionHeaderValue.Parse ("att;filename*=utf-8''%C4%8Eas");
122                         Assert.AreEqual ("Ďas", res.FileNameStar, "#71");
123
124                         res = ContentDispositionHeaderValue.Parse ("att;filename*=btf-8''%C4%8E");
125                         Assert.IsNull (res.FileNameStar, "#72");
126
127                         res = ContentDispositionHeaderValue.Parse ("att;filename*=utf-8''%T4%8O%");
128                         Assert.AreEqual ("%T4%8O%", res.FileNameStar, "#73");
129                 }
130
131                 [Test]
132                 public void Parse_Invalid ()
133                 {
134                         try {
135                                 ContentDispositionHeaderValue.Parse (null);
136                                 Assert.Fail ("#1");
137                         } catch (FormatException) {
138                         }
139
140                         try {
141                                 ContentDispositionHeaderValue.Parse ("  ");
142                                 Assert.Fail ("#2");
143                         } catch (FormatException) {
144                         }
145
146                         try {
147                                 ContentDispositionHeaderValue.Parse ("attachment; filename=foo.html ;");
148                                 Assert.Fail ("#3");
149                         } catch (FormatException) {
150                         }
151
152                         try {
153                                 ContentDispositionHeaderValue.Parse ("attachment; filename=foo bar.html");
154                                 Assert.Fail ("#4");
155                         } catch (FormatException) {
156                         }
157
158                         try {
159                                 ContentDispositionHeaderValue.Parse ("\"attachment\"");
160                                 Assert.Fail ("#5");
161                         } catch (FormatException) {
162                         }
163
164                         try {
165                                 ContentDispositionHeaderValue.Parse ("att;filename*=utf-8''%T4%8╗");
166                                 Assert.Fail ("#6");
167                         } catch (FormatException) {
168                         }
169                 }
170
171                 [Test]
172                 public void Properties ()
173                 {
174                         var value = new ContentDispositionHeaderValue ("ttt");
175                         Assert.IsNull (value.CreationDate, "#1");
176                         Assert.AreEqual ("ttt", value.DispositionType, "#2");
177                         Assert.IsNull (value.FileName, "#3");
178                         Assert.IsNull (value.FileNameStar, "#4");
179                         Assert.IsNull (value.ModificationDate, "#5");
180                         Assert.IsNull (value.Name, "#6");
181                         Assert.AreEqual (0, value.Parameters.Count, "#7");
182                         Assert.IsNull (value.ReadDate, "#8");
183                         Assert.IsNull (value.Size, "#9");
184
185                         value.Parameters.Add (new NameValueHeaderValue ("creation-date", "\"20 Jun 82 11:34:11\""));
186                         value.Parameters.Add (new NameValueHeaderValue ("filename", "g*"));
187                         value.Parameters.Add (new NameValueHeaderValue ("filename*", "ag*"));
188                         value.Parameters.Add (new NameValueHeaderValue ("modification-date", "\"20 Jun 22 4:6:22\""));
189                         value.Parameters.Add (new NameValueHeaderValue ("name", "nnn"));
190                         value.Parameters.Add (new NameValueHeaderValue ("read-date", "\"1 Jun 01 1:1:1\""));
191                         value.Parameters.Add (new NameValueHeaderValue ("size", "5"));
192
193                         Assert.AreEqual (new DateTimeOffset (1982, 6, 20, 11, 34, 11, TimeSpan.Zero), value.CreationDate, "#11");
194                         Assert.AreEqual ("g*", value.FileName, "#12");
195                         Assert.IsNull (value.FileNameStar, "#13");
196                         Assert.AreEqual (new DateTimeOffset (2022, 6, 20, 4, 6, 22, TimeSpan.Zero), value.ModificationDate, "#14");
197                         Assert.AreEqual ("nnn", value.Name, "#15");
198                         Assert.AreEqual (new DateTimeOffset (2001, 6, 1, 1, 1, 1, TimeSpan.Zero), value.ReadDate, "#16");
199                         Assert.AreEqual (5, value.Size, "#17");
200                 }
201
202                 [Test]
203                 public void Properties_FileName ()
204                 {
205                         var value = new ContentDispositionHeaderValue ("a");
206
207                         value.FileName = "aa";
208                         Assert.AreEqual ("aa", value.FileName, "#1");
209                         Assert.AreEqual (new NameValueHeaderValue ("filename", "aa"), value.Parameters.First (), "#2");
210
211                         value.FileName = "č";
212                         Assert.AreEqual ("č", value.FileName, "#11");
213                         Assert.AreEqual (new NameValueHeaderValue ("filename", "\"=?utf-8?B?xI0=?=\""), value.Parameters.First (), "#12");
214
215                         value.FileName = "(@)";
216                         Assert.AreEqual ("\"(@)\"", value.FileName, "#21");
217                         Assert.AreEqual (new NameValueHeaderValue ("filename", "\"(@)\""), value.Parameters.First (), "#22");
218
219                         value.FileName = "\"č\"";
220                         Assert.AreEqual ("č", value.FileName, "#31");
221                         Assert.AreEqual (new NameValueHeaderValue ("filename", "\"=?utf-8?B?xI0=?=\""), value.Parameters.First (), "#32");
222
223                         value.FileName = "\"quoted\"";
224                         Assert.AreEqual ("\"quoted\"", value.FileName, "#41");
225                         Assert.AreEqual (new NameValueHeaderValue ("filename", "\"quoted\""), value.Parameters.First (), "#42");
226
227                         value.FileName = "~";
228                         Assert.AreEqual ("~", value.FileName, "#51");
229                         Assert.AreEqual (new NameValueHeaderValue ("filename", "~"), value.Parameters.First (), "#52");
230
231                         value.FileName = "\x7f";
232                         Assert.AreEqual ("\"\x7f\"", value.FileName, "#61");
233                         Assert.AreEqual (new NameValueHeaderValue ("filename", "\"\x7f\""), value.Parameters.First (), "#62");
234                 }
235
236                 [Test]
237                 public void Properties_FileNameStar ()
238                 {
239                         var value = new ContentDispositionHeaderValue ("a");
240
241                         value.FileNameStar = "aa";
242                         Assert.AreEqual ("aa", value.FileNameStar, "#1");
243                         Assert.AreEqual (new NameValueHeaderValue ("filename*", "utf-8''aa"), value.Parameters.First (), "#2");
244
245                         value.FileNameStar = "č";
246                         Assert.AreEqual ("č", value.FileNameStar, "#11");
247                         Assert.AreEqual (new NameValueHeaderValue ("filename*", "utf-8''%C4%8D"), value.Parameters.First (), "#12");
248
249                         value.FileNameStar = "@x*\\%?.txt";
250                         Assert.AreEqual ("@x*\\%?.txt", value.FileNameStar, "#21");
251                         Assert.AreEqual (new NameValueHeaderValue ("filename*", "utf-8''%40x%2A%5C%25%3F.txt"), value.Parameters.First (), "#22");
252                 }
253
254                 [Test]
255                 public void Properties_Name ()
256                 {
257                         var value = new ContentDispositionHeaderValue ("a");
258
259                         value.Name = "aa";
260                         Assert.AreEqual ("aa", value.Name, "#1");
261                         Assert.AreEqual (new NameValueHeaderValue ("name", "aa"), value.Parameters.First (), "#2");
262
263                         value.Name = "č";
264                         Assert.AreEqual ("č", value.Name, "#11");
265                         Assert.AreEqual (new NameValueHeaderValue ("name", "\"=?utf-8?B?xI0=?=\""), value.Parameters.First (), "#12");
266
267                         value.Name = "(@)";
268                         Assert.AreEqual ("\"(@)\"", value.Name, "#21");
269                         Assert.AreEqual (new NameValueHeaderValue ("name", "\"(@)\""), value.Parameters.First (), "#22");
270
271                         value.Name = "\"č\"";
272                         Assert.AreEqual ("č", value.Name, "#31");
273                         Assert.AreEqual (new NameValueHeaderValue ("name", "\"=?utf-8?B?xI0=?=\""), value.Parameters.First (), "#32");
274
275                         value.Name = "\"quoted\"";
276                         Assert.AreEqual ("\"quoted\"", value.Name, "#41");
277                         Assert.AreEqual (new NameValueHeaderValue ("name", "\"quoted\""), value.Parameters.First (), "#42");
278                 }
279
280                 [Test]
281                 public void Properties_ModificationDate ()
282                 {
283                         var value = new ContentDispositionHeaderValue ("a");
284
285                         value.ModificationDate = new DateTimeOffset (2010, 12, 30, 22, 34, 2, TimeSpan.Zero); //.FromHours (-3));
286                         Assert.AreEqual (new DateTimeOffset (2010, 12, 30, 22, 34, 2, TimeSpan.Zero), value.ModificationDate, "#1");
287                         Assert.AreEqual (new NameValueHeaderValue ("modification-date", "\"Thu, 30 Dec 2010 22:34:02 GMT\""), value.Parameters.First (), "#2");
288                 }
289
290                 [Test]
291                 public void Properties_Invalid ()
292                 {
293                         var value = new ContentDispositionHeaderValue ("a");
294                         try {
295                                 value.Size = -9;
296                                 Assert.Fail ("#1");
297                         } catch (ArgumentOutOfRangeException) {
298                         }
299                 }
300
301                 [Test]
302                 public void TryParse ()
303                 {
304                         ContentDispositionHeaderValue res;
305                         Assert.IsTrue (ContentDispositionHeaderValue.TryParse ("attachment; filename*0*=ISO-8859-15''euro-sign%3d%a4; filename*=ISO-8859-1''currency-sign%3d%a4", out res), "#1");
306                         Assert.AreEqual ("attachment", res.DispositionType, "#2");
307                         Assert.AreEqual ("currency-sign=¤", res.FileNameStar, "#3");
308                 }
309
310                 [Test]
311                 public void TryParse_Invalid ()
312                 {
313                         ContentDispositionHeaderValue res;
314                         Assert.IsFalse (ContentDispositionHeaderValue.TryParse ("", out res), "#1");
315                         Assert.IsNull (res, "#2");
316                 }
317         }
318 }