2 // MemoryMappedFileTest.cs
5 // Zoltan Varga (vargaz@gmail.com)
7 // (C) 2009 Novell, Inc. (http://www.novell.com)
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
33 using System.IO.MemoryMappedFiles;
36 using NUnit.Framework;
38 namespace MonoTests.System.IO.MemoryMappedFiles {
41 public class MemoryMappedFileTest {
43 void AssertThrows<ExType> (Action del) where ExType : Exception {
51 Assert.IsTrue (thrown);
54 static string tempDir = Path.Combine (Path.GetTempPath (), typeof (MemoryMappedFileTest).FullName);
59 protected void SetUp () {
60 if (Directory.Exists (tempDir))
61 Directory.Delete (tempDir, true);
63 Directory.CreateDirectory (tempDir);
65 fname = Path.Combine (tempDir, "basic.txt");
67 using (StreamWriter sw = new StreamWriter (fname)) {
68 sw.WriteLine ("Hello!");
69 sw.WriteLine ("World!");
74 protected void TearDown () {
75 if (Directory.Exists (tempDir))
76 Directory.Delete (tempDir, true);
80 public void Basic () {
81 var file = MemoryMappedFile.CreateFromFile (fname, FileMode.Open);
83 using (var stream = file.CreateViewStream ()) {
84 TextReader r = new StreamReader (stream);
89 Assert.AreEqual ("Hello!", s);
91 Assert.AreEqual ("World!", s);
96 public void CreateNew ()
99 MemoryMappedFile.CreateNew (Path.Combine (tempDir, "createNew.test"), 8192);
103 [ExpectedException (typeof (IOException))]
104 public void CreateNew_OnExistingFile ()
107 MemoryMappedFile.CreateNew (Path.Combine (tempDir, "createNew.test"), 8192);
109 // This should fail, the file exists
110 MemoryMappedFile.CreateNew (Path.Combine (tempDir, "createNew.test"), 8192);
113 // Call this twice, it should always work
115 public void CreateOrOpen_Multiple ()
117 MemoryMappedFile.CreateOrOpen (Path.Combine (tempDir, "createOrOpen.test"), 8192);
118 MemoryMappedFile.CreateOrOpen (Path.Combine (tempDir, "createOrOpen.test"), 8192);
122 [ExpectedException(typeof(ArgumentOutOfRangeException))]
123 public void CreateFromFileWithSmallerCapacityThanFile ()
125 var f = Path.Combine (tempDir, "8192-file");
126 File.WriteAllBytes (f, new byte [8192]);
128 // We are requesting fewer bytes to map.
129 MemoryMappedFile.CreateFromFile (f, FileMode.Open, "myMap", 4192);
133 public void CreateFromFile_Null () {
134 AssertThrows<ArgumentNullException> (delegate () {
135 MemoryMappedFile.CreateFromFile (null);
140 public void CreateViewStream_Offsets () {
141 var file = MemoryMappedFile.CreateFromFile (fname, FileMode.Open);
143 using (var stream = file.CreateViewStream (2, 3)) {
144 byte[] arr = new byte [128];
146 int len = stream.Read (arr, 0, 128);
148 Assert.AreEqual (3, len);
150 Assert.AreEqual ('l', (char)arr [0]);
151 Assert.AreEqual ('l', (char)arr [1]);
152 Assert.AreEqual ('o', (char)arr [2]);
157 public void CreateViewStream_Rights () {
158 var file = MemoryMappedFile.CreateFromFile (fname, FileMode.Open);
160 using (var stream = file.CreateViewStream (0, 0, MemoryMappedFileAccess.Read)) {
161 AssertThrows<NotSupportedException> (delegate () {
162 stream.WriteByte (0);
166 using (var stream = file.CreateViewStream (0, 0, MemoryMappedFileAccess.Write)) {
167 AssertThrows<NotSupportedException> (delegate () {
174 public unsafe void CreateViewBasic () {
175 var file = MemoryMappedFile.CreateFromFile (fname, FileMode.Open);
177 using (var v = file.CreateViewAccessor ()) {
181 var handle = v.SafeMemoryMappedViewHandle;
185 handle.AcquirePointer (ref b);
187 for (int i = 0; i < 5; ++i)
190 handle.ReleasePointer ();
193 Assert.AreEqual ("Hello", s);
198 public unsafe void ViewReadArray () {
199 var file = MemoryMappedFile.CreateFromFile (fname, FileMode.Open);
201 using (var v = file.CreateViewAccessor ()) {
202 var a = new byte [5];
203 var n = v.ReadArray (0, a, 0, 5);
204 Assert.AreEqual (5, n);
205 var s = new string (Array.ConvertAll (a, b => (char)b));
206 Assert.AreEqual ("Hello", s);