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.

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