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

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