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

from __future__ import absolute_import
from __future__ import print_function
from __future__ import unicode_literals

import os
import unittest

from cros_venv import testcases
from cros_venv import venvlib


class VenvTestCase(unittest.TestCase):

    """TestCase for venvlib."""

    def test__PACKAGE_DIR(self):
        """Test that _PACKAGE_DIR exists."""
        self.assertTrue(os.path.isdir(venvlib._PACKAGE_DIR))

    def test__iter_equal(self):
        """Test when _iter_equal() is True."""
        self.assertTrue(venvlib._iter_equal(
            iter(['foo', 'bar']),
            iter(['foo', 'bar']),
        ))

    def test__iter_equal_wrong_length(self):
        """Test when _iter_equal() is False due to length."""
        self.assertFalse(venvlib._iter_equal(
            iter(['foo', 'bar', 'baz']),
            iter(['foo', 'bar']),
        ))

    def test__iter_equal_fill_with_None(self):
        """Test that _iter_equal() is True due to filling with None."""
        self.assertTrue(venvlib._iter_equal(
            iter(['foo', 'bar', None]),
            iter(['foo', 'bar']),
        ))

    def test__iter_equal_wrong_value(self):
        """Test when _iter_equal() is False due to value."""
        self.assertFalse(venvlib._iter_equal(
            iter(['foo', 'baz']),
            iter(['foo', 'bar']),
        ))


class VenvTmpDirTestCase(testcases.TmpdirTestCase):

    """TestCase for venvlib that uses a temp directory."""

    def test__makedirs_exist_ok(self):
        """Test _makedirs_exist_ok() ignores existing dir."""
        os.mkdir('foo')
        try:
            venvlib._makedirs_exist_ok('foo')
        except OSError:
            self.fail('OSError raised')

    def test__reqs_up_to_date(self):
        """Test _reqs_up_to_date()."""
        venv = venvlib.Venv('.', 'reqs.txt')
        os.makedirs('lib/python2.7/site-packages')
        with open('reqs.txt', 'w') as f:
            f.write('mir.qualia==1.2.3\n')
        with open('.installed.txt', 'w') as f:
            f.write('mir.qualia==1.2.3\n')
        self.assertTrue(venv._reqs_up_to_date())

    def test__reqs_up_to_date_missing(self):
        """Test _reqs_up_to_date() with missing installed reqs."""
        venv = venvlib.Venv('.', 'reqs.txt')
        self.assertFalse(venv._reqs_up_to_date())

    def test__reqs_up_to_date_different(self):
        """Test _reqs_up_to_date() with different installed reqs."""
        venv = venvlib.Venv('.', 'reqs.txt')
        os.makedirs('lib/python2.7/site-packages')
        with open('reqs.txt', 'w') as f:
            f.write('mir.qualia==1.2.4\n')
        with open('.installed.txt', 'w') as f:
            f.write('mir.qualia==1.2.3\n')
        self.assertFalse(venv._reqs_up_to_date())

    def test__venv_initialized(self):
        """Test _venv_initialized()."""
        venv = venvlib.Venv('.', 'reqs.txt')
        os.makedirs('bin')
        with open('bin/python', 'wb') as f:
            f.write(b'python binary')
        self.assertTrue(venv._venv_initialized())

    def test__venv_initialized_missing(self):
        """Test _venv_initialized() with missing bin/python."""
        venv = venvlib.Venv('.', 'reqs.txt')
        self.assertFalse(venv._venv_initialized())
