blob: b39f86701fac2e5382e03ebe8181c507103c0b8f [file] [log] [blame]
#
# Copyright (C) 2017 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 logging
import sys
from vts.proto import ComponentSpecificationMessage_pb2 as CompSpecMsg
def PbEnum2PyValue(var):
"""Converts VariableSecificationMessage (Enum) to Python value.
Args:
var: VariableSpecificationMessage to convert.
Returns:
a converted value.
"""
return getattr(var.scalar_value, var.scalar_type)
def PbMask2PyValue(var):
"""Converts VariableSecificationMessage (Mask) to Python value.
Args:
var: VariableSpecificationMessage to convert.
Returns:
a converted value.
"""
return getattr(var.scalar_value, var.scalar_type)
def PbScalar2PyValue(var):
"""Converts VariableSecificationMessage (Scalar) to Python value.
Args:
message: VariableSpecificationMessage to convert.
Returns:
Converted scalar value.
"""
return getattr(var.scalar_value, var.scalar_type)
def PbString2PyString(var):
"""Converts VTS VariableSecificationMessage (String) to Python string.
Args:
var: VariableSpecificationMessage to convert.
Returns:
Converted string.
"""
return var.string_value.message
def PbVector2PyList(var):
"""Converts VariableSecificationMessage (Vector) to a Python list.
Args:
var: VariableSpecificationMessage to convert.
Returns:
A converted list if valid, None otherwise.
"""
result = []
for curr_value in var.vector_value:
if curr_value.type == CompSpecMsg.TYPE_SCALAR:
result.append(PbScalar2PyValue(curr_value))
elif curr_value.type == CompSpecMsg.TYPE_STRUCT:
result.append(PbStruct2PyDict(curr_value))
else:
logging.error("unsupported type %s", curr_value.type)
return None
return result
def PbArray2PyList(var):
"""Converts VariableSecificationMessage (Array) to a Python list.
Args:
var: VariableSpecificationMessage to convert.
Returns:
A converted list if valid, None otherwise
"""
result = []
for curr_value in var.vector_value:
if curr_value.type == CompSpecMsg.TYPE_SCALAR:
result.append(PbScalar2PyValue(curr_value))
elif curr_value.type == CompSpecMsg.TYPE_STRUCT:
result.append(PbStruct2PyDict(curr_value))
else:
logging.error("unsupported type %s", curr_value.type)
return None
return result
def PbStruct2PyDict(var):
"""Converts VariableSecificationMessage (struct) to Python dict.
Args:
var: VariableSpecificationMessage to convert.
Returns:
a dict, containing the converted data if valid. None otherwise.
"""
result = {}
for attr in var.struct_value:
if attr.type == CompSpecMsg.TYPE_ENUM:
result[attr.name] = PbEnum2PyValue(attr)
elif attr.type == CompSpecMsg.TYPE_SCALAR:
result[attr.name] = PbScalar2PyValue(attr)
elif attr.type == CompSpecMsg.TYPE_STRING:
result[attr.name] = PbString2PyString(attr)
elif attr.type == CompSpecMsg.TYPE_VECTOR:
result[attr.name] = PbVector2PyList(attr)
elif attr.type == CompSpecMsg.TYPE_STRUCT:
result[attr.name] = PbStruct2PyDict(attr)
elif attr.type == CompSpecMsg.TYPE_Array:
result[attr.name] = PbArray2PyList(attr)
else:
logging.error("PyDict2PbStruct: unsupported type %s",
attr.type)
return None
return result
def PbPredefined2PyValue(var):
"""Converts VariableSecificationMessage (PREDEFINED_TYPE) to Python value.
Args:
var: VariableSpecificationMessage to convert.
Returns:
a converted value.
"""
return var.predefined_type
def Convert(var):
"""Converts VariableSecificationMessage to Python native data structure.
Args:
var: VariableSpecificationMessage of a target variable to convert.
Returns:
A list containing the converted Python values if valid. None otherwise.
"""
if var.type == CompSpecMsg.TYPE_PREDEFINED:
return PbPredefined2PyValue(var)
elif var.type == CompSpecMsg.TYPE_SCALAR:
return PbScalar2PyValue(var)
elif var.type == CompSpecMsg.TYPE_VECTOR:
return PbVector2PyList(var)
elif var.type == CompSpecMsg.TYPE_STRUCT:
return PbStruct2PyDict(var)
elif var.type == CompSpecMsg.TYPE_ENUM:
return PbEnum2PyValue(var)
elif var.type == CompSpecMsg.TYPE_STRING:
return PbString2PyString(var)
elif var.type == CompSpecMsg.TYPE_MASK:
return PbMask2PyValue(var)
else:
logging.error("Got unsupported callback arg type %s" % var.type)
return None
return message