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部分,该部分比较容易理解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/463452.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VSTS学习和迁移(1) 安装部署

要将开发环境从SVN到VFS中,下个月开始迁移。 先从WebCast中下载文件,看了安装部署部分。以下为部分截图: 一:课程内容 Team Foundation 的逻辑结构与物理结构 Team Foundation 系统要求 Team Foundation 安装实战 Team Founda…

【HNOI2013】数列

题面 题解 设\(\{a_n\}\)为差分数组,可以得到柿子:\[ \begin{aligned} ans & \sum_{a_1 1} ^ m \sum_{a_2 1} ^ m \cdots \sum_{a_{k-1} 1} ^ m (n - \sum_{i 1} ^ {k - 1} a_i) \\ & nm^{k - 1} - \sum_{a_1 1} ^ m \sum_{a_2 1} ^ m \cd…

程序员的艺术:排序算法舞蹈

1、冒泡排序: 2、希尔排序: 3、选择排序: 4:插入排序: 5、快速排序: 6、归并排序: 转载于:https://www.cnblogs.com/jxgxy/archive/2012/08/20/2648210.html

Redis源码分析之内存检测memtest

redis的内存检测会和机器的CPU位数有关,32位或64位会影响后面的一些宏定义参数。首先给出memtest中的API: void memtest_progress_start(char *title, int pass) /* 内存检测加载开始,输出开始的一些图线显示 */ void memtest_progress_end(…

Java Collections Framework - Java集合框架List,Map,Set等全面介绍之概要篇

deng 转载于:https://www.cnblogs.com/jacktu/archive/2009/05/15/1457316.html

C语言 数据结构 树和二叉树

树 1、树:是n节点的有限集。树是n(n>0)个节点的有限集。 n0时成为空树。 在任意一颗非空树中:(1)有且仅有一个称为根的节点;(2)当n>0时,其余节点可分为m(m>0)个互不相交的…

Oracle开启关闭归档日志

开启归档日志 shutdown immediate; --关闭数据库 startup mount; --打开数据库 alter database archivelog; --开启归档日志 alter database open; --开启数据库 archive log list; --查看归档日志是否开启 关闭归档日志 shutdown immediate; --关闭数据库 startup mount; …

Redis源码分析之anet网络通信的封装

anet是redis对tcp/ip网络中socket api接口的一个全面的封装,针对server/client端。封装的api的接口如下,注释了主要的接口: // tcp连接 int anetTcpConnect(char *err, char *addr, int port); // 非阻塞连接 int anetTcpNonBlockConnect(ch…

使用AJAX Toolkit创建新闻列表

我们很多站点上面都需要显示新闻列表,由标题和正文组成的。一般客户都希望实现这样的效果: 开始的时候只是显示标题,当点击标题的时候,再展开正文。再点击,又可缩回去。 这是典型的AJAX效果,或者说以前你也…

C语言 嵌入式 面试小知识点(一)

sizeof是C/C中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数。 与strlen的区别: 一、sizeof 是运算符,确切的说是一个编译时运算符,参数可以是数组、指针、类型、对象…

将数据渲染到页面的几种方式

将数据渲染到页面的几种方式: 1.字符串拼接; 2.dom回流 3.文档碎片(文档碎片节点:documentFragment) 4.模板 (下章会详细介绍模板)转载于:https://www.cnblogs.com/shangjun6/p/1039740…

论证是一门学问

本文的标题借用了安东尼.韦斯顿(Anthony Weston)的《论证是一门学问》一书的标题,向安东尼老爷子致敬的同时,也希望更多人能够真正了解“什么是论证”。 争论与论证从来都不是新鲜事物,作为软件行业的科技工作者&…

[翻译]SQL Server 工作集消息

Q:我发现有指向工作集(SQL Server保留内存区域)被分页出来相关的消息: 重要部分的 SQL 服务器进程内存已被分页。这可能导致性能下降。持续时间: 0 秒。 工作集 (KB): 2484,已提交 (KB): 48036&…

Redis源码分析之工具类util

在redis源码中的辅助工具类中,主要包括大小端转换、SHA算法以及util.h中对应的算法。 大小端转换: LittleEndian:低位字节数据存放于低地址,高位字节数据存放于高地址。 BigEndian:低位字节数据存放于高地址&#x…

Linux下如何安装软件

一、解析Linux应用软件安装包通常Linux应用软件的安装包有三种:1) tar包,如software-1.2.3-1.tar.gz。它是使用UNIX系统的打包工具tar打包的。2) rpm包,如software-1.2.3-1.i386.rpm。它是RedHat Linux提供的一种包封装…

Python深浅拷贝辨析

1 import copy2 3 list1 [11, 22, [33, 44]]4 list2 list15 list3 list1[:]6 list4 copy.copy(list1)7 list5 copy.deepcopy(list1)8 9 list1[0] 0 # 对列表的首层做增删改查操作 10 print("list1:",id(list1),list1) # list1: 1455502266696 [0, 22, […

生活规则

1.朋友请你吃饭,不要觉得理所当然,请礼尚往来,否则你的名声会越来越臭。 2.给自己定目标,一年,两年,五年,也许你出生不如别人好,通过努力,往往可以改变70%的命运。破罐子…

[AX]AX2012 SSRS报表使用Report Data Method

在AX2012的SSRS报表中可以使用c#或者Visual basic .net编写report data method来获取和操作数据,由report data method返回的数据可以用在报表的表达式中,也可以用作dataset的数据源。 使用Report data method首先需要创建AX model工程,在工程…

HIVE和HBASE区别

转载:https://www.cnblogs.com/justinzhang/p/4273470.html 1. 两者分别是什么? Apache Hive是一个构建在Hadoop基础设施之上的数据仓库。通过Hive可以使用HQL语言查询存放在HDFS上的数据。HQL是一种类SQL语言,这种语言最终被转化为Map/Re…

php调试

今天在使用php 的session 的时候,出现了以前就遇见但是又解决不了的问题,在页面上出现如下提示: Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at E:\php…