Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cassandra MAM backend tests for travis [not merge] #102

Open
wants to merge 10 commits into
base: master
Choose a base branch
from
31 changes: 1 addition & 30 deletions default.spec
Original file line number Diff line number Diff line change
Expand Up @@ -8,38 +8,9 @@
%% For more info see:
%% http://www.erlang.org/doc/apps/common_test/run_test_chapter.html#test_specifications

{suites, "tests", adhoc_SUITE}.
{suites, "tests", amp_SUITE}.
{suites, "tests", anonymous_SUITE}.
{suites, "tests", bosh_SUITE}.
{suites, "tests", carboncopy_SUITE}.
{suites, "tests", cluster_commands_SUITE}.
{suites, "tests", conf_reload_SUITE}.
{suites, "tests", connect_SUITE}.
{suites, "tests", ejabberdctl_SUITE}.
{suites, "tests", last_SUITE}.
{suites, "tests", login_SUITE}.
{suites, "tests", mam_SUITE}.
{suites, "tests", metrics_api_SUITE}.
{suites, "tests", metrics_c2s_SUITE}.
{suites, "tests", metrics_roster_SUITE}.
{suites, "tests", metrics_register_SUITE}.
{suites, "tests", metrics_session_SUITE}.
{suites, "tests", muc_SUITE}.
{suites, "tests", offline_SUITE}.
{suites, "tests", presence_SUITE}.
{suites, "tests", privacy_SUITE}.
{suites, "tests", private_SUITE}.
{suites, "tests", s2s_SUITE}.
{suites, "tests", shared_roster_SUITE}.
{suites, "tests", sic_SUITE}.
{suites, "tests", sm_SUITE}.
{suites, "tests", system_monitor_SUITE}.
{suites, "tests", users_api_SUITE}.
{suites, "tests", vcard_simple_SUITE}.
{suites, "tests", websockets_SUITE}.
{config, ["test.config"]}.
{logdir, "ct_report"}.
{ct_hooks, [ct_tty_hook, ct_mongoose_hook]}.
{ct_hooks, [ct_tty_hook, ct_mongoose_hook, ct_travis_hook]}.
%%To enable printing group and case enters on server side
%%{ct_hooks, [{ct_tty_hook, [print_group, print_case]}]}.
33 changes: 0 additions & 33 deletions full.spec
Original file line number Diff line number Diff line change
@@ -1,35 +1,2 @@
{suites, "tests", anonymous_SUITE}.
{suites, "tests", bosh_SUITE}.
{suites, "tests", s2s_SUITE}.
%%{suites, "tests", snmp_SUITE}.
%%{suites, "tests", snmp_c2s_SUITE}.
%%{suites, "tests", snmp_register_SUITE}.
%%{suites, "tests", snmp_roster_SUITl}.
%%{suites, "tests", snmp_session_SUITE}.
%%{suites, "tests", snmp_table_SUITE}.

%% taken from default.spec
{suites, "tests", adhoc_SUITE}.
{suites, "tests", conf_reload_SUITE}.
{suites, "tests", ejabberdctl_SUITE}.
{suites, "tests", last_SUITE}.
{suites, "tests", login_SUITE}.
{suites, "tests", muc_SUITE}.
{suites, "tests", mam_SUITE}.
{suites, "tests", offline_SUITE}.
{suites, "tests", presence_SUITE}.
{suites, "tests", privacy_SUITE}.
{suites, "tests", private_SUITE}.
{suites, "tests", sic_SUITE}.
{suites, "tests", users_api_SUITE}.
{suites, "tests", vcard_simple_SUITE}.
{suites, "tests", websockets_SUITE}.
{suites, "tests", metrics_api_SUITE}.
{suites, "tests", metrics_c2s_SUITE}.
{suites, "tests", metrics_roster_SUITE}.
{suites, "tests", metrics_register_SUITE}.
{suites, "tests", metrics_session_SUITE}.
{suites, "tests", system_monitor_SUITE}.
{suites, "tests", carboncopy_SUITE}.
{config, ["test.config"]}.
{logdir, "ct_report"}.
155 changes: 155 additions & 0 deletions src/ct_travis_hook.erl
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
%%% @doc Common Test Example Common Test Hook module.
-module(ct_travis_hook).

%% Callbacks
-export([id/1]).
-export([init/2]).

-export([pre_init_per_suite/3]).
-export([post_init_per_suite/4]).
-export([pre_end_per_suite/3]).
-export([post_end_per_suite/4]).

-export([pre_init_per_group/3]).
-export([post_init_per_group/4]).
-export([pre_end_per_group/3]).
-export([post_end_per_group/4]).

-export([pre_init_per_testcase/3]).
-export([post_end_per_testcase/4]).

-export([on_tc_fail/3]).
-export([on_tc_skip/3]).

-export([terminate/1]).

-record(state, { log_fd, test_n, group_test_n }).

%% @doc Return a unique id for this CTH.
id(Opts) ->
ct_travis_hook.

%% @doc Always called before any other callback function. Use this to initiate
%% any common state.
init(Id, Opts) ->
ct:pal("Init ct_travis_hook", []),
{ok, FD} = file:open("/tmp/ct_travis_hook.log", [append, write]),
{ok, #state{log_fd=FD}}.

%% @doc Called before init_per_suite is called.
pre_init_per_suite(Suite,Config,State) ->
State2 = reset_test_n(State),
{Config, fold_start(suite, Suite, State2)}.

%% @doc Called after init_per_suite.
post_init_per_suite(Suite,Config,Return,State) ->
{Return, State}.

%% @doc Called before end_per_suite.
pre_end_per_suite(Suite,Config,State) ->
{Config, State}.

%% @doc Called after end_per_suite.
post_end_per_suite(Suite,Config,Return,State) ->
{Return, fold_end(suite, Suite, Return, State)}.

%% @doc Called before each init_per_group.
pre_init_per_group(Group,Config,State) ->
State2 = set_group_test_n(State),
State3 = fold_start(group, Group, State2),
{Config, State3}.

%% @doc Called after each init_per_group.
post_init_per_group(Group,Config,Return,State) ->
{Return, State}.

%% @doc Called after each end_per_group.
pre_end_per_group(Group,Config,State) ->
{Config, State}.

%% @doc Called after each end_per_group.
post_end_per_group(Group,Config,Return,State) ->
{Return, fold_end(group, Group, Return, State)}.

%% @doc Called before each test case.
pre_init_per_testcase(TC,Config,State) ->
{Config, fold_start(test, TC, State)}.

%% @doc Called after each test case.
post_end_per_testcase(TC,Config,Return,State) ->
State2 = fold_end(test, TC, Return, State),
State3 = inc_test_n(State2),
{Return, State3}.

%% @doc Called after post_init_per_suite, post_end_per_suite, post_init_per_group,
%% post_end_per_group and post_end_per_testcase if the suite, group or test case failed.
on_tc_fail(TC, Reason, State) ->
State.

%% @doc Called when a test case is skipped by either user action
%% or due to an init function failing.
on_tc_skip(TC, Reason, State) ->
State.

%% @doc Called when the scope of the CTH is done
terminate(State) ->
ok.

%% --------------------------------------------------------------------
%% Private

%% Same as:
%% echo -en "travis_fold:start:Name\\r"
%% echo "Name"
fold_start(Type, Name, State=#state{log_fd=FD}) ->
STestN = get_and_print_n(Type, State),
SType = print_type(Type),
io:format(FD, "travis_fold:start:~s~p.~s\r~p~n",
[SType, Name, STestN, Name]),
State.

%% Same as:
%% echo -en "travis_fold:end:Name\\r"
fold_end(Type, Name, Return, State=#state{log_fd=FD}) ->
STestN = get_and_print_n(Type, State),
SType = print_type(Type),
SReturn = print_return(Return),
io:format(FD, "travis_fold:end:~s~p.~s\r~s",
[SType, Name, STestN, SReturn]),
State.

print_type(suite) -> "s.";
print_type(group) -> "g.";
print_type(test) -> "t.".

print_return({skip, Reason}) ->
io_lib:format("~nSkipped ~p~n", [Reason]);
print_return({fail, Reason}) ->
io_lib:format("~nFailed ~p~n", [Reason]);
print_return(_) ->
"".

inc_test_n(State=#state{test_n=TestN}) ->
State#state{test_n=TestN+1}.

reset_test_n(State=#state{test_n=TestN}) ->
State#state{test_n=1}.

set_group_test_n(State=#state{test_n=TestN}) ->
State#state{group_test_n=TestN}.

get_and_print_n(Type, State) ->
TestN = get_test_n(Type, State),
print_test_n(Type, TestN).

get_test_n(test, State=#state{test_n=TestN}) ->
TestN;
get_test_n(group, State=#state{group_test_n=TestN}) ->
TestN;
get_test_n(suite, State=#state{}) ->
1.

print_test_n(suite, _TestN) ->
""; % do not print for suites, because TestN is always 1
print_test_n(_Type, TestN) ->
integer_to_list(TestN).
2 changes: 1 addition & 1 deletion test.config
Original file line number Diff line number Diff line change
Expand Up @@ -201,7 +201,7 @@
]}.

{mam, [
{skipped_configurations, [ca]}
% {skipped_configurations, [ca]}
]}.

%% vim: ft=erlang
51 changes: 48 additions & 3 deletions tests/mam_SUITE.erl
Original file line number Diff line number Diff line change
Expand Up @@ -178,15 +178,38 @@ tests() ->
not is_skipped(C, G)].

groups() ->
[{full_group(C, G), Props, Tests}
[{full_group(C, G), Props, filter_tests(C, G, Tests)}
|| C <- configurations(), {G, Props, Tests} <- basic_groups(),
not is_skipped(C, G)].

filter_tests(C, G, Tests) ->
[Test || Test <- Tests, not is_test_skipped(C, G, Test)].

is_skipped(odbc_mnesia_muc_cache, muc) -> false;
is_skipped(odbc_mnesia_muc_cache, muc_with_pm) -> false;
is_skipped(odbc_mnesia_muc_cache, muc_rsm) -> false;
is_skipped(odbc_mnesia_muc_cache, _) -> true;
is_skipped(ca, rsm) ->
true; %% only with_rsm group supported, mod_mam_con_ca_arch missing_with_jid
is_skipped(C, _) -> is_configuration_skipped(C).

is_test_skipped(ca, muc_rsm, muc_querying_for_all_messages_with_jid) ->
true; % mod_mam_muc_ca_arch with_jid_not_supported
is_test_skipped(ca, rsm, pagination_offset5_opt_count) ->
true; % mod_mam_con_ca_arch offset_not_supported
is_test_skipped(ca, with_rsm, pagination_offset5_opt_count) ->
true; % mod_mam_con_ca_arch offset_not_supported
is_test_skipped(ca, muc_rsm, pagination_offset5_opt_count) ->
true; % mod_mam_muc_ca_arch offset_not_supported
is_test_skipped(ca, rsm, pagination_offset5_opt_count_all) ->
true; % mod_mam_con_ca_arch offset_not_supported
is_test_skipped(ca, with_rsm, pagination_offset5_opt_count_all) ->
true; % mod_mam_con_ca_arch offset_not_supported
is_test_skipped(ca, muc_rsm, pagination_offset5_opt_count_all) ->
true; % mod_mam_muc_ca_arch offset_not_supported
is_test_skipped(_C, _G, _Test) ->
false.

is_configuration_skipped(C) ->
lists:member(C, skipped_configurations()).

Expand Down Expand Up @@ -246,9 +269,11 @@ muc_cases() ->
muc_rsm_cases() ->
rsm_cases().

%% RSM cases with filtering by countact jid
with_rsm_cases() ->
rsm_cases().

%% RSM cases without filtering by countact jid
rsm_cases() ->
[pagination_first5,
pagination_last5,
Expand Down Expand Up @@ -292,15 +317,35 @@ init_per_group(Group, Config) ->
B = basic_group(Group),
ct:pal("Init per group ~p; configuration ~p; basic group ~p",
[Group, C, B]),
Config1 = init_modules(C, B, Config),
init_state(C, B, Config1).
Config1 = try_init_modules(C, B, Config),
try_init_state(C, B, Config1).

end_per_group(Group, Config) ->
C = configuration(Group),
B = basic_group(Group),
Config1 = end_state(C, B, Config),
end_modules(C, B, Config1).

try_init_modules(C, B, Config) ->
try
init_modules(C, B, Config)
catch Class:Reason ->
Stacktrace = erlang:get_stacktrace(),
ct:pal("init_modules failed, configuration=~p, basic_group=~p, stacktrace=~p",
[C, B, Stacktrace]),
erlang:raise(Class, Reason, Stacktrace)
end.

try_init_state(C, B, Config) ->
try
init_state(C, B, Config)
catch Class:Reason ->
Stacktrace = erlang:get_stacktrace(),
ct:pal("init_state failed, configuration=~p, basic_group=~p, stacktrace=~p",
[C, B, Stacktrace]),
erlang:raise(Class, Reason, Stacktrace)
end.

init_modules(C, muc_rsm, Config) ->
init_modules(C, muc, Config);

Expand Down