コード例 #1
0
        public void Call_WhenMethodThrows_PreservesStackTrace()
        {
            try
            {
                // Arrange
                InvalidOperationException expectedException     = new InvalidOperationException();
                ExceptionDispatchInfo     expectedExceptionInfo = CreateExceptionInfo(expectedException);
                string expectedStackTrace = expectedExceptionInfo.SourceException.StackTrace;
                ThrowingProgram.ExceptionInfo = expectedExceptionInfo;

                var        host       = JobHostFactory.Create <ThrowingProgram>(null);
                MethodInfo methodInfo = typeof(ThrowingProgram).GetMethod("Throw");

                // Act & Assert
                FunctionInvocationException exception = Assert.Throws <FunctionInvocationException>(
                    () => host.Call(methodInfo));
                Assert.Same(exception.InnerException, expectedException);
                Assert.NotNull(exception.InnerException.StackTrace);
                Assert.True(exception.InnerException.StackTrace.StartsWith(expectedStackTrace));
            }
            finally
            {
                ThrowingProgram.ExceptionInfo = null;
            }
        }
コード例 #2
0
        public void QueueTrigger_WithNonTextualByteArrayMessageUsingQueueTriggerBindingData_Throws()
        {
            try
            {
                // Arrange
                var host = JobHostFactory.Create <QueueTriggerBindingDataProgram>(
                    CloudStorageAccount.DevelopmentStorageAccount);
                MethodInfo        methodInfo = typeof(QueueTriggerBindingDataProgram).GetMethod("OnQueue");
                byte[]            contents   = new byte[] { 0x00, 0xFF }; // Not valid UTF-8
                CloudQueueMessage message    = new CloudQueueMessage(contents);

                // Act & Assert
                FunctionInvocationException exception = Assert.Throws <FunctionInvocationException>(
                    () => host.Call(methodInfo, new { message = message }));
                // This exeption shape/message could be better, but it's meets a minimum acceptibility threshold.
                Assert.Equal("Exception binding parameter 'queueTrigger'", exception.InnerException.Message);
                Exception innerException = exception.InnerException.InnerException;
                Assert.IsType <InvalidOperationException>(innerException);
                Assert.Equal("Binding data does not contain expected value 'queueTrigger'.", innerException.Message);
            }
            finally
            {
                QueueTriggerBindingDataProgram.QueueTrigger = null;
            }
        }
コード例 #3
0
        public void BlobTrigger_ProvidesBlobTriggerBindingData()
        {
            try
            {
                // Arrange
                CloudStorageAccount account      = CloudStorageAccount.DevelopmentStorageAccount;
                var                host          = JobHostFactory.Create <BlobTriggerBindingDataProgram>(account);
                MethodInfo         methodInfo    = typeof(BlobTriggerBindingDataProgram).GetMethod("OnBlob");
                string             containerName = "a";
                string             blobName      = "b";
                string             expectedPath  = containerName + "/" + blobName;
                CloudBlobContainer container     = account.CreateCloudBlobClient().GetContainerReference(containerName);
                ICloudBlob         blob          = container.GetBlockBlobReference(blobName);

                // Act
                host.Call(methodInfo, new { blob = blob });

                // Assert
                Assert.Equal(expectedPath, BlobTriggerBindingDataProgram.BlobTrigger);
            }
            finally
            {
                BlobTriggerBindingDataProgram.BlobTrigger = null;
            }
        }
コード例 #4
0
        public void BindStringableParameter_CanInvoke()
        {
            // Arrange
            using (var host = JobHostFactory.Create <TestFunctions>())
            {
                MethodInfo method = typeof(TestFunctions).GetMethod("BindStringableParameter");
                Assert.NotNull(method); // Guard
                Guid   guid = Guid.NewGuid();
                string expectedGuidValue = guid.ToString("D");
                string message           = JsonConvert.SerializeObject(new MessageWithStringableProperty {
                    GuidValue = guid
                });

                try
                {
                    // Act
                    host.Call(method, new { message = message });

                    // Assert
                    Assert.Equal(expectedGuidValue, TestFunctions.Result);
                }
                finally
                {
                    TestFunctions.Result = null;
                }
            }
        }
コード例 #5
0
        public void SimpleInvoke_WithObject()
        {
            var host = JobHostFactory.Create <ProgramSimple>(null);

            var x = "abc";

            ProgramSimple._value = null;
            host.Call("Test", new { value = x });

            // Ensure test method was invoked properly.
            Assert.Equal(x, ProgramSimple._value);
        }
コード例 #6
0
        public void SimpleInvoke_WithDictionary()
        {
            var host = JobHostFactory.Create <ProgramSimple>(null);

            var x = "abc";

            ProgramSimple._value = null;
            host.Call("Test", new Dictionary <string, object> {
                { "value", x }
            });

            // Ensure test method was invoked properly.
            Assert.Equal(x, ProgramSimple._value);
        }
コード例 #7
0
        public async Task CallAsync_WithDictionary()
        {
            var host = JobHostFactory.Create <ProgramSimple>(null);

            var value = "abc";

            ProgramSimple._value = null;
            await host.CallAsync("Test", new Dictionary <string, object> {
                { "value", value }
            });

            // Ensure test method was invoked properly.
            Assert.Equal(value, ProgramSimple._value);
        }
コード例 #8
0
        public void ParameterBindings_WithNullableParameters_CanInvoke()
        {
            // Arrange
            using (var host = JobHostFactory.Create <TestFunctions>())
            {
                MethodInfo method = typeof(TestFunctions).GetMethod("ParameterBindings");
                TestFunctions.Result = null;
                host.Call(method, new { a = 123, b = default(int?), c = "Testing" });
                Assert.Equal("123Testing", TestFunctions.Result);

                host.Call(method, new { a = 123, b = default(int?), c = (string)null });
                Assert.Equal("123", TestFunctions.Result);
            }
        }
コード例 #9
0
        public void CallAsyncWithCancellationToken_PassesCancellationTokenToMethod()
        {
            // Arrange
            ProgramWithCancellationToken.Cleanup();
            var host = JobHostFactory.Create <ProgramWithCancellationToken>(null);

            using (CancellationTokenSource source = new CancellationTokenSource())
            {
                ProgramWithCancellationToken.CancellationTokenSource = source;

                // Act
                host.CallAsync("BindCancellationToken", null, source.Token).GetAwaiter().GetResult();

                // Assert
                Assert.True(ProgramWithCancellationToken.IsCancellationRequested);
            }
        }
コード例 #10
0
        public void QueueTrigger_ProvidesQueueTriggerBindingData()
        {
            try
            {
                // Arrange
                var host = JobHostFactory.Create <QueueTriggerBindingDataProgram>(
                    CloudStorageAccount.DevelopmentStorageAccount);
                MethodInfo methodInfo      = typeof(QueueTriggerBindingDataProgram).GetMethod("OnQueue");
                string     expectedMessage = "a";

                // Act
                host.Call(methodInfo, new { message = expectedMessage });

                // Assert
                Assert.Equal(expectedMessage, QueueTriggerBindingDataProgram.QueueTrigger);
            }
            finally
            {
                QueueTriggerBindingDataProgram.QueueTrigger = null;
            }
        }
コード例 #11
0
        public void QueueTrigger_WithNonTextualByteArrayMessageNotUsingQueueTriggerBindingData_DoesNotThrow()
        {
            try
            {
                // Arrange
                var host = JobHostFactory.Create <QueueTriggerBindingDataProgram>(
                    CloudStorageAccount.DevelopmentStorageAccount);
                MethodInfo        methodInfo    = typeof(QueueTriggerBindingDataProgram).GetMethod("ProcessQueueAsBytes");
                byte[]            expectedBytes = new byte[] { 0x00, 0xFF }; // Not valid UTF-8
                CloudQueueMessage message       = new CloudQueueMessage(expectedBytes);

                // Act
                host.Call(methodInfo, new { message = message });

                // Assert
                Assert.Equal(QueueTriggerBindingDataProgram.Bytes, expectedBytes);
            }
            finally
            {
                QueueTriggerBindingDataProgram.QueueTrigger = null;
            }
        }
コード例 #12
0
        public void QueueTrigger_WithTextualByteArrayMessage_ProvidesQueueTriggerBindingData()
        {
            try
            {
                // Arrange
                var host = JobHostFactory.Create <QueueTriggerBindingDataProgram>(
                    CloudStorageAccount.DevelopmentStorageAccount);
                MethodInfo        methodInfo      = typeof(QueueTriggerBindingDataProgram).GetMethod("OnQueue");
                string            expectedMessage = "abc";
                CloudQueueMessage message         = new CloudQueueMessage(expectedMessage);
                Assert.Equal(expectedMessage, message.AsString); // Guard

                // Act
                host.Call(methodInfo, new { message = message });

                // Assert
                Assert.Equal(expectedMessage, QueueTriggerBindingDataProgram.QueueTrigger);
            }
            finally
            {
                QueueTriggerBindingDataProgram.QueueTrigger = null;
            }
        }