2009-07-11 Michael Barker <mike@middlesoft.co.uk>
[mono.git] / mcs / class / corlib / Test / System.IO / BufferedStreamTest.cs
1 //
2 // System.IO.BufferedStream Unit Tests
3 //
4 // Authors: 
5 //      Ville Palo (vi64pa@kolumbus.fi)
6 //      Sebastien Pouliot  <sebastien@ximian.com>
7 //
8 // (C) 2003 Ville Palo
9 // Copyright (C) 2004 Novell (http://www.novell.com)
10 //
11
12 using NUnit.Framework;
13 using System.IO;
14 using System.Text;
15 using System;
16
17 namespace MonoTests.System.IO {
18
19 [TestFixture]
20 public class BufferedStreamTest {
21         
22         private MemoryStream mem;
23         
24         [SetUp]
25         protected void SetUp ()
26         {
27                 mem = new MemoryStream ();
28         }
29
30         [TearDown]
31         protected void TearDown ()
32         {
33                 //Some tests might mess with mem, so let's check it first
34                 if (mem != null)
35                         mem.Close ();
36         }
37
38
39         [Test]
40         public void Ctor ()
41         {
42                 MemoryStream str = new MemoryStream ();
43                 str.Write (new byte [] {1, 2, 3, 4, 5, 6}, 0, 6);
44                 BufferedStream stream = new BufferedStream (str);
45                 
46                 Assert.AreEqual (true, stream.CanRead, "test#01");
47                 Assert.AreEqual (true, stream.CanSeek, "test#02");
48                 Assert.AreEqual (true, stream.CanWrite, "test#03");
49                 Assert.AreEqual (6, stream.Length, "test#04");
50                 Assert.AreEqual (6, stream.Position, "test#05");
51                 
52                 string path = Path.GetTempFileName ();
53                 if (File.Exists (path))
54                         File.Delete (path);
55                 
56                 FileStream file = new FileStream (path, FileMode.OpenOrCreate, FileAccess.Write);
57                 stream = new BufferedStream (file);             
58                 Assert.AreEqual (false, stream.CanRead, "test#06");
59                 Assert.AreEqual (true, stream.CanSeek, "test#07");
60                 Assert.AreEqual (true, stream.CanWrite, "test#08");
61                 Assert.AreEqual (0, stream.Length, "test#09");
62                 Assert.AreEqual (0, stream.Position, "test#10");                
63                 file.Close ();
64                 
65                 if (File.Exists (path))
66                         File.Delete (path);
67                 
68                 file = new FileStream (path, FileMode.OpenOrCreate, FileAccess.Write);
69                 stream = new BufferedStream (file, 12);         
70                 Assert.AreEqual (false, stream.CanRead, "test#11");
71                 Assert.AreEqual (true, stream.CanSeek, "test#12");
72                 Assert.AreEqual (true, stream.CanWrite, "test#13");
73                 Assert.AreEqual (0, stream.Length, "test#14");
74                 Assert.AreEqual (0, stream.Position, "test#15");                
75
76                 file.Close ();
77                 if (File.Exists (path))
78                         File.Delete (path);
79         }
80
81         /// <summary>
82         /// Throws an exception if stream is null
83         /// </summary>
84         [Test]
85         [ExpectedException(typeof(ArgumentNullException))]
86         public void CtorNullExceptionStream () 
87         {
88                 BufferedStream stream = new BufferedStream (null);
89         }
90
91         /// <summary>
92         /// Throws an exception if stream is null
93         /// </summary>
94         [Test]
95         [ExpectedException(typeof(ArgumentNullException))]
96         public void CtorNullExceptionStream1 () 
97         {
98                 BufferedStream stream = new BufferedStream (null, 12);
99         }
100         
101         /// <summary>
102         /// Throws an exception if stream is null
103         /// </summary>
104         [Test]
105         [ExpectedException(typeof(ArgumentOutOfRangeException))]
106         public void CtorOutOfRangeExceptionStream1 () 
107         {
108                 MemoryStream str = new MemoryStream ();
109                 BufferedStream stream = new BufferedStream (str, -12);
110         }
111
112
113         [Test]
114         [ExpectedException(typeof(ObjectDisposedException))]
115         public void CtorOutOfRangeException2 () 
116         {
117                 MemoryStream str = new MemoryStream ();
118                 str.Close ();
119                 BufferedStream stream = new BufferedStream (str);               
120         }
121         
122         [Test]  
123         public void Close1 ()
124         {
125                 BufferedStream stream = new BufferedStream (mem);
126                 stream.Close ();
127                 stream.Close ();
128         }
129
130         [Test]  
131         public void Close2 ()
132         {
133                 BufferedStream stream = new BufferedStream (mem);
134                 stream.Close ();
135                 Assert.AreEqual (false, stream.CanRead, "test#01");
136                 Assert.AreEqual (false, stream.CanSeek, "test#02");
137                 Assert.AreEqual (false, stream.CanWrite, "test#03");
138         }
139
140         [Test]  
141         [ExpectedException(typeof(ObjectDisposedException))]    
142         public void Close3 ()
143         {
144                 BufferedStream stream = new BufferedStream (mem);
145                 stream.Close ();
146                 long l = stream.Position;
147         }
148
149         [Test]  
150         [ExpectedException(typeof(ObjectDisposedException))]    
151         public void Close4 ()
152         {
153                 BufferedStream stream = new BufferedStream (mem);
154                 stream.Close ();
155                 long l = stream.Length;
156         }
157         
158         [Test]  
159         [ExpectedException(typeof(ObjectDisposedException))]    
160         public void Close5 ()
161         {
162                 BufferedStream stream = new BufferedStream (mem);
163                 stream.Close ();
164                 stream.WriteByte (1);
165         }
166         
167         [Test]  
168         [ExpectedException(typeof(ObjectDisposedException))]    
169         public void Close6 ()
170         {
171                 BufferedStream stream = new BufferedStream (mem);
172                 stream.Close ();
173                 stream.ReadByte ();
174         }
175
176         [Test]  
177         [ExpectedException(typeof(NotSupportedException))]      
178         public void Close7 ()
179         {
180                 BufferedStream stream = new BufferedStream (mem);
181                 mem.Close ();
182                 stream.WriteByte (1);
183         }
184         
185         [Test]
186         public void Read ()
187         {
188                 mem.Write (new byte [] {0, 1, 2, 3, 4, 5, 6, 7}, 0, 8);
189                 BufferedStream stream = new BufferedStream (mem);
190
191                 byte [] bytes = new byte [10];
192                 stream.Read (bytes, 0, 3);
193                 Assert.AreEqual (0, bytes [0], "test#01");
194                 Assert.AreEqual (0, bytes [1], "test#02");
195                 Assert.AreEqual (0, bytes [2], "test#03");
196
197                 stream.Seek (0, SeekOrigin.Begin);
198                 stream.Read (bytes, 0, 3);
199                 Assert.AreEqual (0, bytes [0], "test#04");
200                 Assert.AreEqual (1, bytes [1], "test#05");
201                 Assert.AreEqual (2, bytes [2], "test#06");
202                 Assert.AreEqual (0, bytes [0], "test#07");              
203
204                 stream.Read (bytes, 5, 3);
205                 Assert.AreEqual (3, bytes [5], "test#08");
206                 Assert.AreEqual (4, bytes [6], "test#09");
207                 Assert.AreEqual (5, bytes [7], "test#10");
208                 Assert.AreEqual (0, bytes [8], "test#11");              
209
210                 stream.Read (bytes, 0, 10);
211                 Assert.AreEqual (3, bytes [5], "test#12");
212                 Assert.AreEqual (4, bytes [6], "test#13");
213                 Assert.AreEqual (5, bytes [7], "test#14");
214                 Assert.AreEqual (0, bytes [9], "test#15");                              
215         }
216         
217         [Test]
218         [ExpectedException(typeof(ArgumentException))]          
219         public void ReadException ()
220         {
221                 mem.Write (new byte [] {0, 1, 2, 3, 4, 5, 6, 7}, 0, 8);
222                 BufferedStream stream = new BufferedStream (mem);
223
224                 byte [] bytes = new byte [10];
225                 stream.Read (bytes, 0, 30);             
226         }
227
228         [Test]
229         [ExpectedException(typeof(ArgumentNullException))]
230         public void Read_Null () 
231         {
232                 BufferedStream stream = new BufferedStream (mem);
233                 stream.Read (null, 0, 0);
234         }
235
236         [Test]
237         [ExpectedException(typeof(NotSupportedException))]
238         public void Read_CantRead () 
239         {
240                 WriteOnlyStream wo = new WriteOnlyStream ();
241                 BufferedStream stream = new BufferedStream (wo);
242                 stream.Read (new byte [1], 0, 1);
243         }
244
245         [Test]
246         [ExpectedException(typeof(ArgumentOutOfRangeException))]
247         public void Read_OffsetNegative () 
248         {
249                 BufferedStream stream = new BufferedStream (mem);
250                 stream.Read (new byte [1], -1, 1); 
251         }
252
253         [Test]
254         [ExpectedException(typeof(ArgumentException))]
255         public void Read_OffsetOverflow () 
256         {
257                 BufferedStream stream = new BufferedStream (mem);
258                 stream.Read (new byte [1], Int32.MaxValue, 1); 
259         }
260
261         [Test]
262         [ExpectedException(typeof(ArgumentOutOfRangeException))]
263         public void Read_CountNegative () 
264         {
265                 BufferedStream stream = new BufferedStream (mem);
266                 stream.Read (new byte [1], 1, -1); 
267         }
268
269         [Test]
270         [ExpectedException(typeof(ArgumentException))]
271         public void Read_CountOverflow () 
272         {
273                 BufferedStream stream = new BufferedStream (mem);
274                 stream.Read (new byte [1], 1, Int32.MaxValue); 
275         }
276         
277         [Test]
278         public void ReadByte ()
279         {
280                 mem.Write (new byte [] {0, 1, 2, 3, 4, 5, 6, 7}, 0, 8);
281                 BufferedStream stream = new BufferedStream (mem);
282
283                 Assert.AreEqual (-1, stream.ReadByte (), "test#01");
284                 Assert.AreEqual (-1, stream.ReadByte (), "test#02");
285                 Assert.AreEqual (-1, stream.ReadByte (), "test#03");
286
287                 stream.Seek (0, SeekOrigin.Begin);
288                 Assert.AreEqual (0, stream.ReadByte (), "test#04");
289                 Assert.AreEqual (1, stream.ReadByte (), "test#05");
290                 Assert.AreEqual (2, stream.ReadByte (), "test#06");
291                 Assert.AreEqual (3, stream.ReadByte (), "test#07");             
292         }
293         
294         [Test]
295         public void Write ()
296         {
297                 BufferedStream stream = new BufferedStream (mem);
298                 
299                 stream.Write (new byte [] {0, 1, 2, 3, 4}, 0, 4);
300                 Assert.AreEqual (4, stream.Length, "test#01");
301                 byte [] bytes = mem.GetBuffer ();
302                 Assert.AreEqual (0, bytes [0], "test#02");
303                 Assert.AreEqual (1, bytes [1], "test#03");
304                 Assert.AreEqual (2, bytes [2], "test#04");
305                 Assert.AreEqual (3, bytes [3], "test#05");
306
307                 bytes = new byte [] {1, 4, 3};
308                 stream.Write (bytes, 0, 3);
309                 stream.Flush ();
310                 bytes = mem.GetBuffer ();               
311                 Assert.AreEqual (0, bytes [0], "test#06");
312                 Assert.AreEqual (1, bytes [1], "test#07");
313                 Assert.AreEqual (2, bytes [2], "test#08");
314                 Assert.AreEqual (3, bytes [3], "test#09");
315                 Assert.AreEqual (1, bytes [4], "test#10");
316                 Assert.AreEqual (4, bytes [5], "test#11");
317                 Assert.AreEqual (3, bytes [6], "test#10");
318                 Assert.AreEqual (0, bytes [7], "test#11");
319                 Assert.AreEqual (7, stream.Length, "test#12");
320         }
321                 
322         [Test]
323         [ExpectedException(typeof (ArgumentException))]
324         public void WriteException ()
325         {
326                 BufferedStream stream = new BufferedStream (mem);
327                 stream.Write (new byte [] {0,1,2,3}, 0, 10);
328         }
329
330         [Test]
331         [ExpectedException(typeof(ArgumentNullException))]
332         public void Write_Null () 
333         {
334                 BufferedStream stream = new BufferedStream (mem);
335                 stream.Write (null, 0, 0);
336         }
337
338         [Test]
339         [ExpectedException(typeof(NotSupportedException))]
340         public void Write_CantWrite () 
341         {
342                 ReadOnlyStream ro = new ReadOnlyStream ();
343                 BufferedStream stream = new BufferedStream (ro);
344                 stream.Write (new byte [1], 0, 1);
345         }
346
347         [Test]
348         [ExpectedException(typeof(ArgumentOutOfRangeException))]
349         public void Write_OffsetNegative () 
350         {
351                 BufferedStream stream = new BufferedStream (mem);
352                 stream.Write (new byte [1], -1, 1); 
353         }
354
355         [Test]
356         [ExpectedException(typeof(ArgumentException))]
357         public void Write_OffsetOverflow () 
358         {
359                 BufferedStream stream = new BufferedStream (mem);
360                 stream.Write (new byte [1], Int32.MaxValue, 1); 
361         }
362
363         [Test]
364         [ExpectedException(typeof(ArgumentOutOfRangeException))]
365         public void Write_CountNegative () 
366         {
367                 BufferedStream stream = new BufferedStream (mem);
368                 stream.Write (new byte [1], 1, -1); 
369         }
370
371         [Test]
372         [ExpectedException(typeof(ArgumentException))]
373         public void Write_CountOverflow () 
374         {
375                 BufferedStream stream = new BufferedStream (mem);
376                 stream.Write (new byte [1], 1, Int32.MaxValue); 
377         }
378         
379         [Test]
380         public void WriteByte ()
381         {
382                 BufferedStream stream = new BufferedStream (mem);
383                 stream.WriteByte (1);
384                 stream.WriteByte (2);
385                 stream.WriteByte (3);
386                 stream.Flush ();
387                 Assert.AreEqual (256, mem.GetBuffer ().Length, "test#01");
388                 Assert.AreEqual (3, stream.Length, "test#02");
389                 Assert.AreEqual (1, mem.GetBuffer () [0], "test#03");
390                 Assert.AreEqual (2, mem.GetBuffer () [1], "test#04");
391                 Assert.AreEqual (3, mem.GetBuffer () [2], "test#05");           
392         }
393         
394         [Test]
395         public void Flush ()
396         {
397                 BufferedStream stream = new BufferedStream (mem);
398                 stream.WriteByte (1);
399                 stream.WriteByte (2);
400                 
401                 byte [] bytes = mem.GetBuffer ();
402                 Assert.AreEqual (0, bytes.Length, "test#01");
403                 stream.Flush ();
404                 
405                 bytes = mem.GetBuffer ();
406                 Assert.AreEqual (256, bytes.Length, "test#02");
407                 Assert.AreEqual (1, bytes [0], "test#03");
408                 Assert.AreEqual (2, bytes [1], "test#04");
409                 mem.Close ();
410                 mem = new MemoryStream ();
411                 bytes = new byte [] {0, 1, 2, 3, 4, 5};
412                 stream = new BufferedStream (mem);
413                 stream.Write (bytes, 0, 2);
414                 Assert.AreEqual (2, stream.Length, "test#05");
415                 bytes = mem.GetBuffer ();
416                 Assert.AreEqual (256, bytes.Length, "test#06");
417
418                 Assert.AreEqual (0, bytes [0], "test#07");
419                 Assert.AreEqual (1, bytes [1], "test#08");
420                 
421                 stream.Write (bytes, 0, 2);
422                 
423                 bytes = mem.GetBuffer ();
424                 Assert.AreEqual (0, bytes [0], "test#09");
425                 Assert.AreEqual (1, bytes [1], "test#10");
426                 Assert.AreEqual (0, bytes [2], "test#11");
427                 Assert.AreEqual (0, bytes [3], "test#12");
428                 stream.Flush ();
429                 bytes = mem.GetBuffer ();
430                 Assert.AreEqual (0, bytes [2], "test#13");
431                 Assert.AreEqual (1, bytes [3], "test#14");
432         }
433         
434         [Test]
435         public void Seek ()
436         {
437                 BufferedStream stream = new BufferedStream (mem);
438                 stream.Write (new byte [] {0, 1, 2, 3, 4, 5}, 0, 6);
439                 
440                 Assert.AreEqual (6, stream.Position, "test#01");
441                 
442                 stream.Seek (-5, SeekOrigin.End);               
443                 Assert.AreEqual (1, stream.Position, "test#02");
444                 
445                 stream.Seek (3, SeekOrigin.Current);
446                 Assert.AreEqual (4, stream.Position, "test#03");
447                 
448                 stream.Seek (300, SeekOrigin.Current);          
449                 Assert.AreEqual (304, stream.Position, "test#04");              
450         }
451         
452         [Test]
453         [ExpectedException(typeof (IOException))]
454         public void SeekException ()
455         {
456                 BufferedStream stream = new BufferedStream (mem);
457                 stream.Seek (-1, SeekOrigin.Begin);
458         }
459         
460         [Test]
461         public void SetLength ()
462         {
463                 BufferedStream stream = new BufferedStream (mem);
464                 stream.Write (new byte [] {0,1,2,3,4,5}, 0, 6);
465                 
466                 Assert.AreEqual (6, stream.Length, "test#01");
467                 stream.SetLength (60);
468                 Assert.AreEqual (60, stream.Length, "test#02");
469                 
470                 stream.SetLength (2);
471                 Assert.AreEqual (2, stream.Length, "test#03");  
472         }
473         
474          [Test]
475          [ExpectedException(typeof(ArgumentOutOfRangeException))]
476          public void SetLengthException ()
477          {
478                 BufferedStream stream = new BufferedStream (mem);
479                 stream.SetLength (-1);          
480          }
481
482          [Test]
483          [ExpectedException(typeof(NotSupportedException))]
484          public void SetLengthException2 ()
485          {
486                 BufferedStream stream = new BufferedStream (mem);
487                 mem.Close ();
488                 stream.SetLength (1);           
489          }
490
491          [Test]
492          public void SetLengthException3 ()
493          {
494                 BufferedStream stream = new BufferedStream (mem);
495                 mem = null;
496                 // Strangely, this does not throw an exception on .NET 1.1
497                 stream.SetLength (1);           
498          }
499          
500          [Test]
501          public void Position ()
502          {
503                 mem = new MemoryStream ();
504                 BufferedStream stream = new BufferedStream (mem,5);
505                 stream.Write (new byte [] {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}, 0, 16);
506                 
507                 stream.Position = 0;
508                 Assert.AreEqual (0, stream.Position, "test#01");                
509                 Assert.AreEqual (0, stream.ReadByte (), "test#02");             
510                 
511                 stream.Position = 5;
512                 Assert.AreEqual (5, stream.Position, "test#01");                
513                 Assert.AreEqual (5, stream.ReadByte (), "test#02");             
514                 
515                 // Should not need to read from the underlying stream:
516                 stream.Position = 7;
517                 Assert.AreEqual (7, stream.Position, "test#01");                
518                 Assert.AreEqual (7, stream.ReadByte (), "test#02");             
519                 
520                 // Should not need to read from the underlying stream:
521                 stream.Position = 5;
522                 Assert.AreEqual (5, stream.Position, "test#01");                
523                 Assert.AreEqual (5, stream.ReadByte (), "test#02");             
524                                 
525                 // Should not need to read from the underlying stream:
526                 stream.Position = 9;
527                 Assert.AreEqual (9, stream.Position, "test#01");
528                 Assert.AreEqual (9, stream.ReadByte (), "test#02");
529                 
530                 stream.Position = 10;
531                 Assert.AreEqual (10, stream.Position, "test#01");               
532                 Assert.AreEqual (10, stream.ReadByte (), "test#02");            
533                 
534                 stream.Position = 9;
535                 Assert.AreEqual (9, stream.Position, "test#01");                
536                 Assert.AreEqual (9, stream.ReadByte (), "test#02");             
537          }
538
539         [Test]
540         public void PositionAfterSetLength () 
541         {
542                 BufferedStream stream = new BufferedStream (new MemoryStream ());
543                 stream.SetLength (32);
544                 stream.Position = 32;
545                 stream.SetLength (16);
546                 Assert.AreEqual (16, stream.Position, "Position==16");
547         }
548
549         [Test]
550         [ExpectedException (typeof (ObjectDisposedException))]
551         public void SetLength_Disposed ()
552         {
553                 BufferedStream stream = new BufferedStream (new MemoryStream ());
554                 stream.Close ();
555                 stream.SetLength (16);
556         }
557
558         [Test]
559         [ExpectedException (typeof (NotSupportedException))]
560         public void Seek_ClosedMemoryStream ()
561         {
562                 MemoryStream ms = new MemoryStream ();
563                 BufferedStream stream = new BufferedStream (ms);
564                 ms.Close ();
565                 stream.Seek (0, SeekOrigin.Begin);
566         }
567
568         [Test]
569         [ExpectedException (typeof (ObjectDisposedException))]
570         public void Seek_ClosedBufferedStream ()
571         {
572                 BufferedStream stream = new BufferedStream (new MemoryStream ());
573                 stream.Close ();
574                 stream.Seek (0, SeekOrigin.Begin);
575         }
576 }
577 }