aboutsummaryrefslogtreecommitdiffstats
path: root/lib/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'lib/kernel')
-rw-r--r--lib/kernel/doc/src/application.xml9
-rw-r--r--lib/kernel/doc/src/inet.xml4
-rw-r--r--lib/kernel/src/application.erl23
-rw-r--r--lib/kernel/src/application_master.erl9
-rw-r--r--lib/kernel/src/disk_log.erl18
-rw-r--r--lib/kernel/src/file.erl43
-rw-r--r--lib/kernel/src/file_io_server.erl3
-rw-r--r--lib/kernel/src/file_server.erl3
-rw-r--r--lib/kernel/src/gen_sctp.erl4
-rw-r--r--lib/kernel/src/gen_udp.erl4
-rw-r--r--lib/kernel/src/inet.erl46
-rw-r--r--lib/kernel/src/inet_db.erl65
-rw-r--r--lib/kernel/src/inet_gethost_native.erl3
-rw-r--r--lib/kernel/src/inet_hosts.erl9
-rw-r--r--lib/kernel/src/inet_int.hrl4
-rw-r--r--lib/kernel/src/inet_res.erl6
-rw-r--r--lib/kernel/src/os.erl23
-rw-r--r--lib/kernel/src/rpc.erl24
-rw-r--r--lib/kernel/test/application_SUITE.erl1543
-rw-r--r--lib/kernel/test/disk_log_SUITE.erl4
-rw-r--r--lib/kernel/test/file_SUITE.erl46
-rw-r--r--lib/kernel/test/file_name_SUITE.erl16
-rw-r--r--lib/kernel/test/gen_sctp_SUITE.erl3
-rw-r--r--lib/kernel/test/gen_tcp_misc_SUITE.erl2
-rw-r--r--lib/kernel/test/global_SUITE_data/global_trace.erl9
-rw-r--r--lib/kernel/test/inet_SUITE.erl197
-rw-r--r--lib/kernel/test/inet_res_SUITE.erl198
-rw-r--r--lib/kernel/test/inet_res_SUITE_data/otptest/named_inc.conf6
-rw-r--r--lib/kernel/test/inet_res_SUITE_data/otptest/root.zone6
-rw-r--r--lib/kernel/test/inet_sockopt_SUITE.erl8
-rw-r--r--lib/kernel/test/interactive_shell_SUITE.erl17
-rw-r--r--lib/kernel/test/os_SUITE.erl45
-rw-r--r--lib/kernel/test/prim_file_SUITE.erl17
-rw-r--r--lib/kernel/vsn.mk2
34 files changed, 1335 insertions, 1084 deletions
diff --git a/lib/kernel/doc/src/application.xml b/lib/kernel/doc/src/application.xml
index 697de6681f..362c373c6c 100644
--- a/lib/kernel/doc/src/application.xml
+++ b/lib/kernel/doc/src/application.xml
@@ -253,6 +253,15 @@ Nodes = [cp1@cave, {cp2@cave, cp3@cave}]</code>
</warning>
</desc>
</func>
+ <func>
+ <name name="ensure_started" arity="1"/>
+ <name name="ensure_started" arity="2"/>
+ <fsummary>Load and start an application</fsummary>
+ <desc>
+ <p>Equivalent to <seealso marker="#start/2"><c>application:start/1,2</c></seealso> except
+ it returns <c>ok</c> for already started applications.</p>
+ </desc>
+ </func>
<func>
<name name="start" arity="1"/>
<name name="start" arity="2"/>
diff --git a/lib/kernel/doc/src/inet.xml b/lib/kernel/doc/src/inet.xml
index 541500a300..7cd98914d1 100644
--- a/lib/kernel/doc/src/inet.xml
+++ b/lib/kernel/doc/src/inet.xml
@@ -559,7 +559,7 @@ fe80::204:acff:fe17:bf38
<c>[Byte1,Byte2|Binary]</c>.</p>
</item>
- <tag><c>{high_msgq_watermark, Size}</c> (TCP/IP sockets)</tag>
+ <tag><c>{high_msgq_watermark, Size}</c></tag>
<item>
<p>The socket message queue will be set into a busy
state when the amount of data queued on the message
@@ -674,7 +674,7 @@ fe80::204:acff:fe17:bf38
the flushing time-out in seconds.</p>
</item>
- <tag><c>{low_msgq_watermark, Size}</c> (TCP/IP sockets)</tag>
+ <tag><c>{low_msgq_watermark, Size}</c></tag>
<item>
<p>If the socket message queue is in a busy state, the
socket message queue will be set in a not busy state when
diff --git a/lib/kernel/src/application.erl b/lib/kernel/src/application.erl
index 6efc1b4499..5dd6b73857 100644
--- a/lib/kernel/src/application.erl
+++ b/lib/kernel/src/application.erl
@@ -22,6 +22,7 @@
load/1, load/2, unload/1, takeover/2,
which_applications/0, which_applications/1,
loaded_applications/0, permit/2]).
+-export([ensure_started/1, ensure_started/2]).
-export([set_env/3, set_env/4, unset_env/2, unset_env/3]).
-export([get_env/1, get_env/2, get_env/3, get_all_env/0, get_all_env/1]).
-export([get_key/1, get_key/2, get_all_key/0, get_all_key/1]).
@@ -135,6 +136,28 @@ start(Application, RestartType) ->
Error
end.
+-spec ensure_started(Application) -> 'ok' | {'error', Reason} when
+ Application :: atom(),
+ Reason :: term().
+
+ensure_started(Application) ->
+ ensure_started(Application, temporary).
+
+-spec ensure_started(Application, Type) -> 'ok' | {'error', Reason} when
+ Application :: atom(),
+ Type :: restart_type(),
+ Reason :: term().
+
+ensure_started(Application, RestartType) ->
+ case start(Application, RestartType) of
+ ok ->
+ ok;
+ {error, {already_started, Application}} ->
+ ok;
+ Error ->
+ Error
+ end.
+
-spec start_boot(Application :: atom()) -> 'ok' | {'error', term()}.
start_boot(Application) ->
diff --git a/lib/kernel/src/application_master.erl b/lib/kernel/src/application_master.erl
index 679fefaed9..34a3efcaf2 100644
--- a/lib/kernel/src/application_master.erl
+++ b/lib/kernel/src/application_master.erl
@@ -76,13 +76,8 @@ call(AppMaster, Req) ->
{'DOWN', Ref, process, _, _Info} ->
ok;
{Tag, Res} ->
- erlang:demonitor(Ref),
- receive
- {'DOWN', Ref, process, _, _Info} ->
- Res
- after 0 ->
- Res
- end
+ erlang:demonitor(Ref, [flush]),
+ Res
end.
%%%-----------------------------------------------------------------
diff --git a/lib/kernel/src/disk_log.erl b/lib/kernel/src/disk_log.erl
index 0c5af2857e..c238eff12f 100644
--- a/lib/kernel/src/disk_log.erl
+++ b/lib/kernel/src/disk_log.erl
@@ -1914,13 +1914,8 @@ multi_req(Msg, Pids) ->
{'DOWN', Ref, process, Pid, _Info} ->
Reply;
{disk_log, Pid, _Reply} ->
- erlang:demonitor(Ref),
- receive
- {'DOWN', Ref, process, Pid, _Reason} ->
- ok
- after 0 ->
- ok
- end
+ erlang:demonitor(Ref, [flush]),
+ ok
end
end, {error, nonode}, Refs).
@@ -1965,13 +1960,8 @@ monitor_request(Pid, Req) ->
{error, no_such_log};
{disk_log, Pid, Reply} when not is_tuple(Reply) orelse
element(2, Reply) =/= disk_log_stopped ->
- erlang:demonitor(Ref),
- receive
- {'DOWN', Ref, process, Pid, _Reason} ->
- Reply
- after 0 ->
- Reply
- end
+ erlang:demonitor(Ref, [flush]),
+ Reply
end.
req2(Pid, R) ->
diff --git a/lib/kernel/src/file.erl b/lib/kernel/src/file.erl
index a4c56b346f..36289053eb 100644
--- a/lib/kernel/src/file.erl
+++ b/lib/kernel/src/file.erl
@@ -480,8 +480,7 @@ open(Item, Mode) ->
Reason :: posix() | badarg | terminated.
close(File) when is_pid(File) ->
- R = file_request(File, close),
- case wait_file_reply(File, R) of
+ case file_request(File, close) of
{error, terminated} ->
ok;
Other ->
@@ -503,8 +502,7 @@ close(_) ->
Reason :: posix() | badarg.
advise(File, Offset, Length, Advise) when is_pid(File) ->
- R = file_request(File, {advise, Offset, Length, Advise}),
- wait_file_reply(File, R);
+ file_request(File, {advise, Offset, Length, Advise});
advise(#file_descriptor{module = Module} = Handle, Offset, Length, Advise) ->
Module:advise(Handle, Offset, Length, Advise);
advise(_, _, _, _) ->
@@ -517,8 +515,7 @@ advise(_, _, _, _) ->
Length :: non_neg_integer().
allocate(File, Offset, Length) when is_pid(File) ->
- R = file_request(File, {allocate, Offset, Length}),
- wait_file_reply(File, R);
+ file_request(File, {allocate, Offset, Length});
allocate(#file_descriptor{module = Module} = Handle, Offset, Length) ->
Module:allocate(Handle, Offset, Length).
@@ -601,8 +598,7 @@ pread_int(_, _, _) ->
Reason :: posix() | badarg | terminated.
pread(File, At, Sz) when is_pid(File), is_integer(Sz), Sz >= 0 ->
- R = file_request(File, {pread, At, Sz}),
- wait_file_reply(File, R);
+ file_request(File, {pread, At, Sz});
pread(#file_descriptor{module = Module} = Handle, Offs, Sz)
when is_integer(Sz), Sz >= 0 ->
Module:pread(Handle, Offs, Sz);
@@ -658,8 +654,7 @@ pwrite_int(_, _, _) ->
Reason :: posix() | badarg | terminated.
pwrite(File, At, Bytes) when is_pid(File) ->
- R = file_request(File, {pwrite, At, Bytes}),
- wait_file_reply(File, R);
+ file_request(File, {pwrite, At, Bytes});
pwrite(#file_descriptor{module = Module} = Handle, Offs, Bytes) ->
Module:pwrite(Handle, Offs, Bytes);
pwrite(_, _, _) ->
@@ -670,8 +665,7 @@ pwrite(_, _, _) ->
Reason :: posix() | badarg | terminated.
datasync(File) when is_pid(File) ->
- R = file_request(File, datasync),
- wait_file_reply(File, R);
+ file_request(File, datasync);
datasync(#file_descriptor{module = Module} = Handle) ->
Module:datasync(Handle);
datasync(_) ->
@@ -682,8 +676,7 @@ datasync(_) ->
Reason :: posix() | badarg | terminated.
sync(File) when is_pid(File) ->
- R = file_request(File, sync),
- wait_file_reply(File, R);
+ file_request(File, sync);
sync(#file_descriptor{module = Module} = Handle) ->
Module:sync(Handle);
sync(_) ->
@@ -696,8 +689,7 @@ sync(_) ->
Reason :: posix() | badarg | terminated.
position(File, At) when is_pid(File) ->
- R = file_request(File, {position,At}),
- wait_file_reply(File, R);
+ file_request(File, {position,At});
position(#file_descriptor{module = Module} = Handle, At) ->
Module:position(Handle, At);
position(_, _) ->
@@ -708,8 +700,7 @@ position(_, _) ->
Reason :: posix() | badarg | terminated.
truncate(File) when is_pid(File) ->
- R = file_request(File, truncate),
- wait_file_reply(File, R);
+ file_request(File, truncate);
truncate(#file_descriptor{module = Module} = Handle) ->
Module:truncate(Handle);
truncate(_) ->
@@ -1497,25 +1488,19 @@ check_args([]) ->
ok.
%%-----------------------------------------------------------------
-%% Functions for communicating with a file io server.
+%% Function for communicating with a file io server.
%% The messages sent have the following formats:
%%
%% {file_request,From,ReplyAs,Request}
%% {file_reply,ReplyAs,Reply}
file_request(Io, Request) ->
- R = erlang:monitor(process, Io),
- Io ! {file_request,self(),Io,Request},
- R.
-
-wait_file_reply(From, Ref) ->
+ Ref = erlang:monitor(process, Io),
+ Io ! {file_request,self(),Ref,Request},
receive
- {file_reply,From,Reply} ->
- erlang:demonitor(Ref),
- receive {'DOWN', Ref, _, _, _} -> ok after 0 -> ok end,
- %% receive {'EXIT', From, _} -> ok after 0 -> ok end,
+ {file_reply,Ref,Reply} ->
+ erlang:demonitor(Ref, [flush]),
Reply;
{'DOWN', Ref, _, _, _} ->
- %% receive {'EXIT', From, _} -> ok after 0 -> ok end,
{error, terminated}
end.
diff --git a/lib/kernel/src/file_io_server.erl b/lib/kernel/src/file_io_server.erl
index fad2ed7fb3..07fb55f390 100644
--- a/lib/kernel/src/file_io_server.erl
+++ b/lib/kernel/src/file_io_server.erl
@@ -92,8 +92,7 @@ do_start(Spawn, Owner, FileName, ModeList) ->
Mref = erlang:monitor(process, Pid),
receive
{Ref, {error, _Reason} = Error} ->
- erlang:demonitor(Mref),
- receive {'DOWN', Mref, _, _, _} -> ok after 0 -> ok end,
+ erlang:demonitor(Mref, [flush]),
Error;
{Ref, ok} ->
erlang:demonitor(Mref),
diff --git a/lib/kernel/src/file_server.erl b/lib/kernel/src/file_server.erl
index 49ec6f96cc..d036dbb516 100644
--- a/lib/kernel/src/file_server.erl
+++ b/lib/kernel/src/file_server.erl
@@ -317,8 +317,7 @@ do_start_slave(start, Filer, Name) ->
SlaveMonitor = erlang:monitor(process, Slave),
receive
{started, Token} ->
- erlang:demonitor(SlaveMonitor),
- receive {'DOWN', SlaveMonitor, _, _, _} -> ok after 0 -> ok end,
+ erlang:demonitor(SlaveMonitor, [flush]),
{ok, Slave};
{'DOWN', SlaveMonitor, _, _, Reason} ->
exit(Reason)
diff --git a/lib/kernel/src/gen_sctp.erl b/lib/kernel/src/gen_sctp.erl
index 74ad192802..acc116df84 100644
--- a/lib/kernel/src/gen_sctp.erl
+++ b/lib/kernel/src/gen_sctp.erl
@@ -39,7 +39,9 @@
{active, true | false | once} |
{buffer, non_neg_integer()} |
{dontroute, boolean()} |
+ {high_msgq_watermark, pos_integer()} |
{linger, {boolean(), non_neg_integer()}} |
+ {low_msgq_watermark, pos_integer()} |
{mode, list | binary} | list | binary |
{priority, non_neg_integer()} |
{recbuf, non_neg_integer()} |
@@ -68,7 +70,9 @@
active |
buffer |
dontroute |
+ high_msgq_watermark |
linger |
+ low_msgq_watermark |
mode |
priority |
recbuf |
diff --git a/lib/kernel/src/gen_udp.erl b/lib/kernel/src/gen_udp.erl
index c5a1173575..fb5737f82e 100644
--- a/lib/kernel/src/gen_udp.erl
+++ b/lib/kernel/src/gen_udp.erl
@@ -34,6 +34,8 @@
{dontroute, boolean()} |
{drop_membership, {inet:ip_address(), inet:ip_address()}} |
{header, non_neg_integer()} |
+ {high_msgq_watermark, pos_integer()} |
+ {low_msgq_watermark, pos_integer()} |
{mode, list | binary} | list | binary |
{multicast_if, inet:ip_address()} |
{multicast_loop, boolean()} |
@@ -56,6 +58,8 @@
deliver |
dontroute |
header |
+ high_msgq_watermark |
+ low_msgq_watermark |
mode |
multicast_if |
multicast_loop |
diff --git a/lib/kernel/src/inet.erl b/lib/kernel/src/inet.erl
index 9670271b2e..3ea530a366 100644
--- a/lib/kernel/src/inet.erl
+++ b/lib/kernel/src/inet.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2012. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2013. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -712,7 +712,8 @@ udp_options() ->
[tos, priority, reuseaddr, sndbuf, recbuf, header, active, buffer, mode,
deliver, ipv6_v6only,
broadcast, dontroute, multicast_if, multicast_ttl, multicast_loop,
- add_membership, drop_membership, read_packets,raw].
+ add_membership, drop_membership, read_packets,raw,
+ high_msgq_watermark, low_msgq_watermark].
udp_options(Opts, Family) ->
@@ -766,7 +767,7 @@ udp_add(Name, Val, R, Opts, As) ->
sctp_options() ->
[ % The following are generic inet options supported for SCTP sockets:
mode, active, buffer, tos, priority, dontroute, reuseaddr, linger, sndbuf,
- recbuf, ipv6_v6only,
+ recbuf, ipv6_v6only, high_msgq_watermark, low_msgq_watermark,
% Other options are SCTP-specific (though they may be similar to their
% TCP and UDP counter-parts):
@@ -946,21 +947,34 @@ gethostbyname_self(Name, Type) when is_atom(Name) ->
gethostbyname_self(Name, Type)
when is_list(Name), Type =:= inet;
is_list(Name), Type =:= inet6 ->
- case inet_db:gethostname() of
- Name ->
- {ok,make_hostent(Name,
- [translate_ip(loopback, Type)],
- [], Type)};
- Self ->
+ N = inet_db:tolower(Name),
+ Self = inet_db:gethostname(),
+ %%
+ %% This is the final fallback that pretends /etc/hosts has got
+ %% a line for the hostname on the loopback address.
+ %% Lookups into /etc/hosts are case insensitive and return
+ %% what is in the file. Therefore the letter case may differ between
+ %% the returned hostent record and the hostname that was asked for.
+ %%
+ case inet_db:tolower(Self) of
+ N ->
+ {ok,
+ make_hostent(
+ Self, [translate_ip(loopback, Type)], [], Type)};
+ _ ->
case inet_db:res_option(domain) of
- "" -> {error,nxdomain};
+ "" ->
+ {error,nxdomain};
Domain ->
- case lists:append([Self,".",Domain]) of
- Name ->
- {ok,make_hostent(Name,
- [translate_ip(loopback, Type)],
- [], Type)};
- _ -> {error,nxdomain}
+ FQDN = lists:append([Self,".",Domain]),
+ case inet_db:tolower(FQDN) of
+ N ->
+ {ok,
+ make_hostent(
+ FQDN,
+ [translate_ip(loopback, Type)], [], Type)};
+ _ ->
+ {error,nxdomain}
end
end
end;
diff --git a/lib/kernel/src/inet_db.erl b/lib/kernel/src/inet_db.erl
index d4749b9756..a7679c531b 100644
--- a/lib/kernel/src/inet_db.erl
+++ b/lib/kernel/src/inet_db.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2013. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -845,7 +845,8 @@ init([]) ->
process_flag(trap_exit, true),
Db = ets:new(inet_db, [public, named_table]),
reset_db(Db),
- Cache = ets:new(inet_cache, [public, bag, {keypos,2}, named_table]),
+ CacheOpts = [public, bag, {keypos,#dns_rr.domain}, named_table],
+ Cache = ets:new(inet_cache, CacheOpts),
BynameOpts = [protected, bag, named_table, {keypos,1}],
ByaddrOpts = [protected, bag, named_table, {keypos,3}],
HostsByname = ets:new(inet_hosts_byname, BynameOpts),
@@ -901,15 +902,21 @@ reset_db(Db) ->
handle_call(Request, From, #state{db=Db}=State) ->
case Request of
{load_hosts_file,IPNmAs} when is_list(IPNmAs) ->
- NIPs = lists:flatten([ [{N,if tuple_size(IP) =:= 4 -> inet;
- tuple_size(IP) =:= 8 -> inet6
- end,IP} || N <- [Nm|As]]
- || {IP,Nm,As} <- IPNmAs]),
+ NIPs =
+ lists:flatten(
+ [ [{N,
+ if tuple_size(IP) =:= 4 -> inet;
+ tuple_size(IP) =:= 8 -> inet6
+ end,IP} || N <- [Nm|As]]
+ || {IP,Nm,As} <- IPNmAs]),
Byname = State#state.hosts_file_byname,
Byaddr = State#state.hosts_file_byaddr,
ets:delete_all_objects(Byname),
ets:delete_all_objects(Byaddr),
- ets:insert(Byname, NIPs),
+ %% Byname has lowercased names while Byaddr keep the name casing.
+ %% This is to be able to reconstruct the original
+ %% /etc/hosts entry.
+ ets:insert(Byname, [{tolower(N),Type,IP} || {N,Type,IP} <- NIPs]),
ets:insert(Byaddr, NIPs),
{reply, ok, State};
@@ -938,16 +945,14 @@ handle_call(Request, From, #state{db=Db}=State) ->
{reply, ok, State};
{add_rr, RR} when is_record(RR, dns_rr) ->
- RR1 = lower_rr(RR),
- ?dbg("add_rr: ~p~n", [RR1]),
- do_add_rr(RR1, Db, State),
+ ?dbg("add_rr: ~p~n", [RR]),
+ do_add_rr(RR, Db, State),
{reply, ok, State};
{del_rr, RR} when is_record(RR, dns_rr) ->
- RR1 = lower_rr(RR),
%% note. del_rr will handle wildcards !!!
Cache = State#state.cache,
- ets:match_delete(Cache, RR1),
+ ets:match_delete(Cache, RR),
{reply, ok, State};
{lookup_rr, Domain, Class, Type} ->
@@ -1225,15 +1230,18 @@ handle_set_file(ParseFun, Bin, From, State) ->
handle_rc_list(Opts, From, State)
end.
+%% Byname has lowercased names while Byaddr keep the name casing.
+%% This is to be able to reconstruct the original /etc/hosts entry.
+
do_add_host(Byname, Byaddr, Names, Type, IP) ->
do_del_host(Byname, Byaddr, IP),
- NIPs = [{tolower(N),Type,IP} || N <- Names],
- ets:insert(Byname, NIPs),
- ets:insert(Byaddr, NIPs),
+ ets:insert(Byname, [{tolower(N),Type,IP} || N <- Names]),
+ ets:insert(Byaddr, [{N,Type,IP} || N <- Names]),
ok.
do_del_host(Byname, Byaddr, IP) ->
- [ets:delete_object(Byname, NIP) || NIP <- ets:lookup(Byaddr, IP)],
+ [ets:delete_object(Byname, {tolower(Name),Type,Addr}) ||
+ {Name,Type,Addr} <- ets:lookup(Byaddr, IP)],
ets:delete(Byaddr, IP),
ok.
@@ -1369,7 +1377,7 @@ times() ->
%% lookup and remove old entries
do_lookup_rr(Domain, Class, Type) ->
- match_rr(#dns_rr{domain = tolower(Domain), class = Class,type = Type,
+ match_rr(#dns_rr{domain = Domain, class = Class,type = Type,
cnt = '_', tm = '_', ttl = '_',
bm = '_', func = '_', data = '_'}).
@@ -1393,23 +1401,20 @@ filter_rr([], _Time) -> [].
%%
-%% Lower case the domain name before storage
-%%
-lower_rr(RR) ->
- Dn = RR#dns_rr.domain,
- if is_list(Dn) ->
- RR#dns_rr { domain = tolower(Dn) };
- true -> RR
- end.
-
+%% Case fold upper-case to lower-case according to RFC 4343
+%% "Domain Name System (DNS) Case Insensitivity Clarification".
%%
-%% Map upper-case to lower-case
%% NOTE: this code is in kernel and we don't want to relay
-%% to much on stdlib
+%% to much on stdlib. Furthermore string:to_lower/1
+%% does not follow RFC 4343.
%%
tolower([]) -> [];
-tolower([C|Cs]) when C >= $A, C =< $Z -> [(C-$A)+$a|tolower(Cs)];
-tolower([C|Cs]) -> [C|tolower(Cs)].
+tolower([C|Cs]) when is_integer(C) ->
+ if C >= $A, C =< $Z ->
+ [(C-$A)+$a|tolower(Cs)];
+ true ->
+ [C|tolower(Cs)]
+ end.
dn_ip6_int(A,B,C,D,E,F,G,H) ->
dnib(H) ++ dnib(G) ++ dnib(F) ++ dnib(E) ++
diff --git a/lib/kernel/src/inet_gethost_native.erl b/lib/kernel/src/inet_gethost_native.erl
index db3e44ce6f..df866660b4 100644
--- a/lib/kernel/src/inet_gethost_native.erl
+++ b/lib/kernel/src/inet_gethost_native.erl
@@ -503,8 +503,7 @@ getit(Req, DefaultName) ->
Pid, Reason} ->
{error, Reason}
end,
- catch erlang:demonitor(Ref2),
- receive {'DOWN',Ref2,_,_,_} -> ok after 0 -> ok end,
+ catch erlang:demonitor(Ref2, [flush]),
Res2
end.
diff --git a/lib/kernel/src/inet_hosts.erl b/lib/kernel/src/inet_hosts.erl
index df1d4fc0be..6e9719b4aa 100644
--- a/lib/kernel/src/inet_hosts.erl
+++ b/lib/kernel/src/inet_hosts.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2013. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -38,9 +38,12 @@ gethostbyname(_) -> {error, formerr}.
gethostbyname(Name, Type) when is_list(Name), is_atom(Type) ->
- case gethostbyname(Name, Type, inet_hosts_byname, inet_hosts_byaddr) of
+ %% Byname has lowercased names while Byaddr keep the name casing.
+ %% This is to be able to reconstruct the original /etc/hosts entry.
+ N = inet_db:tolower(Name),
+ case gethostbyname(N, Type, inet_hosts_byname, inet_hosts_byaddr) of
false ->
- case gethostbyname(Name, Type,
+ case gethostbyname(N, Type,
inet_hosts_file_byname,
inet_hosts_file_byaddr) of
false -> {error,nxdomain};
diff --git a/lib/kernel/src/inet_int.hrl b/lib/kernel/src/inet_int.hrl
index 000119bc74..a01c733d81 100644
--- a/lib/kernel/src/inet_int.hrl
+++ b/lib/kernel/src/inet_int.hrl
@@ -141,8 +141,8 @@
-define(INET_LOPT_READ_PACKETS, 33).
-define(INET_OPT_RAW, 34).
-define(INET_LOPT_TCP_SEND_TIMEOUT_CLOSE, 35).
--define(INET_LOPT_TCP_MSGQ_HIWTRMRK, 36).
--define(INET_LOPT_TCP_MSGQ_LOWTRMRK, 37).
+-define(INET_LOPT_MSGQ_HIWTRMRK, 36).
+-define(INET_LOPT_MSGQ_LOWTRMRK, 37).
% Specific SCTP options: separate range:
-define(SCTP_OPT_RTOINFO, 100).
-define(SCTP_OPT_ASSOCINFO, 101).
diff --git a/lib/kernel/src/inet_res.erl b/lib/kernel/src/inet_res.erl
index 59ba408d7a..94a9f7c64d 100644
--- a/lib/kernel/src/inet_res.erl
+++ b/lib/kernel/src/inet_res.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2011. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2013. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -181,8 +181,8 @@ lookup(Name, Class, Type, Opts, Timeout) ->
lookup_filter({ok,#dns_rec{anlist=Answers}}, Class, Type) ->
[A#dns_rr.data || A <- Answers,
- A#dns_rr.class =:= Class,
- A#dns_rr.type =:= Type];
+ Class =:= any orelse A#dns_rr.class =:= Class,
+ Type =:= any orelse A#dns_rr.type =:= Type];
lookup_filter({error,_}, _, _) -> [].
%% --------------------------------------------------------------------------
diff --git a/lib/kernel/src/os.erl b/lib/kernel/src/os.erl
index 742c000cc1..ded03361ee 100644
--- a/lib/kernel/src/os.erl
+++ b/lib/kernel/src/os.erl
@@ -126,7 +126,7 @@ verify_executable(Name0, [Ext|Rest], OrigExtensions) ->
end;
verify_executable(Name, [], OrigExtensions) when OrigExtensions =/= [""] -> %% Windows
%% Will only happen on windows, hence case insensitivity
- case can_be_full_name(string:to_lower(Name),OrigExtensions) of
+ case can_be_full_name(string:to_lower(Name),OrigExtensions) of
true ->
verify_executable(Name,[""],[""]);
_ ->
@@ -150,7 +150,7 @@ split_path(Path) ->
{win32, _} ->
{ok,Curr} = file:get_cwd(),
split_path(Path, $;, [], [Curr]);
- _ ->
+ _ ->
split_path(Path, $:, [], [])
end.
@@ -187,11 +187,14 @@ cmd(Cmd) ->
{unix, _} ->
unix_cmd(Cmd);
{win32, Wtype} ->
- Command = case {os:getenv("COMSPEC"),Wtype} of
+ Command0 = case {os:getenv("COMSPEC"),Wtype} of
{false,windows} -> lists:concat(["command.com /c", Cmd]);
{false,_} -> lists:concat(["cmd /c", Cmd]);
{Cspec,_} -> lists:concat([Cspec," /c",Cmd])
end,
+ %% open_port/2 awaits string() in Command, but io_lib:chars() can be
+ %% deep lists according to io_lib module description.
+ Command = lists:flatten(Command0),
Port = open_port({spawn, Command}, [stream, in, eof, hide]),
get_data(Port, [])
end.
@@ -213,7 +216,7 @@ unix_cmd(Cmd) ->
end.
%% The -s flag implies that only the positional parameters are set,
-%% and the commands are read from standard input. We set the
+%% and the commands are read from standard input. We set the
%% $1 parameter for easy identification of the resident shell.
%%
-define(SHELL, "/bin/sh -s unix:cmd 2>&1").
@@ -226,7 +229,7 @@ unix_cmd(Cmd) ->
-spec start_port() -> port().
start_port() ->
Ref = make_ref(),
- Request = {Ref,self()},
+ Request = {Ref,self()},
{Pid, Mon} = case whereis(?PORT_CREATOR_NAME) of
undefined ->
spawn_monitor(fun() ->
@@ -273,7 +276,7 @@ start_port_srv_handle({Ref,Client}) ->
Port
catch
error:Reason ->
- {Reason,erlang:get_stacktrace()}
+ {Reason,erlang:get_stacktrace()}
end,
Client ! {Ref,Reply}.
@@ -355,16 +358,16 @@ get_data(Port, Sofar) ->
{Port, {data, Bytes}} ->
get_data(Port, [Sofar|Bytes]);
{Port, eof} ->
- Port ! {self(), close},
+ Port ! {self(), close},
receive
{Port, closed} ->
true
- end,
+ end,
receive
- {'EXIT', Port, _} ->
+ {'EXIT', Port, _} ->
ok
after 1 -> % force context switch
ok
- end,
+ end,
lists:flatten(Sofar)
end.
diff --git a/lib/kernel/src/rpc.erl b/lib/kernel/src/rpc.erl
index 7c965ca384..83e0b59cc2 100644
--- a/lib/kernel/src/rpc.erl
+++ b/lib/kernel/src/rpc.erl
@@ -388,13 +388,8 @@ server_call(Node, Name, ReplyWrapper, Msg)
{'DOWN', Ref, _, _, _} ->
{error, nodedown};
{ReplyWrapper, Node, Reply} ->
- erlang:demonitor(Ref),
- receive
- {'DOWN', Ref, _, _, _} ->
- Reply
- after 0 ->
- Reply
- end
+ erlang:demonitor(Ref, [flush]),
+ Reply
end
end.
@@ -501,17 +496,6 @@ start_monitor(Node, Name) ->
{Node,erlang:monitor(process, {Name, Node})}
end.
-%% Cancels a monitor started with Ref=erlang:monitor(_, _),
-%% i.e return value {Node, Ref} from start_monitor/2 above.
-unmonitor(Ref) when is_reference(Ref) ->
- erlang:demonitor(Ref),
- receive
- {'DOWN', Ref, _, _, _} ->
- true
- after 0 ->
- true
- end.
-
%% Call apply(M,F,A) on all nodes in parallel
-spec multicall(Module, Function, Args) -> {ResL, BadNodes} when
@@ -635,10 +619,10 @@ rec_nodes(Name, [{N,R} | Tail], Badnodes, Replies) ->
rec_nodes(Name, Tail, [N|Badnodes], Replies);
{?NAME, N, {nonexisting_name, _}} ->
%% used by sbcast()
- unmonitor(R),
+ erlang:demonitor(R, [flush]),
rec_nodes(Name, Tail, [N|Badnodes], Replies);
{Name, N, Reply} -> %% Name is bound !!!
- unmonitor(R),
+ erlang:demonitor(R, [flush]),
rec_nodes(Name, Tail, Badnodes, [Reply|Replies])
end.
diff --git a/lib/kernel/test/application_SUITE.erl b/lib/kernel/test/application_SUITE.erl
index 0452202467..1ff291be54 100644
--- a/lib/kernel/test/application_SUITE.erl
+++ b/lib/kernel/test/application_SUITE.erl
@@ -21,8 +21,10 @@
-include_lib("test_server/include/test_server.hrl").
-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
- init_per_group/2,end_per_group/2,
- failover/1, failover_comp/1, permissions/1, load/1,
+ init_per_group/2,end_per_group/2
+ ]).
+
+-export([failover/1, failover_comp/1, permissions/1, load/1,
load_use_cache/1,
otp_1586/1, otp_2078/1, otp_2012/1, otp_2718/1, otp_2973/1,
otp_3002/1, otp_3184/1, otp_4066/1, otp_4227/1, otp_5363/1,
@@ -33,6 +35,7 @@
-export([config_change/1,
distr_changed_tc1/1, distr_changed_tc2/1,
+ ensure_started/1,
shutdown_func/1, do_shutdown/1, shutdown_timeout/1]).
-define(TESTCASE, testcase_name).
@@ -47,7 +50,7 @@ suite() -> [{ct_hooks,[ts_install_cth]}].
all() ->
[failover, failover_comp, permissions, load,
- load_use_cache, {group, reported_bugs}, start_phases,
+ load_use_cache, ensure_started, {group, reported_bugs}, start_phases,
script_start, nodedown_start, permit_false_start_local,
permit_false_start_dist, get_key, get_env,
{group, distr_changed}, config_change, shutdown_func, shutdown_timeout].
@@ -76,10 +79,10 @@ end_per_group(_GroupName, Config) ->
init_per_testcase(otp_2973=Case, Config) ->
code:add_path(?config(data_dir,Config)),
- ?line Dog = test_server:timetrap(?default_timeout),
+ Dog = test_server:timetrap(?default_timeout),
[{?TESTCASE, Case}, {watchdog, Dog}|Config];
init_per_testcase(Case, Config) ->
- ?line Dog = test_server:timetrap(?default_timeout),
+ Dog = test_server:timetrap(?default_timeout),
[{?TESTCASE, Case}, {watchdog, Dog}|Config].
end_per_testcase(otp_2973, Config) ->
@@ -121,92 +124,92 @@ failover(doc) ->
failover(Conf) when is_list(Conf) ->
%% start a help process to check the start type
StPid = spawn_link(?MODULE, start_type, []),
- ?line yes = global:register_name(st_type, StPid),
+ yes = global:register_name(st_type, StPid),
NodeNames = [Ncp1, Ncp2, Ncp3] = node_names([cp1, cp2, cp3], Conf),
NoSyncTime = config_fun_fast(config_fo(NodeNames)),
WithSyncTime = config_fun(config_fo(NodeNames)),
% Test [cp1, cp2, cp3]
- ?line {ok, Cp1} = start_node_config(Ncp1, NoSyncTime, Conf),
- ?line {ok, Cp2} = start_node_config(Ncp2, NoSyncTime, Conf),
- ?line {ok, Cp3} = start_node_config(Ncp3, WithSyncTime, Conf),
+ {ok, Cp1} = start_node_config(Ncp1, NoSyncTime, Conf),
+ {ok, Cp2} = start_node_config(Ncp2, NoSyncTime, Conf),
+ {ok, Cp3} = start_node_config(Ncp3, WithSyncTime, Conf),
Cps = [Cp1, Cp2, Cp3],
- ?line wait_for_ready_net(),
+ wait_for_ready_net(),
% Start app1 and make sure cp1 starts it
- ?line {[ok,ok,ok],[]} =
+ {[ok,ok,ok],[]} =
rpc:multicall(Cps, application, load, [app1()]),
- ?line ?UNTIL(is_loaded(app1, Cps)),
- ?line {[ok,ok,ok],[]} =
+ ?UNTIL(is_loaded(app1, Cps)),
+ {[ok,ok,ok],[]} =
rpc:multicall(Cps, application, start, [app1, permanent]),
- ?line ?UNTIL(is_started(app1, Cp1)),
- ?line false = is_started(app1, Cp2),
- ?line ok = get_start_type(#st{normal = 3}),
+ ?UNTIL(is_started(app1, Cp1)),
+ false = is_started(app1, Cp2),
+ ok = get_start_type(#st{normal = 3}),
% Stop cp1 and make sure cp2 starts app1
stop_node_nice(Cp1),
- ?line ?UNTIL(is_started(app1, Cp2)),
- ?line ok = get_start_type(#st{normal = 3}),
+ ?UNTIL(is_started(app1, Cp2)),
+ ok = get_start_type(#st{normal = 3}),
% Restart cp1 and make sure it restarts app1
- ?line {ok, Cp1_2} = start_node_config(Ncp1, NoSyncTime, Conf),
- ?line global:sync(),
- ?line ok = rpc:call(Cp1_2, application, load, [app1()]),
- ?line ok = rpc:call(Cp1_2, application, start, [app1, permanent]),
- ?line ?UNTIL(is_started(app1, Cp1)),
- ?line ?UNTIL(not is_started(app1, Cp2)),
- ?line ok = get_start_type(#st{takeover = 3}),
+ {ok, Cp1_2} = start_node_config(Ncp1, NoSyncTime, Conf),
+ global:sync(),
+ ok = rpc:call(Cp1_2, application, load, [app1()]),
+ ok = rpc:call(Cp1_2, application, start, [app1, permanent]),
+ ?UNTIL(is_started(app1, Cp1)),
+ ?UNTIL(not is_started(app1, Cp2)),
+ ok = get_start_type(#st{takeover = 3}),
% Test [{cp1, cp2}, cp3]
% Start app_sp and make sure cp2 starts it (cp1 has more apps started)
- ?line {[ok,ok,ok],[]} =
+ {[ok,ok,ok],[]} =
rpc:multicall([Cp1_2, Cp2, Cp3], application, load, [app_sp()]),
- ?line {[ok,ok,ok],[]} =
+ {[ok,ok,ok],[]} =
rpc:multicall([Cp1_2, Cp2, Cp3], application, start,[app_sp,permanent]),
- ?line ?UNTIL(is_started(app_sp, Cp2)),
- ?line false = is_started(app_sp, Cp1),
- ?line false = is_started(app_sp, Cp3),
- ?line ok = get_start_type(#st{normal = 3}),
+ ?UNTIL(is_started(app_sp, Cp2)),
+ false = is_started(app_sp, Cp1),
+ false = is_started(app_sp, Cp3),
+ ok = get_start_type(#st{normal = 3}),
% Stop cp2 and make sure cp1 starts app_sp
stop_node_nice(Cp2),
- ?line ?UNTIL(is_started(app_sp, Cp1_2)),
- ?line ok = get_start_type(#st{failover = 3}),
+ ?UNTIL(is_started(app_sp, Cp1_2)),
+ ok = get_start_type(#st{failover = 3}),
% Stop cp1 and make sure cp3 starts app_sp
stop_node_nice(Cp1_2),
- ?line ?UNTIL(is_started(app_sp, Cp3)),
- ?line ok = get_start_type(#st{normal = 3, failover = 3}),
+ ?UNTIL(is_started(app_sp, Cp3)),
+ ok = get_start_type(#st{normal = 3, failover = 3}),
% Restart cp2 and make sure it restarts app_sp
- ?line {ok, Cp2_2} = start_node_config(Ncp2, NoSyncTime, Conf),
- ?line global:sync(),
- ?line ok = rpc:call(Cp2_2, application, load, [app_sp()]),
- ?line ok = rpc:call(Cp2_2, application, start, [app_sp, permanent]),
- ?line ?UNTIL(is_started(app_sp, Cp2_2)),
- ?line ?UNTIL(not is_started(app_sp, Cp3)),
- ?line ok = get_start_type(#st{takeover = 3}),
+ {ok, Cp2_2} = start_node_config(Ncp2, NoSyncTime, Conf),
+ global:sync(),
+ ok = rpc:call(Cp2_2, application, load, [app_sp()]),
+ ok = rpc:call(Cp2_2, application, start, [app_sp, permanent]),
+ ?UNTIL(is_started(app_sp, Cp2_2)),
+ ?UNTIL(not is_started(app_sp, Cp3)),
+ ok = get_start_type(#st{takeover = 3}),
% Restart cp1 and make sure it doesn't restart app_sp
- ?line {ok, Cp1_3} = start_node_config(Ncp1, NoSyncTime, Conf),
- ?line global:sync(),
- ?line ok = rpc:call(Cp1_3, application, load, [app_sp()]),
- ?line ok = rpc:call(Cp1_3, application, start, [app_sp, permanent]),
+ {ok, Cp1_3} = start_node_config(Ncp1, NoSyncTime, Conf),
+ global:sync(),
+ ok = rpc:call(Cp1_3, application, load, [app_sp()]),
+ ok = rpc:call(Cp1_3, application, start, [app_sp, permanent]),
test_server:sleep(500),
- ?line false = is_started(app_sp, Cp1_3),
- ?line true = is_started(app_sp, Cp2_2),
+ false = is_started(app_sp, Cp1_3),
+ true = is_started(app_sp, Cp2_2),
% Force takeover to cp1
- ?line ok = rpc:call(Cp1_3, application, takeover, [app_sp, permanent]),
- ?line ?UNTIL(is_started(app_sp, Cp1_3)),
- ?line ?UNTIL(not is_started(app_sp, Cp2_2)),
- ?line ok = get_start_type(#st{takeover = 3}),
+ ok = rpc:call(Cp1_3, application, takeover, [app_sp, permanent]),
+ ?UNTIL(is_started(app_sp, Cp1_3)),
+ ?UNTIL(not is_started(app_sp, Cp2_2)),
+ ok = get_start_type(#st{takeover = 3}),
%% Kill one child process and see that it is started with type local
PP = global:whereis_name({ch,3}),
exit(PP, kill),
- ?line ok = get_start_type(#st{local = 1}),
+ ok = get_start_type(#st{local = 1}),
global:send(st_type, kill),
@@ -227,96 +230,96 @@ failover_comp(doc) ->
failover_comp(Conf) when is_list(Conf) ->
%% start a help process to check the start type
StPid = spawn_link(?MODULE, start_type, []),
- ?line yes = global:register_name(st_type, StPid),
+ yes = global:register_name(st_type, StPid),
NodeNames = [Ncp1, Ncp2, Ncp3] = node_names([cp1, cp2, cp3], Conf),
NoSyncTime = config_fun_fast(config(NodeNames)),
WithSyncTime = config_fun(config(NodeNames)),
% Test [cp1, cp2, cp3]
- ?line {ok, Cp1} = start_node_config(Ncp1, NoSyncTime, Conf),
- ?line {ok, Cp2} = start_node_config(Ncp2, NoSyncTime, Conf),
- ?line {ok, Cp3} = start_node_config(Ncp3, WithSyncTime, Conf),
+ {ok, Cp1} = start_node_config(Ncp1, NoSyncTime, Conf),
+ {ok, Cp2} = start_node_config(Ncp2, NoSyncTime, Conf),
+ {ok, Cp3} = start_node_config(Ncp3, WithSyncTime, Conf),
Cps = [Cp1, Cp2, Cp3],
- ?line wait_for_ready_net(),
+ wait_for_ready_net(),
% Start app1 and make sure cp1 starts it
- ?line {[ok,ok,ok],[]} =
+ {[ok,ok,ok],[]} =
rpc:multicall(Cps, application, load, [app1()]),
- ?line ?UNTIL(is_loaded(app1, Cps)),
- ?line {[ok,ok,ok],[]} =
+ ?UNTIL(is_loaded(app1, Cps)),
+ {[ok,ok,ok],[]} =
rpc:multicall(Cps, application, start, [app1, permanent]),
- ?line ?UNTIL(is_started(app1, Cp1)),
- ?line false = is_started(app1, Cp2),
- ?line ok = get_start_type(#st{normal = 3}),
+ ?UNTIL(is_started(app1, Cp1)),
+ false = is_started(app1, Cp2),
+ ok = get_start_type(#st{normal = 3}),
% Stop cp1 and make sure cp2 starts app1
stop_node_nice(Cp1),
- ?line ?UNTIL(is_started(app1, Cp2)),
- ?line ok = get_start_type(#st{normal = 3}),
+ ?UNTIL(is_started(app1, Cp2)),
+ ok = get_start_type(#st{normal = 3}),
% Restart cp1 and make sure it restarts app1
- ?line {ok, Cp1_2} = start_node_config(Ncp1, NoSyncTime, Conf),
- ?line global:sync(),
- ?line ok = rpc:call(Cp1_2, application, load, [app1()]),
- ?line ?UNTIL(is_loaded(app1, Cp1_2)),
- ?line ok = rpc:call(Cp1_2, application, start, [app1, permanent]),
- ?line ?UNTIL(is_started(app1, Cp1_2)),
- ?line ?UNTIL(not is_started(app1, Cp2)),
- ?line ok = get_start_type(#st{takeover = 3}),
+ {ok, Cp1_2} = start_node_config(Ncp1, NoSyncTime, Conf),
+ global:sync(),
+ ok = rpc:call(Cp1_2, application, load, [app1()]),
+ ?UNTIL(is_loaded(app1, Cp1_2)),
+ ok = rpc:call(Cp1_2, application, start, [app1, permanent]),
+ ?UNTIL(is_started(app1, Cp1_2)),
+ ?UNTIL(not is_started(app1, Cp2)),
+ ok = get_start_type(#st{takeover = 3}),
% Test [{cp1, cp2}, cp3]
% Start app3 and make sure cp2 starts it (cp1 has more apps started)
- ?line {[ok,ok,ok],[]} =
+ {[ok,ok,ok],[]} =
rpc:multicall([Cp1_2, Cp2, Cp3], application, load, [app3()]),
- ?line ?UNTIL(is_loaded(app3, [Cp1_2, Cp2, Cp3])),
- ?line {[ok,ok,ok],[]} =
+ ?UNTIL(is_loaded(app3, [Cp1_2, Cp2, Cp3])),
+ {[ok,ok,ok],[]} =
rpc:multicall([Cp1_2, Cp2, Cp3], application, start,[app3,permanent]),
- ?line ?UNTIL(is_started(app3, Cp2)),
- ?line false = is_started(app3, Cp1),
- ?line false = is_started(app3, Cp3),
- ?line ok = get_start_type(#st{normal = 3}),
+ ?UNTIL(is_started(app3, Cp2)),
+ false = is_started(app3, Cp1),
+ false = is_started(app3, Cp3),
+ ok = get_start_type(#st{normal = 3}),
% Stop cp2 and make sure cp1 starts app3
stop_node_nice(Cp2),
- ?line ?UNTIL(is_started(app3, Cp1_2)),
- ?line ok = get_start_type(#st{normal = 3}),
+ ?UNTIL(is_started(app3, Cp1_2)),
+ ok = get_start_type(#st{normal = 3}),
% Stop cp1 and make sure cp3 starts app3
stop_node_nice(Cp1_2),
- ?line ?UNTIL(is_started(app3, Cp3)),
- ?line ok = get_start_type(#st{normal = 6}),
+ ?UNTIL(is_started(app3, Cp3)),
+ ok = get_start_type(#st{normal = 6}),
% Restart cp2 and make sure it restarts app3
- ?line {ok, Cp2_2} = start_node_config(Ncp2, NoSyncTime, Conf),
- ?line global:sync(),
- ?line ok = rpc:call(Cp2_2, application, load, [app3()]),
- ?line ?UNTIL(is_loaded(app3, Cp2_2)),
- ?line ok = rpc:call(Cp2_2, application, start, [app3, permanent]),
- ?line ?UNTIL(is_started(app3, Cp2_2)),
- ?line ?UNTIL(not is_started(app3, Cp3)),
- ?line ok = get_start_type(#st{takeover = 3}),
+ {ok, Cp2_2} = start_node_config(Ncp2, NoSyncTime, Conf),
+ global:sync(),
+ ok = rpc:call(Cp2_2, application, load, [app3()]),
+ ?UNTIL(is_loaded(app3, Cp2_2)),
+ ok = rpc:call(Cp2_2, application, start, [app3, permanent]),
+ ?UNTIL(is_started(app3, Cp2_2)),
+ ?UNTIL(not is_started(app3, Cp3)),
+ ok = get_start_type(#st{takeover = 3}),
% Restart cp1 and make sure it doesn't restart app3
- ?line {ok, Cp1_3} = start_node_config(Ncp1, NoSyncTime, Conf),
- ?line global:sync(),
- ?line ok = rpc:call(Cp1_3, application, load, [app3()]),
- ?line true = is_loaded(app3, Cp1_3),
- ?line ok = rpc:call(Cp1_3, application, start, [app3, permanent]),
+ {ok, Cp1_3} = start_node_config(Ncp1, NoSyncTime, Conf),
+ global:sync(),
+ ok = rpc:call(Cp1_3, application, load, [app3()]),
+ true = is_loaded(app3, Cp1_3),
+ ok = rpc:call(Cp1_3, application, start, [app3, permanent]),
test_server:sleep(5000),
- ?line false = is_started(app3, Cp1_3),
- ?line true = is_started(app3, Cp2_2),
+ false = is_started(app3, Cp1_3),
+ true = is_started(app3, Cp2_2),
% Force takeover to cp1
- ?line ok = rpc:call(Cp1_3, application, takeover, [app3, permanent]),
- ?line ?UNTIL(is_started(app3, Cp1_3)),
- ?line ?UNTIL(not is_started(app3, Cp2_2)),
- ?line ok = get_start_type(#st{takeover = 3}),
+ ok = rpc:call(Cp1_3, application, takeover, [app3, permanent]),
+ ?UNTIL(is_started(app3, Cp1_3)),
+ ?UNTIL(not is_started(app3, Cp2_2)),
+ ok = get_start_type(#st{takeover = 3}),
%% Kill one child process and see that it is started with type local
PP = global:whereis_name({ch,3}),
exit(PP, kill),
- ?line ok = get_start_type(#st{local = 1}),
+ ok = get_start_type(#st{local = 1}),
global:send(st_type, kill),
@@ -339,67 +342,67 @@ permissions(Conf) when is_list(Conf) ->
WithSyncTime = config_fun(config2(NodeNames)),
% Test [cp1, cp2, cp3]
- ?line {ok, Cp1} = start_node_config(Ncp1, NoSyncTime, Conf),
- ?line {ok, Cp2} = start_node_config(Ncp2, NoSyncTime, Conf),
- ?line {ok, Cp3} = start_node_config(Ncp3, WithSyncTime, Conf),
+ {ok, Cp1} = start_node_config(Ncp1, NoSyncTime, Conf),
+ {ok, Cp2} = start_node_config(Ncp2, NoSyncTime, Conf),
+ {ok, Cp3} = start_node_config(Ncp3, WithSyncTime, Conf),
Cps = [Cp1, Cp2, Cp3],
- ?line wait_for_ready_net(),
+ wait_for_ready_net(),
% Start app1 and make sure cp1 starts it
- ?line {[ok,ok,ok],[]} =
+ {[ok,ok,ok],[]} =
rpc:multicall(Cps, application, load, [app1()]),
- ?line ?UNTIL(is_loaded(app1, Cps)),
- ?line {[ok,ok,ok],[]} =
+ ?UNTIL(is_loaded(app1, Cps)),
+ {[ok,ok,ok],[]} =
rpc:multicall(Cps, application, start, [app1, permanent]),
- ?line ?UNTIL(is_started(app1, Cp1)),
- ?line false = is_started(app1, Cp2),
+ ?UNTIL(is_started(app1, Cp1)),
+ false = is_started(app1, Cp2),
% Unpermit app1 on cp1, make sure cp2 starts it
- ?line ok = rpc:call(Cp1, application, permit, [app1, false]),
- ?line false = is_started(app1, Cp1),
- ?line true = is_started(app1, Cp2),
+ ok = rpc:call(Cp1, application, permit, [app1, false]),
+ false = is_started(app1, Cp1),
+ true = is_started(app1, Cp2),
% Unpermit app1 on cp2, make sure cp3 starts it
- ?line ok = rpc:call(Cp2, application, permit, [app1, false]),
- ?line false = is_started(app1, Cp1),
- ?line false = is_started(app1, Cp2),
- ?line true = is_started(app1, Cp3),
+ ok = rpc:call(Cp2, application, permit, [app1, false]),
+ false = is_started(app1, Cp1),
+ false = is_started(app1, Cp2),
+ true = is_started(app1, Cp3),
% Permit cp2 again
- ?line ok = rpc:call(Cp2, application, permit, [app1, true]),
- ?line false = is_started(app1, Cp1),
- ?line false = is_started(app1, Cp3),
- ?line true = is_started(app1, Cp2),
+ ok = rpc:call(Cp2, application, permit, [app1, true]),
+ false = is_started(app1, Cp1),
+ false = is_started(app1, Cp3),
+ true = is_started(app1, Cp2),
% Start app3, make sure noone starts it
- ?line {[ok,ok,ok],[]} =
+ {[ok,ok,ok],[]} =
rpc:multicall(Cps, application, load, [app3()]),
- ?line ?UNTIL(is_loaded(app3, Cps)),
- ?line {[ok,ok,ok],[]} =
+ ?UNTIL(is_loaded(app3, Cps)),
+ {[ok,ok,ok],[]} =
rpc:multicall(Cps, application, start, [app3, permanent]),
test_server:sleep(1000),
- ?line false = is_started(app3, Cp1),
- ?line false = is_started(app3, Cp2),
- ?line false = is_started(app3, Cp3),
+ false = is_started(app3, Cp1),
+ false = is_started(app3, Cp2),
+ false = is_started(app3, Cp3),
% Permit app3 on Cp3
- ?line ok = rpc:call(Cp3, application, permit, [app3, true]),
- ?line true = is_started(app3, Cp3),
+ ok = rpc:call(Cp3, application, permit, [app3, true]),
+ true = is_started(app3, Cp3),
% Permit app3 on Cp2, make sure it starts it
- ?line ok = rpc:call(Cp2, application, permit, [app3, true]),
- ?line true = is_started(app3, Cp2),
- ?line false = is_started(app3, Cp3),
+ ok = rpc:call(Cp2, application, permit, [app3, true]),
+ true = is_started(app3, Cp2),
+ false = is_started(app3, Cp3),
% Permit app3 on Cp1, make sure it doesn't start it
- ?line ok = rpc:call(Cp1, application, permit, [app3, true]),
- ?line false = is_started(app3, Cp1),
- ?line true = is_started(app3, Cp2),
- ?line false = is_started(app3, Cp3),
+ ok = rpc:call(Cp1, application, permit, [app3, true]),
+ false = is_started(app3, Cp1),
+ true = is_started(app3, Cp2),
+ false = is_started(app3, Cp3),
% Stop Cp2, make sure Cp1 starts app3
stop_node_nice(Cp2),
- ?line ?UNTIL(is_started(app3, Cp1)),
+ ?UNTIL(is_started(app3, Cp1)),
stop_node_nice(Cp1),
stop_node_nice(Cp3),
@@ -418,25 +421,25 @@ load(Conf) when is_list(Conf) ->
WithSyncTime = config_fun(config3(NodeNames)),
% Test [cp1, cp2, cp3]
- ?line {ok, Cp1} = start_node_config(Ncp1, NoSyncTime, Conf),
- ?line {ok, Cp2} = start_node_config(Ncp2, NoSyncTime, Conf),
- ?line {ok, Cp3} = start_node_config(Ncp3, WithSyncTime, Conf),
+ {ok, Cp1} = start_node_config(Ncp1, NoSyncTime, Conf),
+ {ok, Cp2} = start_node_config(Ncp2, NoSyncTime, Conf),
+ {ok, Cp3} = start_node_config(Ncp3, WithSyncTime, Conf),
Cps = [Cp1, Cp2, Cp3],
- ?line wait_for_ready_net(),
+ wait_for_ready_net(),
- ?line {[ok,ok,ok],[]} =
+ {[ok,ok,ok],[]} =
rpc:multicall(Cps, application, load, [app1(), d1(NodeNames)]),
- ?line ?UNTIL(is_loaded(app1, Cps)),
- ?line {[ok,ok,ok],[]} =
+ ?UNTIL(is_loaded(app1, Cps)),
+ {[ok,ok,ok],[]} =
rpc:multicall(Cps, application, start, [app1, permanent]),
- ?line ?UNTIL(is_started(app1, Cp1)),
- ?line false = is_started(app1, Cp2),
- ?line false = is_started(app1, Cp3),
+ ?UNTIL(is_started(app1, Cp1)),
+ false = is_started(app1, Cp2),
+ false = is_started(app1, Cp3),
% Load app1 with different specs and make sure we get an error
- ?line {[{error,_},{error,_}],[]} =
+ {[{error,_},{error,_}],[]} =
rpc:multicall([Cp1, Cp2], application, load, [app1(), d1(NodeNames)]),
- ?line {error, _} = rpc:call(Cp3, application, load, [app1(), d2(NodeNames)]),
+ {error, _} = rpc:call(Cp3, application, load, [app1(), d2(NodeNames)]),
stop_node_nice(Cp1),
stop_node_nice(Cp2),
@@ -455,24 +458,24 @@ load_use_cache(Conf) when is_list(Conf) ->
WithSyncTime = config_fun(config3(NodeNames)),
% Test [cp1, cp2, cp3]
- ?line {ok, Cp1} = start_node_with_cache(Ncp1, NoSyncTime, Conf),
- ?line {ok, Cp2} = start_node_with_cache(Ncp2, NoSyncTime, Conf),
- ?line {ok, Cp3} = start_node_with_cache(Ncp3, WithSyncTime, Conf),
+ {ok, Cp1} = start_node_with_cache(Ncp1, NoSyncTime, Conf),
+ {ok, Cp2} = start_node_with_cache(Ncp2, NoSyncTime, Conf),
+ {ok, Cp3} = start_node_with_cache(Ncp3, WithSyncTime, Conf),
Cps = [Cp1, Cp2, Cp3],
- ?line wait_for_ready_net(),
+ wait_for_ready_net(),
- ?line {[ok,ok,ok],[]} =
+ {[ok,ok,ok],[]} =
rpc:multicall(Cps, application, load, [app1(), d1(NodeNames)]),
- ?line ?UNTIL(is_loaded(app1, Cps)),
- ?line {[ok,ok,ok],[]} =
+ ?UNTIL(is_loaded(app1, Cps)),
+ {[ok,ok,ok],[]} =
rpc:multicall(Cps, application, start, [app1, permanent]),
- ?line ?UNTIL(is_started(app1, Cp1)),
- ?line false = is_started(app1, Cp2),
+ ?UNTIL(is_started(app1, Cp1)),
+ false = is_started(app1, Cp2),
% Load app1 with different specs and make sure we get an error
- ?line {[{error,_},{error,_}],[]} =
+ {[{error,_},{error,_}],[]} =
rpc:multicall([Cp1, Cp2], application, load, [app1(), d1(NodeNames)]),
- ?line {error, _} = rpc:call(Cp3, application, load, [app1(), d2(NodeNames)]),
+ {error, _} = rpc:call(Cp3, application, load, [app1(), d2(NodeNames)]),
stop_node_nice(Cp1),
stop_node_nice(Cp2),
@@ -489,57 +492,57 @@ start_phases(doc) ->
start_phases(Conf) when is_list(Conf) ->
%% start a help process to check the start type
SpPid = spawn_link(?MODULE, start_phase, []),
- ?line yes = global:register_name(start_phase, SpPid),
+ yes = global:register_name(start_phase, SpPid),
NodeNames = [Ncp1, _Ncp2, _Ncp3] = node_names([cp1, cp2, cp3], Conf),
WithSyncTime = config_fun(config_sf(NodeNames)),
- ?line {ok, Cp1} = start_node_config_sf(Ncp1, WithSyncTime, Conf),
- ?line wait_for_ready_net(),
+ {ok, Cp1} = start_node_config_sf(Ncp1, WithSyncTime, Conf),
+ wait_for_ready_net(),
%%=============================
%%Example 1 in the user's guide
%%=============================
- ?line ok = rpc:call(Cp1, application, load, [myApp,
+ ok = rpc:call(Cp1, application, load, [myApp,
d_any3(myApp, NodeNames)]),
- ?line ?UNTIL(is_loaded(myApp, Cp1)),
- ?line ok = rpc:call(Cp1, application, start, [myApp, permanent]),
- ?line ?UNTIL(is_started(myApp, Cp1)),
- ?line ok = get_start_phase({sp, 0, 1, 0, 0, 1}),
- ?line ok = rpc:call(Cp1, application, stop, [myApp]),
+ ?UNTIL(is_loaded(myApp, Cp1)),
+ ok = rpc:call(Cp1, application, start, [myApp, permanent]),
+ ?UNTIL(is_started(myApp, Cp1)),
+ ok = get_start_phase({sp, 0, 1, 0, 0, 1}),
+ ok = rpc:call(Cp1, application, stop, [myApp]),
%%=============================
%%Example 2 in the user's guide
%%=============================
- ?line ok = rpc:call(Cp1, application, load, [topApp,
+ ok = rpc:call(Cp1, application, load, [topApp,
d_any3(topApp, NodeNames)]),
- ?line ?UNTIL(is_loaded(topApp, Cp1)),
- ?line ok = rpc:call(Cp1, application, start, [topApp, permanent]),
- ?line ?UNTIL(is_started(topApp, Cp1)),
- ?line ok = get_start_phase({sp, 0, 1, 0, 0, 1}),
- ?line ok = rpc:call(Cp1, application, stop, [topApp]),
+ ?UNTIL(is_loaded(topApp, Cp1)),
+ ok = rpc:call(Cp1, application, start, [topApp, permanent]),
+ ?UNTIL(is_started(topApp, Cp1)),
+ ok = get_start_phase({sp, 0, 1, 0, 0, 1}),
+ ok = rpc:call(Cp1, application, stop, [topApp]),
%%=============================
%%Example 3 in the user's guide
%%=============================
- ?line ok = rpc:call(Cp1, application, load, [topApp2,
+ ok = rpc:call(Cp1, application, load, [topApp2,
d_any3(topApp2, NodeNames)]),
- ?line ?UNTIL(is_loaded(topApp2, Cp1)),
- ?line ok = rpc:call(Cp1, application, start, [topApp2, permanent]),
- ?line ?UNTIL(is_started(topApp2, Cp1)),
- ?line ok = get_start_phase({sp, 0, 2, 0, 0, 3}),
- ?line ok = rpc:call(Cp1, application, stop, [topApp2]),
+ ?UNTIL(is_loaded(topApp2, Cp1)),
+ ok = rpc:call(Cp1, application, start, [topApp2, permanent]),
+ ?UNTIL(is_started(topApp2, Cp1)),
+ ok = get_start_phase({sp, 0, 2, 0, 0, 3}),
+ ok = rpc:call(Cp1, application, stop, [topApp2]),
%%=============================
%%Example 4 in the user's guide
%%=============================
- ?line ok = rpc:call(Cp1, application, load, [topApp3,
+ ok = rpc:call(Cp1, application, load, [topApp3,
d_any3(topApp3, NodeNames)]),
- ?line ?UNTIL(is_loaded(topApp3, Cp1)),
- ?line ok = rpc:call(Cp1, application, start, [topApp3, permanent]),
- ?line ?UNTIL(is_started(topApp3, Cp1)),
- ?line ok = get_start_phase({sp, 1, 3, 3, 2, 4}),
- ?line ok = rpc:call(Cp1, application, stop, [topApp3]),
+ ?UNTIL(is_loaded(topApp3, Cp1)),
+ ok = rpc:call(Cp1, application, start, [topApp3, permanent]),
+ ?UNTIL(is_started(topApp3, Cp1)),
+ ok = get_start_phase({sp, 1, 3, 3, 2, 4}),
+ ok = rpc:call(Cp1, application, stop, [topApp3]),
global:send(start_phase, kill),
@@ -554,101 +557,101 @@ script_start(suite) -> [];
script_start(Conf) when is_list(Conf) ->
%% start a help process to check the start type
StPid = spawn_link(?MODULE, start_type, []),
- ?line yes = global:register_name(st_type, StPid),
+ yes = global:register_name(st_type, StPid),
% Create the .app files and the boot script
- ?line ok = create_app(),
- ?line {{KernelVer,StdlibVer}, _} = create_script("latest"),
- ?line case is_real_system(KernelVer, StdlibVer) of
+ ok = create_app(),
+ {{KernelVer,StdlibVer}, _} = create_script("latest"),
+ case is_real_system(KernelVer, StdlibVer) of
true ->
Options = [];
false ->
Options = [local]
end,
- ?line ok = systools:make_script("latest", Options),
+ ok = systools:make_script("latest", Options),
NodeNames = [Ncp1, Ncp2, Ncp3] = node_names([cp1, cp2, cp3], Conf),
NoSyncTime = config_fun_fast(config_fo(NodeNames)),
WithSyncTime = config_fun(config_fo(NodeNames)),
% Test [cp1, cp2, cp3]
- ?line {ok, Cp1} = start_node_boot_config(Ncp1, NoSyncTime, Conf, latest),
- ?line {ok, Cp2} = start_node_boot_config(Ncp2, NoSyncTime, Conf, latest),
- ?line {ok, Cp3} = start_node_boot_config(Ncp3, WithSyncTime, Conf, latest),
- ?line wait_for_ready_net(),
+ {ok, Cp1} = start_node_boot_config(Ncp1, NoSyncTime, Conf, latest),
+ {ok, Cp2} = start_node_boot_config(Ncp2, NoSyncTime, Conf, latest),
+ {ok, Cp3} = start_node_boot_config(Ncp3, WithSyncTime, Conf, latest),
+ wait_for_ready_net(),
- ?line ?UNTIL(is_started(app1, Cp1)),
- ?line ?UNTIL(is_started(app2, Cp1)),
- ?line ?UNTIL(is_started(app_sp, Cp1)),
- ?line false = is_started(app1, Cp2),
- ?line ok = get_start_type(#st{normal = 9}),
+ ?UNTIL(is_started(app1, Cp1)),
+ ?UNTIL(is_started(app2, Cp1)),
+ ?UNTIL(is_started(app_sp, Cp1)),
+ false = is_started(app1, Cp2),
+ ok = get_start_type(#st{normal = 9}),
% Stop cp1 and make sure cp2 starts app1, app2 normally (no
% start_phases defined) and app_sp as failover (start_phases
% defined)
stop_node_nice(Cp1),
- ?line ?UNTIL(is_started(app1, Cp2)),
- ?line ?UNTIL(is_started(app2, Cp2)),
- ?line ?UNTIL(is_started(app_sp, Cp2)),
- ?line ok = get_start_type(#st{normal = 6, failover = 3}),
+ ?UNTIL(is_started(app1, Cp2)),
+ ?UNTIL(is_started(app2, Cp2)),
+ ?UNTIL(is_started(app_sp, Cp2)),
+ ok = get_start_type(#st{normal = 6, failover = 3}),
% Restart cp1, Cp1 takesover app1 and app2
- ?line {ok, Cp1_2} = start_node_boot_config(Ncp1, NoSyncTime, Conf, latest),
- ?line global:sync(),
- ?line ?UNTIL(is_started(app1, Cp1_2)),
- ?line false = is_started(app1, Cp2),
- ?line ?UNTIL(is_started(app2, Cp1_2)),
- ?line true = is_started(app_sp, Cp2),
- ?line ?UNTIL(not is_started(app1, Cp2)),
- ?line ?UNTIL(not is_started(app2, Cp2)),
- ?line ok = get_start_type(#st{takeover = 6}),
+ {ok, Cp1_2} = start_node_boot_config(Ncp1, NoSyncTime, Conf, latest),
+ global:sync(),
+ ?UNTIL(is_started(app1, Cp1_2)),
+ false = is_started(app1, Cp2),
+ ?UNTIL(is_started(app2, Cp1_2)),
+ true = is_started(app_sp, Cp2),
+ ?UNTIL(not is_started(app1, Cp2)),
+ ?UNTIL(not is_started(app2, Cp2)),
+ ok = get_start_type(#st{takeover = 6}),
% Stop cp2 and make sure cp1 starts app_sp.
- ?line false = is_started(app_sp, Cp1_2),
+ false = is_started(app_sp, Cp1_2),
stop_node_nice(Cp2),
- ?line ?UNTIL(is_started(app_sp, Cp1_2)),
- ?line ok = get_start_type(#st{failover = 3}),
+ ?UNTIL(is_started(app_sp, Cp1_2)),
+ ok = get_start_type(#st{failover = 3}),
% Stop cp1 and make sure cp3 starts app1, app2 and app_sp
stop_node_nice(Cp1_2),
- ?line ?UNTIL(is_started(app_sp, Cp3)),
- ?line ?UNTIL(is_started(app1, Cp3)),
- ?line ?UNTIL(is_started(app2, Cp3)),
- ?line ok = get_start_type(#st{normal = 6, failover = 3}),
+ ?UNTIL(is_started(app_sp, Cp3)),
+ ?UNTIL(is_started(app1, Cp3)),
+ ?UNTIL(is_started(app2, Cp3)),
+ ok = get_start_type(#st{normal = 6, failover = 3}),
% Restart cp2 and make sure it takesover app1, app2 and app_sp
- ?line {ok, Cp2_2} = start_node_boot_config(Ncp2, NoSyncTime, Conf, latest),
- ?line global:sync(),
- ?line ?UNTIL(is_started(app_sp, Cp2_2)),
- ?line ?UNTIL(is_started(app1, Cp2_2)),
- ?line ?UNTIL(is_started(app2, Cp2_2)),
- ?line ?UNTIL(not is_started(app_sp, Cp3)),
- ?line ?UNTIL(not is_started(app1, Cp3)),
- ?line ?UNTIL(not is_started(app2, Cp3)),
- ?line ok = get_start_type(#st{takeover = 9}),
+ {ok, Cp2_2} = start_node_boot_config(Ncp2, NoSyncTime, Conf, latest),
+ global:sync(),
+ ?UNTIL(is_started(app_sp, Cp2_2)),
+ ?UNTIL(is_started(app1, Cp2_2)),
+ ?UNTIL(is_started(app2, Cp2_2)),
+ ?UNTIL(not is_started(app_sp, Cp3)),
+ ?UNTIL(not is_started(app1, Cp3)),
+ ?UNTIL(not is_started(app2, Cp3)),
+ ok = get_start_type(#st{takeover = 9}),
% Restart cp1 and make sure it takesover app1, app2
- ?line {ok, Cp1_3} = start_node_boot_config(Ncp1, NoSyncTime, Conf, latest),
- ?line global:sync(),
- ?line ?UNTIL(is_started(app1, Cp1_3)),
- ?line ?UNTIL(is_started(app2, Cp1_3)),
- ?line false = is_started(app_sp, Cp1_3),
- ?line true = is_started(app_sp, Cp2_2),
- ?line ?UNTIL(not is_started(app1, Cp2_2)),
- ?line ?UNTIL(not is_started(app2, Cp2_2)),
- ?line ok = get_start_type(#st{takeover = 6}),
+ {ok, Cp1_3} = start_node_boot_config(Ncp1, NoSyncTime, Conf, latest),
+ global:sync(),
+ ?UNTIL(is_started(app1, Cp1_3)),
+ ?UNTIL(is_started(app2, Cp1_3)),
+ false = is_started(app_sp, Cp1_3),
+ true = is_started(app_sp, Cp2_2),
+ ?UNTIL(not is_started(app1, Cp2_2)),
+ ?UNTIL(not is_started(app2, Cp2_2)),
+ ok = get_start_type(#st{takeover = 6}),
% Force takeover to cp1
- ?line ok = rpc:call(Cp1_3, application, takeover, [app_sp, permanent]),
- ?line ?UNTIL(is_started(app_sp, Cp1_3)),
- ?line ?UNTIL(not is_started(app_sp, Cp2_2)),
- ?line ok = get_start_type(#st{takeover = 3}),
+ ok = rpc:call(Cp1_3, application, takeover, [app_sp, permanent]),
+ ?UNTIL(is_started(app_sp, Cp1_3)),
+ ?UNTIL(not is_started(app_sp, Cp2_2)),
+ ok = get_start_type(#st{takeover = 3}),
%% Kill one child process and see that it is started with type local
PP = global:whereis_name({ch,3}),
exit(PP, kill),
- ?line ok = get_start_type(#st{local = 1}),
+ ok = get_start_type(#st{local = 1}),
global:send(st_type, kill),
@@ -656,9 +659,9 @@ script_start(Conf) when is_list(Conf) ->
stop_node_nice(Cp2_2),
stop_node_nice(Cp3),
- ?line ok = file:delete("latest.boot"),
- ?line ok = file:delete("latest.rel"),
- ?line ok = file:delete("latest.script"),
+ ok = file:delete("latest.boot"),
+ ok = file:delete("latest.rel"),
+ ok = file:delete("latest.script"),
ok.
@@ -672,119 +675,119 @@ permit_false_start_local(Conf) when is_list(Conf) ->
% Test [cp1, cp2, cp3]
[Ncp1, Ncp2, Ncp3] = node_names([cp1, cp2, cp3], Conf),
- ?line {ok, Cp1} = start_node(Ncp1, Config),
- ?line {ok, Cp2} = start_node(Ncp2, Config),
- ?line {ok, Cp3} = start_node(Ncp3, Config),
- ?line wait_for_ready_net(),
+ {ok, Cp1} = start_node(Ncp1, Config),
+ {ok, Cp2} = start_node(Ncp2, Config),
+ {ok, Cp3} = start_node(Ncp3, Config),
+ wait_for_ready_net(),
- ?line {[ok,ok,ok],[]} =
+ {[ok,ok,ok],[]} =
rpc:multicall([Cp1, Cp2, Cp3], application, load, [app1()]),
- ?line {[ok,ok,ok],[]} =
+ {[ok,ok,ok],[]} =
rpc:multicall([Cp1, Cp2, Cp3], application, start, [app1, permanent]),
- ?line {[ok,ok,ok],[]} =
+ {[ok,ok,ok],[]} =
rpc:multicall([Cp1, Cp2, Cp3], application, load, [app2()]),
- ?line {[ok,ok,ok],[]} =
+ {[ok,ok,ok],[]} =
rpc:multicall([Cp1, Cp2, Cp3], application, start, [app2, permanent]),
- ?line {[ok,ok,ok],[]} =
+ {[ok,ok,ok],[]} =
rpc:multicall([Cp1, Cp2, Cp3], application, load, [app3()]),
test_server:sleep(1000),
- ?line false = is_started(app1, Cp1),
- ?line false = is_started(app1, Cp2),
- ?line false = is_started(app1, Cp3),
+ false = is_started(app1, Cp1),
+ false = is_started(app1, Cp2),
+ false = is_started(app1, Cp3),
%Permit a not started application
- ?line ok = rpc:call(Cp1, application, permit, [app3, true]),
+ ok = rpc:call(Cp1, application, permit, [app3, true]),
test_server:sleep(1000),
- ?line false = is_started(app3, Cp1),
- ?line false = is_started(app3, Cp2),
- ?line false = is_started(app3, Cp3),
+ false = is_started(app3, Cp1),
+ false = is_started(app3, Cp2),
+ false = is_started(app3, Cp3),
%Permit a not loaded application
- ?line {error,{not_loaded,app_notloaded}} =
+ {error,{not_loaded,app_notloaded}} =
rpc:call(Cp1, application, permit, [app_notloaded, true]),
test_server:sleep(1000),
- ?line false = is_started(app_notloaded, Cp1),
- ?line false = is_started(app_notloaded, Cp2),
- ?line false = is_started(app_notloaded, Cp3),
+ false = is_started(app_notloaded, Cp1),
+ false = is_started(app_notloaded, Cp2),
+ false = is_started(app_notloaded, Cp3),
%Unpermit a not started application
- ?line ok = rpc:call(Cp1, application, permit, [app3, false]),
+ ok = rpc:call(Cp1, application, permit, [app3, false]),
test_server:sleep(1000),
- ?line false = is_started(app3, Cp1),
- ?line false = is_started(app3, Cp2),
- ?line false = is_started(app3, Cp3),
+ false = is_started(app3, Cp1),
+ false = is_started(app3, Cp2),
+ false = is_started(app3, Cp3),
%Unpermit a not loaded application
- ?line {error,{not_loaded,app_notloaded}} =
+ {error,{not_loaded,app_notloaded}} =
rpc:call(Cp1, application, permit, [app_notloaded, false]),
test_server:sleep(1000),
- ?line false = is_started(app_notloaded, Cp1),
- ?line false = is_started(app_notloaded, Cp2),
- ?line false = is_started(app_notloaded, Cp3),
+ false = is_started(app_notloaded, Cp1),
+ false = is_started(app_notloaded, Cp2),
+ false = is_started(app_notloaded, Cp3),
% Permit app1 on CP1 and make sure it is started
- ?line ok = rpc:call(Cp1, application, permit, [app1, true]),
- ?line ?UNTIL(is_started(app1, Cp1)),
- ?line false = is_started(app1, Cp2),
- ?line false = is_started(app1, Cp3),
+ ok = rpc:call(Cp1, application, permit, [app1, true]),
+ ?UNTIL(is_started(app1, Cp1)),
+ false = is_started(app1, Cp2),
+ false = is_started(app1, Cp3),
% Permit it again
- ?line ok = rpc:call(Cp1, application, permit, [app1, true]),
+ ok = rpc:call(Cp1, application, permit, [app1, true]),
test_server:sleep(1000),
- ?line true = is_started(app1, Cp1),
- ?line false = is_started(app1, Cp2),
- ?line false = is_started(app1, Cp3),
+ true = is_started(app1, Cp1),
+ false = is_started(app1, Cp2),
+ false = is_started(app1, Cp3),
% Permit app2 on CP1 and make sure it is started
- ?line ok = rpc:call(Cp1, application, permit, [app2, true]),
- ?line ?UNTIL(is_started(app2, Cp1)),
- ?line false = is_started(app2, Cp2),
- ?line false = is_started(app2, Cp3),
+ ok = rpc:call(Cp1, application, permit, [app2, true]),
+ ?UNTIL(is_started(app2, Cp1)),
+ false = is_started(app2, Cp2),
+ false = is_started(app2, Cp3),
% Permit app1 on CP2 and make sure it is started
- ?line ok = rpc:call(Cp2, application, permit, [app1, true]),
- ?line ?UNTIL(is_started(app1, Cp2)),
- ?line true = is_started(app1, Cp1),
- ?line false = is_started(app1, Cp3),
+ ok = rpc:call(Cp2, application, permit, [app1, true]),
+ ?UNTIL(is_started(app1, Cp2)),
+ true = is_started(app1, Cp1),
+ false = is_started(app1, Cp3),
% Unpermit app1 on CP1 and make sure it is stopped
- ?line ok = rpc:call(Cp1, application, permit, [app1, false]),
- ?line ?UNTIL(false =:= is_started(app1, Cp1)),
- ?line true = is_started(app1, Cp2),
- ?line false = is_started(app1, Cp3),
+ ok = rpc:call(Cp1, application, permit, [app1, false]),
+ ?UNTIL(false =:= is_started(app1, Cp1)),
+ true = is_started(app1, Cp2),
+ false = is_started(app1, Cp3),
% Unpermit it agin
- ?line ok = rpc:call(Cp1, application, permit, [app1, false]),
+ ok = rpc:call(Cp1, application, permit, [app1, false]),
test_server:sleep(1000),
- ?line false = is_started(app1, Cp1),
- ?line true = is_started(app1, Cp2),
- ?line false = is_started(app1, Cp3),
+ false = is_started(app1, Cp1),
+ true = is_started(app1, Cp2),
+ false = is_started(app1, Cp3),
% Permit app1 on CP1 and make sure it is started
- ?line ok = rpc:call(Cp1, application, permit, [app1, true]),
- ?line ?UNTIL(is_started(app1, Cp1)),
- ?line true = is_started(app1, Cp2),
- ?line false = is_started(app1, Cp3),
+ ok = rpc:call(Cp1, application, permit, [app1, true]),
+ ?UNTIL(is_started(app1, Cp1)),
+ true = is_started(app1, Cp2),
+ false = is_started(app1, Cp3),
% Unpermit app1 on CP1 and make sure it is stopped
- ?line ok = rpc:call(Cp1, application, permit, [app1, false]),
- ?line ?UNTIL(false =:= is_started(app1, Cp1)),
- ?line true = is_started(app1, Cp2),
- ?line false = is_started(app1, Cp3),
+ ok = rpc:call(Cp1, application, permit, [app1, false]),
+ ?UNTIL(false =:= is_started(app1, Cp1)),
+ true = is_started(app1, Cp2),
+ false = is_started(app1, Cp3),
% Unpermit app1 on CP2 and make sure it is stopped
- ?line ok = rpc:call(Cp2, application, permit, [app1, false]),
+ ok = rpc:call(Cp2, application, permit, [app1, false]),
test_server:sleep(1000),
- ?line ?UNTIL(false =:= is_started(app1, Cp2)),
- ?line false = is_started(app1, Cp1),
- ?line false = is_started(app1, Cp3),
+ ?UNTIL(false =:= is_started(app1, Cp2)),
+ false = is_started(app1, Cp1),
+ false = is_started(app1, Cp3),
% Unpermit app2 on CP1 and make sure it is stopped
- ?line ok = rpc:call(Cp1, application, permit, [app2, false]),
- ?line ?UNTIL(false =:= is_started(app2, Cp2)),
- ?line false = is_started(app2, Cp1),
- ?line false = is_started(app2, Cp3),
+ ok = rpc:call(Cp1, application, permit, [app2, false]),
+ ?UNTIL(false =:= is_started(app2, Cp2)),
+ false = is_started(app2, Cp1),
+ false = is_started(app2, Cp3),
stop_node_nice(Cp1),
stop_node_nice(Cp2),
@@ -802,125 +805,125 @@ permit_false_start_dist(Conf) when is_list(Conf) ->
WithSyncTime = config_fun(config_perm2(NodeNames)),
% Test [cp1, cp2, cp3]
- ?line {ok, Cp1} = start_node_config(Ncp1, NoSyncTime, Conf),
- ?line {ok, Cp2} = start_node_config(Ncp2, NoSyncTime, Conf),
- ?line {ok, Cp3} = start_node_config(Ncp3, WithSyncTime, Conf),
+ {ok, Cp1} = start_node_config(Ncp1, NoSyncTime, Conf),
+ {ok, Cp2} = start_node_config(Ncp2, NoSyncTime, Conf),
+ {ok, Cp3} = start_node_config(Ncp3, WithSyncTime, Conf),
Cps = [Cp1, Cp2, Cp3],
- ?line wait_for_ready_net(),
+ wait_for_ready_net(),
- ?line {[ok,ok,ok],[]} =
+ {[ok,ok,ok],[]} =
rpc:multicall(Cps, application, load, [app1()]),
- ?line ?UNTIL(is_loaded(app1, Cps)),
- ?line {[ok,ok,ok],[]} =
+ ?UNTIL(is_loaded(app1, Cps)),
+ {[ok,ok,ok],[]} =
rpc:multicall(Cps, application, start, [app1, permanent]),
- ?line {[ok,ok,ok],[]} =
+ {[ok,ok,ok],[]} =
rpc:multicall(Cps, application, load, [app2()]),
test_server:sleep(1000),
- ?line false = is_started(app1, Cp1),
- ?line false = is_started(app1, Cp2),
- ?line false = is_started(app1, Cp3),
+ false = is_started(app1, Cp1),
+ false = is_started(app1, Cp2),
+ false = is_started(app1, Cp3),
%Permit a not started application
- ?line ok = rpc:call(Cp1, application, permit, [app2, true]),
+ ok = rpc:call(Cp1, application, permit, [app2, true]),
test_server:sleep(1000),
- ?line false = is_started(app2, Cp1),
- ?line false = is_started(app2, Cp2),
- ?line false = is_started(app2, Cp3),
+ false = is_started(app2, Cp1),
+ false = is_started(app2, Cp2),
+ false = is_started(app2, Cp3),
%Permit a not loaded application
- ?line {error,{not_loaded,app3}} =
+ {error,{not_loaded,app3}} =
rpc:call(Cp1, application, permit, [app3, true]),
test_server:sleep(1000),
- ?line false = is_started(app3, Cp1),
- ?line false = is_started(app3, Cp2),
- ?line false = is_started(app3, Cp3),
+ false = is_started(app3, Cp1),
+ false = is_started(app3, Cp2),
+ false = is_started(app3, Cp3),
%Unpermit a not started application
- ?line ok = rpc:call(Cp1, application, permit, [app2, false]),
- ?line {[ok,ok,ok],[]} =
+ ok = rpc:call(Cp1, application, permit, [app2, false]),
+ {[ok,ok,ok],[]} =
rpc:multicall([Cp1, Cp2, Cp3], application, start, [app2, permanent]),
test_server:sleep(1000),
- ?line false = is_started(app2, Cp1),
- ?line false = is_started(app2, Cp2),
- ?line false = is_started(app2, Cp3),
+ false = is_started(app2, Cp1),
+ false = is_started(app2, Cp2),
+ false = is_started(app2, Cp3),
%Unpermit a not loaded application
- ?line {error,{not_loaded,app3}} =
+ {error,{not_loaded,app3}} =
rpc:call(Cp1, application, permit, [app3, false]),
- ?line {[ok,ok,ok],[]} =
+ {[ok,ok,ok],[]} =
rpc:multicall(Cps, application, load, [app3()]),
- ?line ?UNTIL(is_loaded(app3, Cps)),
- ?line {[ok,ok,ok],[]} =
+ ?UNTIL(is_loaded(app3, Cps)),
+ {[ok,ok,ok],[]} =
rpc:multicall(Cps, application, start, [app3, permanent]),
test_server:sleep(1000),
- ?line false = is_started(app3, Cp1),
- ?line false = is_started(app3, Cp2),
- ?line false = is_started(app3, Cp3),
+ false = is_started(app3, Cp1),
+ false = is_started(app3, Cp2),
+ false = is_started(app3, Cp3),
% Permit app1 on CP1 and make sure it is started
- ?line ok = rpc:call(Cp1, application, permit, [app1, true]),
- ?line ?UNTIL(is_started(app1, Cp1)),
- ?line false = is_started(app1, Cp2),
- ?line false = is_started(app1, Cp3),
+ ok = rpc:call(Cp1, application, permit, [app1, true]),
+ ?UNTIL(is_started(app1, Cp1)),
+ false = is_started(app1, Cp2),
+ false = is_started(app1, Cp3),
% Permit it again
- ?line ok = rpc:call(Cp1, application, permit, [app1, true]),
- ?line ?UNTIL(is_started(app1, Cp1)),
- ?line false = is_started(app1, Cp2),
- ?line false = is_started(app1, Cp3),
+ ok = rpc:call(Cp1, application, permit, [app1, true]),
+ ?UNTIL(is_started(app1, Cp1)),
+ false = is_started(app1, Cp2),
+ false = is_started(app1, Cp3),
% Permit app2 on CP1 and make sure it is started
- ?line ok = rpc:call(Cp1, application, permit, [app2, true]),
- ?line ?UNTIL(is_started(app2, Cp1)),
- ?line false = is_started(app2, Cp2),
- ?line false = is_started(app2, Cp3),
+ ok = rpc:call(Cp1, application, permit, [app2, true]),
+ ?UNTIL(is_started(app2, Cp1)),
+ false = is_started(app2, Cp2),
+ false = is_started(app2, Cp3),
% Permit app1 on CP2 and make sure it is not started
- ?line ok = rpc:call(Cp2, application, permit, [app1, true]),
+ ok = rpc:call(Cp2, application, permit, [app1, true]),
test_server:sleep(1000),
- ?line true = is_started(app1, Cp1),
- ?line false = is_started(app1, Cp2),
- ?line false = is_started(app1, Cp3),
+ true = is_started(app1, Cp1),
+ false = is_started(app1, Cp2),
+ false = is_started(app1, Cp3),
% Crash CP1 and make sure app1, but not app2, is started on CP2
stop_node_nice(Cp1),
- ?line ?UNTIL(is_started(app1, Cp2)),
- ?line false = is_started(app2, Cp2),
+ ?UNTIL(is_started(app1, Cp2)),
+ false = is_started(app2, Cp2),
% Restart CP1 again, check nothing is running on it
- ?line {ok, Cp1_2} = start_node_config(Ncp1, NoSyncTime, Conf),
- ?line global:sync(),
- ?line ok = rpc:call(Cp1_2, application, load, [app1()]),
- ?line ?UNTIL(is_loaded(app1, Cp1_2)),
- ?line ok = rpc:call(Cp1_2, application, start, [app1, permanent]),
- ?line ok = rpc:call(Cp1_2, application, load, [app2()]),
- ?line ?UNTIL(is_loaded(app2, Cp1_2)),
- ?line ok = rpc:call(Cp1_2, application, start, [app2, permanent]),
- ?line ok = rpc:call(Cp1_2, application, load, [app3()]),
- ?line ?UNTIL(is_loaded(app3, Cp1_2)),
- ?line ok = rpc:call(Cp1_2, application, start, [app3, permanent]),
- ?line false = is_started(app1, Cp1_2),
- ?line false = is_started(app2, Cp1_2),
+ {ok, Cp1_2} = start_node_config(Ncp1, NoSyncTime, Conf),
+ global:sync(),
+ ok = rpc:call(Cp1_2, application, load, [app1()]),
+ ?UNTIL(is_loaded(app1, Cp1_2)),
+ ok = rpc:call(Cp1_2, application, start, [app1, permanent]),
+ ok = rpc:call(Cp1_2, application, load, [app2()]),
+ ?UNTIL(is_loaded(app2, Cp1_2)),
+ ok = rpc:call(Cp1_2, application, start, [app2, permanent]),
+ ok = rpc:call(Cp1_2, application, load, [app3()]),
+ ?UNTIL(is_loaded(app3, Cp1_2)),
+ ok = rpc:call(Cp1_2, application, start, [app3, permanent]),
+ false = is_started(app1, Cp1_2),
+ false = is_started(app2, Cp1_2),
% Permit app3 on CP3 and make sure it is started
- ?line ok = rpc:call(Cp3, application, permit, [app3, true]),
- ?line ?UNTIL(is_started(app3, Cp3)),
- ?line false = is_started(app3, Cp1_2),
- ?line false = is_started(app3, Cp2),
+ ok = rpc:call(Cp3, application, permit, [app3, true]),
+ ?UNTIL(is_started(app3, Cp3)),
+ false = is_started(app3, Cp1_2),
+ false = is_started(app3, Cp2),
% Permit app3 on CP1 and make sure it is moved there from CP3
- ?line ok = rpc:call(Cp1_2, application, permit, [app3, true]),
- ?line ?UNTIL(is_started(app3, Cp1_2)),
- ?line false = is_started(app3, Cp2),
- ?line false = is_started(app3, Cp3),
+ ok = rpc:call(Cp1_2, application, permit, [app3, true]),
+ ?UNTIL(is_started(app3, Cp1_2)),
+ false = is_started(app3, Cp2),
+ false = is_started(app3, Cp3),
% Unpermit app3 on CP3 and CP1 and make sure it is stopped
- ?line ok = rpc:call(Cp3, application, permit, [app3, false]),
- ?line ok = rpc:call(Cp1_2, application, permit, [app3, false]),
- ?line ?UNTIL(false =:= is_started(app3, Cp1_2)),
- ?line false = is_started(app3, Cp2),
- ?line false = is_started(app3, Cp3),
+ ok = rpc:call(Cp3, application, permit, [app3, false]),
+ ok = rpc:call(Cp1_2, application, permit, [app3, false]),
+ ?UNTIL(false =:= is_started(app3, Cp1_2)),
+ false = is_started(app3, Cp2),
+ false = is_started(app3, Cp3),
stop_node_nice(Cp1_2),
stop_node_nice(Cp2),
@@ -937,23 +940,45 @@ nodedown_start(Conf) when is_list(Conf) ->
WithSyncTime = config_fun(config4(NodeNames)),
% Test [cp1, cp2]
- ?line {ok, Cp1} = start_node_config(Ncp1, NoSyncTime, Conf),
- ?line {ok, Cp2} = start_node_config(Ncp2, WithSyncTime, Conf),
- ?line wait_for_ready_net(),
+ {ok, Cp1} = start_node_config(Ncp1, NoSyncTime, Conf),
+ {ok, Cp2} = start_node_config(Ncp2, WithSyncTime, Conf),
+ wait_for_ready_net(),
% Start app1 and make sure cp1 starts it
- ?line {[ok,ok],[]} =
+ {[ok,ok],[]} =
rpc:multicall([Cp1, Cp2], application, load, [app1()]),
- ?line _ = rpc:cast(Cp2, application, start, [app1, permanent]),
+ _ = rpc:cast(Cp2, application, start, [app1, permanent]),
test_server:sleep(1000),
% Crash CP1 and make sure app1 is started on CP2
stop_node_nice(Cp1),
- ?line ?UNTIL(is_started(app1, Cp2)),
+ ?UNTIL(is_started(app1, Cp2)),
stop_node_nice(Cp2),
ok.
+
+ensure_started(suite) -> [];
+ensure_started(doc) -> ["Test application:ensure_started/1."];
+ensure_started(Conf) ->
+
+ {ok, Fd} = file:open("app1.app", [write]),
+ w_app1(Fd),
+ file:close(Fd),
+
+ ok = application:ensure_started(app1),
+ ok = application:ensure_started(app1),
+ {error, {already_started, app1}} = application:start(app1),
+ ok = application:stop(app1),
+ {error,{"no such file or directory", _ }} = application:ensure_started(hopefully_not_an_existing_app_file),
+
+ ok = application:ensure_started(app1, permanent),
+ ok = application:ensure_started(app1, permanent),
+ ok = application:stop(app1),
+ ok = application:unload(app1),
+ ok.
+
+
%%%-----------------------------------------------------------------
%%% Testing of reported bugs and other tickets.
%%%-----------------------------------------------------------------
@@ -970,9 +995,9 @@ otp_1586(Conf) when is_list(Conf) ->
{ok, Fd} = file:open(filename:join(Dir, "app5.app"), [write]),
w_app5(Fd),
file:close(Fd),
- ?line code:add_patha(Dir),
- ?line ok = application:load(app4()),
- ?line ok = application:unload(app4),
+ code:add_patha(Dir),
+ ok = application:load(app4()),
+ ok = application:unload(app4),
ok.
%%-----------------------------------------------------------------
@@ -989,24 +1014,24 @@ otp_2078(Conf) when is_list(Conf) ->
WithSyncTime = config_fun(config4(NodeNames)),
% Test [cp1, cp2]
- ?line {ok, Cp1} = start_node_config(Ncp1, NoSyncTime, Conf),
- ?line {ok, Cp2} = start_node_config(Ncp2, WithSyncTime, Conf),
+ {ok, Cp1} = start_node_config(Ncp1, NoSyncTime, Conf),
+ {ok, Cp2} = start_node_config(Ncp2, WithSyncTime, Conf),
Cps = [Cp1, Cp2],
- ?line wait_for_ready_net(),
+ wait_for_ready_net(),
% Start app1 and make sure cp1 starts it
- ?line {[ok,ok],[]} =
+ {[ok,ok],[]} =
rpc:multicall(Cps, application, load, [app1()]),
- ?line ?UNTIL(is_loaded(app1, Cps)),
- ?line ok = rpc:call(Cp1, application, start, [app1, permanent]),
- ?line ?UNTIL(is_started(app1, Cp1)),
- ?line false = is_started(app1, Cp2),
+ ?UNTIL(is_loaded(app1, Cps)),
+ ok = rpc:call(Cp1, application, start, [app1, permanent]),
+ ?UNTIL(is_started(app1, Cp1)),
+ false = is_started(app1, Cp2),
% Start app1 on cp2; make sure it works (the bug was that this start
% returned error)
- ?line ok = rpc:call(Cp2, application, start, [app1, permanent]),
- ?line true = is_started(app1, Cp1),
- ?line false = is_started(app1, Cp2),
+ ok = rpc:call(Cp2, application, start, [app1, permanent]),
+ true = is_started(app1, Cp1),
+ false = is_started(app1, Cp2),
stop_node_nice(Cp1),
stop_node_nice(Cp2),
@@ -1018,7 +1043,7 @@ otp_2012(doc) ->
otp_2012(Conf) when is_list(Conf) ->
%% start a help process to check the config change
CcPid = spawn_link(?MODULE, conf_change, []),
- ?line yes = global:register_name(conf_change, CcPid),
+ yes = global:register_name(conf_change, CcPid),
% Write a .app file
{ok, Fd} = file:open("app1.app", [write]),
@@ -1029,19 +1054,19 @@ otp_2012(Conf) when is_list(Conf) ->
file:close(Fd2),
% Start app1
- ?line ok = application:load(app1()),
- ?line ok = application:start(app1, permanent),
+ ok = application:load(app1()),
+ ok = application:start(app1, permanent),
%% Read the current configuration parameters, and change them
EnvBefore = application_controller:prep_config_change(),
application_controller:test_change_apps([app1],[[{app1,[{new1, hi},
{new2, moi}]}]]),
- ?line ok = application_controller:config_change(EnvBefore),
- ?line ok = get_conf_change([{[], [{new1, hi}, {new2, moi}], []}]),
+ ok = application_controller:config_change(EnvBefore),
+ ok = get_conf_change([{[], [{new1, hi}, {new2, moi}], []}]),
% Start app2
- ?line ok = application:load(app2()),
- ?line ok = application:start(app2, permanent),
+ ok = application:load(app2()),
+ ok = application:start(app2, permanent),
%% Read the current configuration parameters, and change them again
EnvBefore2 = application_controller:prep_config_change(),
@@ -1050,13 +1075,13 @@ otp_2012(Conf) when is_list(Conf) ->
application_controller:test_change_apps([app2],[[{app2,[{new1, si},
{new2, no}]}]]),
_EnvBefore22 = application_controller:prep_config_change(),
- ?line ok = application_controller:config_change(EnvBefore2),
+ ok = application_controller:config_change(EnvBefore2),
- ?line ok = get_conf_change([{[],[{new1,si},{new2,no}],[]},
+ ok = get_conf_change([{[],[{new1,si},{new2,no}],[]},
{[{new1,hello}],[{new3,mors}],[new2]}]),
- ?line ok = application:stop(app1),
- ?line ok = application:stop(app2),
+ ok = application:stop(app1),
+ ok = application:stop(app2),
ok.
%%-----------------------------------------------------------------
@@ -1067,24 +1092,24 @@ otp_2718(suite) -> [];
otp_2718(doc) ->
["Test fail of transient app at start."];
otp_2718(Conf) when is_list(Conf) ->
- ?line {ok, Cp1} = start_node_args(cp1, "-pa " ++ ?config(data_dir,Conf)),
- ?line wait_for_ready_net(),
+ {ok, Cp1} = start_node_args(cp1, "-pa " ++ ?config(data_dir,Conf)),
+ wait_for_ready_net(),
%% normal exit from the application
- ?line ok = rpc:call(Cp1, application, load, [app_trans_normal()]),
- ?line ?UNTIL(is_loaded(trans_normal, Cp1)),
- ?line {error, {{'EXIT',normal},_}} =
+ ok = rpc:call(Cp1, application, load, [app_trans_normal()]),
+ ?UNTIL(is_loaded(trans_normal, Cp1)),
+ {error, {{'EXIT',normal},_}} =
rpc:call(Cp1, application, start, [trans_normal, transient]),
test_server:sleep(2000),
- ?line false = is_started(trans_normal, Cp1),
+ false = is_started(trans_normal, Cp1),
%% abnormal exit from the application
- ?line ok = rpc:call(Cp1, application, load, [app_trans_abnormal()]),
- ?line {error, {bad_return,{{trans_abnormal_sup,start,[normal,[]]},
+ ok = rpc:call(Cp1, application, load, [app_trans_abnormal()]),
+ {error, {bad_return,{{trans_abnormal_sup,start,[normal,[]]},
{'EXIT',abnormal}}}} =
rpc:call(Cp1, application, start, [trans_abnormal, transient]),
test_server:sleep(3000),
- ?line {badrpc,nodedown} = which_applications(Cp1),
+ {badrpc,nodedown} = which_applications(Cp1),
ok.
%%-----------------------------------------------------------------
@@ -1100,65 +1125,65 @@ otp_2973(Conf) when is_list(Conf) ->
w_app(Fd, app0()),
file:close(Fd),
- ?line Pid1 = spawn_link(?MODULE, init2973, []),
- ?line Pid2 = spawn_link(?MODULE, init2973, []),
+ Pid1 = spawn_link(?MODULE, init2973, []),
+ Pid2 = spawn_link(?MODULE, init2973, []),
- ?line Pid1 ! {start, self(), app0},
- ?line Pid2 ! {start, self(), app0},
+ Pid1 ! {start, self(), app0},
+ Pid2 ! {start, self(), app0},
- ?line {Res1, Res2} = receive
+ {Res1, Res2} = receive
{Pid1, res, Res1x} ->
receive
{Pid2, res, Res2x} ->
{Res1x, Res2x}
after 2000 ->
- ?line test_server:fail(timeout_pid2)
+ test_server:fail(timeout_pid2)
end;
{Pid2, res, Res2x} ->
receive
{Pid1, res, Res1x} ->
{Res1x, Res2x}
after 2000 ->
- ?line test_server:fail(timeout_pid1)
+ test_server:fail(timeout_pid1)
end
end,
%% Stop it. Inteferes with other global.
- ?line ok = application:stop(app0),
+ ok = application:stop(app0),
%% Test result.
case {Res1, Res2} of
{ok, ok} ->
ok;
_ ->
- ?line Txt = io_lib:format("Illegal results from start: ~p ~p ",
+ Txt = io_lib:format("Illegal results from start: ~p ~p ",
[Res1, Res2]),
- ?line test_server:fail(lists:flatten(Txt))
+ test_server:fail(lists:flatten(Txt))
end,
% Write a .app file
- ?line {ok, Fda} = file:open("app_start_error.app", [write]),
- ?line w_app_start_error(Fda),
- ?line file:close(Fda),
+ {ok, Fda} = file:open("app_start_error.app", [write]),
+ w_app_start_error(Fda),
+ file:close(Fda),
- ?line Pid1 ! {start, self(), app_start_error},
- ?line Pid2 ! {start, self(), app_start_error},
+ Pid1 ! {start, self(), app_start_error},
+ Pid2 ! {start, self(), app_start_error},
- ?line {Res1a, Res2a} = receive
+ {Res1a, Res2a} = receive
{Pid1, res, Res1y} ->
receive
{Pid2, res, Res2y} ->
{Res1y, Res2y}
after 2000 ->
- ?line test_server:fail(timeout_pid2)
+ test_server:fail(timeout_pid2)
end;
{Pid2, res, Res2y} ->
receive
{Pid1, res, Res1y} ->
{Res1y, Res2y}
after 2000 ->
- ?line test_server:fail(timeout_pid1)
+ test_server:fail(timeout_pid1)
end
end,
@@ -1167,8 +1192,8 @@ otp_2973(Conf) when is_list(Conf) ->
{error,{'start error',{app_start_error,start,[normal,[]]}}}} ->
ok;
_ ->
- ?line Txta = io_lib:format("Illegal results from start ~p ~p ",[Res1a, Res2a]),
- ?line test_server:fail(lists:flatten(Txta))
+ Txta = io_lib:format("Illegal results from start ~p ~p ",[Res1a, Res2a]),
+ test_server:fail(lists:flatten(Txta))
end,
ok.
@@ -1190,34 +1215,34 @@ otp_3184(Conf) when is_list(Conf) ->
WithSyncTime = config_fun(config3184(NodeNames)),
% Test [cp1, cp2]
- ?line {ok, Cp1} = start_node_config(Ncp1, NoSyncTime, Conf),
- ?line {ok, Cp2} = start_node_config(Ncp2, WithSyncTime, Conf),
- ?line wait_for_ready_net(),
+ {ok, Cp1} = start_node_config(Ncp1, NoSyncTime, Conf),
+ {ok, Cp2} = start_node_config(Ncp2, WithSyncTime, Conf),
+ wait_for_ready_net(),
% Start app1 and make sure it is not started
- ?line {[ok,ok],[]} =
+ {[ok,ok],[]} =
rpc:multicall([Cp1, Cp2], application, load, [app1()]),
test_server:sleep(3000),
- ?line false = is_started(app1, Cp1),
- ?line false = is_started(app1, Cp2),
+ false = is_started(app1, Cp1),
+ false = is_started(app1, Cp2),
% Start app1 on cp1
- ?line ok = rpc:call(Cp1, application, permit, [app1, true]),
- ?line ok = rpc:call(Cp1, application, start, [app1, permanent]),
- ?line ok = rpc:call(Cp2, application, start, [app1, permanent]),
- ?line ?UNTIL(is_started(app1, Cp1)),
- ?line false = is_started(app1, Cp2),
+ ok = rpc:call(Cp1, application, permit, [app1, true]),
+ ok = rpc:call(Cp1, application, start, [app1, permanent]),
+ ok = rpc:call(Cp2, application, start, [app1, permanent]),
+ ?UNTIL(is_started(app1, Cp1)),
+ false = is_started(app1, Cp2),
% Check that the application is marked as running in application_controller
- ?line X = rpc:call(Cp1, application_controller, info, []),
- ?line {value, {running, Xrunning}} = lists:keysearch(running, 1, X),
- ?line {value, Xapp1} = lists:keysearch(app1, 1, Xrunning),
- ?line {app1, _Xpid} = Xapp1,
+ X = rpc:call(Cp1, application_controller, info, []),
+ {value, {running, Xrunning}} = lists:keysearch(running, 1, X),
+ {value, Xapp1} = lists:keysearch(app1, 1, Xrunning),
+ {app1, _Xpid} = Xapp1,
- ?line Y = rpc:call(Cp2, application_controller, info, []),
- ?line {value, {running, Yrunning}} = lists:keysearch(running, 1, Y),
- ?line {value, Yapp1} = lists:keysearch(app1, 1, Yrunning),
- ?line {app1, {distributed, Cp1}} = Yapp1,
+ Y = rpc:call(Cp2, application_controller, info, []),
+ {value, {running, Yrunning}} = lists:keysearch(running, 1, Y),
+ {value, Yapp1} = lists:keysearch(app1, 1, Yrunning),
+ {app1, {distributed, Cp1}} = Yapp1,
stop_node_nice(Cp1),
stop_node_nice(Cp2),
@@ -1232,26 +1257,26 @@ otp_3002(doc) ->
["crash the node if permanent appl has illegal env parameter values."];
otp_3002(Conf) when is_list(Conf) ->
% Create the boot script
- ?line {{KernelVer,StdlibVer}, {LatestDir, LatestName}} =
+ {{KernelVer,StdlibVer}, {LatestDir, LatestName}} =
create_script_3002("script_3002"),
?t:format(0, "LatestDir = ~p~n", [LatestDir]),
?t:format(0, "LatestName = ~p~n", [LatestName]),
- ?line case is_real_system(KernelVer, StdlibVer) of
+ case is_real_system(KernelVer, StdlibVer) of
true ->
Options = [];
false ->
Options = [local]
end,
- ?line ok = systools:make_script("script_3002", Options),
- ?line ok = systools:script2boot("script_3002"),
+ ok = systools:make_script("script_3002", Options),
+ ok = systools:script2boot("script_3002"),
- ?line {error, timeout} = start_node_boot_3002(cp1, "script_3002"),
+ {error, timeout} = start_node_boot_3002(cp1, "script_3002"),
- ?line ok = file:delete("script_3002.boot"),
- ?line ok = file:delete("script_3002.rel"),
- ?line ok = file:delete("script_3002.script"),
+ ok = file:delete("script_3002.boot"),
+ ok = file:delete("script_3002.rel"),
+ ok = file:delete("script_3002.script"),
ok.
%%-----------------------------------------------------------------
@@ -1273,51 +1298,51 @@ otp_4066(Conf) when is_list(Conf) ->
App1Nodes = {app1, AllNodes},
Dir = ?config(priv_dir,Conf),
- ?line {ok, FdC} = file:open(filename:join(Dir, "otp_4066.config"), [write]),
- ?line write_config(FdC, config_4066(AllNodes, 5000, [App1Nodes])),
- ?line file:close(FdC),
+ {ok, FdC} = file:open(filename:join(Dir, "otp_4066.config"), [write]),
+ write_config(FdC, config_4066(AllNodes, 5000, [App1Nodes])),
+ file:close(FdC),
% Write the app1.app file
- ?line {ok, FdA12} = file:open(filename:join(Dir, "app1.app"), [write]),
- ?line w_app1(FdA12),
- ?line file:close(FdA12),
+ {ok, FdA12} = file:open(filename:join(Dir, "app1.app"), [write]),
+ w_app1(FdA12),
+ file:close(FdA12),
Args1 = "-pa " ++ Dir ++ " -config " ++ filename:join(Dir, "otp_4066"),
Args2 = "-pa " ++ Dir ++ " -kernel start_dist_ac true",
- ?line {ok, Cp2} = start_node_args(Ncp2, Args2),
+ {ok, Cp2} = start_node_args(Ncp2, Args2),
%% Cp1 syncs with cp2 (which is known to be up).
- ?line {ok, Cp1} = start_node_args(Ncp1, Args1),
- ?line wait_for_ready_net(),
+ {ok, Cp1} = start_node_args(Ncp1, Args1),
+ wait_for_ready_net(),
- ?line ok = rpc:call(Cp1, application, start, [app1]),
- ?line wait_until_started(app1, [Cp1]),
- ?line test_server:format("--- App1 started at Cp1 ---~n", []),
- ?line print_dac_state(AllNodes),
+ ok = rpc:call(Cp1, application, start, [app1]),
+ wait_until_started(app1, [Cp1]),
+ test_server:format("--- App1 started at Cp1 ---~n", []),
+ print_dac_state(AllNodes),
% Cp2 previously crashed on this stop
- ?line ok = rpc:call(Cp1, application, stop, [app1]),
- ?line wait_until_stopped(app1, [Cp1]),
- ?line test_server:format("--- App1 stopped at Cp1 ---~n", []),
- ?line print_dac_state(AllNodes),
+ ok = rpc:call(Cp1, application, stop, [app1]),
+ wait_until_stopped(app1, [Cp1]),
+ test_server:format("--- App1 stopped at Cp1 ---~n", []),
+ print_dac_state(AllNodes),
- ?line ok = rpc:call(Cp1, application, start, [app1]),
- ?line wait_until_started(app1, [Cp1]),
- ?line test_server:format("--- App1 started at Cp1 ---~n", []),
- ?line print_dac_state(AllNodes),
+ ok = rpc:call(Cp1, application, start, [app1]),
+ wait_until_started(app1, [Cp1]),
+ test_server:format("--- App1 started at Cp1 ---~n", []),
+ print_dac_state(AllNodes),
- ?line ok = rpc:call(Cp2, application, load, [app1, App1Nodes]),
- ?line ok = rpc:call(Cp2, application, start, [app1]),
- ?line test_server:format("--- App1 started at Cp2 ---~n", []),
- ?line print_dac_state(AllNodes),
+ ok = rpc:call(Cp2, application, load, [app1, App1Nodes]),
+ ok = rpc:call(Cp2, application, start, [app1]),
+ test_server:format("--- App1 started at Cp2 ---~n", []),
+ print_dac_state(AllNodes),
- ?line stop_node_nice(Cp1),
- ?line wait_until_started(app1, [Cp2]),
- ?line test_server:format("--- Cp1 crashed; failover to Cp2 ---~n", []),
- ?line print_dac_state(Cp2),
+ stop_node_nice(Cp1),
+ wait_until_started(app1, [Cp2]),
+ test_server:format("--- Cp1 crashed; failover to Cp2 ---~n", []),
+ print_dac_state(Cp2),
- ?line stop_node_nice(Cp2),
+ stop_node_nice(Cp2),
ok.
config_4066(SyncNodesOptional, SyncNodesTimeout, Distributed) ->
@@ -1349,34 +1374,34 @@ otp_4227(Conf) when is_list(Conf) ->
WithSyncTime = config_fun(config_4227(NodeNames)),
%% Test [cp1, cp2]
- ?line {ok, Cp1} = start_node_config(Ncp1, NoSyncTime, Conf),
- ?line {ok, Cp2} = start_node_config(Ncp2, WithSyncTime, Conf),
+ {ok, Cp1} = start_node_config(Ncp1, NoSyncTime, Conf),
+ {ok, Cp2} = start_node_config(Ncp2, WithSyncTime, Conf),
Cps = [Cp1, Cp2],
- ?line wait_for_ready_net(),
+ wait_for_ready_net(),
%% Try to start app10 which should fail since app9 is not started
- ?line {[ok,ok],[]} =
+ {[ok,ok],[]} =
rpc:multicall(Cps, application, load, [app9()]),
- ?line ?UNTIL(is_loaded(app9, Cps)),
- ?line {[ok,ok],[]} =
+ ?UNTIL(is_loaded(app9, Cps)),
+ {[ok,ok],[]} =
rpc:multicall(Cps, application, load, [app10_dep9()]),
- ?line {error, {not_started, app9}} =
+ {error, {not_started, app9}} =
rpc:call(Cp1, application, start, [app10]),
%% Start app9 and brutally kill it, then try to start app10
- ?line ok = rpc:call(Cp1, application, start, [app9]),
- ?line test_server:sleep(1000),
- ?line Pid9 = rpc:call(Cp1, erlang, whereis, [ch_sup19]),
- ?line true = erlang:is_pid(Pid9),
- ?line true = erlang:exit(Pid9, kill),
- ?line test_server:sleep(1000),
+ ok = rpc:call(Cp1, application, start, [app9]),
+ test_server:sleep(1000),
+ Pid9 = rpc:call(Cp1, erlang, whereis, [ch_sup19]),
+ true = erlang:is_pid(Pid9),
+ true = erlang:exit(Pid9, kill),
+ test_server:sleep(1000),
%% This gave {error, no_report} before the patch
- ?line {error, {not_running, app9}} =
+ {error, {not_running, app9}} =
rpc:call(Cp1, application, start, [app10]),
- ?line stop_node_nice(Cp1),
- ?line stop_node_nice(Cp2),
+ stop_node_nice(Cp1),
+ stop_node_nice(Cp2),
ok.
config_4227([Ncp1, Ncp2]) ->
@@ -1410,18 +1435,18 @@ otp_5363(Conf) when is_list(Conf) ->
OldPath = code:get_path(),
code:add_patha(?config(data_dir,Conf)),
try
- ?line ok = application:load(app_group_leader()),
- ?line ok = application:start(group_leader),
- ?line case whereis(nisse) of
+ ok = application:load(app_group_leader()),
+ ok = application:start(group_leader),
+ case whereis(nisse) of
Pid when is_pid(Pid) ->
- ?line Mref = erlang:monitor(process, Pid),
- ?line ok = application:stop(group_leader),
+ Mref = erlang:monitor(process, Pid),
+ ok = application:stop(group_leader),
receive
{'DOWN',Mref,_,_,_} -> ok
end,
- ?line undefined = whereis(nisse);
+ undefined = whereis(nisse);
Bad ->
- ?line io:format("~p\n", [Bad]),
+ io:format("~p\n", [Bad]),
?t:fail()
end
after
@@ -1448,25 +1473,25 @@ otp_5606(Conf) when is_list(Conf) ->
Config = filename:join(Dir, "sys"),
%% Test [cp1, cp2]
- ?line {ok, Cp1} = start_node(Ncp1, Config),
- ?line {ok, Cp2} = start_node(Ncp2, Config),
+ {ok, Cp1} = start_node(Ncp1, Config),
+ {ok, Cp2} = start_node(Ncp2, Config),
Cps = [Cp1, Cp2],
- ?line wait_for_ready_net(),
+ wait_for_ready_net(),
%% Load app1 on both nodes
- ?line {[ok, ok], []} =
+ {[ok, ok], []} =
rpc:multicall(Cps, application, load, [app1()]),
%% Attempt to start app1 from different processes simultaneously
- ?line Pid11 = spawn_link(Cp1, ?MODULE, loop5606, [self()]),
- ?line Pid12 = spawn_link(Cp1, ?MODULE, loop5606, [self()]),
- ?line Pid13 = spawn_link(Cp1, ?MODULE, loop5606, [self()]),
- ?line Pid2 = spawn_link(Cp2, ?MODULE, loop5606, [self()]),
+ Pid11 = spawn_link(Cp1, ?MODULE, loop5606, [self()]),
+ Pid12 = spawn_link(Cp1, ?MODULE, loop5606, [self()]),
+ Pid13 = spawn_link(Cp1, ?MODULE, loop5606, [self()]),
+ Pid2 = spawn_link(Cp2, ?MODULE, loop5606, [self()]),
- ?line Pid2 ! start,
- ?line Pid11 ! start,
- ?line Pid12 ! start,
- ?line Pid13 ! start,
+ Pid2 ! start,
+ Pid11 ! start,
+ Pid12 ! start,
+ Pid13 ! start,
ResL = otp_5606_loop([]),
@@ -1476,10 +1501,10 @@ otp_5606(Conf) when is_list(Conf) ->
[Res1, Res2, Res3, Res4] ->
Txt = io_lib:format("Illegal results from start ~p ~p ~p ~p",
[Res1, Res2, Res3, Res4]),
- ?line test_server:fail(lists:flatten(Txt))
+ test_server:fail(lists:flatten(Txt))
end,
- ?line {error, {already_started, app1}} =
+ {error, {already_started, app1}} =
rpc:call(Cp1, application, start, [app1]),
stop_node_nice(Cp1),
@@ -1491,7 +1516,7 @@ otp_5606_loop(ResL) when length(ResL)<4 ->
{_Pid, Res} ->
otp_5606_loop([Res|ResL])
after 5000 ->
- ?line test_server:fail(timeout_waiting_for_res)
+ test_server:fail(timeout_waiting_for_res)
end;
otp_5606_loop(ResL) ->
ResL.
@@ -1525,34 +1550,34 @@ get_key(Conf) when is_list(Conf) ->
WithSyncTime = config_fun(config_inc(NodeNames)),
% Test [cp1, cp2, cp3]
- ?line {ok, Cp1} = start_node_config(Ncp1, WithSyncTime, Conf),
+ {ok, Cp1} = start_node_config(Ncp1, WithSyncTime, Conf),
- ?line ok = rpc:call(Cp1, application, load, [appinc(), d3(NodeNames)]),
- ?line ?UNTIL(is_loaded(appinc, Cp1)),
- ?line ok = rpc:call(Cp1, application, start, [appinc, permanent]),
- ?line ?UNTIL(is_started(appinc, Cp1)),
+ ok = rpc:call(Cp1, application, load, [appinc(), d3(NodeNames)]),
+ ?UNTIL(is_loaded(appinc, Cp1)),
+ ok = rpc:call(Cp1, application, start, [appinc, permanent]),
+ ?UNTIL(is_started(appinc, Cp1)),
- ?line {ok, "Test of new app file, including appnew"} =
+ {ok, "Test of new app file, including appnew"} =
rpc:call(Cp1, application, get_key, [appinc, description]),
- ?line {ok, "CXC 138 ai"} = rpc:call(Cp1, application, get_key, [appinc ,id]),
- ?line {ok, "2.0"} = rpc:call(Cp1, application, get_key, [appinc, vsn]),
- ?line {ok, [kernel]} = rpc:call(Cp1, application, get_key, [appinc, applications]),
- ?line {ok, [appinc1, appinc2]} =
+ {ok, "CXC 138 ai"} = rpc:call(Cp1, application, get_key, [appinc ,id]),
+ {ok, "2.0"} = rpc:call(Cp1, application, get_key, [appinc, vsn]),
+ {ok, [kernel]} = rpc:call(Cp1, application, get_key, [appinc, applications]),
+ {ok, [appinc1, appinc2]} =
rpc:call(Cp1, application, get_key, [appinc, included_applications]),
- ?line {ok, []} = rpc:call(Cp1, application, get_key, [appinc, registered]),
- ?line {ok, [{init, [kalle]}, {takeover, []}, {go, [sune]}]} =
+ {ok, []} = rpc:call(Cp1, application, get_key, [appinc, registered]),
+ {ok, [{init, [kalle]}, {takeover, []}, {go, [sune]}]} =
rpc:call(Cp1, application, get_key, [appinc, start_phases]),
- ?line {ok, Env} = rpc:call(Cp1, application, get_key, [appinc ,env]),
- ?line [{included_applications,[appinc1,appinc2]},
+ {ok, Env} = rpc:call(Cp1, application, get_key, [appinc ,env]),
+ [{included_applications,[appinc1,appinc2]},
{own2,val2},{own_env1,value1}] = lists:sort(Env),
- ?line {ok, []} = rpc:call(Cp1, application, get_key, [appinc, modules]),
- ?line {ok, {application_starter, [ch_sup, {appinc, 41, 43}] }} =
+ {ok, []} = rpc:call(Cp1, application, get_key, [appinc, modules]),
+ {ok, {application_starter, [ch_sup, {appinc, 41, 43}] }} =
rpc:call(Cp1, application, get_key, [appinc, mod]),
- ?line {ok, infinity} = rpc:call(Cp1, application, get_key, [appinc, maxP]),
- ?line {ok, infinity} = rpc:call(Cp1, application, get_key, [appinc, maxT]),
- ?line undefined = rpc:call(Cp1, application, get_key, [appinc, very_unknown]),
+ {ok, infinity} = rpc:call(Cp1, application, get_key, [appinc, maxP]),
+ {ok, infinity} = rpc:call(Cp1, application, get_key, [appinc, maxT]),
+ undefined = rpc:call(Cp1, application, get_key, [appinc, very_unknown]),
- ?line {ok, [{description, "Test of new app file, including appnew"},
+ {ok, [{description, "Test of new app file, including appnew"},
{id, "CXC 138 ai"},
{vsn, "2.0"},
{modules, []},
@@ -1565,40 +1590,40 @@ get_key(Conf) when is_list(Conf) ->
{mod, {application_starter, [ch_sup, {appinc, 41, 43}] }},
{start_phases, [{init, [kalle]}, {takeover, []}, {go, [sune]}]}]} =
rpc:call(Cp1, application, get_all_key, [appinc]),
- ?line [{included_applications,[appinc1,appinc2]},
+ [{included_applications,[appinc1,appinc2]},
{own2,val2},{own_env1,value1}] = lists:sort(Env),
- ?line {ok, "Test of new app file, including appnew"} =
+ {ok, "Test of new app file, including appnew"} =
gen_server:call({global, {ch,41}}, {get_pid_key, description}),
- ?line {ok, "CXC 138 ai"} =
+ {ok, "CXC 138 ai"} =
gen_server:call({global, {ch,41}}, {get_pid_key, id}),
- ?line {ok, "2.0"} =
+ {ok, "2.0"} =
gen_server:call({global, {ch,41}}, {get_pid_key, vsn}),
- ?line {ok, [kernel]} =
+ {ok, [kernel]} =
gen_server:call({global, {ch,41}}, {get_pid_key, applications}),
- ?line {ok, [appinc1, appinc2]} =
+ {ok, [appinc1, appinc2]} =
gen_server:call({global, {ch,41}}, {get_pid_key, included_applications}),
- ?line {ok, []} =
+ {ok, []} =
gen_server:call({global, {ch,41}}, {get_pid_key, registered}),
- ?line {ok, [{init, [kalle]}, {takeover, []}, {go, [sune]}]} =
+ {ok, [{init, [kalle]}, {takeover, []}, {go, [sune]}]} =
gen_server:call({global, {ch,41}}, {get_pid_key, start_phases}),
- ?line {ok, Env} = gen_server:call({global, {ch,41}}, {get_pid_key, env}),
- ?line [{included_applications,[appinc1,appinc2]},
+ {ok, Env} = gen_server:call({global, {ch,41}}, {get_pid_key, env}),
+ [{included_applications,[appinc1,appinc2]},
{own2,val2},{own_env1,value1}] = lists:sort(Env),
- ?line {ok, []} =
+ {ok, []} =
gen_server:call({global, {ch,41}}, {get_pid_key, modules}),
- ?line {ok, {application_starter, [ch_sup, {appinc, 41, 43}] }} =
+ {ok, {application_starter, [ch_sup, {appinc, 41, 43}] }} =
gen_server:call({global, {ch,41}}, {get_pid_key, mod}),
- ?line {ok, infinity} =
+ {ok, infinity} =
gen_server:call({global, {ch,41}}, {get_pid_key, maxP}),
- ?line {ok, infinity} =
+ {ok, infinity} =
gen_server:call({global, {ch,41}}, {get_pid_key, maxT}),
- ?line undefined =
+ undefined =
gen_server:call({global, {ch,41}}, {get_pid_key, very_unknown}),
- ?line {ok, [{description, "Test of new app file, including appnew"},
+ {ok, [{description, "Test of new app file, including appnew"},
{id, "CXC 138 ai"},
{vsn, "2.0"},
{modules, []},
@@ -1611,7 +1636,7 @@ get_key(Conf) when is_list(Conf) ->
{mod, {application_starter, [ch_sup, {appinc, 41, 43}] }},
{start_phases, [{init, [kalle]}, {takeover, []}, {go, [sune]}]}]} =
gen_server:call({global, {ch,41}}, get_pid_all_key),
- ?line [{included_applications,[appinc1,appinc2]},
+ [{included_applications,[appinc1,appinc2]},
{own2,val2},{own_env1,value1}] = lists:sort(Env),
stop_node_nice(Cp1),
@@ -1628,81 +1653,81 @@ distr_changed_tc1(Conf) when is_list(Conf) ->
{OldKernel, OldEnv, {Cp1, Cp2, Cp3}, {_Ncp1, _Ncp2, _Ncp3}, _Config2} =
distr_changed_prep(Conf),
- ?line NewDist = {distributed, [{app1, [Cp3]},
+ NewDist = {distributed, [{app1, [Cp3]},
{app2, 5000, [Cp2]},
{app3, [Cp3, {Cp1, Cp2}]},
{app6, [Cp1, {Cp3, Cp2}]},
{app7, 1000, [Cp3]},
{app8, [Cp1, {Cp2, Cp3}]}]},
- ?line NewKernel = [{kernel, lists:keyreplace(distributed, 1, OldKernel, NewDist)}],
- ?line ok = rpc:call(Cp1, application_controller, test_change_apps,
+ NewKernel = [{kernel, lists:keyreplace(distributed, 1, OldKernel, NewDist)}],
+ ok = rpc:call(Cp1, application_controller, test_change_apps,
[[kernel], [NewKernel]]),
- ?line ok = rpc:call(Cp2, application_controller, test_change_apps,
+ ok = rpc:call(Cp2, application_controller, test_change_apps,
[[kernel], [NewKernel]]),
- ?line ok = rpc:call(Cp3, application_controller, test_change_apps,
+ ok = rpc:call(Cp3, application_controller, test_change_apps,
[[kernel], [NewKernel]]),
- ?line {[ok,ok,ok],[]} =
+ {[ok,ok,ok],[]} =
rpc:multicall([Cp1, Cp2, Cp3],
application_controller, config_change, [OldEnv]),
- ?line test_server:sleep(7000),
+ test_server:sleep(7000),
- ?line DcInfo1 = rpc:call(Cp1, dist_ac, info, []),
- ?line DcInfo2 = rpc:call(Cp2, dist_ac, info, []),
- ?line DcInfo3 = rpc:call(Cp3, dist_ac, info, []),
+ DcInfo1 = rpc:call(Cp1, dist_ac, info, []),
+ DcInfo2 = rpc:call(Cp2, dist_ac, info, []),
+ DcInfo3 = rpc:call(Cp3, dist_ac, info, []),
- ?line DcWa1 = which_applications(Cp1),
- ?line DcWa2 = which_applications(Cp2),
- ?line DcWa3 = which_applications(Cp3),
+ DcWa1 = which_applications(Cp1),
+ DcWa2 = which_applications(Cp2),
+ DcWa3 = which_applications(Cp3),
- ?line Wa1 = lists:foldl(fun({A1, _N1, _V1}, AccIn) -> [A1 | AccIn] end,
+ Wa1 = lists:foldl(fun({A1, _N1, _V1}, AccIn) -> [A1 | AccIn] end,
[], DcWa1),
- ?line Wa2 = lists:foldl(fun({A2, _N2, _V2}, AccIn) -> [A2 | AccIn] end,
+ Wa2 = lists:foldl(fun({A2, _N2, _V2}, AccIn) -> [A2 | AccIn] end,
[], DcWa2),
- ?line Wa3 = lists:foldl(fun({A3, _N3, _V3}, AccIn) -> [A3 | AccIn] end,
+ Wa3 = lists:foldl(fun({A3, _N3, _V3}, AccIn) -> [A3 | AccIn] end,
[], DcWa3),
- ?line case lists:sort(Wa1) of
+ case lists:sort(Wa1) of
[app1, app2, app3, kernel, stdlib] ->
ok;
EWa1 ->
X1 = io_lib:format("distribution error: Cp1 ~p ",[EWa1]),
- ?line test_server:fail(lists:flatten(X1))
+ test_server:fail(lists:flatten(X1))
end,
- ?line case lists:sort(Wa2) of
+ case lists:sort(Wa2) of
[app6, app8, kernel, stdlib] ->
ok;
EWa2 ->
X2 = io_lib:format("distribution error: Cp2 ~p ",[EWa2]),
- ?line test_server:fail(lists:flatten(X2))
+ test_server:fail(lists:flatten(X2))
end,
- ?line case lists:sort(Wa3) of
+ case lists:sort(Wa3) of
[app7, kernel, stdlib] ->
ok;
EWa3 ->
X3 = io_lib:format("distribution error: Cp3 ~p ",[EWa3]),
- ?line test_server:fail(lists:flatten(X3))
+ test_server:fail(lists:flatten(X3))
end,
- ?line DcInfo1n = rpc:call(Cp1, dist_ac, info, []),
- ?line DcInfo2n = rpc:call(Cp2, dist_ac, info, []),
- ?line DcInfo3n = rpc:call(Cp3, dist_ac, info, []),
+ DcInfo1n = rpc:call(Cp1, dist_ac, info, []),
+ DcInfo2n = rpc:call(Cp2, dist_ac, info, []),
+ DcInfo3n = rpc:call(Cp3, dist_ac, info, []),
%% Added afterwards. Got rid of some warnings for unused variables.
- ?line true = DcInfo1 =:= DcInfo1n,
- ?line true = DcInfo2 =:= DcInfo2n,
- ?line true = DcInfo3 =:= DcInfo3n,
+ true = DcInfo1 =:= DcInfo1n,
+ true = DcInfo2 =:= DcInfo2n,
+ true = DcInfo3 =:= DcInfo3n,
stop_node_nice(Cp1),
stop_node_nice(Cp2),
stop_node_nice(Cp3),
- ?line ok = file:delete("dc.boot"),
- ?line ok = file:delete("dc.rel"),
- ?line ok = file:delete("dc.script"),
+ ok = file:delete("dc.boot"),
+ ok = file:delete("dc.rel"),
+ ok = file:delete("dc.script"),
ok.
@@ -1714,103 +1739,103 @@ distr_changed_tc2(Conf) when is_list(Conf) ->
{OldKernel, OldEnv, {Cp1, Cp2, Cp3}, {Ncp1, _Ncp2, _Ncp3}, Config2} =
distr_changed_prep(Conf),
- ?line NewDist = {distributed, [{app1, [Cp3]},
+ NewDist = {distributed, [{app1, [Cp3]},
{app2, 5000, [Cp2]},
{app3, [Cp3, {Cp1, Cp2}]},
{app6, [Cp1, {Cp3, Cp2}]},
{app7, 1000, [Cp3]},
{app8, [Cp1, {Cp2, Cp3}]}]},
- ?line NewKernel = [{kernel, lists:keyreplace(distributed, 1, OldKernel, NewDist)}],
- ?line ok = rpc:call(Cp1, application_controller, test_change_apps,
+ NewKernel = [{kernel, lists:keyreplace(distributed, 1, OldKernel, NewDist)}],
+ ok = rpc:call(Cp1, application_controller, test_change_apps,
[[kernel], [NewKernel]]),
- ?line ok = rpc:call(Cp2, application_controller, test_change_apps,
+ ok = rpc:call(Cp2, application_controller, test_change_apps,
[[kernel], [NewKernel]]),
- ?line ok = rpc:call(Cp3, application_controller, test_change_apps,
+ ok = rpc:call(Cp3, application_controller, test_change_apps,
[[kernel], [NewKernel]]),
- ?line {[ok,ok,ok],[]} =
+ {[ok,ok,ok],[]} =
rpc:multicall([Cp1, Cp2, Cp3],
application_controller, config_change, [OldEnv]),
- ?line test_server:sleep(4000),
- ?line stop_node_nice(Cp1),
- ?line test_server:sleep(10000),
+ test_server:sleep(4000),
+ stop_node_nice(Cp1),
+ test_server:sleep(10000),
-% ?line _DcInfo1 = rpc:call(Cp1, dist_ac, info, []),
- ?line _DcInfo2 = rpc:call(Cp2, dist_ac, info, []),
- ?line _DcInfo3 = rpc:call(Cp3, dist_ac, info, []),
+% _DcInfo1 = rpc:call(Cp1, dist_ac, info, []),
+ _DcInfo2 = rpc:call(Cp2, dist_ac, info, []),
+ _DcInfo3 = rpc:call(Cp3, dist_ac, info, []),
% ?t:format(0,"#### DcInfo1 ~n~p~n",[_DcInfo1]),
-% ?line DcWa1 = which_applications(Cp1),
- ?line DcWa2 = which_applications(Cp2),
- ?line DcWa3 = which_applications(Cp3),
+% DcWa1 = which_applications(Cp1),
+ DcWa2 = which_applications(Cp2),
+ DcWa3 = which_applications(Cp3),
-% ?line Wa1 = lists:foldl(fun({A1, _N1, _V1}, AccIn) -> [A1 | AccIn] end,
+% Wa1 = lists:foldl(fun({A1, _N1, _V1}, AccIn) -> [A1 | AccIn] end,
% [], DcWa1),
- ?line Wa2 = lists:foldl(fun({A2, _N2, _V2}, AccIn) -> [A2 | AccIn] end,
+ Wa2 = lists:foldl(fun({A2, _N2, _V2}, AccIn) -> [A2 | AccIn] end,
[], DcWa2),
- ?line Wa3 = lists:foldl(fun({A3, _N3, _V3}, AccIn) -> [A3 | AccIn] end,
+ Wa3 = lists:foldl(fun({A3, _N3, _V3}, AccIn) -> [A3 | AccIn] end,
[], DcWa3),
- ?line case lists:sort(Wa2) of
+ case lists:sort(Wa2) of
[app2, app6, app8, kernel, stdlib] ->
ok;
EWa2 ->
X2 = io_lib:format("distribution error: Cp2 ~p ",[EWa2]),
- ?line test_server:fail(lists:flatten(X2))
+ test_server:fail(lists:flatten(X2))
end,
- ?line case lists:sort(Wa3) of
+ case lists:sort(Wa3) of
[app1, app3, app7, kernel, stdlib] ->
ok;
EWa3 ->
X3 = io_lib:format("distribution error: Cp3 ~p ",[EWa3]),
- ?line test_server:fail(lists:flatten(X3))
+ test_server:fail(lists:flatten(X3))
end,
- ?line {ok, Cp1} = start_node_boot(Ncp1, Config2, dc),
- ?line test_server:sleep(10000),
+ {ok, Cp1} = start_node_boot(Ncp1, Config2, dc),
+ test_server:sleep(10000),
- ?line _DcInfo1rs = rpc:call(Cp1, dist_ac, info, []),
- ?line _DcInfo2rs = rpc:call(Cp2, dist_ac, info, []),
- ?line _DcInfo3rs = rpc:call(Cp3, dist_ac, info, []),
+ _DcInfo1rs = rpc:call(Cp1, dist_ac, info, []),
+ _DcInfo2rs = rpc:call(Cp2, dist_ac, info, []),
+ _DcInfo3rs = rpc:call(Cp3, dist_ac, info, []),
- ?line DcWa1rs = which_applications(Cp1),
- ?line DcWa2rs = which_applications(Cp2),
- ?line DcWa3rs = which_applications(Cp3),
+ DcWa1rs = which_applications(Cp1),
+ DcWa2rs = which_applications(Cp2),
+ DcWa3rs = which_applications(Cp3),
- ?line Wa1rs = lists:foldl(fun({A1, _N1, _V1}, AccIn) -> [A1 | AccIn] end,
+ Wa1rs = lists:foldl(fun({A1, _N1, _V1}, AccIn) -> [A1 | AccIn] end,
[], DcWa1rs),
- ?line Wa2rs = lists:foldl(fun({A2, _N2, _V2}, AccIn) -> [A2 | AccIn] end,
+ Wa2rs = lists:foldl(fun({A2, _N2, _V2}, AccIn) -> [A2 | AccIn] end,
[], DcWa2rs),
- ?line Wa3rs = lists:foldl(fun({A3, _N3, _V3}, AccIn) -> [A3 | AccIn] end,
+ Wa3rs = lists:foldl(fun({A3, _N3, _V3}, AccIn) -> [A3 | AccIn] end,
[], DcWa3rs),
- ?line case lists:sort(Wa1rs) of
+ case lists:sort(Wa1rs) of
[app6, app8, kernel, stdlib] ->
ok;
EWa1rs ->
X1rs = io_lib:format("distribution error: Cp1 ~p ",[EWa1rs]),
- ?line test_server:fail(lists:flatten(X1rs))
+ test_server:fail(lists:flatten(X1rs))
end,
- ?line case lists:sort(Wa2rs) of
+ case lists:sort(Wa2rs) of
[app2, kernel, stdlib] ->
ok;
EWa2rs ->
X2rs = io_lib:format("distribution error: Cp2 ~p ",[EWa2rs]),
- ?line test_server:fail(lists:flatten(X2rs))
+ test_server:fail(lists:flatten(X2rs))
end,
- ?line case lists:sort(Wa3rs) of
+ case lists:sort(Wa3rs) of
[app1, app3, app7, kernel, stdlib] ->
ok;
EWa3rs ->
X3rs = io_lib:format("distribution error: Cp3 ~p ",[EWa3rs]),
- ?line test_server:fail(lists:flatten(X3rs))
+ test_server:fail(lists:flatten(X3rs))
end,
@@ -1818,9 +1843,9 @@ distr_changed_tc2(Conf) when is_list(Conf) ->
stop_node_nice(Cp2),
stop_node_nice(Cp3),
- ?line ok = file:delete("dc.boot"),
- ?line ok = file:delete("dc.rel"),
- ?line ok = file:delete("dc.script"),
+ ok = file:delete("dc.boot"),
+ ok = file:delete("dc.rel"),
+ ok = file:delete("dc.script"),
ok.
@@ -1836,36 +1861,36 @@ config_change(doc) ->
config_change(Conf) when is_list(Conf) ->
%% Change to data_dir
- ?line {ok, CWD} = file:get_cwd(),
- ?line DataDir = ?config(data_dir, Conf),
- ?line ok = file:set_cwd(DataDir),
+ {ok, CWD} = file:get_cwd(),
+ DataDir = ?config(data_dir, Conf),
+ ok = file:set_cwd(DataDir),
%% Find out application data from boot script
- ?line Boot = filename:join([code:root_dir(), "bin", "start.boot"]),
- ?line {ok, Bin} = file:read_file(Boot),
- ?line Appls = get_appls(binary_to_term(Bin)),
+ Boot = filename:join([code:root_dir(), "bin", "start.boot"]),
+ {ok, Bin} = file:read_file(Boot),
+ Appls = get_appls(binary_to_term(Bin)),
%% Simulate contents of "sys.config"
- ?line Config = [{stdlib, [{par1,sys},{par2,sys}]},
+ Config = [{stdlib, [{par1,sys},{par2,sys}]},
"t1",
"t2.config",
filename:join([DataDir, "subdir", "t3"]),
{stdlib, [{par6,sys}]}],
%% Order application_controller to update configuration
- ?line ok = application_controller:change_application_data(Appls,
+ ok = application_controller:change_application_data(Appls,
Config),
%% Check that stdlib parameters are correctly set
- ?line Env = application:get_all_env(stdlib),
- ?line {value, {par1,sys}} = lists:keysearch(par1, 1, Env),
- ?line {value, {par2,t1}} = lists:keysearch(par2, 1, Env),
- ?line {value, {par3,t1}} = lists:keysearch(par3, 1, Env),
- ?line {value, {par4,t2}} = lists:keysearch(par4, 1, Env),
- ?line {value, {par5,t3}} = lists:keysearch(par5, 1, Env),
- ?line {value, {par6,sys}} = lists:keysearch(par6, 1, Env),
+ Env = application:get_all_env(stdlib),
+ {value, {par1,sys}} = lists:keysearch(par1, 1, Env),
+ {value, {par2,t1}} = lists:keysearch(par2, 1, Env),
+ {value, {par3,t1}} = lists:keysearch(par3, 1, Env),
+ {value, {par4,t2}} = lists:keysearch(par4, 1, Env),
+ {value, {par5,t3}} = lists:keysearch(par5, 1, Env),
+ {value, {par6,sys}} = lists:keysearch(par6, 1, Env),
- ?line ok = file:set_cwd(CWD).
+ ok = file:set_cwd(CWD).
%% This function is stolen from SASL module release_handler, OTP R10B
get_appls({script, _, Script}) ->
@@ -1891,18 +1916,18 @@ shutdown_func(suite) ->
shutdown_func(doc) ->
["Tests the 'shutdown_func' kernel config parameter"];
shutdown_func(Config) when is_list(Config) ->
- ?line {ok,Cp1} = start_node(?MODULE_STRING++"_shutdown_func"),
- ?line wait_for_ready_net(),
- ?line Tag = make_ref(),
- ?line ok = rpc:call(Cp1, application, set_env,
+ {ok,Cp1} = start_node(?MODULE_STRING++"_shutdown_func"),
+ wait_for_ready_net(),
+ Tag = make_ref(),
+ ok = rpc:call(Cp1, application, set_env,
[kernel, shutdown_func, {?MODULE, do_shutdown}]),
- ?line ok = rpc:call(Cp1, application, set_env,
+ ok = rpc:call(Cp1, application, set_env,
[kernel, shutdown_func_test, {self(), Tag}]),
- ?line _ = rpc:call(Cp1, init, stop, []),
- ?line receive
+ _ = rpc:call(Cp1, init, stop, []),
+ receive
{Pid, Tag, shutting_down, shutdown} ->
- ?line Mref = erlang:monitor(process, Pid),
- ?line Pid ! {self(), Tag, ok},
+ Mref = erlang:monitor(process, Pid),
+ Pid ! {self(), Tag, ok},
receive
{'DOWN', Mref, _, Pid, noconnection} ->
ok
@@ -2488,9 +2513,9 @@ node_name(Name, Config) ->
lists:concat([Name,U,?testcase,U,U,L]).
stop_node_nice(Node) when is_atom(Node) ->
- ?line test_server:stop_node(Node);
+ test_server:stop_node(Node);
stop_node_nice(Nodes) when is_list(Nodes) ->
- ?line lists:foreach(fun (N) -> stop_node_nice(N) end, Nodes).
+ lists:foreach(fun (N) -> stop_node_nice(N) end, Nodes).
get_start_type(Expected) ->
@@ -2581,10 +2606,10 @@ get_conf_change(Expected) ->
{cc, Expected} ->
ok;
{cc, List} ->
- ?line test_server:format("====== ~p ======~n",[{cc, List}]),
- ?line test_server:fail(not_valid_conf_change)
+ test_server:format("====== ~p ======~n",[{cc, List}]),
+ test_server:fail(not_valid_conf_change)
after 5000 ->
- ?line test_server:fail(not_valid_conf_change_to)
+ test_server:fail(not_valid_conf_change_to)
end.
conf_change() ->
@@ -2604,75 +2629,75 @@ cc(List) ->
create_app() ->
- ?line Dir = "./",
- ?line App1 = Dir ++ "app1",
- ?line {ok, Fd1} = file:open(App1++".app",[write]),
- ?line io:format(Fd1, "~p. \n", [app1()]),
- ?line file:close(Fd1),
- ?line App2 = Dir ++ "app2",
- ?line {ok, Fd2} = file:open(App2++".app",[write]),
- ?line io:format(Fd2, "~p. \n", [app2()]),
- ?line file:close(Fd2),
- ?line App3 = Dir ++ "app_sp",
- ?line {ok, Fd3} = file:open(App3++".app",[write]),
- ?line io:format(Fd3, "~p. \n", [app_sp()]),
- ?line file:close(Fd3),
+ Dir = "./",
+ App1 = Dir ++ "app1",
+ {ok, Fd1} = file:open(App1++".app",[write]),
+ io:format(Fd1, "~p. \n", [app1()]),
+ file:close(Fd1),
+ App2 = Dir ++ "app2",
+ {ok, Fd2} = file:open(App2++".app",[write]),
+ io:format(Fd2, "~p. \n", [app2()]),
+ file:close(Fd2),
+ App3 = Dir ++ "app_sp",
+ {ok, Fd3} = file:open(App3++".app",[write]),
+ io:format(Fd3, "~p. \n", [app_sp()]),
+ file:close(Fd3),
ok.
create_script(ScriptName) ->
- ?line Dir = "./",
- ?line Name = Dir ++ ScriptName,
- ?line Apps = which_applications(),
- ?line {value,{_,_,KernelVer}} = lists:keysearch(kernel,1,Apps),
- ?line {value,{_,_,StdlibVer}} = lists:keysearch(stdlib,1,Apps),
- ?line {ok,Fd} = file:open(Name++".rel",[write]),
- ?line io:format(Fd,
+ Dir = "./",
+ Name = Dir ++ ScriptName,
+ Apps = which_applications(),
+ {value,{_,_,KernelVer}} = lists:keysearch(kernel,1,Apps),
+ {value,{_,_,StdlibVer}} = lists:keysearch(stdlib,1,Apps),
+ {ok,Fd} = file:open(Name++".rel",[write]),
+ io:format(Fd,
"{release, {\"Test release 3\", \"LATEST\"}, \n"
" {erts, \"4.4\"}, \n"
" [{kernel, \"~s\"}, {stdlib, \"~s\"}, \n"
" {app1, \"2.0\"}, {app2, \"2.0\"}, {app_sp, \"2.0\"}]}.\n",
[KernelVer,StdlibVer]),
- ?line file:close(Fd),
+ file:close(Fd),
{{KernelVer,StdlibVer},
{filename:dirname(Name), filename:basename(Name)}}.
create_script_dc(ScriptName) ->
- ?line Dir = "./",
- ?line Name = Dir ++ ScriptName,
- ?line Apps = which_applications(),
- ?line {value,{_,_,KernelVer}} = lists:keysearch(kernel,1,Apps),
- ?line {value,{_,_,StdlibVer}} = lists:keysearch(stdlib,1,Apps),
- ?line {ok,Fd} = file:open(Name++".rel",[write]),
- ?line io:format(Fd,
+ Dir = "./",
+ Name = Dir ++ ScriptName,
+ Apps = which_applications(),
+ {value,{_,_,KernelVer}} = lists:keysearch(kernel,1,Apps),
+ {value,{_,_,StdlibVer}} = lists:keysearch(stdlib,1,Apps),
+ {ok,Fd} = file:open(Name++".rel",[write]),
+ io:format(Fd,
"{release, {\"Test release 3\", \"LATEST\"}, \n"
" {erts, \"4.4\"}, \n"
" [{kernel, \"~s\"}, {stdlib, \"~s\"}, \n"
" {app1, \"2.0\"}, {app2, \"2.0\"}, {app3, \"2.0\"}, \n"
" {app6, \"2.0\"}, {app7, \"2.0\"}, {app8, \"2.0\"}]}.\n",
[KernelVer,StdlibVer]),
- ?line file:close(Fd),
+ file:close(Fd),
{{KernelVer,StdlibVer},
{filename:dirname(Name), filename:basename(Name)}}.
create_script_3002(ScriptName) ->
- ?line Dir = "./",
- ?line Name = Dir ++ ScriptName,
- ?line Apps = which_applications(),
- ?line {value,{_,_,KernelVer}} = lists:keysearch(kernel,1,Apps),
- ?line {value,{_,_,StdlibVer}} = lists:keysearch(stdlib,1,Apps),
- ?line {value,{_,_,SaslVer}} = lists:keysearch(sasl,1,Apps),
- ?line {ok,Fd} = file:open(Name++".rel",[write]),
- ?line io:format(Fd,
+ Dir = "./",
+ Name = Dir ++ ScriptName,
+ Apps = which_applications(),
+ {value,{_,_,KernelVer}} = lists:keysearch(kernel,1,Apps),
+ {value,{_,_,StdlibVer}} = lists:keysearch(stdlib,1,Apps),
+ {value,{_,_,SaslVer}} = lists:keysearch(sasl,1,Apps),
+ {ok,Fd} = file:open(Name++".rel",[write]),
+ io:format(Fd,
"{release, {\"Test release 3\", \"LATEST\"}, \n"
" {erts, \"4.4\"}, \n"
" [{kernel, \"~s\"}, {stdlib, \"~s\"}, \n"
" {sasl, \"~s\"}]}.\n",
[KernelVer, StdlibVer, SaslVer]),
- ?line file:close(Fd),
+ file:close(Fd),
{{KernelVer,StdlibVer},
{filename:dirname(Name), filename:basename(Name)}}.
@@ -2681,57 +2706,57 @@ create_script_3002(ScriptName) ->
distr_changed_prep(Conf) when is_list(Conf) ->
% Write .app files
- ?line {ok, Fd1} = file:open("app1.app", [write]),
- ?line w_app1(Fd1),
- ?line file:close(Fd1),
- ?line {ok, Fd2} = file:open("app2.app", [write]),
- ?line w_app2(Fd2),
- ?line file:close(Fd2),
- ?line {ok, Fd3} = file:open("app3.app", [write]),
- ?line w_app3(Fd3),
- ?line file:close(Fd3),
- ?line {ok, Fd4} = file:open("app6.app", [write]),
- ?line w_app6(Fd4),
- ?line file:close(Fd4),
- ?line {ok, Fd5} = file:open("app7.app", [write]),
- ?line w_app7(Fd5),
- ?line file:close(Fd5),
- ?line {ok, Fd6} = file:open("app8.app", [write]),
- ?line w_app8(Fd6),
- ?line file:close(Fd6),
+ {ok, Fd1} = file:open("app1.app", [write]),
+ w_app1(Fd1),
+ file:close(Fd1),
+ {ok, Fd2} = file:open("app2.app", [write]),
+ w_app2(Fd2),
+ file:close(Fd2),
+ {ok, Fd3} = file:open("app3.app", [write]),
+ w_app3(Fd3),
+ file:close(Fd3),
+ {ok, Fd4} = file:open("app6.app", [write]),
+ w_app6(Fd4),
+ file:close(Fd4),
+ {ok, Fd5} = file:open("app7.app", [write]),
+ w_app7(Fd5),
+ file:close(Fd5),
+ {ok, Fd6} = file:open("app8.app", [write]),
+ w_app8(Fd6),
+ file:close(Fd6),
% Create the .app files and the boot script
- ?line {{KernelVer,StdlibVer}, _} = create_script_dc("dc"),
+ {{KernelVer,StdlibVer}, _} = create_script_dc("dc"),
- ?line case is_real_system(KernelVer, StdlibVer) of
+ case is_real_system(KernelVer, StdlibVer) of
true ->
Options = [];
false ->
Options = [local]
end,
- ?line ok = systools:make_script("dc", Options),
+ ok = systools:make_script("dc", Options),
NodeNames = [Ncp1, Ncp2, Ncp3] = node_names([cp1, cp2, cp3], Conf),
NoSyncTime = config_fun_fast(config_dc(NodeNames)),
WithSyncTime = config_fun(config_dc(NodeNames)),
- ?line Dir = ?config(priv_dir,Conf),
- ?line {ok, Fd_dc2} = file:open(filename:join(Dir, "sys2.config"), [write]),
- ?line (config_dc2(NodeNames))(Fd_dc2),
- ?line file:close(Fd_dc2),
- ?line Config2 = filename:join(Dir, "sys2"),
+ Dir = ?config(priv_dir,Conf),
+ {ok, Fd_dc2} = file:open(filename:join(Dir, "sys2.config"), [write]),
+ (config_dc2(NodeNames))(Fd_dc2),
+ file:close(Fd_dc2),
+ Config2 = filename:join(Dir, "sys2"),
% Test [cp1, cp2, cp3]
- ?line {ok, Cp1} = start_node_boot_config(Ncp1, NoSyncTime, Conf, dc),
- ?line {ok, Cp2} = start_node_boot_config(Ncp2, NoSyncTime, Conf, dc),
- ?line {ok, Cp3} = start_node_boot_config(Ncp3, WithSyncTime, Conf, dc),
- ?line global:sync(),
+ {ok, Cp1} = start_node_boot_config(Ncp1, NoSyncTime, Conf, dc),
+ {ok, Cp2} = start_node_boot_config(Ncp2, NoSyncTime, Conf, dc),
+ {ok, Cp3} = start_node_boot_config(Ncp3, WithSyncTime, Conf, dc),
+ global:sync(),
%% Read the current configuration parameters, and change them
- ?line OldEnv = rpc:call(Cp1, application_controller, prep_config_change, []),
- ?line {value, {kernel, OldKernel}} = lists:keysearch(kernel, 1, OldEnv),
+ OldEnv = rpc:call(Cp1, application_controller, prep_config_change, []),
+ {value, {kernel, OldKernel}} = lists:keysearch(kernel, 1, OldEnv),
{OldKernel, OldEnv, {Cp1, Cp2, Cp3}, {Ncp1, Ncp2, Ncp3}, Config2}.
diff --git a/lib/kernel/test/disk_log_SUITE.erl b/lib/kernel/test/disk_log_SUITE.erl
index 0f811b8f73..f55af1e354 100644
--- a/lib/kernel/test/disk_log_SUITE.erl
+++ b/lib/kernel/test/disk_log_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2012. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2013. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -3205,7 +3205,7 @@ many_users(Conf) when is_list(Conf) ->
?line true = lists:duplicate(NoClients, {error, {full,"log.LOG"}}) == C2,
?line true = length(T2) > 0,
?line {C3, T3} = many(Fun2, NoClients, N, wrap, internal,
- {300*NoClients,20}, Dir),
+ {300*NoClients,200}, Dir),
?line true = lists:duplicate(NoClients, ok) == C3,
?line true = length(T3) == N*NoClients,
ok.
diff --git a/lib/kernel/test/file_SUITE.erl b/lib/kernel/test/file_SUITE.erl
index c604e7073f..e4c8f0ffaf 100644
--- a/lib/kernel/test/file_SUITE.erl
+++ b/lib/kernel/test/file_SUITE.erl
@@ -91,6 +91,8 @@
-export([standard_io/1,mini_server/1]).
+-export([old_io_protocol/1]).
+
%% Debug exports
-export([create_file_slow/2, create_file/2, create_bin/2]).
-export([verify_file/2, verify_bin/3]).
@@ -114,7 +116,7 @@ all() ->
delayed_write, read_ahead, segment_read, segment_write,
ipread, pid2name, interleaved_read_write, otp_5814, otp_10852,
large_file, large_write, read_line_1, read_line_2, read_line_3,
- read_line_4, standard_io].
+ read_line_4, standard_io, old_io_protocol].
groups() ->
[{dirs, [], [make_del_dir, cur_dir_0, cur_dir_1,
@@ -310,6 +312,31 @@ standard_io(Config) when is_list(Config) ->
Pid ! die,
receive after 1000 -> ok end.
+old_io_protocol(suite) ->
+ [];
+old_io_protocol(doc) ->
+ ["Test that the old file IO protocol =< R16B still works"];
+old_io_protocol(Config) when is_list(Config) ->
+ Dog = test_server:timetrap(test_server:seconds(5)),
+ RootDir = ?config(priv_dir,Config),
+ Name = filename:join(RootDir,
+ atom_to_list(?MODULE)
+ ++"old_io_protocol.fil"),
+ MyData = "0123456789abcdefghijklmnopqrstuvxyz",
+ ok = ?FILE_MODULE:write_file(Name, MyData),
+ {ok, Fd} = ?FILE_MODULE:open(Name, write),
+ Fd ! {file_request,self(),Fd,truncate},
+ receive
+ {file_reply,Fd,ok} -> ok
+ end,
+ ok = ?FILE_MODULE:close(Fd),
+ {ok, <<>>} = ?FILE_MODULE:read_file(Name),
+ test_server:timetrap_cancel(Dog),
+ [] = flush(),
+ ok.
+
+
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
read_write_file(suite) -> [];
@@ -2624,6 +2651,8 @@ symlinks(Config) when is_list(Config) ->
?line #file_info{links=1, type=symlink} = Info2,
?line {ok, Name} = ?FILE_MODULE:read_link(Alias),
{ok, Name} = ?FILE_MODULE:read_link_all(Alias),
+ %% If all is good, delete dir again (avoid hanging dir on windows)
+ rm_rf(?FILE_MODULE,NewDir),
ok
end,
@@ -4277,3 +4306,18 @@ disc_free(Path) ->
memsize() ->
{Tot,_Used,_} = memsup:get_memory_data(),
Tot.
+
+%%%-----------------------------------------------------------------
+%%% Utilities
+rm_rf(Mod,Dir) ->
+ case Mod:read_link_info(Dir) of
+ {ok, #file_info{type = directory}} ->
+ {ok, Content} = Mod:list_dir_all(Dir),
+ [ rm_rf(Mod,filename:join(Dir,C)) || C <- Content ],
+ Mod:del_dir(Dir),
+ ok;
+ {ok, #file_info{}} ->
+ Mod:delete(Dir);
+ _ ->
+ ok
+ end.
diff --git a/lib/kernel/test/file_name_SUITE.erl b/lib/kernel/test/file_name_SUITE.erl
index a6728564e4..0c8082026a 100644
--- a/lib/kernel/test/file_name_SUITE.erl
+++ b/lib/kernel/test/file_name_SUITE.erl
@@ -197,7 +197,10 @@ normal(Config) when is_list(Config) ->
put(file_module,prim_file),
ok = check_normal(prim_file),
put(file_module,file),
- ok = check_normal(file)
+ ok = check_normal(file),
+ %% If all is good, delete dir again (avoid hanging dir on windows)
+ rm_rf(file,"normal_dir"),
+ ok
after
file:set_cwd(Dir)
end.
@@ -219,7 +222,10 @@ icky(Config) when is_list(Config) ->
put(file_module,prim_file),
ok = check_icky(prim_file),
put(file_module,file),
- ok = check_icky(file)
+ ok = check_icky(file),
+ %% If all is good, delete dir again (avoid hanging dir on windows)
+ rm_rf(file,"icky_dir"),
+ ok
after
file:set_cwd(Dir)
end
@@ -243,7 +249,11 @@ very_icky(Config) when is_list(Config) ->
{skipped,"VM needs to be started in Unicode filename mode"};
ok ->
put(file_module,file),
- ok = check_very_icky(file)
+ ok = check_very_icky(file),
+ %% If all is good, delete dir again
+ %% (avoid hanging dir on windows)
+ rm_rf(file,"very_icky_dir"),
+ ok
end
after
file:set_cwd(Dir)
diff --git a/lib/kernel/test/gen_sctp_SUITE.erl b/lib/kernel/test/gen_sctp_SUITE.erl
index 2a886b2efc..c5d8becfd3 100644
--- a/lib/kernel/test/gen_sctp_SUITE.erl
+++ b/lib/kernel/test/gen_sctp_SUITE.erl
@@ -1399,8 +1399,7 @@ s_req(S, Req) ->
{'DOWN',Mref,_,_,Error} ->
exit(Error);
{S,Mref,Reply} ->
- erlang:demonitor(Mref),
- receive {'DOWN',Mref,_,_,_} -> ok after 0 -> ok end,
+ erlang:demonitor(Mref, [flush]),
Reply
end.
diff --git a/lib/kernel/test/gen_tcp_misc_SUITE.erl b/lib/kernel/test/gen_tcp_misc_SUITE.erl
index 6b672004ec..2d5827282f 100644
--- a/lib/kernel/test/gen_tcp_misc_SUITE.erl
+++ b/lib/kernel/test/gen_tcp_misc_SUITE.erl
@@ -602,7 +602,7 @@ iter_max_socks(Config) when is_list(Config) ->
%% Run on a different node in order to limit the effect if this test fails.
Dir = filename:dirname(code:which(?MODULE)),
{ok,Node} = test_server:start_node(test_iter_max_socks,slave,
- [{args,"-pa " ++ Dir}]),
+ [{args,"+Q 2048 -pa " ++ Dir}]),
L = rpc:call(Node,?MODULE,do_iter_max_socks,[N, initalize]),
test_server:stop_node(Node),
diff --git a/lib/kernel/test/global_SUITE_data/global_trace.erl b/lib/kernel/test/global_SUITE_data/global_trace.erl
index 4f253baac4..ddbe608c0a 100644
--- a/lib/kernel/test/global_SUITE_data/global_trace.erl
+++ b/lib/kernel/test/global_SUITE_data/global_trace.erl
@@ -1,3 +1,4 @@
+%% -*- coding: utf-8 -*-
%%
%% %CopyrightBegin%
%%
@@ -122,12 +123,12 @@ state(Else) ->
%%% {ops,Ops}]
%%% NewKnown = Known ++ AddedNodes
%%% AddedNodes = NewNodes -- Known
-%%% NewNodes �r h�r den man f�rhandlat med plus de noder den k�nner till.
+%%% NewNodes är här den man förhandlat med plus de noder den känner till.
%%% {added, AddedNodes}, Extra = [{ops,Ops}]
%%% NewKnown = Known ++ AddedNodes
-%%% Den (passiva) noden f�r Nodes som �r NewNodes
-%%% hos den f�rhandlande. Sedan: AddedNodes = (Nodes -- Known) -- [node()].
-%%% Det �r som hos f�rhandlaren.
+%%% Den (passiva) noden får Nodes som är NewNodes
+%%% hos den förhandlande. Sedan: AddedNodes = (Nodes -- Known) -- [node()].
+%%% Det är som hos förhandlaren.
%%% {nodes_changed, {New,Old}}
%%% Every now and then the list [node() | nodes()] is checked for updates.
%%% New are the nodes that global does not know of (yet).
diff --git a/lib/kernel/test/inet_SUITE.erl b/lib/kernel/test/inet_SUITE.erl
index 1f7724d0dc..62ba95e1a3 100644
--- a/lib/kernel/test/inet_SUITE.erl
+++ b/lib/kernel/test/inet_SUITE.erl
@@ -183,80 +183,74 @@ t_gethostbyname(Config) when is_list(Config) ->
h_addr_list = [IP]},
?line HEntF_ = HEntF,
?line check_elems([{HEnt#hostent.h_aliases,[[],Aliases]}]),
+ %%
+ ?line FullNameU = toupper(FullName),
+ ?line {ok,HEntU} = inet:gethostbyname(FullNameU),
+ ?line FullNameU = toupper(HEntU#hostent.h_name),
+ ?line #hostent{
+ h_addrtype = inet,
+ h_length = 4,
+ h_addr_list = [IP]} = HEntU,
+ ?line check_elems(
+ [{[toupper(H) || H <- HEntU#hostent.h_aliases],
+ [[],[toupper(A) || A <- Aliases]]}]),
?line {DName, _DFullName, _DIPStr, _DIP, _, _, _} =
ct:get_config(test_dummy_host),
?line {error,nxdomain} = inet:gethostbyname(DName),
- ?line {error,nxdomain} = inet:gethostbyname(IP_46_Str).
+ ?line {error,nxdomain} = inet:gethostbyname(IP_46_Str),
+ ok.
t_gethostbyname_v6() -> required(v6).
t_gethostbyname_v6(doc) -> "Test the inet:gethostbyname/1 inet6 function.";
t_gethostbyname_v6(suite) -> [];
t_gethostbyname_v6(Config) when is_list(Config) ->
- ?line {Name, _, _, _,Aliases,IP_46_Str,IP_46} =
- ct:get_config(test_host_ipv4_only),
+ {Name, FullName, IPStr, IP, Aliases} =
+ ct:get_config(test_host_ipv6_only),
- case {inet:gethostbyname(IP_46_Str, inet6),
- inet:gethostbyname(Name, inet6)} of
- {{ok,HEnt46},{ok,_}} ->
- ?line HEnt46_ = HEnt46#hostent{h_name = IP_46_Str,
- h_addrtype = inet6,
- h_length = 16,
- h_addr_list = [IP_46]},
- ?line HEnt46_ = HEnt46,
- ?line check_elems([{HEnt46#hostent.h_aliases,[[],Aliases]}]),
-
- ?line {Name6, FullName6, IPStr6, IP6, Aliases6} =
- ct:get_config(test_host_ipv6_only),
- ?line {ok,_} = inet:gethostbyname(IPStr6, inet6),
- ?line {ok,HEnt6} = inet:gethostbyname(Name6, inet6),
- ?line {ok,HEnt6} = inet:gethostbyname(list_to_atom(Name6), inet6),
- ?line case HEnt6#hostent.h_addr_list of
- [IP6] -> % ipv6 ok
- ?line HEnt6_ = HEnt6#hostent{h_addrtype = inet6,
- h_length = 16,
- h_addr_list = [IP6]},
- ?line HEnt6_ = HEnt6,
- ?line check_elems([{HEnt6#hostent.h_name,[Name6,FullName6]},
- {HEnt6#hostent.h_aliases,[[],Aliases6]}]);
- _ -> % ipv4 compatible addr
- ?line {ok,HEnt4} = inet:gethostbyname(Name6, inet),
- ?line [IP4] = HEnt4#hostent.h_addr_list,
- ?line {ok,IP46_2} =
- inet_parse:ipv6_address("::ffff:"++inet_parse:ntoa(IP4)),
- ?line HEnt6_ = HEnt6#hostent{h_addrtype = inet6,
- h_length = 16,
- h_addr_list = [IP46_2]},
- ?line HEnt6_ = HEnt6,
- ?line check_elems([{HEnt6#hostent.h_name,[Name6,FullName6]}])
- end,
-
- ?line {ok,HEntF6} = inet:gethostbyname(FullName6, inet6),
- ?line case HEntF6#hostent.h_addr_list of
- [IP6] -> % ipv6 ok
- ?line HEntF6_ = HEntF6#hostent{h_name = FullName6,
- h_addrtype = inet6,
- h_length = 16,
- h_addr_list = [IP6]},
- ?line HEntF6_ = HEntF6,
- ?line check_elems([{HEntF6#hostent.h_aliases,[[],Aliases6]}]);
- _ -> % ipv4 compatible addr
- ?line {ok,HEntF4} = inet:gethostbyname(FullName6, inet),
- ?line [IPF4] = HEntF4#hostent.h_addr_list,
- ?line {ok,IPF46_2} =
- inet_parse:ipv6_address("::ffff:"++inet_parse:ntoa(IPF4)),
- ?line HEntF6_ = HEntF6#hostent{h_addrtype = inet6,
- h_length = 16,
- h_addr_list = [IPF46_2]},
- ?line HEntF6_ = HEntF6,
- ?line check_elems([{HEntF6#hostent.h_name,[Name6,FullName6]}])
- end,
-
- ?line {DName6, _DFullName6, _DIPStr6, _DIP6, _} =
- ct:get_config(test_dummy_ipv6_host),
- ?line {error,nxdomain} = inet:gethostbyname(DName6, inet6),
- ok;
- {_,_} ->
+ case inet:gethostbyname(Name, inet6) of
+ {ok,HEnt} ->
+ {ok,_} = inet:gethostbyname(IPStr, inet6),
+ {ok,HEnt} = inet:gethostbyname(list_to_atom(Name), inet6),
+ case HEnt#hostent.h_addr_list of
+ [IP] -> % IPv6 address
+ #hostent{h_addrtype = inet6,
+ h_length = 16} = HEnt,
+ check_elems(
+ [{HEnt#hostent.h_name,[Name,FullName]},
+ {HEnt#hostent.h_aliases,[[],Aliases]}]);
+ [IP46] -> % IPv4 compatible address
+ {ok,HEnt4} = inet:gethostbyname(Name, inet),
+ #hostent{h_addrtype = inet,
+ h_length = 4,
+ h_addr_list = [IP4]} = HEnt4,
+ {ok,IP46} =
+ inet_parse:ipv6_address(
+ "::ffff:" ++ inet_parse:ntoa(IP4)),
+ check_elems(
+ [{HEnt#hostent.h_name,[Name,FullName]}])
+ end,
+
+ {ok,HEntF} = inet:gethostbyname(FullName, inet6),
+ case HEntF#hostent.h_addr_list of
+ [IP] -> % IPv6 address
+ #hostent{h_name = FullName,
+ h_addrtype = inet6,
+ h_length = 16} = HEntF,
+ check_elems(
+ [{HEnt#hostent.h_aliases,[[],Aliases]}]);
+ [IP46F] -> % IPv4 compatible address
+ {ok,HEnt4F} = inet:gethostbyname(FullName, inet),
+ #hostent{h_addrtype = inet,
+ h_length = 4,
+ h_addr_list = [IP4F]} = HEnt4F,
+ {ok,IP46F} =
+ inet_parse:ipv6_address(
+ "::ffff:" ++ inet_parse:ntoa(IP4F)),
+ check_elems(
+ [{HEntF#hostent.h_name,[Name,FullName]}])
+ end;
+ _ ->
{skip, "IPv6 is not supported on this host"}
end.
@@ -290,47 +284,35 @@ t_getaddr(Config) when is_list(Config) ->
?line {error,nxdomain} = inet:getaddr(DName, inet),
?line {error,nxdomain} = inet:getaddr(DFullName, inet),
?line {ok,DIP} = inet:getaddr(DIPStr, inet),
- ?line {ok,DIP} = inet:getaddr(DIP, inet).
+ ?line {ok,DIP} = inet:getaddr(DIP, inet),
+ ok.
t_getaddr_v6() -> required(v4) ++ required(v6).
t_getaddr_v6(doc) -> "Test the inet:getaddr/2 function.";
t_getaddr_v6(suite) -> [];
t_getaddr_v6(Config) when is_list(Config) ->
- ?line {Name,FullName,IPStr,_IP,_,IP_46_Str,IP46} =
- ct:get_config(test_host_ipv4_only),
- case {inet:getaddr(IP_46_Str, inet6),inet:getaddr(Name, inet6)} of
- {{ok,IP46},{ok,V4Addr}} when V4Addr /= {0,0,0,0,0,0,0,1} ->
- %% Since we suceeded in parsing an IPv6 address string and
- %% look up the name, this computer fully supports IPv6.
- ?line {ok,IP46} = inet:getaddr(IP46, inet6),
- ?line {ok,IP46} = inet:getaddr(Name, inet6),
- ?line {ok,IP46} = inet:getaddr(FullName, inet6),
- ?line {ok,IP46} = inet:getaddr(IPStr, inet6),
-%% ?line IP4toIP6 = inet:getaddr(IPStr, inet6),
-%% ?line case IP4toIP6 of
-%% {ok,IP46} ->
-%% ?line ok;
-%% {error,nxdomain} ->
-%% ?line false =
-%% lists:member(native,
-%% inet_db:res_option(lookup))
-%% end,
- ?line {Name6, FullName6, IPStr6, IP6, _} =
- ct:get_config(test_host_ipv6_only),
- ?line {ok,_} = inet:getaddr(list_to_atom(Name6), inet6),
- ?line {ok,_} = inet:getaddr(Name6, inet6),
- ?line {ok,_} = inet:getaddr(FullName6, inet6),
- ?line {ok,IP6} = inet:getaddr(IP6, inet6),
- ?line {ok,IP6} = inet:getaddr(IPStr6, inet6),
-
- ?line {DName6, DFullName6, DIPStr6, DIP6, _} =
+ {Name,FullName,IPStr,IP,_} =
+ ct:get_config(test_host_ipv6_only),
+
+ case inet:getaddr(Name, inet6) of
+ {ok,Addr} ->
+ IP = Addr,
+ {ok,IP} = inet:getaddr(toupper(Name), inet6),
+ {ok,IP} = inet:getaddr(list_to_atom(Name), inet6),
+ {ok,IP} = inet:getaddr(list_to_atom(toupper(Name)), inet6),
+ {ok,IP} = inet:getaddr(FullName, inet6),
+ {ok,IP} = inet:getaddr(toupper(FullName), inet6),
+ {ok,IP} = inet:getaddr(IP, inet6),
+ {ok,IP} = inet:getaddr(IPStr, inet6),
+ %%
+ {DName,DFullName,DIPStr,DIP,_} =
ct:get_config(test_dummy_ipv6_host),
- ?line {error,nxdomain} = inet:getaddr(DName6, inet6),
- ?line {error,nxdomain} = inet:getaddr(DFullName6, inet6),
- ?line {ok,DIP6} = inet:getaddr(DIPStr6, inet6),
- ?line {ok,DIP6} = inet:getaddr(DIP6, inet6),
+ {error,nxdomain} = inet:getaddr(DName, inet6),
+ {error,nxdomain} = inet:getaddr(DFullName, inet6),
+ {ok,DIP} = inet:getaddr(DIPStr, inet6),
+ {ok,DIP} = inet:getaddr(DIP, inet6),
ok;
- {_,_} ->
+ _ ->
{skip, "IPv6 is not supported on this host"}
end.
@@ -608,8 +590,12 @@ t_parse_address(Func, [String|L]) ->
t_parse_address(Func, L).
parse_strict_address(Config) when is_list(Config) ->
- {ok, Ipv4} = inet:parse_strict_address("127.0.0.1"),
- {ok, Ipv6} = inet:parse_strict_address("c11:0c22:5c33:c440:55c0:c66c:77:0088").
+ {ok, {127,0,0,1}} =
+ inet:parse_strict_address("127.0.0.1"),
+ {ok, {3089,3106,23603,50240,21952,50796,119,136}} =
+ inet:parse_strict_address("c11:0c22:5c33:c440:55c0:c66c:77:0088"),
+ {ok, {3089,3106,23603,50240,0,0,119,136}} =
+ inet:parse_strict_address("c11:0c22:5c33:c440::077:0088").
t_gethostnative(suite) ->[];
t_gethostnative(doc) ->[];
@@ -1102,3 +1088,14 @@ ip_member({127,_,_,_}, [{127,_,_,_}|_]) -> true;
ip_member(K, [K|_]) -> true;
ip_member(K, [_|T]) -> ip_member(K, T);
ip_member(_, []) -> false.
+
+%% Case fold to upper case according to RFC 4343
+%%
+toupper([C|Cs]) when is_integer(C) ->
+ if $a =< C, C =< $z ->
+ [(C - $a + $A)|toupper(Cs)];
+ true ->
+ [C|toupper(Cs)]
+ end;
+toupper([]) ->
+ [].
diff --git a/lib/kernel/test/inet_res_SUITE.erl b/lib/kernel/test/inet_res_SUITE.erl
index f3ba28e4f9..1bc93e3138 100644
--- a/lib/kernel/test/inet_res_SUITE.erl
+++ b/lib/kernel/test/inet_res_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2009-2011. All Rights Reserved.
+%% Copyright Ericsson AB 2009-2013. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -282,6 +282,7 @@ basic(doc) ->
basic(Config) when is_list(Config) ->
NS = ns(Config),
Name = "ns.otptest",
+ NameC = caseflip(Name),
IP = {127,0,0,254},
%%
%% nslookup
@@ -292,6 +293,17 @@ basic(Config) when is_list(Config) ->
Bin1 = inet_dns:encode(Msg1),
%%io:format("Bin1 = ~w~n", [Bin1]),
{ok,Msg1} = inet_dns:decode(Bin1),
+ %% Now with scrambled case
+ {ok,Msg1b} = inet_res:nslookup(NameC, in, a, [NS]),
+ io:format("~p~n", [Msg1b]),
+ [RR1b] = inet_dns:msg(Msg1b, anlist),
+ IP = inet_dns:rr(RR1b, data),
+ Bin1b = inet_dns:encode(Msg1b),
+ %%io:format("Bin1b = ~w~n", [Bin1b]),
+ {ok,Msg1b} = inet_dns:decode(Bin1b),
+ true =
+ (tolower(inet_dns:rr(RR1, domain))
+ =:= tolower(inet_dns:rr(RR1b, domain))),
%%
%% resolve
{ok,Msg2} = inet_res:resolve(Name, in, a, [{nameservers,[NS]},verbose]),
@@ -301,15 +313,29 @@ basic(Config) when is_list(Config) ->
Bin2 = inet_dns:encode(Msg2),
%%io:format("Bin2 = ~w~n", [Bin2]),
{ok,Msg2} = inet_dns:decode(Bin2),
+ %% Now with scrambled case
+ {ok,Msg2b} = inet_res:resolve(NameC, in, a, [{nameservers,[NS]},verbose]),
+ io:format("~p~n", [Msg2b]),
+ [RR2b] = inet_dns:msg(Msg2b, anlist),
+ IP = inet_dns:rr(RR2b, data),
+ Bin2b = inet_dns:encode(Msg2b),
+ %%io:format("Bin2b = ~w~n", [Bin2b]),
+ {ok,Msg2b} = inet_dns:decode(Bin2b),
+ true =
+ (tolower(inet_dns:rr(RR2, domain))
+ =:= tolower(inet_dns:rr(RR2b, domain))),
%%
%% lookup
[IP] = inet_res:lookup(Name, in, a, [{nameservers,[NS]},verbose]),
+ [IP] = inet_res:lookup(NameC, in, a, [{nameservers,[NS]},verbose]),
%%
%% gethostbyname
{ok,#hostent{h_addr_list=[IP]}} = inet_res:gethostbyname(Name),
+ {ok,#hostent{h_addr_list=[IP]}} = inet_res:gethostbyname(NameC),
%%
%% getbyname
{ok,#hostent{h_addr_list=[IP]}} = inet_res:getbyname(Name, a),
+ {ok,#hostent{h_addr_list=[IP]}} = inet_res:getbyname(NameC, a),
ok.
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -317,63 +343,115 @@ basic(Config) when is_list(Config) ->
resolve(doc) ->
["Lookup different records using resolve/2..4"];
resolve(Config) when is_list(Config) ->
+ Class = in,
NS = ns(Config),
Domain = "otptest",
RDomain4 = "0.0.127.in-addr.arpa",
RDomain6 = "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa",
Name = "resolve."++Domain,
- L = [{in,a,Name,[{127,0,0,28}],undefined},
- {in,aaaa,Name,[{0,0,0,0,0,0,32512,28}],undefined},
- {in,cname,"cname."++Name,[Name],undefined},
- {in,a,"cname."++Name,[Name,{127,0,0,28}],undefined},
- {in,ns,"ns."++Name,[],[Name]},
- {in,soa,Domain,[],[{"ns.otptest","lsa.otptest",1,60,10,300,30}]},
+ L = [{a,Name,[{a,{127,0,0,28}}],undefined},
+ {aaaa,Name,[{aaaa,{0,0,0,0,0,0,32512,28}}],undefined},
+ {cname,"cname."++Name,[{cname,Name}],undefined},
+ {a,"cname."++Name,[{cname,Name},{a,{127,0,0,28}}],undefined},
+ {ns,"ns."++Name,[],[{ns,Name}]},
+ {soa,Domain,[],[{soa,{"ns.otptest","lsa.otptest",1,60,10,300,30}}]},
%% WKS: protocol TCP (6), services (bits) TELNET (23) and SMTP (25)
- {in,wks,"wks."++Name,[{{127,0,0,28},6,<<0,0,1,64>>}],undefined},
- {in,ptr,"28."++RDomain4,[Name],undefined},
- {in,ptr,"c.1.0.0.0.0.f.7."++RDomain6,[Name],undefined},
- {in,hinfo,Name,[{"BEAM","Erlang/OTP"}],undefined},
- {in,mx,RDomain4,[{10,"mx."++Domain}],undefined},
- {in,srv,"_srv._tcp."++Name,[{10,3,4711,Name}],undefined},
- {in,naptr,"naptr."++Name,
- [{10,5,"s","http","","_srv._tcp."++Name}],undefined},
- {in,txt,"txt."++Name,
- [["Hej ","du ","glade "],["ta ","en ","spade!"]],undefined},
- {in,mb,"mb."++Name,["mx."++Name],undefined},
- {in,mg,"mg."++Name,["lsa."++Domain],undefined},
- {in,mr,"mr."++Name,["lsa."++Domain],undefined},
- {in,minfo,"minfo."++Name,
- [{"minfo-owner."++Name,"minfo-bounce."++Name}],undefined},
- {in,any,"cname."++Name,[Name],undefined},
- {in,any,Name,[{127,0,0,28},
- {0,0,0,0,0,0,32512,28},
- {"BEAM","Erlang/OTP"}],undefined}
+ {wks,"wks."++Name,[{wks,{{127,0,0,28},6,<<0,0,1,64>>}}],undefined},
+ {ptr,"28."++RDomain4,[{ptr,Name}],undefined},
+ {ptr,"c.1.0.0.0.0.f.7."++RDomain6,[{ptr,Name}],undefined},
+ {hinfo,Name,[{hinfo,{"BEAM","Erlang/OTP"}}],undefined},
+ {mx,RDomain4,[{mx,{10,"mx."++Domain}}],undefined},
+ {srv,"_srv._tcp."++Name,[{srv,{10,3,4711,Name}}],undefined},
+ {naptr,"naptr."++Name,
+ [{naptr,{10,5,"s","http","","_srv._tcp."++Name}}],
+ undefined},
+ {txt,"txt."++Name,
+ [{txt,["Hej ","du ","glade "]},{txt,["ta ","en ","spade!"]}],
+ undefined},
+ {mb,"mb."++Name,[{mb,"mx."++Name}],undefined},
+ {mg,"mg."++Name,[{mg,"Lsa."++Domain}],undefined},
+ {mr,"mr."++Name,[{mr,"LSA."++Domain}],undefined},
+ {minfo,"minfo."++Name,
+ [{minfo,{"minfo-OWNER."++Name,"MinfoBounce."++Name}}],
+ undefined},
+ {any,"cname."++Name,[{cname,Name}],undefined},
+ {any,Name,
+ [{a,{127,0,0,28}},
+ {aaaa,{0,0,0,0,0,0,32512,28}},
+ {hinfo,{"BEAM","Erlang/OTP"}}],
+ undefined}
],
- resolve([{edns,false},{nameservers,[NS]}], L),
- resolve([{edns,0},{nameservers,[NS]}], L).
-
-resolve(_Opts, []) -> ok;
-resolve(Opts, [{Class,Type,Name,Answers,Authority}=Q|Qs]) ->
+ resolve(Class, [{edns,0},{nameservers,[NS]}], L),
+ resolve(Class, [{edns,false},{nameservers,[NS]}], L),
+ %% Again, to see ensure the cache does not mess things up
+ resolve(Class, [{edns,0},{nameservers,[NS]}], L),
+ resolve(Class, [{edns,false},{nameservers,[NS]}], L).
+
+resolve(_Class, _Opts, []) ->
+ ok;
+resolve(Class, Opts, [{Type,Nm,Answers,Authority}=Q|Qs]) ->
io:format("Query: ~p~nOptions: ~p~n", [Q,Opts]),
- {ok,Msg} = inet_res:resolve(Name, Class, Type, Opts),
+ {Name,NameC} =
+ case erlang:phash2(Q) band 4 of
+ 0 ->
+ {Nm,caseflip(Nm)};
+ _ ->
+ {caseflip(Nm),Nm}
+ end,
AnList =
if
Answers =/= undefined ->
- lists:sort(Answers);
+ normalize_answers(Answers);
true ->
undefined
end,
NsList =
if
Authority =/= undefined ->
- lists:sort(Authority);
+ normalize_answers(Authority);
true ->
undefined
end,
- case {lists:sort
- ([inet_dns:rr(RR, data) || RR <- inet_dns:msg(Msg, anlist)]),
- lists:sort
- ([inet_dns:rr(RR, data) || RR <- inet_dns:msg(Msg, nslist)])} of
+ {ok,Msg} = inet_res:resolve(Name, Class, Type, Opts),
+ check_msg(Class, Type, Msg, AnList, NsList),
+ {ok,MsgC} = inet_res:resolve(NameC, Class, Type, Opts),
+ check_msg(Class, Type, MsgC, AnList, NsList),
+ resolve(Class, Opts, Qs).
+
+
+
+normalize_answers(AnList) ->
+ lists:sort([normalize_answer(Answer) || Answer <- AnList]).
+
+normalize_answer({soa,{NS,HM,Ser,Ref,Ret,Exp,Min}}) ->
+ {tolower(NS),tolower_email(HM),Ser,Ref,Ret,Exp,Min};
+normalize_answer({mx,{Prio,DN}}) ->
+ {Prio,tolower(DN)};
+normalize_answer({srv,{Prio,Weight,Port,DN}}) ->
+ {Prio,Weight,Port,tolower(DN)};
+normalize_answer({naptr,{Order,Pref,Flags,Service,RE,Repl}}) ->
+ {Order,Pref,Flags,Service,RE,tolower(Repl)};
+normalize_answer({minfo,{RespM,ErrM}}) ->
+ {tolower_email(RespM),tolower_email(ErrM)};
+normalize_answer({T,MN}) when T =:= mg; T =:= mr ->
+ tolower_email(MN);
+normalize_answer({T,DN}) when T =:= cname; T =:= ns; T =:= ptr; T =:= mb ->
+ tolower(DN);
+normalize_answer(Answer) ->
+ Answer.
+
+check_msg(Class, Type, Msg, AnList, NsList) ->
+ io:format("check_msg Type: ~p, Msg: ~p~n.", [Type,Msg]),
+ case {normalize_answers(
+ [begin
+ Class = inet_dns:rr(RR, class),
+ {inet_dns:rr(RR, type),inet_dns:rr(RR, data)}
+ end || RR <- inet_dns:msg(Msg, anlist)]),
+ normalize_answers(
+ [begin
+ Class = inet_dns:rr(RR, class),
+ {inet_dns:rr(RR, type),inet_dns:rr(RR, data)}
+ end || RR <- inet_dns:msg(Msg, nslist)])} of
{AnList,NsList} ->
ok;
{NsList,AnList} when Type =:= ns ->
@@ -389,7 +467,7 @@ resolve(Opts, [{Class,Type,Name,Answers,Authority}=Q|Qs]) ->
end,
Buf = inet_dns:encode(Msg),
{ok,Msg} = inet_dns:decode(Buf),
- resolve(Opts, Qs).
+ ok.
%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -497,6 +575,7 @@ files_monitor(Config) when is_list(Config) ->
do_files_monitor(Config) ->
Dir = ?config(priv_dir, Config),
{ok,Hostname} = inet:gethostname(),
+ io:format("Hostname = ~p.~n", [Hostname]),
FQDN =
case inet_db:res_option(domain) of
"" ->
@@ -504,11 +583,13 @@ do_files_monitor(Config) ->
_ ->
Hostname++"."++inet_db:res_option(domain)
end,
+ io:format("FQDN = ~p.~n", [FQDN]),
HostsFile = filename:join(Dir, "files_monitor_hosts"),
ResolvConf = filename:join(Dir, "files_monitor_resolv.conf"),
ok = inet_db:res_option(resolv_conf, ResolvConf),
ok = inet_db:res_option(hosts_file, HostsFile),
[] = inet_db:res_option(search),
+ %% The inet function will use its final fallback to find this host
{ok,#hostent{h_name = Hostname,
h_addrtype = inet,
h_length = 4,
@@ -521,6 +602,7 @@ do_files_monitor(Config) ->
{error,nxdomain} = inet_res:gethostbyname(FQDN),
{ok,{127,0,0,10}} = inet:getaddr("mx.otptest", inet),
{ok,{0,0,0,0,0,0,32512,28}} = inet:getaddr("resolve.otptest", inet6),
+ %% The inet function will use its final fallback to find this host
{ok,#hostent{h_name = Hostname,
h_addrtype = inet6,
h_length = 16,
@@ -603,3 +685,41 @@ ipv4_to_ipv6() -> inet_SUITE:ipv4_to_ipv6().
ipv4_to_ipv6(Config) -> inet_SUITE:ipv4_to_ipv6(Config).
host_and_addr() -> inet_SUITE:host_and_addr().
host_and_addr(Config) -> inet_SUITE:host_and_addr(Config).
+
+
+
+%% Case flip helper
+
+caseflip([C|Cs]) when is_integer(C), $a =< C, C =< $z ->
+ [(C - $a + $A)|caseflip_skip(Cs)];
+caseflip([C|Cs]) when is_integer(C), $A =< C, C =< $Z ->
+ [(C - $A + $a)|caseflip_skip(Cs)];
+caseflip([C|Cs]) ->
+ [C|caseflip(Cs)];
+caseflip([]) ->
+ [].
+
+caseflip_skip([C|Cs]) when is_integer(C), $a =< C, C =< $z ->
+ [C|caseflip(Cs)];
+caseflip_skip([C|Cs]) when is_integer(C), $A =< C, C =< $Z ->
+ [C|caseflip(Cs)];
+caseflip_skip([C|Cs]) ->
+ [C|caseflip_skip(Cs)];
+caseflip_skip([]) ->
+ [].
+
+tolower_email([$.|Cs]) ->
+ [$.|tolower(Cs)];
+tolower_email([C|Cs]) ->
+ [C|tolower_email(Cs)].
+
+%% Case fold to lower case according to RFC 4343
+%%
+tolower([C|Cs]) when is_integer(C) ->
+ if $A =< C, C =< $Z ->
+ [(C - $A + $a)|tolower(Cs)];
+ true ->
+ [C|tolower(Cs)]
+ end;
+tolower([]) ->
+ [].
diff --git a/lib/kernel/test/inet_res_SUITE_data/otptest/named_inc.conf b/lib/kernel/test/inet_res_SUITE_data/otptest/named_inc.conf
index 0b01b25204..2d68f6e59c 100644
--- a/lib/kernel/test/inet_res_SUITE_data/otptest/named_inc.conf
+++ b/lib/kernel/test/inet_res_SUITE_data/otptest/named_inc.conf
@@ -2,11 +2,11 @@ zone "." in {
type master;
file "root.zone";
};
-zone "0.0.127.in-addr.arpa" in {
+zone "0.0.127.in-addr.arpa." in {
type master;
file "0.0.127.in-addr.arpa.zone";
};
-zone "0.0.0.0.f.7.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa" in {
+zone "0.0.0.0.f.7.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa." in {
type master;
file "0.0.0.0.f.7.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa.zone";
-}; \ No newline at end of file
+};
diff --git a/lib/kernel/test/inet_res_SUITE_data/otptest/root.zone b/lib/kernel/test/inet_res_SUITE_data/otptest/root.zone
index 11cba18d45..5a56eac95c 100644
--- a/lib/kernel/test/inet_res_SUITE_data/otptest/root.zone
+++ b/lib/kernel/test/inet_res_SUITE_data/otptest/root.zone
@@ -43,8 +43,8 @@ naptr.resolve.otptest IN NAPTR 10 5 "S" "HTTP" "" _srv._tcp.resolve.otptest
txt.resolve.otptest IN TXT "Hej " "du " "glade "
txt.resolve.otptest IN TXT "ta " "en " "spade!"
mb.resolve.otptest IN MB mx.resolve.otptest
-mg.resolve.otptest IN MG lsa.otptest
-mr.resolve.otptest IN MR lsa.otptest
-minfo.resolve.otptest IN MINFO minfo-owner.resolve.otptest minfo-bounce.resolve.otptest
+mg.resolve.otptest IN MG Lsa.otptest
+mr.resolve.otptest IN MR LSA.otptest
+minfo.resolve.otptest IN MINFO minfo-OWNER.resolve.otptest MinfoBounce.resolve.otptest
ns.otptest IN A 127.0.0.254
diff --git a/lib/kernel/test/inet_sockopt_SUITE.erl b/lib/kernel/test/inet_sockopt_SUITE.erl
index 75496ce745..185751fead 100644
--- a/lib/kernel/test/inet_sockopt_SUITE.erl
+++ b/lib/kernel/test/inet_sockopt_SUITE.erl
@@ -772,8 +772,10 @@ all_listen_options() ->
{mode,list,binary,true,true},
{deliver,term,port,true,true},
{exit_on_close, true, false, true, true},
- %{high_watermark,4096,8192,true,true},
- %{low_watermark,2048,4096,true,true},
+ {high_watermark,4096,8192,true,true},
+ {low_watermark,2048,4096,true,true},
+ {high_msgq_watermark,4096,8192,true,true},
+ {low_msgq_watermark,2048,4096,true,true},
{send_timeout,infinity,1000,true,true},
{send_timeout_close,false,true,true,true},
{delay_send,false,true,true,true},
@@ -797,6 +799,8 @@ all_connect_options() ->
{exit_on_close, true, false, true, true},
{high_watermark,4096,8192,false,true},
{low_watermark,2048,4096,false,true},
+ {high_msgq_watermark,4096,8192,true,true},
+ {low_msgq_watermark,2048,4096,true,true},
{send_timeout,infinity,1000,true,true},
{send_timeout_close,false,true,true,true},
{delay_send,false,true,true,true},
diff --git a/lib/kernel/test/interactive_shell_SUITE.erl b/lib/kernel/test/interactive_shell_SUITE.erl
index 36e13cec26..d7d9434b1f 100644
--- a/lib/kernel/test/interactive_shell_SUITE.erl
+++ b/lib/kernel/test/interactive_shell_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2012. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2013. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -193,7 +193,7 @@ job_control_remote(Config) when is_list(Config) ->
{skip,"No new shell found"};
_ ->
?line RNode = create_nodename(),
- ?line MyNode = atom_to_list(node()),
+ ?line MyNode = atom2list(node()),
?line Pid = spawn_link(fun() ->
receive die ->
ok
@@ -211,7 +211,7 @@ job_control_remote(Config) when is_list(Config) ->
{sleep,timeout(short)},
{putline,""},
{getline," -->"},
- {putline,"r "++MyNode},
+ {putline,"r '"++MyNode++"'"},
{putline,"c"},
{putline_raw,""},
{getline,"Eshell"},
@@ -254,7 +254,7 @@ job_control_remote_noshell(Config) when is_list(Config) ->
end),
?line PidStr = rpc:call(NSNode,erlang,pid_to_list,[Pid]),
?line true = rpc:call(NSNode,erlang,register,[kalaskula,Pid]),
- ?line NSNodeStr = atom_to_list(NSNode),
+ ?line NSNodeStr = atom2list(NSNode),
?line CookieString = lists:flatten(
io_lib:format("~w",
[erlang:get_cookie()])),
@@ -265,7 +265,7 @@ job_control_remote_noshell(Config) when is_list(Config) ->
{sleep,timeout(short)},
{putline,""},
{getline," -->"},
- {putline,"r "++NSNodeStr},
+ {putline,"r '"++NSNodeStr++"'"},
{putline,"c"},
{putline_raw,""},
{getline,"Eshell"},
@@ -715,7 +715,10 @@ get_default_shell() ->
{putline, "whereis(user_drv)."},
{getline, "undefined"}],[]),
old
- catch E:R ->
- ?dbg({E,R}),
+ catch _E:_R ->
+ ?dbg({_E,_R}),
new
end.
+
+atom2list(A) ->
+ lists:flatten(io_lib:format("~s", [A])).
diff --git a/lib/kernel/test/os_SUITE.erl b/lib/kernel/test/os_SUITE.erl
index 382fd6f6a9..73ed704ae3 100644
--- a/lib/kernel/test/os_SUITE.erl
+++ b/lib/kernel/test/os_SUITE.erl
@@ -18,20 +18,21 @@
%%
-module(os_SUITE).
--export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
+-export([all/0, suite/0,groups/0,init_per_suite/1, end_per_suite/1,
init_per_group/2,end_per_group/2]).
-export([space_in_cwd/1, quoting/1, space_in_name/1, bad_command/1,
- find_executable/1, unix_comment_in_command/1, evil/1]).
+ find_executable/1, unix_comment_in_command/1, deep_list_command/1, evil/1]).
-include_lib("test_server/include/test_server.hrl").
suite() -> [{ct_hooks,[ts_install_cth]}].
-all() ->
+all() ->
[space_in_cwd, quoting, space_in_name, bad_command,
- find_executable, unix_comment_in_command, evil].
+ find_executable, unix_comment_in_command, deep_list_command,
+ evil].
-groups() ->
+groups() ->
[].
init_per_suite(Config) ->
@@ -117,9 +118,9 @@ space_in_name(Config) when is_list(Config) ->
?line ok = file:change_mode(Echo, 8#777), % Make it executable on Unix.
%% Run the echo program.
- %% Quoting on windows depends on if the full path of the executable
+ %% Quoting on windows depends on if the full path of the executable
%% contains special characters. Paths when running common_tests always
- %% include @, why Windows would always fail if we do not double the
+ %% include @, why Windows would always fail if we do not double the
%% quotes (this is the behaviour of cmd.exe, not Erlang's idea).
Quote = case os:type() of
{win32,_} ->
@@ -135,7 +136,7 @@ space_in_name(Config) when is_list(Config) ->
?t:sleep(5),
?line [] = receive_all(),
ok.
-
+
bad_command(doc) ->
"Check that a bad command doesn't crasch the server or the emulator (it used to).";
bad_command(suite) -> [];
@@ -153,17 +154,17 @@ find_executable(suite) -> [];
find_executable(doc) -> [];
find_executable(Config) when is_list(Config) ->
case os:type() of
- {win32, _} ->
+ {win32, _} ->
?line DataDir = filename:join(?config(data_dir, Config), "win32"),
?line ok = file:set_cwd(filename:join([DataDir, "current"])),
?line Bin = filename:join(DataDir, "bin"),
?line Abin = filename:join(DataDir, "abin"),
?line UsrBin = filename:join([DataDir, "usr", "bin"]),
?line {ok, Current} = file:get_cwd(),
-
+
?line Path = lists:concat([Bin, ";", Abin, ";", UsrBin]),
?line io:format("Path = ~s", [Path]),
-
+
%% Search for programs in Bin (second element in PATH).
?line find_exe(Abin, "my_ar", ".exe", Path),
?line find_exe(Abin, "my_ascii", ".com", Path),
@@ -175,18 +176,18 @@ find_executable(Config) when is_list(Config) ->
?line find_exe(Abin, "my_ar.EXE", "", Path),
?line find_exe(Abin, "my_ascii.COM", "", Path),
?line find_exe(Abin, "MY_ADB.BAT", "", Path),
-
+
%% Search for programs in Abin (second element in PATH).
?line find_exe(Abin, "my_ar", ".exe", Path),
?line find_exe(Abin, "my_ascii", ".com", Path),
?line find_exe(Abin, "my_adb", ".bat", Path),
-
+
%% Search for programs in the current working directory.
?line find_exe(Current, "my_program", ".exe", Path),
?line find_exe(Current, "my_command", ".com", Path),
?line find_exe(Current, "my_batch", ".bat", Path),
ok;
- {unix, _} ->
+ {unix, _} ->
DataDir = ?config(data_dir, Config),
%% Smoke test.
@@ -237,6 +238,21 @@ unix_comment_in_command(Config) when is_list(Config) ->
?line test_server:timetrap_cancel(Dog),
ok.
+deep_list_command(doc) ->
+ "Check that a deep list in command works equally on unix and on windows.";
+deep_list_command(suite) -> [];
+deep_list_command(Config) when is_list(Config) ->
+ %% As a 'io_lib' module description says: "There is no guarantee that the
+ %% character lists returned from some of the functions are flat, they can
+ %% be deep lists."
+ %% That's why os:cmd/1 can have arguments that are deep lists.
+ %% It is not a problem for unix, but for windows it is (in R15B02 for ex.).
+ Echo = os:cmd([$e, $c, "ho"]),
+ true = erlang:is_list(Echo),
+ %% FYI: [$e, $c, "ho"] =:= io_lib:format("ec~s", ["ho"])
+ ok.
+
+
-define(EVIL_PROCS, 100).
-define(EVIL_LOOPS, 100).
-define(PORT_CREATOR, os_cmd_port_creator).
@@ -303,4 +319,3 @@ receive_all() ->
X -> [X|receive_all()]
after 0 -> []
end.
-
diff --git a/lib/kernel/test/prim_file_SUITE.erl b/lib/kernel/test/prim_file_SUITE.erl
index ac75037536..199e597e78 100644
--- a/lib/kernel/test/prim_file_SUITE.erl
+++ b/lib/kernel/test/prim_file_SUITE.erl
@@ -2039,6 +2039,8 @@ symlinks(Config, Handle, Suffix) ->
?PRIM_FILE_call(read_link, Handle, [Alias]),
{ok, Name} =
?PRIM_FILE_call(read_link_all, Handle, [Alias]),
+ %% If all is good, delete dir again (avoid hanging dir on windows)
+ rm_rf(?PRIM_FILE,NewDir),
ok
end,
@@ -2245,3 +2247,18 @@ zip_data([], Bs) ->
Bs;
zip_data(As, []) ->
As.
+
+%%%-----------------------------------------------------------------
+%%% Utilities
+rm_rf(Mod,Dir) ->
+ case Mod:read_link_info(Dir) of
+ {ok, #file_info{type = directory}} ->
+ {ok, Content} = Mod:list_dir_all(Dir),
+ [ rm_rf(Mod,filename:join(Dir,C)) || C <- Content ],
+ Mod:del_dir(Dir),
+ ok;
+ {ok, #file_info{}} ->
+ Mod:delete(Dir);
+ _ ->
+ ok
+ end.
diff --git a/lib/kernel/vsn.mk b/lib/kernel/vsn.mk
index b6cf4407d2..49404196dd 100644
--- a/lib/kernel/vsn.mk
+++ b/lib/kernel/vsn.mk
@@ -1 +1 @@
-KERNEL_VSN = 2.16.1
+KERNEL_VSN = 2.16.2