Merge pull request #3528 from BrzVlad/fix-sgen-check-before-collections
[mono.git] / mcs / class / corlib / Test / System.IO / StreamTest.cs
1 //
2 // StreamTest.cs
3 //
4 // Authors:
5 //      Marek Safar  <marek.safar@gmail.com>
6 //
7 // Copyright 2011 Xamarin, Inc (http://www.xamarin.com)
8 //
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:
16 //
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 //
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.
27 //
28
29 using System;
30 using System.IO;
31
32 using NUnit.Framework;
33
34 namespace MonoTests.System.IO
35 {
36         [TestFixture]
37         public class StreamTest
38         {
39                 class MockStream : Stream
40                 {
41                         bool canRead, canSeek, canWrite;
42                         public event Action OnFlush;
43                         public event Func<byte[], int, int, int> OnRead;
44                         public event Action<byte[], int, int> OnWrite;
45
46                         public MockStream (bool canRead, bool canSeek, bool canWrite)
47                         {
48                                 this.canRead = canRead;
49                                 this.canSeek = canSeek;
50                                 this.canWrite = canWrite;
51                         }
52
53                         public override bool CanRead {
54                                 get {
55                                         return canRead;
56                                 }
57                         }
58
59                         public override bool CanSeek {
60                                 get {
61                                         return canSeek;
62                                 }
63                         }
64
65                         public override bool CanWrite {
66                                 get {
67                                         return canWrite;
68                                 }
69                         }
70
71                         public override void Flush ()
72                         {
73                                 if (OnFlush != null)
74                                         OnFlush ();
75                         }
76
77                         public override long Length {
78                                 get { throw new NotImplementedException (); }
79                         }
80
81                         public override long Position {
82                                 get {
83                                         throw new NotImplementedException ();
84                                 }
85                                 set {
86                                         throw new NotImplementedException ();
87                                 }
88                         }
89
90                         public override int Read (byte[] buffer, int offset, int count)
91                         {
92                                 if (OnRead != null)
93                                         return OnRead (buffer, offset, count);
94
95                                 return -1;
96                         }
97
98                         public override long Seek (long offset, SeekOrigin origin)
99                         {
100                                 throw new NotImplementedException ();
101                         }
102
103                         public override void SetLength (long value)
104                         {
105                                 throw new NotImplementedException ();
106                         }
107
108                         public override void Write (byte[] buffer, int offset, int count)
109                         {
110                                 if (OnWrite != null)
111                                         OnWrite (buffer, offset, count);
112                         }
113                 }
114
115                 [Test]
116                 public void SynchronizedTest ()
117                 {
118                         var s = Stream.Synchronized (new MemoryStream ());
119                         s.Close ();
120                         Assert.IsFalse (s.CanRead, "#1");
121                 }
122
123                 [Test]
124                 public void CopyAsync ()
125                 {
126                         var ms = new MockStream (true, false, true);
127                         int counter = 4;
128                         ms.OnRead += delegate { return --counter; };
129                         var memory = new MemoryStream ();
130                         Assert.IsTrue (ms.CopyToAsync (ms).Wait (1000));
131                 }
132
133                 [Test]
134                 public void FlushAsync ()
135                 {
136                         bool called = false;
137                         var ms = new MockStream (false, false, false);
138                         ms.OnFlush += () => { called = true; };
139                         var t = ms.FlushAsync ();
140                         Assert.IsTrue (t.Wait (1000), "#1");
141                         Assert.IsTrue (called, "#2");
142                 }
143
144                 [Test]
145                 public void FlushAsync_Exception ()
146                 {
147                         var ms = new MockStream (false, false, false);
148                         ms.OnFlush += () => { throw new ApplicationException (); };
149                         var t = ms.FlushAsync ();
150                         try {
151                                 t.Wait (1000);
152                                 Assert.Fail ();
153                         } catch (AggregateException) {
154                         }
155                 }
156
157                 [Test]
158                 public void ReadAsync ()
159                 {
160                         bool called = false;
161                         var buffer = new byte[4];
162                         var ms = new MockStream (true, false, false);
163                         ms.OnRead += (b, p, c) => { called = true; return 2; };
164                         var t = ms.ReadAsync (buffer, 0, 4);
165
166                         Assert.IsTrue (t.Wait (1000), "#1");
167                         Assert.IsTrue (called, "#2");
168                         Assert.AreEqual (2, t.Result, "#3");
169                 }
170
171                 [Test]
172                 public void ReadAsync_Exception ()
173                 {
174                         var buffer = new byte[4];
175                         var ms = new MockStream (true, false, false);
176                         ms.OnRead += (b, p, c) => { throw new ApplicationException (); };
177                         var t = ms.ReadAsync (buffer, 0, 4);
178
179                         try {
180                                 t.Wait (1000);
181                                 Assert.Fail ();
182                         } catch (AggregateException) {
183                         }
184                 }
185
186                 [Test]
187                 public void WriteAsync ()
188                 {
189                         bool called = false;
190                         var buffer = new byte[4];
191                         var ms = new MockStream (false, false, true);
192                         ms.OnWrite += (b, p, c) => { called = true; };
193                         var t = ms.WriteAsync (buffer, 0, 4);
194
195                         Assert.IsTrue (t.Wait (1000), "#1");
196                         Assert.IsTrue (called, "#2");
197                 }
198
199                 [Test]
200                 public void WriteAsync_Exception ()
201                 {
202                         var buffer = new byte[4];
203                         var ms = new MockStream (false, false, true);
204                         ms.OnWrite += (b, p, c) => { throw new ApplicationException (); };
205                         var t = ms.WriteAsync (buffer, 0, 4);
206
207                         try {
208                                 t.Wait (1000);
209                                 Assert.Fail ();
210                         } catch (AggregateException) {
211                         }
212                 }
213         }
214 }