コード例 #1
0
        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));
        }
コード例 #2
0
        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");
        }
コード例 #3
0
        public void SetWriter_IfNullObject_Throws()
        {
            // Arrange
            Guid g = Guid.NewGuid();

            // Act & Assert
            ExceptionAssert.ThrowsArgumentNull(() => BlobCausalityManager.SetWriter(null, g), "metadata");
        }
コード例 #4
0
        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();
        }
コード例 #5
0
        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);
        }
コード例 #6
0
        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();
        }
コード例 #7
0
        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();
        }
コード例 #8
0
        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();
        }
コード例 #9
0
        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));
        }
コード例 #10
0
        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));
        }
コード例 #11
0
        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();
        }