-
Notifications
You must be signed in to change notification settings - Fork 113
/
integration_test.exs
164 lines (141 loc) · 4.08 KB
/
integration_test.exs
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
defmodule Finch.HTTP1.IntegrationTest do
use ExUnit.Case, async: false
import ExUnit.CaptureLog
require Logger
alias Finch.HTTPS1Server
alias Finch.TestHelper
setup_all do
{:ok, listen_socket} = :ssl.listen(0, mode: :binary)
{:ok, {_address, port}} = :ssl.sockname(listen_socket)
:ssl.close(listen_socket)
{:ok, _} = HTTPS1Server.start(port)
{:ok, url: "https://localhost:#{port}"}
end
@tag :capture_log
test "fail to negotiate h2 protocol", %{url: url} do
start_supervised!(
{Finch,
name: H2Finch,
pools: %{
default: [
protocols: [:http2],
conn_opts: [
transport_opts: [
verify: :verify_none
]
]
]
}}
)
assert capture_log(fn ->
{:error, _} = Finch.build(:get, url) |> Finch.request(H2Finch)
end) =~ "No application protocol"
end
@tag :capture_log
@tag skip: TestHelper.ssl_version() < [10, 2]
test "writes TLS secrets to SSLKEYLOGFILE file", %{url: url} do
tmp_dir = System.tmp_dir()
log_file = Path.join(tmp_dir, "ssl-key-file.log")
:ok = System.put_env("SSLKEYLOGFILE", log_file)
start_finch([:"tlsv1.2", :"tlsv1.3"])
try do
assert {:ok, _} = Finch.build(:get, url) |> Finch.request(H1Finch)
assert File.stat!(log_file).size > 0
after
File.rm!(log_file)
System.delete_env("SSLKEYLOGFILE")
end
end
@tag :capture_log
@tag skip: TestHelper.ssl_version() < [10, 2]
test "writes TLS secrets to SSLKEYLOGFILE file using TLS 1.3" do
tmp_dir = System.tmp_dir()
log_file = Path.join(tmp_dir, "ssl-key-file.log")
:ok = System.put_env("SSLKEYLOGFILE", log_file)
start_finch([:"tlsv1.3"])
try do
{:ok, _} = Finch.build(:get, "https://rabbitmq.com") |> Finch.request(H1Finch)
assert File.stat!(log_file).size > 0
after
File.rm!(log_file)
System.delete_env("SSLKEYLOGFILE")
end
end
@tag :capture_log
@tag skip: TestHelper.ssl_version() < [10, 2]
test "cancel streaming response", %{url: url} do
start_finch([:"tlsv1.2", :"tlsv1.3"])
assert catch_throw(
Finch.stream(Finch.build(:get, url), H1Finch, :ok, fn {:status, _}, :ok ->
throw(:error)
end)
) == :error
end
test "trailers" do
handler = fn transport, socket ->
data = """
HTTP/1.1 200 OK
transfer-encoding: chunked
trailer: x-foo, x-bar
6\r
chunk1\r
6\r
chunk2\r
0\r
x-foo: foo\r
x-bar: bar\r
\r
"""
:ok = transport.send(socket, data)
end
{:ok, socket} = Finch.MockSocketServer.start(socket: {nil, []}, handler: handler)
{:ok, port} = :inet.port(socket)
url = "http://localhost:#{port}"
start_supervised!(
{Finch,
name: H1Finch,
pools: %{
default: [
protocols: [:http1]
]
}}
)
{:ok, resp} = Finch.build(:get, url) |> Finch.request(H1Finch)
assert resp.status == 200
assert resp.headers == [{"transfer-encoding", "chunked"}, {"trailer", "x-foo, x-bar"}]
assert resp.body == "chunk1chunk2"
assert resp.trailers == [{"x-foo", "foo"}, {"x-bar", "bar"}]
end
defp start_finch(tls_versions) do
start_supervised!(
{Finch,
name: H1Finch,
pools: %{
default: [
protocols: [:http1],
conn_opts: [
transport_opts: [
reuse_sessions: false,
verify: :verify_none,
keep_secrets: true,
versions: tls_versions,
ciphers: get_ciphers_for_tls_versions(tls_versions)
]
]
]
}}
)
end
def get_ciphers_for_tls_versions(tls_versions) do
if TestHelper.ssl_version() >= [8, 2, 4] do
# Note: :ssl.filter_cipher_suites/2 is available
tls_versions
|> List.foldl([], fn v, acc ->
[:ssl.filter_cipher_suites(:ssl.cipher_suites(:all, v), []) | acc]
end)
|> List.flatten()
else
:ssl.cipher_suites(:all, :"tlsv1.2")
end
end
end