diff options
author | Paul Joseph Davis <davisp@apache.org> | 2009-06-25 04:52:17 +0000 |
---|---|---|
committer | Paul Joseph Davis <davisp@apache.org> | 2009-06-25 04:52:17 +0000 |
commit | 25d76bffa027c3d736791949c3b1355709b9531c (patch) | |
tree | 6994cba48516347b0f113dd32bbdb79f7a9aa010 /test/etap | |
parent | c3437ff4648454607e17c7356536e857dfe87ae1 (diff) |
Adding tests for couch_ref_counter.erl
Thanks Bob Dionne
git-svn-id: https://svn.apache.org/repos/asf/couchdb/trunk@788253 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'test/etap')
-rwxr-xr-x | test/etap/100-ref-counter.t | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/test/etap/100-ref-counter.t b/test/etap/100-ref-counter.t new file mode 100755 index 00000000..746b70a9 --- /dev/null +++ b/test/etap/100-ref-counter.t @@ -0,0 +1,93 @@ +#!/usr/bin/env escript +%% -*- erlang -*- + +main(_) -> + code:add_pathz("src/couchdb"), + etap:plan(8), + case (catch test()) of + ok -> + etap:end_tests(); + Other -> + etap:diag(io_lib:format("Test died abnormally: ~p", [Other])), + etap:bail(Other) + end, + ok. + +loop() -> + receive + {ping, From} -> + From ! pong + end. + +wait() -> + receive + _ -> + ok + after + 1000 -> + throw(timeout_error) + end. + +test() -> + {ok, RefCtr} = couch_ref_counter:start([]), + + etap:is( + couch_ref_counter:count(RefCtr), + 1, + "A ref_counter is initialized with the calling process as a referer." + ), + + ChildPid1 = spawn(fun() -> loop() end), + + % This is largely implicit in that nothing else breaks + % as ok is just returned from gen_server:cast() + etap:is( + couch_ref_counter:drop(RefCtr, ChildPid1), + ok, + "Dropping an unknown Pid is ignored." + ), + + couch_ref_counter:add(RefCtr, ChildPid1), + etap:is( + couch_ref_counter:count(RefCtr), + 2, + "Adding a Pid to the ref_counter increases it's count." + ), + + couch_ref_counter:add(RefCtr, ChildPid1), + etap:is( + couch_ref_counter:count(RefCtr), + 2, + "Readding the same Pid maintains the count but increments it's refs." + ), + + couch_ref_counter:drop(RefCtr, ChildPid1), + etap:is( + couch_ref_counter:count(RefCtr), + 2, + "Droping the doubly added Pid only removes a ref, not a referer." + ), + + couch_ref_counter:drop(RefCtr, ChildPid1), + etap:is( + couch_ref_counter:count(RefCtr), + 1, + "Dropping the second ref drops the referer." + ), + + couch_ref_counter:add(RefCtr, ChildPid1), + etap:is( + couch_ref_counter:count(RefCtr), + 2, + "Sanity checking that the Pid was re-added." + ), + + ChildPid1 ! {ping, self()}, + wait(), + etap:is( + couch_ref_counter:count(RefCtr), + 1, + "The referer count was decremented automatically on process exit." + ), + + ok. |