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] SetUp()25 protected void SetUp () 26 { 27 mem = new MemoryStream (); 28 } 29 30 [TearDown] 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] Ctor()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))] CtorNullExceptionStream()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))] CtorNullExceptionStream1()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))] CtorOutOfRangeExceptionStream1()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))] CtorOutOfRangeException2()115 public void CtorOutOfRangeException2 () 116 { 117 MemoryStream str = new MemoryStream (); 118 str.Close (); 119 BufferedStream stream = new BufferedStream (str); 120 } 121 122 [Test] Close1()123 public void Close1 () 124 { 125 BufferedStream stream = new BufferedStream (mem); 126 stream.Close (); 127 stream.Close (); 128 } 129 130 [Test] Close2()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))] Close3()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))] Close4()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))] Close5()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))] Close6()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))] Close7()178 public void Close7 () 179 { 180 BufferedStream stream = new BufferedStream (mem); 181 mem.Close (); 182 stream.WriteByte (1); 183 } 184 185 [Test] Read()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))] ReadException()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))] Read_Null()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))] Read_CantRead()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(NotSupportedException))] ReadByte_CantRead()247 public void ReadByte_CantRead () 248 { 249 WriteOnlyStream wo = new WriteOnlyStream (); 250 BufferedStream stream = new BufferedStream (wo); 251 stream.ReadByte (); 252 } 253 254 [Test] 255 [ExpectedException(typeof(ArgumentOutOfRangeException))] Read_OffsetNegative()256 public void Read_OffsetNegative () 257 { 258 BufferedStream stream = new BufferedStream (mem); 259 stream.Read (new byte [1], -1, 1); 260 } 261 262 [Test] 263 [ExpectedException(typeof(ArgumentException))] Read_OffsetOverflow()264 public void Read_OffsetOverflow () 265 { 266 BufferedStream stream = new BufferedStream (mem); 267 stream.Read (new byte [1], Int32.MaxValue, 1); 268 } 269 270 [Test] 271 [ExpectedException(typeof(ArgumentOutOfRangeException))] Read_CountNegative()272 public void Read_CountNegative () 273 { 274 BufferedStream stream = new BufferedStream (mem); 275 stream.Read (new byte [1], 1, -1); 276 } 277 278 [Test] 279 [ExpectedException(typeof(ArgumentException))] Read_CountOverflow()280 public void Read_CountOverflow () 281 { 282 BufferedStream stream = new BufferedStream (mem); 283 stream.Read (new byte [1], 1, Int32.MaxValue); 284 } 285 286 [Test] ReadByte()287 public void ReadByte () 288 { 289 mem.Write (new byte [] {0, 1, 2, 3, 4, 5, 6, 7}, 0, 8); 290 BufferedStream stream = new BufferedStream (mem); 291 292 Assert.AreEqual (-1, stream.ReadByte (), "test#01"); 293 Assert.AreEqual (-1, stream.ReadByte (), "test#02"); 294 Assert.AreEqual (-1, stream.ReadByte (), "test#03"); 295 296 stream.Seek (0, SeekOrigin.Begin); 297 Assert.AreEqual (0, stream.ReadByte (), "test#04"); 298 Assert.AreEqual (1, stream.ReadByte (), "test#05"); 299 Assert.AreEqual (2, stream.ReadByte (), "test#06"); 300 Assert.AreEqual (3, stream.ReadByte (), "test#07"); 301 } 302 303 [Test] Write()304 public void Write () 305 { 306 BufferedStream stream = new BufferedStream (mem); 307 308 stream.Write (new byte [] {0, 1, 2, 3, 4}, 0, 4); 309 Assert.AreEqual (4, stream.Length, "test#01"); 310 byte [] bytes = mem.GetBuffer (); 311 Assert.AreEqual (0, bytes [0], "test#02"); 312 Assert.AreEqual (1, bytes [1], "test#03"); 313 Assert.AreEqual (2, bytes [2], "test#04"); 314 Assert.AreEqual (3, bytes [3], "test#05"); 315 316 bytes = new byte [] {1, 4, 3}; 317 stream.Write (bytes, 0, 3); 318 stream.Flush (); 319 bytes = mem.GetBuffer (); 320 Assert.AreEqual (0, bytes [0], "test#06"); 321 Assert.AreEqual (1, bytes [1], "test#07"); 322 Assert.AreEqual (2, bytes [2], "test#08"); 323 Assert.AreEqual (3, bytes [3], "test#09"); 324 Assert.AreEqual (1, bytes [4], "test#10"); 325 Assert.AreEqual (4, bytes [5], "test#11"); 326 Assert.AreEqual (3, bytes [6], "test#10"); 327 Assert.AreEqual (0, bytes [7], "test#11"); 328 Assert.AreEqual (7, stream.Length, "test#12"); 329 } 330 331 [Test] 332 [ExpectedException(typeof (ArgumentException))] WriteException()333 public void WriteException () 334 { 335 BufferedStream stream = new BufferedStream (mem); 336 stream.Write (new byte [] {0,1,2,3}, 0, 10); 337 } 338 339 [Test] 340 [ExpectedException(typeof(ArgumentNullException))] Write_Null()341 public void Write_Null () 342 { 343 BufferedStream stream = new BufferedStream (mem); 344 stream.Write (null, 0, 0); 345 } 346 347 [Test] 348 [ExpectedException(typeof(NotSupportedException))] Write_CantWrite()349 public void Write_CantWrite () 350 { 351 ReadOnlyStream ro = new ReadOnlyStream (); 352 BufferedStream stream = new BufferedStream (ro); 353 stream.Write (new byte [1], 0, 1); 354 } 355 356 [Test] 357 [ExpectedException(typeof(NotSupportedException))] WriteByte_CantWrite()358 public void WriteByte_CantWrite () 359 { 360 ReadOnlyStream ro = new ReadOnlyStream (); 361 BufferedStream stream = new BufferedStream (ro); 362 stream.WriteByte (0); 363 } 364 365 [Test] 366 [ExpectedException(typeof(ArgumentOutOfRangeException))] Write_OffsetNegative()367 public void Write_OffsetNegative () 368 { 369 BufferedStream stream = new BufferedStream (mem); 370 stream.Write (new byte [1], -1, 1); 371 } 372 373 [Test] 374 [ExpectedException(typeof(ArgumentException))] Write_OffsetOverflow()375 public void Write_OffsetOverflow () 376 { 377 BufferedStream stream = new BufferedStream (mem); 378 stream.Write (new byte [1], Int32.MaxValue, 1); 379 } 380 381 [Test] 382 [ExpectedException(typeof(ArgumentOutOfRangeException))] Write_CountNegative()383 public void Write_CountNegative () 384 { 385 BufferedStream stream = new BufferedStream (mem); 386 stream.Write (new byte [1], 1, -1); 387 } 388 389 [Test] 390 [ExpectedException(typeof(ArgumentException))] Write_CountOverflow()391 public void Write_CountOverflow () 392 { 393 BufferedStream stream = new BufferedStream (mem); 394 stream.Write (new byte [1], 1, Int32.MaxValue); 395 } 396 397 [Test] WriteByte()398 public void WriteByte () 399 { 400 BufferedStream stream = new BufferedStream (mem); 401 stream.WriteByte (1); 402 stream.WriteByte (2); 403 stream.WriteByte (3); 404 stream.Flush (); 405 Assert.AreEqual (256, mem.GetBuffer ().Length, "test#01"); 406 Assert.AreEqual (3, stream.Length, "test#02"); 407 Assert.AreEqual (1, mem.GetBuffer () [0], "test#03"); 408 Assert.AreEqual (2, mem.GetBuffer () [1], "test#04"); 409 Assert.AreEqual (3, mem.GetBuffer () [2], "test#05"); 410 } 411 412 [Test] Flush()413 public void Flush () 414 { 415 BufferedStream stream = new BufferedStream (mem); 416 stream.WriteByte (1); 417 stream.WriteByte (2); 418 419 byte [] bytes = mem.GetBuffer (); 420 Assert.AreEqual (0, bytes.Length, "test#01"); 421 stream.Flush (); 422 423 bytes = mem.GetBuffer (); 424 Assert.AreEqual (256, bytes.Length, "test#02"); 425 Assert.AreEqual (1, bytes [0], "test#03"); 426 Assert.AreEqual (2, bytes [1], "test#04"); 427 mem.Close (); 428 mem = new MemoryStream (); 429 bytes = new byte [] {0, 1, 2, 3, 4, 5}; 430 stream = new BufferedStream (mem); 431 stream.Write (bytes, 0, 2); 432 Assert.AreEqual (2, stream.Length, "test#05"); 433 bytes = mem.GetBuffer (); 434 Assert.AreEqual (256, bytes.Length, "test#06"); 435 436 Assert.AreEqual (0, bytes [0], "test#07"); 437 Assert.AreEqual (1, bytes [1], "test#08"); 438 439 stream.Write (bytes, 0, 2); 440 441 bytes = mem.GetBuffer (); 442 Assert.AreEqual (0, bytes [0], "test#09"); 443 Assert.AreEqual (1, bytes [1], "test#10"); 444 Assert.AreEqual (0, bytes [2], "test#11"); 445 Assert.AreEqual (0, bytes [3], "test#12"); 446 stream.Flush (); 447 bytes = mem.GetBuffer (); 448 Assert.AreEqual (0, bytes [2], "test#13"); 449 Assert.AreEqual (1, bytes [3], "test#14"); 450 } 451 452 [Test] Seek()453 public void Seek () 454 { 455 BufferedStream stream = new BufferedStream (mem); 456 stream.Write (new byte [] {0, 1, 2, 3, 4, 5}, 0, 6); 457 458 Assert.AreEqual (6, stream.Position, "test#01"); 459 460 stream.Seek (-5, SeekOrigin.End); 461 Assert.AreEqual (1, stream.Position, "test#02"); 462 463 stream.Seek (3, SeekOrigin.Current); 464 Assert.AreEqual (4, stream.Position, "test#03"); 465 466 stream.Seek (300, SeekOrigin.Current); 467 Assert.AreEqual (304, stream.Position, "test#04"); 468 } 469 470 [Test] 471 [ExpectedException(typeof (IOException))] SeekException()472 public void SeekException () 473 { 474 BufferedStream stream = new BufferedStream (mem); 475 stream.Seek (-1, SeekOrigin.Begin); 476 } 477 478 [Test] SetLength()479 public void SetLength () 480 { 481 BufferedStream stream = new BufferedStream (mem); 482 stream.Write (new byte [] {0,1,2,3,4,5}, 0, 6); 483 484 Assert.AreEqual (6, stream.Length, "test#01"); 485 stream.SetLength (60); 486 Assert.AreEqual (60, stream.Length, "test#02"); 487 488 stream.SetLength (2); 489 Assert.AreEqual (2, stream.Length, "test#03"); 490 } 491 492 [Test] 493 [ExpectedException(typeof(ArgumentOutOfRangeException))] SetLengthException()494 public void SetLengthException () 495 { 496 BufferedStream stream = new BufferedStream (mem); 497 stream.SetLength (-1); 498 } 499 500 [Test] 501 [ExpectedException(typeof(NotSupportedException))] SetLengthException2()502 public void SetLengthException2 () 503 { 504 BufferedStream stream = new BufferedStream (mem); 505 mem.Close (); 506 stream.SetLength (1); 507 } 508 509 [Test] SetLengthException3()510 public void SetLengthException3 () 511 { 512 BufferedStream stream = new BufferedStream (mem); 513 mem = null; 514 // Strangely, this does not throw an exception on .NET 1.1 515 stream.SetLength (1); 516 } 517 518 [Test] Position()519 public void Position () 520 { 521 mem = new MemoryStream (); 522 BufferedStream stream = new BufferedStream (mem,5); 523 stream.Write (new byte [] {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}, 0, 16); 524 525 stream.Position = 0; 526 Assert.AreEqual (0, stream.Position, "test#01"); 527 Assert.AreEqual (0, stream.ReadByte (), "test#02"); 528 529 stream.Position = 5; 530 Assert.AreEqual (5, stream.Position, "test#01"); 531 Assert.AreEqual (5, stream.ReadByte (), "test#02"); 532 533 // Should not need to read from the underlying stream: 534 stream.Position = 7; 535 Assert.AreEqual (7, stream.Position, "test#01"); 536 Assert.AreEqual (7, stream.ReadByte (), "test#02"); 537 538 // Should not need to read from the underlying stream: 539 stream.Position = 5; 540 Assert.AreEqual (5, stream.Position, "test#01"); 541 Assert.AreEqual (5, stream.ReadByte (), "test#02"); 542 543 // Should not need to read from the underlying stream: 544 stream.Position = 9; 545 Assert.AreEqual (9, stream.Position, "test#01"); 546 Assert.AreEqual (9, stream.ReadByte (), "test#02"); 547 548 stream.Position = 10; 549 Assert.AreEqual (10, stream.Position, "test#01"); 550 Assert.AreEqual (10, stream.ReadByte (), "test#02"); 551 552 stream.Position = 9; 553 Assert.AreEqual (9, stream.Position, "test#01"); 554 Assert.AreEqual (9, stream.ReadByte (), "test#02"); 555 } 556 557 [Test] PositionAfterSetLength()558 public void PositionAfterSetLength () 559 { 560 BufferedStream stream = new BufferedStream (new MemoryStream ()); 561 stream.SetLength (32); 562 stream.Position = 32; 563 stream.SetLength (16); 564 Assert.AreEqual (16, stream.Position, "Position==16"); 565 } 566 567 [Test] 568 [ExpectedException (typeof (ObjectDisposedException))] SetLength_Disposed()569 public void SetLength_Disposed () 570 { 571 BufferedStream stream = new BufferedStream (new MemoryStream ()); 572 stream.Close (); 573 stream.SetLength (16); 574 } 575 576 [Test] 577 [ExpectedException (typeof (NotSupportedException))] Seek_ClosedMemoryStream()578 public void Seek_ClosedMemoryStream () 579 { 580 MemoryStream ms = new MemoryStream (); 581 BufferedStream stream = new BufferedStream (ms); 582 ms.Close (); 583 stream.Seek (0, SeekOrigin.Begin); 584 } 585 586 [Test] 587 [ExpectedException (typeof (ObjectDisposedException))] Seek_ClosedBufferedStream()588 public void Seek_ClosedBufferedStream () 589 { 590 BufferedStream stream = new BufferedStream (new MemoryStream ()); 591 stream.Close (); 592 stream.Seek (0, SeekOrigin.Begin); 593 } 594 } 595 } 596