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.

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