# Copyright 2010-2018 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 AutounmaskTestCase(TestCase):

	def testAutounmask(self):

		ebuilds = {
			#ebuilds to test use changes
			"dev-libs/A-1": { "SLOT": 1, "DEPEND": "dev-libs/B[foo]", "EAPI": 2},
			"dev-libs/A-2": { "SLOT": 2, "DEPEND": "dev-libs/B[bar]", "EAPI": 2},
			"dev-libs/B-1": { "DEPEND": "foo? ( dev-libs/C ) bar? ( dev-libs/D )", "IUSE": "foo bar"},
			"dev-libs/C-1": {},
			"dev-libs/D-1": {},

			#ebuilds to test if we allow changing of masked or forced flags
			"dev-libs/E-1": { "SLOT": 1, "DEPEND": "dev-libs/F[masked-flag]", "EAPI": 2},
			"dev-libs/E-2": { "SLOT": 2, "DEPEND": "dev-libs/G[-forced-flag]", "EAPI": 2},
			"dev-libs/F-1": { "IUSE": "masked-flag"},
			"dev-libs/G-1": { "IUSE": "forced-flag"},

			#ebuilds to test keyword changes
			"app-misc/Z-1": { "KEYWORDS": "~x86", "DEPEND": "app-misc/Y" },
			"app-misc/Y-1": { "KEYWORDS": "~x86" },
			"app-misc/W-1": {},
			"app-misc/W-2": { "KEYWORDS": "~x86" },
			"app-misc/V-1": { "KEYWORDS": "~x86", "DEPEND": ">=app-misc/W-2"},

			#ebuilds to test mask and keyword changes
			"app-text/A-1": {},
			"app-text/B-1": { "KEYWORDS": "~x86" },
			"app-text/C-1": { "KEYWORDS": "" },
			"app-text/D-1": { "KEYWORDS": "~x86" },
			"app-text/D-2": { "KEYWORDS": "" },

			#ebuilds for mixed test for || dep handling
			"sci-libs/K-1": { "DEPEND": " || ( sci-libs/L[bar] || ( sci-libs/M sci-libs/P ) )", "EAPI": 2},
			"sci-libs/K-2": { "DEPEND": " || ( sci-libs/L[bar] || ( sci-libs/P sci-libs/M ) )", "EAPI": 2},
			"sci-libs/K-3": { "DEPEND": " || ( sci-libs/M || ( sci-libs/L[bar] sci-libs/P ) )", "EAPI": 2},
			"sci-libs/K-4": { "DEPEND": " || ( sci-libs/M || ( sci-libs/P sci-libs/L[bar] ) )", "EAPI": 2},
			"sci-libs/K-5": { "DEPEND": " || ( sci-libs/P || ( sci-libs/L[bar] sci-libs/M ) )", "EAPI": 2},
			"sci-libs/K-6": { "DEPEND": " || ( sci-libs/P || ( sci-libs/M sci-libs/L[bar] ) )", "EAPI": 2},
			"sci-libs/K-7": { "DEPEND": " || ( sci-libs/M sci-libs/L[bar] )", "EAPI": 2},
			"sci-libs/K-8": { "DEPEND": " || ( sci-libs/L[bar] sci-libs/M )", "EAPI": 2},

			"sci-libs/L-1": { "IUSE": "bar" },
			"sci-libs/M-1": { "KEYWORDS": "~x86" },
			"sci-libs/P-1": { },

			#ebuilds to test these nice "required by cat/pkg[foo]" messages
			"dev-util/Q-1": { "DEPEND": "foo? ( dev-util/R[bar] )", "IUSE": "+foo", "EAPI": 2 },
			"dev-util/Q-2": { "RDEPEND": "!foo? ( dev-util/R[bar] )", "IUSE": "foo", "EAPI": 2 },
			"dev-util/R-1": { "IUSE": "bar" },

			#ebuilds to test interaction with REQUIRED_USE
			"app-portage/A-1": { "DEPEND": "app-portage/B[foo]", "EAPI": 2 },
			"app-portage/A-2": { "DEPEND": "app-portage/B[foo=]", "IUSE": "+foo", "REQUIRED_USE": "foo", "EAPI": "4" },

			"app-portage/B-1": { "IUSE": "foo +bar", "REQUIRED_USE": "^^ ( foo bar )", "EAPI": "4" },
			"app-portage/C-1": { "IUSE": "+foo +bar", "REQUIRED_USE": "^^ ( foo bar )", "EAPI": "4" },

			"sci-mathematics/octave-4.2.2": {
				"EAPI": 6,
				"RDEPEND": ">=x11-libs/qscintilla-2.9.3-r2:=[qt5(+)]",
			},
			"x11-libs/qscintilla-2.9.4": {
				"EAPI": 6,
				"IUSE": "+qt4 qt5",
				"REQUIRED_USE": "^^ ( qt4 qt5 )",
			},
			"x11-libs/qscintilla-2.10": {
				"EAPI": 6,
				"KEYWORDS": "~x86",
				"IUSE": "qt4 +qt5",
			},
			}

		test_cases = (
				#Test USE changes.
				#The simple case.

				ResolverPlaygroundTestCase(
					["dev-libs/A:1"],
					options={"--autounmask": "n"},
					success=False),
				ResolverPlaygroundTestCase(
					["dev-libs/A:1"],
					options={"--autounmask": True},
					success=False,
					mergelist=["dev-libs/C-1", "dev-libs/B-1", "dev-libs/A-1"],
					use_changes={ "dev-libs/B-1": {"foo": True} }),

				#Make sure we restart if needed.
				ResolverPlaygroundTestCase(
					["dev-libs/A:1", "dev-libs/B"],
					options={"--autounmask": True, "--autounmask-backtrack": "y"},
					all_permutations=True,
					success=False,
					mergelist=["dev-libs/C-1", "dev-libs/B-1", "dev-libs/A-1"],
					use_changes={ "dev-libs/B-1": {"foo": True} }),

				# With --autounmask-backtrack=y:
				#[ebuild  N     ] dev-libs/C-1
				#[ebuild  N     ] dev-libs/B-1  USE="foo -bar"
				#[ebuild  N     ] dev-libs/A-1
				#
				#The following USE changes are necessary to proceed:
				# (see "package.use" in the portage(5) man page for more details)
				## required by dev-libs/A-1::test_repo
				## required by dev-libs/A:1 (argument)
				#>=dev-libs/B-1 foo

				# Without --autounmask-backtrack=y:
				#[ebuild  N     ] dev-libs/B-1  USE="foo -bar"
				#[ebuild  N     ] dev-libs/A-1
				#
				#The following USE changes are necessary to proceed:
				# (see "package.use" in the portage(5) man page for more details)
				## required by dev-libs/A-1::test_repo
				## required by dev-libs/A:1 (argument)
				#>=dev-libs/B-1 foo

				ResolverPlaygroundTestCase(
					["dev-libs/A:1", "dev-libs/A:2", "dev-libs/B"],
					options={"--autounmask": True, "--autounmask-backtrack": "y"},
					all_permutations=True,
					success=False,
					mergelist=["dev-libs/D-1", "dev-libs/C-1", "dev-libs/B-1", "dev-libs/A-1", "dev-libs/A-2"],
					ignore_mergelist_order=True,
					use_changes={ "dev-libs/B-1": {"foo": True, "bar": True} }),

				# With --autounmask-backtrack=y:
				#[ebuild  N     ] dev-libs/C-1
				#[ebuild  N     ] dev-libs/D-1
				#[ebuild  N     ] dev-libs/B-1  USE="bar foo"
				#[ebuild  N     ] dev-libs/A-2
				#[ebuild  N     ] dev-libs/A-1
				#
				#The following USE changes are necessary to proceed:
				# (see "package.use" in the portage(5) man page for more details)
				## required by dev-libs/A-2::test_repo
				## required by dev-libs/A:2 (argument)
				#>=dev-libs/B-1 bar foo

				# Without --autounmask-backtrack=y:
				#[ebuild  N     ] dev-libs/B-1  USE="bar foo"
				#[ebuild  N     ] dev-libs/A-1
				#[ebuild  N     ] dev-libs/A-2
				#
				#The following USE changes are necessary to proceed:
				# (see "package.use" in the portage(5) man page for more details)
				## required by dev-libs/A-1::test_repo
				## required by dev-libs/A:1 (argument)
				#>=dev-libs/B-1 foo bar

				# NOTE: The --autounmask-backtrack=n behavior is acceptable, but
				# it would be nicer if it added the dev-libs/C-1 and dev-libs/D-1
				# deps to the depgraph without backtracking. It could add two
				# instances of dev-libs/B-1 to the graph with different USE flags,
				# and then use _solve_non_slot_operator_slot_conflicts to eliminate
				# the redundant instance.

				#Test keywording.
				#The simple case.

				ResolverPlaygroundTestCase(
					["app-misc/Z"],
					options={"--autounmask": "n"},
					success=False),
				ResolverPlaygroundTestCase(
					["app-misc/Z"],
					options={"--autounmask": True},
					success=False,
					mergelist=["app-misc/Y-1", "app-misc/Z-1"],
					unstable_keywords=["app-misc/Y-1", "app-misc/Z-1"]),

				#Make sure that the backtracking for slot conflicts handles our mess.

				ResolverPlaygroundTestCase(
					["=app-misc/V-1", "app-misc/W"],
					options={"--autounmask": True},
					all_permutations=True,
					success=False,
					mergelist=["app-misc/W-2", "app-misc/V-1"],
					unstable_keywords=["app-misc/W-2", "app-misc/V-1"]),

				#Mixed testing
				#Make sure we don't change use for something in a || dep if there is another choice
				#that needs no change.

				ResolverPlaygroundTestCase(
					["=sci-libs/K-1"],
					options={"--autounmask": True},
					success=True,
					mergelist=["sci-libs/P-1", "sci-libs/K-1"]),
				ResolverPlaygroundTestCase(
					["=sci-libs/K-2"],
					options={"--autounmask": True},
					success=True,
					mergelist=["sci-libs/P-1", "sci-libs/K-2"]),
				ResolverPlaygroundTestCase(
					["=sci-libs/K-3"],
					options={"--autounmask": True},
					success=True,
					mergelist=["sci-libs/P-1", "sci-libs/K-3"]),
				ResolverPlaygroundTestCase(
					["=sci-libs/K-4"],
					options={"--autounmask": True},
					success=True,
					mergelist=["sci-libs/P-1", "sci-libs/K-4"]),
				ResolverPlaygroundTestCase(
					["=sci-libs/K-5"],
					options={"--autounmask": True},
					success=True,
					mergelist=["sci-libs/P-1", "sci-libs/K-5"]),
				ResolverPlaygroundTestCase(
					["=sci-libs/K-6"],
					options={"--autounmask": True},
					success=True,
					mergelist=["sci-libs/P-1", "sci-libs/K-6"]),

				#Make sure we prefer use changes over keyword changes.
				ResolverPlaygroundTestCase(
					["=sci-libs/K-7"],
					options={"--autounmask": True},
					success=False,
					mergelist=["sci-libs/L-1", "sci-libs/K-7"],
					use_changes={ "sci-libs/L-1": { "bar": True } }),
				ResolverPlaygroundTestCase(
					["=sci-libs/K-8"],
					options={"--autounmask": True},
					success=False,
					mergelist=["sci-libs/L-1", "sci-libs/K-8"],
					use_changes={ "sci-libs/L-1": { "bar": True } }),

				#Test these nice "required by cat/pkg[foo]" messages.
				ResolverPlaygroundTestCase(
					["=dev-util/Q-1"],
					options={"--autounmask": True},
					success=False,
					mergelist=["dev-util/R-1", "dev-util/Q-1"],
					use_changes={ "dev-util/R-1": { "bar": True } }),
				ResolverPlaygroundTestCase(
					["=dev-util/Q-2"],
					options={"--autounmask": True},
					success=False,
					mergelist=["dev-util/R-1", "dev-util/Q-2"],
					use_changes={ "dev-util/R-1": { "bar": True } }),

				#Test interaction with REQUIRED_USE.
				# Some of these cases trigger USE change(s) that violate
				# REQUIRED_USE, so the USE changes are shown along with
				# the REQUIRED_USE violation that they would trigger.

				# The following USE changes are necessary to proceed:
				#  (see "package.use" in the portage(5) man page for more details)
				# # required by app-portage/A-1::test_repo
				# # required by =app-portage/A-1 (argument)
				# >=app-portage/B-1 foo
				#
				# !!! The ebuild selected to satisfy "app-portage/B[foo]" has unmet requirements.
				# - app-portage/B-1::test_repo USE="bar (forced-flag) -foo"
				#
				#   The following REQUIRED_USE flag constraints are unsatisfied:
				#     exactly-one-of ( foo bar )
				ResolverPlaygroundTestCase(
					["=app-portage/A-1"],
					options={ "--autounmask": True },
					use_changes={"app-portage/B-1": {"foo": True}},
					success=False),

				# The following USE changes are necessary to proceed:
				#  (see "package.use" in the portage(5) man page for more details)
				# # required by app-portage/A-2::test_repo
				# # required by =app-portage/A-2 (argument)
				# >=app-portage/B-1 foo
				#
				# !!! The ebuild selected to satisfy "app-portage/B[foo=]" has unmet requirements.
				# - app-portage/B-1::test_repo USE="bar (forced-flag) -foo"
				#
				#   The following REQUIRED_USE flag constraints are unsatisfied:
				#     exactly-one-of ( foo bar )
				ResolverPlaygroundTestCase(
					["=app-portage/A-2"],
					options={ "--autounmask": True },
					use_changes={"app-portage/B-1": {"foo": True}},
					success=False),
				ResolverPlaygroundTestCase(
					["=app-portage/C-1"],
					options={ "--autounmask": True },
					use_changes=None,
					success=False),

				# Test bug 622462, where it inappropriately unmasked a newer
				# version rather than report unsatisfied REQUIRED_USE.
				#
				# The following USE changes are necessary to proceed:
				#  (see "package.use" in the portage(5) man page for more details)
				# # required by sci-mathematics/octave-4.2.2::test_repo
				# # required by sci-mathematics/octave (argument)
				# >=x11-libs/qscintilla-2.9.4 qt5
				#
				# !!! The ebuild selected to satisfy ">=x11-libs/qscintilla-2.9.3-r2:=[qt5(+)]" has unmet requirements.
				# - x11-libs/qscintilla-2.9.4::test_repo USE="qt4 -qt5"
				#
				#   The following REQUIRED_USE flag constraints are unsatisfied:
				#     exactly-one-of ( qt4 qt5 )
				#
				# (dependency required by "sci-mathematics/octave-4.2.2::test_repo" [ebuild])
				# (dependency required by "sci-mathematics/octave" [argument])
				ResolverPlaygroundTestCase(
					["sci-mathematics/octave"],
					options={"--autounmask": True},
					use_changes={"x11-libs/qscintilla-2.9.4": {"qt5": True}},
					success=False),

				#Make sure we don't change masked/forced flags.
				ResolverPlaygroundTestCase(
					["dev-libs/E:1"],
					options={"--autounmask": True},
					use_changes=None,
					success=False),
				ResolverPlaygroundTestCase(
					["dev-libs/E:2"],
					options={"--autounmask": True},
					use_changes=None,
					success=False),

				#Test mask and keyword changes.
				ResolverPlaygroundTestCase(
					["app-text/A"],
					options={"--autounmask": True},
					success=False,
					mergelist=["app-text/A-1"],
					needed_p_mask_changes=["app-text/A-1"]),
				ResolverPlaygroundTestCase(
					["app-text/B"],
					options={"--autounmask": True},
					success=False,
					mergelist=["app-text/B-1"],
					unstable_keywords=["app-text/B-1"],
					needed_p_mask_changes=["app-text/B-1"]),
				ResolverPlaygroundTestCase(
					["app-text/C"],
					options={"--autounmask": True},
					success=False,
					mergelist=["app-text/C-1"],
					unstable_keywords=["app-text/C-1"],
					needed_p_mask_changes=["app-text/C-1"]),
				#Make sure unstable keyword is preferred over missing keyword
				ResolverPlaygroundTestCase(
					["app-text/D"],
					options={"--autounmask": True},
					success=False,
					mergelist=["app-text/D-1"],
					unstable_keywords=["app-text/D-1"]),
				#Test missing keyword
				ResolverPlaygroundTestCase(
					["=app-text/D-2"],
					options={"--autounmask": True},
					success=False,
					mergelist=["app-text/D-2"],
					unstable_keywords=["app-text/D-2"])
			)

		profile = {
			"use.mask":
				(
					"masked-flag",
				),
			"use.force":
				(
					"forced-flag",
				),
			"package.mask":
				(
					"app-text/A",
					"app-text/B",
					"app-text/C",
				),
		}

		playground = ResolverPlayground(ebuilds=ebuilds, profile=profile)
		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()

	def testAutounmaskForLicenses(self):

		ebuilds = {
			"dev-libs/A-1": { "LICENSE": "TEST" },
			"dev-libs/B-1": { "LICENSE": "TEST", "IUSE": "foo", "KEYWORDS": "~x86"},
			"dev-libs/C-1": { "DEPEND": "dev-libs/B[foo]", "EAPI": 2 },

			"dev-libs/D-1": { "DEPEND": "dev-libs/E dev-libs/F", "LICENSE": "TEST" },
			"dev-libs/E-1": { "LICENSE": "TEST" },
			"dev-libs/E-2": { "LICENSE": "TEST" },
			"dev-libs/F-1": { "DEPEND": "=dev-libs/E-1", "LICENSE": "TEST" },

			"dev-java/sun-jdk-1.6.0.32": { "LICENSE": "TEST", "KEYWORDS": "~x86" },
			"dev-java/sun-jdk-1.6.0.31": { "LICENSE": "TEST", "KEYWORDS": "x86" },
			}

		test_cases = (
				ResolverPlaygroundTestCase(
					["=dev-libs/A-1"],
					options={"--autounmask": 'n'},
					success=False),
				ResolverPlaygroundTestCase(
					["=dev-libs/A-1"],
					options={"--autounmask": True},
					success=False,
					mergelist=["dev-libs/A-1"],
					license_changes={ "dev-libs/A-1": set(["TEST"]) }),

				#Test license+keyword+use change at once.
				ResolverPlaygroundTestCase(
					["=dev-libs/C-1"],
					options={"--autounmask": True},
					success=False,
					mergelist=["dev-libs/B-1", "dev-libs/C-1"],
					license_changes={ "dev-libs/B-1": set(["TEST"]) },
					unstable_keywords=["dev-libs/B-1"],
					use_changes={ "dev-libs/B-1": { "foo": True } }),

				#Test license with backtracking.
				ResolverPlaygroundTestCase(
					["=dev-libs/D-1"],
					options={"--autounmask": True},
					success=False,
					mergelist=["dev-libs/E-1", "dev-libs/F-1", "dev-libs/D-1"],
					license_changes={ "dev-libs/D-1": set(["TEST"]), "dev-libs/E-1": set(["TEST"]), "dev-libs/E-2": set(["TEST"]), "dev-libs/F-1": set(["TEST"]) }),

				#Test license only for bug #420847
				ResolverPlaygroundTestCase(
					["dev-java/sun-jdk"],
					options={"--autounmask": True},
					success=False,
					mergelist=["dev-java/sun-jdk-1.6.0.31"],
					license_changes={ "dev-java/sun-jdk-1.6.0.31": set(["TEST"]) }),
			)

		playground = ResolverPlayground(ebuilds=ebuilds)
		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()


	def testAutounmaskAndSets(self):

		ebuilds = {
			#ebuilds to test use changes
			"dev-libs/A-1": { },
			"dev-libs/A-2": { "KEYWORDS": "~x86" },
			"dev-libs/B-1": { "DEPEND": "dev-libs/A" },
			"dev-libs/C-1": { "DEPEND": ">=dev-libs/A-2" },
			"dev-libs/D-1": { "DEPEND": "dev-libs/A" },
			}

		world_sets = ["@test-set"]
		sets = {
			"test-set": (
					"dev-libs/A", "dev-libs/B", "dev-libs/C", "dev-libs/D",
				),
			}

		test_cases = (
				#Test USE changes.
				#The simple case.

				ResolverPlaygroundTestCase(
					["dev-libs/B", "dev-libs/C", "dev-libs/D"],
					all_permutations=True,
					options={"--autounmask": "y"},
					mergelist=["dev-libs/A-2", "dev-libs/B-1", "dev-libs/C-1", "dev-libs/D-1"],
					ignore_mergelist_order=True,
					unstable_keywords=["dev-libs/A-2"],
					success=False),

				ResolverPlaygroundTestCase(
					["@test-set"],
					all_permutations=True,
					options={"--autounmask": "y"},
					mergelist=["dev-libs/A-2", "dev-libs/B-1", "dev-libs/C-1", "dev-libs/D-1"],
					ignore_mergelist_order=True,
					unstable_keywords=["dev-libs/A-2"],
					success=False),

				ResolverPlaygroundTestCase(
					["@world"],
					all_permutations=True,
					options={"--autounmask": "y"},
					mergelist=["dev-libs/A-2", "dev-libs/B-1", "dev-libs/C-1", "dev-libs/D-1"],
					ignore_mergelist_order=True,
					unstable_keywords=["dev-libs/A-2"],
					success=False),
			)


		playground = ResolverPlayground(ebuilds=ebuilds, world_sets=world_sets, sets=sets)
		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()


	def testAutounmaskKeepMasks(self):
		"""
		Ensure that we try to use a masked version with keywords before trying
		masked version with missing keywords (prefer masked regular version
		over -9999 version).
		"""
		ebuilds = {
			"app-text/A-1": {},
			}

		test_cases = (
				#Test mask and keyword changes.
				ResolverPlaygroundTestCase(
					["app-text/A"],
					options={"--autounmask": True,
							"--autounmask-keep-masks": "y"},
					success=False),
				ResolverPlaygroundTestCase(
					["app-text/A"],
					options={"--autounmask": True,
							"--autounmask-keep-masks": "n"},
					success=False,
					mergelist=["app-text/A-1"],
					needed_p_mask_changes=["app-text/A-1"]),
			)

		profile = {
			"package.mask":
				(
					"app-text/A",
				),
		}

		playground = ResolverPlayground(ebuilds=ebuilds, profile=profile)

		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()


	def testAutounmask9999(self):

		ebuilds = {
			"dev-libs/A-1": { },
			"dev-libs/A-2": { },
			"dev-libs/A-9999": { "KEYWORDS": "" },
			"dev-libs/B-1": { "DEPEND": ">=dev-libs/A-2" },
			"dev-libs/C-1": { "DEPEND": ">=dev-libs/A-3" },
			}

		profile = {
			"package.mask":
				(
					">=dev-libs/A-2",
				),
		}

		test_cases = (
			ResolverPlaygroundTestCase(
				["dev-libs/B"],
				success=False,
				mergelist=["dev-libs/A-2", "dev-libs/B-1"],
				needed_p_mask_changes=set(["dev-libs/A-2"])),

			ResolverPlaygroundTestCase(
				["dev-libs/C"],
				success=False,
				mergelist=["dev-libs/A-9999", "dev-libs/C-1"],
				unstable_keywords=set(["dev-libs/A-9999"]),
				needed_p_mask_changes=set(["dev-libs/A-9999"])),
			)

		playground = ResolverPlayground(ebuilds=ebuilds, profile=profile)
		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()
