Você não pode selecionar mais de 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.

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