aboutsummaryrefslogtreecommitdiffstats
path: root/erts/emulator/test/distribution_SUITE_data/run.erl
blob: f574b2c02cc4c979754c4083759f93f1f41bdcbb (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
%%
%% %CopyrightBegin%
%% 
%% Copyright Ericsson AB 1998-2016. All Rights Reserved.
%% 
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
%% You may obtain a copy of the License at
%%
%%     http://www.apache.org/licenses/LICENSE-2.0
%%
%% Unless required by applicable law or agreed to in writing, software
%% distributed under the License is distributed on an "AS IS" BASIS,
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
%% See the License for the specific language governing permissions and
%% limitations under the License.
%% 
%% %CopyrightEnd%
%%

-module(run).

-compile(export_all).

host() ->
    from($@, atom_to_list(node())).

from(H, [H | T]) -> T;
from(H, [_ | T]) -> from(H, T);
from(H, []) -> [].

start() ->
    Result = do_it(),

    %% Do GCs and node_and_dist_references
    %% in an attempt to crash the VM (without OTP-13076 fix)
    lists:foreach(fun(P) -> erlang:garbage_collect(P) end,
		  processes()),
    erts_debug:set_internal_state(available_internal_state, true),
    erts_debug:get_internal_state(node_and_dist_references),

    io:format("~w~n", [Result]),

    if
	Result ->
	    init:stop();
	true ->
	    %% Make sure that the io:format/2 output is really written
	    %% (especially on Windows).
	    erlang:yield(),
	    init:stop()
    end.


do_it() ->
    {ok, _} = net_kernel:start([fideridum,shortnames]),
    {ok, Node} = slave:start(host(), heppel),
    P = spawn(Node, net_kernel, stop, []),
    B1 = term_to_binary(P),
    N1 = node(P),
    ok = net_kernel:stop(),
    N2 = node(P),

    %% OTP-13076
    %% Restart distribution with same node name as previous remote node
    %% Repeat to wrap around creation
    Result = lists:foldl(fun(_, Acc) ->
				 timer:sleep(2),  % give net_kernel:stop() time to take effect :-(
				 {ok, _} = net_kernel:start([heppel,shortnames]),
				 N3 = node(P),
				 ok = net_kernel:stop(),
				 N4 = node(P),
				 Acc and (N3 =:= N1) and (N4 =:= N1)
			 end,
			 (N2 =:= N1),
			 lists:seq(1,3)),

    Result.