From 3218ffcc9d300a92c840a2025624cba51a0e3c20 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Erik=20Hedenstro=CC=88m?= <erik@hedenstroem.com>
Date: Mon, 26 Sep 2016 17:12:59 +0200
Subject: [PATCH] Improved cleanup

---
 src/dockerl.erl       |  6 ++++++
 test/dockerl_test.erl | 46 +++++++++++++++++++++++++++++++------------
 2 files changed, 39 insertions(+), 13 deletions(-)

diff --git a/src/dockerl.erl b/src/dockerl.erl
index 09b9520..47f7d14 100644
--- a/src/dockerl.erl
+++ b/src/dockerl.erl
@@ -9,6 +9,7 @@
 
     list_images/1, list_images/2,
     pull_image/2, pull_image/3,
+    pull_image_async/2, pull_image_async/3,
     inspect_image/2,
     image_history/2,
     remove_image/2, remove_image/3,
@@ -73,6 +74,11 @@ pull_image(ServerRef, Name) ->
 pull_image(ServerRef, Name, Tag) ->
     gen_server:call(ServerRef, {post, <<"/images/create?fromImage=", Name/binary, "&tag=", Tag/binary>>}, 600000).
 
+pull_image_async(ServerRef, Name) ->
+    gen_server:call(ServerRef, {stream, post, <<"/images/create?fromImage=", Name/binary>>}, 600000).
+pull_image_async(ServerRef, Name, Tag) ->
+    gen_server:call(ServerRef, {stream, post, <<"/images/create?fromImage=", Name/binary, "&tag=", Tag/binary>>}, 600000).
+
 inspect_image(ServerRef, Name) ->
     gen_server:call(ServerRef, {get, <<"/images/", Name/binary, "/json">>}).
 
diff --git a/test/dockerl_test.erl b/test/dockerl_test.erl
index 620f766..d4cb64a 100644
--- a/test/dockerl_test.erl
+++ b/test/dockerl_test.erl
@@ -22,20 +22,24 @@ start() ->
     lager:set_loglevel(lager_console_backend, debug),
     hackney:start(),
     {ok, Pid} = dockerl:start_link(socket, <<"/var/run/docker.sock">>),
-    Pid.
+    {Pid, random_name(16)}.
 
-stop(Pid) ->
+stop({Pid, _}) ->
     MRef = erlang:monitor(process, Pid),
     gen_server:cast(Pid, stop),
     receive {'DOWN', MRef, _, _, _} -> ok end.
 
-instantiator(Pid) ->
+instantiator({Pid, Name}) ->
     [
         info(Pid),
         version(Pid),
         {timeout, 60, pull_image(Pid)},
-        {timeout, 60, start_container(Pid)},
-        {timeout, 60, remove_image(Pid)}
+        create_container(Pid, Name),
+        start_container(Pid, Name),
+        {timeout, 20, query_container(Pid, Name)},
+        stop_container(Pid, Name),
+        remove_container(Pid, Name),
+        remove_image(Pid)
     ].
 
 %%%====================================================================
@@ -50,21 +54,29 @@ version(Pid) ->
 pull_image(Pid) ->
     ?_assertMatch({ok, _}, dockerl:pull_image(Pid, <<"nginx:alpine">>)).
 
-remove_image(Pid) ->
-    ?_assertMatch({ok, _}, dockerl:remove_image(Pid, <<"nginx:alpine">>)).
+create_container(Pid, Name) ->
+    ?_assertMatch({ok, _}, dockerl:create_container(Pid, <<"nginx:alpine">>, Name, #{'PublishAllPorts' => true, 'Tty' => true})).
+
+start_container(Pid, Name) ->
+    ?_assertMatch(ok, dockerl:start_container(Pid, Name)).
 
-start_container(Pid) ->
+query_container(Pid, Id) ->
     fun() ->
-        {ok, Id} = dockerl:create_container(Pid, <<"nginx:alpine">>, #{'PublishAllPorts' => true, 'Tty' => true}),
-        ?assertMatch(ok, dockerl:start_container(Pid, Id)),
         {ok, #{<<"80/tcp">> := [{_Address, Port}]}} = dockerl_utils:get_ports(Pid, Id),
         spawn(fun() -> send_request(Port) end),
         {ok, Stream} = dockerl:container_logs(Pid, Id),
-        ?assertEqual(ok, match_logs(Stream, <<"eunit">>, 1)),
-        ?assertMatch(ok, dockerl:stop_container(Pid, Id)),
-        ?assertMatch(ok, dockerl:remove_container(Pid, Id))
+        ?assertEqual(ok, match_logs(Stream, <<"eunit">>, 1))
     end.
 
+stop_container(Pid, Name) ->
+    ?_assertMatch(ok, dockerl:stop_container(Pid, Name)).
+
+remove_container(Pid, Name) ->
+    ?_assertMatch(ok, dockerl:remove_container(Pid, Name)).
+
+remove_image(Pid) ->
+    ?_assertMatch({ok, _}, dockerl:remove_image(Pid, <<"nginx:alpine">>)).
+
 %%%===================================================================
 %%% Internal functions
 %%%===================================================================
@@ -95,3 +107,11 @@ match_logs(Stream, Pattern, Count) ->
             Stream ! stop,
             {error, timeout}
     end.
+
+random_name(Length) ->
+    random_name(Length, "abcdefghijklmnopqrstuvwyz").
+random_name(Length, AllowedChars) ->
+    list_to_binary(lists:foldl(
+        fun(_, Acc) ->
+            [lists:nth(rand:uniform(length(AllowedChars)), AllowedChars) | Acc]
+        end, [], lists:seq(1, Length))).
-- 
GitLab