My favorites | Sign in
Project Home Downloads Wiki Issues
Project Information
Members
Links

translate english!

イントロダクション

テストを書いていると、一時的に関数の挙動を書き換えたいときがあります。

こんな関数のテストするとして、time()関数をライブラリの中に書いてあるので、失敗ルーチンのテストを書くのが非常に難しい場合。。。

//2000年以上か?
bool isOver2000year()
{
	//現在動かしたら、絶対 TRUE にしかならない
	return time(NULL) >= 946652400;	//2000-01-01 00:00:00
}

このルーチンを検証するのには、PCの時計を変更しないとだめ。

うーん、めんどくさい。

テストルーチンの時だけ、一時的に time() を昔に戻せないだろうか。

そんなことで困ってませんか?

{
	//現在は2010年なので結果はTRUE
	bool r = isOver2000year();
	printf("%d" , (int)r);	//1
}
{
	//time関数を乗っ取る all your function are belong to us
	SEXYHOOK_FUNC_HOOK_1_BEGIN(time_t,__cdecl,time,time_t * a)
	{
		//昔の時刻を返すようにする
		return 915116400;//1999-01-01 00:00:00
	}
	SEXYHOOK_FUNC_END();

	//現在は2010年なので、結果は TRUE になりそうだが、上で関数をフックしているので、結果は FALSE
	bool r = isOver2000year();
	printf("%d" , (int)r);	//0
}

sexyhookを使えば、一時的にAPIや関数、クラスメソッドの挙動を自由に書き換えることが出来ます。
名著レガシーコード改善ガイドWorking Effectively With Legacy Code)にある接合部を既存のソースコードを一切変更せずに強引に作り出し、テストを楽に行うことができます。


興味を持ったら次のページにゴー

SEXYHOOKで始めるテスト 強引に接合部を作成 SEXYHOOK_Users_Manual


どうやって実装しているのか気になる人、もっと改造してよりセクシーにしたいハッカー向け
SEXYHOOKの実装部(魔術サイド) SEXYHOOK_Hackers_Manual

プレゼン (とある関数の接合部 SEXYHOOK)
http://prezi.com/aigm45d07lrp/sexyhook2/
急募:発表できる勉強会w


内容に間違い、バグ等ありましたら、SVN/wikiを修正していただいて結構です。お気軽にどうぞ。
よろしければ、twitterで @super_rti までご連絡ください。

Powered by Google Project Hosting