Skip to content

Commit accd0e8

Browse files
committed
fix handle event tests
1 parent c742a0a commit accd0e8

File tree

2 files changed

+55
-54
lines changed

2 files changed

+55
-54
lines changed

azure_functions_worker_v2/azure_functions_worker_v2/handle_event.py

Lines changed: 25 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@
5252
from .utils.validators import validate_script_file_name
5353

5454
_metadata_result: Optional[List] = None
55-
_metadata_exception: Optional[Exception] = None
5655
_functions: MutableMapping[str, FunctionInfo] = Registry()
5756
_function_data_cache_enabled: bool = False
5857
_host: str = ""
@@ -62,7 +61,7 @@
6261
async def worker_init_request(request):
6362
logger.debug("V2 Library Worker: received WorkerInitRequest,"
6463
"Version %s", VERSION)
65-
global _host, protos, _function_data_cache_enabled, _metadata_exception
64+
global _host, protos, _function_data_cache_enabled
6665
init_request = request.request.worker_init_request
6766
host_capabilities = init_request.capabilities
6867
_host = request.properties.get("host")
@@ -295,7 +294,7 @@ async def function_environment_reload_request(request):
295294
"""
296295
logger.debug("V2 Library Worker: received WorkerEnvReloadRequest,"
297296
"Version %s", VERSION)
298-
global _host, protos, _metadata_exception
297+
global _host, protos
299298
try:
300299

301300
func_env_reload_request = \
@@ -376,31 +375,30 @@ def load_function_metadata(function_app_directory, caller_info):
376375
global protos, _metadata_result
377376
"""
378377
This method is called to index the functions in the function app
379-
directory and save the results in function_metadata_result or
380-
function_metadata_exception in case of an exception.
378+
directory and save the results in function_metadata_result.
379+
380+
If an exception occurs during the indexing, it will be caught
381+
in the worker_init_request and returned as a failure
382+
status result.
381383
"""
382-
try:
383-
script_file_name = get_app_setting(
384-
setting=PYTHON_SCRIPT_FILE_NAME,
385-
default_value=PYTHON_SCRIPT_FILE_NAME_DEFAULT)
386-
387-
logger.debug(
388-
'Received load_function_metadata request from %s, '
389-
'script_file_name: %s',
390-
caller_info, script_file_name)
391-
392-
validate_script_file_name(script_file_name)
393-
function_path = os.path.join(function_app_directory,
394-
script_file_name)
395-
396-
# For V1, the function path will not exist and
397-
# return None.
398-
global _metadata_result
399-
_metadata_result = (index_functions(function_path, function_app_directory)) \
400-
if os.path.exists(function_path) else None
401-
except Exception as ex:
402-
global _metadata_exception
403-
_metadata_exception = ex
384+
script_file_name = get_app_setting(
385+
setting=PYTHON_SCRIPT_FILE_NAME,
386+
default_value=PYTHON_SCRIPT_FILE_NAME_DEFAULT)
387+
388+
logger.debug(
389+
'Received load_function_metadata request from %s, '
390+
'script_file_name: %s',
391+
caller_info, script_file_name)
392+
393+
validate_script_file_name(script_file_name)
394+
function_path = os.path.join(function_app_directory,
395+
script_file_name)
396+
397+
# For V1, the function path will not exist and
398+
# return None.
399+
global _metadata_result
400+
_metadata_result = (index_functions(function_path, function_app_directory)) \
401+
if os.path.exists(function_path) else None
404402

405403

406404
def index_functions(function_path: str, function_dir: str):

azure_functions_worker_v2/tests/unittests/test_handle_event.py

Lines changed: 30 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,16 @@
2020

2121

2222
class TestHandleEvent(testutils.AsyncTestCase):
23-
async def test_worker_init_request(self):
23+
@patch("azure_functions_worker_v2.handle_event.index_function_app")
24+
async def test_worker_init_request(self, mock_index_function_app):
2425
worker_request = WorkerRequest(name='worker_init_request',
2526
request=Request(FunctionRequest(
2627
'hello',
2728
BASIC_FUNCTION_DIRECTORY)),
2829
properties={'host': '123',
2930
'protos': test_protos})
3031
result = await worker_init_request(worker_request)
32+
mock_index_function_app.assert_called_once()
3133
self.assertEqual(result.capabilities, {'WorkerStatus': 'true',
3234
'RpcHttpBodyOnly': 'true',
3335
'SharedMemoryDataTransfer': 'true',
@@ -44,16 +46,19 @@ async def test_worker_init_request(self):
4446
return_value=True)
4547
@patch("azure_functions_worker_v2.handle_event.initialize_http_server",
4648
return_value="http://mock_address")
49+
@patch("azure_functions_worker_v2.handle_event.index_function_app")
4750
async def test_worker_init_request_with_streaming(self,
4851
mock_http_v2_enabled,
49-
mock_initialize_http_server):
52+
mock_initialize_http_server,
53+
mock_index_function_app):
5054
worker_request = WorkerRequest(name='worker_init_request',
5155
request=Request(FunctionRequest(
5256
'hello',
5357
STREAMING_FUNCTION_DIRECTORY)),
5458
properties={'host': '123',
5559
'protos': test_protos})
5660
result = await worker_init_request(worker_request)
61+
mock_index_function_app.assert_called_once()
5762
self.assertEqual(result.capabilities, {'WorkerStatus': 'true',
5863
'RpcHttpBodyOnly': 'true',
5964
'SharedMemoryDataTransfer': 'true',
@@ -71,14 +76,18 @@ async def test_worker_init_request_with_streaming(self,
7176
@patch("azure_functions_worker_v2.handle_event"
7277
".otel_manager.get_azure_monitor_available",
7378
return_value=True)
74-
async def test_worker_init_request_with_otel(self, mock_otel_enabled):
79+
@patch("azure_functions_worker_v2.handle_event.index_function_app")
80+
async def test_worker_init_request_with_otel(self,
81+
mock_otel_enabled,
82+
mock_index_function_app):
7583
worker_request = WorkerRequest(name='worker_init_request',
7684
request=Request(FunctionRequest(
7785
'hello',
7886
BASIC_FUNCTION_DIRECTORY)),
7987
properties={'host': '123',
8088
'protos': test_protos})
8189
result = await worker_init_request(worker_request)
90+
mock_index_function_app.assert_called_once()
8291
self.assertEqual(result.capabilities, {'WorkerStatus': 'true',
8392
'RpcHttpBodyOnly': 'true',
8493
'SharedMemoryDataTransfer': 'true',
@@ -93,8 +102,7 @@ async def test_worker_init_request_with_otel(self, mock_otel_enabled):
93102
self.assertEqual(result.result.status, 1)
94103

95104
async def test_worker_init_request_with_exception(self):
96-
# Even if an exception happens during indexing,
97-
# we still return the WorkerInitResponse
105+
# If an exception happens during indexing, we return failure
98106
worker_request = WorkerRequest(name='worker_init_request',
99107
request=Request(FunctionRequest(
100108
'hello',
@@ -112,23 +120,16 @@ async def test_worker_init_request_with_exception(self):
112120
self.assertIsNotNone(result.worker_metadata.runtime_version)
113121
self.assertIsNotNone(result.worker_metadata.worker_version)
114122
self.assertIsNotNone(result.worker_metadata.worker_bitness)
115-
self.assertEqual(result.result.status, 1)
123+
self.assertEqual(result.result.status, 0)
116124

117125
async def test_functions_metadata_request(self):
126+
# We always succeed in metadata request - exceptions are raised
127+
# in init
118128
handle_event.protos = test_protos
119-
handle_event._metadata_exception = None
120129
metadata_result = await functions_metadata_request(None)
121130
self.assertEqual(metadata_result.result.status, 1)
122131

123-
async def test_functions_metadata_request_with_exception(self):
124-
handle_event.protos = test_protos
125-
handle_event._metadata_exception = Exception
126-
metadata_result = await functions_metadata_request(None)
127-
self.assertEqual(metadata_result.result.status, 0)
128-
handle_event._metadata_exception = None
129-
130-
@patch("azure_functions_worker_v2.loader.index_function_app",
131-
return_value=True)
132+
@patch("azure_functions_worker_v2.handle_event.index_function_app")
132133
async def test_function_environment_reload_request(self, mock_index_function_app):
133134
worker_request = WorkerRequest(name='function_environment_reload_request',
134135
request=Request(FunctionRequest(
@@ -138,6 +139,7 @@ async def test_function_environment_reload_request(self, mock_index_function_app
138139
'protos': test_protos})
139140
handle_event.protos = test_protos
140141
result = await function_environment_reload_request(worker_request)
142+
mock_index_function_app.assert_called_once()
141143
self.assertEqual(result.capabilities, {})
142144
self.assertEqual(result.worker_metadata.runtime_name, "python")
143145
self.assertIsNotNone(result.worker_metadata.runtime_version)
@@ -149,10 +151,12 @@ async def test_function_environment_reload_request(self, mock_index_function_app
149151
return_value=True)
150152
@patch("azure_functions_worker_v2.handle_event.initialize_http_server",
151153
return_value="http://mock_address")
154+
@patch("azure_functions_worker_v2.handle_event.index_function_app")
152155
async def test_function_environment_reload_request_with_streaming(
153156
self,
154157
mock_http_v2_enabled,
155-
mock_initialize_http_server):
158+
mock_initialize_http_server,
159+
mock_index_function_app):
156160
handle_event.protos = test_protos
157161
worker_request = WorkerRequest(name='function_environment_reload_request',
158162
request=Request(FunctionRequest(
@@ -161,6 +165,7 @@ async def test_function_environment_reload_request_with_streaming(
161165
properties={'host': '123',
162166
'protos': test_protos})
163167
result = await function_environment_reload_request(worker_request)
168+
mock_index_function_app.assert_called_once()
164169
self.assertEqual(result.capabilities, {'HttpUri': 'http://mock_address',
165170
'RequiresRouteParameters': 'true'})
166171
self.assertEqual(result.worker_metadata.runtime_name, "python")
@@ -172,8 +177,11 @@ async def test_function_environment_reload_request_with_streaming(
172177
@patch("azure_functions_worker_v2.handle_event"
173178
".otel_manager.get_azure_monitor_available",
174179
return_value=True)
175-
async def test_function_environment_reload_request_with_otel(self,
176-
mock_otel_enabled):
180+
@patch("azure_functions_worker_v2.handle_event.index_function_app")
181+
async def test_function_environment_reload_request_with_otel(
182+
self,
183+
mock_otel_enabled,
184+
mock_index_function_app):
177185
handle_event.protos = test_protos
178186
worker_request = WorkerRequest(name='function_environment_reload_request',
179187
request=Request(FunctionRequest(
@@ -182,6 +190,7 @@ async def test_function_environment_reload_request_with_otel(self,
182190
properties={'host': '123',
183191
'protos': test_protos})
184192
result = await function_environment_reload_request(worker_request)
193+
mock_index_function_app.assert_called_once()
185194
self.assertEqual(result.capabilities, {'WorkerOpenTelemetryEnabled': 'true'})
186195
self.assertEqual(result.worker_metadata.runtime_name, "python")
187196
self.assertIsNotNone(result.worker_metadata.runtime_version)
@@ -190,8 +199,7 @@ async def test_function_environment_reload_request_with_otel(self,
190199
self.assertEqual(result.result.status, 1)
191200

192201
async def test_function_environment_reload_request_with_exception(self):
193-
# Even if an exception happens during indexing,
194-
# we still return success
202+
# If an exception happens during indexing, the worker reports failure
195203
handle_event.protos = test_protos
196204
worker_request = WorkerRequest(name='function_environment_reload_request',
197205
request=Request(FunctionRequest(
@@ -200,9 +208,4 @@ async def test_function_environment_reload_request_with_exception(self):
200208
properties={'host': '123',
201209
'protos': test_protos})
202210
result = await function_environment_reload_request(worker_request)
203-
self.assertEqual(result.capabilities, {})
204-
self.assertEqual(result.worker_metadata.runtime_name, "python")
205-
self.assertIsNotNone(result.worker_metadata.runtime_version)
206-
self.assertIsNotNone(result.worker_metadata.worker_version)
207-
self.assertIsNotNone(result.worker_metadata.worker_bitness)
208-
self.assertEqual(result.result.status, 1)
211+
self.assertEqual(result.result.status, 0)

0 commit comments

Comments
 (0)