#
# 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 re
import logging
from vts.utils.python.os import path_utils
from vts.testcases.kernel.ltp import ltp_enums
from vts.testcases.kernel.ltp import ltp_configs
class TestCase(object):
"""Stores name, path, and param information for each test case.
All class initiation inputs are assumed to be already validated by
test case parser.
Attributes:
testsuite: string, name of testsuite to which the testcase belongs
testname: string, name of the test case
command: string, the command to run the test case
_args: list of string, test case command line arguments
requirement_state: RequirementState, enum representing requirement
check results
note: string, a place to store additional note for the test case
such as what environment requirement did not satisfy.
is_staging: bool, whether test case is a staging test
is_filtered: bool, whether test case is excluded by filter
"""
def __init__(self, testsuite, testname, command):
self.testsuite = testsuite
self.testname = testname
self._command = command
self.requirement_state = ltp_enums.RequirementState.UNCHECKED
self.note = ""
self.is_staging = False
self.is_filtered = False
@property
def note(self):
"""Get the note"""
return self._note
@note.setter
def note(self, note):
"""Set the note"""
self._note = note
@property
def requirement_state(self):
"""Get the requirement state"""
return self._requirement_state
@requirement_state.setter
def requirement_state(self, requirement_state):
"""Set the requirement state"""
self._requirement_state = requirement_state
@property
def testsuite(self):
"""Get the test suite's name."""
return self._testsuite
@testsuite.setter
def testsuite(self, testsuite):
"""Set the test suite's name."""
self._testsuite = testsuite
@property
def testname(self):
"""Get the test case's name."""
return self._testname
@testname.setter
def testname(self, testname):
"""Set the test case's name."""
self._testname = testname
def InternalAddLtpPathToCommand(self, command):
"""Internal function to change binary in commands to their full path"""
tokens = command.strip().split()
# If not ltp executables:
if (tokens[0] in ltp_configs.INTERNAL_BINS or
tokens[0] in ltp_configs.INTERNAL_SHELL_COMMANDS or
tokens[0].find('=') > 0):
return command
else: # Is Ltp executable
tokens[0] = path_utils.JoinTargetPath(ltp_configs.LTPBINPATH,
tokens[0])
return ' '.join(tokens)
def GetCommand(self):
"""Get test case's command.
Get the test case's command where ltp test binary names have been
replaced with their full paths
"""
return '&&'.join((self.InternalAddLtpPathToCommand(command)
for command in self._command.split('&&')))
def InternalGetExecutableNames(self):
"""Get a generator of all required executable file names"""
executables = (command.strip().split()[0]
for command in self._command.split('&&'))
# In some test definitions there were command starting with
# > TDsrc='mktemp ...'. We use regex to remove quotes
pattern = re.compile('[\'|\"]')
return (pattern.sub('', executable.split('=')[1])
if executable.find('=') > 0 else executable
for executable in executables)
def GetRequiredExecutablePaths(self, ltp_bin_path=ltp_configs.LTPBINPATH):
"""Get required executables' paths.
Returns:
A list of all executables' paths that will be needed
by its command. For LTP's executables, absolute path will be
returned. For binaries in system's PATH, only the name will be
returned.
"""
return [path_utils.JoinTargetPath(ltp_bin_path, executable)
if executable not in ltp_configs.INTERNAL_BINS else executable
for executable in self.InternalGetExecutableNames()
if executable not in ltp_configs.INTERNAL_SHELL_COMMANDS]
@property
def fullname(self):
"""Return full test name in <testsuite-testname> format"""
return "%s.%s" % (self.testsuite, self.testname)
def __str__(self):
return self.fullname
@property
def is_staging(self):
'''Whether this test is a staging test.'''
return self._is_staging
@is_staging.setter
def is_staging(self, is_staging):
'''Set whether this test is a staging test.'''
self._is_staging = is_staging
@property
def is_filtered(self):
'''Whether this test has been filtered out.'''
return self._is_filtered
@is_filtered.setter
def is_filtered(self, is_filtered):
'''Set whether this test has been filtered out.'''
self._is_filtered = is_filtered