Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: add back python 2.7 for gcloud usage only #892

Merged
merged 8 commits into from
Oct 21, 2021
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
fix: add app engine app and fix noxfile
arithmetic1728 committed Oct 20, 2021
commit f71a06802c8215961bc5722ef580bc894db50887
19 changes: 17 additions & 2 deletions system_tests/noxfile.py
Original file line number Diff line number Diff line change
@@ -394,8 +394,23 @@ def external_accounts(session):
)


@nox.session(python=PYTHON_VERSIONS_SYNC)
def downscoping(session):
@nox.session(python=["2.7"])
def downscoping_27(session):
session.install(
*TEST_DEPENDENCIES_SYNC,
"enum34",
"google-auth",
"google-cloud-storage",
)
default(
session,
"system_tests_sync/test_downscoping.py",
*session.posargs,
)


@nox.session(python=["3.7"])
def downscoping_37(session):
session.install(
*TEST_DEPENDENCIES_SYNC,
"google-auth",
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
lib
12 changes: 12 additions & 0 deletions system_tests/system_tests_sync/app_engine_test_app/app.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
api_version: 1
service: google-auth-system-tests
runtime: python27
threadsafe: true

handlers:
- url: .*
script: main.app

libraries:
- name: ssl
version: 2.7.11
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# Copyright 2016 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.

from google.appengine.ext import vendor

# Add any libraries installed in the "lib" folder.
vendor.add("lib")


# Patch os.path.expanduser. This should be fixed in GAE
# versions released after Nov 2016.
import os.path


def patched_expanduser(path):
return path


os.path.expanduser = patched_expanduser
129 changes: 129 additions & 0 deletions system_tests/system_tests_sync/app_engine_test_app/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
# Copyright 2016 Google LLC All Rights Reserved.
#
# 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.

"""App Engine standard application that runs basic system tests for
google.auth.app_engine.
This application has to run tests manually instead of using pytest because
pytest currently doesn't work on App Engine standard.
"""

import contextlib
import json
import sys
from StringIO import StringIO
import traceback

from google.appengine.api import app_identity
import google.auth
from google.auth import _helpers
from google.auth import app_engine
import google.auth.transport.urllib3
import urllib3.contrib.appengine
import webapp2

FAILED_TEST_TMPL = """
Test {} failed: {}
Stacktrace:
{}
Captured output:
{}
"""
TOKEN_INFO_URL = "https://www.googleapis.com/oauth2/v3/tokeninfo"
EMAIL_SCOPE = "https://www.googleapis.com/auth/userinfo.email"
HTTP = urllib3.contrib.appengine.AppEngineManager()
HTTP_REQUEST = google.auth.transport.urllib3.Request(HTTP)


def test_credentials():
credentials = app_engine.Credentials()
scoped_credentials = credentials.with_scopes([EMAIL_SCOPE])

scoped_credentials.refresh(None)

assert scoped_credentials.valid
assert scoped_credentials.token is not None

# Get token info and verify scope
url = _helpers.update_query(
TOKEN_INFO_URL, {"access_token": scoped_credentials.token}
)
response = HTTP_REQUEST(url=url, method="GET")
token_info = json.loads(response.data.decode("utf-8"))

assert token_info["scope"] == EMAIL_SCOPE


def test_default():
credentials, project_id = google.auth.default()

assert isinstance(credentials, app_engine.Credentials)
assert project_id == app_identity.get_application_id()


@contextlib.contextmanager
def capture():
"""Context manager that captures stderr and stdout."""
oldout, olderr = sys.stdout, sys.stderr
try:
out = StringIO()
sys.stdout, sys.stderr = out, out
yield out
finally:
sys.stdout, sys.stderr = oldout, olderr


def run_test_func(func):
with capture() as capsys:
try:
func()
return True, ""
except Exception as exc:
output = FAILED_TEST_TMPL.format(
func.func_name, exc, traceback.format_exc(), capsys.getvalue()
)
return False, output


def run_tests():
"""Runs all tests.
Returns:
Tuple[bool, str]: A tuple containing True if all tests pass, False
otherwise, and any captured output from the tests.
"""
status = True
output = ""

tests = (test_credentials, test_default)

for test in tests:
test_status, test_output = run_test_func(test)
status = status and test_status
output += test_output

return status, output


class MainHandler(webapp2.RequestHandler):
def get(self):
self.response.headers["content-type"] = "text/plain"

status, output = run_tests()

if not status:
self.response.status = 500

self.response.write(output)


app = webapp2.WSGIApplication([("/", MainHandler)], debug=True)
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
urllib3
# Relative path to google-auth-python's source.
../../..
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Copyright 2016 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.

import os

TEST_APP_URL = os.environ["TEST_APP_URL"]


def test_live_application(http_request):
response = http_request(method="GET", url=TEST_APP_URL)
assert response.status == 200, response.data.decode("utf-8")