Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

312 linhas
12 KiB

  1. -module(rebar_utils_SUITE).
  2. -export([all/0,
  3. init_per_testcase/2,
  4. end_per_testcase/2,
  5. groups/0,
  6. init_per_group/2,
  7. end_per_group/2,
  8. empty_arglist/1,
  9. single_task/1,
  10. single_task_with_immediate_comma/1,
  11. single_task_with_trailing_comma/1,
  12. multiple_task/1,
  13. multiple_task_no_spaces/1,
  14. multiple_task_with_immediate_comma/1,
  15. multiple_task_with_trailing_comma/1,
  16. task_with_arg/1,
  17. task_with_arg_with_immediate_comma/1,
  18. task_with_arg_with_trailing_comma/1,
  19. task_with_multiple_args/1,
  20. task_with_flag/1,
  21. task_with_flag_with_immediate_comma/1,
  22. task_with_flag_with_trailing_comma/1,
  23. task_with_flag_with_commas/1,
  24. task_with_multiple_flags/1,
  25. special_task_do/1,
  26. valid_otp_version/1,
  27. valid_old_format_otp_version/1,
  28. valid_otp_version_equal/1,
  29. invalid_otp_version/1,
  30. nonblacklisted_otp_version/1,
  31. blacklisted_otp_version/1,
  32. sh_does_not_miss_messages/1,
  33. tup_merge/1,
  34. proxy_auth/1]).
  35. -include_lib("common_test/include/ct.hrl").
  36. -include_lib("eunit/include/eunit.hrl").
  37. -include_lib("kernel/include/file.hrl").
  38. init_per_testcase(_, Config) ->
  39. rebar_test_utils:init_rebar_state(Config).
  40. end_per_testcase(_, _Config) ->
  41. catch meck:unload().
  42. all() ->
  43. [{group, args_to_tasks},
  44. sh_does_not_miss_messages,
  45. tup_merge,
  46. proxy_auth].
  47. groups() ->
  48. [{args_to_tasks, [], [empty_arglist,
  49. single_task,
  50. single_task_with_immediate_comma,
  51. single_task_with_trailing_comma,
  52. multiple_task,
  53. multiple_task_no_spaces,
  54. multiple_task_with_immediate_comma,
  55. multiple_task_with_trailing_comma,
  56. task_with_arg,
  57. task_with_arg_with_immediate_comma,
  58. task_with_arg_with_trailing_comma,
  59. task_with_multiple_args,
  60. task_with_flag,
  61. task_with_flag_with_immediate_comma,
  62. task_with_flag_with_trailing_comma,
  63. task_with_flag_with_commas,
  64. task_with_multiple_flags,
  65. special_task_do,
  66. valid_otp_version,
  67. valid_old_format_otp_version,
  68. valid_otp_version_equal,
  69. invalid_otp_version,
  70. nonblacklisted_otp_version,
  71. blacklisted_otp_version
  72. ]}].
  73. init_per_group(_, Config) -> Config.
  74. end_per_group(_, Config) -> Config.
  75. empty_arglist(_Config) ->
  76. [] = rebar_utils:args_to_tasks([]).
  77. single_task(_Config) ->
  78. [{"foo", []}] = rebar_utils:args_to_tasks(["foo"]).
  79. single_task_with_immediate_comma(_Config) ->
  80. [{"foo", []}] = rebar_utils:args_to_tasks(["foo,"]).
  81. single_task_with_trailing_comma(_Config) ->
  82. [{"foo", []}] = rebar_utils:args_to_tasks(["foo", ","]).
  83. multiple_task(_Config) ->
  84. [{"foo", []}, {"bar", []}, {"baz", []}] = rebar_utils:args_to_tasks(["foo,",
  85. "bar,",
  86. "baz"]).
  87. multiple_task_no_spaces(_Config) ->
  88. [{"foo", []}, {"bar", []}, {"baz", []}] = rebar_utils:args_to_tasks(["foo,bar,baz"]).
  89. multiple_task_with_immediate_comma(_Config) ->
  90. [{"foo", []}, {"bar", []}, {"baz", []}] = rebar_utils:args_to_tasks(["foo,",
  91. "bar,",
  92. "baz,"]).
  93. multiple_task_with_trailing_comma(_Config) ->
  94. [{"foo", []}, {"bar", []}, {"baz", []}] = rebar_utils:args_to_tasks(["foo",
  95. ",",
  96. "bar",
  97. ",",
  98. "baz",
  99. ","]).
  100. task_with_arg(_Config) ->
  101. [{"foo", ["bar"]}] = rebar_utils:args_to_tasks(["foo", "bar"]).
  102. task_with_arg_with_immediate_comma(_Config) ->
  103. [{"foo", ["bar"]}, {"baz", []}] = rebar_utils:args_to_tasks(["foo", "bar,", "baz"]).
  104. task_with_arg_with_trailing_comma(_Config) ->
  105. [{"foo", ["bar"]}, {"baz", []}] = rebar_utils:args_to_tasks(["foo", "bar", ",", "baz"]).
  106. task_with_multiple_args(_Config) ->
  107. [{"foo", ["bar", "baz"]}] = rebar_utils:args_to_tasks(["foo", "bar", "baz"]).
  108. task_with_flag(_Config) ->
  109. [{"foo", ["--bar"]}] = rebar_utils:args_to_tasks(["foo", "--bar"]).
  110. task_with_flag_with_immediate_comma(_Config) ->
  111. [{"foo", ["--bar"]}, {"baz", []}] = rebar_utils:args_to_tasks(["foo", "--bar,", "baz"]).
  112. task_with_flag_with_trailing_comma(_Config) ->
  113. [{"foo", ["--bar"]}, {"baz", []}] = rebar_utils:args_to_tasks(["foo", "--bar", ",", "baz"]).
  114. task_with_flag_with_commas(_Config) ->
  115. [{"foo", ["--bar=baz,qux"]}] = rebar_utils:args_to_tasks(["foo", "--bar=baz,qux"]).
  116. task_with_multiple_flags(_Config) ->
  117. [{"foo", ["--bar", "--baz"]}] = rebar_utils:args_to_tasks(["foo", "--bar", "--baz"]).
  118. special_task_do(_Config) ->
  119. [{"foo", []}, {"do", ["bar,", "baz"]}] = rebar_utils:args_to_tasks(["foo,",
  120. "do",
  121. "bar,",
  122. "baz"]).
  123. valid_otp_version(_Config) ->
  124. meck:new(rebar_utils, [passthrough]),
  125. meck:expect(rebar_utils, otp_release, fun() -> "42.4" end),
  126. rebar_utils:check_min_otp_version("42.3"),
  127. meck:unload(rebar_utils).
  128. valid_old_format_otp_version(_Config) ->
  129. meck:new(rebar_utils, [passthrough]),
  130. meck:expect(rebar_utils, otp_release, fun() -> "R15B03-1" end),
  131. rebar_utils:check_min_otp_version("14"),
  132. meck:expect(rebar_utils, otp_release, fun() -> "R16B03" end),
  133. rebar_utils:check_min_otp_version("16.0"),
  134. meck:expect(rebar_utils, otp_release, fun() -> "18.0.1" end),
  135. rebar_utils:check_min_otp_version("17.5.4"),
  136. meck:expect(rebar_utils, otp_release, fun() -> "18.0-rc1" end),
  137. ?assertException(throw, rebar_abort, rebar_utils:check_min_otp_version("19")),
  138. meck:unload(rebar_utils).
  139. valid_otp_version_equal(_Config) ->
  140. meck:new(rebar_utils, [passthrough]),
  141. meck:expect(rebar_utils, otp_release, fun() -> "42.3" end),
  142. rebar_utils:check_min_otp_version("42.3"),
  143. meck:unload(rebar_utils).
  144. invalid_otp_version(_Config) ->
  145. meck:new(rebar_utils, [passthrough]),
  146. meck:expect(rebar_utils, otp_release, fun() -> "17.4" end),
  147. ?assertException(throw, rebar_abort, rebar_utils:check_min_otp_version("42.3")),
  148. meck:unload(rebar_utils).
  149. nonblacklisted_otp_version(_Config) ->
  150. meck:new(rebar_utils, [passthrough]),
  151. meck:expect(rebar_utils, otp_release, fun() -> "42.4" end),
  152. rebar_utils:check_blacklisted_otp_versions(["1\\.2", "42\\.3"]),
  153. meck:unload(rebar_utils).
  154. blacklisted_otp_version(_Config) ->
  155. meck:new(rebar_utils, [passthrough]),
  156. meck:expect(rebar_utils, otp_release, fun() -> "42.4" end),
  157. ?assertException(throw, rebar_abort, rebar_utils:check_blacklisted_otp_versions(["1\\.2", "42\\.[1-4]"])),
  158. meck:unload(rebar_utils).
  159. sh_does_not_miss_messages(_Config) ->
  160. Source = "~nmain(_) ->~n io:format(\"donotmissme\").~n",
  161. file:write_file("do_not_miss_messages", io_lib:format(Source,[])),
  162. {ok, "donotmissme"} = rebar_utils:sh("escript do_not_miss_messages", []),
  163. AnyMessageRemained =
  164. receive
  165. What -> What
  166. after 100 ->
  167. false
  168. end,
  169. AnyMessageRemained = false.
  170. tup_merge(_Config) ->
  171. ?assertEqual(
  172. [a,{a,a},{a,a,a},{a,b},{a,b,b},b,{b,a},{b,a,a},{b,b},{b,b,b},z,{z,a},{z,a,a},{z,b},{z,b,b}],
  173. rebar_utils:tup_umerge(
  174. rebar_utils:tup_sort([a,{a,a},{a,a,a},b,{b,a},{b,a,a},z,{z,a},{z,a,a}]),
  175. rebar_utils:tup_sort([a,{a,b},{a,b,b},b,{b,b},{b,b,b},z,{z,b},{z,b,b}])
  176. )
  177. ),
  178. ?assertEqual(
  179. [a,{a,b},{a,b,b},{a,a},{a,a,a},b,{b,b},{b,b,b},{b,a},{b,a,a},z,{z,b},{z,b,b},{z,a},{z,a,a}],
  180. rebar_utils:tup_umerge(
  181. rebar_utils:tup_sort([a,{a,b},{a,b,b},b,{b,b},{b,b,b},z,{z,b},{z,b,b}]),
  182. rebar_utils:tup_sort([a,{a,a},{a,a,a},b,{b,a},{b,a,a},z,{z,a},{z,a,a}])
  183. )
  184. ),
  185. ?assertEqual(
  186. [a,{a,b},{a,b,b},{a,a},{a,a,a},b,{b,b},{b,b,b},{b,a},{b,a,a},z,{z,b},{z,b,b},{z,a},{z,a,a}],
  187. rebar_utils:tup_umerge(
  188. rebar_utils:tup_sort([a,b,z,{a,b},{b,b},{z,b},{a,b,b},{b,b,b},{z,b,b}]),
  189. rebar_utils:tup_sort([a,{a,a},{a,a,a},b,{b,a},{b,a,a},z,{z,a},{z,a,a}])
  190. )
  191. ),
  192. ?assertEqual(
  193. [{a,b},a,{a,b,b},{a,a},{a,a,a},{b,b},b,{b,b,b},{b,a},{b,a,a},{z,b},z,{z,b,b},{z,a},{z,a,a}],
  194. rebar_utils:tup_umerge(
  195. rebar_utils:tup_sort([{a,b},{b,b},{z,b},a,b,z,{a,b,b},{b,b,b},{z,b,b}]),
  196. rebar_utils:tup_sort([a,{a,a},{a,a,a},b,{b,a},{b,a,a},z,{z,a},{z,a,a}])
  197. )
  198. ),
  199. ?assertEqual(
  200. [a,{a,b},{a,b,b},{a,a},{a,a,a},b,{b,b},{b,b,b},{b,a},{b,a,a},z,{z,b},{z,b,b},{z,a},{z,a,a}],
  201. rebar_utils:tup_umerge(
  202. rebar_utils:tup_sort([a,{a,b},{a,b,b},b,{b,b},{b,b,b},z,{z,b},{z,b,b}]),
  203. rebar_utils:tup_sort([{a,a},a,{a,a,a},{b,a},b,{b,a,a},{z,a},z,{z,a,a}])
  204. )
  205. ),
  206. ?assertEqual(
  207. [{a,b},a,{a,b,b},{a,a},{a,a,a},{b,b},b,{b,b,b},{b,a},{b,a,a},{z,b},z,{z,b,b},{z,a},{z,a,a}],
  208. rebar_utils:tup_umerge(
  209. rebar_utils:tup_sort([{a,b},{b,b},{z,b},a,b,z,{a,b,b},{b,b,b},{z,b,b}]),
  210. rebar_utils:tup_sort([{a,a},a,{a,a,a},{b,a},b,{b,a,a},{z,a},z,{z,a,a}])
  211. )
  212. ),
  213. ?assertEqual(
  214. [{a,b},{a,b,b},a,{a,a},{a,a,a},{b,b},{b,b,b},b,{b,a},{b,a,a},{z,b},{z,b,b},z,{z,a},{z,a,a}],
  215. rebar_utils:tup_umerge(
  216. rebar_utils:tup_sort([{a,b},{a,b,b},{b,b},{b,b,b},{z,b},{z,b,b},a,b,z]),
  217. rebar_utils:tup_sort([{a,a},{a,a,a},a,{b,a},{b,a,a},b,{z,a},{z,a,a},z])
  218. )
  219. ),
  220. ?assertEqual(
  221. [{a,b},{a,b,b},a,{a,a},{a,a,a},{b,b},{b,b,b},b,{b,a},{b,a,a},{z,b},{z,b,b},z,{z,a},{z,a,a}],
  222. rebar_utils:tup_umerge(
  223. rebar_utils:tup_sort([{a,b},{a,b,b},{b,b},{b,b,b},{z,b},{z,b,b},a,b,z]),
  224. rebar_utils:tup_sort([{a,a},{a,b},{a,a,a},{a,b,b},a,{b,a},{b,a,a},b,{z,a},{z,a,a},z])
  225. )
  226. ),
  227. ?assertEqual(
  228. [{l, a}, {r, a, b}, {s, a}, {s, b}],
  229. rebar_utils:tup_umerge(
  230. rebar_utils:tup_sort([{r, a, b}, {s, a}, {l, a}]),
  231. rebar_utils:tup_sort([{s, b}])
  232. )
  233. ),
  234. ?assertEqual(
  235. [{a,b,b},{a,b},a,{a,a},{a,a,a},{b,b},{b,b,b},b,{b,a,a},{b,a},{z,b},{z,b,b},z,{z,a},{z,a,a}],
  236. rebar_utils:tup_umerge(
  237. rebar_utils:tup_sort([{a,b,b},{b,b},{a,b},{b,b,b},{z,b},{z,b,b},a,b,z]),
  238. rebar_utils:tup_sort([{a,a},{a,a,a},a,{b,a,a},b,{z,a},{z,a,a},{b,a},z])
  239. )
  240. ).
  241. proxy_auth(_Config) ->
  242. proxy_auth(_Config, "http_proxy"),
  243. proxy_auth(_Config, "https_proxy").
  244. proxy_auth(_Config, ProxyEnvKey) ->
  245. Host = "host:",
  246. Port = "1234",
  247. %% remember current proxy specification
  248. OldProxySpec = os:getenv(ProxyEnvKey),
  249. %% proxy auth not set
  250. application:unset_env(rebar, proxy_auth),
  251. ?assertEqual([], rebar_utils:get_proxy_auth()),
  252. %% proxy auth with regular username/password
  253. os:putenv(ProxyEnvKey, "http://Username:Password@" ++ Host ++ Port),
  254. rebar_utils:set_httpc_options(),
  255. ?assertEqual([{proxy_auth, {"Username", "Password"}}],
  256. rebar_utils:get_proxy_auth()),
  257. %% proxy auth with username missing and url encoded password
  258. os:putenv(ProxyEnvKey, "http://:%3F!abc%23%24@" ++ Host ++ Port),
  259. rebar_utils:set_httpc_options(),
  260. ?assertEqual([{proxy_auth, {"", "?!abc#$"}}],
  261. rebar_utils:get_proxy_auth()),
  262. %% restore original proxy specification if any
  263. restore_proxy_env(ProxyEnvKey, OldProxySpec),
  264. application:unset_env(rebar, proxy_auth).
  265. restore_proxy_env(ProxyEnvKey, false) ->
  266. os:putenv(ProxyEnvKey, "");
  267. restore_proxy_env(ProxyEnvKey, ProxySpec) ->
  268. os:putenv(ProxyEnvKey, ProxySpec).