testrunner/env.py - Run from any directory

env.py will calculate ANDROID_BUILD_TOP relative to where its located,
if it wasn't already set.

This enables 'run_build_test_target' to successfully run even if
build/envsetup.sh was not run first.

(also rename env.py's members to have the private naming convention,
as they are not meant to be exposed to other modules)

Change-Id: I236c6005d56fa1a155c6eb104936e3e010a169de
diff --git a/test/testrunner/env.py b/test/testrunner/env.py
index 46244a4..f5e2a61 100644
--- a/test/testrunner/env.py
+++ b/test/testrunner/env.py
@@ -17,10 +17,10 @@
 import tempfile
 import subprocess
 
-env = dict(os.environ)
+_env = dict(os.environ)
 
-def getEnvBoolean(var, default):
-  val = env.get(var)
+def _getEnvBoolean(var, default):
+  val = _env.get(var)
   if val:
     if val == "True" or val == "true":
       return True
@@ -35,7 +35,7 @@
                         'HOST_OUT_EXECUTABLES']
 _DUMP_MANY_VARS = None  # To be set to a dictionary with above list being the keys,
                         # and the build variable being the value.
-def dump_many_vars(var_name):
+def _dump_many_vars(var_name):
   """
   Reach into the Android build system to dump many build vars simultaneously.
   Since the make system is so slow, we want to avoid calling into build frequently.
@@ -74,142 +74,159 @@
 
   return _DUMP_MANY_VARS[var_name]
 
-def get_build_var(var_name):
-  return dump_many_vars(var_name)
+def _get_build_var(var_name):
+  return _dump_many_vars(var_name)
 
 def get_env(key):
-  return env.get(key)
+  return _env.get(key)
 
-ANDROID_BUILD_TOP = env.get('ANDROID_BUILD_TOP', os.getcwd())
+def _get_android_build_top():
+  path_to_top = _env.get('ANDROID_BUILD_TOP')
+  if not path_to_top:
+    # nothing set. try to guess it based on the relative path of this env.py file.
+    this_file_path = os.path.realpath(__file__)
+    path_to_top = os.path.join(os.path.dirname(this_file_path), '../../../')
+    path_to_top = os.path.realpath(path_to_top)
+
+  if not os.path.exists(os.path.join(path_to_top, 'build/envsetup.sh')):
+    raise AssertionError("env.py must be located inside an android source tree")
+
+  return path_to_top
+
+ANDROID_BUILD_TOP = _get_android_build_top()
 
 # Directory used for temporary test files on the host.
 ART_HOST_TEST_DIR = tempfile.mkdtemp(prefix = 'test-art-')
 
 # Keep going after encountering a test failure?
-ART_TEST_KEEP_GOING = getEnvBoolean('ART_TEST_KEEP_GOING', True)
+ART_TEST_KEEP_GOING = _getEnvBoolean('ART_TEST_KEEP_GOING', True)
 
 # Do you want all tests, even those that are time consuming?
-ART_TEST_FULL = getEnvBoolean('ART_TEST_FULL', False)
+ART_TEST_FULL = _getEnvBoolean('ART_TEST_FULL', False)
 
 # Do you want interpreter tests run?
-ART_TEST_INTERPRETER = getEnvBoolean('ART_TEST_INTERPRETER', ART_TEST_FULL)
-ART_TEST_INTERPRETER_ACCESS_CHECKS = getEnvBoolean('ART_TEST_INTERPRETER_ACCESS_CHECKS',
+ART_TEST_INTERPRETER = _getEnvBoolean('ART_TEST_INTERPRETER', ART_TEST_FULL)
+ART_TEST_INTERPRETER_ACCESS_CHECKS = _getEnvBoolean('ART_TEST_INTERPRETER_ACCESS_CHECKS',
                                                    ART_TEST_FULL)
 
 # Do you want JIT tests run?
-ART_TEST_JIT = getEnvBoolean('ART_TEST_JIT', ART_TEST_FULL)
+ART_TEST_JIT = _getEnvBoolean('ART_TEST_JIT', ART_TEST_FULL)
 
 # Do you want optimizing compiler tests run?
-ART_TEST_OPTIMIZING = getEnvBoolean('ART_TEST_OPTIMIZING', ART_TEST_FULL)
+ART_TEST_OPTIMIZING = _getEnvBoolean('ART_TEST_OPTIMIZING', ART_TEST_FULL)
 
 # Do you want to test the optimizing compiler with graph coloring register allocation?
-ART_TEST_OPTIMIZING_GRAPH_COLOR = getEnvBoolean('ART_TEST_OPTIMIZING_GRAPH_COLOR', ART_TEST_FULL)
+ART_TEST_OPTIMIZING_GRAPH_COLOR = _getEnvBoolean('ART_TEST_OPTIMIZING_GRAPH_COLOR', ART_TEST_FULL)
 
 # Do you want to do run-tests with profiles?
-ART_TEST_SPEED_PROFILE = getEnvBoolean('ART_TEST_SPEED_PROFILE', ART_TEST_FULL)
+ART_TEST_SPEED_PROFILE = _getEnvBoolean('ART_TEST_SPEED_PROFILE', ART_TEST_FULL)
 
 # Do we want to test PIC-compiled tests ("apps")?
-ART_TEST_PIC_TEST = getEnvBoolean('ART_TEST_PIC_TEST', ART_TEST_FULL)
+ART_TEST_PIC_TEST = _getEnvBoolean('ART_TEST_PIC_TEST', ART_TEST_FULL)
 # Do you want tracing tests run?
-ART_TEST_TRACE = getEnvBoolean('ART_TEST_TRACE', ART_TEST_FULL)
+ART_TEST_TRACE = _getEnvBoolean('ART_TEST_TRACE', ART_TEST_FULL)
 
 # Do you want tracing tests (streaming mode) run?
-ART_TEST_TRACE_STREAM = getEnvBoolean('ART_TEST_TRACE_STREAM', ART_TEST_FULL)
+ART_TEST_TRACE_STREAM = _getEnvBoolean('ART_TEST_TRACE_STREAM', ART_TEST_FULL)
 
 # Do you want tests with GC verification enabled run?
-ART_TEST_GC_VERIFY = getEnvBoolean('ART_TEST_GC_VERIFY', ART_TEST_FULL)
+ART_TEST_GC_VERIFY = _getEnvBoolean('ART_TEST_GC_VERIFY', ART_TEST_FULL)
 
 # Do you want tests with the GC stress mode enabled run?
-ART_TEST_GC_STRESS = getEnvBoolean('ART_TEST_GC_STRESS', ART_TEST_FULL)
+ART_TEST_GC_STRESS = _getEnvBoolean('ART_TEST_GC_STRESS', ART_TEST_FULL)
 
 # Do you want tests with the JNI forcecopy mode enabled run?
-ART_TEST_JNI_FORCECOPY = getEnvBoolean('ART_TEST_JNI_FORCECOPY', ART_TEST_FULL)
+ART_TEST_JNI_FORCECOPY = _getEnvBoolean('ART_TEST_JNI_FORCECOPY', ART_TEST_FULL)
 
 # Do you want run-tests with relocation disabled run?
-ART_TEST_RUN_TEST_RELOCATE = getEnvBoolean('ART_TEST_RUN_TEST_RELOCATE', ART_TEST_FULL)
+ART_TEST_RUN_TEST_RELOCATE = _getEnvBoolean('ART_TEST_RUN_TEST_RELOCATE', ART_TEST_FULL)
 
 # Do you want run-tests with prebuilding?
-ART_TEST_RUN_TEST_PREBUILD = getEnvBoolean('ART_TEST_RUN_TEST_PREBUILD', ART_TEST_FULL)
+ART_TEST_RUN_TEST_PREBUILD = _getEnvBoolean('ART_TEST_RUN_TEST_PREBUILD', ART_TEST_FULL)
 
 # Do you want run-tests with no prebuilding enabled run?
-ART_TEST_RUN_TEST_NO_PREBUILD = getEnvBoolean('ART_TEST_RUN_TEST_NO_PREBUILD', ART_TEST_FULL)
+ART_TEST_RUN_TEST_NO_PREBUILD = _getEnvBoolean('ART_TEST_RUN_TEST_NO_PREBUILD', ART_TEST_FULL)
 
 # Do you want run-tests with a pregenerated core.art?
-ART_TEST_RUN_TEST_IMAGE = getEnvBoolean('ART_TEST_RUN_TEST_IMAGE', ART_TEST_FULL)
+ART_TEST_RUN_TEST_IMAGE = _getEnvBoolean('ART_TEST_RUN_TEST_IMAGE', ART_TEST_FULL)
 
 # Do you want run-tests without a pregenerated core.art?
-ART_TEST_RUN_TEST_NO_IMAGE = getEnvBoolean('ART_TEST_RUN_TEST_NO_IMAGE', ART_TEST_FULL)
+ART_TEST_RUN_TEST_NO_IMAGE = _getEnvBoolean('ART_TEST_RUN_TEST_NO_IMAGE', ART_TEST_FULL)
 
 # Do you want run-tests with relocation enabled but patchoat failing?
-ART_TEST_RUN_TEST_RELOCATE_NO_PATCHOAT = getEnvBoolean('ART_TEST_RUN_TEST_RELOCATE_NO_PATCHOAT',
+ART_TEST_RUN_TEST_RELOCATE_NO_PATCHOAT = _getEnvBoolean('ART_TEST_RUN_TEST_RELOCATE_NO_PATCHOAT',
                                                        ART_TEST_FULL)
 
 # Do you want run-tests without a dex2oat?
-ART_TEST_RUN_TEST_NO_DEX2OAT = getEnvBoolean('ART_TEST_RUN_TEST_NO_DEX2OAT', ART_TEST_FULL)
+ART_TEST_RUN_TEST_NO_DEX2OAT = _getEnvBoolean('ART_TEST_RUN_TEST_NO_DEX2OAT', ART_TEST_FULL)
 
 # Do you want run-tests with libartd.so?
-ART_TEST_RUN_TEST_DEBUG = getEnvBoolean('ART_TEST_RUN_TEST_DEBUG', ART_TEST_FULL)
+ART_TEST_RUN_TEST_DEBUG = _getEnvBoolean('ART_TEST_RUN_TEST_DEBUG', ART_TEST_FULL)
 
 # Do you want run-tests with libart.so?
-ART_TEST_RUN_TEST_NDEBUG = getEnvBoolean('ART_TEST_RUN_TEST_NDEBUG', ART_TEST_FULL)
+ART_TEST_RUN_TEST_NDEBUG = _getEnvBoolean('ART_TEST_RUN_TEST_NDEBUG', ART_TEST_FULL)
 
 # Do you want failed tests to have their artifacts cleaned up?
-ART_TEST_RUN_TEST_ALWAYS_CLEAN = getEnvBoolean('ART_TEST_RUN_TEST_ALWAYS_CLEAN', True)
+ART_TEST_RUN_TEST_ALWAYS_CLEAN = _getEnvBoolean('ART_TEST_RUN_TEST_ALWAYS_CLEAN', True)
 
 # Do you want run-tests with the --debuggable flag
-ART_TEST_RUN_TEST_DEBUGGABLE = getEnvBoolean('ART_TEST_RUN_TEST_DEBUGGABLE', ART_TEST_FULL)
+ART_TEST_RUN_TEST_DEBUGGABLE = _getEnvBoolean('ART_TEST_RUN_TEST_DEBUGGABLE', ART_TEST_FULL)
 
 # Do you want to test multi-part boot-image functionality?
-ART_TEST_RUN_TEST_MULTI_IMAGE = getEnvBoolean('ART_TEST_RUN_TEST_MULTI_IMAGE', ART_TEST_FULL)
+ART_TEST_RUN_TEST_MULTI_IMAGE = _getEnvBoolean('ART_TEST_RUN_TEST_MULTI_IMAGE', ART_TEST_FULL)
 
-ART_TEST_DEBUG_GC = getEnvBoolean('ART_TEST_DEBUG_GC', False)
+ART_TEST_DEBUG_GC = _getEnvBoolean('ART_TEST_DEBUG_GC', False)
 
-ART_TEST_BISECTION = getEnvBoolean('ART_TEST_BISECTION', False)
+ART_TEST_BISECTION = _getEnvBoolean('ART_TEST_BISECTION', False)
 
-DEX2OAT_HOST_INSTRUCTION_SET_FEATURES = env.get('DEX2OAT_HOST_INSTRUCTION_SET_FEATURES')
+DEX2OAT_HOST_INSTRUCTION_SET_FEATURES = _env.get('DEX2OAT_HOST_INSTRUCTION_SET_FEATURES')
 
 # Do you want run-tests with the host/target's second arch?
-ART_TEST_RUN_TEST_2ND_ARCH = getEnvBoolean('ART_TEST_RUN_TEST_2ND_ARCH', True)
+ART_TEST_RUN_TEST_2ND_ARCH = _getEnvBoolean('ART_TEST_RUN_TEST_2ND_ARCH', True)
 
-HOST_2ND_ARCH_PREFIX = get_build_var('HOST_2ND_ARCH_PREFIX')
-HOST_2ND_ARCH_PREFIX_DEX2OAT_HOST_INSTRUCTION_SET_FEATURES = env.get(
+HOST_2ND_ARCH_PREFIX = _get_build_var('HOST_2ND_ARCH_PREFIX')
+HOST_2ND_ARCH_PREFIX_DEX2OAT_HOST_INSTRUCTION_SET_FEATURES = _env.get(
   HOST_2ND_ARCH_PREFIX + 'DEX2OAT_HOST_INSTRUCTION_SET_FEATURES')
 
-ART_TEST_ANDROID_ROOT = env.get('ART_TEST_ANDROID_ROOT')
+ART_TEST_ANDROID_ROOT = _env.get('ART_TEST_ANDROID_ROOT')
 
-ART_TEST_WITH_STRACE = getEnvBoolean('ART_TEST_DEBUG_GC', False)
+ART_TEST_WITH_STRACE = _getEnvBoolean('ART_TEST_DEBUG_GC', False)
 
-EXTRA_DISABLED_TESTS = set(env.get("ART_TEST_RUN_TEST_SKIP", "").split())
+EXTRA_DISABLED_TESTS = set(_env.get("ART_TEST_RUN_TEST_SKIP", "").split())
 
-ART_TEST_RUN_TEST_BUILD = getEnvBoolean('ART_TEST_RUN_TEST_BUILD', False)
+ART_TEST_RUN_TEST_BUILD = _getEnvBoolean('ART_TEST_RUN_TEST_BUILD', False)
 
-TARGET_2ND_ARCH = get_build_var('TARGET_2ND_ARCH')
-TARGET_ARCH = get_build_var('TARGET_ARCH')
+TARGET_2ND_ARCH = _get_build_var('TARGET_2ND_ARCH')
+TARGET_ARCH = _get_build_var('TARGET_ARCH')
+
+# Note: ART_2ND_PHONY_TEST_TARGET_SUFFIX is 2ND_ART_PHONY_TEST_TARGET_SUFFIX in .mk files
+# Note: ART_2ND_PHONY_TEST_HOST_SUFFIX is 2ND_ART_PHONY_HOST_TARGET_SUFFIX in .mk files
+# Python does not let us have variable names starting with a digit, so it has differ.
 if TARGET_2ND_ARCH:
   if "64" in TARGET_ARCH:
     ART_PHONY_TEST_TARGET_SUFFIX = "64"
-    _2ND_ART_PHONY_TEST_TARGET_SUFFIX = "32"
+    ART_2ND_PHONY_TEST_TARGET_SUFFIX = "32"
   else:
     ART_PHONY_TEST_TARGET_SUFFIX = "32"
-    _2ND_ART_PHONY_TEST_TARGET_SUFFIX = ""
+    ART_2ND_PHONY_TEST_TARGET_SUFFIX = ""
 else:
   if "64" in TARGET_ARCH:
     ART_PHONY_TEST_TARGET_SUFFIX = "64"
-    _2ND_ART_PHONY_TEST_TARGET_SUFFIX = ""
+    ART_2ND_PHONY_TEST_TARGET_SUFFIX = ""
   else:
     ART_PHONY_TEST_TARGET_SUFFIX = "32"
-    _2ND_ART_PHONY_TEST_TARGET_SUFFIX = ""
+    ART_2ND_PHONY_TEST_TARGET_SUFFIX = ""
 
-HOST_PREFER_32_BIT = get_build_var('HOST_PREFER_32_BIT')
+HOST_PREFER_32_BIT = _get_build_var('HOST_PREFER_32_BIT')
 if HOST_PREFER_32_BIT == "true":
   ART_PHONY_TEST_HOST_SUFFIX = "32"
-  _2ND_ART_PHONY_TEST_HOST_SUFFIX = ""
+  ART_2ND_PHONY_TEST_HOST_SUFFIX = ""
 else:
   ART_PHONY_TEST_HOST_SUFFIX = "64"
-  _2ND_ART_PHONY_TEST_HOST_SUFFIX = "32"
+  ART_2ND_PHONY_TEST_HOST_SUFFIX = "32"
 
 HOST_OUT_EXECUTABLES = os.path.join(ANDROID_BUILD_TOP,
-                                    get_build_var("HOST_OUT_EXECUTABLES"))
+                                    _get_build_var("HOST_OUT_EXECUTABLES"))
 os.environ['JACK'] = HOST_OUT_EXECUTABLES + '/jack'
 os.environ['DX'] = HOST_OUT_EXECUTABLES + '/dx'
 os.environ['SMALI'] = HOST_OUT_EXECUTABLES + '/smali'
diff --git a/test/testrunner/testrunner.py b/test/testrunner/testrunner.py
index 6a8b0ae..5d3687e 100755
--- a/test/testrunner/testrunner.py
+++ b/test/testrunner/testrunner.py
@@ -256,8 +256,8 @@
     ADDRESS_SIZES_TARGET['target'].add(env.ART_PHONY_TEST_TARGET_SUFFIX)
     ADDRESS_SIZES_TARGET['host'].add(env.ART_PHONY_TEST_HOST_SUFFIX)
     if env.ART_TEST_RUN_TEST_2ND_ARCH:
-      ADDRESS_SIZES_TARGET['host'].add(env._2ND_ART_PHONY_TEST_HOST_SUFFIX)
-      ADDRESS_SIZES_TARGET['target'].add(env._2ND_ART_PHONY_TEST_TARGET_SUFFIX)
+      ADDRESS_SIZES_TARGET['host'].add(env.ART_2ND_PHONY_TEST_HOST_SUFFIX)
+      ADDRESS_SIZES_TARGET['target'].add(env.ART_2ND_PHONY_TEST_TARGET_SUFFIX)
   else:
     ADDRESS_SIZES_TARGET['host'] = ADDRESS_SIZES_TARGET['host'].union(ADDRESS_SIZES)
     ADDRESS_SIZES_TARGET['target'] = ADDRESS_SIZES_TARGET['target'].union(ADDRESS_SIZES)