summaryrefslogtreecommitdiff
path: root/test/rebar_extra_src_dirs_SUITE.erl
blob: a00bb2dc538e1dc9de25bd4d0d7adbe9fac31d08 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
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).