예제 #1
0
        public SendUnitTestResultResponse SendUnitTestResult(
            Guid accountId,
            SendUnitTestResultRequestData data)
        {
            var request = GetRequest <SendUnitTestResultRequest>(accountId);

            request.Data = data;
            var dispatcher = DispatcherHelper.GetDispatcherService();

            return(dispatcher.SendUnitTestResult(request));
        }
예제 #2
0
        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);
        }
예제 #3
0
        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 = "Укажите хотя бы один запрос (правило) для проверки"
            });
        }