Skip to content

Commit d09a915

Browse files
committed
Added consumption tests
1 parent 7bf7061 commit d09a915

File tree

3 files changed

+64
-30
lines changed

3 files changed

+64
-30
lines changed

azure_functions_worker/dispatcher.py

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -302,8 +302,9 @@ async def _handle__worker_init_request(self, request):
302302
bindings.load_binding_registry()
303303

304304
if is_envvar_true(ENABLE_INIT_INDEXING):
305-
self.get_function_metadata(directory,
306-
caller_info=sys._getframe().f_code.co_name)
305+
self.get_function_metadata(
306+
directory,
307+
caller_info=sys._getframe().f_code.co_name)
307308

308309
return protos.StreamingMessage(
309310
request_id=self.request_id,
@@ -323,8 +324,8 @@ async def _handle__worker_status_request(self, request):
323324

324325
def get_function_metadata(self, directory, caller_info):
325326
"""
326-
This method is called to index the functions in the function app directory
327-
and save the results in function_metadata_result or
327+
This method is called to index the functions in the function app
328+
directory and save the results in function_metadata_result or
328329
function_metadata_exception in case of an exception.
329330
"""
330331
script_file_name = get_app_setting(
@@ -340,7 +341,8 @@ def get_function_metadata(self, directory, caller_info):
340341
validate_script_file_name(script_file_name)
341342
function_path = os.path.join(directory, script_file_name)
342343

343-
self.function_metadata_result = self.index_functions(function_path) \
344+
self.function_metadata_result = (
345+
self.index_functions(function_path)) \
344346
if os.path.exists(function_path) else None
345347

346348
except Exception as ex:
@@ -351,8 +353,9 @@ async def _handle__functions_metadata_request(self, request):
351353
directory = metadata_request.function_app_directory
352354

353355
if not is_envvar_true(ENABLE_INIT_INDEXING):
354-
self.get_function_metadata(directory,
355-
caller_info=sys._getframe().f_code.co_name)
356+
self.get_function_metadata(
357+
directory,
358+
caller_info=sys._getframe().f_code.co_name)
356359

357360
if self.function_metadata_exception:
358361
return protos.StreamingMessage(
@@ -381,7 +384,8 @@ async def _handle__function_load_request(self, request):
381384

382385
logger.info(
383386
'Received WorkerLoadRequest, request ID %s, function_id: %s,'
384-
'function_name: %s,', self.request_id, function_id, function_name)
387+
'function_name: %s,',
388+
self.request_id, function_id, function_name)
385389

386390
programming_model = "V2"
387391
try:
@@ -576,6 +580,7 @@ async def _handle__function_environment_reload_request(self, request):
576580

577581
func_env_reload_request = \
578582
request.function_environment_reload_request
583+
directory = func_env_reload_request.function_app_directory
579584

580585
# Append function project root to module finding sys.path
581586
if func_env_reload_request.function_app_directory:
@@ -601,14 +606,17 @@ async def _handle__function_environment_reload_request(self, request):
601606
root_logger.setLevel(logging.DEBUG)
602607

603608
# Reload azure google namespaces
604-
DependencyManager.reload_customer_libraries(
605-
func_env_reload_request.function_app_directory
606-
)
609+
DependencyManager.reload_customer_libraries(directory)
607610

608611
# calling load_binding_registry again since the
609612
# reload_customer_libraries call clears the registry
610613
bindings.load_binding_registry()
611614

615+
if is_envvar_true(ENABLE_INIT_INDEXING):
616+
self.get_function_metadata(
617+
directory,
618+
caller_info=sys._getframe().f_code.co_name)
619+
612620
# Change function app directory
613621
if getattr(func_env_reload_request,
614622
'function_app_directory', None):

tests/consumption_tests/test_linux_consumption.py

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77

88
from requests import Request
99

10+
from azure_functions_worker.constants import ENABLE_INIT_INDEXING, \
11+
PYTHON_ENABLE_WORKER_EXTENSIONS, PYTHON_ISOLATE_WORKER_DEPENDENCIES, \
12+
PYTHON_ENABLE_DEBUG_LOGGING
1013
from tests.utils.testutils_lc import (
1114
LinuxConsumptionWebHostController
1215
)
@@ -107,7 +110,7 @@ def test_new_protobuf(self):
107110
ctrl.assign_container(env={
108111
"AzureWebJobsStorage": self._storage,
109112
"SCM_RUN_FROM_PACKAGE": self._get_blob_url("NewProtobuf"),
110-
"PYTHON_ISOLATE_WORKER_DEPENDENCIES": "1"
113+
PYTHON_ISOLATE_WORKER_DEPENDENCIES: "1"
111114
})
112115
req = Request('GET', f'{ctrl.url}/api/HttpTrigger')
113116
resp = ctrl.send_request(req)
@@ -137,7 +140,7 @@ def test_old_protobuf(self):
137140
ctrl.assign_container(env={
138141
"AzureWebJobsStorage": self._storage,
139142
"SCM_RUN_FROM_PACKAGE": self._get_blob_url("OldProtobuf"),
140-
"PYTHON_ISOLATE_WORKER_DEPENDENCIES": "1"
143+
PYTHON_ISOLATE_WORKER_DEPENDENCIES: "1"
141144
})
142145
req = Request('GET', f'{ctrl.url}/api/HttpTrigger')
143146
resp = ctrl.send_request(req)
@@ -189,7 +192,7 @@ def test_debug_logging_enabled(self):
189192
"AzureWebJobsStorage": self._storage,
190193
"SCM_RUN_FROM_PACKAGE": self._get_blob_url(
191194
"EnableDebugLogging"),
192-
"PYTHON_ENABLE_DEBUG_LOGGING": "1"
195+
PYTHON_ENABLE_DEBUG_LOGGING: "1"
193196
})
194197
req = Request('GET', f'{ctrl.url}/api/HttpTrigger1')
195198
resp = ctrl.send_request(req)
@@ -218,7 +221,7 @@ def test_pinning_functions_to_older_version(self):
218221
"AzureWebJobsStorage": self._storage,
219222
"SCM_RUN_FROM_PACKAGE": self._get_blob_url(
220223
"PinningFunctions"),
221-
"PYTHON_ISOLATE_WORKER_DEPENDENCIES": "1",
224+
PYTHON_ISOLATE_WORKER_DEPENDENCIES: "1",
222225
})
223226
req = Request('GET', f'{ctrl.url}/api/HttpTrigger1')
224227
resp = ctrl.send_request(req)
@@ -232,8 +235,7 @@ def test_opencensus_with_extensions_enabled(self):
232235
"""A function app with extensions enabled containing the
233236
following libraries:
234237
235-
azure-functions, azure-eventhub, azure-storage-blob, numpy,
236-
cryptography, pyodbc, requests
238+
azure-functions, opencensus
237239
238240
should return 200 after importing all libraries.
239241
"""
@@ -242,8 +244,25 @@ def test_opencensus_with_extensions_enabled(self):
242244
ctrl.assign_container(env={
243245
"AzureWebJobsStorage": self._storage,
244246
"SCM_RUN_FROM_PACKAGE": self._get_blob_url("Opencensus"),
245-
"PYTHON_ENABLE_WORKER_EXTENSIONS": "1",
246-
"AzureWebJobsFeatureFlags": "EnableWorkerIndexing"
247+
PYTHON_ENABLE_WORKER_EXTENSIONS: "1"
248+
})
249+
req = Request('GET', f'{ctrl.url}/api/opencensus')
250+
resp = ctrl.send_request(req)
251+
self.assertEqual(resp.status_code, 200)
252+
253+
@skipIf(sys.version_info.minor != 10,
254+
"This is testing only for python310")
255+
def test_opencensus_with_extensions_enabled_init_indexing(self):
256+
"""
257+
A function app with init indexing enabled
258+
"""
259+
with LinuxConsumptionWebHostController(_DEFAULT_HOST_VERSION,
260+
self._py_version) as ctrl:
261+
ctrl.assign_container(env={
262+
"AzureWebJobsStorage": self._storage,
263+
"SCM_RUN_FROM_PACKAGE": self._get_blob_url("Opencensus"),
264+
PYTHON_ENABLE_WORKER_EXTENSIONS: "1",
265+
ENABLE_INIT_INDEXING: "true"
247266
})
248267
req = Request('GET', f'{ctrl.url}/api/opencensus')
249268
resp = ctrl.send_request(req)
@@ -263,8 +282,7 @@ def test_reload_variables_after_timeout_error(self):
263282
"AzureWebJobsStorage": self._storage,
264283
"SCM_RUN_FROM_PACKAGE": self._get_blob_url(
265284
"TimeoutError"),
266-
"PYTHON_ISOLATE_WORKER_DEPENDENCIES": "1",
267-
"AzureWebJobsFeatureFlags": "EnableWorkerIndexing"
285+
PYTHON_ISOLATE_WORKER_DEPENDENCIES: "1"
268286
})
269287
req = Request('GET', f'{ctrl.url}/api/hello')
270288
resp = ctrl.send_request(req)
@@ -297,8 +315,7 @@ def test_reload_variables_after_oom_error(self):
297315
"AzureWebJobsStorage": self._storage,
298316
"SCM_RUN_FROM_PACKAGE": self._get_blob_url(
299317
"OOMError"),
300-
"PYTHON_ISOLATE_WORKER_DEPENDENCIES": "1",
301-
"AzureWebJobsFeatureFlags": "EnableWorkerIndexing"
318+
PYTHON_ISOLATE_WORKER_DEPENDENCIES: "1"
302319
})
303320
req = Request('GET', f'{ctrl.url}/api/httptrigger')
304321
resp = ctrl.send_request(req)

tests/unittests/test_dispatcher.py

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
PYTHON_THREADPOOL_THREAD_COUNT_MAX_37,
1515
PYTHON_THREADPOOL_THREAD_COUNT_MIN,
1616
ENABLE_INIT_INDEXING)
17+
from azure_functions_worker.dispatcher import Dispatcher
1718
from azure_functions_worker.version import VERSION
1819
from tests.utils import testutils
1920
from tests.utils.testutils import UNIT_TESTS_ROOT
@@ -802,8 +803,10 @@ def test_worker_init_request_with_indexing_disabled(self):
802803
self.assertIsNone(self.dispatcher.function_metadata_exception)
803804

804805
@patch.dict(os.environ, {ENABLE_INIT_INDEXING: 'true'})
805-
def test_worker_init_request_with_indexing_exception(self):
806-
sys.path.remove(str(FUNCTION_APP_DIRECTORY))
806+
@patch.object(Dispatcher, 'index_functions')
807+
def test_worker_init_request_with_indexing_exception(self,
808+
mock_index_functions):
809+
mock_index_functions.side_effect = Exception("Mocked Exception")
807810

808811
request = protos.StreamingMessage(
809812
worker_init_request=protos.WorkerInitRequest(
@@ -877,8 +880,12 @@ def test_functions_metadata_request_with_init_indexing_disabled(self):
877880
self.assertIsNone(self.dispatcher.function_metadata_exception)
878881

879882
@patch.dict(os.environ, {ENABLE_INIT_INDEXING: 'true'})
880-
def test_functions_metadata_request_with_indexing_exception(self):
881-
sys.path.remove(str(FUNCTION_APP_DIRECTORY))
883+
@patch.object(Dispatcher, 'index_functions')
884+
def test_functions_metadata_request_with_indexing_exception(
885+
self,
886+
mock_index_functions):
887+
888+
mock_index_functions.side_effect = Exception("Mocked Exception")
882889

883890
request = protos.StreamingMessage(
884891
worker_init_request=protos.WorkerInitRequest(
@@ -900,10 +907,12 @@ def test_functions_metadata_request_with_indexing_exception(self):
900907
self.assertIsNotNone(self.dispatcher.function_metadata_exception)
901908

902909
metadata_response = self.loop.run_until_complete(
903-
self.dispatcher._handle__functions_metadata_request(metadata_request))
910+
self.dispatcher._handle__functions_metadata_request(
911+
metadata_request))
904912

905-
self.assertEqual(metadata_response.function_metadata_response.result.status,
906-
protos.StatusResult.Failure)
913+
self.assertEqual(
914+
metadata_response.function_metadata_response.result.status,
915+
protos.StatusResult.Failure)
907916

908917
@patch.dict(os.environ, {ENABLE_INIT_INDEXING: 'false'})
909918
def test_dispatcher_indexing_in_load_request(self):

0 commit comments

Comments
 (0)