aboutsummaryrefslogtreecommitdiffstats
path: root/erts/test/install_SUITE.erl
diff options
context:
space:
mode:
Diffstat (limited to 'erts/test/install_SUITE.erl')
-rw-r--r--erts/test/install_SUITE.erl727
1 files changed, 727 insertions, 0 deletions
diff --git a/erts/test/install_SUITE.erl b/erts/test/install_SUITE.erl
new file mode 100644
index 0000000000..b11f65480d
--- /dev/null
+++ b/erts/test/install_SUITE.erl
@@ -0,0 +1,727 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2010. 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
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+
+
+%%%-------------------------------------------------------------------
+%%% File : install_SUITE.erl
+%%% Author : Rickard Green
+%%% Description :
+%%%
+%%% Created : 12 Jan 2010 by Rickard Green
+%%%-------------------------------------------------------------------
+-module(install_SUITE).
+
+%-define(line_trace, 1).
+
+-export([all/1, init_per_suite/1, end_per_suite/1,
+ init_per_testcase/2, fin_per_testcase/2]).
+
+-export([bin_default/1,
+ bin_default_dirty/1,
+ bin_outside_eprfx/1,
+ bin_outside_eprfx_dirty/1,
+ bin_unreasonable_path/1,
+ bin_not_abs/1,
+ 'bin white space'/1,
+ bin_no_srcfile/1,
+ bin_unreachable_absolute/1,
+ bin_unreachable_relative/1,
+ bin_same_dir/1,
+ bin_ok_symlink/1,
+ bin_dirname_fail/1,
+ bin_no_use_dirname_fail/1]).
+
+-define(DEFAULT_TIMEOUT, ?t:minutes(1)).
+-define(JOIN(A,B,C), filename:join(A, B, C)).
+
+-include("test_server.hrl").
+
+-record(inst, {mkdirs = true,
+ symlinks = true,
+ cmd_prefix = "",
+ ln_s = "ln -s",
+ test_prefix = "",
+ destdir = "",
+ extra_prefix = "",
+ exec_prefix = "",
+ bindir = "",
+ erlang_bindir = "",
+ bindir_symlinks = ""}).
+
+need_symlink_cases() ->
+ [bin_unreachable_absolute,
+ bin_unreachable_relative,
+ bin_same_dir,
+ bin_ok_symlink,
+ bin_dirname_fail,
+ bin_no_use_dirname_fail].
+
+dont_need_symlink_cases() ->
+ [bin_default,
+ bin_default_dirty,
+ bin_outside_eprfx,
+ bin_outside_eprfx_dirty,
+ bin_not_abs,
+ bin_unreasonable_path,
+ 'bin white space',
+ bin_no_srcfile].
+
+all(suite) ->
+ dont_need_symlink_cases() ++ need_symlink_cases().
+
+%%
+%% The test cases
+%%
+
+bin_default(Config) when is_list(Config) ->
+ ?line E = "/usr/local",
+ ?line Bs = "/usr/local/bin",
+ ?line Be = Bs,
+ ?line EBs = "/usr/local/lib/erlang/bin",
+ ?line EBe = EBs,
+ ?line RP = "../lib/erlang/bin",
+ ChkRes = fun (Res, #inst{test_prefix = TP,
+ destdir = D,
+ extra_prefix = EP,
+ bindir_symlinks = BSL,
+ symlinks = SL}) ->
+ ?line B = join([TP, D, EP, Be]),
+ Expct = case {SL, BSL} of
+ {false, _} when BSL == "relative";
+ BSL == "absolute" ->
+ ?line {error, no_ln_s};
+ {false, _} ->
+ ?line {ok,{absolute,
+ B,join([TP,D,EP,EBe])}};
+ {true, "absolute"} ->
+ ?line {ok,{absolute,B,join([TP,EP,EBe])}};
+ {true, _} ->
+ ?line {ok,{relative,B,RP}}
+ end,
+ expect(Expct, Res)
+ end,
+ install_bin(Config, #inst{exec_prefix = E,
+ bindir = Bs,
+ erlang_bindir = EBs}, ChkRes).
+
+bin_default_dirty(Config) when is_list(Config) ->
+ ?line E = "/usr/./local/lib/..",
+ ?line Bs = "/usr/local//lib/../lib/erlang/../../bin",
+ ?line Be = "/usr/local/lib/../lib/erlang/../../bin",
+ ?line EBs = "/usr/local/lib/../lib/erlang/../erlang/bin/x/y/../..//",
+ ?line EBe = "/usr/local/lib/../lib/erlang/../erlang/bin/x/y/../..",
+ ?line RP = "../lib/erlang/bin",
+ ChkRes = fun (Res, #inst{test_prefix = TP,
+ destdir = D,
+ extra_prefix = EP,
+ bindir_symlinks = BSL,
+ symlinks = SL}) ->
+ ?line B = join([TP, D, EP, Be]),
+ Expct = case {SL, BSL} of
+ {false, _} when BSL == "relative";
+ BSL == "absolute" ->
+ ?line {error, no_ln_s};
+ {false, _} ->
+ ?line {ok,{absolute,
+ B,join([TP,D,EP,EBe])}};
+ {true, "absolute"} ->
+ ?line {ok,{absolute,
+ B,join([TP,EP,EBe])}};
+ {true, _} ->
+ ?line {ok,{relative,B,RP}}
+ end,
+ expect(Expct, Res)
+ end,
+ install_bin(Config, #inst{exec_prefix = E,
+ bindir = Bs,
+ erlang_bindir = EBs}, ChkRes).
+
+
+bin_outside_eprfx(Config) when is_list(Config) ->
+ ?line E = "/usr/local",
+ ?line Bs = "/usr/bin",
+ ?line Be = Bs,
+ ?line EBs = "/usr/local/lib/erlang/bin",
+ ?line EBe = EBs,
+ ?line RP = "../local/lib/erlang/bin",
+ ChkRes = fun (Res, #inst{test_prefix = TP,
+ destdir = D,
+ extra_prefix = EP,
+ bindir_symlinks = BSL,
+ symlinks = SL}) ->
+ ?line B = join([TP, D, EP, Be]),
+ Expct = case {SL, BSL} of
+ {false, _} when BSL == "relative";
+ BSL == "absolute" ->
+ ?line {error, no_ln_s};
+ {false, _} ->
+ ?line {ok,{absolute,
+ B,join([TP,D,EP,EBe])}};
+ {true, "relative"} ->
+ ?line {ok,{relative,B,RP}};
+ {true, _} ->
+ ?line {ok,{absolute,B,join([TP,EP,EBe])}}
+ end,
+ expect(Expct, Res)
+ end,
+ install_bin(Config, #inst{exec_prefix = E,
+ bindir = Bs,
+ erlang_bindir = EBs}, ChkRes).
+
+
+bin_outside_eprfx_dirty(Config) when is_list(Config) ->
+ ?line E = "/usr/local/lib/..",
+ ?line Bs = "/usr/local/lib/../../bin",
+ ?line Be = Bs,
+ ?line EBs = "/usr/local/lib/erlang/bin",
+ ?line EBe = EBs,
+ ?line RP = "../local/lib/erlang/bin",
+ ChkRes = fun (Res, #inst{test_prefix = TP,
+ destdir = D,
+ extra_prefix = EP,
+ bindir_symlinks = BSL,
+ symlinks = SL}) ->
+ ?line B = join([TP, D, EP, Be]),
+ Expct = case {SL, BSL} of
+ {false, _} when BSL == "relative";
+ BSL == "absolute" ->
+ ?line {error, no_ln_s};
+ {false, _} ->
+ ?line {ok,{absolute,
+ B,join([TP,D,EP,EBe])}};
+ {true, "relative"} ->
+ ?line {ok,{relative,B,RP}};
+ {true, _} ->
+ ?line {ok,{absolute,B,join([TP,EP,EBe])}}
+ end,
+ expect(Expct, Res)
+ end,
+ install_bin(Config, #inst{exec_prefix = E,
+ bindir = Bs,
+ erlang_bindir = EBs}, ChkRes).
+
+bin_unreasonable_path(Config) when is_list(Config) ->
+ ?line E = "/usr/local/../../..",
+ ?line Bs = "/usr/local/../../../bin",
+ ?line Be = Bs,
+ ?line EBs = "/usr/local/../../../bin_unreasonable_path/usr/local/lib/erlang/bin",
+ ?line EBe = EBs,
+ ?line RP = "../bin_unreasonable_path/usr/local/lib/erlang/bin",
+ ChkRes = fun (Res, #inst{test_prefix = TP,
+ destdir = D,
+ extra_prefix = EP,
+ bindir_symlinks = BSL,
+ symlinks = SL}) ->
+ ?line B = join([TP, D, EP, Be]),
+ Expct = case {TP, SL, BSL} of
+ {_, false, _} when BSL == "relative";
+ BSL == "absolute" ->
+ ?line {error, no_ln_s};
+ {_, false, _} ->
+ ?line {ok,{absolute,
+ B,join([TP,D,EP,EBe])}};
+ {"", true, "relative"} ->
+ {error, unreasonable_path};
+ {"", true, _} ->
+ ?line {ok,{absolute,B,join([TP,EP,EBe])}};
+ {_, true, "absolute"} ->
+ ?line {ok,{absolute,B,join([TP,EP,EBe])}};
+ _ ->
+ ?line {ok,{relative,B,RP}}
+ end,
+ expect(Expct, Res)
+ end,
+ install_bin(Config, #inst{exec_prefix = E,
+ bindir = Bs,
+ erlang_bindir = EBs}, ChkRes).
+
+bin_unreachable_absolute(Config) when is_list(Config) ->
+ TDir = ?config(test_dir, Config),
+ make_dirs(TDir, "/opt/local/lib/erlang/usr/bin"),
+ make_dirs(TDir, "/opt/local/lib/erlang/bin"),
+ Erl = join([TDir, "/opt/local/lib/erlang/bin/erl"]),
+ Erlc = join([TDir, "/opt/local/lib/erlang/bin/erlc"]),
+ make_dirs(TDir, "/usr/local/lib"),
+ make_dirs(TDir, "/usr/local/bin"),
+ ok = file:write_file(Erl, "erl"),
+ ok = file:write_file(Erlc, "erlc"),
+ ok = file:make_symlink("../../../opt/local/lib/erlang/usr",
+ join([TDir, "/usr/local/lib/erlang"])),
+ ?line E = "/usr/local",
+ ?line Bs = "/usr/local/bin",
+ ?line Be = Bs,
+ ?line EBs = "/usr/local/lib/erlang/../bin",
+ ?line EBe = EBs,
+ ChkRes = fun (Res, #inst{test_prefix = TP,
+ destdir = D,
+ extra_prefix = EP,
+ bindir_symlinks = BSL,
+ symlinks = SL}) ->
+ ?line B = join([TP, D, EP, Be]),
+ Expct = case {SL, BSL} of
+ {false, _} when BSL == "relative";
+ BSL == "absolute" ->
+ ?line {error, no_ln_s};
+ {false, _} ->
+ ?line {ok,{absolute,
+ B,join([TP,D,EP,EBe])}};
+ {true, "relative"} ->
+ {error, unreachable_absolute};
+ {true, _} ->
+ ?line {ok,{absolute,B,join([TP,EP,EBe])}}
+ end,
+ expect(Expct, Res)
+ end,
+ install_bin(Config, #inst{exec_prefix = E,
+ bindir = Bs,
+ erlang_bindir = EBs}, ChkRes).
+
+bin_unreachable_relative(Config) when is_list(Config) ->
+ TDir = ?config(test_dir, Config),
+ make_dirs(TDir, "/opt/local/lib/erlang/bin"),
+ make_dirs(TDir, "/opt/local/bin"),
+ make_dirs(TDir, "/usr/local/lib/erlang/bin"),
+ Erl = join([TDir, "/usr/local/lib/erlang/bin/erl"]),
+ Erlc = join([TDir, "/usr/local/lib/erlang/bin/erlc"]),
+ ok = file:write_file(Erl, "erl"),
+ ok = file:write_file(Erlc, "erlc"),
+ ok = file:make_symlink("../../opt/local/bin",
+ join([TDir, "/usr/local/bin"])),
+
+ ?line E = "/usr/local",
+ ?line Bs = "/usr/local/bin",
+ ?line Be = Bs,
+ ?line EBs = "/usr/local/lib/erlang/bin",
+ ?line EBe = EBs,
+ ChkRes = fun (Res, #inst{test_prefix = TP,
+ destdir = D,
+ extra_prefix = EP,
+ bindir_symlinks = BSL,
+ symlinks = SL}) ->
+ ?line B = join([TP, D, EP, Be]),
+ Expct = case {SL, BSL} of
+ {false, _} when BSL == "relative";
+ BSL == "absolute" ->
+ ?line {error, no_ln_s};
+ {false, _} ->
+ ?line {ok,{absolute,
+ B,join([TP,D,EP,EBe])}};
+ {true, "relative"} ->
+ {error, unreachable_relative};
+ {true, _} ->
+ ?line {ok,{absolute,B,join([TP,EP,EBe])}}
+ end,
+ expect(Expct, Res)
+ end,
+ install_bin(Config, #inst{exec_prefix = E,
+ bindir = Bs,
+ erlang_bindir = EBs}, ChkRes).
+
+bin_ok_symlink(Config) when is_list(Config) ->
+ TDir = ?config(test_dir, Config),
+ make_dirs(TDir, "/usr/local/bin"),
+ make_dirs(TDir, "/opt/local/lib/erlang/bin"),
+ Erl = join([TDir, "/opt/local/lib/erlang/bin/erl"]),
+ Erlc = join([TDir, "/opt/local/lib/erlang/bin/erlc"]),
+ ok = file:write_file(Erl, "erl"),
+ ok = file:write_file(Erlc, "erlc"),
+ ok = file:make_symlink("../../opt/local/lib",
+ join([TDir, "/usr/local/lib"])),
+ ?line E = "/usr/local",
+ ?line Bs = "/usr/local/bin",
+ ?line Be = Bs,
+ ?line EBs = "/usr/local/lib/erlang/bin",
+ ?line EBe = EBs,
+ ?line RP = "../lib/erlang/bin",
+ ChkRes = fun (Res, #inst{test_prefix = TP,
+ destdir = D,
+ extra_prefix = EP,
+ bindir_symlinks = BSL,
+ symlinks = SL}) ->
+ ?line B = join([TP, D, EP, Be]),
+ Expct = case {SL, BSL} of
+ {false, _} when BSL == "relative";
+ BSL == "absolute" ->
+ ?line {error, no_ln_s};
+ {false, _} ->
+ ?line {ok,{absolute,
+ B,join([TP,D,EP,EBe])}};
+ {true, "absolute"} ->
+ ?line {ok,{absolute,B,join([TP,EP,EBe])}};
+ {true, _} ->
+ ?line {ok,{relative,B,RP}}
+ end,
+ expect(Expct, Res)
+ end,
+ install_bin(Config, #inst{exec_prefix = E,
+ bindir = Bs,
+ erlang_bindir = EBs}, ChkRes).
+
+bin_same_dir(Config) when is_list(Config) ->
+ TDir = ?config(test_dir, Config),
+ make_dirs(TDir, "/usr/local/bin"),
+ make_dirs(TDir, "/usr/local/lib"),
+ ok = file:make_symlink("..", join([TDir, "/usr/local/lib/erlang"])),
+ Erl = join([TDir, "/usr/local/lib/erlang/bin/erl"]),
+ Erlc = join([TDir, "/usr/local/lib/erlang/bin/erlc"]),
+ ok = file:write_file(Erl, "erl"),
+ ok = file:write_file(Erlc, "erlc"),
+ ChkRes = fun (Res, _) ->
+ expect({error, target_and_source_same_dir}, Res)
+ end,
+ install_bin(Config,
+ #inst{mkdirs = false,
+ exec_prefix = "/usr/local",
+ bindir = "/usr/local/bin",
+ erlang_bindir = "/usr/local/lib/erlang/bin"},
+ ChkRes).
+
+bin_not_abs(Config) when is_list(Config) ->
+ ChkRes = fun (Res, #inst{test_prefix = TP}) ->
+ case TP of
+ "" ->
+ expect({error, {not_abs, 'bindir'}}, Res);
+ _ ->
+ B = join([TP, "/usr/local/bin"]),
+ {ok, {relative, B, "../lib/erlang/bin"}}
+ end
+ end,
+ install_bin(Config,
+ #inst{exec_prefix = "/usr/local",
+ bindir = "usr/local/bin",
+ erlang_bindir = "/usr/local/lib/erlang/bin"},
+ ChkRes).
+
+
+'bin white space'(Config) when is_list(Config) ->
+ ?line E = "/u s r/local",
+ ?line Bs = "/u s r/local/b i n",
+ ?line Be = Bs,
+ ?line EBs = "/u s r/local/lib/erl ang/bin",
+ ?line EBe = EBs,
+ ?line RP = "../lib/erl ang/bin",
+ ChkRes = fun (Res, #inst{test_prefix = TP,
+ destdir = D,
+ extra_prefix = EP,
+ bindir_symlinks = BSL,
+ symlinks = SL}) ->
+ ?line B = join([TP, D, EP, Be]),
+ Expct = case {SL, BSL} of
+ {false, _} when BSL == "relative";
+ BSL == "absolute" ->
+ ?line {error, no_ln_s};
+ {false, _} ->
+ ?line {ok,{absolute,
+ B,join([TP,D,EP,EBe])}};
+ {true, "absolute"} ->
+ ?line {ok,{absolute,B,join([TP,EP,EBe])}};
+ {true, _} ->
+ ?line {ok,{relative,B,RP}}
+ end,
+ expect(Expct, Res)
+ end,
+ install_bin(Config, #inst{exec_prefix = E,
+ bindir = Bs,
+ erlang_bindir = EBs}, ChkRes).
+
+bin_dirname_fail(Config) when is_list(Config) ->
+ ?line E = "/opt",
+ ?line Bs = "/opt/lib/../bin",
+ ?line Be = Bs,
+ ?line EBs = "/opt/lib/erlang/otp/bin",
+ ?line EBe = EBs,
+ ?line CMDPRFX = "PATH="++?config(data_dir,Config)++":"++os:getenv("PATH"),
+ ChkRes = fun (Res, #inst{test_prefix = TP,
+ destdir = D,
+ extra_prefix = EP,
+ bindir_symlinks = BSL,
+ symlinks = SL}) ->
+ ?line B = join([TP, D, EP, Be]),
+ Expct = case {SL, BSL} of
+ {false, _} when BSL == "relative";
+ BSL == "absolute" ->
+ ?line {error, no_ln_s};
+ {false, _} ->
+ ?line {ok,{absolute,
+ B,join([TP,D,EP,EBe])}};
+ {true, "relative"} ->
+ ?line {error, dirname_failed};
+ {true, _} ->
+ ?line {ok,{absolute,B,join([TP,EP,EBe])}}
+ end,
+ expect(Expct, Res)
+ end,
+ install_bin(Config, #inst{cmd_prefix = CMDPRFX,
+ exec_prefix = E,
+ bindir = Bs,
+ erlang_bindir = EBs}, ChkRes).
+
+bin_no_use_dirname_fail(Config) when is_list(Config) ->
+ ?line E = "/opt",
+ ?line Bs = "/opt/bin",
+ ?line Be = Bs,
+ ?line EBs = "/opt/lib/erlang/otp/bin",
+ ?line EBe = EBs,
+ ?line RP = "../lib/erlang/otp/bin",
+ ?line CMDPRFX = "PATH="++?config(data_dir,Config)++":"++os:getenv("PATH"),
+ ChkRes = fun (Res, #inst{test_prefix = TP,
+ destdir = D,
+ extra_prefix = EP,
+ bindir_symlinks = BSL,
+ symlinks = SL}) ->
+ ?line B = join([TP, D, EP, Be]),
+ Expct = case {SL, BSL} of
+ {false, _} when BSL == "relative";
+ BSL == "absolute" ->
+ ?line {error, no_ln_s};
+ {false, _} ->
+ ?line {ok,{absolute,
+ B,join([TP,D,EP,EBe])}};
+ {true, "absolute"} ->
+ ?line {ok,{absolute,B,join([TP,EP,EBe])}};
+ {true, _} ->
+ ?line {ok,{relative,B,RP}}
+ end,
+ expect(Expct, Res)
+ end,
+ install_bin(Config, #inst{cmd_prefix = CMDPRFX,
+ exec_prefix = E,
+ bindir = Bs,
+ erlang_bindir = EBs}, ChkRes).
+
+bin_no_srcfile(Config) when is_list(Config) ->
+ TDir = ?config(test_dir, Config),
+ make_dirs(TDir, "/opt/local/bin"),
+ make_dirs(TDir, "/opt/local/lib/erlang/bin"),
+ Erl = join([TDir, "/opt/local/lib/erlang/bin/erl"]),
+ ok = file:write_file(Erl, "erl"),
+ Erlc = join([TDir, "/opt/local/lib/erlang/bin/erlc"]),
+ RP_Erlc = "../lib/erlang/bin/erlc",
+ ChkRes = fun (Res, #inst{bindir_symlinks = BSL,
+ symlinks = SL}) ->
+ Expct = case {SL, BSL} of
+ {false, _} when BSL == "relative";
+ BSL == "absolute" ->
+ ?line {error, no_ln_s};
+ {false,_} ->
+ ?line {error,{no_srcfile, Erlc}};
+ {true, "absolute"} ->
+ ?line {error,{no_srcfile, Erlc}};
+ {true, _} ->
+ ?line {error,{no_srcfile, RP_Erlc}}
+ end,
+ expect(Expct, Res)
+ end,
+ install_bin(Config,
+ #inst{mkdirs = false,
+ exec_prefix = "/opt/local",
+ bindir = "/opt/local/bin",
+ erlang_bindir = "/opt/local/lib/erlang/bin"},
+ ChkRes).
+
+%%
+%%
+%% Auxiliary functions
+%%
+%%
+
+expect(X, X) ->
+ ?t:format("result: ~p~n", [X]),
+ ?t:format("-----------------------------------------------~n", []),
+ ok;
+expect(X, Y) ->
+ ?t:format("expected: ~p~n", [X]),
+ ?t:format("got : ~p~n", [Y]),
+ ?t:format("-----------------------------------------------~n", []),
+ ?t:fail({X,Y}).
+
+init_per_suite(Config) ->
+ PD = ?config(priv_dir, Config),
+ SymLinks = case ?t:os_type() of
+ {win32, _} -> false;
+ _ ->
+ case file:make_symlink("nothing",
+ filename:join(PD,
+ "symlink_test")) of
+ ok -> true;
+ _ -> false
+ end
+ end,
+ [{symlinks, SymLinks} | Config].
+
+end_per_suite(_Config) ->
+ ok.
+
+init_per_testcase(Case, Config) ->
+ init_per_testcase_aux(?config(symlinks,Config),?t:os_type(),Case,Config).
+
+init_per_testcase_aux(_, {win32, _}, _Case, _Config) ->
+ {skip, "Not on windows"};
+init_per_testcase_aux(false, OsType, Case, Config) ->
+ case lists:member(Case, need_symlink_cases()) of
+ false -> init_per_testcase_aux(true, OsType, Case, Config);
+ true -> {skip, "Cannot create symbolic links"}
+ end;
+init_per_testcase_aux(true, _OsType, Case, Config) ->
+ Dog = ?t:timetrap(?DEFAULT_TIMEOUT),
+ [{watchdog, Dog},
+ {testcase, Case},
+ {test_dir, make_dirs(?config(priv_dir, Config), atom_to_list(Case))}
+ | Config].
+
+fin_per_testcase(_Case, Config) ->
+ Dog = ?config(watchdog, Config),
+ ?t:timetrap_cancel(Dog),
+ ok.
+
+
+make_dirs(Root, Suffix) ->
+ do_make_dirs(Root, string:tokens(Suffix, [$/])).
+
+do_make_dirs(_Root, []) ->
+ "";
+do_make_dirs(Root, [D|Ds]) ->
+ Dir = filename:join(Root, D),
+ case file:make_dir(Dir) of
+ {error, eexist} -> ok;
+ ok -> ok;
+ Err -> exit({make_dir, Err})
+ end,
+ filename:join(Dir, do_make_dirs(Dir, Ds)).
+
+install_bin(Config, #inst{mkdirs = MkDirs,
+ exec_prefix = EXEC_PREFIX,
+ bindir = BINDIR,
+ erlang_bindir = ERLANG_BINDIR} = Inst, ChkRes) ->
+ PDir = ?config(priv_dir, Config),
+ TDir = ?config(test_dir, Config),
+ TD = atom_to_list(?config(testcase, Config)),
+ case MkDirs of
+ false -> ok;
+ true ->
+ make_dirs(TDir, EXEC_PREFIX),
+ make_dirs(TDir, BINDIR),
+ make_dirs(TDir, ERLANG_BINDIR),
+ Erl = join([TDir, ERLANG_BINDIR, "/erl"]),
+ Erlc = join([TDir, ERLANG_BINDIR, "/erlc"]),
+ ok = file:write_file(Erl, "erl"),
+ ok = file:write_file(Erlc, "erlc")
+ end,
+
+ install_bin2(Config, Inst#inst{destdir = TDir}, ChkRes),
+ install_bin2(Config, Inst#inst{extra_prefix = TDir}, ChkRes),
+ install_bin2(Config, Inst#inst{destdir = PDir,
+ extra_prefix = "/"++TD}, ChkRes),
+ install_bin2(Config,
+ Inst#inst{test_prefix = TDir,
+ exec_prefix = join([TDir, EXEC_PREFIX]),
+ bindir = join([TDir, BINDIR]),
+ erlang_bindir = join([TDir, ERLANG_BINDIR])},
+ ChkRes),
+ case ?config(symlinks, Config) of
+ true -> ok;
+ false -> {comment, "No symlink tests run, since symlinks not working"}
+ end.
+
+
+install_bin2(Config, Inst, ChkRes) ->
+ install_bin3(Config, Inst#inst{symlinks = false,
+ ln_s = "ln"}, ChkRes),
+ install_bin3(Config, Inst#inst{symlinks = false,
+ ln_s = "ln",
+ bindir_symlinks = "relative"}, ChkRes),
+ install_bin3(Config, Inst#inst{symlinks = false,
+ ln_s = "ln",
+ bindir_symlinks = "absolute"}, ChkRes),
+ install_bin3(Config, Inst#inst{symlinks = false,
+ ln_s = "cp -p"}, ChkRes),
+ install_bin3(Config, Inst#inst{symlinks = false,
+ ln_s = "cp -p",
+ bindir_symlinks = "relative"}, ChkRes),
+ install_bin3(Config, Inst#inst{symlinks = false,
+ ln_s = "cp -p",
+ bindir_symlinks = "absolute"}, ChkRes),
+ case ?config(symlinks, Config) of
+ true ->
+ install_bin3(Config, Inst#inst{symlinks = true,
+ ln_s = "ln -s"}, ChkRes),
+ install_bin3(Config, Inst#inst{symlinks = true,
+ ln_s = "ln -s",
+ bindir_symlinks = "relative"}, ChkRes),
+ install_bin3(Config, Inst#inst{symlinks = true,
+ ln_s = "ln -s",
+ bindir_symlinks = "absolute"}, ChkRes);
+ false ->
+ ok
+ end.
+
+
+
+install_bin3(Config,
+ #inst{cmd_prefix = CMD_PRFX,
+ ln_s = LN_S,
+ destdir = DESTDIR,
+ extra_prefix = EXTRA_PREFIX,
+ exec_prefix = EXEC_PREFIX,
+ bindir = BINDIR,
+ erlang_bindir = ERLANG_BINDIR,
+ bindir_symlinks = BINDIR_SYMLINKS} = Inst,
+ ChkRes) ->
+ Test = ?config(testcase, Config),
+ DDir = ?config(data_dir, Config),
+ TDir = ?config(test_dir, Config),
+ InstallBin = filename:join(DDir, "install_bin"),
+ ResFile = filename:join(TDir, atom_to_list(Test) ++ "-result.txt"),
+ Cmd = CMD_PRFX ++ " "
+ ++ InstallBin ++ " --ln_s \"" ++ LN_S
+ ++ "\" --destdir \"" ++ DESTDIR
+ ++ "\" --extra-prefix \"" ++ EXTRA_PREFIX
+ ++ "\" --bindir-symlinks \"" ++ BINDIR_SYMLINKS
+ ++ "\" --bindir \"" ++ BINDIR
+ ++ "\" --erlang-bindir \"" ++ ERLANG_BINDIR
+ ++ "\" --exec-prefix \"" ++ EXEC_PREFIX
+ ++ "\" --test-file \"" ++ ResFile ++ "\" erl erlc",
+
+ ?t:format("CMD_PRFX = \"~s\"~n"
+ "LN_S = \"~s\"~n"
+ "BINDIR_SYMLINKS = \"~s\"~n"
+ "exec_prefix = \"~s\"~n"
+ "bindir = \"~s\"~n"
+ "erlang_bindir = \"~s\"~n"
+ "EXTRA_PREFIX = \"~s\"~n"
+ "DESTDIR = \"~s\"~n",
+ [CMD_PRFX, LN_S, BINDIR_SYMLINKS, EXEC_PREFIX, BINDIR,
+ ERLANG_BINDIR, EXTRA_PREFIX, DESTDIR]),
+
+ ?t:format("$ ~s~n", [Cmd]),
+ CmdOutput = os:cmd(Cmd),
+ ?t:format("~s~n", [CmdOutput]),
+ ChkRes(case file:consult(ResFile) of
+ {ok, [Res]} -> Res;
+ Err -> exit({result, Err})
+ end,
+ Inst).
+
+join("") ->
+ "";
+join([""|Ds]) ->
+ join(Ds);
+join([D|Ds]) ->
+ "/" ++ string:strip(D, both, $/) ++ join(Ds).
+