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