diff options
Diffstat (limited to 'lib/kernel')
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 |