PageRenderTime 57ms CodeModel.GetById 8ms RepoModel.GetById 0ms app.codeStats 0ms

/src/Ninject.Extensions.Interception.Test/DynamicProxy2BaseTests.cs

https://github.com/hereyes/ninject.extensions.interception
C# | 270 lines | 219 code | 49 blank | 2 comment | 4 complexity | a8b0eff12eef59830b696230d4a6cc43 MD5 | raw file
Possible License(s): Apache-2.0, LGPL-3.0, MPL-2.0-no-copyleft-exception
  1. namespace Ninject.Extensions.Interception
  2. {
  3. using System;
  4. using System.Collections.Generic;
  5. using Castle.DynamicProxy;
  6. using FluentAssertions;
  7. using Ninject.Extensions.Interception.Fakes;
  8. using Ninject.Extensions.Interception.Infrastructure.Language;
  9. using Ninject.Extensions.Interception.Interceptors;
  10. using Xunit;
  11. public class DynamicProxy2BaseTests : DynamicProxy2InterceptionContext
  12. {
  13. [Fact]
  14. public void SelfBoundTypesDeclaringMethodInterceptorsAreProxied()
  15. {
  16. using (var kernel = CreateDefaultInterceptionKernel())
  17. {
  18. kernel.Bind<ObjectWithMethodInterceptor>().ToSelf();
  19. var obj = kernel.Get<ObjectWithMethodInterceptor>();
  20. obj.Should().NotBeNull();
  21. var baseTypes = new List<Type>();
  22. Type type = obj.GetType();
  23. while (type != typeof(object))
  24. {
  25. baseTypes.Add(type);
  26. Type[] interfaces = type.GetInterfaces();
  27. baseTypes.AddRange(interfaces);
  28. type = type.BaseType;
  29. }
  30. typeof(IProxyTargetAccessor).IsAssignableFrom(obj.GetType()).Should().BeTrue();
  31. }
  32. }
  33. [Fact]
  34. public void SelfBoundTypesDeclaringMethodInterceptorsCanBeReleased()
  35. {
  36. using (var kernel = CreateDefaultInterceptionKernel())
  37. {
  38. kernel.Bind<ObjectWithMethodInterceptor>().ToSelf();
  39. var obj = kernel.Get<ObjectWithMethodInterceptor>();
  40. obj.Should().NotBeNull();
  41. }
  42. }
  43. [Fact]
  44. public void ClassesWithMultiplePropertiesWithTheSameNameCanBeInjected()
  45. {
  46. using (var kernel = CreateDefaultInterceptionKernel())
  47. {
  48. kernel.Bind<SameNameProperty>().ToSelf();
  49. var obj = kernel.Get<SameNameProperty>();
  50. obj.Should().NotBeNull();
  51. }
  52. }
  53. [Fact]
  54. public void SelfBoundTypesDeclaringMethodInterceptorsAreIntercepted()
  55. {
  56. using (var kernel = CreateDefaultInterceptionKernel())
  57. {
  58. kernel.Bind<ObjectWithMethodInterceptor>().ToSelf();
  59. var obj = kernel.Get<ObjectWithMethodInterceptor>();
  60. obj.Should().NotBeNull();
  61. typeof(IProxyTargetAccessor).IsAssignableFrom(obj.GetType()).Should().BeTrue();
  62. CountInterceptor.Reset();
  63. obj.Foo();
  64. obj.Bar();
  65. CountInterceptor.Count.Should().Be(1);
  66. }
  67. }
  68. [Fact]
  69. public void SelfBoundTypesDeclaringPropertyInterceptorsAreIntercepted()
  70. {
  71. using (var kernel = CreateDefaultInterceptionKernel())
  72. {
  73. kernel.Bind<ObjectWithMethodInterceptor>().ToSelf();
  74. var obj = kernel.Get<ObjectWithMethodInterceptor>();
  75. CountInterceptor.Reset();
  76. var value = obj.TestProperty;
  77. obj.TestProperty = value;
  78. CountInterceptor.Count.Should().Be(0);
  79. var value2 = obj.TestProperty2;
  80. obj.TestProperty2 = value2;
  81. CountInterceptor.Count.Should().Be(1);
  82. }
  83. }
  84. [Fact]
  85. public void SelfBoundTypesDeclaringInterceptorsOnGenericMethodsAreIntercepted()
  86. {
  87. using (var kernel = CreateDefaultInterceptionKernel())
  88. {
  89. kernel.Bind<ObjectWithGenericMethod>().ToSelf();
  90. var obj = kernel.Get<ObjectWithGenericMethod>();
  91. FlagInterceptor.Reset();
  92. string result = obj.ConvertGeneric(42);
  93. result.Should().Be("42");
  94. FlagInterceptor.WasCalled.Should().BeTrue();
  95. }
  96. }
  97. [Fact]
  98. public void ServiceBoundTypesDeclaringMethodInterceptorsAreProxied()
  99. {
  100. using (var kernel = CreateDefaultInterceptionKernel())
  101. {
  102. kernel.Bind<IFoo>().To<ObjectWithMethodInterceptor>();
  103. var obj = kernel.Get<IFoo>();
  104. obj.Should().NotBeNull();
  105. typeof(IProxyTargetAccessor).IsAssignableFrom(obj.GetType()).Should().BeTrue();
  106. }
  107. }
  108. [Fact]
  109. public void ServiceBoundTypesDeclaringMethodInterceptorsAreIntercepted()
  110. {
  111. using (var kernel = CreateDefaultInterceptionKernel())
  112. {
  113. kernel.Bind<IFoo>().To<ObjectWithMethodInterceptor>();
  114. var obj = kernel.Get<IFoo>();
  115. obj.Should().NotBeNull();
  116. typeof(IProxyTargetAccessor).IsAssignableFrom(obj.GetType()).Should().BeTrue();
  117. CountInterceptor.Reset();
  118. obj.Foo();
  119. obj.Bar();
  120. CountInterceptor.Count.Should().Be(1);
  121. }
  122. }
  123. [Fact]
  124. public void ServiceBoundTypesDeclaringInterceptorsOnGenericMethodsAreIntercepted()
  125. {
  126. using ( StandardKernel kernel = CreateDefaultInterceptionKernel() )
  127. {
  128. kernel.Bind<IGenericMethod>().To<ObjectWithGenericMethod>();
  129. var obj = kernel.Get<IGenericMethod>();
  130. obj.Should().NotBeNull();
  131. typeof(IProxyTargetAccessor).IsAssignableFrom(obj.GetType()).Should().BeTrue();
  132. FlagInterceptor.Reset();
  133. string result = obj.ConvertGeneric(42);
  134. result.Should().Be("42");
  135. FlagInterceptor.WasCalled.Should().BeTrue();
  136. }
  137. }
  138. [Fact]
  139. public void SelfBoundTypesThatAreProxiedReceiveConstructorInjections()
  140. {
  141. using ( StandardKernel kernel = CreateDefaultInterceptionKernel() )
  142. {
  143. kernel.Bind<RequestsConstructorInjection>().ToSelf();
  144. // This is just here to trigger proxying, but we won't intercept any calls
  145. kernel.Intercept(request => true).With<FlagInterceptor>();
  146. var obj = kernel.Get<RequestsConstructorInjection>();
  147. obj.Should().NotBeNull();
  148. typeof(IProxyTargetAccessor).IsAssignableFrom(obj.GetType()).Should().BeTrue();
  149. obj.Child.Should().NotBeNull();
  150. }
  151. }
  152. [Fact]
  153. public void SingletonTests()
  154. {
  155. using (StandardKernel kernel = CreateDefaultInterceptionKernel())
  156. {
  157. kernel.Bind<RequestsConstructorInjection>().ToSelf().InSingletonScope();
  158. // This is just here to trigger proxying, but we won't intercept any calls
  159. kernel.Intercept((request) => true).With<FlagInterceptor>();
  160. var obj = kernel.Get<RequestsConstructorInjection>();
  161. obj.Should().NotBeNull();
  162. typeof(IProxyTargetAccessor).IsAssignableFrom(obj.GetType()).Should().BeTrue();
  163. obj.Child.Should().NotBeNull();
  164. }
  165. }
  166. [Fact]
  167. public void NoneVirtualFunctionIntercepted_WhenResolveByInterface_ThenInterceptabe()
  168. {
  169. using (var kernel = CreateDefaultInterceptionKernel())
  170. {
  171. CountInterceptor.Reset();
  172. kernel.Bind<IFoo>().To<NoneVirtualFooImplementation>().Intercept().With<CountInterceptor>();
  173. var obj = kernel.Get<IFoo>();
  174. obj.Foo();
  175. CountInterceptor.Count.Should().Be(1);
  176. }
  177. }
  178. [Fact]
  179. public void NoneVirtualFunctionIntercepted_WhenResolveByInterfaceAndInterceptionByContext_ThenInterceptabe()
  180. {
  181. using (var kernel = CreateDefaultInterceptionKernel())
  182. {
  183. CountInterceptor.Reset();
  184. kernel.Bind<IFoo>().To<NoneVirtualFooImplementation>();
  185. kernel.Intercept(ctx => ctx.Request.Service == typeof(IFoo)).With<CountInterceptor>();
  186. var obj = kernel.Get<IFoo>();
  187. obj.Foo();
  188. CountInterceptor.Count.Should().Be(1);
  189. }
  190. }
  191. [Fact]
  192. public void NoneVirtualPropertyIntercepted_WhenResolveByInterface_ThenInterceptabe()
  193. {
  194. using (var kernel = CreateDefaultInterceptionKernel())
  195. {
  196. CountInterceptor.Reset();
  197. const bool OriginalValue = true;
  198. kernel.Bind<IFoo>().To<NoneVirtualFooImplementation>();
  199. kernel.Intercept(ctx => ctx.Request.Service == typeof(IFoo)).With<CountInterceptor>();
  200. var obj = kernel.Get<IFoo>();
  201. obj.TestProperty = OriginalValue;
  202. var value = obj.TestProperty;
  203. CountInterceptor.Count.Should().Be(1);
  204. value.Should().Be(OriginalValue);
  205. }
  206. }
  207. [Fact]
  208. public void ClassesWithNoDefaultConstructorCanBeIntercepted()
  209. {
  210. using (var kernel = CreateDefaultInterceptionKernel())
  211. {
  212. CountInterceptor.Reset();
  213. kernel.Bind<IFoo>().To<FooWithNoDefaultConstructor>().Intercept().With<CountInterceptor>();
  214. kernel.Bind<IMock>().To<SimpleObject>();
  215. var obj = kernel.Get<IFoo>();
  216. obj.Foo();
  217. CountInterceptor.Count.Should().Be(1);
  218. }
  219. }
  220. }
  221. }