Пример #1
0
        public void Pipeline_Execute_Throws_Wrong_Output_Length()
        {
            MockPipeline    pipeline    = TestPipelines.CreateMockProcessor1Pipeline();
            ProcessorResult errorResult = null;

            // Override the OnExecute to return a ProcessorResult
            // which contains the wrong
            ((MockProcessor1)pipeline.Processors[1]).OnExecuteCalled =
                i =>
            {
                ProcessorResult pr = new ProcessorResult <string>()
                {
                };
                pr.Output = new object[] { "string1", "string2" };
                return(pr as ProcessorResult <string>);
            };

            pipeline.OnErrorCalled = r => errorResult = r;

            // The final pipeline result should reflect that error status
            ProcessorResult result = pipeline.Execute(new object[] { 5 });

            Assert.IsNotNull(result, "Failed to get a result");
            Assert.AreEqual(ProcessorStatus.Error, result.Status, "Expected failure status");
            Assert.IsNotNull(result.Error, "Expected error result");
            Assert.AreEqual(typeof(InvalidOperationException), result.Error.GetType(), "Expected InvalidOperationException");

            Assert.IsNotNull(errorResult, "Pipeline.OnError should have been called");
        }
Пример #2
0
        public void ProcessCallsStep()
        {
            var pipeline = new MockPipeline();

            pipeline.Process(new TestableBundle("~"), new CassetteSettings());
            pipeline.DummyStep.ProcessCalled.ShouldBeTrue();
        }
        public void Pipeline_BindArgumentToPipelineOutput_By_Name()
        {
            MockProcessor1 processor = new MockProcessor1();
            MockPipeline   pipeline  = new MockPipeline(
                new Processor[] { processor },
                Enumerable.Empty <ProcessorArgument>(),
                new ProcessorArgument[] { new ProcessorArgument("PipelineOutput", typeof(string)) });

            BindArgumentsEventArgs eventArgs      = null;
            ProcessorArgument      inArgFromBind  = null;
            ProcessorArgument      outArgFromBind = null;

            pipeline.OnBindArgumentsCalled = (outArg, inArg) =>
            {
                inArgFromBind  = inArg;
                outArgFromBind = outArg;
            };

            pipeline.BoundArguments = (s, a) => { eventArgs = a as BindArgumentsEventArgs; };
            pipeline.BindArgumentToPipelineOutput(processor.OutArguments[0], "PipelineOutput");
            Assert.IsNotNull(eventArgs, "Did not receive OnBoundArguments callback");
            Assert.AreSame(pipeline.Processors[1].OutArguments[0], outArgFromBind, "Did not receive correct outArg in OnBind virtual");
            Assert.AreSame(pipeline.Processors[2].InArguments[0], inArgFromBind, "Did not receive correct inArg in OnBind virtual");
            Assert.IsTrue(pipeline.GetBoundToArguments(pipeline.Processors[1].OutArguments[0]).Contains(pipeline.Processors[2].InArguments[0]),
                          "Failed to find exit processor in argument in bindings for processor 1");
        }
        /// <summary>
        /// This pipeline has 2 MockProcessor1's in it, both binding their inputs to the pipeline's 'intValue'.
        /// The pipeline has 2 outputs, one bound to each processor's.
        /// </summary>
        /// <returns></returns>
        public static MockPipeline CreateDoubleMockProcessor1Pipeline()
        {
            Processor    processor1 = new MockProcessor1();
            Processor    processor2 = new MockProcessor1();
            MockPipeline pipeline   = new MockPipeline(
                new[] { processor1, processor2 },
                new[] { new ProcessorArgument("intValue", typeof(int), new object[0]) },
                new[] { new ProcessorArgument("theResult1", typeof(string), new object[0]),
                        new ProcessorArgument("theResult2", typeof(string), new object[0]) }
                );

            // Pipeline["intValue"] --> Processor1[0]
            pipeline.BindArgumentToPipelineInput("intValue", processor1.InArguments[0]);

            // Pipeline["intValue"] --> Processor2[0]
            pipeline.BindArgumentToPipelineInput("intValue", processor2.InArguments[0]);

            // Processor1[0] --> Pipeline["theResult1"]
            pipeline.BindArgumentToPipelineOutput(processor1.OutArguments[0], "theResult1");

            // Processor2[0] --> Pipeline["theResult2"]
            pipeline.BindArgumentToPipelineOutput(processor2.OutArguments[0], "theResult2");
            pipeline.Initialize();
            return(pipeline);
        }
        /// <summary>
        /// Creates a Pipeline with a single MockProcessor1 in it, binding its inputs to the pipeline inputs
        /// and its outputs to the pipeline outputs.
        /// </summary>
        /// <returns></returns>
        public static MockPipeline CreateMockProcessor1Pipeline()
        {
            MockPipeline pipeline = CreateMockProcessor1PipelineUninitialized();

            pipeline.Initialize();
            return(pipeline);
        }
Пример #6
0
        public void TestInitialise()
        {
            _Snapshot = Factory.TakeSnapshot();

            _ControllerFinder = MockHelper.FactoryImplementation <IControllerFinder>();
            _ControllerTypes  = new List <ControllerType>();
            _ControllerFinder.Setup(r => r.DiscoverControllers()).Returns(_ControllerTypes);

            _RouteFinder = MockHelper.FactoryImplementation <IRouteFinder>();
            _Routes      = new List <Route>();
            _RouteFinder.Setup(r => r.DiscoverRoutes(It.IsAny <IEnumerable <ControllerType> >())).Returns(_Routes);

            _RouteMapper = MockHelper.FactoryImplementation <IRouteMapper>();
            _FoundRoute  = new Route();
            _RouteMapper.Setup(r => r.FindRouteForRequest(It.IsAny <IDictionary <string, object> >())).Returns(() => _FoundRoute);
            _RouteParameters = new RouteParameters(new string[0], new object[0]);
            _RouteMapper.Setup(r => r.BuildRouteParameters(It.IsAny <Route>(), It.IsAny <IDictionary <string, object> >())).Returns(() => _RouteParameters);

            _RouteFilter_CanCallRoute = true;
            _RouteFilter = MockHelper.FactoryImplementation <IRouteFilter>();
            _RouteFilter.Setup(r => r.CanCallRoute(It.IsAny <Route>(), It.IsAny <IDictionary <string, object> >())).Returns(() => _RouteFilter_CanCallRoute);

            _RouteCaller  = MockHelper.FactoryImplementation <IRouteCaller>();
            _RouteOutcome = null;
            _RouteCaller.Setup(r => r.CallRoute(It.IsAny <IDictionary <string, object> >(), It.IsAny <Route>(), It.IsAny <RouteParameters>())).Returns(() => _RouteOutcome);

            _Responder = MockHelper.FactoryImplementation <IWebApiResponder>();

            _Pipeline    = new MockPipeline();
            _Environment = new MockOwinEnvironment();

            _WebApi = Factory.Resolve <IWebApiMiddleware>();
        }
Пример #7
0
        public void ProcessCallsCreatePipeline()
        {
            var pipeline = new MockPipeline();

            pipeline.Process(new TestableBundle("~"), new CassetteSettings(""));
            pipeline.CreatePipelineCalled.ShouldBeTrue();
        }
        public void Pipeline_BindArgumentToPipelineOutput_By_Bad_Name_Throws()
        {
            MockProcessor1 processor = new MockProcessor1();
            MockPipeline   pipeline  = new MockPipeline(
                new Processor[] { processor },
                Enumerable.Empty <ProcessorArgument>(),
                new ProcessorArgument[] { new ProcessorArgument("PipelineOutput", typeof(string)) });

            ExceptionAssert.Throws(
                typeof(ArgumentException),
                "BindArgumentToPipelineOutput should throw with null name",
                () => pipeline.BindArgumentToPipelineOutput(processor.OutArguments[0], null),
                "pipelineOutputArgumentName"
                );

            ExceptionAssert.Throws(
                typeof(ArgumentException),
                "BindArgumentToPipelineOutput should throw with empty name",
                () => pipeline.BindArgumentToPipelineOutput(processor.OutArguments[0], string.Empty),
                "pipelineOutputArgumentName"
                );

            ExceptionAssert.Throws(
                typeof(ArgumentException),
                "BindArgumentToPipelineOutput should throw with whitespace name",
                () => pipeline.BindArgumentToPipelineOutput(processor.OutArguments[0], "   "),
                "pipelineOutputArgumentName"
                );

            ExceptionAssert.ThrowsInvalidOperation(
                "BindArgumentToPipelineInput should throw with non-existent name",
                () => pipeline.BindArgumentToPipelineOutput(processor.OutArguments[0], "NotAName")
                );
        }
        public void PipelineContext_OnReadAllInputs_Overridable()
        {
            MockPipeline        pipeline = TestPipelines.CreateMockProcessor1Pipeline();
            MockPipelineContext context  = pipeline.Context;
            bool processorCalled         = false;

            context.OnReadAllInputsCalled = (inProc, inValues) =>
            {
                // Inject a '3' into the inputs for proc 1
                if (inProc == pipeline.Processors[1])
                {
                    processorCalled = true;
                    Assert.AreEqual(4, inValues[0], "Expected to see '4' as the pipeline input");
                    inValues[0] = 3;
                }
            };

            ProcessorResult procResult = pipeline.Execute(new object[] { 4 });

            Assert.IsNotNull(procResult.Output, "Expected output array");
            Assert.AreEqual(1, procResult.Output.Length, "Output size mismatch");
            Assert.AreEqual(3.ToString(), procResult.Output[0], "Pipeline did not use context we injected");

            Assert.IsTrue(processorCalled, "Our ReadAllInputs override was not called");
        }
        public void Pipeline_Bind_OnBinding_OnBind_OnBound_Callbacks()
        {
            MockProcessor1          processor1 = new MockProcessor1();
            MockProcessorEchoString processor2 = new MockProcessorEchoString();
            MockPipeline            pipeline   = new MockPipeline(
                new Processor[] { processor1, processor2 },
                Enumerable.Empty <ProcessorArgument>(),
                Enumerable.Empty <ProcessorArgument>());
            BindArgumentsEventArgs bindingEventArgs = null;
            BindArgumentsEventArgs boundEventArgs   = null;
            ProcessorArgument      inArgFromBind    = null;
            ProcessorArgument      outArgFromBind   = null;

            pipeline.OnBindArgumentsCalled = (outArg, inArg) =>
            {
                inArgFromBind  = inArg;
                outArgFromBind = outArg;
            };

            pipeline.BindingArguments = (s, a) => { bindingEventArgs = a as BindArgumentsEventArgs; };
            pipeline.BoundArguments   = (s, a) => { boundEventArgs = a as BindArgumentsEventArgs; };

            pipeline.BindArguments(processor1.OutArguments[0], processor2.InArguments[0]);
            Assert.IsNotNull(bindingEventArgs, "Did not receive BindingArguments callback");
            Assert.AreSame(processor1.OutArguments[0], bindingEventArgs.OutArgument, "Did not receive correct outArg in BindingArgument callback");
            Assert.AreSame(processor2.InArguments[0], bindingEventArgs.InArgument, "Did not receive correct inArg in BindingArgument callback");

            Assert.IsNotNull(boundEventArgs, "Did not receive BoundArguments callback");
            Assert.AreSame(processor1.OutArguments[0], boundEventArgs.OutArgument, "Did not receive correct outArg in BoundArgument callback");
            Assert.AreSame(processor2.InArguments[0], boundEventArgs.InArgument, "Did not receive correct inArg in BoundArgument callback");

            Assert.AreSame(processor1.OutArguments[0], outArgFromBind, "Did not receive correct outArg in OnBind virtual");
            Assert.AreSame(processor2.InArguments[0], inArgFromBind, "Did not receive correct inArg in OnBind virtual");
        }
Пример #11
0
        public void PipelineBuilder_Derived_Pipeline()
        {
            MockPipelineBuilderOfMockPipeline pb = new MockPipelineBuilderOfMockPipeline();

            Processor[]         processors = new Processor[0];
            ProcessorArgument[] inArgs     = new ProcessorArgument[0];
            ProcessorArgument[] outArgs    = new ProcessorArgument[0];
            MockPipeline        pipeline   = pb.Build(processors, inArgs, outArgs);
        }
Пример #12
0
        public void WhenUpdateStep_ThenProcessCallsUpdateAction()
        {
            var pipeline = new MockPipeline();

            pipeline.Update <MockStep>(step => step.Updated = true);

            pipeline.Process(new TestableBundle("~"), new CassetteSettings());

            pipeline.DummyStep.Updated.ShouldBeTrue();
        }
Пример #13
0
        public void WhenRemoveStep_ThenProcessDoesNotCallIt()
        {
            var pipeline = new MockPipeline();

            pipeline.Remove <MockStep>();

            pipeline.Process(new TestableBundle("~"), new CassetteSettings());

            pipeline.DummyStep.ProcessCalled.ShouldBeFalse();
        }
        public void PipelineContext_ReadInput_Returns_WriteInput()
        {
            MockPipeline        pipeline = TestPipelines.CreateMockProcessor1Pipeline();
            MockPipelineContext context  = pipeline.Context;

            context.WriteInput(pipeline.Processors[1].InArguments[0], 7);
            object value = context.ReadInput(pipeline.Processors[1].InArguments[0]);

            Assert.AreEqual(7, value, "Expected processor 1 to have this input value after we wrote it");
        }
        public void PipelineContext_WriteInput_Throws_If_Null_ProcessorArgument()
        {
            MockPipeline    pipeline = TestPipelines.CreateMockProcessor1Pipeline();
            PipelineContext context  = new PipelineContext(pipeline);

            ExceptionAssert.ThrowsArgumentNull(
                "PipelineContext should throw if null processor argument specified",
                "inArgument",
                () => context.WriteInput(null, new object())
                );
        }
Пример #16
0
        public void WhenReplaceStep_ThenProcessCallsNewStep()
        {
            var pipeline = new MockPipeline();
            var newStep  = new MockStep();

            pipeline.Replace <MockStep>(newStep);

            pipeline.Process(new TestableBundle("~"), new CassetteSettings());

            newStep.ProcessCalled.ShouldBeTrue();
        }
Пример #17
0
        public void WhenInsertAfterStep_TheProcessCallsTheNewStep()
        {
            var pipeline = new MockPipeline();
            var newStep  = new MockStep();

            pipeline.InsertAfter <MockStep>(newStep);

            pipeline.Process(new TestableBundle("~"), new CassetteSettings());

            newStep.ProcessCalled.ShouldBeTrue();
        }
        public void PipelineContext_ReadAllInputs_Throws_If_Null_Processor()
        {
            MockPipeline    pipeline = TestPipelines.CreateMockProcessor1Pipeline();
            PipelineContext context  = new PipelineContext(pipeline);

            ExceptionAssert.ThrowsArgumentNull(
                "PipelineContext should throw if null processor specified",
                "processor",
                () => context.ReadAllInputs(null)
                );
        }
Пример #19
0
        public void WhenReplaceStep_ThenProcessDoesNotCallOldStep()
        {
            var pipeline = new MockPipeline();
            var newStep  = new MockStep();

            pipeline.Replace <MockStep>(newStep);

            pipeline.Process(new TestableBundle("~"), new CassetteSettings(""));

            pipeline.DummyStep.ProcessCalled.ShouldBeFalse();
        }
Пример #20
0
        public void WhenAppendStep_ThenProcessCallsTheStepLast()
        {
            var pipeline = new MockPipeline();
            var step     = new MockStep();

            pipeline.Append(step);

            pipeline.Process(new TestableBundle("~"), new CassetteSettings());

            (step.CallIndex > pipeline.DummyStep.CallIndex).ShouldBeTrue();
        }
Пример #21
0
        public void WhenInsertBeforeStep_TheProcessCallsTheNewStepBeforeOriginalStep()
        {
            var pipeline = new MockPipeline();
            var newStep  = new MockStep();

            pipeline.InsertBefore <MockStep>(newStep);

            pipeline.Process(new TestableBundle("~"), new CassetteSettings());

            (newStep.CallIndex < pipeline.DummyStep.CallIndex).ShouldBeTrue();
        }
        public void PipelineContext_ReadInput_Returns_Result_After_Execution()
        {
            MockPipeline        pipeline = TestPipelines.CreateMockProcessor1Pipeline();
            MockPipelineContext context  = pipeline.Context;
            object value = context.ReadInput(pipeline.Processors[1].InArguments[0]);

            Assert.IsNull(value, "Expected null prior to execution");
            ProcessorResult result = pipeline.Execute(new object[] { 7 });

            value = context.ReadInput(pipeline.Processors[1].InArguments[0]);
            Assert.AreEqual(7, value, "Expected processor 1 to have this input value after execution");
        }
        /// <summary>
        /// Creates a Pipeline with no actual processor other than binding the pipeline inputs to the
        /// pipeline outputs.
        /// </summary>
        /// <returns></returns>
        public static MockPipeline CreateEmptyPipeline()
        {
            MockPipeline pipeline = new MockPipeline(
                new Processor[0],
                new[] { new ProcessorArgument("inValue", typeof(string), new object[0]) },
                new[] { new ProcessorArgument("outValue", typeof(string), new object[0]) }
                );

            pipeline.BindArgumentToPipelineInput("inValue", pipeline.Processors[1].InArguments[0]);
            pipeline.Initialize();
            return(pipeline);
        }
        public void PipelineContext_WriteInput_Throws_If_Containerless_ProcessorArgument()
        {
            MockPipeline    pipeline = TestPipelines.CreateMockProcessor1Pipeline();
            PipelineContext context  = new PipelineContext(pipeline);

            ExceptionAssert.Throws(
                typeof(ArgumentException),
                "PipelineContext should throw if processor argument belongs to no collection",
                () => context.WriteInput(new ProcessorArgument("foo", typeof(string)), new object()),
                "inArgument"
                );
        }
Пример #25
0
        public void CanChainModifications()
        {
            var pipeline = new MockPipeline();
            var step1    = new MockStep();
            var step2    = new MockStep();

            pipeline.Append(step1).Append(step2);

            pipeline.Process(new TestableBundle("~"), new CassetteSettings());

            step1.CallIndex.ShouldEqual(1);
            step2.CallIndex.ShouldEqual(2);
        }
        /// <summary>
        /// Creates an uninitialized Pipeline with a single MockProcessor1 in it, binding its inputs to the pipeline inputs
        /// and its outputs to the pipeline outputs.
        /// </summary>
        /// <returns></returns>
        public static MockPipeline CreateMockProcessor1PipelineUninitialized()
        {
            Processor    processor = new MockProcessor1();
            MockPipeline pipeline  = new MockPipeline(
                new[] { processor },
                new[] { new ProcessorArgument("intValue", typeof(int), new object[0]) },
                new[] { new ProcessorArgument("theResult", typeof(string), new object[0]) }
                );

            pipeline.BindArgumentToPipelineInput("intValue", processor.InArguments[0]);
            pipeline.BindArgumentToPipelineOutput(processor.OutArguments[0], "theResult");
            return(pipeline);
        }
        public void PipelineContext_ReadAllInputs_Throws_If_Processor_Not_In_Pipeline()
        {
            Processor       processor = new MockProcessor1();
            MockPipeline    pipeline  = TestPipelines.CreateMockProcessor1Pipeline();
            PipelineContext context   = new PipelineContext(pipeline);

            ExceptionAssert.Throws(
                typeof(ArgumentException),
                "PipelineContext should throw if processor from different pipeline specified",
                () => context.ReadAllInputs(processor),
                "processor"
                );
        }
        public void PipelineContext_WriteInput_Throws_If_External_ProcessorArgument()
        {
            Processor       processor = new MockProcessor1();
            MockPipeline    pipeline  = TestPipelines.CreateMockProcessor1Pipeline();
            PipelineContext context   = new PipelineContext(pipeline);

            ExceptionAssert.Throws(
                typeof(ArgumentException),
                "PipelineContext should throw if processor argument belongs to different pipeline",
                () => context.WriteInput(processor.InArguments[0], new object()),
                "inArgument"
                );
        }
Пример #29
0
        public void Pipeline_Executes_With_No_Bindings()
        {
            MockProcessor1          processor1 = new MockProcessor1();
            MockProcessorEchoString processor2 = new MockProcessorEchoString();
            MockPipeline            pipeline   = new MockPipeline(
                new Processor[] { processor1, processor2 },
                Enumerable.Empty <ProcessorArgument>(),
                Enumerable.Empty <ProcessorArgument>());

            pipeline.Initialize();
            ProcessorResult result = pipeline.Execute(new object[0]);

            Assert.IsNotNull(result, "Expected non-null ProcessorResult");
            Assert.IsNotNull(result.Output, "Expected non-null output from unbound pipeline");
            Assert.AreEqual(0, result.Output.Length, "Expected empty array from unbound pipeline");
            Assert.AreEqual(ProcessorStatus.Ok, result.Status, "Expected OK status from pipeline");
        }
        public void PipelineContext_Can_Redirect_Storage()
        {
            MockPipeline pipeline = TestPipelines.CreateMockProcessor1Pipeline();

            // Create our own special context and redirect to it when pipeline executes
            MockPipelineContextWithOwnStore context = new MockPipelineContextWithOwnStore(pipeline);

            pipeline.OnCreateContextCalled = () => context;

            ProcessorResult procResult = pipeline.Execute(new object[] { 4 });

            Assert.IsNotNull(procResult.Output, "Expected output array");
            Assert.AreEqual(1, procResult.Output.Length, "Output size mismatch");
            Assert.AreEqual(4.ToString(), procResult.Output[0], "Pipeline did produce expected value");

            Dictionary <ProcessorArgument, object> cache = context.Cache;

            Assert.AreEqual(2, cache.Count, "Expected 2 cached input values");
        }