You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

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