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.

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