You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

136 lines
5.1 KiB

  1. -module(rebar_file_utils_SUITE).
  2. -export([all/0,
  3. groups/0,
  4. init_per_group/2,
  5. end_per_group/2,
  6. raw_tmpdir/1,
  7. empty_tmpdir/1,
  8. simple_tmpdir/1,
  9. multi_tmpdir/1,
  10. reset_nonexistent_dir/1,
  11. reset_empty_dir/1,
  12. reset_dir/1,
  13. path_from_ancestor/1,
  14. canonical_path/1,
  15. resolve_link/1,
  16. split_dirname/1]).
  17. -include_lib("common_test/include/ct.hrl").
  18. -include_lib("eunit/include/eunit.hrl").
  19. -include_lib("kernel/include/file.hrl").
  20. all() ->
  21. [{group, tmpdir},
  22. {group, reset_dir},
  23. canonical_path,
  24. resolve_link,
  25. split_dirname].
  26. groups() ->
  27. [{tmpdir, [], [raw_tmpdir, empty_tmpdir, simple_tmpdir, multi_tmpdir]},
  28. {reset_dir, [], [reset_nonexistent_dir, reset_empty_dir, reset_dir]}].
  29. init_per_group(reset_dir, Config) ->
  30. TmpDir = rebar_file_utils:system_tmpdir(["rebar_file_utils_SUITE", "resetable"]),
  31. [{tmpdir, TmpDir}|Config];
  32. init_per_group(_, Config) -> Config.
  33. end_per_group(_, Config) -> Config.
  34. raw_tmpdir(_Config) ->
  35. case rebar_file_utils:system_tmpdir() of
  36. "/tmp" -> ok;
  37. "./tmp" -> ok
  38. end.
  39. empty_tmpdir(_Config) ->
  40. case rebar_file_utils:system_tmpdir([]) of
  41. "/tmp" -> ok;
  42. "./tmp" -> ok
  43. end.
  44. simple_tmpdir(_Config) ->
  45. case rebar_file_utils:system_tmpdir(["test"]) of
  46. "/tmp/test" -> ok;
  47. "./tmp/test" -> ok
  48. end.
  49. multi_tmpdir(_Config) ->
  50. case rebar_file_utils:system_tmpdir(["a", "b", "c"]) of
  51. "/tmp/a/b/c" -> ok;
  52. "./tmp/a/b/c" -> ok
  53. end.
  54. reset_nonexistent_dir(Config) ->
  55. TmpDir = ?config(tmpdir, Config),
  56. _ = ec_file:remove(TmpDir, [recursive]),
  57. ?assertNot(filelib:is_dir(TmpDir)),
  58. ok = rebar_file_utils:reset_dir(TmpDir),
  59. ?assert(filelib:is_dir(TmpDir)),
  60. {ok, []} = rebar_utils:list_dir(TmpDir).
  61. reset_empty_dir(Config) ->
  62. TmpDir = ?config(tmpdir, Config),
  63. _ = ec_file:remove(TmpDir, [recursive]),
  64. _ = filelib:ensure_dir(filename:join([TmpDir, "dummy.beam"])),
  65. ?assert(filelib:is_dir(TmpDir)),
  66. ok = rebar_file_utils:reset_dir(TmpDir),
  67. ?assert(filelib:is_dir(TmpDir)),
  68. {ok, []} = rebar_utils:list_dir(TmpDir).
  69. reset_dir(Config) ->
  70. TmpDir = ?config(tmpdir, Config),
  71. _ = ec_file:remove(TmpDir, [recursive]),
  72. _ = filelib:ensure_dir(filename:join([TmpDir, "dummy.beam"])),
  73. ?assert(filelib:is_dir(TmpDir)),
  74. lists:foreach(fun(Name) -> file:write_file(filename:join([TmpDir, Name]), <<>>) end,
  75. ["a", "b", "c"]),
  76. lists:foreach(fun(File) -> ?assert(filelib:is_file(filename:join([TmpDir, File]))) end,
  77. ["a", "b", "c"]),
  78. ok = rebar_file_utils:reset_dir(TmpDir),
  79. ?assert(filelib:is_dir(TmpDir)),
  80. {ok, []} = rebar_utils:list_dir(TmpDir).
  81. path_from_ancestor(_Config) ->
  82. ?assertEqual({ok, "foo/bar/baz"}, rebar_file_utils:path_from_ancestor("/foo/bar/baz", "/")),
  83. ?assertEqual({ok, "bar/baz"}, rebar_file_utils:path_from_ancestor("/foo/bar/baz", "/foo")),
  84. ?assertEqual({ok, "bar"}, rebar_file_utils:path_from_ancestor("foo/bar", "foo")),
  85. ?assertEqual({ok, "bar"}, rebar_file_utils:path_from_ancestor("foo/bar/", "foo/")),
  86. ?assertEqual({error, badparent}, rebar_file_utils:path_from_ancestor("/foo/bar/baz", "/qux")),
  87. ?assertEqual({error, badparent}, rebar_file_utils:path_from_ancestor("/foo/bar/baz", "/foo/bar/baz/qux")).
  88. canonical_path(_Config) ->
  89. %% We find the root so that the name works both on unix-likes and
  90. %% with Windows.
  91. Root = case os:type() of
  92. {win32, _} -> filename:nativename(filename:absname("/")); % C:\, with proper drive
  93. _ -> "/"
  94. end,
  95. ?assertEqual(filename:nativename(Root), rebar_file_utils:canonical_path("/")),
  96. ?assertEqual(filename:nativename(Root), rebar_file_utils:canonical_path("/../../..")),
  97. ?assertEqual(Root ++ "foo", rebar_file_utils:canonical_path("/foo/bar/..")),
  98. ?assertEqual(Root ++ "foo", rebar_file_utils:canonical_path("/foo/../foo")),
  99. ?assertEqual(Root ++ "foo", rebar_file_utils:canonical_path("/foo/.")),
  100. ?assertEqual(Root ++ "foo", rebar_file_utils:canonical_path("/foo/./.")),
  101. ?assertEqual(filename:nativename(Root ++ "foo/bar"),
  102. rebar_file_utils:canonical_path("/foo/./bar")).
  103. resolve_link(_Config) ->
  104. TmpDir = rebar_file_utils:system_tmpdir(
  105. ["rebar_file_utils_SUITE", "resolve_link"]),
  106. Link = filename:join(TmpDir, "link"),
  107. Target = filename:join(TmpDir, "link-target"),
  108. ec_file:remove(TmpDir, [recursive]),
  109. ok = filelib:ensure_dir(Target),
  110. ok = file:write_file(Target, <<>>),
  111. ok = file:make_symlink(Target, Link),
  112. ?assertEqual(Target, rebar_file_utils:resolve_link(Link)).
  113. split_dirname(_Config) ->
  114. ?assertEqual({".", ""}, rebar_file_utils:split_dirname("")),
  115. ?assertEqual({"/", ""}, rebar_file_utils:split_dirname("/")),
  116. ?assertEqual({"/", "foo"}, rebar_file_utils:split_dirname("/foo")),
  117. ?assertEqual({".", "foo"}, rebar_file_utils:split_dirname("foo")),
  118. ?assertEqual({"/foo", "bar"}, rebar_file_utils:split_dirname("/foo/bar")),
  119. ?assertEqual({"foo", "bar"}, rebar_file_utils:split_dirname("foo/bar")).