普通文本  |  183行  |  5.24 KB

#
# 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