public FunctionsScaleManagerTests()
        {
            _monitors       = new List <IScaleMonitor>();
            _loggerProvider = new TestLoggerProvider();
            ILoggerFactory loggerFactory = new LoggerFactory();

            loggerFactory.AddProvider(_loggerProvider);
            _testLogger = loggerFactory.CreateLogger("Test");

            _monitorManagerMock = new Mock <IScaleMonitorManager>(MockBehavior.Strict);
            _monitorManagerMock.Setup(p => p.GetMonitors()).Returns(() => _monitors);
            _metricsRepositoryMock = new Mock <IScaleMetricsRepository>(MockBehavior.Strict);

            _scaleManager = new FunctionsScaleManager(_monitorManagerMock.Object, _metricsRepositoryMock.Object, loggerFactory);
        }
        public void GetAggregateScaleVote_ReturnsExpectedResult(int workerCount, int numScaleOutVotes, int numScaleInVotes, ScaleVote expected)
        {
            var context = new ScaleStatusContext
            {
                WorkerCount = workerCount
            };
            List <ScaleVote> votes = new List <ScaleVote>();

            for (int i = 0; i < numScaleOutVotes; i++)
            {
                votes.Add(ScaleVote.ScaleOut);
            }
            for (int i = 0; i < numScaleInVotes; i++)
            {
                votes.Add(ScaleVote.ScaleIn);
            }
            var vote = FunctionsScaleManager.GetAggregateScaleVote(votes, context, _testLogger);

            Assert.Equal(expected, vote);
        }
        public async Task <IActionResult> GetScaleStatus([FromBody] ScaleStatusContext context, [FromServices] FunctionsScaleManager scaleManager)
        {
            // if runtime scale isn't enabled return error
            if (!_environment.IsRuntimeScaleMonitoringEnabled())
            {
                return(BadRequest("Runtime scale monitoring is not enabled."));
            }

            var scaleStatus = await scaleManager.GetScaleStatusAsync(context);

            return(new ObjectResult(scaleStatus));
        }