選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

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