forked from openshift/aws-efs-utils
-
Notifications
You must be signed in to change notification settings - Fork 0
/
test_choose_tls_port.py
161 lines (116 loc) · 5.14 KB
/
test_choose_tls_port.py
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
# Copyright 2017-2018 Amazon.com, Inc. and its affiliates. All Rights Reserved.
#
# Licensed under the MIT License. See the LICENSE accompanying this file
# for the specific language governing permissions and limitations under
# the License.
import socket
import random
from unittest.mock import MagicMock
import pytest
import mount_efs
from .. import utils
try:
import ConfigParser
except ImportError:
from configparser import ConfigParser
DEFAULT_TLS_PORT_RANGE_LOW = 20049
DEFAULT_TLS_PORT_RANGE_HIGH = 20449
FS_ID = "fs-deadbeef"
MOUNT_POINT = "/mnt"
STATE_FILE_DIR = "/tmp"
def _get_config():
try:
config = ConfigParser.SafeConfigParser()
except AttributeError:
config = ConfigParser()
config.add_section(mount_efs.CONFIG_SECTION)
config.set(
mount_efs.CONFIG_SECTION,
"port_range_lower_bound",
str(DEFAULT_TLS_PORT_RANGE_LOW),
)
config.set(
mount_efs.CONFIG_SECTION,
"port_range_upper_bound",
str(DEFAULT_TLS_PORT_RANGE_HIGH),
)
return config
def test_choose_tls_port_first_try(mocker):
fake_sock = MagicMock()
tls_port = random.randrange(DEFAULT_TLS_PORT_RANGE_LOW, DEFAULT_TLS_PORT_RANGE_HIGH)
fake_sock.getsockname.return_value = ("localhost", tls_port)
mocker.patch("socket.socket", return_value=fake_sock)
options = {}
sock, tls_port = mount_efs.choose_tls_port_and_bind_sock(STATE_FILE_DIR, FS_ID, MOUNT_POINT, _get_config(), options)
assert DEFAULT_TLS_PORT_RANGE_LOW <= tls_port <= DEFAULT_TLS_PORT_RANGE_HIGH
def test_choose_tls_port_second_try(mocker):
bad_sock = MagicMock()
bad_sock.bind.side_effect = [socket.error, None]
tls_port = random.randrange(DEFAULT_TLS_PORT_RANGE_LOW, DEFAULT_TLS_PORT_RANGE_HIGH)
bad_sock.getsockname.return_value = ("localhost", tls_port)
options = {}
mocker.patch("socket.socket", return_value=bad_sock)
sock, tls_port = mount_efs.choose_tls_port_and_bind_sock(STATE_FILE_DIR, FS_ID, MOUNT_POINT, _get_config(), options)
assert DEFAULT_TLS_PORT_RANGE_LOW <= tls_port <= DEFAULT_TLS_PORT_RANGE_HIGH
assert 2 == bad_sock.bind.call_count
def test_choose_tls_port_never_succeeds(mocker, capsys):
bad_sock = MagicMock()
bad_sock.bind.side_effect = socket.error()
options = {}
mocker.patch("socket.socket", return_value=bad_sock)
with pytest.raises(SystemExit) as ex:
mount_efs.choose_tls_port_and_bind_sock(STATE_FILE_DIR, FS_ID, MOUNT_POINT, _get_config(), options)
assert 0 != ex.value.code
out, err = capsys.readouterr()
assert "Failed to locate an available port" in err
assert (
DEFAULT_TLS_PORT_RANGE_HIGH - DEFAULT_TLS_PORT_RANGE_LOW
== bad_sock.bind.call_count
)
def test_choose_tls_port_option_specified(mocker):
fake_sock = MagicMock()
fake_sock.getsockname.return_value = ("localhost", 1000)
mocker.patch("socket.socket", return_value=fake_sock)
options = {"tlsport": 1000}
sock, tls_port = mount_efs.choose_tls_port_and_bind_sock(STATE_FILE_DIR, FS_ID, MOUNT_POINT, _get_config(), options)
assert 1000 == tls_port
def test_choose_tls_port_option_specified_unavailable(mocker, capsys):
bad_sock = MagicMock()
bad_sock.bind.side_effect = socket.error()
options = {"tlsport": 1000}
mocker.patch("socket.socket", return_value=bad_sock)
with pytest.raises(SystemExit) as ex:
mount_efs.choose_tls_port_and_bind_sock(STATE_FILE_DIR, FS_ID, MOUNT_POINT, _get_config(), options)
assert 0 != ex.value.code
out, err = capsys.readouterr()
assert "Specified port [1000] is unavailable" in err
assert 1 == bad_sock.bind.call_count
def test_choose_tls_port_under_netns(mocker, capsys):
mocker.patch("builtins.open")
setns_mock = mocker.patch("mount_efs.setns", return_value=(None, None))
mocker.patch("socket.socket", return_value=MagicMock())
options = {"netns": "/proc/1000/ns/net"}
mount_efs.choose_tls_port_and_bind_sock(STATE_FILE_DIR, FS_ID, MOUNT_POINT, _get_config(), options)
utils.assert_called(setns_mock)
def test_verify_tls_port(mocker):
sock = MagicMock()
sock.connect.side_effect = [ConnectionRefusedError, None]
mocker.patch("socket.socket", return_value=sock)
result = mount_efs.verify_tlsport_can_be_connected(1000)
assert result is False
result = mount_efs.verify_tlsport_can_be_connected(1000)
assert result is True
assert 2 == sock.connect.call_count
def test_choose_tls_port_already_configured(mocker, capsys):
fake_sock = MagicMock()
tls_port = random.randrange(DEFAULT_TLS_PORT_RANGE_LOW, DEFAULT_TLS_PORT_RANGE_HIGH)
fake_sock.getsockname.return_value = ("localhost", tls_port)
mocker.patch("socket.socket", return_value=fake_sock)
access_mock = mocker.patch("os.access", return_value=True)
options = {}
with pytest.raises(SystemExit) as ex:
mount_efs.choose_tls_port_and_bind_sock(STATE_FILE_DIR, FS_ID, MOUNT_POINT, _get_config(), options)
assert 0 != ex.value.code
out, err = capsys.readouterr()
assert "Failed to locate an available port" in err
utils.assert_called_n_times(access_mock, DEFAULT_TLS_PORT_RANGE_HIGH - DEFAULT_TLS_PORT_RANGE_LOW)