【工作经历:阿里巴巴搜索技术研发中心QA ,百度新产品测试部QA】
【领域:测试分析,自动化测试,性能测试,安全测试 】
【个人定位:高级测试工程师+培训师+领域产品专家】
发布新日志
-
2011-11-20 05:05:27
baiduhook是一个优秀的linux下的hook框架,也是百度的同事贡献给业界的一个非常优秀的工具。
百度很少开源自己的技术的,所以,对于这次的这种行为,是颇值得赞赏的。
所以我在此处转载,希望可以让更多的人了解。
这个框架的作用,就不大作介绍了。简单的,使用它,可以mock系统的任何函数。
虚函数,非虚函数,共有,私有,以及系统函数等。
这个方案里面,其实暗藏着一种c++单元测试领域的一个巨大创新。
众所周知,googletest和googlemock都是非常优秀的,但是googlemock自身是有限制的,它要求在开发编写的代码中,必须使用虚函数,才可以使用googlemock。这样会给平常的c++单元测试带来一定阻碍。
而使用baiduhook框架,就可以轻松的绕过google给我们的一个紧箍咒。
代码示例
请在文本框输入文字
/***************************************************************************
| *
| * Copyright (c) 2011 Baidu.com, Inc. All Rights Reserved
| *
| **************************************************************************/
|
|
|
| #include <gtest/gtest.h>
|
| #include "mylib.h"
|
| #include "bhook.h"
|
| //隐含类指针参数需要在hook函数中显示定义
| int MyPublicSay(MyLib::Person *person)
| {
| int err;
| int ret = fault_fail("MyLib::Person::PublicSay", &err);
| if(ret == 0) {
| printf("\e[33;1m[=HOOK=] this is no PublicSay!\n\e[m");
| return err;
| }
|
| typedef int (*REAL_FUNC)(MyLib::Person *);
| REAL_FUNC old_func = (REAL_FUNC)get_real_func_lib("MyLib::Person::PublicSay");
| return old_func(person);
| }
|
| int MyPrivateSay(MyLib::Person *person)
| {
| int err;
| int ret = fault_fail("MyLib::Person::PrivateSay", &err);
| if(ret == 0) {
| printf("\e[33;1m[=HOOK=] this is no PrivateSay!\n\e[m");
| return err;
| }
|
| typedef int (*REAL_FUNC)(MyLib::Person *);
| REAL_FUNC old_func = (REAL_FUNC)get_real_func_lib("MyLib::Person::PrivateSay");
| return old_func(person);
| }
|
| TEST(Person, PublicSay)
| {
| //enable
| fault_enable("MyLib::Person::PublicSay", 100, -1);
|
| MyLib::Person * person = new MyLib::Person();
|
| int ret = person->PublicSay();
|
| EXPECT_EQ(0, ret);
|
| delete person;
| }
|
| TEST(Person, PrivateSay)
| {
| //enable
| fault_enable("MyLib::Person::PrivateSay", 100, -2);
|
| MyLib::Person * person = new MyLib::Person();
|
| int ret = person->Call();
|
| EXPECT_EQ(0, ret);
|
| delete person;
| }
|
| int main(int argc, char **argv) {
| testing::InitGoogleTest(&argc, argv);
|
| testing::GTEST_FLAG(color) = "yes";
| //attach func
| attach_func_lib("MyLib::Person::PublicSay", (void *)MyPublicSay);
|
| attach_func_lib("MyLib::Person::PrivateSay", (void *)MyPrivateSay);
|
| return RUN_ALL_TESTS();
| } |
|
感兴趣的同学可以去深入研究
项目首页:http://code.google.com/p/baiduhook/
官方的文档 http://code.google.com/p/baiduhook/wiki/Demos
百度QA blog上的一个技术文章
http://hi.baidu.com/baiduqa/blog/item/454507494d1f6eeb82025c54.html
查看(2928)
评论(1)
收藏
分享
管理