[sgen] Evacuate from emptier blocks to fuller ones
[mono.git] / mcs / class / corlib / Test / System.Runtime.ExceptionServices / ExceptionDispatchInfoTest.cs
1 //
2 // ExceptionDispatchInfoTest.cs
3 //
4 // Authors:
5 //      Marek Safar  <marek.safar@gmail.com>
6 //
7 // Copyright (C) 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 NUnit.Framework;
31 using System.Runtime.ExceptionServices;
32 using System.Threading.Tasks;
33 using System.Diagnostics;
34
35 namespace MonoTests.System.Runtime.ExceptionServices
36 {
37         [TestFixture]
38         public class ExceptionDispatchInfoTest
39         {
40                 [Test]
41                 public void Capture_InvalidArguments ()
42                 {
43                         try {
44                                 ExceptionDispatchInfo.Capture (null);
45                                 Assert.Fail ();
46                         } catch (ArgumentNullException) {
47                         }
48                 }
49
50                 [Test]
51                 public void Capture ()
52                 {
53                         var e = new ApplicationException ("test");
54                         var edi = ExceptionDispatchInfo.Capture (e);
55                         Assert.AreEqual (e, edi.SourceException);
56                 }
57
58                 [Test]
59                 public void Throw ()
60                 {
61                         Exception orig = null;
62                         var t = Task.Factory.StartNew (() => {
63                                 try {
64                                         throw new ApplicationException ("aaa");
65                                 } catch (Exception e) {
66                                         orig = e;
67                                         return ExceptionDispatchInfo.Capture (e);
68                                 }
69                         });
70
71                         var ed = t.Result;
72                         var orig_stack = orig.StackTrace;
73                         try {
74                                 ed.Throw ();
75                                 Assert.Fail ("#0");
76                         } catch (Exception e) {
77                                 var s = e.StackTrace.Split ('\n');
78                                 Assert.AreEqual (4, s.Length, "#1");
79                                 Assert.AreEqual (orig, e, "#2");
80                                 Assert.AreNotEqual (orig_stack, e.StackTrace, "#3");
81                         }
82                 }
83
84                 [Test]
85                 public void ThrowWithEmptyFrames ()
86                 {
87                         var edi = ExceptionDispatchInfo.Capture (new OperationCanceledException ());
88                         try {
89                                 edi.Throw ();
90                                 Assert.Fail ("#0");
91                         } catch (OperationCanceledException e) {
92                                 Assert.IsFalse (e.StackTrace.Contains ("---"));
93                                 Assert.AreEqual (2, e.StackTrace.Split (new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).Length);
94                         }
95                 }
96
97                 [Test]
98                 public void LastThrowWins ()
99                 {
100                         Exception e;
101                         try {
102                                 throw new Exception ("test");
103                         } catch (Exception e2) {
104                                 e = e2;
105                         }
106
107                         var edi = ExceptionDispatchInfo.Capture (e);
108
109                         try {
110                                 edi.Throw ();
111                         } catch {
112                         }
113
114                         try {
115                                 edi.Throw ();
116                         } catch (Exception ex) {
117                         }
118
119                         try {
120                                 edi.Throw ();
121                         } catch (Exception ex) {
122                                 var split = ex.StackTrace.Split (new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
123                                 Assert.AreEqual (4, split.Length, "#1");
124                                 Assert.IsTrue (split [1].Contains ("---"), "#2");
125                         }
126                 }
127
128                 [Test]
129                 public void ThrowMultipleCaptures ()
130                 {
131                         Exception e;
132                         try {
133                                 throw new Exception ("test");
134                         } catch (Exception e2) {
135                                 e = e2;
136                         }
137
138                         var edi = ExceptionDispatchInfo.Capture (e);
139
140                         try {
141                                 edi.Throw ();
142                         } catch (Exception e3) {
143                                 edi = ExceptionDispatchInfo.Capture (e3);
144                         }
145
146                         try {
147                                 edi.Throw ();
148                         } catch (Exception ex) {
149                                 var split = ex.StackTrace.Split (new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
150                                 Assert.AreEqual (7, split.Length, "#1");
151                                 Assert.IsTrue (split [1].Contains ("---"), "#2");
152                                 Assert.IsTrue (split [4].Contains ("---"), "#3");
153                         }
154                 }
155
156                 [Test]
157                 public void StackTraceUserCopy ()
158                 {
159                         try {
160                                 try {
161                                         throw new NotImplementedException ();
162                                 } catch (Exception e) {
163                                         var edi = ExceptionDispatchInfo.Capture (e);
164                                         edi.Throw();
165                                 }
166                         } catch (Exception ex) {
167                                 var st = new StackTrace (ex, true);
168                                 var split = st.ToString ().Split (new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
169                                 Assert.AreEqual (4, split.Length, "#1");
170                                 Assert.IsTrue (split [1].Contains ("---"), "#2");
171                         }
172                 }
173         }
174 }
175