diff --git a/.github/workflows/qa.yml b/.github/workflows/qa.yml index 769564f..999035c 100644 --- a/.github/workflows/qa.yml +++ b/.github/workflows/qa.yml @@ -10,6 +10,6 @@ jobs: uses: autumn-library/workflows/.github/workflows/sonar.yml@main with: github_repository: stivo182/oscript-httpbin - oscript_version: dev + oscript_version: stable secrets: SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a085e8e..065190d 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -10,7 +10,14 @@ jobs: strategy: fail-fast: false matrix: - oscript_version: ['stable', 'dev'] + oscript_version: ['default', 'lts'] + test_engine: ['1testrunner'] + include: + - oscript_version: 'stable' + test_engine: 'oneunit' + - oscript_version: 'dev' + test_engine: 'oneunit' uses: autumn-library/workflows/.github/workflows/test.yml@main with: - oscript_version: ${{ matrix.oscript_version }} \ No newline at end of file + oscript_version: ${{ matrix.oscript_version }} + test_engine: ${{ matrix.test_engine }} \ No newline at end of file diff --git a/packagedef b/packagedef index d1f3f56..6c113cf 100644 --- a/packagedef +++ b/packagedef @@ -13,12 +13,13 @@ .ВключитьФайл("LICENSE") .ЗависитОт("autumn", "4.3.11") .ЗависитОт("autumn-cli", "1.2.0") - .ЗависитОт("winow", "0.11.0") + .ЗависитОт("winow", "0.11.2") .ЗависитОт("compressor", "1.0.2") .ЗависитОт("1connector", "2.3.3") .ЗависитОт("packageinfo", "1.1.1") .ЗависитОт("fs", "1.2.0") .ЗависитОт("logos", "1.7.1") + .ЗависитОт("configor", "0.10.0") .РазработкаЗависитОт("1testrunner") .РазработкаЗависитОт("asserts") .РазработкаЗависитОт("coverage") diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\227\320\260\320\277\321\203\321\201\320\272\320\260\321\202\320\265\320\273\321\214\320\241\320\265\321\200\320\262\320\270\321\201\320\260.os" "b/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\227\320\260\320\277\321\203\321\201\320\272\320\260\321\202\320\265\320\273\321\214\320\241\320\265\321\200\320\262\320\270\321\201\320\260.os" similarity index 97% rename from "src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\227\320\260\320\277\321\203\321\201\320\272\320\260\321\202\320\265\320\273\321\214\320\241\320\265\321\200\320\262\320\270\321\201\320\260.os" rename to "src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\227\320\260\320\277\321\203\321\201\320\272\320\260\321\202\320\265\320\273\321\214\320\241\320\265\321\200\320\262\320\270\321\201\320\260.os" index 7732c4c..4b4d9b7 100644 --- "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\227\320\260\320\277\321\203\321\201\320\272\320\260\321\202\320\265\320\273\321\214\320\241\320\265\321\200\320\262\320\270\321\201\320\260.os" +++ "b/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\227\320\260\320\277\321\203\321\201\320\272\320\260\321\202\320\265\320\273\321\214\320\241\320\265\321\200\320\262\320\270\321\201\320\260.os" @@ -1,4 +1,3 @@ - #Использовать winow Перем _Хост; // Строка @@ -36,7 +35,7 @@ _НастройкиВебСервера.ИмяХоста = _Хост; _НастройкиВебСервера.Порт = _Порт; - Если ПолучитьПеременнуюСреды("HTTPBIN_IS_TEST_MODE") = "true" Тогда + Если ПолучитьПеременнуюСреды("HTTPBIN_TESTING_MODE") = "true" Тогда _НастройкиВебСервера.ЗадержкаПередЧтениемСокета = 400; КонецЕсли; diff --git "a/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\227\320\260\320\277\321\203\321\201\321\202\320\270\321\202\321\214.os" "b/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\227\320\260\320\277\321\203\321\201\321\202\320\270\321\202\321\214.os" index 613ed0e..87968c9 100644 --- "a/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\227\320\260\320\277\321\203\321\201\321\202\320\270\321\202\321\214.os" +++ "b/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\227\320\260\320\277\321\203\321\201\321\202\320\270\321\202\321\214.os" @@ -18,21 +18,22 @@ &ПоУмолчанию(3333) Перем _Порт; // Число +&Опция( + Имя = "routes-handlers", + Описание = "Путь к файлу или каталогу кастомных контроллеров" +) +&ТМассивСтрок +Перем _КастомныеКонтроллеры; // BSLLS:UnusedLocalVariable-off + &Опция( Имя = "parent-pid", Описание = "PID родительского процесса" ) &ТЧисло &ПоУмолчанию(0) +&СкрытьВСправке Перем _ИдентификаторРодительскогоПроцесса; // Число -&Опция( - Имя = "routes-handlers", - Описание = "Путь к файлу или каталогу кастомных контроллеров" -) -&ТМассивСтрок -Перем _КастомныеКонтроллеры; // BSLLS:UnusedLocalVariable-off - #КонецОбласти #Область ОписаниеПеременных diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/HttpBin.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/HttpBin.os" index 48f1f72..54ce454 100644 --- "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/HttpBin.os" +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/HttpBin.os" @@ -4,6 +4,8 @@ #Использовать 1connector #Использовать fs #Использовать logos +#Использовать configor +#Использовать "../../internal" Перем _ТаймаутЗапуска; // Число - Таймаут запуска сервиса в секундах Перем _ТаймаутПроверки; // Число - Таймаут HTTP-проверки доступности в секундах @@ -275,7 +277,7 @@ _Лог.Отладка("Запуск процесса: %1", СтрокаКоманды); - _Процесс = СоздатьПроцесс(СтрокаКоманды, РабочийКаталог, , , , ПеременныеСреды()); + _Процесс = СоздатьПроцесс(СтрокаКоманды, РабочийКаталог, , , , ПолучитьПараметрыСредыПроцесса()); _Процесс.Запустить(); Если Синхронно Тогда @@ -393,4 +395,92 @@ КонецФункции +Функция ПолучитьПараметрыСредыПроцесса() + + ПеременныеСреды = ПеременныеСреды(); + СтартовыйКаталог = СтартовыйСценарий().Каталог; + ПутьККонфигурации = ОбъединитьПути(СтартовыйКаталог, "oscript.cfg"); + + Если Не ФС.ФайлСуществует(ПутьККонфигурации) Тогда + Возврат ПеременныеСреды; + КонецЕсли; + + Конфигурация = КонфигурацияОСкрпитВСоответствие(ПеременныеСреды["OSCRIPT_CONFIG"]); + Если ЗначениеЗаполнено(Конфигурация["lib.system"]) Тогда + Возврат ПеременныеСреды; + КонецЕсли; + + МенеджерПараметров = Новый МенеджерПараметров(); + МенеджерПараметров.УстановитьФайлПараметров(ПутьККонфигурации); + МенеджерПараметров.ДобавитьПровайдерПараметров(Новый ПровайдерПараметровCFG()); + МенеджерПараметров.Прочитать(); + + УстановитьКаталогВКонфигурацию(Конфигурация, "lib.system", МенеджерПараметров.Параметр("lib.system")); + УстановитьКаталогВКонфигурацию(Конфигурация, "lib.additional", МенеджерПараметров.Параметр("lib.additional")); + + ПеременныеСреды["OSCRIPT_CONFIG"] = КонфигурацияОСкрпитВСтроку(Конфигурация); + + Возврат ПеременныеСреды; + +КонецФункции + +Функция КонфигурацияОСкрпитВСоответствие(Параметры) + + Результат = Новый Соответствие(); + + Если Не ЗначениеЗаполнено(Параметры) Тогда + Возврат Результат; + КонецЕсли; + + КлючиИЗначения = СтрРазделить(Параметры, ";"); + + Для Каждого КлючИЗначение Из КлючиИЗначения Цикл + ПозицияРавенства = СтрНайти(КлючИЗначение, "="); + Если ПозицияРавенства > 0 Тогда + ЛеваяЧасть = Сред(КлючИЗначение, 1, ПозицияРавенства - 1); + ПраваяЧасть = Сред(КлючИЗначение, ПозицияРавенства + 1); + Результат.Вставить(СокрЛП(ЛеваяЧасть), ПраваяЧасть); + КонецЕсли; + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Функция КонфигурацияОСкрпитВСтроку(Параметры) + + Результат = Новый Массив(); + + Для Каждого КлючИЗначение Из Параметры Цикл + Если ЗначениеЗаполнено(КлючИЗначение.Значение) Тогда + Результат.Добавить(СтрШаблон("%1=%2", НРег(КлючИЗначение.Ключ), КлючИЗначение.Значение)); + КонецЕсли; + КонецЦикла; + + Возврат СтрСоединить(Результат, ";"); + +КонецФункции + +Процедура УстановитьКаталогВКонфигурацию(Конфигурация, Ключ, Знач Каталог) + + Если Не ЗначениеЗаполнено(Каталог) Тогда + Возврат; + КонецЕсли; + + ПозицияТочкиЗапятой = СтрНайти(Каталог, ";"); + Если ПозицияТочкиЗапятой > 0 Тогда + Каталог = Сред(Каталог, 1, ПозицияТочкиЗапятой - 1); + КонецЕсли; + + СтартовыйКаталог = СтартовыйСценарий().Каталог; + НормализованныйПуть = ФС.НормализоватьПуть(ОбъединитьПути(СтартовыйКаталог, Каталог)); + + Если ФС.КаталогСуществует(НормализованныйПуть) Тогда + Каталог = НормализованныйПуть; + КонецЕсли; + + Конфигурация[Ключ] = Каталог; + +КонецПроцедуры + #КонецОбласти \ No newline at end of file diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\260\321\202\320\265\320\273\321\214\320\232\320\260\321\201\321\202\320\276\320\274\320\275\321\213\321\205\320\232\320\276\320\275\321\202\321\200\320\276\320\273\320\273\320\265\321\200\320\276\320\262.os" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\260\321\202\320\265\320\273\321\214\320\232\320\260\321\201\321\202\320\276\320\274\320\275\321\213\321\205\320\232\320\276\320\275\321\202\321\200\320\276\320\273\320\273\320\265\321\200\320\276\320\262.os" index dc9807b..bed6e1e 100644 --- "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\260\321\202\320\265\320\273\321\214\320\232\320\260\321\201\321\202\320\276\320\274\320\275\321\213\321\205\320\232\320\276\320\275\321\202\321\200\320\276\320\273\320\273\320\265\321\200\320\276\320\262.os" +++ "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\320\276\320\264\320\272\320\273\321\216\321\207\320\260\321\202\320\265\320\273\321\214\320\232\320\260\321\201\321\202\320\276\320\274\320\275\321\213\321\205\320\232\320\276\320\275\321\202\321\200\320\276\320\273\320\273\320\265\321\200\320\276\320\262.os" @@ -51,7 +51,7 @@ Процедура ПодключитьИзКаталога(Каталог) - Файлы = НайтиФайлы(Каталог, "*.os"); + Файлы = НайтиФайлы(Каталог, "*.os", Истина); Для Каждого Файл Из Файлы Цикл Подключить(Файл.ПолноеИмя); diff --git "a/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262CFG.os" "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262CFG.os" new file mode 100644 index 0000000..0703d81 --- /dev/null +++ "b/src/internal/\320\232\320\273\320\260\321\201\321\201\321\213/\320\237\321\200\320\276\320\262\320\260\320\271\320\264\320\265\321\200\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\276\320\262CFG.os" @@ -0,0 +1,117 @@ +#Использовать logos + +Перем _Лог; + +#Область ПрограммныйИнтерфейс + +// Возвращает приоритет провайдера +// +// Возвращаемое значение: +// Число - текущий приоритет провайдера +// +Функция Приоритет() Экспорт + Возврат 1; +КонецФункции + +// Возвращает идентификатор провайдера +// +// Возвращаемое значение: +// Строка - текущий идентификатор провайдера +// +Функция Идентификатор() Экспорт + Возврат "cfg"; +КонецФункции + +// Возвращает тип провайдера +// +// Возвращаемое значение: +// Строка - текущий тип провайдера +// +Функция ТипПровайдера() Экспорт + Возврат "file"; +КонецФункции + +// Возвращает расширения файлов по умолчанию +// +// Возвращаемое значение: +// Строка - расширения файлов по умолчанию +// +Функция РасширенияФайлов() Экспорт + Возврат "cfg"; +КонецФункции + +// Выполняет чтение параметров для провайдера +// +// Параметры: +// НастройкиПровайдера - Структура - структура настроек провайдера +// +// Возвращаемое значение: +// Соответствие - результат чтения провайдера +// +Функция ПрочитатьПараметры(НастройкиПровайдера) Экспорт + + ПрочитанныеПараметры = Новый Соответствие; + + ФайлПараметров = Новый Файл(НастройкиПровайдера.ФайлПараметров); + + Если Не ФайлПараметров.Существует() Тогда + _Лог.Отладка("Не найден файл параметров <%1>", ФайлПараметров.ПолноеИмя); + Возврат ПрочитанныеПараметры; + КонецЕсли; + + _Лог.Отладка("Выполняю чтение файла параметров <%1>", ФайлПараметров.ПолноеИмя); + ПрочитанныеПараметры = Прочитать(ФайлПараметров.ПолноеИмя); + + Возврат ПрочитанныеПараметры; + +КонецФункции + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Процедура ПриСозданииОбъекта() + _Лог = Логирование.ПолучитьЛог("oscript.lib.httpbin.configor.cfg"); +КонецПроцедуры + +// Выполнить чтение настроек из файла +// +// Параметры: +// ПутьКФайлу - Cтрока - путь к файлу настроек +// Возвращаемое значение: +// Соответствие - итоговые параметры +// +Функция Прочитать(Знач ПутьКФайлу) + + НастройкиИзФайла = Новый Соответствие; + + ТД = Новый ТекстовыйДокумент(); + ТД.Прочитать(ПутьКФайлу); + + Для Сч = 1 По ТД.КоличествоСтрок() Цикл + + СтрокаНастроек = ТД.ПолучитьСтроку(Сч); + + Если ПустаяСтрока(СтрокаНастроек) или Лев(СтрокаНастроек, 1) = "#" Тогда + Продолжить; + КонецЕсли; + + Поз = СтрНайти(СтрокаНастроек, "="); + Если Поз = 0 Тогда + Продолжить; + КонецЕсли; + + Ключ = СокрЛП(Лев(СтрокаНастроек, Поз - 1)); + Значение = СокрЛП(Сред(СтрокаНастроек, Поз + 1)); + + НастройкиИзФайла.Вставить(Ключ, Значение); + + КонецЦикла; + + _Лог.Отладка("Прочитан файл настроек %1", ПутьКФайлу); + + Возврат НастройкиИзФайла; + +КонецФункции // Прочитать + +#КонецОбласти \ No newline at end of file diff --git a/tests/HttpBin_API_test.os b/tests/HttpBin_API_test.os index 052cfdf..c51be8f 100644 --- a/tests/HttpBin_API_test.os +++ b/tests/HttpBin_API_test.os @@ -7,7 +7,6 @@ #Использовать "../src/core" Перем HttpBin; // HttpBin -Перем СервисЗапущен; &ТестовыйНабор(Характер = "Одиночка") Процедура ПриСозданииОбъекта() @@ -16,27 +15,22 @@ &ПередВсеми Процедура ПередЗапускомТестов() Экспорт - - СервисЗапущен = Ложь; - - УстановитьПеременнуюСреды("HTTPBIN_IS_TEST_MODE", "true"); - - HttpBin = Новый HttpBin(); - HttpBin.Запустить(); - - СервисЗапущен = Истина; + + Если HttpBin = Неопределено Тогда + УстановитьПеременнуюСреды("HTTPBIN_TESTING_MODE", "true"); + + HttpBin = Новый HttpBin(); + HttpBin.УстановитьТаймаутЗапуска(10); + HttpBin.Запустить(); + КонецЕсли; КонецПроцедуры &ПослеВсех Процедура ПослеЗапускаТестов() Экспорт - HttpBin.Остановить(); -КонецПроцедуры - -&ПередКаждым -Процедура ПередЗапускомТеста() Экспорт - Если Не СервисЗапущен Тогда - ВызватьИсключение "Сервис не запущен"; + Если Не HttpBin = Неопределено Тогда + HttpBin.Остановить(); + HttpBin = Неопределено; КонецЕсли; КонецПроцедуры diff --git a/tests/HttpBin_test.os b/tests/HttpBin_test.os index c2b49f3..cdca9b1 100644 --- a/tests/HttpBin_test.os +++ b/tests/HttpBin_test.os @@ -25,6 +25,7 @@ Если Не _HttpBin = Неопределено Тогда _HttpBin.Остановить(); + _HttpBin = Неопределено; КонецЕсли; КонецПроцедуры @@ -33,7 +34,7 @@ Процедура ТестДолжен_ЗапуститьСервисСинхронноИОстановить() Экспорт // Действие - _HttpBin = Новый HttpBin().Запустить(); + _HttpBin = HttpBin().Запустить(); // Проверка Ожидаем.Что(_HttpBin.Отвечает(), "Должен быть запущен").ЭтоИстина(); @@ -44,7 +45,7 @@ Процедура ТестДолжен_ЗапуститьСервисАсинхронноИОстановить() Экспорт // Подготовка - _HttpBin = Новый HttpBin(); + _HttpBin = HttpBin(); ВремяНачалаЗапуска = ТекущаяУниверсальнаяДатаВМиллисекундах(); _HttpBin.Запустить(); @@ -67,7 +68,7 @@ Процедура ТестДолжен_ЗапуститьСервисСКастомнымКонтроллеромИзФайла() Экспорт // Подготовка - _HttpBin = Новый HttpBin() + _HttpBin = HttpBin() .УстановитьРасположениеКонтроллеров("./tests/fixtures/КастомныеКонтроллеры/КастомныйКонтроллер.os") .Запустить(); @@ -83,7 +84,7 @@ Процедура ТестДолжен_ЗапуститьСервисСКастомнымКонтроллеромИзКаталога() Экспорт // Подготовка - _HttpBin = Новый HttpBin() + _HttpBin = HttpBin() .УстановитьРасположениеКонтроллеров("./tests/fixtures/КастомныеКонтроллеры") .Запустить(); @@ -101,7 +102,7 @@ // Подготовка УстановитьТекущийКаталог("tests"); - _HttpBin = Новый HttpBin() + _HttpBin = HttpBin() .УстановитьРасположениеКонтроллеров("./fixtures/КастомныеКонтроллеры") .Запустить(); @@ -120,7 +121,7 @@ УстановитьТекущийКаталог("tests"); // Действие - _HttpBin = Новый HttpBin().Запустить(); + _HttpBin = HttpBin().Запустить(); // Проверка Ожидаем.Что(_HttpBin.Отвечает(), "Должен быть запущен").ЭтоИстина(); @@ -129,4 +130,8 @@ Функция ВыполнитьЗапрос(АдресРесурса) Возврат КоннекторHTTP.Get(_HttpBin.URL(АдресРесурса), , Новый Структура("Таймаут", 3)); +КонецФункции + +Функция HttpBin() + Возврат Новый HttpBin().УстановитьТаймаутЗапуска(10); КонецФункции \ No newline at end of file diff --git a/tests/oscript.cfg b/tests/oscript.cfg new file mode 100644 index 0000000..2303418 --- /dev/null +++ b/tests/oscript.cfg @@ -0,0 +1 @@ +lib.system=../oscript_modules \ No newline at end of file