summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFilipe David Borba Manana <fdmanana@apache.org>2012-10-31 16:19:48 +0100
committerJan Lehnardt <jan@apache.org>2012-11-13 20:53:16 +0100
commitd7f20376b1a880ba45e0a2699de2dd66df82f671 (patch)
tree72f845fe6c7676448e97a8ea4d6ca7457e22cad2
parent178f77fa3c38580e4db42d82d531edccc5d2c743 (diff)
downloadcouchdb-d7f20376b1a880ba45e0a2699de2dd66df82f671.tar.gz
COUCHDB-1424 Fix etap to not consume any message
Turns out that etap consumes any message in the mailbox in some cases. This can make some tests that use message passing hang, as etap itself consumes the messages.
-rw-r--r--src/etap/etap.erl21
1 files changed, 11 insertions, 10 deletions
diff --git a/src/etap/etap.erl b/src/etap/etap.erl
index 7380013f0..ae3896c01 100644
--- a/src/etap/etap.erl
+++ b/src/etap/etap.erl
@@ -120,14 +120,14 @@ plan(N) when is_integer(N), N > 0 ->
%% @doc End the current test plan and output test results.
%% @todo This should probably be done in the test_server process.
end_tests() ->
- timer:sleep(100),
+ Ref = make_ref(),
case whereis(etap_server) of
- undefined -> self() ! true;
- _ -> etap_server ! {self(), state}
+ undefined -> self() ! {Ref, true};
+ _ -> etap_server ! {self(), state, Ref}
end,
- State = receive X -> X end,
+ State = receive {Ref, X} -> X end,
if
- State#test_state.planned == -1 ->
+ is_record(State, test_state) andalso State#test_state.planned == -1 ->
io:format("1..~p~n", [State#test_state.count]);
true ->
ok
@@ -564,8 +564,8 @@ test_server(State) ->
count = State#test_state.count + 1,
fail = State#test_state.fail + 1
};
- {From, state} ->
- From ! State,
+ {From, state, Ref} ->
+ From ! {Ref, State},
State;
{_From, diag, Message} ->
io:format("~s~n", [Message]),
@@ -573,8 +573,8 @@ test_server(State) ->
{From, count} ->
From ! State#test_state.count,
State;
- {From, is_skip} ->
- From ! State#test_state.skip,
+ {From, is_skip, Ref} ->
+ From ! {Ref, State#test_state.skip},
State;
done ->
exit(normal)
@@ -584,7 +584,8 @@ test_server(State) ->
%% @private
%% @doc Process the result of a test and send it to the etap_server process.
mk_tap(Result, Desc) ->
- IsSkip = lib:sendw(etap_server, is_skip),
+ etap_server ! {self(), is_skip, Ref = make_ref()} ,
+ receive {Ref, IsSkip} -> ok end,
case [IsSkip, Result] of
[_, true] ->
etap_server ! {self(), pass, Desc},