Skip to content

Commit 8c64b33

Browse files
committed
refactor
1 parent 85d0e55 commit 8c64b33

File tree

5 files changed

+35
-74
lines changed

5 files changed

+35
-74
lines changed

lib/redex_server.ex

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ defmodule Redex.Server do
99
1010
## Examples
1111
12-
iex> Redex.Server.start_link()
12+
iex> Redex.Server.start_link([])
1313
{:ok, #PID<0.102.0>}
1414
1515
"""
@@ -34,21 +34,22 @@ defmodule Redex.Server do
3434

3535
defp loop_acceptor(socket) do
3636
{:ok, client} = :gen_tcp.accept(socket)
37-
serve(client)
37+
Logger.debug "new client"
38+
handle_client(client)
3839
loop_acceptor(socket)
3940
end
4041

41-
defp serve(socket) do
42-
socket
43-
|> read_line()
44-
|> write_line(socket)
45-
46-
serve(socket)
42+
defp handle_client(socket) do
43+
case socket |> read_line() do
44+
{:ok, line} ->
45+
write_line(line, socket)
46+
handle_client(socket)
47+
{:error, error} -> Logger.debug "connection closed: #{error}"
48+
end
4749
end
4850

4951
defp read_line(socket) do
50-
{:ok, data} = :gen_tcp.recv(socket, 0)
51-
data
52+
:gen_tcp.recv(socket, 0)
5253
end
5354

5455
defp write_line(line, socket) do

lib/test_utils.ex

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,21 @@
11
defmodule Redex.TestUtils do
2-
def wait_for_server(retries \\ 5) do
3-
case :gen_tcp.connect('localhost', 6379, []) do
2+
3+
def wait_for_server(host, port, retries \\ 5) when is_binary(host) do
4+
wait(to_charlist(host), port, retries)
5+
end
6+
7+
defp wait(host, port, retries) do
8+
case :gen_tcp.connect(host, port, []) do
49
{:ok, socket} ->
510
:gen_tcp.close(socket)
611
{:error, reason} ->
712
cond do
813
retries > 0 ->
914
:timer.sleep(100)
10-
wait_for_server(retries - 1)
15+
wait(host, port, retries - 1)
1116
:true ->
12-
Mix.raise "Cannot connect to Redis" <>
13-
" (http://localhost:6379):" <>
17+
Mix.raise "Cannot connect to server" <>
18+
" (#{host}:#{port}):" <>
1419
" #{:inet.format_error(reason)}"
1520
end
1621
end

mix.exs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ defmodule Redex.MixProject do
2121
# Run "mix help deps" to learn about dependencies.
2222
defp deps do
2323
[
24+
{:redix, ">= 0.0.0"}
2425
# {:dep_from_hexpm, "~> 0.3.0"},
2526
# {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"},
2627
]

mix.lock

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
%{
2+
"redix": {:hex, :redix, "0.9.0", "c631c921354587e054bf1e2a6b7d0120d617352fc42b624b9ca79ea484d0326c", [:mix], [], "hexpm"},
3+
}

test/redex_test.exs

Lines changed: 10 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,75 +1,26 @@
11
defmodule RedexServerTest do
22
use ExUnit.Case
3+
4+
@test_port 6455
35
# doctest Redex.Server
46

57
setup do
68
IO.puts "starting server"
7-
{:ok, server} = Redex.Server.start_link([])
9+
{:ok, server} = Redex.Server.start_link([port: @test_port])
810
%{pid: server}
911
end
1012

1113
setup context do
12-
Redex.TestUtils.wait_for_server()
13-
context
14+
Redex.TestUtils.wait_for_server("localhost", @test_port)
15+
:ok
1416
end
1517

16-
test "it starts", %{pid: pid} do
17-
assert Process.alive?(pid)
18+
setup context do
19+
{:ok, conn} = Redix.start_link(host: "localhost", port: @test_port)
20+
%{conn: conn}
1821
end
1922

20-
test "it responds to ping", %{pid: pid} do
21-
23+
test "it starts", %{pid: pid} do
24+
assert Process.alive?(pid)
2225
end
2326
end
24-
25-
26-
# defmodule AssertionTest do
27-
# use ExUnit.Case, async: true
28-
29-
# # "setup_all" is called once per module before any test runs
30-
# setup_all do
31-
# IO.puts "Starting AssertionTest"
32-
33-
# # Context is not updated here
34-
# :ok
35-
# end
36-
37-
# # "setup" is called before each test
38-
# setup do
39-
# IO.puts "This is a setup callback for #{inspect self()}"
40-
41-
# on_exit fn ->
42-
# IO.puts "This is invoked once the test is done. Process: #{inspect self()}"
43-
# end
44-
45-
# # Returns extra metadata to be merged into context
46-
# [hello: "world"]
47-
48-
# # Similarly, any of the following would work:
49-
# # {:ok, [hello: "world"]}
50-
# # %{hello: "world"}
51-
# # {:ok, %{hello: "world"}}
52-
# end
53-
54-
# # Same as above, but receives the context as argument
55-
# setup context do
56-
# IO.puts "Setting up: #{context.test}"
57-
# :ok
58-
# end
59-
60-
# # Setups can also invoke a local or imported function that returns a context
61-
# setup :invoke_local_or_imported_function
62-
63-
# test "always pass" do
64-
# assert true
65-
# end
66-
67-
# test "uses metadata from setup", context do
68-
# assert context[:hello] == "world"
69-
# assert context[:from_named_setup] == true
70-
# end
71-
72-
# defp invoke_local_or_imported_function(context) do
73-
# [from_named_setup: true]
74-
# end
75-
# end

0 commit comments

Comments
 (0)