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.

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