# -*- coding: utf-8 -*-
# Copyright 2016 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.

"""Test cros_generate_os_release."""

from __future__ import print_function

import os
import sys

from chromite.lib import cros_build_lib
from chromite.lib import cros_test_lib
from chromite.lib import osutils
from chromite.scripts import cros_generate_os_release


assert sys.version_info >= (3, 6), 'This module requires Python 3.6+'


class CrosGenerateOsReleaseTest(cros_test_lib.TempDirTestCase):
  """Tests GenerateOsRelease."""

  def setUp(self):
    # Use a fresh tempdir as the root for each test case.
    self.osrelease = os.path.join(self.tempdir, 'etc', 'os-release')
    self.osreleased = os.path.join(self.tempdir, 'etc', 'os-release.d')
    osutils.SafeMakedirs(self.osreleased)

  def testOnlyOsRelease(self):
    """Tests the script without /etc/os-release."""
    osutils.WriteFile(os.path.join(self.osreleased, 'TEST'), 'hello')
    cros_generate_os_release.GenerateOsRelease(self.tempdir)
    self.assertEqual('TEST=hello\n', osutils.ReadFile(self.osrelease))

  def testOnlyOsReleaseD(self):
    """Tests the script without /etc/os-release.d."""
    osutils.RmDir(self.osreleased)
    osutils.WriteFile(self.osrelease, 'TEST=bonjour\n')

    cros_generate_os_release.GenerateOsRelease(self.tempdir)
    self.assertEqual('TEST=bonjour\n', osutils.ReadFile(self.osrelease))

  def testFailOnDuplicate(self):
    """Tests with a field set both in os-release and os-release.d/."""
    osutils.WriteFile(os.path.join(self.osreleased, 'TEST'), 'hello')
    osutils.WriteFile(self.osrelease, 'TEST=bonjour')

    self.assertRaises(cros_build_lib.DieSystemExit,
                      cros_generate_os_release.GenerateOsRelease, self.tempdir)

  def testNormal(self):
    """Normal scenario: both os-release and os-release.d are present."""
    osutils.WriteFile(os.path.join(self.osreleased, 'TEST1'), 'hello')
    osutils.WriteFile(self.osrelease, 'TEST2=bonjour')

    default_params = {'TEST1': 'hello2',
                      'TEST3': 'hola'}

    cros_generate_os_release.GenerateOsRelease(self.tempdir,
                                               default_params=default_params)
    output = osutils.ReadFile(self.osrelease).splitlines()
    output.sort()
    self.assertEqual(['TEST1=hello',
                      'TEST2=bonjour',
                      'TEST3=hola'],
                     output)
