コード例 #1
0
        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);
        }
コード例 #2
0
        public void Constructor_InitializesWithDefaults()
        {
            var opts = new ThreadDumpOptions();

            Assert.True(opts.Enabled);
            Assert.True(opts.Sensitive);
            Assert.Equal("dump", opts.Id);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        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"));
        }
コード例 #6
0
        /// <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));
        }
コード例 #7
0
        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));
        }
コード例 #8
0
        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);
        }