diff --git a/.gitignore b/.gitignore index 29d8318..100d358 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ exec.log bdd-log.xml +*.ospx +coverage/ diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000..ddcd33c --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,94 @@ + +pipeline { + agent none + options { + buildDiscarder(logRotator(numToKeepStr: '7')) + skipDefaultCheckout() + } + + stages { + stage('Тестирование кода пакета WIN') { + + agent { label 'windows' } + + steps { + checkout scm + + script { + if( fileExists ('tasks/test.os') ){ + bat 'chcp 65001 > nul && oscript tasks/test.os' + + junit allowEmptyResults: true, testResults: 'tests.xml' + junit allowEmptyResults: true, testResults: 'bdd-log.xml' + } + else + echo 'no testing task' + } + + } + + } + + stage('Тестирование кода пакета LINUX') { + + agent { label 'master' } + + steps { + echo 'under development' + } + + } + + stage('Сборка пакета') { + + agent { label 'windows' } + + steps { + checkout scm + + bat 'erase /Q *.ospx' + bat 'chcp 65001 > nul && call opm build .' + + stash includes: '*.ospx', name: 'package' + archiveArtifacts '*.ospx' + } + + } + + stage('Публикация в хабе') { + when { + branch 'master' + } + agent { label 'master' } + steps { + sh 'rm -f *.ospx' + unstash 'package' + + sh ''' + artifact=`ls -1 *.ospx` + basename=`echo $artifact | sed -r 's/(.+)-.*(.ospx)/\\1/'` + cp $artifact $basename.ospx + sudo rsync -rv *.ospx /var/www/hub.oscript.io/download/$basename/ + '''.stripIndent() + } + } + + stage('Публикация в нестабильном хабе') { + when { + branch 'develop' + } + agent { label 'master' } + steps { + sh 'rm -f *.ospx' + unstash 'package' + + sh ''' + artifact=`ls -1 *.ospx` + basename=`echo $artifact | sed -r 's/(.+)-.*(.ospx)/\\1/'` + cp $artifact $basename.ospx + sudo rsync -rv *.ospx /var/www/hub.oscript.io/dev-channel/$basename/ + '''.stripIndent() + } + } + } +} diff --git a/appveyor-runtests.cmd b/appveyor-runtests.cmd index 32abd89..f7dc690 100644 --- a/appveyor-runtests.cmd +++ b/appveyor-runtests.cmd @@ -9,7 +9,7 @@ set OSCRIPT=%ProgramFiles(x86)%\OneScript @echo . @rem call 1bdd features -junit-out ./bdd-log.xml -@call opm test +@call oscript tasks/test.os @if %ERRORLEVEL%==2 GOTO good_exit_bdd @if %ERRORLEVEL%==0 GOTO good_exit_bdd diff --git "a/features/step_definitions/\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\320\265\320\232\320\276\320\274\320\260\320\275\320\264\321\213.os" "b/features/step_definitions/\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\320\265\320\232\320\276\320\274\320\260\320\275\320\264\321\213.os" index 3bf1b8b..12019bb 100644 --- "a/features/step_definitions/\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\320\265\320\232\320\276\320\274\320\260\320\275\320\264\321\213.os" +++ "b/features/step_definitions/\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\320\265\320\232\320\276\320\274\320\260\320\275\320\264\321\213.os" @@ -17,6 +17,9 @@ ВсеШаги.Добавить("ЯУстанавливаюОжидаемыйДиапазонКодовВозвратаОтДоДляКоманды"); ВсеШаги.Добавить("ЯУстанавливаюПериодОпросаЗавершенияКомандыВМиллисекунду"); ВсеШаги.Добавить("ЯСнимаюФлагПоказаНемедленногоВыводаКоманды"); + ВсеШаги.Добавить("ЯПодключаюВыводКомандыВЛог"); + ВсеШаги.Добавить("ЯПодключаюВыводВФайлДляЛога"); + ВсеШаги.Добавить("ЯУстанавливаюФлагПоказаНемедленногоВыводаКоманды"); Возврат ВсеШаги; КонецФункции @@ -89,6 +92,13 @@ Команда.ПоказыватьВыводНемедленно(Ложь); КонецПроцедуры +//Я устанавливаю флаг показа немедленного вывода команды "oscript" +Процедура ЯУстанавливаюФлагПоказаНемедленногоВыводаКоманды(Знач ИмяИлиТекстКоманды) Экспорт + Команда = ПолучитьКомандуИзКонтекста(ИмяИлиТекстКоманды); + + Команда.ПоказыватьВыводНемедленно(Истина); +КонецПроцедуры + //Я добавляю параметры для команды "oscript" //| -version | //| -encoding=utf-8 | @@ -101,8 +111,34 @@ Команда.ДобавитьПараметры(МассивПараметров); КонецПроцедуры +//Я подключаю вывод команды "oscript" в лог "ТестовыйЛог" +Процедура ЯПодключаюВыводКомандыВЛог(Знач ИмяИлиТекстКоманды, Знач ИмяЛога) Экспорт + Команда = ПолучитьКомандуИзКонтекста(ИмяИлиТекстКоманды); + Команда.ДобавитьЛогВыводаКоманды(ИмяЛога); + + НовыйЛог = Логирование.ПолучитьЛог(ИмяЛога); + НовыйЛог.УстановитьРаскладку(ЭтотОбъект); +КонецПроцедуры + +//Я подключаю вывод в файл "лог1.Log" для лога "ТестовыйЛог" +Процедура ЯПодключаюВыводВФайлДляЛога(Знач ПутьФайла, Знач ИмяЛога) Экспорт + НовыйЛог = Логирование.ПолучитьЛог(ИмяЛога); + + ФайлЖурнала = Новый ВыводЛогаВФайл; + ФайлЖурнала.ОткрытьФайл(ПутьФайла); + + НовыйЛог.ДобавитьСпособВывода(ФайлЖурнала); + +КонецПроцедуры + // { Служебные функции +Функция Форматировать(Знач Уровень, Знач Сообщение) Экспорт + + Возврат СтрШаблон("ФИЧА ВыполнениеКоманды: %1 - %2", УровниЛога.НаименованиеУровня(Уровень), Сообщение); + +КонецФункции + Процедура ВыполнитьКоманду(Знач ИмяИлиТекстКоманды, Знач ИспользуемКомандныйПроцессор = Истина) Команда = ПолучитьКомандуИзКонтекста(ИмяИлиТекстКоманды); Команда.УстановитьИсполнениеЧерезКомандыСистемы(ИспользуемКомандныйПроцессор); diff --git "a/features/step_definitions/\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\265\320\244\320\260\320\271\320\273\321\213.os" "b/features/step_definitions/\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\265\320\244\320\260\320\271\320\273\321\213.os" index 5d26a8f..8ea8554 100644 --- "a/features/step_definitions/\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\265\320\244\320\260\320\271\320\273\321\213.os" +++ "b/features/step_definitions/\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\265\320\244\320\260\320\271\320\273\321\213.os" @@ -2,6 +2,8 @@ #Использовать "../.." Перем БДД; //контекст фреймворка 1bdd +Перем ЭтоWindows; +Перем ПропускаюВЛинукс; // Метод выдает список шагов, реализованных в данном файле-шагов Функция ПолучитьСписокШагов(КонтекстФреймворкаBDD) Экспорт @@ -10,11 +12,14 @@ ВсеШаги = Новый Массив; ВсеШаги.Добавить("ЯСоздаюКомандныйФайл"); + ВсеШаги.Добавить("ЯСоздаюКомандныйФайлPowerShell"); ВсеШаги.Добавить("ЯДобавляюСтрокуВКомандныйФайл"); ВсеШаги.Добавить("ЯСообщаюСодержимоеКомандногоФайла"); ВсеШаги.Добавить("ЯВыполняюКомандныйФайл"); ВсеШаги.Добавить("ВыводКомандногоФайлаСодержит"); ВсеШаги.Добавить("КодВозвратаКомандногоФайлаРавен"); + ВсеШаги.Добавить("ЯУстанавливаюПриложениеЗапуска"); + ВсеШаги.Добавить("ЯПропускаюЭтотСценарийВЛинукс"); Возврат ВсеШаги; КонецФункции @@ -23,7 +28,7 @@ // Процедура выполняется перед запуском каждого сценария Процедура ПередЗапускомСценария(Знач Узел) Экспорт - + ПропускаюВЛинукс = Ложь; КонецПроцедуры // Процедура выполняется после завершения каждого сценария @@ -33,13 +38,31 @@ //Я создаю командный файл Процедура ЯСоздаюКомандныйФайл() Экспорт - КомандныйФайл = Новый КомандныйФайл; - КомандныйФайл.Создать(); - БДД.СохранитьВКонтекст("КомандныйФайл", КомандныйФайл); + СоздатьФайл(); +КонецПроцедуры + +// Я пропускаю этот сценарий в Линукс +Процедура ЯПропускаюЭтотСценарийВЛинукс() Экспорт + ПропускаюВЛинукс = Истина; +КонецПроцедуры + +//Я создаю командный файл PowerShell "" ".ps1" +Процедура ЯСоздаюКомандныйФайлPowerShell(Знач Путь="", Знач Расширение="") Экспорт + Если ПропускаюШагВЛинукс() Тогда + БДД.ВыполнитьШаг("Пропускаю шаг в Linux"); + Возврат; + КонецЕсли; + + СоздатьФайл(Путь,Расширение); КонецПроцедуры //я добавляю строку "echo командный файл" в командный файл Процедура ЯДобавляюСтрокуВКомандныйФайл(Знач СтрокаКоманды) Экспорт + Если ПропускаюШагВЛинукс() Тогда + БДД.ВыполнитьШаг("Пропускаю шаг в Linux"); + Возврат; + КонецЕсли; + КомандныйФайл = БДД.ПолучитьИзКонтекста("КомандныйФайл"); КомандныйФайл.ДобавитьКоманду(СтрокаКоманды); @@ -47,6 +70,11 @@ //Я выполняю командный файл Процедура ЯВыполняюКомандныйФайл() Экспорт + Если ПропускаюШагВЛинукс() Тогда + БДД.ВыполнитьШаг("Пропускаю шаг в Linux"); + Возврат; + КонецЕсли; + КомандныйФайл = БДД.ПолучитьИзКонтекста("КомандныйФайл"); КомандныйФайл.Исполнить(); @@ -54,11 +82,20 @@ //Я сообщаю содержимое файла "ИмяФайла" Процедура ЯСообщаюСодержимоеФайла(Знач ИмяФайла) Экспорт + Если ПропускаюШагВЛинукс() Тогда + БДД.ВыполнитьШаг("Пропускаю шаг в Linux"); + Возврат; + КонецЕсли; + ВывестиТекстФайла(ИмяФайла); КонецПроцедуры //Я сообщаю содержимое командного файла Процедура ЯСообщаюСодержимоеКомандногоФайла() Экспорт + Если ПропускаюШагВЛинукс() Тогда + БДД.ВыполнитьШаг("Пропускаю шаг в Linux"); + Возврат; + КонецЕсли; КомандныйФайл = БДД.ПолучитьИзКонтекста("КомандныйФайл"); ТекстФайла = КомандныйФайл.ПолучитьТекстФайла(); @@ -67,6 +104,11 @@ //Вывод командного файла содержит "командный файл" Процедура ВыводКомандногоФайлаСодержит(Знач ОжидаемыйВыводКоманды) Экспорт + Если ПропускаюШагВЛинукс() Тогда + БДД.ВыполнитьШаг("Пропускаю шаг в Linux"); + Возврат; + КонецЕсли; + КомандныйФайл = БДД.ПолучитьИзКонтекста("КомандныйФайл"); ВыводКоманды = КомандныйФайл.ПолучитьВывод(); @@ -75,11 +117,31 @@ //Код возврата командного файла равен 0 Процедура КодВозвратаКомандногоФайлаРавен(Знач ОжидаемыйКодВозврата) Экспорт + Если ПропускаюШагВЛинукс() Тогда + БДД.ВыполнитьШаг("Пропускаю шаг в Linux"); + Возврат; + КонецЕсли; + КомандныйФайл = БДД.ПолучитьИзКонтекста("КомандныйФайл"); Ожидаем.Что(КомандныйФайл.ПолучитьКодВозврата(), "Код возврата").Равно(ОжидаемыйКодВозврата); КонецПроцедуры +//Я устанавливаю приложение запуска "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" +Процедура ЯУстанавливаюПриложениеЗапуска(Знач ПутьПриложения="") Экспорт + Если ПропускаюШагВЛинукс() Тогда + БДД.ВыполнитьШаг("Пропускаю шаг в Linux"); + Возврат; + КонецЕсли; + + КомандныйФайл = БДД.ПолучитьИзКонтекста("КомандныйФайл"); + Если КомандныйФайл=Неопределено Тогда + КомандныйФайл = Новый КомандныйФайл; + КонецЕсли; + КомандныйФайл.УстановитьПриложение(ПутьПриложения); + БДД.СохранитьВКонтекст("КомандныйФайл", КомандныйФайл); +КонецПроцедуры + Процедура ВывестиТекстФайла(Знач ИмяФайла, Знач Кодировка = Неопределено) @@ -87,15 +149,34 @@ Если НЕ Файл.Существует() Тогда Возврат; КонецЕсли; - + Если Кодировка = Неопределено Тогда Кодировка = "utf-8"; КонецЕсли; - + ЧТ = Новый ЧтениеТекста(ИмяФайла, Кодировка); СтрокаФайла = ЧТ.Прочитать(); ЧТ.Закрыть(); - + Сообщить(СтрокаФайла); КонецПроцедуры + +Процедура СоздатьФайл(Знач Путь="", Знач Расширение="") + КомандныйФайл = БДД.ПолучитьИзКонтекста("КомандныйФайл"); + Если КомандныйФайл=Неопределено Тогда + КомандныйФайл = Новый КомандныйФайл; + КонецЕсли; + + КомандныйФайл.Создать(Путь,Расширение); + БДД.СохранитьВКонтекст("КомандныйФайл", КомандныйФайл); +КонецПроцедуры + +Функция ПропускаюШагВЛинукс() + Если ЭтоWindows = Неопределено Тогда + СистемнаяИнформация = Новый СистемнаяИнформация; + ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0; + КонецЕсли; + + Возврат ПропускаюВЛинукс И НЕ ЭтоWindows; +КонецФункции // ЭтоWindows() diff --git "a/features/\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\320\265\320\232\320\276\320\274\320\260\320\275\320\264\321\213.feature" "b/features/\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\320\265\320\232\320\276\320\274\320\260\320\275\320\264\321\213.feature" index 09f06e4..d0d5e81 100644 --- "a/features/\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\320\265\320\232\320\276\320\274\320\260\320\275\320\264\321\213.feature" +++ "b/features/\320\222\321\213\320\277\320\276\320\273\320\275\320\265\320\275\320\270\320\265\320\232\320\276\320\274\320\260\320\275\320\264\321\213.feature" @@ -71,3 +71,53 @@ Когда Я устанавливаю ожидаемый диапазон кодов возврата от 1 до 10 для команды "oscript" Тогда Я получаю исключение при выполнении команды "oscript" И Код возврата команды "oscript" равен 0 + +Сценарий: Выполнение команды с выводом в отдельный лог + Допустим Я создаю временный каталог и сохраняю его в контекст + И Я устанавливаю временный каталог как рабочий каталог + И Я установил рабочий каталог как текущий каталог + + Допустим Я подключаю вывод команды "oscript" в лог "ТестовыйЛог" + И Я подключаю вывод в файл "лог1.Log" для лога "ТестовыйЛог" + И Я добавляю параметр "-version" для команды "oscript" + + Когда Я выполняю команду "oscript" + Тогда я не вижу в консоли строку подобно "(\d+\.){3}\d+" + Тогда я не вижу в консоли вывод "ФИЧА ВыполнениеКоманды" + И Код возврата команды "oscript" равен 0 + И Файл "лог1.Log" содержит "ФИЧА ВыполнениеКоманды" + +Сценарий: Выполнение команды с выводом в отдельные логи + Допустим Я создаю временный каталог и сохраняю его в контекст + И Я устанавливаю временный каталог как рабочий каталог + И Я установил рабочий каталог как текущий каталог + + Допустим Я подключаю вывод команды "oscript" в лог "ТестовыйЛог" + И Я подключаю вывод в файл "лог1.Log" для лога "ТестовыйЛог" + И Я подключаю вывод в файл "лог2.txt" для лога "ТестовыйЛог2" + Допустим Я подключаю вывод команды "oscript" в лог "ТестовыйЛог2" + И Я добавляю параметр "-version" для команды "oscript" + + Когда Я выполняю команду "oscript" + Тогда я не вижу в консоли строку подобно "(\d+\.){3}\d+" + Тогда я не вижу в консоли вывод "ФИЧА ВыполнениеКоманды" + И Код возврата команды "oscript" равен 0 + И Файл "лог1.Log" содержит "ФИЧА ВыполнениеКоманды" + И Файл "лог2.txt" содержит "ФИЧА ВыполнениеКоманды" + +Сценарий: Выполнение команды с выводом в отдельный лог при включенном немедленном выводом команды + Допустим Я создаю временный каталог и сохраняю его в контекст + И Я устанавливаю временный каталог как рабочий каталог + И Я установил рабочий каталог как текущий каталог + + Допустим Я устанавливаю флаг показа немедленного вывода команды "oscript" + Допустим Я подключаю вывод команды "oscript" в лог "ТестовыйЛог" + И Я подключаю вывод в файл "лог1.Log" для лога "ТестовыйЛог" + И Я добавляю параметр "-version" для команды "oscript" + + Когда Я выполняю команду "oscript" + Тогда я не вижу в консоли строку подобно "(\d+\.){3}\d+" + Тогда я не вижу в консоли вывод "ФИЧА ВыполнениеКоманды" + И Код возврата команды "oscript" равен 0 + + И Файл "лог1.Log" содержит "ФИЧА ВыполнениеКоманды" diff --git "a/features/\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\265\320\244\320\260\320\271\320\273\321\213.feature" "b/features/\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\265\320\244\320\260\320\271\320\273\321\213.feature" index 853efbd..8ad0dfb 100644 --- "a/features/\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\265\320\244\320\260\320\271\320\273\321\213.feature" +++ "b/features/\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\265\320\244\320\260\320\271\320\273\321\213.feature" @@ -9,7 +9,17 @@ Контекст: Отключение отладки в логах Допустим Я выключаю отладку лога с именем "oscript.lib.commands" -Сценарий: Выполнение простого командного файла +Сценарий: Выполнение командного файла PowerShell + Когда Я пропускаю этот сценарий в Линукс + И Я устанавливаю приложение запуска "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" + И Я создаю командный файл PowerShell "" ".ps1" + И Я добавляю строку "Write-Host PowerShell" в командный файл + И Я сообщаю содержимое командного файла + И Я выполняю командный файл + Тогда Вывод командного файла содержит "PowerShell" + И Код возврата командного файла равен 0 + +Сценарий: Выполнение командного файла Когда Я создаю командный файл И Я добавляю строку "echo command file" в командный файл И Я сообщаю содержимое командного файла diff --git a/packagedef b/packagedef index 35474a7..848e66b 100644 --- a/packagedef +++ b/packagedef @@ -1,7 +1,7 @@  Описание.Имя("1commands") - .Версия("1.2.1") - .ВерсияСреды("1.0.16") + .Версия("1.3.0") + .ВерсияСреды("1.0.17") .ЗависитОт("logos") .ЗависитОт("asserts") .ЗависитОт("tempfiles") @@ -10,4 +10,5 @@ .ВключитьФайл("readme.md") .ВключитьФайл("LICENSE.md") .ВключитьФайл("NOTICE") + .ВключитьФайл("packagedef") .ВключитьФайл("lib.config"); diff --git a/readme.md b/readme.md index 709d301..6f73bd1 100644 --- a/readme.md +++ b/readme.md @@ -3,7 +3,7 @@ Обсудить [![Join the chat at https://gitter.im/EvilBeaver/oscript-library](https://badges.gitter.im/EvilBeaver/oscript-library.svg)](https://gitter.im/EvilBeaver/oscript-library?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![GitHub release](https://img.shields.io/github/release/artbear/1commands.svg)](https://github.com/artbear/1commands/releases) [![Build Status](http://build.oscript.io/buildStatus/icon?job=oscript-library/1commands/develop)](http://build.oscript.io/job/oscript-library/job/1commands/job/develop/) [![Build status](https://ci.appveyor.com/api/projects/status/ervidk37h9m0tgs5?svg=true)](https://ci.appveyor.com/project/artbear/1commands) -## Библиотека для упрощения работы c запуском различных приложений и командных файлов (cmd, bat, bash) из oscript. +## Библиотека для упрощения работы c запуском различных приложений и командных файлов (cmd, bat, bash, PowerShell и др.) из oscript. Позволяет выполнять рутинные операции по запуску приложений и командных файлов системы. @@ -30,7 +30,22 @@ КомандныйФайл.ДобавитьКоманду("@echo off"); КомандныйФайл.ДобавитьКоманду("oscript -version"); -Сообщить(КомандныйФайл.ПолучитьСодержимоеФайла()); +Сообщить(КомандныйФайл.ПолучитьТекстФайла()); + +КодВозврата = КомандныйФайл.Исполнить(); +Сообщить(КодВозврата); + +Сообщить(КомандныйФайл.ПолучитьВывод()); +``` +или запуск командного файла PowerShell +```bsl +КомандныйФайл = Новый КомандныйФайл; +КомандныйФайл.УстановитьПриложение("C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"); +КомандныйФайл.Создать("",".ps1"); + +КомандныйФайл.ДобавитьКоманду("Get-Help"); + +Сообщить(КомандныйФайл.ПолучитьТекстФайла()); КодВозврата = КомандныйФайл.Исполнить(); Сообщить(КодВозврата); diff --git "a/src/\320\232\320\276\320\274\320\260\320\275\320\264\320\260.os" "b/src/\320\232\320\276\320\274\320\260\320\275\320\264\320\260.os" index 7e934ea..29b8270 100644 --- "a/src/\320\232\320\276\320\274\320\260\320\275\320\264\320\260.os" +++ "b/src/\320\232\320\276\320\274\320\260\320\275\320\264\320\260.os" @@ -17,6 +17,7 @@ Перем МаксимальныйОжидаемыйКодВозврата; Перем ПериодОпросаВМиллисекундах; Перем НемедленнныйВывод; +Перем ПодключенныеЛоги; Перем ЭтоWindows; Перем Лог; @@ -30,7 +31,12 @@ ПроверитьВозможностьВыполненияКоманды(); - КодВозврата = ЗапуститьИПодождать(); + КодВозврата = ЗапуститьИПодождать(); + + Для каждого ПодключенныйЛог Из ПодключенныеЛоги Цикл + ПодключенныйЛог.Закрыть(); + КонецЦикла; + Лог.Отладка("Код возврата равен %1", КодВозврата); Возврат КодВозврата; @@ -149,6 +155,22 @@ НемедленнныйВывод = НемедленныйПоказ; КонецПроцедуры +// Устанавливает передачу вывода команды в дополнительный лог +// +// Параметры: +// ИмяЛогаИлиЛог - <Строка, Лог> - имя лога или объект лога +// +Процедура ДобавитьЛогВыводаКоманды(Знач ИмяЛогаИлиЛог) Экспорт + + НовыйЛог = ИмяЛогаИлиЛог; + Если ТипЗнч(ИмяЛогаИлиЛог) = Тип("Строка") Тогда + НовыйЛог = Логирование.ПолучитьЛог(ИмяЛогаИлиЛог); + КонецЕсли; + + ПодключенныеЛоги.Добавить(НовыйЛог); + +КонецПроцедуры + // Установить ожидаемый код возврата // После исполнения команды будет выброшено исключение, если полученный код возврата не совпадает с ожидаемым // @@ -353,12 +375,12 @@ КонецЕсли; ОбработатьОчереднуюСтрокуВывода(Процесс.ПотокВывода, ЗаписьXML, "В цикле"); - ОбработатьОчереднуюСтрокуВывода(Процесс.ПотокОшибок, ЗаписьXML, "В цикле"); + ОбработатьОчереднуюСтрокуВывода(Процесс.ПотокОшибок, ЗаписьXML, "В цикле", Истина); КонецЦикла; ОбработатьОчереднуюСтрокуВывода(Процесс.ПотокВывода, ЗаписьXML, "После цикла"); - ОбработатьОчереднуюСтрокуВывода(Процесс.ПотокОшибок, ЗаписьXML, "После цикла"); + ОбработатьОчереднуюСтрокуВывода(Процесс.ПотокОшибок, ЗаписьXML, "После цикла", Истина); РезультатРаботыПроцесса = ЗаписьXML.Закрыть(); Если Не НемедленнныйВывод Тогда @@ -370,7 +392,7 @@ УстановитьВывод(РезультатРаботыПроцесса); КонецПроцедуры -Функция ОбработатьОчереднуюСтрокуВывода(ПотокПроцесса, ЗаписьXML, Знач ПрефиксДляОтладки) +Функция ОбработатьОчереднуюСтрокуВывода(ПотокПроцесса, ЗаписьXML, Знач ПрефиксДляОтладки, Знач ЭтоВыводОшибки = Ложь) Рез = ""; Если ПотокПроцесса.ЕстьДанные Тогда Рез = ПотокПроцесса.Прочитать(); @@ -378,11 +400,23 @@ Если Рез <> "" Тогда Лог.Отладка("в цикле %2%1", Рез, Символы.ПС); - ЗаписьXML.ЗаписатьБезОбработки(Рез + Символы.ПС); - - Если НемедленнныйВывод Тогда - Сообщить(Рез); + Если ЗначениеЗаполнено(ПодключенныеЛоги) Тогда + Лог.Отладка(" Вывожу в отдельные логи"); + Для каждого ПодключенныйЛог Из ПодключенныеЛоги Цикл + Если ЭтоВыводОшибки Тогда + ПодключенныйЛог.Ошибка(Рез); + Иначе + ПодключенныйЛог.Информация(Рез); + КонецЕсли; + КонецЦикла; + Иначе + ЗаписьXML.ЗаписатьБезОбработки(Рез + Символы.ПС); + + Если НемедленнныйВывод Тогда + Сообщить(Рез); + КонецЕсли; КонецЕсли; + КонецЕсли; Возврат Рез; @@ -392,11 +426,16 @@ Если ПроверяемКодВозврата Тогда Если КодВозврата < МинимальныйОжидаемыйКодВозврата или КодВозврата > МаксимальныйОжидаемыйКодВозврата Тогда Если МинимальныйОжидаемыйКодВозврата <> МаксимальныйОжидаемыйКодВозврата Тогда - ТекстОшибки = СтрШаблон("Ожидали, что код возврата <%1> команды <%2> совпадет с ожидаемым диапазоном <%3>-<%4>, а это не так", - КодВозврата, Приложение, МинимальныйОжидаемыйКодВозврата, МаксимальныйОжидаемыйКодВозврата); + ТекстОшибки = СтрШаблон("Ожидали, что код возврата <%1> команды <%2> совпадет с ожидаемым диапазоном <%3>-<%4>, а это не так! + |Лог команды: + |%5", + КодВозврата, Приложение, МинимальныйОжидаемыйКодВозврата, МаксимальныйОжидаемыйКодВозврата, + ПолучитьВывод()); Иначе - ТекстОшибки = СтрШаблон("Ожидали, что код возврата <%1> команды <%2> совпадет с ожидаемым <%3>, а это не так", - КодВозврата, Приложение, МинимальныйОжидаемыйКодВозврата); + ТекстОшибки = СтрШаблон("Ожидали, что код возврата <%1> команды <%2> совпадет с ожидаемым <%3>, а это не так! + |Лог команды: + |%4", + КодВозврата, Приложение, МинимальныйОжидаемыйКодВозврата, ПолучитьВывод()); КонецЕсли; Ожидаем.Что(КодВозврата, СтрШаблон("%1, вывод %2", ТекстОшибки, ВыводКоманды)). БольшеИлиРавно(МинимальныйОжидаемыйКодВозврата). @@ -428,6 +467,8 @@ ПериодОпросаВМиллисекундах = 100; НемедленнныйВывод = Ложь; + + ПодключенныеЛоги = Новый Массив; КонецПроцедуры diff --git "a/src/\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\244\320\260\320\271\320\273.os" "b/src/\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\244\320\260\320\271\320\273.os" index 21625e0..46d74ba 100644 --- "a/src/\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\244\320\260\320\271\320\273.os" +++ "b/src/\320\232\320\276\320\274\320\260\320\275\320\264\320\275\321\213\320\271\320\244\320\260\320\271\320\273.os" @@ -7,6 +7,7 @@ Перем ПутьКоманды; Перем Команда; Перем ТекстФайла; +Перем Приложение; Перем ЭтоWindows; Перем Лог; @@ -22,6 +23,20 @@ Возврат "oscript.lib.commands"; КонецФункции +// Установить путь к приложению. +// +// Параметры: +// ПутьПриложения - Путь приложения (Строка) +// Например для запуска скриптов PowerShell +// Для 64bit PowerShell если стоит 64 битная система или 32bit PowerShell, если стоит 32 битная система +// "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" +// Для 32bit PowerShell на 64 битных системах находится в папке: +// "C:\Windows\syswow64\Windowspowershell\v1.0\powershell.exe" +// +Процедура УстановитьПриложение(Знач ПутьПриложения) Экспорт + Приложение = ПутьПриложения; +КонецПроцедуры // УстановитьПриложение() + // Получить путь командного файла // // Возвращаемое значение: @@ -75,14 +90,19 @@ // Параметры: // Путь - Строка - путь создаваемого файла. Необязательное значение. // Если не задан, создается временный файл в каталоге временных файлов +// Расширение - Строка - расширение исполняемого командного файла. +// Если не задано, подставляется ".bat" для Windows или ".sh" для Linux. // // Возвращаемое значение: // Строка - Путь созданного файла // -Функция Создать(Знач Путь = "") Экспорт +Функция Создать(Знач Путь = "", Знач Расширение="") Экспорт + Если ПустаяСтрока(Расширение) Тогда + Расширение = ?(ЭтоWindows, ".bat", ".sh"); + КонецЕсли; Если ПустаяСтрока(Путь) Тогда - ПутьКоманды = ВременныеФайлы.НовоеИмяФайла(?(ЭтоWindows, ".bat", ".sh")); + ПутьКоманды = ВременныеФайлы.НовоеИмяФайла(Расширение); Лог.Отладка("КомандныйФайл: задаю временный путь командного файла <%1>.", ПутьКоманды); Иначе ПутьКоманды = Путь; @@ -125,7 +145,9 @@ Команда.УстановитьКодировкуВывода(КодировкаВывода); Команда.ПоказыватьВыводНемедленно(НемедленнныйВывод); - Если ЭтоWindows Тогда + Если ЗначениеЗаполнено(Приложение) Тогда + СтрокаЗапуска = """%1"""; + ИначеЕсли ЭтоWindows Тогда Приложение = "cmd.exe"; СтрокаЗапуска = "/C ""%1"""; Иначе diff --git a/tasks/coverage.os b/tasks/coverage.os new file mode 100644 index 0000000..ca026d3 --- /dev/null +++ b/tasks/coverage.os @@ -0,0 +1,73 @@ +#Использовать 1commands +#Использовать asserts +#Использовать fs +#Использовать json + +СистемнаяИнформация = Новый СистемнаяИнформация; +ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0; + +ФС.ОбеспечитьПустойКаталог("coverage"); +ПутьКСтат = "coverage/stat.json"; + +Команда = Новый Команда; +Команда.УстановитьКоманду("oscript"); +Если НЕ ЭтоWindows Тогда + Команда.ДобавитьПараметр("-encoding=utf-8"); +КонецЕсли; +Команда.ДобавитьПараметр(СтрШаблон("-codestat=%1", ПутьКСтат)); +Команда.ДобавитьПараметр("tasks/test.os"); +Команда.ПоказыватьВыводНемедленно(Истина); + +КодВозврата = Команда.Исполнить(); +Сообщить(Команда.ПолучитьВывод()); +Ожидаем.Что(КодВозврата).Равно(0); + +Файл_Стат = Новый Файл(ПутьКСтат); +Ожидаем.Что(Файл_Стат.Существует(), СтрШаблон("Файл <%1> с результатами покрытия не существует!", Файл_Стат.ПолноеИмя)).ЭтоИстина(); + +ЧтениеТекста = Новый ЧтениеТекста(ПутьКСтат, КодировкаТекста.UTF8); + +СтрокаJSON = ЧтениеТекста.Прочитать(); +ЧтениеТекста.Закрыть(); + +Парсер = Новый ПарсерJSON(); +ДанныеПокрытия = Парсер.ПрочитатьJSON(СтрокаJSON); + +ЗаписьXML = Новый ЗаписьXML; +ЗаписьXML.ОткрытьФайл("coverage/genericCoverage.xml"); +ЗаписьXML.ЗаписатьОбъявлениеXML(); +ЗаписьXML.ЗаписатьНачалоЭлемента("coverage"); +ЗаписьXML.ЗаписатьАтрибут("version", "1"); + +Для Каждого Файл Из ДанныеПокрытия Цикл + + ДанныеФайла = Файл.Значение; + + ЗаписьXML.ЗаписатьНачалоЭлемента("file"); + ЗаписьXML.ЗаписатьАтрибут("path", ДанныеФайла.Получить("#path")); + + Для Каждого КлючИЗначение Из ДанныеФайла Цикл + + Если КлючИЗначение.Ключ = "#path" Тогда + Продолжить; + КонецЕсли; + + ДанныеПроцедуры = КлючИЗначение.Значение; + Для Каждого ДанныеСтроки Из ДанныеПроцедуры Цикл + + ЗаписьXML.ЗаписатьНачалоЭлемента("lineToCover"); + + ЗаписьXML.ЗаписатьАтрибут("lineNumber", ДанныеСтроки.Ключ); + Покрыто = Число(ДанныеСтроки.Значение.Получить("count")) > 0; + ЗаписьXML.ЗаписатьАтрибут("covered", Формат(Покрыто, "БИ=true; БЛ=false")); + + ЗаписьXML.ЗаписатьКонецЭлемента(); // lineToCover + КонецЦикла + КонецЦикла; + + ЗаписьXML.ЗаписатьКонецЭлемента(); // file + +КонецЦикла; + +ЗаписьXML.ЗаписатьКонецЭлемента(); // coverage +ЗаписьXML.Закрыть(); diff --git a/tasks/test.os b/tasks/test.os index 8e7218c..5c8c4a9 100644 --- a/tasks/test.os +++ b/tasks/test.os @@ -15,7 +15,7 @@ Если РезультатыВыполнения.Строки.Количество() > 0 Тогда СтатусВыполнения = ИсполнительБДД.ПолучитьИтоговыйСтатусВыполнения(РезультатыВыполнения); - // ИсполнительБДД.ВывестиИтоговыеРезультатыВыполнения(РезультатыВыполнения, ФайлФичи.ЭтоКаталог()); + ИсполнительБДД.ВывестиИтоговыеРезультатыВыполнения(РезультатыВыполнения, Файл_КаталогФич.ЭтоКаталог()); КонецЕсли; ГенераторОтчетаJUnit = Новый ГенераторОтчетаJUnit;