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

            var account   = new FakeStorageAccount();
            var client    = account.CreateBlobClient();
            var container = client.GetContainerReference(HostContainerNames.Hosts);

            container.CreateIfNotExists();

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

            var blob = GetBlockBlobReference(client, hostId, storageAccountName, containerName);

            blob.UploadText(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));
        }
Esempio n. 2
0
        public async Task StaticInit()
        {
            IStorageAccount account = new FakeStorageAccount();
            var             config  = TestHelpers.NewConfig(account);

            // Can do the static init. Get the binders.
            var ctx      = config.CreateStaticServices();
            var provider = ctx.GetService <IBindingProvider>();

            var attr    = new BlobAttribute("container/path", FileAccess.Read);
            var result1 = await ScriptHelpers.CanBindAsync(provider, attr, typeof(TextReader));

            var result2 = await ScriptHelpers.CanBindAsync(provider, attr, typeof(TextWriter));

            Assert.True(result1);
            Assert.False(result2);

            // Can now set type locator and types, do indexing, and run.
            // Important that we're able to set this *after* we've queried the binding graph.
            config.TypeLocator = new FakeTypeLocator(typeof(ProgramSimple));

            var expected = "123";

            using (var jobHost = new JobHost(config))
            {
                var method = typeof(ProgramSimple).GetMethod("Test");
                jobHost.Call(method, new { value = expected });
                Assert.Equal(expected, ProgramSimple._value);
            }
        }
Esempio n. 3
0
        public async Task Blob_IfBoundToCloudBlockBlob_BindsAndCreatesContainerButNotBlob()
        {
            // Act
            var account = new FakeStorageAccount();

            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());
        }
Esempio n. 4
0
        public async Task Trigger_CanBeInstanceMethod()
        {
            // Arrange
            string            expectedGuid    = Guid.NewGuid().ToString();
            CloudQueueMessage expectedMessage = new CloudQueueMessage(expectedGuid);
            var account = new FakeStorageAccount();
            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);
        }
Esempio n. 5
0
        // Helper for quickly testing indexing errors
        public static void AssertIndexingError <TProgram>(string methodName, string expectedErrorMessage)
        {
            // Need to pass an account to get passed initial validation checks.
            IStorageAccount account = new FakeStorageAccount();
            var             host    = TestHelpers.NewJobHost <TProgram>(account);

            host.AssertIndexingError(methodName, expectedErrorMessage);
        }
Esempio n. 6
0
        private static async Task <StorageAccount> CreateFakeStorageAccountAsync()
        {
            var account = new FakeStorageAccount();

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

            return(account);
        }
Esempio n. 7
0
        public void Table_SingleOut_Supported()
        {
            IStorageAccount account = new FakeStorageAccount();
            var             host    = TestHelpers.NewJobHost <BindToSingleOutProgram>(account);

            host.Call("Run");

            AssertStringProperty(account, "Property", "1234");
        }
Esempio n. 8
0
        private static IStorageAccount CreateFakeStorageAccount()
        {
            var account = new FakeStorageAccount();

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

            return(account);
        }
Esempio n. 9
0
        public void Table_ResolvedName()
        {
            IStorageAccount account = new FakeStorageAccount();
            var             host    = TestHelpers.NewJobHost <BindToICollectorITableEntityResolvedTableProgram>(account);

            host.Call("Run", new { t1 = "ZZ" });

            AssertStringProperty(account, "Property", "123", "TaZZ");
            AssertStringProperty(account, "Property", "456", "ZZxZZ");
        }
Esempio n. 10
0
        private static async Task<TResult> CallQueueTriggerAsync<TResult>(object message, Type programType,
            Action<TaskCompletionSource<TResult>> setTaskSource)
        {
            var account = new FakeStorageAccount();
            var method = programType.GetMethod("Run");
            Assert.NotNull(method);

            var result = await FunctionalTest.CallAsync<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 FakeStorageAccount();
            var client  = account.CreateBlobClient();

            // 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);
        }
Esempio n. 12
0
        public async Task LoadLatestScan_NoBlob_ReturnsNull()
        {
            string hostId             = Guid.NewGuid().ToString();
            string storageAccountName = Guid.NewGuid().ToString();
            string containerName      = Guid.NewGuid().ToString();

            var account   = new FakeStorageAccount();
            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);
        }
Esempio n. 13
0
        public async Task Stop_TriggersCancellationToken()
        {
            StorageAccount account = new FakeStorageAccount();
            CloudQueue     queue   = await CreateQueueAsync(account, QueueName);

            CloudQueueMessage message = new CloudQueueMessage("ignore");
            await queue.AddMessageAsync(message);

            var host = new HostBuilder()
                       .ConfigureDefaultTestHost <CallbackCancellationTokenProgram>(c =>
            {
                c.AddAzureStorage();
                c.Services.AddSingleton <StorageAccountProvider>(_ => new FakeStorageAccountProvider(account));
            })
                       .Build();

            using (host)
            {
                int secondsToWait = 5;

                // Start and wait for the function to be invoked.
                await host.StartAsync();

                bool completed = _functionStarted.Task.WaitUntilCompleted(secondsToWait * 1000);
                Assert.True(completed, $"Function did not start in {secondsToWait} seconds.");

                // Stop the host and let the function know it can continue.
                Task stopTask = host.StopAsync();
                _stopHostCalled.TrySetResult(null);

                completed = _testTaskSource.Task.WaitUntilCompleted(secondsToWait * 1000);
                Assert.True(completed, $"Host did not shut down in {secondsToWait} seconds.");

                // Give a nicer test failure message for faulted tasks.
                if (_testTaskSource.Task.Status == TaskStatus.Faulted)
                {
                    await _testTaskSource.Task;
                }

                Assert.Equal(TaskStatus.RanToCompletion, _testTaskSource.Task.Status);

                stopTask.WaitUntilCompleted(3 * 1000);
                Assert.Equal(TaskStatus.RanToCompletion, stopTask.Status);
            }
        }
Esempio n. 14
0
        public async Task Trigger_IfClassIsDisposable_Disposes()
        {
            // Arrange
            CloudQueueMessage expectedMessage = new CloudQueueMessage("ignore");
            var account = new FakeStorageAccount();
            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);
        }
Esempio n. 15
0
        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 FakeStorageAccount();
            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);
        }
Esempio n. 16
0
        public void FlushAfterAdd_PersistsEntity()
        {
            // Arrange
            var account = new FakeStorageAccount();
            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);
        }
Esempio n. 17
0
        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 FakeStorageAccount();
            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);
        }
Esempio n. 18
0
        public async Task UpdateLatestScan_Inserts()
        {
            string hostId             = Guid.NewGuid().ToString();
            string storageAccountName = Guid.NewGuid().ToString();
            string containerName      = Guid.NewGuid().ToString();

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

            DateTime now = DateTime.UtcNow;

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