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.

551 line
22 KiB

  1. -module(rebar_ct_SUITE).
  2. -export([all/0,
  3. groups/0,
  4. init_per_group/2,
  5. end_per_group/2]).
  6. -export([basic_app_default_dirs/1,
  7. basic_app_default_beams/1,
  8. multi_app_default_dirs/1,
  9. multi_app_default_beams/1,
  10. single_app_dir/1,
  11. single_extra_dir/1,
  12. single_unmanaged_dir/1,
  13. single_suite/1,
  14. single_extra_suite/1,
  15. single_unmanaged_suite/1,
  16. multi_suite/1,
  17. all_suite/1,
  18. single_dir_and_single_suite/1,
  19. symlinked_dir_overwritten_fix/1]).
  20. -include_lib("common_test/include/ct.hrl").
  21. all() -> [{group, basic_app},
  22. {group, multi_app},
  23. {group, dirs_and_suites}].
  24. groups() -> [{basic_app, [], [basic_app_default_dirs,
  25. basic_app_default_beams]},
  26. {multi_app, [], [multi_app_default_dirs,
  27. multi_app_default_beams]},
  28. {dirs_and_suites, [], [single_app_dir,
  29. single_extra_dir,
  30. single_unmanaged_dir,
  31. single_suite,
  32. single_extra_suite,
  33. single_unmanaged_suite,
  34. multi_suite,
  35. all_suite,
  36. single_dir_and_single_suite,
  37. symlinked_dir_overwritten_fix]}].
  38. init_per_group(basic_app, Config) ->
  39. C = rebar_test_utils:init_rebar_state(Config, "ct_"),
  40. AppDir = ?config(apps, C),
  41. Name = rebar_test_utils:create_random_name(atom_to_list(basic_app) ++ "_"),
  42. Vsn = rebar_test_utils:create_random_vsn(),
  43. rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
  44. Suite = filename:join([AppDir, "test", Name ++ "_SUITE.erl"]),
  45. ok = filelib:ensure_dir(Suite),
  46. ok = file:write_file(Suite, test_suite(Name)),
  47. {ok, State} = rebar_test_utils:run_and_check(C, [], ["as", "test", "compile"], return),
  48. LibDirs = rebar_dir:lib_dirs(State),
  49. State1 = rebar_app_discover:do(State, LibDirs),
  50. Providers = rebar_state:providers(State1),
  51. Namespace = rebar_state:namespace(State1),
  52. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  53. GetOptSpec = providers:opts(CommandProvider),
  54. {ok, GetOptResult} = getopt:parse(GetOptSpec, []),
  55. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  56. Result = rebar_prv_common_test:setup_ct(State2),
  57. [{result, Result}, {appnames, [Name]}|C];
  58. init_per_group(multi_app, Config) ->
  59. C = rebar_test_utils:init_rebar_state(Config, "ct_"),
  60. AppDir = ?config(apps, C),
  61. Name1 = rebar_test_utils:create_random_name(atom_to_list(multi_app) ++ "_"),
  62. Vsn1 = rebar_test_utils:create_random_vsn(),
  63. AppDir1 = filename:join([AppDir, "apps", Name1]),
  64. rebar_test_utils:create_app(AppDir1, Name1, Vsn1, [kernel, stdlib]),
  65. Suite1 = filename:join([AppDir1, "test", Name1 ++ "_SUITE.erl"]),
  66. ok = filelib:ensure_dir(Suite1),
  67. ok = file:write_file(Suite1, test_suite(Name1)),
  68. Name2 = rebar_test_utils:create_random_name(atom_to_list(multi_app) ++ "_"),
  69. Vsn2 = rebar_test_utils:create_random_vsn(),
  70. AppDir2 = filename:join([AppDir, "apps", Name2]),
  71. rebar_test_utils:create_app(AppDir2, Name2, Vsn2, [kernel, stdlib]),
  72. Suite2 = filename:join([AppDir2, "test", Name2 ++ "_SUITE.erl"]),
  73. ok = filelib:ensure_dir(Suite2),
  74. ok = file:write_file(Suite2, test_suite(Name2)),
  75. Suite3 = filename:join([AppDir, "test", "extras_SUITE.erl"]),
  76. ok = filelib:ensure_dir(Suite3),
  77. ok = file:write_file(Suite3, test_suite("extras")),
  78. {ok, State} = rebar_test_utils:run_and_check(C, [], ["as", "test", "compile"], return),
  79. LibDirs = rebar_dir:lib_dirs(State),
  80. State1 = rebar_app_discover:do(State, LibDirs),
  81. Providers = rebar_state:providers(State1),
  82. Namespace = rebar_state:namespace(State1),
  83. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  84. GetOptSpec = providers:opts(CommandProvider),
  85. {ok, GetOptResult} = getopt:parse(GetOptSpec, []),
  86. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  87. Result = rebar_prv_common_test:setup_ct(State2),
  88. [{result, Result}, {appnames, [Name1, Name2]}|C];
  89. init_per_group(dirs_and_suites, Config) ->
  90. C = rebar_test_utils:init_rebar_state(Config, "ct_"),
  91. AppDir = ?config(apps, C),
  92. Name1 = rebar_test_utils:create_random_name(atom_to_list(dirs_and_suites) ++ "_"),
  93. Vsn1 = rebar_test_utils:create_random_vsn(),
  94. AppDir1 = filename:join([AppDir, "apps", Name1]),
  95. rebar_test_utils:create_app(AppDir1, Name1, Vsn1, [kernel, stdlib]),
  96. Suite1 = filename:join([AppDir1, "test", Name1 ++ "_SUITE.erl"]),
  97. ok = filelib:ensure_dir(Suite1),
  98. ok = file:write_file(Suite1, test_suite(Name1)),
  99. Name2 = rebar_test_utils:create_random_name(atom_to_list(dir_and_suites) ++ "_"),
  100. Vsn2 = rebar_test_utils:create_random_vsn(),
  101. AppDir2 = filename:join([AppDir, "apps", Name2]),
  102. rebar_test_utils:create_app(AppDir2, Name2, Vsn2, [kernel, stdlib]),
  103. Suite2 = filename:join([AppDir2, "test", Name2 ++ "_SUITE.erl"]),
  104. ok = filelib:ensure_dir(Suite2),
  105. ok = file:write_file(Suite2, test_suite(Name2)),
  106. Suite3 = filename:join([AppDir, "test", "extras_SUITE.erl"]),
  107. ok = filelib:ensure_dir(Suite3),
  108. ok = file:write_file(Suite3, test_suite("extras")),
  109. [{appnames, [Name1, Name2]}|C].
  110. end_per_group(_Group, _Config) -> ok.
  111. basic_app_default_dirs(Config) ->
  112. AppDir = ?config(apps, Config),
  113. [Name] = ?config(appnames, Config),
  114. Result = ?config(result, Config),
  115. Expect = filename:absname(filename:join([AppDir, "_build", "test", "lib", Name, "test"])),
  116. Dir = proplists:get_value(dir, Result),
  117. Expect = Dir.
  118. basic_app_default_beams(Config) ->
  119. AppDir = ?config(apps, Config),
  120. [Name] = ?config(appnames, Config),
  121. File = filename:join([AppDir,
  122. "_build",
  123. "test",
  124. "lib",
  125. Name,
  126. "test",
  127. Name ++ "_SUITE.beam"]),
  128. true = filelib:is_file(File).
  129. multi_app_default_dirs(Config) ->
  130. AppDir = ?config(apps, Config),
  131. [Name1, Name2] = ?config(appnames, Config),
  132. Result = ?config(result, Config),
  133. Expect1 = filename:absname(filename:join([AppDir, "_build", "test", "lib", Name1, "test"])),
  134. Expect2 = filename:absname(filename:join([AppDir, "_build", "test", "lib", Name2, "test"])),
  135. Expect3 = filename:absname(filename:join([AppDir, "_build", "test", "test"])),
  136. Dirs = proplists:get_value(dir, Result),
  137. true = (lists:sort([Expect1, Expect2, Expect3]) == lists:sort(Dirs)).
  138. multi_app_default_beams(Config) ->
  139. AppDir = ?config(apps, Config),
  140. [Name1, Name2] = ?config(appnames, Config),
  141. File1 = filename:join([AppDir,
  142. "_build",
  143. "test",
  144. "lib",
  145. Name1,
  146. "test",
  147. Name1 ++ "_SUITE.beam"]),
  148. File2 = filename:join([AppDir,
  149. "_build",
  150. "test",
  151. "lib",
  152. Name2,
  153. "test",
  154. Name2 ++ "_SUITE.beam"]),
  155. File3 = filename:join([AppDir,
  156. "_build",
  157. "test",
  158. "test",
  159. "extras_SUITE.beam"]),
  160. true = filelib:is_file(File1),
  161. true = filelib:is_file(File2),
  162. true = filelib:is_file(File3).
  163. single_app_dir(Config) ->
  164. AppDir = ?config(apps, Config),
  165. [Name1, _Name2] = ?config(appnames, Config),
  166. {ok, State} = rebar_test_utils:run_and_check(Config, [], ["as", "test", "compile"], return),
  167. LibDirs = rebar_dir:lib_dirs(State),
  168. State1 = rebar_app_discover:do(State, LibDirs),
  169. Providers = rebar_state:providers(State1),
  170. Namespace = rebar_state:namespace(State1),
  171. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  172. GetOptSpec = providers:opts(CommandProvider),
  173. {ok, GetOptResult} = getopt:parse(GetOptSpec,
  174. ["--dir=" ++ filename:join([AppDir,
  175. "apps",
  176. Name1,
  177. "test"])]),
  178. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  179. Result = rebar_prv_common_test:setup_ct(State2),
  180. Expect = filename:absname(filename:join([AppDir, "_build", "test", "lib", Name1, "test"])),
  181. Dir = proplists:get_value(dir, Result),
  182. Expect = Dir.
  183. single_extra_dir(Config) ->
  184. AppDir = ?config(apps, Config),
  185. {ok, State} = rebar_test_utils:run_and_check(Config, [], ["as", "test", "compile"], return),
  186. LibDirs = rebar_dir:lib_dirs(State),
  187. State1 = rebar_app_discover:do(State, LibDirs),
  188. Providers = rebar_state:providers(State1),
  189. Namespace = rebar_state:namespace(State1),
  190. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  191. GetOptSpec = providers:opts(CommandProvider),
  192. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--dir=" ++ filename:join([AppDir,
  193. "test"])]),
  194. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  195. Result = rebar_prv_common_test:setup_ct(State2),
  196. Expect = filename:absname(filename:join([AppDir, "_build", "test", "test"])),
  197. Dir = proplists:get_value(dir, Result),
  198. Expect = Dir.
  199. single_unmanaged_dir(Config) ->
  200. PrivDir = ?config(priv_dir, Config),
  201. Suite = filename:join([PrivDir, "unmanaged_dir", "unmanaged_dir_SUITE.erl"]),
  202. ok = filelib:ensure_dir(Suite),
  203. ok = file:write_file(Suite, test_suite("unmanaged_dir")),
  204. {ok, State} = rebar_test_utils:run_and_check(Config, [], ["as", "test", "compile"], return),
  205. LibDirs = rebar_dir:lib_dirs(State),
  206. State1 = rebar_app_discover:do(State, LibDirs),
  207. Providers = rebar_state:providers(State1),
  208. Namespace = rebar_state:namespace(State1),
  209. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  210. GetOptSpec = providers:opts(CommandProvider),
  211. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--dir=" ++ filename:absname(filename:join([PrivDir,
  212. "unmanaged_dir"]))]),
  213. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  214. Result = rebar_prv_common_test:setup_ct(State2),
  215. Expect = filename:absname(filename:join([PrivDir, "unmanaged_dir"])),
  216. Dir = proplists:get_value(dir, Result),
  217. Expect = Dir.
  218. single_suite(Config) ->
  219. AppDir = ?config(apps, Config),
  220. [Name1, _Name2] = ?config(appnames, Config),
  221. {ok, State} = rebar_test_utils:run_and_check(Config, [], ["as", "test", "compile"], return),
  222. LibDirs = rebar_dir:lib_dirs(State),
  223. State1 = rebar_app_discover:do(State, LibDirs),
  224. Providers = rebar_state:providers(State1),
  225. Namespace = rebar_state:namespace(State1),
  226. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  227. GetOptSpec = providers:opts(CommandProvider),
  228. {ok, GetOptResult} = getopt:parse(GetOptSpec,
  229. ["--suite=" ++ filename:join([AppDir,
  230. "apps",
  231. Name1,
  232. "test",
  233. Name1 ++ "_SUITE"])]),
  234. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  235. Result = rebar_prv_common_test:setup_ct(State2),
  236. Expect = [filename:absname(filename:join([AppDir,
  237. "_build",
  238. "test",
  239. "lib",
  240. Name1,
  241. "test",
  242. Name1 ++ "_SUITE"]))],
  243. Suite = proplists:get_value(suite, Result),
  244. Expect = Suite.
  245. single_extra_suite(Config) ->
  246. AppDir = ?config(apps, Config),
  247. [_Name1, _Name2] = ?config(appnames, Config),
  248. {ok, State} = rebar_test_utils:run_and_check(Config, [], ["as", "test", "compile"], return),
  249. LibDirs = rebar_dir:lib_dirs(State),
  250. State1 = rebar_app_discover:do(State, LibDirs),
  251. Providers = rebar_state:providers(State1),
  252. Namespace = rebar_state:namespace(State1),
  253. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  254. GetOptSpec = providers:opts(CommandProvider),
  255. {ok, GetOptResult} = getopt:parse(GetOptSpec,
  256. ["--suite=" ++ filename:join([AppDir,
  257. "test",
  258. "extra_SUITE"])]),
  259. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  260. Result = rebar_prv_common_test:setup_ct(State2),
  261. Expect = [filename:absname(filename:join([AppDir,
  262. "_build",
  263. "test",
  264. "test",
  265. "extra_SUITE"]))],
  266. Suite = proplists:get_value(suite, Result),
  267. Expect = Suite.
  268. single_unmanaged_suite(Config) ->
  269. PrivDir = ?config(priv_dir, Config),
  270. [_Name1, _Name2] = ?config(appnames, Config),
  271. Suite = filename:join([PrivDir, "unmanaged", "unmanaged_SUITE.erl"]),
  272. ok = filelib:ensure_dir(Suite),
  273. ok = file:write_file(Suite, test_suite("unmanaged")),
  274. {ok, State} = rebar_test_utils:run_and_check(Config, [], ["as", "test", "compile"], return),
  275. LibDirs = rebar_dir:lib_dirs(State),
  276. State1 = rebar_app_discover:do(State, LibDirs),
  277. Providers = rebar_state:providers(State1),
  278. Namespace = rebar_state:namespace(State1),
  279. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  280. GetOptSpec = providers:opts(CommandProvider),
  281. {ok, GetOptResult} = getopt:parse(GetOptSpec,
  282. ["--suite=" ++ filename:absname(filename:join([PrivDir,
  283. "unmanaged",
  284. "unmanaged_SUITE"]))]),
  285. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  286. Result = rebar_prv_common_test:setup_ct(State2),
  287. Expect = [filename:absname(filename:join([PrivDir,
  288. "unmanaged",
  289. "unmanaged_SUITE"]))],
  290. SuitePath = proplists:get_value(suite, Result),
  291. Expect = SuitePath.
  292. multi_suite(Config) ->
  293. AppDir = ?config(apps, Config),
  294. [Name1, Name2] = ?config(appnames, Config),
  295. {ok, State} = rebar_test_utils:run_and_check(Config, [], ["as", "test", "compile"], return),
  296. LibDirs = rebar_dir:lib_dirs(State),
  297. State1 = rebar_app_discover:do(State, LibDirs),
  298. Providers = rebar_state:providers(State1),
  299. Namespace = rebar_state:namespace(State1),
  300. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  301. GetOptSpec = providers:opts(CommandProvider),
  302. {ok, GetOptResult} = getopt:parse(GetOptSpec,
  303. ["--suite=" ++ filename:join([AppDir,
  304. "apps",
  305. Name1,
  306. "test",
  307. Name1 ++ "_SUITE," ++ AppDir,
  308. "apps",
  309. Name2,
  310. "test",
  311. Name2 ++ "_SUITE"])]),
  312. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  313. Result = rebar_prv_common_test:setup_ct(State2),
  314. Expect1 = filename:absname(filename:join([AppDir,
  315. "_build",
  316. "test",
  317. "lib",
  318. Name1,
  319. "test",
  320. Name1 ++ "_SUITE"])),
  321. Expect2 = filename:absname(filename:join([AppDir,
  322. "_build",
  323. "test",
  324. "lib",
  325. Name2,
  326. "test",
  327. Name2 ++ "_SUITE"])),
  328. Suites = proplists:get_value(suite, Result),
  329. true = (lists:sort([Expect1, Expect2]) == lists:sort(Suites)).
  330. all_suite(Config) ->
  331. AppDir = ?config(apps, Config),
  332. [Name1, Name2] = ?config(appnames, Config),
  333. {ok, State} = rebar_test_utils:run_and_check(Config, [], ["as", "test", "compile"], return),
  334. LibDirs = rebar_dir:lib_dirs(State),
  335. State1 = rebar_app_discover:do(State, LibDirs),
  336. Providers = rebar_state:providers(State1),
  337. Namespace = rebar_state:namespace(State1),
  338. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  339. GetOptSpec = providers:opts(CommandProvider),
  340. {ok, GetOptResult} = getopt:parse(GetOptSpec,
  341. ["--suite=" ++ filename:join([AppDir,
  342. "apps",
  343. Name1,
  344. "test",
  345. Name1 ++ "_SUITE," ++ AppDir,
  346. "apps",
  347. Name2,
  348. "test",
  349. Name2 ++ "_SUITE," ++ AppDir,
  350. "test",
  351. "extra_SUITE"])]),
  352. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  353. Result = rebar_prv_common_test:setup_ct(State2),
  354. Expect1 = filename:absname(filename:join([AppDir,
  355. "_build",
  356. "test",
  357. "lib",
  358. Name1,
  359. "test",
  360. Name1 ++ "_SUITE"])),
  361. Expect2 = filename:absname(filename:join([AppDir,
  362. "_build",
  363. "test",
  364. "lib",
  365. Name2,
  366. "test",
  367. Name2 ++ "_SUITE"])),
  368. Expect3 = filename:absname(filename:join([AppDir,
  369. "_build",
  370. "test",
  371. "test",
  372. "extra_SUITE"])),
  373. Suites = proplists:get_value(suite, Result),
  374. true = (lists:sort([Expect1, Expect2, Expect3]) == lists:sort(Suites)).
  375. single_dir_and_single_suite(Config) ->
  376. AppDir = ?config(apps, Config),
  377. [_Name1, _Name2] = ?config(appnames, Config),
  378. {ok, State} = rebar_test_utils:run_and_check(Config, [], ["as", "test", "compile"], return),
  379. LibDirs = rebar_dir:lib_dirs(State),
  380. State1 = rebar_app_discover:do(State, LibDirs),
  381. Providers = rebar_state:providers(State1),
  382. Namespace = rebar_state:namespace(State1),
  383. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  384. GetOptSpec = providers:opts(CommandProvider),
  385. {ok, GetOptResult} = getopt:parse(GetOptSpec,
  386. ["--dir=" ++ filename:join([AppDir, "test"]),
  387. "--suite=extra_SUITE"]),
  388. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  389. Result = rebar_prv_common_test:setup_ct(State2),
  390. Expect = [filename:absname(filename:join([AppDir,
  391. "_build",
  392. "test",
  393. "test",
  394. "extra_SUITE"]))],
  395. Suite = proplists:get_value(suite, Result),
  396. Expect = Suite.
  397. symlinked_dir_overwritten_fix(Config) ->
  398. AppDir = ?config(apps, Config),
  399. [Name1, _Name2] = ?config(appnames, Config),
  400. {ok, State} = rebar_test_utils:run_and_check(Config, [], ["as", "test", "compile"], return),
  401. LibDirs = rebar_dir:lib_dirs(State),
  402. State1 = rebar_app_discover:do(State, LibDirs),
  403. Providers = rebar_state:providers(State1),
  404. Namespace = rebar_state:namespace(State1),
  405. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  406. GetOptSpec = providers:opts(CommandProvider),
  407. {ok, GetOptResult} = getopt:parse(GetOptSpec,
  408. ["--dir=" ++ filename:join([AppDir,
  409. "apps",
  410. Name1])]),
  411. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  412. Result = rebar_prv_common_test:setup_ct(State2),
  413. Expect = filename:absname(filename:join([AppDir, "_build", "test", "lib", Name1])),
  414. Dir = proplists:get_value(dir, Result),
  415. Expect = Dir,
  416. {ok, _} = rebar_test_utils:run_and_check(Config, [], ["as", "test", "compile"], return).
  417. test_suite(Name) ->
  418. io_lib:format("-module(~ts_SUITE).\n"
  419. "-compile(export_all).\n"
  420. "all() -> [some_test].\n"
  421. "some_test(_) -> ok.\n", [Name]).