File 3301-Ensure-testsuites-only-write-to-temporary-directory.patch of Package erlang
From 4daaa84cf99f26647ffa66f100c788eae533897d Mon Sep 17 00:00:00 2001
From: Anders Svensson <anders@erlang.org>
Date: Fri, 18 Mar 2022 14:24:52 +0100
Subject: [PATCH] Ensure testsuites only write to temporary directory
The compiler, codec, and examples testsuites wrote to pwd, which
common_test changes to its priv_dir, but that isn't ideal without
common_test. Write to a created temporary directory in this case.
---
lib/diameter/test/diameter_app_SUITE.erl | 2 +-
lib/diameter/test/diameter_codec_SUITE.erl | 29 ++++----
lib/diameter/test/diameter_compiler_SUITE.erl | 61 +++++++++-------
lib/diameter/test/diameter_examples_SUITE.erl | 69 ++++++++++++-------
lib/diameter/test/diameter_tls_SUITE.erl | 2 +-
lib/diameter/test/diameter_util.erl | 2 +-
6 files changed, 98 insertions(+), 67 deletions(-)
diff --git a/lib/diameter/test/diameter_app_SUITE.erl b/lib/diameter/test/diameter_app_SUITE.erl
index 561d4283a2..adcc7114a1 100644
--- a/lib/diameter/test/diameter_app_SUITE.erl
+++ b/lib/diameter/test/diameter_app_SUITE.erl
@@ -76,7 +76,7 @@ run() ->
run(all()).
run(List) ->
- Tmp = ?util:mktemp(filename:join(?util:tmpdir(), "diameter_app")),
+ Tmp = ?util:mktemp("diameter_app"),
try
run([{priv_dir, Tmp}], List)
after
diff --git a/lib/diameter/test/diameter_codec_SUITE.erl b/lib/diameter/test/diameter_codec_SUITE.erl
index ff8a031460..f92b360dab 100644
--- a/lib/diameter/test/diameter_codec_SUITE.erl
+++ b/lib/diameter/test/diameter_codec_SUITE.erl
@@ -97,7 +97,7 @@ run(lib) ->
%% Have a separate AVP dictionary just to exercise more code.
run(unknown) ->
- PD = ?util:mktemp(filename:join(?util:tmpdir(), "diameter_codec")),
+ PD = ?util:mktemp("diameter_codec"),
DD = filename:join([code:lib_dir(diameter),
"test",
"diameter_codec_SUITE_data"]),
@@ -132,24 +132,25 @@ run(List) ->
%% ===========================================================================
unknown(Priv, Data) ->
- ok = make(Data, "recv.dia"),
- ok = make(Data, "avps.dia"),
- {ok, _, _} = compile("diameter_test_avps.erl"),
- ok = make(Data, "send.dia"),
- {ok, _, _} = compile("diameter_test_send.erl"),
- {ok, _, _} = compile("diameter_test_recv.erl"),
- {ok, _, _} = compile(filename:join([Data, "diameter_test_unknown.erl"]),
+ ok = make(Data, "recv.dia", Priv),
+ ok = make(Data, "avps.dia", Priv),
+ {ok, _, _} = compile(Priv, "diameter_test_avps.erl"),
+ ok = make(Data, "send.dia", Priv),
+ {ok, _, _} = compile(Priv, "diameter_test_send.erl"),
+ {ok, _, _} = compile(Priv, "diameter_test_recv.erl"),
+ {ok, _, _} = compile(Priv,
+ filename:join([Data, "diameter_test_unknown.erl"]),
[{i, Priv}]),
diameter_test_unknown:run().
-make(Dir, File) ->
- diameter_make:codec(filename:join([Dir, File])).
+make(Dir, File, Out) ->
+ diameter_make:codec(filename:join(Dir, File), [{outdir, Out}]).
-compile(File) ->
- compile(File, []).
+compile(Dir, File) ->
+ compile(Dir, File, []).
-compile(File, Opts) ->
- compile:file(File, [return | Opts]).
+compile(Dir, File, Opts) ->
+ compile:file(filename:join(Dir, File), [return | Opts]).
%% ===========================================================================
diff --git a/lib/diameter/test/diameter_compiler_SUITE.erl b/lib/diameter/test/diameter_compiler_SUITE.erl
index 071ab26d08..cd886d4e8e 100644
--- a/lib/diameter/test/diameter_compiler_SUITE.erl
+++ b/lib/diameter/test/diameter_compiler_SUITE.erl
@@ -383,31 +383,46 @@ run() ->
%% run/1
-run(List) ->
+run(List)
+ when is_list(List) ->
+ Tmp = ?util:mktemp("diameter_compiler"),
+ try
+ run(List, Tmp)
+ after
+ file:del_dir_r(Tmp)
+ end.
+
+%% run/2
+
+run(List, Dir)
+ when is_list(List) ->
Path = filename:join([code:lib_dir(diameter, src), "dict", ?base]),
{ok, Bin} = file:read_file(Path),
- ?util:run([{{?MODULE, F, [Bin]}, 180000} || F <- List]).
+ ?util:run([{{?MODULE, F, [{Bin, Dir}]}, 180000} || F <- List]);
+
+run(F, Config) ->
+ run([F], proplists:get_value(priv_dir, Config)).
%% ===========================================================================
%% format/1
%%
%% Ensure that parse o format is the identity map.
-format(<<_/binary>> = Bin) ->
+format({<<_/binary>> = Bin, _Dir}) ->
?util:run([{?MODULE, format, [{M, Bin}]} || E <- ?REPLACE,
{ok, M} <- [norm(E)]]);
format({Mods, Bin}) ->
B = modify(Bin, Mods),
- {ok, Dict} = parse(B, []),
- {ok, D} = parse(diameter_make:format(Dict), []),
+ {ok, Dict} = parse(B),
+ {ok, D} = parse(diameter_make:format(Dict)),
{Dict, Dict} = {Dict, D};
-format(_Config) ->
- run([format]).
+format(Config) ->
+ run(format, Config).
-parse(File, Opts) ->
- case diameter_make:codec(File, [parse, hrl, return | Opts]) of
+parse(File) ->
+ case diameter_make:codec(File, [parse, hrl, return]) of
{ok, [Dict, _]} ->
{ok, Dict};
{error, _} = E ->
@@ -420,21 +435,21 @@ parse(File, Opts) ->
%% Ensure the expected success/error when parsing a morphed common
%% dictionary.
-replace(<<_/binary>> = Bin) ->
+replace({<<_/binary>> = Bin, _Dir}) ->
?util:run([{?MODULE, replace, [{N, Bin}]} || E <- ?REPLACE,
N <- [norm(E)]]);
replace({{E, Mods}, Bin}) ->
B = modify(Bin, Mods),
- case {E, parse(B, [{include, here()}]), Mods} of
+ case {E, parse(B), Mods} of
{ok, {ok, Dict}, _} ->
Dict;
{_, {error, {E,_} = T}, _} when E /= ok ->
diameter_make:format_error(T)
end;
-replace(_Config) ->
- run([replace]).
+replace(Config) ->
+ run(replace, Config).
re({RE, Repl}, Bin) ->
re:replace(Bin, RE, Repl, [multiline]).
@@ -444,25 +459,26 @@ re({RE, Repl}, Bin) ->
%%
%% Ensure success when generating code and compiling.
-generate(<<_/binary>> = Bin) ->
+generate({<<_/binary>> = Bin, Dir}) ->
Rs = lists:zip(?REPLACE, lists:seq(1, length(?REPLACE))),
- ?util:run([{?MODULE, generate, [{M, Bin, N, T}]}
+ ?util:run([{?MODULE, generate, [{M, Bin, N, T, Dir}]}
|| {E,N} <- Rs,
{ok, M} <- [norm(E)],
T <- [erl, hrl, parse, forms]]);
-generate({Mods, Bin, N, Mode}) ->
+generate({Mods, Bin, N, Mode, Dir}) ->
B = modify(Bin, Mods ++ [{"@name .*", "@name dict" ++ ?L(N)}]),
- {ok, Dict} = parse(B, []),
+ {ok, Dict} = parse(B),
File = "dict" ++ integer_to_list(N),
{_, ok} = {Dict, diameter_make:codec(Dict,
[{name, File},
{prefix, "base"},
+ {outdir, Dir},
Mode])},
- generate(Mode, File, Dict);
+ generate(Mode, filename:join(Dir, File), Dict);
-generate(_Config) ->
- run([generate]).
+generate(Config) ->
+ run(generate, Config).
generate(erl, File, _) ->
{ok, _} = compile:file(File ++ ".erl", [return_errors]);
@@ -487,7 +503,7 @@ flatten1({Key, BaseD, FlatD}) ->
flatten1(_) ->
[Vsn | BaseD] = diameter_gen_base_rfc6733:dict(),
- {ok, I} = parse("@inherits diameter_gen_base_rfc6733\n", []),
+ {ok, I} = parse("@inherits diameter_gen_base_rfc6733\n"),
[Vsn | FlatD] = diameter_make:flatten(I),
?util:run([{?MODULE, flatten1, [{K, BaseD, FlatD}]}
|| K <- [avp_types, grouped, enum]]).
@@ -584,8 +600,5 @@ norm({E, RE, Repl}) ->
norm({_,_} = T) ->
T.
-here() ->
- filename:dirname(code:which(?MODULE)).
-
dict() ->
[0 | orddict:new()].
diff --git a/lib/diameter/test/diameter_tls_SUITE.erl b/lib/diameter/test/diameter_tls_SUITE.erl
index 4e8cde95d3..1e7f7ed50a 100644
--- a/lib/diameter/test/diameter_tls_SUITE.erl
+++ b/lib/diameter/test/diameter_tls_SUITE.erl
@@ -149,7 +149,7 @@ dir(Config) ->
%% ===========================================================================
run() ->
- Tmp = ?util:mktemp(filename:join(?util:tmpdir(), "diameter_tls")),
+ Tmp = ?util:mktemp("diameter_tls"),
try
run(Tmp, true)
after
diff --git a/lib/diameter/test/diameter_util.erl b/lib/diameter/test/diameter_util.erl
index feb8a74e5f..ab5f5d10a3 100644
--- a/lib/diameter/test/diameter_util.erl
+++ b/lib/diameter/test/diameter_util.erl
@@ -208,7 +208,7 @@ tmpdir() ->
mktemp(Prefix) ->
Suf = integer_to_list(erlang:monotonic_time()),
- Tmp = Prefix ++ "." ++ Suf,
+ Tmp = filename:join(tmpdir(), Prefix ++ "." ++ Suf),
ok = file:make_dir(Tmp),
Tmp.
--
2.34.1