# Copyright 2017 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2

from portage.tests import TestCase
from portage.tests.resolver.ResolverPlayground import (
	ResolverPlayground,
	ResolverPlaygroundTestCase,
)

class BinaryPkgEbuildVisibilityTestCase(TestCase):

	def testBinaryPkgEbuildVisibility(self):

		binpkgs = {
			"app-misc/foo-3" : {},
			"app-misc/foo-2" : {},
			"app-misc/foo-1" : {},
		}

		ebuilds = {
			"app-misc/foo-2" : {},
			"app-misc/foo-1" : {},
		}

		installed = {
			"app-misc/foo-1" : {},
		}

		world = ["app-misc/foo"]

		test_cases = (

			# Test bug #612960, where --use-ebuild-visibility failed
			# to reject binary packages for which ebuilds were not
			# available.
			ResolverPlaygroundTestCase(
				["@world"],
				options = {
					"--update": True,
					"--deep": True,
					"--use-ebuild-visibility": 'y',
					"--usepkgonly": True,
				},
				success = True,
				mergelist = [
					'[binary]app-misc/foo-2',
				],
			),

			ResolverPlaygroundTestCase(
				["@world"],
				options = {
					"--update": True,
					"--deep": True,
					"--usepkgonly": True,
				},
				success = True,
				mergelist = [
					'[binary]app-misc/foo-3',
				],
			),

			ResolverPlaygroundTestCase(
				["@world"],
				options = {
					"--update": True,
					"--deep": True,
					"--usepkg": True,
				},
				success = True,
				mergelist = [
					'[binary]app-misc/foo-2',
				],
			),

			ResolverPlaygroundTestCase(
				["=app-misc/foo-3"],
				options = {
					"--use-ebuild-visibility": 'y',
					"--usepkgonly": True,
				},
				success = False,
			),

			ResolverPlaygroundTestCase(
				["app-misc/foo"],
				options = {
					"--use-ebuild-visibility": 'y',
					"--usepkgonly": True,
				},
				success = True,
				mergelist = [
					'[binary]app-misc/foo-2',
				],
			),

			ResolverPlaygroundTestCase(
				["app-misc/foo"],
				options = {
					"--usepkgonly": True,
				},
				success = True,
				mergelist = [
					'[binary]app-misc/foo-3',
				],
			),

			# The default behavior is to enforce ebuild visibility as
			# long as a visible package is available to satisfy the
			# current atom. In the following test case, ebuild visibility
			# is ignored in order to satisfy the =app-misc/foo-3 atom.
			ResolverPlaygroundTestCase(
				["=app-misc/foo-3"],
				options = {
					"--usepkg": True,
				},
				success = True,
				mergelist = [
					'[binary]app-misc/foo-3',
				],
			),

			# Verify that --use-ebuild-visibility works with --usepkg
			# when no other visible package is available.
			ResolverPlaygroundTestCase(
				["=app-misc/foo-3"],
				options = {
					"--use-ebuild-visibility": "y",
					"--usepkg": True,
				},
				success = False,
			),
		)

		playground = ResolverPlayground(binpkgs=binpkgs, ebuilds=ebuilds,
			installed=installed, world=world)
		try:
			for test_case in test_cases:
				playground.run_TestCase(test_case)
				self.assertEqual(test_case.test_success, True,
					test_case.fail_msg)
		finally:
			playground.cleanup()

