1e5c31af7Sopenharmony_ci# -*- coding: utf-8 -*- 2e5c31af7Sopenharmony_ci 3e5c31af7Sopenharmony_ci#------------------------------------------------------------------------- 4e5c31af7Sopenharmony_ci# Vulkan CTS 5e5c31af7Sopenharmony_ci# ---------- 6e5c31af7Sopenharmony_ci# 7e5c31af7Sopenharmony_ci# Copyright (c) 2016 Google Inc. 8e5c31af7Sopenharmony_ci# 9e5c31af7Sopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License"); 10e5c31af7Sopenharmony_ci# you may not use this file except in compliance with the License. 11e5c31af7Sopenharmony_ci# You may obtain a copy of the License at 12e5c31af7Sopenharmony_ci# 13e5c31af7Sopenharmony_ci# http://www.apache.org/licenses/LICENSE-2.0 14e5c31af7Sopenharmony_ci# 15e5c31af7Sopenharmony_ci# Unless required by applicable law or agreed to in writing, software 16e5c31af7Sopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS, 17e5c31af7Sopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18e5c31af7Sopenharmony_ci# See the License for the specific language governing permissions and 19e5c31af7Sopenharmony_ci# limitations under the License. 20e5c31af7Sopenharmony_ci# 21e5c31af7Sopenharmony_ci#------------------------------------------------------------------------- 22e5c31af7Sopenharmony_ci 23e5c31af7Sopenharmony_ciimport os 24e5c31af7Sopenharmony_ciimport sys 25e5c31af7Sopenharmony_ci 26e5c31af7Sopenharmony_cisys.path.append(os.path.join(os.path.dirname(__file__), "..", "log")) 27e5c31af7Sopenharmony_cisys.path.append(os.path.join(os.path.dirname(__file__), "..", "build")) 28e5c31af7Sopenharmony_ci 29e5c31af7Sopenharmony_cifrom common import readFile 30e5c31af7Sopenharmony_cifrom message import * 31e5c31af7Sopenharmony_cifrom log_parser import StatusCode, BatchResultParser 32e5c31af7Sopenharmony_ci 33e5c31af7Sopenharmony_ciALLOWED_STATUS_CODES = set([ 34e5c31af7Sopenharmony_ci StatusCode.PASS, 35e5c31af7Sopenharmony_ci StatusCode.NOT_SUPPORTED, 36e5c31af7Sopenharmony_ci StatusCode.QUALITY_WARNING, 37e5c31af7Sopenharmony_ci StatusCode.COMPATIBILITY_WARNING 38e5c31af7Sopenharmony_ci ]) 39e5c31af7Sopenharmony_ci 40e5c31af7Sopenharmony_cidef readMustpass (filename): 41e5c31af7Sopenharmony_ci f = open(filename, 'rt') 42e5c31af7Sopenharmony_ci cases = [] 43e5c31af7Sopenharmony_ci for line in f: 44e5c31af7Sopenharmony_ci s = line.strip() 45e5c31af7Sopenharmony_ci if len(s) > 0: 46e5c31af7Sopenharmony_ci cases.append(s) 47e5c31af7Sopenharmony_ci return cases 48e5c31af7Sopenharmony_ci 49e5c31af7Sopenharmony_cidef readTestLog (filename): 50e5c31af7Sopenharmony_ci parser = BatchResultParser() 51e5c31af7Sopenharmony_ci return parser.parseFile(filename) 52e5c31af7Sopenharmony_ci 53e5c31af7Sopenharmony_cidef verifyTestLog (filename, mustpass): 54e5c31af7Sopenharmony_ci results = readTestLog(filename) 55e5c31af7Sopenharmony_ci messages = [] 56e5c31af7Sopenharmony_ci resultOrderOk = True 57e5c31af7Sopenharmony_ci 58e5c31af7Sopenharmony_ci # Mustpass case names must be unique 59e5c31af7Sopenharmony_ci assert len(mustpass) == len(set(mustpass)) 60e5c31af7Sopenharmony_ci 61e5c31af7Sopenharmony_ci # Verify number of results 62e5c31af7Sopenharmony_ci if len(results) != len(mustpass): 63e5c31af7Sopenharmony_ci messages.append(error(filename, "Wrong number of test results, expected %d, found %d" % (len(mustpass), len(results)))) 64e5c31af7Sopenharmony_ci 65e5c31af7Sopenharmony_ci caseNameToResultNdx = {} 66e5c31af7Sopenharmony_ci for ndx in range(len(results)): 67e5c31af7Sopenharmony_ci result = results[ndx] 68e5c31af7Sopenharmony_ci if not result in caseNameToResultNdx: 69e5c31af7Sopenharmony_ci caseNameToResultNdx[result.name] = ndx 70e5c31af7Sopenharmony_ci else: 71e5c31af7Sopenharmony_ci messages.append(error(filename, "Multiple results for " + result.name)) 72e5c31af7Sopenharmony_ci 73e5c31af7Sopenharmony_ci # Verify that all results are present and valid 74e5c31af7Sopenharmony_ci for ndx in range(len(mustpass)): 75e5c31af7Sopenharmony_ci caseName = mustpass[ndx] 76e5c31af7Sopenharmony_ci 77e5c31af7Sopenharmony_ci if caseName in caseNameToResultNdx: 78e5c31af7Sopenharmony_ci resultNdx = caseNameToResultNdx[caseName] 79e5c31af7Sopenharmony_ci result = results[resultNdx] 80e5c31af7Sopenharmony_ci 81e5c31af7Sopenharmony_ci if resultNdx != ndx: 82e5c31af7Sopenharmony_ci resultOrderOk = False 83e5c31af7Sopenharmony_ci 84e5c31af7Sopenharmony_ci if not result.statusCode in ALLOWED_STATUS_CODES: 85e5c31af7Sopenharmony_ci messages.append(error(filename, result.name + ": " + result.statusCode)) 86e5c31af7Sopenharmony_ci else: 87e5c31af7Sopenharmony_ci messages.append(error(filename, "Missing result for " + caseName)) 88e5c31af7Sopenharmony_ci 89e5c31af7Sopenharmony_ci if len(results) == len(mustpass) and not resultOrderOk: 90e5c31af7Sopenharmony_ci messages.append(error(filename, "Results are not in the expected order")) 91e5c31af7Sopenharmony_ci 92e5c31af7Sopenharmony_ci return messages 93e5c31af7Sopenharmony_ci 94e5c31af7Sopenharmony_cidef beginsWith (str, prefix): 95e5c31af7Sopenharmony_ci return str[:len(prefix)] == prefix 96e5c31af7Sopenharmony_ci 97e5c31af7Sopenharmony_cidef verifyStatement (package): 98e5c31af7Sopenharmony_ci messages = [] 99e5c31af7Sopenharmony_ci 100e5c31af7Sopenharmony_ci if package.statement != None: 101e5c31af7Sopenharmony_ci statementPath = os.path.join(package.basePath, package.statement) 102e5c31af7Sopenharmony_ci statement = readFile(statementPath) 103e5c31af7Sopenharmony_ci hasVersion = False 104e5c31af7Sopenharmony_ci hasProduct = False 105e5c31af7Sopenharmony_ci hasCpu = False 106e5c31af7Sopenharmony_ci hasOs = False 107e5c31af7Sopenharmony_ci 108e5c31af7Sopenharmony_ci for line in statement.splitlines(): 109e5c31af7Sopenharmony_ci if beginsWith(line, "CONFORM_VERSION:"): 110e5c31af7Sopenharmony_ci if hasVersion: 111e5c31af7Sopenharmony_ci messages.append(error(statementPath, "Multiple CONFORM_VERSIONs")) 112e5c31af7Sopenharmony_ci else: 113e5c31af7Sopenharmony_ci assert len(line.split()) >= 2 114e5c31af7Sopenharmony_ci package.conformVersion = line.split()[1] 115e5c31af7Sopenharmony_ci hasVersion = True 116e5c31af7Sopenharmony_ci elif beginsWith(line, "PRODUCT:"): 117e5c31af7Sopenharmony_ci hasProduct = True # Multiple products allowed 118e5c31af7Sopenharmony_ci elif beginsWith(line, "CPU:"): 119e5c31af7Sopenharmony_ci if hasCpu: 120e5c31af7Sopenharmony_ci messages.append(error(statementPath, "Multiple PRODUCTs")) 121e5c31af7Sopenharmony_ci else: 122e5c31af7Sopenharmony_ci hasCpu = True 123e5c31af7Sopenharmony_ci elif beginsWith(line, "OS:"): 124e5c31af7Sopenharmony_ci if hasOs: 125e5c31af7Sopenharmony_ci messages.append(error(statementPath, "Multiple OSes")) 126e5c31af7Sopenharmony_ci else: 127e5c31af7Sopenharmony_ci assert len(line.split()) >= 2 128e5c31af7Sopenharmony_ci package.conformOs = line.split()[1] 129e5c31af7Sopenharmony_ci hasOs = True 130e5c31af7Sopenharmony_ci 131e5c31af7Sopenharmony_ci if not hasVersion: 132e5c31af7Sopenharmony_ci messages.append(error(statementPath, "No CONFORM_VERSION")) 133e5c31af7Sopenharmony_ci if not hasProduct: 134e5c31af7Sopenharmony_ci messages.append(error(statementPath, "No PRODUCT")) 135e5c31af7Sopenharmony_ci if not hasCpu: 136e5c31af7Sopenharmony_ci messages.append(error(statementPath, "No CPU")) 137e5c31af7Sopenharmony_ci if not hasOs: 138e5c31af7Sopenharmony_ci messages.append(error(statementPath, "No OS")) 139e5c31af7Sopenharmony_ci else: 140e5c31af7Sopenharmony_ci messages.append(error(package.basePath, "Missing conformance statement file")) 141e5c31af7Sopenharmony_ci 142e5c31af7Sopenharmony_ci return messages 143e5c31af7Sopenharmony_ci 144e5c31af7Sopenharmony_cidef verifyGitStatus (package): 145e5c31af7Sopenharmony_ci messages = [] 146e5c31af7Sopenharmony_ci 147e5c31af7Sopenharmony_ci if len(package.gitStatus) > 0: 148e5c31af7Sopenharmony_ci for s in package.gitStatus: 149e5c31af7Sopenharmony_ci statusPath = os.path.join(package.basePath, s) 150e5c31af7Sopenharmony_ci status = readFile(statusPath) 151e5c31af7Sopenharmony_ci 152e5c31af7Sopenharmony_ci if status.find("nothing to commit, working directory clean") < 0 and status.find("nothing to commit, working tree clean") < 0: 153e5c31af7Sopenharmony_ci messages.append(error(package.basePath, "Working directory is not clean")) 154e5c31af7Sopenharmony_ci else: 155e5c31af7Sopenharmony_ci messages.append(error(package.basePath, "Missing git status files")) 156e5c31af7Sopenharmony_ci 157e5c31af7Sopenharmony_ci return messages 158e5c31af7Sopenharmony_ci 159e5c31af7Sopenharmony_cidef isGitLogEmpty (package, gitLog): 160e5c31af7Sopenharmony_ci logPath = os.path.join(package.basePath, gitLog) 161e5c31af7Sopenharmony_ci log = readFile(logPath) 162e5c31af7Sopenharmony_ci 163e5c31af7Sopenharmony_ci return len(log.strip()) == 0 164e5c31af7Sopenharmony_ci 165e5c31af7Sopenharmony_cidef verifyGitLog (package): 166e5c31af7Sopenharmony_ci messages = [] 167e5c31af7Sopenharmony_ci 168e5c31af7Sopenharmony_ci if len(package.gitLog) > 0: 169e5c31af7Sopenharmony_ci for log, path in package.gitLog: 170e5c31af7Sopenharmony_ci if not isGitLogEmpty(package, log): 171e5c31af7Sopenharmony_ci messages.append(warning(os.path.join(package.basePath, log), "Log is not empty")) 172e5c31af7Sopenharmony_ci else: 173e5c31af7Sopenharmony_ci messages.append(error(package.basePath, "Missing git log files")) 174e5c31af7Sopenharmony_ci 175e5c31af7Sopenharmony_ci return messages 176e5c31af7Sopenharmony_ci 177e5c31af7Sopenharmony_cidef verifyPatches (package): 178e5c31af7Sopenharmony_ci messages = [] 179e5c31af7Sopenharmony_ci hasPatches = len(package.patches) 180e5c31af7Sopenharmony_ci logEmpty = True 181e5c31af7Sopenharmony_ci for log, path in package.gitLog: 182e5c31af7Sopenharmony_ci logEmpty &= isGitLogEmpty(package, log) 183e5c31af7Sopenharmony_ci 184e5c31af7Sopenharmony_ci if hasPatches and logEmpty: 185e5c31af7Sopenharmony_ci messages.append(error(package.basePath, "Package includes patches but log is empty")) 186e5c31af7Sopenharmony_ci elif not hasPatches and not logEmpty: 187e5c31af7Sopenharmony_ci messages.append(error(package.basePath, "Test log is not empty but package doesn't contain patches")) 188e5c31af7Sopenharmony_ci 189e5c31af7Sopenharmony_ci return messages 190