# Copyright 2016 The ChromiumOS Authors
# 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."""

import os

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


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

    def setUp(self) -> None:
        # 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) -> None:
        """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) -> None:
        """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) -> None:
        """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) -> None:
        """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)

    def testDefaultsOnly(self) -> None:
        """Test we always emit defaults even without any os-release.d frags."""
        osutils.RmDir(self.osreleased)
        cros_generate_os_release.GenerateOsRelease(self.tempdir, {"FOO": "bar"})
        self.assertExists(self.osrelease)
        self.assertEqual("FOO=bar\n", osutils.ReadFile(self.osrelease))
