From 22e9244b1636d5db5eafa1f30ae16ad8dece43fb Mon Sep 17 00:00:00 2001 From: Dan Willemsen Date: Mon, 3 Dec 2018 15:56:10 -0800 Subject: [PATCH] Add par_test This test adds a number of checks for the visible python state inside a hermetic par file. Test: build/soong/python/tests/runtests.sh Change-Id: I7188d862a309a09623169e1f967bde86707d41af --- python/tests/Android.bp | 32 ++++++++++++++++++++ python/tests/par_test.py | 50 ++++++++++++++++++++++++++++++++ python/tests/runtest.sh | 39 +++++++++++++++++++++++++ python/tests/testpkg/par_test.py | 37 +++++++++++++++++++++++ 4 files changed, 158 insertions(+) create mode 100644 python/tests/Android.bp create mode 100644 python/tests/par_test.py create mode 100755 python/tests/runtest.sh create mode 100644 python/tests/testpkg/par_test.py diff --git a/python/tests/Android.bp b/python/tests/Android.bp new file mode 100644 index 000000000..1f4305c41 --- /dev/null +++ b/python/tests/Android.bp @@ -0,0 +1,32 @@ +// Copyright 2019 Google Inc. 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. + +python_test_host { + name: "par_test", + main: "par_test.py", + srcs: [ + "par_test.py", + "testpkg/par_test.py", + ], + + version: { + py2: { + enabled: true, + embedded_launcher: true, + }, + py3: { + enabled: false, + }, + }, +} diff --git a/python/tests/par_test.py b/python/tests/par_test.py new file mode 100644 index 000000000..1fafe0f82 --- /dev/null +++ b/python/tests/par_test.py @@ -0,0 +1,50 @@ +# Copyright 2019 Google Inc. 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. + +import os +import site +import sys + +# This file checks the visible python state against expected values when run +# inside a hermetic par file. + +failed = False +def assert_equal(what, a, b): + global failed + if a != b: + print("Expected %s('%s') == '%s'" % (what, a, b)) + failed = True + +assert_equal("__name__", __name__, "__main__") +assert_equal("os.path.basename(__file__)", os.path.basename(__file__), "par_test.py") + +archive = os.path.dirname(__file__) + +assert_equal("__package__", __package__, "") +assert_equal("sys.argv[0]", sys.argv[0], archive) +assert_equal("sys.executable", sys.executable, None) +assert_equal("sys.exec_prefix", sys.exec_prefix, archive) +assert_equal("sys.prefix", sys.prefix, archive) +assert_equal("__loader__.archive", __loader__.archive, archive) +assert_equal("site.ENABLE_USER_SITE", site.ENABLE_USER_SITE, None) + +assert_equal("len(sys.path)", len(sys.path), 3) +assert_equal("sys.path[0]", sys.path[0], archive) +assert_equal("sys.path[1]", sys.path[1], os.path.join(archive, "internal")) +assert_equal("sys.path[2]", sys.path[2], os.path.join(archive, "internal", "stdlib")) + +if failed: + sys.exit(1) + +import testpkg.par_test diff --git a/python/tests/runtest.sh b/python/tests/runtest.sh new file mode 100755 index 000000000..a319558ff --- /dev/null +++ b/python/tests/runtest.sh @@ -0,0 +1,39 @@ +#!/bin/bash -e +# +# Copyright 2019 Google Inc. 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. + +# +# This is just a helper to run the tests under a few different environments +# + +if [ -z $ANDROID_HOST_OUT ]; then + echo "Must be run after running lunch" + exit 1 +fi + +if [ ! -f $ANDROID_HOST_OUT/nativetest64/par_test/par_test ]; then + echo "Run 'm par_test' first" + exit 1 +fi + +export LD_LIBRARY_PATH=$ANDROID_HOST_OUT/lib64 + +set -x + +PYTHONHOME= PYTHONPATH= $ANDROID_HOST_OUT/nativetest64/par_test/par_test +PYTHONHOME=/usr $ANDROID_HOST_OUT/nativetest64/par_test/par_test +PYTHONPATH=/usr $ANDROID_HOST_OUT/nativetest64/par_test/par_test + +echo "Passed!" diff --git a/python/tests/testpkg/par_test.py b/python/tests/testpkg/par_test.py new file mode 100644 index 000000000..22dd09564 --- /dev/null +++ b/python/tests/testpkg/par_test.py @@ -0,0 +1,37 @@ +# Copyright 2018 Google Inc. 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. + +import os +import sys + +# This file checks the visible python state against expected values when run +# inside a hermetic par file. + +failed = False +def assert_equal(what, a, b): + global failed + if a != b: + print("Expected %s('%s') == '%s'" % (what, a, b)) + failed = True + +archive = sys.modules["__main__"].__loader__.archive + +assert_equal("__name__", __name__, "testpkg.par_test") +assert_equal("__file__", __file__, os.path.join(archive, "testpkg/par_test.py")) +assert_equal("__package__", __package__, "testpkg") +assert_equal("__loader__.archive", __loader__.archive, archive) +assert_equal("__loader__.prefix", __loader__.prefix, "testpkg/") + +if failed: + sys.exit(1)