1 //
2 // DeflateStreamCas.cs -CAS unit tests for System.IO.Compression.DeflateStream
3 //
4 // Author:
5 //	Sebastien Pouliot  <sebastien@ximian.com>
6 //
7 // Copyright (C) 2005 Novell, Inc (http://www.novell.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 
30 using NUnit.Framework;
31 
32 using System;
33 using System.IO;
34 using System.IO.Compression;
35 using System.Security;
36 using System.Security.Permissions;
37 using System.Threading;
38 
39 namespace MonoCasTests.System.IO.Compression {
40 
41 	[TestFixture]
42 	[Category ("CAS")]
43 	public class DeflateStreamCas {
44 
45 		private const int timeout = 30000;
46 		private string message;
47 
48 		static ManualResetEvent reset;
49 
50 		[TestFixtureSetUp]
FixtureSetUp()51 		public void FixtureSetUp ()
52 		{
53 			// this occurs with a "clean" stack (full trust)
54 			reset = new ManualResetEvent (false);
55 		}
56 
57 		[TestFixtureTearDown]
FixtureTearDown()58 		public void FixtureTearDown ()
59 		{
60 			reset.Close ();
61 		}
62 
63 		[SetUp]
SetUp()64 		public void SetUp ()
65 		{
66 			if (!SecurityManager.SecurityEnabled)
67 				Assert.Ignore ("SecurityManager.SecurityEnabled is OFF");
68 		}
69 
70 		// async tests (for stack propagation)
71 
ReadCallback(IAsyncResult ar)72 		private void ReadCallback (IAsyncResult ar)
73 		{
74 			DeflateStream s = (DeflateStream)ar.AsyncState;
75 			s.EndRead (ar);
76 			try {
77 				// can we do something bad here ?
78 				Assert.IsNotNull (Environment.GetEnvironmentVariable ("USERNAME"));
79 				message = "Expected a SecurityException";
80 			}
81 			catch (SecurityException) {
82 				message = null;
83 				reset.Set ();
84 			}
85 			catch (Exception e) {
86 				message = e.ToString ();
87 			}
88 		}
89 
90 		[Test]
91 		[EnvironmentPermission (SecurityAction.Deny, Read = "USERNAME")]
AsyncRead()92 		public void AsyncRead ()
93 		{
94 			DeflateStream cs = new DeflateStream (new MemoryStream (), CompressionMode.Decompress);
95 			message = "AsyncRead";
96 			reset.Reset ();
97 			IAsyncResult r = cs.BeginRead (new byte[0], 0, 0, new AsyncCallback (ReadCallback), cs);
98 			Assert.IsNotNull (r, "IAsyncResult");
99 			if (!reset.WaitOne (timeout, true))
100 				Assert.Ignore ("Timeout");
101 			Assert.IsNull (message, message);
102 			cs.Close ();
103 		}
104 
WriteCallback(IAsyncResult ar)105 		private void WriteCallback (IAsyncResult ar)
106 		{
107 			DeflateStream s = (DeflateStream)ar.AsyncState;
108 			s.EndWrite (ar);
109 			try {
110 				// can we do something bad here ?
111 				Assert.IsNotNull (Environment.GetEnvironmentVariable ("USERNAME"));
112 				message = "Expected a SecurityException";
113 			}
114 			catch (SecurityException) {
115 				message = null;
116 				reset.Set ();
117 			}
118 			catch (Exception e) {
119 				message = e.ToString ();
120 			}
121 		}
122 
123 		[Test]
124 		[EnvironmentPermission (SecurityAction.Deny, Read = "USERNAME")]
AsyncWrite()125 		public void AsyncWrite ()
126 		{
127 			DeflateStream cs = new DeflateStream (new MemoryStream (), CompressionMode.Compress);
128 			message = "AsyncWrite";
129 			reset.Reset ();
130 			IAsyncResult r = cs.BeginWrite (new byte[1], 0, 1, new AsyncCallback (WriteCallback), cs);
131 			Assert.IsNotNull (r, "IAsyncResult");
132 			if (!reset.WaitOne (timeout, true))
133 				Assert.Ignore ("Timeout");
134 			Assert.IsNull (message, message);
135 // the Close is currently buggy in Mono
136 //			cs.Close ();
137 		}
138 	}
139 }
140 
141