summaryrefslogtreecommitdiff
path: root/test/rebar_compile_SUITE.erl
blob: 2acc64a846095fe2011d4c6e40471e74ee98201e (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
-module(rebar_compile_SUITE).

-export([suite/0,
         init_per_suite/1,
         end_per_suite/1,
         init_per_testcase/2,
         all/0,
         build_basic_app/1]).

-include_lib("common_test/include/ct.hrl").
-include_lib("eunit/include/eunit.hrl").
-include_lib("kernel/include/file.hrl").
-include_lib("kernel/include/file.hrl").

suite() ->
    [].

init_per_suite(Config) ->
    Config.

end_per_suite(_Config) ->
    ok.

init_per_testcase(_, Config) ->
    DataDir = proplists:get_value(data_dir, Config),
    AppsDir = filename:join([DataDir, create_random_name("apps_dir1_")]),
    ok = ec_file:mkdir_p(AppsDir),
    Verbosity = rebar3:log_level(),
    rebar_log:init(command_line, Verbosity),
    State = rebar_state:new(),
    [{apps, AppsDir}, {state, State} | Config].

all() ->
    [build_basic_app].

build_basic_app(Config) ->
    AppDir = proplists:get_value(apps, Config),

    Name = create_random_name("app1_"),
    Vsn = create_random_vsn(),
    create_app(AppDir, Name, Vsn, [kernel, stdlib]),

    run_and_check(Config, [], "compile", [{app, Name}]).

%%%===================================================================
%%% Helper Functions
%%%===================================================================

run_and_check(Config, RebarConfig, Command, Expect) ->
    AppDir = proplists:get_value(apps, Config),
    State = proplists:get_value(state, Config),

    rebar3:run(rebar_state:new(State, RebarConfig, AppDir), Command),

    lists:foreach(fun({app, Name}) ->
                          [App] = rebar_app_discover:find_apps([AppDir]),
                          ?assertEqual(Name, ec_cnv:to_list(rebar_app_info:name(App)))
                  end, Expect).

create_app(AppDir, Name, Vsn, Deps) ->
    write_src_file(AppDir, Name),
    write_app_src_file(AppDir, Name, Vsn, Deps),
    rebar_app_info:new(Name, Vsn, AppDir, Deps).

create_empty_app(AppDir, Name, Vsn, Deps) ->
    write_app_file(AppDir, Name, Vsn, Deps),
    rebar_app_info:new(Name, Vsn, AppDir, Deps).

write_beam_file(Dir, Name) ->
    Beam = filename:join([Dir, "ebin", "not_a_real_beam" ++ Name ++ ".beam"]),
    ok = filelib:ensure_dir(Beam),
    ok = ec_file:write_term(Beam, testing_purposes_only).

write_src_file(Dir, Name) ->
    Erl = filename:join([Dir, "src", "not_a_real_src" ++ Name ++ ".erl"]),
    ok = filelib:ensure_dir(Erl),
    ok = ec_file:write(Erl, erl_src_file("not_a_real_src" ++ Name ++ ".erl")).

write_app_file(Dir, Name, Version, Deps) ->
    Filename = filename:join([Dir, "ebin", Name ++ ".app"]),
    ok = filelib:ensure_dir(Filename),
    ok = ec_file:write_term(Filename, get_app_metadata(ec_cnv:to_list(Name), Version, Deps)).

write_app_src_file(Dir, Name, Version, Deps) ->
    Filename = filename:join([Dir, "src", Name ++ ".app.src"]),
    ok = filelib:ensure_dir(Filename),
    ok = ec_file:write_term(Filename, get_app_metadata(ec_cnv:to_list(Name), Version, Deps)).

get_app_metadata(Name, Vsn, Deps) ->
    {application, erlang:list_to_atom(Name),
     [{description, ""},
      {vsn, Vsn},
      {modules, []},
      {included_applications, []},
      {registered, []},
      {applications, Deps}]}.

create_random_name(Name) ->
    random:seed(erlang:now()),
    Name ++ erlang:integer_to_list(random:uniform(1000000)).

create_random_vsn() ->
    random:seed(erlang:now()),
    lists:flatten([erlang:integer_to_list(random:uniform(100)),
                   ".", erlang:integer_to_list(random:uniform(100)),
                   ".", erlang:integer_to_list(random:uniform(100))]).

write_config(Filename, Values) ->
    ok = filelib:ensure_dir(Filename),
    ok = ec_file:write(Filename,
                       [io_lib:format("~p.\n", [Val]) || Val <- Values]).

erl_src_file(Name) ->
    io_lib:format("-module(~s).\n"
                 "-export([main/0]).\n"
                 "main() -> ok.\n", [filename:basename(Name, ".erl")]).