summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorDavid Kalnischkies <david@kalnischkies.de>2021-09-04 16:10:50 +0200
committerDavid Kalnischkies <david@kalnischkies.de>2021-09-04 16:20:12 +0200
commit70c669e2566d119559d2986635bb6c1d0d368073 (patch)
tree1584687e9bac78ae75bac737acb1b67a83bcdc79 /test
parent79a675ddf3320bf640d130e592c86fefd1a460e1 (diff)
Streamline access to barbarian architecture functionality
APT is not the place this information should be stored at, but it is a good place to experiment and see what will be (not) needed in the future for a proper implementation higher up the stack. This is why "BarbarianArchitectures" is chosen instead of a more neutral and/or sensible "VeryForeign" and isn't readily exported in the API to other clients for this PoC as a to be drawn up standard will likely require potentially incompatible changes. Having a then outdated and slightly different implementation block a "good" name would be bad. The functionality itself mostly exists (ignoring bugs) since the introduction of MultiArch as we always had the risk of encountering packages of architectures not known to dpkg (forced onto the system, potentially before MultiArch) we had to deal with somehow and other edge cases. All this commit really does is allowing what could previously only be achieved with editing sources.list and some conf options via a single config option: -o APT::BarbarianArchitectures=foo,bar
Diffstat (limited to 'test')
-rwxr-xr-xtest/integration/test-apt-get-build-dep-barbarian140
-rwxr-xr-xtest/integration/test-apt-get-build-dep-file14
-rw-r--r--test/libapt/getarchitectures_test.cc28
3 files changed, 181 insertions, 1 deletions
diff --git a/test/integration/test-apt-get-build-dep-barbarian b/test/integration/test-apt-get-build-dep-barbarian
new file mode 100755
index 000000000..688f7a54b
--- /dev/null
+++ b/test/integration/test-apt-get-build-dep-barbarian
@@ -0,0 +1,140 @@
+#!/bin/sh
+set -e
+
+TESTDIR="$(readlink -f "$(dirname "$0")")"
+. "$TESTDIR/framework"
+setupenvironment
+configarchitecture 'amd64' 'i386' 'armel' 'mipsel'
+
+insertinstalledpackage 'build-essential' 'all' '1'
+insertpackage 'unstable' 'samey' 'amd64,i386,armel,mipsel' '1' 'Multi-Arch: same'
+insertinstalledpackage 'samey' 'unknown' '1' 'Multi-Arch: same'
+
+insertsource 'unstable' 'cool-foo' 'any' '1' 'Build-Depends: foo, samey'
+insertsource 'unstable' 'bad-amd64-foo' 'any' '1' 'Build-Depends: foo, samey
+Build-Conflicts: foo:amd64'
+insertsource 'unstable' 'bad-armel-foo' 'any' '1' 'Build-Depends: foo, samey
+Build-Conflicts: foo:armel'
+insertsource 'unstable' 'bad-amd64-armel-foo' 'any' '1' 'Build-Depends: foo, samey
+Build-Conflicts: foo:amd64, foo:armel'
+insertsource 'unstable' 'bad-amd64-i386-foo' 'any' '1' 'Build-Depends: foo, samey
+Build-Conflicts: foo:amd64, foo:i386'
+insertsource 'unstable' 'bad-amd64-i386-armel-foo' 'any' '1' 'Build-Depends: foo, samey
+Build-Conflicts: foo:amd64, foo:i386, foo:armel'
+insertpackage 'unstable' 'foo' 'amd64,i386,armel,mipsel' '1' 'Multi-Arch: foreign'
+
+setupaptarchive
+
+installsfoosamey() {
+ local FOO="foo:$1"
+ local SAMEY="samey:$2"
+ if [ "$1" = 'amd64' ]; then FOO='foo'; fi
+ if [ "$2" = 'amd64' ]; then SAMEY='samey'; fi
+ echo "Reading package lists...
+Reading package lists...
+Building dependency tree...
+The following NEW packages will be installed:
+ $FOO $SAMEY
+0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
+Inst $FOO (1 unstable [$1])
+Inst $SAMEY (1 unstable [$2])
+Conf $FOO (1 unstable [$1])
+Conf $SAMEY (1 unstable [$2])"
+}
+
+testdpkginstalled 'samey:unknown'
+
+testsuccessequal "$(installsfoosamey 'amd64' 'amd64')" apt build-dep cool-foo -s
+testsuccessequal "$(installsfoosamey 'amd64' 'amd64')" apt build-dep cool-foo -s -a amd64
+testsuccessequal "$(installsfoosamey 'amd64' 'i386')" apt build-dep cool-foo -s -a i386
+testsuccessequal "$(installsfoosamey 'amd64' 'armel')" apt build-dep cool-foo -s -a armel
+
+testsuccessequal "$(installsfoosamey 'i386' 'amd64')" apt build-dep bad-amd64-foo -s
+testsuccessequal "$(installsfoosamey 'i386' 'amd64')" apt build-dep bad-amd64-foo -s -a amd64
+testsuccessequal "$(installsfoosamey 'i386' 'i386')" apt build-dep bad-amd64-foo -s -a i386
+testsuccessequal "$(installsfoosamey 'i386' 'armel')" apt build-dep bad-amd64-foo -s -a armel
+
+testsuccessequal "$(installsfoosamey 'amd64' 'amd64')" apt build-dep bad-armel-foo -s
+testsuccessequal "$(installsfoosamey 'amd64' 'amd64')" apt build-dep bad-armel-foo -s -a amd64
+testsuccessequal "$(installsfoosamey 'amd64' 'i386')" apt build-dep bad-armel-foo -s -a i386
+testsuccessequal "$(installsfoosamey 'amd64' 'armel')" apt build-dep bad-armel-foo -s -a armel
+
+testsuccessequal "$(installsfoosamey 'i386' 'amd64')" apt build-dep bad-amd64-armel-foo -s
+testsuccessequal "$(installsfoosamey 'i386' 'amd64')" apt build-dep bad-amd64-armel-foo -s -a amd64
+testsuccessequal "$(installsfoosamey 'i386' 'i386')" apt build-dep bad-amd64-armel-foo -s -a i386
+testsuccessequal "$(installsfoosamey 'i386' 'armel')" apt build-dep bad-amd64-armel-foo -s -a armel
+
+testsuccessequal "$(installsfoosamey 'armel' 'amd64')" apt build-dep bad-amd64-i386-foo -s
+testsuccessequal "$(installsfoosamey 'armel' 'amd64')" apt build-dep bad-amd64-i386-foo -s -a amd64
+testsuccessequal "$(installsfoosamey 'armel' 'i386')" apt build-dep bad-amd64-i386-foo -s -a i386
+testsuccessequal "$(installsfoosamey 'armel' 'armel')" apt build-dep bad-amd64-i386-foo -s -a armel
+
+testsuccessequal "$(installsfoosamey 'mipsel' 'amd64')" apt build-dep bad-amd64-i386-armel-foo -s
+testsuccessequal "$(installsfoosamey 'mipsel' 'amd64')" apt build-dep bad-amd64-i386-armel-foo -s -a amd64
+testsuccessequal "$(installsfoosamey 'mipsel' 'i386')" apt build-dep bad-amd64-i386-armel-foo -s -a i386
+testsuccessequal "$(installsfoosamey 'mipsel' 'armel')" apt build-dep bad-amd64-i386-armel-foo -s -a armel
+
+
+msgmsg 'BarbarianArchitectures' 'config'
+echo 'APT::BarbarianArchitectures { "mipsel"; "armel"; };' > rootdir/etc/apt/apt.conf.d/99barbarianarchs
+testsuccess aptcache gencaches
+
+testsuccessequal "$(installsfoosamey 'amd64' 'i386')" apt build-dep cool-foo -s -a i386
+testsuccessequal "$(installsfoosamey 'i386' 'i386')" apt build-dep bad-amd64-foo -s -a i386
+testsuccessequal "$(installsfoosamey 'amd64' 'i386')" apt build-dep bad-armel-foo -s -a i386
+testsuccessequal "$(installsfoosamey 'i386' 'i386')" apt build-dep bad-amd64-armel-foo -s -a i386
+testfailureequal 'Reading package lists...
+Reading package lists...
+Building dependency tree...
+Some packages could not be installed. This may mean that you have
+requested an impossible situation or if you are using the unstable
+distribution that some required packages have not yet been created
+or been moved out of Incoming.
+The following information may help to resolve the situation:
+
+The following packages have unmet dependencies:
+ builddeps:bad-amd64-i386-foo:i386 : Depends: foo:i386
+E: Unable to correct problems, you have held broken packages.' apt build-dep bad-amd64-i386-foo -s -a i386
+testfailureequal 'Reading package lists...
+Reading package lists...
+Building dependency tree...
+Some packages could not be installed. This may mean that you have
+requested an impossible situation or if you are using the unstable
+distribution that some required packages have not yet been created
+or been moved out of Incoming.
+The following information may help to resolve the situation:
+
+The following packages have unmet dependencies:
+ builddeps:bad-amd64-i386-armel-foo:i386 : Depends: foo:i386
+E: Unable to correct problems, you have held broken packages.' apt build-dep bad-amd64-i386-armel-foo -s -a i386
+
+testsuccessequal "$(installsfoosamey 'amd64' 'armel')" apt build-dep cool-foo -s -a armel
+testsuccessequal "$(installsfoosamey 'i386' 'armel')" apt build-dep bad-amd64-foo -s -a armel
+testsuccessequal "$(installsfoosamey 'amd64' 'armel')" apt build-dep bad-armel-foo -s -a armel
+testsuccessequal "$(installsfoosamey 'i386' 'armel')" apt build-dep bad-amd64-armel-foo -s -a armel
+testsuccessequal "$(installsfoosamey 'armel' 'armel')" apt build-dep bad-amd64-i386-foo -s -a armel
+FAILURE='Reading package lists...
+Building dependency tree...
+Some packages could not be installed. This may mean that you have
+requested an impossible situation or if you are using the unstable
+distribution that some required packages have not yet been created
+or been moved out of Incoming.
+The following information may help to resolve the situation:
+
+The following packages have unmet dependencies:
+ builddeps:bad-amd64-i386-armel-foo:armel : Depends: foo:armel
+E: Unable to correct problems, you have held broken packages.'
+testfailureequal "Reading package lists...
+$FAILURE" apt build-dep bad-amd64-i386-armel-foo -s -a armel
+
+msgmsg 'BarbarianArchitectures' 'cmdline options'
+rm rootdir/etc/apt/apt.conf.d/99barbarianarchs
+testsuccess aptcache gencaches
+
+testsuccessequal "$(installsfoosamey 'mipsel' 'armel')" apt build-dep bad-amd64-i386-armel-foo -s -a armel
+testsuccess aptcache gencaches -o APT::BarbarianArchitectures::=armel
+testsuccessequal "$(installsfoosamey 'mipsel' 'armel')" apt build-dep bad-amd64-i386-armel-foo -s -a armel -o APT::BarbarianArchitectures::=armel
+testfailureequal "$FAILURE" apt build-dep bad-amd64-i386-armel-foo -s -a armel -o APT::BarbarianArchitectures::=mipsel
+testfailureequal "$FAILURE" apt build-dep bad-amd64-i386-armel-foo -s -a armel -o APT::BarbarianArchitectures::=mipsel -o APT::BarbarianArchitectures::=armel
+testfailureequal "Reading package lists...
+$FAILURE" apt build-dep bad-amd64-i386-armel-foo -s -a armel -o APT::BarbarianArchitectures=mipsel,armel
diff --git a/test/integration/test-apt-get-build-dep-file b/test/integration/test-apt-get-build-dep-file
index c4b6947bf..88bf10b0f 100755
--- a/test/integration/test-apt-get-build-dep-file
+++ b/test/integration/test-apt-get-build-dep-file
@@ -158,7 +158,19 @@ testsuccess aptget build-dep --simulate '..'
cd ../..
testfailureequal 'E: Must specify at least one package to check builddeps for' aptget build-dep
-testfailureequal 'E: No architecture information available for armel. See apt.conf(5) APT::Architectures for setup' aptget build-dep --simulate ./foo-1.0 -a armel
+testfailureequal "Note, using directory './foo-1.0' to get the build dependencies
+Reading package lists...
+Building dependency tree...
+Some packages could not be installed. This may mean that you have
+requested an impossible situation or if you are using the unstable
+distribution that some required packages have not yet been created
+or been moved out of Incoming.
+The following information may help to resolve the situation:
+
+The following packages have unmet dependencies:
+ builddeps:./foo-1.0:armel : Depends: debhelper:armel (>= 7) but it is not installable
+W: No architecture information available for armel. See apt.conf(5) APT::Architectures for setup
+E: Unable to correct problems, you have held broken packages." aptget build-dep --simulate ./foo-1.0 -a armel
testfailureequal 'Reading package lists...
E: Unable to find a source package for foo' aptget build-dep --simulate foo
diff --git a/test/libapt/getarchitectures_test.cc b/test/libapt/getarchitectures_test.cc
index 57e9a5f2f..4f767226f 100644
--- a/test/libapt/getarchitectures_test.cc
+++ b/test/libapt/getarchitectures_test.cc
@@ -75,3 +75,31 @@ TEST(ArchitecturesTest,Duplicates)
_config->Clear();
}
+TEST(ArchitecturesTest,VeryForeign)
+{
+ _config->Clear();
+ _config->Set("APT::Architectures::", "i386");
+ _config->Set("APT::Architectures::", "amd64");
+ _config->Set("APT::Architectures::", "armel");
+
+ auto vec = APT::Configuration::getArchitectures(false);
+ ASSERT_EQ(3u, vec.size());
+ EXPECT_EQ("i386", vec[0]);
+ EXPECT_EQ("amd64", vec[1]);
+ EXPECT_EQ("armel", vec[2]);
+
+ _config->Set("APT::BarbarianArchitectures::", "mipsel");
+ vec = APT::Configuration::getArchitectures(false);
+ ASSERT_EQ(3u, vec.size());
+ EXPECT_EQ("i386", vec[0]);
+ EXPECT_EQ("amd64", vec[1]);
+ EXPECT_EQ("armel", vec[2]);
+
+ _config->Set("APT::BarbarianArchitectures::", "armel");
+ vec = APT::Configuration::getArchitectures(false);
+ ASSERT_EQ(2u, vec.size());
+ EXPECT_EQ("i386", vec[0]);
+ EXPECT_EQ("amd64", vec[1]);
+
+ _config->Clear();
+}