1
0
mirror of https://github.com/bia-technologies/yaxunit.git synced 2025-01-08 13:06:32 +02:00

#314 Асинхронная обработка зависимостей

This commit is contained in:
alkoleft 2024-04-02 03:38:26 +03:00
parent c0174e340d
commit 4d184b1a7e
7 changed files with 449 additions and 238 deletions

View File

@ -18,102 +18,6 @@
#Область СлужебныйПрограммныйИнтерфейс
// Разрешить зависимости.
//
// Параметры:
// ТестовыйМодуль - см. ЮТФабрикаСлужебный.ОписаниеИсполняемогоТестовогоМодуля
Процедура РазрешитьЗависимости(ТестовыйМодуль) Экспорт
РезультатРазрешенияЗависимостей = РазрешитьЗависимостиОбъекта(ТестовыйМодуль);
Статусы = ЮТФабрика.СтатусыИсполненияТеста();
Если НЕ РезультатРазрешенияЗависимостей.Успешно Тогда
УстановитьОшибкиВ(ТестовыйМодуль.НаборыТестов, РезультатРазрешенияЗависимостей.Ошибка);
Возврат;
КонецЕсли;
Для Каждого Набор Из ТестовыйМодуль.НаборыТестов Цикл
РезультатРазрешенияЗависимостей = РазрешитьЗависимостиОбъекта(Набор);
Если НЕ РезультатРазрешенияЗависимостей.Успешно Тогда
УстановитьОшибкиВ(Набор.Тесты, РезультатРазрешенияЗависимостей.Ошибка);
Набор.Ошибки.Добавить(РезультатРазрешенияЗависимостей.Ошибка);
Набор.Выполнять = Ложь;
Продолжить;
КонецЕсли;
Для Каждого Тест Из Набор.Тесты Цикл
РезультатРазрешенияЗависимостей = РазрешитьЗависимостиОбъекта(Тест);
Если НЕ РезультатРазрешенияЗависимостей.Успешно Тогда
Тест.Ошибки.Добавить(РезультатРазрешенияЗависимостей.Ошибка);
Тест.Статус = Статусы.Пропущен;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
// Дедупликация зависимостей.
//
// Параметры:
// РезультатЧтенияТестов - Массив из см. ЮТФабрикаСлужебный.ОписаниеТестовогоМодуля - Набор описаний тестовых модулей, которые содержат информацию о запускаемых тестах
Процедура ДедупликацияЗависимостей(РезультатЧтенияТестов) Экспорт
Зависимости = Новый Соответствие();
Для Каждого ТестовыйМодуль Из РезультатЧтенияТестов Цикл
ДедупликацияЗависимостейОбъекта(Зависимости, ТестовыйМодуль);
Для Каждого ТестовыйНабор Из ТестовыйМодуль.НаборыТестов Цикл
ДедупликацияЗависимостейОбъекта(Зависимости, ТестовыйНабор);
Для Каждого Тест Из ТестовыйНабор.Тесты Цикл
ДедупликацияЗависимостейОбъекта(Зависимости, Тест);
КонецЦикла;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Процедура СохранитьРезультатРазрешенияЗависимости(КлючЗависимости, Результат) Экспорт
КонтекстРазрешенныеЗависимости = ЮТКонтекстСлужебный.ЗначениеКонтекста(ИмяКонтекстаРазрешенныеЗависимости());
КонтекстРазрешенныеЗависимости.Вставить(КлючЗависимости, Результат);
ПередаваемыеЗначения = Новый Соответствие();
ИмяКонтекстаДанныеЗависимостей = ИмяКонтекстаДанныеЗависимостей();
Если Результат.СохраняемыйКонтекст <> Неопределено Тогда
ПередаваемыеЗначения.Вставить(КлючЗависимости, Результат.СохраняемыйКонтекстСервер);
ЮТКонтекстСлужебный.ВставитьЗначениеКонтекста(ИмяКонтекстаДанныеЗависимостей, ПередаваемыеЗначения);
ЮТКонтекстСлужебный.ВставитьЗначениеКонтекста(ИмяКонтекстаДанныеЗависимостей, ПередаваемыеЗначения, Истина);
КонецЕсли;
Если Результат.СохраняемыйКонтекстСервер <> Неопределено Тогда
ПередаваемыеЗначения.Вставить(КлючЗависимости, Результат.СохраняемыйКонтекстСервер);
ЮТКонтекстСлужебный.ВставитьЗначениеКонтекста(ИмяКонтекстаДанныеЗависимостей, ПередаваемыеЗначения, Истина);
КонецЕсли;
Если Результат.СохраняемыйКонтекстКлиент <> Неопределено Тогда
ПередаваемыеЗначения.Вставить(КлючЗависимости, Результат.СохраняемыйКонтекстКлиент);
ЮТКонтекстСлужебный.ВставитьЗначениеКонтекста(ИмяКонтекстаДанныеЗависимостей, ПередаваемыеЗначения);
КонецЕсли;
КонецПроцедуры
Функция ДанныеЗависимости(ОписаниеЗависимости) Экспорт
КлючЗависимости = КлючЗависимости(ОписаниеЗависимости);
@ -151,66 +55,7 @@
#Область СлужебныеПроцедурыИФункции
Функция РазрешитьЗависимостиОбъекта(Объект)
Для Каждого Зависимость Из Объект.Зависимости Цикл
Результат = РазрешитьЗависимость(Зависимость);
Если НЕ Результат.Успешно Тогда
Возврат Результат;
КонецЕсли;
КонецЦикла;
Возврат Новый Структура("Успешно, Ошибка", Истина);
КонецФункции
Функция РазрешитьЗависимость(ОписаниеЗависимости)
Сообщение = СтрШаблон("Не удалось разрешить зависимость `%1`", ПредставлениеЗависимости(ОписаниеЗависимости));
РезультатРазрешения = РезультатРазрешенияЗависимости(ОписаниеЗависимости.Ключ);
Если РезультатРазрешения <> Неопределено Тогда
Возврат РезультатРазрешения;
КонецЕсли;
Попытка
РезультатРазрешения = ЮТМетодыСлужебный.ВызватьФункцию(ОписаниеЗависимости.МетодРеализации, ОписаниеЗависимости.Параметры);
Исключение
РезультатРазрешения = ЮТФабрикаСлужебный.РезультатРазрешенияЗависимости();
РезультатРазрешения.Ошибка = ОписаниеОшибкиПропуска(Сообщение, ИнформацияОбОшибке());
СохранитьРезультатРазрешенияЗависимости(ОписаниеЗависимости.Ключ, РезультатРазрешения);
Возврат РезультатРазрешения;
КонецПопытки;
Если НЕ РезультатРазрешения.Успешно Тогда
Если РезультатРазрешения.Ошибка = Неопределено Тогда
РезультатРазрешения.Ошибка = ОписаниеОшибкиПропуска(Сообщение);
Иначе
РезультатРазрешения.Ошибка = ОписаниеОшибкиПропуска(Сообщение, РезультатРазрешения.Ошибка);
КонецЕсли;
КонецЕсли;
СохранитьРезультатРазрешенияЗависимости(ОписаниеЗависимости.Ключ, РезультатРазрешения);
Возврат РезультатРазрешения;
КонецФункции
Процедура ДедупликацияЗависимостейОбъекта(Зависимости, Объект)
Для Инд = 0 По Объект.Зависимости.ВГраница() Цикл
Объект.Зависимости[Инд] = УникальнаяЗависимость(Зависимости, Объект.Зависимости[Инд]);
КонецЦикла;
КонецПроцедуры
Функция КлючЗависимости(ОписаниеЗависимости)
Функция КлючЗависимости(ОписаниеЗависимости) Экспорт
Идентификатор = ВРег(ОписаниеЗависимости.Идентификатор);
@ -222,6 +67,16 @@
КонецФункции
Функция ПредставлениеЗависимости(ОписаниеЗависимости) Экспорт
Если ЗначениеЗаполнено(ОписаниеЗависимости.Параметры) Тогда
Возврат ОписаниеЗависимости.Идентификатор + ЮТКоллекции.ПредставлениеМассива(ОписаниеЗависимости.Параметры);
Иначе
Возврат ОписаниеЗависимости.Идентификатор;
КонецЕсли;
КонецФункции
Функция УникальнаяЗависимость(Зависимости, ОписаниеЗависимости) Экспорт
КлючЗависимости = КлючЗависимости(ОписаниеЗависимости);
@ -244,53 +99,9 @@
КонецФункции
Функция ПредставлениеЗависимости(ОписаниеЗависимости)
Если ЗначениеЗаполнено(ОписаниеЗависимости.Параметры) Тогда
Возврат ОписаниеЗависимости.Идентификатор + ЮТКоллекции.ПредставлениеМассива(ОписаниеЗависимости.Параметры);
Иначе
Возврат ОписаниеЗависимости.Идентификатор;
КонецЕсли;
КонецФункции
Функция ОписаниеОшибкиПропуска(Описание, ИнформацияОбОшибке = Неопределено)
Ошибка = ЮТФабрикаСлужебный.ОписаниеОшибкиПропуска(Описание);
Если ИнформацияОбОшибке = Неопределено Тогда
Возврат Ошибка;
КонецЕсли;
ТипОшибки = ТипЗнч(ИнформацияОбОшибке);
Если ТипОшибки = Тип("Структура") Тогда
ЗаполнитьЗначенияСвойств(Ошибка, ИнформацияОбОшибке, , "ТипОшибки, Сообщение");
Ошибка.Сообщение = ЮТСтроки.ДобавитьСтроку(Описание, ИнформацияОбОшибке.Сообщение, Символы.ПС);
ИначеЕсли ТипОшибки = Тип("ИнформацияОбОшибке") Тогда
Ошибка.Стек = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке);
ИначеЕсли ТипОшибки = Тип("Строка") Тогда
Ошибка.Сообщение = ЮТСтроки.ДобавитьСтроку(Описание, ИнформацияОбОшибке, Символы.ПС);
КонецЕсли;
Возврат Ошибка;
КонецФункции
Функция УстановитьОшибкиВ(Объекты, Ошибка)
Для Каждого Объект Из Объекты Цикл
Объект.Ошибки.Добавить(Ошибка);
Объект.Выполнять = Ложь;
КонецЦикла;
Возврат Ошибка;
КонецФункции
Функция РезультатРазрешенияЗависимости(КлючЗависимости)
ДанныеКонтекста = ЮТКонтекстСлужебный.ЗначениеКонтекста(ИмяКонтекстаРазрешенныеЗависимости());
ДанныеКонтекста = КонтекстРазрешенныеЗависимости();
Возврат ДанныеКонтекста[КлючЗависимости];
КонецФункции
@ -311,13 +122,19 @@
КонецПроцедуры
Функция ИмяКонтекстаРазрешенныеЗависимости()
Функция КонтекстРазрешенныеЗависимости() Экспорт
Возврат ЮТКонтекстСлужебный.ЗначениеКонтекста(ИмяКонтекстаРазрешенныеЗависимости());
КонецФункции
Функция ИмяКонтекстаРазрешенныеЗависимости() Экспорт
Возврат "КонтекстРазрешенныеЗависимости";
КонецФункции
Функция ИмяКонтекстаДанныеЗависимостей()
Функция ИмяКонтекстаДанныеЗависимостей() Экспорт
Возврат "КонтекстДанныеЗависимостей";

View File

@ -0,0 +1,320 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2024 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
#Область СлужебныйПрограммныйИнтерфейс
// Разрешить зависимости.
//
// Параметры:
// ТестовыеМодули - Массив из см. ЮТФабрикаСлужебный.ОписаниеИсполняемогоТестовогоМодуля
// Обработчик - ОписаниеОповещения
Процедура РазрешитьЗависимости(ТестовыеМодули, Обработчик) Экспорт
Зависимости = СобратьЗависимости(ТестовыеМодули);
Если НЕ ЗначениеЗаполнено(Зависимости) Тогда
ЮТЛогирование.Отладка("Обработка зависимостей: нет зависимостей");
ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьОбработчик(Обработчик);
Возврат;
КонецЕсли;
ПараметрыИсполнения = ЮТАсинхроннаяОбработкаСлужебныйКлиент.ЦепочкаАсинхроннойОбработки();
ПараметрыИсполнения.Вставить("ТестовыеМодули", ТестовыеМодули);
Для Каждого ОписаниеЗависимости Из Зависимости Цикл
Параметры = Новый Структура("ОписаниеЗависимости, ПараметрыИсполнения", ОписаниеЗависимости, ПараметрыИсполнения);
Если ОписаниеЗависимости.Асинхронный Тогда
Загрузчик = Новый ОписаниеОповещения("РазрешитьЗависимостьАсинхронно", ЭтотОбъект, Параметры);
Иначе
Загрузчик = Новый ОписаниеОповещения("РазрешитьЗависимость", ЭтотОбъект, Параметры);
КонецЕсли;
ПараметрыИсполнения.Цепочка.Добавить(Загрузчик);
КонецЦикла;
ПараметрыИсполнения.Цепочка.Добавить(Новый ОписаниеОповещения("ПослеОбработкиЗависимостей", ЭтотОбъект, ПараметрыИсполнения));
ПараметрыИсполнения.Цепочка.Добавить(Обработчик);
ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьСледующийОбработчик(ПараметрыИсполнения);
КонецПроцедуры
// Дедупликация зависимостей.
//
// Параметры:
// РезультатЧтенияТестов - Массив из см. ЮТФабрикаСлужебный.ОписаниеТестовогоМодуля - Набор описаний тестовых модулей, которые содержат информацию о запускаемых тестах
Процедура ДедупликацияЗависимостей(РезультатЧтенияТестов) Экспорт
Зависимости = Новый Соответствие();
Для Каждого ТестовыйМодуль Из РезультатЧтенияТестов Цикл
ДедупликацияЗависимостейОбъекта(Зависимости, ТестовыйМодуль);
Для Каждого ТестовыйНабор Из ТестовыйМодуль.НаборыТестов Цикл
ДедупликацияЗависимостейОбъекта(Зависимости, ТестовыйНабор);
Для Каждого Тест Из ТестовыйНабор.Тесты Цикл
ДедупликацияЗависимостейОбъекта(Зависимости, Тест);
КонецЦикла;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#Область РазрешениеЗависимостей
Функция СобратьЗависимости(ТестовыеМодули)
Зависимости = Новый Массив();
ДобавленныеЗависимости = Новый Соответствие();
Для Каждого ТестовыйМодуль Из ТестовыеМодули Цикл
СобратьЗависимостиОбъекта(ТестовыйМодуль, Зависимости, ДобавленныеЗависимости);
Для Каждого Набор Из ТестовыйМодуль.НаборыТестов Цикл
СобратьЗависимостиОбъекта(Набор, Зависимости, ДобавленныеЗависимости);
Для Каждого Тест Из Набор.Тесты Цикл
СобратьЗависимостиОбъекта(Тест, Зависимости, ДобавленныеЗависимости);
КонецЦикла;
КонецЦикла;
КонецЦикла;
Возврат Зависимости;
КонецФункции
Процедура СобратьЗависимостиОбъекта(Объект, Зависимости, ДобавленныеЗависимости)
Для Каждого Зависимость Из Объект.Зависимости Цикл
Если ДобавленныеЗависимости[Зависимость.Ключ] = Неопределено Тогда
Зависимости.Добавить(Зависимость);
ДобавленныеЗависимости.Вставить(Зависимость.Ключ, Истина);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура РазрешитьЗависимостьАсинхронно(Результат, Параметры) Экспорт
ОписаниеЗависимости = Параметры.ОписаниеЗависимости;
ЮТЛогирование.Отладка("Обработка зависимостей: асинхронная обработка зависимости " + ЮТЗависимостиСлужебный.ПредставлениеЗависимости(ОписаниеЗависимости));
Обработчик = Новый ОписаниеОповещения("ОбработатьРезультатРазрешенияЗависимости", ЭтотОбъект, Параметры);
ИмяМетода = ОписаниеЗависимости.МетодРеализации;
ПараметрыМетода = ЮТКоллекции.СкопироватьМассив(ОписаниеЗависимости.Параметры);
ПараметрыМетода.Добавить(Обработчик);
Ошибка = ЮТМетодыСлужебный.ВыполнитьМетод(ИмяМетода, ПараметрыМетода);
Если Ошибка <> Неопределено Тогда
РезультатРазрешения = ЮТФабрикаСлужебный.РезультатРазрешенияЗависимости();
РезультатРазрешения.Ошибка = Ошибка;
ОбработатьРезультатРазрешенияЗависимости(РезультатРазрешения, Параметры);
КонецЕсли;
КонецПроцедуры
Процедура ОбработатьРезультатРазрешенияЗависимости(Результат, Параметры) Экспорт
ОписаниеЗависимости = Параметры.ОписаниеЗависимости;
ПредставлениеЗависимости = ЮТЗависимостиСлужебный.ПредставлениеЗависимости(ОписаниеЗависимости);
ЮТЛогирование.Отладка("Обработка зависимостей: заврешена обработка зависимости " + ПредставлениеЗависимости);
ПараметрыИсполнения = Параметры.ПараметрыИсполнения;
Если НЕ Результат.Успешно Тогда
Сообщение = СтрШаблон("Не удалось разрешить зависимость `%1`", ПредставлениеЗависимости);
Результат.Ошибка = ОписаниеОшибкиПропуска(Сообщение, Результат.Ошибка);
ЮТЛогирование.Ошибка(Результат.Ошибка.Сообщение);
КонецЕсли;
СохранитьРезультатРазрешенияЗависимости(ОписаниеЗависимости.Ключ, Результат);
ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьСледующийОбработчик(ПараметрыИсполнения);
КонецПроцедуры
Процедура РазрешитьЗависимость(Результат, Параметры) Экспорт
ОписаниеЗависимости = Параметры.ОписаниеЗависимости;
Попытка
РезультатРазрешения = ЮТМетодыСлужебный.ВызватьФункцию(ОписаниеЗависимости.МетодРеализации, ОписаниеЗависимости.Параметры);
Исключение
РезультатРазрешения = ЮТФабрикаСлужебный.РезультатРазрешенияЗависимости();
РезультатРазрешения.Ошибка = ИнформацияОбОшибке();
КонецПопытки;
ОбработатьРезультатРазрешенияЗависимости(РезультатРазрешения, Параметры);
КонецПроцедуры
Процедура СохранитьРезультатРазрешенияЗависимости(КлючЗависимости, Результат) Экспорт
ИмяКонтекстаДанныеЗависимостей = ЮТЗависимостиСлужебный.ИмяКонтекстаДанныеЗависимостей();
КонтекстРазрешенныеЗависимости = ЮТЗависимостиСлужебный.КонтекстРазрешенныеЗависимости();
КонтекстРазрешенныеЗависимости.Вставить(КлючЗависимости, Результат);
ПередаваемыеЗначения = Новый Соответствие();
Если Результат.СохраняемыйКонтекст <> Неопределено Тогда
ПередаваемыеЗначения.Вставить(КлючЗависимости, Результат.СохраняемыйКонтекстСервер);
ЮТКонтекстСлужебный.ВставитьЗначениеКонтекста(ИмяКонтекстаДанныеЗависимостей, ПередаваемыеЗначения);
ЮТКонтекстСлужебный.ВставитьЗначениеКонтекста(ИмяКонтекстаДанныеЗависимостей, ПередаваемыеЗначения, Истина);
КонецЕсли;
Если Результат.СохраняемыйКонтекстСервер <> Неопределено Тогда
ПередаваемыеЗначения.Вставить(КлючЗависимости, Результат.СохраняемыйКонтекстСервер);
ЮТКонтекстСлужебный.ВставитьЗначениеКонтекста(ИмяКонтекстаДанныеЗависимостей, ПередаваемыеЗначения, Истина);
КонецЕсли;
Если Результат.СохраняемыйКонтекстКлиент <> Неопределено Тогда
ПередаваемыеЗначения.Вставить(КлючЗависимости, Результат.СохраняемыйКонтекстКлиент);
ЮТКонтекстСлужебный.ВставитьЗначениеКонтекста(ИмяКонтекстаДанныеЗависимостей, ПередаваемыеЗначения);
КонецЕсли;
КонецПроцедуры
Процедура ПослеОбработкиЗависимостей(Результат, ПараметрыИсполнения) Экспорт
РазрешенныеЗависимости = ЮТЗависимостиСлужебный.КонтекстРазрешенныеЗависимости();
Статусы = ЮТФабрика.СтатусыИсполненияТеста();
Для Каждого ТестовыйМодуль Из ПараметрыИсполнения.ТестовыеМодули Цикл
РезультатРазрешенияЗависимостей = ПроверкаРазрешенныхЗависимостей(ТестовыйМодуль, РазрешенныеЗависимости);
Если НЕ РезультатРазрешенияЗависимостей.Успешно Тогда
УстановитьОшибкиВ(ТестовыйМодуль.НаборыТестов, РезультатРазрешенияЗависимостей.Ошибка);
Прервать;
КонецЕсли;
Для Каждого Набор Из ТестовыйМодуль.НаборыТестов Цикл
РезультатРазрешенияЗависимостей = ПроверкаРазрешенныхЗависимостей(Набор, РазрешенныеЗависимости);
Если НЕ РезультатРазрешенияЗависимостей.Успешно Тогда
УстановитьОшибкиВ(Набор.Тесты, РезультатРазрешенияЗависимостей.Ошибка);
Набор.Ошибки.Добавить(РезультатРазрешенияЗависимостей.Ошибка);
Набор.Выполнять = Ложь;
Продолжить;
КонецЕсли;
Для Каждого Тест Из Набор.Тесты Цикл
РезультатРазрешенияЗависимостей = ПроверкаРазрешенныхЗависимостей(Тест, РазрешенныеЗависимости);
Если НЕ РезультатРазрешенияЗависимостей.Успешно Тогда
Тест.Ошибки.Добавить(РезультатРазрешенияЗависимостей.Ошибка);
Тест.Статус = Статусы.Пропущен;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьСледующийОбработчик(ПараметрыИсполнения);
КонецПроцедуры
Функция ОписаниеОшибкиПропуска(Описание, ИнформацияОбОшибке = Неопределено)
Ошибка = ЮТФабрикаСлужебный.ОписаниеОшибкиПропуска(Описание);
Если ИнформацияОбОшибке = Неопределено Тогда
Возврат Ошибка;
КонецЕсли;
ТипОшибки = ТипЗнч(ИнформацияОбОшибке);
Если ТипОшибки = Тип("Структура") Тогда
ЗаполнитьЗначенияСвойств(Ошибка, ИнформацияОбОшибке, , "ТипОшибки, Сообщение");
Ошибка.Сообщение = ЮТСтроки.ДобавитьСтроку(Описание, ИнформацияОбОшибке.Сообщение, Символы.ПС);
ИначеЕсли ТипОшибки = Тип("ИнформацияОбОшибке") Тогда
Ошибка.Стек = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке);
ИначеЕсли ТипОшибки = Тип("Строка") Тогда
Ошибка.Сообщение = ЮТСтроки.ДобавитьСтроку(Описание, ИнформацияОбОшибке, Символы.ПС);
КонецЕсли;
Возврат Ошибка;
КонецФункции
Функция УстановитьОшибкиВ(Объекты, Ошибка)
Для Каждого Объект Из Объекты Цикл
Объект.Ошибки.Добавить(Ошибка);
Объект.Выполнять = Ложь;
КонецЦикла;
Возврат Ошибка;
КонецФункции
Функция ПроверкаРазрешенныхЗависимостей(Объект, РазрешенныеЗависимости)
Для Каждого ОписаниеЗависимости Из Объект.Зависимости Цикл
Результат = РазрешенныеЗависимости[ОписаниеЗависимости.Ключ];
Если Результат = Неопределено Тогда
Результат = ЮТФабрикаСлужебный.РезультатРазрешенияЗависимости();
Сообщение = СтрШаблон("Нет информации о зависимости `%1`, что-то пошло не так", ЮТЗависимостиСлужебный.ПредставлениеЗависимости(ОписаниеЗависимости));
Результат.Ошибка = ОписаниеОшибкиПропуска(Сообщение);
КонецЕсли;
Если НЕ Результат.Успешно Тогда
Возврат Результат;
КонецЕсли;
КонецЦикла;
Возврат Новый Структура("Успешно", Истина);
КонецФункции
#КонецОбласти
Процедура ДедупликацияЗависимостейОбъекта(Зависимости, Объект)
Для Инд = 0 По Объект.Зависимости.ВГраница() Цикл
Объект.Зависимости[Инд] = ЮТЗависимостиСлужебный.УникальнаяЗависимость(Зависимости, Объект.Зависимости[Инд]);
КонецЦикла;
КонецПроцедуры
#КонецОбласти

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="8742463f-e915-43d3-b7bd-aaeedff6df08">
<name>ЮТЗависимостиСлужебныйКлиент</name>
<synonym>
<key>ru</key>
<value>Зависимости служебный клиент</value>
</synonym>
<clientManagedApplication>true</clientManagedApplication>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -28,6 +28,7 @@
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикПодключитьКомпоненты");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикИнициализация");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикЗагрузитьТесты");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикРазрешитьЗависимости");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикВыполнитьТестирование");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикСохранитьОтчет");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикСохранитьКодВозврата");
@ -44,6 +45,7 @@
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикИнициализация");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикЗагрузитьТесты");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикРазрешитьЗависимости");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикВыполнитьТестирование");
ПараметрыИсполнения.Цепочка.Добавить(ОбработчикЗавершения);
@ -73,8 +75,6 @@
СерверныеНаборы = Новый Массив();
ПропущенныеНаборы = Новый Массив();
ЮТЗависимостиСлужебный.РазрешитьЗависимости(ТестовыйМодуль);
Для Каждого Набор Из ТестовыйМодуль.НаборыТестов Цикл
Если НЕ Набор.Выполнять Тогда
@ -191,6 +191,14 @@
КонецПроцедуры
Процедура ОбработчикРазрешитьЗависимости(Результат, ДополнительныеПараметры) Экспорт
Обработчик = ЮТАсинхроннаяОбработкаСлужебныйКлиент.СледующийОбработчик(ДополнительныеПараметры);
ЮТЗависимостиСлужебныйКлиент.РазрешитьЗависимости(ДополнительныеПараметры.ИсполняемыеТестовыеМодули, Обработчик);
КонецПроцедуры
Процедура ОбработчикВыполнитьТестирование(Результат, ДополнительныеПараметры) Экспорт
ЮТСобытияСлужебный.ПередВыполнениемТестов(ДополнительныеПараметры.ИсполняемыеТестовыеМодули);

View File

@ -18,36 +18,24 @@
#Область СлужебныйПрограммныйИнтерфейс
Функция ФайлыПроекта(ПутьКФайламПроекта) Экспорт
Процедура ФайлыПроекта(ПутьКФайлуПроекта, Обработчик) Экспорт
Результат = ЮТФабрикаСлужебный.РезультатРазрешенияЗависимости();
ПолныйПуть = ПутьКФайламПроекта(ПутьКФайлуПроекта);
ПолныйПуть = ПутьКФайламПроекта(ПутьКФайламПроекта);
ПараметрыИсполнения = ЮТАсинхроннаяОбработкаСлужебныйКлиент.ЦепочкаАсинхроннойОбработки();
ПараметрыИсполнения.Вставить("ФинальныйОбработчик", Обработчик);
ПараметрыИсполнения.Вставить("ПолныйПуть", ПолныйПуть);
ПараметрыИсполнения.Вставить("ПутьКФайлуПроекта", ПутьКФайлуПроекта);
Если ЮТФайлы.ЭтоКаталог(ПолныйПуть) Тогда
Файлы = НайтиФайлы(ПолныйПуть, "*.*", Истина);
Иначе
Файлы = НайтиФайлы(ПолныйПуть);
КонецЕсли;
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикПроверкиСуществования");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикПроверкиКаталога");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикРезультатовПоиска");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикПеремещения");
ПараметрыИсполнения.Цепочка.Добавить(Обработчик);
Если НЕ ЗначениеЗаполнено(Файлы) Тогда
Результат.Ошибка = СтрШаблон("Не удалось найти файлы каталога проекта по пути `%1`", ПутьКФайламПроекта);
Возврат Результат;
КонецЕсли;
ЮТФайлы.Существует(ПолныйПуть, ЮТАсинхроннаяОбработкаСлужебныйКлиент.СледующийОбработчик(ПараметрыИсполнения));
РезультатПередачиФайлов = ОбработкаНайденныхФайлов(Файлы, ПутьКФайламПроекта);
Результат.Успешно = РезультатПередачиФайлов <> Неопределено;
Если Результат.Успешно Тогда
Результат.СохраняемыйКонтекстКлиент = Новый Структура("РабочийКаталог, ПолноеИмя", ЮТНастройкиВыполнения.КаталогПроекта(), ПолныйПуть);
Результат.СохраняемыйКонтекстСервер = РезультатПередачиФайлов;
Результат.СохраняемыйКонтекстСервер.Вставить("ПолноеИмя", ЮТФайлы.ОбъединитьПути(Результат.СохраняемыйКонтекстСервер.РабочийКаталог, ПутьКФайламПроекта));
КонецЕсли;
Возврат Результат;
КонецФункции
КонецПроцедуры
#КонецОбласти
@ -55,13 +43,36 @@
#Область ФайлыПроекта
Функция ПутьКФайламПроекта(ИмяФайла) Экспорт
Процедура ОбработчикПроверкиСуществования(Существует, Параметры) Экспорт
Возврат ЮТФайлы.ОбъединитьПути(ЮТНастройкиВыполнения.КаталогПроекта(), ИмяФайла);
Если НЕ Существует Тогда
Сообщение = СтрШаблон("Файл/каталог проекта `%1` не существует", Параметры.ПутьКФайлуПроекта);
ПрерватьОбработку(Сообщение, Параметры);
Возврат;
КонецЕсли;
КонецФункции
ЮТФайлы.ЭтоКаталог(Параметры.ПолныйПуть, ЮТАсинхроннаяОбработкаСлужебныйКлиент.СледующийОбработчик(Параметры));
КонецПроцедуры
Функция ОбработкаНайденныхФайлов(НайденныеФайлы, ПутьКФайламПроекта) Экспорт
Процедура ОбработчикПроверкиКаталога(ЭтоКаталог, Параметры) Экспорт
Обработчик = ЮТАсинхроннаяОбработкаСлужебныйКлиент.СледующийОбработчик(Параметры);
Если ЭтоКаталог Тогда
НачатьПоискФайлов(Обработчик, Параметры.ПолныйПуть, "*.*", Истина);
Иначе
НачатьПоискФайлов(Обработчик, Параметры.ПолныйПуть);
КонецЕсли;
КонецПроцедуры
Процедура ОбработчикРезультатовПоиска(НайденныеФайлы, Параметры) Экспорт
Если НЕ ЗначениеЗаполнено(НайденныеФайлы) Тогда
Сообщение = СтрШаблон("Не удалось найти файлы каталога проекта по пути `%1`", Параметры.ПутьКФайлуПроекта);
ПрерватьОбработку(Сообщение, Параметры);
Возврат;
КонецЕсли;
ФайлыДляПеремещения = Новый Массив();
@ -69,13 +80,57 @@
ФайлыДляПеремещения.Добавить(Новый ОписаниеПередаваемогоФайла(Файл.ПолноеИмя));
КонецЦикла;
ПомещенныеФайлы = Новый Массив();;
Если ПоместитьФайлы(ФайлыДляПеремещения, ПомещенныеФайлы, , Ложь) Тогда
Возврат ЮТРазрешениеЗависимостейСлужебныйВызовСервера.ПоместитьФайлыВРабочийКаталог(ПомещенныеФайлы);
Обработчик = ЮТАсинхроннаяОбработкаСлужебныйКлиент.СледующийОбработчик(Параметры);
НачатьПомещениеФайлов(Обработчик, ФайлыДляПеремещения, , Ложь);
КонецПроцедуры
Процедура ОбработчикПеремещения(ПомещенныеФайлы, Параметры) Экспорт
Если НЕ ЗначениеЗаполнено(ПомещенныеФайлы) Тогда
Сообщение = СтрШаблон("Не удалось передать на сервер файлы проекта из каталога `%1`", Параметры.ПутьКФайлуПроекта);
ПрерватьОбработку(Сообщение, Параметры);
Возврат;
КонецЕсли;
РезультатПередачиФайлов = ЮТРазрешениеЗависимостейСлужебныйВызовСервера.ПоместитьФайлыВРабочийКаталог(ПомещенныеФайлы);
Результат = ЮТФабрикаСлужебный.РезультатРазрешенияЗависимости();
Результат.Успешно = РезультатПередачиФайлов <> Неопределено;
Если Результат.Успешно Тогда
Результат.СохраняемыйКонтекстКлиент = Новый Структура("РабочийКаталог, ПолноеИмя", ЮТНастройкиВыполнения.КаталогПроекта(), Параметры.ПолныйПуть);
Результат.СохраняемыйКонтекстСервер = РезультатПередачиФайлов;
Результат.СохраняемыйКонтекстСервер.Вставить("ПолноеИмя", ЮТФайлы.ОбъединитьПути(Результат.СохраняемыйКонтекстСервер.РабочийКаталог, Параметры.ПутьКФайлуПроекта));
КонецЕсли;
ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьСледующийОбработчик(Параметры, Результат);
КонецПроцедуры
Процедура ПрерватьОбработку(Ошибка, Параметры)
Обработчик = Параметры.ФинальныйОбработчик;
Результат = ЮТФабрикаСлужебный.РезультатРазрешенияЗависимости();
Результат.Ошибка = Ошибка;
ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьОбработчик(Обработчик, Результат);
КонецПроцедуры
Функция ПутьКФайламПроекта(ИмяФайла) Экспорт
Возврат ЮТФайлы.ОбъединитьПути(ЮТНастройкиВыполнения.КаталогПроекта(), ИмяФайла);
КонецФункции
#КонецОбласти
Процедура ДобавитьОбработчикЦепочки(ПараметрыИсполнения, ИмяМетода)
Обработчик = Новый ОписаниеОповещения(ИмяМетода, ЭтотОбъект, ПараметрыИсполнения);
ПараметрыИсполнения.Цепочка.Добавить(Обработчик);
КонецПроцедуры
#КонецОбласти

View File

@ -43,7 +43,7 @@
КонецЦикла;
ЮТЗависимостиСлужебный.ДедупликацияЗависимостей(Результат);
ЮТЗависимостиСлужебныйКлиент.ДедупликацияЗависимостей(Результат);
Возврат Результат;

View File

@ -63,6 +63,7 @@
<commonModules>CommonModule.ЮТест</commonModules>
<commonModules>CommonModule.ЮТЗависимости</commonModules>
<commonModules>CommonModule.ЮТЗависимостиСлужебный</commonModules>
<commonModules>CommonModule.ЮТЗависимостиСлужебныйКлиент</commonModules>
<commonModules>CommonModule.ЮТЗапросы</commonModules>
<commonModules>CommonModule.ЮТЗапросыСлужебныйВызовСервера</commonModules>
<commonModules>CommonModule.ЮТЗапросыСлужебныйКлиентСервер</commonModules>