#!/usr/bin/perl
# a-1 requires b-1
# a-2 requires b-2
#
# c requires d
# d1-1 provides d, but not d1-2
# d2-2 provides d, but not d2-1
#
# e-2 conflicts with f-1
#
# h-1 conflicts with g-2
#
# i requires j
# j1 provides j and requires k
# j2 provides j
# k1-1 provides k, but not k1-2
#
# l-1 and l-2 requires k
# m-1 requires k but not m-2
# n requires m
#
use strict;
use lib '.', 't';
use helper;
use urpm::util;
use Test::More 'no_plan';
need_root_and_prepare();
my $name = 'split-transactions--promote';
urpmi_addmedia("$name-1 $::pwd/media/$name-1");
urpmi_addmedia("$name-2 $::pwd/media/$name-2");
test('--split-length 0');
test('--split-level 1 --split-length 1');
test_conflict();
sub test {
my ($split) = @_;
test_ab("$split --auto-select");
#- below need the promotion of "a-2" (upgraded from "a-1") to work
test_ab("$split b");
#- below need the promotion of "d2" (new installed package) to work
test_cd("$split d1");
#- below need the promotion of "f-2" (upgraded from "f-1") to work
test_ef("$split e");
#- below need the promotion of "h-2" (upgraded from "h-1") to work
test_gh("$split g");
#- below need the promotion of "j2" (replacing removed j1) to work
test_ijk("$split k1");
#- below tests for bug #52667
#- transactions created with only k1 upgrade caused n to be removed
test_klm("$split --auto-select");
test_klm("$split k1");
}
sub test_conflict {
test_conflict_ef();
test_conflict_gh();
}
sub test_ab {
my ($para) = @_;
urpmi("--media $name-1 --auto a b");
check_installed_names('a', 'b');
urpmi("--media $name-2 --auto $para");
check_installed_fullnames_and_remove('a-2-1', 'b-2-1');
}
sub test_cd {
my ($para) = @_;
urpmi("--media $name-1 --auto c");
check_installed_names('c', 'd1');
urpmi("--media $name-2 --auto $para");
check_installed_fullnames_and_remove('c-1-1', 'd1-2-1', 'd2-2-1');
}
sub test_ef {
my ($para) = @_;
urpmi("--media $name-1 --auto e f");
check_installed_names('f', 'e');
urpmi("--media $name-2 --auto $para");
check_installed_fullnames_and_remove('e-2-1', 'f-2-1');
}
sub test_gh {
my ($para) = @_;
urpmi("--media $name-1 --auto g h");
check_installed_names('g', 'h');
urpmi("--media $name-2 --auto $para");
check_installed_fullnames_and_remove('g-2-1', 'h-2-1');
}
sub test_ijk {
my ($para) = @_;
urpmi("--media $name-1 --auto i");
check_installed_names('i', 'j1', 'k1');
urpmi("--media $name-2 --auto $para");
check_installed_fullnames_and_remove('i-1-1', 'j2-1-1', 'k1-2-1');
}
sub test_klm {
my ($para) = @_;
urpmi("--media $name-1 --auto l");
urpmi("--media $name-1 --auto n"); # separated in order to force install order
check_installed_names('k1', 'l', 'm', 'n');
my $output = run_urpm_cmd("urpmi --media $name-2 --auto $para 2>&1");
ok($output !~ /transaction is too small/, "test_klm transaction validity");
ok($output !~ /due to missing m/, "do not ask for removal of n"); # false message
# installation was always ok, just transactions and messages above were wrong
check_installed_fullnames_and_remove('k1-2-1', 'm-2-1', 'n-1-1');
}
sub test_conflict_ef {
my ($para) = @_;
urpmi("--media $name-1 f");
check_installed_names('f');
my @reasons = run_urpmi_and_get_conflicts("--media $name-1 --auto media/$name-2/e-2-*.rpm");
$reasons[0] =~ s/\.\w+$//; # get rid of arch
my $wanted = 'e-2-1';
ok($reasons[0] eq $wanted, "$wanted in @reasons");
check_installed_fullnames_and_remove('e-2-1');
}
sub test_conflict_gh {
my ($para) = @_;
urpmi("--media $name-1 h");
check_installed_names('h');
my @reasons = run_urpmi_and_get_conflicts("--media $name-1 --auto media/$name-2/g-2-*.rpm");
my $wanted = 'g[> 1]';
ok($reasons[0] eq $wanted, "$wanted in @reasons");
check_installed_fullnames_and_remove('g-2-1');
}
sub run_urpmi_and_get_conflicts {
my ($para) = @_;
my $output = run_urpm_cmd("urpmi $para");
$output =~ /\(due to conflicts with (.*)\)/g;
}