[System.IO.Compression.FileSystem] Fixed date time when creating Zip entries from...
[mono.git] / mcs / class / WindowsBase / Test / System.IO.Packaging / PackageTest.cs
1 // Permission is hereby granted, free of charge, to any person obtaining\r
2 // a copy of this software and associated documentation files (the\r
3 // "Software"), to deal in the Software without restriction, including\r
4 // without limitation the rights to use, copy, modify, merge, publish,\r
5 // distribute, sublicense, and/or sell copies of the Software, and to\r
6 // permit persons to whom the Software is furnished to do so, subject to\r
7 // the following conditions:\r
8 // \r
9 // The above copyright notice and this permission notice shall be\r
10 // included in all copies or substantial portions of the Software.\r
11 // \r
12 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
13 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
14 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
15 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
16 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
17 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
18 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
19 //\r
20 // Copyright (c) 2008 Novell, Inc. (http://www.novell.com)\r
21 //\r
22 // Authors:\r
23 //    Alan McGovern (amcgovern@novell.com)\r
24 //\r
25 \r
26 \r
27 using System;\r
28 using System.Collections.Generic;\r
29 using System.IO;\r
30 using System.IO.Packaging;\r
31 using System.Linq;\r
32 using System.Text;\r
33 using NUnit.Framework;\r
34 \r
35 namespace MonoTests.System.IO.Packaging {\r
36 \r
37     [TestFixture]\r
38     public class PackageTest : TestBase {\r
39 \r
40         //static void Main (string [] args)\r
41         //{\r
42         //    PackageTest t = new PackageTest ();\r
43         //    t.FixtureSetup ();\r
44         //    t.Setup ();\r
45         //    t.RelationshipPartGetStream ();\r
46         //}\r
47         string path = "test.package";\r
48 \r
49         public override void Setup ()\r
50         {\r
51             if (File.Exists (path))\r
52                 File.Delete (path);\r
53         }\r
54 \r
55         public override void TearDown ()\r
56         {\r
57             try {\r
58                 if (package != null)\r
59                     package.Close ();\r
60             } catch {\r
61                 // FIXME: This shouldn't be required when i implement this\r
62             }\r
63             if (File.Exists (path))\r
64                 File.Delete (path);\r
65         }\r
66 \r
67         [Test]\r
68         public void CheckContentFile ()\r
69         {\r
70             MemoryStream stream = new MemoryStream ();\r
71             package = Package.Open (stream, FileMode.Create, FileAccess.ReadWrite);\r
72             package.CreatePart (uris[0], "custom/type");\r
73             package.CreateRelationship (uris[1], TargetMode.External, "relType");\r
74 \r
75             package.Close ();\r
76             package = Package.Open (new MemoryStream (stream.ToArray ()), FileMode.Open, FileAccess.ReadWrite);\r
77             package.Close ();\r
78             package = Package.Open (new MemoryStream (stream.ToArray ()), FileMode.Open, FileAccess.ReadWrite);\r
79 \r
80             Assert.AreEqual (2, package.GetParts ().Count (), "#1");\r
81             Assert.AreEqual (1, package.GetRelationships ().Count (), "#2");\r
82         }\r
83 \r
84         [Test]\r
85         [ExpectedException (typeof (FileFormatException))]\r
86         public void CorruptStream ()\r
87         {\r
88             stream = new FakeStream (true, true, true);\r
89             stream.Write (new byte [1024], 0, 1024);\r
90             package = Package.Open (stream);\r
91         }\r
92 \r
93         [Test]\r
94         [ExpectedException (typeof (NotSupportedException))]\r
95         public void FileShareReadWrite ()\r
96         {\r
97             package = Package.Open (path, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);\r
98         }\r
99 \r
100         [Test]\r
101         [ExpectedException (typeof (FileNotFoundException))]\r
102         public void OpenNonExistantPath ()\r
103         {\r
104             package = Package.Open (path, FileMode.Open);\r
105         }\r
106 \r
107         [Test]\r
108         public void NonExistantPath ()\r
109         {\r
110             package = Package.Open (path);\r
111         }\r
112 \r
113         [Test]\r
114         public void PreExistingPath ()\r
115         {\r
116             package = Package.Open (path);\r
117             package.Close ();\r
118             package = Package.Open (path);\r
119         }\r
120                 \r
121                 [Test]\r
122                 public void Close_FileStreamNotClosed ()\r
123                 {\r
124                         using (var stream = new FileStream (path, FileMode.OpenOrCreate, FileAccess.ReadWrite)) {\r
125                                 var package = Package.Open (stream, FileMode.OpenOrCreate);\r
126                                 package.CreatePart (uris [0], contentType);\r
127                                 package.Close ();\r
128                                 stream.Read (new byte [1024], 0, 1024);\r
129                         }\r
130                 }\r
131                 \r
132                 [Test]\r
133                 public void Close_MemoryStreamNotClosed ()\r
134                 {\r
135                         using (var stream = new MemoryStream ()) {\r
136                                 var package = Package.Open (stream, FileMode.OpenOrCreate);\r
137                                 package.CreatePart (uris [0], contentType);\r
138                                 package.Close ();\r
139                                 stream.Read (new byte [1024], 0, 1024);\r
140                         }\r
141                 }\r
142                 \r
143                 [Test]\r
144                 public void Close_Twice ()\r
145                 {\r
146                         var package = Package.Open (new MemoryStream (), FileMode.OpenOrCreate);\r
147                         package.Close ();\r
148                         package.Close ();\r
149                 }\r
150                 \r
151                 [Test]\r
152                 public void Dispose_Twice ()\r
153                 {\r
154                         var package = Package.Open (new MemoryStream (), FileMode.OpenOrCreate);\r
155                         ((IDisposable) package).Dispose ();\r
156                         ((IDisposable) package).Dispose ();\r
157                 }\r
158                 \r
159         [Test]\r
160         public void CreatePath ()\r
161         {\r
162             package = Package.Open (path, FileMode.Create);\r
163             Assert.AreEqual (FileAccess.ReadWrite, package.FileOpenAccess, "#1");\r
164         }\r
165 \r
166         [Test]\r
167         [ExpectedException (typeof (ArgumentException))]\r
168         public void CreatePathReadonly ()\r
169         {\r
170             package = Package.Open (path, FileMode.Create, FileAccess.Read);\r
171             package.Close ();\r
172         }\r
173 \r
174         [Test]\r
175         public void CreatePathTwice ()\r
176         {\r
177             package = Package.Open (path, FileMode.Create);\r
178             package.Close ();\r
179             package = Package.Open (path, FileMode.Open);\r
180             Assert.AreEqual (FileAccess.ReadWrite, package.FileOpenAccess);\r
181         }\r
182 \r
183         [Test]\r
184         public void OpenPackageMultipleTimes ()\r
185         {\r
186             var filename = Path.GetTempFileName ();\r
187             try {\r
188                 using (var file = File.Open (filename, FileMode.OpenOrCreate)) {\r
189                     var package = Package.Open (file, FileMode.OpenOrCreate);\r
190                     var part = package.CreatePart (new Uri ("/test", UriKind.Relative), "test/type");\r
191                     using (var stream = part.GetStream ())\r
192                         stream.Write (new byte [1024 * 1024], 0, 1024 * 1024);\r
193                     package.Close ();\r
194                 }\r
195                 \r
196                 for (int i = 0; i < 10; i++) {\r
197                     using (var file = File.Open (filename, FileMode.OpenOrCreate))\r
198                     using (var package = Package.Open (file)) {\r
199                         package.GetParts ();\r
200                         package.GetRelationships ();\r
201                     }\r
202                 }\r
203             } finally {\r
204                 if (File.Exists (filename))\r
205                     File.Delete (filename);\r
206             }\r
207         }\r
208         \r
209         [Test]\r
210         public void OpenPathReadonly ()\r
211         {\r
212             package = Package.Open (path, FileMode.Create);\r
213             package.CreatePart (uris[0], contentType);\r
214             package.CreateRelationship (uris[1], TargetMode.External, "relType");\r
215             package.Close ();\r
216             package = Package.Open (path, FileMode.Open, FileAccess.Read);\r
217             Assert.AreEqual (2, package.GetParts ().Count (), "#1");\r
218             Assert.AreEqual (1, package.GetRelationships ().Count (), "#2");\r
219             Assert.AreEqual (FileAccess.Read, package.FileOpenAccess, "Should be read access");\r
220             try {\r
221                 package.CreatePart (uris [0], contentType);\r
222                 Assert.Fail ("Cannot modify a read-only package");\r
223             } catch (IOException) {\r
224 \r
225             }\r
226 \r
227             try {\r
228                 package.CreateRelationship (uris [0], TargetMode.Internal, contentType);\r
229                 Assert.Fail ("Cannot modify a read-only package");\r
230             } catch (IOException) {\r
231 \r
232             }\r
233 \r
234             try {\r
235                 package.DeletePart (uris [0]);\r
236                 Assert.Fail ("Cannot modify a read-only package");\r
237             } catch (IOException) {\r
238 \r
239             }\r
240 \r
241             try {\r
242                 package.DeleteRelationship (contentType);\r
243                 Assert.Fail ("Cannot modify a read-only package");\r
244             } catch (IOException) {\r
245 \r
246             }\r
247         }\r
248 \r
249         [Test]\r
250         [ExpectedException (typeof (ArgumentException))]\r
251         public void ReadableStream ()\r
252         {\r
253             stream = new FakeStream (true, false, false);\r
254             package = Package.Open (stream);\r
255         }\r
256 \r
257         [Test]\r
258         [ExpectedException (typeof (FileFormatException))]\r
259         public void ReadableSeekableStream ()\r
260         {\r
261             stream = new FakeStream (true, false, true);\r
262             package = Package.Open (stream);\r
263 \r
264             try {\r
265                 package.DeleteRelationship (contentType);\r
266                 Assert.Fail ("Cannot modify a read-only package");\r
267             } catch (IOException) {\r
268 \r
269             }\r
270         }\r
271 \r
272         [Test]\r
273         [ExpectedException (typeof (ArgumentException))]\r
274         public void ReadOnlyAccess ()\r
275         {\r
276             stream = new FakeStream (true, false, true);\r
277             package = Package.Open (path, FileMode.CreateNew, FileAccess.Read);\r
278 \r
279             try {\r
280                 package.DeleteRelationship (contentType);\r
281                 Assert.Fail ("Cannot modify a read-only package");\r
282             } catch (IOException) {\r
283 \r
284             }\r
285         }\r
286 \r
287         [Test]\r
288         [Category ("NotWorking")]\r
289         [Ignore ("I'm not supposed to write to the relation stream unless i'm flushing")]\r
290         public void RelationshipPartGetStream ()\r
291         {\r
292             package = Package.Open (path);\r
293             package.CreateRelationship (uris [0], TargetMode.External, "rel");\r
294             PackagePart p = package.GetPart (relationshipUri);\r
295             Assert.IsNotNull (p, "#0");\r
296             Stream s = p.GetStream ();\r
297             Assert.AreEqual (0, s.Length, "#1");\r
298             Assert.IsTrue (s.CanRead, "#2");\r
299             Assert.IsTrue (s.CanSeek, "#3");\r
300             Assert.IsFalse (s.CanTimeout, "#4");\r
301             Assert.IsTrue (s.CanWrite, "#5");\r
302         }\r
303 \r
304         [Test]\r
305         [ExpectedException (typeof (IOException))]\r
306         public void SetFileModeOnUnwriteableStream ()\r
307         {\r
308             stream = new FakeStream (true, false, true);\r
309             package = Package.Open (stream, FileMode.Truncate);\r
310         }\r
311 \r
312         [Test]\r
313         [ExpectedException (typeof (NotSupportedException))]\r
314         public void SetAppendOnWriteableStream ()\r
315         {\r
316             stream = new FakeStream (true, true, true);\r
317             package = Package.Open (stream, FileMode.Append);\r
318         }\r
319 \r
320         [Test]\r
321         public void SetCreateNewOnWriteableStream ()\r
322         {\r
323             package = Package.Open (stream, FileMode.CreateNew);\r
324         }\r
325 \r
326         [Test]\r
327         [ExpectedException(typeof(IOException))]\r
328         public void SetCreateNewOnWriteableStream2 ()\r
329         {\r
330             stream = new FakeStream (true, true, true);\r
331             stream.Write (new byte [1000], 0, 1000);\r
332             package = Package.Open (stream, FileMode.CreateNew);\r
333             Assert.AreEqual (0, stream.Length, "#1");\r
334         }\r
335 \r
336         [Test]\r
337         public void SetCreateOnWriteableStream ()\r
338         {\r
339             stream = new FakeStream (true, true, true);\r
340             package = Package.Open (stream, FileMode.Create);\r
341         }\r
342 \r
343         [Test]\r
344         [ExpectedException (typeof (FileFormatException))]\r
345         public void SetOpenOnWriteableStream ()\r
346         {\r
347             stream = new FakeStream (true, true, true);\r
348             package = Package.Open (stream, FileMode.Open);\r
349         }\r
350 \r
351         [Test]\r
352         public void SetOpenOrCreateOnWriteableStream ()\r
353         {\r
354             stream = new FakeStream (true, true, true);\r
355             package = Package.Open (stream, FileMode.OpenOrCreate);\r
356         }\r
357 \r
358         [Test]\r
359         [ExpectedException (typeof (NotSupportedException))]\r
360         public void SetTruncateOnWriteableStream ()\r
361         {\r
362             stream = new FakeStream (true, true, true);\r
363             package = Package.Open (stream, FileMode.Truncate);\r
364         }\r
365 \r
366         [Test]\r
367         [ExpectedException (typeof (NotSupportedException))]\r
368         public void SetTruncateOnWriteablePath ()\r
369         {\r
370             stream = new FakeStream (true, true, true);\r
371             File.Create (path).Close ();\r
372             package = Package.Open (path, FileMode.Truncate);\r
373         }\r
374 \r
375         [Test]\r
376         [ExpectedException (typeof (FileFormatException))]\r
377         public void StreamOpen ()\r
378         {\r
379             stream = new FakeStream (true, true, true);\r
380             package = Package.Open (stream, FileMode.Open);\r
381         }\r
382 \r
383         [Test]\r
384         public void StreamCreate ()\r
385         {\r
386             stream = new FakeStream (true, true, true);\r
387             package = Package.Open (stream, FileMode.Create);\r
388         }\r
389 \r
390         [Test]\r
391         [ExpectedException (typeof (IOException))]\r
392         public void UnusableStream ()\r
393         {\r
394             stream = new FakeStream (false, false, false);\r
395             package = Package.Open (stream);\r
396         }\r
397 \r
398         // Bug - I'm passing in FileAccess.Write but it thinks I've passed FileAccess.Read\r
399         [Test]\r
400         [ExpectedException (typeof (ArgumentException))]\r
401         public void WriteAccessDoesntExist ()\r
402         {\r
403             package = Package.Open (path, FileMode.OpenOrCreate, FileAccess.Write);\r
404         }\r
405 \r
406         [Test]\r
407         public void ReadWriteAccessDoesntExist ()\r
408         {\r
409             package = Package.Open (path, FileMode.OpenOrCreate, FileAccess.ReadWrite);\r
410         }\r
411 \r
412         [Test]\r
413         [ExpectedException (typeof (FileFormatException))]\r
414         public void WriteOnlyAccessExists ()\r
415         {\r
416             File.Create (path).Close ();\r
417             package = Package.Open (path, FileMode.OpenOrCreate, FileAccess.Write);\r
418         }\r
419     }\r
420 }\r