public async Task <TestRunResponse> StartTestRunAsync(TestCaseInfo testCase, TestRunState state)
        {
            if (_session.State == TestRunSessionState.NotStarted)
            {
                await SetSessionStateAsync(TestRunSessionState.Running);
            }
            _logger.Debug($"Start testing test case {testCase.AzureTestCaseId}, State: {state}");
            if (testCase.TestRunId == 0)
            {
                var testRunResponse = await _client.InsertTestRunAsync(
                    _session.Id,
                    new TestRunRequest()
                {
                    TestCaseId = testCase.Id,
                    StartTime  = DateTime.Now,
                    State      = state,
                });

                testCase.TestRunId = testRunResponse.Id;
                return(testRunResponse);
            }
            else
            {
                var patch = new JsonPatchDocument <TestRunRequest>();
                patch.Add(r => r.StartTime, DateTime.Now);
                patch.Add(r => r.State, state);
                return(await _client.PatchTestRunAsync(_session.Id, testCase.TestRunId, patch));
            }
        }
        private Task <TestRunResponse> SetTestRunStateAsync(TestCaseInfo testCase, TestRunState state)
        {
            var patch = new JsonPatchDocument <TestRunRequest>();

            patch.Add(r => r.State, state);
            _logger.Debug($"Updating test case state: {testCase.AzureTestCaseId} => {state}");
            return(_client.PatchTestRunAsync(_session.Id, testCase.TestRunId, patch));
        }
 public Task <TestRunResponse> AdvanceTestRunStateAsync(TestCaseInfo testCase, TestRunState state)
 {
     if (state == TestRunState.NotStarted)
     {
         throw new ArgumentException($"Test run should have already been started. State cannot be {state}.");
     }
     if (state == TestRunState.Finished)
     {
         throw new ArgumentException($"Finishing test run should be recorded with `{nameof(RecordTestRunEndAsync)}`.");
     }
     return(SetTestRunStateAsync(testCase, state));
 }
        public async Task <TestRunResponse> RecordTestRunEndAsync(TestCaseInfo testCase, TestRunOutcome outcome,
                                                                  string errorMessage, IEnumerable <string> impactFiles, IEnumerable <string> impactMethods)
        {
            var patch = new JsonPatchDocument <TestRunRequest>();

            patch.Add(r => r.State, TestRunState.Finished);
            patch.Add(r => r.Outcome, outcome);
            patch.Add(r => r.FinishTime, DateTime.Now);
            patch.Add(r => r.ErrorMessage, errorMessage);
            var runResponse = await _client.PatchTestRunAsync(_session.Id, testCase.TestRunId, patch);

            _logger.Info("Test run finished: " + ObjToString(runResponse));

            List <CodeSignature> codeSignatures = new List <CodeSignature>();

            if (impactFiles != null)
            {
                codeSignatures.AddRange(
                    impactFiles.Select(f => new CodeSignature(f, CodeSignatureUtils.CalculateSignature(f), CodeSignatureType.File)));
            }
            if (impactMethods != null)
            {
                codeSignatures.AddRange(
                    impactMethods.Select(f => new CodeSignature(f, CodeSignatureUtils.CalculateSignature(f), CodeSignatureType.Method)));
            }

            var impactRequest = new TestCaseImpactUpdateRequest()
            {
                ProductLine    = _productLine,
                CodeSignatures = codeSignatures
            };

            var impactDataCount = codeSignatures.Count;

            LogDebug("Updating test impact information. Number of files/methods (code signatures): " + impactDataCount);
            if (impactDataCount == 0)
            {
                LogDebug("(No impact data is available)");
            }

            Exception impactUpdateException = null;

            try
            {
                await _client.UpdateTestImpactAsync(testCase.Id, impactRequest);
            }
            catch (Exception ex)
            {
                impactUpdateException = ex;
                _logger.Error("Updating test case impact data failed:\r\n" + ex.ToString());
            }

            var lastStateRequest = new TestLastStateUpdateRequest()
            {
                ProductLine      = _productLine,
                TestRunSessionId = _session.Id,
                Outcome          = outcome
            };

            if (impactUpdateException != null)
            {
                lastStateRequest.DictatedRunReason = RunReason.ImpactUpdateFailed;
                _logger.Warn("Test case will be run again next time.");
            }

            LogDebug($"Updating test last state. Azure Test Case Id: {testCase.AzureTestCaseId}, Outcome: {outcome}");

            await _client.UpdateTestLastStateAsync(testCase.Id, lastStateRequest);

            return(runResponse);
        }