2 // HttpClientCertificateTest.cs
3 // - Unit tests for System.Web.HttpClientCertificate
6 // Sebastien Pouliot <sebastien@ximian.com>
8 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
10 // Permission is hereby granted, free of charge, to any person obtaining
11 // a copy of this software and associated documentation files (the
12 // "Software"), to deal in the Software without restriction, including
13 // without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to
15 // permit persons to whom the Software is furnished to do so, subject to
16 // the following conditions:
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 using System.Threading;
34 using NUnit.Framework;
36 namespace MonoTests.System.Web {
38 // copied from Miguel's FakeHttpWorkerRequest in HttpRequestTest
39 class MyHttpWorkerRequest : HttpWorkerRequest {
42 private bool alternate;
43 private bool override_cc;
45 public MyHttpWorkerRequest ()
49 public override string GetUriPath()
54 public override string GetQueryString()
56 return "GetQueryString";
59 public override string GetRawUrl()
64 public override string GetHttpVerbName()
69 public override string GetHttpVersion()
74 public override int GetRemotePort()
79 public override string GetLocalAddress()
84 public override string GetRemoteName ()
89 public override string GetRemoteAddress ()
91 return "RemoteAddress";
94 public override int GetLocalPort()
99 public override void SendStatus(int s, string x)
103 public override void SendKnownResponseHeader(int x, string j)
107 public override void SendUnknownResponseHeader(string a, string b)
111 public override void SendResponseFromMemory(byte[] arr, int x)
115 public override void SendResponseFromFile(string a, long b , long c)
119 public override void SendResponseFromFile (IntPtr a, long b, long c)
123 public override void FlushResponse (bool x)
127 public override void EndOfRequest ()
131 public bool MirrorVariableName {
132 get { return mirror; }
133 set { mirror = value; }
136 public bool AlternateChoice {
137 get { return alternate; }
138 set { alternate = value; }
141 public override string GetServerVariable (string name)
148 return (alternate) ? base.GetServerVariable (name) : "12";
149 case "CERT_SECRETKEYSIZE":
150 return (alternate) ? base.GetServerVariable (name) : "13";
151 case "HTTPS_KEYSIZE":
153 case "HTTPS_SECRETKEYSIZE":
159 return base.GetServerVariable (name);
162 public bool Override {
163 get { return override_cc; }
164 set { override_cc = value; }
167 public override byte[] GetClientCertificate ()
172 return base.GetClientCertificate ();
176 public override byte[] GetClientCertificateBinaryIssuer ()
181 return base.GetClientCertificateBinaryIssuer ();
185 public override int GetClientCertificateEncoding ()
188 return Int32.MinValue;
190 return base.GetClientCertificateEncoding ();
194 public override byte[] GetClientCertificatePublicKey ()
199 return base.GetClientCertificatePublicKey ();
203 public override DateTime GetClientCertificateValidFrom ()
206 return DateTime.MaxValue;
208 return base.GetClientCertificateValidFrom ();
212 public override DateTime GetClientCertificateValidUntil ()
215 return DateTime.MinValue;
217 return base.GetClientCertificateValidUntil ();
223 public class HttpClientCertificateTest {
225 private MyHttpWorkerRequest hwr;
229 public void FixtureSetUp ()
231 hwr = new MyHttpWorkerRequest ();
237 hwr.Override = false;
238 hwr.MirrorVariableName = false;
239 hwr.AlternateChoice = false;
244 [ExpectedException (typeof (NullReferenceException))]
245 public void HttpRequestPublicCtor ()
247 HttpRequest hr = new HttpRequest ("file", "http://www.mono-project.com/", "");
248 // always throw a NullReferenceException if the public ctor is used
249 hr.ClientCertificate.ToString ();
252 private HttpClientCertificate GetHttpClientCertificate ()
254 return new HttpContext (hwr).Request.ClientCertificate;
258 public void DefaultValues ()
260 HttpClientCertificate hcc = GetHttpClientCertificate ();
261 Assert.AreEqual (0, hcc.BinaryIssuer.Length, "BinaryIssuer");
262 Assert.AreEqual (0, hcc.CertEncoding, "CertEncoding");
263 Assert.AreEqual (0, hcc.Certificate.Length, "Certificate");
264 Assert.AreEqual (String.Empty, hcc.Cookie, "Cookie");
265 Assert.AreEqual (0, hcc.Flags, "Flags");
266 Assert.IsFalse (hcc.IsPresent, "IsPresent");
267 Assert.AreEqual (String.Empty, hcc.Issuer, "Issuer");
268 Assert.IsTrue (hcc.IsValid, "IsValid");
269 Assert.AreEqual (0, hcc.KeySize, "KeySize");
270 Assert.AreEqual (0, hcc.PublicKey.Length, "PublicKey");
271 Assert.AreEqual (0, hcc.SecretKeySize, "SecretKeySize");
272 Assert.AreEqual (String.Empty, hcc.SerialNumber, "SerialNumber");
273 Assert.AreEqual (String.Empty, hcc.ServerIssuer, "ServerIssuer");
274 Assert.AreEqual (String.Empty, hcc.ServerSubject, "ServerSubject");
275 Assert.AreEqual (String.Empty, hcc.Subject, "Subject");
276 DateTime start = DateTime.Now.AddMinutes (1);
277 DateTime end = start.AddMinutes (-2);
278 // creation time - doesn't update (at least after first call)
279 Assert.IsTrue (hcc.ValidFrom < start, "ValidFrom <");
280 Assert.IsTrue (hcc.ValidFrom > end, "ValidFrom >");
281 Assert.IsTrue (hcc.ValidUntil < start, "ValidUntil <");
282 Assert.IsTrue (hcc.ValidUntil > end, "ValidUntil >");
284 // NameValueCollection stuff
285 Assert.AreEqual (0, hcc.Count, "Count");
289 public void MirrorValues ()
291 hwr.MirrorVariableName = true;
292 HttpClientCertificate hcc = GetHttpClientCertificate ();
294 // not default (because we now have some data)
295 Assert.IsFalse (hcc.IsValid, "IsValid");
296 Assert.IsTrue (hcc.IsPresent, "IsPresent");
298 Assert.AreEqual ("CERT_COOKIE", hcc.Cookie, "Cookie");
299 Assert.AreEqual (11, hcc.Flags, "Flags");
300 Assert.AreEqual ("CERT_ISSUER", hcc.Issuer, "Issuer");
301 Assert.AreEqual (12, hcc.KeySize, "KeySize");
302 Assert.AreEqual (13, hcc.SecretKeySize, "SecretKeySize");
303 Assert.AreEqual ("CERT_SERIALNUMBER", hcc.SerialNumber, "SerialNumber");
304 Assert.AreEqual ("CERT_SERVER_ISSUER", hcc.ServerIssuer, "ServerIssuer");
305 Assert.AreEqual ("CERT_SERVER_SUBJECT", hcc.ServerSubject, "ServerSubject");
306 Assert.AreEqual ("CERT_SUBJECT", hcc.Subject, "Subject");
310 public void MirrorValues_Alternate ()
312 hwr.MirrorVariableName = true;
313 hwr.AlternateChoice = true;
314 HttpClientCertificate hcc = GetHttpClientCertificate ();
315 // if CERT_KEYSIZE is missing then HTTPS_KEYSIZE isn't checked
316 Assert.AreEqual (0, hcc.KeySize, "Alternate-KeySize");
317 // if CERT_SECRETKEYSIZE is missing then HTTPS_SECRETKEYSIZE isn't looked
318 Assert.AreEqual (0, hcc.SecretKeySize, "Alternate-SecretKeySize");
322 public void HttpWorkerRequest ()
324 // required to "activate" later call as IsPresent will return true
325 hwr.MirrorVariableName = true;
327 HttpClientCertificate hcc = GetHttpClientCertificate ();
329 // not affected by server variables (but by HttpWorkerRequest)
330 Assert.AreEqual (2, hcc.BinaryIssuer.Length, "BinaryIssuer");
331 Assert.AreEqual (Int32.MinValue, hcc.CertEncoding, "CertEncoding");
332 Assert.AreEqual (1, hcc.Certificate.Length, "Certificate");
333 Assert.AreEqual (3, hcc.PublicKey.Length, "PublicKey");
334 Assert.AreEqual (DateTime.MaxValue, hcc.ValidFrom, "ValidFrom");
335 Assert.AreEqual (DateTime.MinValue, hcc.ValidUntil, "ValidUntil");
341 HttpClientCertificate hcc = GetHttpClientCertificate ();
342 // just to see if it always returns DateTime.Now or if it cache the value
343 long from1 = hcc.ValidFrom.Ticks;
344 Thread.Sleep (100); // don't go too fast
345 long until1 = hcc.ValidUntil.Ticks;
346 Thread.Sleep (100); // don't go too fast
347 long from2 = hcc.ValidFrom.Ticks;
348 Thread.Sleep (100); // don't go too fast
349 long until2 = hcc.ValidUntil.Ticks;
350 Assert.AreEqual (from1, from2, "from-from");
351 Assert.AreEqual (until1, until2, "until-until");
352 Assert.AreEqual (from1, until2, "from-until");
358 HttpClientCertificate hcc = GetHttpClientCertificate ();
359 Assert.AreEqual (0, hcc.Count, "0");
361 Assert.AreEqual (1, hcc.Count, "1");
362 // it's not read-only (at least not in this case)
368 HttpClientCertificate hcc = GetHttpClientCertificate ();
369 Assert.AreEqual (String.Empty, hcc.Get (null), "null");
371 Assert.AreEqual (String.Empty, hcc.Get ("a"), "Get(string)");
372 Assert.AreEqual ("b", hcc.Get (0), "Get(int)");