Redis源码分析之小型测试框架testhelp.h和redis-check-aof.c日志检测
生活随笔
收集整理的這篇文章主要介紹了
Redis源码分析之小型测试框架testhelp.h和redis-check-aof.c日志检测
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
使用的是redis 3.2版本
test中的文件主要分為以下幾個:
1.memtest.c 內存檢測
2.redis_benchmark.c 用于redis性能測試的實現,后續會當做單獨的一個章節進行分析
3.redis_check_aof.c 用于更新日志檢查的實現。
4.redis_check_dump.c 用于本地數據庫檢查的實現。
5.testhelp.h 一個C風格的小型測試框架。
今天看了testhelp.h和redis_check_aof.c,主要將自己理解的寫出來,要不然看了之后過一段時間又都忘記了,沒有留下什么痕跡
testhelp.h一個C風格的小型測試框架:已經說是一個框架了,是不是代碼量很多,其實就沒幾行代碼,主要是里面的設計方式是值的學習的,就是函數式編程思想。
// 失敗的測試用例數量 int __failed_tests = 0;// 總的測試用例數量 int __test_num = 0;/* 宏定義測試方法,輸入參數,輸入描述語,判斷的式子作為參數 */ /* 有完全體現了函數式編程的思想 */ #define test_cond(descr,_c) do { \__test_num++; printf("%d - %s: ", __test_num, descr); \if(_c) printf("PASSED\n"); else {printf("FAILED\n"); __failed_tests++;} \ } while(0); #define test_report() do { \printf("%d tests, %d passed, %d failed\n", __test_num, \__test_num-__failed_tests, __failed_tests); \if (__failed_tests) { \printf("=== WARNING === We have failed tests here...\n"); \exit(1); \} \ } while(0);例如,在sds的測試中的使用:
sds x = sdsnew("foo"), y;test_cond("Create a string and obtain the length",sdslen(x) == 3 && memcmp(x,"foo\0",4) == 0)sdsfree(x);只需要傳入_c,就可以將具體的函數傳入,是不是很精妙,實際上,這就是所說的函數式編程。
/* 方法API */ int consumeNewline(char *buf) /* 消除buf前面的換行符,即比較buf字符串中的前2個字符 */ int readLong(FILE *fp, char prefix, long *target) /* 從文件中讀取long類型值 */ int readBytes(FILE *fp, char *target, long length) /* 從文件中讀取字節 */ int readString(FILE *fp, char** target) /* 文件中讀取字符串 */ int readArgc(FILE *fp, long *target) /* 文件中讀取參數,首字符以“*”開頭 */ off_t process(FILE *fp) /* 返回fp文件的偏移量 */read方法大體類似,以下用readLong()作為例子:
// 從文件中讀取long型數據 int readLong(FILE *fp, char prefix, long *target) {char buf[128], *eptr;// 定位到內容部分epos = ftello(fp);if (fgets(buf,sizeof(buf),fp) == NULL) {return 0;}// 前綴不符合預期if (buf[0] != prefix) {ERROR("Expected prefix '%c', got: '%c'",prefix,buf[0]);return 0;}// 轉換為long型數據*target = strtol(buf+1,&eptr,10);return consumeNewline(eptr); }其中有一個比較特別的方法,consumeNewline()消除換行符的方法:
// 判斷buf中前2個字符是否符合預期 int consumeNewline(char *buf) {if (strncmp(buf,"\r\n",2) != 0) {// 出錯ERROR("Expected \\r\\n, got: %02x%02x",buf[0],buf[1]);return 0;}return 1; }相對于struct部分,該部分比較容易理解
總結
以上是生活随笔為你收集整理的Redis源码分析之小型测试框架testhelp.h和redis-check-aof.c日志检测的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL基础 — 常用命令
- 下一篇: GooFlow入门级使用