Tasuku SUENAGA
a****@razil*****
2009年 4月 10日 (金) 19:52:29 JST
須藤さん おおおー。テスト失敗時のリソース開放が完全に抜けおちてました。 staticやexpireでのval開放忘れは凡ミスです。直しておきます。 setup/teardownは各テストごとに呼ばれるんですね。 groongaプロセスの上げ下ろしは1回にしたいので、 cut_startup()/cut_shutdown()を使いたいと思います。 (それで思い出したのですが、gcutter.hのあとにsocket.hをincludeすると shutdownの再定義でエラーが出てしまいます。 socket.hがincludeされているとshutdownを再定義しないようにはなっていますが、 いっそのこそ非推奨にしたほうがすっきりすると思いました) Kouhei Sutou さんは書きました: > 須藤です。 > > # パッチ1 > > In <49DF1****@razil*****> > "[groonga-dev,00019] test/unit/memcachedを追加しました。" on Fri, 10 Apr 2009 18:57:49 +0900, > Tasuku SUENAGA <a****@razil*****> wrote: > >> それに併せて、test/unit/memcachedのディレクトリを追加し、 >> そこに簡単なmemcachedプロトコルのテストを入れました。 > > valもstaticにしてファイルローカルにしちゃってよいと思います。 > teardownにいれておかないと、途中でassertionが失敗してfree() > されないことがあります。 > > (テストなので多少のメモリリークなんかどうでもいいじゃんとか > いうのでもいいですが、ふつうに使うときのようにちゃんとメモリ > 管理するように書いておくと、たまにテスト対象のメモリ管理バグ > を見つけることができます。) > > diff --git a/test/unit/memcached/test-memcached.c b/test/unit/memcached/test-memcached.c > index 8e6e50c..c2b7dbf 100644 > --- a/test/unit/memcached/test-memcached.c > +++ b/test/unit/memcached/test-memcached.c > @@ -30,9 +30,10 @@ > #define GROONGA_TEST_DB "/tmp/groonga-memcached.db" > > /* globals */ > -pid_t groonga_pid; > -struct memcached_st *memc; > -struct memcached_server_st *servers; > +static pid_t groonga_pid; > +static struct memcached_st *memc; > +static struct memcached_server_st *servers; > +static char *val; > > void test_set_and_get(void); > > @@ -59,6 +60,8 @@ setup(void) > cut_fail("cannot execute groonga server. port:%s db:%s", > GROONGA_TEST_PORT, GROONGA_TEST_DB); > } > + > + val = NULL; > } > > void > @@ -70,12 +73,15 @@ teardown(void) > cut_fail("cannot terminate groonga server. port:%s db:%s", > GROONGA_TEST_PORT, GROONGA_TEST_DB); > } > + > + if (val) { > + free(val); > + } > } > > void > test_set_and_get(void) > { > - char *val; > size_t val_len; > uint32_t flags; > memcached_return rc; > @@ -89,16 +95,11 @@ test_set_and_get(void) > cut_assert_equal_int(MEMCACHED_SUCCESS, rc); > cut_assert_equal_string("value", val); > cut_assert_equal_uint(0xdeadbeefU, flags); > - > - if (val) { > - free(val); > - } > } > > void > test_set_and_get_with_expire(void) > { > - char *val; > size_t val_len; > uint32_t flags; > memcached_return rc; > @@ -113,13 +114,14 @@ test_set_and_get_with_expire(void) > cut_assert_equal_string("value", val); > cut_assert_equal_uint(0xdeadbeefU, flags); > > + if (val) { > + free(val); > + val = NULL; > + } > + > sleep(2); > > val = memcached_get(memc, "key", 1, &val_len, &flags, &rc); > cut_set_message("memcached get with expiration error."); > cut_assert_equal_int(MEMCACHED_NOTFOUND, rc); > - > - if (val) { > - free(val); > - } > } > > > -- > 須藤 功平 <kou****@clear*****> > > 株式会社クリアコード (http://www.clear-code.com/) --- tasuku <a****@razil*****>