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

1248 行
48 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. basic_app_ct_macro/1,
  9. multi_app_default_dirs/1,
  10. multi_app_default_beams/1,
  11. multi_app_ct_macro/1,
  12. single_app_dir/1,
  13. single_extra_dir/1,
  14. single_unmanaged_dir/1,
  15. single_suite/1,
  16. single_extra_suite/1,
  17. single_unmanaged_suite/1,
  18. multi_suite/1,
  19. all_suite/1,
  20. single_dir_and_single_suite/1,
  21. suite_at_root/1,
  22. suite_at_app_root/1,
  23. data_dir_correct/1,
  24. cmd_label/1,
  25. cmd_config/1,
  26. cmd_spec/1,
  27. cmd_join_specs/1,
  28. cmd_allow_user_terms/1,
  29. cmd_logdir/1,
  30. cmd_logopts/1,
  31. cmd_verbosity/1,
  32. cmd_repeat/1,
  33. cmd_duration/1,
  34. cmd_until/1,
  35. cmd_force_stop/1,
  36. cmd_basic_html/1,
  37. cmd_stylesheet/1,
  38. cmd_decrypt_key/1,
  39. cmd_decrypt_file/1,
  40. cmd_abort_if_missing_suites/1,
  41. cmd_multiply_timetraps/1,
  42. cmd_scale_timetraps/1,
  43. cmd_create_priv_dir/1,
  44. cmd_include_dir/1,
  45. cmd_sys_config/1,
  46. cfg_opts/1,
  47. cfg_arbitrary_opts/1,
  48. cfg_cover_spec/1,
  49. cfg_atom_suites/1,
  50. cover_compiled/1,
  51. misspecified_ct_opts/1,
  52. misspecified_ct_compile_opts/1,
  53. misspecified_ct_first_files/1]).
  54. -include_lib("eunit/include/eunit.hrl").
  55. -include_lib("common_test/include/ct.hrl").
  56. all() -> [{group, basic_app},
  57. {group, multi_app},
  58. {group, dirs_and_suites},
  59. {group, data_dirs},
  60. {group, ct_opts},
  61. {group, cover},
  62. cfg_opts, cfg_arbitrary_opts,
  63. cfg_cover_spec,
  64. cfg_atom_suites,
  65. misspecified_ct_opts,
  66. misspecified_ct_compile_opts,
  67. misspecified_ct_first_files].
  68. groups() -> [{basic_app, [], [basic_app_default_dirs,
  69. basic_app_default_beams,
  70. basic_app_ct_macro]},
  71. {multi_app, [], [multi_app_default_dirs,
  72. multi_app_default_beams,
  73. multi_app_ct_macro]},
  74. {dirs_and_suites, [], [single_app_dir,
  75. single_extra_dir,
  76. single_unmanaged_dir,
  77. single_suite,
  78. single_extra_suite,
  79. single_unmanaged_suite,
  80. multi_suite,
  81. all_suite,
  82. single_dir_and_single_suite,
  83. suite_at_root,
  84. suite_at_app_root]},
  85. {data_dirs, [], [data_dir_correct]},
  86. {ct_opts, [], [cmd_label,
  87. cmd_config,
  88. cmd_spec,
  89. cmd_join_specs,
  90. cmd_allow_user_terms,
  91. cmd_logdir,
  92. cmd_logopts,
  93. cmd_verbosity,
  94. cmd_repeat,
  95. cmd_duration,
  96. cmd_until,
  97. cmd_force_stop,
  98. cmd_basic_html,
  99. cmd_stylesheet,
  100. cmd_decrypt_key,
  101. cmd_decrypt_file,
  102. cmd_abort_if_missing_suites,
  103. cmd_multiply_timetraps,
  104. cmd_scale_timetraps,
  105. cmd_create_priv_dir,
  106. cmd_include_dir,
  107. cmd_sys_config]},
  108. {cover, [], [cover_compiled]}].
  109. init_per_group(basic_app, Config) ->
  110. C = rebar_test_utils:init_rebar_state(Config, "ct_"),
  111. AppDir = ?config(apps, C),
  112. Name = rebar_test_utils:create_random_name(atom_to_list(basic_app) ++ "_"),
  113. Vsn = rebar_test_utils:create_random_vsn(),
  114. rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
  115. Suite = filename:join([AppDir, "test", Name ++ "_SUITE.erl"]),
  116. ok = filelib:ensure_dir(Suite),
  117. ok = file:write_file(Suite, test_suite(Name)),
  118. {ok, State} = rebar_test_utils:run_and_check(C, [], ["as", "test", "lock"], return),
  119. Tests = rebar_prv_common_test:prepare_tests(State),
  120. {ok, NewState} = rebar_prv_common_test:compile(State, Tests),
  121. {ok, T} = Tests,
  122. Opts = rebar_prv_common_test:translate_paths(NewState, T),
  123. [{result, Opts}, {appnames, [Name]}, {compile_state, NewState}|C];
  124. init_per_group(multi_app, Config) ->
  125. C = rebar_test_utils:init_rebar_state(Config, "ct_"),
  126. AppDir = ?config(apps, C),
  127. Name1 = rebar_test_utils:create_random_name(atom_to_list(multi_app) ++ "_"),
  128. Vsn1 = rebar_test_utils:create_random_vsn(),
  129. AppDir1 = filename:join([AppDir, "apps", Name1]),
  130. rebar_test_utils:create_app(AppDir1, Name1, Vsn1, [kernel, stdlib]),
  131. Suite1 = filename:join([AppDir1, "test", Name1 ++ "_SUITE.erl"]),
  132. ok = filelib:ensure_dir(Suite1),
  133. ok = file:write_file(Suite1, test_suite(Name1)),
  134. Name2 = rebar_test_utils:create_random_name(atom_to_list(multi_app) ++ "_"),
  135. Vsn2 = rebar_test_utils:create_random_vsn(),
  136. AppDir2 = filename:join([AppDir, "apps", Name2]),
  137. rebar_test_utils:create_app(AppDir2, Name2, Vsn2, [kernel, stdlib]),
  138. Suite2 = filename:join([AppDir2, "test", Name2 ++ "_SUITE.erl"]),
  139. ok = filelib:ensure_dir(Suite2),
  140. ok = file:write_file(Suite2, test_suite(Name2)),
  141. Suite3 = filename:join([AppDir, "test", "extras_SUITE.erl"]),
  142. ok = filelib:ensure_dir(Suite3),
  143. ok = file:write_file(Suite3, test_suite("extras")),
  144. {ok, State} = rebar_test_utils:run_and_check(C, [], ["as", "test", "lock"], return),
  145. Tests = rebar_prv_common_test:prepare_tests(State),
  146. {ok, NewState} = rebar_prv_common_test:compile(State, Tests),
  147. {ok, T} = Tests,
  148. Opts = rebar_prv_common_test:translate_paths(NewState, T),
  149. [{result, Opts}, {appnames, [Name1, Name2]}, {compile_state, NewState}|C];
  150. init_per_group(dirs_and_suites, Config) ->
  151. C = rebar_test_utils:init_rebar_state(Config, "ct_"),
  152. AppDir = ?config(apps, C),
  153. Name1 = rebar_test_utils:create_random_name(atom_to_list(dirs_and_suites) ++ "_"),
  154. Vsn1 = rebar_test_utils:create_random_vsn(),
  155. AppDir1 = filename:join([AppDir, "apps", Name1]),
  156. rebar_test_utils:create_app(AppDir1, Name1, Vsn1, [kernel, stdlib]),
  157. Suite1 = filename:join([AppDir1, "test", Name1 ++ "_SUITE.erl"]),
  158. ok = filelib:ensure_dir(Suite1),
  159. ok = file:write_file(Suite1, test_suite(Name1)),
  160. Name2 = rebar_test_utils:create_random_name(atom_to_list(dir_and_suites) ++ "_"),
  161. Vsn2 = rebar_test_utils:create_random_vsn(),
  162. AppDir2 = filename:join([AppDir, "apps", Name2]),
  163. rebar_test_utils:create_app(AppDir2, Name2, Vsn2, [kernel, stdlib]),
  164. Suite2 = filename:join([AppDir2, "test", Name2 ++ "_SUITE.erl"]),
  165. ok = filelib:ensure_dir(Suite2),
  166. ok = file:write_file(Suite2, test_suite(Name2)),
  167. Suite3 = filename:join([AppDir, "test", "extras_SUITE.erl"]),
  168. ok = filelib:ensure_dir(Suite3),
  169. ok = file:write_file(Suite3, test_suite("extras")),
  170. Suite4 = filename:join([AppDir, "root_SUITE.erl"]),
  171. ok = file:write_file(Suite4, test_suite("root")),
  172. ok = file:write_file(filename:join([AppDir, "root_SUITE.hrl"]), <<>>),
  173. ok = filelib:ensure_dir(filename:join([AppDir, "root_SUITE_data", "dummy.txt"])),
  174. ok = file:write_file(filename:join([AppDir, "root_SUITE_data", "some_data.txt"]), <<>>),
  175. Suite5 = filename:join([AppDir, "apps", Name2, "app_root_SUITE.erl"]),
  176. ok = file:write_file(Suite5, test_suite("app_root")),
  177. ok = file:write_file(filename:join([AppDir, "apps", Name2, "app_root_SUITE.hrl"]), <<>>),
  178. ok = filelib:ensure_dir(filename:join([AppDir, "apps", Name2, "app_root_SUITE_data", "dummy.txt"])),
  179. ok = file:write_file(filename:join([AppDir, "apps", Name2, "app_root_SUITE_data", "some_data.txt"]), <<>>),
  180. {ok, State} = rebar_test_utils:run_and_check(C, [], ["as", "test", "lock"], return),
  181. [{s, State}, {appnames, [Name1, Name2]}|C];
  182. init_per_group(ct_opts, Config) ->
  183. C = rebar_test_utils:init_rebar_state(Config, "ct_opts"),
  184. AppDir = ?config(apps, C),
  185. Name = rebar_test_utils:create_random_name("ct_opts_"),
  186. Vsn = rebar_test_utils:create_random_vsn(),
  187. rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
  188. {ok, State} = rebar_test_utils:run_and_check(C, [], ["as", "test", "lock"], return),
  189. [{result, State}, {name, Name}|C];
  190. init_per_group(cover, Config) ->
  191. C = rebar_test_utils:init_rebar_state(Config, "ct_opts"),
  192. AppDir = ?config(apps, C),
  193. Name = rebar_test_utils:create_random_name("ct_opts_"),
  194. Vsn = rebar_test_utils:create_random_vsn(),
  195. rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
  196. {ok, State} = rebar_test_utils:run_and_check(C, [], ["as", "test", "lock"], return),
  197. [{result, State}, {name, Name}|C];
  198. init_per_group(_, Config) -> Config.
  199. end_per_group(_Group, _Config) -> ok.
  200. basic_app_default_dirs(Config) ->
  201. AppDir = ?config(apps, Config),
  202. [Name] = ?config(appnames, Config),
  203. Result = ?config(result, Config),
  204. Expect = filename:join([AppDir, "_build", "test", "lib", Name, "test"]),
  205. Dir = proplists:get_value(dir, Result),
  206. [Expect] = Dir.
  207. basic_app_default_beams(Config) ->
  208. AppDir = ?config(apps, Config),
  209. [Name] = ?config(appnames, Config),
  210. File = filename:join([AppDir,
  211. "_build",
  212. "test",
  213. "lib",
  214. Name,
  215. "test",
  216. Name ++ "_SUITE.beam"]),
  217. true = filelib:is_file(File).
  218. basic_app_ct_macro(Config) ->
  219. State = ?config(compile_state, Config),
  220. [App] = rebar_state:project_apps(State),
  221. Opts = rebar_app_info:opts(App),
  222. ErlOpts = dict:fetch(erl_opts, Opts),
  223. true = lists:member({d, 'COMMON_TEST'}, ErlOpts).
  224. multi_app_default_dirs(Config) ->
  225. AppDir = ?config(apps, Config),
  226. [Name1, Name2] = ?config(appnames, Config),
  227. Result = ?config(result, Config),
  228. Expect1 = filename:absname(filename:join([AppDir, "_build", "test", "lib", Name1, "test"])),
  229. Expect2 = filename:absname(filename:join([AppDir, "_build", "test", "lib", Name2, "test"])),
  230. Expect3 = filename:absname(filename:join([AppDir, "_build", "test", "extras", "test"])),
  231. Dirs = proplists:get_value(dir, Result),
  232. true = (lists:sort([Expect1, Expect2, Expect3]) == lists:sort(Dirs)).
  233. multi_app_default_beams(Config) ->
  234. AppDir = ?config(apps, Config),
  235. [Name1, Name2] = ?config(appnames, Config),
  236. File1 = filename:join([AppDir,
  237. "_build",
  238. "test",
  239. "lib",
  240. Name1,
  241. "test",
  242. Name1 ++ "_SUITE.beam"]),
  243. File2 = filename:join([AppDir,
  244. "_build",
  245. "test",
  246. "lib",
  247. Name2,
  248. "test",
  249. Name2 ++ "_SUITE.beam"]),
  250. File3 = filename:join([AppDir,
  251. "_build",
  252. "test",
  253. "extras",
  254. "test",
  255. "extras_SUITE.beam"]),
  256. true = filelib:is_file(File1),
  257. true = filelib:is_file(File2),
  258. true = filelib:is_file(File3).
  259. multi_app_ct_macro(Config) ->
  260. State = ?config(compile_state, Config),
  261. Apps = rebar_state:project_apps(State),
  262. lists:foreach(fun(App) ->
  263. Opts = rebar_app_info:opts(App),
  264. ErlOpts = dict:fetch(erl_opts, Opts),
  265. true = lists:member({d, 'COMMON_TEST'}, ErlOpts)
  266. end, Apps).
  267. single_app_dir(Config) ->
  268. AppDir = ?config(apps, Config),
  269. [Name1, _Name2] = ?config(appnames, Config),
  270. State = ?config(s, Config),
  271. LibDirs = rebar_dir:lib_dirs(State),
  272. State1 = rebar_app_discover:do(State, LibDirs),
  273. Providers = rebar_state:providers(State1),
  274. Namespace = rebar_state:namespace(State1),
  275. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  276. GetOptSpec = providers:opts(CommandProvider),
  277. {ok, GetOptResult} = getopt:parse(GetOptSpec,
  278. ["--dir=" ++ filename:join([AppDir,
  279. "apps",
  280. Name1,
  281. "test"])]),
  282. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  283. Tests = rebar_prv_common_test:prepare_tests(State2),
  284. {ok, NewState} = rebar_prv_common_test:compile(State2, Tests),
  285. {ok, T} = Tests,
  286. Opts = rebar_prv_common_test:translate_paths(NewState, T),
  287. Expect = filename:join([AppDir, "_build", "test", "lib", Name1, "test"]),
  288. Dir = proplists:get_value(dir, Opts),
  289. [Expect] = Dir.
  290. single_extra_dir(Config) ->
  291. AppDir = ?config(apps, Config),
  292. State = ?config(s, Config),
  293. LibDirs = rebar_dir:lib_dirs(State),
  294. State1 = rebar_app_discover:do(State, LibDirs),
  295. Providers = rebar_state:providers(State1),
  296. Namespace = rebar_state:namespace(State1),
  297. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  298. GetOptSpec = providers:opts(CommandProvider),
  299. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--dir=" ++ filename:join([AppDir,
  300. "test"])]),
  301. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  302. Tests = rebar_prv_common_test:prepare_tests(State2),
  303. {ok, NewState} = rebar_prv_common_test:compile(State2, Tests),
  304. {ok, T} = Tests,
  305. Opts = rebar_prv_common_test:translate_paths(NewState, T),
  306. Expect = filename:join([AppDir, "_build", "test", "extras", "test"]),
  307. Dir = proplists:get_value(dir, Opts),
  308. [Expect] = Dir.
  309. single_unmanaged_dir(Config) ->
  310. PrivDir = ?config(priv_dir, Config),
  311. State = ?config(s, Config),
  312. Suite = filename:join([PrivDir, "unmanaged_dir", "unmanaged_dir_SUITE.erl"]),
  313. ok = filelib:ensure_dir(Suite),
  314. ok = file:write_file(Suite, test_suite("unmanaged_dir")),
  315. LibDirs = rebar_dir:lib_dirs(State),
  316. State1 = rebar_app_discover:do(State, LibDirs),
  317. Providers = rebar_state:providers(State1),
  318. Namespace = rebar_state:namespace(State1),
  319. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  320. GetOptSpec = providers:opts(CommandProvider),
  321. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--dir=" ++ filename:absname(filename:join([PrivDir,
  322. "unmanaged_dir"]))]),
  323. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  324. Tests = rebar_prv_common_test:prepare_tests(State2),
  325. {ok, NewState} = rebar_prv_common_test:compile(State2, Tests),
  326. {ok, T} = Tests,
  327. Opts = rebar_prv_common_test:translate_paths(NewState, T),
  328. Expect = filename:join([PrivDir, "unmanaged_dir"]),
  329. Dir = proplists:get_value(dir, Opts),
  330. [Expect] = Dir.
  331. single_suite(Config) ->
  332. AppDir = ?config(apps, Config),
  333. [Name1, _Name2] = ?config(appnames, Config),
  334. State = ?config(s, Config),
  335. LibDirs = rebar_dir:lib_dirs(State),
  336. State1 = rebar_app_discover:do(State, LibDirs),
  337. Providers = rebar_state:providers(State1),
  338. Namespace = rebar_state:namespace(State1),
  339. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  340. GetOptSpec = providers:opts(CommandProvider),
  341. {ok, GetOptResult} = getopt:parse(GetOptSpec,
  342. ["--suite=" ++ filename:join([AppDir,
  343. "apps",
  344. Name1,
  345. "test",
  346. Name1 ++ "_SUITE"])]),
  347. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  348. Tests = rebar_prv_common_test:prepare_tests(State2),
  349. {ok, NewState} = rebar_prv_common_test:compile(State2, Tests),
  350. {ok, T} = Tests,
  351. Opts = rebar_prv_common_test:translate_paths(NewState, T),
  352. Expect = filename:join([AppDir,
  353. "_build",
  354. "test",
  355. "lib",
  356. Name1,
  357. "test",
  358. Name1 ++ "_SUITE"]),
  359. Suite = proplists:get_value(suite, Opts),
  360. [Expect] = Suite.
  361. single_extra_suite(Config) ->
  362. AppDir = ?config(apps, Config),
  363. [_Name1, _Name2] = ?config(appnames, Config),
  364. State = ?config(s, Config),
  365. LibDirs = rebar_dir:lib_dirs(State),
  366. State1 = rebar_app_discover:do(State, LibDirs),
  367. Providers = rebar_state:providers(State1),
  368. Namespace = rebar_state:namespace(State1),
  369. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  370. GetOptSpec = providers:opts(CommandProvider),
  371. {ok, GetOptResult} = getopt:parse(GetOptSpec,
  372. ["--suite=" ++ filename:join([AppDir,
  373. "test",
  374. "extra_SUITE"])]),
  375. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  376. Tests = rebar_prv_common_test:prepare_tests(State2),
  377. {ok, NewState} = rebar_prv_common_test:compile(State2, Tests),
  378. {ok, T} = Tests,
  379. Opts = rebar_prv_common_test:translate_paths(NewState, T),
  380. Expect = filename:join([AppDir,
  381. "_build",
  382. "test",
  383. "extras",
  384. "test",
  385. "extra_SUITE"]),
  386. Suite = proplists:get_value(suite, Opts),
  387. [Expect] = Suite.
  388. single_unmanaged_suite(Config) ->
  389. PrivDir = ?config(priv_dir, Config),
  390. [_Name1, _Name2] = ?config(appnames, Config),
  391. State = ?config(s, Config),
  392. Suite = filename:join([PrivDir, "unmanaged", "unmanaged_SUITE.erl"]),
  393. ok = filelib:ensure_dir(Suite),
  394. ok = file:write_file(Suite, test_suite("unmanaged")),
  395. LibDirs = rebar_dir:lib_dirs(State),
  396. State1 = rebar_app_discover:do(State, LibDirs),
  397. Providers = rebar_state:providers(State1),
  398. Namespace = rebar_state:namespace(State1),
  399. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  400. GetOptSpec = providers:opts(CommandProvider),
  401. {ok, GetOptResult} = getopt:parse(GetOptSpec,
  402. ["--suite=" ++ filename:absname(filename:join([PrivDir,
  403. "unmanaged",
  404. "unmanaged_SUITE"]))]),
  405. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  406. Tests = rebar_prv_common_test:prepare_tests(State2),
  407. {ok, NewState} = rebar_prv_common_test:compile(State2, Tests),
  408. {ok, T} = Tests,
  409. Opts = rebar_prv_common_test:translate_paths(NewState, T),
  410. Expect = filename:join([PrivDir,
  411. "unmanaged",
  412. "unmanaged_SUITE"]),
  413. SuitePath = proplists:get_value(suite, Opts),
  414. [Expect] = SuitePath.
  415. multi_suite(Config) ->
  416. AppDir = ?config(apps, Config),
  417. [Name1, Name2] = ?config(appnames, Config),
  418. State = ?config(s, Config),
  419. LibDirs = rebar_dir:lib_dirs(State),
  420. State1 = rebar_app_discover:do(State, LibDirs),
  421. Providers = rebar_state:providers(State1),
  422. Namespace = rebar_state:namespace(State1),
  423. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  424. GetOptSpec = providers:opts(CommandProvider),
  425. {ok, GetOptResult} = getopt:parse(GetOptSpec,
  426. ["--suite=" ++ filename:join([AppDir,
  427. "apps",
  428. Name1,
  429. "test",
  430. Name1 ++ "_SUITE," ++ AppDir,
  431. "apps",
  432. Name2,
  433. "test",
  434. Name2 ++ "_SUITE"])]),
  435. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  436. Tests = rebar_prv_common_test:prepare_tests(State2),
  437. {ok, NewState} = rebar_prv_common_test:compile(State2, Tests),
  438. {ok, T} = Tests,
  439. Opts = rebar_prv_common_test:translate_paths(NewState, T),
  440. Expect1 = filename:join([AppDir,
  441. "_build",
  442. "test",
  443. "lib",
  444. Name1,
  445. "test",
  446. Name1 ++ "_SUITE"]),
  447. Expect2 = filename:join([AppDir,
  448. "_build",
  449. "test",
  450. "lib",
  451. Name2,
  452. "test",
  453. Name2 ++ "_SUITE"]),
  454. Suites = proplists:get_value(suite, Opts),
  455. true = (lists:sort([Expect1, Expect2]) == lists:sort(Suites)).
  456. all_suite(Config) ->
  457. AppDir = ?config(apps, Config),
  458. [Name1, Name2] = ?config(appnames, Config),
  459. State = ?config(s, Config),
  460. LibDirs = rebar_dir:lib_dirs(State),
  461. State1 = rebar_app_discover:do(State, LibDirs),
  462. Providers = rebar_state:providers(State1),
  463. Namespace = rebar_state:namespace(State1),
  464. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  465. GetOptSpec = providers:opts(CommandProvider),
  466. {ok, GetOptResult} = getopt:parse(GetOptSpec,
  467. ["--suite=" ++ filename:join([AppDir,
  468. "apps",
  469. Name1,
  470. "test",
  471. Name1 ++ "_SUITE," ++ AppDir,
  472. "apps",
  473. Name2,
  474. "test",
  475. Name2 ++ "_SUITE," ++ AppDir,
  476. "test",
  477. "extra_SUITE"])]),
  478. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  479. Tests = rebar_prv_common_test:prepare_tests(State2),
  480. {ok, NewState} = rebar_prv_common_test:compile(State2, Tests),
  481. {ok, T} = Tests,
  482. Opts = rebar_prv_common_test:translate_paths(NewState, T),
  483. Expect1 = filename:join([AppDir,
  484. "_build",
  485. "test",
  486. "lib",
  487. Name1,
  488. "test",
  489. Name1 ++ "_SUITE"]),
  490. Expect2 = filename:join([AppDir,
  491. "_build",
  492. "test",
  493. "lib",
  494. Name2,
  495. "test",
  496. Name2 ++ "_SUITE"]),
  497. Expect3 = filename:join([AppDir,
  498. "_build",
  499. "test",
  500. "extras",
  501. "test",
  502. "extra_SUITE"]),
  503. Suites = proplists:get_value(suite, Opts),
  504. true = (lists:sort([Expect1, Expect2, Expect3]) == lists:sort(Suites)).
  505. single_dir_and_single_suite(Config) ->
  506. AppDir = ?config(apps, Config),
  507. [_Name1, _Name2] = ?config(appnames, Config),
  508. State = ?config(s, Config),
  509. LibDirs = rebar_dir:lib_dirs(State),
  510. State1 = rebar_app_discover:do(State, LibDirs),
  511. Providers = rebar_state:providers(State1),
  512. Namespace = rebar_state:namespace(State1),
  513. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  514. GetOptSpec = providers:opts(CommandProvider),
  515. {ok, GetOptResult} = getopt:parse(GetOptSpec,
  516. ["--dir=" ++ filename:join([AppDir, "test"]),
  517. "--suite=extra_SUITE"]),
  518. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  519. Tests = rebar_prv_common_test:prepare_tests(State2),
  520. {ok, NewState} = rebar_prv_common_test:compile(State2, Tests),
  521. {ok, T} = Tests,
  522. Opts = rebar_prv_common_test:translate_paths(NewState, T),
  523. Expect = filename:join([AppDir,
  524. "_build",
  525. "test",
  526. "extras",
  527. "test"]),
  528. Dir = proplists:get_value(dir, Opts),
  529. [Expect] = Dir,
  530. Suite = proplists:get_value(suite, Opts),
  531. ["extra_SUITE"] = Suite.
  532. suite_at_root(Config) ->
  533. AppDir = ?config(apps, Config),
  534. State = ?config(s, Config),
  535. LibDirs = rebar_dir:lib_dirs(State),
  536. State1 = rebar_app_discover:do(State, LibDirs),
  537. Providers = rebar_state:providers(State1),
  538. Namespace = rebar_state:namespace(State1),
  539. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  540. GetOptSpec = providers:opts(CommandProvider),
  541. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--suite=" ++ filename:join([AppDir, "root_SUITE"])]),
  542. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  543. Tests = rebar_prv_common_test:prepare_tests(State2),
  544. {ok, NewState} = rebar_prv_common_test:compile(State2, Tests),
  545. {ok, T} = Tests,
  546. Opts = rebar_prv_common_test:translate_paths(NewState, T),
  547. Suite = proplists:get_value(suite, Opts),
  548. Expected = filename:join([AppDir, "_build", "test", "extras", "root_SUITE"]),
  549. [Expected] = Suite,
  550. TestHrl = filename:join([AppDir, "_build", "test", "extras", "root_SUITE.hrl"]),
  551. true = filelib:is_file(TestHrl),
  552. TestBeam = filename:join([AppDir, "_build", "test", "extras", "root_SUITE.beam"]),
  553. true = filelib:is_file(TestBeam),
  554. DataDir = filename:join([AppDir, "_build", "test", "extras", "root_SUITE_data"]),
  555. true = filelib:is_dir(DataDir),
  556. DataFile = filename:join([AppDir, "_build", "test", "extras", "root_SUITE_data", "some_data.txt"]),
  557. true = filelib:is_file(DataFile).
  558. suite_at_app_root(Config) ->
  559. AppDir = ?config(apps, Config),
  560. [_Name1, Name2] = ?config(appnames, Config),
  561. State = ?config(s, Config),
  562. LibDirs = rebar_dir:lib_dirs(State),
  563. State1 = rebar_app_discover:do(State, LibDirs),
  564. Providers = rebar_state:providers(State1),
  565. Namespace = rebar_state:namespace(State1),
  566. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  567. GetOptSpec = providers:opts(CommandProvider),
  568. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--suite=" ++ filename:join([AppDir, "apps", Name2, "app_root_SUITE"])]),
  569. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  570. Tests = rebar_prv_common_test:prepare_tests(State2),
  571. {ok, NewState} = rebar_prv_common_test:compile(State2, Tests),
  572. {ok, T} = Tests,
  573. Opts = rebar_prv_common_test:translate_paths(NewState, T),
  574. Suite = proplists:get_value(suite, Opts),
  575. Expected = filename:join([AppDir, "_build", "test", "lib", Name2, "app_root_SUITE"]),
  576. [Expected] = Suite,
  577. TestHrl = filename:join([AppDir, "_build", "test", "lib", Name2, "app_root_SUITE.hrl"]),
  578. true = filelib:is_file(TestHrl),
  579. TestBeam = filename:join([AppDir, "_build", "test", "lib", Name2, "app_root_SUITE.beam"]),
  580. true = filelib:is_file(TestBeam),
  581. DataDir = filename:join([AppDir, "_build", "test", "lib", Name2, "app_root_SUITE_data"]),
  582. true = filelib:is_dir(DataDir),
  583. DataFile = filename:join([AppDir, "_build", "test", "lib", Name2, "app_root_SUITE_data", "some_data.txt"]),
  584. true = filelib:is_file(DataFile).
  585. %% this test probably only fails when this suite is run via rebar3 with the --cover flag
  586. data_dir_correct(Config) ->
  587. DataDir = ?config(data_dir, Config),
  588. Parts = filename:split(DataDir),
  589. ["rebar_ct_SUITE_data","test","rebar","lib",_,"_build"|_] = lists:reverse(Parts).
  590. cmd_label(Config) ->
  591. State = ?config(result, Config),
  592. Providers = rebar_state:providers(State),
  593. Namespace = rebar_state:namespace(State),
  594. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  595. GetOptSpec = providers:opts(CommandProvider),
  596. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--label=this_is_a_label"]),
  597. NewState = rebar_state:command_parsed_args(State, GetOptResult),
  598. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(NewState),
  599. true = lists:member({label, "this_is_a_label"}, TestOpts).
  600. cmd_config(Config) ->
  601. State = ?config(result, Config),
  602. Providers = rebar_state:providers(State),
  603. Namespace = rebar_state:namespace(State),
  604. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  605. GetOptSpec = providers:opts(CommandProvider),
  606. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--config=config/foo,config/bar,config/baz"]),
  607. NewState = rebar_state:command_parsed_args(State, GetOptResult),
  608. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(NewState),
  609. true = lists:member({config, ["config/foo", "config/bar", "config/baz"]}, TestOpts).
  610. cmd_spec(Config) ->
  611. State = ?config(result, Config),
  612. Providers = rebar_state:providers(State),
  613. Namespace = rebar_state:namespace(State),
  614. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  615. GetOptSpec = providers:opts(CommandProvider),
  616. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--spec=foo.spec,bar.spec,baz.spec"]),
  617. NewState = rebar_state:command_parsed_args(State, GetOptResult),
  618. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(NewState),
  619. true = lists:member({spec, ["foo.spec", "bar.spec", "baz.spec"]}, TestOpts).
  620. cmd_join_specs(Config) ->
  621. State = ?config(result, Config),
  622. Providers = rebar_state:providers(State),
  623. Namespace = rebar_state:namespace(State),
  624. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  625. GetOptSpec = providers:opts(CommandProvider),
  626. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--join_specs=true"]),
  627. NewState = rebar_state:command_parsed_args(State, GetOptResult),
  628. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(NewState),
  629. true = lists:member({join_specs, true}, TestOpts).
  630. cmd_allow_user_terms(Config) ->
  631. State = ?config(result, Config),
  632. Providers = rebar_state:providers(State),
  633. Namespace = rebar_state:namespace(State),
  634. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  635. GetOptSpec = providers:opts(CommandProvider),
  636. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--allow_user_terms=true"]),
  637. NewState = rebar_state:command_parsed_args(State, GetOptResult),
  638. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(NewState),
  639. true = lists:member({allow_user_terms, true}, TestOpts).
  640. cmd_logdir(Config) ->
  641. State = ?config(result, Config),
  642. Providers = rebar_state:providers(State),
  643. Namespace = rebar_state:namespace(State),
  644. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  645. GetOptSpec = providers:opts(CommandProvider),
  646. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--logdir=/tmp/ct_logs"]),
  647. NewState = rebar_state:command_parsed_args(State, GetOptResult),
  648. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(NewState),
  649. true = lists:member({logdir, "/tmp/ct_logs"}, TestOpts).
  650. cmd_logopts(Config) ->
  651. State = ?config(result, Config),
  652. Providers = rebar_state:providers(State),
  653. Namespace = rebar_state:namespace(State),
  654. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  655. GetOptSpec = providers:opts(CommandProvider),
  656. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--logopts=no_src,no_nl"]),
  657. NewState = rebar_state:command_parsed_args(State, GetOptResult),
  658. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(NewState),
  659. true = lists:member({logopts, [no_src, no_nl]}, TestOpts).
  660. cmd_verbosity(Config) ->
  661. State = ?config(result, Config),
  662. Providers = rebar_state:providers(State),
  663. Namespace = rebar_state:namespace(State),
  664. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  665. GetOptSpec = providers:opts(CommandProvider),
  666. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--verbosity=43"]),
  667. NewState = rebar_state:command_parsed_args(State, GetOptResult),
  668. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(NewState),
  669. true = lists:member({verbosity, 43}, TestOpts).
  670. cmd_repeat(Config) ->
  671. State = ?config(result, Config),
  672. Providers = rebar_state:providers(State),
  673. Namespace = rebar_state:namespace(State),
  674. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  675. GetOptSpec = providers:opts(CommandProvider),
  676. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--repeat=3"]),
  677. NewState = rebar_state:command_parsed_args(State, GetOptResult),
  678. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(NewState),
  679. true = lists:member({repeat, 3}, TestOpts).
  680. cmd_duration(Config) ->
  681. State = ?config(result, Config),
  682. Providers = rebar_state:providers(State),
  683. Namespace = rebar_state:namespace(State),
  684. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  685. GetOptSpec = providers:opts(CommandProvider),
  686. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--duration=001500"]),
  687. NewState = rebar_state:command_parsed_args(State, GetOptResult),
  688. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(NewState),
  689. true = lists:member({duration, "001500"}, TestOpts).
  690. cmd_until(Config) ->
  691. State = ?config(result, Config),
  692. Providers = rebar_state:providers(State),
  693. Namespace = rebar_state:namespace(State),
  694. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  695. GetOptSpec = providers:opts(CommandProvider),
  696. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--until=001500"]),
  697. NewState = rebar_state:command_parsed_args(State, GetOptResult),
  698. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(NewState),
  699. true = lists:member({until, "001500"}, TestOpts).
  700. cmd_force_stop(Config) ->
  701. State = ?config(result, Config),
  702. Providers = rebar_state:providers(State),
  703. Namespace = rebar_state:namespace(State),
  704. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  705. GetOptSpec = providers:opts(CommandProvider),
  706. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--force_stop=skip_rest"]),
  707. NewState = rebar_state:command_parsed_args(State, GetOptResult),
  708. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(NewState),
  709. true = lists:member({force_stop, skip_rest}, TestOpts).
  710. cmd_basic_html(Config) ->
  711. State = ?config(result, Config),
  712. Providers = rebar_state:providers(State),
  713. Namespace = rebar_state:namespace(State),
  714. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  715. GetOptSpec = providers:opts(CommandProvider),
  716. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--basic_html"]),
  717. NewState = rebar_state:command_parsed_args(State, GetOptResult),
  718. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(NewState),
  719. true = lists:member({basic_html, true}, TestOpts).
  720. cmd_stylesheet(Config) ->
  721. State = ?config(result, Config),
  722. Providers = rebar_state:providers(State),
  723. Namespace = rebar_state:namespace(State),
  724. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  725. GetOptSpec = providers:opts(CommandProvider),
  726. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--stylesheet=resources/tests.css"]),
  727. NewState = rebar_state:command_parsed_args(State, GetOptResult),
  728. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(NewState),
  729. true = lists:member({stylesheet, "resources/tests.css"}, TestOpts).
  730. cmd_decrypt_key(Config) ->
  731. State = ?config(result, Config),
  732. Providers = rebar_state:providers(State),
  733. Namespace = rebar_state:namespace(State),
  734. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  735. GetOptSpec = providers:opts(CommandProvider),
  736. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--decrypt_key==ac467e30"]),
  737. NewState = rebar_state:command_parsed_args(State, GetOptResult),
  738. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(NewState),
  739. true = lists:member({decrypt_key, "=ac467e30"}, TestOpts).
  740. cmd_decrypt_file(Config) ->
  741. State = ?config(result, Config),
  742. Providers = rebar_state:providers(State),
  743. Namespace = rebar_state:namespace(State),
  744. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  745. GetOptSpec = providers:opts(CommandProvider),
  746. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--decrypt_file=../keyfile.pem"]),
  747. NewState = rebar_state:command_parsed_args(State, GetOptResult),
  748. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(NewState),
  749. true = lists:member({decrypt_file, "../keyfile.pem"}, TestOpts).
  750. cmd_abort_if_missing_suites(Config) ->
  751. State = ?config(result, Config),
  752. Providers = rebar_state:providers(State),
  753. Namespace = rebar_state:namespace(State),
  754. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  755. GetOptSpec = providers:opts(CommandProvider),
  756. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--abort_if_missing_suites"]),
  757. NewState = rebar_state:command_parsed_args(State, GetOptResult),
  758. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(NewState),
  759. true = lists:member({abort_if_missing_suites, true}, TestOpts).
  760. cmd_multiply_timetraps(Config) ->
  761. State = ?config(result, Config),
  762. Providers = rebar_state:providers(State),
  763. Namespace = rebar_state:namespace(State),
  764. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  765. GetOptSpec = providers:opts(CommandProvider),
  766. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--multiply_timetraps=3"]),
  767. NewState = rebar_state:command_parsed_args(State, GetOptResult),
  768. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(NewState),
  769. true = lists:member({multiply_timetraps, 3}, TestOpts).
  770. cmd_scale_timetraps(Config) ->
  771. State = ?config(result, Config),
  772. Providers = rebar_state:providers(State),
  773. Namespace = rebar_state:namespace(State),
  774. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  775. GetOptSpec = providers:opts(CommandProvider),
  776. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--scale_timetraps"]),
  777. NewState = rebar_state:command_parsed_args(State, GetOptResult),
  778. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(NewState),
  779. true = lists:member({scale_timetraps, true}, TestOpts).
  780. cmd_create_priv_dir(Config) ->
  781. State = ?config(result, Config),
  782. Providers = rebar_state:providers(State),
  783. Namespace = rebar_state:namespace(State),
  784. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  785. GetOptSpec = providers:opts(CommandProvider),
  786. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--create_priv_dir=manual_per_tc"]),
  787. NewState = rebar_state:command_parsed_args(State, GetOptResult),
  788. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(NewState),
  789. true = lists:member({create_priv_dir, manual_per_tc}, TestOpts).
  790. cmd_include_dir(Config) ->
  791. State = ?config(result, Config),
  792. AppDir = ?config(apps, Config),
  793. Providers = rebar_state:providers(State),
  794. Namespace = rebar_state:namespace(State),
  795. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  796. GetOptSpec = providers:opts(CommandProvider),
  797. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--include=foo/bar/baz,qux"]),
  798. NewState = rebar_state:command_parsed_args(State, GetOptResult),
  799. Tests = rebar_prv_common_test:prepare_tests(NewState),
  800. {ok, _} = rebar_prv_common_test:compile(NewState, Tests),
  801. Name = ?config(name, Config),
  802. Beam = filename:join([AppDir, "_build", "test", "lib", Name, "ebin", Name ++ ".beam"]),
  803. {ok, {_, [{compile_info, Info}]}} = beam_lib:chunks(Beam, [compile_info]),
  804. CompileOpts = proplists:get_value(options, Info),
  805. true = lists:member({i, "foo/bar/baz"}, CompileOpts),
  806. true = lists:member({i, "qux"}, CompileOpts).
  807. cmd_sys_config(Config) ->
  808. State = ?config(result, Config),
  809. AppDir = ?config(apps, Config),
  810. Name = ?config(name, Config),
  811. AppName = list_to_atom(Name),
  812. {ok, _} = rebar_prv_common_test:prepare_tests(State),
  813. ?assertEqual(undefined, application:get_env(AppName, key)),
  814. CfgFile = filename:join([AppDir, "config", "cfg_sys.config"]),
  815. ok = filelib:ensure_dir(CfgFile),
  816. ok = file:write_file(CfgFile, cfg_sys_config_file(AppName)),
  817. RebarConfig = [{ct_opts, [{sys_config, CfgFile}]}],
  818. {ok, State1} = rebar_test_utils:run_and_check(Config, RebarConfig, ["as", "test", "lock"], return),
  819. {ok, _} = rebar_prv_common_test:prepare_tests(State1),
  820. ?assertEqual({ok, cfg_value}, application:get_env(AppName, key)),
  821. Providers = rebar_state:providers(State1),
  822. Namespace = rebar_state:namespace(State1),
  823. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  824. GetOptSpec = providers:opts(CommandProvider),
  825. CmdFile = filename:join([AppDir, "config", "cmd_sys.config"]),
  826. ok = filelib:ensure_dir(CmdFile),
  827. ok = file:write_file(CmdFile, cmd_sys_config_file(AppName)),
  828. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--sys_config="++CmdFile]),
  829. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  830. {ok, _} = rebar_prv_common_test:prepare_tests(State2),
  831. ?assertEqual({ok ,cmd_value}, application:get_env(AppName, key)).
  832. cfg_opts(Config) ->
  833. C = rebar_test_utils:init_rebar_state(Config, "ct_cfg_opts_"),
  834. AppDir = ?config(apps, C),
  835. Name = rebar_test_utils:create_random_name("ct_cfg_opts_"),
  836. Vsn = rebar_test_utils:create_random_vsn(),
  837. rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
  838. RebarConfig = [{ct_opts, [{label, "this_is_a_label"}, {decrypt_file, "../keyfile.pem"}]}],
  839. {ok, State} = rebar_test_utils:run_and_check(C, RebarConfig, ["as", "test", "lock"], return),
  840. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(State),
  841. true = lists:member({label, "this_is_a_label"}, TestOpts),
  842. true = lists:member({decrypt_file, "../keyfile.pem"}, TestOpts).
  843. %% allow even nonsensical opts to be passed to ct_run for futureproofing
  844. cfg_arbitrary_opts(Config) ->
  845. C = rebar_test_utils:init_rebar_state(Config, "ct_cfg_arbitrary_opts_"),
  846. AppDir = ?config(apps, C),
  847. Name = rebar_test_utils:create_random_name("ct_cfg_arbitrary_opts_"),
  848. Vsn = rebar_test_utils:create_random_vsn(),
  849. rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
  850. RebarConfig = [{ct_opts, [{foo, 1}, {bar, 2}, {baz, 3}]}],
  851. {ok, State} = rebar_test_utils:run_and_check(C, RebarConfig, ["as", "test", "lock"], return),
  852. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(State),
  853. true = lists:member({foo, 1}, TestOpts),
  854. true = lists:member({bar, 2}, TestOpts),
  855. true = lists:member({baz, 3}, TestOpts).
  856. cfg_cover_spec(Config) ->
  857. C = rebar_test_utils:init_rebar_state(Config, "ct_cfg_cover_spec_opts_"),
  858. AppDir = ?config(apps, C),
  859. Name = rebar_test_utils:create_random_name("ct_cfg_cover_spec_opts_"),
  860. Vsn = rebar_test_utils:create_random_vsn(),
  861. rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
  862. RebarConfig = [{ct_opts, [Opt = {cover, "spec/foo.spec"}]}],
  863. {ok, State} = rebar_test_utils:run_and_check(C, RebarConfig, ["as", "test", "lock"], return),
  864. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(State),
  865. false = lists:member(Opt, TestOpts).
  866. cfg_atom_suites(Config) ->
  867. C = rebar_test_utils:init_rebar_state(Config, "ct_cfg_atom_suites_"),
  868. AppDir = ?config(apps, C),
  869. Name = rebar_test_utils:create_random_name("ct_cfg_atom_suites_"),
  870. Vsn = rebar_test_utils:create_random_vsn(),
  871. rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
  872. RebarConfig = [{ct_opts, [{suite, [foo, bar, baz]}]}],
  873. {ok, State} = rebar_test_utils:run_and_check(C, RebarConfig, ["as", "test", "lock"], return),
  874. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(State),
  875. true = lists:member({suite, ["foo", "bar", "baz"]}, TestOpts).
  876. cover_compiled(Config) ->
  877. State = ?config(result, Config),
  878. Providers = rebar_state:providers(State),
  879. Namespace = rebar_state:namespace(State),
  880. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  881. GetOptSpec = providers:opts(CommandProvider),
  882. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--cover"]),
  883. NewState = rebar_state:command_parsed_args(State, GetOptResult),
  884. Tests = rebar_prv_common_test:prepare_tests(NewState),
  885. {ok, _} = rebar_prv_common_test:compile(NewState, Tests),
  886. Name = ?config(name, Config),
  887. Mod = list_to_atom(Name),
  888. {file, _} = cover:is_compiled(Mod).
  889. misspecified_ct_opts(Config) ->
  890. C = rebar_test_utils:init_rebar_state(Config, "ct_cfg_atom_suites_"),
  891. AppDir = ?config(apps, C),
  892. Name = rebar_test_utils:create_random_name("ct_cfg_atom_suites_"),
  893. Vsn = rebar_test_utils:create_random_vsn(),
  894. rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
  895. RebarConfig = [{ct_opts, {basic_html, false}}],
  896. {ok, State} = rebar_test_utils:run_and_check(C, RebarConfig, ["as", "test", "lock"], return),
  897. {error, {rebar_prv_common_test, Error}} = rebar_prv_common_test:prepare_tests(State),
  898. {badconfig, {"Value `~p' of option `~p' must be a list", {{basic_html, false}, ct_opts}}} = Error.
  899. misspecified_ct_compile_opts(Config) ->
  900. C = rebar_test_utils:init_rebar_state(Config, "ct_cfg_atom_suites_"),
  901. AppDir = ?config(apps, C),
  902. Name = rebar_test_utils:create_random_name("ct_cfg_atom_suites_"),
  903. Vsn = rebar_test_utils:create_random_vsn(),
  904. rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
  905. RebarConfig = [{ct_compile_opts, {d, whatever}}],
  906. {ok, State} = rebar_test_utils:run_and_check(C, RebarConfig, ["as", "test", "lock"], return),
  907. Tests = rebar_prv_common_test:prepare_tests(State),
  908. {error, {rebar_prv_common_test, Error}} = rebar_prv_common_test:compile(State, Tests),
  909. {badconfig, {"Value `~p' of option `~p' must be a list", {{d, whatever}, ct_compile_opts}}} = Error.
  910. misspecified_ct_first_files(Config) ->
  911. C = rebar_test_utils:init_rebar_state(Config, "ct_cfg_atom_suites_"),
  912. AppDir = ?config(apps, C),
  913. Name = rebar_test_utils:create_random_name("ct_cfg_atom_suites_"),
  914. Vsn = rebar_test_utils:create_random_vsn(),
  915. rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
  916. RebarConfig = [{ct_first_files, some_file}],
  917. {ok, State} = rebar_test_utils:run_and_check(C, RebarConfig, ["as", "test", "lock"], return),
  918. Tests = rebar_prv_common_test:prepare_tests(State),
  919. {error, {rebar_prv_common_test, Error}} = rebar_prv_common_test:compile(State, Tests),
  920. {badconfig, {"Value `~p' of option `~p' must be a list", {some_file, ct_first_files}}} = Error.
  921. %% helper for generating test data
  922. test_suite(Name) ->
  923. io_lib:format("-module(~ts_SUITE).\n"
  924. "-compile(export_all).\n"
  925. "all() -> [some_test].\n"
  926. "some_test(_) -> ok.\n", [Name]).
  927. cmd_sys_config_file(AppName) ->
  928. io_lib:format("[{~s, [{key, cmd_value}]}].", [AppName]).
  929. cfg_sys_config_file(AppName) ->
  930. io_lib:format("[{~s, [{key, cfg_value}]}].", [AppName]).