Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

1562 linhas
60 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. testspec_at_root/1,
  56. testspec_parse_error/1,
  57. cmd_vs_cfg_opts/1]).
  58. -include_lib("eunit/include/eunit.hrl").
  59. -include_lib("common_test/include/ct.hrl").
  60. all() -> [{group, basic_app},
  61. {group, multi_app},
  62. {group, dirs_and_suites},
  63. {group, data_dirs},
  64. {group, ct_opts},
  65. {group, cover},
  66. cfg_opts, cfg_arbitrary_opts,
  67. cfg_cover_spec,
  68. cfg_atom_suites,
  69. misspecified_ct_opts,
  70. misspecified_ct_compile_opts,
  71. misspecified_ct_first_files,
  72. testspec,
  73. testspec_at_root,
  74. testspec_parse_error,
  75. cmd_vs_cfg_opts].
  76. groups() -> [{basic_app, [], [basic_app_default_dirs,
  77. basic_app_default_beams,
  78. basic_app_ct_macro]},
  79. {multi_app, [], [multi_app_default_dirs,
  80. multi_app_default_beams,
  81. multi_app_ct_macro]},
  82. {dirs_and_suites, [], [single_app_dir,
  83. single_extra_dir,
  84. single_unmanaged_dir,
  85. single_suite,
  86. single_extra_suite,
  87. single_unmanaged_suite,
  88. multi_suite,
  89. all_suite,
  90. single_dir_and_single_suite,
  91. suite_at_root,
  92. suite_at_app_root]},
  93. {data_dirs, [], [data_dir_correct]},
  94. {ct_opts, [], [cmd_label,
  95. cmd_config,
  96. cmd_spec,
  97. cmd_join_specs,
  98. cmd_allow_user_terms,
  99. cmd_logdir,
  100. cmd_logopts,
  101. cmd_verbosity,
  102. cmd_repeat,
  103. cmd_duration,
  104. cmd_until,
  105. cmd_force_stop,
  106. cmd_basic_html,
  107. cmd_stylesheet,
  108. cmd_decrypt_key,
  109. cmd_decrypt_file,
  110. cmd_abort_if_missing_suites,
  111. cmd_multiply_timetraps,
  112. cmd_scale_timetraps,
  113. cmd_create_priv_dir,
  114. cmd_include_dir,
  115. cmd_sys_config]},
  116. {cover, [], [cover_compiled]}].
  117. init_per_group(basic_app, Config) ->
  118. C = rebar_test_utils:init_rebar_state(Config, "ct_"),
  119. AppDir = ?config(apps, C),
  120. Name = rebar_test_utils:create_random_name(atom_to_list(basic_app) ++ "_"),
  121. Vsn = rebar_test_utils:create_random_vsn(),
  122. rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
  123. Suite = filename:join([AppDir, "test", Name ++ "_SUITE.erl"]),
  124. ok = filelib:ensure_dir(Suite),
  125. ok = file:write_file(Suite, test_suite(Name)),
  126. {ok, State} = rebar_test_utils:run_and_check(C, [], ["as", "test", "lock"], return),
  127. Tests = rebar_prv_common_test:prepare_tests(State),
  128. {ok, NewState} = rebar_prv_common_test:compile(State, Tests),
  129. {ok, T} = Tests,
  130. Opts = rebar_prv_common_test:translate_paths(NewState, T),
  131. [{result, Opts}, {appnames, [Name]}, {compile_state, NewState}|C];
  132. init_per_group(multi_app, Config) ->
  133. C = rebar_test_utils:init_rebar_state(Config, "ct_"),
  134. AppDir = ?config(apps, C),
  135. Name1 = rebar_test_utils:create_random_name(atom_to_list(multi_app) ++ "_"),
  136. Vsn1 = rebar_test_utils:create_random_vsn(),
  137. AppDir1 = filename:join([AppDir, "apps", Name1]),
  138. rebar_test_utils:create_app(AppDir1, Name1, Vsn1, [kernel, stdlib]),
  139. Suite1 = filename:join([AppDir1, "test", Name1 ++ "_SUITE.erl"]),
  140. ok = filelib:ensure_dir(Suite1),
  141. ok = file:write_file(Suite1, test_suite(Name1)),
  142. Name2 = rebar_test_utils:create_random_name(atom_to_list(multi_app) ++ "_"),
  143. Vsn2 = rebar_test_utils:create_random_vsn(),
  144. AppDir2 = filename:join([AppDir, "apps", Name2]),
  145. rebar_test_utils:create_app(AppDir2, Name2, Vsn2, [kernel, stdlib]),
  146. Suite2 = filename:join([AppDir2, "test", Name2 ++ "_SUITE.erl"]),
  147. ok = filelib:ensure_dir(Suite2),
  148. ok = file:write_file(Suite2, test_suite(Name2)),
  149. Suite3 = filename:join([AppDir, "test", "extras_SUITE.erl"]),
  150. ok = filelib:ensure_dir(Suite3),
  151. ok = file:write_file(Suite3, test_suite("extras")),
  152. {ok, State} = rebar_test_utils:run_and_check(C, [], ["as", "test", "lock"], return),
  153. Tests = rebar_prv_common_test:prepare_tests(State),
  154. {ok, NewState} = rebar_prv_common_test:compile(State, Tests),
  155. {ok, T} = Tests,
  156. Opts = rebar_prv_common_test:translate_paths(NewState, T),
  157. [{result, Opts}, {appnames, [Name1, Name2]}, {compile_state, NewState}|C];
  158. init_per_group(dirs_and_suites, Config) ->
  159. C = rebar_test_utils:init_rebar_state(Config, "ct_"),
  160. AppDir = ?config(apps, C),
  161. Name1 = rebar_test_utils:create_random_name(atom_to_list(dirs_and_suites) ++ "_"),
  162. Vsn1 = rebar_test_utils:create_random_vsn(),
  163. AppDir1 = filename:join([AppDir, "apps", Name1]),
  164. rebar_test_utils:create_app(AppDir1, Name1, Vsn1, [kernel, stdlib]),
  165. Suite1 = filename:join([AppDir1, "test", Name1 ++ "_SUITE.erl"]),
  166. ok = filelib:ensure_dir(Suite1),
  167. ok = file:write_file(Suite1, test_suite(Name1)),
  168. Name2 = rebar_test_utils:create_random_name(atom_to_list(dir_and_suites) ++ "_"),
  169. Vsn2 = rebar_test_utils:create_random_vsn(),
  170. AppDir2 = filename:join([AppDir, "apps", Name2]),
  171. rebar_test_utils:create_app(AppDir2, Name2, Vsn2, [kernel, stdlib]),
  172. Suite2 = filename:join([AppDir2, "test", Name2 ++ "_SUITE.erl"]),
  173. ok = filelib:ensure_dir(Suite2),
  174. ok = file:write_file(Suite2, test_suite(Name2)),
  175. Suite3 = filename:join([AppDir, "test", "extras_SUITE.erl"]),
  176. ok = filelib:ensure_dir(Suite3),
  177. ok = file:write_file(Suite3, test_suite("extras")),
  178. Suite4 = filename:join([AppDir, "root_SUITE.erl"]),
  179. ok = file:write_file(Suite4, test_suite("root")),
  180. ok = file:write_file(filename:join([AppDir, "root_SUITE.hrl"]), <<>>),
  181. ok = filelib:ensure_dir(filename:join([AppDir, "root_SUITE_data", "dummy.txt"])),
  182. ok = file:write_file(filename:join([AppDir, "root_SUITE_data", "some_data.txt"]), <<>>),
  183. Suite5 = filename:join([AppDir, "apps", Name2, "app_root_SUITE.erl"]),
  184. ok = file:write_file(Suite5, test_suite("app_root")),
  185. ok = file:write_file(filename:join([AppDir, "apps", Name2, "app_root_SUITE.hrl"]), <<>>),
  186. ok = filelib:ensure_dir(filename:join([AppDir, "apps", Name2, "app_root_SUITE_data", "dummy.txt"])),
  187. ok = file:write_file(filename:join([AppDir, "apps", Name2, "app_root_SUITE_data", "some_data.txt"]), <<>>),
  188. {ok, State} = rebar_test_utils:run_and_check(C, [], ["as", "test", "lock"], return),
  189. [{s, State}, {appnames, [Name1, Name2]}|C];
  190. init_per_group(ct_opts, Config) ->
  191. C = rebar_test_utils:init_rebar_state(Config, "ct_opts"),
  192. AppDir = ?config(apps, C),
  193. Name = rebar_test_utils:create_random_name("ct_opts_"),
  194. Vsn = rebar_test_utils:create_random_vsn(),
  195. rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
  196. {ok, State} = rebar_test_utils:run_and_check(C, [], ["as", "test", "lock"], return),
  197. [{result, State}, {name, Name}|C];
  198. init_per_group(cover, Config) ->
  199. C = rebar_test_utils:init_rebar_state(Config, "ct_opts"),
  200. AppDir = ?config(apps, C),
  201. Name = rebar_test_utils:create_random_name("ct_opts_"),
  202. Vsn = rebar_test_utils:create_random_vsn(),
  203. rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
  204. {ok, State} = rebar_test_utils:run_and_check(C, [], ["as", "test", "lock"], return),
  205. [{result, State}, {name, Name}|C];
  206. init_per_group(_, Config) -> Config.
  207. end_per_group(_Group, _Config) -> ok.
  208. basic_app_default_dirs(Config) ->
  209. AppDir = ?config(apps, Config),
  210. [Name] = ?config(appnames, Config),
  211. Result = ?config(result, Config),
  212. Expect = filename:join([AppDir, "_build", "test", "lib", Name, "test"]),
  213. Dir = proplists:get_value(dir, Result),
  214. [Expect] = Dir.
  215. basic_app_default_beams(Config) ->
  216. AppDir = ?config(apps, Config),
  217. [Name] = ?config(appnames, Config),
  218. File = filename:join([AppDir,
  219. "_build",
  220. "test",
  221. "lib",
  222. Name,
  223. "test",
  224. Name ++ "_SUITE.beam"]),
  225. true = filelib:is_file(File).
  226. basic_app_ct_macro(Config) ->
  227. State = ?config(compile_state, Config),
  228. [App] = rebar_state:project_apps(State),
  229. Opts = rebar_app_info:opts(App),
  230. ErlOpts = dict:fetch(erl_opts, Opts),
  231. true = lists:member({d, 'COMMON_TEST'}, ErlOpts).
  232. multi_app_default_dirs(Config) ->
  233. AppDir = ?config(apps, Config),
  234. [Name1, Name2] = ?config(appnames, Config),
  235. Result = ?config(result, Config),
  236. Expect1 = filename:absname(filename:join([AppDir, "_build", "test", "lib", Name1, "test"])),
  237. Expect2 = filename:absname(filename:join([AppDir, "_build", "test", "lib", Name2, "test"])),
  238. Expect3 = filename:absname(filename:join([AppDir, "_build", "test", "extras", "test"])),
  239. Dirs = proplists:get_value(dir, Result),
  240. true = (lists:sort([Expect1, Expect2, Expect3]) == lists:sort(Dirs)).
  241. multi_app_default_beams(Config) ->
  242. AppDir = ?config(apps, Config),
  243. [Name1, Name2] = ?config(appnames, Config),
  244. File1 = filename:join([AppDir,
  245. "_build",
  246. "test",
  247. "lib",
  248. Name1,
  249. "test",
  250. Name1 ++ "_SUITE.beam"]),
  251. File2 = filename:join([AppDir,
  252. "_build",
  253. "test",
  254. "lib",
  255. Name2,
  256. "test",
  257. Name2 ++ "_SUITE.beam"]),
  258. File3 = filename:join([AppDir,
  259. "_build",
  260. "test",
  261. "extras",
  262. "test",
  263. "extras_SUITE.beam"]),
  264. true = filelib:is_file(File1),
  265. true = filelib:is_file(File2),
  266. true = filelib:is_file(File3).
  267. multi_app_ct_macro(Config) ->
  268. State = ?config(compile_state, Config),
  269. Apps = rebar_state:project_apps(State),
  270. lists:foreach(fun(App) ->
  271. Opts = rebar_app_info:opts(App),
  272. ErlOpts = dict:fetch(erl_opts, Opts),
  273. true = lists:member({d, 'COMMON_TEST'}, ErlOpts)
  274. end, Apps).
  275. single_app_dir(Config) ->
  276. AppDir = ?config(apps, Config),
  277. [Name1, _Name2] = ?config(appnames, Config),
  278. State = ?config(s, Config),
  279. LibDirs = rebar_dir:lib_dirs(State),
  280. State1 = rebar_app_discover:do(State, LibDirs),
  281. Providers = rebar_state:providers(State1),
  282. Namespace = rebar_state:namespace(State1),
  283. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  284. GetOptSpec = providers:opts(CommandProvider),
  285. {ok, GetOptResult} = getopt:parse(GetOptSpec,
  286. ["--dir=" ++ filename:join([AppDir,
  287. "apps",
  288. Name1,
  289. "test"])]),
  290. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  291. Tests = rebar_prv_common_test:prepare_tests(State2),
  292. {ok, NewState} = rebar_prv_common_test:compile(State2, Tests),
  293. {ok, T} = Tests,
  294. Opts = rebar_prv_common_test:translate_paths(NewState, T),
  295. Expect = filename:join([AppDir, "_build", "test", "lib", Name1, "test"]),
  296. Dir = proplists:get_value(dir, Opts),
  297. [Expect] = Dir.
  298. single_extra_dir(Config) ->
  299. AppDir = ?config(apps, Config),
  300. State = ?config(s, Config),
  301. LibDirs = rebar_dir:lib_dirs(State),
  302. State1 = rebar_app_discover:do(State, LibDirs),
  303. Providers = rebar_state:providers(State1),
  304. Namespace = rebar_state:namespace(State1),
  305. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  306. GetOptSpec = providers:opts(CommandProvider),
  307. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--dir=" ++ filename:join([AppDir,
  308. "test"])]),
  309. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  310. Tests = rebar_prv_common_test:prepare_tests(State2),
  311. {ok, NewState} = rebar_prv_common_test:compile(State2, Tests),
  312. {ok, T} = Tests,
  313. Opts = rebar_prv_common_test:translate_paths(NewState, T),
  314. Expect = filename:join([AppDir, "_build", "test", "extras", "test"]),
  315. Dir = proplists:get_value(dir, Opts),
  316. [Expect] = Dir.
  317. single_unmanaged_dir(Config) ->
  318. PrivDir = ?config(priv_dir, Config),
  319. State = ?config(s, Config),
  320. Suite = filename:join([PrivDir, "unmanaged_dir", "unmanaged_dir_SUITE.erl"]),
  321. ok = filelib:ensure_dir(Suite),
  322. ok = file:write_file(Suite, test_suite("unmanaged_dir")),
  323. LibDirs = rebar_dir:lib_dirs(State),
  324. State1 = rebar_app_discover:do(State, LibDirs),
  325. Providers = rebar_state:providers(State1),
  326. Namespace = rebar_state:namespace(State1),
  327. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  328. GetOptSpec = providers:opts(CommandProvider),
  329. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--dir=" ++ filename:absname(filename:join([PrivDir,
  330. "unmanaged_dir"]))]),
  331. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  332. Tests = rebar_prv_common_test:prepare_tests(State2),
  333. {ok, NewState} = rebar_prv_common_test:compile(State2, Tests),
  334. {ok, T} = Tests,
  335. Opts = rebar_prv_common_test:translate_paths(NewState, T),
  336. Expect = filename:join([PrivDir, "unmanaged_dir"]),
  337. Dir = proplists:get_value(dir, Opts),
  338. [Expect] = Dir.
  339. single_suite(Config) ->
  340. AppDir = ?config(apps, Config),
  341. [Name1, _Name2] = ?config(appnames, Config),
  342. State = ?config(s, Config),
  343. LibDirs = rebar_dir:lib_dirs(State),
  344. State1 = rebar_app_discover:do(State, LibDirs),
  345. Providers = rebar_state:providers(State1),
  346. Namespace = rebar_state:namespace(State1),
  347. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  348. GetOptSpec = providers:opts(CommandProvider),
  349. {ok, GetOptResult} = getopt:parse(GetOptSpec,
  350. ["--suite=" ++ filename:join([AppDir,
  351. "apps",
  352. Name1,
  353. "test",
  354. Name1 ++ "_SUITE"])]),
  355. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  356. Tests = rebar_prv_common_test:prepare_tests(State2),
  357. {ok, NewState} = rebar_prv_common_test:compile(State2, Tests),
  358. {ok, T} = Tests,
  359. Opts = rebar_prv_common_test:translate_paths(NewState, T),
  360. Expect = filename:join([AppDir,
  361. "_build",
  362. "test",
  363. "lib",
  364. Name1,
  365. "test",
  366. Name1 ++ "_SUITE"]),
  367. Suite = proplists:get_value(suite, Opts),
  368. [Expect] = Suite.
  369. single_extra_suite(Config) ->
  370. AppDir = ?config(apps, Config),
  371. [_Name1, _Name2] = ?config(appnames, Config),
  372. State = ?config(s, Config),
  373. LibDirs = rebar_dir:lib_dirs(State),
  374. State1 = rebar_app_discover:do(State, LibDirs),
  375. Providers = rebar_state:providers(State1),
  376. Namespace = rebar_state:namespace(State1),
  377. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  378. GetOptSpec = providers:opts(CommandProvider),
  379. {ok, GetOptResult} = getopt:parse(GetOptSpec,
  380. ["--suite=" ++ filename:join([AppDir,
  381. "test",
  382. "extra_SUITE"])]),
  383. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  384. Tests = rebar_prv_common_test:prepare_tests(State2),
  385. {ok, NewState} = rebar_prv_common_test:compile(State2, Tests),
  386. {ok, T} = Tests,
  387. Opts = rebar_prv_common_test:translate_paths(NewState, T),
  388. Expect = filename:join([AppDir,
  389. "_build",
  390. "test",
  391. "extras",
  392. "test",
  393. "extra_SUITE"]),
  394. Suite = proplists:get_value(suite, Opts),
  395. [Expect] = Suite.
  396. single_unmanaged_suite(Config) ->
  397. PrivDir = ?config(priv_dir, Config),
  398. [_Name1, _Name2] = ?config(appnames, Config),
  399. State = ?config(s, Config),
  400. Suite = filename:join([PrivDir, "unmanaged", "unmanaged_SUITE.erl"]),
  401. ok = filelib:ensure_dir(Suite),
  402. ok = file:write_file(Suite, test_suite("unmanaged")),
  403. LibDirs = rebar_dir:lib_dirs(State),
  404. State1 = rebar_app_discover:do(State, LibDirs),
  405. Providers = rebar_state:providers(State1),
  406. Namespace = rebar_state:namespace(State1),
  407. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  408. GetOptSpec = providers:opts(CommandProvider),
  409. {ok, GetOptResult} = getopt:parse(GetOptSpec,
  410. ["--suite=" ++ filename:absname(filename:join([PrivDir,
  411. "unmanaged",
  412. "unmanaged_SUITE"]))]),
  413. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  414. Tests = rebar_prv_common_test:prepare_tests(State2),
  415. {ok, NewState} = rebar_prv_common_test:compile(State2, Tests),
  416. {ok, T} = Tests,
  417. Opts = rebar_prv_common_test:translate_paths(NewState, T),
  418. Expect = filename:join([PrivDir,
  419. "unmanaged",
  420. "unmanaged_SUITE"]),
  421. SuitePath = proplists:get_value(suite, Opts),
  422. [Expect] = SuitePath.
  423. multi_suite(Config) ->
  424. AppDir = ?config(apps, Config),
  425. [Name1, Name2] = ?config(appnames, Config),
  426. State = ?config(s, Config),
  427. LibDirs = rebar_dir:lib_dirs(State),
  428. State1 = rebar_app_discover:do(State, LibDirs),
  429. Providers = rebar_state:providers(State1),
  430. Namespace = rebar_state:namespace(State1),
  431. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  432. GetOptSpec = providers:opts(CommandProvider),
  433. {ok, GetOptResult} = getopt:parse(GetOptSpec,
  434. ["--suite=" ++ filename:join([AppDir,
  435. "apps",
  436. Name1,
  437. "test",
  438. Name1 ++ "_SUITE," ++ AppDir,
  439. "apps",
  440. Name2,
  441. "test",
  442. Name2 ++ "_SUITE"])]),
  443. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  444. Tests = rebar_prv_common_test:prepare_tests(State2),
  445. {ok, NewState} = rebar_prv_common_test:compile(State2, Tests),
  446. {ok, T} = Tests,
  447. Opts = rebar_prv_common_test:translate_paths(NewState, T),
  448. Expect1 = filename:join([AppDir,
  449. "_build",
  450. "test",
  451. "lib",
  452. Name1,
  453. "test",
  454. Name1 ++ "_SUITE"]),
  455. Expect2 = filename:join([AppDir,
  456. "_build",
  457. "test",
  458. "lib",
  459. Name2,
  460. "test",
  461. Name2 ++ "_SUITE"]),
  462. Suites = proplists:get_value(suite, Opts),
  463. true = (lists:sort([Expect1, Expect2]) == lists:sort(Suites)).
  464. all_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. ["--suite=" ++ filename:join([AppDir,
  476. "apps",
  477. Name1,
  478. "test",
  479. Name1 ++ "_SUITE," ++ AppDir,
  480. "apps",
  481. Name2,
  482. "test",
  483. Name2 ++ "_SUITE," ++ AppDir,
  484. "test",
  485. "extra_SUITE"])]),
  486. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  487. Tests = rebar_prv_common_test:prepare_tests(State2),
  488. {ok, NewState} = rebar_prv_common_test:compile(State2, Tests),
  489. {ok, T} = Tests,
  490. Opts = rebar_prv_common_test:translate_paths(NewState, T),
  491. Expect1 = filename:join([AppDir,
  492. "_build",
  493. "test",
  494. "lib",
  495. Name1,
  496. "test",
  497. Name1 ++ "_SUITE"]),
  498. Expect2 = filename:join([AppDir,
  499. "_build",
  500. "test",
  501. "lib",
  502. Name2,
  503. "test",
  504. Name2 ++ "_SUITE"]),
  505. Expect3 = filename:join([AppDir,
  506. "_build",
  507. "test",
  508. "extras",
  509. "test",
  510. "extra_SUITE"]),
  511. Suites = proplists:get_value(suite, Opts),
  512. true = (lists:sort([Expect1, Expect2, Expect3]) == lists:sort(Suites)).
  513. single_dir_and_single_suite(Config) ->
  514. AppDir = ?config(apps, Config),
  515. [_Name1, _Name2] = ?config(appnames, Config),
  516. State = ?config(s, Config),
  517. LibDirs = rebar_dir:lib_dirs(State),
  518. State1 = rebar_app_discover:do(State, LibDirs),
  519. Providers = rebar_state:providers(State1),
  520. Namespace = rebar_state:namespace(State1),
  521. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  522. GetOptSpec = providers:opts(CommandProvider),
  523. {ok, GetOptResult} = getopt:parse(GetOptSpec,
  524. ["--dir=" ++ filename:join([AppDir, "test"]),
  525. "--suite=extra_SUITE"]),
  526. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  527. Tests = rebar_prv_common_test:prepare_tests(State2),
  528. {ok, NewState} = rebar_prv_common_test:compile(State2, Tests),
  529. {ok, T} = Tests,
  530. Opts = rebar_prv_common_test:translate_paths(NewState, T),
  531. Expect = filename:join([AppDir,
  532. "_build",
  533. "test",
  534. "extras",
  535. "test"]),
  536. Dir = proplists:get_value(dir, Opts),
  537. [Expect] = Dir,
  538. Suite = proplists:get_value(suite, Opts),
  539. ["extra_SUITE"] = Suite.
  540. suite_at_root(Config) ->
  541. AppDir = ?config(apps, Config),
  542. State = ?config(s, Config),
  543. LibDirs = rebar_dir:lib_dirs(State),
  544. State1 = rebar_app_discover:do(State, LibDirs),
  545. Providers = rebar_state:providers(State1),
  546. Namespace = rebar_state:namespace(State1),
  547. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  548. GetOptSpec = providers:opts(CommandProvider),
  549. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--suite=" ++ filename:join([AppDir, "root_SUITE"])]),
  550. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  551. Tests = rebar_prv_common_test:prepare_tests(State2),
  552. {ok, NewState} = rebar_prv_common_test:compile(State2, Tests),
  553. {ok, T} = Tests,
  554. Opts = rebar_prv_common_test:translate_paths(NewState, T),
  555. Suite = proplists:get_value(suite, Opts),
  556. Expected = filename:join([AppDir, "_build", "test", "extras", "root_SUITE"]),
  557. [Expected] = Suite,
  558. TestHrl = filename:join([AppDir, "_build", "test", "extras", "root_SUITE.hrl"]),
  559. true = filelib:is_file(TestHrl),
  560. TestBeam = filename:join([AppDir, "_build", "test", "extras", "root_SUITE.beam"]),
  561. true = filelib:is_file(TestBeam),
  562. DataDir = filename:join([AppDir, "_build", "test", "extras", "root_SUITE_data"]),
  563. true = filelib:is_dir(DataDir),
  564. DataFile = filename:join([AppDir, "_build", "test", "extras", "root_SUITE_data", "some_data.txt"]),
  565. true = filelib:is_file(DataFile),
  566. %% Same test again, but using relative path to the suite from the
  567. %% project root
  568. {ok,Cwd} = file:get_cwd(),
  569. ok = file:set_cwd(AppDir),
  570. rebar_file_utils:rm_rf("_build"),
  571. {ok, GetOptResult2} = getopt:parse(GetOptSpec, ["--suite=" ++ "root_SUITE"]),
  572. State3 = rebar_state:command_parsed_args(State1, GetOptResult2),
  573. Tests2 = rebar_prv_common_test:prepare_tests(State3),
  574. {ok, NewState2} = rebar_prv_common_test:compile(State3, Tests2),
  575. {ok, T2} = Tests2,
  576. Opts2 = rebar_prv_common_test:translate_paths(NewState2, T2),
  577. ok = file:set_cwd(Cwd),
  578. Suite2 = proplists:get_value(suite, Opts2),
  579. [Expected] = Suite2,
  580. true = filelib:is_file(TestHrl),
  581. true = filelib:is_file(TestBeam),
  582. true = filelib:is_dir(DataDir),
  583. true = filelib:is_file(DataFile),
  584. ok.
  585. suite_at_app_root(Config) ->
  586. AppDir = ?config(apps, Config),
  587. [_Name1, Name2] = ?config(appnames, Config),
  588. State = ?config(s, Config),
  589. LibDirs = rebar_dir:lib_dirs(State),
  590. State1 = rebar_app_discover:do(State, LibDirs),
  591. Providers = rebar_state:providers(State1),
  592. Namespace = rebar_state:namespace(State1),
  593. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  594. GetOptSpec = providers:opts(CommandProvider),
  595. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--suite=" ++ filename:join([AppDir, "apps", Name2, "app_root_SUITE"])]),
  596. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  597. Tests = rebar_prv_common_test:prepare_tests(State2),
  598. {ok, NewState} = rebar_prv_common_test:compile(State2, Tests),
  599. {ok, T} = Tests,
  600. Opts = rebar_prv_common_test:translate_paths(NewState, T),
  601. Suite = proplists:get_value(suite, Opts),
  602. Expected = filename:join([AppDir, "_build", "test", "lib", Name2, "app_root_SUITE"]),
  603. [Expected] = Suite,
  604. TestHrl = filename:join([AppDir, "_build", "test", "lib", Name2, "app_root_SUITE.hrl"]),
  605. true = filelib:is_file(TestHrl),
  606. TestBeam = filename:join([AppDir, "_build", "test", "lib", Name2, "app_root_SUITE.beam"]),
  607. true = filelib:is_file(TestBeam),
  608. DataDir = filename:join([AppDir, "_build", "test", "lib", Name2, "app_root_SUITE_data"]),
  609. true = filelib:is_dir(DataDir),
  610. DataFile = filename:join([AppDir, "_build", "test", "lib", Name2, "app_root_SUITE_data", "some_data.txt"]),
  611. true = filelib:is_file(DataFile),
  612. %% Same test again using relative path to the suite from the project root
  613. {ok,Cwd} = file:get_cwd(),
  614. ok = file:set_cwd(AppDir),
  615. rebar_file_utils:rm_rf("_build"),
  616. {ok, GetOptResult2} = getopt:parse(GetOptSpec, ["--suite=" ++ filename:join(["apps", Name2, "app_root_SUITE"])]),
  617. State3 = rebar_state:command_parsed_args(State1, GetOptResult2),
  618. Tests2 = rebar_prv_common_test:prepare_tests(State3),
  619. {ok, NewState2} = rebar_prv_common_test:compile(State3, Tests2),
  620. {ok, T2} = Tests2,
  621. Opts2 = rebar_prv_common_test:translate_paths(NewState2, T2),
  622. ok = file:set_cwd(Cwd),
  623. Suite2 = proplists:get_value(suite, Opts2),
  624. [Expected] = Suite2,
  625. true = filelib:is_file(TestHrl),
  626. true = filelib:is_file(TestBeam),
  627. true = filelib:is_dir(DataDir),
  628. true = filelib:is_file(DataFile),
  629. ok.
  630. %% this test probably only fails when this suite is run via rebar3 with the --cover flag
  631. data_dir_correct(Config) ->
  632. DataDir = ?config(data_dir, Config),
  633. Parts = filename:split(DataDir),
  634. ["rebar_ct_SUITE_data","test","rebar","lib",_,"_build"|_] = lists:reverse(Parts).
  635. cmd_label(Config) ->
  636. State = ?config(result, Config),
  637. Providers = rebar_state:providers(State),
  638. Namespace = rebar_state:namespace(State),
  639. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  640. GetOptSpec = providers:opts(CommandProvider),
  641. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--label=this_is_a_label"]),
  642. NewState = rebar_state:command_parsed_args(State, GetOptResult),
  643. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(NewState),
  644. true = lists:member({label, "this_is_a_label"}, TestOpts).
  645. cmd_config(Config) ->
  646. State = ?config(result, Config),
  647. Providers = rebar_state:providers(State),
  648. Namespace = rebar_state:namespace(State),
  649. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  650. GetOptSpec = providers:opts(CommandProvider),
  651. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--config=config/foo,config/bar,config/baz"]),
  652. NewState = rebar_state:command_parsed_args(State, GetOptResult),
  653. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(NewState),
  654. true = lists:member({config, ["config/foo", "config/bar", "config/baz"]}, TestOpts).
  655. cmd_spec(Config) ->
  656. State = ?config(result, Config),
  657. Providers = rebar_state:providers(State),
  658. Namespace = rebar_state:namespace(State),
  659. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  660. GetOptSpec = providers:opts(CommandProvider),
  661. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--spec=foo.spec,bar.spec,baz.spec"]),
  662. NewState = rebar_state:command_parsed_args(State, GetOptResult),
  663. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(NewState),
  664. true = lists:member({spec, ["foo.spec", "bar.spec", "baz.spec"]}, TestOpts).
  665. cmd_join_specs(Config) ->
  666. State = ?config(result, Config),
  667. Providers = rebar_state:providers(State),
  668. Namespace = rebar_state:namespace(State),
  669. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  670. GetOptSpec = providers:opts(CommandProvider),
  671. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--join_specs=true"]),
  672. NewState = rebar_state:command_parsed_args(State, GetOptResult),
  673. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(NewState),
  674. true = lists:member({join_specs, true}, TestOpts).
  675. cmd_allow_user_terms(Config) ->
  676. State = ?config(result, Config),
  677. Providers = rebar_state:providers(State),
  678. Namespace = rebar_state:namespace(State),
  679. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  680. GetOptSpec = providers:opts(CommandProvider),
  681. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--allow_user_terms=true"]),
  682. NewState = rebar_state:command_parsed_args(State, GetOptResult),
  683. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(NewState),
  684. true = lists:member({allow_user_terms, true}, TestOpts).
  685. cmd_logdir(Config) ->
  686. State = ?config(result, Config),
  687. Providers = rebar_state:providers(State),
  688. Namespace = rebar_state:namespace(State),
  689. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  690. GetOptSpec = providers:opts(CommandProvider),
  691. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--logdir=/tmp/ct_logs"]),
  692. NewState = rebar_state:command_parsed_args(State, GetOptResult),
  693. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(NewState),
  694. true = lists:member({logdir, "/tmp/ct_logs"}, TestOpts).
  695. cmd_logopts(Config) ->
  696. State = ?config(result, Config),
  697. Providers = rebar_state:providers(State),
  698. Namespace = rebar_state:namespace(State),
  699. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  700. GetOptSpec = providers:opts(CommandProvider),
  701. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--logopts=no_src,no_nl"]),
  702. NewState = rebar_state:command_parsed_args(State, GetOptResult),
  703. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(NewState),
  704. true = lists:member({logopts, [no_src, no_nl]}, TestOpts).
  705. cmd_verbosity(Config) ->
  706. State = ?config(result, Config),
  707. Providers = rebar_state:providers(State),
  708. Namespace = rebar_state:namespace(State),
  709. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  710. GetOptSpec = providers:opts(CommandProvider),
  711. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--verbosity=43"]),
  712. NewState = rebar_state:command_parsed_args(State, GetOptResult),
  713. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(NewState),
  714. true = lists:member({verbosity, 43}, TestOpts).
  715. cmd_repeat(Config) ->
  716. State = ?config(result, Config),
  717. Providers = rebar_state:providers(State),
  718. Namespace = rebar_state:namespace(State),
  719. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  720. GetOptSpec = providers:opts(CommandProvider),
  721. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--repeat=3"]),
  722. NewState = rebar_state:command_parsed_args(State, GetOptResult),
  723. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(NewState),
  724. true = lists:member({repeat, 3}, TestOpts).
  725. cmd_duration(Config) ->
  726. State = ?config(result, Config),
  727. Providers = rebar_state:providers(State),
  728. Namespace = rebar_state:namespace(State),
  729. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  730. GetOptSpec = providers:opts(CommandProvider),
  731. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--duration=001500"]),
  732. NewState = rebar_state:command_parsed_args(State, GetOptResult),
  733. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(NewState),
  734. true = lists:member({duration, "001500"}, TestOpts).
  735. cmd_until(Config) ->
  736. State = ?config(result, Config),
  737. Providers = rebar_state:providers(State),
  738. Namespace = rebar_state:namespace(State),
  739. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  740. GetOptSpec = providers:opts(CommandProvider),
  741. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--until=001500"]),
  742. NewState = rebar_state:command_parsed_args(State, GetOptResult),
  743. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(NewState),
  744. true = lists:member({until, "001500"}, TestOpts).
  745. cmd_force_stop(Config) ->
  746. State = ?config(result, Config),
  747. Providers = rebar_state:providers(State),
  748. Namespace = rebar_state:namespace(State),
  749. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  750. GetOptSpec = providers:opts(CommandProvider),
  751. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--force_stop=skip_rest"]),
  752. NewState = rebar_state:command_parsed_args(State, GetOptResult),
  753. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(NewState),
  754. true = lists:member({force_stop, skip_rest}, TestOpts).
  755. cmd_basic_html(Config) ->
  756. State = ?config(result, Config),
  757. Providers = rebar_state:providers(State),
  758. Namespace = rebar_state:namespace(State),
  759. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  760. GetOptSpec = providers:opts(CommandProvider),
  761. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--basic_html"]),
  762. NewState = rebar_state:command_parsed_args(State, GetOptResult),
  763. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(NewState),
  764. true = lists:member({basic_html, true}, TestOpts).
  765. cmd_stylesheet(Config) ->
  766. State = ?config(result, Config),
  767. Providers = rebar_state:providers(State),
  768. Namespace = rebar_state:namespace(State),
  769. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  770. GetOptSpec = providers:opts(CommandProvider),
  771. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--stylesheet=resources/tests.css"]),
  772. NewState = rebar_state:command_parsed_args(State, GetOptResult),
  773. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(NewState),
  774. true = lists:member({stylesheet, "resources/tests.css"}, TestOpts).
  775. cmd_decrypt_key(Config) ->
  776. State = ?config(result, Config),
  777. Providers = rebar_state:providers(State),
  778. Namespace = rebar_state:namespace(State),
  779. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  780. GetOptSpec = providers:opts(CommandProvider),
  781. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--decrypt_key==ac467e30"]),
  782. NewState = rebar_state:command_parsed_args(State, GetOptResult),
  783. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(NewState),
  784. true = lists:member({decrypt_key, "=ac467e30"}, TestOpts).
  785. cmd_decrypt_file(Config) ->
  786. State = ?config(result, Config),
  787. Providers = rebar_state:providers(State),
  788. Namespace = rebar_state:namespace(State),
  789. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  790. GetOptSpec = providers:opts(CommandProvider),
  791. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--decrypt_file=../keyfile.pem"]),
  792. NewState = rebar_state:command_parsed_args(State, GetOptResult),
  793. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(NewState),
  794. true = lists:member({decrypt_file, "../keyfile.pem"}, TestOpts).
  795. cmd_abort_if_missing_suites(Config) ->
  796. State = ?config(result, 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, ["--abort_if_missing_suites"]),
  802. NewState = rebar_state:command_parsed_args(State, GetOptResult),
  803. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(NewState),
  804. true = lists:member({abort_if_missing_suites, true}, TestOpts).
  805. cmd_multiply_timetraps(Config) ->
  806. State = ?config(result, Config),
  807. Providers = rebar_state:providers(State),
  808. Namespace = rebar_state:namespace(State),
  809. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  810. GetOptSpec = providers:opts(CommandProvider),
  811. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--multiply_timetraps=3"]),
  812. NewState = rebar_state:command_parsed_args(State, GetOptResult),
  813. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(NewState),
  814. true = lists:member({multiply_timetraps, 3}, TestOpts).
  815. cmd_scale_timetraps(Config) ->
  816. State = ?config(result, Config),
  817. Providers = rebar_state:providers(State),
  818. Namespace = rebar_state:namespace(State),
  819. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  820. GetOptSpec = providers:opts(CommandProvider),
  821. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--scale_timetraps"]),
  822. NewState = rebar_state:command_parsed_args(State, GetOptResult),
  823. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(NewState),
  824. true = lists:member({scale_timetraps, true}, TestOpts).
  825. cmd_create_priv_dir(Config) ->
  826. State = ?config(result, Config),
  827. Providers = rebar_state:providers(State),
  828. Namespace = rebar_state:namespace(State),
  829. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  830. GetOptSpec = providers:opts(CommandProvider),
  831. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--create_priv_dir=manual_per_tc"]),
  832. NewState = rebar_state:command_parsed_args(State, GetOptResult),
  833. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(NewState),
  834. true = lists:member({create_priv_dir, manual_per_tc}, TestOpts).
  835. cmd_include_dir(Config) ->
  836. State = ?config(result, Config),
  837. AppDir = ?config(apps, Config),
  838. Providers = rebar_state:providers(State),
  839. Namespace = rebar_state:namespace(State),
  840. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  841. GetOptSpec = providers:opts(CommandProvider),
  842. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--include=foo/bar/baz,qux"]),
  843. NewState = rebar_state:command_parsed_args(State, GetOptResult),
  844. Tests = rebar_prv_common_test:prepare_tests(NewState),
  845. {ok, _} = rebar_prv_common_test:compile(NewState, Tests),
  846. Name = ?config(name, Config),
  847. Beam = filename:join([AppDir, "_build", "test", "lib", Name, "ebin", Name ++ ".beam"]),
  848. {ok, {_, [{compile_info, Info}]}} = beam_lib:chunks(Beam, [compile_info]),
  849. CompileOpts = proplists:get_value(options, Info),
  850. true = lists:member({i, "foo/bar/baz"}, CompileOpts),
  851. true = lists:member({i, "qux"}, CompileOpts).
  852. cmd_sys_config(Config) ->
  853. State = ?config(result, Config),
  854. AppDir = ?config(apps, Config),
  855. Name = ?config(name, Config),
  856. AppName = list_to_atom(Name),
  857. {ok, _} = rebar_prv_common_test:prepare_tests(State),
  858. ?assertEqual(undefined, application:get_env(AppName, key)),
  859. CfgFile = filename:join([AppDir, "config", "cfg_sys.config"]),
  860. ok = filelib:ensure_dir(CfgFile),
  861. ok = file:write_file(CfgFile, cfg_sys_config_file(AppName)),
  862. RebarConfig = [{ct_opts, [{sys_config, CfgFile}]}],
  863. {ok, State1} = rebar_test_utils:run_and_check(Config, RebarConfig, ["as", "test", "lock"], return),
  864. {ok, _} = rebar_prv_common_test:prepare_tests(State1),
  865. ?assertEqual({ok, cfg_value}, application:get_env(AppName, key)),
  866. Providers = rebar_state:providers(State1),
  867. Namespace = rebar_state:namespace(State1),
  868. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  869. GetOptSpec = providers:opts(CommandProvider),
  870. CmdFile = filename:join([AppDir, "config", "cmd_sys.config"]),
  871. ok = filelib:ensure_dir(CmdFile),
  872. ok = file:write_file(CmdFile, cmd_sys_config_file(AppName)),
  873. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--sys_config="++CmdFile]),
  874. State2 = rebar_state:command_parsed_args(State1, GetOptResult),
  875. {ok, _} = rebar_prv_common_test:prepare_tests(State2),
  876. ?assertEqual({ok ,cmd_value}, application:get_env(AppName, key)).
  877. cfg_opts(Config) ->
  878. C = rebar_test_utils:init_rebar_state(Config, "ct_cfg_opts_"),
  879. AppDir = ?config(apps, C),
  880. Name = rebar_test_utils:create_random_name("ct_cfg_opts_"),
  881. Vsn = rebar_test_utils:create_random_vsn(),
  882. rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
  883. RebarConfig = [{ct_opts, [{label, "this_is_a_label"}, {decrypt_file, "../keyfile.pem"}]}],
  884. {ok, State} = rebar_test_utils:run_and_check(C, RebarConfig, ["as", "test", "lock"], return),
  885. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(State),
  886. true = lists:member({label, "this_is_a_label"}, TestOpts),
  887. true = lists:member({decrypt_file, "../keyfile.pem"}, TestOpts).
  888. %% allow even nonsensical opts to be passed to ct_run for futureproofing
  889. cfg_arbitrary_opts(Config) ->
  890. C = rebar_test_utils:init_rebar_state(Config, "ct_cfg_arbitrary_opts_"),
  891. AppDir = ?config(apps, C),
  892. Name = rebar_test_utils:create_random_name("ct_cfg_arbitrary_opts_"),
  893. Vsn = rebar_test_utils:create_random_vsn(),
  894. rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
  895. RebarConfig = [{ct_opts, [{foo, 1}, {bar, 2}, {baz, 3}]}],
  896. {ok, State} = rebar_test_utils:run_and_check(C, RebarConfig, ["as", "test", "lock"], return),
  897. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(State),
  898. true = lists:member({foo, 1}, TestOpts),
  899. true = lists:member({bar, 2}, TestOpts),
  900. true = lists:member({baz, 3}, TestOpts).
  901. cfg_cover_spec(Config) ->
  902. C = rebar_test_utils:init_rebar_state(Config, "ct_cfg_cover_spec_opts_"),
  903. AppDir = ?config(apps, C),
  904. Name = rebar_test_utils:create_random_name("ct_cfg_cover_spec_opts_"),
  905. Vsn = rebar_test_utils:create_random_vsn(),
  906. rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
  907. RebarConfig = [{ct_opts, [Opt = {cover, "spec/foo.spec"}]}],
  908. {ok, State} = rebar_test_utils:run_and_check(C, RebarConfig, ["as", "test", "lock"], return),
  909. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(State),
  910. false = lists:member(Opt, TestOpts).
  911. cfg_atom_suites(Config) ->
  912. C = rebar_test_utils:init_rebar_state(Config, "ct_cfg_atom_suites_"),
  913. AppDir = ?config(apps, C),
  914. Name = rebar_test_utils:create_random_name("ct_cfg_atom_suites_"),
  915. Vsn = rebar_test_utils:create_random_vsn(),
  916. rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
  917. RebarConfig = [{ct_opts, [{suite, [foo, bar, baz]}]}],
  918. {ok, State} = rebar_test_utils:run_and_check(C, RebarConfig, ["as", "test", "lock"], return),
  919. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(State),
  920. true = lists:member({suite, ["foo", "bar", "baz"]}, TestOpts).
  921. cover_compiled(Config) ->
  922. State = ?config(result, Config),
  923. Providers = rebar_state:providers(State),
  924. Namespace = rebar_state:namespace(State),
  925. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  926. GetOptSpec = providers:opts(CommandProvider),
  927. {ok, GetOptResult} = getopt:parse(GetOptSpec, ["--cover"]),
  928. NewState = rebar_state:command_parsed_args(State, GetOptResult),
  929. Tests = rebar_prv_common_test:prepare_tests(NewState),
  930. {ok, _} = rebar_prv_common_test:compile(NewState, Tests),
  931. Name = ?config(name, Config),
  932. Mod = list_to_atom(Name),
  933. {file, _} = cover:is_compiled(Mod).
  934. misspecified_ct_opts(Config) ->
  935. C = rebar_test_utils:init_rebar_state(Config, "ct_cfg_atom_suites_"),
  936. AppDir = ?config(apps, C),
  937. Name = rebar_test_utils:create_random_name("ct_cfg_atom_suites_"),
  938. Vsn = rebar_test_utils:create_random_vsn(),
  939. rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
  940. RebarConfig = [{ct_opts, {basic_html, false}}],
  941. {ok, State} = rebar_test_utils:run_and_check(C, RebarConfig, ["as", "test", "lock"], return),
  942. {error, {rebar_prv_common_test, Error}} = rebar_prv_common_test:prepare_tests(State),
  943. {badconfig, {"Value `~p' of option `~p' must be a list", {{basic_html, false}, ct_opts}}} = Error.
  944. misspecified_ct_compile_opts(Config) ->
  945. C = rebar_test_utils:init_rebar_state(Config, "ct_cfg_atom_suites_"),
  946. AppDir = ?config(apps, C),
  947. Name = rebar_test_utils:create_random_name("ct_cfg_atom_suites_"),
  948. Vsn = rebar_test_utils:create_random_vsn(),
  949. rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
  950. RebarConfig = [{ct_compile_opts, {d, whatever}}],
  951. {ok, State} = rebar_test_utils:run_and_check(C, RebarConfig, ["as", "test", "lock"], return),
  952. Tests = rebar_prv_common_test:prepare_tests(State),
  953. {error, {rebar_prv_common_test, Error}} = rebar_prv_common_test:compile(State, Tests),
  954. {badconfig, {"Value `~p' of option `~p' must be a list", {{d, whatever}, ct_compile_opts}}} = Error.
  955. misspecified_ct_first_files(Config) ->
  956. C = rebar_test_utils:init_rebar_state(Config, "ct_cfg_atom_suites_"),
  957. AppDir = ?config(apps, C),
  958. Name = rebar_test_utils:create_random_name("ct_cfg_atom_suites_"),
  959. Vsn = rebar_test_utils:create_random_vsn(),
  960. rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
  961. RebarConfig = [{ct_first_files, some_file}],
  962. {ok, State} = rebar_test_utils:run_and_check(C, RebarConfig, ["as", "test", "lock"], return),
  963. Tests = rebar_prv_common_test:prepare_tests(State),
  964. {error, {rebar_prv_common_test, Error}} = rebar_prv_common_test:compile(State, Tests),
  965. {badconfig, {"Value `~p' of option `~p' must be a list", {some_file, ct_first_files}}} = Error.
  966. testspec(Config) ->
  967. C = rebar_test_utils:init_rebar_state(Config, "ct_testspec_"),
  968. AppDir = ?config(apps, C),
  969. Name = rebar_test_utils:create_random_name("ct_testspec_"),
  970. Vsn = rebar_test_utils:create_random_vsn(),
  971. rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
  972. Spec1 = filename:join([AppDir, "test", "some.spec"]),
  973. ok = filelib:ensure_dir(Spec1),
  974. ok = file:write_file(Spec1, "{suites,\".\",all}.\n"),
  975. Spec2 = filename:join([AppDir, "specs", "another.spec"]),
  976. ok = filelib:ensure_dir(Spec2),
  977. Suites2 = filename:join([AppDir,"suites","*"]),
  978. ok = filelib:ensure_dir(Suites2),
  979. ok = file:write_file(Spec2, "{suites,\"../suites/\",all}.\n"),
  980. {ok,Wd} = file:get_cwd(),
  981. ok = file:set_cwd(AppDir),
  982. {ok, State} = rebar_test_utils:run_and_check(C,
  983. [],
  984. ["as", "test", "lock"],
  985. return),
  986. Providers = rebar_state:providers(State),
  987. Namespace = rebar_state:namespace(State),
  988. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  989. GetOptSpec = providers:opts(CommandProvider),
  990. %% Testspec in "test" directory
  991. {ok, GetOptResult1} = getopt:parse(GetOptSpec, ["--spec","test/some.spec"]),
  992. State1 = rebar_state:command_parsed_args(State, GetOptResult1),
  993. Tests1 = rebar_prv_common_test:prepare_tests(State1),
  994. {ok, NewState1} = rebar_prv_common_test:compile(State1, Tests1),
  995. {ok, T1} = Tests1,
  996. Opts1= rebar_prv_common_test:translate_paths(NewState1, T1),
  997. %% check that extra src dir is added
  998. [App1] = rebar_state:project_apps(NewState1),
  999. ["test"] = rebar_dir:extra_src_dirs(rebar_app_info:opts(App1)),
  1000. %% check that path is translated
  1001. ExpectedSpec1 = filename:join([AppDir, "_build", "test", "lib", Name,
  1002. "test", "some.spec"]),
  1003. [ExpectedSpec1] = proplists:get_value(spec, Opts1),
  1004. %% Testspec in directory other than "test"
  1005. {ok, GetOptResult2} = getopt:parse(GetOptSpec,
  1006. ["--spec","specs/another.spec"]),
  1007. State2 = rebar_state:command_parsed_args(State, GetOptResult2),
  1008. Tests2 = {ok, T2} =rebar_prv_common_test:prepare_tests(State2),
  1009. {ok, NewState2} = rebar_prv_common_test:compile(State2, Tests2),
  1010. Opts2= rebar_prv_common_test:translate_paths(NewState2, T2),
  1011. %% check that extra src dirs are added
  1012. [App2] = rebar_state:project_apps(NewState2),
  1013. ["specs","suites","test"] =
  1014. lists:sort(rebar_dir:extra_src_dirs(rebar_app_info:opts(App2))),
  1015. %% check that paths are translated
  1016. ExpectedSpec2 = filename:join([AppDir, "_build", "test", "lib", Name,
  1017. "specs", "another.spec"]),
  1018. [ExpectedSpec2] = proplists:get_value(spec, Opts2),
  1019. ok = file:set_cwd(Wd),
  1020. ok.
  1021. testspec_at_root(Config) ->
  1022. C = rebar_test_utils:init_rebar_state(Config, "ct_testspec_at_root_"),
  1023. AppDir = ?config(apps, C),
  1024. Name = rebar_test_utils:create_random_name("ct_testspec_at_root_"),
  1025. Vsn = rebar_test_utils:create_random_vsn(),
  1026. AppDir1 = filename:join([AppDir, "apps", Name]),
  1027. rebar_test_utils:create_app(AppDir1, Name, Vsn, [kernel, stdlib]),
  1028. Spec1 = filename:join([AppDir, "root.spec"]),
  1029. ok = filelib:ensure_dir(Spec1),
  1030. ok = file:write_file(Spec1, "{suites,\"test\",all}."),
  1031. Spec2 = filename:join([AppDir, "root1.spec"]),
  1032. ok = file:write_file(Spec2, "{suites,\".\",all}."),
  1033. Spec3 = filename:join([AppDir, "root2.spec"]),
  1034. ok = file:write_file(Spec3, "{suites,\"suites\",all}."),
  1035. Suite1 = filename:join(AppDir,"root_SUITE.erl"),
  1036. ok = file:write_file(Suite1, test_suite("root")),
  1037. Suite2 = filename:join([AppDir,"suites","test_SUITE.erl"]),
  1038. ok = filelib:ensure_dir(Suite2),
  1039. ok = file:write_file(Suite2, test_suite("test")),
  1040. {ok, State} = rebar_test_utils:run_and_check(C,
  1041. [],
  1042. ["as", "test", "lock"],
  1043. return),
  1044. Providers = rebar_state:providers(State),
  1045. Namespace = rebar_state:namespace(State),
  1046. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  1047. GetOptSpec = providers:opts(CommandProvider),
  1048. SpecArg1 = string:join([Spec1,Spec2,Spec3],","),
  1049. {ok, GetOptResult1} = getopt:parse(GetOptSpec, ["--spec",SpecArg1]),
  1050. State1 = rebar_state:command_parsed_args(State, GetOptResult1),
  1051. Tests1 = rebar_prv_common_test:prepare_tests(State1),
  1052. {ok, NewState1} = rebar_prv_common_test:compile(State1, Tests1),
  1053. {ok, T1} = Tests1,
  1054. Opts1= rebar_prv_common_test:translate_paths(NewState1, T1),
  1055. %% check that extra src dir is added
  1056. ExtraDir = filename:join([AppDir, "_build", "test", "extras"]),
  1057. [ExtraDir,"suites","test"] =
  1058. rebar_dir:extra_src_dirs(rebar_state:opts(NewState1)),
  1059. %% check that path is translated
  1060. ExpectedSpec1 = filename:join([AppDir, "_build", "test",
  1061. "extras", "root.spec"]),
  1062. ExpectedSpec2 = filename:join([AppDir, "_build", "test",
  1063. "extras", "root1.spec"]),
  1064. ExpectedSpec3 = filename:join([AppDir, "_build", "test",
  1065. "extras", "root2.spec"]),
  1066. [ExpectedSpec1,ExpectedSpec2,ExpectedSpec3] =
  1067. lists:sort(proplists:get_value(spec, Opts1)),
  1068. %% check that test specs are copied
  1069. [ExpectedSpec1,ExpectedSpec2,ExpectedSpec3] =
  1070. lists:sort(filelib:wildcard(filename:join([AppDir, "_build", "test",
  1071. "extras", "*.spec"]))),
  1072. %% Same test again, using relative path
  1073. {ok,Cwd} = file:get_cwd(),
  1074. ok = file:set_cwd(AppDir),
  1075. ok = rebar_file_utils:rm_rf("_build"),
  1076. SpecArg2 = "root.spec,root1.spec,root2.spec",
  1077. {ok, GetOptResult2} = getopt:parse(GetOptSpec, ["--spec",SpecArg2]),
  1078. State2 = rebar_state:command_parsed_args(State, GetOptResult2),
  1079. Tests2 = rebar_prv_common_test:prepare_tests(State2),
  1080. {ok, NewState2} = rebar_prv_common_test:compile(State2, Tests2),
  1081. {ok, T2} = Tests2,
  1082. Opts2= rebar_prv_common_test:translate_paths(NewState2, T2),
  1083. %% check that extra src dir is added
  1084. [ExtraDir,"suites","test"] =
  1085. rebar_dir:extra_src_dirs(rebar_state:opts(NewState2)),
  1086. %% check that path is translated
  1087. [ExpectedSpec1,ExpectedSpec2,ExpectedSpec3] =
  1088. lists:sort(proplists:get_value(spec, Opts2)),
  1089. %% check that test specs are copied
  1090. [ExpectedSpec1,ExpectedSpec2,ExpectedSpec3] =
  1091. lists:sort(filelib:wildcard(filename:join([AppDir, "_build", "test",
  1092. "extras", "root*.spec"]))),
  1093. ok = file:set_cwd(Cwd),
  1094. ok.
  1095. testspec_parse_error(Config) ->
  1096. C = rebar_test_utils:init_rebar_state(Config, "ct_testspec_error"),
  1097. AppDir = ?config(apps, C),
  1098. Name = rebar_test_utils:create_random_name("ct_testspec_error"),
  1099. Vsn = rebar_test_utils:create_random_vsn(),
  1100. rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
  1101. Spec1 = filename:join([AppDir, "test", "nonexisting.spec"]),
  1102. Spec2 = filename:join([AppDir, "test", "some.spec"]),
  1103. ok = filelib:ensure_dir(Spec2),
  1104. ok = file:write_file(Spec2, ".\n"),
  1105. {ok, State} = rebar_test_utils:run_and_check(C,
  1106. [],
  1107. ["as", "test", "lock"],
  1108. return),
  1109. Providers = rebar_state:providers(State),
  1110. Namespace = rebar_state:namespace(State),
  1111. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  1112. GetOptSpec = providers:opts(CommandProvider),
  1113. %% Non existing testspec
  1114. {ok, GetOptResult1} = getopt:parse(GetOptSpec, ["--spec",Spec1]),
  1115. State1 = rebar_state:command_parsed_args(State, GetOptResult1),
  1116. Tests1 = rebar_prv_common_test:prepare_tests(State1),
  1117. {error,
  1118. {rebar_prv_common_test,
  1119. {error_reading_testspec,
  1120. {Spec1,"no such file or directory"}}}} =
  1121. rebar_prv_common_test:compile(State1, Tests1),
  1122. %% Syntax error
  1123. {ok, GetOptResult2} = getopt:parse(GetOptSpec, ["--spec",Spec2]),
  1124. State2 = rebar_state:command_parsed_args(State, GetOptResult2),
  1125. Tests2 = rebar_prv_common_test:prepare_tests(State2),
  1126. {error,
  1127. {rebar_prv_common_test,
  1128. {error_reading_testspec,
  1129. {Spec2,"1: syntax error before: '.'"}}}} =
  1130. rebar_prv_common_test:compile(State2, Tests2),
  1131. ok.
  1132. cmd_vs_cfg_opts(Config) ->
  1133. C = rebar_test_utils:init_rebar_state(Config, "ct_cmd_vs_cfg_opts_"),
  1134. AppDir = ?config(apps, C),
  1135. Name = rebar_test_utils:create_random_name("ct_cmd_vs_cfg_opts_"),
  1136. Vsn = rebar_test_utils:create_random_vsn(),
  1137. rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]),
  1138. RebarConfig = [{ct_opts, [{spec,"mytest.spec"},
  1139. {dir,"test"},
  1140. {suite,"some_SUITE"},
  1141. {group,"some_group"},
  1142. {testcase,"some_test"}]}],
  1143. {ok, State} = rebar_test_utils:run_and_check(C, RebarConfig, ["as", "test", "lock"], return),
  1144. {ok, TestOpts} = rebar_prv_common_test:prepare_tests(State),
  1145. true = lists:member({spec, "mytest.spec"}, TestOpts),
  1146. true = lists:member({dir, "test"}, TestOpts),
  1147. true = lists:member({suite, "some_SUITE"}, TestOpts),
  1148. true = lists:member({group, "some_group"}, TestOpts),
  1149. true = lists:member({testcase, "some_test"}, TestOpts),
  1150. Providers = rebar_state:providers(State),
  1151. Namespace = rebar_state:namespace(State),
  1152. CommandProvider = providers:get_provider(ct, Providers, Namespace),
  1153. GetOptSpec = providers:opts(CommandProvider),
  1154. {ok, GetOptResult1} = getopt:parse(GetOptSpec, ["--spec","test/some.spec"]),
  1155. State1 = rebar_state:command_parsed_args(State, GetOptResult1),
  1156. {ok, TestOpts1} = rebar_prv_common_test:prepare_tests(State1),
  1157. true = lists:member({spec, ["test/some.spec"]}, TestOpts1),
  1158. false = lists:keymember(dir, 1, TestOpts1),
  1159. false = lists:keymember(suite, 1, TestOpts1),
  1160. false = lists:keymember(group, 1, TestOpts1),
  1161. false = lists:keymember(testcase, 1, TestOpts1),
  1162. {ok, GetOptResult2} = getopt:parse(GetOptSpec, ["--suite","test/some_SUITE"]),
  1163. State2 = rebar_state:command_parsed_args(State, GetOptResult2),
  1164. {ok, TestOpts2} = rebar_prv_common_test:prepare_tests(State2),
  1165. true = lists:member({suite, ["test/some_SUITE"]}, TestOpts2),
  1166. false = lists:keymember(spec, 1, TestOpts2),
  1167. false = lists:keymember(dir, 1, TestOpts2),
  1168. false = lists:keymember(group, 1, TestOpts2),
  1169. false = lists:keymember(testcase, 1, TestOpts2),
  1170. ok.
  1171. %% helper for generating test data
  1172. test_suite(Name) ->
  1173. io_lib:format("-module(~ts_SUITE).\n"
  1174. "-compile(export_all).\n"
  1175. "all() -> [some_test].\n"
  1176. "some_test(_) -> ok.\n", [Name]).
  1177. cmd_sys_config_file(AppName) ->
  1178. io_lib:format("[{~s, [{key, cmd_value}]}].", [AppName]).
  1179. cfg_sys_config_file(AppName) ->
  1180. io_lib:format("[{~s, [{key, cfg_value}]}].", [AppName]).