25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

563 lines
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. "extras",
  163. "test",
  164. "extras_SUITE.beam"]),
  165. true = filelib:is_file(File1),
  166. true = filelib:is_file(File2),
  167. true = filelib:is_file(File3).
  168. single_app_dir(Config) ->
  169. AppDir = ?config(apps, Config),
  170. [Name1, _Name2] = ?config(appnames, Config),
  171. {ok, State} = rebar_test_utils:run_and_check(Config, [], ["as", "test", "compile"], return),
  172. LibDirs = rebar_dir:lib_dirs(State),
  173. State1 = rebar_app_discover:do(State, LibDirs),
  174. Providers = rebar_state:providers(State1),
  175. Namespace = rebar_state:namespace(State1),
  176. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  177. GetOptSpec = providers:opts(CommandProvider),
  178. {ok, GetOptResult} = getopt:parse(GetOptSpec,
  179. ["--dir=" ++ filename:join([AppDir,
  180. "apps",
  181. Name1,
  182. "test"])]),
  183. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  184. Result = rebar_prv_common_test:setup_ct(State2),
  185. Expect = filename:absname(filename:join([AppDir, "_build", "test", "lib", Name1, "test"])),
  186. Dir = proplists:get_value(dir, Result),
  187. Expect = Dir.
  188. single_extra_dir(Config) ->
  189. AppDir = ?config(apps, Config),
  190. {ok, State} = rebar_test_utils:run_and_check(Config, [], ["as", "test", "compile"], return),
  191. LibDirs = rebar_dir:lib_dirs(State),
  192. State1 = rebar_app_discover:do(State, LibDirs),
  193. Providers = rebar_state:providers(State1),
  194. Namespace = rebar_state:namespace(State1),
  195. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  196. GetOptSpec = providers:opts(CommandProvider),
  197. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--dir=" ++ filename:join([AppDir,
  198. "test"])]),
  199. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  200. Result = rebar_prv_common_test:setup_ct(State2),
  201. Expect = filename:absname(filename:join([AppDir, "_build", "test", "test"])),
  202. Dir = proplists:get_value(dir, Result),
  203. Expect = Dir.
  204. single_unmanaged_dir(Config) ->
  205. PrivDir = ?config(priv_dir, Config),
  206. Suite = filename:join([PrivDir, "unmanaged_dir", "unmanaged_dir_SUITE.erl"]),
  207. ok = filelib:ensure_dir(Suite),
  208. ok = file:write_file(Suite, test_suite("unmanaged_dir")),
  209. {ok, State} = rebar_test_utils:run_and_check(Config, [], ["as", "test", "compile"], return),
  210. LibDirs = rebar_dir:lib_dirs(State),
  211. State1 = rebar_app_discover:do(State, LibDirs),
  212. Providers = rebar_state:providers(State1),
  213. Namespace = rebar_state:namespace(State1),
  214. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  215. GetOptSpec = providers:opts(CommandProvider),
  216. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--dir=" ++ filename:absname(filename:join([PrivDir,
  217. "unmanaged_dir"]))]),
  218. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  219. Result = rebar_prv_common_test:setup_ct(State2),
  220. Expect = filename:absname(filename:join([PrivDir, "unmanaged_dir"])),
  221. Dir = proplists:get_value(dir, Result),
  222. Expect = Dir.
  223. single_suite(Config) ->
  224. AppDir = ?config(apps, Config),
  225. [Name1, _Name2] = ?config(appnames, Config),
  226. {ok, State} = rebar_test_utils:run_and_check(Config, [], ["as", "test", "compile"], return),
  227. LibDirs = rebar_dir:lib_dirs(State),
  228. State1 = rebar_app_discover:do(State, LibDirs),
  229. Providers = rebar_state:providers(State1),
  230. Namespace = rebar_state:namespace(State1),
  231. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  232. GetOptSpec = providers:opts(CommandProvider),
  233. {ok, GetOptResult} = getopt:parse(GetOptSpec,
  234. ["--suite=" ++ filename:join([AppDir,
  235. "apps",
  236. Name1,
  237. "test",
  238. Name1 ++ "_SUITE"])]),
  239. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  240. Result = rebar_prv_common_test:setup_ct(State2),
  241. Expect = [filename:absname(filename:join([AppDir,
  242. "_build",
  243. "test",
  244. "lib",
  245. Name1,
  246. "test",
  247. Name1 ++ "_SUITE"]))],
  248. Suite = proplists:get_value(suite, Result),
  249. Expect = Suite.
  250. single_extra_suite(Config) ->
  251. AppDir = ?config(apps, Config),
  252. [_Name1, _Name2] = ?config(appnames, Config),
  253. {ok, State} = rebar_test_utils:run_and_check(Config, [], ["as", "test", "compile"], return),
  254. LibDirs = rebar_dir:lib_dirs(State),
  255. State1 = rebar_app_discover:do(State, LibDirs),
  256. Providers = rebar_state:providers(State1),
  257. Namespace = rebar_state:namespace(State1),
  258. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  259. GetOptSpec = providers:opts(CommandProvider),
  260. {ok, GetOptResult} = getopt:parse(GetOptSpec,
  261. ["--suite=" ++ filename:join([AppDir,
  262. "test",
  263. "extra_SUITE"])]),
  264. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  265. Result = rebar_prv_common_test:setup_ct(State2),
  266. Expect = [filename:absname(filename:join([AppDir,
  267. "_build",
  268. "test",
  269. "test",
  270. "extra_SUITE"]))],
  271. Suite = proplists:get_value(suite, Result),
  272. Expect = Suite.
  273. single_unmanaged_suite(Config) ->
  274. PrivDir = ?config(priv_dir, Config),
  275. [_Name1, _Name2] = ?config(appnames, Config),
  276. Suite = filename:join([PrivDir, "unmanaged", "unmanaged_SUITE.erl"]),
  277. ok = filelib:ensure_dir(Suite),
  278. ok = file:write_file(Suite, test_suite("unmanaged")),
  279. {ok, State} = rebar_test_utils:run_and_check(Config, [], ["as", "test", "compile"], return),
  280. LibDirs = rebar_dir:lib_dirs(State),
  281. State1 = rebar_app_discover:do(State, LibDirs),
  282. Providers = rebar_state:providers(State1),
  283. Namespace = rebar_state:namespace(State1),
  284. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  285. GetOptSpec = providers:opts(CommandProvider),
  286. {ok, GetOptResult} = getopt:parse(GetOptSpec,
  287. ["--suite=" ++ filename:absname(filename:join([PrivDir,
  288. "unmanaged",
  289. "unmanaged_SUITE"]))]),
  290. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  291. Result = rebar_prv_common_test:setup_ct(State2),
  292. Expect = [filename:absname(filename:join([PrivDir,
  293. "unmanaged",
  294. "unmanaged_SUITE"]))],
  295. SuitePath = proplists:get_value(suite, Result),
  296. Expect = SuitePath.
  297. multi_suite(Config) ->
  298. AppDir = ?config(apps, Config),
  299. [Name1, Name2] = ?config(appnames, Config),
  300. {ok, State} = rebar_test_utils:run_and_check(Config, [], ["as", "test", "compile"], return),
  301. LibDirs = rebar_dir:lib_dirs(State),
  302. State1 = rebar_app_discover:do(State, LibDirs),
  303. Providers = rebar_state:providers(State1),
  304. Namespace = rebar_state:namespace(State1),
  305. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  306. GetOptSpec = providers:opts(CommandProvider),
  307. {ok, GetOptResult} = getopt:parse(GetOptSpec,
  308. ["--suite=" ++ filename:join([AppDir,
  309. "apps",
  310. Name1,
  311. "test",
  312. Name1 ++ "_SUITE," ++ AppDir,
  313. "apps",
  314. Name2,
  315. "test",
  316. Name2 ++ "_SUITE"])]),
  317. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  318. Result = rebar_prv_common_test:setup_ct(State2),
  319. Expect1 = filename:absname(filename:join([AppDir,
  320. "_build",
  321. "test",
  322. "lib",
  323. Name1,
  324. "test",
  325. Name1 ++ "_SUITE"])),
  326. Expect2 = filename:absname(filename:join([AppDir,
  327. "_build",
  328. "test",
  329. "lib",
  330. Name2,
  331. "test",
  332. Name2 ++ "_SUITE"])),
  333. Suites = proplists:get_value(suite, Result),
  334. true = (lists:sort([Expect1, Expect2]) == lists:sort(Suites)).
  335. all_suite(Config) ->
  336. AppDir = ?config(apps, Config),
  337. [Name1, Name2] = ?config(appnames, Config),
  338. {ok, State} = rebar_test_utils:run_and_check(Config, [], ["as", "test", "compile"], return),
  339. LibDirs = rebar_dir:lib_dirs(State),
  340. State1 = rebar_app_discover:do(State, LibDirs),
  341. Providers = rebar_state:providers(State1),
  342. Namespace = rebar_state:namespace(State1),
  343. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  344. GetOptSpec = providers:opts(CommandProvider),
  345. {ok, GetOptResult} = getopt:parse(GetOptSpec,
  346. ["--suite=" ++ filename:join([AppDir,
  347. "apps",
  348. Name1,
  349. "test",
  350. Name1 ++ "_SUITE," ++ AppDir,
  351. "apps",
  352. Name2,
  353. "test",
  354. Name2 ++ "_SUITE," ++ AppDir,
  355. "test",
  356. "extra_SUITE"])]),
  357. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  358. Result = rebar_prv_common_test:setup_ct(State2),
  359. Expect1 = filename:absname(filename:join([AppDir,
  360. "_build",
  361. "test",
  362. "lib",
  363. Name1,
  364. "test",
  365. Name1 ++ "_SUITE"])),
  366. Expect2 = filename:absname(filename:join([AppDir,
  367. "_build",
  368. "test",
  369. "lib",
  370. Name2,
  371. "test",
  372. Name2 ++ "_SUITE"])),
  373. Expect3 = filename:absname(filename:join([AppDir,
  374. "_build",
  375. "test",
  376. "test",
  377. "extra_SUITE"])),
  378. Suites = proplists:get_value(suite, Result),
  379. true = (lists:sort([Expect1, Expect2, Expect3]) == lists:sort(Suites)).
  380. single_dir_and_single_suite(Config) ->
  381. AppDir = ?config(apps, Config),
  382. [_Name1, _Name2] = ?config(appnames, Config),
  383. {ok, State} = rebar_test_utils:run_and_check(Config, [], ["as", "test", "compile"], return),
  384. LibDirs = rebar_dir:lib_dirs(State),
  385. State1 = rebar_app_discover:do(State, LibDirs),
  386. Providers = rebar_state:providers(State1),
  387. Namespace = rebar_state:namespace(State1),
  388. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  389. GetOptSpec = providers:opts(CommandProvider),
  390. {ok, GetOptResult} = getopt:parse(GetOptSpec,
  391. ["--dir=" ++ filename:join([AppDir, "test"]),
  392. "--suite=extra_SUITE"]),
  393. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  394. Result = rebar_prv_common_test:setup_ct(State2),
  395. Expect = [filename:absname(filename:join([AppDir,
  396. "_build",
  397. "test",
  398. "test",
  399. "extra_SUITE"]))],
  400. Suite = proplists:get_value(suite, Result),
  401. Expect = Suite.
  402. symlinked_dir_overwritten_fix(Config) ->
  403. AppDir = ?config(apps, Config),
  404. [Name1, _Name2] = ?config(appnames, Config),
  405. {ok, State} = rebar_test_utils:run_and_check(Config, [], ["as", "test", "compile"], return),
  406. LibDirs = rebar_dir:lib_dirs(State),
  407. State1 = rebar_app_discover:do(State, LibDirs),
  408. Providers = rebar_state:providers(State1),
  409. Namespace = rebar_state:namespace(State1),
  410. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  411. GetOptSpec = providers:opts(CommandProvider),
  412. {ok, GetOptResult} = getopt:parse(GetOptSpec,
  413. ["--dir=" ++ filename:join([AppDir,
  414. "apps",
  415. Name1])]),
  416. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  417. Result = rebar_prv_common_test:setup_ct(State2),
  418. Expect = filename:absname(filename:join([AppDir, "_build", "test", "lib", Name1])),
  419. Dir = proplists:get_value(dir, Result),
  420. Expect = Dir,
  421. {ok, _} = rebar_test_utils:run_and_check(Config, [], ["as", "test", "compile"], return).
  422. %% this test probably only fails when this suite is run via rebar3 with the --cover flag
  423. data_dir_correct(Config) ->
  424. DataDir = ?config(data_dir, Config),
  425. Parts = filename:split(DataDir),
  426. ["rebar_ct_SUITE_data","test","rebar","lib","test","_build"|_] = lists:reverse(Parts).
  427. %% helper for generating test data
  428. test_suite(Name) ->
  429. io_lib:format("-module(~ts_SUITE).\n"
  430. "-compile(export_all).\n"
  431. "all() -> [some_test].\n"
  432. "some_test(_) -> ok.\n", [Name]).