public SendUnitTestResultResponse SendUnitTestResult( Guid accountId, SendUnitTestResultRequestData data) { var request = GetRequest <SendUnitTestResultRequest>(accountId); request.Data = data; var dispatcher = DispatcherHelper.GetDispatcherService(); return(dispatcher.SendUnitTestResult(request)); }
public void WrongUnitTestIdTest() { var account = TestHelper.GetTestAccount(); var dispatcher = TestHelper.GetDispatcherClient(); var data = new SendUnitTestResultRequestData() { UnitTestId = new Guid("00000000-1111-2222-3333-444444444444"), Message = "Test", Result = UnitTestResult.Success }; var response = dispatcher.SendUnitTestResult(account.Id, data); Assert.False(response.Success); }
protected override SendUnitTestResultRequestData GetResult( Guid accountId, AccountDbContext accountDbContext, UnitTest unitTest, ILogger logger, CancellationToken token) { var rule = unitTest.SslCertificateExpirationDateRule; var uri = new Uri(unitTest.SslCertificateExpirationDateRule.Url); if (uri.Scheme != "https") { rule.LastRunErrorCode = SslCertificateExpirationDateErrorCode.Success; return(new SendUnitTestResultRequestData() { Message = "Url должен начинаться с https://", Result = UnitTestResult.Alarm }); } DateTime date; try { date = GetPaymentDate(uri); } catch (WebException exception) { rule.LastRunErrorCode = SslCertificateExpirationDateErrorCode.Success; return(new SendUnitTestResultRequestData() { Result = UnitTestResult.Alarm, Message = exception.Message }); } var days = (date.Date - DateTime.Now.Date).TotalDays; rule.LastRunErrorCode = SslCertificateExpirationDateErrorCode.Success; var result = new SendUnitTestResultRequestData() { Message = string.Format( "Осталось {0} дней до окончания срока действия сертификата. Срок действия {1}", days, date.ToString("dd.MM.yyyy")) }; if (days <= rule.AlarmDaysCount) { result.Result = UnitTestResult.Alarm; } else if (days <= rule.WarningDaysCount) { result.Result = UnitTestResult.Warning; } else { result.Result = UnitTestResult.Success; } return(result); }
protected SendUnitTestResultRequestData CheckForBanner( Guid accountId, AccountDbContext accountDbContext, UnitTest unitTest, ILogger logger) { logger.Debug("Поиск баннера Zidium для проверки " + unitTest.DisplayName); SendUnitTestResultRequestData result = null; // Из всех правил получим главные уникальные страницы сайтов var urls = unitTest.HttpRequestUnitTest.Rules.Select(t => { var uri = new Uri(t.Url); return(uri.Scheme + @"://" + uri.Authority); }).Distinct().ToArray(); // Проверим, что на каждой главной странице есть баннер var hasBanner = true; string noBannerUrl = null; foreach (var url in urls) { logger.Debug("Поиск баннера Zidium на странице " + url); try { var hasPageBanner = BannerHelper.FindBanner(url); logger.Debug("Результат: " + hasPageBanner + ", страница: " + url); // Если баннер не найден и нет интернета, то отложим проверку if (hasPageBanner == false && IsInternetWork() == false) { logger.Debug("Интернет не работает, поиск баннера отложен"); return(null); } if (hasPageBanner == false) { noBannerUrl = url; hasBanner = false; break; } } catch (Exception exception) { logger.Warn("Ошибка проверки баннера " + url + ": " + exception.Message); noBannerUrl = url; hasBanner = false; break; } } // Отправляем результат диспетчеру // Признак баннера будет обновлён, если лимит превышен, вернётся false var dispatcher = GetDispatcherClient(); var response = dispatcher.SendHttpUnitTestBanner(accountId, unitTest.Id, hasBanner); if (!response.Success) { logger.Error("Не удалось проверить лимит http-проверок без баннера: " + response.ErrorMessage); return(null); } // Если лимит превышен, то проверка уже отключена диспетчером, осталось поменять результат if (response.Data.CanProcessUnitTest == false) { result = new SendUnitTestResultRequestData() { Result = UnitTestResult.Alarm, Message = "Проверка отключена, не найден баннер Zidium на странице " + noBannerUrl }; logger.Warn(result.Message); } else { if (!hasBanner) { logger.Debug("Баннер Zidium не найден, но проверка включена, так как не превышен лимит бесплатных проверок"); } else { logger.Info("Баннер Zidium подтверждён для проверки " + unitTest.DisplayName); } } accountDbContext.SaveChanges(); return(result); }
protected override SendUnitTestResultRequestData GetResult( Guid accountId, AccountDbContext accountDbContext, UnitTest unitTest, ILogger logger, CancellationToken token) { var rules = unitTest.HttpRequestUnitTest.Rules .Where(x => x.IsDeleted == false) .OrderBy(x => x.SortNumber) .ToList(); logger.Debug("Найдено правил " + rules.Count); if (rules.Count > 0) { // Проверим наличие баннера, если это нужно if (unitTest.HttpRequestUnitTest.LastBannerCheck == null || unitTest.HttpRequestUnitTest.LastBannerCheck.Value <= DateTime.Now.AddHours(-24)) { var bannerResultData = CheckForBanner(accountId, accountDbContext, unitTest, logger); if (bannerResultData != null) { return(bannerResultData); } } var resultData = new SendUnitTestResultRequestData(); resultData.Properties = new List <ExtentionPropertyDto>(); HttpRequestUnitTestRule errorRule = null; foreach (var rule in rules) { token.ThrowIfCancellationRequested(); var ruleResult = ProcessRule(rule, logger); if (ruleResult.ErrorCode == HttpRequestErrorCode.UnknownError) { // если произошла неизвестная ошибка, то не обновляем статус проверки logger.Debug("Выход из-за неизвестной ошибки"); return(null); } if (ruleResult.ErrorCode == HttpRequestErrorCode.InternetNotWork) { // Если интернет не работает, то не обновляем статус проверки logger.Debug("Выход из-за InternetNotWork"); return(null); } // обновим правило rule.LastRunErrorCode = ruleResult.ErrorCode; rule.LastRunTime = ruleResult.StartDate; rule.LastRunDurationMs = (int)(ruleResult.EndDate - ruleResult.StartDate).TotalMilliseconds; rule.LastRunErrorMessage = ruleResult.ErrorMessage; // сохраним информацию об ошибке if (errorRule == null && ruleResult.ErrorCode != HttpRequestErrorCode.Success) { errorRule = rule; resultData.Properties.AddValue("Rule", rule.DisplayName); resultData.Properties.AddValue("ErrorMessage", rule.LastRunErrorMessage); resultData.Properties.AddValue("ErrorCode", rule.LastRunErrorCode.ToString()); resultData.Properties.AddValue("RequestMethod", rule.Method.ToString()); resultData.Properties.AddValue("TimeoutMs", (rule.TimeoutSeconds ?? 0) * 1000); var duration = (int)((ruleResult.EndDate - ruleResult.StartDate).TotalMilliseconds); resultData.Properties.AddValue("ExecutionTimeMs", duration); if (ruleResult.Request != null) { resultData.Properties.AddValue("RequestUrl", ruleResult.Request.RequestUri.AbsoluteUri); } if (ruleResult.ResponseHeaders != null) { resultData.Properties.AddValue("ResponseHeaders", ruleResult.ResponseHeaders); } if (ruleResult.ResponseHtml != null) { resultData.Properties.AddValue("ResponseHtml", ruleResult.ResponseHtml); } if (unitTest.HttpRequestUnitTest.ProcessAllRulesOnError == false) { break; // прекращаем выполнять правила, если хотя бы в одном ошибка } } } if (errorRule != null) { resultData.Result = UnitTestResult.Alarm; var errorMessage = errorRule.DisplayName + ". " + errorRule.LastRunErrorMessage; resultData.Message = errorMessage; } else { resultData.Result = UnitTestResult.Success; resultData.Message = "Успешно"; } // сохраним изменения статусов правил accountDbContext.SaveChanges(); return(resultData); } return(new SendUnitTestResultRequestData() { Result = UnitTestResult.Unknown, Message = "Укажите хотя бы один запрос (правило) для проверки" }); }