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

openSUSE Build Service is sponsored by