Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/qa.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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 }}
11 changes: 9 additions & 2 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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 }}
oscript_version: ${{ matrix.oscript_version }}
test_engine: ${{ matrix.test_engine }}
3 changes: 2 additions & 1 deletion packagedef
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

#Использовать winow

Перем _Хост; // Строка
Expand Down Expand Up @@ -36,7 +35,7 @@
_НастройкиВебСервера.ИмяХоста = _Хост;
_НастройкиВебСервера.Порт = _Порт;

Если ПолучитьПеременнуюСреды("HTTPBIN_IS_TEST_MODE") = "true" Тогда
Если ПолучитьПеременнуюСреды("HTTPBIN_TESTING_MODE") = "true" Тогда
_НастройкиВебСервера.ЗадержкаПередЧтениемСокета = 400;
КонецЕсли;

Expand Down
15 changes: 8 additions & 7 deletions src/cmd/Классы/КомандаЗапустить.os
Original file line number Diff line number Diff line change
Expand Up @@ -18,21 +18,22 @@
&ПоУмолчанию(3333)
Перем _Порт; // Число

&Опция(
Имя = "routes-handlers",
Описание = "Путь к файлу или каталогу кастомных контроллеров"
)
&ТМассивСтрок
Перем _КастомныеКонтроллеры; // BSLLS:UnusedLocalVariable-off

&Опция(
Имя = "parent-pid",
Описание = "PID родительского процесса"
)
&ТЧисло
&ПоУмолчанию(0)
&СкрытьВСправке
Перем _ИдентификаторРодительскогоПроцесса; // Число

&Опция(
Имя = "routes-handlers",
Описание = "Путь к файлу или каталогу кастомных контроллеров"
)
&ТМассивСтрок
Перем _КастомныеКонтроллеры; // BSLLS:UnusedLocalVariable-off

#КонецОбласти

#Область ОписаниеПеременных
Expand Down
92 changes: 91 additions & 1 deletion src/core/Классы/HttpBin.os
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
#Использовать 1connector
#Использовать fs
#Использовать logos
#Использовать configor
#Использовать "../../internal"

Перем _ТаймаутЗапуска; // Число - Таймаут запуска сервиса в секундах
Перем _ТаймаутПроверки; // Число - Таймаут HTTP-проверки доступности в секундах
Expand Down Expand Up @@ -275,7 +277,7 @@

_Лог.Отладка("Запуск процесса: %1", СтрокаКоманды);

_Процесс = СоздатьПроцесс(СтрокаКоманды, РабочийКаталог, , , , ПеременныеСреды());
_Процесс = СоздатьПроцесс(СтрокаКоманды, РабочийКаталог, , , , ПолучитьПараметрыСредыПроцесса());
_Процесс.Запустить();

Если Синхронно Тогда
Expand Down Expand Up @@ -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);
КонецЕсли;

СтартовыйКаталог = СтартовыйСценарий().Каталог;
НормализованныйПуть = ФС.НормализоватьПуть(ОбъединитьПути(СтартовыйКаталог, Каталог));

Если ФС.КаталогСуществует(НормализованныйПуть) Тогда
Каталог = НормализованныйПуть;
КонецЕсли;

Конфигурация[Ключ] = Каталог;

КонецПроцедуры

Comment on lines +398 to +485
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

ПолучитьПараметрыСредыПроцесса: есть несколько edge-case’ов, которые могут ломать старт/конфиг.

  1. Не мутировать “живые” переменные среды родителя (если API возвращает view, а не копию). Сейчас вы меняете ПеременныеСреды["OSCRIPT_CONFIG"] напрямую. Лучше собрать копию и менять её.
  2. Ранний Возврат, если заполнен lib.system, блокирует установку lib.additional. Если это не намеренно — лучше “пропускать только lib.system”, но не выходить из функции.
  3. Нет try/catch вокруг чтения конфигурации. Любая проблема с oscript.cfg/провайдером/парсингом может валить запуск сервиса целиком — часто лучше залогировать и продолжить со старой средой.
  4. КонфигурацияОСкрпитВСоответствие: стоит триммить и значения тоже (пути из cfg часто с пробелами).
  5. УстановитьКаталогВКонфигурацию: поведение с абсолютными путями зависит от ОбъединитьПути. Если Каталог может быть абсолютным — лучше не “прибивать” его к СтартовыйСценарий().Каталог (используйте проверку абсолютности, если она есть в fs).
Proposed fix (минимально инвазивный)
 Функция ПолучитьПараметрыСредыПроцесса()

-	ПеременныеСреды = ПеременныеСреды();
+	ПеременныеСредыИсходные = ПеременныеСреды();
+	ПеременныеСреды = Новый Соответствие();
+	Для Каждого КлючИЗначение Из ПеременныеСредыИсходные Цикл
+		ПеременныеСреды.Вставить(КлючИЗначение.Ключ, КлючИЗначение.Значение);
+	КонецЦикла;

 	СтартовыйКаталог = СтартовыйСценарий().Каталог;
 	ПутьККонфигурации = ОбъединитьПути(СтартовыйКаталог, "oscript.cfg");

 	Если Не ФС.ФайлСуществует(ПутьККонфигурации) Тогда
 		Возврат ПеременныеСреды;
 	КонецЕсли;

 	Конфигурация = КонфигурацияОСкрпитВСоответствие(ПеременныеСреды["OSCRIPT_CONFIG"]);
-	Если ЗначениеЗаполнено(Конфигурация["lib.system"]) Тогда
-		Возврат ПеременныеСреды;
-	КонецЕсли;
+	// Не выходим сразу: lib.additional может быть полезен даже если lib.system задан извне.

-	МенеджерПараметров = Новый МенеджерПараметров();
-	МенеджерПараметров.УстановитьФайлПараметров(ПутьККонфигурации);
-	МенеджерПараметров.ДобавитьПровайдерПараметров(Новый ПровайдерПараметровCFG());
-	МенеджерПараметров.Прочитать();
+	Попытка
+		МенеджерПараметров = Новый МенеджерПараметров();
+		МенеджерПараметров.УстановитьФайлПараметров(ПутьККонфигурации);
+		МенеджерПараметров.ДобавитьПровайдерПараметров(Новый ПровайдерПараметровCFG());
+		МенеджерПараметров.Прочитать();
+	Исключение
+		_Лог.Отладка(
+			"Не удалось прочитать oscript.cfg (%1). Ошибка: %2",
+			ПутьККонфигурации,
+			ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())
+		);
+		Возврат ПеременныеСреды;
+	КонецПопытки;

-	УстановитьКаталогВКонфигурацию(Конфигурация, "lib.system", МенеджерПараметров.Параметр("lib.system"));
+	Если Не ЗначениеЗаполнено(Конфигурация["lib.system"]) Тогда
+		УстановитьКаталогВКонфигурацию(Конфигурация, "lib.system", МенеджерПараметров.Параметр("lib.system"));
+	КонецЕсли;
 	УстановитьКаталогВКонфигурацию(Конфигурация, "lib.additional", МенеджерПараметров.Параметр("lib.additional"));

 	ПеременныеСреды["OSCRIPT_CONFIG"] = КонфигурацияОСкрпитВСтроку(Конфигурация);

 	Возврат ПеременныеСреды;

 КонецФункции

 Функция КонфигурацияОСкрпитВСоответствие(Параметры)

 	Результат = Новый Соответствие();

 	Если Не ЗначениеЗаполнено(Параметры) Тогда
 		Возврат Результат;
 	КонецЕсли;
 	
 	КлючиИЗначения = СтрРазделить(Параметры, ";");

 	Для Каждого КлючИЗначение Из КлючиИЗначения Цикл
 		ПозицияРавенства = СтрНайти(КлючИЗначение, "=");
 		Если ПозицияРавенства > 0 Тогда
 			ЛеваяЧасть = Сред(КлючИЗначение, 1, ПозицияРавенства - 1);
 			ПраваяЧасть = Сред(КлючИЗначение, ПозицияРавенства + 1);
-			Результат.Вставить(СокрЛП(ЛеваяЧасть), ПраваяЧасть);
+			Результат.Вставить(СокрЛП(ЛеваяЧасть), СокрЛП(ПраваяЧасть));
 		КонецЕсли;
 	КонецЦикла;

 	Возврат Результат;

 КонецФункции
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
Функция ПолучитьПараметрыСредыПроцесса()
ПеременныеСреды = ПеременныеСреды();
СтартовыйКаталог = СтартовыйСценарий().Каталог;
ПутьККонфигурации = ОбъединитьПути(СтартовыйКаталог, "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);
КонецЕсли;
СтартовыйКаталог = СтартовыйСценарий().Каталог;
НормализованныйПуть = ФС.НормализоватьПуть(ОбъединитьПути(СтартовыйКаталог, Каталог));
Если ФС.КаталогСуществует(НормализованныйПуть) Тогда
Каталог = НормализованныйПуть;
КонецЕсли;
Конфигурация[Ключ] = Каталог;
КонецПроцедуры
Функция ПолучитьПараметрыСредыПроцесса()
ПеременныеСредыИсходные = ПеременныеСреды();
ПеременныеСреды = Новый Соответствие();
Для Каждого КлючИЗначение Из ПеременныеСредыИсходные Цикл
ПеременныеСреды.Вставить(КлючИЗначение.Ключ, КлючИЗначение.Значение);
КонецЦикла;
СтартовыйКаталог = СтартовыйСценарий().Каталог;
ПутьККонфигурации = ОбъединитьПути(СтартовыйКаталог, "oscript.cfg");
Если Не ФС.ФайлСуществует(ПутьККонфигурации) Тогда
Возврат ПеременныеСреды;
КонецЕсли;
Конфигурация = КонфигурацияОСкрпитВСоответствие(ПеременныеСреды["OSCRIPT_CONFIG"]);
// Не выходим сразу: lib.additional может быть полезен даже если lib.system задан извне.
Попытка
МенеджерПараметров = Новый МенеджерПараметров();
МенеджерПараметров.УстановитьФайлПараметров(ПутьККонфигурации);
МенеджерПараметров.ДобавитьПровайдерПараметров(Новый ПровайдерПараметровCFG());
МенеджерПараметров.Прочитать();
Исключение
_Лог.Отладка(
"Не удалось прочитать oscript.cfg (%1). Ошибка: %2",
ПутьККонфигурации,
ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())
);
Возврат ПеременныеСреды;
КонецПопытки;
Если Не ЗначениеЗаполнено(Конфигурация["lib.system"]) Тогда
УстановитьКаталогВКонфигурацию(Конфигурация, "lib.system", МенеджерПараметров.Параметр("lib.system"));
КонецЕсли;
УстановитьКаталогВКонфигурацию(Конфигурация, "lib.additional", МенеджерПараметров.Параметр("lib.additional"));
ПеременныеСреды["OSCRIPT_CONFIG"] = КонфигурацияОСкрпитВСтроку(Конфигурация);
Возврат ПеременныеСреды;
КонецФункции
Функция КонфигурацияОСкрпитВСоответствие(Параметры)
Результат = Новый Соответствие();
Если Не ЗначениеЗаполнено(Параметры) Тогда
Возврат Результат;
КонецЕсли;
КлючиИЗначения = СтрРазделить(Параметры, ";");
Для Каждого КлючИЗначение Из КлючиИЗначения Цикл
ПозицияРавенства = СтрНайти(КлючИЗначение, "=");
Если ПозицияРавенства > 0 Тогда
ЛеваяЧасть = Сред(КлючИЗначение, 1, ПозицияРавенства - 1);
ПраваяЧасть = Сред(КлючИЗначение, ПозицияРавенства + 1);
Результат.Вставить(СокрЛП(ЛеваяЧасть), СокрЛП(ПраваяЧасть));
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Процедура УстановитьКаталогВКонфигурацию(Конфигурация, Ключ, Знач Каталог)
Если Не ЗначениеЗаполнено(Каталог) Тогда
Возврат;
КонецЕсли;
ПозицияТочкиЗапятой = СтрНайти(Каталог, ";");
Если ПозицияТочкиЗапятой > 0 Тогда
Каталог = Сред(Каталог, 1, ПозицияТочкиЗапятой - 1);
КонецЕсли;
СтартовыйКаталог = СтартовыйСценарий().Каталог;
НормализованныйПуть = ФС.НормализоватьПуть(ОбъединитьПути(СтартовыйКаталог, Каталог));
Если ФС.КаталогСуществует(НормализованныйПуть) Тогда
Каталог = НормализованныйПуть;
КонецЕсли;
Конфигурация[Ключ] = Каталог;
КонецПроцедуры

#КонецОбласти
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@

Процедура ПодключитьИзКаталога(Каталог)

Файлы = НайтиФайлы(Каталог, "*.os");
Файлы = НайтиФайлы(Каталог, "*.os", Истина);

Для Каждого Файл Из Файлы Цикл
Подключить(Файл.ПолноеИмя);
Expand Down
117 changes: 117 additions & 0 deletions src/internal/Классы/ПровайдерПараметровCFG.os
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
#Использовать logos

Перем _Лог;

#Область ПрограммныйИнтерфейс

// Возвращает приоритет провайдера
//
// Возвращаемое значение:
// Число - текущий приоритет провайдера
//
Функция Приоритет() Экспорт
Возврат 1;
КонецФункции

// Возвращает идентификатор провайдера
//
// Возвращаемое значение:
// Строка - текущий идентификатор провайдера
//
Функция Идентификатор() Экспорт
Возврат "cfg";
КонецФункции

// Возвращает тип провайдера
//
// Возвращаемое значение:
// Строка - текущий тип провайдера
//
Функция ТипПровайдера() Экспорт
Возврат "file";
КонецФункции

// Возвращает расширения файлов по умолчанию
//
// Возвращаемое значение:
// Строка - расширения файлов по умолчанию
//
Функция РасширенияФайлов() Экспорт
Возврат "cfg";
КонецФункции

// Выполняет чтение параметров для провайдера
//
// Параметры:
// НастройкиПровайдера - Структура - структура настроек провайдера
//
// Возвращаемое значение:
// Соответствие - результат чтения провайдера
//
Функция ПрочитатьПараметры(НастройкиПровайдера) Экспорт

ПрочитанныеПараметры = Новый Соответствие;

ФайлПараметров = Новый Файл(НастройкиПровайдера.ФайлПараметров);

Если Не ФайлПараметров.Существует() Тогда
_Лог.Отладка("Не найден файл параметров <%1>", ФайлПараметров.ПолноеИмя);
Возврат ПрочитанныеПараметры;
КонецЕсли;

_Лог.Отладка("Выполняю чтение файла параметров <%1>", ФайлПараметров.ПолноеИмя);
ПрочитанныеПараметры = Прочитать(ФайлПараметров.ПолноеИмя);

Возврат ПрочитанныеПараметры;

КонецФункции

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

Процедура ПриСозданииОбъекта()
_Лог = Логирование.ПолучитьЛог("oscript.lib.httpbin.configor.cfg");
КонецПроцедуры

// Выполнить чтение настроек из файла
//
// Параметры:
// ПутьКФайлу - Cтрока - путь к файлу настроек
// Возвращаемое значение:
// Соответствие - итоговые параметры
//
Функция Прочитать(Знач ПутьКФайлу)

НастройкиИзФайла = Новый Соответствие;

ТД = Новый ТекстовыйДокумент();
ТД.Прочитать(ПутьКФайлу);

Для Сч = 1 По ТД.КоличествоСтрок() Цикл

СтрокаНастроек = ТД.ПолучитьСтроку(Сч);

Если ПустаяСтрока(СтрокаНастроек) или Лев(СтрокаНастроек, 1) = "#" Тогда
Продолжить;
КонецЕсли;

Поз = СтрНайти(СтрокаНастроек, "=");
Если Поз = 0 Тогда
Продолжить;
КонецЕсли;

Ключ = СокрЛП(Лев(СтрокаНастроек, Поз - 1));
Значение = СокрЛП(Сред(СтрокаНастроек, Поз + 1));

НастройкиИзФайла.Вставить(Ключ, Значение);

КонецЦикла;

_Лог.Отладка("Прочитан файл настроек %1", ПутьКФайлу);

Возврат НастройкиИзФайла;

КонецФункции // Прочитать

#КонецОбласти
28 changes: 11 additions & 17 deletions tests/HttpBin_API_test.os
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
#Использовать "../src/core"

Перем HttpBin; // HttpBin
Перем СервисЗапущен;

&ТестовыйНабор(Характер = "Одиночка")
Процедура ПриСозданииОбъекта()
Expand All @@ -16,27 +15,22 @@

&ПередВсеми
Процедура ПередЗапускомТестов() Экспорт

СервисЗапущен = Ложь;

УстановитьПеременнуюСреды("HTTPBIN_IS_TEST_MODE", "true");

HttpBin = Новый HttpBin();
HttpBin.Запустить();

СервисЗапущен = Истина;

Если HttpBin = Неопределено Тогда
УстановитьПеременнуюСреды("HTTPBIN_TESTING_MODE", "true");

HttpBin = Новый HttpBin();
HttpBin.УстановитьТаймаутЗапуска(10);
HttpBin.Запустить();
КонецЕсли;
Comment on lines 16 to +25
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

rg -n "HTTPBIN_TESTING_MODE|HTTPBIN_IS_TEST_MODE" -S

Repository: Stivo182/oscript-httpbin

Length of output: 266


🏁 Script executed:

# Check for teardown procedures and environment variable handling
rg -n "ПослеВсеми|ОчиститьПеременнуюСреды|УстановитьПеременнуюСреды" tests/ -A 2

Repository: Stivo182/oscript-httpbin

Length of output: 247


🏁 Script executed:

# List test files to understand the test structure
find tests/ -type f -name "*.os" | head -20

Repository: Stivo182/oscript-httpbin

Length of output: 174


🏁 Script executed:

# Check the ЗапускательСервиса.os file to see how HTTPBIN_TESTING_MODE is used
wc -l src/cmd/Классы/ЗапускательСервиса.os

Repository: Stivo182/oscript-httpbin

Length of output: 107


🏁 Script executed:

# Read the context around line 38 where HTTPBIN_TESTING_MODE is used
sed -n '30,50p' src/cmd/Классы/ЗапускательСервиса.os

Repository: Stivo182/oscript-httpbin

Length of output: 386


🏁 Script executed:

# Read the entire HttpBin_API_test.os file to check for teardown procedures
wc -l tests/HttpBin_API_test.os

Repository: Stivo182/oscript-httpbin

Length of output: 98


🏁 Script executed:

# Check the full content of HttpBin_API_test.os
cat -n tests/HttpBin_API_test.os

Repository: Stivo182/oscript-httpbin

Length of output: 47030


Add environment variable cleanup in teardown procedure.

The HTTPBIN_TESTING_MODE environment variable is set in &ПередВсеми but never reset. The &ПослеВсех procedure should also call ОчиститьПеременнуюСреды("HTTPBIN_TESTING_MODE") to prevent the variable from persisting if other test suites run in the same process, which would cause those tests to unexpectedly receive the 400ms socket delay configured in ЗапускательСервиса.os:38.

🤖 Prompt for AI Agents
In @tests/HttpBin_API_test.os around lines 16 - 25, The test setup sets the
HTTPBIN_TESTING_MODE env var in the ПередЗапускомТестов procedure but never
clears it; add an &ПослеВсех teardown that calls
ОчиститьПеременнуюСреды("HTTPBIN_TESTING_MODE") and stops the HttpBin instance
(e.g., HttpBin. Остановить() or similar) if defined; locate the test file
procedures ПередЗапускомТестов and add an &ПослеВсех block that checks if
HttpBin <> Неопределено then clears the env var via
ОчиститьПеременнуюСреды("HTTPBIN_TESTING_MODE") and cleans up the HttpBin
resource to avoid leaking the 400ms socket delay into other suites.


КонецПроцедуры

&ПослеВсех
Процедура ПослеЗапускаТестов() Экспорт
HttpBin.Остановить();
КонецПроцедуры

&ПередКаждым
Процедура ПередЗапускомТеста() Экспорт
Если Не СервисЗапущен Тогда
ВызватьИсключение "Сервис не запущен";
Если Не HttpBin = Неопределено Тогда
HttpBin.Остановить();
HttpBin = Неопределено;
КонецЕсли;
КонецПроцедуры
Comment on lines 29 to 35
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

ПослеЗапускаТестов: защитить остановку, чтобы teardown не падал и не скрывал причину фейла старта.
Если HttpBin не был создан (или создание/старт упали), то HttpBin.Остановить() в &ПослеВсех сам выбросит исключение и “перекроет” первопричину.

Proposed fix
 &ПослеВсех
 Процедура ПослеЗапускаТестов() Экспорт
-	HttpBin.Остановить();
-	HttpBin = Неопределено;
+	Если HttpBin <> Неопределено Тогда
+		HttpBin.Остановить();
+		HttpBin = Неопределено;
+	КонецЕсли;
 КонецПроцедуры
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
&ПослеВсех
Процедура ПослеЗапускаТестов() Экспорт
HttpBin.Остановить();
КонецПроцедуры
&ПередКаждым
Процедура ПередЗапускомТеста() Экспорт
Если Не СервисЗапущен Тогда
ВызватьИсключение "Сервис не запущен";
КонецЕсли;
HttpBin = Неопределено;
КонецПроцедуры
&ПослеВсех
Процедура ПослеЗапускаТестов() Экспорт
Если HttpBin <> Неопределено Тогда
HttpBin.Остановить();
HttpBin = Неопределено;
КонецЕсли;
КонецПроцедуры
🤖 Prompt for AI Agents
In @tests/HttpBin_API_test.os around lines 29 - 33, В процедуре
ПослеЗапускаТестов защитить вызов остановки тестового сервера: перед вызовом
HttpBin.Остановить() проверить, что HttpBin не равен Неопределено (и при желании
— что у него есть метод Остановить), и обернуть вызов в блок обработки
исключений (поймать и проигнорировать/залогировать ошибку), чтобы не позволять
ошибке при остановке скрыть исходную проблему запуска.


Expand Down
1 change: 1 addition & 0 deletions tests/oscript.cfg
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
lib.system=../oscript_modules
Loading