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;
259 [Category ("NotDotNet")] // we don't want to duplicate this
261 public void DefaultValues ()
263 HttpClientCertificate hcc = GetHttpClientCertificate ();
264 Assert.AreEqual (0, hcc.BinaryIssuer.Length, "BinaryIssuer");
265 Assert.AreEqual (0, hcc.CertEncoding, "CertEncoding");
266 Assert.AreEqual (0, hcc.Certificate.Length, "Certificate");
267 Assert.AreEqual (String.Empty, hcc.Cookie, "Cookie");
268 Assert.AreEqual (0, hcc.Flags, "Flags");
269 Assert.IsFalse (hcc.IsPresent, "IsPresent");
270 Assert.AreEqual (String.Empty, hcc.Issuer, "Issuer");
271 Assert.IsTrue (hcc.IsValid, "IsValid");
272 Assert.AreEqual (0, hcc.KeySize, "KeySize");
273 Assert.AreEqual (0, hcc.PublicKey.Length, "PublicKey");
274 Assert.AreEqual (0, hcc.SecretKeySize, "SecretKeySize");
275 Assert.AreEqual (String.Empty, hcc.SerialNumber, "SerialNumber");
276 Assert.AreEqual (String.Empty, hcc.ServerIssuer, "ServerIssuer");
277 Assert.AreEqual (String.Empty, hcc.ServerSubject, "ServerSubject");
278 Assert.AreEqual (String.Empty, hcc.Subject, "Subject");
279 DateTime start = DateTime.Now.AddMinutes (1);
280 DateTime end = start.AddMinutes (-2);
281 // creation time - doesn't update (at least after first call)
282 Assert.IsTrue (hcc.ValidFrom < start, "ValidFrom <");
283 Assert.IsTrue (hcc.ValidFrom > end, "ValidFrom >");
284 Assert.IsTrue (hcc.ValidUntil < start, "ValidUntil <");
285 Assert.IsTrue (hcc.ValidUntil > end, "ValidUntil >");
287 // NameValueCollection stuff
288 Assert.AreEqual (0, hcc.Count, "Count");
293 [Category ("NotDotNet")] // we don't want to duplicate this
295 public void MirrorValues ()
297 hwr.MirrorVariableName = true;
298 HttpClientCertificate hcc = GetHttpClientCertificate ();
300 // not default (because we now have some data)
301 Assert.IsFalse (hcc.IsValid, "IsValid");
302 Assert.IsTrue (hcc.IsPresent, "IsPresent");
304 Assert.AreEqual ("CERT_COOKIE", hcc.Cookie, "Cookie");
305 Assert.AreEqual (11, hcc.Flags, "Flags");
306 Assert.AreEqual ("CERT_ISSUER", hcc.Issuer, "Issuer");
307 Assert.AreEqual (12, hcc.KeySize, "KeySize");
308 Assert.AreEqual (13, hcc.SecretKeySize, "SecretKeySize");
309 Assert.AreEqual ("CERT_SERIALNUMBER", hcc.SerialNumber, "SerialNumber");
310 Assert.AreEqual ("CERT_SERVER_ISSUER", hcc.ServerIssuer, "ServerIssuer");
311 Assert.AreEqual ("CERT_SERVER_SUBJECT", hcc.ServerSubject, "ServerSubject");
312 Assert.AreEqual ("CERT_SUBJECT", hcc.Subject, "Subject");
317 [Category ("NotDotNet")] // we don't want to duplicate this
319 public void MirrorValues_Alternate ()
321 hwr.MirrorVariableName = true;
322 hwr.AlternateChoice = true;
323 HttpClientCertificate hcc = GetHttpClientCertificate ();
324 // if CERT_KEYSIZE is missing then HTTPS_KEYSIZE isn't checked
325 Assert.AreEqual (0, hcc.KeySize, "Alternate-KeySize");
326 // if CERT_SECRETKEYSIZE is missing then HTTPS_SECRETKEYSIZE isn't looked
327 Assert.AreEqual (0, hcc.SecretKeySize, "Alternate-SecretKeySize");
332 [Category ("NotDotNet")] // we don't want to duplicate this
334 public void HttpWorkerRequest ()
336 // required to "activate" later call as IsPresent will return true
337 hwr.MirrorVariableName = true;
339 HttpClientCertificate hcc = GetHttpClientCertificate ();
341 // not affected by server variables (but by HttpWorkerRequest)
342 Assert.AreEqual (2, hcc.BinaryIssuer.Length, "BinaryIssuer");
343 Assert.AreEqual (Int32.MinValue, hcc.CertEncoding, "CertEncoding");
344 Assert.AreEqual (1, hcc.Certificate.Length, "Certificate");
345 Assert.AreEqual (3, hcc.PublicKey.Length, "PublicKey");
346 Assert.AreEqual (DateTime.MaxValue, hcc.ValidFrom, "ValidFrom");
347 Assert.AreEqual (DateTime.MinValue, hcc.ValidUntil, "ValidUntil");
352 [Category ("NotDotNet")] // we don't want to duplicate this
356 HttpClientCertificate hcc = GetHttpClientCertificate ();
357 // just to see if it always returns DateTime.Now or if it cache the value
358 long from1 = hcc.ValidFrom.Ticks;
359 Thread.Sleep (100); // don't go too fast
360 long until1 = hcc.ValidUntil.Ticks;
361 Thread.Sleep (100); // don't go too fast
362 long from2 = hcc.ValidFrom.Ticks;
363 Thread.Sleep (100); // don't go too fast
364 long until2 = hcc.ValidUntil.Ticks;
365 Assert.AreEqual (from1, from2, "from-from");
366 Assert.AreEqual (until1, until2, "until-until");
367 Assert.AreEqual (from1, until2, "from-until");
372 [Category ("NotDotNet")] // we don't want to duplicate this
376 HttpClientCertificate hcc = GetHttpClientCertificate ();
377 Assert.AreEqual (0, hcc.Count, "0");
379 Assert.AreEqual (1, hcc.Count, "1");
380 // it's not read-only (at least not in this case)
385 [Category ("NotDotNet")] // we don't want to duplicate this
389 HttpClientCertificate hcc = GetHttpClientCertificate ();
390 Assert.AreEqual (String.Empty, hcc.Get (null), "null");
392 Assert.AreEqual (String.Empty, hcc.Get ("a"), "Get(string)");
393 Assert.AreEqual ("b", hcc.Get (0), "Get(int)");