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
9 // The above copyright notice and this permission notice shall be
\r
10 // included in all copies or substantial portions of the Software.
\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
20 // Copyright (c) 2008 Novell, Inc. (http://www.novell.com)
\r
23 // Alan McGovern (amcgovern@novell.com)
\r
28 using System.Collections.Generic;
\r
30 using System.IO.Compression;
\r
31 using System.IO.Packaging;
\r
34 using NUnit.Framework;
\r
36 namespace MonoTests.System.IO.Packaging {
\r
39 public class PackageTest : TestBase {
\r
41 //static void Main (string [] args)
\r
43 // PackageTest t = new PackageTest ();
\r
44 // t.FixtureSetup ();
\r
46 // t.RelationshipPartGetStream ();
\r
48 string path = "test.package";
\r
50 public override void Setup ()
\r
52 if (File.Exists (path))
\r
56 public override void TearDown ()
\r
59 if (package != null)
\r
62 // FIXME: This shouldn't be required when i implement this
\r
64 if (File.Exists (path))
\r
69 public void CheckContentFile ()
\r
71 MemoryStream stream = new MemoryStream ();
\r
72 package = Package.Open (stream, FileMode.Create, FileAccess.ReadWrite);
\r
73 package.CreatePart (uris[0], "custom/type");
\r
74 package.CreateRelationship (uris[1], TargetMode.External, "relType");
\r
77 package = Package.Open (new MemoryStream (stream.ToArray ()), FileMode.Open, FileAccess.ReadWrite);
\r
79 package = Package.Open (new MemoryStream (stream.ToArray ()), FileMode.Open, FileAccess.ReadWrite);
\r
81 Assert.AreEqual (2, package.GetParts ().Count (), "#1");
\r
82 Assert.AreEqual (1, package.GetRelationships ().Count (), "#2");
\r
86 [ExpectedException (typeof (FileFormatException))]
\r
87 public void CorruptStream ()
\r
89 stream = new FakeStream (true, true, true);
\r
90 stream.Write (new byte [1024], 0, 1024);
\r
91 package = Package.Open (stream);
\r
95 [ExpectedException (typeof (NotSupportedException))]
\r
96 public void FileShareReadWrite ()
\r
98 package = Package.Open (path, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);
\r
102 [ExpectedException (typeof (FileNotFoundException))]
\r
103 public void OpenNonExistantPath ()
\r
105 package = Package.Open (path, FileMode.Open);
\r
109 public void NonExistantPath ()
\r
111 package = Package.Open (path);
\r
115 public void PreExistingPath ()
\r
117 package = Package.Open (path);
\r
119 package = Package.Open (path);
\r
123 public void Close_FileStreamNotClosed ()
\r
125 using (var stream = new FileStream (path, FileMode.OpenOrCreate, FileAccess.ReadWrite)) {
\r
126 var package = Package.Open (stream, FileMode.OpenOrCreate);
\r
127 package.CreatePart (uris [0], contentType);
\r
129 stream.Read (new byte [1024], 0, 1024);
\r
134 public void Close_MemoryStreamNotClosed ()
\r
136 using (var stream = new MemoryStream ()) {
\r
137 var package = Package.Open (stream, FileMode.OpenOrCreate);
\r
138 package.CreatePart (uris [0], contentType);
\r
140 stream.Read (new byte [1024], 0, 1024);
\r
145 public void Close_Twice ()
\r
147 var package = Package.Open (new MemoryStream (), FileMode.OpenOrCreate);
\r
153 public void Dispose_Twice ()
\r
155 var package = Package.Open (new MemoryStream (), FileMode.OpenOrCreate);
\r
156 ((IDisposable) package).Dispose ();
\r
157 ((IDisposable) package).Dispose ();
\r
161 public void CreatePath ()
\r
163 package = Package.Open (path, FileMode.Create);
\r
164 Assert.AreEqual (FileAccess.ReadWrite, package.FileOpenAccess, "#1");
\r
168 [ExpectedException (typeof (ArgumentException))]
\r
169 public void CreatePathReadonly ()
\r
171 package = Package.Open (path, FileMode.Create, FileAccess.Read);
\r
176 public void CreatePathTwice ()
\r
178 package = Package.Open (path, FileMode.Create);
\r
180 package = Package.Open (path, FileMode.Open);
\r
181 Assert.AreEqual (FileAccess.ReadWrite, package.FileOpenAccess);
\r
185 public void OpenPackageMultipleTimes ()
\r
187 var filename = Path.GetTempFileName ();
\r
189 using (var file = File.Open (filename, FileMode.OpenOrCreate)) {
\r
190 var package = Package.Open (file, FileMode.OpenOrCreate);
\r
191 var part = package.CreatePart (new Uri ("/test", UriKind.Relative), "test/type");
\r
192 using (var stream = part.GetStream ())
\r
193 stream.Write (new byte [1024 * 1024], 0, 1024 * 1024);
\r
197 for (int i = 0; i < 10; i++) {
\r
198 using (var file = File.Open (filename, FileMode.OpenOrCreate))
\r
199 using (var package = Package.Open (file)) {
\r
200 package.GetParts ();
\r
201 package.GetRelationships ();
\r
205 if (File.Exists (filename))
\r
206 File.Delete (filename);
\r
211 public void OpenPathReadonly ()
\r
213 package = Package.Open (path, FileMode.Create);
\r
214 package.CreatePart (uris[0], contentType);
\r
215 package.CreateRelationship (uris[1], TargetMode.External, "relType");
\r
217 package = Package.Open (path, FileMode.Open, FileAccess.Read);
\r
218 Assert.AreEqual (2, package.GetParts ().Count (), "#1");
\r
219 Assert.AreEqual (1, package.GetRelationships ().Count (), "#2");
\r
220 Assert.AreEqual (FileAccess.Read, package.FileOpenAccess, "Should be read access");
\r
222 package.CreatePart (uris [0], contentType);
\r
223 Assert.Fail ("Cannot modify a read-only package");
\r
224 } catch (IOException) {
\r
229 package.CreateRelationship (uris [0], TargetMode.Internal, contentType);
\r
230 Assert.Fail ("Cannot modify a read-only package");
\r
231 } catch (IOException) {
\r
236 package.DeletePart (uris [0]);
\r
237 Assert.Fail ("Cannot modify a read-only package");
\r
238 } catch (IOException) {
\r
243 package.DeleteRelationship (contentType);
\r
244 Assert.Fail ("Cannot modify a read-only package");
\r
245 } catch (IOException) {
\r
251 [ExpectedException (typeof (ArgumentException))]
\r
252 public void ReadableStream ()
\r
254 stream = new FakeStream (true, false, false);
\r
255 package = Package.Open (stream);
\r
259 [ExpectedException (typeof (FileFormatException))]
\r
260 public void ReadableSeekableStream ()
\r
262 stream = new FakeStream (true, false, true);
\r
263 package = Package.Open (stream);
\r
266 package.DeleteRelationship (contentType);
\r
267 Assert.Fail ("Cannot modify a read-only package");
\r
268 } catch (IOException) {
\r
274 [ExpectedException (typeof (ArgumentException))]
\r
275 public void ReadOnlyAccess ()
\r
277 stream = new FakeStream (true, false, true);
\r
278 package = Package.Open (path, FileMode.CreateNew, FileAccess.Read);
\r
281 package.DeleteRelationship (contentType);
\r
282 Assert.Fail ("Cannot modify a read-only package");
\r
283 } catch (IOException) {
\r
289 [Category ("NotWorking")]
\r
290 [Ignore ("I'm not supposed to write to the relation stream unless i'm flushing")]
\r
291 public void RelationshipPartGetStream ()
\r
293 package = Package.Open (path);
\r
294 package.CreateRelationship (uris [0], TargetMode.External, "rel");
\r
295 PackagePart p = package.GetPart (relationshipUri);
\r
296 Assert.IsNotNull (p, "#0");
\r
297 Stream s = p.GetStream ();
\r
298 Assert.AreEqual (0, s.Length, "#1");
\r
299 Assert.IsTrue (s.CanRead, "#2");
\r
300 Assert.IsTrue (s.CanSeek, "#3");
\r
301 Assert.IsFalse (s.CanTimeout, "#4");
\r
302 Assert.IsTrue (s.CanWrite, "#5");
\r
306 [ExpectedException (typeof (IOException))]
\r
307 public void SetFileModeOnUnwriteableStream ()
\r
309 stream = new FakeStream (true, false, true);
\r
310 package = Package.Open (stream, FileMode.Truncate);
\r
314 [ExpectedException (typeof (NotSupportedException))]
\r
315 public void SetAppendOnWriteableStream ()
\r
317 stream = new FakeStream (true, true, true);
\r
318 package = Package.Open (stream, FileMode.Append);
\r
322 public void SetCreateNewOnWriteableStream ()
\r
324 package = Package.Open (stream, FileMode.CreateNew);
\r
328 [ExpectedException(typeof(IOException))]
\r
329 public void SetCreateNewOnWriteableStream2 ()
\r
331 stream = new FakeStream (true, true, true);
\r
332 stream.Write (new byte [1000], 0, 1000);
\r
333 package = Package.Open (stream, FileMode.CreateNew);
\r
334 Assert.AreEqual (0, stream.Length, "#1");
\r
338 public void SetCreateOnWriteableStream ()
\r
340 stream = new FakeStream (true, true, true);
\r
341 package = Package.Open (stream, FileMode.Create);
\r
345 [ExpectedException (typeof (FileFormatException))]
\r
346 public void SetOpenOnWriteableStream ()
\r
348 stream = new FakeStream (true, true, true);
\r
349 package = Package.Open (stream, FileMode.Open);
\r
353 public void SetOpenOrCreateOnWriteableStream ()
\r
355 stream = new FakeStream (true, true, true);
\r
356 package = Package.Open (stream, FileMode.OpenOrCreate);
\r
360 [ExpectedException (typeof (NotSupportedException))]
\r
361 public void SetTruncateOnWriteableStream ()
\r
363 stream = new FakeStream (true, true, true);
\r
364 package = Package.Open (stream, FileMode.Truncate);
\r
368 [ExpectedException (typeof (NotSupportedException))]
\r
369 public void SetTruncateOnWriteablePath ()
\r
371 stream = new FakeStream (true, true, true);
\r
372 File.Create (path).Close ();
\r
373 package = Package.Open (path, FileMode.Truncate);
\r
377 [ExpectedException (typeof (FileFormatException))]
\r
378 public void StreamOpen ()
\r
380 stream = new FakeStream (true, true, true);
\r
381 package = Package.Open (stream, FileMode.Open);
\r
385 public void StreamCreate ()
\r
387 stream = new FakeStream (true, true, true);
\r
388 package = Package.Open (stream, FileMode.Create);
\r
392 [ExpectedException (typeof (IOException))]
\r
393 public void UnusableStream ()
\r
395 stream = new FakeStream (false, false, false);
\r
396 package = Package.Open (stream);
\r
399 // Bug - I'm passing in FileAccess.Write but it thinks I've passed FileAccess.Read
\r
401 [ExpectedException (typeof (ArgumentException))]
\r
402 public void WriteAccessDoesntExist ()
\r
404 package = Package.Open (path, FileMode.OpenOrCreate, FileAccess.Write);
\r
408 public void ReadWriteAccessDoesntExist ()
\r
410 package = Package.Open (path, FileMode.OpenOrCreate, FileAccess.ReadWrite);
\r
414 [ExpectedException (typeof (FileFormatException))]
\r
415 public void WriteOnlyAccessExists ()
\r
417 File.Create (path).Close ();
\r
418 package = Package.Open (path, FileMode.OpenOrCreate, FileAccess.Write);
\r
422 public void Check_ZipDateTime ()
\r
424 using (var zipStream = new FileStream (path, FileMode.OpenOrCreate, FileAccess.ReadWrite))
\r
425 using (package = Package.Open (zipStream, FileMode.OpenOrCreate)) {
\r
426 var part = package.CreatePart (new Uri ("/test", UriKind.Relative), "test/type");
\r
427 using (var stream = part.GetStream ())
\r
428 stream.Write (new byte [1024 * 1024], 0, 1024 * 1024);
\r
431 using (var stream = new FileStream (path, FileMode.Open, FileAccess.Read))
\r
432 using (var archive = new ZipArchive(stream))
\r
434 foreach (var entry in archive.Entries)
\r
435 Assert.AreEqual (entry.LastWriteTime.Year, DateTime.Now.Year);
\r