117 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			117 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Python
		
	
	
	
# Copyright 2022 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
 | 
						|
#
 | 
						|
#     https://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
 | 
						|
import logging
 | 
						|
import argparse
 | 
						|
import subprocess
 | 
						|
 | 
						|
from re import sub
 | 
						|
from pathlib import Path
 | 
						|
from genericpath import exists
 | 
						|
from multiprocessing import Process
 | 
						|
 | 
						|
ANDROID_BUILD_TOP = os.getenv("ANDROID_BUILD_TOP")
 | 
						|
TARGET_PRODUCT = os.getenv("TARGET_PRODUCT")
 | 
						|
TARGET_BUILD_VARIANT = os.getenv("TARGET_BUILD_VARIANT")
 | 
						|
ANDROID_PRODUCT_OUT = os.getenv("ANDROID_PRODUCT_OUT")
 | 
						|
PANDORA_CF_APK = Path(
 | 
						|
    f'{ANDROID_BUILD_TOP}/out/target/product/vsoc_x86_64/testcases/PandoraServer/x86_64/PandoraServer.apk'
 | 
						|
)
 | 
						|
 | 
						|
 | 
						|
def build_pandora_server():
 | 
						|
  target = TARGET_PRODUCT if TARGET_BUILD_VARIANT == "release" else f'{TARGET_PRODUCT}-{TARGET_BUILD_VARIANT}'
 | 
						|
  logging.debug(f'build_pandora_server: {target}')
 | 
						|
  pandora_server_cmd = f'source build/envsetup.sh && lunch {target} && make PandoraServer'
 | 
						|
  subprocess.run(pandora_server_cmd,
 | 
						|
                 cwd=ANDROID_BUILD_TOP,
 | 
						|
                 shell=True,
 | 
						|
                 executable='/bin/bash',
 | 
						|
                 check=True)
 | 
						|
 | 
						|
 | 
						|
def install_pandora_server(serial):
 | 
						|
  logging.debug('Install PandoraServer.apk')
 | 
						|
  pandora_apk_path = Path(
 | 
						|
      f'{ANDROID_PRODUCT_OUT}/testcases/PandoraServer/x86_64/PandoraServer.apk')
 | 
						|
  if not pandora_apk_path.exists():
 | 
						|
    logging.error(
 | 
						|
        f"PandoraServer apk is not build or the path is wrong: {pandora_apk_path}"
 | 
						|
    )
 | 
						|
    sys.exit(1)
 | 
						|
  install_apk_cmd = ['adb', 'install', '-r', '-g', str(pandora_apk_path)]
 | 
						|
  if args.serial != "":
 | 
						|
    install_apk_cmd.append(f'-s {serial}')
 | 
						|
  subprocess.run(install_apk_cmd, check=True)
 | 
						|
 | 
						|
 | 
						|
def instrument_pandora_server():
 | 
						|
  logging.debug('instrument_pandora_server')
 | 
						|
  instrument_cmd = 'adb shell am instrument --no-hidden-api-checks -w com.android.pandora/.Main'
 | 
						|
  instrument_process = Process(
 | 
						|
      target=lambda: subprocess.run(instrument_cmd, shell=True, check=True))
 | 
						|
  instrument_process.start()
 | 
						|
  return instrument_process
 | 
						|
 | 
						|
 | 
						|
def run_test(args):
 | 
						|
  logging.debug(f'run_test config: {args.config} test: {args.test}')
 | 
						|
  test_cmd = ['python3', args.test, '-c', args.config]
 | 
						|
  if args.verbose:
 | 
						|
    test_cmd.append('--verbose')
 | 
						|
  test_cmd.extend(args.mobly_args)
 | 
						|
  p = subprocess.Popen(test_cmd)
 | 
						|
  p.wait(timeout=args.timeout)
 | 
						|
  p.terminate()
 | 
						|
 | 
						|
 | 
						|
def run(args):
 | 
						|
  if not PANDORA_CF_APK.exists() or args.build:
 | 
						|
    build_pandora_server()
 | 
						|
  install_pandora_server(args.serial)
 | 
						|
  instrument_process = instrument_pandora_server()
 | 
						|
  run_test(args)
 | 
						|
  instrument_process.terminate()
 | 
						|
 | 
						|
 | 
						|
if __name__ == '__main__':
 | 
						|
  parser = argparse.ArgumentParser()
 | 
						|
  parser.add_argument("test", type=str, help="Test script path")
 | 
						|
  parser.add_argument("config", type=str, help="Test config file path")
 | 
						|
  parser.add_argument("-b",
 | 
						|
                      "--build",
 | 
						|
                      action="store_true",
 | 
						|
                      help="Build the PandoraServer.apk")
 | 
						|
  parser.add_argument("-s",
 | 
						|
                      "--serial",
 | 
						|
                      type=str,
 | 
						|
                      default="",
 | 
						|
                      help="Use device with given serial")
 | 
						|
  parser.add_argument("-m",
 | 
						|
                      "--timeout",
 | 
						|
                      type=int,
 | 
						|
                      default=1800000,
 | 
						|
                      help="Mobly test timeout")
 | 
						|
  parser.add_argument("-v",
 | 
						|
                      "--verbose",
 | 
						|
                      action="store_true",
 | 
						|
                      help="Set console logger level to DEBUG")
 | 
						|
  parser.add_argument("mobly_args", nargs='*')
 | 
						|
  args = parser.parse_args()
 | 
						|
  console_level = logging.DEBUG if args.verbose else logging.INFO
 | 
						|
  logging.basicConfig(level=console_level)
 | 
						|
  run(args)
 |