Skip to content

Commit

Permalink
Add tests for feature - "Allowing factory supports for python app con…
Browse files Browse the repository at this point in the history
…fig"

Add the following tests cases:
1. When "factory" key is used inside the "targets" option.
2. When "factory" key is used at the root level of python application config.
3. When factory returns invalid callable or When factory is invalid callable

Closes: nginx#1106
Link: <nginx#1336>
Signed-off-by: Andrew Clayton <[email protected]>
  • Loading branch information
gourav-kandoria committed Jun 26, 2024
1 parent 7921697 commit be3d582
Show file tree
Hide file tree
Showing 2 changed files with 165 additions and 0 deletions.
19 changes: 19 additions & 0 deletions test/python/factory/wsgi.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
def wsgi_a(env, start_response):
start_response('200', [('Content-Length', '1')])
return [b'1']


def wsgi_b(env, start_response):
start_response('200', [('Content-Length', '1')])
return [b'2']

def wsgi_a_factory():
return wsgi_a

def wsgi_b_factory():
return wsgi_b

wsgi_invalid_callable = None

def wsgi_factory_returning_invalid_callable():
return wsgi_invalid_callable
146 changes: 146 additions & 0 deletions test/test_python_factory.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,146 @@
from unit.applications.lang.python import ApplicationPython
from unit.option import option

prerequisites = {'modules': {'python': 'all'}}

client = ApplicationPython()

def test_python_factory_targets():
python_dir = f'{option.test_dir}/python'

assert 'success' in client.conf(
{
"listeners": {
"*:8080": {
"pass": "applications/targets/1"
},
"*:8081": {
"pass": "applications/targets/2"
},
"*:8082": {
"pass": "applications/targets/factory-1"
},
"*:8083": {
"pass": "applications/targets/factory-2"
},
},
"applications": {
"targets": {
"type": client.get_application_type(),
"working_directory": f'{python_dir}/factory/',
"path": f'{python_dir}/factory/',
"targets": {
"1": {
"module": "wsgi",
"callable": "wsgi_a",
"factory": False
},
"2": {
"module": "wsgi",
"callable": "wsgi_b",
"factory": False
},
"factory-1": {
"module": "wsgi",
"callable": "wsgi_a_factory",
"factory": True
},
"factory-2": {
"module": "wsgi",
"callable": "wsgi_b_factory",
"factory": True
},
},
}
},
}
)

resp = client.get(port=8080)
assert resp['status'] == 200
assert resp['body'] == '1'

resp = client.get(port=8081)
assert resp['status'] == 200
assert resp['body'] == '2'

resp = client.get(port=8082)
assert resp['status'] == 200
assert resp['body'] == '1'

resp = client.get(port=8083)
assert resp['status'] == 200
assert resp['body'] == '2'

def test_python_factory_without_targets():
python_dir = f'{option.test_dir}/python'

assert 'success' in client.conf(
{
"listeners": {
"*:8080": {
"pass": "applications/python-app-factory"
},
"*:8081": {
"pass": "applications/python-app"
}
},
"applications": {
"python-app-factory": {
"type": client.get_application_type(),
"working_directory": f'{python_dir}/factory/',
"path": f'{python_dir}/factory/',
"module": "wsgi",
"callable": "wsgi_a_factory",
"factory": True
},
"python-app": {
"type": client.get_application_type(),
"working_directory": f'{python_dir}/factory/',
"path": f'{python_dir}/factory/',
"module": "wsgi",
"callable": "wsgi_b",
"factory": False
}
},
}
)

resp = client.get(port=8080)
assert resp['status'] == 200
assert resp['body'] == '1'

resp = client.get(port=8081)
assert resp['status'] == 200
assert resp['body'] == '2'

def test_python_factory_invalid_callable_value(skip_alert):
skip_alert(r"[\s\S]*") # This regex will match to any string
python_dir = f'{option.test_dir}/python'

invalid_callable_values = ["wsgi_factory_returning_invalid_callable", "wsgi_invalid_callable"]

for callable_value in invalid_callable_values:
assert 'error' in client.conf(
{
"listeners": {
"*:8080": {
"pass": "applications/targets/1"
}
},
"applications": {
"targets": {
"type": client.get_application_type(),
"working_directory": f'{python_dir}/factory/',
"path": f'{python_dir}/factory/',
"targets": {
"1": {
"module": "wsgi",
"callable": callable_value,
"factory": True
},
},
}
},
}
)

0 comments on commit be3d582

Please sign in to comment.