From 6ef6376b3143cea98ef098b818149b322946a05f Mon Sep 17 00:00:00 2001 From: asriniva <69502+asriniva@users.noreply.github.com> Date: Tue, 11 Aug 2020 19:29:55 +0000 Subject: [PATCH 1/3] Add legacy GCF Python 3.7 behavior --- src/functions_framework/__init__.py | 13 ++++++++++ tests/test_functions.py | 30 +++++++++++++++++++++++ tests/test_functions/returns_none/main.py | 29 ++++++++++++++++++++++ 3 files changed, 72 insertions(+) create mode 100644 tests/test_functions/returns_none/main.py diff --git a/src/functions_framework/__init__.py b/src/functions_framework/__init__.py index b7f38290..594551d3 100644 --- a/src/functions_framework/__init__.py +++ b/src/functions_framework/__init__.py @@ -174,6 +174,19 @@ def create_app(target=None, source=None, signature_type=None): app = flask.Flask(target, template_folder=template_folder) app.config["MAX_CONTENT_LENGTH"] = MAX_CONTENT_LENGTH + # 6. Handle legacy GCF Python 3.7 behavior + if os.environ.get("ENTRY_POINT"): + os.environ["FUNCTION_TRIGGER_TYPE"] = signature_type + os.environ["FUNCTION_NAME"] = os.environ.get("K_SERVICE", target) + app.make_response_original = app.make_response + + def handle_none(rv): + if rv is None: + rv = "OK" + return app.make_response_original(rv) + + app.make_response = handle_none + # Extract the target function from the source file try: function = getattr(source_module, target) diff --git a/tests/test_functions.py b/tests/test_functions.py index c6eccb91..1aba0b4e 100644 --- a/tests/test_functions.py +++ b/tests/test_functions.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import os import pathlib import re import time @@ -455,3 +456,32 @@ def test_class_in_main_is_in_right_module(): resp = client.get("/") assert resp.status_code == 200 + + +def test_legacy_function_check_env(): + source = TEST_FUNCTIONS_DIR / "http_check_env" / "main.py" + target = "function" + + os.environ["ENTRY_POINT"] = target + + client = create_app(target, source).test_client() + resp = client.post("/", json={"mode": "FUNCTION_TRIGGER_TYPE"}) + assert resp.status_code == 200 + assert resp.data == b"http" + + resp = client.post("/", json={"mode": "FUNCTION_NAME"}) + assert resp.status_code == 200 + assert resp.data == b"function" + + +def test_legacy_function_returns_none(): + source = TEST_FUNCTIONS_DIR / "returns_none" / "main.py" + target = "function" + + os.environ["ENTRY_POINT"] = target + + client = create_app(target, source).test_client() + resp = client.get("/") + + assert resp.status_code == 200 + assert resp.data == b"OK" diff --git a/tests/test_functions/returns_none/main.py b/tests/test_functions/returns_none/main.py new file mode 100644 index 00000000..636ea575 --- /dev/null +++ b/tests/test_functions/returns_none/main.py @@ -0,0 +1,29 @@ +# Copyright 2020 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Function used in Worker tests of handling HTTP functions.""" + + +def function(request): + """Test HTTP function when using legacy GCF behavior. + + The function returns None, which should be a 200 response. + + Args: + request: The HTTP request which triggered this function. + + Returns: + None. + """ + return None From 706c4d2fe2f60b09855ee18f4e68eb6035910786 Mon Sep 17 00:00:00 2001 From: asriniva <69502+asriniva@users.noreply.github.com> Date: Wed, 12 Aug 2020 00:27:29 +0000 Subject: [PATCH 2/3] Add test --- tests/test_functions.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/test_functions.py b/tests/test_functions.py index 1aba0b4e..fad33441 100644 --- a/tests/test_functions.py +++ b/tests/test_functions.py @@ -458,6 +458,16 @@ def test_class_in_main_is_in_right_module(): assert resp.status_code == 200 +def test_function_returns_none(): + source = TEST_FUNCTIONS_DIR / "returns_none" / "main.py" + target = "function" + + client = create_app(target, source).test_client() + resp = client.get("/") + + assert resp.status_code == 500 + + def test_legacy_function_check_env(): source = TEST_FUNCTIONS_DIR / "http_check_env" / "main.py" target = "function" From bf600ac835c5a716b336c618af1f78d019b7b249 Mon Sep 17 00:00:00 2001 From: asriniva <69502+asriniva@users.noreply.github.com> Date: Mon, 17 Aug 2020 23:14:09 +0000 Subject: [PATCH 3/3] Modify tests --- tests/test_functions.py | 10 +++++----- tests/test_functions/returns_none/main.py | 2 -- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/tests/test_functions.py b/tests/test_functions.py index fad33441..4698049e 100644 --- a/tests/test_functions.py +++ b/tests/test_functions.py @@ -468,11 +468,11 @@ def test_function_returns_none(): assert resp.status_code == 500 -def test_legacy_function_check_env(): +def test_legacy_function_check_env(monkeypatch): source = TEST_FUNCTIONS_DIR / "http_check_env" / "main.py" target = "function" - os.environ["ENTRY_POINT"] = target + monkeypatch.setenv("ENTRY_POINT", target) client = create_app(target, source).test_client() resp = client.post("/", json={"mode": "FUNCTION_TRIGGER_TYPE"}) @@ -481,14 +481,14 @@ def test_legacy_function_check_env(): resp = client.post("/", json={"mode": "FUNCTION_NAME"}) assert resp.status_code == 200 - assert resp.data == b"function" + assert resp.data.decode("utf-8") == target -def test_legacy_function_returns_none(): +def test_legacy_function_returns_none(monkeypatch): source = TEST_FUNCTIONS_DIR / "returns_none" / "main.py" target = "function" - os.environ["ENTRY_POINT"] = target + monkeypatch.setenv("ENTRY_POINT", target) client = create_app(target, source).test_client() resp = client.get("/") diff --git a/tests/test_functions/returns_none/main.py b/tests/test_functions/returns_none/main.py index 636ea575..f6a4acaa 100644 --- a/tests/test_functions/returns_none/main.py +++ b/tests/test_functions/returns_none/main.py @@ -12,8 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Function used in Worker tests of handling HTTP functions.""" - def function(request): """Test HTTP function when using legacy GCF behavior.