Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions docker-compose-test.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@ version: "3"

services:
test:
image: hexpm/elixir:1.14.4-erlang-25.3.2-alpine-3.16.5
command: sh -c "cd app/ && apk add git && mix local.hex --force && mix local.rebar --force && mix deps.get && mix coveralls.json --warnings-as-errors"
image: membraneframeworklabs/docker_membrane:v2.2.0
command: sh -c "cd app/ && mix deps.get && mix coveralls.json --warnings-as-errors"
volumes:
- .:/app
- /app/deps
- /app/_build
ports:
- "4000:4000"
depends_on:
Expand Down
55 changes: 55 additions & 0 deletions lib/mix/tasks/test_with_docker.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
defmodule Mix.Tasks.TestWithDocker do
@moduledoc """
Test the SDK with Jellyfish running in Docker
"""

use Mix.Task

@impl Mix.Task
def run(args) do
if System.find_executable("docker") do
IO.puts("Running tests using Docker. To run tests without Docker call \"mix test.local\"")

docker_compose_prefix = ["docker", "compose", "-f", "docker-compose-test.yaml"]

stream_command(docker_compose_prefix ++ ["pull"])

stream_command(
docker_compose_prefix ++ ["up", "--remove-orphans", "test", "--exit-code-from", "test"]
)

stream_command(docker_compose_prefix ++ ["down"])
else
IO.puts("Running tests inside docker container ...")

Mix.Task.run("test", args)
end
end

defp stream_command(cmd) do
port =
Port.open({:spawn, Enum.join(cmd, " ")}, [
{:line, 1024},
:use_stdio,
:stderr_to_stdout,
:exit_status
])

receive_and_print(port)
end

defp receive_and_print(port) do
receive do
{^port, {:data, {:eol, line}}} ->
IO.puts(line)
receive_and_print(port)

{^port, {:data, data}} ->
IO.puts(data)
receive_and_print(port)

{^port, {:exit_status, exit_status}} ->
IO.puts("Docker command exited with status code: #{exit_status}")
end
end
end
63 changes: 5 additions & 58 deletions mix.exs
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ defmodule Membrane.Template.Mixfile do
"coveralls.post": :test,
"coveralls.html": :test,
"coveralls.json": :test,
"test.local": :test
"test.docker": :test
]
]
end
Expand Down Expand Up @@ -74,7 +74,8 @@ defmodule Membrane.Template.Mixfile do

defp dialyzer() do
opts = [
flags: [:error_handling]
flags: [:error_handling],
plt_add_apps: [:mix]
]

if System.get_env("CI") == "true" do
Expand Down Expand Up @@ -115,62 +116,8 @@ defmodule Membrane.Template.Mixfile do

def aliases do
[
test: &test_in_docker/1,
"test.local": ["cmd MIX_ENV=test_local mix test --without_docker"]
"test.local": ["cmd MIX_ENV=test_local mix test"],
"test.docker": "test_with_docker"
]
end

defp test_in_docker(opts) do
cond do
List.last(opts) == "--without_docker" ->
IO.puts("Running tests locally (it requires setting up jellyfish without docker) ...")

Mix.Task.run("test", ["--exclude", "file_component_sources"])

System.find_executable("docker") ->
IO.puts("Running tests using Docker. To run tests without Docker call \"mix test.local\"")

docker_compose_prefix = ["docker", "compose", "-f", "docker-compose-test.yaml"]

stream_command(docker_compose_prefix ++ ["pull"])

stream_command(
docker_compose_prefix ++ ["up", "--remove-orphans", "test", "--exit-code-from", "test"]
)

stream_command(docker_compose_prefix ++ ["down"])

true ->
IO.puts("Running tests inside docker container ...")

Mix.Task.run("test")
end
end

defp stream_command(cmd) do
port =
Port.open({:spawn, Enum.join(cmd, " ")}, [
{:line, 1024},
:use_stdio,
:stderr_to_stdout,
:exit_status
])

receive_and_print(port)
end

defp receive_and_print(port) do
receive do
{^port, {:data, {:eol, line}}} ->
IO.puts(line)
receive_and_print(port)

{^port, {:data, data}} ->
IO.puts(data)
receive_and_print(port)

{^port, {:exit_status, exit_status}} ->
IO.puts("Docker command exited with status code: #{exit_status}")
end
end
end