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.

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