-module(rebar_file_utils_SUITE). -export([all/0, groups/0, init_per_group/2, end_per_group/2, raw_tmpdir/1, empty_tmpdir/1, simple_tmpdir/1, multi_tmpdir/1, reset_nonexistent_dir/1, reset_empty_dir/1, reset_dir/1, path_from_ancestor/1, canonical_path/1, resolve_link/1, split_dirname/1, mv_warning_is_ignored/1]). -include_lib("common_test/include/ct.hrl"). -include_lib("eunit/include/eunit.hrl"). -include_lib("kernel/include/file.hrl"). all() -> [{group, tmpdir}, {group, reset_dir}, path_from_ancestor, canonical_path, resolve_link, split_dirname, mv_warning_is_ignored]. groups() -> [{tmpdir, [], [raw_tmpdir, empty_tmpdir, simple_tmpdir, multi_tmpdir]}, {reset_dir, [], [reset_nonexistent_dir, reset_empty_dir, reset_dir]}]. init_per_group(reset_dir, Config) -> TmpDir = rebar_file_utils:system_tmpdir(["rebar_file_utils_SUITE", "resetable"]), [{tmpdir, TmpDir}|Config]; init_per_group(_, Config) -> Config. end_per_group(_, Config) -> Config. raw_tmpdir(_Config) -> case rebar_file_utils:system_tmpdir() of "/tmp" -> ok; "./tmp" -> ok end. empty_tmpdir(_Config) -> case rebar_file_utils:system_tmpdir([]) of "/tmp" -> ok; "./tmp" -> ok end. simple_tmpdir(_Config) -> case rebar_file_utils:system_tmpdir(["test"]) of "/tmp/test" -> ok; "./tmp/test" -> ok end. multi_tmpdir(_Config) -> case rebar_file_utils:system_tmpdir(["a", "b", "c"]) of "/tmp/a/b/c" -> ok; "./tmp/a/b/c" -> ok end. reset_nonexistent_dir(Config) -> TmpDir = ?config(tmpdir, Config), _ = ec_file:remove(TmpDir, [recursive]), ?assertNot(filelib:is_dir(TmpDir)), ok = rebar_file_utils:reset_dir(TmpDir), ?assert(filelib:is_dir(TmpDir)), {ok, []} = rebar_utils:list_dir(TmpDir). reset_empty_dir(Config) -> TmpDir = ?config(tmpdir, Config), _ = ec_file:remove(TmpDir, [recursive]), _ = filelib:ensure_dir(filename:join([TmpDir, "dummy.beam"])), ?assert(filelib:is_dir(TmpDir)), ok = rebar_file_utils:reset_dir(TmpDir), ?assert(filelib:is_dir(TmpDir)), {ok, []} = rebar_utils:list_dir(TmpDir). reset_dir(Config) -> TmpDir = ?config(tmpdir, Config), _ = ec_file:remove(TmpDir, [recursive]), _ = filelib:ensure_dir(filename:join([TmpDir, "dummy.beam"])), ?assert(filelib:is_dir(TmpDir)), lists:foreach(fun(Name) -> file:write_file(filename:join([TmpDir, Name]), <<>>) end, ["a", "b", "c"]), lists:foreach(fun(File) -> ?assert(filelib:is_file(filename:join([TmpDir, File]))) end, ["a", "b", "c"]), ok = rebar_file_utils:reset_dir(TmpDir), ?assert(filelib:is_dir(TmpDir)), {ok, []} = rebar_utils:list_dir(TmpDir). path_from_ancestor(_Config) -> ?assertEqual({ok, "foo/bar/baz"}, rebar_file_utils:path_from_ancestor("/foo/bar/baz", "/")), ?assertEqual({ok, "bar/baz"}, rebar_file_utils:path_from_ancestor("/foo/bar/baz", "/foo")), ?assertEqual({ok, "bar"}, rebar_file_utils:path_from_ancestor("foo/bar", "foo")), ?assertEqual({ok, "bar"}, rebar_file_utils:path_from_ancestor("foo/bar/", "foo/")), ?assertEqual({error, badparent}, rebar_file_utils:path_from_ancestor("/foo/bar/baz", "/qux")), ?assertEqual({error, badparent}, rebar_file_utils:path_from_ancestor("/foo/bar/baz", "/foo/bar/baz/qux")). canonical_path(_Config) -> %% We find the root so that the name works both on unix-likes and %% with Windows. Root = case os:type() of {win32, _} -> filename:nativename(filename:absname("/")); % C:\, with proper drive _ -> "/" end, ?assertEqual(filename:nativename(Root), rebar_file_utils:canonical_path("/")), ?assertEqual(filename:nativename(Root), rebar_file_utils:canonical_path("/../../..")), ?assertEqual(Root ++ "foo", rebar_file_utils:canonical_path("/foo/bar/..")), ?assertEqual(Root ++ "foo", rebar_file_utils:canonical_path("/foo/../foo")), ?assertEqual(Root ++ "foo", rebar_file_utils:canonical_path("/foo/.")), ?assertEqual(Root ++ "foo", rebar_file_utils:canonical_path("/foo/./.")), ?assertEqual(filename:nativename(Root ++ "foo/bar"), rebar_file_utils:canonical_path("/foo/./bar")). resolve_link(_Config) -> TmpDir = rebar_file_utils:system_tmpdir( ["rebar_file_utils_SUITE", "resolve_link"]), Link = filename:join(TmpDir, "link"), Target = filename:join(TmpDir, "link-target"), ec_file:remove(TmpDir, [recursive]), ok = filelib:ensure_dir(Target), ok = file:write_file(Target, <<>>), ok = file:make_symlink(Target, Link), ?assertEqual(Target, rebar_file_utils:resolve_link(Link)). split_dirname(_Config) -> ?assertEqual({".", ""}, rebar_file_utils:split_dirname("")), ?assertEqual({"/", ""}, rebar_file_utils:split_dirname("/")), ?assertEqual({"/", "foo"}, rebar_file_utils:split_dirname("/foo")), ?assertEqual({".", "foo"}, rebar_file_utils:split_dirname("foo")), ?assertEqual({"/foo", "bar"}, rebar_file_utils:split_dirname("/foo/bar")), ?assertEqual({"foo", "bar"}, rebar_file_utils:split_dirname("foo/bar")). mv_warning_is_ignored(_Config) -> meck:new(rebar_utils, [passthrough]), meck:expect(rebar_utils, sh, fun("mv ding dong", _) -> {ok, "Warning"} end), ok = rebar_file_utils:mv("ding", "dong"), meck:unload(rebar_utils).