diff options
author | Paul J. Davis <paul.joseph.davis@gmail.com> | 2018-09-19 11:53:16 -0500 |
---|---|---|
committer | Paul J. Davis <paul.joseph.davis@gmail.com> | 2020-01-05 14:16:52 -0600 |
commit | 36cf8936f88d8e9b519bd94aab433933691ff6ae (patch) | |
tree | 8a032c3ce2c105fee1a39a63a5e728fd66f33176 | |
parent | 0449057d65d185822087c5c856ee269ee64a37c2 (diff) | |
download | couchdb-36cf8936f88d8e9b519bd94aab433933691ff6ae.tar.gz |
Simplfiy interleaved message couch_server test
Previous this test relied on delete/open requests getting things into a
confused state. Now that we understand the issue we can replace the more
complicated logic by directly polutnig couch_server's message queue with
invalid messages.
-rw-r--r-- | src/couch/test/eunit/couch_server_tests.erl | 50 |
1 files changed, 17 insertions, 33 deletions
diff --git a/src/couch/test/eunit/couch_server_tests.erl b/src/couch/test/eunit/couch_server_tests.erl index 530b7efd0..7d50700d2 100644 --- a/src/couch/test/eunit/couch_server_tests.erl +++ b/src/couch/test/eunit/couch_server_tests.erl @@ -14,6 +14,8 @@ -include_lib("couch/include/couch_eunit.hrl"). -include_lib("couch/include/couch_db.hrl"). + +-include("../src/couch_db_int.hrl"). -include("../src/couch_server_int.hrl"). start() -> @@ -192,10 +194,11 @@ make_interleaved_requests({_, TestDbName}) -> t_interleaved_create_delete_open(DbName) -> - {CrtRef, DelRef, OpenRef} = {make_ref(), make_ref(), make_ref()}, + {CrtRef, OpenRef} = {make_ref(), make_ref()}, CrtMsg = {'$gen_call', {self(), CrtRef}, {create, DbName, [?ADMIN_CTX]}}, - DelMsg = {'$gen_call', {self(), DelRef}, {delete, DbName, [?ADMIN_CTX]}}, - OpenMsg = {'$gen_call', {self(), OpenRef}, {open, DbName, [?ADMIN_CTX]}}, + FakePid = spawn(fun() -> ok end), + OpenResult = {open_result, DbName, {ok, #db{main_pid = FakePid}}}, + OpenResultMsg = {'$gen_call', {self(), OpenRef}, OpenResult}, % Get the current couch_server pid so we're sure % to not end up messaging two different pids @@ -215,48 +218,29 @@ t_interleaved_create_delete_open(DbName) -> % our next requests and let the opener finish processing. erlang:suspend_process(CouchServer), - % Since couch_server is suspend, this delete request won't - % be processed until after the opener has sent its - % successful open response via gen_server:call/3 - CouchServer ! DelMsg, - - % This open request will be in the queue after the - % delete request but before the gen_server:call/3 - % message which will establish the mixed up state - % in the couch_dbs ets table - CouchServer ! OpenMsg, + % We queue a confused open_result message in front of + % the correct response from the opener. + CouchServer ! OpenResultMsg, - % First release the opener pid so it can continue - % working while we tweak meck + % Release the opener pid so it can continue Opener ! go, - % Replace our expect call to meck so that the OpenMsg - % isn't blocked on the receive - meck:expect(couch_db, start_link, fun(Engine, DbName1, Filename, Options) -> - meck:passthrough([Engine, DbName1, Filename, Options]) - end), - % Wait for the '$gen_call' message from OpenerPid to arrive % in couch_server's mailbox ok = wait_for_open_async_result(CouchServer, Opener), % Now monitor and resume the couch_server and assert that - % couch_server does not crash while processing OpenMsg + % couch_server does not crash while processing OpenResultMsg CSRef = erlang:monitor(process, CouchServer), erlang:resume_process(CouchServer), check_monitor_not_triggered(CSRef), - % The create response is expected to return not_found - % due to the delete request canceling the async opener - % pid and sending not_found to all waiters unconditionally - ?assertEqual({CrtRef, not_found}, get_next_message()), - - % Our delete request was processed normally - ?assertEqual({DelRef, ok}, get_next_message()), + % Our open_result message was processed and ignored + ?assertEqual({OpenRef, ok}, get_next_message()), - % The db was deleted thus it should be not found - % when we try and open it. - ?assertMatch({OpenRef, {not_found, no_db_file}}, get_next_message()), + % Our create request was processed normally after we + % ignored the spurious open_result + ?assertMatch({CrtRef, {ok, _}}, get_next_message()), % And finally assert that couch_server is still % alive. @@ -281,7 +265,7 @@ wait_for_open_async_result(CouchServer, Opener) -> {_, Messages} = erlang:process_info(CouchServer, messages), Found = lists:foldl(fun(Msg, Acc) -> case Msg of - {'$gen_call', {Opener, _}, {open_result, _, _, {ok, _}}} -> + {'$gen_call', {Opener, _}, {open_result, _, {ok, _}}} -> true; _ -> Acc |