Skip to content

Commit e49e783

Browse files
committed
added executable script to run EPP Gate server from command line
1 parent e2d11d4 commit e49e783

File tree

4 files changed

+57
-14
lines changed

4 files changed

+57
-14
lines changed

bin/epp-gate

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#!/usr/bin/env python
2+
# -*- coding: utf-8 -*-
3+
import re
4+
import sys
5+
from epp.rpc_server import main
6+
if __name__ == '__main__':
7+
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
8+
sys.exit(int(not main()))

requirements.txt

+1
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,4 @@ pyparsing==2.4.7
1010
pytest==6.2.3
1111
soupsieve==2.2.1
1212
toml==0.10.2
13+
pika==1.2.0

setup.py

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
author_email='[email protected]',
88
packages=find_packages(where='src'),
99
package_dir={'': 'src'},
10+
scripts=['bin/epp-gate', ],
1011
description='Python-based Extensible Provisioning Protocol (EPP) client',
1112
long_description=(
1213
"The library provides an interface to the Extensible Provisioning "

tests/epp/test_client.py

+47-14
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,13 @@
3535
<trID><svTRID>1618435120843</svTRID></trID></response></epp>'''
3636

3737

38+
sample_unknown_command_response = b'''<?xml version="1.0" encoding="UTF-8"?>
39+
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
40+
xsi:schemaLocation="urn:ietf:params:xml:ns:epp-1.0 epp-1.0.xsd"><response><result code="2000">
41+
<msg>Unknown command</msg></result>
42+
<trID><svTRID>1618663648910</svTRID></trID></response></epp>'''
43+
44+
3845
def conn():
3946
logging.getLogger('epp.client').setLevel(logging.DEBUG)
4047
return client.EPPConnection(
@@ -47,6 +54,10 @@ def conn():
4754
)
4855

4956

57+
def fake_response(xml_response):
58+
return client.int_to_net(len(xml_response) + 4, client.get_format_32()) + xml_response
59+
60+
5061
class TestEPPConnection(object):
5162

5263
def test_init(self):
@@ -94,8 +105,8 @@ def test_greeting_failed(self, mock_wrap_socket, mock_socket_connect):
94105
def test_login_failed(self, mock_wrap_socket, mock_socket_connect):
95106
mock_socket_connect.return_value = True
96107
fake_stream = io.BytesIO(
97-
client.int_to_net(len(sample_greeting) + 4, client.get_format_32()) + sample_greeting +
98-
client.int_to_net(18 + 4, client.get_format_32()) + b'bad login response')
108+
fake_response(sample_greeting) +
109+
fake_response(b'bad login response'))
99110
setattr(fake_stream, 'send', lambda _: True)
100111
mock_wrap_socket.return_value = fake_stream
101112
with pytest.raises(AttributeError):
@@ -106,8 +117,8 @@ def test_login_failed(self, mock_wrap_socket, mock_socket_connect):
106117
def test_open_success(self, mock_wrap_socket, mock_socket_connect):
107118
mock_socket_connect.return_value = True
108119
fake_stream = io.BytesIO(
109-
client.int_to_net(len(sample_greeting) + 4, client.get_format_32()) + sample_greeting +
110-
client.int_to_net(len(sample_login_response) + 4, client.get_format_32()) + sample_login_response)
120+
fake_response(sample_greeting) +
121+
fake_response(sample_login_response))
111122
setattr(fake_stream, 'send', lambda _: True)
112123
mock_wrap_socket.return_value = fake_stream
113124
assert conn().open() is True
@@ -117,9 +128,9 @@ def test_open_success(self, mock_wrap_socket, mock_socket_connect):
117128
def test_close_failed(self, mock_wrap_socket, mock_socket_connect):
118129
mock_socket_connect.return_value = True
119130
fake_stream = io.BytesIO(
120-
client.int_to_net(len(sample_greeting) + 4, client.get_format_32()) + sample_greeting +
121-
client.int_to_net(len(sample_login_response) + 4, client.get_format_32()) + sample_login_response +
122-
client.int_to_net(19 + 4, client.get_format_32()) + b'bad logout response')
131+
fake_response(sample_greeting) +
132+
fake_response(sample_login_response) +
133+
fake_response(b'bad logout response'))
123134
setattr(fake_stream, 'send', lambda _: True)
124135
mock_wrap_socket.return_value = fake_stream
125136
c = conn()
@@ -132,9 +143,9 @@ def test_close_failed(self, mock_wrap_socket, mock_socket_connect):
132143
def test_close_success(self, mock_wrap_socket, mock_socket_connect):
133144
mock_socket_connect.return_value = True
134145
fake_stream = io.BytesIO(
135-
client.int_to_net(len(sample_greeting) + 4, client.get_format_32()) + sample_greeting +
136-
client.int_to_net(len(sample_login_response) + 4, client.get_format_32()) + sample_login_response +
137-
client.int_to_net(len(sample_logout_response) + 4, client.get_format_32()) + sample_logout_response)
146+
fake_response(sample_greeting) +
147+
fake_response(sample_login_response) +
148+
fake_response(sample_logout_response))
138149
setattr(fake_stream, 'send', lambda _: True)
139150
mock_wrap_socket.return_value = fake_stream
140151
c = conn()
@@ -146,12 +157,34 @@ def test_close_success(self, mock_wrap_socket, mock_socket_connect):
146157
def test_call(self, mock_wrap_socket, mock_socket_connect):
147158
mock_socket_connect.return_value = True
148159
fake_stream = io.BytesIO(
149-
client.int_to_net(len(sample_greeting) + 4, client.get_format_32()) + sample_greeting +
150-
client.int_to_net(len(sample_login_response) + 4, client.get_format_32()) + sample_login_response +
151-
client.int_to_net(len(sample_logout_response) + 4, client.get_format_32()) + sample_logout_response)
160+
fake_response(sample_greeting) +
161+
fake_response(sample_login_response) +
162+
fake_response(sample_unknown_command_response) +
163+
fake_response(sample_logout_response))
152164
setattr(fake_stream, 'send', lambda _: True)
153165
mock_wrap_socket.return_value = fake_stream
154166
c = conn()
155167
assert c.open() is True
156-
c.call(cmd='<?xml version="1.0" encoding="UTF-8"?><test></test>')
168+
assert c.call(cmd='<?xml version="1.0" encoding="UTF-8"?><test></test>') == sample_unknown_command_response
169+
assert c.close() is True
157170

171+
@mock.patch('socket.socket.connect')
172+
@mock.patch('ssl.wrap_socket')
173+
def test_call_with_soup(self, mock_wrap_socket, mock_socket_connect):
174+
mock_socket_connect.return_value = True
175+
fake_stream = io.BytesIO(
176+
fake_response(sample_greeting) +
177+
fake_response(sample_login_response) +
178+
fake_response(sample_unknown_command_response) +
179+
fake_response(sample_logout_response))
180+
setattr(fake_stream, 'send', lambda _: True)
181+
mock_wrap_socket.return_value = fake_stream
182+
c = conn()
183+
assert c.open() is True
184+
resp = c.call(
185+
cmd='<?xml version="1.0" encoding="UTF-8"?><test></test>',
186+
soup=True,
187+
)
188+
assert resp.find('result').get('code') == '2000'
189+
assert resp.find('msg').text == 'Unknown command'
190+
assert c.close() is True

0 commit comments

Comments
 (0)