-
Notifications
You must be signed in to change notification settings - Fork 428
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
Add GDPR removal for pubsub (alternative) #2349
Conversation
Tests by @NelsonVides and @ludwikbukowski
6735.1 / Erlang 20.3 / small_tests / 6902266 6735.2 / Erlang 20.3 / internal_mnesia / 6902266 pubsub_SUITE:tree+hometree_specific:disco_node_children_by_path_prefix{error,{{badmatch,false},
[{pubsub_tools,check_response,2,
[{file,"pubsub_tools.erl"},{line,472}]},
{pubsub_tools,receive_response,3,
[{file,"pubsub_tools.erl"},{line,462}]},
{pubsub_tools,receive_and_check_response,4,
[{file,"pubsub_tools.erl"},{line,452}]},
{pubsub_SUITE,'-disco_node_children_by_path_prefix/1-fun-0-',2,
[{file,"pubsub_SUITE.erl"},{line,1796}]},
{escalus_story,story,4,
[{file,"/home/travis/build/esl/MongooseIM/big_tests/_build/default/lib/escalus/src/escalus_story.erl"},
{line,72}]},
{test_server,ts_tc,3,[{file,"test_server.erl"},{line,1546}]},
{test_server,run_test_case_eval1,6,
[{file,"test_server.erl"},{line,1062}]},
{test_server,run_test_case_eval,9,
[{file,"test_server.erl"},{line,994}]}]}} sm_SUITE:parallel:subscription_requests_are_buffered_properly{error,{{badmatch,false},
[{escalus_session,stream_management,2,
[{file,"/home/travis/build/esl/MongooseIM/big_tests/_build/default/lib/escalus/src/escalus_session.erl"},
{line,240}]},
{escalus_connection,connection_step,2,
[{file,"/home/travis/build/esl/MongooseIM/big_tests/_build/default/lib/escalus/src/escalus_connection.erl"},
{line,154}]},
{lists,foldl,3,[{file,"lists.erl"},{line,1263}]},
{escalus_connection,start,2,
[{file,"/home/travis/build/esl/MongooseIM/big_tests/_build/default/lib/escalus/src/escalus_connection.erl"},
{line,138}]},
{sm_SUITE,'-subscription_requests_are_buffered_properly/1-fun-3-',6,
[{file,"sm_SUITE.erl"},{line,848}]},
{escalus_story,story,4,
[{file,"/home/travis/build/esl/MongooseIM/big_tests/_build/default/lib/escalus/src/escalus_story.erl"},
{line,72}]},
{test_server,ts_tc,3,[{file,"test_server.erl"},{line,1546}]},
{test_server,run_test_case_eval1,6,
[{file,"test_server.erl"},{line,1062}]}]}} 6735.3 / Erlang 20.3 / odbc_mssql_mnesia / 6902266 pubsub_SUITE:tree+hometree_specific:can_create_node_with_existing_parent_path{error,{{badmatch,false},
[{pubsub_tools,check_response,2,
[{file,"pubsub_tools.erl"},{line,472}]},
{pubsub_tools,receive_response,3,
[{file,"pubsub_tools.erl"},{line,462}]},
{pubsub_tools,receive_and_check_response,4,
[{file,"pubsub_tools.erl"},{line,452}]},
{pubsub_SUITE,'-can_create_node_with_existing_parent_path/1-fun-0-',
1,
[{file,"pubsub_SUITE.erl"},{line,1768}]},
{escalus_story,story,4,
[{file,"/home/travis/build/esl/MongooseIM/big_tests/_build/default/lib/escalus/src/escalus_story.erl"},
{line,72}]},
{test_server,ts_tc,3,[{file,"test_server.erl"},{line,1546}]},
{test_server,run_test_case_eval1,6,
[{file,"test_server.erl"},{line,1062}]},
{test_server,run_test_case_eval,9,
[{file,"test_server.erl"},{line,994}]}]}} 6735.4 / Erlang 20.3 / ldap_mnesia / 6902266 6735.5 / Erlang 20.3 / elasticsearch_and_cassandra_mnesia / 6902266 6735.8 / Erlang 21.3 / mysql_redis / 6902266 pubsub_SUITE:dag+collection:discover_top_level_nodes_test{error,
{timeout_when_waiting_for_stanza,
[{escalus_client,wait_for_stanza,
[{client,<<"alicE43.50371@localhost/res1">>,escalus_tcp,
<0.16042.3>,
[{event_manager,<0.15981.3>},
{server,<<"localhost">>},
{username,<<"alicE43.50371">>},
{resource,<<"res1">>}],
[{event_client,
[{event_manager,<0.15981.3>},
{server,<<"localhost">>},
{username,<<"alicE43.50371">>},
{resource,<<"res1">>}]},
{resource,<<"res1">>},
{username,<<"alicE43.50371">>},
{server,<<"localhost">>},
{host,<<"localhost">>},
{port,5222},
{auth,{escalus_auth,auth_plain}},
{wspath,undefined},
{username,<<"alicE43.50371">>},
{server,<<"localhost">>},
{password,<<"matygrysa">>},
{stream_id,<<"8CE829EB2A9CA1C6">>}]},
5000],
[{file,
"/home/travis/build/esl/MongooseIM/big_tests/_build/default/lib/escalus/src/escalus_client.erl"},
{line,136}]},
{pubsub_tools,receive_response,3,
[{file,"pubsub_tools.erl"},{line,461}]},
{pubsub_tools,receive_and_check_response,4,
[{file,"pubsub_tools.erl"},{line,452}]},
{pubsub_SUITE,'-discover_top_level_nodes_test/1-fun-0-',2,
[{file,"pubsub_SUITE.erl"},{line,1461}]},
{escalus_story,story,4,
[{file,
"/home/travis/build/esl/MongooseIM/big_tests/_build/default/... 6735.7 / Erlang 21.3 / pgsql_mnesia / 6902266 6735.9 / Erlang 21.3 / riak_mnesia / 6902266 |
Codecov Report
@@ Coverage Diff @@
## master #2349 +/- ##
=========================================
+ Coverage 76.31% 77.8% +1.49%
=========================================
Files 335 335
Lines 29287 29314 +27
=========================================
+ Hits 22349 22809 +460
+ Misses 6938 6505 -433
Continue to review full report at Codecov.
|
src/pubsub/mod_pubsub.erl
Outdated
BackendModules = mongoose_lib:find_behaviour_implementations(mod_pubsub_db), | ||
lists:foreach(fun(Backend) -> | ||
remove_user_per_backend_safe(LUser, LServer, Backend) | ||
end, BackendModules). |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I had cases of dialyzer failing to me here. The spec of remove_user/2
in gdpr
is to return the atom ok
.
(_) -> | ||
ok | ||
end, Affs). | ||
BackendModules = mongoose_lib:find_behaviour_implementations(mod_pubsub_db), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
And this just makes me think of one thing: why did we spawn a different process and return ok immediately before? Was it because of some timeout? Do we want to receive a notification for failure or so?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Original pubsub's remove_user
implementation probably assumed that the operator doesn't care if the removal action actually finished when the function exits. Currently all GDPR ops we've added are synchronous, even for MAM.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This solution seem mostly "clean" apart from the fact that it skips one level of abstraction which really hurts. And since the implementation is the same and all nodes are based on node_flat
, why don't we move this implementation to node_flat:on_remove_user
? I'm sure we can get the plugin name from state, or even add it to the args and inside this node_flat:on_remove_user
call Plugin:should_delete_when_owner_removed
(erlang polymorphism? :) ).
Apart from that I have only some minor comments and some questions.
big_tests/tests/pubsub_tools.erl
Outdated
{node_addr(), pubsub_node_name()}. | ||
pubsub_node() -> pubsub_node(1). | ||
pubsub_node(Num) -> | ||
{pubsub_tools:node_addr(), <<"node", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
{pubsub_tools:node_addr(), <<"node", | |
{pubsub_tools:node_addr(), <<"node_", |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
IMHO the above ^ is gonna be more readable, but I don't have a strong opinion on that.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No strong opinion as well but maybe indeed adding _
would be a good thing.
src/pubsub/mod_pubsub.erl
Outdated
true -> | ||
% Oh my, we do have a mess in the API, don't we? | ||
Backend:delete_node(Node), | ||
Backend:del_node(Nidx); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What is the difference? Maybe it's worth mentioning in comment why we call the same function twice only with different wording? I know that maybe it's not that hard to figure out by looking at the code, but this is "what the hell" moment for me, seeing that, and not having to understand lower layer by reading a comment would help a lot. And I'm sure I'm not alone in this feeling ;)
src/pubsub/mod_pubsub.erl
Outdated
lists:foreach(fun({#pubsub_node{ id = Nidx, type = Type } = Node, owner}) -> | ||
Plugin = plugin(Type), | ||
MaybeBasePlugin | ||
= maybe_default_node(Plugin, should_delete_when_owner_removed, []), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
= maybe_default_node(Plugin, should_delete_when_owner_removed, []), | |
= maybe_default_node(Plugin, should_delete_when_owner_removed, []), |
@@ -214,3 +220,8 @@ extra_debug_fun(Fun) -> | |||
%% Internal functions | |||
%%==================================================================== | |||
|
|||
sanitize_reason(Map) when is_map(Map) -> | |||
Map; | |||
sanitize_reason(Other) -> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
How is that possible? The spec above says ReasonData :: map()
, so this either is a dead code or should be a dead code. Either way something is not right (spec or this clause).
On different topic, don't we prefer to simply match on map in db_error
and crash if something weird is passed?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For disabled backends pool_not_started
is returned or similar, instead of map. This was a quick fix I needed for debugging but indeed maybe it can be done better.
@@ -208,6 +210,15 @@ node_name(Nidx) -> | |||
_ -> <<>> | |||
end. | |||
|
|||
-spec find_nodes_by_affiliated_user(JID :: jid:ljid()) -> | |||
[{mod_pubsub:pubsubNode(), mod_pubsub:affiliation()}]. | |||
find_nodes_by_affiliated_user(LJID) -> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do we really need this function on such low-level module? Isn't there a plugin API that would do the same?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I actually think that such function fits better in DB layer because it should be a simple data retrieval instead the processing done in node_flat
, which is actually a workaround for strange Mnesia data model.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I wasn't suggesting to move it, I was just asking if there is similar functionality already there :)
del_state(State). | ||
|
||
-spec del_state(mod_pubsub:pubsubState()) -> ok. | ||
del_state(#pubsub_state{ stateid = {LJID, Nidx}, subscriptions = Subs }) -> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't really like the fact that this function behaves differently based on type of the argument. I know that arity is different, but the name is the same, so I would expect this function to do the same thing, only maybe based on different data. I would suggest renaming here.
del_state(State). | ||
|
||
-spec del_state(mod_pubsub:pubsubState()) -> ok. | ||
del_state(#pubsub_state{ stateid = {LJID, Nidx}, subscriptions = Subs }) -> | ||
lists:foreach(fun({_, SubId}) -> mnesia:delete({pubsub_subscription, SubId}) end, Subs), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Also, why do we even need this function? The code above seem to be the same as in https://github.com/esl/MongooseIM/pull/2349/files#diff-76947e0e8d171032fa48bd99ed39698dR550 . What is the difference?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
del_state
removes the state unconditionally, while delete_all_subscriptions_by_state
only when there is no affiliation in the state (with all subscriptions removed).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ok, but do we need to delete subs here? This function is called only from https://github.com/esl/MongooseIM/pull/2349/files#diff-76947e0e8d171032fa48bd99ed39698dR553, just after removing subs. Isn't this code redundant?
6736.1 / Erlang 20.3 / small_tests / 9c46b5d 6736.2 / Erlang 20.3 / internal_mnesia / 9c46b5d sm_SUITE:parallel:subscription_requests_are_buffered_properly{error,{{badmatch,false},
[{escalus_session,stream_management,2,
[{file,"/home/travis/build/esl/MongooseIM/big_tests/_build/default/lib/escalus/src/escalus_session.erl"},
{line,240}]},
{escalus_connection,connection_step,2,
[{file,"/home/travis/build/esl/MongooseIM/big_tests/_build/default/lib/escalus/src/escalus_connection.erl"},
{line,154}]},
{lists,foldl,3,[{file,"lists.erl"},{line,1263}]},
{escalus_connection,start,2,
[{file,"/home/travis/build/esl/MongooseIM/big_tests/_build/default/lib/escalus/src/escalus_connection.erl"},
{line,138}]},
{sm_SUITE,'-subscription_requests_are_buffered_properly/1-fun-3-',6,
[{file,"sm_SUITE.erl"},{line,848}]},
{escalus_story,story,4,
[{file,"/home/travis/build/esl/MongooseIM/big_tests/_build/default/lib/escalus/src/escalus_story.erl"},
{line,72}]},
{test_server,ts_tc,3,[{file,"test_server.erl"},{line,1546}]},
{test_server,run_test_case_eval1,6,
[{file,"test_server.erl"},{line,1062}]}]}} sm_SUITE:parallel:subscription_requests_are_buffered_properly{error,{{badmatch,false},
[{escalus_session,stream_management,2,
[{file,"/home/travis/build/esl/MongooseIM/big_tests/_build/default/lib/escalus/src/escalus_session.erl"},
{line,240}]},
{escalus_connection,connection_step,2,
[{file,"/home/travis/build/esl/MongooseIM/big_tests/_build/default/lib/escalus/src/escalus_connection.erl"},
{line,154}]},
{lists,foldl,3,[{file,"lists.erl"},{line,1263}]},
{escalus_connection,start,2,
[{file,"/home/travis/build/esl/MongooseIM/big_tests/_build/default/lib/escalus/src/escalus_connection.erl"},
{line,138}]},
{sm_SUITE,'-subscription_requests_are_buffered_properly/1-fun-3-',6,
[{file,"sm_SUITE.erl"},{line,848}]},
{escalus_story,story,4,
[{file,"/home/travis/build/esl/MongooseIM/big_tests/_build/default/lib/escalus/src/escalus_story.erl"},
{line,72}]},
{test_server,ts_tc,3,[{file,"test_server.erl"},{line,1546}]},
{test_server,run_test_case_eval1,6,
[{file,"test_server.erl"},{line,1062}]}]}} sm_SUITE:parallel:subscription_requests_are_buffered_properly{error,{{badmatch,false},
[{escalus_session,stream_management,2,
[{file,"/home/travis/build/esl/MongooseIM/big_tests/_build/default/lib/escalus/src/escalus_session.erl"},
{line,240}]},
{escalus_connection,connection_step,2,
[{file,"/home/travis/build/esl/MongooseIM/big_tests/_build/default/lib/escalus/src/escalus_connection.erl"},
{line,154}]},
{lists,foldl,3,[{file,"lists.erl"},{line,1263}]},
{escalus_connection,start,2,
[{file,"/home/travis/build/esl/MongooseIM/big_tests/_build/default/lib/escalus/src/escalus_connection.erl"},
{line,138}]},
{sm_SUITE,'-subscription_requests_are_buffered_properly/1-fun-3-',6,
[{file,"sm_SUITE.erl"},{line,848}]},
{escalus_story,story,4,
[{file,"/home/travis/build/esl/MongooseIM/big_tests/_build/default/lib/escalus/src/escalus_story.erl"},
{line,72}]},
{test_server,ts_tc,3,[{file,"test_server.erl"},{line,1546}]},
{test_server,run_test_case_eval1,6,
[{file,"test_server.erl"},{line,1062}]}]}} 6736.3 / Erlang 20.3 / odbc_mssql_mnesia / 9c46b5d pubsub_SUITE:tree+hometree_specific:can_create_node_with_existing_parent_path{error,{{badmatch,false},
[{pubsub_tools,check_response,2,
[{file,"pubsub_tools.erl"},{line,472}]},
{pubsub_tools,receive_response,3,
[{file,"pubsub_tools.erl"},{line,462}]},
{pubsub_tools,receive_and_check_response,4,
[{file,"pubsub_tools.erl"},{line,452}]},
{pubsub_SUITE,'-can_create_node_with_existing_parent_path/1-fun-0-',
1,
[{file,"pubsub_SUITE.erl"},{line,1768}]},
{escalus_story,story,4,
[{file,"/home/travis/build/esl/MongooseIM/big_tests/_build/default/lib/escalus/src/escalus_story.erl"},
{line,72}]},
{test_server,ts_tc,3,[{file,"test_server.erl"},{line,1546}]},
{test_server,run_test_case_eval1,6,
[{file,"test_server.erl"},{line,1062}]},
{test_server,run_test_case_eval,9,
[{file,"test_server.erl"},{line,994}]}]}} 6736.4 / Erlang 20.3 / ldap_mnesia / 9c46b5d 6736.5 / Erlang 20.3 / elasticsearch_and_cassandra_mnesia / 9c46b5d 6736.8 / Erlang 21.3 / mysql_redis / 9c46b5d pubsub_SUITE:dag+collection:notify_collection_test{error,
{timeout_when_waiting_for_stanza,
[{escalus_client,wait_for_stanza,
[{client,<<"alicE80.821865@localhost/res1">>,escalus_tcp,
<0.15685.3>,
[{event_manager,<0.15596.3>},
{server,<<"localhost">>},
{username,<<"alicE80.821865">>},
{resource,<<"res1">>}],
[{event_client,
[{event_manager,<0.15596.3>},
{server,<<"localhost">>},
{username,<<"alicE80.821865">>},
{resource,<<"res1">>}]},
{resource,<<"res1">>},
{username,<<"alicE80.821865">>},
{server,<<"localhost">>},
{host,<<"localhost">>},
{port,5222},
{auth,{escalus_auth,auth_plain}},
{wspath,undefined},
{username,<<"alicE80.821865">>},
{server,<<"localhost">>},
{password,<<"matygrysa">>},
{stream_id,<<"542704AAD672CBBA">>}]},
5000],
[{file,
"/home/travis/build/esl/MongooseIM/big_tests/_build/default/lib/escalus/src/escalus_client.erl"},
{line,136}]},
{pubsub_tools,receive_response,3,
[{file,"pubsub_tools.erl"},{line,461}]},
{pubsub_tools,receive_and_check_response,4,
[{file,"pubsub_tools.erl"},{line,452}]},
{pubsub_SUITE,'-notify_collection_test/1-fun-0-',2,
[{file,"pubsub_SUITE.erl"},{line,1232}]},
{escalus_story,story,4,
[{file,
"/home/travis/build/esl/MongooseIM/big_tests/_build/default/li... pubsub_SUITE:dag+collection:request_all_items_leaf_test{error,
{timeout_when_waiting_for_stanza,
[{escalus_client,wait_for_stanza,
[{client,<<"alicE80.842907@localhost/res1">>,escalus_tcp,
<0.15694.3>,
[{event_manager,<0.15632.3>},
{server,<<"localhost">>},
{username,<<"alicE80.842907">>},
{resource,<<"res1">>}],
[{event_client,
[{event_manager,<0.15632.3>},
{server,<<"localhost">>},
{username,<<"alicE80.842907">>},
{resource,<<"res1">>}]},
{resource,<<"res1">>},
{username,<<"alicE80.842907">>},
{server,<<"localhost">>},
{host,<<"localhost">>},
{port,5222},
{auth,{escalus_auth,auth_plain}},
{wspath,undefined},
{username,<<"alicE80.842907">>},
{server,<<"localhost">>},
{password,<<"matygrysa">>},
{stream_id,<<"7CC4E6CC17371898">>}]},
5000],
[{file,
"/home/travis/build/esl/MongooseIM/big_tests/_build/default/lib/escalus/src/escalus_client.erl"},
{line,136}]},
{pubsub_tools,receive_response,3,
[{file,"pubsub_tools.erl"},{line,461}]},
{pubsub_tools,receive_and_check_response,4,
[{file,"pubsub_tools.erl"},{line,452}]},
{pubsub_SUITE,'-request_all_items_leaf_test/1-fun-0-',2,
[{file,"pubsub_SUITE.erl"},{line,1517}]},
{escalus_story,story,4,
[{file,
"/home/travis/build/esl/MongooseIM/big_tests/_build/defau... 6736.7 / Erlang 21.3 / pgsql_mnesia / 9c46b5d 6736.9 / Erlang 21.3 / riak_mnesia / 9c46b5d 6736.8 / Erlang 21.3 / mysql_redis / 9c46b5d pubsub_SUITE:dag+collection:notify_collection_test{error,
{timeout_when_waiting_for_stanza,
[{escalus_client,wait_for_stanza,
[{client,<<"alicE54.892196@localhost/res1">>,escalus_tcp,
<0.15878.3>,
[{event_manager,<0.15803.3>},
{server,<<"localhost">>},
{username,<<"alicE54.892196">>},
{resource,<<"res1">>}],
[{event_client,
[{event_manager,<0.15803.3>},
{server,<<"localhost">>},
{username,<<"alicE54.892196">>},
{resource,<<"res1">>}]},
{resource,<<"res1">>},
{username,<<"alicE54.892196">>},
{server,<<"localhost">>},
{host,<<"localhost">>},
{port,5222},
{auth,{escalus_auth,auth_plain}},
{wspath,undefined},
{username,<<"alicE54.892196">>},
{server,<<"localhost">>},
{password,<<"matygrysa">>},
{stream_id,<<"FEE16C4510512BF7">>}]},
5000],
[{file,
"/home/travis/build/esl/MongooseIM/big_tests/_build/default/lib/escalus/src/escalus_client.erl"},
{line,136}]},
{pubsub_tools,receive_response,3,
[{file,"pubsub_tools.erl"},{line,461}]},
{pubsub_tools,receive_and_check_response,4,
[{file,"pubsub_tools.erl"},{line,452}]},
{pubsub_SUITE,'-notify_collection_test/1-fun-0-',2,
[{file,"pubsub_SUITE.erl"},{line,1234}]},
{escalus_story,story,4,
[{file,
"/home/travis/build/esl/MongooseIM/big_tests/_build/default/li... pubsub_SUITE:tree+hometree_specific:deleting_parent_path_deletes_children{error,{{badmatch,false},
[{pubsub_tools,check_response,2,
[{file,"pubsub_tools.erl"},{line,472}]},
{pubsub_tools,receive_response,3,
[{file,"pubsub_tools.erl"},{line,462}]},
{pubsub_tools,receive_and_check_response,4,
[{file,"pubsub_tools.erl"},{line,452}]},
{pubsub_SUITE,'-deleting_parent_path_deletes_children/1-fun-0-',1,
[{file,"pubsub_SUITE.erl"},{line,1815}]},
{escalus_story,story,4,
[{file,"/home/travis/build/esl/MongooseIM/big_tests/_build/default/lib/escalus/src/escalus_story.erl"},
{line,72}]},
{test_server,ts_tc,3,[{file,"test_server.erl"},{line,1562}]},
{test_server,run_test_case_eval1,6,
[{file,"test_server.erl"},{line,1080}]},
{test_server,run_test_case_eval,9,
[{file,"test_server.erl"},{line,1012}]}]}} pubsub_SUITE:tree+hometree_specific:disco_node_children_by_path_prefix{error,{{badmatch,false},
[{pubsub_tools,check_response,2,
[{file,"pubsub_tools.erl"},{line,472}]},
{pubsub_tools,receive_response,3,
[{file,"pubsub_tools.erl"},{line,462}]},
{pubsub_tools,receive_and_check_response,4,
[{file,"pubsub_tools.erl"},{line,452}]},
{pubsub_SUITE,'-disco_node_children_by_path_prefix/1-fun-0-',2,
[{file,"pubsub_SUITE.erl"},{line,1796}]},
{escalus_story,story,4,
[{file,"/home/travis/build/esl/MongooseIM/big_tests/_build/default/lib/escalus/src/escalus_story.erl"},
{line,72}]},
{test_server,ts_tc,3,[{file,"test_server.erl"},{line,1562}]},
{test_server,run_test_case_eval1,6,
[{file,"test_server.erl"},{line,1080}]},
{test_server,run_test_case_eval,9,
[{file,"test_server.erl"},{line,1012}]}]}} 6736.8 / Erlang 21.3 / mysql_redis / 9c46b5d pubsub_SUITE:dag+collection:notify_collection_test{error,
{timeout_when_waiting_for_stanza,
[{escalus_client,wait_for_stanza,
[{client,<<"alicE55.138441@localhost/res1">>,escalus_tcp,
<0.15802.3>,
[{event_manager,<0.15768.3>},
{server,<<"localhost">>},
{username,<<"alicE55.138441">>},
{resource,<<"res1">>}],
[{event_client,
[{event_manager,<0.15768.3>},
{server,<<"localhost">>},
{username,<<"alicE55.138441">>},
{resource,<<"res1">>}]},
{resource,<<"res1">>},
{username,<<"alicE55.138441">>},
{server,<<"localhost">>},
{host,<<"localhost">>},
{port,5222},
{auth,{escalus_auth,auth_plain}},
{wspath,undefined},
{username,<<"alicE55.138441">>},
{server,<<"localhost">>},
{password,<<"matygrysa">>},
{stream_id,<<"75AE15A39EF0CD1A">>}]},
5000],
[{file,
"/home/travis/build/esl/MongooseIM/big_tests/_build/default/lib/escalus/src/escalus_client.erl"},
{line,136}]},
{pubsub_tools,receive_response,3,
[{file,"pubsub_tools.erl"},{line,461}]},
{pubsub_tools,receive_and_check_response,4,
[{file,"pubsub_tools.erl"},{line,452}]},
{pubsub_SUITE,'-notify_collection_test/1-fun-0-',2,
[{file,"pubsub_SUITE.erl"},{line,1232}]},
{escalus_story,story,4,
[{file,
"/home/travis/build/esl/MongooseIM/big_tests/_build/default/li... |
Tests by @NelsonVides and @ludwikbukowski
This PR is an alternative implementation for #2348