diff --git a/.gitignore b/.gitignore index 69c4933..bc0621a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,5 @@ .vscode -tmp* \ No newline at end of file +tmp* +coverage +test-reports +*.ospx diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..dfc33a1 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,26 @@ +sudo: required +dist: trusty +addons: + sonarqube: true +jdk: + - openjdk11 +before_install: + - chmod +x travis.sh + - sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF + - echo "deb http://download.mono-project.com/repo/ubuntu trusty main" | sudo tee /etc/apt/sources.list.d/mono-official.list + - sudo apt-get update + - sudo apt-get install mono-complete mono-devel dos2unix + - wget -O os.deb http://oscript.io/downloads/latest/x64/deb + - sudo dpkg -i os.deb; sudo apt install -f + - oscript +install: + - sudo opm install + - sudo opm install 1testrunner + - sudo opm install v8runner + +cache: + directories: + - '$HOME/.m2/repository' + - '$HOME/.sonar/cache' +script: + - ./travis.sh \ No newline at end of file diff --git a/sonar-project.properties b/sonar-project.properties new file mode 100644 index 0000000..2aaf790 --- /dev/null +++ b/sonar-project.properties @@ -0,0 +1,20 @@ +# must be unique in a given SonarQube instance +sonar.projectKey=yard + +# this is the name displayed in the SonarQube UI +sonar.projectName=yard + +# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows. +# Since SonarQube 4.2, this property is optional if sonar.modules is set. +# If not set, SonarQube starts looking for source code from the directory containing +# the sonar-project.properties file. + +sonar.sources=./src +sonar.tests=./tests + +# Encoding of the source code. Default is default system encoding +sonar.sourceEncoding=UTF-8 + +sonar.coverageReportPaths=coverage/genericCoverage.xml + +sonar.testExecutionReportPaths=test-reports/tests.xml \ No newline at end of file diff --git a/tasks/coverage.os b/tasks/coverage.os new file mode 100644 index 0000000..8a5e574 --- /dev/null +++ b/tasks/coverage.os @@ -0,0 +1,74 @@ +#Использовать 1commands +#Использовать asserts +#Использовать fs +#Использовать json + +СистемнаяИнформация = Новый СистемнаяИнформация; +ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0; + +ФС.ОбеспечитьПустойКаталог("coverage"); +ПутьКСтат = "coverage/stat.json"; + +Команда = Новый Команда; +Команда.УстановитьКоманду("oscript"); +Если НЕ ЭтоWindows Тогда + Команда.ДобавитьПараметр("-encoding=utf-8"); +КонецЕсли; +Команда.ДобавитьПараметр(СтрШаблон("-codestat=%1", ПутьКСтат)); +Команда.ДобавитьПараметр("tasks/test.os"); +Команда.ПоказыватьВыводНемедленно(Истина); + +КодВозврата = Команда.Исполнить(); + +Файл_Стат = Новый Файл(ПутьКСтат); +Ожидаем.Что(Файл_Стат.Существует(), + СтрШаблон("Файл <%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.Закрыть(); + +ЗавершитьРаботу(КодВозврата); \ No newline at end of file diff --git a/tasks/test.os b/tasks/test.os new file mode 100644 index 0000000..9eba8a7 --- /dev/null +++ b/tasks/test.os @@ -0,0 +1,22 @@ +#Использовать 1testrunner + +Процедура ПровестиТестирование() + + Тестер = Новый Тестер; + + КаталогПроекта = ОбъединитьПути(ТекущийСценарий().Каталог, ".."); + КаталогРезультатовТестов = Новый Файл(ОбъединитьПути(КаталогПроекта, "test-reports")); + Если Не КаталогРезультатовТестов.Существует() Тогда + СоздатьКаталог(КаталогРезультатовТестов.ПолноеИмя); + КонецЕсли; + + ФайлРезультатовТестовПакета = Новый Файл(КаталогРезультатовТестов.ПолноеИмя); + КаталогТестов = Новый Файл(ОбъединитьПути(КаталогПроекта, "tests")); + + Тестер.УстановитьФорматЛогФайла(Тестер.ФорматыЛогФайла().GenericExec); + + Тестер.ТестироватьКаталог(КаталогТестов, ФайлРезультатовТестовПакета); + +КонецПроцедуры + +ПровестиТестирование(); diff --git a/tests/yard-test.os b/tests/yard-test.os new file mode 100644 index 0000000..890ab71 --- /dev/null +++ b/tests/yard-test.os @@ -0,0 +1,100 @@ +// ---------------------------------------------------------- +// This Source Code Form is subject to the terms of the +// Mozilla Public License, v.2.0. If a copy of the MPL +// was not distributed with this file, You can obtain one +// at http://mozilla.org/MPL/2.0/. +// ---------------------------------------------------------- +// Codebase: https://github.com/ArKuznetsov/yabr.os/ +// ---------------------------------------------------------- + +#Использовать "../src" +#Использовать asserts +#Использовать fs +#Использовать tempfiles + +Перем ЮнитТест; +Перем ВременныйКаталог; + +Перем Лог; + +// Процедура выполняется после запуска теста +// +Процедура ПередЗапускомТеста() Экспорт + + Лог = ПараметрыПриложения.Лог(); + Лог.УстановитьУровень(УровниЛога.Информация); + +КонецПроцедуры // ПередЗапускомТеста() + +// Функция возвращает список тестов для выполнения +// +// Параметры: +// Тестирование - Тестер - Объект Тестер (1testrunner) +// +// Возвращаемое значение: +// Массив - Массив имен процедур-тестов +// +Функция ПолучитьСписокТестов(Тестирование) Экспорт + + ЮнитТест = Тестирование; + + СписокТестов = Новый Массив; + СписокТестов.Добавить("ТестДолжен_СписокПриложенийСВерсиямиССайта1С"); + СписокТестов.Добавить("ТестДолжен_ЗагрузитьВерсииПриложения"); + СписокТестов.Добавить("ТестДолжен_РаспаковатьВерсииПриложения"); + + Возврат СписокТестов; + +КонецФункции // ПолучитьСписокТестов() + +// Процедура выполняется после запуска теста +// +Процедура ПослеЗапускаТеста() Экспорт + +КонецПроцедуры // ПослеЗапускаТеста() + +// Процедура - тест +// +Процедура ТестДолжен_СписокПриложенийСВерсиямиССайта1С() Экспорт + + Пользователь = ПолучитьПеременнуюСреды("YARD_RELEASES_USER"); + Пароль = ПолучитьПеременнуюСреды("YARD_RELEASES_PWD"); + + Лог.Информация(Пользователь); + + ПараметрыОбработки = Новый Структура(); + ПараметрыОбработки.Вставить("ИмяПользователя", Пользователь); + + ПараметрыОбработки.Вставить("ПарольПользователя", Пароль); + ПараметрыОбработки.Вставить("ФильтрПриложений", "Библиотека стандартных подсистем.*3\.1"); + ПараметрыОбработки.Вставить("ФильтрВерсий", "3\.1\.3.*"); + // ПараметрыОбработки.Вставить("ФильтрВерсийНачинаяСДаты"); + // ПараметрыОбработки.Вставить("ФильтрВерсийДоДаты"); + // ПараметрыОбработки.Вставить("ПутьКФайлуДляСохранения"); + + СписокРелизов = Новый СписокРелизов1С(); + СписокРелизов.УстановитьПараметрыОбработкиДанных(ПараметрыОбработки); + СписокРелизов.ОбработатьДанные(); + + Утверждения.ПроверитьБольшеИлиРавно(СписокРелизов.РезультатОбработки().Количество(), + 1, + "Не удалось получить список релизов."); + +КонецПроцедуры // ТестДолжен_СписокПриложенийСВерсиямиССайта1С() + +// Процедура - тест +// +Процедура ТестДолжен_ЗагрузитьВерсииПриложения() Экспорт + + ВызватьИсключение "Не реализовано"; + +КонецПроцедуры // ТестДолжен_ЗагрузитьВерсииПриложения() + +// Процедура - тест +// +Процедура ТестДолжен_РаспаковатьВерсииПриложения() Экспорт + + ВызватьИсключение "Не реализовано"; + + +КонецПроцедуры // ТестДолжен_РаспаковатьВерсииПриложения() diff --git a/travis.sh b/travis.sh new file mode 100644 index 0000000..dc9d0e7 --- /dev/null +++ b/travis.sh @@ -0,0 +1,34 @@ + +#!/bin/bash +set -e + +sudo opm run coverage + +temp=`cat packagedef | grep ".Версия(" | sed 's|[^"]*"||' | sed -r 's/".+//'` +version=${temp##*|} + +if [ "$TRAVIS_SECURE_ENV_VARS" == "true" ]; then + if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then + sonar-scanner \ + -Dsonar.host.url=$SONAR_HOST \ + -Dsonar.analysis.mode=issues \ + -Dsonar.github.pullRequest=$TRAVIS_PULL_REQUEST \ + -Dsonar.github.repository=$TRAVIS_REPO_SLUG \ + -Dsonar.github.oauth=$SONAR_GITHUB_TOKEN \ + -Dsonar.login=$SONAR_TOKEN \ + -Dsonar.scm.enabled=true \ + -Dsonar.scm.provider=git \ + -Dsonar.scanner.skip=false \ + -Dsonar.branch.name=master + + elif [ "$TRAVIS_BRANCH" == "develop" ] && [ "$TRAVIS_PULL_REQUEST" == "false" ]; then + sonar-scanner \ + -Dsonar.host.url=$SONAR_HOST \ + -Dsonar.login=$SONAR_TOKEN \ + -Dsonar.projectVersion=$version \ + -Dsonar.scm.enabled=true \ + -Dsonar.scm.provider=git \ + -Dsonar.scanner.skip=false \ + -Dsonar.branch.name=master + fi +fi \ No newline at end of file