您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

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