From c534deafc55e980dafa2bcfa5f85e9fdd86dba49 Mon Sep 17 00:00:00 2001 From: alisdair sullivan Date: Sat, 16 May 2015 17:30:06 -0700 Subject: generalize the "test" special dir into an {extra_src_dirs, [...]} option like `src_dirs`, `extra_src_dirs` are directories to be copied to the `_build` dir and compiled. unlike `src_dirs` they are not added to the .app specification --- test/rebar_extra_src_dirs_SUITE.erl | 152 ++++++++++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 test/rebar_extra_src_dirs_SUITE.erl (limited to 'test') diff --git a/test/rebar_extra_src_dirs_SUITE.erl b/test/rebar_extra_src_dirs_SUITE.erl new file mode 100644 index 0000000..a00bb2d --- /dev/null +++ b/test/rebar_extra_src_dirs_SUITE.erl @@ -0,0 +1,152 @@ +-module(rebar_extra_src_dirs_SUITE). + +-export([suite/0, + init_per_suite/1, + end_per_suite/1, + init_per_testcase/2, + end_per_testcase/2, + all/0, + build_basic_app/1, + build_multi_apps/1, + src_dir_takes_precedence/1]). + +-include_lib("common_test/include/ct.hrl"). + +suite() -> + []. + +init_per_suite(Config) -> + Config. + +end_per_suite(_Config) -> + ok. + +init_per_testcase(_, Config) -> + rebar_test_utils:init_rebar_state(Config). + +end_per_testcase(_, _Config) -> ok. + +all() -> + [build_basic_app, build_multi_apps, src_dir_takes_precedence]. + +build_basic_app(Config) -> + AppDir = ?config(apps, Config), + + Name = rebar_test_utils:create_random_name("app1_"), + Vsn = rebar_test_utils:create_random_vsn(), + rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]), + + Extra = filename:join([AppDir, "extra", "extra.erl"]), + ok = filelib:ensure_dir(Extra), + Src = io_lib:format("-module(extra).~n-export([x/0]).~nx() -> ok.", []), + ok = ec_file:write(Extra, Src), + + RebarConfig = [{erl_opts, [{extra_src_dirs, ["extra"]}]}], + + rebar_test_utils:run_and_check(Config, RebarConfig, ["compile"], {ok, [{app, Name}]}), + + %% check that `extra.erl` was compiled to the `ebin` dir + Ebin = filename:join([AppDir, "_build", "default", "lib", Name, "ebin"]), + true = filelib:is_file(filename:join([Ebin, "extra.beam"])), + + %% check that `extra.erl` is not in the `modules` key of the app + {ok, App} = file:consult(filename:join([AppDir, + "_build", + "default", + "lib", + Name, + "ebin", + Name ++ ".app"])), + [{application, _, KVs}] = App, + Mods = proplists:get_value(modules, KVs), + false = lists:member(extra, Mods). + +build_multi_apps(Config) -> + AppDir = ?config(apps, Config), + + Name1 = rebar_test_utils:create_random_name("app1_"), + Vsn1 = rebar_test_utils:create_random_vsn(), + rebar_test_utils:create_app(filename:join([AppDir,Name1]), Name1, Vsn1, [kernel, stdlib]), + Name2 = rebar_test_utils:create_random_name("app2_"), + Vsn2 = rebar_test_utils:create_random_vsn(), + rebar_test_utils:create_app(filename:join([AppDir,Name2]), Name2, Vsn2, [kernel, stdlib]), + + Extra1 = filename:join([AppDir, Name1, "extra", "extra1.erl"]), + ok = filelib:ensure_dir(Extra1), + Src1 = io_lib:format("-module(extra1).~n-export([x/0]).~nx() -> ok.", []), + ok = ec_file:write(Extra1, Src1), + + Extra2 = filename:join([AppDir, Name2, "extra", "extra2.erl"]), + ok = filelib:ensure_dir(Extra2), + Src2 = io_lib:format("-module(extra2).~n-export([x/0]).~nx() -> ok.", []), + ok = ec_file:write(Extra2, Src2), + + RebarConfig = [{erl_opts, [{extra_src_dirs, ["extra"]}]}], + + rebar_test_utils:run_and_check( + Config, RebarConfig, ["compile"], + {ok, [{app, Name1}, {app, Name2}]} + ), + + %% check that `extraX.erl` was compiled to the `ebin` dir + Ebin1 = filename:join([AppDir, "_build", "default", "lib", Name1, "ebin"]), + true = filelib:is_file(filename:join([Ebin1, "extra1.beam"])), + + Ebin2 = filename:join([AppDir, "_build", "default", "lib", Name2, "ebin"]), + true = filelib:is_file(filename:join([Ebin2, "extra2.beam"])), + + %% check that `extraX.erl` is not in the `modules` key of the app + {ok, App1} = file:consult(filename:join([AppDir, + "_build", + "default", + "lib", + Name1, + "ebin", + Name1 ++ ".app"])), + [{application, _, KVs1}] = App1, + Mods1 = proplists:get_value(modules, KVs1), + false = lists:member(extra1, Mods1), + + {ok, App2} = file:consult(filename:join([AppDir, + "_build", + "default", + "lib", + Name2, + "ebin", + Name2 ++ ".app"])), + [{application, _, KVs2}] = App2, + Mods2 = proplists:get_value(modules, KVs2), + false = lists:member(extra2, Mods2). + +src_dir_takes_precedence(Config) -> + AppDir = ?config(apps, Config), + + Name = rebar_test_utils:create_random_name("app1_"), + Vsn = rebar_test_utils:create_random_vsn(), + rebar_test_utils:create_app(AppDir, Name, Vsn, [kernel, stdlib]), + + Extra = filename:join([AppDir, "extra", "extra.erl"]), + ok = filelib:ensure_dir(Extra), + Src = io_lib:format("-module(extra).~n-export([x/0]).~nx() -> ok.", []), + ok = ec_file:write(Extra, Src), + + RebarConfig = [{erl_opts, [{src_dirs, ["src", "extra"]}, {extra_src_dirs, ["extra"]}]}], + + rebar_test_utils:run_and_check(Config, RebarConfig, ["compile"], {ok, [{app, Name}]}), + + %% check that `extra.erl` was compiled to the `ebin` dir + %% check that `extraX.erl` was compiled to the `ebin` dir + Ebin = filename:join([AppDir, "_build", "default", "lib", Name, "ebin"]), + true = filelib:is_file(filename:join([Ebin, "extra.beam"])), + + %% check that `extra.erl` is in the `modules` key of the app + {ok, App} = file:consult(filename:join([AppDir, + "_build", + "default", + "lib", + Name, + "ebin", + Name ++ ".app"])), + [{application, _, KVs}] = App, + Mods = proplists:get_value(modules, KVs), + true = lists:member(extra, Mods). \ No newline at end of file -- cgit v1.1