public static async Task <NotifyingBlobStream> BindStreamAsync(BlobWithContainer <BlobBaseClient> blob, ValueBindingContext context, IBlobWrittenWatcher blobWrittenWatcher) { var blockBlob = blob.BlobClient as BlockBlobClient; if (blockBlob == null) { throw new InvalidOperationException("Cannot bind to page or append blobs using 'out string', 'TextWriter', or writable 'Stream' parameters."); } var functionID = context.FunctionInstanceId; BlobProperties properties = await blockBlob.FetchPropertiesOrNullIfNotExistAsync().ConfigureAwait(false); Dictionary <string, string> metadata = new Dictionary <string, string>(); if (properties != null && properties.Metadata != null) { metadata = new Dictionary <string, string>(properties.Metadata); } BlobCausalityManager.SetWriter(metadata, functionID); BlockBlobOpenWriteOptions options = new BlockBlobOpenWriteOptions() { Metadata = metadata, }; Stream rawStream = await blockBlob.OpenWriteAsync(true, options).ConfigureAwait(false); IBlobCommitedAction committedAction = new BlobCommittedAction(blob, blobWrittenWatcher); return(await Task.FromResult(new NotifyingBlobStream(rawStream, committedAction)).ConfigureAwait(false)); }
public async Task BlobTrigger_IfHasUnboundParameter_CanCall() { // Arrange var client = account.CreateBlobServiceClient(); var container = client.GetBlobContainerClient(ContainerName); const string inputBlobName = "note-monday.csv"; var inputBlob = container.GetBlockBlobClient(inputBlobName); await container.CreateIfNotExistsAsync(); await inputBlob.UploadTextAsync("abc"); IDictionary <string, object> arguments = new Dictionary <string, object> { { "values", ContainerName + "/" + inputBlobName }, { "unbound", "test" } }; // Act await CallAsync(account, typeof(BlobProgram), "UnboundParameter", arguments); var outputBlob = container.GetBlockBlobClient("note.csv"); string content = await outputBlob.DownloadTextAsync(); Assert.Equal("done", content); // $$$ Put this in its own unit test? Guid?guid = BlobCausalityManager.GetWriterAsync(outputBlob, CancellationToken.None).GetAwaiter().GetResult(); Assert.True(guid != Guid.Empty, "Blob is missing causality information"); }
public void SetWriter_IfNullObject_Throws() { // Arrange Guid g = Guid.NewGuid(); // Act & Assert ExceptionAssert.ThrowsArgumentNull(() => BlobCausalityManager.SetWriter(null, g), "metadata"); }
public void GetWriter_IfFetchFails_ReturnsNull() { // Arrange Mock <BlobBaseClient> blobMock = SetupBlobMock(isFetchSuccess: false); // Act Guid?writer = BlobCausalityManager.GetWriterAsync(blobMock.Object, CancellationToken.None).GetAwaiter().GetResult(); // Assert Assert.Null(writer); blobMock.Verify(); }
public void SetWriter_IfValidGuid_AddsWriter() { // Arrange IDictionary <string, string> metadata = new Dictionary <string, string>(); Guid g = Guid.NewGuid(); // Act BlobCausalityManager.SetWriter(metadata, g); // Assert AssertWriterEqual(g, metadata); }
public void GetWriter_IfMetadataDoesNotHaveWriterProperty_ReturnsNull() { // Arrange Mock <ICloudBlob> blobMock = SetupBlobMock(isFetchSuccess: true); // Act Guid?writer = BlobCausalityManager.GetWriterAsync(blobMock.Object, CancellationToken.None).GetAwaiter().GetResult(); // Assert Assert.Null(writer); blobMock.Verify(); }
public void GetWriter_IfMetadataPropertyIsGuid_ReturnsThatGuid() { // Arrange Guid expected = Guid.NewGuid(); Mock <ICloudBlob> blobMock = SetupBlobMock(isFetchSuccess: true); blobMock.Object.Metadata[BlobMetadataKeys.ParentId] = expected.ToString(); // Act Guid?writer = BlobCausalityManager.GetWriterAsync(blobMock.Object, CancellationToken.None).GetAwaiter().GetResult(); // Assert Assert.Equal(expected, writer); blobMock.Verify(); }
public void GetWriter_IfMetadataPropertyIsNotGuid_ReturnsNull() { // Arrange Mock <BlobBaseClient> blobMock = SetupBlobMock( isFetchSuccess: true, new Dictionary <string, string>() { { BlobMetadataKeys.ParentId, "abc" } }); // Act Guid?writer = BlobCausalityManager.GetWriterAsync(blobMock.Object, CancellationToken.None).GetAwaiter().GetResult(); // Assert Assert.Null(writer); blobMock.Verify(); }
public static async Task <WatchableCloudBlobStream> BindStreamAsync(IStorageBlob blob, ValueBindingContext context, IBlobWrittenWatcher blobWrittenWatcher) { IStorageBlockBlob blockBlob = blob as IStorageBlockBlob; if (blockBlob == null) { throw new InvalidOperationException("Cannot bind a page blob using an out string."); } BlobCausalityManager.SetWriter(blob.Metadata, context.FunctionInstanceId); CloudBlobStream rawStream = await blockBlob.OpenWriteAsync(context.CancellationToken); IBlobCommitedAction committedAction = new BlobCommittedAction(blob, blobWrittenWatcher); return(new WatchableCloudBlobStream(rawStream, committedAction)); }
public static async Task <WatchableCloudBlobStream> BindStreamAsync(ICloudBlob blob, ValueBindingContext context, IBlobWrittenWatcher blobWrittenWatcher) { var blockBlob = blob as CloudBlockBlob; if (blockBlob == null) { throw new InvalidOperationException("Cannot bind to page or append blobs using 'out string', 'TextWriter', or writable 'Stream' parameters."); } BlobCausalityManager.SetWriter(blob.Metadata, context.FunctionInstanceId); CloudBlobStream rawStream = await blockBlob.OpenWriteAsync(context.CancellationToken); IBlobCommitedAction committedAction = new BlobCommittedAction(blob, blobWrittenWatcher); return(new WatchableCloudBlobStream(rawStream, committedAction)); }
public void GetWriter_IfMetadataPropertyIsGuid_ReturnsThatGuid() { // Arrange Guid expected = Guid.NewGuid(); Mock <BlobBaseClient> blobMock = SetupBlobMock( isFetchSuccess: true, new Dictionary <string, string>() { { BlobMetadataKeys.ParentId, expected.ToString() } }); // Act Guid?writer = BlobCausalityManager.GetWriterAsync(blobMock.Object, CancellationToken.None).GetAwaiter().GetResult(); // Assert Assert.AreEqual(expected, writer); blobMock.Verify(); }