1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2026-06-09 23:56:48 +02:00

Рефакторинг mongodb и lua

This commit is contained in:
Anton Titovets
2026-06-03 18:46:39 +03:00
parent 4afd617ccf
commit d23bbcb072
11 changed files with 786 additions and 85 deletions
+6 -7
View File
@@ -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
+33 -19
View File
@@ -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<u8>) -> 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<Vec<u8>, 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<Vec<u8>, 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<u8>) -> 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<u8>) -> 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();
}
}
+52 -28
View File
@@ -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<u8>) -> JanxValue {
pub fn execute_bytecode(&mut self, bytecode: Vec<u8>) -> 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<Vec<u8>, String> {
pub fn compile_to_bytecode(&mut self, code: String) -> Result<Vec<u8>, String> {
self.call_binary(|response| WorkerCommand::CompileToBytecode { code, response })
}
pub fn compile_file_to_bytecode(&self, path: String) -> Result<Vec<u8>, String> {
pub fn compile_file_to_bytecode(&mut self, path: String) -> Result<Vec<u8>, String> {
self.call_binary(|response| WorkerCommand::CompileFileToBytecode { path, response })
}
pub fn call_function(&self, function_name: String, args_janx: Vec<u8>) -> JanxValue {
pub fn call_function(&mut self, function_name: String, args_janx: Vec<u8>) -> 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<u8>) -> JanxValue {
pub fn set_global(&mut self, variable_name: String, value_janx: Vec<u8>) -> 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<String>, usize)> {
@@ -111,7 +112,13 @@ impl LynaBackend {
})
}
fn call<F>(&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<F>(&mut self, build: F) -> JanxValue
where
F: FnOnce(Sender<JanxValue>) -> WorkerCommand,
{
@@ -121,37 +128,54 @@ impl LynaBackend {
}
}
fn call_binary<F>(&self, build: F) -> Result<Vec<u8>, String>
fn call_binary<F>(&mut self, build: F) -> Result<Vec<u8>, String>
where
F: FnOnce(Sender<Result<Vec<u8>, String>>) -> WorkerCommand,
{
self.call_thread(build).and_then(|result| result)
}
fn call_result<F>(&self, build: F) -> Result<(), String>
fn call_result<F>(&mut self, build: F) -> Result<(), String>
where
F: FnOnce(Sender<Result<(), String>>) -> WorkerCommand,
{
self.call_thread(build).and_then(|result| result)
}
fn call_thread<T, F>(&self, build: F) -> Result<T, String>
fn call_thread<T, F>(&mut self, build: F) -> Result<T, String>
where
T: Send,
F: FnOnce(Sender<T>) -> 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<WorkerCommand>, 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();
}
}
+6 -6
View File
@@ -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
+8 -2
View File
@@ -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();
}
}
+18 -23
View File
@@ -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<JanxValue, String> {
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<WorkerCommand>, String> {
if !self.is_connected() {
return Err("Not connected to MongoDB".to_string());
}
self.require_thread()
}
fn require_thread(&self) -> Result<&BackendThread<WorkerCommand>, 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();
}
}
@@ -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_СериализоватьДанные(Знач Результат, Знач Вариант, Восстановленное = Неопределено, ИсходноеЗначение = Неопределено)
ОжидаетЧто(ТипЗнч(Результат)).Равно(Тип("ДвоичныеДанные"));
+327
View File
@@ -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
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="a8f3c2e1-4b5d-4a9e-8c7f-1d2e3f4a5b6c">
<name>OPIt_Lua</name>
<synonym>
<key>ru</key>
<value>Lua</value>
</synonym>
<clientManagedApplication>true</clientManagedApplication>
<server>true</server>
<externalConnection>true</externalConnection>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>
@@ -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";
@@ -36,6 +36,7 @@
<commonModules>CommonModule.OPIt_GRPC</commonModules>
<commonModules>CommonModule.OPIt_HTTP</commonModules>
<commonModules>CommonModule.OPIt_Janx</commonModules>
<commonModules>CommonModule.OPIt_Lua</commonModules>
<commonModules>CommonModule.OPIt_MessagePack</commonModules>
<commonModules>CommonModule.OPIt_MongoDB</commonModules>
<commonModules>CommonModule.OPIt_MSSQL</commonModules>