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

"""Unit tests for the cros_list_modified_packages program"""

from __future__ import print_function

import functools

from chromite.lib import cros_test_lib
from chromite.lib import sysroot_lib
from chromite.scripts import cros_list_modified_packages


class ListModifiedWorkonPackagesTest(cros_test_lib.MockTestCase):
  """Test for cros_list_modified_packages.ListModifiedWorkonPackages."""

  def testListModifiedWorkonPackages(self):
    """Test that no ebuild breaks cros_list_modified_packages"""

    # A hook to set the "all_opt" parameter when calling ListWorkonPackages
    _ListWorkonPackagesPatch = \
      functools.partial(cros_list_modified_packages.ListWorkonPackages,
                        all_opt=True)

    with self.PatchObject(cros_list_modified_packages, 'ListWorkonPackages',
                          side_effect=_ListWorkonPackagesPatch):
      # ListModifiedWorkonPackages returns a generator object and doesn't
      # actually do any work automatically. We have to extract the elements
      # from it to get it to exercise the code, and we can do that by turning
      # it into a list.
      list(cros_list_modified_packages.ListModifiedWorkonPackages(
          sysroot=sysroot_lib.Sysroot('/')))
