# -*- coding: utf-8 -*-
# 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_build_lib
from chromite.lib import cros_test_lib
from chromite.lib import osutils


class TestChrootManager(cros_test_lib.MockTempDirTestCase):
  """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')
    m = self.PatchObject(cros_build_lib, 'CleanupChrootMount')
    fresh_chroot = self.chroot_manager.EnsureChrootAtVersion('foo')
    self.assertEquals(self.chroot_manager.GetChrootVersion(chroot), None)
    self.assertTrue(fresh_chroot)
    m.asset_called()
