#!/usr/bin/env python3
#
# 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 random
from acts.base_test import BaseTestClass

CONSERVATIVE_MAX_ATTEN_VALUE = 10
MIN_ATTEN_VALUE = 0


class AttenuatorSanityTest(BaseTestClass):
    def __init__(self, controllers):
        BaseTestClass.__init__(self, controllers)
        self.tests = ("test_attenuator_validation",
                      "test_attenuator_get_max_value", )
        self.number_of_iteration = 2

    def test_attenuator_validation(self):
        """Validate attenuator set and get APIs works fine.
        """
        for atten in self.attenuators:
            self.log.info("Attenuator: {}".format(atten))
            try:
                atten_max_value = atten.get_max_atten()
            except ValueError as e:
                self.log.error(e)
                self.log.info("Using conservative max value.")
                atten_max_value = CONSERVATIVE_MAX_ATTEN_VALUE

            atten_value_list = [MIN_ATTEN_VALUE, atten_max_value]
            for i in range(0, self.number_of_iteration):
                atten_value_list.append(
                    int(random.uniform(0, atten_max_value)))

            for atten_val in atten_value_list:
                self.log.info("Set atten to {}".format(atten_val))
                atten.set_atten(atten_val)
                current_atten = int(atten.get_atten())
                self.log.info("Current atten = {}".format(current_atten))
                assert atten_val == current_atten, "Setting attenuator failed."

        return True

    def test_attenuator_get_max_value(self):
        """Validate attenuator get_max_atten APIs works fine.
        """
        for atten in self.attenuators:
            try:
                atten_max_value = atten.get_max_atten()
            except ValueError as e:
                self.log.error(e)
                return False
        return True
