# # Copyright (C) 2016 The Android Open Source Project # # 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 types import threading import re import logging from vts.runners.host import const from vts.testcases.kernel.ltp.shell_environment import shell_commands class ShellEnvironment(object): '''Class for executing environment definition classes and do cleanup jobs. Attributes: shell: shell mirror object, shell to execute commands _cleanup_jobs: set of CheckSetupCleanup objects, a set used to store clean up jobs if requested. _thread_lock: a threading.Lock object ''' def __init__(self, shell): self.shell = shell self._cleanup_jobs = [] self._thread_lock = threading.Lock() def Cleanup(self): '''Final cleanup jobs. Will run all the stored cleanup jobs''' return all([method(*args) for method, args in self._cleanup_jobs]) def AddCleanupJob(self, method, *args): '''Add a clean up job for final cleanup''' if (method, args) not in self._cleanup_jobs: self._cleanup_jobs.append((method, args)) @property def shell(self): '''returns an object that can execute a shell command''' return self._shell @shell.setter def shell(self, shell): self._shell = shell def ExecuteDefinitions(self, definitions): '''Execute a given list of environment check definitions''' self._thread_lock.acquire() if not isinstance(definitions, types.ListType): definitions = [definitions] for definition in definitions: definition.context = self if not definition.Execute(): self._thread_lock.release() return (False, definition.GetNote()) self._thread_lock.release() return (True, "") def GetDeviceNumberOfPresentCpu(self): '''Get the number of available CPUs on target device''' results = self.shell.Execute('cat %s' % shell_commands.FILEPATH_CPU_PRESENT) if (not results or results[const.EXIT_CODE][0] or not results[const.STDOUT][0]): logging.error("Cannot get number of working CPU info." "\n Command results: {}".format(results)) return 1 else: cpu_info = results[const.STDOUT][0].strip() m = re.match("[0-9]+-?[0-9]*", cpu_info) if m and m.span() == (0, len(cpu_info)): logging.info("spam" + str(m.span())) try: return int(cpu_info.split('-')[-1]) + 1 except Exception as e: logging.error(e) logging.error("Cannot parse number of working CPU info." "\n CPU info: '{}'".format(cpu_info)) return 1