diff --git a/src/addins/lua/dependencies.log b/src/addins/lua/dependencies.log index 8c274b99d6..0f4e34eb2d 100644 --- a/src/addins/lua/dependencies.log +++ b/src/addins/lua/dependencies.log @@ -1,14 +1,13 @@ "MAIN ---" - linux-vdso.so.1 (0x00007ffee48cc000) - libm.so.6 => /lib64/libm.so.6 (0x000071267b400000) - libpthread.so.0 => /lib64/libpthread.so.0 (0x000071267b000000) - libc.so.6 => /lib64/libc.so.6 (0x000071267ac00000) - libdl.so.2 => /lib64/libdl.so.2 (0x000071267a800000) - /lib64/ld-linux-x86-64.so.2 (0x000071267b800000) + linux-vdso.so.1 (0x00007ffd0c973000) + libm.so.6 => /lib64/libm.so.6 (0x00007f4015a00000) + libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f4015600000) + libc.so.6 => /lib64/libc.so.6 (0x00007f4015200000) + libdl.so.2 => /lib64/libdl.so.2 (0x00007f4014e00000) + /lib64/ld-linux-x86-64.so.2 (0x00007f4015e00000) GLIBC_2.2.5 GLIBC_2.12 GLIBC_2.3 GLIBC_2.3.4 -GLIBC_2.7 GLIBC_2.14 GLIBC_2.17 diff --git a/src/addins/lua/src/addin.rs b/src/addins/lua/src/addin.rs index 00b6f2d319..c5f4041ab3 100644 --- a/src/addins/lua/src/addin.rs +++ b/src/addins/lua/src/addin.rs @@ -22,61 +22,68 @@ impl AddIn { } pub fn execute_string(&self, code: &str) -> JanxValue { - self.lock_backend().execute_string(code.to_string()) + let mut backend = self.lock_backend(); + backend.execute_string(code.to_string()) } pub fn execute_file(&self, path: &str) -> JanxValue { - self.lock_backend().execute_file(path.to_string()) + let mut backend = self.lock_backend(); + backend.execute_file(path.to_string()) } pub fn execute_bytecode(&self, bytecode: Vec) -> JanxValue { - self.lock_backend().execute_bytecode(bytecode) + let mut backend = self.lock_backend(); + backend.execute_bytecode(bytecode) } pub fn execute_bytecode_file(&self, path: &str) -> JanxValue { - self.lock_backend() - .execute_bytecode_file(path.to_string()) + let mut backend = self.lock_backend(); + backend.execute_bytecode_file(path.to_string()) } pub fn compile_to_bytecode(&self, code: &str) -> Result, String> { - self.lock_backend() - .compile_to_bytecode(code.to_string()) + let mut backend = self.lock_backend(); + backend.compile_to_bytecode(code.to_string()) } pub fn compile_file_to_bytecode(&self, path: &str) -> Result, String> { - self.lock_backend() - .compile_file_to_bytecode(path.to_string()) + let mut backend = self.lock_backend(); + backend.compile_file_to_bytecode(path.to_string()) } pub fn call_function(&self, function_name: &str, args_janx: Vec) -> JanxValue { - self.lock_backend() - .call_function(function_name.to_string(), args_janx) + let mut backend = self.lock_backend(); + backend.call_function(function_name.to_string(), args_janx) } pub fn set_global(&self, variable_name: &str, value_janx: Vec) -> JanxValue { - self.lock_backend() - .set_global(variable_name.to_string(), value_janx) + let mut backend = self.lock_backend(); + backend.set_global(variable_name.to_string(), value_janx) } pub fn get_global(&self, variable_name: &str) -> JanxValue { - self.lock_backend().get_global(variable_name.to_string()) + let mut backend = self.lock_backend(); + backend.get_global(variable_name.to_string()) } pub fn add_package(&self, package_name: String, code: String) -> JanxValue { - self.lock_backend().add_package(package_name, code) + let mut backend = self.lock_backend(); + backend.add_package(package_name, code) } pub fn load_package_from_file(&self, package_name: String, file_path: String) -> JanxValue { - self.lock_backend() - .load_package_from_file(package_name, file_path) + let mut backend = self.lock_backend(); + backend.load_package_from_file(package_name, file_path) } pub fn get_packages(&self) -> JanxValue { - self.lock_backend().get_packages() + let mut backend = self.lock_backend(); + backend.get_packages() } pub fn reset(&self) -> JanxValue { - self.lock_backend().reset() + let mut backend = self.lock_backend(); + backend.reset() } pub fn set_logger(&mut self, logger_config: &JanxValue) -> JanxValue { @@ -110,3 +117,10 @@ impl AddIn { self.get_field_ptr(index) as *mut _ } } + +impl Drop for AddIn { + fn drop(&mut self) { + let mut backend = self.lock_backend(); + backend.close_backend(); + } +} diff --git a/src/addins/lua/src/backend.rs b/src/addins/lua/src/backend.rs index 8348f1cff8..ab37ed148d 100644 --- a/src/addins/lua/src/backend.rs +++ b/src/addins/lua/src/backend.rs @@ -15,39 +15,37 @@ pub struct LynaBackend { impl LynaBackend { pub fn new() -> Self { - let thread = worker::spawn_thread() - .unwrap_or_else(|e| panic!("Failed to initialize lyna backend thread: {}", e)); Self { - thread: Some(thread), + thread: None, logger: None, } } - pub fn execute_string(&self, code: String) -> JanxValue { + pub fn execute_string(&mut self, code: String) -> JanxValue { self.call(|response| WorkerCommand::ExecuteString { code, response }) } - pub fn execute_file(&self, path: String) -> JanxValue { + pub fn execute_file(&mut self, path: String) -> JanxValue { self.call(|response| WorkerCommand::ExecuteFile { path, response }) } - pub fn execute_bytecode(&self, bytecode: Vec) -> JanxValue { + pub fn execute_bytecode(&mut self, bytecode: Vec) -> JanxValue { self.call(|response| WorkerCommand::ExecuteBytecode { bytecode, response }) } - pub fn execute_bytecode_file(&self, path: String) -> JanxValue { + pub fn execute_bytecode_file(&mut self, path: String) -> JanxValue { self.call(|response| WorkerCommand::ExecuteBytecodeFile { path, response }) } - pub fn compile_to_bytecode(&self, code: String) -> Result, String> { + pub fn compile_to_bytecode(&mut self, code: String) -> Result, String> { self.call_binary(|response| WorkerCommand::CompileToBytecode { code, response }) } - pub fn compile_file_to_bytecode(&self, path: String) -> Result, String> { + pub fn compile_file_to_bytecode(&mut self, path: String) -> Result, String> { self.call_binary(|response| WorkerCommand::CompileFileToBytecode { path, response }) } - pub fn call_function(&self, function_name: String, args_janx: Vec) -> JanxValue { + pub fn call_function(&mut self, function_name: String, args_janx: Vec) -> JanxValue { self.call(|response| WorkerCommand::CallFunction { function_name, args_janx, @@ -55,7 +53,7 @@ impl LynaBackend { }) } - pub fn set_global(&self, variable_name: String, value_janx: Vec) -> JanxValue { + pub fn set_global(&mut self, variable_name: String, value_janx: Vec) -> JanxValue { self.call(|response| WorkerCommand::SetGlobal { variable_name, value_janx, @@ -63,14 +61,14 @@ impl LynaBackend { }) } - pub fn get_global(&self, variable_name: String) -> JanxValue { + pub fn get_global(&mut self, variable_name: String) -> JanxValue { self.call(|response| WorkerCommand::GetGlobal { variable_name, response, }) } - pub fn add_package(&self, package_name: String, code: String) -> JanxValue { + pub fn add_package(&mut self, package_name: String, code: String) -> JanxValue { self.call(|response| WorkerCommand::AddPackage { package_name, code, @@ -78,7 +76,7 @@ impl LynaBackend { }) } - pub fn load_package_from_file(&self, package_name: String, file_path: String) -> JanxValue { + pub fn load_package_from_file(&mut self, package_name: String, file_path: String) -> JanxValue { self.call(|response| WorkerCommand::LoadPackageFromFile { package_name, file_path, @@ -86,11 +84,11 @@ impl LynaBackend { }) } - pub fn get_packages(&self) -> JanxValue { + pub fn get_packages(&mut self) -> JanxValue { self.call(|response| WorkerCommand::GetPackages { response }) } - pub fn reset(&self) -> JanxValue { + pub fn reset(&mut self) -> JanxValue { self.call(|response| WorkerCommand::Reset { response }) } @@ -100,7 +98,10 @@ impl LynaBackend { } self.logger = Some(logger.clone()); - self.call_result(|response| WorkerCommand::SetLogger { logger, response }) + if self.thread.is_some() { + self.call_result(|response| WorkerCommand::SetLogger { logger, response })?; + } + Ok(()) } pub fn get_logs(&self, count: usize) -> Option<(Vec, usize)> { @@ -111,7 +112,13 @@ impl LynaBackend { }) } - fn call(&self, build: F) -> JanxValue + pub fn close_backend(&mut self) { + if let Some(mut thread) = self.thread.take() { + let _ = thread.shutdown(Some(WorkerCommand::Shutdown)); + } + } + + fn call(&mut self, build: F) -> JanxValue where F: FnOnce(Sender) -> WorkerCommand, { @@ -121,37 +128,54 @@ impl LynaBackend { } } - fn call_binary(&self, build: F) -> Result, String> + fn call_binary(&mut self, build: F) -> Result, String> where F: FnOnce(Sender, String>>) -> WorkerCommand, { self.call_thread(build).and_then(|result| result) } - fn call_result(&self, build: F) -> Result<(), String> + fn call_result(&mut self, build: F) -> Result<(), String> where F: FnOnce(Sender>) -> WorkerCommand, { self.call_thread(build).and_then(|result| result) } - fn call_thread(&self, build: F) -> Result + fn call_thread(&mut self, build: F) -> Result where T: Send, F: FnOnce(Sender) -> WorkerCommand, { - let thread = self - .thread - .as_ref() - .ok_or_else(|| "Backend thread is not available".to_string())?; + self.ensure_thread()?; + let thread = self.require_thread()?; thread.call(build) } + + fn require_thread(&self) -> Result<&SyncBackendThread, String> { + self.thread + .as_ref() + .ok_or_else(|| "Backend thread is not available".to_string()) + } + + fn ensure_thread(&mut self) -> Result<(), String> { + if self.thread.is_some() { + return Ok(()); + } + + let thread = worker::spawn_thread()?; + self.thread = Some(thread); + + if let Some(logger) = self.logger.clone() { + self.call_result(|response| WorkerCommand::SetLogger { logger, response })?; + } + + Ok(()) + } } impl Drop for LynaBackend { fn drop(&mut self) { - if let Some(mut thread) = self.thread.take() { - let _ = thread.shutdown(Some(WorkerCommand::Shutdown)); - } + self.close_backend(); } } diff --git a/src/addins/mongodb/dependencies.log b/src/addins/mongodb/dependencies.log index c1b7c06391..ef2a43bcd0 100644 --- a/src/addins/mongodb/dependencies.log +++ b/src/addins/mongodb/dependencies.log @@ -1,10 +1,10 @@ "MAIN ---" - linux-vdso.so.1 (0x00007fffb2df3000) - libm.so.6 => /lib64/libm.so.6 (0x0000700ce0a00000) - libpthread.so.0 => /lib64/libpthread.so.0 (0x0000700ce0600000) - libc.so.6 => /lib64/libc.so.6 (0x0000700ce0200000) - libdl.so.2 => /lib64/libdl.so.2 (0x0000700cdfe00000) - /lib64/ld-linux-x86-64.so.2 (0x0000700ce1400000) + linux-vdso.so.1 (0x00007ffe6532d000) + libm.so.6 => /lib64/libm.so.6 (0x0000760f65800000) + libpthread.so.0 => /lib64/libpthread.so.0 (0x0000760f65400000) + libc.so.6 => /lib64/libc.so.6 (0x0000760f65000000) + libdl.so.2 => /lib64/libdl.so.2 (0x0000760f64c00000) + /lib64/ld-linux-x86-64.so.2 (0x0000760f66200000) GLIBC_2.2.5 GLIBC_2.12 GLIBC_2.3 diff --git a/src/addins/mongodb/src/addin.rs b/src/addins/mongodb/src/addin.rs index f40f7bde03..158ec30e7a 100644 --- a/src/addins/mongodb/src/addin.rs +++ b/src/addins/mongodb/src/addin.rs @@ -68,8 +68,8 @@ impl AddIn { } } - pub fn execute(&mut self, params: JanxValue) -> JanxValue { - let mut client = self.lock_client(); + pub fn execute(&self, params: JanxValue) -> JanxValue { + let client = self.lock_client(); match client.execute(params) { Ok(result) => result, Err(e) => janx_error(e), @@ -87,3 +87,9 @@ impl AddIn { self.get_field_ptr(index) as *mut _ } } + +impl Drop for AddIn { + fn drop(&mut self) { + self.lock_client().close_backend(); + } +} diff --git a/src/addins/mongodb/src/backend.rs b/src/addins/mongodb/src/backend.rs index b6f1e01f81..c8e80c5671 100644 --- a/src/addins/mongodb/src/backend.rs +++ b/src/addins/mongodb/src/backend.rs @@ -61,10 +61,7 @@ impl MongoDBBackend { self.ensure_thread()?; - let thread = self - .thread - .as_ref() - .ok_or_else(|| "Backend thread is not available".to_string())?; + let thread = self.require_thread()?; thread .call(|response| WorkerCommand::Connect { @@ -76,14 +73,7 @@ impl MongoDBBackend { } pub fn disconnect(&mut self) -> Result<(), String> { - if !self.is_connected() { - return Err("Connection already closed".to_string()); - } - - let thread = self - .thread - .as_ref() - .ok_or_else(|| "Backend thread is not available".to_string())?; + let thread = self.require_connected()?; thread .call(|response| WorkerCommand::Disconnect { response }) @@ -91,16 +81,8 @@ impl MongoDBBackend { } pub fn execute(&self, params: JanxValue) -> Result { - if !self.is_connected() { - return Err("Connection already closed".to_string()); - } - let execute_params = parse_execute_params(params)?; - - let thread = self - .thread - .as_ref() - .ok_or_else(|| "Backend thread is not available".to_string())?; + let thread = self.require_connected()?; thread.call(|response| WorkerCommand::Execute { params: execute_params, @@ -108,12 +90,25 @@ impl MongoDBBackend { }) } - pub fn close(&mut self) { + pub fn close_backend(&mut self) { if let Some(mut thread) = self.thread.take() { let _ = thread.shutdown(Some(WorkerCommand::Shutdown)); } } + fn require_connected(&self) -> Result<&BackendThread, String> { + if !self.is_connected() { + return Err("Not connected to MongoDB".to_string()); + } + self.require_thread() + } + + fn require_thread(&self) -> Result<&BackendThread, String> { + self.thread + .as_ref() + .ok_or_else(|| "Backend thread is not available".to_string()) + } + fn ensure_thread(&mut self) -> Result<(), String> { if self.thread.is_some() { return Ok(()); @@ -127,6 +122,6 @@ impl MongoDBBackend { impl Drop for MongoDBBackend { fn drop(&mut self) { - self.close(); + self.close_backend(); } } diff --git a/src/ru/BSL/Tests/src/CommonModules/OPI_ПолучениеДанныхТестов/Module.bsl b/src/ru/BSL/Tests/src/CommonModules/OPI_ПолучениеДанныхТестов/Module.bsl index f80fccff8f..19e6f6df02 100644 --- a/src/ru/BSL/Tests/src/CommonModules/OPI_ПолучениеДанныхТестов/Module.bsl +++ b/src/ru/BSL/Tests/src/CommonModules/OPI_ПолучениеДанныхТестов/Module.bsl @@ -169,6 +169,7 @@ Разделы.Вставить("RSS" , 5); Разделы.Вставить("MessagePack" , 5); Разделы.Вставить("Janx" , 5); + Разделы.Вставить("Lua" , 5); Возврат Разделы; @@ -217,6 +218,7 @@ ZMQ = "ZeroMQ"; MsgPack = "MessagePack"; Janx = "Janx"; + Lua = "Lua"; МассивТестов = Новый Массив; @@ -363,8 +365,10 @@ НовыйТест(МассивТестов, МодульТестов, "MYS_РасширеннаяПроверка" , "Расширенная проверка" , MySQL); НовыйТест(МассивТестов, МодульТестов, "MYS_ORM" , "ORM" , MySQL); НовыйТест(МассивТестов, МодульТестов, "MSS_ОсновныеМетоды" , "Основные методы" , MSSQL); + НовыйТест(МассивТестов, МодульТестов, "MSS_РасширеннаяПроверка" , "Расширенная проверка" , MSSQL); НовыйТест(МассивТестов, МодульТестов, "MSS_ORM" , "ORM" , MSSQL); НовыйТест(МассивТестов, МодульТестов, "Mongo_ОсновныеМетоды" , "Основные методы" , MongoDB); + НовыйТест(МассивТестов, МодульТестов, "Mongo_РасширеннаяПроверка" , "Расширенная проверка" , MongoDB); НовыйТест(МассивТестов, МодульТестов, "Mongo_РаботаСБазами" , "Работа с базами" , MongoDB); НовыйТест(МассивТестов, МодульТестов, "Mongo_РаботаСКоллекциями" , "Работа с коллекциями" , MongoDB); НовыйТест(МассивТестов, МодульТестов, "Mongo_РаботаСДокументами" , "Работа с документами" , MongoDB); @@ -424,6 +428,10 @@ НовыйТест(МассивТестов, МодульТестов, "MP_Совместимость" , "Совместимость с эталоном" , MsgPack); НовыйТест(МассивТестов, МодульТестов, "Jnx_Данные" , "Данные" , Janx); НовыйТест(МассивТестов, МодульТестов, "Jnx_Бенчмарк" , "Бенчмарк" , Janx); + НовыйТест(МассивТестов, МодульТестов, "Lua_ОсновныеМетоды" , "Основные методы" , Lua); + НовыйТест(МассивТестов, МодульТестов, "Lua_РаботаСоСкриптами" , "Работа со скриптами" , Lua); + НовыйТест(МассивТестов, МодульТестов, "Lua_РаботаСБайткодом" , "Работа с байткодом" , Lua); + НовыйТест(МассивТестов, МодульТестов, "Lua_РасширеннаяПроверка" , "Расширенная проверка" , Lua); Возврат МассивТестов; @@ -11941,6 +11949,52 @@ КонецФункции +Функция Проверка_MSSQL_Расширенная_ВыполнитьЗапросБезПодключения(Знач Результат, Знач Вариант) + + ОжидаетЧто(Результат["result"]).Равно(Ложь); + ОжидаетЧто(СтрНайти(нРег(Результат["error"]), "not connected") > 0).Равно(Истина); + + Возврат Результат; + +КонецФункции + +Функция Проверка_MSSQL_Расширенная_ПодключениеБезСтроки(Знач Результат, Знач Вариант) + + ОжидаетЧто(Результат["result"]).Равно(Ложь); + ОжидаетЧто(СтрНайти(нРег(Результат["error"]), "empty connection") > 0).Равно(Истина); + + Возврат Результат; + +КонецФункции + +Функция Проверка_MSSQL_Расширенная_ПовторноеПодключение(Знач Результат, Знач Вариант) + + ТекстОшибки = нРег(Результат["error"]); + ЭтоПовтор = СтрНайти(ТекстОшибки, "already") > 0 + Или СтрНайти(ТекстОшибки, "initialized") > 0 + Или СтрНайти(ТекстОшибки, "connected") > 0; + + ОжидаетЧто(Результат["result"]).Равно(Ложь); + ОжидаетЧто(ЭтоПовтор).Равно(Истина); + + Возврат Результат; + +КонецФункции + +Функция Проверка_MSSQL_Расширенная_ПолучитьЛогПриПодключении(Знач Результат, Знач Вариант, ФайлЛога = "") + + ОжидаетЧто(Результат["result"]).Равно(Истина); + ОжидаетЧто(Результат["logs"]).ИмеетТип("Массив"); + ОжидаетЧто(Результат["logs"].Количество() > 0).Равно(Истина); + + ОбъектЛога = Новый Файл(ФайлЛога); + ОжидаетЧто(ОбъектЛога.Существует()).Равно(Истина); + ОжидаетЧто(ОбъектЛога.Размер() > 0).Равно(Истина); + + Возврат Результат; + +КонецФункции + Функция Проверка_MSSQL_СформироватьСтрокуПодключения(Знач Результат, Знач Вариант) ОжидаетЧто(Результат).ИмеетТип("Строка").Заполнено(); @@ -13758,6 +13812,52 @@ КонецФункции +Функция Проверка_MongoDB_Расширенная_ВыполнитьКомандуБезПодключения(Знач Результат, Знач Вариант) + + ОжидаетЧто(Результат["result"]).Равно(Ложь); + ОжидаетЧто(СтрНайти(нРег(Результат["error"]), "not connected") > 0).Равно(Истина); + + Возврат Результат; + +КонецФункции + +Функция Проверка_MongoDB_Расширенная_ПодключениеБезСтроки(Знач Результат, Знач Вариант) + + ОжидаетЧто(Результат["result"]).Равно(Ложь); + ОжидаетЧто(СтрНайти(нРег(Результат["error"]), "empty connection") > 0).Равно(Истина); + + Возврат Результат; + +КонецФункции + +Функция Проверка_MongoDB_Расширенная_ПовторноеПодключение(Знач Результат, Знач Вариант) + + ТекстОшибки = нРег(Результат["error"]); + ЭтоПовтор = СтрНайти(ТекстОшибки, "already") > 0 + Или СтрНайти(ТекстОшибки, "initialized") > 0 + Или СтрНайти(ТекстОшибки, "connected") > 0; + + ОжидаетЧто(Результат["result"]).Равно(Ложь); + ОжидаетЧто(ЭтоПовтор).Равно(Истина); + + Возврат Результат; + +КонецФункции + +Функция Проверка_MongoDB_Расширенная_ПолучитьЛогПриПодключении(Знач Результат, Знач Вариант, ФайлЛога = "") + + ОжидаетЧто(Результат["result"]).Равно(Истина); + ОжидаетЧто(Результат["logs"]).ИмеетТип("Массив"); + ОжидаетЧто(Результат["logs"].Количество() > 0).Равно(Истина); + + ОбъектЛога = Новый Файл(ФайлЛога); + ОжидаетЧто(ОбъектЛога.Существует()).Равно(Истина); + ОжидаетЧто(ОбъектЛога.Размер() > 0).Равно(Истина); + + Возврат Результат; + +КонецФункции + Функция Проверка_MongoDB_СформироватьСтрокуПодключения(Знач Результат, Знач Вариант, Параметры = "") Адрес = "127.0.0.1:1234"; @@ -15494,6 +15594,120 @@ КонецФункции +Функция Проверка_Lua_Расширенная_ОшибкаВыполненияКода(Знач Результат, Знач Вариант) + + ОжидаетЧто(Результат["result"]).Равно(Ложь); + ОжидаетЧто(ЗначениеЗаполнено(Результат["error"])).Равно(Истина); + + Возврат Результат; + +КонецФункции + +Функция Проверка_Lua_Расширенная_ПолучитьЛогБезИнициализации(Знач Результат, Знач Вариант) + + ОжидаетЧто(Результат["result"]).Равно(Ложь); + ОжидаетЧто(СтрНайти(нРег(Результат["error"]), "logger not initialized") > 0).Равно(Истина); + + Возврат Результат; + +КонецФункции + +Функция Проверка_Lua_Расширенная_ПолучитьЛогПриВыполнении(Знач Результат, Знач Вариант, ФайлЛога = "") + + ОжидаетЧто(Результат["result"]).Равно(Истина); + ОжидаетЧто(Результат["logs"]).ИмеетТип("Массив"); + ОжидаетЧто(Результат["logs"].Количество() > 0).Равно(Истина); + + ОбъектЛога = Новый Файл(ФайлЛога); + ОжидаетЧто(ОбъектЛога.Существует()).Равно(Истина); + ОжидаетЧто(ОбъектЛога.Размер() > 0).Равно(Истина); + + Возврат Результат; + +КонецФункции + +Функция Проверка_Lua_СоздатьVM(Знач Результат, Знач Вариант) + + Если Вариант = "LuaJIT" Тогда + ОжидаетЧто(Строка(ТипЗнч(Результат))).Равно("AddIn.OPI_LuaJIT.Main"); + Иначе + ОжидаетЧто(Строка(ТипЗнч(Результат))).Равно("AddIn.OPI_Lua54.Main"); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Функция Проверка_Lua_ЭтоVM(Знач Результат, Знач Вариант) + + Если Вариант = "Lua54" Тогда + ОжидаетЧто(Результат).Равно(Истина); + Иначе + ОжидаетЧто(Результат).Равно(Ложь); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Функция Проверка_Lua_ВыполнитьКодИзСтроки(Знач Результат, Знач Вариант) + + ОжидаетЧто(Результат).Равно(42); + + Возврат Результат; + +КонецФункции + +Функция Проверка_Lua_ВыполнитьКодИзФайла(Знач Результат, Знач Вариант) + + ОжидаетЧто(Результат).Равно(7); + + Возврат Результат; + +КонецФункции + +Функция Проверка_Lua_ВызватьФункцию(Знач Результат, Знач Вариант) + + ОжидаетЧто(Результат).Равно(3); + + Возврат Результат; + +КонецФункции + +Функция Проверка_Lua_СкомпилироватьКодИзСтроки(Знач Результат, Знач Вариант) + + ОжидаетЧто(Результат).ИмеетТип("ДвоичныеДанные"); + ОжидаетЧто(Результат.Размер() > 0).Равно(Истина); + + Возврат Результат; + +КонецФункции + +Функция Проверка_Lua_СкомпилироватьКодИзФайла(Знач Результат, Знач Вариант) + + ОжидаетЧто(Результат).ИмеетТип("ДвоичныеДанные"); + ОжидаетЧто(Результат.Размер() > 0).Равно(Истина); + + Возврат Результат; + +КонецФункции + +Функция Проверка_Lua_ВыполнитьБайтКод(Знач Результат, Знач Вариант) + + ОжидаетЧто(Результат).Равно(11); + + Возврат Результат; + +КонецФункции + +Функция Проверка_Lua_ВыполнитьБайтКодФайла(Знач Результат, Знач Вариант) + + ОжидаетЧто(Результат).Равно(13); + + Возврат Результат; + +КонецФункции + Функция Проверка_Janx_СериализоватьДанные(Знач Результат, Знач Вариант, Восстановленное = Неопределено, ИсходноеЗначение = Неопределено) ОжидаетЧто(ТипЗнч(Результат)).Равно(Тип("ДвоичныеДанные")); diff --git a/src/ru/BSL/Tests/src/CommonModules/OPIt_Lua/Module.bsl b/src/ru/BSL/Tests/src/CommonModules/OPIt_Lua/Module.bsl new file mode 100644 index 0000000000..2350ee6756 --- /dev/null +++ b/src/ru/BSL/Tests/src/CommonModules/OPIt_Lua/Module.bsl @@ -0,0 +1,327 @@ +// OneScript: ./OInt/tests/Modules/OPIt_Lua.os + +// MIT License + +// Copyright (c) 2023-2026 Anton Tsitavets + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: + +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. + +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +// https://github.com/Bayselonarrend/OpenIntegrations + +// Набор тестов для YAxUnit + +// BSLLS:Typo-off +// BSLLS:LatinAndCyrillicSymbolInWord-off +// BSLLS:IncorrectLineBreak-off +// BSLLS:UsingServiceTag-off +// BSLLS:UnusedParameters-off +// BSLLS:DuplicateStringLiteral-off +// BSLLS:UsingHardcodePath-off +// BSLLS:UnusedLocalVariable-off +// BSLLS:DeprecatedMessage-off +// BSLLS:LineLength-off +// BSLLS:MagicNumber-off +// BSLLS:CommentedCode-off +// BSLLS:AssignAliasFieldsInQuery-off +// BSLLS:UsingHardcodeNetworkAddress-off +// BSLLS:UnreachableCode-off +// BSLLS:UnusedLocalMethod-off +// BSLLS:NestedFunctionInParameters-off +// BSLLS:MissingTemporaryFileDeletion-off +// BSLLS:UsingSynchronousCalls-off +// BSLLS:MagicDate-off +// BSLLS:MissingParameterDescription-off +// BSLLS:NumberOfOptionalParams-off +// BSLLS:MethodSize-off +// BSLLS:NestedConstructorsInStructureDeclaration-off +// BSLLS:NumberOfValuesInStructureConstructor-off +// BSLLS:UsingHardcodeSecretInformation-off +// BSLLS:SpaceAtStartComment-off + +//@skip-check undefined-variable +//@skip-check wrong-string-literal-content +//@skip-check module-structure-top-region +//@skip-check module-structure-method-in-regions +//@skip-check undefined-function-or-procedure +//@skip-check module-unused-local-variable +//@skip-check bsl-legacy-check-string-literal +//@skip-check bsl-legacy-check-method-for-statements-after-return +//@skip-check missing-temporary-file-deletion +//@skip-check module-unused-method + +// #Использовать oint +// #Использовать asserts +// #Использовать "internal" + +#Если Не ВебКлиент Тогда // !OPI + +// Для YaxUnit + +Процедура ИсполняемыеСценарии() Экспорт + + OPI_ПолучениеДанныхТестов.СформироватьТестыЯкс("Lua"); + +КонецПроцедуры + +// Для Asserts + +Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт + + Возврат OPI_ПолучениеДанныхТестов.СформироватьТестыАссертс("Lua"); + +КонецФункции + +#Область СлужебныйПрограммныйИнтерфейс + +#Область ЗапускаемыеТесты + +#Область Lua + +Процедура Lua_ОсновныеМетоды() Экспорт + + Lua_СоздатьVM(); + Lua_ЭтоVM(); + +КонецПроцедуры + +Процедура Lua_РаботаСоСкриптами() Экспорт + + Lua_ВыполнитьКодИзСтроки(); + Lua_ВыполнитьКодИзФайла(); + Lua_ВызватьФункцию(); + +КонецПроцедуры + +Процедура Lua_РаботаСБайткодом() Экспорт + + Lua_СкомпилироватьКодИзСтроки(); + Lua_СкомпилироватьКодИзФайла(); + Lua_ВыполнитьБайтКод(); + Lua_ВыполнитьБайтКодФайла(); + +КонецПроцедуры + +Процедура Lua_РасширеннаяПроверка() Экспорт + + OPI_ПолучениеДанныхТестов.УстановитьПризнакТестаCLI(Ложь); + + Если OPI_ПолучениеДанныхТестов.ЭтоТестCLI() Тогда + Сообщить("CLI SKIP"); + Возврат; + КонецЕсли; + + Lua_Расширенная_ОшибкаВыполненияКода(); + Lua_Расширенная_ПолучитьЛогБезИнициализации(); + Lua_Расширенная_ПолучитьЛогПриВыполнении(); + +КонецПроцедуры + +#КонецОбласти // Lua + +#КонецОбласти // ЗапускаемыеТесты + +#КонецОбласти // СлужебныйПрограммныйИнтерфейс + +#Область СлужебныеПроцедурыИФункции + +#Область АтомарныеТесты + +#Область Lua + +Процедура Lua_СоздатьVM() + + Результат = OPI_Lua.СоздатьVM("Lua54"); + + // END + + OPI_ПолучениеДанныхТестов.Обработать(Результат, "Lua", "СоздатьVM", "Lua54"); + + Результат = OPI_Lua.СоздатьVM("LuaJIT"); + + OPI_ПолучениеДанныхТестов.Обработать(Результат, "Lua", "СоздатьVM", "LuaJIT"); + +КонецПроцедуры + +Процедура Lua_ЭтоVM() + + VM54 = OPI_Lua.СоздатьVM("Lua54"); + + Результат = OPI_Lua.ЭтоVM(VM54); + + OPI_ПолучениеДанныхТестов.Обработать(Результат, "Lua", "ЭтоVM", "Lua54"); // SKIP + + Результат = OPI_Lua.ЭтоVM("not a vm"); + + // END + + OPI_ПолучениеДанныхТестов.Обработать(Результат, "Lua", "ЭтоVM", "Ложь"); + +КонецПроцедуры + +Процедура Lua_ВыполнитьКодИзСтроки() + + Результат = OPI_Lua.ВыполнитьКодИзСтроки("Lua54", "return 42"); + + // END + + OPI_ПолучениеДанныхТестов.Обработать(Результат, "Lua", "ВыполнитьКодИзСтроки"); + +КонецПроцедуры + +Процедура Lua_ВыполнитьКодИзФайла() + + ФайлСкрипта = ПолучитьИмяВременногоФайла("lua"); + Запись = Новый ЗаписьТекста(ФайлСкрипта, КодировкаТекста.UTF8); + Запись.Записать("return 7"); + Запись.Закрыть(); + + Результат = OPI_Lua.ВыполнитьКодИзФайла("Lua54", ФайлСкрипта); + + // END + + OPI_ПолучениеДанныхТестов.Обработать(Результат, "Lua", "ВыполнитьКодИзФайла"); + +КонецПроцедуры + +Процедура Lua_ВызватьФункцию() + + VM = OPI_Lua.СоздатьVM("Lua54"); + + OPI_Lua.ВыполнитьКодИзСтроки(VM, "function add(a, b) return a + b end"); + + Параметры = Новый Массив; + Параметры.Добавить(1); + Параметры.Добавить(2); + + Результат = OPI_Lua.ВызватьФункцию(VM, "add", Параметры); + + // END + + OPI_ПолучениеДанныхТестов.Обработать(Результат, "Lua", "ВызватьФункцию"); + +КонецПроцедуры + +Процедура Lua_СкомпилироватьКодИзСтроки() + + Результат = OPI_Lua.СкомпилироватьКодИзСтроки("Lua54", "return 1"); + + // END + + OPI_ПолучениеДанныхТестов.Обработать(Результат, "Lua", "СкомпилироватьКодИзСтроки"); + +КонецПроцедуры + +Процедура Lua_СкомпилироватьКодИзФайла() + + ФайлСкрипта = ПолучитьИмяВременногоФайла("lua"); + Запись = Новый ЗаписьТекста(ФайлСкрипта, КодировкаТекста.UTF8); + Запись.Записать("return 3"); + Запись.Закрыть(); + + Результат = OPI_Lua.СкомпилироватьКодИзФайла("Lua54", ФайлСкрипта); + + // END + + OPI_ПолучениеДанныхТестов.Обработать(Результат, "Lua", "СкомпилироватьКодИзФайла"); + +КонецПроцедуры + +Процедура Lua_ВыполнитьБайтКод() + + БайтКод = OPI_Lua.СкомпилироватьКодИзСтроки("Lua54", "return 11"); + Результат = OPI_Lua.ВыполнитьБайтКод("Lua54", БайтКод); + + // END + + OPI_ПолучениеДанныхТестов.Обработать(Результат, "Lua", "ВыполнитьБайтКод"); + +КонецПроцедуры + +Процедура Lua_ВыполнитьБайтКодФайла() + + ФайлСкрипта = ПолучитьИмяВременногоФайла("lua"); + Запись = Новый ЗаписьТекста(ФайлСкрипта, КодировкаТекста.UTF8); + Запись.Записать("return 13"); + Запись.Закрыть(); + + ФайлБайтКода = ПолучитьИмяВременногоФайла("bin"); + БайтКод = OPI_Lua.СкомпилироватьКодИзФайла("Lua54", ФайлСкрипта); + + ЗаписьБин = Новый ЗаписьДвоичныхДанных(ФайлБайтКода); + ЗаписьБин.Записать(БайтКод); + ЗаписьБин.Закрыть(); + + Результат = OPI_Lua.ВыполнитьБайтКодФайла("Lua54", ФайлБайтКода); + + // END + + OPI_ПолучениеДанныхТестов.Обработать(Результат, "Lua", "ВыполнитьБайтКодФайла"); + +КонецПроцедуры + +#Область РасширеннаяПроверка + +Процедура Lua_Расширенная_ОшибкаВыполненияКода() + + Компонента = OPI_Компоненты.ПолучитьКомпоненту("Lua54"); + Результат = OPI_Компоненты.ДесериализоватьJanx(Компонента.ExecuteString("syntax error !!!")); + + // END + + OPI_ПолучениеДанныхТестов.Обработать(Результат, "Lua", "Расширенная_ОшибкаВыполненияКода"); + +КонецПроцедуры + +Процедура Lua_Расширенная_ПолучитьЛогБезИнициализации() + + Компонента = OPI_Lua.СоздатьVM("Lua54"); + Результат = OPI_Компоненты.ДесериализоватьJanx(Компонента.GetLogs(10)); + + // END + + OPI_ПолучениеДанныхТестов.Обработать(Результат, "Lua", "Расширенная_ПолучитьЛогБезИнициализации"); + +КонецПроцедуры + +Процедура Lua_Расширенная_ПолучитьЛогПриВыполнении() + + ФайлЛога = ПолучитьИмяВременногоФайла("txt"); + НастройкиЛогирования = OPI_Компоненты.ПолучитьНастройкиЛогирования(Истина, 100, ФайлЛога); + + VM = OPI_Lua.СоздатьVM("Lua54", НастройкиЛогирования); + + OPI_Lua.ВыполнитьКодИзСтроки(VM, "return 1"); + + Результат = OPI_Компоненты.ДесериализоватьJanx(VM.GetLogs(10)); + + // END + + OPI_ПолучениеДанныхТестов.Обработать(Результат, "Lua", "Расширенная_ПолучитьЛогПриВыполнении", , ФайлЛога); + +КонецПроцедуры + +#КонецОбласти // РасширеннаяПроверка + +#КонецОбласти // Lua + +#КонецОбласти // АтомарныеТесты + +#КонецОбласти // СлужебныеПроцедурыИФункции + +#КонецЕсли // !OPI diff --git a/src/ru/BSL/Tests/src/CommonModules/OPIt_Lua/OPIt_Lua.mdo b/src/ru/BSL/Tests/src/CommonModules/OPIt_Lua/OPIt_Lua.mdo new file mode 100644 index 0000000000..6296c8bbc8 --- /dev/null +++ b/src/ru/BSL/Tests/src/CommonModules/OPIt_Lua/OPIt_Lua.mdo @@ -0,0 +1,12 @@ + + + OPIt_Lua + + ru + Lua + + true + true + true + true + diff --git a/src/ru/BSL/Tests/src/CommonModules/OPIt_MongoDB/Module.bsl b/src/ru/BSL/Tests/src/CommonModules/OPIt_MongoDB/Module.bsl index 2bf993f84e..ae7b48af4f 100644 --- a/src/ru/BSL/Tests/src/CommonModules/OPIt_MongoDB/Module.bsl +++ b/src/ru/BSL/Tests/src/CommonModules/OPIt_MongoDB/Module.bsl @@ -114,6 +114,28 @@ КонецПроцедуры +Процедура Mongo_РасширеннаяПроверка() Экспорт + + OPI_ПолучениеДанныхТестов.УстановитьПризнакТестаCLI(Ложь); + + Если OPI_ПолучениеДанныхТестов.ЭтоТестCLI() Тогда + Сообщить("CLI SKIP"); + Возврат; + КонецЕсли; + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("MongoDB_Port" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("MongoDB_User" , ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("MongoDB_Password", ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("MongoDB_DB" , ПараметрыТеста); + + MongoDB_Расширенная_ВыполнитьКомандуБезПодключения(ПараметрыТеста); + MongoDB_Расширенная_ПодключениеБезСтроки(ПараметрыТеста); + MongoDB_Расширенная_ПовторноеПодключение(ПараметрыТеста); + MongoDB_Расширенная_ПолучитьЛогПриПодключении(ПараметрыТеста); + +КонецПроцедуры + Процедура Mongo_РаботаСБазами() Экспорт ПараметрыТеста = Новый Структура; @@ -376,6 +398,93 @@ КонецПроцедуры +#Область РасширеннаяПроверка + +Процедура MongoDB_Расширенная_ВыполнитьКомандуБезПодключения(ПараметрыФункции) + + Коннектор = OPI_Компоненты.ПолучитьКомпоненту("MongoDB"); + Результат = OPI_MongoDB.ВыполнитьКоманду(Коннектор, "listDatabases"); + + // END + + OPI_ПолучениеДанныхТестов.Обработать(Результат, "MongoDB", "Расширенная_ВыполнитьКомандуБезПодключения"); + +КонецПроцедуры + +Процедура MongoDB_Расширенная_ПодключениеБезСтроки(ПараметрыФункции) + + Коннектор = OPI_Компоненты.ПолучитьКомпоненту("MongoDB"); + Результат = OPI_Компоненты.ДесериализоватьJanx(Коннектор.Connect()); + + // END + + OPI_ПолучениеДанныхТестов.Обработать(Результат, "MongoDB", "Расширенная_ПодключениеБезСтроки"); + +КонецПроцедуры + +Процедура MongoDB_Расширенная_ПовторноеПодключение(ПараметрыФункции) + + Адрес = "127.0.0.1:1234"; + Логин = ПараметрыФункции["MongoDB_User"]; + Пароль = ПараметрыФункции["MongoDB_Password"]; + База = ПараметрыФункции["MongoDB_DB"]; + + Адрес = OPI_ПолучениеДанныхТестов.ПолучитьLocalhost() + ":" + ПараметрыФункции["MongoDB_Port"]; + + ПараметрыПодключения = Новый Структура("authSource", "admin"); + СтрокаПодключения = OPI_MongoDB.СформироватьСтрокуПодключения(Адрес, База, Логин, Пароль, ПараметрыПодключения); + + Коннектор = OPI_Компоненты.ПолучитьКомпоненту("MongoDB"); + + Коннектор.ConnectionString = СтрокаПодключения; + ПервоеПодключение = OPI_Компоненты.ДесериализоватьJanx(Коннектор.Connect()); + + Если Не ПервоеПодключение["result"] Тогда + ВызватьИсключение OPI_Инструменты.JSONСтрокой(ПервоеПодключение); + КонецЕсли; + + Результат = OPI_Компоненты.ДесериализоватьJanx(Коннектор.Connect()); + + // END + + OPI_ПолучениеДанныхТестов.Обработать(Результат, "MongoDB", "Расширенная_ПовторноеПодключение"); + OPI_MongoDB.ЗакрытьСоединение(Коннектор); + +КонецПроцедуры + +Процедура MongoDB_Расширенная_ПолучитьЛогПриПодключении(ПараметрыФункции) + + ФайлЛога = ПолучитьИмяВременногоФайла("txt"); + НастройкиЛогирования = OPI_MongoDB.ПолучитьНастройкиЛогирования(Истина, 100, ФайлЛога); + + Адрес = "127.0.0.1:1234"; + Логин = ПараметрыФункции["MongoDB_User"]; + Пароль = ПараметрыФункции["MongoDB_Password"]; + + Адрес = OPI_ПолучениеДанныхТестов.ПолучитьLocalhost() + ":" + ПараметрыФункции["MongoDB_Port"]; + + ПараметрыПодключения = Новый Структура("authSource", "admin"); + СтрокаПодключения = OPI_MongoDB.СформироватьСтрокуПодключения(Адрес, , Логин, Пароль, ПараметрыПодключения); + + Соединение = OPI_MongoDB.ОткрытьСоединение(СтрокаПодключения, НастройкиЛогирования); + + Если Не OPI_MongoDB.ЭтоКоннектор(Соединение) Тогда + ВызватьИсключение OPI_Инструменты.JSONСтрокой(Соединение); + КонецЕсли; + + OPI_MongoDB.ВыполнитьКоманду(Соединение, "listDatabases", , , Новый Структура("nameOnly", Истина)); + + Результат = OPI_MongoDB.ПолучитьЛог(Соединение); + + // END + + OPI_ПолучениеДанныхТестов.Обработать(Результат, "MongoDB", "Расширенная_ПолучитьЛогПриПодключении", , ФайлЛога); + OPI_MongoDB.ЗакрытьСоединение(Соединение); + +КонецПроцедуры + +#КонецОбласти // РасширеннаяПроверка + Процедура MongoDB_ПолучитьБазуДанных(ПараметрыФункции) Адрес = "127.0.0.1:1234"; diff --git a/src/ru/BSL/Tests/src/Configuration/Configuration.mdo b/src/ru/BSL/Tests/src/Configuration/Configuration.mdo index b3baea565f..a73070a908 100644 --- a/src/ru/BSL/Tests/src/Configuration/Configuration.mdo +++ b/src/ru/BSL/Tests/src/Configuration/Configuration.mdo @@ -36,6 +36,7 @@ CommonModule.OPIt_GRPC CommonModule.OPIt_HTTP CommonModule.OPIt_Janx + CommonModule.OPIt_Lua CommonModule.OPIt_MessagePack CommonModule.OPIt_MongoDB CommonModule.OPIt_MSSQL