# Copyright 2019 Google LLC
#
# 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
#
#     https://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 unittest

from . import test_utils
from edgetpu.basic import edgetpu_utils
from edgetpu.basic.basic_engine import BasicEngine


class EdgeTpuUtilsTest(unittest.TestCase):

  def testRuntimeVersion(self):
    self.assertEqual(edgetpu_utils.SUPPORTED_RUNTIME_VERSION,
                     edgetpu_utils.GetRuntimeVersion())

  def testListEdgeTpuPaths(self):
    num_all = len(
        edgetpu_utils.ListEdgeTpuPaths(edgetpu_utils.EDGE_TPU_STATE_NONE))
    unused_engine = BasicEngine(
        test_utils.TestDataPath('mobilenet_v1_1.0_224_quant.tflite'))
    num_assigned = len(
        edgetpu_utils.ListEdgeTpuPaths(edgetpu_utils.EDGE_TPU_STATE_ASSIGNED))
    self.assertEqual(num_assigned, 1)
    num_available = len(
        edgetpu_utils.ListEdgeTpuPaths(edgetpu_utils.EDGE_TPU_STATE_UNASSIGNED))
    self.assertEqual(num_available, num_all - 1)

  def testUseAllEdgeTpu(self):
    available_tpus = edgetpu_utils.ListEdgeTpuPaths(
        edgetpu_utils.EDGE_TPU_STATE_UNASSIGNED)
    recorded_tpus = []
    engine_list = []
    for _ in available_tpus:
      engine = BasicEngine(
          test_utils.TestDataPath('mobilenet_v1_1.0_224_quant.tflite'))
      recorded_tpus.append(engine.device_path())
      engine_list.append(engine)

    remaining_tpus = edgetpu_utils.ListEdgeTpuPaths(
        edgetpu_utils.EDGE_TPU_STATE_UNASSIGNED)
    self.assertEqual(0, len(remaining_tpus))
    self.assertTupleEqual(tuple(recorded_tpus), available_tpus)
