WIP: tests pass, but not finished yet

This commit is contained in:
Scott Lystig Fritchie 2015-05-01 14:51:42 +09:00
parent 7bafc1c28a
commit 53f6a753f4
3 changed files with 71 additions and 31 deletions

View file

@ -131,28 +131,31 @@ test_react_to_env(Pid) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
get_my_private_projection_members_dict(MgrOpts) -> %% Bootstrapping is a hassle ... when when isn't it?
EmptyDict = orddict:new(), %%
case proplists:get_value(projection_store_registered_name, MgrOpts) of %% If InitMembersDict == [], then we don't know anything about the chain
undefined -> %% that we'll be participating in. We'll have to wait for directions from
EmptyDict; %% our sysadmin later.
Store -> %%
case machi_projection_store:read_latest_projection(Store, private) of %% If InitMembersDict /= [], then we do know what chain we're
{error, not_written} -> %% participating in. It's probably test code, since that's about the
EmptyDict; %% only time that we know so much at init() time.
{ok, P} -> %%
P#projection_v1.members_dict %% In either case, we'll try to create & store an epoch 0 projection
end %% and store it to both projections stores. This is tricky if
end. %% InitMembersDict == [] because InitMembersDict usually contains the
%% #p_svrv records that we need to *write* to the projection store,
%% even our own private store! For test code, we get the store
%% manager's pid in MgrOpts and use direct gen_server calls to the
%% local projection store.
init({MyName, MembersDict, MgrOpts}) -> init({MyName, InitMembersDict, MgrOpts}) ->
Dx = case MembersDict of ZeroAll_list = [P#p_srvr.name || {_,P} <- orddict:to_list(InitMembersDict)],
[] -> ZeroProj = make_none_projection(MyName, ZeroAll_list, InitMembersDict),
get_my_private_projection_members_dict(MgrOpts); ok = store_zeroth_projection_maybe(ZeroProj, MgrOpts),
_ ->
MembersDict MembersDict = get_my_private_projection_members_dict(MgrOpts, InitMembersDict),
end, All_list = [P#p_srvr.name || {_, P} <- orddict:to_list(MembersDict)],
All_list = [P#p_srvr.name || {_, P} <- orddict:to_list(Dx)],
Opt = fun(Key, Default) -> proplists:get_value(Key, MgrOpts, Default) end, Opt = fun(Key, Default) -> proplists:get_value(Key, MgrOpts, Default) end,
RunEnv = [{seed, Opt(seed, now())}, RunEnv = [{seed, Opt(seed, now())},
{use_partition_simulator, Opt(use_partition_simulator, true)}, {use_partition_simulator, Opt(use_partition_simulator, true)},
@ -247,6 +250,29 @@ make_none_projection(MyName, All_list, MembersDict) ->
UPI_list = [], UPI_list = [],
machi_projection:new(MyName, MembersDict, UPI_list, Down_list, [], []). machi_projection:new(MyName, MembersDict, UPI_list, Down_list, [], []).
get_my_private_projection_members_dict(MgrOpts, DefaultDict) ->
case proplists:get_value(projection_store_registered_name, MgrOpts) of
undefined ->
DefaultDict;
Store ->
{ok, P} = machi_projection_store:read_latest_projection(Store,
private),
P#projection_v1.members_dict
end.
%% Write the epoch 0 projection store, to assist bootstrapping. If the
%% 0th epoch is already written, there's no problem.
store_zeroth_projection_maybe(ZeroProj, MgrOpts) ->
case proplists:get_value(projection_store_registered_name, MgrOpts) of
undefined ->
ok;
Store ->
_ = machi_projection_store:write(Store, public, ZeroProj),
_ = machi_projection_store:write(Store, private, ZeroProj),
ok
end.
set_active_timer(#ch_mgr{name=MyName, members_dict=MembersDict}=S) -> set_active_timer(#ch_mgr{name=MyName, members_dict=MembersDict}=S) ->
FLU_list = [P#p_srvr.name || {_,P} <- orddict:to_list(MembersDict)], FLU_list = [P#p_srvr.name || {_,P} <- orddict:to_list(MembersDict)],
USec = calc_sleep_ranked_order(1000, 2000, MyName, FLU_list), USec = calc_sleep_ranked_order(1000, 2000, MyName, FLU_list),
@ -607,6 +633,8 @@ rank_projection(#projection_v1{author_server=Author,
( N * length(Repairing_list)) + ( N * length(Repairing_list)) +
(N*N * length(UPI_list)). (N*N * length(UPI_list)).
do_react_to_env(#ch_mgr{proj=#projection_v1{members_dict=[]}}=S) ->
{empty_members_dict, S};
do_react_to_env(S) -> do_react_to_env(S) ->
put(react, []), put(react, []),
react_to_env_A10(S). react_to_env_A10(S).
@ -1238,9 +1266,9 @@ QQQ =
{_WhateverUnanimous, BestP, Props, _S} = {_WhateverUnanimous, BestP, Props, _S} =
cl_read_latest_projection(private, S), cl_read_latest_projection(private, S),
NotBestPs = proplists:get_value(not_unanimous_answers, Props, []), NotBestPs = proplists:get_value(not_unanimous_answers, Props, []),
io:format(user, "QQQ ~p\n", [QQQ]), %% io:format(user, "QQQ ~p\n", [QQQ]),
io:format(user, "BestP ~p\n", [BestP]), %% io:format(user, "BestP ~p\n", [BestP]),
io:format(user, "NotBestPs ~p\n", [NotBestPs]), %% io:format(user, "NotBestPs ~p\n", [NotBestPs]),
DownUnion = lists:usort( DownUnion = lists:usort(
lists:flatten( lists:flatten(
[P#projection_v1.down || [P#projection_v1.down ||

View file

@ -239,6 +239,17 @@ info_msg(Fmt, Args) ->
_ -> error_logger:info_msg(Fmt, Args) _ -> error_logger:info_msg(Fmt, Args)
end. end.
wait_for_death(Pid, 0) ->
exit({not_dead_yet, Pid});
wait_for_death(Pid, Iters) when is_pid(Pid) ->
case erlang:is_process_alive(Pid) of
false ->
ok;
true ->
timer:sleep(1),
wait_for_death(Pid, Iters-1)
end.
%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%
%% @doc Create a TCP connection to a remote Machi server. %% @doc Create a TCP connection to a remote Machi server.

View file

@ -43,6 +43,7 @@
-include_lib("eunit/include/eunit.hrl"). -include_lib("eunit/include/eunit.hrl").
smoke_test() -> smoke_test() ->
[os:cmd("rm -rf " ++ X) || X <- ["./data.a", "./data.b", "/data.c"] ],
{ok, SupPid} = machi_flu_sup:start_link(), {ok, SupPid} = machi_flu_sup:start_link(),
try try
{ok, _} = machi_flu_psup:start_flu_package(a, 5555, "./data.a", {ok, _} = machi_flu_psup:start_flu_package(a, 5555, "./data.a",
@ -51,16 +52,16 @@ smoke_test() ->
[{active_mode,false}]), [{active_mode,false}]),
{ok, _} = machi_flu_psup:start_flu_package(c, 5557, "./data.c", {ok, _} = machi_flu_psup:start_flu_package(c, 5557, "./data.c",
[{active_mode,false}]), [{active_mode,false}]),
[begin [begin
QQ = machi_chain_manager1:test_react_to_env(a_chmgr), _QQ = machi_chain_manager1:test_react_to_env(a_chmgr),
io:format(user, "QQ ~p\n", [QQ]) ok
end || _ <- [1,2,3]], end || _ <- lists:seq(1,5)],
ok ok
after after
[ok = machi_flu_psup:stop_flu_package(X) || X <- [a,b,c]], exit(SupPid, normal),
unlink(SupPid), machi_util:wait_for_death(SupPid, 100),
exit(SupPid, stop_please) ok
end. end.
-endif. % TEST -endif. % TEST