From cae0281c2fbd77c27e12cbd6e497e44ab1f37f94 Mon Sep 17 00:00:00 2001 From: liuxueli Date: Wed, 19 Jun 2024 10:49:21 +0000 Subject: Feature: performance test case --- test/dns_decoder_test.cpp | 334 +++++++++++----------------------------------- 1 file changed, 78 insertions(+), 256 deletions(-) (limited to 'test/dns_decoder_test.cpp') diff --git a/test/dns_decoder_test.cpp b/test/dns_decoder_test.cpp index f0ddbd3..44931e5 100644 --- a/test/dns_decoder_test.cpp +++ b/test/dns_decoder_test.cpp @@ -4,13 +4,11 @@ #include #include #include -#include #ifdef __cplusplus extern "C" { - #include "cJSON.h" #include "dns_decoder.h" #include "toml/toml.h" @@ -33,8 +31,10 @@ struct dns_decoder_test_plugin_env int commit_result_enable; int write_result_enable; int decode_resource_record_enable; + int export_resource_record_enable; }; +extern "C" void perf_resource_record_decode(struct dns_message *dns_msg); extern "C" int commit_test_result_json(cJSON *node, const char *name); void dns_real_result_write_file(char *result_str) @@ -47,232 +47,6 @@ void dns_real_result_write_file(char *result_str) } } -void dns_resource_record_str2hex_append(cJSON *one_rr_object, uint8_t *str, size_t str_sz, const char *key) -{ - if(one_rr_object==NULL || str==NULL || str_sz==0 || key==NULL) - { - return; - } - - size_t offset=0; - char hex_buff[4096]={0}; - size_t hex_buff_sz=sizeof(hex_buff); - - for(size_t i=0; i= hex_buff_sz) - { - break; - } - } - - if(offset>0) - { - cJSON_AddStringToObject(one_rr_object, key, hex_buff); - } -} - -void dns_resource_record_dstring_append(cJSON *one_rr_object, struct dstring *dstr, const char *key) -{ - if(dstr->value_sz > 0) - { - cJSON_AddStringToObject(one_rr_object, key, (char *)(dstr->value)); - } -} - -int dns_resource_record_json_exporter(cJSON *object, struct dns_resource_record *rr_array, uint16_t n_rr, const char *rr_type, int *dns_sec) -{ - if(object==NULL || rr_array==NULL || n_rr==0 || dns_sec==NULL) - { - return 0; - } - - char ip_str[128]; - cJSON *dns_rr_array=cJSON_CreateArray(); - - for(uint16_t i=0; itype == DNS_RR_TYPE_OPT) - { - cJSON_AddStringToObject(one_rr_object, "name", (const char *)(dns_rr->qname.value)); - cJSON_AddNumberToObject(one_rr_object, "type", dns_rr->type); - cJSON_AddNumberToObject(one_rr_object, "udp_payload", dns_rr->rr_class); - cJSON_AddNumberToObject(one_rr_object, "rcode", (int)(dns_rr->ttl>>24)); - cJSON_AddNumberToObject(one_rr_object, "version", (int)((dns_rr->ttl>>16)&0xFF)); - cJSON_AddNumberToObject(one_rr_object, "Z", (int)(dns_rr->ttl&&0xFFFF)); - cJSON_AddNumberToObject(one_rr_object, "rdlength", dns_rr->rdlength); - } - else - { - cJSON_AddStringToObject(one_rr_object, "name", (const char *)(dns_rr->qname.value)); - cJSON_AddNumberToObject(one_rr_object, "type", dns_rr->type); - cJSON_AddNumberToObject(one_rr_object, "class", dns_rr->rr_class); - cJSON_AddNumberToObject(one_rr_object, "ttl", dns_rr->ttl); - cJSON_AddNumberToObject(one_rr_object, "rdlength", dns_rr->rdlength); - } - - if(dns_rr->rdlength==0) - { - cJSON_AddItemToArray(dns_rr_array, one_rr_object); - continue; - } - - switch(dns_rr->type) - { - case DNS_RR_TYPE_A: - inet_ntop(AF_INET, (void *)(dns_rr->rdata.a.value), ip_str, sizeof(ip_str)); - cJSON_AddStringToObject(one_rr_object, "a", ip_str); - break; - case DNS_RR_TYPE_AAAA: - inet_ntop(AF_INET6, dns_rr->rdata.aaaa.value, ip_str, sizeof(ip_str)); - cJSON_AddStringToObject(one_rr_object, "aaaa", ip_str); - break; - case DNS_RR_TYPE_NS: - dns_resource_record_dstring_append(one_rr_object, &(dns_rr->rdata.ns), "ns"); - break; - case DNS_RR_TYPE_MD: - dns_resource_record_dstring_append(one_rr_object, &(dns_rr->rdata.md), "md"); - break; - case DNS_RR_TYPE_MF: - dns_resource_record_dstring_append(one_rr_object, &(dns_rr->rdata.mf), "mf"); - break; - case DNS_RR_TYPE_CNAME: - dns_resource_record_dstring_append(one_rr_object, &(dns_rr->rdata.cname), "cname"); - break; - case DNS_RR_TYPE_MB: - dns_resource_record_dstring_append(one_rr_object, &(dns_rr->rdata.mb), "mb"); - break; - case DNS_RR_TYPE_MG: - dns_resource_record_dstring_append(one_rr_object, &(dns_rr->rdata.mg), "mg"); - break; - case DNS_RR_TYPE_MR: - dns_resource_record_dstring_append(one_rr_object, &(dns_rr->rdata.mr), "mr"); - break; - case DNS_RR_TYPE_TXT: - dns_resource_record_dstring_append(one_rr_object, &(dns_rr->rdata.txt), "txt"); - cJSON_AddNumberToObject(one_rr_object, "size", dns_rr->rdata.txt.value_sz); - break; - case DNS_RR_TYPE_NULL: - dns_resource_record_dstring_append(one_rr_object, &(dns_rr->rdata.null), "null"); - cJSON_AddNumberToObject(one_rr_object, "size", dns_rr->rdata.null.value_sz); - break; - case DNS_RR_TYPE_PTR: - dns_resource_record_dstring_append(one_rr_object, &(dns_rr->rdata.ptr), "ptr"); - break; - case DNS_RR_TYPE_HINFO: - dns_resource_record_dstring_append(one_rr_object, &(dns_rr->rdata.hinfo.cpu), "cpu"); - dns_resource_record_dstring_append(one_rr_object, &(dns_rr->rdata.hinfo.os), "os"); - break; - case DNS_RR_TYPE_MINFO: - dns_resource_record_dstring_append(one_rr_object, &(dns_rr->rdata.minfo.rmailbx), "rmailbx"); - dns_resource_record_dstring_append(one_rr_object, &(dns_rr->rdata.minfo.emailbx), "emailbx"); - break; - case DNS_RR_TYPE_MX: - dns_resource_record_dstring_append(one_rr_object, &(dns_rr->rdata.mx.exchange), "exchange"); - cJSON_AddNumberToObject(one_rr_object, "preference", dns_rr->rdata.mx.preference); - break; - case DNS_RR_TYPE_RP: - dns_resource_record_dstring_append(one_rr_object, &(dns_rr->rdata.rp.mailbox), "mailbox"); - dns_resource_record_dstring_append(one_rr_object, &(dns_rr->rdata.rp.txt_rr), "txt_rr"); - break; - case DNS_RR_TYPE_SOA: - dns_resource_record_dstring_append(one_rr_object, &(dns_rr->rdata.soa.mname), "mname"); - dns_resource_record_dstring_append(one_rr_object, &(dns_rr->rdata.soa.rname), "rname"); - cJSON_AddNumberToObject(one_rr_object, "serial", dns_rr->rdata.soa.serial); - cJSON_AddNumberToObject(one_rr_object, "refresh", dns_rr->rdata.soa.refresh); - cJSON_AddNumberToObject(one_rr_object, "retry", dns_rr->rdata.soa.retry); - cJSON_AddNumberToObject(one_rr_object, "cname", dns_rr->rdata.soa.expire); - cJSON_AddNumberToObject(one_rr_object, "minimum", dns_rr->rdata.soa.minimum); - break; - - case DNS_RR_TYPE_WKS: - cJSON_AddStringToObject(one_rr_object, "addr", ip_str); - cJSON_AddNumberToObject(one_rr_object, "protocol", dns_rr->rdata.wks.protocol); - cJSON_AddNumberToObject(one_rr_object, "size", dns_rr->rdata.wks.size); - - dns_resource_record_str2hex_append(one_rr_object, dns_rr->rdata.wks.bitmap, dns_rr->rdata.wks.size, "bitmap"); - break; - case DNS_RR_TYPE_OPT: - break; - case DNS_RR_TYPE_DS: - *dns_sec = 2; - cJSON_AddNumberToObject(one_rr_object, "key_tag", dns_rr->rdata.ds.key_tag); - cJSON_AddNumberToObject(one_rr_object, "algo", dns_rr->rdata.ds.algo); - cJSON_AddNumberToObject(one_rr_object, "digest_type", dns_rr->rdata.ds.digest_type); - cJSON_AddNumberToObject(one_rr_object, "digest_len", dns_rr->rdata.ds.digest_len); - - dns_resource_record_str2hex_append(one_rr_object, dns_rr->rdata.ds.digest, dns_rr->rdata.ds.digest_len, "digest"); - break; - case DNS_RR_TYPE_RRSIG: - *dns_sec = 2; - cJSON_AddNumberToObject(one_rr_object, "type_covered", dns_rr->rdata.rrsig.type_covered); - cJSON_AddNumberToObject(one_rr_object, "algo", dns_rr->rdata.rrsig.algo); - cJSON_AddNumberToObject(one_rr_object, "labels", dns_rr->rdata.rrsig.labels); - cJSON_AddNumberToObject(one_rr_object, "original_ttl", dns_rr->rdata.rrsig.original_ttl); - cJSON_AddNumberToObject(one_rr_object, "sig_expiration", dns_rr->rdata.rrsig.sig_expiration); - cJSON_AddNumberToObject(one_rr_object, "sig_inception", dns_rr->rdata.rrsig.sig_inception); - cJSON_AddNumberToObject(one_rr_object, "key_tag", dns_rr->rdata.rrsig.key_tag); - - dns_resource_record_dstring_append(one_rr_object, &(dns_rr->rdata.rrsig.signer_name), "signer_name"); - - cJSON_AddNumberToObject(one_rr_object, "signature_len", dns_rr->rdata.rrsig.signature_len); - dns_resource_record_str2hex_append(one_rr_object, dns_rr->rdata.rrsig.signature, dns_rr->rdata.rrsig.signature_len, "signature"); - break; - case DNS_RR_TYPE_NSEC: - *dns_sec = 2; - dns_resource_record_dstring_append(one_rr_object, &(dns_rr->rdata.nsec.next_domain), "next_domain"); - cJSON_AddNumberToObject(one_rr_object, "maps_len", dns_rr->rdata.nsec.type_bit_maps.value_sz); - - dns_resource_record_str2hex_append(one_rr_object, dns_rr->rdata.nsec.type_bit_maps.value, dns_rr->rdata.nsec.type_bit_maps.value_sz, "type_bit_maps"); - break; - case DNS_RR_TYPE_DNSKEY: - *dns_sec = 2; - cJSON_AddNumberToObject(one_rr_object, "flags", dns_rr->rdata.dnskey.flags); - cJSON_AddNumberToObject(one_rr_object, "protocol", dns_rr->rdata.dnskey.protocol); - cJSON_AddNumberToObject(one_rr_object, "algo", dns_rr->rdata.dnskey.algo); - cJSON_AddNumberToObject(one_rr_object, "public_key_len", dns_rr->rdata.dnskey.public_key_len); - - dns_resource_record_str2hex_append(one_rr_object, dns_rr->rdata.dnskey.public_key, dns_rr->rdata.dnskey.public_key_len, "public_key"); - break; - case DNS_RR_TYPE_NSEC3: - *dns_sec = 2; - cJSON_AddNumberToObject(one_rr_object, "hash_algo", dns_rr->rdata.nsec3.hash_algo); - cJSON_AddNumberToObject(one_rr_object, "flags", dns_rr->rdata.nsec3.flags); - cJSON_AddNumberToObject(one_rr_object, "iteration", dns_rr->rdata.nsec3.iteration); - - cJSON_AddNumberToObject(one_rr_object, "salt_len", dns_rr->rdata.nsec3.salt_len); - dns_resource_record_str2hex_append(one_rr_object, dns_rr->rdata.nsec3.salt_value, dns_rr->rdata.nsec3.salt_len, "salt_value"); - - cJSON_AddNumberToObject(one_rr_object, "hash_len", dns_rr->rdata.nsec3.hash_len); - dns_resource_record_str2hex_append(one_rr_object, dns_rr->rdata.nsec3.next_hash_owner, dns_rr->rdata.nsec3.hash_len, "next_hash_owner"); - - cJSON_AddNumberToObject(one_rr_object, "maps_len", dns_rr->rdata.nsec3.type_bit_maps.value_sz); - dns_resource_record_str2hex_append(one_rr_object, dns_rr->rdata.nsec3.type_bit_maps.value,dns_rr->rdata.nsec3.type_bit_maps.value_sz, "type_bit_maps"); - break; - case DNS_RR_TYPE_NSEC3PARAM: - cJSON_AddNumberToObject(one_rr_object, "hash_algo", dns_rr->rdata.nsec3param.hash_algo); - cJSON_AddNumberToObject(one_rr_object, "flags", dns_rr->rdata.nsec3param.flags); - cJSON_AddNumberToObject(one_rr_object, "iteration", dns_rr->rdata.nsec3param.iteration); - cJSON_AddNumberToObject(one_rr_object, "salt_len", dns_rr->rdata.nsec3param.salt_len); - - dns_resource_record_str2hex_append(one_rr_object, dns_rr->rdata.nsec3param.salt_value, dns_rr->rdata.nsec3param.salt_len, "salt_value"); - break; - default: - break; - } - - cJSON_AddItemToArray(dns_rr_array, one_rr_object); - } - - cJSON_AddItemToObject(object, rr_type, dns_rr_array); - - return 1; -} - void dns_decoder_test_message_cb(struct session *ss, int topic_id, const void *msg, void *per_session_ctx, void *plugin_env_str) { struct dns_message *dns_msg=(struct dns_message *)msg; @@ -284,18 +58,23 @@ void dns_decoder_test_message_cb(struct session *ss, int topic_id, const void *m //uint16_t id=dns_message_header_id_get(dns_msg); struct dns_decoder_test_plugin_env *plugin_env=(struct dns_decoder_test_plugin_env *)plugin_env_str; + if(plugin_env->decode_resource_record_enable==1) + { + perf_resource_record_decode(dns_msg); + return ; + } - cJSON *real_result=cJSON_CreateObject(); - cJSON_AddStringToObject(real_result, "Tuple4", session_get0_readable_addr(ss)); + cJSON *real_result=cJSON_CreateObject(); + cJSON_AddStringToObject(real_result, "Tuple4", session_get0_readable_addr(ss)); uint16_t n_question=0; struct dns_query_question *question=NULL; - dns_message_question_get0(dns_msg, &question, &n_question); + dns_message_query_question_get0(dns_msg, &question, &n_question); if(n_question>0 && question!=NULL) { - cJSON_AddStringToObject(real_result, "dns_qname", (char *)question->qname); - cJSON_AddNumberToObject(real_result, "dns_qtype", question->qtype); - cJSON_AddNumberToObject(real_result, "dns_qclass", question->qclass); + cJSON_AddStringToObject(real_result, "dns_qname", dns_query_question_qname_get0(question)); + cJSON_AddNumberToObject(real_result, "dns_qtype", dns_query_question_qtype_get0(question)); + cJSON_AddNumberToObject(real_result, "dns_qclass", dns_query_question_qclass_get0(question)); } struct dns_flag *flag=dns_message_header_flag_get0(dns_msg); @@ -306,38 +85,57 @@ void dns_decoder_test_message_cb(struct session *ss, int topic_id, const void *m cJSON_AddNumberToObject(real_result, "dns_rd", (double)(flag->rd)); } - if(plugin_env->decode_resource_record_enable==1) - { - cJSON *rr_object=cJSON_CreateObject(); - uint16_t n_answer_rr=0; - struct dns_resource_record *answer_rr=NULL; - dns_message_answer_resource_record_get0(dns_msg, &answer_rr, &n_answer_rr); + uint16_t n_answer_rr=0; + struct dns_resource_record *answer_rr=NULL; + dns_message_answer_resource_record_get0(dns_msg, &answer_rr, &n_answer_rr); + + uint16_t n_authority_rr=0; + struct dns_resource_record *authority_rr=NULL; + dns_message_authority_resource_record_get0(dns_msg, &authority_rr, &n_authority_rr); - uint16_t n_authority_rr=0; - struct dns_resource_record *authority_rr=NULL; - dns_message_authority_resource_record_get0(dns_msg, &authority_rr, &n_authority_rr); + uint16_t n_additional_rr=0; + struct dns_resource_record *additional_rr=NULL; + dns_message_additional_resource_record_get0(dns_msg, &additional_rr, &n_additional_rr); - uint16_t n_additional_rr=0; - struct dns_resource_record *additional_rr=NULL; - dns_message_additional_resource_record_get0(dns_msg, &additional_rr, &n_additional_rr); + const char *answer=dns_resource_record_json_exporter(answer_rr, n_answer_rr); + const char *authority=dns_resource_record_json_exporter(authority_rr, n_authority_rr); + const char *additional=dns_resource_record_json_exporter(additional_rr, n_additional_rr); - int dns_sec=1; - dns_resource_record_json_exporter(rr_object, answer_rr, n_answer_rr, "answer", &dns_sec); - dns_resource_record_json_exporter(rr_object, authority_rr, n_authority_rr, "authority", &dns_sec); - dns_resource_record_json_exporter(rr_object, additional_rr, n_additional_rr, "additional", &dns_sec); + cJSON *rr_array=cJSON_CreateObject(); + if(answer!=NULL) + { + cJSON *rr_object=cJSON_Parse(answer); + cJSON_AddItemToObject(rr_array, "answer", rr_object); + free((void *)answer); + } + + if(authority!=NULL) + { + cJSON *rr_object=cJSON_Parse(authority); + cJSON_AddItemToObject(rr_array, "authority", rr_object); + free((void *)authority); + } - cJSON_AddItemToObject(real_result, "rr", rr_object); + if(additional!=NULL) + { + cJSON *rr_object=cJSON_Parse(additional); + cJSON_AddItemToObject(rr_array, "additional", rr_object); + free((void *)additional); } - char result_name[16]=""; - sprintf(result_name, "DNS_RESULT_%d", plugin_env->result_index++); + cJSON_AddItemToObject(real_result, "rr", rr_array); - char *real_result_str=cJSON_Print(real_result); - dns_real_result_write_file(real_result_str); - free(real_result_str); + if(plugin_env->write_result_enable==1) + { + char *real_result_str=cJSON_Print(real_result); + dns_real_result_write_file(real_result_str); + free(real_result_str); + } if(plugin_env->commit_result_enable==1) { + char result_name[16]=""; + sprintf(result_name, "DNS_RESULT_%d", plugin_env->result_index++); commit_test_result_json(real_result, result_name); } else @@ -465,6 +263,30 @@ int32_t dns_decoder_test_config_load(const char *cfg_path, struct dns_decoder_te } } + // export_resource_record_enable + toml_datum_t export_resource_record_enable_val=toml_string_in(test_tbl, "export_resource_record_enable"); + if(export_resource_record_enable_val.ok==0) + { + plugin_env->export_resource_record_enable=0; + fprintf(stderr, "[%s:%d] config file: %s has no key: [decoder.dns.test.export_resource_record_enable]", __FUNCTION__, __LINE__, cfg_path); + } + else + { + if(memcmp("no", export_resource_record_enable_val.u.s, strlen("no"))==0) + { + plugin_env->export_resource_record_enable=0; + } + else if(memcmp("yes", export_resource_record_enable_val.u.s, strlen("yes"))==0) + { + plugin_env->export_resource_record_enable=1; + } + else + { + plugin_env->export_resource_record_enable=1; + fprintf(stderr, "[%s:%d] config file: %s key: [decoder.dns.test.export_resource_record_enable] value is not yes or no", __FUNCTION__, __LINE__, cfg_path); + } + } + toml_free(root); return ret; -- cgit v1.2.3