예제 #1
0
        public async Task AddWorkerIfNeeded_Returns_Expected(WorkerConcurrencyOptions options,
                                                             int[] latencies1, int[] latencies2, bool readyForInvocations1, bool readyForInvocations2,
                                                             TimeSpan elapsedFromLastAdding, bool expected)
        {
            Mock <IFunctionInvocationDispatcher>        functionInvocationDispatcher        = new Mock <IFunctionInvocationDispatcher>(MockBehavior.Strict);
            Mock <IFunctionInvocationDispatcherFactory> functionInvocationDispatcherFactory = new Mock <IFunctionInvocationDispatcherFactory>(MockBehavior.Strict);

            functionInvocationDispatcherFactory.Setup(x => x.GetFunctionDispatcher()).Returns(functionInvocationDispatcher.Object);

            Dictionary <string, WorkerStatus> workerStatuses = new Dictionary <string, WorkerStatus>();

            workerStatuses.Add("test1", new WorkerStatus()
            {
                IsReady        = readyForInvocations1,
                LatencyHistory = latencies1.Select(x => TimeSpan.FromMilliseconds(x))
            });
            workerStatuses.Add("test2", new WorkerStatus()
            {
                IsReady        = readyForInvocations2,
                LatencyHistory = latencies2.Select(x => TimeSpan.FromMilliseconds(x))
            });

            WorkerConcurrencyManager concurrancyManager = new WorkerConcurrencyManager(functionInvocationDispatcherFactory.Object, _testEnvironment, Options.Create(options),
                                                                                       _functionsHostingConfigurations, _applicationLifetime, _loggerFactory);
            await concurrancyManager.StartAsync(CancellationToken.None);

            bool value = concurrancyManager.NewWorkerIsRequired(workerStatuses, elapsedFromLastAdding);

            Assert.Equal(value, expected);
        }
예제 #2
0
        public async Task IsOverloaded_Returns_Expected(WorkerConcurrencyOptions options, int[] latencies, bool expected)
        {
            Mock <IFunctionInvocationDispatcher>        functionInvocationDispatcher        = new Mock <IFunctionInvocationDispatcher>(MockBehavior.Strict);
            Mock <IFunctionInvocationDispatcherFactory> functionInvocationDispatcherFactory = new Mock <IFunctionInvocationDispatcherFactory>(MockBehavior.Strict);

            functionInvocationDispatcherFactory.Setup(x => x.GetFunctionDispatcher()).Returns(functionInvocationDispatcher.Object);
            WorkerConcurrencyManager concurrancyManger = new WorkerConcurrencyManager(functionInvocationDispatcherFactory.Object, _testEnvironment, Options.Create(options),
                                                                                      _functionsHostingConfigurations, _applicationLifetime, _loggerFactory);
            await concurrancyManger.StartAsync(CancellationToken.None);

            WorkerStatus status = new WorkerStatus()
            {
                LatencyHistory = latencies.Select(x => TimeSpan.FromMilliseconds(x))
            };

            Assert.Equal(concurrancyManger.IsOverloaded(status), expected);
        }
예제 #3
0
        public async Task Start_StartsTimer_WhenDynamicConcurrencyEnabled()
        {
            WorkerConcurrencyOptions options = new WorkerConcurrencyOptions()
            {
                AdjustmentPeriod = TimeSpan.Zero
            };

            Mock <IFunctionInvocationDispatcher>        functionInvocationDispatcher        = new Mock <IFunctionInvocationDispatcher>(MockBehavior.Strict);
            Mock <IFunctionInvocationDispatcherFactory> functionInvocationDispatcherFactory = new Mock <IFunctionInvocationDispatcherFactory>(MockBehavior.Strict);

            functionInvocationDispatcherFactory.Setup(x => x.GetFunctionDispatcher()).Returns(functionInvocationDispatcher.Object);
            WorkerConcurrencyManager concurrancyManger = new WorkerConcurrencyManager(functionInvocationDispatcherFactory.Object, _testEnvironment, Options.Create(options),
                                                                                      _functionsHostingConfigurations, _applicationLifetime, _loggerFactory);
            await concurrancyManger.StartAsync(CancellationToken.None);

            await TestHelpers.Await(() =>
            {
                var sratedLog = _loggerProvider.GetAllLogMessages().FirstOrDefault(x => x.FormattedMessage.StartsWith("Starting dynamic worker concurrency monitoring."));
                return(sratedLog != null);
            }, pollingInterval : 1000, timeout : 10 * 1000);
        }
예제 #4
0
        public async Task ActivateWorkerConcurency_FunctionsHostingConfiguration_WorkAsExpected()
        {
            TestEnvironment testEnvironment = new TestEnvironment();

            testEnvironment.SetEnvironmentVariable(EnvironmentSettingNames.FunctionWorkerRuntime, RpcWorkerConstants.NodeLanguageWorkerName);
            Mock <IFunctionInvocationDispatcher>        functionInvocationDispatcher        = new Mock <IFunctionInvocationDispatcher>(MockBehavior.Strict);
            Mock <IFunctionInvocationDispatcherFactory> functionInvocationDispatcherFactory = new Mock <IFunctionInvocationDispatcherFactory>(MockBehavior.Strict);

            functionInvocationDispatcherFactory.Setup(x => x.GetFunctionDispatcher()).Returns(functionInvocationDispatcher.Object);
            Mock <IFunctionsHostingConfiguration> conf = new Mock <IFunctionsHostingConfiguration>();

            conf.Setup(x => x.FunctionsWorkerDynamicConcurrencyEnabled).Returns(true);
            WorkerConcurrencyOptions options = new WorkerConcurrencyOptions();

            WorkerConcurrencyManager concurrancyManager = new WorkerConcurrencyManager(functionInvocationDispatcherFactory.Object, testEnvironment, Options.Create(options), conf.Object, _applicationLifetime, _loggerFactory);

            concurrancyManager.ActivationTimerInterval = TimeSpan.FromMilliseconds(100);
            await concurrancyManager.StartAsync(CancellationToken.None);

            await TestHelpers.Await(() => _loggerProvider.GetAllLogMessages().SingleOrDefault(x => x.FormattedMessage.StartsWith("Dynamic worker concurrency monitoring was started by activation timer.")) != null, timeout : 1000, pollingInterval : 100);

            conf.Setup(x => x.FunctionsWorkerDynamicConcurrencyEnabled).Returns(false);
            await TestHelpers.Await(() => _loggerProvider.GetAllLogMessages().SingleOrDefault(x => x.FormattedMessage.StartsWith("Dynamic worker concurrency monitoring is disabled after activation. Shutting down Functions Host.")) != null, timeout : 1000, pollingInterval : 100);
        }