You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

CachedNetworkStreamTest.cs 2.5 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. using Microsoft.VisualStudio.TestTools.UnitTesting;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Text;
  6. using Shadowsocks.Controller;
  7. namespace Shadowsocks.Test
  8. {
  9. [TestClass]
  10. public class CachedNetworkStreamTest
  11. {
  12. byte[] b0 = new byte[256];
  13. byte[] b1 = new byte[256];
  14. byte[] b2 = new byte[1024];
  15. // [TestInitialize]
  16. [TestInitialize]
  17. public void init()
  18. {
  19. for (int i = 0; i < 256; i++)
  20. {
  21. b0[i] = (byte)i;
  22. b1[i] = (byte)(255 - i);
  23. }
  24. b0.CopyTo(b2, 0);
  25. b1.CopyTo(b2, 256);
  26. b0.CopyTo(b2, 512);
  27. }
  28. [TestMethod]
  29. public void StreamTest()
  30. {
  31. using MemoryStream ms = new MemoryStream(b2);
  32. using CachedNetworkStream s = new CachedNetworkStream(ms);
  33. byte[] o = new byte[128];
  34. Assert.AreEqual(128, s.Read(o, 0, 128));
  35. TestUtils.ArrayEqual(b0[0..128], o);
  36. Assert.AreEqual(64, s.Read(o, 0, 64));
  37. TestUtils.ArrayEqual(b0[128..192], o[0..64]);
  38. s.Seek(0, SeekOrigin.Begin);
  39. Assert.AreEqual(64, s.Read(o, 0, 64));
  40. TestUtils.ArrayEqual(b0[0..64], o[0..64]);
  41. // refuse to go out of cached range
  42. Assert.ThrowsException<NotSupportedException>(() =>
  43. {
  44. s.Seek(193, SeekOrigin.Begin);
  45. });
  46. Assert.AreEqual(128, s.Read(o, 0, 128));
  47. TestUtils.ArrayEqual(b0[64..192], o);
  48. Assert.IsTrue(s.CanSeek);
  49. Assert.AreEqual(128, s.Read(o, 0, 128));
  50. TestUtils.ArrayEqual(b0[192..256], o[0..64]);
  51. TestUtils.ArrayEqual(b1[0..64], o[64..128]);
  52. Assert.IsFalse(s.CanSeek);
  53. // refuse to go back when non-cache data has been read
  54. Assert.ThrowsException<NotSupportedException>(() =>
  55. {
  56. s.Seek(0, SeekOrigin.Begin);
  57. });
  58. // read in non-cache range
  59. Assert.AreEqual(64, s.Read(o, 0, 64));
  60. s.Read(o, 0, 128);
  61. Assert.AreEqual(512, s.Position);
  62. Assert.AreEqual(128, s.Read(o, 0, 128));
  63. TestUtils.ArrayEqual(b0[0..128], o);
  64. s.Read(o, 0, 128);
  65. s.Read(o, 0, 128);
  66. s.Read(o, 0, 128);
  67. // read at eos
  68. Assert.AreEqual(0, s.Read(o, 0, 128));
  69. }
  70. }
  71. }