diff --git a/inc/Maat_command.h b/inc/Maat_command.h index fbdd9a1..ec4796f 100644 --- a/inc/Maat_command.h +++ b/inc/Maat_command.h @@ -156,6 +156,8 @@ int Maat_cmd_set_group(Maat_feather_t feather, int group_id, const struct Maat_r //Return -1 for failed. int Maat_cmd_set_line(Maat_feather_t feather,const struct Maat_line_t* line_rule, enum MAAT_OPERATION op); int Maat_cmd_set_lines(Maat_feather_t feather,const struct Maat_line_t** line_rule, int line_num ,enum MAAT_OPERATION op); +int Maat_cmd_set_file(Maat_feather_t feather,const char* key, const char* value, size_t size, enum MAAT_OPERATION op); + //Return the value of key after the increment. //If the key does not exist, it is set to 0 before performing the operation. long long Maat_cmd_incrby(Maat_feather_t feather,const char* key, int increment); diff --git a/inc/Maat_rule.h b/inc/Maat_rule.h index 8980546..91d373c 100644 --- a/inc/Maat_rule.h +++ b/inc/Maat_rule.h @@ -6,7 +6,7 @@ * to reside in the heart) of the departed would reach the paradise of afterlife * successfully. * Author: zhengchao@iie.ac.cn,MESA -* Version 2018-09-21 rule tags +* Version 2018-09-25 foreign key and rule tags. * NOTE: MUST compile with G++ * All right reserved by Institute of Infomation Engineering,Chinese Academic of Science 2014~2018 ********************************************************* diff --git a/src/entry/Maat_api.cpp b/src/entry/Maat_api.cpp index b920ea7..8b78b3f 100644 --- a/src/entry/Maat_api.cpp +++ b/src/entry/Maat_api.cpp @@ -677,10 +677,11 @@ int Maat_set_feather_opt(Maat_feather_t feather,enum MAAT_INIT_OPT type,const vo } break; case MAAT_OPT_FOREIGN_CONT_DIR: + memset(_feather->foreign_cont_dir, 0, sizeof(_feather->foreign_cont_dir)); strncpy(_feather->foreign_cont_dir, (char*)value, sizeof(_feather->foreign_cont_dir)); - if(_feather->foreign_cont_dir[size-1]=='/') + if(_feather->foreign_cont_dir[strlen(_feather->foreign_cont_dir)-1]=='/') { - _feather->foreign_cont_dir[size-1]='\0'; + _feather->foreign_cont_dir[strlen(_feather->foreign_cont_dir)-1]='\0'; } break; case MAAT_OPT_FOREIGN_CONT_LINGER: diff --git a/src/entry/Maat_command.cpp b/src/entry/Maat_command.cpp index eb06e30..a7d581c 100644 --- a/src/entry/Maat_command.cpp +++ b/src/entry/Maat_command.cpp @@ -23,6 +23,8 @@ const char* rm_expire_lock="EXPIRE_OP_LOCK"; const long rm_expire_lock_timeout=300*1000; const static int MAAT_REDIS_SYNC_TIME=30*60; const char* rm_op_str[]={"DEL","ADD","RENEW_TIMEOUT"}; +const char* foreign_source_prefix="redis://"; +const char* foreign_key_prefix="__FILE_"; struct _Maat_cmd_inner_t @@ -1386,17 +1388,18 @@ const char* find_Nth_column(const char* line, int Nth, int* column_len) int start=0, end=0; for(i=0;i<(int)strlen(line);i++) { - if(line[i]==' '||line[i]=='\t') + if(line[i]!=' '&&line[i]!='\t') { - j++; + continue; } + j++; if(j==Nth-1) { start=i+1; } if(j==Nth) { - end=i+1; + end=i; break; } } @@ -1415,7 +1418,7 @@ char* get_foreign_cont_filename(const char* table_name, int rule_id, const char* { char* filename=NULL; char buffer[512]; - snprintf(buffer, sizeof(buffer),"%s/%s/%d%s",dir, table_name, rule_id, foreign_key); + snprintf(buffer, sizeof(buffer),"%s/%s-%d-%s",dir, table_name, rule_id, foreign_key); filename=(char*)calloc(sizeof(char), strlen(buffer)+1); memcpy(filename, buffer, strlen(buffer)); return filename; @@ -1442,13 +1445,12 @@ void rewrite_table_line_with_foreign(struct serial_rule_t*p) origin_column=find_Nth_column(p->table_line, p->f_keys[i].column, &origin_column_size); strncat(pos_rewrite_line, pos_origin_line, origin_column-pos_origin_line); pos_rewrite_line+=origin_column-pos_origin_line; - pos_origin_line+=origin_column_size; + pos_origin_line=origin_column+origin_column_size; strncat(pos_rewrite_line, p->f_keys[i].filename, strlen(p->f_keys[i].filename)); pos_rewrite_line+=strlen(p->f_keys[i].filename); } strncat(pos_rewrite_line, pos_origin_line, strlen(p->table_line)-(pos_origin_line-p->table_line)); - pos_rewrite_line+=strlen(p->f_keys[i].filename); free(p->table_line); p->table_line=rewrite_line; @@ -1457,11 +1459,9 @@ void rewrite_table_line_with_foreign(struct serial_rule_t*p) int get_foreign_keys(redisContext *ctx, struct serial_rule_t* rule_list, int rule_num, _Maat_feather_t* feather, const char* dir,void *logger) { int ret=0, table_id=0, i=0, j=0; - int foregin_key_size=0; + int foreign_key_size=0; int rule_with_foreign_key=0; - const char* foreign_source_prefix="redis://"; - const char* foreign_key_prefix="__FILE_"; - const char* p_foregin=NULL; + const char* p_foreign=NULL; struct _Maat_table_info_t* p_table=NULL; struct stat file_info; for(i=0; in_foreign;j++) { - p_foregin=find_Nth_column(rule_list[i].table_line, p_table->foreign_columns[j], &foregin_key_size); - if(p_foregin==NULL) + p_foreign=find_Nth_column(rule_list[i].table_line, p_table->foreign_columns[j], &foreign_key_size); + if(p_foreign==NULL) { MESA_handle_runtime_log(logger,RLOG_LV_FATAL,maat_redis_monitor , "Get %s,%d foreign keys failed: No %dth column." , rule_list[i].table_name, rule_list[i].rule_id, p_table->foreign_columns[j]); continue; } - if(0!=strncasecmp(p_foregin, foreign_source_prefix, strlen(foreign_source_prefix))) + if(0!=strncmp(p_foreign, foreign_source_prefix, strlen(foreign_source_prefix))) { MESA_handle_runtime_log(logger,RLOG_LV_FATAL,maat_redis_monitor ,"Get %s,%d foreign key failed: Invalid source prefix %s." - , rule_list[i].table_name, rule_list[i].rule_id, p_foregin); + , rule_list[i].table_name, rule_list[i].rule_id, p_foreign); continue; } rule_list[i].f_keys[j].column=p_table->foreign_columns[j]; - foregin_key_size=foregin_key_size+1-strlen(foreign_source_prefix); - p_foregin+=strlen(foreign_source_prefix); - if(0!=strncasecmp(p_foregin, foreign_key_prefix, strlen(foreign_key_prefix))) + foreign_key_size=foreign_key_size-strlen(foreign_source_prefix); + p_foreign+=strlen(foreign_source_prefix); + if(0!=strncmp(p_foreign, foreign_key_prefix, strlen(foreign_key_prefix))) { MESA_handle_runtime_log(logger,RLOG_LV_INFO,maat_redis_monitor ,"%s,%d foreign key prefix %s is discouraged." - , rule_list[i].table_name, rule_list[i].rule_id, p_foregin); + , rule_list[i].table_name, rule_list[i].rule_id, p_foreign); } - rule_list[i].f_keys[j].key=(char*)calloc(sizeof(char),foregin_key_size); - memcpy(rule_list[i].f_keys[j].key, p_foregin, foregin_key_size); + rule_list[i].f_keys[j].key=(char*)calloc(sizeof(char),foreign_key_size+1); + memcpy(rule_list[i].f_keys[j].key, p_foreign, foreign_key_size); - rule_list[i].f_keys[j].filename=get_foreign_cont_filename(rule_list[i].table_name, rule_list[i].rule_id, p_foregin, dir); + rule_list[i].f_keys[j].filename=get_foreign_cont_filename(rule_list[i].table_name, rule_list[i].rule_id, rule_list[i].f_keys[j].key, dir); ret=stat(rule_list[i].f_keys[j].filename, &file_info); if(ret==0) { @@ -1867,11 +1867,14 @@ int Maat_cmd_set_group(Maat_feather_t feather,int group_id, const struct Maat_re } int Maat_cmd_set_lines(Maat_feather_t feather,const struct Maat_line_t** line_rule, int line_num ,enum MAAT_OPERATION op) { - int i=0; + int i=0, j=0; _Maat_feather_t* _feather=(_Maat_feather_t*)feather; int ret=0, table_id=0,success_cnt=0; struct serial_rule_t *s_rule=NULL; + struct _Maat_table_info_t* p_table=NULL; long long server_time=0,absolute_expire_time=0; + const char* p_foreign=NULL; + int foreign_key_size=0; if(_feather->redis_write_ctx==NULL) { ret=connect_redis_for_write(_feather); @@ -1894,7 +1897,8 @@ int Maat_cmd_set_lines(Maat_feather_t feather,const struct Maat_line_t** line_ru ret=-1; goto error_out; } - if(TABLE_TYPE_PLUGIN!=_feather->p_table_info[table_id]->table_type) + p_table=_feather->p_table_info[table_id]; + if(TABLE_TYPE_PLUGIN!=p_table->table_type) { MESA_handle_runtime_log(_feather->logger,RLOG_LV_FATAL,maat_command ,"Command set line id %d failed: table %s is not a plugin table." @@ -1906,14 +1910,14 @@ int Maat_cmd_set_lines(Maat_feather_t feather,const struct Maat_line_t** line_ru if(op==MAAT_OP_ADD) { ret=get_valid_flag_offset(line_rule[i]->table_line - , _feather->p_table_info[table_id]->table_type - , _feather->p_table_info[table_id]->valid_flag_column); + , p_table->table_type + , p_table->valid_flag_column); if(ret<0|| (op==MAAT_OP_ADD&&line_rule[i]->table_line[ret]!='1')) { MESA_handle_runtime_log(_feather->logger,RLOG_LV_FATAL,maat_command - ,"Command set line id %d failed: illegal valid flag." - , line_rule[i]->rule_id); + ,"Command set line %s %d failed: illegal valid flag." + , line_rule[i]->table_name, line_rule[i]->rule_id); ret=-1; goto error_out; } @@ -1926,6 +1930,31 @@ int Maat_cmd_set_lines(Maat_feather_t feather,const struct Maat_line_t** line_ru { absolute_expire_time=server_time+line_rule[i]->expire_after; } + if(p_table->n_foreign>0) + { + for(j=0;jn_foreign;j++) + { + p_foreign=find_Nth_column(line_rule[i]->table_line, p_table->foreign_columns[j], &foreign_key_size); + if(p_foreign==NULL) + { + MESA_handle_runtime_log(_feather->logger,RLOG_LV_FATAL, maat_command + , "Command set line %s %d failed: No %dth column." + , line_rule[i]->table_name, line_rule[i]->rule_id + , p_table->foreign_columns[j]); + ret=-1; + goto error_out; + } + if(0!=strncmp(p_foreign, foreign_source_prefix, strlen(foreign_source_prefix))) + { + MESA_handle_runtime_log(_feather->logger,RLOG_LV_FATAL,maat_redis_monitor + ,"Command set line %s %d failed: Source prefix %s is mandatory." + , line_rule[i]->table_name, line_rule[i]->rule_id, foreign_source_prefix); + ret=-1; + goto error_out; + } + } + + } set_serial_rule(s_rule+i, op,line_rule[i]->rule_id,line_rule[i]->label_id,line_rule[i]->table_name,line_rule[i]->table_line, absolute_expire_time); } success_cnt=exec_serial_rule(_feather->redis_write_ctx,s_rule, line_num,server_time,_feather->logger); @@ -1948,6 +1977,49 @@ int Maat_cmd_set_line(Maat_feather_t feather,const struct Maat_line_t* line_rule ret=Maat_cmd_set_lines(feather,&line_rule, 1, op); return ret; } +int Maat_cmd_set_file(Maat_feather_t feather,const char* key, const char* value, size_t size, enum MAAT_OPERATION op) +{ + struct _Maat_feather_t* _feather=(struct _Maat_feather_t*)feather; + redisContext* ctx=_feather->redis_write_ctx; + const char *arg_vec[3]; + size_t len_vec[3]; + arg_vec[0] = "SET"; + len_vec[0] = strlen("SET"); + + arg_vec[1] = key; + len_vec[1] = strlen(key); + + arg_vec[2] = value; + len_vec[2] = size; + + redisReply *reply=NULL; + if(0!=strncmp(key, foreign_key_prefix, strlen(foreign_key_prefix))) + { + MESA_handle_runtime_log(_feather->logger, RLOG_LV_FATAL, maat_command, "Invalid File key, prefix %s is mandatory.", foreign_key_prefix); + return -1; + } + switch(op) + { + case MAAT_OP_ADD: + reply= (redisReply *)redisCommandArgv(ctx, sizeof(arg_vec) / sizeof(arg_vec[0]), arg_vec, len_vec); + break; + case MAAT_OP_DEL: + reply=_wrap_redisCommand(ctx,"EXPIRE %s %d", key, MAAT_REDIS_SYNC_TIME); + break; + default: + return -1; + break; + } + if(reply==NULL||reply->type==REDIS_REPLY_NIL||reply->type==REDIS_REPLY_ERROR) + { + MESA_handle_runtime_log(_feather->logger, RLOG_LV_FATAL, maat_command,"Set file failed, maybe Redis is busy."); + freeReplyObject(reply); + reply=NULL; + return -1; + } + freeReplyObject(reply); + return 0; +} void Maat_add_region2cmd(struct Maat_cmd_t* cmd,int which_group,const struct Maat_region_t* region) { struct _Maat_cmd_inner_t* _cmd=(struct _Maat_cmd_inner_t*)cmd; diff --git a/src/entry/Maat_rule.cpp b/src/entry/Maat_rule.cpp index 345020f..65180f5 100644 --- a/src/entry/Maat_rule.cpp +++ b/src/entry/Maat_rule.cpp @@ -32,7 +32,7 @@ #include "stream_fuzzy_hash.h" #include "gram_index_engine.h" -int MAAT_FRAME_VERSION_2_2_20180921=1; +int MAAT_FRAME_VERSION_2_2_20180925=1; const char* CHARSET_STRING[]={"NONE","gbk","big5","unicode","utf8","bin", "unicode_ascii_esc","unicode_ascii_aligned","unicode_ncr_dec","unicode_ncr_hex","url_encode_gb2312","url_encode_utf8",""}; @@ -613,7 +613,7 @@ int read_plugin_table_info(const char* line, struct _Maat_table_info_t* p) copy_line=_maat_strdup(line); for (token = copy_line, i=0; ; token= NULL, i++) { - sub_token= strtok_r(token,"\t", &saveptr); + sub_token= strtok_r(token,"\t ", &saveptr); if (sub_token == NULL) break; if(i==3) @@ -621,7 +621,7 @@ int read_plugin_table_info(const char* line, struct _Maat_table_info_t* p) break; } } - if(i<2) + if(i<3) { goto error_out; } @@ -655,7 +655,7 @@ int read_plugin_table_info(const char* line, struct _Maat_table_info_t* p) tmp=cJSON_GetObjectItem(json, "foreign"); if(tmp!=NULL) { - _read_integer_arrary(tmp->string, p->foreign_columns, MAX_FOREIGN_CLMN_NUM); + p->n_foreign=_read_integer_arrary(tmp->valuestring, p->foreign_columns, MAX_FOREIGN_CLMN_NUM); } cJSON_Delete(json); @@ -3038,7 +3038,7 @@ void update_plugin_table(struct _Maat_table_info_t* table,const char* table_line copy=_maat_strdup(table_line); for (token = copy, i=0; irule_tag_column ; token= NULL, i++) { - sub_token= strtok_r(token,"\t", &saveptr); + sub_token= strtok_r(token," \t", &saveptr); if (sub_token == NULL) break; } diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index b4c2ce2..e1a6223 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -13,4 +13,4 @@ file(COPY testdata DESTINATION ./) file(COPY testdata_uni2ascii DESTINATION ./) include(GoogleTest) -#gtest_discover_tests(test_maatframe) +gtest_discover_tests(test_maatframe) diff --git a/test/maat_demo.cpp b/test/maat_demo.cpp index b59bc78..2058777 100644 --- a/test/maat_demo.cpp +++ b/test/maat_demo.cpp @@ -22,7 +22,7 @@ unsigned short test_maat_redis_port=6379; const char* json_path="./maat_json.json"; const char* ful_cfg_dir="./rule/full/index/"; const char* inc_cfg_dir="./rule/inc/index/"; -#define WAIT_FOR_EFFECTIVE_US 1000*1000 +#define WAIT_FOR_EFFECTIVE_US 2*1000*1000 extern int my_scandir(const char *dir, struct dirent ***namelist, int(*filter)(const struct dirent *), int(*compar)(const void *, const void *)); diff --git a/test/table_info.conf b/test/table_info.conf index cedf33f..e467830 100644 --- a/test/table_info.conf +++ b/test/table_info.conf @@ -11,7 +11,7 @@ #id name type # #For plugin table. The first column's id is 1. 0 as not speicified. -#id name type valid_column tag_column +#id name type column_define # #For expr/expr_plus Table #id name type src_charset dst_charset do_merge cross_cache quick_mode @@ -28,4 +28,4 @@ 9 SIM_URL similar -- 10 IMAGE_FP expr UTF8 UTF8 yes 128 quickoff 11 TEST_EFFECTIVE_RANGE_TABLE plugin {"valid":4,"tag":5} -- -12 TEST_EXETERN_LINK plugin {"valid":4,"foreign":"6,7","tag":3} -- \ No newline at end of file +12 TEST_FOREIGN_KEY plugin {"valid":4,"foreign":"6,8","tag":3} -- \ No newline at end of file diff --git a/test/test_maatframe.cpp b/test/test_maatframe.cpp index ea49a8c..70e9137 100644 --- a/test/test_maatframe.cpp +++ b/test/test_maatframe.cpp @@ -17,6 +17,7 @@ #include //fstat #include #include +#include #include const char* test_maat_redis_ip="127.0.0.1"; @@ -24,14 +25,14 @@ unsigned short test_maat_redis_port=6379; const char* json_path="./maat_json.json"; const char* ful_cfg_dir="./rule/full/index/"; const char* inc_cfg_dir="./rule/inc/index/"; -#define WAIT_FOR_EFFECTIVE_US 1000*1000 +#define WAIT_FOR_EFFECTIVE_US 1*1000*1000 extern int my_scandir(const char *dir, struct dirent ***namelist, int(*filter)(const struct dirent *), int(*compar)(const void *, const void *)); Maat_feather_t g_feather=NULL; -void *logger=NULL; +void *g_logger=NULL; int g_iThreadNum=4; const char* table_info_path="./table_info.conf"; int scan_interval_ms=1; @@ -103,7 +104,7 @@ TEST(PluginTable, Callback) Maat_read_entry_cb, Maat_read_entry_finish_cb, g_feather, - logger); + g_logger); } TEST(StringScan, Full) @@ -527,7 +528,7 @@ TEST(RuleTags, Compile) result,NULL, 4, &mid, 0); - EXPECT_LE(ret, 0); + EXPECT_EQ(ret, -2); ret=Maat_full_scan_string(g_feather, table_id,CHARSET_GBK, should_hit, strlen(should_hit), result,NULL, 4, @@ -660,8 +661,16 @@ protected: Maat_set_feather_opt(_shared_feather, MAAT_OPT_SCANDIR_INTERVAL_MS,&scan_interval_ms, sizeof(scan_interval_ms)); //Set a short intevral for testing. Maat_set_feather_opt(_shared_feather, MAAT_OPT_EFFECT_INVERVAL_MS,&effective_interval_ms, sizeof(effective_interval_ms)); - Maat_initiate_feather(_shared_feather); + + const char* foregin_dir="./foreign_files/"; + Maat_set_feather_opt(_shared_feather, MAAT_OPT_FOREIGN_CONT_DIR,foregin_dir, strlen(foregin_dir)+1); + + int linger_timeout=4; + Maat_set_feather_opt(_shared_feather, MAAT_OPT_FOREIGN_CONT_LINGER,&linger_timeout, sizeof(linger_timeout)); + Maat_cmd_flushDB(_shared_feather); + Maat_initiate_feather(_shared_feather); + } static void TearDownTestCase() { @@ -734,7 +743,7 @@ int del_command(Maat_feather_t feather,int config_id) return 0; } -TEST_F(MaatCmdTest, Expr) +TEST_F(MaatCmdTest, SetExpr) { const char* scan_data="Hiredis is a minimalistic C client library for the Redis database.\r\n"; const char* table_name="HTTP_URL"; @@ -764,8 +773,11 @@ TEST_F(MaatCmdTest, Expr) ret=Maat_read_state(feather,MAAT_STATE_VERSION, &version_after, sizeof(version_after)); EXPECT_EQ(ret, 0); + EXPECT_GT(version_after, version_before); + table_id=Maat_table_register(feather,table_name); ASSERT_GT(table_id, 0); + memset(&result, 0, sizeof(result)); ret=Maat_full_scan_string(feather, table_id,CHARSET_GBK, scan_data, strlen(scan_data), &result,NULL, 1, &mid, 0); @@ -777,7 +789,7 @@ TEST_F(MaatCmdTest, Expr) EXPECT_EQ(output_id_cnt, 1); EXPECT_EQ(output_ids[0], config_id); - + usleep(WAIT_FOR_EFFECTIVE_US);//waiting for commands go into effect del_command(feather, config_id); usleep(WAIT_FOR_EFFECTIVE_US);//waiting for commands go into effect ret=Maat_full_scan_string(feather, table_id,CHARSET_GBK, scan_data, strlen(scan_data), @@ -795,7 +807,7 @@ TEST_F(MaatCmdTest, Expr) &mid, 0); EXPECT_EQ(ret, 0); } -TEST_F(MaatCmdTest, Lines) +TEST_F(MaatCmdTest, SetLines) { const int TEST_CMD_LINE_NUM=4; const struct Maat_line_t *p_line[TEST_CMD_LINE_NUM]; @@ -830,7 +842,7 @@ TEST_F(MaatCmdTest, Lines) return; } -TEST_F(MaatCmdTest, IP) +TEST_F(MaatCmdTest, SetIP) { struct Maat_cmd_t* cmd=NULL; struct Maat_rule_t rule; @@ -961,6 +973,146 @@ TEST_F(MaatCmdTest, PauseUpdate) } +void prepare_file_to_set(const char* filename, char** file_buff, size_t* file_size, char* file_key, size_t key_size) +{ + int ret=0, i=0; + FILE* fp=NULL; + struct stat file_info; + unsigned char md5[MD5_DIGEST_LENGTH]; + char md5string[MD5_DIGEST_LENGTH+1]; + memset(md5, 0, sizeof(md5)); + memset(md5string, 0, sizeof(md5string)); + + ret=stat(filename, &file_info); + ASSERT_TRUE(ret==0); + + fp=fopen(filename,"r"); + ASSERT_FALSE(fp==NULL); + + *file_size=file_info.st_size; + *file_buff=(char*)malloc(*file_size); + ret=fread(*file_buff,1,*file_size,fp); + fclose(fp); + + MD5((const unsigned char *)(*file_buff), (unsigned long)(*file_size), md5); + for(i = 0; i < MD5_DIGEST_LENGTH; ++i) + { + sprintf(&md5string[i*2], "%02x", (unsigned int)md5[i]); + } + snprintf(file_key, key_size, "__FILE_%s", md5string); + return; +} +char* md5_file(const char* filename, char* md5string) +{ + FILE* fp=NULL; + int i=0; + unsigned char md5[MD5_DIGEST_LENGTH]; + struct stat file_info; + stat(filename, &file_info); + size_t file_size=file_info.st_size; + + fp=fopen(filename,"r"); + if(fp==NULL) + { + return NULL; + } + char* file_buff=(char*)malloc(file_size); + fread(file_buff,1,file_size,fp); + fclose(fp); + + MD5((const unsigned char *)(file_buff), (unsigned long)(file_size), md5); + for(i = 0; i < MD5_DIGEST_LENGTH; ++i) + { + sprintf(&md5string[i*2], "%02x", (unsigned int)md5[i]); + } + free(file_buff); + return md5string; +} +int is_same_file(const char* filename1, const char* filename2) +{ + char md5string[2][MD5_DIGEST_LENGTH*2+1]; + memset(md5string, 0, sizeof(md5string)); + md5_file(filename1, md5string[0]); + md5_file(filename2, md5string[1]); + if(0==strcmp(md5string[0], md5string[1])) + { + return 1; + } + else + { + return 0; + } +} +int g_test_foregin_read_OK=0; +void foreign_key_test_entry_cb(int table_id,const char* table_line,void* u_para) +{ + int rule_id=-1, not_care=0, tag=0; + int is_valid=0; + char file1_origin_name[256], file2_origin_name[256]; + char file1_localname[256], file2_localname[256]; + char end[16]; + + memset(file1_localname, 0, sizeof(file1_localname)); + memset(file2_localname, 0, sizeof(file2_localname)); + + sscanf(table_line, "%d\t%d\t%d\t%d\t%s\t%s\t\%s\t%s\t%s",&rule_id, ¬_care, &tag, &is_valid + , file1_origin_name, file1_localname + , file2_origin_name, file2_localname + , end); + EXPECT_STREQ(end, "End"); + EXPECT_TRUE(is_same_file(file1_origin_name, file1_localname)); + EXPECT_TRUE(is_same_file(file2_origin_name, file2_localname)); + + g_test_foregin_read_OK=1; + return; +} + +TEST_F(MaatCmdTest, SetFile) +{ + Maat_feather_t feather=MaatCmdTest::_shared_feather; + int ret=0, table_id=0; + const char* table_name="TEST_FOREIGN_KEY"; + table_id=Maat_table_register(feather, table_name); + ASSERT_GT(table_id, 0); + ret=Maat_table_callback_register(feather, table_id, + NULL, + foreign_key_test_entry_cb, + NULL, + NULL); + ASSERT_EQ(ret, 1); + const char* file1_name="./testdata/digest_test.data", *file2_name="./testdata/mesa_logo.jpg"; + char* file_buff=NULL, file1_key[256], file2_key[256]; + size_t file_size=0; + + prepare_file_to_set(file1_name, &file_buff, &file_size, file1_key, sizeof(file1_key)); + Maat_cmd_set_file(feather, file1_key, file_buff, file_size, MAAT_OP_ADD); + free(file_buff); + file_buff=NULL; + + prepare_file_to_set(file2_name, &file_buff, &file_size, file2_key, sizeof(file2_key)); + Maat_cmd_set_file(feather, file2_key, file_buff, file_size, MAAT_OP_ADD); + free(file_buff); + file_buff=NULL; + g_test_foregin_read_OK=0; + + char line[1024]; + int tag=0; + struct Maat_line_t line_rule; + line_rule.label_id=0; + line_rule.rule_id=(int)Maat_cmd_incrby(feather,"TEST_PLUG_SEQ", 1); + line_rule.table_name=table_name; + snprintf(line, sizeof(line),"%d\t2\t%d\t1\t%s\tredis://%s\t%s\tredis://%s\tEnd",line_rule.rule_id, tag + ,file1_name, file1_key + ,file2_name, file2_key); + line_rule.table_line=line; + line_rule.expire_after=0; + ret=Maat_cmd_set_line(feather, &line_rule, MAAT_OP_ADD); + EXPECT_EQ(ret, 1); + usleep(WAIT_FOR_EFFECTIVE_US);//wait for callback triggered. + EXPECT_EQ(g_test_foregin_read_OK, 1); + return; +} + int main(int argc, char ** argv) { @@ -972,9 +1124,9 @@ int main(int argc, char ** argv) int scan_detail=0; ::testing::InitGoogleTest(&argc, argv); - logger=MESA_create_runtime_log_handle(log_file,0); + g_logger=MESA_create_runtime_log_handle(log_file,0); - g_feather=Maat_feather(g_iThreadNum, table_info_path, logger); + g_feather=Maat_feather(g_iThreadNum, table_info_path, g_logger); Maat_set_feather_opt(g_feather,MAAT_OPT_INSTANCE_NAME,"demo", strlen("demo")+1); Maat_set_feather_opt(g_feather,MAAT_OPT_DECRYPT_KEY,decrypt_key, strlen(decrypt_key)+1); Maat_set_feather_opt(g_feather, MAAT_OPT_JSON_FILE_PATH, json_path, strlen(json_path)+1);