# 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.

"""Unittests for virtualenv_wrapper"""

import os
import sys

from chromite.lib import cros_test_lib
from chromite.scripts import virtualenv_wrapper


_MODULE_DIR = os.path.dirname(os.path.realpath(__file__))


class VirtualEnvTest(cros_test_lib.TestCase):
    """Test that we are running in a virtualenv."""

    # pylint: disable=protected-access

    def testModuleIsFromVenv(self):
        """Test that we import |six| from the virtualenv."""
        # Note: The |six| module is chosen somewhat arbitrarily, but it happens
        # to be provided inside the chromite virtualenv.
        six = __import__("six")
        req_path = os.path.dirname(os.path.realpath(six.__file__))
        self.assertIn("/.cache/cros_venv/", req_path)

    def testInsideVenv(self):
        """Test that we are inside a virtualenv."""
        # pylint: disable=protected-access
        self.assertTrue(
            (
                hasattr(sys, "real_prefix")
                or (
                    hasattr(sys, "base_prefix")
                    and sys.base_prefix != sys.prefix
                )
            )
        )

    def testVenvMarkers(self):
        """Test that the virtualenv marker functions work."""
        # pylint: disable=protected-access
        test_env = {"PATH": "/bin:/usr/bin"}
        self.assertFalse(virtualenv_wrapper._IsInsideVenv(test_env))
        new_test_env = virtualenv_wrapper._CreateVenvEnvironment(test_env)
        self.assertTrue(virtualenv_wrapper._IsInsideVenv(new_test_env))

    def testCreateVenvEnvironmentNoSideEffect(self):
        """Test that _CreateVenvEnvironment doesn't modify input dict."""
        # pylint: disable=protected-access
        test_env = {"PATH": "/bin:/usr/bin"}
        original = test_env.copy()
        virtualenv_wrapper._CreateVenvEnvironment(test_env)
        self.assertEqual(test_env, original)
