PageRenderTime 29ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/tags/Libs_1.3/CodeTitans.UnitTests/IoC/ServiceLocatorTests.cs

#
C# | 363 lines | 239 code | 72 blank | 52 comment | 0 complexity | 3cda8dc6b4ca15359f45984a92c33a55 MD5 | raw file
  1. #region License
  2. /*
  3. Copyright (c) 2010, Paweł Hofman (CodeTitans)
  4. All Rights Reserved.
  5. Licensed under the Apache License version 2.0.
  6. For more information please visit:
  7. http://codetitans.codeplex.com/license
  8. or
  9. http://www.apache.org/licenses/
  10. For latest source code, documentation, samples
  11. and more information please visit:
  12. http://codetitans.codeplex.com/
  13. */
  14. #endregion
  15. using System;
  16. using CodeTitans.Services;
  17. #if NUNIT
  18. using NUnit.Framework;
  19. using TestClassAttribute=NUnit.Framework.TestFixtureAttribute;
  20. using TestMethodAttribute=NUnit.Framework.TestAttribute;
  21. using TestInitializeAttribute=NUnit.Framework.SetUpAttribute;
  22. using TestCleanupAttribute=NUnit.Framework.TearDownAttribute;
  23. #else
  24. using Microsoft.VisualStudio.TestTools.UnitTesting;
  25. #endif
  26. namespace CodeTitans.UnitTests.Services
  27. {
  28. /// <summary>
  29. /// This is a test class for ServiceLocatorTest and is intended
  30. /// to contain all ServiceLocatorTest Unit Tests
  31. ///</summary>
  32. [TestClass]
  33. public class ServiceLocatorTests
  34. {
  35. public const string TestGuidString = "F587A062-1E7C-4358-A0AB-09032A954C69";
  36. public readonly Guid TestGuid = new Guid(TestGuidString);
  37. public const uint TestId = 10101;
  38. public interface ITestService
  39. {
  40. }
  41. public interface IUnknownService
  42. {
  43. }
  44. public class SimpleService : ITestService
  45. {
  46. }
  47. public class SimpleSiteService : ITestService, IServiceSite, IUnknownService, ICloneable
  48. {
  49. public IServiceProviderEx Provider
  50. { get; private set; }
  51. #region IServiceSite Members
  52. public void SetSite(IServiceProviderEx provider)
  53. {
  54. Provider = provider;
  55. }
  56. public void SetSiteArguments(params object[] initArgs)
  57. {
  58. }
  59. #endregion
  60. #region ICloneable Members
  61. public object Clone()
  62. {
  63. return null;
  64. }
  65. #endregion
  66. }
  67. [TestMethod]
  68. [ExpectedException(typeof(ArgumentNullException))]
  69. public void TryRegisterNullTypeService()
  70. {
  71. var s = new ServiceLocator();
  72. // exception expected here:
  73. s.Register((Type)null, new object());
  74. }
  75. [TestMethod]
  76. [ExpectedException(typeof(ArgumentNullException))]
  77. public void TryRegisterNullNameService()
  78. {
  79. var s = new ServiceLocator();
  80. // exception expected here:
  81. s.Register((string)null, new object());
  82. }
  83. [TestMethod]
  84. public void RegisterServiceViaObject ()
  85. {
  86. var s = new ServiceLocator();
  87. var service = new SimpleService();
  88. ITestService result;
  89. s.Register(service);
  90. // since now on, the service should be available via number of ways
  91. // let's try most of them if we receive the same object:
  92. result = s.GetService<ITestService>();
  93. Assert.AreEqual(result, service);
  94. result = s.GetService(typeof (ITestService)) as ITestService;
  95. Assert.AreEqual(result, service);
  96. // registering service via object shouldn't automatically register classes:
  97. result = s.GetService<SimpleService>();
  98. Assert.IsNull(result);
  99. }
  100. [TestMethod]
  101. public void RegisterServiceViaGuid()
  102. {
  103. var s = new ServiceLocator();
  104. var service = new SimpleService();
  105. ITestService result;
  106. s.Register(TestGuid, service);
  107. // since now on, the service should be available via number of ways
  108. // let's try most of them if we receive the same object:
  109. result = s.GetService<ITestService>(TestGuid);
  110. Assert.AreEqual(result, service);
  111. Assert.AreEqual(s.GetService(TestGuid), service);
  112. result = s.GetService(typeof(ITestService)) as ITestService;
  113. Assert.IsNull(result);
  114. // registering service via object shouldn't automatically register classes:
  115. result = s.GetService<SimpleService>();
  116. Assert.IsNull(result);
  117. }
  118. [TestMethod]
  119. public void RegisterAndUnregisterService()
  120. {
  121. var s = new ServiceLocator();
  122. var service = new SimpleService();
  123. s.Register(TestGuid, service);
  124. s.Register(TestGuidString, service);
  125. s.Register(service);
  126. s.Register(TestId, service);
  127. // check if was added:
  128. Assert.AreEqual(service, s.GetService<ITestService>());
  129. Assert.AreEqual(service, s.GetService(TestGuid));
  130. Assert.AreEqual(service, s.GetService(TestGuidString));
  131. Assert.AreEqual(service, s.GetService(TestId));
  132. // passing the null value instead of real service, will release
  133. // service object:
  134. s.Register(typeof (ITestService), null);
  135. s.Register(TestGuid, null);
  136. s.Register(TestGuidString, null);
  137. s.Register(TestId, null);
  138. // validate if service is no more available:
  139. Assert.IsNull(s.GetService<ITestService>());
  140. Assert.IsNull(s.GetService(TestGuid));
  141. Assert.IsNull(s.GetService(TestGuidString));
  142. Assert.IsNull(s.GetService(TestId));
  143. }
  144. [TestMethod]
  145. [ExpectedException(typeof(ServiceValidationException))]
  146. public void FailToRegisterDynamicNoService ()
  147. {
  148. var s = new ServiceLocator();
  149. // try to register service that doesn't implement required interface:
  150. s.Register(typeof(IUnknownService), typeof(ITestService));
  151. }
  152. [TestMethod]
  153. [ExpectedException(typeof(ServiceValidationException))]
  154. public void FailToRegisterDynamicService ()
  155. {
  156. var s = new ServiceLocator();
  157. // try to register service that doesn't implement required interface:
  158. s.Register(typeof(IUnknownService), typeof(SimpleService));
  159. }
  160. [TestMethod]
  161. [ExpectedException(typeof(ServiceValidationException))]
  162. public void FailToRegisterDynamicServiceViaHandler()
  163. {
  164. var s = new ServiceLocator();
  165. ServiceCreationHandler h = (sender, e) =>
  166. {
  167. e.Service = new SimpleService();
  168. };
  169. // fail to register service:
  170. s.Register(typeof (IUnknownService), ServiceMode.Singleton, h);
  171. // try to get a service, and an exception should be generated:
  172. var o = s.GetService<IUnknownService>();
  173. Assert.IsNull(o);
  174. }
  175. [TestMethod]
  176. public void RegisterDynamicCloneService ()
  177. {
  178. var s = new ServiceLocator();
  179. // register one that per each request will generate new instance of service:
  180. s.Register(typeof(ITestService), typeof(SimpleService), ServiceMode.Clone);
  181. // get reference to services:
  182. var service1 = s.GetService<ITestService>();
  183. var service2 = s.GetService<ITestService>();
  184. var service3 = s.GetService<ITestService>();
  185. Assert.IsNotNull(service1);
  186. Assert.IsNotNull(service2);
  187. Assert.IsNotNull(service3);
  188. Assert.AreNotEqual(service1, service2);
  189. Assert.AreNotEqual(service1, service3);
  190. }
  191. [TestMethod]
  192. public void RegisterDynamicSingletonService ()
  193. {
  194. var s = new ServiceLocator();
  195. // register service returning the same instance each time:
  196. s.Register(typeof(ITestService), typeof(SimpleService), ServiceMode.Singleton);
  197. // get reference to services:
  198. var service1 = s.GetService<ITestService>();
  199. var service2 = s.GetService<ITestService>();
  200. var service3 = s.GetService<ITestService>();
  201. Assert.IsNotNull(service1);
  202. Assert.IsNotNull(service2);
  203. Assert.IsNotNull(service3);
  204. Assert.AreEqual(service1, service2);
  205. Assert.AreEqual(service1, service3);
  206. }
  207. [TestMethod]
  208. public void RegisterSiteService()
  209. {
  210. var s = new ServiceLocator();
  211. var service = new SimpleSiteService();
  212. // all kinds of services should support IServiceSite call:
  213. s.Register(typeof(ITestService), typeof(SimpleSiteService), ServiceMode.Clone);
  214. s.Register(typeof(ICloneable), ServiceMode.Clone, (sender, e) => { e.Service = new SimpleSiteService(); });
  215. s.Register(typeof (IUnknownService), service);
  216. s.Register(TestId, typeof(SimpleSiteService), ServiceMode.Singleton);
  217. // get not null services with Provider set:
  218. var s1 = s.GetService<ITestService, SimpleSiteService>();
  219. var s2 = s.GetService<ICloneable, SimpleSiteService>();
  220. var s3 = s.GetService<IUnknownService, SimpleSiteService>();
  221. var s4 = s.GetService<SimpleSiteService>(TestId);
  222. Assert.IsNotNull(s1);
  223. Assert.IsNotNull(s1.Provider);
  224. Assert.AreEqual(s1.Provider, s);
  225. Assert.IsNotNull(s2);
  226. Assert.IsNotNull(s2.Provider);
  227. Assert.AreEqual(s2.Provider, s);
  228. Assert.IsNotNull(s3);
  229. Assert.IsNotNull(s3.Provider);
  230. Assert.AreEqual(s3.Provider, s);
  231. Assert.AreEqual(s3, service);
  232. Assert.IsNotNull(s4);
  233. Assert.IsNotNull(s4.Provider);
  234. Assert.AreEqual(s4.Provider, s);
  235. }
  236. [TestMethod]
  237. [ExpectedException(typeof(ArgumentNullException))]
  238. public void BindToNull()
  239. {
  240. var s = new ServiceLocator();
  241. // create any servie:
  242. var r = s.Register(typeof (ITestService), typeof (SimpleSiteService), ServiceMode.Clone);
  243. // try to bind with null:
  244. s.Bind(typeof (SimpleSiteService), null);
  245. Assert.IsNull(r);
  246. }
  247. [TestMethod]
  248. public void BindToExistingTypeService ()
  249. {
  250. var s = new ServiceLocator();
  251. var name1 = "MyService1";
  252. var name2 = "MyService2";
  253. // create any servie:
  254. var r = s.Register(typeof (ITestService), typeof (SimpleSiteService), ServiceMode.Singleton);
  255. // try to bind with null:
  256. s.Bind(typeof (SimpleSiteService), r);
  257. s.Bind(name1, r);
  258. s.Bind(name2, r);
  259. // get services:
  260. var o1 = s.GetService<ITestService>();
  261. var o2 = s.GetService<ITestService>(name1);
  262. var o3 = s.GetService<ITestService>(name2);
  263. Assert.IsNotNull(r);
  264. Assert.IsNotNull(o1);
  265. Assert.IsNotNull(o2);
  266. Assert.IsNotNull(o3);
  267. Assert.AreEqual(o1, o2);
  268. Assert.AreEqual(o2, o3);
  269. }
  270. [TestMethod]
  271. public void CrossLocatorBinding()
  272. {
  273. var s1 = new ServiceLocator();
  274. var s2 = new ServiceLocator();
  275. // register any service:
  276. var r1 = s1.Register(typeof (ITestService), typeof (SimpleSiteService), ServiceMode.Singleton);
  277. Assert.IsNotNull(r1);
  278. // try to bind in other locator:
  279. var r2 = s2.Bind(typeof (ITestService), r1);
  280. // since it's possible to share the same service across multiple service locators,
  281. // expect the object to be identical:
  282. Assert.IsNotNull(r2);
  283. Assert.AreEqual(r1, r2);
  284. }
  285. }
  286. }