Example #1
0
        public void EventsAreIntercepted()
        {
            CallCountHandler fireHandler = new CallCountHandler();
            CallCountHandler addHandler  = new CallCountHandler();

            VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor();

            Assert.IsTrue(interceptor.CanIntercept(typeof(OverrideableProperies)));

            Type            proxyType = interceptor.CreateProxyType(typeof(ClassWithEvent));
            ClassWithEvent  instance  = (ClassWithEvent)Activator.CreateInstance(proxyType);
            PipelineManager manager   = new PipelineManager();

            ((IInterceptingProxy)instance).AddInterceptionBehavior(new PolicyInjectionBehavior(manager));
            SetPipeline(manager, instance, "add_MyEvent", addHandler);
            SetPipeline(manager, instance, "FireMyEvent", fireHandler);

            bool raised = false;

            instance.MyEvent += delegate { raised = true; };

            instance.FireMyEvent();
            instance.FireMyEvent();

            Assert.IsTrue(raised);

            Assert.AreEqual(2, fireHandler.CallCount);
            Assert.AreEqual(1, addHandler.CallCount);
        }
Example #2
0
        public void CanCreateInstanceForGeneratedTypeForAbstractTypeWithProtectedConstructor()
        {
            VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor();
            Type proxyType = interceptor.CreateProxyType(typeof(AbstractClassWithProtectedConstructor));

            Activator.CreateInstance(proxyType, 100);
        }
Example #3
0
        public void CanGenerateDerivedTypeForAbstractType()
        {
            VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor();
            Type proxyType = interceptor.CreateProxyType(typeof(AbstractClassWithPublicConstructor));

            Assert.AreSame(typeof(AbstractClassWithPublicConstructor), proxyType.BaseType);
        }
Example #4
0
        public void CanInterceptProperties()
        {
            CallCountHandler getHandler = new CallCountHandler();
            CallCountHandler setHandler = new CallCountHandler();

            VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor();

            Assert.IsTrue(interceptor.CanIntercept(typeof(OverrideableProperies)));

            Type proxyType = interceptor.CreateProxyType(typeof(OverrideableProperies));
            OverrideableProperies instance = (OverrideableProperies)Activator.CreateInstance(proxyType);

            PipelineManager manager = new PipelineManager();

            ((IInterceptingProxy)instance).AddInterceptionBehavior(new PolicyInjectionBehavior(manager));
            SetPipeline(manager, instance, "get_IntProperty", getHandler);
            SetPipeline(manager, instance, "set_IntProperty", setHandler);

            instance.IntProperty = 12;
            instance.IntProperty = 15;

            int total = 0;

            for (int i = 0; i < 5; ++i)
            {
                total += instance.IntProperty;
            }

            Assert.AreEqual(5 * 15, total);

            Assert.AreEqual(5, getHandler.CallCount);
            Assert.AreEqual(2, setHandler.CallCount);
        }
        public void AttemptingToInterceptInvalidClassThrows()
        {
            PostCallCountHandler     handler     = new PostCallCountHandler();
            VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor();

            interceptor.CreateProxyType(typeof(CantTouchThis));
        }
        public void CanInterceptProperties()
        {
            CallCountHandler getHandler = new CallCountHandler();
            CallCountHandler setHandler = new CallCountHandler();

            VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor();
            Assert.IsTrue(interceptor.CanIntercept(typeof(OverrideableProperies)));

            Type proxyType = interceptor.CreateProxyType(typeof(OverrideableProperies));
            OverrideableProperies instance = (OverrideableProperies)Activator.CreateInstance(proxyType);

            PipelineManager manager = new PipelineManager();
            ((IInterceptingProxy)instance).AddInterceptionBehavior(new PolicyInjectionBehavior(manager));
            SetPipeline(manager, instance, "get_IntProperty", getHandler);
            SetPipeline(manager, instance, "set_IntProperty", setHandler);

            instance.IntProperty = 12;
            instance.IntProperty = 15;

            int total = 0;
            for (int i = 0; i < 5; ++i)
            {
                total += instance.IntProperty;
            }

            Assert.AreEqual(5 * 15, total);

            Assert.AreEqual(5, getHandler.CallCount);
            Assert.AreEqual(2, setHandler.CallCount);
        }
Example #7
0
        public void InterceptableClassWithNoVirtualMethodsReturnsEmptyMethodList()
        {
            VirtualMethodInterceptor        interceptor = new VirtualMethodInterceptor();
            List <MethodImplementationInfo> methods     =
                new List <MethodImplementationInfo>(interceptor.GetInterceptableMethods(typeof(ClassWithNoVirtuals), typeof(ClassWithNoVirtuals)));

            Assert.AreEqual(0, methods.Count);
        }
Example #8
0
        public void AssortedParameterKindsAreProperlyHandled()
        {
            var interceptor = new VirtualMethodInterceptor();

            var type = interceptor.CreateProxyType(typeof(AssortedParameterKindsAreProperlyHandledHelper.TypeWithAssertedParameterKinds));

            IInterceptingProxy proxy = Activator.CreateInstance(type) as IInterceptingProxy;

            AssortedParameterKindsAreProperlyHandledHelper.PerformTest(proxy);
        }
        public void CanDoVirtualInterception()
        {
            //Virtual method interceptor
            var type         = typeof(MyType);
            var handlerType  = typeof(ModifyResultHandler);
            var interceptor  = new VirtualMethodInterceptor();
            var canIntercept = interceptor.CanIntercept(type);
            var myProxyType  = interceptor.Intercept(type, handlerType);
            var myProxy      = Activator.CreateInstance(myProxyType) as IMyType;
            var result       = myProxy.MyMethod();

            Assert.Equal(20, result);
        }
        public void InterceptingClassOverridesBaseClassVirtualMethods()
        {
            Type baseType = typeof(ClassWithDefaultCtor);
            VirtualMethodInterceptor   interceptor = new VirtualMethodInterceptor();
            InterceptingClassGenerator generator   = new InterceptingClassGenerator(baseType);
            Type generatedType = generator.GenerateType();

            MethodInfo methodOne       = generatedType.GetMethod("MethodOne");
            MethodInfo calculateAnswer = generatedType.GetMethod("CalculateAnswer");

            Assert.AreSame(generatedType, methodOne.DeclaringType);
            Assert.AreSame(generatedType, calculateAnswer.DeclaringType);
        }
        static void VirtualMethodInterceptor(Type type)
        {
            //Virtual method interceptor
            var interceptor      = new VirtualMethodInterceptor();
            var canIntercept     = interceptor.CanIntercept(type);
            var myProxyType      = interceptor.Intercept(type, typeof(MyHandler));
            var myProxy          = Activator.CreateInstance(myProxyType) as IMyType;
            var proxy            = myProxy as IInterceptionProxy;
            var otherInterceptor = proxy.Interceptor;
            var result           = myProxy.MyMethod();

            Assert.AreEqual(20, result);
        }
Example #12
0
        public void ReflectingOverProxyTypesGivesOnlyBaseProperties()
        {
            VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor();

            Assert.IsTrue(interceptor.CanIntercept(typeof(OverrideableProperies)));

            Type proxyType = interceptor.CreateProxyType(typeof(OverrideableProperies));

            PropertyInfo[] properties = proxyType.GetProperties();

            Assert.AreEqual(2, properties.Length);
            Assert.IsTrue(Sequence.ForAll(properties, delegate(PropertyInfo pi) { return(pi.DeclaringType == typeof(OverrideableProperies)); }));
        }
        public void AttemptingToInterceptInvalidClassThrows()
        {
            PostCallCountHandler     handler     = new PostCallCountHandler();
            VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor();

            try
            {
                interceptor.CreateProxyType(typeof(CantTouchThis));
                Assert.Fail();
            }
            catch (Exception ex)
            {
                Assert.IsInstanceOfType(ex, typeof(InvalidOperationException));
            }
        }
Example #14
0
        public void CanInterceptMethods()
        {
            CallCountHandler         h1          = new CallCountHandler();
            VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor();
            Type proxyType = interceptor.CreateProxyType(typeof(TwoOverrideableMethods));

            TwoOverrideableMethods instance =
                (TwoOverrideableMethods)Activator.CreateInstance(proxyType);

            SetPipeline(instance, "DoSomething", h1);

            instance.DoSomething();

            Assert.IsTrue(instance.DidSomething);
            Assert.AreEqual(1, h1.CallCount);
        }
Example #15
0
        public void InvokingAbstractMethodFromInterceptedAbstracTypeInstanceThrows()
        {
            VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor();
            Type proxyType = interceptor.CreateProxyType(typeof(AbstractClassWithPublicConstructor));

            AbstractClassWithPublicConstructor instance =
                (AbstractClassWithPublicConstructor)Activator.CreateInstance(proxyType);

            try
            {
                instance.AbstractMethod();
                Assert.Fail("should have thrown");
            }
            catch (NotImplementedException)
            {
            }
        }
        public void CanInterceptMethods()
        {
            CallCountHandler h1 = new CallCountHandler();
            VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor();
            Type proxyType = interceptor.CreateProxyType(typeof(TwoOverrideableMethods));

            TwoOverrideableMethods instance =
                (TwoOverrideableMethods)Activator.CreateInstance(proxyType);
            PipelineManager manager = new PipelineManager();
            ((IInterceptingProxy)instance).AddInterceptionBehavior(new PolicyInjectionBehavior(manager));
            SetPipeline(manager, instance, "DoSomething", h1);

            instance.DoSomething();

            Assert.IsTrue(instance.DidSomething);
            Assert.AreEqual(1, h1.CallCount);
        }
Example #17
0
        public void CanInvokeOverridenAbstractMethodMethodOnInterceptedAbstractDerivedFromAbstractTypeInstance()
        {
            VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor();
            Type proxyType = interceptor.CreateProxyType(typeof(AbstractDerivedFromAbstractClassWithPublicConstructor));

            AbstractDerivedFromAbstractClassWithPublicConstructor instance =
                (AbstractDerivedFromAbstractClassWithPublicConstructor)Activator.CreateInstance(proxyType);
            bool invoked = false;

            ((IInterceptingProxy)instance).AddInterceptionBehavior(
                new DelegateInterceptionBehavior((mi, gn) => { invoked = true; return(gn()(mi, gn)); }));

            int value = instance.AbstractMethod();

            Assert.AreEqual(200, value);
            Assert.IsTrue(invoked);
        }
Example #18
0
        public void CanInterceptTypeWithNonDefaultCtor()
        {
            CallCountHandler         h1          = new CallCountHandler();
            VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor();
            Type proxyType = interceptor.CreateProxyType(typeof(ClassWithNonDefaultCtor));

            ClassWithNonDefaultCtor instance =
                (ClassWithNonDefaultCtor)Activator.CreateInstance(proxyType, "arg-value");

            PipelineManager manager = new PipelineManager();

            ((IInterceptingProxy)instance).AddInterceptionBehavior(new PolicyInjectionBehavior(manager));
            SetPipeline(manager, instance, "GetArg", h1);

            Assert.AreEqual("arg-value", instance.GetArg());

            Assert.AreEqual(1, h1.CallCount);
        }
Example #19
0
        public void CanInterceptMethods()
        {
            CallCountHandler         h1          = new CallCountHandler();
            VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor();
            Type proxyType = interceptor.CreateProxyType(typeof(TwoOverrideableMethods));

            TwoOverrideableMethods instance =
                (TwoOverrideableMethods)Activator.CreateInstance(proxyType);
            PipelineManager manager = new PipelineManager();

            ((IInterceptingProxy)instance).AddInterceptionBehavior(new PolicyInjectionBehavior(manager));
            SetPipeline(manager, instance, "DoSomething", h1);

            instance.DoSomething();

            Assert.IsTrue(instance.DidSomething);
            Assert.AreEqual(1, h1.CallCount);
        }
Example #20
0
        public void CanInterceptNonPublicPropertiesUsingVirtualInterceptor()
        {
            VirtualMethodInterceptor interceptor =
                new VirtualMethodInterceptor();

            Type generatedType = interceptor.CreateProxyType(typeof(ClassWithNonPublicVirtualProperties));

            ClassWithNonPublicVirtualProperties instance = (ClassWithNonPublicVirtualProperties)Activator.CreateInstance(generatedType);

            bool intercepted = false;

            ((IInterceptingProxy)instance)
            .AddInterceptionBehavior(
                new ActionInterceptionBehavior(() => intercepted = true));

            var result = instance.GetSomePropertyValue();

            Assert.IsTrue(intercepted);
        }
Example #21
0
        internal static T GetInterceptingInstance <T>(params object[] ctorValues)
        {
            VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor();
            Type typeToIntercept = typeof(T);

            if (typeToIntercept.IsGenericType)
            {
                typeToIntercept = typeToIntercept.GetGenericTypeDefinition();
            }

            InterceptingClassGenerator generator = new InterceptingClassGenerator(typeToIntercept);
            Type generatedType = generator.GenerateType();

            if (generatedType.IsGenericTypeDefinition)
            {
                generatedType = generatedType.MakeGenericType(typeof(T).GetGenericArguments());
            }

            return((T)Activator.CreateInstance(generatedType, ctorValues));
        }
        public void ReflectingOverProxyTypesGivesOnlyBaseProperties()
        {
            VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor();
            Assert.IsTrue(interceptor.CanIntercept(typeof(OverrideableProperies)));

            Type proxyType = interceptor.CreateProxyType(typeof(OverrideableProperies));
            PropertyInfo[] properties = proxyType.GetProperties();

            Assert.AreEqual(2, properties.Length);

            Assert.IsTrue(properties.All(pi => pi.DeclaringType == typeof(OverrideableProperies)));
        }
Example #23
0
        public void CantInterceptSealedClass()
        {
            VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor();

            Assert.IsFalse(interceptor.CanIntercept(typeof(CantOverride)));
        }
        public void EventsAreIntercepted()
        {
            CallCountHandler fireHandler = new CallCountHandler();
            CallCountHandler addHandler = new CallCountHandler();

            VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor();
            Assert.IsTrue(interceptor.CanIntercept(typeof(OverrideableProperies)));

            Type proxyType = interceptor.CreateProxyType(typeof(ClassWithEvent));
            ClassWithEvent instance = (ClassWithEvent)Activator.CreateInstance(proxyType);
            PipelineManager manager = new PipelineManager();
            ((IInterceptingProxy)instance).AddInterceptionBehavior(new PolicyInjectionBehavior(manager));
            SetPipeline(manager, instance, "add_MyEvent", addHandler);
            SetPipeline(manager, instance, "FireMyEvent", fireHandler);


            bool raised = false;
            instance.MyEvent += delegate { raised = true; };

            instance.FireMyEvent();
            instance.FireMyEvent();

            Assert.IsTrue(raised);

            Assert.AreEqual(2, fireHandler.CallCount);
            Assert.AreEqual(1, addHandler.CallCount);

        }
        public void CantInterceptSealedClass()
        {
            VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor();
            Assert.IsFalse(interceptor.CanIntercept(typeof(CantOverride)));

        }
Example #26
0
        public void CanInterceptBasicClass()
        {
            VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor();

            Assert.IsTrue(interceptor.CanIntercept(typeof(ClassWithNoVirtuals)));
        }
        public void CanInterceptTypeWithNonDefaultCtor()
        {
            CallCountHandler h1 = new CallCountHandler();
            VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor();
            Type proxyType = interceptor.CreateProxyType(typeof(ClassWithNonDefaultCtor));

            ClassWithNonDefaultCtor instance =
                (ClassWithNonDefaultCtor)Activator.CreateInstance(proxyType, "arg-value");

            PipelineManager manager = new PipelineManager();
            ((IInterceptingProxy)instance).AddInterceptionBehavior(new PolicyInjectionBehavior(manager));
            SetPipeline(manager, instance, "GetArg", h1);

            Assert.AreEqual("arg-value", instance.GetArg());

            Assert.AreEqual(1, h1.CallCount);
        }
 public void CanInterceptBasicClass()
 {
     VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor();
     Assert.IsTrue(interceptor.CanIntercept(typeof(ClassWithNoVirtuals)));
 }
        public void AssortedParameterKindsAreProperlyHandled()
        {
            var interceptor = new VirtualMethodInterceptor();

            var type = interceptor.CreateProxyType(typeof(AssortedParameterKindsAreProperlyHandledHelper.TypeWithAssertedParameterKinds));

            IInterceptingProxy proxy = Activator.CreateInstance(type) as IInterceptingProxy;

            AssortedParameterKindsAreProperlyHandledHelper.PerformTest(proxy);
        }
        public void InvokingAbstractMethodFromInterceptedAbstracTypeInstanceThrows()
        {
            VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor();
            Type proxyType = interceptor.CreateProxyType(typeof(AbstractClassWithPublicConstructor));

            AbstractClassWithPublicConstructor instance =
                (AbstractClassWithPublicConstructor)Activator.CreateInstance(proxyType);

            try
            {
                instance.AbstractMethod();
                Assert.Fail("should have thrown");
            }
            catch (NotImplementedException)
            {
            }
        }
        public void CanCreateInstanceForGeneratedTypeForAbstractTypeWithProtectedConstructor()
        {
            VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor();
            Type proxyType = interceptor.CreateProxyType(typeof(AbstractClassWithProtectedConstructor));

            Activator.CreateInstance(proxyType, 100);
        }
		static void VirtualMethodInterceptor(Type type)
		{
			//Virtual method interceptor
			var interceptor = new VirtualMethodInterceptor();
			var canIntercept = interceptor.CanIntercept(type);
			var myProxyType = interceptor.Intercept(type, typeof(MyHandler));
			var myProxy = Activator.CreateInstance(myProxyType) as IMyType;
			var proxy = myProxy as IInterceptionProxy;
			var otherInterceptor = proxy.Interceptor;
			var result = myProxy.MyMethod();
			Assert.AreEqual(20, result);
		}
        public void CanGenerateDerivedTypeForAbstractType()
        {
            VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor();
            Type proxyType = interceptor.CreateProxyType(typeof(AbstractClassWithPublicConstructor));

            Assert.AreSame(typeof(AbstractClassWithPublicConstructor), proxyType.BaseType);
        }
        public void CanInvokeOverridenAbstractMethodMethodOnInterceptedAbstractDerivedFromAbstractTypeInstance()
        {
            VirtualMethodInterceptor interceptor = new VirtualMethodInterceptor();
            Type proxyType = interceptor.CreateProxyType(typeof(AbstractDerivedFromAbstractClassWithPublicConstructor));

            AbstractDerivedFromAbstractClassWithPublicConstructor instance =
                (AbstractDerivedFromAbstractClassWithPublicConstructor)Activator.CreateInstance(proxyType);
            bool invoked = false;
            ((IInterceptingProxy)instance).AddInterceptionBehavior(
                new DelegateInterceptionBehavior((mi, gn) => { invoked = true; return gn()(mi, gn); }));

            int value = instance.AbstractMethod();

            Assert.AreEqual(200, value);
            Assert.IsTrue(invoked);
        }