2 // System.IO.UnmanagedMemoryStreamTest.cs
5 // Sridhar Kulkarni (sridharkulkarni@gmail.com)
6 // Gert Driesen (drieseng@users.sourceforge.net)
7 // Sebastien Pouliot <sebastien@ximian.com>
9 // (c) 2006 Sridhar Kulkarni.
10 // Copyright (C) 2004, 2009 Novell (http://www.novell.com)
14 using System.Collections;
16 using System.Runtime.InteropServices;
19 using NUnit.Framework;
21 namespace MonoTests.System.IO
24 public unsafe class UnmanagedMemoryStreamTest {
25 byte[] testStreamData;
27 IntPtr mem_intptr = IntPtr.Zero;
28 byte* mem_byteptr = null;
35 testStreamData = UnicodeEncoding.Unicode.GetBytes("Here is some mono testdata");
36 length = testStreamData.Length;
37 capacity = testStreamData.Length * 2;
38 mem_intptr = Marshal.AllocHGlobal(capacity);
39 mem_byteptr = (byte*)mem_intptr.ToPointer();
40 readData = new byte[length];
44 public void TearDown ()
46 if (mem_intptr != IntPtr.Zero)
47 Marshal.FreeHGlobal (mem_intptr);
51 // Verify that the first count bytes in testBytes are the same as
52 // the count bytes from index start in testStreamData
54 void VerifyTestData (string id, byte [] testBytes, int start, int count)
56 if (testBytes == null)
57 Assert.Fail(id + "+1 testBytes is null");
61 start + count > testStreamData.Length ||
62 start > testStreamData.Length)
63 throw new ArgumentOutOfRangeException(id + "+2");
65 for (int test = 0; test < count; test++)
67 if (testBytes[test] == testStreamData[start + test])
70 string failStr = "testByte {0} (testStream {1}) was <{2}>, expecting <{3}>";
71 failStr = String.Format(failStr,
75 testStreamData[start + test]);
76 Assert.Fail(id + "-3" + failStr);
81 public void Constructor1 ()
83 UnmanagedMemoryStream ums = new
84 UnmanagedMemoryStream(mem_byteptr, length);
85 Assert.AreEqual ((long) length, ums.Capacity, "#1");
86 Assert.AreEqual ((long) length, ums.Length, "#2");
87 Assert.AreEqual (0L, ums.Position, "#3");
88 ums.Position = (length-2);
89 Assert.AreEqual ((long)(length - 2), ums.Position, "#4");
91 ums.Seek(3L, SeekOrigin.Begin);
92 Assert.AreEqual (3L, ums.Position, "#5");
93 Assert.IsTrue (ums.CanRead, "#6");
94 Assert.IsFalse (ums.CanWrite, "#7");
99 public void Constructor1_Length_Negative ()
102 new UnmanagedMemoryStream(mem_byteptr, -1);
104 } catch (ArgumentOutOfRangeException ex) {
105 // Non-negative number required
106 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2");
107 Assert.IsNull (ex.InnerException, "#3");
108 Assert.IsNotNull (ex.Message, "#4");
109 Assert.IsNotNull (ex.ParamName, "#5");
110 Assert.AreEqual ("length", ex.ParamName, "#6");
115 public void Constructor1_Pointer_Null ()
118 new UnmanagedMemoryStream((byte*) null, -1);
120 } catch (ArgumentNullException ex) {
121 // Value cannot be null
122 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
123 Assert.IsNull (ex.InnerException, "#3");
124 Assert.IsNotNull (ex.Message, "#4");
125 Assert.IsNotNull (ex.ParamName, "#5");
126 Assert.AreEqual ("pointer", ex.ParamName, "#6");
131 public void Constructor2 ()
133 UnmanagedMemoryStream ums;
135 ums = new UnmanagedMemoryStream(mem_byteptr,
136 length, 999, FileAccess.Read);
137 Assert.IsTrue (ums.CanRead, "#A1");
138 Assert.IsTrue (ums.CanSeek, "#A2");
139 Assert.IsFalse (ums.CanWrite, "#A3");
140 Assert.AreEqual (999, ums.Capacity, "#A4");
141 Assert.AreEqual (length, ums.Length, "#A5");
142 Assert.AreEqual (0, ums.Position, "#A6");
145 ums = new UnmanagedMemoryStream(mem_byteptr,
146 length, 666, FileAccess.Write);
147 Assert.IsFalse (ums.CanRead, "#B1");
148 Assert.IsTrue (ums.CanSeek, "#B2");
149 Assert.IsTrue (ums.CanWrite, "#B3");
150 Assert.AreEqual (666, ums.Capacity, "#B4");
151 Assert.AreEqual (length, ums.Length, "#B5");
152 Assert.AreEqual (0, ums.Position, "#B6");
155 ums = new UnmanagedMemoryStream(mem_byteptr,
156 0, 0, FileAccess.ReadWrite);
157 Assert.IsTrue (ums.CanRead, "#C1");
158 Assert.IsTrue (ums.CanSeek, "#C2");
159 Assert.IsTrue (ums.CanWrite, "#C3");
160 Assert.AreEqual (0, ums.Capacity, "#C4");
161 Assert.AreEqual (0, ums.Length, "#C5");
162 Assert.AreEqual (0, ums.Position, "#C6");
167 public void Constructor2_Access_Invalid ()
170 new UnmanagedMemoryStream(mem_byteptr, 0, 0, (FileAccess) 666);
172 } catch (ArgumentOutOfRangeException ex) {
173 // Enum value was out of legal range
174 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2");
175 Assert.IsNull (ex.InnerException, "#3");
176 Assert.IsNotNull (ex.Message, "#4");
177 Assert.IsNotNull (ex.ParamName, "#5");
178 Assert.AreEqual ("access", ex.ParamName, "#6");
183 public void Constructor2_Capacity_Negative ()
186 new UnmanagedMemoryStream(mem_byteptr, 0, -1, FileAccess.Read);
188 } catch (ArgumentOutOfRangeException ex) {
189 // Non-negative number required
190 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2");
191 Assert.IsNull (ex.InnerException, "#3");
192 Assert.IsNotNull (ex.Message, "#4");
193 Assert.IsNotNull (ex.ParamName, "#5");
194 Assert.AreEqual ("capacity", ex.ParamName, "#6");
199 public void Constructor2_Length_Negative ()
202 new UnmanagedMemoryStream(mem_byteptr, -1, 0, FileAccess.Read);
204 } catch (ArgumentOutOfRangeException ex) {
205 // Non-negative number required
206 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2");
207 Assert.IsNull (ex.InnerException, "#3");
208 Assert.IsNotNull (ex.Message, "#4");
209 Assert.IsNotNull (ex.ParamName, "#5");
210 Assert.AreEqual ("length", ex.ParamName, "#6");
215 public void Constructor2_Length_Overflow ()
218 new UnmanagedMemoryStream(mem_byteptr, 5, 3, FileAccess.Read);
220 } catch (ArgumentOutOfRangeException ex) {
221 // The length cannot be greater than the capacity
222 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2");
223 Assert.IsNull (ex.InnerException, "#3");
224 Assert.IsNotNull (ex.Message, "#4");
225 Assert.IsNotNull (ex.ParamName, "#5");
226 Assert.AreEqual ("length", ex.ParamName, "#6");
231 public void Constructor2_Pointer_Null ()
234 new UnmanagedMemoryStream((byte*) null, 5, 3, FileAccess.Read);
236 } catch (ArgumentNullException ex) {
237 // Value cannot be null
238 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
239 Assert.IsNull (ex.InnerException, "#3");
240 Assert.IsNotNull (ex.Message, "#4");
241 Assert.IsNotNull (ex.ParamName, "#5");
242 Assert.AreEqual ("pointer", ex.ParamName, "#6");
247 [ExpectedException (typeof (ObjectDisposedException))]
248 public void Flush_Stream_Closed ()
250 UnmanagedMemoryStream ums = new
251 UnmanagedMemoryStream(mem_byteptr, length);
257 public void CanRead ()
259 UnmanagedMemoryStream ums = new
260 UnmanagedMemoryStream(mem_byteptr, length, capacity, FileAccess.Read);
261 Assert.IsTrue (ums.CanRead, "#1");
262 ums.Seek (length, SeekOrigin.Begin);
263 Assert.IsTrue (ums.CanRead, "#2");
264 ums.Seek (capacity, SeekOrigin.Begin);
265 Assert.IsTrue (ums.CanRead, "#3");
266 ums.Seek (capacity + 1, SeekOrigin.Begin);
267 Assert.IsTrue (ums.CanRead, "#4");
268 ums.Seek (0, SeekOrigin.Begin);
269 Assert.IsTrue (ums.CanRead, "#5");
274 public void CanRead_Stream_Closed ()
276 UnmanagedMemoryStream ums = new
277 UnmanagedMemoryStream(mem_byteptr, length, capacity, FileAccess.ReadWrite);
279 Assert.IsFalse (ums.CanRead);
283 public void CanSeek ()
285 UnmanagedMemoryStream ums = new
286 UnmanagedMemoryStream(mem_byteptr, length, capacity, FileAccess.Read);
287 Assert.IsTrue (ums.CanSeek, "#1");
288 ums.Seek (length, SeekOrigin.Begin);
289 Assert.IsTrue (ums.CanSeek, "#2");
290 ums.Seek (capacity, SeekOrigin.Begin);
291 Assert.IsTrue (ums.CanSeek, "#3");
292 ums.Seek (capacity + 1, SeekOrigin.Begin);
293 Assert.IsTrue (ums.CanSeek, "#4");
294 ums.Seek (0, SeekOrigin.Begin);
295 Assert.IsTrue (ums.CanSeek, "#5");
300 public void CanSeek_Stream_Closed ()
302 UnmanagedMemoryStream ums = new
303 UnmanagedMemoryStream(mem_byteptr, length, capacity, FileAccess.ReadWrite);
304 Assert.IsTrue (ums.CanSeek, "#1");
306 Assert.IsFalse (ums.CanSeek, "#2");
310 public void CanWrite ()
312 UnmanagedMemoryStream ums = new
313 UnmanagedMemoryStream(mem_byteptr, length, capacity, FileAccess.ReadWrite);
314 Assert.IsTrue (ums.CanWrite, "#1");
315 ums.Seek (length, SeekOrigin.Begin);
316 Assert.IsTrue (ums.CanWrite, "#2");
317 ums.Seek (capacity, SeekOrigin.Begin);
318 Assert.IsTrue (ums.CanWrite, "#3");
319 ums.Seek (capacity + 1, SeekOrigin.Begin);
320 Assert.IsTrue (ums.CanWrite, "#4");
321 ums.Seek (0, SeekOrigin.Begin);
322 Assert.IsTrue (ums.CanWrite, "#5");
327 public void CanWrite_Stream_Closed ()
329 UnmanagedMemoryStream ums = new
330 UnmanagedMemoryStream(mem_byteptr, length, capacity, FileAccess.ReadWrite);
331 Assert.IsTrue (ums.CanWrite, "#1");
333 Assert.IsFalse (ums.CanWrite, "#2");
339 UnmanagedMemoryStream ums = new
340 UnmanagedMemoryStream(mem_byteptr, length, capacity, FileAccess.ReadWrite);
341 ums.Write (testStreamData, 0, testStreamData.Length);
344 Assert.AreEqual (length / 2, ums.Read (readData, 0, (length / 2)), "#1");
345 VerifyTestData ("#2", readData, 0, (length / 2));
346 Assert.AreEqual (length / 2, ums.Position, "#3");
348 //Seek back to begining
349 ums.Seek (0, SeekOrigin.Begin);
351 //Read complete stream
352 Assert.AreEqual (length, ums.Read (readData, 0, length), "#4");
353 VerifyTestData ("#5", readData, 0, length);
354 Assert.AreEqual (length, ums.Position, "#6");
356 //Seek to mid of the stream and read till end
357 ums.Seek ((length / 2), SeekOrigin.Begin);
358 ums.Read (readData, 0, (length / 2));
359 VerifyTestData ("#7", readData, (length / 2), (length / 2));
360 Assert.AreEqual (length, ums.Position, "#8");
365 public void Read_Buffer_Null ()
367 UnmanagedMemoryStream ums = new
368 UnmanagedMemoryStream(mem_byteptr, length);
370 ums.Read((byte []) null, 0, 0);
372 } catch (ArgumentNullException ex) {
373 // Value cannot be null
374 Assert.AreEqual (typeof (ArgumentNullException), ex.GetType (), "#2");
375 Assert.IsNull (ex.InnerException, "#3");
376 Assert.IsNotNull (ex.Message, "#4");
377 Assert.IsNotNull (ex.ParamName, "#5");
378 Assert.AreEqual ("buffer", ex.ParamName, "#6");
383 [ExpectedException (typeof (ObjectDisposedException))]
384 public void Read_Stream_Closed ()
386 UnmanagedMemoryStream ums = new
387 UnmanagedMemoryStream(mem_byteptr, length);
389 ums.Read(readData, 0, 0);
393 public void Read_Count_Negative ()
395 UnmanagedMemoryStream ums = new
396 UnmanagedMemoryStream(mem_byteptr, length, length, FileAccess.ReadWrite);
397 ums.Write (testStreamData, 0, testStreamData.Length);
400 ums.Read (readData, 0, -1);
402 } catch (ArgumentOutOfRangeException ex) {
403 // Non-negative number required
404 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2");
405 Assert.IsNull (ex.InnerException, "#3");
406 Assert.IsNotNull (ex.Message, "#4");
407 Assert.IsNotNull (ex.ParamName, "#5");
408 Assert.AreEqual ("count", ex.ParamName, "#6");
413 public void Read_Count_Overlow ()
415 UnmanagedMemoryStream ums = new
416 UnmanagedMemoryStream(mem_byteptr, length, length, FileAccess.ReadWrite);
417 ums.Write (testStreamData, 0, testStreamData.Length);
420 ums.Read (readData, 1, readData.Length);
422 } catch (ArgumentException ex) {
423 // Offset and length were out of bounds for the array or count
424 // is greater than the number of elements from index to the end
425 // of the source collection
426 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
427 Assert.IsNull (ex.InnerException, "#3");
428 Assert.IsNotNull (ex.Message, "#4");
429 Assert.IsNull (ex.ParamName, "#5");
434 public void Read_EndOfStream ()
436 UnmanagedMemoryStream ums = new
437 UnmanagedMemoryStream(mem_byteptr, length, length * 2, FileAccess.ReadWrite);
438 ums.Write (testStreamData, 0, testStreamData.Length);
439 Assert.AreEqual (0, ums.Read (readData, 0, 1), "#1");
440 ums.Seek(length + 1, SeekOrigin.Begin);
441 Assert.AreEqual (0, ums.Read (readData, 0, 1), "#2");
442 ums.Seek(length - 3, SeekOrigin.Begin);
443 Assert.AreEqual (3, ums.Read (readData, 0, 5), "#3");
444 ums.Seek(capacity + 1, SeekOrigin.Begin);
445 Assert.AreEqual (0, ums.Read (readData, 0, 1), "#4");
450 public void Read_Offset_Negative ()
452 UnmanagedMemoryStream ums = new
453 UnmanagedMemoryStream(mem_byteptr, length, length, FileAccess.ReadWrite);
454 ums.Write (testStreamData, 0, testStreamData.Length);
457 ums.Read (readData, -1, 0);
459 } catch (ArgumentOutOfRangeException ex) {
460 // Non-negative number required
461 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2");
462 Assert.IsNull (ex.InnerException, "#3");
463 Assert.IsNotNull (ex.Message, "#4");
464 Assert.IsNotNull (ex.ParamName, "#5");
465 Assert.AreEqual ("offset", ex.ParamName, "#6");
470 public void Read_Offset_Overflow ()
472 using (UnmanagedMemoryStream ums = new UnmanagedMemoryStream (mem_byteptr, length, length, FileAccess.ReadWrite)) {
473 ums.Write (testStreamData, 0, testStreamData.Length);
476 ums.Read (readData, Int32.MaxValue, 0);
479 catch (ArgumentException ex) {
480 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
481 Assert.IsNull (ex.InnerException, "#3");
482 Assert.IsNotNull (ex.Message, "#4");
483 Assert.IsNull (ex.ParamName, "#5");
489 public void Read_Count_Overflow ()
491 using (UnmanagedMemoryStream ums = new UnmanagedMemoryStream (mem_byteptr, length, length, FileAccess.ReadWrite)) {
492 ums.Write (testStreamData, 0, testStreamData.Length);
495 ums.Read (readData, 0, Int32.MaxValue);
498 catch (ArgumentException ex) {
499 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
500 Assert.IsNull (ex.InnerException, "#3");
501 Assert.IsNotNull (ex.Message, "#4");
502 Assert.IsNull (ex.ParamName, "#5");
508 public void Read_WriteOnly ()
510 UnmanagedMemoryStream ums = new
511 UnmanagedMemoryStream(mem_byteptr, length, length, FileAccess.Write);
513 ums.Read(readData, 0, 1);
515 } catch (NotSupportedException ex) {
516 // Stream does not support reading
517 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2");
518 Assert.IsNull (ex.InnerException, "#3");
519 Assert.IsNotNull (ex.Message, "#4");
525 public void ReadByte ()
527 UnmanagedMemoryStream ums = new
528 UnmanagedMemoryStream(mem_byteptr, length, length, FileAccess.ReadWrite);
529 ums.Write (testStreamData, 0, testStreamData.Length);
531 Assert.AreEqual (testStreamData [0], ums.ReadByte (), "#1");
532 Assert.AreEqual (testStreamData [1], ums.ReadByte (), "#2");
537 [ExpectedException (typeof (ObjectDisposedException))]
538 public void ReadByte_Stream_Closed ()
540 UnmanagedMemoryStream ums = new
541 UnmanagedMemoryStream(mem_byteptr, length);
547 public void ReadByte_EndOfStream ()
549 UnmanagedMemoryStream ums = new
550 UnmanagedMemoryStream(mem_byteptr, length, capacity, FileAccess.ReadWrite);
551 ums.Write (testStreamData, 0, testStreamData.Length);
553 ums.Seek(length, SeekOrigin.Begin);
554 Assert.AreEqual (-1, ums.ReadByte (), "#3");
555 ums.Seek(length + 1, SeekOrigin.Begin);
556 Assert.AreEqual (-1, ums.ReadByte (), "#4");
557 ums.Seek(capacity, SeekOrigin.Begin);
558 Assert.AreEqual (-1, ums.ReadByte (), "#5");
559 ums.Seek(capacity + 1, SeekOrigin.Begin);
560 Assert.AreEqual (-1, ums.ReadByte (), "#6");
565 public void ReadByte_WriteOnly ()
567 UnmanagedMemoryStream ums = new
568 UnmanagedMemoryStream(mem_byteptr, length, capacity, FileAccess.Write);
572 } catch (NotSupportedException ex) {
573 // Stream does not support reading
574 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2");
575 Assert.IsNull (ex.InnerException, "#3");
576 Assert.IsNotNull (ex.Message, "#4");
584 UnmanagedMemoryStream ums = new
585 UnmanagedMemoryStream(mem_byteptr, length, capacity, FileAccess.Write);
586 Assert.AreEqual (5, ums.Seek (5, SeekOrigin.Begin), "#A1");
587 Assert.AreEqual (5, ums.Position, "#A2");
588 Assert.AreEqual (length, ums.Length, "#A3");
590 ums.Seek (2, SeekOrigin.Current);
591 //Assert.AreEqual (7, ums.Seek (2, SeekOrigin.Current), "#B1");
592 Assert.AreEqual (7, ums.Position, "#B2");
593 Assert.AreEqual (length, ums.Length, "#B3");
595 Assert.AreEqual (length + 2, ums.Seek (2, SeekOrigin.End), "#C1");
596 Assert.AreEqual (length + 2, ums.Position, "#C2");
597 Assert.AreEqual (length, ums.Length, "#C3");
599 Assert.AreEqual (0, ums.Seek (0, SeekOrigin.Begin), "#D1");
600 Assert.AreEqual (0, ums.Position, "#D2");
601 Assert.AreEqual (length, ums.Length, "#D3");
603 Assert.AreEqual (length - 2, ums.Seek (-2, SeekOrigin.End), "#E1");
604 Assert.AreEqual (length - 2, ums.Position, "#E2");
605 Assert.AreEqual (length, ums.Length, "#E3");
607 Assert.AreEqual (length - 5, ums.Seek (-3, SeekOrigin.Current), "#F1");
608 Assert.AreEqual (length - 5, ums.Position, "#F2");
609 Assert.AreEqual (length, ums.Length, "#F3");
611 Assert.AreEqual (capacity + 5, ums.Seek (capacity + 5, SeekOrigin.Begin), "#G1");
612 Assert.AreEqual (capacity + 5, ums.Position, "#G2");
613 Assert.AreEqual (length, ums.Length, "#G3");
617 public void Seek_Origin_Invalid ()
619 UnmanagedMemoryStream ums = new
620 UnmanagedMemoryStream(mem_byteptr, 5, 10, FileAccess.Read);
622 ums.Seek(1, (SeekOrigin) 666);
624 } catch (ArgumentException ex) {
625 // Invalid seek origin
626 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
627 Assert.IsNull (ex.InnerException, "#3");
628 Assert.IsNotNull (ex.Message, "#4");
629 Assert.IsNull (ex.ParamName, "#5");
635 public void Seek_Offset_Invalid ()
637 UnmanagedMemoryStream ums = new
638 UnmanagedMemoryStream(mem_byteptr, length, capacity, FileAccess.ReadWrite);
639 ums.Write (testStreamData, 0, testStreamData.Length);
642 ums.Seek(-1, SeekOrigin.Begin);
644 } catch (IOException ex) {
645 // An attempt was made to move the position before the beginning
647 Assert.AreEqual (typeof (IOException), ex.GetType (), "#A2");
648 Assert.IsNull (ex.InnerException, "#A3");
649 Assert.IsNotNull (ex.Message, "#A4");
654 ums.Seek(-3, SeekOrigin.Current);
656 } catch (IOException ex) {
657 // An attempt was made to move the position before the beginning
659 Assert.AreEqual (typeof (IOException), ex.GetType (), "#B2");
660 Assert.IsNull (ex.InnerException, "#B3");
661 Assert.IsNotNull (ex.Message, "#B4");
668 public void Seek_Begin_Overflow ()
670 using (UnmanagedMemoryStream ums = new UnmanagedMemoryStream (mem_byteptr, 5, 10, FileAccess.Read)) {
671 Assert.AreEqual (Int64.MaxValue, ums.Seek (Int64.MaxValue, SeekOrigin.Begin), "Seek");
672 Assert.AreEqual (Int64.MaxValue, ums.Position, "Position");
674 byte* p = ums.PositionPointer;
677 catch (IndexOutOfRangeException ex) {
678 Assert.AreEqual (typeof (IndexOutOfRangeException), ex.GetType (), "#2");
679 Assert.IsNull (ex.InnerException, "#3");
680 Assert.IsNotNull (ex.Message, "#4");
686 public void Seek_Current_Overflow ()
688 using (UnmanagedMemoryStream ums = new UnmanagedMemoryStream (mem_byteptr, 5, 10, FileAccess.Read)) {
691 ums.Seek (Int64.MaxValue, SeekOrigin.Current);
694 catch (IOException ex) {
695 Assert.AreEqual (typeof (IOException), ex.GetType (), "#2");
696 Assert.IsNull (ex.InnerException, "#3");
697 Assert.IsNotNull (ex.Message, "#4");
703 public void Seek_End_Overflow ()
705 using (UnmanagedMemoryStream ums = new UnmanagedMemoryStream (mem_byteptr, 5, 10, FileAccess.Read)) {
707 ums.Seek (Int64.MaxValue, SeekOrigin.End);
710 catch (IOException ex) {
711 Assert.AreEqual (typeof (IOException), ex.GetType (), "#2");
712 Assert.IsNull (ex.InnerException, "#3");
713 Assert.IsNotNull (ex.Message, "#4");
719 [ExpectedException (typeof (ObjectDisposedException))]
720 public void Seek_Stream_Closed ()
722 UnmanagedMemoryStream ums = new
723 UnmanagedMemoryStream(mem_byteptr, length);
725 ums.Seek (0, SeekOrigin.Begin);
731 UnmanagedMemoryStream ums = new
732 UnmanagedMemoryStream(mem_byteptr, length, capacity, FileAccess.ReadWrite);
733 ums.Write (testStreamData, 0, length);
734 Assert.AreEqual (capacity, ums.Capacity, "#A1");
735 Assert.AreEqual (length, ums.Position, "#A2");
736 Assert.AreEqual (length, ums.Length, "#A3");
738 ums.Read (readData, 0, length);
739 Assert.AreEqual (capacity, ums.Capacity, "#B1");
740 Assert.AreEqual (length, ums.Position, "#B2");
741 Assert.AreEqual (length, ums.Length, "#B3");
742 VerifyTestData ("#B4", readData, 0, length);
743 ums.Write (testStreamData, 2, 2);
744 Assert.AreEqual (capacity, ums.Capacity, "#C1");
745 Assert.AreEqual (length + 2, ums.Position, "#C1");
746 Assert.AreEqual (length + 2, ums.Length, "#C2");
747 ums.Position = length;
748 Assert.AreEqual (testStreamData [2], ums.ReadByte (), "#D1");
749 Assert.AreEqual (testStreamData [3], ums.ReadByte (), "#D2");
754 public void Write_Capacity_Exceeded ()
756 UnmanagedMemoryStream ums = new
757 UnmanagedMemoryStream(mem_byteptr, length, length + 2, FileAccess.ReadWrite);
758 ums.Write (testStreamData, 0, length);
759 ums.Write (testStreamData, 0, 2);
761 ums.Write (testStreamData, 0, 1);
763 } catch (NotSupportedException ex) {
764 // Unable to expand length of this stream beyond its capacity
765 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2");
766 Assert.IsNull (ex.InnerException, "#3");
767 Assert.IsNotNull (ex.Message, "#4");
773 public void Write_Count_Negative ()
775 UnmanagedMemoryStream ums = new
776 UnmanagedMemoryStream(mem_byteptr, length, capacity, FileAccess.ReadWrite);
778 ums.Write (testStreamData, 0, -1);
780 } catch (ArgumentOutOfRangeException ex) {
781 // Non-negative number required
782 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2");
783 Assert.IsNull (ex.InnerException, "#3");
784 Assert.IsNotNull (ex.Message, "#4");
785 Assert.IsNotNull (ex.ParamName, "#5");
786 Assert.AreEqual ("count", ex.ParamName, "#6");
792 public void Write_Offset_Negative ()
794 UnmanagedMemoryStream ums = new
795 UnmanagedMemoryStream(mem_byteptr, length, capacity, FileAccess.ReadWrite);
797 ums.Write (testStreamData, -1, testStreamData.Length);
799 } catch (ArgumentOutOfRangeException ex) {
800 // Non-negative number required
801 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2");
802 Assert.IsNull (ex.InnerException, "#3");
803 Assert.IsNotNull (ex.Message, "#4");
804 Assert.IsNotNull (ex.ParamName, "#5");
805 Assert.AreEqual ("offset", ex.ParamName, "#6");
811 public void Write_Offset_Overflow ()
813 using (UnmanagedMemoryStream ums = new UnmanagedMemoryStream (mem_byteptr, length, capacity, FileAccess.ReadWrite)) {
815 ums.Write (testStreamData, Int32.MaxValue, 1);
818 catch (ArgumentException ex) {
819 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
820 Assert.IsNull (ex.InnerException, "#3");
821 Assert.IsNotNull (ex.Message, "#4");
822 Assert.IsNull (ex.ParamName, "#5");
828 public void Write_Count_Overflow ()
830 using (UnmanagedMemoryStream ums = new UnmanagedMemoryStream (mem_byteptr, length, capacity, FileAccess.ReadWrite)) {
832 ums.Write (testStreamData, 1, Int32.MaxValue);
835 catch (ArgumentException ex) {
836 Assert.AreEqual (typeof (ArgumentException), ex.GetType (), "#2");
837 Assert.IsNull (ex.InnerException, "#3");
838 Assert.IsNotNull (ex.Message, "#4");
839 Assert.IsNull (ex.ParamName, "#5");
845 [ExpectedException (typeof (ObjectDisposedException))]
846 public void Write_Stream_Closed ()
848 UnmanagedMemoryStream ums = new
849 UnmanagedMemoryStream(mem_byteptr, length);
851 ums.Write(testStreamData, 0, length);
855 public void Write_Stream_ReadOnly ()
857 UnmanagedMemoryStream ums = new
858 UnmanagedMemoryStream(mem_byteptr, length);
860 ums.Write(testStreamData, 0, length);
862 } catch (NotSupportedException ex) {
863 // Stream does not support writing
864 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2");
865 Assert.IsNull (ex.InnerException, "#3");
866 Assert.IsNotNull (ex.Message, "#4");
872 public void WriteByte ()
874 UnmanagedMemoryStream ums = new
875 UnmanagedMemoryStream(mem_byteptr, 3, 5, FileAccess.ReadWrite);
876 ums.WriteByte (testStreamData [0]);
877 Assert.AreEqual (5, ums.Capacity, "#A1");
878 Assert.AreEqual (1, ums.Position, "#A2");
879 Assert.AreEqual (3, ums.Length, "#A3");
880 ums.WriteByte (testStreamData [1]);
881 Assert.AreEqual (5, ums.Capacity, "#B1");
882 Assert.AreEqual (2, ums.Position, "#B2");
883 Assert.AreEqual (3, ums.Length, "#B3");
884 ums.WriteByte (testStreamData [2]);
885 Assert.AreEqual (5, ums.Capacity, "#C1");
886 Assert.AreEqual (3, ums.Position, "#C2");
887 Assert.AreEqual (3, ums.Length, "#C3");
888 ums.WriteByte (testStreamData [3]);
889 Assert.AreEqual (5, ums.Capacity, "#D1");
890 Assert.AreEqual (4, ums.Position, "#D2");
891 Assert.AreEqual (4, ums.Length, "#D3");
892 ums.WriteByte (testStreamData [4]);
893 Assert.AreEqual (5, ums.Capacity, "#E1");
894 Assert.AreEqual (5, ums.Position, "#E2");
895 Assert.AreEqual (5, ums.Length, "#E3");
896 ums.Seek (0, SeekOrigin.Begin);
897 Assert.AreEqual (testStreamData [0], ums.ReadByte (), "#F1");
898 Assert.AreEqual (testStreamData [1], ums.ReadByte (), "#F2");
899 Assert.AreEqual (testStreamData [2], ums.ReadByte (), "#F3");
900 Assert.AreEqual (testStreamData [3], ums.ReadByte (), "#F4");
901 Assert.AreEqual (testStreamData [4], ums.ReadByte (), "#F5");
906 [ExpectedException (typeof (ObjectDisposedException))]
907 public void WriteByte_Stream_Closed ()
909 UnmanagedMemoryStream ums = new UnmanagedMemoryStream(mem_byteptr,
910 length, length, FileAccess.Write);
916 public void WriteByte_Capacity_Exceeded ()
918 UnmanagedMemoryStream ums = new
919 UnmanagedMemoryStream(mem_byteptr, 1, 2, FileAccess.ReadWrite);
920 ums.WriteByte (0x44);
921 ums.WriteByte (0x45);
923 ums.WriteByte (0x46);
925 } catch (NotSupportedException ex) {
926 // Unable to expand length of this stream beyond its capacity
927 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2");
928 Assert.IsNull (ex.InnerException, "#3");
929 Assert.IsNotNull (ex.Message, "#4");
935 public void WriteByte_Stream_ReadOnly ()
937 UnmanagedMemoryStream ums = new
938 UnmanagedMemoryStream(mem_byteptr, length);
940 ums.WriteByte (testStreamData [0]);
942 } catch (NotSupportedException ex) {
943 // Stream does not support writing
944 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2");
945 Assert.IsNull (ex.InnerException, "#3");
946 Assert.IsNotNull (ex.Message, "#4");
952 public void SetLength ()
954 UnmanagedMemoryStream ums = new UnmanagedMemoryStream(mem_byteptr,
955 length, capacity, FileAccess.ReadWrite);
956 ums.Write (testStreamData, 0, testStreamData.Length);
957 ums.SetLength (length - 1);
958 Assert.AreEqual (capacity, ums.Capacity, "#A1");
959 Assert.AreEqual (length - 1, ums.Length, "#A2");
960 Assert.AreEqual (length - 1, ums.Position, "#A3");
961 ums.SetLength (length + 1);
962 Assert.AreEqual (capacity, ums.Capacity, "#B1");
963 Assert.AreEqual (length + 1, ums.Length, "#B2");
964 Assert.AreEqual (length - 1, ums.Position, "#B3");
965 ums.SetLength (length);
966 Assert.AreEqual (capacity, ums.Capacity, "#C1");
967 Assert.AreEqual (length, ums.Length, "#C2");
968 Assert.AreEqual (length - 1, ums.Position, "#C3");
970 Assert.AreEqual (capacity, ums.Capacity, "#D1");
971 Assert.AreEqual (0, ums.Length, "#D2");
972 Assert.AreEqual (0, ums.Position, "#D3");
973 ums.SetLength (capacity);
974 Assert.AreEqual (capacity, ums.Capacity, "#E1");
975 Assert.AreEqual (capacity, ums.Length, "#E2");
976 Assert.AreEqual (0, ums.Position, "#E3");
981 public void SetLength_Capacity_Exceeded ()
983 UnmanagedMemoryStream ums = new UnmanagedMemoryStream(mem_byteptr,
984 length, capacity, FileAccess.ReadWrite);
986 ums.SetLength (capacity + 1);
988 } catch (IOException ex) {
989 // Unable to expand length of this stream beyond its capacity
990 Assert.AreEqual (typeof (IOException), ex.GetType (), "#2");
991 Assert.IsNull (ex.InnerException, "#3");
992 Assert.IsNotNull (ex.Message, "#4");
998 public void SetLength_Negative ()
1000 UnmanagedMemoryStream ums = new UnmanagedMemoryStream(mem_byteptr,
1001 length, capacity, FileAccess.ReadWrite);
1005 } catch (ArgumentOutOfRangeException ex) {
1006 // Non-negative number required
1007 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2");
1008 Assert.IsNull (ex.InnerException, "#3");
1009 Assert.IsNotNull (ex.Message, "#4");
1010 Assert.IsNotNull (ex.ParamName, "#5");
1011 Assert.AreEqual ("length", ex.ParamName, "#6");
1017 public void SetLength_Stream_ReadOnly ()
1019 UnmanagedMemoryStream ums = new UnmanagedMemoryStream(mem_byteptr,
1022 ums.SetLength (length);
1024 } catch (NotSupportedException ex) {
1025 // Stream does not support writing
1026 Assert.AreEqual (typeof (NotSupportedException), ex.GetType (), "#2");
1027 Assert.IsNull (ex.InnerException, "#3");
1028 Assert.IsNotNull (ex.Message, "#4");
1034 [ExpectedException (typeof (ObjectDisposedException))]
1035 public void Capacity_Stream_Closed ()
1037 UnmanagedMemoryStream ums = new
1038 UnmanagedMemoryStream(mem_byteptr, length);
1040 long capacity = ums.Capacity;
1044 [ExpectedException (typeof (ObjectDisposedException))]
1045 public void Length_Stream_Closed ()
1047 UnmanagedMemoryStream ums = new
1048 UnmanagedMemoryStream(mem_byteptr, length);
1050 long x = ums.Length;
1054 public void Position ()
1056 UnmanagedMemoryStream ums = new UnmanagedMemoryStream(mem_byteptr,
1057 length, capacity, FileAccess.ReadWrite);
1058 Assert.AreEqual (0, ums.Position, "#1");
1059 ums.Position = capacity;
1060 Assert.AreEqual (capacity, ums.Position, "#2");
1061 ums.Position = length;
1062 Assert.AreEqual (length, ums.Position, "#3");
1063 ums.Position = int.MaxValue;
1064 Assert.AreEqual (int.MaxValue, ums.Position, "#4");
1066 Assert.AreEqual (0, ums.Position, "#5");
1071 public void Position_MaxValue_Exceeded ()
1073 UnmanagedMemoryStream ums = new UnmanagedMemoryStream(mem_byteptr,
1074 length, capacity, FileAccess.ReadWrite);
1076 ums.Position = 0x80000000;
1078 } catch (ArgumentOutOfRangeException ex) {
1079 // MemoryStream length must be non-negative and less than
1080 // 2^31 - 1 - origin
1081 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2");
1082 Assert.IsNull (ex.InnerException, "#3");
1083 Assert.IsNotNull (ex.Message, "#4");
1084 Assert.IsNotNull (ex.ParamName, "#5");
1085 Assert.AreEqual ("value", ex.ParamName, "#6");
1091 public void Position_Negative ()
1093 UnmanagedMemoryStream ums = new
1094 UnmanagedMemoryStream(mem_byteptr, length);
1098 } catch (ArgumentOutOfRangeException ex) {
1099 // Non-negative number required
1100 Assert.AreEqual (typeof (ArgumentOutOfRangeException), ex.GetType (), "#2");
1101 Assert.IsNull (ex.InnerException, "#3");
1102 Assert.IsNotNull (ex.Message, "#4");
1103 Assert.IsNotNull (ex.ParamName, "#5");
1104 Assert.AreEqual ("value", ex.ParamName, "#6");
1110 public void Position_Overflow ()
1112 byte [] n = new byte [8];
1113 fixed (byte* p = n) {
1114 UnmanagedMemoryStream m = new UnmanagedMemoryStream (p, 8);
1115 Assert.AreEqual (0, m.Position, "Position-0");
1117 Assert.AreEqual (9, m.Position, "Position-1");
1119 byte* p2 = m.PositionPointer;
1120 Assert.Fail ("PositionPointer");
1122 catch (IndexOutOfRangeException) {
1129 public void Position_Stream_Closed ()
1131 UnmanagedMemoryStream ums = new
1132 UnmanagedMemoryStream(mem_byteptr, length);
1135 long x = ums.Position;
1136 Assert.Fail ("#1: " + x);
1137 } catch (ObjectDisposedException) {
1143 } catch (ObjectDisposedException) {
1148 public void PositionPointer_Stream_Closed ()
1150 UnmanagedMemoryStream ums = new
1151 UnmanagedMemoryStream(mem_byteptr, length);
1154 byte* bptr = ums.PositionPointer;
1156 } catch (ObjectDisposedException) {
1160 // position pointer to somewhere within the capacity
1161 ums.PositionPointer = (byte*) (capacity - 1);
1163 } catch (ObjectDisposedException) {
1168 [ExpectedException (typeof(IOException))]
1169 public void PositionPointer_Underflow ()
1171 byte [] n = new byte [8];
1172 fixed (byte *p = n){
1173 UnmanagedMemoryStream m = new UnmanagedMemoryStream (p, 8);
1174 m.PositionPointer = p-1;
1179 public void PositionPointer_Overflow ()
1181 byte [] n = new byte [8];
1182 fixed (byte* p = n) {
1183 UnmanagedMemoryStream m = new UnmanagedMemoryStream (p, 8);
1184 Assert.AreEqual (0, m.Position, "Position-0");
1185 m.PositionPointer = p + 9;
1186 Assert.AreEqual (9, m.Position, "Position-1");
1188 byte* p2 = m.PositionPointer;
1189 Assert.Fail ("PositionPointer");
1191 catch (IndexOutOfRangeException) {
1198 public void PositionPointer_Set ()
1200 byte [] n = new byte [8];
1202 fixed (byte* p = n) {
1203 UnmanagedMemoryStream m = new UnmanagedMemoryStream (p, 8, 8, FileAccess.ReadWrite);
1204 m.PositionPointer = p + 4;
1205 Assert.AreEqual (65, m.ReadByte (), "read");
1208 Assert.AreEqual (42, n [5], "write");
1211 class MyUnmanagedMemoryStream : UnmanagedMemoryStream {
1213 public MyUnmanagedMemoryStream ()
1217 public void MyInitialize (byte* pointer, long length, long capacity, FileAccess access)
1219 Initialize (pointer, length, capacity, access);
1224 public void Defaults_Can_Properties ()
1226 MyUnmanagedMemoryStream s = new MyUnmanagedMemoryStream ();
1227 Assert.IsFalse (s.CanRead, "CanRead");
1228 Assert.IsFalse (s.CanSeek, "CanSeek");
1229 Assert.IsFalse (s.CanWrite, "CanWrite");
1233 [ExpectedException (typeof (ObjectDisposedException))]
1234 public void Defaults_Capacity ()
1236 MyUnmanagedMemoryStream s = new MyUnmanagedMemoryStream ();
1237 Assert.AreEqual (0, s.Capacity, "Capacity");
1241 [ExpectedException (typeof (ObjectDisposedException))]
1242 public void Defaults_Length ()
1244 MyUnmanagedMemoryStream s = new MyUnmanagedMemoryStream ();
1245 Assert.AreEqual (0, s.Length, "Length");
1249 [ExpectedException (typeof (ObjectDisposedException))]
1250 public void Defaults_Position ()
1252 MyUnmanagedMemoryStream s = new MyUnmanagedMemoryStream ();
1253 Assert.AreEqual (0, s.Position, "Position");
1257 [ExpectedException (typeof (ObjectDisposedException))]
1258 public void Defaults_PositionPointer ()
1260 MyUnmanagedMemoryStream s = new MyUnmanagedMemoryStream ();
1261 byte* pp = s.PositionPointer;
1265 [ExpectedException (typeof (InvalidOperationException))]
1266 public void Defaults_ReadTimeout ()
1268 MyUnmanagedMemoryStream s = new MyUnmanagedMemoryStream ();
1269 Assert.AreEqual (0, s.ReadTimeout, "ReadTimeout");
1273 [ExpectedException (typeof (InvalidOperationException))]
1274 public void Defaults_WriteTimeout ()
1276 MyUnmanagedMemoryStream s = new MyUnmanagedMemoryStream ();
1277 Assert.AreEqual (0, s.WriteTimeout, "WriteTimeout");
1281 [ExpectedException (typeof (ArgumentNullException))]
1282 public void Initialize_Pointer_Null ()
1284 using (MyUnmanagedMemoryStream s = new MyUnmanagedMemoryStream ()) {
1285 s.MyInitialize (null, 0, 0, FileAccess.Read);
1290 [ExpectedException (typeof (ArgumentOutOfRangeException))]
1291 public void Initialize_Length_Negative ()
1293 using (MyUnmanagedMemoryStream s = new MyUnmanagedMemoryStream ()) {
1294 s.MyInitialize (mem_byteptr, -1, 0, FileAccess.Read);
1299 [ExpectedException (typeof (ArgumentOutOfRangeException))]
1300 public void Initialize_Capacity_Negative ()
1302 using (MyUnmanagedMemoryStream s = new MyUnmanagedMemoryStream ()) {
1303 s.MyInitialize (mem_byteptr, 0, -1, FileAccess.Read);
1308 [ExpectedException (typeof (ArgumentOutOfRangeException))]
1309 public void Initialize_Access_Invalid ()
1311 using (MyUnmanagedMemoryStream s = new MyUnmanagedMemoryStream ()) {
1312 s.MyInitialize (mem_byteptr, 0, 1, (FileAccess) Int32.MinValue);