1
1
# Copyright (c) Microsoft Corporation. All rights reserved.
2
2
# Licensed under the MIT License.
3
- import importlib .util
4
3
import os
5
4
import sys
5
+ import importlib .util
6
6
import unittest
7
7
from unittest .mock import patch
8
8
9
9
from azure_functions_worker import testutils
10
+ from azure_functions_worker .utils .common import is_python_version
10
11
from azure_functions_worker .utils .dependency import DependencyManager
11
12
12
13
@@ -228,7 +229,7 @@ def test_add_to_sys_path_no_duplication(self):
228
229
229
230
def test_add_to_sys_path_import_module (self ):
230
231
DependencyManager ._add_to_sys_path (self ._customer_deps_path , True )
231
- import common_module # NoQA
232
+ import common_module # NoQA
232
233
self .assertEqual (
233
234
common_module .package_location ,
234
235
os .path .join (self ._customer_deps_path , 'common_module' )
@@ -239,7 +240,7 @@ def test_add_to_sys_path_import_namespace_path(self):
239
240
into sys.path
240
241
"""
241
242
DependencyManager ._add_to_sys_path (self ._customer_deps_path , True )
242
- import common_namespace # NoQA
243
+ import common_namespace # NoQA
243
244
self .assertEqual (len (common_namespace .__path__ ), 1 )
244
245
self .assertEqual (
245
246
common_namespace .__path__ [0 ],
@@ -516,7 +517,7 @@ def test_clear_path_importer_cache_and_modules_retain_namespace(self):
516
517
sys .path .insert (0 , self ._worker_deps_path )
517
518
518
519
# Ensure new import is from _worker_deps_path
519
- import common_module as worker_mod # NoQA
520
+ import common_module as worker_mod # NoQA
520
521
self .assertIn ('common_module' , sys .modules )
521
522
self .assertEqual (
522
523
worker_mod .package_location ,
@@ -554,6 +555,39 @@ def test_use_worker_dependencies_disable(self):
554
555
with self .assertRaises (ImportError ):
555
556
import common_module # NoQA
556
557
558
+ @unittest .skipUnless (
559
+ sys .version_info .major == 3 and sys .version_info .minor != 10 ,
560
+ 'Test only available for Python 3.6, 3.7, 3.8 or 3.9'
561
+ )
562
+ def test_use_worker_dependencies_default_python_36_37_38_39 (self ):
563
+ # Feature should be disabled in Python 3.6, 3.7, 3.8 and 3.9
564
+ # Setup paths
565
+ DependencyManager .worker_deps_path = self ._worker_deps_path
566
+ DependencyManager .cx_deps_path = self ._customer_deps_path
567
+ DependencyManager .cx_working_dir = self ._customer_func_path
568
+
569
+ # The common_module cannot be imported since feature is disabled
570
+ DependencyManager .use_worker_dependencies ()
571
+ with self .assertRaises (ImportError ):
572
+ import common_module # NoQA
573
+
574
+ @unittest .skip ('Skipping since PYTHON_ISOLATE_WORKER_DEPENDENCIES is '
575
+ 'disabled by default' )
576
+ def test_use_worker_dependencies_default_python_310 (self ):
577
+ # Feature should be enabled in Python 3.10 by default
578
+ # Setup paths
579
+ DependencyManager .worker_deps_path = self ._worker_deps_path
580
+ DependencyManager .cx_deps_path = self ._customer_deps_path
581
+ DependencyManager .cx_working_dir = self ._customer_func_path
582
+
583
+ # Ensure the common_module is imported from _worker_deps_path
584
+ DependencyManager .use_worker_dependencies ()
585
+ import common_module # NoQA
586
+ self .assertEqual (
587
+ common_module .package_location ,
588
+ os .path .join (self ._worker_deps_path , 'common_module' )
589
+ )
590
+
557
591
def test_prioritize_customer_dependencies (self ):
558
592
# Setup app settings
559
593
os .environ ['PYTHON_ISOLATE_WORKER_DEPENDENCIES' ] = 'true'
@@ -592,51 +626,52 @@ def test_prioritize_customer_dependencies_disable(self):
592
626
with self .assertRaises (ImportError ):
593
627
import common_module # NoQA
594
628
595
- def test_prioritize_customer_dependencies_from_working_directory (self ):
596
- self ._initialize_scenario ()
597
-
629
+ @unittest .skipIf (is_python_version ('3.10' ),
630
+ 'Test not available for python 3.10' )
631
+ def test_prioritize_customer_dependencies_default_python_36_37_38_39 (self ):
632
+ # Feature should be disabled in Python 3.6, 3.7, 3.8 and 3.9
598
633
# Setup paths
599
634
DependencyManager .worker_deps_path = self ._worker_deps_path
600
635
DependencyManager .cx_deps_path = self ._customer_deps_path
601
636
DependencyManager .cx_working_dir = self ._customer_func_path
602
637
603
- # Ensure the func_specific_module is imported from _customer_func_path
638
+ # Ensure the common_module is imported from _customer_deps_path
604
639
DependencyManager .prioritize_customer_dependencies ()
605
- import func_specific_module # NoQA
606
- self .assertEqual (
607
- func_specific_module .package_location ,
608
- os .path .join (self ._customer_func_path , 'func_specific_module' )
609
- )
640
+ with self .assertRaises (ImportError ):
641
+ import common_module # NoQA
610
642
611
- def test_reload_customer_libraries_dependency_isolation_true (self ):
612
- os .environ ['PYTHON_ISOLATE_WORKER_DEPENDENCIES' ] = 'true'
643
+ @unittest .skip ('Skipping since PYTHON_ISOLATE_WORKER_DEPENDENCIES is '
644
+ 'disabled by default' )
645
+ def test_prioritize_customer_dependencies_default_python_310 (self ):
646
+ # Feature should be enabled in Python 3.10 by default
613
647
# Setup paths
614
648
DependencyManager .worker_deps_path = self ._worker_deps_path
615
649
DependencyManager .cx_deps_path = self ._customer_deps_path
616
650
DependencyManager .cx_working_dir = self ._customer_func_path
617
651
618
- DependencyManager .reload_customer_libraries (self ._customer_deps_path )
652
+ # Ensure the common_module is imported from _customer_deps_path
653
+ DependencyManager .prioritize_customer_dependencies ()
619
654
import common_module # NoQA
620
655
self .assertEqual (
621
656
common_module .package_location ,
622
- os .path .join (self ._customer_deps_path , 'common_module' ))
657
+ os .path .join (self ._customer_deps_path , 'common_module' )
658
+ )
659
+
660
+ def test_prioritize_customer_dependencies_from_working_directory (self ):
661
+ self ._initialize_scenario ()
623
662
624
- def test_reload_customer_libraries_dependency_isolation_false (self ):
625
- os .environ ['PYTHON_ISOLATE_WORKER_DEPENDENCIES' ] = 'false'
626
663
# Setup paths
627
664
DependencyManager .worker_deps_path = self ._worker_deps_path
628
665
DependencyManager .cx_deps_path = self ._customer_deps_path
629
666
DependencyManager .cx_working_dir = self ._customer_func_path
630
667
631
- DependencyManager ._add_to_sys_path (self ._worker_deps_path , True )
632
- import azure .functions # NoQA
633
-
634
- DependencyManager ._add_to_sys_path (self ._customer_deps_path , True )
635
- DependencyManager .reload_customer_libraries (self ._customer_deps_path )
636
- # Checking if azure.functions gets reloaded
637
- self .assertIn (
638
- os .path .join (self ._customer_deps_path , 'azure' , 'functions' ),
639
- sys .modules ['azure.functions' ].__path__ )
668
+ # Ensure the func_specific_module is imported from _customer_func_path
669
+ DependencyManager .prioritize_customer_dependencies ()
670
+ import func_specific_module # NoQA
671
+ self .assertEqual (
672
+ func_specific_module .package_location ,
673
+ os .path .join (self ._customer_func_path , 'func_specific_module' )
674
+ )
640
675
641
676
def test_remove_module_cache (self ):
642
677
# First import the common_module and create a sys.modules cache
0 commit comments