public async Task UpdateLatestScan_Updates()
        {
            string hostId             = Guid.NewGuid().ToString();
            string storageAccountName = Guid.NewGuid().ToString();
            string containerName      = Guid.NewGuid().ToString();

            var account   = new XFakeStorageAccount();
            var client    = account.CreateCloudBlobClient();
            var container = client.GetContainerReference(HostContainerNames.Hosts);
            await container.CreateIfNotExistsAsync();

            DateTime now  = DateTime.UtcNow;
            DateTime past = now.AddMinutes(-1);

            var blob = GetBlockBlobReference(client, hostId, storageAccountName, containerName);
            await blob.UploadTextAsync(string.Format("{{ 'LatestScan' : '{0}' }}", past.ToString("o")));

            var manager = new StorageBlobScanInfoManager(hostId, client);

            await manager.UpdateLatestScanAsync(storageAccountName, containerName, now);

            var scanInfo     = GetBlockBlobReference(client, hostId, storageAccountName, containerName).DownloadText();
            var scanInfoJson = JObject.Parse(scanInfo);
            var storedTime   = (DateTime)scanInfoJson["LatestScan"];

            Assert.Equal(now, storedTime);
            Assert.Equal(now, await manager.LoadLatestScanAsync(storageAccountName, containerName));
        }
        public async Task Blob_IfBoundToCloudBlockBlob_BindsAndCreatesContainerButNotBlob()
        {
            // Act
            var account = new XFakeStorageAccount();

            var   prog = new BindToCloudBlockBlobProgram();
            IHost host = new HostBuilder()
                         .ConfigureDefaultTestHost <BindToCloudBlockBlobProgram>(prog, builder =>
            {
                builder.AddAzureStorage()
                .UseStorage(account);
            })
                         .Build();

            var jobHost = host.GetJobHost <BindToCloudBlockBlobProgram>();
            await jobHost.CallAsync(nameof(BindToCloudBlockBlobProgram.Run));

            var result = prog.Result;

            // Assert
            Assert.NotNull(result);
            Assert.Equal(BlobName, result.Name);
            Assert.NotNull(result.Container);
            Assert.Equal(ContainerName, result.Container.Name);
            CloudBlobContainer container = GetContainerReference(account, ContainerName);

            Assert.True(await container.ExistsAsync());
            CloudBlockBlob blob = container.GetBlockBlobReference(BlobName);

            Assert.False(await blob.ExistsAsync());
        }
        public async Task Trigger_CanBeInstanceMethod()
        {
            // Arrange
            string            expectedGuid    = Guid.NewGuid().ToString();
            CloudQueueMessage expectedMessage = new CloudQueueMessage(expectedGuid);
            var account = new XFakeStorageAccount();
            await account.AddQueueMessageAsync(expectedMessage, QueueName);

            var prog = new InstanceProgram();

            IHost host = new HostBuilder()
                         .ConfigureDefaultTestHost <InstanceProgram>(prog, builder =>
            {
                builder.AddAzureStorage()
                .UseStorage(account);
            })
                         .Build();

            // Act
            var jobHost = host.GetJobHost <InstanceProgram>();
            var result  = await jobHost.RunTriggerAsync <CloudQueueMessage>();

            // Assert
            Assert.Equal(expectedGuid, result.AsString);
        }
        private static StorageAccount CreateFakeStorageAccount()
        {
            var account = new XFakeStorageAccount();

            // make sure our system containers are present
            var container = CreateContainer(account, "azure-webjobs-hosts");

            return(account);
        }
        private static TResult CallQueueTrigger <TResult>(object message, Type programType,
                                                          Action <TaskCompletionSource <TResult> > setTaskSource)
        {
            var account = new XFakeStorageAccount();
            var method  = programType.GetMethod("Run");

            Assert.NotNull(method);

            var result = FunctionalTest.Call <TResult>(account, programType, method, new Dictionary <string, object>
            {
                { "message", message }
            }, setTaskSource);

            return(result);
        }
        public async Task LoadLatestScan_NoContainer_ReturnsNull()
        {
            string hostId             = Guid.NewGuid().ToString();
            string storageAccountName = Guid.NewGuid().ToString();
            string containerName      = Guid.NewGuid().ToString();

            var account = new XFakeStorageAccount();
            var client  = account.CreateCloudBlobClient();

            // by default there is no table in this client
            var manager = new StorageBlobScanInfoManager(hostId, client);

            var result = await manager.LoadLatestScanAsync(storageAccountName, containerName);

            Assert.Null(result);
        }
        public async Task LoadLatestScan_NoBlob_ReturnsNull()
        {
            string hostId             = Guid.NewGuid().ToString();
            string storageAccountName = Guid.NewGuid().ToString();
            string containerName      = Guid.NewGuid().ToString();

            var account   = new XFakeStorageAccount();
            var client    = account.CreateCloudBlobClient();
            var container = client.GetContainerReference(HostContainerNames.Hosts);
            await container.CreateIfNotExistsAsync();

            var manager = new StorageBlobScanInfoManager(hostId, client);

            var result = await manager.LoadLatestScanAsync(storageAccountName, containerName);

            Assert.Null(result);
        }
        public async Task Trigger_IfClassIsDisposable_Disposes()
        {
            // Arrange
            CloudQueueMessage expectedMessage = new CloudQueueMessage("ignore");
            var account = new XFakeStorageAccount();
            await account.AddQueueMessageAsync(expectedMessage, QueueName);

            IHost host = new HostBuilder()
                         .ConfigureDefaultTestHost <DisposeInstanceProgram>(builder =>
            {
                builder.UseStorage(account);
            })
                         .Build();

            // Act & Assert
            var jobHost = host.GetJobHost <DisposeInstanceProgram>();
            var result  = await jobHost.RunTriggerAsync <object>(DisposeInstanceProgram.TaskSource);
        }
        public async Task LoadLatestScan_Returns_Timestamp()
        {
            string hostId             = "host-" + Guid.NewGuid().ToString();
            string storageAccountName = "account=" + Guid.NewGuid().ToString();
            string containerName      = "container-" + Guid.NewGuid().ToString();

            var account   = new XFakeStorageAccount();
            var client    = account.CreateCloudBlobClient();
            var container = client.GetContainerReference(HostContainerNames.Hosts);
            await container.CreateIfNotExistsAsync();

            DateTime now  = DateTime.UtcNow;
            var      blob = GetBlockBlobReference(client, hostId, storageAccountName, containerName);
            await blob.UploadTextAsync(string.Format("{{ \"LatestScan\" : \"{0}\" }}", now.ToString("o")));

            var manager = new StorageBlobScanInfoManager(hostId, client);

            var result = await manager.LoadLatestScanAsync(storageAccountName, containerName);

            Assert.Equal(now, result);
        }
Exemple #10
0
        public void FlushAfterAdd_PersistsEntity()
        {
            // Arrange
            var account = new XFakeStorageAccount();
            var client  = account.CreateCloudTableClient();
            var table   = client.GetTableReference("Table");

            TableEntityWriter <ITableEntity> product = new TableEntityWriter <ITableEntity>(table);
            const string       partitionKey          = "PK";
            const string       rowKey = "RK";
            DynamicTableEntity entity = new DynamicTableEntity(partitionKey, rowKey);

            product.Add(entity);

            // Act
            product.FlushAsync().GetAwaiter().GetResult();

            // Assert
            DynamicTableEntity persisted = table.Retrieve <DynamicTableEntity>(partitionKey, rowKey);

            Assert.NotNull(persisted);
        }
        public async Task Trigger_IfClassConstructorHasDependencies_CanUseCustomJobActivator()
        {
            // Arrange
            const string expectedResult = "abc";

            Mock <IFactory <string> > resultFactoryMock = new Mock <IFactory <string> >(MockBehavior.Strict);

            resultFactoryMock.Setup(f => f.Create()).Returns(expectedResult);
            IFactory <string> resultFactory = resultFactoryMock.Object;

            Mock <IJobActivator> activatorMock = new Mock <IJobActivator>(MockBehavior.Strict);

            activatorMock.Setup(a => a.CreateInstance <InstanceCustomActivatorProgram>())
            .Returns(() => new InstanceCustomActivatorProgram(resultFactory));
            IJobActivator activator = activatorMock.Object;

            CloudQueueMessage message = new CloudQueueMessage("ignore");
            var account = new XFakeStorageAccount();
            await account.AddQueueMessageAsync(message, QueueName);

            IHost host = new HostBuilder()
                         .ConfigureDefaultTestHost <InstanceCustomActivatorProgram>(builder =>
            {
                builder.UseStorage(account);
            }, null, activator)
                         .Build();

            // Act
            var jobHost = host.GetJobHost <InstanceCustomActivatorProgram>();

            Assert.NotNull(jobHost);

            var result = await jobHost.RunTriggerAsync <string>(InstanceCustomActivatorProgram.TaskSource);

            // Assert
            Assert.Same(expectedResult, result);
        }