Merge pull request #5714 from alexischr/update_bockbuild
[mono.git] / mcs / class / corlib / Test / System.IO / FileSystemInfoTest.cs
1 // FileSystemInfoTest.cs - NUnit Test Cases for System.IO.FileSystemInfo class
2 //
3 // Ville Palo (vi64pa@koti.soon.fi)
4 // 
5 // (C) 2003 Ville Palo
6 // 
7
8 using System;
9 using System.Globalization;
10 using System.IO;
11 using System.Runtime.Serialization;
12 using System.Runtime.Serialization.Formatters.Binary;
13 using System.Threading;
14
15 using NUnit.Framework;
16
17 namespace MonoTests.System.IO
18 {
19         [TestFixture]
20         public class FileSystemInfoTest
21         {
22                 CultureInfo old_culture;
23                 string TempFolder = Path.Combine (Path.GetTempPath (), "MonoTests.System.IO.Tests");
24                 static readonly char DSC = Path.DirectorySeparatorChar;
25
26                 [SetUp]
27                 public void SetUp()
28                 {
29                         if (Directory.Exists (TempFolder))
30                                 Directory.Delete (TempFolder, true);
31                         Directory.CreateDirectory (TempFolder);
32                         old_culture = Thread.CurrentThread.CurrentCulture;
33                         Thread.CurrentThread.CurrentCulture = new CultureInfo ("en-US", false);
34                 }
35
36                 [TearDown]
37                 public void TearDown()
38                 {
39                         if (Directory.Exists (TempFolder))
40                                 Directory.Delete (TempFolder, true);
41                         Thread.CurrentThread.CurrentCulture = old_culture;
42                 }
43                 
44                 bool Windows {
45                         get {
46                                 return Path.DirectorySeparatorChar == '\\';
47                         }
48                 }
49
50                 bool Unix {
51                         get {
52                                 return Path.DirectorySeparatorChar == '/';
53                         }
54                 }
55
56                 bool Mac {
57                         get {
58                                 return Path.DirectorySeparatorChar == ':';
59                         }
60                 }
61
62                 private void DeleteFile (string path)
63                 {
64                         if (File.Exists (path))
65                                 File.Delete (path);
66                 }
67
68                 private void DeleteDir (string path)
69                 {
70                         if (Directory.Exists (path))
71                                 Directory.Delete (path, true);
72                 }
73
74                 [Test]
75                 public void CreationTimeFile ()
76                 {
77                         if (Unix)
78                                 Assert.Ignore ("Unix doesn't support CreationTimes");
79
80                         string path = TempFolder + DSC + "FSIT.CreationTime.Test";
81                         DeleteFile (path);
82
83                         try {
84                                 File.Create (path).Close ();
85                                 FileSystemInfo info = new FileInfo (path);
86                                 info.CreationTime = new DateTime (1999, 12, 31, 11, 59, 59);
87
88                                 DateTime time = info.CreationTime;
89                                 Assert.AreEqual (1999, time.Year, "#A1");
90                                 Assert.AreEqual (12, time.Month, "#A2");
91                                 Assert.AreEqual (31, time.Day, "#A3");
92                                 Assert.AreEqual (11, time.Hour, "#A4");
93                                 Assert.AreEqual (59, time.Minute, "#A5");
94                                 Assert.AreEqual (59, time.Second, "#A6");
95                                 
96                                 time = TimeZone.CurrentTimeZone.ToLocalTime (info.CreationTimeUtc);
97                                 Assert.AreEqual (1999, time.Year, "#B1");
98                                 Assert.AreEqual (12, time.Month, "#B2");
99                                 Assert.AreEqual (31, time.Day, "#B3");
100                                 Assert.AreEqual (11, time.Hour, "#B4");
101                                 Assert.AreEqual (59, time.Minute, "#B5");
102                                 Assert.AreEqual (59, time.Second, "#B6");
103                                 
104                                 info.CreationTimeUtc = new DateTime (1999, 12, 31, 11, 59, 59);
105
106                                 time = TimeZone.CurrentTimeZone.ToUniversalTime (info.CreationTime);
107                                 Assert.AreEqual (1999, time.Year, "#C1");
108                                 Assert.AreEqual (12, time.Month, "#C2");
109                                 Assert.AreEqual (31, time.Day, "#C3");
110                                 Assert.AreEqual (11, time.Hour, "#C4");
111                                 Assert.AreEqual (59, time.Minute, "#C5");
112                                 Assert.AreEqual (59, time.Second, "#C6");
113
114                                 time = info.CreationTimeUtc;
115                                 Assert.AreEqual (1999, time.Year, "#D1");
116                                 Assert.AreEqual (12, time.Month, "#D2");
117                                 Assert.AreEqual (31, time.Day, "#D3");
118                                 Assert.AreEqual (11, time.Hour, "#D4");
119                                 Assert.AreEqual (59, time.Minute, "#D5");
120                                 Assert.AreEqual (59, time.Second, "#D6");
121                         } finally {
122                                 DeleteFile (path);
123                         }
124                 }
125
126                 [Test]
127                 public void CreationTimeDirectory ()
128                 {
129                         if (Unix)
130                                 Assert.Ignore ("Unix doesn't support CreationTimes");
131
132                         string path = TempFolder + DSC + "FSIT.CreationTimeDirectory.Test";
133                         DeleteDir (path);
134
135                         try {
136                                 FileSystemInfo info = Directory.CreateDirectory (path);
137                                 info.CreationTime = new DateTime (1999, 12, 31, 11, 59, 59);
138                                 DateTime time = info.CreationTime;
139
140                                 Assert.AreEqual (1999, time.Year, "#A1");
141                                 Assert.AreEqual (12, time.Month, "#A2");
142                                 Assert.AreEqual (31, time.Day, "#A3");
143                                 
144                                 time = TimeZone.CurrentTimeZone.ToLocalTime (info.CreationTimeUtc);
145                                 Assert.AreEqual (1999, time.Year, "#B1");
146                                 Assert.AreEqual (12, time.Month, "#B2");
147                                 Assert.AreEqual (31, time.Day, "#B3");
148                                 Assert.AreEqual (11, time.Hour, "#B4");
149                                 
150                                 info.CreationTimeUtc = new DateTime (1999, 12, 31, 11, 59, 59);
151                                 
152                                 time = TimeZone.CurrentTimeZone.ToUniversalTime (info.CreationTime);
153                                 Assert.AreEqual (1999, time.Year, "#C1");
154                                 Assert.AreEqual (12, time.Month, "#C2");
155                                 Assert.AreEqual (31, time.Day, "#C3");
156                                 
157                                 time = TimeZone.CurrentTimeZone.ToLocalTime (info.CreationTimeUtc);
158                                 Assert.AreEqual (1999, time.Year, "#D1");
159                                 Assert.AreEqual (12, time.Month, "#D2");
160                                 Assert.AreEqual (31, time.Day, "#D3");
161                         } finally {
162                                 DeleteDir (path);
163                         }
164                 }
165                 
166                 [Test]
167                 public void CreationTimeNoFileOrDirectory ()
168                 {
169                         string path = TempFolder + DSC + "FSIT.CreationTimeNoFile.Test";
170                         DeleteFile (path);
171                         DeleteDir (path);
172                         
173                         try {
174                                 FileSystemInfo info = new FileInfo (path);
175                                 
176                                 DateTime time = TimeZone.CurrentTimeZone.ToUniversalTime(info.CreationTime);
177                                 Assert.AreEqual (1601, time.Year, "#A1");
178                                 Assert.AreEqual (1, time.Month, "#A2");
179                                 Assert.AreEqual (1, time.Day, "#A3");
180                                 Assert.AreEqual (0, time.Hour, "#A4");
181                                 Assert.AreEqual (0, time.Minute, "#A5");
182                                 Assert.AreEqual (0, time.Second, "#A6");
183                                 Assert.AreEqual (0, time.Millisecond, "#A7");
184                                 
185                                 info = new DirectoryInfo (path);
186                                 
187                                 time = TimeZone.CurrentTimeZone.ToUniversalTime(info.CreationTime);
188                                 Assert.AreEqual (1601, time.Year, "#B1");
189                                 Assert.AreEqual (1, time.Month, "#B2");
190                                 Assert.AreEqual (1, time.Day, "#B3");
191                                 Assert.AreEqual (0, time.Hour, "#B4");
192                                 Assert.AreEqual (0, time.Minute, "#B5");
193                                 Assert.AreEqual (0, time.Second, "#B6");
194                                 Assert.AreEqual (0, time.Millisecond, "#B7");
195                         } finally {
196                                 DeleteFile (path);
197                                 DeleteDir (path);
198                         }
199                 }
200                 
201                 [Test]
202                 public void Extenssion ()
203                 {
204                         string path = TempFolder + DSC + "FSIT.Extenssion.Test";
205                         DeleteFile (path);
206                         
207                         try {
208                                 FileSystemInfo info = new FileInfo (path);
209                                 Assert.AreEqual (".Test", info.Extension);
210                         } finally {
211                                 DeleteFile (path);
212                         }
213                 }
214                 
215                 [Test]
216                 public void DefaultLastAccessTime ()
217                 {
218                         string path = TempFolder + DSC + "FSIT.DefaultLastAccessTime.Test";
219                         DeleteFile (path);
220                         
221                         try {
222                                 FileSystemInfo info = new FileInfo (path);
223                                 DateTime time = TimeZone.CurrentTimeZone.ToUniversalTime(info.LastAccessTime);
224
225                                 Assert.AreEqual (1601, time.Year, "#1");
226                                 Assert.AreEqual (1, time.Month, "#2");
227                                 Assert.AreEqual (1, time.Day, "#3");
228                                 Assert.AreEqual (0, time.Hour, "#4");
229                                 Assert.AreEqual (0, time.Minute, "#5");
230                                 Assert.AreEqual (0, time.Second, "#6");
231                                 Assert.AreEqual (0, time.Millisecond, "#7");
232                         } finally {
233                                 DeleteFile (path);
234                         }
235                 }
236
237                 [Test]
238                 public void LastAccessTime ()
239                 {
240                         string path = TempFolder + DSC + "FSIT.LastAccessTime.Test";
241                         DeleteFile (path);
242
243                         try {
244                                 File.Create (path).Close ();
245                                 FileSystemInfo info = new FileInfo (path);
246                                 DateTime time;
247                                 info = new FileInfo (path);
248                                 
249                                 info.LastAccessTime = new DateTime (2000, 1, 1, 1, 1, 1);
250                                 time = info.LastAccessTime;
251                                 Assert.AreEqual (2000, time.Year, "#A1");
252                                 Assert.AreEqual (1, time.Month, "#A2");
253                                 Assert.AreEqual (1, time.Day, "#A3");
254                                 Assert.AreEqual (1, time.Hour, "#A4");
255                                 
256                                 time = TimeZone.CurrentTimeZone.ToLocalTime (info.LastAccessTimeUtc);
257                                 Assert.AreEqual (2000, time.Year, "#B1");
258                                 Assert.AreEqual (1, time.Month, "#B2");
259                                 Assert.AreEqual (1, time.Day, "#B3");
260                                 Assert.AreEqual (1, time.Hour, "#B4");
261                                 
262                                 info.LastAccessTimeUtc = new DateTime (2000, 1, 1, 1, 1, 1);
263                                 time = TimeZone.CurrentTimeZone.ToUniversalTime (info.LastAccessTime);
264                                 Assert.AreEqual (2000, time.Year, "#C1");
265                                 Assert.AreEqual (1, time.Month, "#C2");
266                                 Assert.AreEqual (1, time.Day, "#C3");
267                                 Assert.AreEqual (1, time.Hour, "#C4");
268
269                                 time = info.LastAccessTimeUtc;
270                                 Assert.AreEqual (2000, time.Year, "#D1");
271                                 Assert.AreEqual (1, time.Month, "#D2");
272                                 Assert.AreEqual (1, time.Day, "#D3");
273                                 Assert.AreEqual (1, time.Hour, "#D4");
274                         } finally {
275                                 DeleteFile (path);
276                         }
277                 }
278                 
279                 [Test]
280                 public void DefaultLastWriteTime ()
281                 {
282                         string path = TempFolder + DSC + "FSIT.DefaultLastWriteTime.Test";
283                         DeleteDir (path);
284
285                         try {
286
287                                 FileSystemInfo info = new DirectoryInfo (path);
288                                 DateTime time = TimeZone.CurrentTimeZone.ToUniversalTime(info.LastWriteTime);
289
290                                 Assert.AreEqual (1601, time.Year, "#1");
291                                 Assert.AreEqual (1, time.Month, "#2");
292                                 Assert.AreEqual (1, time.Day, "#3");
293                                 Assert.AreEqual (0, time.Hour, "#4");
294                                 Assert.AreEqual (0, time.Minute, "#5");
295                                 Assert.AreEqual (0, time.Second, "#6");
296                                 Assert.AreEqual (0, time.Millisecond, "#7");
297                         } finally {
298                                 DeleteDir (path);
299                         }
300                 }
301                 
302                 [Test]
303                 public void LastWriteTime ()
304                 {
305                         string path = TempFolder + DSC + "FSIT.LastWriteTime.Test";
306                         DeleteDir (path);
307                         
308                         try {
309                                 FileSystemInfo info = Directory.CreateDirectory (path);
310                                 
311                                 info.LastWriteTime = new DateTime (2000, 1, 1, 1, 1, 1);
312                                 DateTime time = info.LastWriteTime;
313
314                                 Assert.AreEqual (2000, time.Year, "#A1");
315                                 Assert.AreEqual (1, time.Month, "#A2");
316                                 Assert.AreEqual (1, time.Day, "#A3");
317                                 Assert.AreEqual (1, time.Hour, "#A4");
318                                 
319                                 time = info.LastWriteTimeUtc.ToLocalTime ();
320                                 Assert.AreEqual (2000, time.Year, "#B1");
321                                 Assert.AreEqual (1, time.Month, "#B2");
322                                 Assert.AreEqual (1, time.Day, "#B3");
323                                 Assert.AreEqual (1, time.Hour, "#B4");
324
325                                 info.LastWriteTimeUtc = new DateTime (2000, 1, 1, 1, 1, 1);
326                                 time = info.LastWriteTimeUtc;
327                                 Assert.AreEqual (2000, time.Year, "#C1");
328                                 Assert.AreEqual (1, time.Month, "#C2");
329                                 Assert.AreEqual (1, time.Day, "#C3");
330                                 Assert.AreEqual (1, time.Hour, "#C4");
331
332                                 time = info.LastWriteTime.ToUniversalTime ();
333                                 Assert.AreEqual (2000, time.Year, "#D1");
334                                 Assert.AreEqual (1, time.Month, "#D2");
335                                 Assert.AreEqual (1, time.Day, "#D3");
336                                 Assert.AreEqual (1, time.Hour, "#D4");
337                         } finally {
338                                 DeleteDir (path);
339                         }
340                 }
341 #if !MOBILE
342                 [Test]
343                 public void Serialization ()
344                 {
345                         string path = TempFolder + DSC + "FSIT.Serialization.Test";
346                         DeleteDir (path);
347
348                         try {
349                                 FileSystemInfo info = Directory.CreateDirectory (path);
350
351                                 SerializationInfo si = new SerializationInfo (
352                                         typeof (FileSystemInfo), new FormatterConverter ());
353                                 info.GetObjectData (si, new StreamingContext ());
354
355                                 Assert.AreEqual (2, si.MemberCount, "#1");
356                                 Assert.AreEqual ("FSIT.Serialization.Test", si.GetString ("OriginalPath"), "#2");
357                                 Assert.AreEqual (path, si.GetString ("FullPath"), "#3");
358                         } finally {
359                                 DeleteDir (path);
360                         }
361                 }
362
363                 [Test]
364                 public void Deserialization ()
365                 {
366                         string path = TempFolder + DSC + "FSIT.Deserialization.Test";
367                         DeleteDir (path);
368
369                         try {
370                                 FileSystemInfo info = Directory.CreateDirectory (path);
371
372                                 MemoryStream ms = new MemoryStream ();
373                                 BinaryFormatter bf = new BinaryFormatter ();
374                                 bf.Serialize (ms, info);
375                                 ms.Position = 0;
376
377                                 FileSystemInfo clone = (FileSystemInfo) bf.Deserialize (ms);
378                                 Assert.AreEqual (clone.FullName, info.FullName);
379                         } finally {
380                                 DeleteDir (path);
381                         }
382                 }
383 #endif
384         }
385 }