/
EvilBeaver
/
OneScript
Обзор
Документация
Войти
/
EvilBeaver
/
OneScript
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
develop
tests/native-api.os
254 строки
15 KB
EvilBeaver
Добавил вывод пути, по которому ищется прокси-библиотека NativeApi
29 июл 2025, 15:55
29 июл 2025, 15:55
a9dcf84
Код
Авторство
О чём код?
Перем юТест; Перем ЭтоWindows; Перем DLLПодключенаУспешно; Перем ЗаписьXML, ЗаписьZIP, КаталогСкрипта, КаталогПакета, СуффиксВерсии; Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт ПроверитьСуществованиеПрокси(); юТест = ЮнитТестирование; ВсеТесты = Новый Массив; // TODO: сделать прогон этого теста еще и на 32-битной архитектуре, см. ошибку #1531 ВсеТесты.Добавить("ТестДолжен_ПроверитьПодключениеВнешнейКомпонентыZIP"); ВсеТесты.Добавить("ТестДолжен_ПроверитьПодключениеВнешнейКомпонентыDLL"); ВсеТесты.Добавить("ТестДолжен_ПроверитьСвойстваВнешнейКомпоненты"); ВсеТесты.Добавить("ТестДолжен_ПроверитьМетодыВнешнейКомпоненты"); #Если Windows Тогда ЭтоWindows = Истина; #ИначеЕсли Linux Тогда ЭтоWindows = Ложь; #Иначе Возврат Новый Массив; // под макос не тестируем #КонецЕсли Возврат ВсеТесты; КонецФункции Процедура ПроверитьСуществованиеПрокси() Каталог = КаталогПрограммы(); СистемнаяИнформация = Новый СистемнаяИнформация(); Если СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86 Тогда ПутьБиблиотеки = ОбъединитьПути(Каталог, "ScriptEngine.NativeApi32.dll"); ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64 Тогда ПутьБиблиотеки = ОбъединитьПути(Каталог, "ScriptEngine.NativeApi64.dll"); ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Linux_x86 Тогда ПутьБиблиотеки = ОбъединитьПути(Каталог, "ScriptEngine.NativeApi32.so"); ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Linux_x86_64 Тогда ПутьБиблиотеки = ОбъединитьПути(Каталог, "ScriptEngine.NativeApi64.so"); Иначе ПутьБиблиотеки = ""; КонецЕсли; Сборка = Новый Файл(ПутьБиблиотеки); Если Не Сборка.Существует() Тогда ВызватьИсключение СтрШаблон("Не собрана прокси-библиотека для NativeApi: %1", ПутьБиблиотеки); КонецЕсли; КонецПроцедуры Функция ПодключитьКомпонентуDLL() Если DLLПодключенаУспешно <> Неопределено Тогда Возврат DLLПодключенаУспешно; КонецЕсли; СистемнаяИнформация = Новый СистемнаяИнформация(); КаталогСборок = ОбъединитьПути(ТекущийСценарий().Каталог, "native-api"); Если СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86 Тогда ПутьБиблиотеки = ОбъединитьПути(КаталогСборок, "bin", "AddInNativeWin32.dll"); ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64 Тогда ПутьБиблиотеки = ОбъединитьПути(КаталогСборок, "bin64", "AddInNativeWin64.dll"); ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Linux_x86 Тогда ПутьБиблиотеки = ОбъединитьПути(КаталогСборок, "build32", "AddInNativeLin32.so"); ИначеЕсли СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Linux_x86_64 Тогда ПутьБиблиотеки = ОбъединитьПути(КаталогСборок, "build64", "AddInNativeLin64.so"); Иначе ВызватьИсключение "Неподдерживаемый тип платформы: " + СистемнаяИнформация.ТипПлатформы; КонецЕсли; Идентификатор = "AddinNativeDLL"; ФайлКомпоненты = Новый Файл(ПутьБиблиотеки); юТест.ПроверитьИстину(ФайлКомпоненты.Существует(), "Файл компоненты '" + ФайлКомпоненты.ПолноеИмя + "' должен существовать"); DLLПодключенаУспешно = ПодключитьВнешнююКомпоненту(ФайлКомпоненты.ПолноеИмя, Идентификатор, ТипВнешнейКомпоненты.Native); Возврат DLLПодключенаУспешно; КонецФункции Процедура ТестДолжен_ПроверитьПодключениеВнешнейКомпонентыZIP() Экспорт ИмяФайлаПакета = юТест.ИмяВременногоФайла(); ЗаписьZIP = Новый ЗаписьZipФайла(ИмяФайлаПакета); МасивФайлов = Новый Массив; Если ЭтоWindows Тогда Каталог = ТекущийСценарий().Каталог + "\native-api\"; МасивФайлов.Добавить("bin\AddInNativeWin32.dll"); МасивФайлов.Добавить("bin64\AddInNativeWin64.dll"); Иначе Каталог = ТекущийСценарий().Каталог + "/native-api/"; МасивФайлов.Добавить("build32/AddInNativeLin32.so"); МасивФайлов.Добавить("build64/AddInNativeLin64.so"); КонецЕсли; ЗаписьZIP.Добавить(Каталог + "MANIFEST.XML", РежимСохраненияПутейZIP.НеСохранятьПути); Для каждого ИмяФайла из МасивФайлов Цикл ПутьФайла = Каталог + ИмяФайла; Файл = Новый Файл(ПутьФайла); Если Файл.Существует() Тогда ЗаписьZIP.Добавить(ПутьФайла, РежимСохраненияПутейZIP.НеСохранятьПути); КонецЕсли; КонецЦикла; ЗаписьZIP.Записать(); Идентификатор = "AddinNativeZip"; Успешно = ПодключитьВнешнююКомпоненту(ИмяФайлаПакета, Идентификатор, ТипВнешнейКомпоненты.Native); юТест.ПроверитьРавенство(Успешно, Истина); ИмяВнешнейКомпоненты = "AddIn." + Идентификатор + ".CAddInNative"; ВнешняяКомпонента = Новый(ИмяВнешнейКомпоненты); юТест.ПроверитьРавенство(Строка(ТипЗнч(ВнешняяКомпонента)), Строка(Тип(ИмяВнешнейКомпоненты))); КонецПроцедуры Процедура ТестДолжен_ПроверитьПодключениеВнешнейКомпонентыDLL() Экспорт Идентификатор = "AddinNativeDLL"; КомпонентаПодключена = ПодключитьКомпонентуDLL(); юТест.ПроверитьИстину(КомпонентаПодключена, "Компонента должна подключиться"); ИмяВнешнейКомпоненты = "AddIn." + Идентификатор + ".CAddInNative"; ВнешняяКомпонента = Новый(ИмяВнешнейКомпоненты); ВнешняяКомпонента.Включить(); юТест.ПроверитьРавенство(ВнешняяКомпонента.Включен, Истина); ВнешняяКомпонента.Выключить(); юТест.ПроверитьРавенство(ВнешняяКомпонента.Включен, Ложь); КонецПроцедуры Процедура ТестДолжен_ПроверитьСвойстваВнешнейКомпоненты() Экспорт Идентификатор = "AddinNativeDLL"; КомпонентаПодключена = ПодключитьКомпонентуDLL(); юТест.ПроверитьИстину(КомпонентаПодключена, "Компонента должна подключиться"); ИмяВнешнейКомпоненты = "AddIn." + Идентификатор + ".CAddInNative"; ВнешняяКомпонента = Новый(ИмяВнешнейКомпоненты); ВнешняяКомпонента.Включен = Истина; юТест.ПроверитьРавенство(ВнешняяКомпонента.Включен, Истина); юТест.ПроверитьРавенство(ВнешняяКомпонента.IsEnabled, Истина); ВнешняяКомпонента.Включен = Ложь; юТест.ПроверитьРавенство(ВнешняяКомпонента.Включен, Ложь); юТест.ПроверитьРавенство(ВнешняяКомпонента.IsEnabled, Ложь); ВнешняяКомпонента["Включен"] = Истина; юТест.ПроверитьРавенство(ВнешняяКомпонента["Включен"], Истина); юТест.ПроверитьРавенство(ВнешняяКомпонента["IsEnabled"], Истина); СодержимоеСтроки = "Тест строки только на запись"; ВнешняяКомпонента.СтрокаТолькоЗапись = СодержимоеСтроки; юТест.ПроверитьРавенство(ВнешняяКомпонента.СтрокаЧтениеЗапись, СодержимоеСтроки); юТест.ПроверитьРавенство(ВнешняяКомпонента.СтрокаТолькоЧтение, СодержимоеСтроки); СодержимоеСтроки = "Тест строки на чтение и запись"; ВнешняяКомпонента.СтрокаЧтениеЗапись = СодержимоеСтроки; юТест.ПроверитьРавенство(ВнешняяКомпонента.СтрокаЧтениеЗапись, СодержимоеСтроки); юТест.ПроверитьРавенство(ВнешняяКомпонента.СтрокаТолькоЧтение, СодержимоеСтроки); Попытка ВнешняяКомпонента.СтрокаТолькоЧтение = СодержимоеСтроки; юТест.ТестПровален("Удалось изменить недоступное для записи свойство"); Исключение юТест.ТестПройден(); КонецПопытки; Попытка СодержимоеСтроки = ВнешняяКомпонента.СтрокаТолькоЗапись; юТест.ТестПровален("Удалось прочитать недоступное для чтения свойство"); Исключение юТест.ТестПройден(); КонецПопытки; Попытка ВнешняяКомпонента.СвойствоОтсутствует = СодержимоеСтроки; юТест.ТестПровален("Удалось обратиться к отсутствующему свойству"); Исключение юТест.ТестПройден(); КонецПопытки; КонецПроцедуры Процедура ТестДолжен_ПроверитьМетодыВнешнейКомпоненты() Экспорт Идентификатор = "AddinNativeDLL"; КомпонентаПодключена = ПодключитьКомпонентуDLL(); юТест.ПроверитьИстину(КомпонентаПодключена, "Компонента должна подключиться"); ИмяВнешнейКомпоненты = "AddIn." + Идентификатор + ".CAddInNative"; ВнешняяКомпонента = Новый(ИмяВнешнейКомпоненты); ВнешняяКомпонента.Включить(); юТест.ПроверитьРавенство(ВнешняяКомпонента.Включен, Истина); ВнешняяКомпонента.Выключить(); юТест.ПроверитьРавенство(ВнешняяКомпонента.Включен, Ложь); Попытка ВнешняяКомпонента.Выключить(Истина); юТест.ТестПровален("Удалось передать параметр в метод без параметров"); Исключение юТест.ТестПройден(); КонецПопытки; юТест.ПроверитьРавенство(ВнешняяКомпонента.ПараметрПоУмолчанию(), Истина); юТест.ПроверитьРавенство(ВнешняяКомпонента.ПараметрПоУмолчанию(Ложь), Ложь); Попытка Значение = ВнешняяКомпонента.ПараметрПоУмолчанию(Истина, Ложь); юТест.ТестПровален("Удалось передать лишний параметр в метод с одним параметром"); Исключение юТест.ТестПройден(); КонецПопытки; ПерваяСтрока = "Первая строка"; ВтораяСтрока = "Вторая тестовая строка"; КонкатенацияСтрок = ВнешняяКомпонента.КонкатенацияСтрок(ПерваяСтрока, ВтораяСтрока); юТест.ПроверитьРавенство(КонкатенацияСтрок, ПерваяСтрока + ВтораяСтрока); СодержимоеФайла = "Тест двоичных данных"; ВременныйФайл = юТест.ИмяВременногоФайла(); ЗаписьТекста = Новый ЗаписьТекста(ВременныйФайл, КодировкаТекста.UTF8); ЗаписьТекста.Записать(СодержимоеФайла); ЗаписьТекста.Закрыть(); ДвоичныеДанные = Новый ДвоичныеДанные(ВременныйФайл); ДвоичныеДанные = ВнешняяКомпонента.Петля(ДвоичныеДанные); Поток = ДвоичныеДанные.ОткрытьПотокДляЧтения(); ЧтениеТекста = Новый ЧтениеТекста(Поток, КодировкаТекста.UTF8); юТест.ПроверитьРавенство(ЧтениеТекста.Прочитать(), СодержимоеФайла); КонецПроцедуры