Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

1350 rindas
52 KiB

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