Skip to content

Commit 070f6a0

Browse files
author
Jason S
committed
Improve Error on bad_return from Application.Behaviour.Start
1 parent 0802014 commit 070f6a0

File tree

2 files changed

+59
-2
lines changed

2 files changed

+59
-2
lines changed

lib/mix/lib/mix/tasks/app.start.ex

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,16 @@ defmodule Mix.Tasks.App.Start do
2727
end
2828

2929
unless opts[:no_start] do
30-
start_app(project)
30+
start(project)
3131
end
3232
end
3333

34-
defp start_app(project) do
34+
def start(project) do
3535
if app = project[:app] do
3636
case Application.Behaviour.start(app) do
3737
:ok -> :ok
38+
{ :error, {:bad_return, err}} ->
39+
raise Exception.normalize(err)
3840
{ :error, reason } ->
3941
raise Mix.Error, message: "Could not start application #{app}: #{inspect reason}"
4042
end

lib/mix/test/mix/tasks/app.start_test.exs

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,24 @@ defmodule Mix.Tasks.App.StartTest do
99
end
1010
end
1111

12+
defmodule BadReturnSample do
13+
def project do
14+
[app: :bad_return_app, version: "0.1.0"]
15+
end
16+
# Configuration for the OTP application
17+
def application do
18+
[mod: { Mix.Tasks.App.StartTest.BadReturnApp, [] }]
19+
end
20+
end
21+
22+
defmodule BadReturnApp do
23+
use Application.Behaviour
24+
25+
def start(_type, _args) do
26+
:bar # Bad return
27+
end
28+
end
29+
1230
defmodule WrongElixirProject do
1331
def project do
1432
[app: :error, version: "0.1.0", elixir: "~> 0.8.1"]
@@ -76,4 +94,41 @@ defmodule Mix.Tasks.App.StartTest do
7694
after
7795
purge [A, B, C]
7896
end
97+
98+
test "start does nothing if project[:app] is nil" do
99+
project = Mix.project
100+
assert Mix.Tasks.App.Start.start(project) == nil
101+
end
102+
103+
test "start runs successfully in okay case" do
104+
Mix.Project.push MixTest.Case.Sample
105+
in_fixture "no_mixfile", fn ->
106+
Mix.Tasks.Compile.run []
107+
project = Mix.project
108+
assert Mix.Tasks.App.Start.start(project) == :ok
109+
end
110+
end
111+
112+
test "start raises an exception on :error" do
113+
Mix.Project.push AppStartSample
114+
115+
in_fixture "no_mixfile", fn ->
116+
project = Mix.project
117+
assert_raise Mix.Error, fn ->
118+
Mix.Tasks.App.Start.start(project)
119+
end
120+
end
121+
end
122+
123+
test "start raises a stacktrace on bad_return" do
124+
Mix.Project.push BadReturnSample
125+
126+
in_fixture "no_mixfile", fn ->
127+
Mix.Tasks.Compile.run []
128+
project = Mix.project
129+
assert_raise ErlangError, fn ->
130+
Mix.Tasks.App.Start.start(project)
131+
end
132+
end
133+
end
79134
end

0 commit comments

Comments
 (0)