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

"""Unittests for chroot management functions."""

from __future__ import print_function

import os

from chromite.cbuildbot import chroot_lib
from chromite.lib import cros_test_lib
from chromite.lib import osutils


class TestChrootManager(cros_test_lib.TempDirTestCase):
  """Class that tests the ChrootManager."""

  def setUp(self):
    self.chroot_manager = chroot_lib.ChrootManager(self.tempdir)

  def testGetChrootVersionWithNoChroot(self):
    """If there's no chroot, GetChrootVersion returns None."""
    self.assertIsNone(self.chroot_manager.GetChrootVersion('foo'))

  def testSetChrootVersionWithNoChroot(self):
    """If there's no chroot, SetChrootVersion does nothing."""
    self.chroot_manager.SetChrootVersion('foo')
    self.assertIsNone(self.chroot_manager.GetChrootVersion())

  def testSetChrootVersionWithChroot(self):
    """SetChrootVersion sets the chroot version."""
    osutils.SafeMakedirs(os.path.join(self.tempdir, 'chroot', 'etc'))
    self.chroot_manager.SetChrootVersion('foo')
    self.assertEquals('foo', self.chroot_manager.GetChrootVersion())

  def testClearChrootVersion(self):
    """SetChrootVersion sets the chroot version."""
    osutils.SafeMakedirs(os.path.join(self.tempdir, 'chroot', 'etc'))
    self.chroot_manager.SetChrootVersion('foo')
    self.assertEquals('foo', self.chroot_manager.GetChrootVersion())
    self.chroot_manager.ClearChrootVersion()
    self.assertIsNone(self.chroot_manager.GetChrootVersion())

  def testUseExistingChroot(self):
    """Tests that EnsureChrootAtVersion succeeds with valid chroot."""
    chroot = os.path.join(self.tempdir, 'chroot')
    osutils.SafeMakedirs(os.path.join(chroot, 'etc'))
    self.chroot_manager.SetChrootVersion('foo')
    fresh_chroot = self.chroot_manager.EnsureChrootAtVersion('foo')
    self.assertEquals(self.chroot_manager.GetChrootVersion(chroot), 'foo')
    self.assertFalse(fresh_chroot)

  def testUseFreshChroot(self):
    """Tests that EnsureChrootAtVersion succeeds with invalid chroot."""
    chroot = os.path.join(self.tempdir, 'chroot')
    fresh_chroot = self.chroot_manager.EnsureChrootAtVersion('foo')
    self.assertEquals(self.chroot_manager.GetChrootVersion(chroot), None)
    self.assertTrue(fresh_chroot)
