public async Task DisableHttpEgressTest()
        {
            await ScenarioRunner.SingleTarget(
                _outputHelper,
                _httpClientFactory,
                DiagnosticPortConnectionMode.Connect,
                TestAppScenarios.AsyncWait.Name,
                appValidate : async(appRunner, appClient) =>
            {
                int processId = await appRunner.ProcessIdTask;

                ProcessInfo processInfo = await appClient.GetProcessAsync(processId);
                Assert.NotNull(processInfo);

                // Dump Error Check
                ValidationProblemDetailsException validationProblemDetailsExceptionDumps = await Assert.ThrowsAsync <ValidationProblemDetailsException>(
                    () => appClient.CaptureDumpAsync(processId, DumpType.Mini));
                Assert.Equal(HttpStatusCode.BadRequest, validationProblemDetailsExceptionDumps.StatusCode);
                Assert.Equal(StatusCodes.Status400BadRequest, validationProblemDetailsExceptionDumps.Details.Status);
                Assert.Equal(DisabledHTTPEgressErrorMessage, validationProblemDetailsExceptionDumps.Message);

                // Logs Error Check
                ValidationProblemDetailsException validationProblemDetailsExceptionLogs = await Assert.ThrowsAsync <ValidationProblemDetailsException>(
                    () => appClient.CaptureLogsAsync(processId, CommonTestTimeouts.LogsDuration, LogLevel.None, LogFormat.NewlineDelimitedJson));
                Assert.Equal(HttpStatusCode.BadRequest, validationProblemDetailsExceptionLogs.StatusCode);
                Assert.Equal(StatusCodes.Status400BadRequest, validationProblemDetailsExceptionLogs.Details.Status);
                Assert.Equal(DisabledHTTPEgressErrorMessage, validationProblemDetailsExceptionLogs.Message);

                await appRunner.SendCommandAsync(TestAppScenarios.AsyncWait.Commands.Continue);
            },
                disableHttpEgress : true);
        }
Exemple #2
0
        /// <summary>
        /// Verifies that a process was found in the identifiers list and checks the /process?pid={processKey} route for the same process.
        /// </summary>
        private async Task VerifyProcessAsync(ApiClient client, IEnumerable <ProcessIdentifier> identifiers, int processId, string expectedEnvVarValue)
        {
            Assert.NotNull(identifiers);
            ProcessIdentifier identifier = identifiers.FirstOrDefault(p => p.Pid == processId);

            Assert.NotNull(identifier);

            ProcessInfo info = await client.GetProcessWithRetryAsync(_outputHelper, pid : identifier.Pid);

            Assert.NotNull(info);
            Assert.Equal(identifier.Pid, info.Pid);

#if NET5_0_OR_GREATER
            // Currently, the runtime instance identifier is only provided for .NET 5 and higher
            info = await client.GetProcessWithRetryAsync(_outputHelper, uid : identifier.Uid);

            Assert.NotNull(info);
            Assert.Equal(identifier.Pid, info.Pid);
            Assert.Equal(identifier.Uid, info.Uid);

            Dictionary <string, string> env = await client.GetProcessEnvironmentAsync(processId);

            Assert.NotNull(env);
            Assert.NotEmpty(env);
            Assert.True(env.TryGetValue(ExpectedEnvVarName, out string actualEnvVarValue));
            Assert.Equal(expectedEnvVarValue, actualEnvVarValue);
#else
            // .NET Core 3.1 and earlier do not support getting the environment block
            ValidationProblemDetailsException validationProblemDetailsException = await Assert.ThrowsAsync <ValidationProblemDetailsException>(
                () => client.GetProcessEnvironmentAsync(processId));

            Assert.Equal(HttpStatusCode.BadRequest, validationProblemDetailsException.StatusCode);
            Assert.Equal(StatusCodes.Status400BadRequest, validationProblemDetailsException.Details.Status);
#endif
        }
        public async Task ConcurrencyLimitTest()
        {
            await ScenarioRunner.SingleTarget(
                _outputHelper,
                _httpClientFactory,
                DiagnosticPortConnectionMode.Connect,
                TestAppScenarios.AsyncWait.Name,
                appValidate : async(appRunner, apiClient) =>
            {
                int processId = await appRunner.ProcessIdTask;

                OperationResponse response1 = await EgressTraceWithDelay(apiClient, processId);
                OperationResponse response2 = await EgressTraceWithDelay(apiClient, processId);
                OperationResponse response3 = await EgressTraceWithDelay(apiClient, processId);

                ValidationProblemDetailsException ex = await Assert.ThrowsAsync <ValidationProblemDetailsException>(() => EgressTraceWithDelay(apiClient, processId));
                Assert.Equal(HttpStatusCode.TooManyRequests, ex.StatusCode);
                Assert.Equal((int)HttpStatusCode.TooManyRequests, ex.Details.Status.GetValueOrDefault());

                await CancelEgressOperation(apiClient, response1);
                await CancelEgressOperation(apiClient, response2);

                OperationResponse response4 = await EgressTraceWithDelay(apiClient, processId, delay: false);

                await CancelEgressOperation(apiClient, response3);
                await CancelEgressOperation(apiClient, response4);

                await appRunner.SendCommandAsync(TestAppScenarios.AsyncWait.Commands.Continue);
            },
                configureTool : (toolRunner) =>
            {
                toolRunner.WriteKeyPerValueConfiguration(new RootOptions().AddFileSystemEgress(FileProviderName, _tempDirectory.FullName));
            });
        }
        public Task LogsDefaultLevelNoneNotSupportedViaBodyTest(DiagnosticPortConnectionMode mode, LogFormat logFormat)
        {
            return(ScenarioRunner.SingleTarget(
                       _outputHelper,
                       _httpClientFactory,
                       mode,
                       TestAppScenarios.Logger.Name,
                       appValidate: async(runner, client) =>
            {
                ValidationProblemDetailsException exception = await Assert.ThrowsAsync <ValidationProblemDetailsException>(
                    async() =>
                {
                    using ResponseStreamHolder _ = await client.CaptureLogsAsync(
                              await runner.ProcessIdTask,
                              CommonTestTimeouts.LogsDuration,
                              new LogsConfiguration()
                    {
                        LogLevel = LogLevel.None
                    },
                              logFormat);
                });
                Assert.Equal(HttpStatusCode.BadRequest, exception.StatusCode);
                Assert.Equal(StatusCodes.Status400BadRequest, exception.Details.Status);

                // Allow test app to gracefully exit by continuing the scenario.
                await runner.SendCommandAsync(TestAppScenarios.Logger.Commands.StartLogging);
            }));
        }
Exemple #5
0
        /// <summary>
        /// Verifies that an invalid Process request throws the correct exception (ValidationProblemDetailsException) and has the correct Status and StatusCode.
        /// </summary>
        private async Task VerifyInvalidRequestException(ApiClient client, int?pid, Guid?uid, string name)
        {
            ValidationProblemDetailsException validationProblemDetailsException = await Assert.ThrowsAsync <ValidationProblemDetailsException>(
                () => client.GetProcessAsync(pid: pid, uid: uid, name: name));

            Assert.Equal(HttpStatusCode.BadRequest, validationProblemDetailsException.StatusCode);
            Assert.Equal(StatusCodes.Status400BadRequest, validationProblemDetailsException.Details.Status);
        }
        public async Task EgressNotExistTest()
        {
            await ScenarioRunner.SingleTarget(
                _outputHelper,
                _httpClientFactory,
                DiagnosticPortConnectionMode.Connect,
                TestAppScenarios.AsyncWait.Name,
                appValidate : async(appRunner, apiClient) =>
            {
                int processId = await appRunner.ProcessIdTask;

                ValidationProblemDetailsException validationException = await Assert.ThrowsAsync <ValidationProblemDetailsException>(
                    () => apiClient.EgressTraceAsync(processId, durationSeconds: 5, FileProviderName));
                Assert.Equal(HttpStatusCode.BadRequest, validationException.StatusCode);

                await appRunner.SendCommandAsync(TestAppScenarios.AsyncWait.Commands.Continue);
            });
        }
        public async Task SharedConcurrencyLimitTest()
        {
            await ScenarioRunner.SingleTarget(
                _outputHelper,
                _httpClientFactory,
                DiagnosticPortConnectionMode.Connect,
                TestAppScenarios.AsyncWait.Name,
                appValidate : async(appRunner, apiClient) =>
            {
                int processId = await appRunner.ProcessIdTask;

                OperationResponse response1            = await EgressTraceWithDelay(apiClient, processId);
                OperationResponse response3            = await EgressTraceWithDelay(apiClient, processId);
                using HttpResponseMessage traceDirect1 = await TraceWithDelay(apiClient, processId);
                Assert.Equal(HttpStatusCode.OK, traceDirect1.StatusCode);

                ValidationProblemDetailsException ex = await Assert.ThrowsAsync <ValidationProblemDetailsException>(
                    () => EgressTraceWithDelay(apiClient, processId, delay: false));
                Assert.Equal(HttpStatusCode.TooManyRequests, ex.StatusCode);

                using HttpResponseMessage traceDirect = await TraceWithDelay(apiClient, processId, delay: false);
                Assert.Equal(HttpStatusCode.TooManyRequests, traceDirect.StatusCode);

                //Validate that the failure from a direct call (handled by middleware)
                //matches the failure produces by egress operations (handled by the Mvc ActionResult stack)
                using HttpResponseMessage egressDirect = await EgressDirect(apiClient, processId);
                Assert.Equal(HttpStatusCode.TooManyRequests, egressDirect.StatusCode);
                Assert.Equal(await egressDirect.Content.ReadAsStringAsync(), await traceDirect.Content.ReadAsStringAsync());

                await CancelEgressOperation(apiClient, response1);
                OperationResponse response4 = await EgressTraceWithDelay(apiClient, processId, delay: false);

                await CancelEgressOperation(apiClient, response3);
                await CancelEgressOperation(apiClient, response4);

                await appRunner.SendCommandAsync(TestAppScenarios.AsyncWait.Commands.Continue);
            },
                configureTool : (toolRunner) =>
            {
                toolRunner.WriteKeyPerValueConfiguration(new RootOptions().AddFileSystemEgress(FileProviderName, _tempDirectory.FullName));
            });
        }