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.

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