#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright 2018 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# pylint: disable=module-missing-docstring,class-missing-docstring

from __future__ import print_function

import json
import os

import cros_config_test_schema
import libcros_schema

from chromite.lib import cros_test_lib
from chromite.lib import osutils


BASIC_CONFIG = """
mosys-base: &mosys_base_cmds
    name: 'mosys'
    args:
      - 'platform id'
      - 'platform name'
nautilus-mosys-base: &nautilus_mosys_cmds
    name: 'mosys'
    args:
      - 'platform version'
cros-config-base: &cros_config_base_cmds
    name: 'cros-config'
    args:
      - '/ brand-name'
cros-config-lte: &cros_config_lte_cmds
    name: 'cros-config'
    args:
      - '/arc/build-properties device'
chromeos:
  devices:
    - device-name: 'nautilus'
      command-groups:
        - *mosys_base_cmds
        - *nautilus_mosys_cmds
        - *cros_config_base_cmds
    - device-name: 'nautiluslte'
      command-groups:
        - *mosys_base_cmds
        - *nautilus_mosys_cmds
        - *cros_config_base_cmds
        - *cros_config_lte_cmds
"""

this_dir = os.path.dirname(__file__)


class ParseArgsTests(cros_test_lib.TestCase):

  def testParseArgs(self):
    argv = ['-s', 'schema', '-c', 'config', '-f', 'nautilus', '-o', 'output']
    opts = cros_config_test_schema.ParseArgs(argv)
    self.assertEqual(opts.schema, 'schema')
    self.assertEqual(opts.config, 'config')
    self.assertEqual(opts.filter, 'nautilus')
    self.assertEqual(opts.output, 'output')


class TransformConfigTests(cros_test_lib.TestCase):

  def testBasicTransform(self):
    result = cros_config_test_schema.TransformConfig(BASIC_CONFIG)
    json_dict = json.loads(result)
    self.assertEqual(1, len(json_dict))

    json_obj = libcros_schema.GetNamedTuple(json_dict)
    self.assertEqual(2, len(json_obj.chromeos.devices))

    device = json_obj.chromeos.devices[0]
    self.assertEqual('nautilus', device.device_name)
    self.assertEqual(3, len(device.command_groups))

    device = json_obj.chromeos.devices[1]
    self.assertEqual('nautiluslte', device.device_name)
    self.assertEqual(4, len(device.command_groups))

  def testTransformConfig_NoMatch(self):
    result = cros_config_test_schema.TransformConfig(
        BASIC_CONFIG, device_filter='abc123')
    json_dict = json.loads(result)
    json_obj = libcros_schema.GetNamedTuple(json_dict)
    self.assertEqual(0, len(json_obj.chromeos.devices))

  def testTransformConfig_FilterMatch(self):
    result = cros_config_test_schema.TransformConfig(
        BASIC_CONFIG, device_filter='nautilus')
    json_dict = json.loads(result)
    json_obj = libcros_schema.GetNamedTuple(json_dict)
    self.assertEqual(1, len(json_obj.chromeos.devices))
    device = json_obj.chromeos.devices[0]
    self.assertEqual('nautilus', device.device_name)
    self.assertEqual(3, len(device.command_groups))


class MainTests(cros_test_lib.TempDirTestCase):

  def testMainImportNoFilter(self):
    output = os.path.join(self.tempdir, 'output.json')
    cros_config_test_schema.Start(
        os.path.join(this_dir, 'test_data/cros_config_test_device.yaml'),
        None,
        output,
        None)
    json_dict = json.loads(osutils.ReadFile(output))
    json_obj = libcros_schema.GetNamedTuple(json_dict)
    self.assertEqual(2, len(json_obj.chromeos.devices))

    device = json_obj.chromeos.devices[0]
    self.assertEqual('nautilus', device.device_name)
    self.assertEqual(3, len(device.command_groups))

    device = json_obj.chromeos.devices[1]
    self.assertEqual('nautiluslte', device.device_name)
    self.assertEqual(4, len(device.command_groups))

  def testMainImportFilterNautilus(self):
    output = os.path.join(self.tempdir, 'output.json')
    cros_config_test_schema.Start(
        os.path.join(this_dir, 'test_data/cros_config_test_device.yaml'),
        'nautilus',
        output,
        None)
    json_dict = json.loads(osutils.ReadFile(output))
    json_obj = libcros_schema.GetNamedTuple(json_dict)
    self.assertEqual(1, len(json_obj.chromeos.devices))

    device = json_obj.chromeos.devices[0]
    self.assertEqual('nautilus', device.device_name)
    self.assertEqual(3, len(device.command_groups))

  def testMainImportFilterNautilusLte(self):
    output = os.path.join(self.tempdir, 'output.json')
    cros_config_test_schema.Start(
        os.path.join(this_dir, 'test_data/cros_config_test_device.yaml'),
        'nautiluslte',
        output,
        None)
    json_dict = json.loads(osutils.ReadFile(output))
    json_obj = libcros_schema.GetNamedTuple(json_dict)
    self.assertEqual(1, len(json_obj.chromeos.devices))

    device = json_obj.chromeos.devices[0]
    self.assertEqual('nautiluslte', device.device_name)
    self.assertEqual(4, len(device.command_groups))


if __name__ == '__main__':
  cros_test_lib.main(module=__name__)
