From 67ce25004c539f3331bbb53869ab942581f9e673 Mon Sep 17 00:00:00 2001 From: Victoria Hall Date: Fri, 2 Aug 2024 15:04:16 -0500 Subject: [PATCH 1/6] refactoring db tests --- eng/templates/jobs/build.yml | 3 +- eng/templates/official/jobs/ci-lc-tests.yml | 1 + .../function_app.py | 4 +- .../deferred_bindings_enabled/function_app.py | 8 +- .../test_deferred_bindings_disabled.py | 64 +++++++++++++++ ...s.py => test_deferred_bindings_enabled.py} | 81 ++++++++----------- .../test_deferred_bindings_enabled_dual.py | 72 +++++++++++++++++ 7 files changed, 177 insertions(+), 56 deletions(-) create mode 100644 tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_disabled.py rename tests/extension_tests/deferred_bindings_tests/{test_deferred_bindings.py => test_deferred_bindings_enabled.py} (56%) create mode 100644 tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_enabled_dual.py diff --git a/eng/templates/jobs/build.yml b/eng/templates/jobs/build.yml index c556c8d5..1f61921f 100644 --- a/eng/templates/jobs/build.yml +++ b/eng/templates/jobs/build.yml @@ -19,4 +19,5 @@ jobs: .env\Scripts\Activate.ps1 python -m pip install --upgrade pip python -m pip install . - displayName: 'Build python worker' \ No newline at end of file + displayName: 'Build python worker' + condition: and(eq(variables.isSdkRelease, false), eq(variables.isExtensionsRelease, false), eq(variables['USETESTPYTHONSDK'], false), eq(variables['USETESTPYTHONEXTENSIONS'], false)) \ No newline at end of file diff --git a/eng/templates/official/jobs/ci-lc-tests.yml b/eng/templates/official/jobs/ci-lc-tests.yml index 42cc5008..defbf3e4 100644 --- a/eng/templates/official/jobs/ci-lc-tests.yml +++ b/eng/templates/official/jobs/ci-lc-tests.yml @@ -31,6 +31,7 @@ jobs: cd tests python -m invoke -c test_setup build-protos displayName: 'Install dependencies and the worker' + condition: and(eq(variables.isSdkRelease, false), eq(variables.isExtensionsRelease, false), eq(variables['USETESTPYTHONSDK'], false), eq(variables['USETESTPYTHONEXTENSIONS'], false)) - bash: | python -m pytest -n auto --dist loadfile -vv --reruns 4 --instafail tests/consumption_tests env: diff --git a/tests/extension_tests/deferred_bindings_tests/deferred_bindings_functions/deferred_bindings_disabled/function_app.py b/tests/extension_tests/deferred_bindings_tests/deferred_bindings_functions/deferred_bindings_disabled/function_app.py index 9ec066bc..2af0d9c2 100644 --- a/tests/extension_tests/deferred_bindings_tests/deferred_bindings_functions/deferred_bindings_disabled/function_app.py +++ b/tests/extension_tests/deferred_bindings_tests/deferred_bindings_functions/deferred_bindings_disabled/function_app.py @@ -7,14 +7,14 @@ app = func.FunctionApp(http_auth_level=func.AuthLevel.ANONYMOUS) -@app.function_name(name="blob_trigger") +@app.function_name(name="blob_trigger_only") @app.blob_trigger(arg_name="file", path="python-worker-tests/test-blob-trigger.txt", connection="AzureWebJobsStorage") @app.blob_output(arg_name="$return", path="python-worker-tests/test-blob-triggered.txt", connection="AzureWebJobsStorage") -def blob_trigger(file: func.InputStream) -> str: +def blob_trigger_only(file: func.InputStream) -> str: return json.dumps({ 'name': file.name, 'length': file.length, diff --git a/tests/extension_tests/deferred_bindings_tests/deferred_bindings_functions/deferred_bindings_enabled/function_app.py b/tests/extension_tests/deferred_bindings_tests/deferred_bindings_functions/deferred_bindings_enabled/function_app.py index 2b3356e4..8613ea46 100644 --- a/tests/extension_tests/deferred_bindings_tests/deferred_bindings_functions/deferred_bindings_enabled/function_app.py +++ b/tests/extension_tests/deferred_bindings_tests/deferred_bindings_functions/deferred_bindings_enabled/function_app.py @@ -6,11 +6,11 @@ app = func.FunctionApp(http_auth_level=func.AuthLevel.ANONYMOUS) -@app.function_name(name="get_bc_blob_triggered") +@app.function_name(name="blob_input_only") @app.blob_input(arg_name="client", path="python-worker-tests/test-blobclient-triggered.txt", connection="AzureWebJobsStorage") -@app.route(route="get_bc_blob_triggered") -def get_bc_blob_triggered(req: func.HttpRequest, - client: blob.BlobClient) -> str: +@app.route(route="blob_input_only") +def blob_input_only(req: func.HttpRequest, + client: blob.BlobClient) -> str: return client.download_blob(encoding='utf-8').readall() diff --git a/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_disabled.py b/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_disabled.py new file mode 100644 index 00000000..a9a07902 --- /dev/null +++ b/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_disabled.py @@ -0,0 +1,64 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. +import sys +import unittest + +import azure.functions as func +from tests.utils import testutils + +from azure_functions_worker import protos +from azure_functions_worker.bindings import meta + + +DEFERRED_BINDINGS_DISABLED_DIR = testutils.EXTENSION_TESTS_FOLDER / \ + 'deferred_bindings_tests' / \ + 'deferred_bindings_functions' / \ + 'deferred_bindings_disabled' + + +@unittest.skipIf(sys.version_info.minor <= 8, "The base extension" + "is only supported for 3.9+.") +class TestDeferredBindingsDisabled(testutils.AsyncTestCase): + + async def test_deferred_bindings_disabled_metadata(self): + async with testutils.start_mockhost( + script_root=DEFERRED_BINDINGS_DISABLED_DIR) as host: + await host.init_worker() + r = await host.get_functions_metadata() + self.assertIsInstance(r.response, protos.FunctionMetadataResponse) + self.assertEqual(r.response.result.status, + protos.StatusResult.Success) + + async def test_deferred_bindings_disabled_log(self): + async with testutils.start_mockhost( + script_root=DEFERRED_BINDINGS_DISABLED_DIR) as host: + await host.init_worker() + r = await host.get_functions_metadata() + disabled_log_present = False + for log in r.logs: + message = log.message + if "Deferred bindings enabled: False" in message: + disabled_log_present = True + break + self.assertTrue(disabled_log_present) + + +@unittest.skipIf(sys.version_info.minor <= 8, "The base extension" + "is only supported for 3.9+.") +class TestDeferredBindingsHelpers(testutils.AsyncTestCase): + + async def test_check_deferred_bindings_disabled(self): + """ + check_deferred_bindings_enabled checks if deferred bindings is enabled at fx + and single binding level. + + The first bool represents if deferred bindings is enabled at a fx level. This + means that at least one binding in the function is a deferred binding type. + + The second represents if the current binding is deferred binding. If this is + True, then deferred bindings must also be enabled at the function level. + + Test: type is not supported, deferred_bindings_enabled is not yet set + """ + self.assertEqual(meta.check_deferred_bindings_enabled( + func.InputStream, False), (False, False)) diff --git a/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings.py b/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_enabled.py similarity index 56% rename from tests/extension_tests/deferred_bindings_tests/test_deferred_bindings.py rename to tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_enabled.py index bdba53a8..d627f5b3 100644 --- a/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings.py +++ b/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_enabled.py @@ -3,7 +3,6 @@ import sys import unittest -import azure.functions as func from tests.utils import testutils from azure_functions_worker import protos @@ -12,21 +11,15 @@ # Even if the tests are skipped for <=3.8, the library is still imported as # it is used for these tests. if sys.version_info.minor >= 9: - from azurefunctions.extensions.bindings.blob import BlobClient, BlobClientConverter + from azurefunctions.extensions.bindings.blob import (BlobClient, + BlobClientConverter, + ContainerClient, + StorageStreamDownloader) DEFERRED_BINDINGS_ENABLED_DIR = testutils.EXTENSION_TESTS_FOLDER / \ 'deferred_bindings_tests' / \ 'deferred_bindings_functions' / \ 'deferred_bindings_enabled' -DEFERRED_BINDINGS_DISABLED_DIR = testutils.EXTENSION_TESTS_FOLDER / \ - 'deferred_bindings_tests' / \ - 'deferred_bindings_functions' / \ - 'deferred_bindings_disabled' - -DEFERRED_BINDINGS_ENABLED_DUAL_DIR = testutils.EXTENSION_TESTS_FOLDER / \ - 'deferred_bindings_tests' / \ - 'deferred_bindings_functions' / \ - 'deferred_bindings_enabled_dual' class MockMBD: @@ -42,7 +35,7 @@ def __init__(self, version: str, source: str, "is only supported for 3.9+.") class TestDeferredBindingsEnabled(testutils.AsyncTestCase): - async def test_deferred_bindings_metadata(self): + async def test_deferred_bindings_enabled_metadata(self): async with testutils.start_mockhost( script_root=DEFERRED_BINDINGS_ENABLED_DIR) as host: await host.init_worker() @@ -51,40 +44,25 @@ async def test_deferred_bindings_metadata(self): self.assertEqual(r.response.result.status, protos.StatusResult.Success) - -@unittest.skipIf(sys.version_info.minor <= 8, "The base extension" - "is only supported for 3.9+.") -class TestDeferredBindingsEnabledDual(testutils.AsyncTestCase): - - async def test_deferred_bindings_dual_metadata(self): - async with testutils.start_mockhost( - script_root=DEFERRED_BINDINGS_ENABLED_DUAL_DIR) as host: - await host.init_worker() - r = await host.get_functions_metadata() - self.assertIsInstance(r.response, protos.FunctionMetadataResponse) - self.assertEqual(r.response.result.status, - protos.StatusResult.Success) - - -@unittest.skipIf(sys.version_info.minor <= 8, "The base extension" - "is only supported for 3.9+.") -class TestDeferredBindingsDisabled(testutils.AsyncTestCase): - - async def test_non_deferred_bindings_metadata(self): + async def test_deferred_bindings_enabled_log(self): async with testutils.start_mockhost( - script_root=DEFERRED_BINDINGS_DISABLED_DIR) as host: + script_root=DEFERRED_BINDINGS_ENABLED_DIR) as host: await host.init_worker() r = await host.get_functions_metadata() - self.assertIsInstance(r.response, protos.FunctionMetadataResponse) - self.assertEqual(r.response.result.status, - protos.StatusResult.Success) + enabled_log_present = False + for log in r.logs: + message = log.message + if "Deferred bindings enabled: True" in message: + enabled_log_present = True + break + self.assertTrue(enabled_log_present) @unittest.skipIf(sys.version_info.minor <= 8, "The base extension" "is only supported for 3.9+.") -class TestDeferredBindingsHelpers(testutils.AsyncTestCase): +class TestDeferredBindingsEnabledHelpers(testutils.AsyncTestCase): - def test_deferred_bindings_decode(self): + def test_deferred_bindings_enabled_decode(self): binding = BlobClientConverter pb = protos.ParameterBinding(name='test', data=protos.TypedData( @@ -114,19 +92,24 @@ async def test_check_deferred_bindings_enabled(self): The second represents if the current binding is deferred binding. If this is True, then deferred bindings must also be enabled at the function level. + + Test type 1: type is supported, deferred_bindings_enabled is not yet set + Test type 2: type is supported, deferred_bindings_enabled is already set """ - async with testutils.start_mockhost( - script_root=DEFERRED_BINDINGS_DISABLED_DIR) as host: - await host.init_worker() + self.assertEqual(meta.check_deferred_bindings_enabled( + BlobClient, False), (True, True)) + + self.assertEqual(meta.check_deferred_bindings_enabled( + BlobClient, True), (True, True)) - self.assertEqual(meta.check_deferred_bindings_enabled( - func.InputStream, False), (False, False)) + self.assertEqual(meta.check_deferred_bindings_enabled( + ContainerClient, False), (True, True)) - self.assertEqual(meta.check_deferred_bindings_enabled( - func.InputStream, True), (True, False)) + self.assertEqual(meta.check_deferred_bindings_enabled( + ContainerClient, True), (True, True)) - self.assertEqual(meta.check_deferred_bindings_enabled( - BlobClient, False), (True, True)) + self.assertEqual(meta.check_deferred_bindings_enabled( + StorageStreamDownloader, False), (True, True)) - self.assertEqual(meta.check_deferred_bindings_enabled( - BlobClient, True), (True, True)) + self.assertEqual(meta.check_deferred_bindings_enabled( + StorageStreamDownloader, True), (True, True)) diff --git a/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_enabled_dual.py b/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_enabled_dual.py new file mode 100644 index 00000000..505fcd8f --- /dev/null +++ b/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_enabled_dual.py @@ -0,0 +1,72 @@ +# Copyright (c) Microsoft Corporation. All rights reserved. +# Licensed under the MIT License. +import sys +import unittest + +import azure.functions as func +from tests.utils import testutils + +from azure_functions_worker import protos +from azure_functions_worker.bindings import meta + +DEFERRED_BINDINGS_ENABLED_DUAL_DIR = testutils.EXTENSION_TESTS_FOLDER / \ + 'deferred_bindings_tests' / \ + 'deferred_bindings_functions' / \ + 'deferred_bindings_enabled_dual' + + +class MockMBD: + def __init__(self, version: str, source: str, + content_type: str, content: str): + self.version = version + self.source = source + self.content_type = content_type + self.content = content + + +@unittest.skipIf(sys.version_info.minor <= 8, "The base extension" + "is only supported for 3.9+.") +class TestDeferredBindingsEnabledDual(testutils.AsyncTestCase): + + async def test_deferred_bindings_dual_metadata(self): + async with testutils.start_mockhost( + script_root=DEFERRED_BINDINGS_ENABLED_DUAL_DIR) as host: + await host.init_worker() + r = await host.get_functions_metadata() + self.assertIsInstance(r.response, protos.FunctionMetadataResponse) + self.assertEqual(r.response.result.status, + protos.StatusResult.Success) + + async def test_deferred_bindings_dual_enabled_log(self): + async with testutils.start_mockhost( + script_root=DEFERRED_BINDINGS_ENABLED_DUAL_DIR) as host: + await host.init_worker() + r = await host.get_functions_metadata() + enabled_log_present = False + for log in r.logs: + message = log.message + if "Deferred bindings enabled: True" in message: + enabled_log_present = True + break + self.assertTrue(enabled_log_present) + + +@unittest.skipIf(sys.version_info.minor <= 8, "The base extension" + "is only supported for 3.9+.") +class TestDeferredBindingsHelpers(testutils.AsyncTestCase): + + async def test_check_deferred_bindings_enabled(self): + """ + check_deferred_bindings_enabled checks if deferred bindings is enabled at fx + and single binding level. + + The first bool represents if deferred bindings is enabled at a fx level. This + means that at least one binding in the function is a deferred binding type. + + The second represents if the current binding is deferred binding. If this is + True, then deferred bindings must also be enabled at the function level. + + Test: type is not supported, deferred_bindings_enabled already set + """ + self.assertEqual(meta.check_deferred_bindings_enabled( + func.InputStream, True), (True, False)) From 938b47bada8f6697818f62fab48f00e3ac560f5a Mon Sep 17 00:00:00 2001 From: Victoria Hall Date: Fri, 2 Aug 2024 16:34:49 -0500 Subject: [PATCH 2/6] test fixes --- .../test_deferred_bindings_disabled.py | 8 ++++-- .../test_deferred_bindings_enabled.py | 27 ++++++++++--------- .../test_deferred_bindings_enabled_dual.py | 7 +++-- tests/unittests/test_dispatcher.py | 4 --- 4 files changed, 26 insertions(+), 20 deletions(-) diff --git a/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_disabled.py b/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_disabled.py index a9a07902..eeea715b 100644 --- a/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_disabled.py +++ b/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_disabled.py @@ -29,6 +29,7 @@ async def test_deferred_bindings_disabled_metadata(self): self.assertEqual(r.response.result.status, protos.StatusResult.Success) + @testutils.retryable_test(3, 5) async def test_deferred_bindings_disabled_log(self): async with testutils.start_mockhost( script_root=DEFERRED_BINDINGS_DISABLED_DIR) as host: @@ -60,5 +61,8 @@ async def test_check_deferred_bindings_disabled(self): Test: type is not supported, deferred_bindings_enabled is not yet set """ - self.assertEqual(meta.check_deferred_bindings_enabled( - func.InputStream, False), (False, False)) + async with testutils.start_mockhost( + script_root=DEFERRED_BINDINGS_DISABLED_DIR) as host: + await host.init_worker() + self.assertEqual(meta.check_deferred_bindings_enabled( + func.InputStream, False), (False, False)) diff --git a/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_enabled.py b/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_enabled.py index d627f5b3..9b450ebe 100644 --- a/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_enabled.py +++ b/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_enabled.py @@ -96,20 +96,23 @@ async def test_check_deferred_bindings_enabled(self): Test type 1: type is supported, deferred_bindings_enabled is not yet set Test type 2: type is supported, deferred_bindings_enabled is already set """ - self.assertEqual(meta.check_deferred_bindings_enabled( - BlobClient, False), (True, True)) + async with testutils.start_mockhost( + script_root=DEFERRED_BINDINGS_ENABLED_DIR) as host: + await host.init_worker() + self.assertEqual(meta.check_deferred_bindings_enabled( + BlobClient, False), (True, True)) - self.assertEqual(meta.check_deferred_bindings_enabled( - BlobClient, True), (True, True)) + self.assertEqual(meta.check_deferred_bindings_enabled( + BlobClient, True), (True, True)) - self.assertEqual(meta.check_deferred_bindings_enabled( - ContainerClient, False), (True, True)) + self.assertEqual(meta.check_deferred_bindings_enabled( + ContainerClient, False), (True, True)) - self.assertEqual(meta.check_deferred_bindings_enabled( - ContainerClient, True), (True, True)) + self.assertEqual(meta.check_deferred_bindings_enabled( + ContainerClient, True), (True, True)) - self.assertEqual(meta.check_deferred_bindings_enabled( - StorageStreamDownloader, False), (True, True)) + self.assertEqual(meta.check_deferred_bindings_enabled( + StorageStreamDownloader, False), (True, True)) - self.assertEqual(meta.check_deferred_bindings_enabled( - StorageStreamDownloader, True), (True, True)) + self.assertEqual(meta.check_deferred_bindings_enabled( + StorageStreamDownloader, True), (True, True)) diff --git a/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_enabled_dual.py b/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_enabled_dual.py index 505fcd8f..03f554da 100644 --- a/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_enabled_dual.py +++ b/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_enabled_dual.py @@ -68,5 +68,8 @@ async def test_check_deferred_bindings_enabled(self): Test: type is not supported, deferred_bindings_enabled already set """ - self.assertEqual(meta.check_deferred_bindings_enabled( - func.InputStream, True), (True, False)) + async with testutils.start_mockhost( + script_root=DEFERRED_BINDINGS_ENABLED_DUAL_DIR) as host: + await host.init_worker() + self.assertEqual(meta.check_deferred_bindings_enabled( + func.InputStream, True), (True, False)) diff --git a/tests/unittests/test_dispatcher.py b/tests/unittests/test_dispatcher.py index 5ee48f9e..10609500 100644 --- a/tests/unittests/test_dispatcher.py +++ b/tests/unittests/test_dispatcher.py @@ -30,10 +30,6 @@ DISPATCHER_STEIN_FUNCTIONS_DIR = testutils.UNIT_TESTS_FOLDER / \ 'dispatcher_functions' / \ 'dispatcher_functions_stein' -DISPATCHER_HTTP_V2_FASTAPI_FUNCTIONS_DIR = testutils.UNIT_TESTS_FOLDER / \ - 'dispatcher_functions' / \ - 'http_v2' / \ - 'fastapi' FUNCTION_APP_DIRECTORY = UNIT_TESTS_ROOT / 'dispatcher_functions' / \ 'dispatcher_functions_stein' From ead6e6bf7de08c4ecb6eb0ceed236d4bcf8435a5 Mon Sep 17 00:00:00 2001 From: Victoria Hall Date: Fri, 2 Aug 2024 16:37:28 -0500 Subject: [PATCH 3/6] condition fix --- eng/templates/official/jobs/ci-e2e-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eng/templates/official/jobs/ci-e2e-tests.yml b/eng/templates/official/jobs/ci-e2e-tests.yml index 86386ab5..b69d9090 100644 --- a/eng/templates/official/jobs/ci-e2e-tests.yml +++ b/eng/templates/official/jobs/ci-e2e-tests.yml @@ -125,5 +125,5 @@ jobs: AzureWebJobsSqlConnectionString: $(SQL_CONNECTION) AzureWebJobsEventGridTopicUri: $(EVENTGRID_URI) AzureWebJobsEventGridConnectionKey: $(EVENTGRID_CONNECTION) - USETESTPYTHONSDK: eq(variables.isSdkRelease, true) + USETESTPYTHONSDK: or(eq(variables.isSdkRelease, true), eq(variables['USETESTPYTHONSDK'], true)) displayName: "Running $(PYTHON_VERSION) Python E2E Tests" From 2bf6931202d42e90f6e17643a5589eb698c2fc88 Mon Sep 17 00:00:00 2001 From: hallvictoria Date: Mon, 5 Aug 2024 09:58:45 -0500 Subject: [PATCH 4/6] specific build id --- eng/templates/jobs/ci-unit-tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eng/templates/jobs/ci-unit-tests.yml b/eng/templates/jobs/ci-unit-tests.yml index d4111994..bff3fc2a 100644 --- a/eng/templates/jobs/ci-unit-tests.yml +++ b/eng/templates/jobs/ci-unit-tests.yml @@ -38,7 +38,7 @@ jobs: inputs: buildType: specific artifactName: 'azure-functions' - project: 'internal' + project: '3f99e810-c336-441f-8892-84983093ad7f' definition: 679 buildVersionToDownload: latest targetPath: '$(Pipeline.Workspace)/PythonSdkArtifact' From a6da31bf5785b25f199fccf5965d1b564ea7ee34 Mon Sep 17 00:00:00 2001 From: hallvictoria Date: Mon, 5 Aug 2024 10:15:03 -0500 Subject: [PATCH 5/6] skip unit tests for sdk releases --- eng/templates/jobs/ci-unit-tests.yml | 37 +--------------------------- 1 file changed, 1 insertion(+), 36 deletions(-) diff --git a/eng/templates/jobs/ci-unit-tests.yml b/eng/templates/jobs/ci-unit-tests.yml index bff3fc2a..8ef4b871 100644 --- a/eng/templates/jobs/ci-unit-tests.yml +++ b/eng/templates/jobs/ci-unit-tests.yml @@ -33,43 +33,8 @@ jobs: eng/scripts/test-setup.sh displayName: 'Install dependencies' condition: and(eq(variables.isSdkRelease, false), eq(variables.isExtensionsRelease, false), eq(variables['USETESTPYTHONSDK'], false), eq(variables['USETESTPYTHONEXTENSIONS'], false)) - - task: DownloadPipelineArtifact@2 - displayName: 'Download Python SDK Artifact' - inputs: - buildType: specific - artifactName: 'azure-functions' - project: '3f99e810-c336-441f-8892-84983093ad7f' - definition: 679 - buildVersionToDownload: latest - targetPath: '$(Pipeline.Workspace)/PythonSdkArtifact' - condition: or(eq(variables.isSdkRelease, true), eq(variables['USETESTPYTHONSDK'], true)) - - bash: | - chmod +x eng/scripts/test-sdk.sh - chmod +x eng/scripts/test-setup.sh - - eng/scripts/test-sdk.sh $(Pipeline.Workspace) $(PYTHON_VERSION) - eng/scripts/test-setup.sh - displayName: 'Install test python sdk, dependencies and the worker' - condition: or(eq(variables.isSdkRelease, true), eq(variables['USETESTPYTHONSDK'], true)) - - task: DownloadPipelineArtifact@2 - displayName: 'Download Python Extension Artifact' - inputs: - buildType: specific - artifactName: $(PYTHONEXTENSIONNAME) - project: 'internal' - definition: 798 - buildVersionToDownload: latest - targetPath: '$(Pipeline.Workspace)/PythonExtensionArtifact' - condition: or(eq(variables.isExtensionsRelease, true), eq(variables['USETESTPYTHONEXTENSIONS'], true)) - - bash: | - chmod +x eng/scripts/test-setup.sh - chmod +x eng/scripts/test-extensions.sh - - eng/scripts/test-extensions.sh $(Pipeline.Workspace) $(PYTHON_VERSION) - eng/scripts/test-setup.sh - displayName: 'Install test python extension, dependencies and the worker' - condition: or(eq(variables.isExtensionsRelease, true), eq(variables['USETESTPYTHONEXTENSIONS'], true)) - bash: | python -m pytest -q -n auto --dist loadfile --reruns 4 --instafail --cov=./azure_functions_worker --cov-report xml --cov-branch tests/unittests displayName: "Running $(PYTHON_VERSION) Unit Tests" + condition: and(eq(variables.isSdkRelease, false), eq(variables.isExtensionsRelease, false), eq(variables['USETESTPYTHONSDK'], false), eq(variables['USETESTPYTHONEXTENSIONS'], false)) \ No newline at end of file From 7252ffc51b1cae75f3de7b2c6985a138cd48353a Mon Sep 17 00:00:00 2001 From: hallvictoria Date: Mon, 5 Aug 2024 10:53:25 -0500 Subject: [PATCH 6/6] added comments, retries for flaky tests --- eng/templates/jobs/build.yml | 1 + eng/templates/jobs/ci-unit-tests.yml | 1 + eng/templates/official/jobs/ci-lc-tests.yml | 1 + .../test_deferred_bindings_disabled.py | 2 +- .../test_deferred_bindings_enabled_dual.py | 4 ++-- tests/unittests/test_http_functions.py | 4 ++++ tests/unittests/test_third_party_http_functions.py | 4 ++++ 7 files changed, 14 insertions(+), 3 deletions(-) diff --git a/eng/templates/jobs/build.yml b/eng/templates/jobs/build.yml index 1f61921f..3b0500df 100644 --- a/eng/templates/jobs/build.yml +++ b/eng/templates/jobs/build.yml @@ -20,4 +20,5 @@ jobs: python -m pip install --upgrade pip python -m pip install . displayName: 'Build python worker' + # Skip the build stage for SDK and Extensions release branches. This stage will fail because pyproject.toml contains the updated (and unreleased) library version condition: and(eq(variables.isSdkRelease, false), eq(variables.isExtensionsRelease, false), eq(variables['USETESTPYTHONSDK'], false), eq(variables['USETESTPYTHONEXTENSIONS'], false)) \ No newline at end of file diff --git a/eng/templates/jobs/ci-unit-tests.yml b/eng/templates/jobs/ci-unit-tests.yml index 8ef4b871..5ff54888 100644 --- a/eng/templates/jobs/ci-unit-tests.yml +++ b/eng/templates/jobs/ci-unit-tests.yml @@ -36,5 +36,6 @@ jobs: - bash: | python -m pytest -q -n auto --dist loadfile --reruns 4 --instafail --cov=./azure_functions_worker --cov-report xml --cov-branch tests/unittests displayName: "Running $(PYTHON_VERSION) Unit Tests" + # Skip running tests for SDK and Extensions release branches. Public pipeline doesn't have permissions to download artifact. condition: and(eq(variables.isSdkRelease, false), eq(variables.isExtensionsRelease, false), eq(variables['USETESTPYTHONSDK'], false), eq(variables['USETESTPYTHONEXTENSIONS'], false)) \ No newline at end of file diff --git a/eng/templates/official/jobs/ci-lc-tests.yml b/eng/templates/official/jobs/ci-lc-tests.yml index defbf3e4..b5229d90 100644 --- a/eng/templates/official/jobs/ci-lc-tests.yml +++ b/eng/templates/official/jobs/ci-lc-tests.yml @@ -31,6 +31,7 @@ jobs: cd tests python -m invoke -c test_setup build-protos displayName: 'Install dependencies and the worker' + # Skip the installation stage for SDK and Extensions release branches. This stage will fail because pyproject.toml contains the updated (and unreleased) library version condition: and(eq(variables.isSdkRelease, false), eq(variables.isExtensionsRelease, false), eq(variables['USETESTPYTHONSDK'], false), eq(variables['USETESTPYTHONEXTENSIONS'], false)) - bash: | python -m pytest -n auto --dist loadfile -vv --reruns 4 --instafail tests/consumption_tests diff --git a/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_disabled.py b/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_disabled.py index eeea715b..a138119c 100644 --- a/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_disabled.py +++ b/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_disabled.py @@ -46,7 +46,7 @@ async def test_deferred_bindings_disabled_log(self): @unittest.skipIf(sys.version_info.minor <= 8, "The base extension" "is only supported for 3.9+.") -class TestDeferredBindingsHelpers(testutils.AsyncTestCase): +class TestDeferredBindingsDisabledHelpers(testutils.AsyncTestCase): async def test_check_deferred_bindings_disabled(self): """ diff --git a/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_enabled_dual.py b/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_enabled_dual.py index 03f554da..e5ec7037 100644 --- a/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_enabled_dual.py +++ b/tests/extension_tests/deferred_bindings_tests/test_deferred_bindings_enabled_dual.py @@ -53,9 +53,9 @@ async def test_deferred_bindings_dual_enabled_log(self): @unittest.skipIf(sys.version_info.minor <= 8, "The base extension" "is only supported for 3.9+.") -class TestDeferredBindingsHelpers(testutils.AsyncTestCase): +class TestDeferredBindingsDualHelpers(testutils.AsyncTestCase): - async def test_check_deferred_bindings_enabled(self): + async def test_check_deferred_bindings_dual_enabled(self): """ check_deferred_bindings_enabled checks if deferred bindings is enabled at fx and single binding level. diff --git a/tests/unittests/test_http_functions.py b/tests/unittests/test_http_functions.py index 109694d7..61b6c433 100644 --- a/tests/unittests/test_http_functions.py +++ b/tests/unittests/test_http_functions.py @@ -324,20 +324,24 @@ def check_log_import_module_troubleshooting_url(self, passed = True self.assertTrue(passed) + @testutils.retryable_test(3, 5) def test_print_logging_no_flush(self): r = self.webhost.request('GET', 'print_logging?message=Secret42') self.assertEqual(r.status_code, 200) self.assertEqual(r.text, 'OK-print-logging') + @testutils.retryable_test(3, 5) def check_log_print_logging_no_flush(self, host_out: typing.List[str]): self.assertIn('Secret42', host_out) + @testutils.retryable_test(3, 5) def test_print_logging_with_flush(self): r = self.webhost.request('GET', 'print_logging?flush=true&message=Secret42') self.assertEqual(r.status_code, 200) self.assertEqual(r.text, 'OK-print-logging') + @testutils.retryable_test(3, 5) def check_log_print_logging_with_flush(self, host_out: typing.List[str]): self.assertIn('Secret42', host_out) diff --git a/tests/unittests/test_third_party_http_functions.py b/tests/unittests/test_third_party_http_functions.py index 634fa258..ba1e44f2 100644 --- a/tests/unittests/test_third_party_http_functions.py +++ b/tests/unittests/test_third_party_http_functions.py @@ -76,15 +76,18 @@ def check_log_debug_with_user_logging(self, self.assertIn('logging debug', host_out) self.assertIn('logging error', host_out) + @testutils.retryable_test(3, 5) def test_print_logging_no_flush(self): r = self.webhost.request('GET', 'print_logging?message=Secret42', no_prefix=True) self.assertEqual(r.status_code, 200) self.assertEqual(r.text, 'OK-print-logging') + @testutils.retryable_test(3, 5) def check_log_print_logging_no_flush(self, host_out: typing.List[str]): self.assertIn('Secret42', host_out) + @testutils.retryable_test(3, 5) def test_print_logging_with_flush(self): r = self.webhost.request('GET', 'print_logging?flush=true&message' @@ -93,6 +96,7 @@ def test_print_logging_with_flush(self): self.assertEqual(r.status_code, 200) self.assertEqual(r.text, 'OK-print-logging') + @testutils.retryable_test(3, 5) def check_log_print_logging_with_flush(self, host_out: typing.List[str]): self.assertIn('Secret42', host_out)