UnmanagedMemoryStreamTest.cs 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. //
  2. // System.IO.UnmanagedMemoryStreamTest.cs
  3. //
  4. // Authors:
  5. // Sridhar Kulkarni ([email protected])
  6. //
  7. // (c) 2006 Sridhar Kulkarni.
  8. // Copyright (C) 2004 Novell (http://www.novell.com)
  9. //
  10. #if NET_2_0 && !TARGET_JVM
  11. using NUnit.Framework;
  12. using System.IO;
  13. using System;
  14. using System.Text;
  15. using System.Runtime.InteropServices;
  16. using System.Collections;
  17. namespace MonoTests.System.IO
  18. {
  19. [TestFixture]
  20. public unsafe class UnmanagedMemoryStreamTest {
  21. UnmanagedMemoryStream testunmanagedStream;
  22. byte[] testStreamData;
  23. byte[] readData;
  24. IntPtr mem_intptr = IntPtr.Zero;
  25. byte* mem_byteptr = null;
  26. int length;
  27. int capacity;
  28. [SetUp]
  29. void SetUp()
  30. {
  31. testStreamData = UnicodeEncoding.Unicode.GetBytes("Here is some mono testdata");
  32. mem_intptr = Marshal.AllocHGlobal(testStreamData.Length);
  33. mem_byteptr = (byte*)mem_intptr.ToPointer();
  34. length = testStreamData.Length;
  35. capacity = testStreamData.Length;
  36. readData = new byte[length];
  37. }
  38. public void AssertIsNull(string message, object obj)
  39. {
  40. Assert.IsNull(obj, message);
  41. }
  42. public void AssertEquals(string message, long expected, long actual)
  43. {
  44. Assert.AreEqual(expected, actual, message);
  45. }
  46. public void AssertEquals(string message, int expected, int actual)
  47. {
  48. Assert.AreEqual(expected, actual, message);
  49. }
  50. //
  51. // Verify that the first count bytes in testBytes are the same as
  52. // the count bytes from index start in testStreamData
  53. //
  54. void VerifyTestData(string id, byte[] testBytes, int start, int count)
  55. {
  56. if (testBytes == null)
  57. Assert.Fail(id + "+1 testBytes is null");
  58. if (start < 0 ||
  59. count < 0 ||
  60. start + count > testStreamData.Length ||
  61. start > testStreamData.Length)
  62. throw new ArgumentOutOfRangeException(id + "+2");
  63. for (int test = 0; test < count; test++)
  64. {
  65. if (testBytes[test] == testStreamData[start + test])
  66. continue;
  67. string failStr = "testByte {0} (testStream {1}) was <{2}>, expecting <{3}>";
  68. failStr = String.Format(failStr,
  69. test,
  70. start + test,
  71. testBytes[test],
  72. testStreamData[start + test]);
  73. Assert.Fail(id + "-3" + failStr);
  74. }
  75. }
  76. //Test construction
  77. [Test]
  78. public void ConstructorOne(){
  79. UnmanagedMemoryStream ums = new
  80. UnmanagedMemoryStream(mem_byteptr, length);
  81. AssertEquals("#01", (long)length, ums.Length);
  82. AssertEquals("#02", 0L, ums.Position);
  83. ums.Position = (length-2);
  84. AssertEquals("#03", (long)(length - 2), ums.Position);
  85. ums.Position = 0;
  86. ums.Seek(3L, SeekOrigin.Begin);
  87. AssertEquals("#04", 3L, ums.Position);
  88. ums.Close();
  89. }
  90. [Test]
  91. public void ConstructorTwo()
  92. {
  93. UnmanagedMemoryStream ums = new
  94. UnmanagedMemoryStream(mem_byteptr, length, capacity, FileAccess.Write);
  95. }
  96. [Test]
  97. public void ConstrucorThree(){
  98. }
  99. [Test]
  100. public void ReadBlock()
  101. {
  102. //Test simple read half of stream
  103. UnmanagedMemoryStream ums = new
  104. UnmanagedMemoryStream(mem_byteptr, length);
  105. ums.Read(readData, 0, (length/2));
  106. VerifyTestData("R1", readData, 0, (length/2));
  107. //Seek back to begining
  108. ums.Seek(0, SeekOrigin.Begin);
  109. //Read complete stream
  110. ums.Read(readData, 0, length);
  111. VerifyTestData("r2", readData, 0, length);
  112. //Seek to mid of the stream and read till end
  113. ums.Seek((length / 2), SeekOrigin.Begin);
  114. ums.Read(readData, 0, (length / 2));
  115. VerifyTestData("r3", readData, 0, (length/2));
  116. ums.Close();
  117. }
  118. [Test]
  119. public void ReadBytes()
  120. {
  121. UnmanagedMemoryStream ums = new
  122. UnmanagedMemoryStream(mem_byteptr, length);
  123. ums.Seek(0, SeekOrigin.Begin);
  124. AssertEquals("#R1", (int) (testStreamData.GetEnumerator()).Current, (ums.ReadByte()));
  125. ums.Seek(length, SeekOrigin.Begin);
  126. AssertEquals("#R2", -1, (ums.ReadByte()));
  127. ums.Close();
  128. }
  129. [Test]
  130. public void WriteBlock()
  131. {
  132. UnmanagedMemoryStream ums = new
  133. UnmanagedMemoryStream(mem_byteptr, length, capacity, FileAccess.ReadWrite);
  134. ums.Write(testStreamData, 0, length);
  135. ums.Read(readData, 0, length);
  136. VerifyTestData("RW1", readData, 0, length);
  137. ums.Close();
  138. }
  139. [Test]
  140. public void WriteBytes()
  141. {
  142. UnmanagedMemoryStream ums = new
  143. UnmanagedMemoryStream(mem_byteptr, length, capacity, FileAccess.ReadWrite);
  144. IEnumerator enumerator = testStreamData.GetEnumerator();
  145. ums.WriteByte((byte)enumerator.Current);
  146. ums.Seek(0, SeekOrigin.Begin);
  147. AssertEquals("RW2", (int)enumerator.Current, ums.ReadByte());
  148. }
  149. [Test]
  150. [ExpectedException(typeof(NotSupportedException))]
  151. public void _SetLength()
  152. {
  153. UnmanagedMemoryStream ums = new
  154. UnmanagedMemoryStream(mem_byteptr, length);
  155. ums.SetLength((length - 2));
  156. ums.Close();
  157. }
  158. [Test]
  159. [ExpectedException(typeof(ObjectDisposedException))]
  160. public void Capacity_Disposed()
  161. {
  162. UnmanagedMemoryStream ums = new
  163. UnmanagedMemoryStream(mem_byteptr, length);
  164. ums.Close();
  165. long capacity = ums.Capacity;
  166. }
  167. [Test]
  168. [ExpectedException(typeof(ObjectDisposedException))]
  169. public void Seek_Disposed()
  170. {
  171. UnmanagedMemoryStream ums = new
  172. UnmanagedMemoryStream(mem_byteptr, length);
  173. ums.Close();
  174. ums.Seek(0, SeekOrigin.Begin);
  175. }
  176. [Test]
  177. [ExpectedException(typeof(ObjectDisposedException))]
  178. public void Close_get_Length()
  179. {
  180. UnmanagedMemoryStream ums = new
  181. UnmanagedMemoryStream(mem_byteptr, length);
  182. ums.Close();
  183. long x = ums.Length;
  184. }
  185. [Test]
  186. [ExpectedException(typeof(ObjectDisposedException))]
  187. public void Close_get_Position()
  188. {
  189. UnmanagedMemoryStream ums = new
  190. UnmanagedMemoryStream(mem_byteptr, length);
  191. ums.Close();
  192. long x = ums.Position;
  193. }
  194. [Test]
  195. [ExpectedException(typeof(ObjectDisposedException))]
  196. public void Close_set_Position()
  197. {
  198. UnmanagedMemoryStream ums = new
  199. UnmanagedMemoryStream(mem_byteptr, length);
  200. ums.Close();
  201. ums.Position = (length - 1);// Set to some acceptable value.
  202. }
  203. [Test]
  204. [ExpectedException(typeof(ObjectDisposedException))]
  205. public void Close_get_PositionPointer()
  206. {
  207. UnmanagedMemoryStream ums = new
  208. UnmanagedMemoryStream(mem_byteptr, length);
  209. ums.Close();
  210. byte* bptr = ums.PositionPointer;
  211. }
  212. [Test]
  213. [ExpectedException(typeof(ObjectDisposedException))]
  214. public void Close_set_PositionPointer()
  215. {
  216. UnmanagedMemoryStream ums = new
  217. UnmanagedMemoryStream(mem_byteptr, length);
  218. ums.Close();
  219. ums.PositionPointer = (byte *) (length - 1); //position pointer to somewhere within the length/capacity
  220. }
  221. [Test]
  222. [ExpectedException(typeof(ObjectDisposedException))]
  223. public void Close_Flush()
  224. {
  225. UnmanagedMemoryStream ums = new
  226. UnmanagedMemoryStream(mem_byteptr, length);
  227. ums.Close();
  228. ums.Flush();
  229. }
  230. [Test]
  231. [ExpectedException(typeof(ObjectDisposedException))]
  232. public void Close_Read()
  233. {
  234. UnmanagedMemoryStream ums = new
  235. UnmanagedMemoryStream(mem_byteptr, length);
  236. ums.Close();
  237. ums.Read(readData, 0, (length-2));
  238. }
  239. [Test]
  240. [ExpectedException(typeof(ObjectDisposedException))]
  241. public void Close_ReadByte()
  242. {
  243. UnmanagedMemoryStream ums = new
  244. UnmanagedMemoryStream(mem_byteptr, length);
  245. ums.Close();
  246. int read_byte = ums.ReadByte();
  247. }
  248. [Test]
  249. [ExpectedException(typeof(ObjectDisposedException))]
  250. public void Close_Write()
  251. {
  252. UnmanagedMemoryStream ums = new
  253. UnmanagedMemoryStream(mem_byteptr, length);
  254. ums.Close();
  255. ums.Write(testStreamData, 0, length);
  256. }
  257. [Test]
  258. [ExpectedException(typeof(ObjectDisposedException))]
  259. public void Close_WriteByte()
  260. {
  261. UnmanagedMemoryStream ums = new
  262. UnmanagedMemoryStream(mem_byteptr, length);
  263. ums.Close();
  264. ums.WriteByte(0x12);
  265. }
  266. }
  267. }
  268. #endif