public void Contstructor_BindsConfigurationCorrectly() { var appsettings = new Dictionary <string, string>() { ["management:endpoints:enabled"] = "false", ["management:endpoints:sensitive"] = "false", ["management:endpoints:path"] = "/cloudfoundryapplication", ["management:endpoints:loggers:enabled"] = "false", ["management:endpoints:loggers:sensitive"] = "true", ["management:endpoints:dump:enabled"] = "true", ["management:endpoints:dump:sensitive"] = "true", ["management:endpoints:cloudfoundry:validatecertificates"] = "true", ["management:endpoints:cloudfoundry:enabled"] = "true" }; ConfigurationBuilder configurationBuilder = new ConfigurationBuilder(); configurationBuilder.AddInMemoryCollection(appsettings); var config = configurationBuilder.Build(); var opts = new ThreadDumpOptions(config); CloudFoundryOptions cloudOpts = new CloudFoundryOptions(config); Assert.True(cloudOpts.Enabled); Assert.False(cloudOpts.Sensitive); Assert.Equal(string.Empty, cloudOpts.Id); Assert.Equal("/cloudfoundryapplication", cloudOpts.Path); Assert.True(cloudOpts.ValidateCertificates); Assert.True(opts.Enabled); Assert.True(opts.Sensitive); Assert.Equal("dump", opts.Id); Assert.Equal("/cloudfoundryapplication/dump", opts.Path); }
public void Constructor_InitializesWithDefaults() { var opts = new ThreadDumpOptions(); Assert.True(opts.Enabled); Assert.True(opts.Sensitive); Assert.Equal("dump", opts.Id); }
public void UseThreadDumpActuator_ThrowsIfDumperNull() { IAppBuilder builder = new AppBuilder(); var config = new ConfigurationBuilder().Build(); var options = new ThreadDumpOptions(config); var exception = Assert.Throws <ArgumentNullException>(() => builder.UseThreadDumpActuator(options, null)); Assert.Equal("threadDumper", exception.ParamName); }
public static void UseThreadDumpActuator(IConfiguration configuration, IThreadDumper threadDumper = null, ILoggerFactory loggerFactory = null) { var options = new ThreadDumpOptions(configuration); threadDumper = threadDumper ?? new ThreadDumper(options); var ep = new ThreadDumpEndpoint(options, threadDumper, CreateLogger <ThreadDumpEndpoint>(loggerFactory)); var handler = new ThreadDumpHandler(ep, SecurityService, CreateLogger <ThreadDumpHandler>(loggerFactory)); ConfiguredHandlers.Add(handler); }
public void ThreadDumpEndpointMiddleware_PathAndVerbMatching_ReturnsExpected() { var opts = new ThreadDumpOptions(); ThreadDumper obs = new ThreadDumper(opts); var ep = new ThreadDumpEndpoint(opts, obs); var middle = new ThreadDumpEndpointMiddleware(null, ep); Assert.True(middle.RequestVerbAndPathMatch("GET", "/dump")); Assert.False(middle.RequestVerbAndPathMatch("PUT", "/dump")); Assert.False(middle.RequestVerbAndPathMatch("GET", "/badpath")); }
/// <summary> /// Add Thread Dump actuator endpoint to OWIN Pipeline /// </summary> /// <param name="builder">OWIN <see cref="IAppBuilder" /></param> /// <param name="config"><see cref="IConfiguration"/> of application for configuring thread dump endpoint</param> /// <param name="loggerFactory">For logging within the middleware</param> /// <returns>OWIN <see cref="IAppBuilder" /> with Thread Dump Endpoint added</returns> public static IAppBuilder UseThreadDumpActuator(this IAppBuilder builder, IConfiguration config, ILoggerFactory loggerFactory = null) { if (builder == null) { throw new ArgumentNullException(nameof(builder)); } if (config == null) { throw new ArgumentNullException(nameof(config)); } var options = new ThreadDumpOptions(config); var threadDumper = new ThreadDumper(options, loggerFactory?.CreateLogger <ThreadDumper>()); return(builder.UseThreadDumpActuator(options, threadDumper, loggerFactory)); }
public void IsDumpRequest_ReturnsExpected() { var opts = new ThreadDumpOptions(); ThreadDumper obs = new ThreadDumper(opts); var ep = new ThreadDumpEndpoint(opts, obs); var middle = new ThreadDumpEndpointMiddleware(null, ep); var context = CreateRequest("GET", "/dump"); Assert.True(middle.IsThreadDumpRequest(context)); var context2 = CreateRequest("PUT", "/dump"); Assert.False(middle.IsThreadDumpRequest(context2)); var context3 = CreateRequest("GET", "/badpath"); Assert.False(middle.IsThreadDumpRequest(context3)); }
public async void HandleThreadDumpRequestAsync_ReturnsExpected() { if (Environment.OSVersion.Platform == PlatformID.Win32NT) { var opts = new ThreadDumpOptions(); ThreadDumper obs = new ThreadDumper(opts); var ep = new ThreadDumpEndpoint(opts, obs); var middle = new ThreadDumpEndpointMiddleware(null, ep); var context = CreateRequest("GET", "/dump"); await middle.HandleThreadDumpRequestAsync(context); context.Response.Body.Seek(0, SeekOrigin.Begin); StreamReader rdr = new StreamReader(context.Response.Body); string json = await rdr.ReadToEndAsync(); Assert.StartsWith("[", json); Assert.EndsWith("]", json); } }
public async void ThreadDumpInvoke_ReturnsExpected() { // arrange var opts = new ThreadDumpOptions(); var middle = new EndpointOwinMiddleware <List <ThreadInfo> >(null, new ThreadDumpEndpoint(opts, new ThreadDumper(opts))); var context = OwinTestHelpers.CreateRequest("GET", "/dump"); // act var json = await middle.InvokeAndReadResponse(context); // assert (that it looks kinda like what we expect... ?) Assert.StartsWith("[", json); Assert.Contains("blockedCount", json); Assert.Contains("blockedTime", json); Assert.Contains("lockedMonitors", json); Assert.Contains("lockedSynchronizers", json); Assert.Contains("lockInfo", json); Assert.Contains("stackTrace", json); Assert.EndsWith("]", json); }