diff options
| author | pengxuanzheng <[email protected]> | 2020-08-24 17:10:55 +0800 |
|---|---|---|
| committer | pengxuanzheng <[email protected]> | 2020-08-24 17:10:55 +0800 |
| commit | 503f4af4d8514913eb2ad0405b557abfd4326976 (patch) | |
| tree | 5dd4f67e39f543c1cb1e2048eae0c0f720691c58 | |
Initial commit
75 files changed, 5482 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c5c1890 --- /dev/null +++ b/.gitignore @@ -0,0 +1,42 @@ +CMakeCache.txt +CMakeCCompiler.cmake +CMakeCXXCompiler.cmake +CMakeDetermineCompilerABI_C.bin +CMakeDetermineCompilerABI_CXX.bin +CMakeSystem.cmake +CMakeCCompilerId.c +a.out +CMakeCXXCompilerId.cpp +CMakeDirectoryInformation.cmake +CMakeOutput.log +Makefile.cmake +Makefile2 +TargetDirectories.txt +CXX.includecache +DependInfo.cmake +build.make +cmake_clean.cmake +depend.internal +depend.make +flags.make +handle_weixinnum.cpp.o +link.txt +progress.make +cmake_clean_target.cmake +cmake.check_cache +feature_tests.bin +feature_tests.c +feature_tests.cxx +handle_fasta_count.cpp.o +handle_fasta_find.cpp.o +progress.marks +Makefile +cmake_install.cmake +libc_handle_weixinnum.a +libc_handle_weixinnum.so +libhandle_fasta_count.a +libhandle_fasta_count.so +libhandle_fasta_find.a +libhandle_fasta_find.so +luatest +tags diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt new file mode 100644 index 0000000..f696207 --- /dev/null +++ b/example/CMakeLists.txt @@ -0,0 +1,14 @@ +cmake_minimum_required(VERSION 3.5) +project (single_thread) +project (multithread) + +link_directories("/root/workspace/tsg_lua_0.99/lib") +link_libraries(tsglua pthread) + +add_definitions(-g -W -Wall) + +add_executable(single_thread single_thread.cpp) +add_executable(multithread multithread.cpp) +target_link_libraries(single_thread tsglua) +target_link_libraries(multithread tsglua) + diff --git a/example/multithread b/example/multithread Binary files differnew file mode 100755 index 0000000..d7d9dbd --- /dev/null +++ b/example/multithread diff --git a/example/multithread.cpp b/example/multithread.cpp new file mode 100644 index 0000000..26b45ec --- /dev/null +++ b/example/multithread.cpp @@ -0,0 +1,265 @@ +/************************************************************************* + > File Name: main.c + > Author: pxz + > Mail: [email protected] + > Created Time: Thu 09 Jul 2020 07:08:40 AM CST + ************************************************************************/ +extern "C" +{ + #include<stdio.h> + #include<stdlib.h> + #include<string.h> + #include<pthread.h> + #include<unistd.h> + #include<time.h> +} +#include"../include/tsg_lua_interface.h" +#ifndef MAX_THREAD_NUM +#define MAX_THREAD_NUM 9 +#endif +#define MAX_SCRIPT_NUM 3 +#define SCRIPT_NO_CACHE -1 + +typedef struct lua_script_info_s{ + const char *script_data; + int script_len; + int script_id; +}lua_script_info_t; + +typedef struct lua_data_s{ + char data[1024]; + int data_len; +}lua_data_t; + +typedef struct{ + lua_data_t data; + int thread_id; +}userdata_t; + + +/* 存储脚本以及脚本id */ +#define SCRIPT_PROTOCOL_RECOGNITION "./script/protocol_recognition.lua" +#define SCRIPT_COUNT_1 "./script/count_1.lua" +#define SCRIPT_MATCH_12345 "./script/match_12345.lua" + +void debuginfo(int thread_id, char *out, int out_len, int out_type) +{ + printf("[C][thread_id:%d]output.len:%d\n", thread_id, out_len); + printf("[C][thread_id:%d]output.type:%d\n", thread_id, out_type); + switch(out_type) + { + case STRING: + printf("[C][thread_id:%d]output.data:%s\n", thread_id, out); + break; + case BOOLEAN: + printf("[C][thread_id:%d]outpt.data:%d\n", thread_id, out[0]); + break; + case INTEGER: + printf("[C][thread_id:%d]outpt.data:%ld\n", thread_id, *(long int *)out); + break; + default: + + break; + } + return; +} + +void *lua_function(void *ptr) +{ + int ret; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + memset(out, 0, 255); + tsg_lua_handle L = NULL; + + userdata_t *userdata = (userdata_t *)ptr; + lua_data_t *data = &userdata->data; + int thread_id = userdata->thread_id; + + lua_script_info_t script_info[MAX_SCRIPT_NUM] = + { + {SCRIPT_PROTOCOL_RECOGNITION, (int)strlen(SCRIPT_PROTOCOL_RECOGNITION), SCRIPT_NO_CACHE}, + {SCRIPT_COUNT_1, (int)strlen(SCRIPT_COUNT_1), SCRIPT_NO_CACHE}, + {SCRIPT_MATCH_12345, (int)strlen(SCRIPT_MATCH_12345), SCRIPT_NO_CACHE}, + }; + + printf("[C][thread_id:%d]:tsg_lua_vm_create start...\n", thread_id); + L = tsg_lua_vm_create(); + if (L == NULL) + { + printf("[C][thread_id:%d]:tsg_lua_vm_create failed...\n", thread_id); + return (void *)"lua vm create failed"; + } + printf("[C][thread_id:%d]:lua:%p ...\n", thread_id, L); + printf("[C][thread_id:%d]:tsg_lua_vm_create success...\n", thread_id); + + printf("[C][thread_id:%d]:tsg_lua_exec_file start...\n", thread_id); + ret = tsg_lua_exec_file(L, script_info[0].script_data, data->data, data->data_len, out, &out_len, &out_type); + if(ret < 0) + { + printf("[C][thread_id:%d]:tsg_lua_exec_file failed...\n", thread_id); + return (void *)"exec failed"; + } + debuginfo(thread_id, out, out_len, out_type); + printf("[C][thread_id:%d]:tsg_lua_exec_file success...\n", thread_id); + + printf("[C][thread_id:%d]:tsg_lua_cache_script_file start...\n", thread_id); + script_info[1].script_id = tsg_lua_cache_script_file(L, script_info[1].script_data); + if (script_info[1].script_id < 0) + { + printf("[C][thread_id:%d]:tsg_lua_cache_script_file failed...\n", thread_id); + return (void *)"cache script failed"; + } + printf("[C][thread_id:%d]:script_id:%d ...\n", thread_id, script_info[1].script_id); + printf("[C][thread_id:%d]:tsg_lua_cache_script_file success...\n", thread_id); + + printf("[C][thread_id:%d]:tsg_lua_cache_exec start...\n", thread_id); + ret = tsg_lua_cache_exec(L, script_info[1].script_id, data->data, data->data_len, out, &out_len, &out_type); + if(ret < 0) + { + printf("[C][thread_id:%d]:tsg_lua_cache_exec failed...\n", thread_id); + return (void *)"cache exec failed"; + } + debuginfo(thread_id, out, out_len, out_type); + printf("[C][thread_id:%d]:tsg_lua_cache_exec success...\n", thread_id); + + printf("[C][thread_id:%d]:tsg_lua_cache_script_file start...\n", thread_id); + script_info[2].script_id = tsg_lua_cache_script_file(L, script_info[2].script_data); + if (script_info[2].script_id < 0) + { + printf("[C][thread_id:%d]:tsg_lua_cache_script_file failed...\n", thread_id); + return (void *)"cache script failed"; + } + printf("[C][thread_id:%d]:script_id:%d ...\n", thread_id, script_info[2].script_id); + printf("[C][thread_id:%d]:tsg_lua_cache_script_file success...\n", thread_id); + + printf("[C][thread_id:%d]:tsg_lua_cache_exec start...\n", thread_id); + ret = tsg_lua_cache_exec(L, script_info[2].script_id, data->data, data->data_len, out, &out_len, &out_type); + if(ret < 0) + { + printf("[C][thread_id:%d]:tsg_lua_cache_exec failed...\n", thread_id); + return (void *)"cache exec failed"; + } + debuginfo(thread_id, out, out_len, out_type); + printf("[C][thread_id:%d]:tsg_lua_cache_exec success...\n", thread_id); + + printf("[C][thread_id:%d]:tsg_lua_uncache_script start...\n", thread_id); + ret = tsg_lua_uncache_script(L, script_info[1].script_id); + if(ret < 0) + { + printf("[C][thread_id:%d]:tsg_lua_uncache_script failed...\n", thread_id); + return (void *)"uncache script failed"; + } + printf("[C][thread_id:%d]:tsg_uncache_script success...\n", thread_id); + + printf("[C][thread_id:%d]:tsg_lua_uncache_script start...\n", thread_id); + ret = tsg_lua_uncache_script(L, script_info[2].script_id); + if(ret < 0) + { + printf("[C][thread_id:%d]:tsg_lua_uncache_script failed...\n", thread_id); + return (void *)"uncache script failed"; + } + printf("[C][thread_id:%d]:tsg_uncache_script success...\n", thread_id); + + printf("[C][thread_id:%d]:tsg_destory_lua start...\n", thread_id); + ret = tsg_destory_lua(L); + if(ret < 0) + { + printf("[C][thread_id:%d]:tsg_destory_lua failed...\n", thread_id); + return (void *)"uncache script failed"; + } + printf("[C][thread_id:%d]:tsg_destory_lua success...\n", thread_id); + pthread_exit((void *)"OK"); +} + + +int main(int argc, char *argv[]) +{ + int thread_num; + pthread_t thread[MAX_THREAD_NUM] = {0}; + int thread_sum; + int ch, i; + char buf[1024]; + int buf_len; + userdata_t userdata[MAX_THREAD_NUM] = {0}; + lua_data_t *data = NULL; + char *retval; + +#ifndef MIN +#define MIN(a, b) ((a) > (b) ?(b):(a)) +#endif + + /* default */ + thread_sum = 3; + strcpy(buf, "this is tcp"); + buf_len = strlen("this is tcp"); + + while((ch = getopt(argc, argv, "t:s:b:d:h")) != -1) + { + switch(ch) + { + case 't': + thread_sum = atoi(optarg); + if (thread_sum > MAX_THREAD_NUM) + { + printf("MAX_THREAD_NUM is %d\n",MAX_THREAD_NUM); + thread_sum = MAX_THREAD_NUM; + } + break; + case 's': + buf_len = MIN(1024, strlen(optarg)); + strncpy(buf, optarg, buf_len); + buf[buf_len] = '\0'; + break; + case 'b': + buf_len = MIN(1024, strlen(optarg)); + for (i = 0; i < buf_len; i++) + { + if ((optarg[i] != '0') && (optarg[i] != '1')) + { + printf("error: input wrong\n"); + return -1; + } + buf[i] = optarg[i] - '0'; + } + break; + case 'd': + buf_len = MIN(1024, strlen(optarg)); + for (i = 0; i < buf_len; i++) + { + if ((optarg[i] < '0') && (optarg[i] > '9')) + { + printf("error: input wrong\n"); + return -1; + } + buf[i] = optarg[i] - '0'; + } + break; + case 'h': + default: + printf("usage: multithread [-t set thread num] [-s input string] [-b input bin] [-d input integer] [-h show help info]\n"); + return -1; + break; + } + } + + for (thread_num = 0; thread_num < thread_sum; thread_num++) + { + userdata[thread_num].thread_id = thread_num; + data = &userdata[thread_num].data; + memcpy(data->data, buf, buf_len); + data->data_len = buf_len; + data->data[buf_len] = thread_num; + data->data_len++; + pthread_create(&thread[thread_num], NULL, lua_function, (void *)&userdata[thread_num]); + } + + for (thread_num = 0; thread_num < thread_sum; thread_num++) + { + pthread_join(thread[thread_num], (void **)&retval); + printf("[C][thread_id:%d]: %s\n", thread_num, retval); + } + + return 0; +} diff --git a/example/script/count_1.lua b/example/script/count_1.lua new file mode 100644 index 0000000..21e5091 --- /dev/null +++ b/example/script/count_1.lua @@ -0,0 +1,16 @@ +local str = tsg.data +local len = string.len(str) +local thread_id = string.byte(str, len) +local str = string.format("[lua][thread_id:%d][count_1.lua]:str:%s, len:%d", thread_id, str, len - 1) +print(str) +local cnt = 0 +local i = 0 +for i = 0, len - 1 do + --print(i, string.byte(str, i), cnt) + if string.byte(str, i) == 1 then + cnt = cnt + 1 + end +end +str = string.format("[lua][thread_id:%d][count_1.lua]:return %d, %s", thread_id, 8, cnt) +print(str) +return 8, cnt diff --git a/example/script/find_1.lua b/example/script/find_1.lua new file mode 100644 index 0000000..2c6e865 --- /dev/null +++ b/example/script/find_1.lua @@ -0,0 +1,13 @@ +local data = tsg.data +local data_len = string.len(data) +local str = string.format("[lua]:data:%s len:%d", data, data_len) +print(str) +for i = 1, data_len do + if string.byte(data, i) == 1 then + str = string.format("[lua]:return %d, %d", 8, i) + print(str); + return 8, i + end +end +return 1, true + diff --git a/example/script/find_1.luajit b/example/script/find_1.luajit Binary files differnew file mode 100644 index 0000000..b558ed1 --- /dev/null +++ b/example/script/find_1.luajit diff --git a/example/script/find_1_b.lua b/example/script/find_1_b.lua Binary files differnew file mode 100644 index 0000000..d04801f --- /dev/null +++ b/example/script/find_1_b.lua diff --git a/example/script/find_hello.lua b/example/script/find_hello.lua new file mode 100644 index 0000000..89037c0 --- /dev/null +++ b/example/script/find_hello.lua @@ -0,0 +1,8 @@ +local ss = tsg.data +print("[lua]:the parameter of lua function is '"..ss.."'") +print("[lua]:start find 'hello'...") +local index_s, index_e = string.find(ss, 'hello') +local str = 'find!' +print("[lua]:result, start at", index_s, ", end at",index_e) +print("[lua]: return ", string.len(str), str) +return string.len(str), str diff --git a/example/script/find_hello.luajit b/example/script/find_hello.luajit Binary files differnew file mode 100644 index 0000000..ba644ec --- /dev/null +++ b/example/script/find_hello.luajit diff --git a/example/script/match_12345.lua b/example/script/match_12345.lua new file mode 100644 index 0000000..c795bd3 --- /dev/null +++ b/example/script/match_12345.lua @@ -0,0 +1,24 @@ +local str = tsg.data +local len = string.len(str) +local thread_id = string.byte(str, len) +local str = string.format("[lua][thread_id:%d][match_12345.lua]:str:%s, len:%d", thread_id, str, len - 1) +print(str) +local i = 0 +for i = 1, string.len(str) do + if string.byte(str, i) == 1 then + if string.byte(str, i + 1) == 2 then + if string.byte(str, i + 2) == 3 then + if string.byte(str, i + 3) == 4 then + if string.byte(str, i + 4) == 5 then + local str = string.format("[lua][thread_id:%d][match_12345.lua]:return %d, %s", thread_id, 1, "true") + print(str) + return 1, true + end + end + end + end + end +end +local str = string.format("[lua][thread_id:%d][match_12345.lua]:return %d, %s", thread_id, 1, "false") +print(str) +return 1, false diff --git a/example/script/print_hello.lua b/example/script/print_hello.lua new file mode 100644 index 0000000..ee823e7 --- /dev/null +++ b/example/script/print_hello.lua @@ -0,0 +1,5 @@ +local str = tsg.data +print("-----------") +print("str") +print("-----------") +return string.len(str), str diff --git a/example/script/print_hello.luajit b/example/script/print_hello.luajit Binary files differnew file mode 100644 index 0000000..c9eb05b --- /dev/null +++ b/example/script/print_hello.luajit diff --git a/example/script/protocol_recognition.lua b/example/script/protocol_recognition.lua new file mode 100644 index 0000000..0987232 --- /dev/null +++ b/example/script/protocol_recognition.lua @@ -0,0 +1,79 @@ +local str = tsg.data; +local len = string.len(str) +local thread_id = string.byte(str, -1) +local info = string.format("[lua][thread_id:%d][protocol_recognition.lua]:str:%s, str_len:%d", thread_id, str, len - 1) +print(info) +local ret = "unrecognition." +local index, _ = string.find(str, "tcp") +if index then + ret = "tcp" + info = string.format("[lua][thread_id:%d][protocol_recognition.lua]:return str_len:%d, str:%s", thread_id, string.len(ret), ret) + print(info) + return string.len(ret), ret +end +index, _ = string.find(str, "udp") +if index then + ret = "udp" + info = string.format("[lua][thread_id:%d][protocol_recognition.lua]:return str_len:%d, str:%s", thread_id, string.len(ret), ret) + print(info) + return string.len(ret), ret +end +index, _ = string.find(str, "ssh") +if index then + ret = "ssh" + info = string.format("[lua][thread_id:%d][protocol_recognition.lua]:return str_len:%d, str:%s", thread_id, string.len(ret), ret) + print(info) + return string.len(ret), ret +end +index, _ = string.find(str, "vnc") +if index then + ret = "vnc" + info = string.format("[lua][thread_id:%d][protocol_recognition.lua]:return str_len:%d, str:%s", thread_id, string.len(ret), ret) + print(info) + return string.len(ret), ret +end +index, _ = string.find(str, "sock") +if index then + ret = "sock" + info = string.format("[lua][thread_id:%d][protocol_recognition.lua]:return str_len:%d, str:%s", thread_id, string.len(ret), ret) + print(info) + return string.len(ret), ret +end +index, _ = string.find(str, "quic") +if index then + ret = "quic" + info = string.format("[lua][thread_id:%d][protocol_recognition.lua]:return str_len:%d, str:%s", thread_id, string.len(ret), ret) + print(info) + return string.len(ret), ret +end +index, _ = string.find(str, "pop3") +if index then + ret = "pop3" + info = string.format("[lua][thread_id:%d][protocol_recognition.lua]:return str_len:%d, str:%s", thread_id, string.len(ret), ret) + print(info) + return string.len(ret), ret +end +index, _ = string.find(str, "smpt") +if index then + ret = "smpt" + info = string.format("[lua][thread_id:%d][protocol_recognition.lua]:return str_len:%d, str:%s", thread_id, string.len(ret), ret) + print(info) + return string.len(ret), ret +end +index, _ = string.find(str, "imap") +if index then + ret = "imap" + info = string.format("[lua][thread_id:%d][protocol_recognition.lua]:return str_len:%d, str:%s", thread_id, string.len(ret), ret) + print(info) + return string.len(ret), ret +end +index, _ = string.find(str, "http") +if index then + ret = "http" + info = string.format("[lua][thread_id:%d][protocol_recognition.lua]:return str_len:%d, str:%s", thread_id, string.len(ret), ret) + print(info) + return string.len(ret), ret +end +info = string.format("[lua][thread_id:%d][protocol_recognition.lua]:return str_len:%d, str:%s", thread_id, string.len(ret), ret) +print(info) +return string.len(ret), ret diff --git a/example/single_thread b/example/single_thread Binary files differnew file mode 100755 index 0000000..c460291 --- /dev/null +++ b/example/single_thread diff --git a/example/single_thread.cpp b/example/single_thread.cpp new file mode 100644 index 0000000..b4efcc4 --- /dev/null +++ b/example/single_thread.cpp @@ -0,0 +1,344 @@ +/************************************************************************* + > File Name: main.c + > Author: pxz + > Mail: [email protected] + > Created Time: Thu 09 Jul 2020 07:08:40 AM CST + ************************************************************************/ +extern "C" +{ + #include<stdio.h> + #include<string.h> +} +#include"../include/tsg_lua_interface.h" +char *content0 = (char *)"HanMeimei said \"hello\" to LiLei"; +char content1[255]; + +char *contents[] ={content0, content1}; + + +int main() +{ + const char *script = "./script/find_hello.lua"; + const char *script1 = "./script/find_1.luajit"; + const char *script2 = "local str = tsg.data print(str) return string.len(str), str"; + const char *script3 = "\x1B\x4C\x4A\x02\x0A\x75\x02\x00"\ + "\x04\x00\x07\x00\x11\x36\x00\x00"\ + "\x00\x39\x00\x01\x00\x36\x01\x02"\ + "\x00\x27\x03\x03\x00\x42\x01\x02"\ + "\x01\x36\x01\x02\x00\x27\x03\x04"\ + "\x00\x42\x01\x02\x01\x36\x01\x02"\ + "\x00\x27\x03\x03\x00\x42\x01\x02"\ + "\x01\x36\x01\x05\x00\x39\x01\x06"\ + "\x01\x12\x03\x00\x00\x42\x01\x02"\ + "\x02\x12\x02\x00\x00\x4A\x01\x03"\ + "\x00\x08\x6C\x65\x6E\x0B\x73\x74"\ + "\x72\x69\x6E\x67\x08\x73\x74\x72"\ + "\x10\x2D\x2D\x2D\x2D\x2D\x2D\x2D"\ + "\x2D\x2D\x2D\x2D\x0A\x70\x72\x69"\ + "\x6E\x74\x09\x64\x61\x74\x61\x08"\ + "\x74\x73\x67\x00"; + tsg_lua_handle L = NULL; + content1[128] = 1; + //memset(content1, 1, sizeof(content1)); + /* 初始化1个虚拟机 */ + printf("\n*********************tsg_lua_vm_create************************\n"); + printf("[C]:call tsg_lua_vm_create...\n"); + L = tsg_lua_vm_create(); + if (L == NULL) + { + printf("[C]:call tsg_lua_vm_create failed.\n"); + return -1; + } + printf("[C]:call tsg_lua_vm_create success.\t lua:%p\n", L); + + char out[255]; + memset(out, 0, sizeof(out)); + size_t out_len; + size_t out_type; + printf("\n=============================file==================================\n"); + printf("\n*********************tsg_lua_exec_file************************\n"); + printf("[C]:call tsg_lua_exec_file, exec %s ...\n", script); + int ret = tsg_lua_exec_file(L, script, content0, strlen(content0), out, &out_len, &out_type); + if (ret < 0) + { + printf("[C]:call tsg_lua_exec_file failed.\n"); + return -1; + } + printf("[C]:call tsg_lua_exec_file success.\n"); + printf("[C]:out_len:%ld\n", out_len); + printf("[C]:out_type:%ld\n", out_type); + switch(out_type) + { + case STRING: + printf("[C]:out_data:%s\n", out); + break; + case INTEGER: + printf("[C]:out_data:%ld\n", *(long int *)out); + break; + case BOOLEAN: + printf("[C]:out_data:%d\n", out[0]); + break; + } + + printf("\n*********************tsg_lua_exec_file************************\n"); + printf("[C]:call tsg_lua_exec_file, exec %s ...\n", script1); + ret = tsg_lua_exec_file(L, script1, content0, strlen(content0), out, &out_len, &out_type); + if (ret < 0) + { + printf("[C]:call tsg_lua_exec_file failed.\n"); + return -1; + } + printf("[C]:call tsg_lua_exec_file success.\n"); + printf("[C]:out_len:%ld\n", out_len); + printf("[C]:out_type:%ld\n", out_type); + switch(out_type) + { + case STRING: + printf("[C]:out_data:%s\n", out); + break; + case INTEGER: + printf("[C]:out_data:%ld\n", *(long int *)out); + break; + case BOOLEAN: + printf("[C]:out_data:%d\n", out[0]); + break; + } + + /* lua 缓存脚本, 再运行 */ + memset(out, 0, sizeof(out)); + printf("\n*********************tsg_lua_cache_script_file************************\n"); + printf("[C]: call tsg_lua_cache_script_file, script:%s ...\n", script); + int script_id = tsg_lua_cache_script_file(L, script); + if (script_id < 0) + { + printf("[C]: call tsg_lua_cache_script_file failed.\n"); + return -1; + } + printf("[C]: call tsg_lua_cache_script_file success.\t script_id:%d\n", script_id); + + printf("\n*********************tsg_lua_cache_exec************************\n"); + printf("[C]: call tsg_lua_cache_exec ...\n"); + ret = tsg_lua_cache_exec(L, script_id, content1, 255, out, &out_len, &out_type); + if (ret < 0) + { + printf("[C]: call tsg_lua_cache_exec failed.\n"); + return -1; + } + printf("[C]: call tsg_lua_cache_exec success\n"); + printf("[C]:out_len:%ld\n", out_len); + printf("[C]:out_type:%ld\n", out_type); + switch(out_type) + { + case STRING: + printf("[C]:out_data:%s\n", out); + break; + case BOOLEAN: + printf("[C]:out_data:%d\n", out[0]); + break; + case INTEGER: + printf("[C]:out_data:%ld\n", *(long int *)out); + break; + } + + memset(out, 0, sizeof(out)); + printf("\n*********************tsg_lua_cache_script_file************************\n"); + printf("[C]: call tsg_lua_cache_script_file, script:%s ...\n", script1); + int script_id1 = tsg_lua_cache_script_file(L, script1); + if (script_id1 < 0) + { + printf("[C]: call tsg_lua_cache_script_file failed.\n"); + return -1; + } + printf("[C]: call tsg_lua_cache_script_file success.\t script_id:%d\n", script_id1); + + printf("\n*********************tsg_lua_cache_exec************************\n"); + printf("[C]: call tsg_lua_cache_exec ...\n"); + ret = tsg_lua_cache_exec(L, script_id1, content1, 255, out, &out_len, &out_type); + if (ret < 0) + { + printf("[C]: call tsg_lua_cache_exec failed.\n"); + return -1; + } + printf("[C]: call tsg_lua_cache_exec success\n"); + printf("[C]:out_len:%ld\n", out_len); + printf("[C]:out_type:%ld\n", out_type); + switch(out_type) + { + case STRING: + printf("[C]:out_data:%s\n", out); + break; + case BOOLEAN: + printf("[C]:out_data:%d\n", out[0]); + break; + case INTEGER: + printf("[C]:out_data:%ld\n", *(long int *)out); + break; + } + + /****************************************************************************************/ + printf("\n=============================string==================================\n"); + memset(out, 0, sizeof(out)); + printf("\n*********************tsg_lua_exec************************\n"); + printf("[C]: call tsg_lua_exec, text-script ...\n"); + ret = tsg_lua_exec(L, script2, strlen(script2), "hello wrold", 11, out, &out_len, &out_type); + if (ret < 0) + { + printf("[C]: call tsg_lua_exec failed ...\n"); + return -1; + } + printf("[C]: call tsg_lua_exec success ...\n"); + printf("[C]:out_len:%ld\n", out_len); + printf("[C]:out_type:%ld\n", out_type); + switch(out_type) + { + case STRING: + printf("[C]:out_data:%s\n", out); + break; + case BOOLEAN: + printf("[C]:out_data:%d\n", out[0]); + break; + case INTEGER: + printf("[C]:out_data:%ld\n", *(long int *)out); + break; + } + + memset(out, 0, sizeof(out)); + printf("\n*********************tsg_lua_exec************************\n"); + printf("[C]: call tsg_lua_exec, bytecode-script ...\n"); + ret = tsg_lua_exec(L, script3, 124, "hello wrold", 11, out, &out_len, &out_type); + if (ret < 0) + { + printf("[C]: call tsg_lua_exec failed ...\n"); + return -1; + } + printf("[C]: call tsg_lua_exec success ...\n"); + printf("[C]:out_len:%ld\n", out_len); + printf("[C]:out_type:%ld\n", out_type); + switch(out_type) + { + case STRING: + printf("[C]:out_data:%s\n", out); + break; + case BOOLEAN: + printf("[C]:out_data:%d\n", out[0]); + break; + case INTEGER: + printf("[C]:out_data:%ld\n", *(long int *)out); + break; + } + memset(out, 0, sizeof(out)); + printf("\n*********************tsg_lua_cache_script************************\n"); + printf("[C]: call tsg_lua_cache_script, text-script ...\n"); + int script_id2 = tsg_lua_cache_script(L, script2, strlen(script2)); + if (script_id2 < 0) + { + printf("[C]: call tsg_lua_cache_script failed.\n"); + return -1; + } + printf("[C]: call tsg_lua_cache_script success.\t script_id:%d\n", script_id2); + + printf("\n*********************tsg_lua_cache_exec************************\n"); + printf("[C]: call tsg_lua_cache_exec ...\n"); + ret = tsg_lua_cache_exec(L, script_id2, "hello wrold", 11, out, &out_len, &out_type); + if (ret < 0) + { + printf("[C]: call tsg_lua_cache_exec failed.\n"); + return -1; + } + printf("[C]: call tsg_lua_cache_exec success\n"); + printf("[C]:out_len:%ld\n", out_len); + printf("[C]:out_type:%ld\n", out_type); + switch(out_type) + { + case STRING: + printf("[C]:out_data:%s\n", out); + break; + case BOOLEAN: + printf("[C]:out_data:%d\n", out[0]); + break; + case INTEGER: + printf("[C]:out_data:%ld\n", *(long int *)out); + break; + } + memset(out, 0, sizeof(out)); + printf("\n*********************tsg_lua_cache_script************************\n"); + printf("[C]: call tsg_lua_cache_script, text-script ...\n"); + int script_id3 = tsg_lua_cache_script(L, script3, 124); + if (script_id3 < 0) + { + printf("[C]: call tsg_lua_cache_script failed.\n"); + return -1; + } + printf("[C]: call tsg_lua_cache_script success.\t script_id:%d\n", script_id3); + + printf("\n*********************tsg_lua_cache_exec************************\n"); + printf("[C]: call tsg_lua_cache_exec ...\n"); + ret = tsg_lua_cache_exec(L, script_id3, "hello world", 11, out, &out_len, &out_type); + if (ret < 0) + { + printf("[C]: call tsg_lua_cache_exec failed.\n"); + return -1; + } + printf("[C]: call tsg_lua_cache_exec success\n"); + printf("[C]:out_len:%ld\n", out_len); + printf("[C]:out_type:%ld\n", out_type); + switch(out_type) + { + case STRING: + printf("[C]:out_data:%s\n", out); + break; + case BOOLEAN: + printf("[C]:out_data:%d\n", out[0]); + break; + case INTEGER: + printf("[C]:out_data:%ld\n", *(long int *)out); + break; + } + /* lua 注销脚本 */ + memset(out, 0, sizeof(out)); + printf("\n*********************tsg_lua_uncache_script************************\n"); + printf("[C]: call tsg_lua_uncache_script, script_id:%d ...\n", script_id); + ret = tsg_lua_uncache_script(L, script_id); + if (ret < 0) + { + printf("[C]: call tsg_lua_uncache_script failed.\n"); + return -1; + } + printf("[C]: call tsg_lua_uncache_script success\n"); + printf("\n*********************tsg_lua_uncache_script************************\n"); + printf("[C]: call tsg_lua_uncache_script, script_id:%d ...\n", script_id1); + ret = tsg_lua_uncache_script(L, script_id1); + if (ret < 0) + { + printf("[C]: call tsg_lua_uncache_script failed.\n"); + return -1; + } + printf("[C]: call tsg_lua_uncache_script success\n"); + printf("\n*********************tsg_lua_uncache_script************************\n"); + printf("[C]: call tsg_lua_uncache_script, script_id:%d ...\n", script_id2); + ret = tsg_lua_uncache_script(L, script_id2); + if (ret < 0) + { + printf("[C]: call tsg_lua_uncache_script failed.\n"); + return -1; + } + printf("[C]: call tsg_lua_uncache_script success\n"); + printf("\n*********************tsg_lua_uncache_script************************\n"); + printf("[C]: call tsg_lua_uncache_script, script_id:%d ...\n", script_id3); + ret = tsg_lua_uncache_script(L, script_id3); + if (ret < 0) + { + printf("[C]: call tsg_lua_uncache_script failed.\n"); + return -1; + } + printf("[C]: call tsg_lua_uncache_script success\n"); + + tsg_lua_cache_exec(L, script_id, content1, 255, out, &out_len, &out_type); + + + /* 关闭lua */ + tsg_destory_lua(L); + printf("[C]:Every day is good day!\n"); + + return 0; +} diff --git a/gtest/CMakeLists.txt b/gtest/CMakeLists.txt new file mode 100644 index 0000000..111f465 --- /dev/null +++ b/gtest/CMakeLists.txt @@ -0,0 +1,13 @@ +cmake_minimum_required(VERSION 2.6) +project(gtest_tsg_lua) +aux_source_directory(. SRCS) + +include_directories("../include") +link_directories("/root/workspace/tsg_lua_0.99/lib") +link_libraries(tsglua gtest gtest_main pthread) + +add_definitions(-g -W -Wall) +#add_executable(gtest_tsg_lua gtest_tsg_lua_vm_create.cpp gtest_tsg_lua_exec.cpp gtest_tsg_lua_cache_script.cpp gtest_tsg_cache_exec.cpp gtest_tsg_lua_uncache_script.cpp gtest_tsg_destory_lua.cpp) +add_executable(../gtest_tsg_lua ${SRCS}) +target_link_libraries(../gtest_tsg_lua tsglua gtest gtest_main pthread) + diff --git a/gtest/gtest_tsg_destory_lua.cpp b/gtest/gtest_tsg_destory_lua.cpp new file mode 100644 index 0000000..8ea164c --- /dev/null +++ b/gtest/gtest_tsg_destory_lua.cpp @@ -0,0 +1,27 @@ +/************************************************************************* + > File Name: gtest_tsg_lua_vm_create.cpp + > Author: pxz + > Mail: [email protected] + > Created Time: Sun 19 Jul 2020 01:27:13 PM CST + ************************************************************************/ +#include <gtest/gtest.h> +#include "tsg_lua_interface.h" + +/* tsg_destory_lua */ +TEST(tsg_destory_lua, normal) +{ + tsg_lua_handle L = NULL; + L = tsg_lua_vm_create(); + int ret = tsg_destory_lua(L); + + EXPECT_EQ(0, ret); +} + +TEST(tsg_destory_lua, lua_vm_isnull) +{ + tsg_lua_handle L = NULL; + + int ret = tsg_destory_lua(L); + + EXPECT_EQ(ERR_LUAVM_ISNULL, ret); +} diff --git a/gtest/gtest_tsg_lua b/gtest/gtest_tsg_lua Binary files differnew file mode 100755 index 0000000..2731bca --- /dev/null +++ b/gtest/gtest_tsg_lua diff --git a/gtest/gtest_tsg_lua_cache_exec.cpp b/gtest/gtest_tsg_lua_cache_exec.cpp new file mode 100644 index 0000000..bd30490 --- /dev/null +++ b/gtest/gtest_tsg_lua_cache_exec.cpp @@ -0,0 +1,309 @@ +/************************************************************************* + > File Name: gtest_tsg_lua_cache_exec.cpp + > Author: pxz + > Mail: [email protected] + > Created Time: Sun 19 Jul 2020 01:28:20 PM CST + ************************************************************************/ +#include <gtest/gtest.h> +#include "tsg_lua_interface.h" +static const char *data = "hello world"; + +/* tsg_lua_cache_exec */ +TEST(tsg_lua_cache_exec, normal_return_string) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = "./script/return_string_normal.lua"; + memset(out, 0, 255); + int script_id = tsg_lua_cache_script_file(L, script); + int ret = tsg_lua_cache_exec(L, script_id, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(0, ret); + EXPECT_EQ(11, out_len); + EXPECT_EQ(STRING, out_type); + EXPECT_STREQ("hello world", out); +} + +TEST(tsg_lua_cache_exec, normal_return_boolean) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + L = tsg_lua_vm_create(); + const char *script = "./script/return_boolean_normal.lua"; + memset(out, 0, 255); + int script_id = tsg_lua_cache_script_file(L, script); + int ret = tsg_lua_cache_exec(L, script_id, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(0, ret); + EXPECT_EQ(1, out_len); + EXPECT_EQ(BOOLEAN, out_type); + EXPECT_EQ(true, out[0]); +} + +TEST(tsg_lua_cache_exec, normal_return_integer) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + L = tsg_lua_vm_create(); + const char *script = "./script/return_integer_normal.lua"; + memset(out, 0, 255); + int script_id = tsg_lua_cache_script_file(L, script); + int ret = tsg_lua_cache_exec(L, script_id, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(0, ret); + EXPECT_EQ(8, out_len); + EXPECT_EQ(INTEGER, out_type); + EXPECT_EQ(7, *(long int *)out); +} + +TEST(tsg_lua_cache_exec, lua_vm_isnull) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = "./script/return_string_normal.lua"; + memset(out, 0, sizeof(out)); + int script_id = tsg_lua_cache_script_file(L, script); + L = NULL; + int ret = tsg_lua_cache_exec(L, script_id, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_LUAVM_ISNULL, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_cache_exec, script_id_invaild) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + L = tsg_lua_vm_create(); + memset(out, 0, 255); + int script_id = 0; + int ret = tsg_lua_cache_exec(L, script_id, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_ID_INVAILD, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_cache_exec, input_isnull) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + char *input = NULL; + + L = tsg_lua_vm_create(); + const char *script = "./script/return_string_normal.lua"; + memset(out, 0, 255); + int script_id = tsg_lua_cache_script_file(L, script); + int ret = tsg_lua_cache_exec(L, script_id, input, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_INPUT_ISNULL, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_cache_exec, in_len_invaild) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = "./script/return_string_normal.lua"; + memset(out, 0, 255); + int script_id = tsg_lua_cache_script_file(L, script); + int ret = tsg_lua_cache_exec(L, script_id, data, 0, out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_IN_LEN_INVAILD, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_cache_exec, string_expected_but_nil) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = "./script/string_expected_but_nil.lua"; + memset(out, 0, 255); + int script_id = tsg_lua_cache_script_file(L, script); + int ret = tsg_lua_cache_exec(L, script_id, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_STRING_EXPECTED_BUT_NIL, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_cache_exec, string_expected_but_boolean) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = "./script/string_expected_but_boolean.lua"; + memset(out, 0, 255); + int script_id = tsg_lua_cache_script_file(L, script); + int ret = tsg_lua_cache_exec(L, script_id, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_STRING_EXPECTED_BUT_BOOL, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_cache_exec, call_global_but_nil) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = "./script/call_global_but_nil.lua"; + memset(out, 0, 255); + int script_id = tsg_lua_cache_script_file(L, script); + int ret = tsg_lua_cache_exec(L, script_id, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_CALL_GLOBAL_BUT_NIL, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + + +TEST(tsg_lua_cache_exec, return_too_few) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = "./script/return_too_few.lua"; + memset(out, 0, 255); + int script_id = tsg_lua_cache_script_file(L, script); + int ret = tsg_lua_cache_exec(L, script_id, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_RETURN_TOO_FEW, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_cache_exec, return_too_much) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = "./script/return_too_much.lua"; + memset(out, 0, 255); + int script_id = tsg_lua_cache_script_file(L, script); + int ret = tsg_lua_cache_exec(L, script_id, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_RETURN_TOO_MUCH, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_cache_exec, return_type_invaild) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = "./script/return_type_invaild.lua"; + memset(out, 0, 255); + int script_id = tsg_lua_cache_script_file(L, script); + int ret = tsg_lua_cache_exec(L, script_id, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_RETURN_TYPE_INVAILD, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_cache_exec, return_length_iszero) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = "./script/return_length_iszero.lua"; + memset(out, 0, 255); + int script_id = tsg_lua_cache_script_file(L, script); + int ret = tsg_lua_cache_exec(L, script_id, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_RETURN_LEN_INVAILD, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_cache_exec, string_expected_but_table) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = "./script/string_expected_but_table.lua"; + memset(out, 0, 255); + int script_id = tsg_lua_cache_script_file(L, script); + int ret = tsg_lua_cache_exec(L, script_id, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_STRING_EXPECTED_BUT_TABLE, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} diff --git a/gtest/gtest_tsg_lua_cache_script.cpp b/gtest/gtest_tsg_lua_cache_script.cpp new file mode 100644 index 0000000..3a2863f --- /dev/null +++ b/gtest/gtest_tsg_lua_cache_script.cpp @@ -0,0 +1,168 @@ +/************************************************************************* + > File Name: gtest_tsg_lua_cache_script.cpp + > Author: pxz + > Mail: [email protected] + > Created Time: Sun 19 Jul 2020 01:28:20 PM CST + ************************************************************************/ +#include <gtest/gtest.h> +#include "tsg_lua_interface.h" + +static size_t script_len; +static char buffer[4096]; +static char *get_script_buffer(const char *script) +{ + FILE *fp = fopen(script, "r"); + if (fp) + { + int num = fread(buffer, 1, 4096, fp); + if (num != 0) + { + buffer[num] = 0; + script_len = num - 1; + return buffer; + } + } + return NULL; +} +/* tsg_lua_cache_script */ +TEST(tsg_lua_cache_script, normal) +{ + tsg_lua_handle L = NULL; + + L = tsg_lua_vm_create(); + const char *script = get_script_buffer("./script/return_string_normal.lua"); + int script_id = tsg_lua_cache_script(L, script, script_len); + + /* check */ + EXPECT_EQ(1, script_id); +} + +TEST(tsg_lua_cache_script, lua_vm_isnull) +{ + tsg_lua_handle L = NULL; + + const char *script = get_script_buffer("./script/return_string_normal.lua"); + int script_id = tsg_lua_cache_script(L, script, script_len); + + /* check */ + EXPECT_EQ(ERR_LUAVM_ISNULL, script_id); +} + +TEST(tsg_lua_cache_script, script_isnull) +{ + tsg_lua_handle L = NULL; + + L = tsg_lua_vm_create(); + const char *script = NULL; + int script_id = tsg_lua_cache_script(L, script, script_len); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_ISNULL, script_id); +} +TEST(tsg_lua_cache_script, do_expected) +{ + tsg_lua_handle L = NULL; + + L = tsg_lua_vm_create(); + const char *script = get_script_buffer("./script/do_expected.lua"); + int script_id = tsg_lua_cache_script(L, script, script_len); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_DO_EXPECTED, script_id); +} + +TEST(tsg_lua_cache_script, then_expected) +{ + tsg_lua_handle L = NULL; + + L = tsg_lua_vm_create(); + const char *script = get_script_buffer("./script/then_expected.lua"); + int script_id = tsg_lua_cache_script(L, script, script_len); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_THEN_EXPECTED, script_id); +} + +TEST(tsg_lua_cache_script, end_expected) +{ + tsg_lua_handle L = NULL; + + L = tsg_lua_vm_create(); + const char *script = get_script_buffer("./script/end_expected.lua"); + int script_id = tsg_lua_cache_script(L, script, script_len); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_END_EXPECTED, script_id); +} + +TEST(tsg_lua_cache_script, eof_expected) +{ + tsg_lua_handle L = NULL; + + L = tsg_lua_vm_create(); + const char *script = get_script_buffer("./script/eof_expected.lua"); + int script_id = tsg_lua_cache_script(L, script, script_len); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_EOF_EXPECTED, script_id); +} + +TEST(tsg_lua_cache_script, equal_in_expected) +{ + tsg_lua_handle L = NULL; + + L = tsg_lua_vm_create(); + const char *script = get_script_buffer("./script/equal_in_expected.lua"); + int script_id = tsg_lua_cache_script(L, script, script_len); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_EQUAL_IN_EXPECTED, script_id); +} + +TEST(tsg_lua_cache_script, unexpected_symbol) +{ + tsg_lua_handle L = NULL; + + L = tsg_lua_vm_create(); + const char *script = get_script_buffer("./script/unexpected_symbol.lua"); + int script_id = tsg_lua_cache_script(L, script, script_len); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_UNEXPECTED_SYMBOL, script_id); +} + +TEST(tsg_lua_cache_script, name_expected) +{ + tsg_lua_handle L = NULL; + + L = tsg_lua_vm_create(); + const char *script = get_script_buffer("./script/name_expected.lua"); + int ret = tsg_lua_cache_script(L, script, script_len); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_NAME_EXPECTED, ret); +} + +TEST(tsg_lua_cache_script, right_curves_bracket_expected) +{ + tsg_lua_handle L = NULL; + + L = tsg_lua_vm_create(); + const char *script = get_script_buffer("./script/right_curves_bracket_expected.lua"); + int ret = tsg_lua_cache_script(L, script, script_len); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_RIGHT_CURVES_BRACKET_EXPECTED, ret); +} + +TEST(tsg_lua_cache_script, right_curly_bracket_expected) +{ + tsg_lua_handle L = NULL; + + L = tsg_lua_vm_create(); + const char *script = get_script_buffer("./script/right_curly_bracket_expected.lua"); + int ret = tsg_lua_cache_script(L, script, script_len); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_RIGHT_CURLY_BRACKET_EXPECTED, ret); +} diff --git a/gtest/gtest_tsg_lua_cache_script_bytecode_file.cpp b/gtest/gtest_tsg_lua_cache_script_bytecode_file.cpp new file mode 100644 index 0000000..2c63cb6 --- /dev/null +++ b/gtest/gtest_tsg_lua_cache_script_bytecode_file.cpp @@ -0,0 +1,44 @@ +/************************************************************************* + > File Name: gtest_tsg_lua_cache_script_file.cpp + > Author: pxz + > Mail: [email protected] + > Created Time: Sun 19 Jul 2020 01:28:20 PM CST + ************************************************************************/ +#include <gtest/gtest.h> +#include "tsg_lua_interface.h" + +/* tsg_lua_cache_script_file */ +TEST(tsg_lua_cache_script_bytecode_file, normal) +{ + tsg_lua_handle L = NULL; + + L = tsg_lua_vm_create(); + const char *script = "./script/return_string_normal.lua"; + int script_id = tsg_lua_cache_script_file(L, script); + + /* check */ + EXPECT_EQ(1, script_id); +} + +TEST(tsg_lua_cache_script_bytecode_file, lua_vm_isnull) +{ + tsg_lua_handle L = NULL; + + const char *script = "./script/return_string_normal.lua"; + int script_id = tsg_lua_cache_script_file(L, script); + + /* check */ + EXPECT_EQ(ERR_LUAVM_ISNULL, script_id); +} + +TEST(tsg_lua_cache_script_bytecode_file, script_isnull) +{ + tsg_lua_handle L = NULL; + + L = tsg_lua_vm_create(); + const char *script = NULL; + int script_id = tsg_lua_cache_script_file(L, script); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_ISNULL, script_id); +} diff --git a/gtest/gtest_tsg_lua_cache_script_file.cpp b/gtest/gtest_tsg_lua_cache_script_file.cpp new file mode 100644 index 0000000..78dbec0 --- /dev/null +++ b/gtest/gtest_tsg_lua_cache_script_file.cpp @@ -0,0 +1,164 @@ +/************************************************************************* + > File Name: gtest_tsg_lua_cache_script_file.cpp + > Author: pxz + > Mail: [email protected] + > Created Time: Sun 19 Jul 2020 01:28:20 PM CST + ************************************************************************/ +#include <gtest/gtest.h> +#include "tsg_lua_interface.h" + +/* tsg_lua_cache_script_file */ +TEST(tsg_lua_cache_script_file, normal) +{ + tsg_lua_handle L = NULL; + + L = tsg_lua_vm_create(); + const char *script = "./script/return_string_normal.lua"; + int script_id = tsg_lua_cache_script_file(L, script); + + /* check */ + EXPECT_EQ(1, script_id); +} + +TEST(tsg_lua_cache_script_file, lua_vm_isnull) +{ + tsg_lua_handle L = NULL; + + const char *script = "./script/return_string_normal.lua"; + int script_id = tsg_lua_cache_script_file(L, script); + + /* check */ + EXPECT_EQ(ERR_LUAVM_ISNULL, script_id); +} + +TEST(tsg_lua_cache_script_file, script_isnull) +{ + tsg_lua_handle L = NULL; + + L = tsg_lua_vm_create(); + const char *script = NULL; + int script_id = tsg_lua_cache_script_file(L, script); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_ISNULL, script_id); +} +#if 0 +TEST(tsg_lua_cache_script_file, function_invaild) +{ + tsg_lua_handle L = NULL; + + L = tsg_lua_vm_create(); + const char *script = "./script/function_invaild.lua"; + int script_id = tsg_lua_cache_script_file(L, script); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_FUNCTION_INVAILD, script_id); +} +#endif +TEST(tsg_lua_cache_script_file, do_expected) +{ + tsg_lua_handle L = NULL; + + L = tsg_lua_vm_create(); + const char *script = "./script/do_expected.lua"; + int script_id = tsg_lua_cache_script_file(L, script); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_DO_EXPECTED, script_id); +} + +TEST(tsg_lua_cache_script_file, then_expected) +{ + tsg_lua_handle L = NULL; + + L = tsg_lua_vm_create(); + const char *script = "./script/then_expected.lua"; + int script_id = tsg_lua_cache_script_file(L, script); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_THEN_EXPECTED, script_id); +} + +TEST(tsg_lua_cache_script_file, end_expected) +{ + tsg_lua_handle L = NULL; + + L = tsg_lua_vm_create(); + const char *script = "./script/end_expected.lua"; + int script_id = tsg_lua_cache_script_file(L, script); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_END_EXPECTED, script_id); +} + +TEST(tsg_lua_cache_script_file, eof_expected) +{ + tsg_lua_handle L = NULL; + + L = tsg_lua_vm_create(); + const char *script = "./script/eof_expected.lua"; + int script_id = tsg_lua_cache_script_file(L, script); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_EOF_EXPECTED, script_id); +} + +TEST(tsg_lua_cache_script_file, equal_in_expected) +{ + tsg_lua_handle L = NULL; + + L = tsg_lua_vm_create(); + const char *script = "./script/equal_in_expected.lua"; + int script_id = tsg_lua_cache_script_file(L, script); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_EQUAL_IN_EXPECTED, script_id); +} + +TEST(tsg_lua_cache_script_file, unexpected_symbol) +{ + tsg_lua_handle L = NULL; + + L = tsg_lua_vm_create(); + const char *script = "./script/unexpected_symbol.lua"; + int script_id = tsg_lua_cache_script_file(L, script); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_UNEXPECTED_SYMBOL, script_id); +} + +TEST(tsg_lua_cache_script_file, name_expected) +{ + tsg_lua_handle L = NULL; + + L = tsg_lua_vm_create(); + const char *script = "./script/name_expected.lua"; + int ret = tsg_lua_cache_script_file(L, script); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_NAME_EXPECTED, ret); +} + +TEST(tsg_lua_cache_script_file, right_curves_bracket_expected) +{ + tsg_lua_handle L = NULL; + + L = tsg_lua_vm_create(); + const char *script = "./script/right_curves_bracket_expected.lua"; + int ret = tsg_lua_cache_script_file(L, script); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_RIGHT_CURVES_BRACKET_EXPECTED, ret); +} + +TEST(tsg_lua_cache_script_file, right_curly_bracket_expected) +{ + tsg_lua_handle L = NULL; + + L = tsg_lua_vm_create(); + const char *script = "./script/right_curly_bracket_expected.lua"; + int ret = tsg_lua_cache_script_file(L, script); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_RIGHT_CURLY_BRACKET_EXPECTED, ret); +} diff --git a/gtest/gtest_tsg_lua_exec.cpp b/gtest/gtest_tsg_lua_exec.cpp new file mode 100644 index 0000000..c0be485 --- /dev/null +++ b/gtest/gtest_tsg_lua_exec.cpp @@ -0,0 +1,500 @@ +/************************************************************************* + > File Name: gtest_tsg_lua_exec.cpp + > Author: pxz + > Mail: [email protected] + > Created Time: Sun 19 Jul 2020 01:28:20 PM CST + ************************************************************************/ +#include <gtest/gtest.h> +#include "tsg_lua_interface.h" +static const char *data = "hello world"; + +static char buffer[4096]; +static char *get_script_buffer(const char *script) +{ + FILE *fp = fopen(script, "r"); + if (fp) + { + int num = fread(buffer, 1, 4096, fp); + if (num != 0) + { + buffer[num] = 0; + return buffer; + } + } + return NULL; +} + +/* tsg_lua_exec */ +TEST(tsg_lua_exec, normal_return_string) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + memset(out, 0, 255); + const char *script = get_script_buffer("./script/return_string_normal.lua"); + int ret = tsg_lua_exec(L, script, strlen(script), data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(0, ret); + EXPECT_EQ(11, out_len); + EXPECT_EQ(STRING, out_type); + EXPECT_STREQ("hello world", out); +} + +TEST(tsg_lua_exec, normal_return_boolean) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + L = tsg_lua_vm_create(); + const char *script = get_script_buffer("./script/return_boolean_normal.lua"); + memset(out, 0, 255); + int ret = tsg_lua_exec(L, script, strlen(script), data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(0, ret); + EXPECT_EQ(1, out_len); + EXPECT_EQ(BOOLEAN, out_type); + EXPECT_EQ(true, out[0]); +} + +TEST(tsg_lua_exec, normal_return_integer) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + L = tsg_lua_vm_create(); + const char *script = get_script_buffer("./script/return_integer_normal.lua"); + memset(out, 0, 255); + int ret = tsg_lua_exec(L, script, strlen(script), data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(0, ret); + EXPECT_EQ(8, out_len); + EXPECT_EQ(INTEGER, out_type); + EXPECT_EQ(7, *(long int *)out); +} + +TEST(tsg_lua_exec, lua_vm_isnull) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + const char *script = get_script_buffer("./script/return_string_normal.lua"); + memset(out, 0, sizeof(out)); + int ret = tsg_lua_exec(L, script, strlen(script), data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_LUAVM_ISNULL, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec, script_isnull) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + L = tsg_lua_vm_create(); + const char *script = NULL; + memset(out, 0, 255); + int ret = tsg_lua_exec(L, script, 0, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_ISNULL, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec, input_isnull) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + char *input = NULL; + + L = tsg_lua_vm_create(); + const char *script = get_script_buffer("./script/return_string_normal.lua"); + memset(out, 0, 255); + int ret = tsg_lua_exec(L, script, strlen(script), input, 0, out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_INPUT_ISNULL, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec, in_len_invaild) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = get_script_buffer("./script/return_string_normal.lua"); + memset(out, 0, 255); + int ret = tsg_lua_exec(L, script, strlen(script), data, 0, out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_IN_LEN_INVAILD, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec, end_expected) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = get_script_buffer("./script/end_expected.lua"); + memset(out, 0, 255); + int ret = tsg_lua_exec(L, script, strlen(script), data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_END_EXPECTED, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec, then_expected) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = get_script_buffer("./script/then_expected.lua"); + memset(out, 0, 255); + int ret = tsg_lua_exec(L, script, strlen(script), data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_THEN_EXPECTED, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec, do_expected) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = get_script_buffer("./script/do_expected.lua"); + memset(out, 0, 255); + int ret = tsg_lua_exec(L, script, strlen(script), data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_DO_EXPECTED, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec, eof_expected) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = get_script_buffer("./script/eof_expected.lua"); + memset(out, 0, 255); + int ret = tsg_lua_exec(L, script, strlen(script), data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_EOF_EXPECTED, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec, equal_in_expected) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = get_script_buffer("./script/equal_in_expected.lua"); + memset(out, 0, 255); + int ret = tsg_lua_exec(L, script, strlen(script), data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_EQUAL_IN_EXPECTED, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec, unexpected_symbol) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = get_script_buffer("./script/unexpected_symbol.lua"); + memset(out, 0, 255); + int ret = tsg_lua_exec(L, script, strlen(script), data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_UNEXPECTED_SYMBOL, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec, name_expected) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = get_script_buffer("./script/name_expected.lua"); + memset(out, 0, 255); + int ret = tsg_lua_exec(L, script, strlen(script), data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_NAME_EXPECTED, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec, right_curves_bracket_expected) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = get_script_buffer("./script/right_curves_bracket_expected.lua"); + memset(out, 0, 255); + int ret = tsg_lua_exec(L, script, strlen(script), data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_RIGHT_CURVES_BRACKET_EXPECTED, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec, right_curly_bracket_expected) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = get_script_buffer("./script/right_curly_bracket_expected.lua"); + memset(out, 0, 255); + int ret = tsg_lua_exec(L, script, strlen(script), data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_RIGHT_CURLY_BRACKET_EXPECTED, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec, string_expected_but_nil) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = get_script_buffer("./script/string_expected_but_nil.lua"); + memset(out, 0, 255); + int ret = tsg_lua_exec(L, script, strlen(script), data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_STRING_EXPECTED_BUT_NIL, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec, string_expected_but_boolean) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = get_script_buffer("./script/string_expected_but_boolean.lua"); + memset(out, 0, 255); + int ret = tsg_lua_exec(L, script, strlen(script), data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_STRING_EXPECTED_BUT_BOOL, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec, string_expected_but_table) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = get_script_buffer("./script/string_expected_but_table.lua"); + memset(out, 0, 255); + int ret = tsg_lua_exec(L, script, strlen(script), data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_STRING_EXPECTED_BUT_TABLE, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec, call_global_but_nil) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = get_script_buffer("./script/call_global_but_nil.lua"); + memset(out, 0, 255); + int ret = tsg_lua_exec(L, script, strlen(script), data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_CALL_GLOBAL_BUT_NIL, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + + +TEST(tsg_lua_exec, return_too_few) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = get_script_buffer("./script/return_too_few.lua"); + memset(out, 0, 255); + int ret = tsg_lua_exec(L, script, strlen(script), data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_RETURN_TOO_FEW, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec, return_too_much) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = get_script_buffer("./script/return_too_much.lua"); + memset(out, 0, 255); + int ret = tsg_lua_exec(L, script, strlen(script), data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_RETURN_TOO_MUCH, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec, return_type_invaild) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = get_script_buffer("./script/return_type_invaild.lua"); + memset(out, 0, 255); + int ret = tsg_lua_exec(L, script, strlen(script), data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_RETURN_TYPE_INVAILD, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec, return_length_iszero) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = get_script_buffer("./script/return_length_iszero.lua"); + memset(out, 0, 255); + int ret = tsg_lua_exec(L, script, strlen(script), data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_RETURN_LEN_INVAILD, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} +#if 0 +TEST(tsg_lua_exec, function_invaild) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = get_script_buffer("./script/function_invaild.lua"); + memset(out, 0, 255); + int ret = tsg_lua_exec(L, script, strlen(script), data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_FUNCTION_INVAILD, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} +#endif diff --git a/gtest/gtest_tsg_lua_exec_bytecode.cpp b/gtest/gtest_tsg_lua_exec_bytecode.cpp new file mode 100644 index 0000000..d2d6976 --- /dev/null +++ b/gtest/gtest_tsg_lua_exec_bytecode.cpp @@ -0,0 +1,311 @@ +/************************************************************************* + > File Name: gtest_tsg_lua_exec.cpp + > Author: pxz + > Mail: [email protected] + > Created Time: Sun 19 Jul 2020 01:28:20 PM CST + ************************************************************************/ +#include <gtest/gtest.h> +#include "tsg_lua_interface.h" + +static const char *data = "hello world"; +static size_t script_len; +static char buffer[4096]; +static char *get_script_buffer(const char *script) +{ + FILE *fp = fopen(script, "r"); + if (fp) + { + int num = fread(buffer, 1, 4096, fp); + if (num != 0) + { + buffer[num] = 0; + script_len = num; + return buffer; + } + } + return NULL; +} + +/* tsg_lua_exec */ +TEST(tsg_lua_exec_bytecode, normal_return_string) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + memset(out, 0, 255); + const char *script = get_script_buffer("./script/return_string_normal.luajit"); + int ret = tsg_lua_exec(L, script, script_len, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(0, ret); + EXPECT_EQ(11, out_len); + EXPECT_EQ(STRING, out_type); + EXPECT_STREQ("hello world", out); +} + +TEST(tsg_lua_exec_bytecode, normal_return_boolean) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + L = tsg_lua_vm_create(); + const char *script = get_script_buffer("./script/return_boolean_normal.luajit"); + memset(out, 0, 255); + int ret = tsg_lua_exec(L, script, script_len, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(0, ret); + EXPECT_EQ(1, out_len); + EXPECT_EQ(BOOLEAN, out_type); + EXPECT_EQ(true, out[0]); +} + +TEST(tsg_lua_exec_bytecode, normal_return_integer) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + L = tsg_lua_vm_create(); + const char *script = get_script_buffer("./script/return_integer_normal.luajit"); + memset(out, 0, 255); + int ret = tsg_lua_exec(L, script, script_len, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(0, ret); + EXPECT_EQ(8, out_len); + EXPECT_EQ(INTEGER, out_type); + EXPECT_EQ(7, *(long int *)out); +} + +TEST(tsg_lua_exec_bytecode, lua_vm_isnull) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + const char *script = get_script_buffer("./script/return_string_normal.luajit"); + memset(out, 0, sizeof(out)); + int ret = tsg_lua_exec(L, script, script_len, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_LUAVM_ISNULL, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec_bytecode, script_isnull) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + L = tsg_lua_vm_create(); + const char *script = NULL; + memset(out, 0, 255); + int ret = tsg_lua_exec(L, script, 0, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_ISNULL, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec_bytecode, input_isnull) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + char *input = NULL; + + L = tsg_lua_vm_create(); + const char *script = get_script_buffer("./script/return_string_normal.luajit"); + memset(out, 0, 255); + int ret = tsg_lua_exec(L, script, script_len, input, 0, out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_INPUT_ISNULL, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec_bytecode, in_len_invaild) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = get_script_buffer("./script/return_string_normal.luajit"); + memset(out, 0, 255); + int ret = tsg_lua_exec(L, script, script_len, data, 0, out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_IN_LEN_INVAILD, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec_bytecode, string_expected_but_nil) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = get_script_buffer("./script/string_expected_but_nil.luajit"); + memset(out, 0, 255); + int ret = tsg_lua_exec(L, script, script_len, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_STRING_EXPECTED_BUT_NIL, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec_bytecode, string_expected_but_boolean) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = get_script_buffer("./script/string_expected_but_boolean.luajit"); + memset(out, 0, 255); + int ret = tsg_lua_exec(L, script, script_len, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_STRING_EXPECTED_BUT_BOOL, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec_bytecode, string_expected_but_table) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = get_script_buffer("./script/string_expected_but_table.luajit"); + memset(out, 0, 255); + int ret = tsg_lua_exec(L, script, script_len, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_STRING_EXPECTED_BUT_TABLE, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec_bytecode, call_global_but_nil) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = get_script_buffer("./script/call_global_but_nil.luajit"); + memset(out, 0, 255); + int ret = tsg_lua_exec(L, script, script_len, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_CALL_GLOBAL_BUT_NIL, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + + +TEST(tsg_lua_exec_bytecode, return_too_few) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = get_script_buffer("./script/return_too_few.luajit"); + memset(out, 0, 255); + int ret = tsg_lua_exec(L, script, script_len, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_RETURN_TOO_FEW, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec_bytecode, return_too_much) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = get_script_buffer("./script/return_too_much.luajit"); + memset(out, 0, 255); + int ret = tsg_lua_exec(L, script, script_len, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_RETURN_TOO_MUCH, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec_bytecode, return_type_invaild) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = get_script_buffer("./script/return_type_invaild.luajit"); + memset(out, 0, 255); + int ret = tsg_lua_exec(L, script, script_len, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_RETURN_TYPE_INVAILD, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec_bytecode, return_length_iszero) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = get_script_buffer("./script/return_length_iszero.luajit"); + memset(out, 0, 255); + int ret = tsg_lua_exec(L, script, script_len, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_RETURN_LEN_INVAILD, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} diff --git a/gtest/gtest_tsg_lua_exec_bytecode_file.cpp b/gtest/gtest_tsg_lua_exec_bytecode_file.cpp new file mode 100644 index 0000000..6fd7552 --- /dev/null +++ b/gtest/gtest_tsg_lua_exec_bytecode_file.cpp @@ -0,0 +1,293 @@ +/************************************************************************* + > File Name: gtest_tsg_lua_exec_file.cpp + > Author: pxz + > Mail: [email protected] + > Created Time: Sun 19 Jul 2020 01:28:20 PM CST + ************************************************************************/ +#include <gtest/gtest.h> +#include "tsg_lua_interface.h" +static const char *data = "hello world"; + +/* tsg_lua_exec_file */ +TEST(tsg_lua_exec_bytecode_file, normal_return_string) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = "./script/return_string_normal.luajit"; + memset(out, 0, 255); + int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(0, ret); + EXPECT_EQ(11, out_len); + EXPECT_EQ(STRING, out_type); + EXPECT_STREQ("hello world", out); +} + +TEST(tsg_lua_exec_bytecode_file, normal_return_boolean) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + L = tsg_lua_vm_create(); + const char *script = "./script/return_boolean_normal.luajit"; + memset(out, 0, 255); + int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(0, ret); + EXPECT_EQ(1, out_len); + EXPECT_EQ(BOOLEAN, out_type); + EXPECT_EQ(true, out[0]); +} + +TEST(tsg_lua_exec_bytecode_file, normal_return_integer) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + L = tsg_lua_vm_create(); + const char *script = "./script/return_integer_normal.luajit"; + memset(out, 0, 255); + int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(0, ret); + EXPECT_EQ(8, out_len); + EXPECT_EQ(INTEGER, out_type); + EXPECT_EQ(7, *(long int *)out); +} + +TEST(tsg_lua_exec_bytecode_file, lua_vm_isnull) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + const char *script = "./script/return_string_normal.luajit"; + memset(out, 0, sizeof(out)); + int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_LUAVM_ISNULL, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec_bytecode_file, script_isnull) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + L = tsg_lua_vm_create(); + const char *script = NULL; + memset(out, 0, 255); + int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_ISNULL, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec_bytecode_file, input_isnull) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + char *input = NULL; + + L = tsg_lua_vm_create(); + const char *script = "./script/return_string_normal.luajit"; + memset(out, 0, 255); + int ret = tsg_lua_exec_file(L, script, input, 0, out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_INPUT_ISNULL, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec_bytecode_file, in_len_invaild) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = "./script/return_string_normal.luajit"; + memset(out, 0, 255); + int ret = tsg_lua_exec_file(L, script, data, 0, out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_IN_LEN_INVAILD, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec_bytecode_file, string_expected_but_nil) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = "./script/string_expected_but_nil.luajit"; + memset(out, 0, 255); + int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_STRING_EXPECTED_BUT_NIL, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec_bytecode_file, string_expected_but_boolean) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = "./script/string_expected_but_boolean.luajit"; + memset(out, 0, 255); + int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_STRING_EXPECTED_BUT_BOOL, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec_bytecode_file, string_expected_but_table) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = "./script/string_expected_but_table.luajit"; + memset(out, 0, 255); + int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_STRING_EXPECTED_BUT_TABLE, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec_bytecode_file, call_global_but_nil) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = "./script/call_global_but_nil.luajit"; + memset(out, 0, 255); + int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_CALL_GLOBAL_BUT_NIL, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + + +TEST(tsg_lua_exec_bytecode_file, return_too_few) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = "./script/return_too_few.luajit"; + memset(out, 0, 255); + int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_RETURN_TOO_FEW, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec_bytecode_file, return_too_much) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = "./script/return_too_much.luajit"; + memset(out, 0, 255); + int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_RETURN_TOO_MUCH, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec_bytecode_file, return_type_invaild) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = "./script/return_type_invaild.luajit"; + memset(out, 0, 255); + int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_RETURN_TYPE_INVAILD, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec_bytecode_file, return_length_iszero) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = "./script/return_length_iszero.luajit"; + memset(out, 0, 255); + int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_RETURN_LEN_INVAILD, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} diff --git a/gtest/gtest_tsg_lua_exec_file.cpp b/gtest/gtest_tsg_lua_exec_file.cpp new file mode 100644 index 0000000..3b63bec --- /dev/null +++ b/gtest/gtest_tsg_lua_exec_file.cpp @@ -0,0 +1,485 @@ +/************************************************************************* + > File Name: gtest_tsg_lua_exec_file.cpp + > Author: pxz + > Mail: [email protected] + > Created Time: Sun 19 Jul 2020 01:28:20 PM CST + ************************************************************************/ +#include <gtest/gtest.h> +#include "tsg_lua_interface.h" + +static const char *data = "hello world"; + +/* tsg_lua_exec_file */ +TEST(tsg_lua_exec_file, normal_return_string) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = "./script/return_string_normal.lua"; + memset(out, 0, 255); + int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(0, ret); + EXPECT_EQ(11, out_len); + EXPECT_EQ(STRING, out_type); + EXPECT_STREQ("hello world", out); +} + +TEST(tsg_lua_exec_file, normal_return_boolean) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + L = tsg_lua_vm_create(); + const char *script = "./script/return_boolean_normal.lua"; + memset(out, 0, 255); + int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(0, ret); + EXPECT_EQ(1, out_len); + EXPECT_EQ(BOOLEAN, out_type); + EXPECT_EQ(true, out[0]); +} + +TEST(tsg_lua_exec_file, normal_return_integer) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + L = tsg_lua_vm_create(); + const char *script = "./script/return_integer_normal.lua"; + memset(out, 0, 255); + int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(0, ret); + EXPECT_EQ(8, out_len); + EXPECT_EQ(INTEGER, out_type); + EXPECT_EQ(7, *(long int *)out); +} + +TEST(tsg_lua_exec_file, lua_vm_isnull) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + const char *script = "./script/return_string_normal.lua"; + memset(out, 0, sizeof(out)); + int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_LUAVM_ISNULL, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec_file, script_isnull) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + L = tsg_lua_vm_create(); + const char *script = NULL; + memset(out, 0, 255); + int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_ISNULL, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec_file, input_isnull) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + char *input = NULL; + + L = tsg_lua_vm_create(); + const char *script = "./script/return_string_normal.lua"; + memset(out, 0, 255); + int ret = tsg_lua_exec_file(L, script, input, 0, out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_INPUT_ISNULL, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec_file, in_len_invaild) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = "./script/return_string_normal.lua"; + memset(out, 0, 255); + int ret = tsg_lua_exec_file(L, script, data, 0, out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_IN_LEN_INVAILD, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec_file, end_expected) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = "./script/end_expected.lua"; + memset(out, 0, 255); + int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_END_EXPECTED, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec_file, then_expected) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = "./script/then_expected.lua"; + memset(out, 0, 255); + int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_THEN_EXPECTED, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec_file, do_expected) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = "./script/do_expected.lua"; + memset(out, 0, 255); + int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_DO_EXPECTED, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec_file, eof_expected) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = "./script/eof_expected.lua"; + memset(out, 0, 255); + int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_EOF_EXPECTED, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec_file, equal_in_expected) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = "./script/equal_in_expected.lua"; + memset(out, 0, 255); + int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_EQUAL_IN_EXPECTED, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec_file, unexpected_symbol) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = "./script/unexpected_symbol.lua"; + memset(out, 0, 255); + int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_UNEXPECTED_SYMBOL, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec_file, name_expected) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = "./script/name_expected.lua"; + memset(out, 0, 255); + int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_NAME_EXPECTED, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec_file, right_curves_bracket_expected) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = "./script/right_curves_bracket_expected.lua"; + memset(out, 0, 255); + int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_RIGHT_CURVES_BRACKET_EXPECTED, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec_file, right_curly_bracket_expected) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = "./script/right_curly_bracket_expected.lua"; + memset(out, 0, 255); + int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_RIGHT_CURLY_BRACKET_EXPECTED, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec_file, string_expected_but_nil) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = "./script/string_expected_but_nil.lua"; + memset(out, 0, 255); + int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_STRING_EXPECTED_BUT_NIL, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec_file, string_expected_but_boolean) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = "./script/string_expected_but_boolean.lua"; + memset(out, 0, 255); + int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_STRING_EXPECTED_BUT_BOOL, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec_file, string_expected_but_table) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = "./script/string_expected_but_table.lua"; + memset(out, 0, 255); + int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_STRING_EXPECTED_BUT_TABLE, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec_file, call_global_but_nil) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = "./script/call_global_but_nil.lua"; + memset(out, 0, 255); + int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_CALL_GLOBAL_BUT_NIL, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + + +TEST(tsg_lua_exec_file, return_too_few) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = "./script/return_too_few.lua"; + memset(out, 0, 255); + int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_RETURN_TOO_FEW, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec_file, return_too_much) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = "./script/return_too_much.lua"; + memset(out, 0, 255); + int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_RETURN_TOO_MUCH, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec_file, return_type_invaild) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = "./script/return_type_invaild.lua"; + memset(out, 0, 255); + int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_RETURN_TYPE_INVAILD, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} + +TEST(tsg_lua_exec_file, return_length_iszero) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = "./script/return_length_iszero.lua"; + memset(out, 0, 255); + int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_RETURN_LEN_INVAILD, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} +#if 0 +TEST(tsg_lua_exec_file, function_invaild) +{ + tsg_lua_handle L = NULL; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + + L = tsg_lua_vm_create(); + const char *script = "./script/function_invaild.lua"; + memset(out, 0, 255); + int ret = tsg_lua_exec_file(L, script, data, strlen(data), out, &out_len, &out_type); + + /* check */ + EXPECT_EQ(ERR_SCRIPT_FUNCTION_INVAILD, ret); + EXPECT_EQ(0, out_len); + EXPECT_EQ(0, out_type); + EXPECT_STREQ("", out); +} +#endif diff --git a/gtest/gtest_tsg_lua_uncache_script.cpp b/gtest/gtest_tsg_lua_uncache_script.cpp new file mode 100644 index 0000000..cf17a87 --- /dev/null +++ b/gtest/gtest_tsg_lua_uncache_script.cpp @@ -0,0 +1,37 @@ +/************************************************************************* + > File Name: gtest_tsg_lua_cache_script_file.cpp + > Author: pxz + > Mail: [email protected] + > Created Time: Sun 19 Jul 2020 01:28:20 PM CST + ************************************************************************/ +#include <gtest/gtest.h> +#include "tsg_lua_interface.h" + +/* tsg_lua_uncache_script */ +TEST(tsg_lua_uncache_script, normal) +{ + tsg_lua_handle L = NULL; + + L = tsg_lua_vm_create(); + const char *script = "./script/return_string_normal.lua"; + int script_id = tsg_lua_cache_script_file(L, script); + int ret = tsg_lua_uncache_script(L, script_id); + + /* check */ + EXPECT_EQ(0, ret); +} + +TEST(tsg_lua_uncache_script, lua_vm_isnull) +{ + tsg_lua_handle L = NULL; + + L = tsg_lua_vm_create(); + const char *script = "./script/return_string_normal.lua"; + int script_id = tsg_lua_cache_script_file(L, script); + L = NULL; + int ret = tsg_lua_uncache_script(L, script_id); + + /* check */ + EXPECT_EQ(ERR_LUAVM_ISNULL, ret); +} + diff --git a/gtest/gtest_tsg_lua_vm_create.cpp b/gtest/gtest_tsg_lua_vm_create.cpp new file mode 100644 index 0000000..91a3c03 --- /dev/null +++ b/gtest/gtest_tsg_lua_vm_create.cpp @@ -0,0 +1,16 @@ +/************************************************************************* + > File Name: gtest_tsg_lua_vm_create.cpp + > Author: pxz + > Mail: [email protected] + > Created Time: Sun 19 Jul 2020 01:27:13 PM CST + ************************************************************************/ +#include <gtest/gtest.h> +#include "tsg_lua_interface.h" + +/* tsg_lua_vm_create */ +TEST(tsg_lua_vm_create, create_normal) +{ + tsg_lua_handle L = NULL; + L = tsg_lua_vm_create(); + EXPECT_NE((void *)NULL, L); +} diff --git a/gtest/script/call_global_but_nil.lua b/gtest/script/call_global_but_nil.lua new file mode 100644 index 0000000..d4d73f6 --- /dev/null +++ b/gtest/script/call_global_but_nil.lua @@ -0,0 +1,2 @@ +str = tablefunc() +return string.len(str), str diff --git a/gtest/script/call_global_but_nil.luajit b/gtest/script/call_global_but_nil.luajit Binary files differnew file mode 100644 index 0000000..b5d19cb --- /dev/null +++ b/gtest/script/call_global_but_nil.luajit diff --git a/gtest/script/do_expected.lua b/gtest/script/do_expected.lua new file mode 100644 index 0000000..b6d9afb --- /dev/null +++ b/gtest/script/do_expected.lua @@ -0,0 +1,3 @@ +local str = tsg.data +for i = 0, 10 + return string.len(str), str diff --git a/gtest/script/end_expected.lua b/gtest/script/end_expected.lua new file mode 100644 index 0000000..fb1dfcb --- /dev/null +++ b/gtest/script/end_expected.lua @@ -0,0 +1,3 @@ +local str = tsg.data +if str then +return string.len(str), str diff --git a/gtest/script/eof_expected.lua b/gtest/script/eof_expected.lua new file mode 100644 index 0000000..580dcab --- /dev/null +++ b/gtest/script/eof_expected.lua @@ -0,0 +1,4 @@ +local str = tsg.data +str = string.format('%s', str) + return string.len(str), str +end diff --git a/gtest/script/equal_in_expected.lua b/gtest/script/equal_in_expected.lua new file mode 100644 index 0000000..846dd7c --- /dev/null +++ b/gtest/script/equal_in_expected.lua @@ -0,0 +1,4 @@ +local str = tsg.data +for i + return string.len(str), str +end diff --git a/gtest/script/name_expected.lua b/gtest/script/name_expected.lua new file mode 100644 index 0000000..0d0bd7a --- /dev/null +++ b/gtest/script/name_expected.lua @@ -0,0 +1,5 @@ +local str = tsg.data +for do + print(str) +end +return string.len(str), str diff --git a/gtest/script/return_boolean_normal.lua b/gtest/script/return_boolean_normal.lua new file mode 100644 index 0000000..5ec3497 --- /dev/null +++ b/gtest/script/return_boolean_normal.lua @@ -0,0 +1,6 @@ +local str = tsg.data +local s_index, e_index = string.find(str, 'hello') +if s_index then + return 1, true +else return 1, false +end diff --git a/gtest/script/return_boolean_normal.luajit b/gtest/script/return_boolean_normal.luajit Binary files differnew file mode 100644 index 0000000..d76eab6 --- /dev/null +++ b/gtest/script/return_boolean_normal.luajit diff --git a/gtest/script/return_integer_normal.lua b/gtest/script/return_integer_normal.lua new file mode 100644 index 0000000..d3c08a7 --- /dev/null +++ b/gtest/script/return_integer_normal.lua @@ -0,0 +1,7 @@ +local str = tsg.data +local s_index, e_index = string.find(str, 'world') +if s_index then + return 8, s_index +else + return 1, false +end diff --git a/gtest/script/return_integer_normal.luajit b/gtest/script/return_integer_normal.luajit Binary files differnew file mode 100644 index 0000000..6c72798 --- /dev/null +++ b/gtest/script/return_integer_normal.luajit diff --git a/gtest/script/return_length_iszero.lua b/gtest/script/return_length_iszero.lua new file mode 100644 index 0000000..e67b392 --- /dev/null +++ b/gtest/script/return_length_iszero.lua @@ -0,0 +1,2 @@ +local str = "hello" +return 0, str diff --git a/gtest/script/return_length_iszero.luajit b/gtest/script/return_length_iszero.luajit Binary files differnew file mode 100644 index 0000000..fcb961c --- /dev/null +++ b/gtest/script/return_length_iszero.luajit diff --git a/gtest/script/return_string_normal.lua b/gtest/script/return_string_normal.lua new file mode 100644 index 0000000..0f1c592 --- /dev/null +++ b/gtest/script/return_string_normal.lua @@ -0,0 +1,2 @@ +local str = tsg.data +return string.len(str), str diff --git a/gtest/script/return_string_normal.luajit b/gtest/script/return_string_normal.luajit Binary files differnew file mode 100644 index 0000000..27764b3 --- /dev/null +++ b/gtest/script/return_string_normal.luajit diff --git a/gtest/script/return_too_few.lua b/gtest/script/return_too_few.lua new file mode 100644 index 0000000..f850e87 --- /dev/null +++ b/gtest/script/return_too_few.lua @@ -0,0 +1,2 @@ +local str = "hello" +return string.len(str) diff --git a/gtest/script/return_too_few.luajit b/gtest/script/return_too_few.luajit Binary files differnew file mode 100644 index 0000000..c2bc81e --- /dev/null +++ b/gtest/script/return_too_few.luajit diff --git a/gtest/script/return_too_much.lua b/gtest/script/return_too_much.lua new file mode 100644 index 0000000..683f6a0 --- /dev/null +++ b/gtest/script/return_too_much.lua @@ -0,0 +1,2 @@ +local str = "hello" +return string.len(str), str, 1 diff --git a/gtest/script/return_too_much.luajit b/gtest/script/return_too_much.luajit Binary files differnew file mode 100644 index 0000000..881e698 --- /dev/null +++ b/gtest/script/return_too_much.luajit diff --git a/gtest/script/return_type_invaild.lua b/gtest/script/return_type_invaild.lua new file mode 100644 index 0000000..2d4e33e --- /dev/null +++ b/gtest/script/return_type_invaild.lua @@ -0,0 +1,2 @@ +local str = "hello" +return string.len(str), nil diff --git a/gtest/script/return_type_invaild.luajit b/gtest/script/return_type_invaild.luajit Binary files differnew file mode 100644 index 0000000..a267b1f --- /dev/null +++ b/gtest/script/return_type_invaild.luajit diff --git a/gtest/script/right_curly_bracket_expected.lua b/gtest/script/right_curly_bracket_expected.lua new file mode 100644 index 0000000..194864b --- /dev/null +++ b/gtest/script/right_curly_bracket_expected.lua @@ -0,0 +1,4 @@ +local str = string.format ('%s', tsg.data) +local table = {} +setmetatable(table, {__index = _G) +return string.len(str), str diff --git a/gtest/script/right_curves_bracket_expected.lua b/gtest/script/right_curves_bracket_expected.lua new file mode 100644 index 0000000..b901a50 --- /dev/null +++ b/gtest/script/right_curves_bracket_expected.lua @@ -0,0 +1,2 @@ +local str = string.format('%s', tsg.data +return string.len(str), str diff --git a/gtest/script/string_expected_but_boolean.lua b/gtest/script/string_expected_but_boolean.lua new file mode 100644 index 0000000..388636f --- /dev/null +++ b/gtest/script/string_expected_but_boolean.lua @@ -0,0 +1,3 @@ +local str = "hello" +return string.len(true), str + diff --git a/gtest/script/string_expected_but_boolean.luajit b/gtest/script/string_expected_but_boolean.luajit Binary files differnew file mode 100644 index 0000000..2c555b4 --- /dev/null +++ b/gtest/script/string_expected_but_boolean.luajit diff --git a/gtest/script/string_expected_but_nil.lua b/gtest/script/string_expected_but_nil.lua new file mode 100644 index 0000000..d0979ec --- /dev/null +++ b/gtest/script/string_expected_but_nil.lua @@ -0,0 +1 @@ +return string.len(str), str diff --git a/gtest/script/string_expected_but_nil.luajit b/gtest/script/string_expected_but_nil.luajit Binary files differnew file mode 100644 index 0000000..92796df --- /dev/null +++ b/gtest/script/string_expected_but_nil.luajit diff --git a/gtest/script/string_expected_but_table.lua b/gtest/script/string_expected_but_table.lua new file mode 100644 index 0000000..417d8ed --- /dev/null +++ b/gtest/script/string_expected_but_table.lua @@ -0,0 +1,2 @@ +local str = {1, 2, 4} +return string.len(str), str diff --git a/gtest/script/string_expected_but_table.luajit b/gtest/script/string_expected_but_table.luajit Binary files differnew file mode 100644 index 0000000..d237308 --- /dev/null +++ b/gtest/script/string_expected_but_table.luajit diff --git a/gtest/script/then_expected.lua b/gtest/script/then_expected.lua new file mode 100644 index 0000000..8a94370 --- /dev/null +++ b/gtest/script/then_expected.lua @@ -0,0 +1,4 @@ +if not nil + str = tsg.data + return string.len(str), str +end diff --git a/gtest/script/unexpected_symbol.lua b/gtest/script/unexpected_symbol.lua new file mode 100644 index 0000000..a51eb44 --- /dev/null +++ b/gtest/script/unexpected_symbol.lua @@ -0,0 +1,3 @@ +-=* +local str = string.format('%s', tsg.data) +return string.len(str), str diff --git a/include/tsg_lua_interface.h b/include/tsg_lua_interface.h new file mode 100644 index 0000000..ae417e0 --- /dev/null +++ b/include/tsg_lua_interface.h @@ -0,0 +1,126 @@ +/************************************************************************* + > File Name: tsg_lua_interface.h + > Author: pxz + > Mail: [email protected] + > Created Time: Wed 08 Jul 2020 02:50:42 PM CST + ************************************************************************/ +#ifndef __TSG_LUA_INTERFACE__ +#define __TSG_LUA_INTERFACE__ + +enum type +{ + STRING = 1, + INTEGER, + BOOLEAN, +}; + +enum err_value +{ + ERR_LUAVM_ISNULL = -1, /* 输入虚拟机参数为空 */ + ERR_SCRIPT_ISNULL = -2, /* 输入脚本为空 */ + ERR_INPUT_ISNULL = -3, /* 输入数据为空 */ + ERR_IN_LEN_INVAILD = -4, /* 输入数据长度小于1 */ + ERR_SCRIPT_FUNCTION_INVAILD = -5, /* 脚本函数名无效 */ + ERR_SCRIPT_RETURN_LEN_INVAILD = -6, /* 脚本返回值长度为0 */ + ERR_SCRIPT_RETURN_TOO_MUCH = -7, /* 脚本返回值太多 */ + ERR_SCRIPT_RETURN_TOO_FEW = -8, /* 脚本返回值太少 */ + ERR_SCRIPT_RETURN_TYPE_INVAILD = -9, /* 脚本返回值类型错误 */ + ERR_SCRIPT_SYNTAX_ERROR = -10, /* 脚本语法错误 */ + ERR_SCRIPT_END_EXPECTED = -11, /* 脚本缺少end */ + ERR_SCRIPT_THEN_EXPECTED = -12, /* 脚本缺少then */ + ERR_SCRIPT_DO_EXPECTED = -13, /* 脚本缺少do */ + ERR_SCRIPT_EOF_EXPECTED = -14, /* 脚本缺少eof */ + ERR_SCRIPT_EQUAL_IN_EXPECTED = -15, /* 脚本缺少‘=’或者‘in’ */ + ERR_SCRIPT_UNEXPECTED_SYMBOL = -16, /* 脚本中出现不可预期的错误符号 */ + ERR_SCRIPT_NAME_EXPECTED = -17, /* 脚本中for后面没有表达式 */ + ERR_SCRIPT_RIGHT_CURVES_BRACKET_EXPECTED = -18, /* 脚本中缺少')' */ + ERR_SCRIPT_RIGHT_CURLY_BRACKET_EXPECTED = -19, /* 脚本中缺少'}' */ + ERR_SCRIPT_EXEC_ERROR = -20, /* 脚本运行错误 */ + ERR_SCRIPT_STRING_EXPECTED_BUT_NIL = -21, /* 脚本参数错误,尝试访问string类型变量,但该变量是nil类型 */ + ERR_SCRIPT_STRING_EXPECTED_BUT_BOOL = -22, /* 脚本参数错误,尝试访问string类型变量,但该变量是bool类型 */ + ERR_SCRIPT_STRING_EXPECTED_BUT_TABLE = -23, /* 脚本参数错误,尝试访问string类型变量,但该变量是table类型 */ + ERR_SCRIPT_CALL_GLOBAL_BUT_NIL = -24, /* 脚本尝试访问一个不存在的变量 */ + ERR_SCRIPT_NOT_EXIT = -25, /* 脚本不存在 */ + ERR_SCRIPT_BYTECODE_NO_HEADER = -26, /* 字节码脚本没有header */ + ERR_SCRIPT_BYTECODE_BAD_HEADER = -27, /* 字节码脚本header错误 */ + ERR_SCRIPT_BYTECODE_VERSION_UNSUPPORTED = -28, /* 字节码脚本的版本不支持 */ + ERR_SCRIPT_BYTECODE_ONLY_SUPPORT_LUAJIT = -29, /* 只支持luajit的字节码脚本 */ + ERR_SCRIPT_BYTECODE_NOT_SUPPORT_BIG_ENDIAN = -30, /* 不支持字节码脚本大端模式 */ + ERR_SCRIPT_BYTECODE_NOT_SUPPORT_DEBUG = -31, /* 不支持字节码脚本debug模式 */ + ERR_SCRIPT_IS_BAD = -32, /* 脚本错误 */ + ERR_SCRIPT_ID_INVAILD = -33, /* 脚本ID无效 */ + ERR_LUA_CACHE_FAILED = -34, /* 脚本缓存失败 */ + ERR_MEM_NOT_ENOUGH = -35, /* 空间不足 */ + ERR_UNKNOWN = -36, /* 未知错误 */ +}; + +typedef void* tsg_lua_handle; + +/* 函数名:tsg_lua_vm_create + * 返回值:tsg_lua_handle 成功,返回一个虚拟机, + * 失败,返回NULL */ +tsg_lua_handle tsg_lua_vm_create(); + +/* 函数名: tsg_lua_exec + * 输入参数: tsg_lua_handle L 指定虚拟机 + * char *script 待执行的lua脚本 + * size_t *script_len 待执行的lua脚本大小 + * char *in 输入待处理的数据 + * size_t in_len 输入待处理的数据的长度 + * 输出参数: + * char *out 输出结果 + * size_t *out_len 输出结果的长度 + * size_t *out_type 输出结果的类型 + * 返回值: int 成功,返回0;失败返回错误值err_value */ +int tsg_lua_exec(tsg_lua_handle L, const char *script, size_t script_len, const char *in, size_t in_len, char *out, size_t *out_len, size_t *out_type); + +/* 函数名: tsg_lua_exec_script + * 输入参数: tsg_lua_handle L 指定虚拟机 + * char *script 待执行的lua脚本 + * char *in 输入待处理的数据 + * size_t in_len 输入待处理的数据的长度 + * 输出参数: + * char *out 输出结果 + * size_t *out_len 输出结果的长度 + * size_t *out_type 输出结果的类型 + * 返回值: int 成功,返回0;失败返回错误值err_value */ +int tsg_lua_exec_file(tsg_lua_handle L, const char *script, const char *in, size_t in_len, char *out, size_t *out_len, size_t *out_type); + +/* 函数名: tsg_lua_cache_script + * 输入参数: tsg_lua_handle L 指定虚拟机 + * char *script 待缓存的lua脚本 + * size_t *script_len 待缓存的lua脚本大小 + * + * 返回值: int 成功,返回一个大于1的值,是脚本在当前虚拟机的唯一标识;失败,返回错误值err_value */ +int tsg_lua_cache_script(tsg_lua_handle L, const char *script, size_t script_len); + +/* 函数名: tsg_lua_cache_script_file + * 输入参数: tsg_lua_handle L 指定虚拟机 + * char *script 待缓存的lua脚本路径名 + * + * 返回值: int 成功,返回一个大于1的值,是脚本在当前虚拟机的唯一标识;失败,返回错误值err_value */ +int tsg_lua_cache_script_file(tsg_lua_handle L, const char *script); + +/* 函数名: tsg_unchache_script + * 输入参数: tsg_lua_handle L 指定虚拟机 + * size_t script_id 当前虚拟机内指定脚本的唯一标识 + * 返回值: int 成功,返回0;失败,返回错误码err_value */ +int tsg_lua_uncache_script(tsg_lua_handle L, size_t script_id); + +/* 函数名: tsg_cache_exec + * 输入参数: tsg_lua_handle L 指定虚拟机 + * size_t script_id 当前虚拟机内指定脚本的唯一标识 + * char *in 输入待处理的数据 + * size_t in_len 输入待处理的数据的长度 + * 输出参数: char *out 输出结果 + * size_t *out_len 输出结果的长度 + * size_t *out_type 输出结果的类型 + * 返回值: int 成功,返回0;失败,返回错误值err_value */ +int tsg_lua_cache_exec(tsg_lua_handle L, size_t script_id, const char *in, size_t in_len, char *out, size_t *out_len, size_t *out_type); + +/* 函数名: tsg_destory_lua + * 输入参数: tsg_lua_handle L 指定虚拟机 + * 返回值: int 成功,返回0;失败返回错误值err_value */ +int tsg_destory_lua(tsg_lua_handle L); + +#endif diff --git a/lib/libtsglua.a b/lib/libtsglua.a Binary files differnew file mode 100644 index 0000000..d799972 --- /dev/null +++ b/lib/libtsglua.a diff --git a/lib/libtsglua.so b/lib/libtsglua.so Binary files differnew file mode 100755 index 0000000..e0025c0 --- /dev/null +++ b/lib/libtsglua.so diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..e98e04d --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,14 @@ +cmake_minimum_required(VERSION 3.5) +SET(CMAKE_CXX_COMPILER /usr/bin/g++) +aux_source_directory(. DIR_LIB_SRCS) +include_directories("/usr/local/include/luajit-2.1/") +link_directories("/usr/local/lib") +link_libraries("libluajit-5.1.a") + +add_definitions(-g -W -Wall -O0 -DTSG_LUA_DEBUG) +SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -shared -fPIC") +add_library(tsglua_static ${DIR_LIB_SRCS}) +add_library(tsglua SHARED ${DIR_LIB_SRCS}) +set_target_properties(tsglua_static PROPERTIES OUTPUT_NAME "tsglua") +target_link_libraries(tsglua libluajit-5.1.a dl) + diff --git a/src/tsg_lua_func.cpp b/src/tsg_lua_func.cpp new file mode 100644 index 0000000..b9e0403 --- /dev/null +++ b/src/tsg_lua_func.cpp @@ -0,0 +1,1329 @@ +/************************************************************************* + > File Name: tsg_lua_func.c + > Author: pxz + > Mail: [email protected] + > Created Time: Wed 08 Jul 2020 03:45:55 PM CST + ************************************************************************/ +extern "C" +{ +#include<stdio.h> +#include<stdlib.h> +#include<string.h> +#include<setjmp.h> +#include "lualib.h" +#include "luajit.h" +#include "lauxlib.h" +} +#include<tcmalloc.h> +#include"../include/tsg_lua_interface.h" + +#ifndef MIN +#define MIN(a,b) (((a) < (b))?(a):(b)) +#endif + +#ifndef TSG_MAX_LUA_ID +#define TSG_MAX_LUA_ID 256 +#endif + +#define MAX_BEGIN_CODE_SIZE 23 +#define MAX_END_CODE_SIZE 22 + +#define TEXT_BEGIN_CODE "return function()" +#define TEXT_BEGIN_SIZE (sizeof(TEXT_BEGIN_CODE) - 1) +#define TEXT_INIT_CODE "\nlocal newglobaltable = {}\nsetmetatable(newglobaltable, {__index = _G})\nsetfenv(1, newglobaltable)" +#define TEXT_INIT_SIZE (sizeof(TEXT_INIT_CODE) - 1) +#define TEXT_END_CODE "\nend" +#define TEXT_END_SIZE (sizeof(TEXT_END_CODE) - 1) + +/* bytecode for luajit 2.0 */ +#define LJ20_BYTECODE_END_STRIPPED \ + "\x14\x03\x00\x01\x00\x01\x00\x03" \ + "\x31\x00\x00\x00\x30\x00\x00\x80\x48\x00\x02\x00" \ + "\x00\x00" +#define LJ20_BYTECODE_END_SIZE (sizeof(LJ20_BYTECODE_END_STRIPPED) - 1) + +/* bytecode for luajit 2.1 */ +#define LJ21_BYTECODE_END_STRIPPED \ + "\x14\x03\x00\x01\x00\x01\x00\x03" \ + "\x33\x00\x00\x00\x32\x00\x00\x80\x4c\x00\x02\x00" \ + "\x00\x00" + +#define LJ21_BYTECODE_END_SIZE (sizeof(LJ21_BYTECODE_END_STRIPPED) - 1) + +/* bytecode for both */ +#define LJ_BYTECODE_LEN_STRIPPED 22 +#define LJ_HEADERSIZE 5 +#define LJ_BCDUMP_F_BE 0x01 +#define LJ_BCDUMP_F_STRIP 0x02 +#define LJ21_BCDUMP_VERSION 2 +#define LJ20_BCDUMP_VERSION 1 +#define LJ_SIGNATURE "\x1b\x4c\x4a" + +#define EXEC_ERROR_INFO_NUM ((int)(sizeof(exec_error) / sizeof(exec_error_massage_t))) +#define SYNTAX_ERROR_INFO_NUM ((int)(sizeof(syntax_error) / sizeof(char *))) + + +typedef struct{ + const char *err_info1; + const char *err_info2; +}exec_error_massage_t; + +enum{ + TSG_LUA_READER_BUFFSIZE = 4096 +}; + +typedef enum{ + TSG_LUA_TEXT_FILE, + TSG_LUA_BC_LUA, + TSG_LUA_BC_LJ +}tsg_lua_clfactory_file_type_t; + +typedef struct{ + const char *s; + tsg_lua_clfactory_file_type_t file_type; + int sent_begin; + int sent_end; + int size; + + size_t begin_code_len; + size_t end_code_len; + size_t rest_len; + const char *begin_code_ptr; + const char *end_code_ptr; +}tsg_lua_clfactory_buffer_t; + +typedef struct{ + FILE *f; + tsg_lua_clfactory_file_type_t file_type; + int extraline; + int sent_begin; + int sent_end; + + size_t begin_code_len; + size_t end_code_len; + size_t rest_len; + union{ + const char *ptr; + char str[MAX_BEGIN_CODE_SIZE]; + }begin_code; + const char *end_code_ptr; + + char buff[TSG_LUA_READER_BUFFSIZE]; +}tsg_lua_clfactory_file_t; + +static jmp_buf lua_exception[TSG_MAX_LUA_ID]; + +static const char *syntax_error[] = +{ + "'end' expected", /* ERR_SCRIPT_END_EXPECTED */ + "'then' expected", /* ERR_SCRIPT_THEN_EXPECTED */ + "'do' expected", /* ERR_SCRIPT_DO_EXPECTED */ + "'<eof>' expected", /* ERR_SCRIPT_EOF_EXPECTED */ + "'=' or 'in' expected", /* ERR_SCRIPT_EQUAL_IN_EXPECTED */ + "unexpected symbol", /* ERR_SCRIPT_UNEXPECTED_SYMBOL */ + "'<name>' expected", /* ERR_SCRIPT_NAME_EXPECT */ + "')' expected", /* ERR_SCRIPT_RIGHT_CURVES_BRACKET */ + "'}' expected", /* ERR_SCRIPT_RIGHT_CURLY_BRACKET */ +}; + +static exec_error_massage_t exec_error[] = +{ + {"bad argument", "(string expected, got nil)"}, /* ERR_SCRIPT_STRING_EXPECTED_BUT_NIL */ + {"bad argument", "(string expected, got boolean)"}, /* ERR_SCRIPT_STRING_EXPECTED_BUT_BOOL */ + {"bad argument", "(string expected, got table)"}, /* ERR_SCRIPT_STRING_EXPECTED_BUT_TABLE */ + {"attempt to call global", "(a nil value)"}, /* ERR_SCRIPT_CALL_GLOBAL_BUT_NIL */ +}; + +static void debuginfo(const char *info, const char *file, size_t line) +{ +#ifdef TSG_LUA_DEBUG + printf("error: [%s:%ld]%s\n", file, line, info); +#else + (void)info; + (void)file; + (void)line; +#endif + return ; +} + +static long tsg_lua_clfactory_file_size(FILE *f) +{ + long cur_pos, len; + cur_pos = ftell(f); + if (cur_pos == -1) + { + return -1; + } + + if (fseek(f, 0, SEEK_END) != 0) + { + return -1; + } + + len = ftell(f); + if (len == -1) + { + return -1; + } + + if (fseek(f, cur_pos, SEEK_SET) != 0) + { + return -1; + } + + return len; +} + +static void tsg_lua_clfactory_file_text_prepare(tsg_lua_clfactory_file_t *lf) +{ + lf->begin_code.ptr = TEXT_BEGIN_CODE; + lf->begin_code_len = TEXT_BEGIN_SIZE; + lf->end_code_ptr = TEXT_END_CODE; + lf->end_code_len = TEXT_END_SIZE; +} + +static int tsg_lua_clfactory_bytecode_buffer_prepare(tsg_lua_clfactory_buffer_t *ls) +{ + int little_endian, version, stripped; + + if (ls->file_type == TSG_LUA_BC_LJ) + { + /* get bytecode header */ + if (ls->size <= LJ_HEADERSIZE) + { + debuginfo("script is bad", __FILE__, __LINE__); + return ERR_SCRIPT_IS_BAD; + } + + ls->size--; + /* get bytecode version */ + version = (int)(ls->s[3]); + + /* compare bytecode header */ + if (strncmp(ls->s, LJ_SIGNATURE, sizeof(LJ_SIGNATURE) - 1)) + { + debuginfo("bad byte-code header", __FILE__, __LINE__); + return ERR_SCRIPT_BYTECODE_BAD_HEADER; + } + + /* little endian or big little endian */ + little_endian = !((ls->s[4]) & LJ_BCDUMP_F_BE); + if (little_endian == 0) + { + debuginfo("not support byte-code coding by big-endian", __FILE__, __LINE__); + return ERR_SCRIPT_BYTECODE_NOT_SUPPORT_BIG_ENDIAN; + } + + /* stripped or debug */ + stripped = (ls->s[4]) & LJ_BCDUMP_F_STRIP; + if (!stripped) + { + debuginfo("not support byte-code include debug-info", __FILE__, __LINE__); + return ERR_SCRIPT_BYTECODE_NOT_SUPPORT_DEBUG; + } + + ls->end_code_len = LJ_BYTECODE_LEN_STRIPPED; + if (version == LJ21_BCDUMP_VERSION) + { + ls->end_code_ptr = LJ21_BYTECODE_END_STRIPPED; + } +#if 0 + else if (version == LJ20_BCDUMP_VERSION) + { + ls->end_code_ptr = LJ20_BYTECODE_END_STRIPPED; + } +#endif + else + { + debuginfo("bytecode format version unsupported", __FILE__, __LINE__); + return ERR_SCRIPT_BYTECODE_VERSION_UNSUPPORTED; + } + } + return 0; +} + +static int tsg_lua_clfactory_bytecode_file_prepare(tsg_lua_clfactory_file_t *lf) +{ + int little_endian, version, stripped; + size_t size; + long fsize; + + *lf->begin_code.str = LUA_SIGNATURE[0]; + if (lf->file_type == TSG_LUA_BC_LJ) + { + /* get bytecode header */ + size = fread(lf->begin_code.str + 1, 1, LJ_HEADERSIZE - 1, lf->f); + if (size != LJ_HEADERSIZE - 1) + { + debuginfo("can not read header", __FILE__, __LINE__); + return ERR_SCRIPT_BYTECODE_NO_HEADER; + } + + /* get bytecode version */ + version = *(lf->begin_code.str + 3); + + /* compare bytecode header */ + if (strncmp(lf->begin_code.str, LJ_SIGNATURE, sizeof(LJ_SIGNATURE) - 1)) + { + debuginfo("bad byte-code header", __FILE__, __LINE__); + return ERR_SCRIPT_BYTECODE_BAD_HEADER; + } + + lf->begin_code_len = LJ_HEADERSIZE; + + /* little endian or big little endian */ + little_endian = !((*(lf->begin_code.str + 4)) & LJ_BCDUMP_F_BE); + if (little_endian == 0) + { + debuginfo("not support byte-code coding by big-endian", __FILE__, __LINE__); + return ERR_SCRIPT_BYTECODE_NOT_SUPPORT_BIG_ENDIAN; + } + + /* stripped or debug */ + stripped = (*(lf->begin_code.str + 4)) & LJ_BCDUMP_F_STRIP; + if (!stripped) + { + debuginfo("not support byte-code include debug-info", __FILE__, __LINE__); + return ERR_SCRIPT_BYTECODE_NOT_SUPPORT_DEBUG; + } + + if (version == LJ21_BCDUMP_VERSION) + { + lf->end_code_ptr = LJ21_BYTECODE_END_STRIPPED; + lf->end_code_len = LJ_BYTECODE_LEN_STRIPPED; + }else if (version == LJ20_BCDUMP_VERSION) + { + lf->end_code_ptr = LJ20_BYTECODE_END_STRIPPED; + lf->end_code_len = LJ_BYTECODE_LEN_STRIPPED; + }else + { + debuginfo("bytecode format version unsupported", __FILE__, __LINE__); + return ERR_SCRIPT_BYTECODE_VERSION_UNSUPPORTED; + } + fsize = tsg_lua_clfactory_file_size(lf->f); + if (fsize < 0) + { + return ERR_SCRIPT_IS_BAD; + } + lf->rest_len = fsize - LJ_HEADERSIZE; + } + return 0; +} + +static const char * tsg_lua_gets(lua_State *L, void *ud, size_t *size) +{ + (void)L; + tsg_lua_clfactory_buffer_t *ls = (tsg_lua_clfactory_buffer_t *)ud; + if (ls->file_type == TSG_LUA_TEXT_FILE) + { + if (ls->sent_begin == 0) + { + ls->sent_begin = 1; + *size = ls->begin_code_len; + return ls->begin_code_ptr; + } + } + if (ls->size == 0) + { + if (ls->sent_end == 0) + { + ls->sent_end = 1; + *size = ls->end_code_len; + return ls->end_code_ptr; + } + return NULL; + } + + if (ls->file_type == TSG_LUA_BC_LJ) + { +#if 0 + lf->rest_len -= ls->size; + if (lf->rest_len == 0) + { + if (--ls->size == 0 && lf->sent_end == 0) + { + lf->sent_end = 1; + *size = lf->end_code_len; + + return lf->end_code_ptr; + } + } +#endif + } + + *size = ls->size; + ls->size = 0; + + return ls->s; +} + +static const char * tsg_lua_getf(lua_State *L, void *ud, size_t *size) +{ + (void)L; + tsg_lua_clfactory_file_t *lf = (tsg_lua_clfactory_file_t *)ud; + if (lf->extraline == 1) + { + lf->extraline = 0; + *size = 1; + return "\n"; + } + + if (lf->sent_begin == 0) + { + lf->sent_begin = 1; + *size = lf->begin_code_len; + if (lf->file_type == TSG_LUA_TEXT_FILE) + { + return lf->begin_code.ptr; + }else + { + return lf->begin_code.str; + } + } + size_t num = fread(lf->buff, 1, sizeof(lf->buff), lf->f); + if (num == 0) + { + if (lf->sent_end == 0) + { + lf->sent_end = 1; + *size = lf->end_code_len; + return lf->end_code_ptr; + } + return NULL; + } + + if (lf->file_type == TSG_LUA_BC_LJ) + { + lf->rest_len -= num; + if (lf->rest_len == 0) + { + if (--num == 0 && lf->sent_end == 0) + { + lf->sent_end = 1; + *size = lf->end_code_len; + + return lf->end_code_ptr; + } + } + } + *size = num; + return lf->buff; +} + +static int c_lua_atpanic(lua_State *L) +{ + char *s = NULL; + char err[255]; + size_t len = 0; + int *lua_id; + + lua_id = (int *)lua_getexdata(L); + if (lua_type(L, -1) == LUA_TSTRING) + { + s = (char *)lua_tolstring(L, -1, &len); + } + + if (s == NULL) + { + s = (char *)"unknow reason"; + len = sizeof(s); + } + sprintf(err, "lua atpanic:lua VM creashed, reason:%*s\n", (int)len, s); + debuginfo(err, __FILE__, __LINE__); + longjmp(lua_exception[*lua_id], 1); +} +#if 0 +int tsg_lua_memmem(lua_State *L) +{ + const char *src; + const char *dest; + size_t src_len, dest_len; + const char *ret; + int start, end; + int parameter_num = lua_gettop(L); + if (parameter_num != 4) + { + return 0; + } + + src = lua_tostring(L, -4); + src_len = lua_tointeger(L, -3); + dest = lua_tostring(L, -2); + dest_len = lua_tointeger(L, -1); + + if (!src || !dest || !src_len || !dest_len) + { + return 0; + } + + ret = (const char *)memmem(src, src_len, dest, dest_len); + if (ret == NULL) + { + return 0; + } + start = ret - src; + end = start + dest_len; + lua_pushinteger(L, start); + lua_pushinteger(L, end); + + return 2; +} + +static void *mem_alloc(void *ud, void *ptr, size_t osize, size_t nsize) +{ + (void)ud; + (void)osize; + if (nsize == 0) { + tc_free(ptr); + return NULL; + } else { + return tc_realloc(ptr, nsize); + } +} +#endif +tsg_lua_handle tsg_lua_vm_create() +{ + lua_State *L; + //const char *err; + + L = luaL_newstate(); + //L = lua_newstate(mem_alloc, NULL); + if (L == NULL) + return NULL; + lua_atpanic(L, c_lua_atpanic); + luaL_openlibs(L); + lua_createtable(L, 0, 2); + //lua_pushcfunction(L, tsg_lua_memmem); + //lua_setfield(L, -2, "memmem"); + lua_setglobal(L, "tsg"); +#if 0 + const char *code = "local ffi = require(\"ffi\")\n"\ + "ffi.cdef[[char *memmem(const char *haystack, size_t haystacklen, const char *needle, size_t needlelen);]]\n"\ + "tsg.ffi = ffi\n"\ + "tsg.C = ffi.C"; + if (luaL_dostring(L, code)) + { + err = lua_tostring(L, -1); + debuginfo(err, __FILE__, __LINE__); + lua_close(L); + return NULL; + } +#endif + return L; +} + +int tsg_lua_exec_file(tsg_lua_handle lua, const char *script, const char *in, size_t in_len, char *out, size_t *out_len, size_t *out_type) +{ + lua_State *L = (lua_State *)lua; + const char *err = NULL; + char err_buf[255]; + int ret = 0; + int i = 0; + int sharp = 0; + tsg_lua_clfactory_file_t lf; + int *lua_id; + + if (L == NULL) + { + debuginfo("lua VM is null.", __FILE__, __LINE__); + return ERR_LUAVM_ISNULL; + } + if (script == NULL) + { + debuginfo("script is null.", __FILE__, __LINE__); + return ERR_SCRIPT_ISNULL; + } + + if (in == NULL) + { + debuginfo("input is null.", __FILE__, __LINE__); + return ERR_INPUT_ISNULL; + } + + if (in_len < 1) + { + debuginfo("in_len is invailed", __FILE__, __LINE__); + return ERR_IN_LEN_INVAILD; + } + + lua_id = (int *)lua_getexdata(L); + + lf.extraline = 0; + lf.sent_begin = 0; + lf.sent_end = 0; + lf.file_type = TSG_LUA_TEXT_FILE; + + lf.f = fopen(script, "r"); + if (lf.f == NULL) + { + return ERR_SCRIPT_NOT_EXIT; + } + int c = getc(lf.f); + if (c == '#') + { + lf.extraline = 1; + while ((c = getc(lf.f)) != EOF && c != '\n') + { + /* skip first line */ + } + if (c == '\n') + { + c = getc(lf.f); + } + sharp = 1; + } + + if (c == LUA_SIGNATURE[0] && script) + { + lf.f = freopen(script, "rb", lf.f); + if (lf.f == NULL) + { + return ERR_SCRIPT_NOT_EXIT; + } + + lf.file_type = TSG_LUA_BC_LJ; + if (sharp) + { + /* 出于对安全的考虑,禁用字节码文件首行不是lua代码的文件 + * 这是因为,字节码文件首行不是lua代码会规避掉一些常规字节码检查 */ + fclose(lf.f); + return ERR_SCRIPT_IS_BAD; + } + + while((c = getc(lf.f)) != EOF && c != LUA_SIGNATURE[0]) + { + /* skip eventual "#! ..." */ + } + int status = tsg_lua_clfactory_bytecode_file_prepare(&lf); + if(status != 0) + { + fclose(lf.f); + return status; + } + lf.extraline = 0; + }else + { + tsg_lua_clfactory_file_text_prepare(&lf); + ungetc(c, lf.f); + } + lua_settop(L, 0); + ret = lua_load(L, tsg_lua_getf, &lf, script); + fclose(lf.f); + if (ret != 0) + { + if (ret == LUA_ERRMEM) + { + return ERR_MEM_NOT_ENOUGH; + } + else if (lua_isstring(L, -1)) + { + err = lua_tostring(L, -1); + debuginfo(err, __FILE__, __LINE__); + for (i = 0; i < SYNTAX_ERROR_INFO_NUM; i++) + { + if (strstr(err, syntax_error[i])) + { + return ERR_SCRIPT_SYNTAX_ERROR - (i + 1); + } + } + return ERR_SCRIPT_SYNTAX_ERROR; + } + else + { + return ERR_UNKNOWN; + } + } + /* set new globaltable */ + lua_createtable(L, 0, 1); + lua_pushvalue(L, -1); + lua_pushvalue(L, LUA_GLOBALSINDEX); + lua_setfield(L, -2, "__index"); + lua_setmetatable(L, -2); + lua_setfenv(L, -2); + + if (lua_pcall(L, 0, LUA_MULTRET, 0)) + { + err = lua_tostring(L, -1); + debuginfo(err, __FILE__, __LINE__); + for (i = 0; i < SYNTAX_ERROR_INFO_NUM; i++) + { + if (strstr(err, syntax_error[i])) + { + return ERR_SCRIPT_SYNTAX_ERROR - (i + 1); + } + } + return ERR_SCRIPT_SYNTAX_ERROR; + } + + /* 输入待处理数据 */ + lua_getglobal(L, "tsg"); + lua_pushlstring(L, in, in_len); + lua_setfield(L, -2, "data"); + lua_settop(L, 1); + + if (setjmp(lua_exception[*lua_id]) == 0) + { + if (lua_pcall(L, 0, LUA_MULTRET, 0)) + { + err = lua_tostring(L, -1); + debuginfo(err, __FILE__, __LINE__); + for (i = 0; i < EXEC_ERROR_INFO_NUM; i++) + { + if ((strstr(err, exec_error[i].err_info1)) && (strstr(err, exec_error[i].err_info2))) + return ERR_SCRIPT_EXEC_ERROR - (i + 1); + } + return ERR_SCRIPT_EXEC_ERROR; + } + int num = lua_gettop(L); + if (num < 2) + { + sprintf((char *)err_buf,"num:%d", num); + debuginfo(err_buf, __FILE__, __LINE__); + return ERR_SCRIPT_RETURN_TOO_FEW; + } + if (num > 2) + { + sprintf((char *)err_buf,"num:%d", num); + debuginfo(err_buf, __FILE__, __LINE__); + return ERR_SCRIPT_RETURN_TOO_MUCH; + } + *out_len = lua_tonumber(L, -2); + if (*out_len < 1) + { + debuginfo("script out_len is 0", __FILE__, __LINE__); + return ERR_SCRIPT_RETURN_LEN_INVAILD; + } + switch(lua_type(L, -1)) + { + case LUA_TSTRING: + memcpy(out, lua_tostring(L, -1), *out_len); + *out_type = STRING; + break; + case LUA_TBOOLEAN: + out[0] = lua_toboolean(L, -1); + //*out_len = 1; + *out_type = BOOLEAN; + break; + case LUA_TNUMBER: + *(long size_t *)out = lua_tointeger(L, -1); + //*out_len = 8; + *out_type = INTEGER; + break; + default: + sprintf((char *)err_buf,"out_type:%d", (lua_type(L, -1))); + debuginfo(err_buf, __FILE__, __LINE__); + *out_len = 0; + return ERR_SCRIPT_RETURN_TYPE_INVAILD; + } + }else + { + return ERR_SCRIPT_EXEC_ERROR; + } + + return 0; +} + + +int tsg_lua_exec(tsg_lua_handle lua, const char *script, size_t script_len, const char *in, size_t in_len, char *out, size_t *out_len, size_t *out_type) +{ + lua_State *L = (lua_State *)lua; + const char *err = NULL; + char err_buf[255]; + int ret = 0; + int i = 0; + int sharp = 0; + int status; + tsg_lua_clfactory_buffer_t ls; + int *lua_id; + + if (L == NULL) + { + debuginfo("lua VM is null.", __FILE__, __LINE__); + return ERR_LUAVM_ISNULL; + } + if (script == NULL) + { + debuginfo("script is null.", __FILE__, __LINE__); + return ERR_SCRIPT_ISNULL; + } + + if (in == NULL) + { + debuginfo("input is null.", __FILE__, __LINE__); + return ERR_INPUT_ISNULL; + } + + if (in_len < 1) + { + debuginfo("in_len is invailed", __FILE__, __LINE__); + return ERR_IN_LEN_INVAILD; + } + + lua_id = (int *)lua_getexdata(L); + + ls.s = script; + ls.size = script_len; + ls.sent_begin = 0; + ls.sent_end = 0; + + if (script[0] == '#') + { + for (i = 0; i < ls.size; i++) + { + if (script[i] == '\n') + { + /* skip extra line */ + ls.s = &script[i]; + ls.size = script_len - i; + break; + } + } + if (i == ls.size) + { + return ERR_SCRIPT_SYNTAX_ERROR; + } + sharp = 1; + } + if (script[i] == LUA_SIGNATURE[0]) + { + /* 不会使用lua虚拟机, 使用的是luajit虚拟机 */ + ls.file_type = TSG_LUA_BC_LJ; + if (sharp) + { + return ERR_SCRIPT_IS_BAD; + } + status = tsg_lua_clfactory_bytecode_buffer_prepare(&ls); + if (status != 0) + { + return status; + } + + }else + { + ls.file_type = TSG_LUA_TEXT_FILE; + ls.begin_code_ptr = TEXT_BEGIN_CODE; + ls.begin_code_len = TEXT_BEGIN_SIZE; + ls.end_code_ptr = TEXT_END_CODE; + ls.end_code_len = TEXT_END_SIZE; + } + lua_settop(L, 0); + ret = lua_load(L, tsg_lua_gets, &ls, "main"); + if (ret != 0) + { + if (ret == LUA_ERRMEM) + { + return ERR_MEM_NOT_ENOUGH; + } + else if (lua_isstring(L, -1)) + { + err = lua_tostring(L, -1); + debuginfo(err, __FILE__, __LINE__); + for (i = 0; i < SYNTAX_ERROR_INFO_NUM; i++) + { + if (strstr(err, syntax_error[i])) + { + return ERR_SCRIPT_SYNTAX_ERROR - (i + 1); + } + } + return ERR_SCRIPT_SYNTAX_ERROR; + } + else + { + return ERR_UNKNOWN; + } + } + /* set new globaltable */ + lua_createtable(L, 0, 1); + lua_pushvalue(L, -1); + lua_pushvalue(L, LUA_GLOBALSINDEX); + lua_setfield(L, -2, "__index"); + lua_setmetatable(L, -2); + lua_setfenv(L, -2); + if (lua_pcall(L, 0, LUA_MULTRET, 0)) + { + err = lua_tostring(L, -1); + debuginfo(err, __FILE__, __LINE__); + for (i = 0; i < SYNTAX_ERROR_INFO_NUM; i++) + { + if (strstr(err, syntax_error[i])) + { + return ERR_SCRIPT_SYNTAX_ERROR - (i + 1); + } + } + return ERR_SCRIPT_SYNTAX_ERROR; + } + + /* 输入待处理数据 */ + lua_getglobal(L, "tsg"); + lua_pushlstring(L, in, in_len); + lua_setfield(L, -2, "data"); + lua_settop(L, 1); + if (setjmp(lua_exception[*lua_id]) == 0) + { + if (lua_pcall(L, 0, LUA_MULTRET, 0)) + { + err = lua_tostring(L, -1); + debuginfo(err, __FILE__, __LINE__); + for (i = 0; i < EXEC_ERROR_INFO_NUM; i++) + { + if ((strstr(err, exec_error[i].err_info1)) && (strstr(err, exec_error[i].err_info2))) + return ERR_SCRIPT_EXEC_ERROR - (i + 1); + } + return ERR_SCRIPT_EXEC_ERROR; + } + int num = lua_gettop(L); + if (num < 2) + { + sprintf((char *)err_buf,"num:%d", num); + debuginfo(err_buf, __FILE__, __LINE__); + return ERR_SCRIPT_RETURN_TOO_FEW; + } + if (num > 2) + { + sprintf((char *)err_buf,"num:%d", num); + debuginfo(err_buf, __FILE__, __LINE__); + return ERR_SCRIPT_RETURN_TOO_MUCH; + } + *out_len = lua_tonumber(L, -2); + if (*out_len < 1) + { + debuginfo("script out_len is 0", __FILE__, __LINE__); + return ERR_SCRIPT_RETURN_LEN_INVAILD; + } + switch(lua_type(L, -1)) + { + case LUA_TSTRING: + memcpy(out, lua_tostring(L, -1), *out_len); + *out_type = STRING; + break; + case LUA_TBOOLEAN: + out[0] = lua_toboolean(L, -1); + //*out_len = 1; + *out_type = BOOLEAN; + break; + case LUA_TNUMBER: + *(long size_t *)out = lua_tointeger(L, -1); + //*out_len = 8; + *out_type = INTEGER; + break; + default: + sprintf((char *)err_buf,"out_type:%d", (lua_type(L, -1))); + debuginfo(err_buf, __FILE__, __LINE__); + *out_len = 0; + return ERR_SCRIPT_RETURN_TYPE_INVAILD; + } + }else + { + return ERR_SCRIPT_EXEC_ERROR; + } + + return 0; +} + +int tsg_lua_cache_script(tsg_lua_handle lua, const char *script, size_t script_len) +{ + size_t script_id = 0; + const char *err = NULL; + int ret = 0; + int i = 0; + int sharp = 0, status = 0; + lua_State *L = (lua_State *)lua; + + if (L == NULL) + { + debuginfo("lua VM is null.", __FILE__, __LINE__); + return ERR_LUAVM_ISNULL; + } + if (script == NULL) + { + debuginfo("script is null.", __FILE__, __LINE__); + return ERR_SCRIPT_ISNULL; + } + + tsg_lua_clfactory_buffer_t ls; + ls.s = script; + ls.size = script_len; + ls.sent_begin = 0; + ls.sent_end = 0; + + if (script[0] == '#') + { + for (i = 0; i < ls.size; i++) + { + if (script[i] == '\n') + { + /* skip extra line */ + ls.s = &script[i]; + ls.size = script_len - i; + break; + } + } + if (i == ls.size) + { + return ERR_SCRIPT_SYNTAX_ERROR; + } + sharp = 1; + } + if (script[i] == LUA_SIGNATURE[0]) + { + /* 不会使用lua虚拟机, 使用的是luajit虚拟机 */ + ls.file_type = TSG_LUA_BC_LJ; + if (sharp) + { + return ERR_SCRIPT_IS_BAD; + } + + status = tsg_lua_clfactory_bytecode_buffer_prepare(&ls); + if (status != 0) + { + return status; + } + + }else + { + ls.file_type = TSG_LUA_TEXT_FILE; + ls.begin_code_ptr = TEXT_BEGIN_CODE; + ls.begin_code_len = TEXT_BEGIN_SIZE; + ls.end_code_ptr = TEXT_END_CODE; + ls.end_code_len = TEXT_END_SIZE; + } + + lua_settop(L, 0); + ret = lua_load(L, tsg_lua_gets, &ls, "string"); + if (ret != 0) + { + if (ret == LUA_ERRMEM) + { + return ERR_MEM_NOT_ENOUGH; + } + else if (lua_isstring(L, -1)) + { + err = lua_tostring(L, -1); + debuginfo(err, __FILE__, __LINE__); + for (i = 0; i < SYNTAX_ERROR_INFO_NUM; i++) + { + if (strstr(err, syntax_error[i])) + { + return ERR_SCRIPT_SYNTAX_ERROR - (i + 1); + } + } + return ERR_SCRIPT_SYNTAX_ERROR; + } + else + { + return ERR_UNKNOWN; + } + } + if (lua_pcall(L, 0, LUA_MULTRET, 0)) + { + err = lua_tostring(L, -1); + debuginfo(err, __FILE__, __LINE__); + for (i = 0; i < SYNTAX_ERROR_INFO_NUM; i++) + { + if (strstr(err, syntax_error[i])) + { + return ERR_SCRIPT_SYNTAX_ERROR - (i + 1); + } + } + return ERR_SCRIPT_SYNTAX_ERROR; + } + + script_id = luaL_ref(L, LUA_REGISTRYINDEX); + if ((script_id == (size_t)LUA_REFNIL) || (script_id == (size_t)LUA_NOREF)) + { + debuginfo("lua cache failed.", __FILE__, __LINE__); + return ERR_LUA_CACHE_FAILED; + } + + return script_id; +} + +int tsg_lua_cache_script_file(tsg_lua_handle lua, const char *script) +{ + size_t script_id; + const char *err = NULL; + int ret = 0; + int i = 0; + int sharp = 0; + tsg_lua_clfactory_file_t lf; + lua_State *L = (lua_State *)lua; + + + if (L == NULL) + { + debuginfo("lua VM is null.", __FILE__, __LINE__); + return ERR_LUAVM_ISNULL; + } + if (script == NULL) + { + debuginfo("script is null.", __FILE__, __LINE__); + return ERR_SCRIPT_ISNULL; + } + lf.extraline = 0; + lf.sent_begin = 0; + lf.sent_end = 0; + lf.file_type = TSG_LUA_TEXT_FILE; + + lf.f = fopen(script, "r"); + if (lf.f == NULL) + { + return ERR_SCRIPT_NOT_EXIT; + } + int c = getc(lf.f); + if (c == '#') + { + lf.extraline = 1; + while ((c = getc(lf.f)) != EOF && c != '\n') + { + /* skip first line */ + } + if (c == '\n') + { + c = getc(lf.f); + } + sharp = 1; + } + + if (c == LUA_SIGNATURE[0] && script) + { + lf.f = freopen(script, "rb", lf.f); + if (lf.f == NULL) + { + return ERR_SCRIPT_NOT_EXIT; + } + lf.file_type = TSG_LUA_BC_LJ; + if (sharp) + { + /* 出于对安全的考虑,禁用字节码文件首行不是lua代码的文件 + * 这是因为,字节码文件首行不是lua代码会规避掉一些常规字节码检查 */ + if(script) + { + fclose(lf.f); + } + + return ERR_SCRIPT_IS_BAD; + } + + while((c = getc(lf.f)) != EOF && c != LUA_SIGNATURE[0]) + { + /* skip eventual "#! ..." */ + } + int status = tsg_lua_clfactory_bytecode_file_prepare(&lf); + if(status != 0) + { + return status; + } + lf.extraline = 0; + }else + { + tsg_lua_clfactory_file_text_prepare(&lf); + ungetc(c, lf.f); + } + lua_settop(L, 0); + ret = lua_load(L, tsg_lua_getf, &lf, script); + fclose(lf.f); + if (ret != 0) + { + if (ret == LUA_ERRMEM) + { + return ERR_MEM_NOT_ENOUGH; + } + else if (lua_isstring(L, -1)) + { + err = lua_tostring(L, -1); + debuginfo(err, __FILE__, __LINE__); + for (i = 0; i < SYNTAX_ERROR_INFO_NUM; i++) + { + if (strstr(err, syntax_error[i])) + { + return ERR_SCRIPT_SYNTAX_ERROR - (i + 1); + } + } + return ERR_SCRIPT_SYNTAX_ERROR; + } + else + { + return ERR_UNKNOWN; + } + } + /* set new globaltable */ + lua_createtable(L, 0, 1); + lua_pushvalue(L, -1); + lua_pushvalue(L, LUA_GLOBALSINDEX); + lua_setfield(L, -2, "__index"); + lua_setmetatable(L, -2); + lua_setfenv(L, -2); + + if (lua_pcall(L, 0, LUA_MULTRET, 0)) + { + err = lua_tostring(L, -1); + debuginfo(err, __FILE__, __LINE__); + for (i = 0; i < SYNTAX_ERROR_INFO_NUM; i++) + { + if (strstr(err, syntax_error[i])) + { + return ERR_SCRIPT_SYNTAX_ERROR - (i + 1); + } + } + return ERR_SCRIPT_SYNTAX_ERROR; + } + + /* cache script */ + script_id = luaL_ref(L, LUA_REGISTRYINDEX); + if ((script_id == (size_t)LUA_REFNIL) || (script_id == (size_t)LUA_NOREF)) + { + debuginfo("lua cache failed.", __FILE__, __LINE__); + return ERR_LUA_CACHE_FAILED; + } + + return script_id; +} + +int tsg_lua_uncache_script(tsg_lua_handle lua, size_t script_id) +{ + lua_State *L = (lua_State *)lua; + + if (L == NULL) + { + debuginfo("lua VM is null.", __FILE__, __LINE__); + return ERR_LUAVM_ISNULL; + } + + luaL_unref(L, LUA_REGISTRYINDEX, script_id); + + return 0; +} + +int tsg_lua_cache_exec(tsg_lua_handle lua, size_t script_id, const char *in, size_t in_len, char *out, size_t *out_len, size_t *out_type) +{ + lua_State *L = (lua_State *)lua; + const char *err; + char err_buf[255]; + int i = 0; + int num = 0; + int *lua_id; + + if (L == NULL) + { + debuginfo("lua VM is null.", __FILE__, __LINE__); + return ERR_LUAVM_ISNULL; + } + if (script_id < 1) + { + debuginfo("script_id is invaild.", __FILE__, __LINE__); + return ERR_SCRIPT_ID_INVAILD; + } + if (in == NULL) + { + debuginfo("input is null.", __FILE__, __LINE__); + return ERR_INPUT_ISNULL; + } + if (in_len < 1) + { + debuginfo("in_len is invailed", __FILE__, __LINE__); + return ERR_IN_LEN_INVAILD; + } + + lua_settop(L, 0); + lua_id = (int *)lua_getexdata(L); + + lua_rawgeti(L, LUA_REGISTRYINDEX, script_id); + lua_getglobal(L, "tsg"); + lua_pushlstring(L, in, in_len); + lua_setfield(L, -2, "data"); + lua_settop(L, 1); + + if (setjmp(lua_exception[*lua_id]) == 0) + { + if (lua_pcall(L, 0, LUA_MULTRET, 0)) + { + err = lua_tostring(L, -1); + debuginfo(err, __FILE__, __LINE__); + for (i = 0; i < EXEC_ERROR_INFO_NUM; i++) + { + if ((strstr(err, exec_error[i].err_info1)) && (strstr(err, exec_error[i].err_info2))) + return ERR_SCRIPT_EXEC_ERROR - (i + 1); + } + return ERR_SCRIPT_EXEC_ERROR; + } + num = lua_gettop(L); + if (num < 2) + { + sprintf((char *)err_buf,"num:%d", num); + debuginfo(err_buf, __FILE__, __LINE__); + return ERR_SCRIPT_RETURN_TOO_FEW; + } + if (num > 2) + { + sprintf((char *)err_buf,"num:%d", num); + debuginfo(err_buf, __FILE__, __LINE__); + return ERR_SCRIPT_RETURN_TOO_MUCH; + } + + *out_len = lua_tonumber(L, -2); + if (*out_len < 1) + { + debuginfo("script out_len is 0", __FILE__, __LINE__); + return ERR_SCRIPT_RETURN_LEN_INVAILD; + } + switch(lua_type(L, -1)) + { + case LUA_TSTRING: + memcpy(out, lua_tostring(L, -1), *out_len); + *out_type = STRING; + break; + case LUA_TBOOLEAN: + out[0] = lua_toboolean(L, -1); + //*out_len = 1; + *out_type = BOOLEAN; + break; + case LUA_TNUMBER: + *(size_t *)out = lua_tointeger(L, -1); + //*out_len = 8; + *out_type = INTEGER; + break; + default: + sprintf((char *)err_buf,"out_type:%d", lua_type(L, -1)); + debuginfo(err_buf, __FILE__, __LINE__); + *out_len = 0; + return ERR_SCRIPT_RETURN_TYPE_INVAILD; + } + }else + { + return ERR_SCRIPT_EXEC_ERROR; + } + + return 0; +} + +int tsg_destory_lua(tsg_lua_handle lua) +{ + lua_State *L = (lua_State *)lua; + + if (L == NULL) + { + debuginfo("lua VM is null.", __FILE__, __LINE__); + return ERR_LUAVM_ISNULL; + } + + lua_close(L); + return 0; +} + +int tsg_lua_identify(tsg_lua_handle lua, size_t *id) +{ + lua_State *L = (lua_State *)lua; + if (L == NULL) + { + debuginfo("lua VM is null.", __FILE__, __LINE__); + return ERR_LUAVM_ISNULL; + } + if (*id > TSG_MAX_LUA_ID) + { + return ERR_LUA_ID; + } + + lua_setexdata(L, id); + + return 0; +} diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt new file mode 100644 index 0000000..7992f24 --- /dev/null +++ b/test/CMakeLists.txt @@ -0,0 +1,9 @@ +cmake_minimum_required(VERSION 2.8) +#include_directories("/usr/local/openresty/luajit/include/luajit-2.1/") +include_directories("../include") +link_directories("/root/workspace/tsg_lua_0.99/lib") +link_libraries("libtsglua.so") +add_definitions(-g -W -Wall -O0) +add_executable(../singlethread_test test.cpp) +add_executable(../multithread_test multithread_test.cpp) +target_link_libraries(../multithread_test tsglua pthread) diff --git a/test/cache_bytecode_G b/test/cache_bytecode_G Binary files differnew file mode 100755 index 0000000..a3c1282 --- /dev/null +++ b/test/cache_bytecode_G diff --git a/test/multithread_test b/test/multithread_test Binary files differnew file mode 100755 index 0000000..46e4fa3 --- /dev/null +++ b/test/multithread_test diff --git a/test/multithread_test.cpp b/test/multithread_test.cpp new file mode 100644 index 0000000..1f4293b --- /dev/null +++ b/test/multithread_test.cpp @@ -0,0 +1,384 @@ +/************************************************************************* + > File Name: multithread_test.cpp + > Author: pxz + > Created Time: Sat 01 Aug 2020 11:53:47 AM CST + ************************************************************************/ +extern "C" +{ + #include<stdio.h> + #include<string.h> + #include<time.h> + #include<unistd.h> + #include<pthread.h> + #include"tsg_lua_interface.h" +} +#define calc_time(__start, __end) \ + (((__end).tv_sec * 1000 * 1000 * 1000 + (__end).tv_nsec) -\ + ((__start).tv_sec * 1000 * 1000 * 1000 + (__start).tv_nsec)) + +#ifndef THREAD_NUM +#define THREAD_NUM 4 +#endif + +char script[4096]; +size_t script_len; +const char *content = "GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGA\ + TCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACT\ + AAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAG\ + GCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCG\ + CCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGT\ + GGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCA\ + GGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAA\ + TTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAG\ + AATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCA\ + GCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGT\ + AATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACC\ + AGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTG\ + GTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACC\ + CGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAG\ + AGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTT\ + TGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACA\ + TGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCT\ + GTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGG\ + TTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGT\ + CTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGG\ + CGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCG\ + TCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTA\ + CTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCG\ + AGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCG\ + GGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACC\ + TGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAA\ + TACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGA\ + GGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACT\ + GCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTC\ + ACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGT\ + TCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGC\ + CGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCG\ + CTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTG\ + GGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCC\ + CAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCT\ + GGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGC\ + GCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGA\ + GGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGA\ + GACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGA\ + GGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTG\ + AAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAAT\ + CCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCA\ + GTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAA\ + AAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGC\ + GGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCT\ + ACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGG\ + GAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATC\ + GCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGC\ + GGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGG\ + TCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAA\ + AAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAG\ + GAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACT\ + CCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCC\ + TGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAG\ + ACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGC\ + GTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGA\ + ACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGA\ + CAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCA\ + CTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCA\ + ACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCG\ + CCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGG\ + AGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTC\ + CGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCG\ + AGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACC\ + CCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAG\ + CTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAG\ + CCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGG\ + CCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATC\ + ACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAA\ + AAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGC\ + TGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCC\ + ACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGG\ + CTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGG\ + AGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATT\ + AGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAA\ + TCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGC\ + CTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAA\ + TCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAG\ + CCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGT\ + GGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCG\ + GGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAG\ + CGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTG\ + GGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATG\ + GTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGT\ + AATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTT\ + GCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCT\ + CAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCG\ + GGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTC\ + TCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACT\ + CGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAG\ + ATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGG\ + CGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTG\ + AGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATA\ + CAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGG\ + CAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGC\ + ACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCAC\ + GCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTC\ + GAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCG\ + GGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCT\ + TGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGG\ + CGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCA\ + GCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGG\ + CCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGC\ + GCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGG\ + CGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGA\ + CTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGG\ + CCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAA\ + ACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCC\ + CAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGT\ + GAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAA\ + AGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGG\ + ATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTAC\ + TAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGA\ + GGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGC\ + GCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGG\ + TGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTC\ + AGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAA\ + ATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGA\ + GAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCC\ + AGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTG\ + TAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGAC\ + CAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGT\ + GGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAAC\ + CCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACA\ + GAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACT\ + TTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAAC\ + ATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCC\ + TGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAG\ + GTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCG\ + TCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAG\ + GCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCC\ + GTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCT\ + ACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCC\ + GAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCC\ + GGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCAC\ + CTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAA\ + ATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTG\ + AGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCAC\ + TGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCT\ + CACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAG\ + TTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAG\ + CCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATC\ + GCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCT\ + GGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATC\ + CCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCC\ + TGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGG\ + CGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGG\ + AGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCG\ + AGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGG\ + AGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGT\ + GAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAA\ + TCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGC\ + AGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCA\ + AAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGG\ + CGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTC\ + TACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCG\ + GGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGAT\ + CGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCG\ + CGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAG\ + GTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACA\ + AAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCA\ + GGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCAC\ + TCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGC\ + CTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGA\ + GACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGG\ + CGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTG\ + AACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCG\ + ACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGC\ + ACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCC\ + AACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGC\ + GCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAA"; +size_t content_len; + +static char *get_script_buffer(const char *file) +{ + FILE *fp = fopen(file, "r"); + if (fp) + { + int num = fread(script, 1, 4096, fp); + if (num != 0) + { + script[num] = 0; + script_len = num; + return script; + } + } + return NULL; +} + +static void *test_tsg_lua_exec(void *ptr) +{ + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + memset(out, 0, sizeof(out)); + tsg_lua_handle L = (tsg_lua_handle)ptr; + int i = 0; + + for (i = 0; i < 10000; i++) + { + tsg_lua_exec(L, script, script_len, content, content_len, out, &out_len, &out_type); + } + pthread_exit(NULL); +} + +static void *test_tsg_cache_exec(void *ptr) +{ + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + memset(out, 0, sizeof(out)); + tsg_lua_handle L = (tsg_lua_handle)ptr; + int i = 0; + + int script_id = tsg_lua_cache_script(L, script, script_len); + for (i = 0; i < 10000; i++) + { + tsg_cache_exec(L, script_id, content, content_len, out, &out_len, &out_type); + } + pthread_exit(NULL); +} + +static void *test_c_func(void *ptr) +{ + (void)ptr; + int i = 0; + + for (i = 0; i < 10000; i++) + { +#if 1 + if (strstr(content, "GGGGGGGGGG")) + { + printf("get GGGGGGGGGG\n"); + return NULL; + } +#else + size_t j = 0; + for (j = 0; j < content_len; j++) + { + if (content[j] == 'G') + { + if (strncmp(&content[j], "GGGGGGGGGG", 10) == 0) + { + printf("get GGGGGGGGGG\n"); + return NULL; + } + } + } +#endif + } + pthread_exit(NULL); +} + +int main() +{ + int i = 0; + tsg_lua_handle lua[THREAD_NUM] = {0}; + pthread_t thread[THREAD_NUM] = {0}; + struct timespec time_start, time_end; + long time1 = 0, time2 = 0, time3 = 0, time4 = 0, time5 = 0; + + content_len = strlen(content); + + for (i = 0; i < THREAD_NUM; i++) + { + lua[i] = tsg_lua_vm_create(); + if (lua[i] == NULL) + { + return -1; + } + } + + /* tsg_lua_exec 运行luajit文本脚本 */ + get_script_buffer("./multithread_test.lua"); + clock_gettime(CLOCK_REALTIME, &time_start); + for (i = 0; i < THREAD_NUM; i++) + { + pthread_create(&thread[i], NULL, test_tsg_lua_exec, lua[i]); + } + for (i = 0; i < THREAD_NUM; i++) + { + pthread_join(thread[i], NULL); + } + clock_gettime(CLOCK_REALTIME, &time_end); + time1 = calc_time(time_start, time_end); + time1 /= 10000; + printf("text script buffer:%ld\n", time1); + sleep(1); + + /* tsg_lua_exec 运行luajit 字节码脚本 */ + get_script_buffer("./multithread_test.luajit"); + clock_gettime(CLOCK_REALTIME, &time_start); + for (i = 0; i < THREAD_NUM; i++) + { + pthread_create(&thread[i], NULL, test_tsg_lua_exec, lua[i]); + } + for (i = 0; i < THREAD_NUM; i++) + { + pthread_join(thread[i], NULL); + } + clock_gettime(CLOCK_REALTIME, &time_end); + time2 = calc_time(time_start, time_end); + time2 /= 10000; + printf("bytecode script buffer:%ld\n", time2); + sleep(1); + + /* tsg_cache_exec 运行lua文本脚本 */ + get_script_buffer("./multithread_test.lua"); + clock_gettime(CLOCK_REALTIME, &time_start); + for (i = 0; i < THREAD_NUM; i++) + { + pthread_create(&thread[i], NULL, test_tsg_cache_exec, lua[i]); + } + for (i = 0; i < THREAD_NUM; i++) + { + pthread_join(thread[i], NULL); + } + clock_gettime(CLOCK_REALTIME, &time_end); + time3 = calc_time(time_start, time_end); + time3 /= 10000; + printf("cache text script buffer:%ld\n", time3); + sleep(1); + + /* tsg_lua_exec 运行lua文本脚本 */ + get_script_buffer("./multithread_test.luajit"); + clock_gettime(CLOCK_REALTIME, &time_start); + for (i = 0; i < THREAD_NUM; i++) + { + pthread_create(&thread[i], NULL, test_tsg_cache_exec, lua[i]); + } + for (i = 0; i < THREAD_NUM; i++) + { + pthread_join(thread[i], NULL); + } + clock_gettime(CLOCK_REALTIME, &time_end); + time4 = calc_time(time_start, time_end); + time4 /= 10000; + printf("cache bytecode script buffer:%ld\n", time4); + sleep(1); + + clock_gettime(CLOCK_REALTIME, &time_start); + for (i = 0; i < THREAD_NUM; i++) + { + pthread_create(&thread[i], NULL, test_c_func, lua[i]); + } + for (i = 0; i < THREAD_NUM; i++) + { + pthread_join(thread[i], NULL); + } + clock_gettime(CLOCK_REALTIME, &time_end); + time5 = calc_time(time_start, time_end); + time5 /= 10000; + printf("C func:%ld\n", time5); + + printf("text script buffer / C func:%lf%%\n", time1 * 100.00 / time5); + printf("bytecode script buffer / C func:%lf%%\n", time2 * 100.00 / time5); + printf("cache text script buffer / C func:%lf%%\n", time3 * 100.00 / time5); + printf("cache bytecode script buffer / C func:%lf%%\n", time4 * 100.00 / time5); + return 0; +} diff --git a/test/multithread_test.lua b/test/multithread_test.lua new file mode 100644 index 0000000..7c4c2e8 --- /dev/null +++ b/test/multithread_test.lua @@ -0,0 +1,48 @@ +--[[ +--慢,原因是string.match不能转化成bytecode不能被jit +local str = tsg.data +if (string.match(str, "GGGGGGGGGG")) then + print("get GGGGGGGGGG") + return 1, true +end +return 1, false +]] +--[[ +local str = tsg.data +local i, j +local sub = "GGGGGGGGGG" +local sub_len = string.len(sub) +for i = 1, string.len(str) - sub_len do + if (string.byte(str, i) == "G") then + for j = 2, sub_len do + if string.byte(str, i + j - 1) ~= string.byte(sub, j) then + break; + end + if j == sub_len then + return 1, true + end + end + end +end +return 1, false +]] + +--[[ +local str = tsg.data +local i +local sub = "GGGGGGGGGG" +for i = 1, string.len(str) - 10 do + if string.byte(str, i) == 'G' then + if string.sub(str, i, i+9) == sub then + return 1, true + end + end +end +return 1, false +]] +local str = tsg.data +if string.find(str, "GGGGGGGGG") then + return 1,true +else + return 1, false +end diff --git a/test/multithread_test.luajit b/test/multithread_test.luajit Binary files differnew file mode 100644 index 0000000..54fbb2e --- /dev/null +++ b/test/multithread_test.luajit diff --git a/test/singlethread_test b/test/singlethread_test Binary files differnew file mode 100755 index 0000000..72a4bc9 --- /dev/null +++ b/test/singlethread_test diff --git a/test/test.cpp b/test/test.cpp new file mode 100644 index 0000000..dcbe900 --- /dev/null +++ b/test/test.cpp @@ -0,0 +1,316 @@ +/************************************************************************* + > File Name: main.c + > Author: pxz + > Mail: [email protected] + > Created Time: Thu 09 Jul 2020 07:08:40 AM CST + ************************************************************************/ +extern "C" +{ + #include<stdio.h> + #include<string.h> + #include<time.h> + #include<unistd.h> + #include"tsg_lua_interface.h" +} +#define calc_time(__start, __end) \ + (((__end).tv_sec * 1000 * 1000 * 1000 + (__end).tv_nsec) -\ + ((__start).tv_sec * 1000 * 1000 * 1000 + (__start).tv_nsec)) + +static size_t script_len; +static char buffer[4096]; +const char *content = "GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGA\ + TCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACT\ + AAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAG\ + GCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCG\ + CCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGT\ + GGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCA\ + GGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAA\ + TTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAG\ + AATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCA\ + GCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGT\ + AATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACC\ + AGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTG\ + GTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACC\ + CGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAG\ + AGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTT\ + TGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACA\ + TGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCT\ + GTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGG\ + TTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGT\ + CTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGG\ + CGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCG\ + TCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTA\ + CTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCG\ + AGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCG\ + GGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACC\ + TGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAA\ + TACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGA\ + GGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACT\ + GCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTC\ + ACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGT\ + TCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGC\ + CGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCG\ + CTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTG\ + GGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCC\ + CAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCT\ + GGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGC\ + GCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGA\ + GGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGA\ + GACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGA\ + GGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTG\ + AAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAAT\ + CCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCA\ + GTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAA\ + AAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGC\ + GGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCT\ + ACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGG\ + GAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATC\ + GCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGC\ + GGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGG\ + TCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAA\ + AAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAG\ + GAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACT\ + CCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCC\ + TGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAG\ + ACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGC\ + GTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGA\ + ACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGA\ + CAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCA\ + CTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCA\ + ACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCG\ + CCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGG\ + AGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTC\ + CGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCG\ + AGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACC\ + CCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAG\ + CTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAG\ + CCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGG\ + CCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATC\ + ACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAA\ + AAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGC\ + TGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCC\ + ACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGG\ + CTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGG\ + AGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATT\ + AGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAA\ + TCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGC\ + CTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAA\ + TCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAG\ + CCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGT\ + GGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCG\ + GGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAG\ + CGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTG\ + GGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATG\ + GTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGT\ + AATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTT\ + GCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCT\ + CAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCG\ + GGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTC\ + TCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACT\ + CGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAG\ + ATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGG\ + CGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTG\ + AGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATA\ + CAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGG\ + CAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGC\ + ACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCAC\ + GCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTC\ + GAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCG\ + GGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCT\ + TGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGG\ + CGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCA\ + GCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGG\ + CCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGC\ + GCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGG\ + CGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGA\ + CTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGG\ + CCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAA\ + ACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCC\ + CAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGT\ + GAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAA\ + AGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGG\ + ATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTAC\ + TAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGA\ + GGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGC\ + GCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGG\ + TGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTC\ + AGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAA\ + ATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGA\ + GAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCC\ + AGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTG\ + TAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGAC\ + CAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGT\ + GGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAAC\ + CCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACA\ + GAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACT\ + TTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAAC\ + ATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCC\ + TGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAG\ + GTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCG\ + TCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAG\ + GCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCC\ + GTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCT\ + ACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCC\ + GAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCC\ + GGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCAC\ + CTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAA\ + ATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTG\ + AGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCAC\ + TGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCT\ + CACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAG\ + TTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAG\ + CCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATC\ + GCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCT\ + GGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATC\ + CCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCC\ + TGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGG\ + CGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGG\ + AGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCG\ + AGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGG\ + AGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGT\ + GAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAA\ + TCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGC\ + AGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCA\ + AAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGG\ + CGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTC\ + TACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCG\ + GGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGAT\ + CGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCG\ + CGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAG\ + GTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACA\ + AAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCA\ + GGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCAC\ + TCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGC\ + CTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGA\ + GACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGG\ + CGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTG\ + AACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCG\ + ACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGC\ + ACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCC\ + AACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGC\ + GCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAA"; +size_t content_len; +static char *get_script_buffer(const char *script) +{ + FILE *fp = fopen(script, "r"); + if (fp) + { + int num = fread(buffer, 1, content_len, fp); + if (num != 0) + { + buffer[num] = 0; + script_len = num; + return buffer; + } + } + return NULL; +} + +int main() +{ + struct timespec time_start, time_end; + int i = 0, j = 0; + long time1 = 0, time2 = 0, time3 = 0, time4 = 0, time5 = 0; + char out[255]; + size_t out_len = 0; + size_t out_type = 0; + const char *bytecode_script_buffer; + int script_id; + /* 初始化1个虚拟机 */ + tsg_lua_handle L = tsg_lua_vm_create(); + content_len = strlen(content); +#if 0 + /* lua 运行字符串脚本 */ + const char *text_script_buffer = get_script_buffer("./multithread_test.lua"); + memset(out, 0, sizeof(out)); + clock_gettime(CLOCK_REALTIME, &time_start); + for (i = 0; i < 10000; i++) + { + tsg_lua_exec(L, text_script_buffer, script_len - 1, content, content_len, out, &out_len, &out_type); + } + clock_gettime(CLOCK_REALTIME, &time_end); + time1 = calc_time(time_start, time_end); + time1 /= 10000; + printf("text script buffer:%ld\n", time1); + sleep(1); + /* lua 运行字符串字节码脚本 */ + const char *bytecode_script_buffer = get_script_buffer("./multithread_test.luajit"); + memset(out, 0, sizeof(out)); + clock_gettime(CLOCK_REALTIME, &time_start); + for (i = 0; i < 10000; i++) + { + tsg_lua_exec(L, bytecode_script_buffer, script_len, content, content_len, out, &out_len, &out_type); + } + clock_gettime(CLOCK_REALTIME, &time_end); + time2 = calc_time(time_start, time_end); + time2 /= 10000; + printf("bytecode script buffer:%ld\n", time2); + sleep(1); + + /* lua 缓存字符串脚本运行 */ + text_script_buffer = get_script_buffer("./multithread_test.lua"); + memset(out, 0, sizeof(out)); + clock_gettime(CLOCK_REALTIME, &time_start); + int script_id = tsg_lua_cache_script(L, text_script_buffer, script_len - 1); + for (i = 0; i < 10000; i++) + { + tsg_cache_exec(L, script_id, content, content_len, out, &out_len, &out_type); + } + clock_gettime(CLOCK_REALTIME, &time_end); + time3 = calc_time(time_start, time_end); + time3 /= 10000; + printf("cache text script buffer:%ld\n", time3); + sleep(1); +#endif + /* lua 缓存字符串字节码脚本运行 */ + bytecode_script_buffer = get_script_buffer("./test.luajit"); + memset(out, 0, sizeof(out)); + clock_gettime(CLOCK_REALTIME, &time_start); + script_id = tsg_lua_cache_script(L, bytecode_script_buffer, script_len); + for (i = 0; i < 10000; i++) + { + tsg_cache_exec(L, script_id, content, content_len, out, &out_len, &out_type); + } + clock_gettime(CLOCK_REALTIME, &time_end); + time4 = calc_time(time_start, time_end); + time4 /= 10000; + printf("cache bytecode script buffer:%ld\n", time4); + /* 关闭lua */ + tsg_destory_lua(L); +#if 0 + sleep(1); + /* C 处理 */ + clock_gettime(CLOCK_REALTIME, &time_start); + for (i = 0; i < 10000; i++) + { +#if 0 + for (j = 0; j < (int)content_len; j++) + { + if (content[j] == 0) + { + printf("content[%d] == 0\n", j); + break; + } + } +#else + if (strstr(content, "GGGGGGGGGG")) + { + printf("get GGGGGGGGGG\n"); + return -1; + } +#endif + } + clock_gettime(CLOCK_REALTIME, &time_end); + time5 = calc_time(time_start, time_end); + time5 /= 10000; + printf("time C:%ld\n", time5); + + printf("text script buffer / C:%lf%%\n", time1 * 100.00 / time5); + printf("bytecode script buffer / C:%lf%%\n", time2 * 100.00 / time5); + printf("bytecode script buffer / test script buffer:%lf%%\n", time2 * 100.00 / time1); + printf("\ncache text script buffer / C:%lf%%\n", time3 * 100.00 / time5); + printf("cache bytecode script buffer / C:%lf%%\n", time4 * 100.00 / time5); + printf("cache bytecode script buffer / cache test script buffer:%lf%%\n", time4 * 100.00 / time3); +#endif + return 0; +} diff --git a/test/test.lua b/test/test.lua new file mode 100644 index 0000000..a5d4a54 --- /dev/null +++ b/test/test.lua @@ -0,0 +1,16 @@ +--[[ +local str = tsg.data +for i = 0, string.len(str) do + if (string.byte(str, i) == 0) then + print("find 0\n") + end +end +return 1, true +]] + +local str = tsg.data +if string.find(str, "weixinnum") then + return 1, false +else + return 1, true +end diff --git a/test/test.luajit b/test/test.luajit Binary files differnew file mode 100644 index 0000000..aa345b8 --- /dev/null +++ b/test/test.luajit |
