Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.

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