public void GetCounters_ReturnsExpectedResult()
        {
            var    mockEnvironment = new Mock <IEnvironment>(MockBehavior.Strict);
            string value           = string.Empty;
            var    logger          = new TestLogger("Test");

            mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.AzureWebsiteAppCountersName)).Returns(() => value);
            var options            = new HostHealthMonitorOptions();
            var performanceManager = new HostPerformanceManager(mockEnvironment.Object, new OptionsWrapper <HostHealthMonitorOptions>(options));

            value = "{\"userTime\": 30000000,\"kernelTime\": 16562500,\"pageFaults\": 131522,\"processes\": 1,\"processLimit\": 32,\"threads\": 32,\"threadLimit\": 512,\"connections\": 4,\"connectionLimit\": 300,\"activeConnections\": 25,\"activeConnectionLimit\": 600,\"sections\": 3,\"sectionLimit\": 256,\"namedPipes\": 0,\"namedPipeLimit\": 128,\"remoteDirMonitors\": 5,\"remoteDirMonitorLimit\": 500,\"readIoOperations\": 675,\"writeIoOperations\": 18,\"otherIoOperations\": 9721,\"readIoBytes\": 72585119,\"writeIoBytes\": 5446,\"otherIoBytes\": 393926,\"privateBytes\": 33759232,\"handles\": 987,\"contextSwitches\": 15535,\"remoteOpens\": 250}";
            var counters = performanceManager.GetPerformanceCounters(logger);

            Assert.Equal(counters.PageFaults, 131522);

            // verify garbage characters are trimmed
            value    = value + "猅";
            counters = performanceManager.GetPerformanceCounters(logger);
            Assert.Equal(counters.PageFaults, 131522);

            value    = "{}";
            counters = performanceManager.GetPerformanceCounters(logger);
            Assert.Equal(counters.PageFaults, 0);

            value    = "this is not json";
            counters = performanceManager.GetPerformanceCounters(logger);
            Assert.Null(counters);
            var error = logger.GetLogMessages().Last();

            Assert.Equal("Failed to deserialize application performance counters. JSON Content: \"this is not json\"", error.FormattedMessage);
        }
Example #2
0
        public HttpThrottleMiddlewareTests()
        {
            _functionDescriptor = new FunctionDescriptor("Test", null, null, new Collection <ParameterDescriptor>(), null, null, null);
            _scriptHost         = new Mock <IScriptJobHost>(MockBehavior.Strict);
            _metricsLogger      = new Mock <IMetricsLogger>(MockBehavior.Strict);
            _metricsLogger.Setup(p => p.LogEvent(MetricEventNames.FunctionInvokeThrottled, null, null)).Callback(() =>
            {
                Interlocked.Increment(ref _throttleMetricCount);
            });
            var environment          = SystemEnvironment.Instance;
            var mockServiceProvider  = new Mock <IServiceProvider>(MockBehavior.Strict);
            var healthMonitorOptions = new HostHealthMonitorOptions();

            _performanceManager = new Mock <HostPerformanceManager>(MockBehavior.Strict, environment, new OptionsWrapper <HostHealthMonitorOptions>(healthMonitorOptions), mockServiceProvider.Object);
            _httpOptions        = new HttpOptions();
            _loggerFactory      = new LoggerFactory();
            _loggerProvider     = new TestLoggerProvider();
            _loggerFactory.AddProvider(_loggerProvider);
            RequestDelegate next = (ctxt) =>
            {
                ctxt.Response.StatusCode = (int)HttpStatusCode.Accepted;
                return(Task.CompletedTask);
            };

            _middleware   = new HttpThrottleMiddleware(next, _loggerFactory, TimeSpan.FromSeconds(1));
            _requestQueue = new HttpRequestQueue(new OptionsWrapper <HttpOptions>(_httpOptions));
        }
        public void HostHealthMonitorOptions_FormatsCorrectly()
        {
            var options = new HostHealthMonitorOptions();
            var result  = JObject.Parse(options.Format()).ToString(Formatting.None);

            Assert.Equal("{\"Enabled\":true,\"HealthCheckInterval\":\"00:00:10\",\"HealthCheckWindow\":\"00:02:00\",\"CounterThreshold\":0.8}", result);
        }
        public HostControllerTests()
        {
            _scriptPath = Path.GetTempPath();
            var applicationHostOptions = new ScriptApplicationHostOptions();

            applicationHostOptions.ScriptPath = _scriptPath;
            var optionsWrapper = new OptionsWrapper <ScriptApplicationHostOptions>(applicationHostOptions);
            var loggerProvider = new TestLoggerProvider();
            var loggerFactory  = new LoggerFactory();

            loggerFactory.AddProvider(loggerProvider);
            _mockEnvironment = new Mock <IEnvironment>(MockBehavior.Strict);
            _mockEnvironment.Setup(p => p.GetEnvironmentVariable(It.IsAny <string>())).Returns <string>(null);
            _mockScriptHostManager = new Mock <IScriptHostManager>(MockBehavior.Strict);
            _mockScriptHostManager.SetupGet(p => p.State).Returns(ScriptHostState.Running);
            _functionsSyncManager   = new Mock <IFunctionsSyncManager>(MockBehavior.Strict);
            _extensionBundleManager = new Mock <IExtensionBundleManager>(MockBehavior.Strict);

            var mockServiceProvider = new Mock <IServiceProvider>(MockBehavior.Strict);

            _hostHealthMonitorOptions = new HostHealthMonitorOptions();
            var wrappedHealthMonitorOptions = new OptionsWrapper <HostHealthMonitorOptions>(_hostHealthMonitorOptions);

            _mockHostPerformanceManager = new Mock <HostPerformanceManager>(_mockEnvironment.Object, wrappedHealthMonitorOptions, mockServiceProvider.Object, null);
            _hostController             = new HostController(optionsWrapper, loggerFactory, _mockEnvironment.Object, _mockScriptHostManager.Object, _functionsSyncManager.Object, _mockHostPerformanceManager.Object);

            _appOfflineFilePath = Path.Combine(_scriptPath, ScriptConstants.AppOfflineFileName);
            if (File.Exists(_appOfflineFilePath))
            {
                File.Delete(_appOfflineFilePath);
            }
        }
        public WebJobsScriptHostServiceTests()
        {
            // configure the monitor so it will fail within a couple seconds
            _healthMonitorOptions = new HostHealthMonitorOptions
            {
                HealthCheckInterval  = TimeSpan.FromMilliseconds(100),
                HealthCheckWindow    = TimeSpan.FromSeconds(1),
                HealthCheckThreshold = 5
            };
            var wrappedHealthMonitorOptions = new OptionsWrapper <HostHealthMonitorOptions>(_healthMonitorOptions);

            _mockApplicationLifetime = new Mock <IApplicationLifetime>(MockBehavior.Loose);
            _mockApplicationLifetime.Setup(p => p.StopApplication())
            .Callback(() =>
            {
                _shutdownCalled = true;
            });

            _mockEnvironment = new Mock <IEnvironment>();
            var mockServiceProvider = new Mock <IServiceProvider>(MockBehavior.Strict);

            _mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.AzureWebsiteInstanceId)).Returns("testapp");
            _mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.AzureWebsiteHostName)).Returns("testapp");

            var mockHostPerformanceManager = new Mock <HostPerformanceManager>(_mockEnvironment.Object, wrappedHealthMonitorOptions, mockServiceProvider.Object, null);

            mockHostPerformanceManager.Setup(p => p.PerformanceCountersExceeded(It.IsAny <Collection <string> >(), It.IsAny <ILogger>()))
            .Callback <Collection <string>, ILogger>((c, l) =>
            {
                if (_countersExceeded)
                {
                    foreach (var counter in _exceededCounters)
                    {
                        c.Add(counter);
                    }
                }
            })
            .Returns(() => _countersExceeded);

            _testHost = new TestFunctionHost(TestScriptPath, TestLogPath,
                                             configureWebHostServices: services =>
            {
                services.AddSingleton <IOptions <HostHealthMonitorOptions> >(wrappedHealthMonitorOptions);
                services.AddSingleton <IApplicationLifetime>(_mockApplicationLifetime.Object);
                services.AddSingleton <IEnvironment>(_mockEnvironment.Object);
                services.AddSingleton <HostPerformanceManager>(mockHostPerformanceManager.Object);

                services.AddSingleton <IConfigureBuilder <IWebJobsBuilder> >(new DelegatedConfigureBuilder <IWebJobsBuilder>(b =>
                {
                    b.UseHostId("1234");
                    b.Services.Configure <ScriptJobHostOptions>(o => o.Functions = new[] { "ManualTrigger", "Scenarios" });
                }));
            },
                                             configureScriptHostWebJobsBuilder: builder =>
            {
                builder.AddExtension <TestWebHookExtension>();
            });

            _scriptHostService = _testHost.JobHostServices.GetService <IScriptHostManager>() as WebJobsScriptHostService;
        }
Example #6
0
        public WebJobsScriptHostServiceTests()
        {
            string testScriptPath = @"TestScripts\CSharp";
            string testLogPath    = Path.Combine(TestHelpers.FunctionsTestDirectory, "Logs", Guid.NewGuid().ToString(), @"Functions");

            // configure the monitor so it will fail within a couple seconds
            _healthMonitorOptions = new HostHealthMonitorOptions
            {
                HealthCheckInterval  = TimeSpan.FromMilliseconds(100),
                HealthCheckWindow    = TimeSpan.FromSeconds(1),
                HealthCheckThreshold = 5
            };
            var wrappedHealthMonitorOptions = new OptionsWrapper <HostHealthMonitorOptions>(_healthMonitorOptions);

            _mockJobHostEnvironment = new Mock <IScriptJobHostEnvironment>(MockBehavior.Strict);
            _mockJobHostEnvironment.Setup(p => p.Shutdown())
            .Callback(() =>
            {
                _shutdownCalled = true;
            });

            var mockEnvironment = new Mock <IEnvironment>();

            mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.AzureWebsiteInstanceId)).Returns("testapp");

            var mockHostPerformanceManager = new Mock <HostPerformanceManager>(mockEnvironment.Object, wrappedHealthMonitorOptions);

            mockHostPerformanceManager.Setup(p => p.IsUnderHighLoad(It.IsAny <Collection <string> >(), It.IsAny <ILogger>()))
            .Callback <Collection <string>, ILogger>((c, l) =>
            {
                if (_underHighLoad)
                {
                    foreach (var counter in _exceededCounters)
                    {
                        c.Add(counter);
                    }
                }
            })
            .Returns(() => _underHighLoad);

            _testHost = new TestFunctionHost(testScriptPath, testLogPath,
                                             configureWebHostServices: services =>
            {
                services.AddSingleton <IOptions <HostHealthMonitorOptions> >(wrappedHealthMonitorOptions);
                services.AddSingleton <IScriptJobHostEnvironment>(_mockJobHostEnvironment.Object);
                services.AddSingleton <IEnvironment>(mockEnvironment.Object);
                services.AddSingleton <HostPerformanceManager>(mockHostPerformanceManager.Object);

                services.AddSingleton <IConfigureBuilder <IWebJobsBuilder> >(new DelegatedConfigureBuilder <IWebJobsBuilder>(b =>
                {
                    b.UseHostId("1234");
                    b.Services.Configure <ScriptJobHostOptions>(o => o.Functions = new[] { "ManualTrigger", "Scenarios" });
                }));
            });

            _scriptHostService = _testHost.JobHostServices.GetService <IScriptHostManager>() as WebJobsScriptHostService;
        }
Example #7
0
        public HostPerformanceManagerTests()
        {
            var mockEnvironment = new Mock <IEnvironment>(MockBehavior.Strict);

            _performanceCountersValue = string.Empty;
            _logger = new TestLogger("Test");
            mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.AzureWebsiteSku)).Returns(ScriptConstants.DynamicSku);
            mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.RoleInstanceId)).Returns((string)null);
            mockEnvironment.Setup(p => p.GetEnvironmentVariable(EnvironmentSettingNames.AzureWebsiteAppCountersName)).Returns(() => _performanceCountersValue);
            var options = new HostHealthMonitorOptions();

            _serviceProviderMock = new Mock <IServiceProvider>(MockBehavior.Strict);
            _performanceManager  = new HostPerformanceManager(mockEnvironment.Object, new OptionsWrapper <HostHealthMonitorOptions>(options), _serviceProviderMock.Object);
        }