Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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 = Неопределено;
КонецЕсли;
КонецПроцедуры

Expand Down
Loading