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; } }
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; } }
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; } }
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; } } }
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); }
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); }
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); }
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); } }
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); } }
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; } }
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; } }
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; } }