Merge pull request #1057 from lextm/master
[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                 [Category("TargetJvmNotSupported")] // CreationTime not supported for TARGET_JVM
76                 public void CreationTimeFile ()
77                 {
78                         if (Unix)
79                                 Assert.Ignore ("Unix doesn't support CreationTimes");
80
81                         string path = TempFolder + DSC + "FSIT.CreationTime.Test";
82                         DeleteFile (path);
83
84                         try {
85                                 File.Create (path).Close ();
86                                 FileSystemInfo info = new FileInfo (path);
87                                 info.CreationTime = new DateTime (1999, 12, 31, 11, 59, 59);
88
89                                 DateTime time = info.CreationTime;
90                                 Assert.AreEqual (1999, time.Year, "#A1");
91                                 Assert.AreEqual (12, time.Month, "#A2");
92                                 Assert.AreEqual (31, time.Day, "#A3");
93                                 Assert.AreEqual (11, time.Hour, "#A4");
94                                 Assert.AreEqual (59, time.Minute, "#A5");
95                                 Assert.AreEqual (59, time.Second, "#A6");
96                                 
97                                 time = TimeZone.CurrentTimeZone.ToLocalTime (info.CreationTimeUtc);
98                                 Assert.AreEqual (1999, time.Year, "#B1");
99                                 Assert.AreEqual (12, time.Month, "#B2");
100                                 Assert.AreEqual (31, time.Day, "#B3");
101                                 Assert.AreEqual (11, time.Hour, "#B4");
102                                 Assert.AreEqual (59, time.Minute, "#B5");
103                                 Assert.AreEqual (59, time.Second, "#B6");
104                                 
105                                 info.CreationTimeUtc = new DateTime (1999, 12, 31, 11, 59, 59);
106
107                                 time = TimeZone.CurrentTimeZone.ToUniversalTime (info.CreationTime);
108                                 Assert.AreEqual (1999, time.Year, "#C1");
109                                 Assert.AreEqual (12, time.Month, "#C2");
110                                 Assert.AreEqual (31, time.Day, "#C3");
111                                 Assert.AreEqual (11, time.Hour, "#C4");
112                                 Assert.AreEqual (59, time.Minute, "#C5");
113                                 Assert.AreEqual (59, time.Second, "#C6");
114
115                                 time = info.CreationTimeUtc;
116                                 Assert.AreEqual (1999, time.Year, "#D1");
117                                 Assert.AreEqual (12, time.Month, "#D2");
118                                 Assert.AreEqual (31, time.Day, "#D3");
119                                 Assert.AreEqual (11, time.Hour, "#D4");
120                                 Assert.AreEqual (59, time.Minute, "#D5");
121                                 Assert.AreEqual (59, time.Second, "#D6");
122                         } finally {
123                                 DeleteFile (path);
124                         }
125                 }
126
127                 [Test]
128                 [Category("TargetJvmNotSupported")] // CreationTime not supported for TARGET_JVM
129                 public void CreationTimeDirectory ()
130                 {
131                         if (Unix)
132                                 Assert.Ignore ("Unix doesn't support CreationTimes");
133
134                         string path = TempFolder + DSC + "FSIT.CreationTimeDirectory.Test";
135                         DeleteDir (path);
136
137                         try {
138                                 FileSystemInfo info = Directory.CreateDirectory (path);
139                                 info.CreationTime = new DateTime (1999, 12, 31, 11, 59, 59);
140                                 DateTime time = info.CreationTime;
141
142                                 Assert.AreEqual (1999, time.Year, "#A1");
143                                 Assert.AreEqual (12, time.Month, "#A2");
144                                 Assert.AreEqual (31, time.Day, "#A3");
145                                 
146                                 time = TimeZone.CurrentTimeZone.ToLocalTime (info.CreationTimeUtc);
147                                 Assert.AreEqual (1999, time.Year, "#B1");
148                                 Assert.AreEqual (12, time.Month, "#B2");
149                                 Assert.AreEqual (31, time.Day, "#B3");
150                                 Assert.AreEqual (11, time.Hour, "#B4");
151                                 
152                                 info.CreationTimeUtc = new DateTime (1999, 12, 31, 11, 59, 59);
153                                 
154                                 time = TimeZone.CurrentTimeZone.ToUniversalTime (info.CreationTime);
155                                 Assert.AreEqual (1999, time.Year, "#C1");
156                                 Assert.AreEqual (12, time.Month, "#C2");
157                                 Assert.AreEqual (31, time.Day, "#C3");
158                                 
159                                 time = TimeZone.CurrentTimeZone.ToLocalTime (info.CreationTimeUtc);
160                                 Assert.AreEqual (1999, time.Year, "#D1");
161                                 Assert.AreEqual (12, time.Month, "#D2");
162                                 Assert.AreEqual (31, time.Day, "#D3");
163                         } finally {
164                                 DeleteDir (path);
165                         }
166                 }
167                 
168                 [Test]
169                 [Category("TargetJvmNotSupported")] // CreationTime not supported for TARGET_JVM
170                 public void CreationTimeNoFileOrDirectory ()
171                 {
172                         string path = TempFolder + DSC + "FSIT.CreationTimeNoFile.Test";
173                         DeleteFile (path);
174                         DeleteDir (path);
175                         
176                         try {
177                                 FileSystemInfo info = new FileInfo (path);
178                                 
179                                 DateTime time = TimeZone.CurrentTimeZone.ToUniversalTime(info.CreationTime);
180                                 Assert.AreEqual (1601, time.Year, "#A1");
181                                 Assert.AreEqual (1, time.Month, "#A2");
182                                 Assert.AreEqual (1, time.Day, "#A3");
183                                 Assert.AreEqual (0, time.Hour, "#A4");
184                                 Assert.AreEqual (0, time.Minute, "#A5");
185                                 Assert.AreEqual (0, time.Second, "#A6");
186                                 Assert.AreEqual (0, time.Millisecond, "#A7");
187                                 
188                                 info = new DirectoryInfo (path);
189                                 
190                                 time = TimeZone.CurrentTimeZone.ToUniversalTime(info.CreationTime);
191                                 Assert.AreEqual (1601, time.Year, "#B1");
192                                 Assert.AreEqual (1, time.Month, "#B2");
193                                 Assert.AreEqual (1, time.Day, "#B3");
194                                 Assert.AreEqual (0, time.Hour, "#B4");
195                                 Assert.AreEqual (0, time.Minute, "#B5");
196                                 Assert.AreEqual (0, time.Second, "#B6");
197                                 Assert.AreEqual (0, time.Millisecond, "#B7");
198                         } finally {
199                                 DeleteFile (path);
200                                 DeleteDir (path);
201                         }
202                 }
203                 
204                 [Test]
205                 public void Extenssion ()
206                 {
207                         string path = TempFolder + DSC + "FSIT.Extenssion.Test";
208                         DeleteFile (path);
209                         
210                         try {
211                                 FileSystemInfo info = new FileInfo (path);
212                                 Assert.AreEqual (".Test", info.Extension);
213                         } finally {
214                                 DeleteFile (path);
215                         }
216                 }
217                 
218                 [Test]
219                 [Category("TargetJvmNotSupported")] // LastAccessTime not supported for TARGET_JVM
220                 public void DefaultLastAccessTime ()
221                 {
222                         string path = TempFolder + DSC + "FSIT.DefaultLastAccessTime.Test";
223                         DeleteFile (path);
224                         
225                         try {
226                                 FileSystemInfo info = new FileInfo (path);
227                                 DateTime time = TimeZone.CurrentTimeZone.ToUniversalTime(info.LastAccessTime);
228
229                                 Assert.AreEqual (1601, time.Year, "#1");
230                                 Assert.AreEqual (1, time.Month, "#2");
231                                 Assert.AreEqual (1, time.Day, "#3");
232                                 Assert.AreEqual (0, time.Hour, "#4");
233                                 Assert.AreEqual (0, time.Minute, "#5");
234                                 Assert.AreEqual (0, time.Second, "#6");
235                                 Assert.AreEqual (0, time.Millisecond, "#7");
236                         } finally {
237                                 DeleteFile (path);
238                         }
239                 }
240
241                 [Test]
242                 [Category("TargetJvmNotSupported")] // LastAccessTime not supported for TARGET_JVM
243                 public void LastAccessTime ()
244                 {
245                         string path = TempFolder + DSC + "FSIT.LastAccessTime.Test";
246                         DeleteFile (path);
247
248                         try {
249                                 File.Create (path).Close ();
250                                 FileSystemInfo info = new FileInfo (path);
251                                 DateTime time;
252                                 info = new FileInfo (path);
253                                 
254                                 info.LastAccessTime = new DateTime (2000, 1, 1, 1, 1, 1);
255                                 time = info.LastAccessTime;
256                                 Assert.AreEqual (2000, time.Year, "#A1");
257                                 Assert.AreEqual (1, time.Month, "#A2");
258                                 Assert.AreEqual (1, time.Day, "#A3");
259                                 Assert.AreEqual (1, time.Hour, "#A4");
260                                 
261                                 time = TimeZone.CurrentTimeZone.ToLocalTime (info.LastAccessTimeUtc);
262                                 Assert.AreEqual (2000, time.Year, "#B1");
263                                 Assert.AreEqual (1, time.Month, "#B2");
264                                 Assert.AreEqual (1, time.Day, "#B3");
265                                 Assert.AreEqual (1, time.Hour, "#B4");
266                                 
267                                 info.LastAccessTimeUtc = new DateTime (2000, 1, 1, 1, 1, 1);
268                                 time = TimeZone.CurrentTimeZone.ToUniversalTime (info.LastAccessTime);
269                                 Assert.AreEqual (2000, time.Year, "#C1");
270                                 Assert.AreEqual (1, time.Month, "#C2");
271                                 Assert.AreEqual (1, time.Day, "#C3");
272                                 Assert.AreEqual (1, time.Hour, "#C4");
273
274                                 time = info.LastAccessTimeUtc;
275                                 Assert.AreEqual (2000, time.Year, "#D1");
276                                 Assert.AreEqual (1, time.Month, "#D2");
277                                 Assert.AreEqual (1, time.Day, "#D3");
278                                 Assert.AreEqual (1, time.Hour, "#D4");
279                         } finally {
280                                 DeleteFile (path);
281                         }
282                 }
283                 
284                 [Test]
285                 [Category("TargetJvmNotSupported")] // LastAccessTime not supported for TARGET_JVM
286                 public void DefaultLastWriteTime ()
287                 {
288                         string path = TempFolder + DSC + "FSIT.DefaultLastWriteTime.Test";
289                         DeleteDir (path);
290
291                         try {
292
293                                 FileSystemInfo info = new DirectoryInfo (path);
294                                 DateTime time = TimeZone.CurrentTimeZone.ToUniversalTime(info.LastWriteTime);
295
296                                 Assert.AreEqual (1601, time.Year, "#1");
297                                 Assert.AreEqual (1, time.Month, "#2");
298                                 Assert.AreEqual (1, time.Day, "#3");
299                                 Assert.AreEqual (0, time.Hour, "#4");
300                                 Assert.AreEqual (0, time.Minute, "#5");
301                                 Assert.AreEqual (0, time.Second, "#6");
302                                 Assert.AreEqual (0, time.Millisecond, "#7");
303                         } finally {
304                                 DeleteDir (path);
305                         }
306                 }
307                 
308                 [Test]
309                 public void LastWriteTime ()
310                 {
311                         string path = TempFolder + DSC + "FSIT.LastWriteTime.Test";
312                         DeleteDir (path);
313                         
314                         try {
315                                 FileSystemInfo info = Directory.CreateDirectory (path);
316                                 
317                                 info.LastWriteTime = new DateTime (2000, 1, 1, 1, 1, 1);
318                                 DateTime time = info.LastWriteTime;
319
320                                 Assert.AreEqual (2000, time.Year, "#A1");
321                                 Assert.AreEqual (1, time.Month, "#A2");
322                                 Assert.AreEqual (1, time.Day, "#A3");
323                                 Assert.AreEqual (1, time.Hour, "#A4");
324                                 
325                                 time = info.LastWriteTimeUtc.ToLocalTime ();
326                                 Assert.AreEqual (2000, time.Year, "#B1");
327                                 Assert.AreEqual (1, time.Month, "#B2");
328                                 Assert.AreEqual (1, time.Day, "#B3");
329                                 Assert.AreEqual (1, time.Hour, "#B4");
330
331                                 info.LastWriteTimeUtc = new DateTime (2000, 1, 1, 1, 1, 1);
332                                 time = info.LastWriteTimeUtc;
333                                 Assert.AreEqual (2000, time.Year, "#C1");
334                                 Assert.AreEqual (1, time.Month, "#C2");
335                                 Assert.AreEqual (1, time.Day, "#C3");
336                                 Assert.AreEqual (1, time.Hour, "#C4");
337
338                                 time = info.LastWriteTime.ToUniversalTime ();
339                                 Assert.AreEqual (2000, time.Year, "#D1");
340                                 Assert.AreEqual (1, time.Month, "#D2");
341                                 Assert.AreEqual (1, time.Day, "#D3");
342                                 Assert.AreEqual (1, time.Hour, "#D4");
343                         } finally {
344                                 DeleteDir (path);
345                         }
346                 }
347 #if !MOBILE
348                 [Test]
349                 public void Serialization ()
350                 {
351                         string path = TempFolder + DSC + "FSIT.Serialization.Test";
352                         DeleteDir (path);
353
354                         try {
355                                 FileSystemInfo info = Directory.CreateDirectory (path);
356
357                                 SerializationInfo si = new SerializationInfo (
358                                         typeof (FileSystemInfo), new FormatterConverter ());
359                                 info.GetObjectData (si, new StreamingContext ());
360
361                                 Assert.AreEqual (2, si.MemberCount, "#1");
362                                 Assert.AreEqual ("FSIT.Serialization.Test", si.GetString ("OriginalPath"), "#2");
363                                 Assert.AreEqual (path, si.GetString ("FullPath"), "#3");
364                         } finally {
365                                 DeleteDir (path);
366                         }
367                 }
368
369                 [Test]
370                 public void Deserialization ()
371                 {
372                         string path = TempFolder + DSC + "FSIT.Deserialization.Test";
373                         DeleteDir (path);
374
375                         try {
376                                 FileSystemInfo info = Directory.CreateDirectory (path);
377
378                                 MemoryStream ms = new MemoryStream ();
379                                 BinaryFormatter bf = new BinaryFormatter ();
380                                 bf.Serialize (ms, info);
381                                 ms.Position = 0;
382
383                                 FileSystemInfo clone = (FileSystemInfo) bf.Deserialize (ms);
384                                 Assert.AreEqual (clone.FullName, info.FullName);
385                         } finally {
386                                 DeleteDir (path);
387                         }
388                 }
389 #endif
390         }
391 }