diff --git a/Makefile-tests.am b/Makefile-tests.am index c21e29f7..cb775320 100644 --- a/Makefile-tests.am +++ b/Makefile-tests.am @@ -111,6 +111,18 @@ _installed_or_uninstalled_test_scripts = \ tests/test-summary-view.sh \ $(NULL) +if ENABLE_EXPERIMENTAL_API +_installed_or_uninstalled_test_scripts += \ + tests/test-find-remotes.sh \ + tests/test-fsck-collections.sh \ + tests/test-init-collections.sh \ + tests/test-prune-collections.sh \ + tests/test-refs-collections.sh \ + tests/test-remote-add-collections.sh \ + tests/test-summary-collections.sh \ + $(NULL) +endif + if BUILDOPT_FUSE _installed_or_uninstalled_test_scripts += tests/test-rofiles-fuse.sh else diff --git a/tests/libtest.sh b/tests/libtest.sh index 15802dfd..ee3f4af8 100755 --- a/tests/libtest.sh +++ b/tests/libtest.sh @@ -537,3 +537,15 @@ ostree_file_path_to_object_path() { relpath=$(ostree_file_path_to_relative_object_path $repo $ref $path) echo ${repo}/${relpath} } + +# Assert ref $2 in repo $1 has checksum $3. +assert_ref () { + assert_streq $(${CMD_PREFIX} ostree rev-parse --repo=$1 $2) $3 +} + +# Assert no ref named $2 is present in repo $1. +assert_not_ref () { + if ${CMD_PREFIX} ostree rev-parse --repo=$1 $2 2>/dev/null; then + fatal "rev-parse $2 unexpectedly succeeded!" + fi +} diff --git a/tests/test-find-remotes.sh b/tests/test-find-remotes.sh new file mode 100755 index 00000000..0b887664 --- /dev/null +++ b/tests/test-find-remotes.sh @@ -0,0 +1,229 @@ +#!/bin/bash +# +# Copyright © 2017 Endless Mobile, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +set -euo pipefail + +. $(dirname $0)/libtest.sh + +echo '1..1' + +# Create two upstream collection repositories with some example commits +cd ${test_tmpdir} + +mkdir apps-collection +ostree_repo_init apps-collection --collection-id org.example.AppsCollection +mkdir -p files +pushd files +${CMD_PREFIX} ostree --repo=../apps-collection commit -s "Test apps-collection commit 1" -b app1 --gpg-homedir=${TEST_GPG_KEYHOME} --gpg-sign=${TEST_GPG_KEYID_1} > ../app1-checksum +${CMD_PREFIX} ostree --repo=../apps-collection commit -s "Test apps-collection commit 2" -b app2 --gpg-homedir=${TEST_GPG_KEYHOME} --gpg-sign=${TEST_GPG_KEYID_1} > ../app2-checksum +popd +${CMD_PREFIX} ostree --repo=apps-collection summary --update --gpg-homedir=${TEST_GPG_KEYHOME} --gpg-sign=${TEST_GPG_KEYID_1} + +mkdir os-collection +ostree_repo_init os-collection --collection-id org.example.OsCollection +mkdir -p files +pushd files +${CMD_PREFIX} ostree --repo=../os-collection commit -s "Test os-collection commit 1" -b os/amd64/master --gpg-homedir=${TEST_GPG_KEYHOME} --gpg-sign=${TEST_GPG_KEYID_2} > ../os-checksum +popd +${CMD_PREFIX} ostree --repo=os-collection summary --update --gpg-homedir=${TEST_GPG_KEYHOME} --gpg-sign=${TEST_GPG_KEYID_2} + +# Create a local repository where we pull the branches from the two remotes as normal, using GPG. +mkdir local +ostree_repo_init local +${CMD_PREFIX} ostree --repo=local remote add apps-remote file://$(pwd)/apps-collection --collection-id org.example.AppsCollection --gpg-import=${test_tmpdir}/gpghome/key1.asc +${CMD_PREFIX} ostree --repo=local remote add os-remote file://$(pwd)/os-collection --collection-id org.example.OsCollection --gpg-import=${test_tmpdir}/gpghome/key2.asc + +${CMD_PREFIX} ostree --repo=local pull apps-remote app1 +${CMD_PREFIX} ostree --repo=local pull os-remote os/amd64/master + +${CMD_PREFIX} ostree --repo=local refs > refs +assert_file_has_content refs "^apps-remote:app1$" +assert_file_has_content refs "^os-remote:os/amd64/master$" + +${CMD_PREFIX} ostree --repo=local refs --collections | wc -l > refscount +assert_file_has_content refscount "^0$" + +# Create a local mirror repository where we pull the branches *in mirror mode* from the two remotes. +# This should pull them into refs/mirrors, since the remotes advertise a collection ID. +mkdir local-mirror +ostree_repo_init local-mirror +${CMD_PREFIX} ostree --repo=local-mirror remote add apps-remote file://$(pwd)/apps-collection --collection-id org.example.AppsCollection --gpg-import=${test_tmpdir}/gpghome/key1.asc +${CMD_PREFIX} ostree --repo=local-mirror remote add os-remote file://$(pwd)/os-collection --collection-id org.example.OsCollection --gpg-import=${test_tmpdir}/gpghome/key2.asc + +${CMD_PREFIX} ostree --repo=local-mirror pull --mirror apps-remote app1 +${CMD_PREFIX} ostree --repo=local-mirror pull --mirror os-remote os/amd64/master + +${CMD_PREFIX} ostree --repo=local-mirror refs | wc -l > refscount +assert_file_has_content refscount "^0$" + +${CMD_PREFIX} ostree --repo=local-mirror refs --collections > refs +assert_file_has_content refs "^(org.example.AppsCollection, app1)$" +assert_file_has_content refs "^(org.example.OsCollection, os/amd64/master)$" + +for repo in local local-mirror; do + # Try finding an update for an existing branch. + ${CMD_PREFIX} ostree --repo=$repo find-remotes org.example.AppsCollection app1 > find + assert_file_has_content find "^Result [0-9]\+: file://$(pwd)/apps-collection$" + assert_file_has_content find "^ - Keyring: apps-remote.trustedkeys.gpg$" + assert_file_has_content find "^ - (org.example.AppsCollection, app1) = $(cat app1-checksum)$" + assert_file_has_content find "^1/1 refs were found.$" + assert_not_file_has_content find "^No results.$" + + # Find several updates for several existing branches. + ${CMD_PREFIX} ostree --repo=$repo find-remotes org.example.AppsCollection app1 org.example.OsCollection os/amd64/master > find + assert_file_has_content find "^Result [0-9]\+: file://$(pwd)/apps-collection$" + assert_file_has_content find "^ - Keyring: apps-remote.trustedkeys.gpg$" + assert_file_has_content find "^ - (org.example.AppsCollection, app1) = $(cat app1-checksum)$" + assert_file_has_content find "^Result [0-9]\+: file://$(pwd)/os-collection$" + assert_file_has_content find "^ - Keyring: os-remote.trustedkeys.gpg$" + assert_file_has_content find "^ - (org.example.OsCollection, os/amd64/master) = $(cat os-checksum)$" + assert_file_has_content find "^2/2 refs were found.$" + assert_not_file_has_content find "^No results.$" + + # Find some updates and a new branch. + ${CMD_PREFIX} ostree --repo=$repo find-remotes org.example.AppsCollection app1 org.example.AppsCollection app2 org.example.OsCollection os/amd64/master > find + assert_file_has_content find "^Result [0-9]\+: file://$(pwd)/apps-collection$" + assert_file_has_content find "^ - Keyring: apps-remote.trustedkeys.gpg$" + assert_file_has_content find "^ - (org.example.AppsCollection, app1) = $(cat app1-checksum)$" + assert_file_has_content find "^ - (org.example.AppsCollection, app2) = $(cat app2-checksum)$" + assert_file_has_content find "^Result [0-9]\+: file://$(pwd)/os-collection$" + assert_file_has_content find "^ - Keyring: os-remote.trustedkeys.gpg$" + assert_file_has_content find "^ - (org.example.OsCollection, os/amd64/master) = $(cat os-checksum)$" + assert_file_has_content find "^3/3 refs were found.$" + assert_not_file_has_content find "^No results.$" + + # Find an update and a non-existent branch. + ${CMD_PREFIX} ostree --repo=$repo find-remotes org.example.AppsCollection app1 org.example.AppsCollection not-an-app > find + assert_file_has_content find "^Result [0-9]\+: file://$(pwd)/apps-collection$" + assert_file_has_content find "^ - Keyring: apps-remote.trustedkeys.gpg$" + assert_file_has_content find "^ - (org.example.AppsCollection, not-an-app) = (not found)$" + assert_file_has_content find "^ - (org.example.AppsCollection, app1) = $(cat app1-checksum)$" + assert_file_has_content find "^Refs not found in any remote:$" + assert_file_has_content find "^ - (org.example.AppsCollection, not-an-app)$" + assert_file_has_content find "^1/2 refs were found.$" + assert_not_file_has_content find "^No results.$" + + # Do all the above, but pull this time. + ${CMD_PREFIX} ostree --repo=$repo find-remotes --pull org.example.AppsCollection app1 > pull || true + assert_file_has_content pull "^1/1 refs were found.$" + assert_file_has_content pull "^Pulled 1/1 refs successfully.$" + assert_not_file_has_content pull "Failed to pull some refs from the remotes" + assert_ref $repo app1 $(cat app1-checksum) + + ${CMD_PREFIX} ostree --repo=$repo find-remotes --pull org.example.AppsCollection app1 org.example.OsCollection os/amd64/master > pull + assert_file_has_content pull "^2/2 refs were found.$" + assert_file_has_content pull "^Pulled 2/2 refs successfully.$" + assert_not_file_has_content pull "Failed to pull some refs from the remotes" + assert_ref $repo app1 $(cat app1-checksum) + assert_ref $repo os/amd64/master $(cat os-checksum) + + ${CMD_PREFIX} ostree --repo=$repo find-remotes --pull org.example.AppsCollection app1 org.example.AppsCollection app2 org.example.OsCollection os/amd64/master > pull + assert_file_has_content pull "^3/3 refs were found.$" + assert_file_has_content pull "^Pulled 3/3 refs successfully.$" + assert_not_file_has_content pull "Failed to pull some refs from the remotes" + assert_ref $repo app1 $(cat app1-checksum) + assert_ref $repo app2 $(cat app2-checksum) + assert_ref $repo os/amd64/master $(cat os-checksum) + + ${CMD_PREFIX} ostree --repo=$repo find-remotes --pull org.example.AppsCollection app1 org.example.AppsCollection not-an-app > pull + assert_file_has_content pull "^1/2 refs were found.$" + assert_not_file_has_content pull "Failed to pull some refs from the remotes" + assert_ref $repo app1 $(cat app1-checksum) + assert_not_ref $repo not-an-app +done + +# Test pulling a new commit into the local mirror from one of the repositories. +pushd files +${CMD_PREFIX} ostree --repo=../os-collection commit -s "Test os-collection commit 2" -b os/amd64/master --gpg-homedir=${TEST_GPG_KEYHOME} --gpg-sign=${TEST_GPG_KEYID_2} > ../os-checksum-2 +popd +${CMD_PREFIX} ostree --repo=os-collection summary --update --gpg-homedir=${TEST_GPG_KEYHOME} --gpg-sign=${TEST_GPG_KEYID_2} + +for repo in local-mirror; do + # Try finding an update for that branch. + ${CMD_PREFIX} ostree --repo=$repo find-remotes org.example.OsCollection os/amd64/master > find + assert_file_has_content find "^Result [0-9]\+: file://$(pwd)/os-collection$" + assert_file_has_content find "^ - Keyring: os-remote.trustedkeys.gpg$" + assert_file_has_content find "^ - (org.example.OsCollection, os/amd64/master) = $(cat os-checksum-2)$" + assert_file_has_content find "^1/1 refs were found.$" + assert_not_file_has_content find "^No results.$" + + # Pull it. + ${CMD_PREFIX} ostree --repo=$repo find-remotes --pull org.example.OsCollection os/amd64/master > pull || true + assert_file_has_content pull "^1/1 refs were found.$" + assert_file_has_content pull "^Pulled 1/1 refs successfully.$" + assert_not_file_has_content pull "Failed to pull some refs from the remotes" + assert_ref $repo os/amd64/master $(cat os-checksum-2) +done + +# Add the local mirror to the local repository as a remote, so that the local repo +# has two configured remotes for the os-collection. Ensure its summary is up to date first. +#${CMD_PREFIX} ostree --repo=local-mirror summary --update +# FIXME: This `cp` can be changed to `ostree summary --update` once PR #946 lands. +# Prior to that, we need to preserve the signatures. +cp os-collection/summary{,.sig} local-mirror/ +${CMD_PREFIX} ostree --repo=local remote add os-remote-local-mirror file://$(pwd)/local-mirror --collection-id org.example.OsCollection --gpg-import=${test_tmpdir}/gpghome/key2.asc + +for repo in local; do + # Try finding an update for that branch. + ${CMD_PREFIX} ostree --repo=$repo find-remotes org.example.OsCollection os/amd64/master > find + assert_file_has_content find "^Result [0-9]\+: file://$(pwd)/os-collection$" + assert_file_has_content find "^ - Keyring: os-remote.trustedkeys.gpg$" + assert_file_has_content find "^ - (org.example.OsCollection, os/amd64/master) = $(cat os-checksum-2)$" + assert_file_has_content find "^Result [0-9]\+: file://$(pwd)/local-mirror$" + assert_file_has_content find "^ - Keyring: os-remote-local-mirror.trustedkeys.gpg$" + assert_file_has_content find "^ - (org.example.OsCollection, os/amd64/master) = $(cat os-checksum-2)$" + assert_file_has_content find "^1/1 refs were found.$" + assert_not_file_has_content find "^No results.$" + + # Pull it. + ${CMD_PREFIX} ostree --repo=$repo find-remotes --pull org.example.OsCollection os/amd64/master > pull || true + assert_file_has_content pull "^1/1 refs were found.$" + assert_file_has_content pull "^Pulled 1/1 refs successfully.$" + assert_not_file_has_content pull "Failed to pull some refs from the remotes" + assert_ref $repo os/amd64/master $(cat os-checksum-2) +done + +# Add another commit to the OS collection, but don’t update the mirror. Then try pulling +# into the local repository again, and check that the outdated ref in the mirror is ignored. +pushd files +${CMD_PREFIX} ostree --repo=../os-collection commit -s "Test os-collection commit 3" -b os/amd64/master --gpg-homedir=${TEST_GPG_KEYHOME} --gpg-sign=${TEST_GPG_KEYID_2} > ../os-checksum-3 +popd +${CMD_PREFIX} ostree --repo=os-collection summary --update --gpg-homedir=${TEST_GPG_KEYHOME} --gpg-sign=${TEST_GPG_KEYID_2} + +for repo in local; do + # Try finding an update for that branch. + ${CMD_PREFIX} ostree --repo=$repo find-remotes org.example.OsCollection os/amd64/master > find + assert_file_has_content find "^Result [0-9]\+: file://$(pwd)/os-collection$" + assert_file_has_content find "^ - Keyring: os-remote.trustedkeys.gpg$" + assert_file_has_content find "^ - (org.example.OsCollection, os/amd64/master) = $(cat os-checksum-3)$" + assert_file_has_content find "^Result [0-9]\+: file://$(pwd)/local-mirror$" + assert_file_has_content find "^ - Keyring: os-remote-local-mirror.trustedkeys.gpg$" + assert_file_has_content find "^ - (org.example.OsCollection, os/amd64/master) = $(cat os-checksum-3)$" + assert_file_has_content find "^1/1 refs were found.$" + assert_not_file_has_content find "^No results.$" + + # Pull it. + ${CMD_PREFIX} ostree --repo=$repo find-remotes --pull org.example.OsCollection os/amd64/master > pull || true + assert_file_has_content pull "^1/1 refs were found.$" + assert_file_has_content pull "^Pulled 1/1 refs successfully.$" + assert_not_file_has_content pull "Failed to pull some refs from the remotes" + assert_ref $repo os/amd64/master $(cat os-checksum-3) +done + +echo "ok find-remotes" diff --git a/tests/test-fsck-collections.sh b/tests/test-fsck-collections.sh new file mode 100755 index 00000000..5de17bcf --- /dev/null +++ b/tests/test-fsck-collections.sh @@ -0,0 +1,72 @@ +#!/bin/bash +# +# Copyright © 2017 Endless Mobile, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +set -euo pipefail + +. $(dirname $0)/libtest.sh + +echo '1..2' + +cd ${test_tmpdir} + +# Check that fsck detects errors with refs which have collection IDs (i.e. refs in refs/mirrors). +set_up_repo() { + rm -rf repo files + + mkdir repo + ostree_repo_init repo + + mkdir files + pushd files + ${CMD_PREFIX} ostree --repo=../repo commit -s "Commit 1" -b original-ref > ../original-ref-checksum + popd + ${CMD_PREFIX} ostree --repo=repo refs --collections --create=org.example.Collection:some-ref $(cat original-ref-checksum) +} + +set_up_repo + +# fsck at this point should succeed +${CMD_PREFIX} ostree fsck --repo=repo > fsck +assert_file_has_content fsck "^Validating refs in collections...$" + +# Drop the commit the ref points to, and drop the original ref so that fsck doesn’t prematurely fail on that. +find repo/objects -name '*.commit' -delete -print | wc -l > commitcount +assert_file_has_content commitcount "^1$" + +rm repo/refs/heads/original-ref + +# fsck should now fail +if ${CMD_PREFIX} ostree fsck --repo=repo > fsck; then + assert_not_reached "fsck unexpectedly succeeded after deleting commit!" +fi +assert_file_has_content fsck "^Validating refs...$" +assert_file_has_content fsck "^Validating refs in collections...$" + +echo "ok 1 fsck-collections" + +# Try fsck in an old repository where refs/mirrors doesn’t exist to begin with. +# It should succeed. +set_up_repo +rm -rf repo/refs/mirrors + +${CMD_PREFIX} ostree fsck --repo=repo > fsck +assert_file_has_content fsck "^Validating refs...$" +assert_file_has_content fsck "^Validating refs in collections...$" + +echo "ok 2 fsck-collections in old repository" diff --git a/tests/test-init-collections.sh b/tests/test-init-collections.sh new file mode 100755 index 00000000..fe78fc97 --- /dev/null +++ b/tests/test-init-collections.sh @@ -0,0 +1,33 @@ +#!/bin/bash +# +# Copyright © 2017 Endless Mobile, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +set -euo pipefail + +. $(dirname $0)/libtest.sh + +echo '1..1' + +cd ${test_tmpdir} + +# Check that initialising a repository with a collection ID results in the ID being in the config. +mkdir repo +ostree_repo_init repo --collection-id org.example.Collection +assert_file_has_content repo/config "^collection-id=org.example.Collection$" + +echo "ok init-collections" diff --git a/tests/test-prune-collections.sh b/tests/test-prune-collections.sh new file mode 100755 index 00000000..823d2805 --- /dev/null +++ b/tests/test-prune-collections.sh @@ -0,0 +1,79 @@ +#!/bin/bash +# +# Copyright © 2017 Endless Mobile, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +set -euo pipefail + +. $(dirname $0)/libtest.sh + +echo '1..2' + +cd ${test_tmpdir} + +# Check that refs with collection IDs (i.e. refs in refs/mirrors) are taken into account +# when computing reachability of objects while pruning. +set_up_repo() { + rm -rf repo files + + mkdir repo + ostree_repo_init repo + + mkdir files + pushd files + ${CMD_PREFIX} ostree --repo=../repo commit -s "Commit 1" -b original-ref > ../original-ref-checksum + popd + ${CMD_PREFIX} ostree --repo=repo refs --collections --create=org.example.Collection:some-ref $(cat original-ref-checksum) +} + +set_up_repo + +# Try deleting a specific commit which is still pointed to by both refs. +if ${CMD_PREFIX} ostree --repo=repo prune --delete-commit=$(cat original-ref-checksum) 2>/dev/null; then + assert_not_reached "prune unexpectedly succeeded in deleting a referenced commit!" +fi + +# Pruning normally should do nothing. +${CMD_PREFIX} ostree --repo=repo prune --refs-only > prune +assert_file_has_content prune "^Total objects: 3$" +assert_file_has_content prune "^No unreachable objects$" + +# Remove the original-ref so that only the some-ref with a collection ID points to the commit. +${CMD_PREFIX} ostree --repo=repo refs --delete original-ref + +${CMD_PREFIX} ostree --repo=repo prune --refs-only > prune +assert_file_has_content prune "^Total objects: 3$" +assert_file_has_content prune "^No unreachable objects$" + +# Remove the second ref so that the commit is now orphaned. +${CMD_PREFIX} ostree --repo=repo refs --collections --delete org.example.Collection + +${CMD_PREFIX} ostree --repo=repo prune --refs-only > prune +assert_file_has_content prune "^Total objects: 3$" +assert_file_has_content prune "^Deleted 3 objects, [0-9]\+ bytes freed$" + +echo "ok 1 prune-collections" + +# Try again, but in an old repository where refs/mirrors doesn’t exist to begin with. +set_up_repo +rm -rf repo/refs/mirrors + +${CMD_PREFIX} ostree --repo=repo prune --refs-only > prune +assert_file_has_content prune "^Total objects: 3$" +assert_file_has_content prune "^No unreachable objects$" + +echo "ok 2 prune-collections in old repository" diff --git a/tests/test-refs-collections.sh b/tests/test-refs-collections.sh new file mode 100755 index 00000000..4d49247d --- /dev/null +++ b/tests/test-refs-collections.sh @@ -0,0 +1,125 @@ +#!/bin/bash +# +# Copyright © 2016 Red Hat, Inc. +# Copyright © 2017 Endless Mobile, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +set -euo pipefail + +. $(dirname $0)/libtest.sh + +echo '1..2' + +cd ${test_tmpdir} +mkdir repo +ostree_repo_init repo --collection-id org.example.Collection + +mkdir -p tree/root +touch tree/root/a + +# Add a few commits +seq 5 | while read i; do + echo a >> tree/root/a + ${CMD_PREFIX} ostree --repo=repo commit --branch=test-$i -m test -s test tree +done + +# The collection IDs should only be listed if --collections is passed. +${CMD_PREFIX} ostree --repo=repo refs | wc -l > refscount +assert_file_has_content refscount "^5$" + +${CMD_PREFIX} ostree --repo=repo refs > refs +assert_file_has_content refs "^test\-1$" +assert_file_has_content refs "^test\-5$" +assert_not_file_has_content refs "org.example.Collection" + +${CMD_PREFIX} ostree --repo=repo refs --collections > refs +assert_file_has_content refs "^(org.example.Collection, test-1)$" +assert_file_has_content refs "^(org.example.Collection, test-5)$" + +# Similarly, the collection IDs should only be listed when filtering if --collections is passed. +${CMD_PREFIX} ostree --repo=repo refs --list org.example.Collection | wc -l > refscount +assert_file_has_content refscount "^0$" + +${CMD_PREFIX} ostree --repo=repo refs --collections --list org.example.Collection | wc -l > refscount +assert_file_has_content refscount "^5$" + +# --delete by itself should fail. +${CMD_PREFIX} ostree --repo=repo refs --delete 2>/dev/null || true +${CMD_PREFIX} ostree --repo=repo refs | wc -l > refscount.delete1 +assert_file_has_content refscount.delete1 "^5$" + +# Deleting specific refs should work. +${CMD_PREFIX} ostree refs --delete 2>/dev/null && (echo 1>&2 "refs --delete (without prefix) unexpectedly succeeded!"; exit 1) +${CMD_PREFIX} ostree --repo=repo refs --delete test-1 test-2 +${CMD_PREFIX} ostree --repo=repo refs | wc -l > refscount.delete2 +assert_file_has_content refscount.delete2 "^3$" +${CMD_PREFIX} ostree --repo=repo refs > refs.delete2 +assert_not_file_has_content refs.delete2 '^test-1$' +assert_not_file_has_content refs.delete2 '^test-2$' +assert_file_has_content refs.delete2 '^test-3$' + +# Deleting by collection ID should only work if --collections is passed. +${CMD_PREFIX} ostree refs --repo=repo --delete org.example.Collection +${CMD_PREFIX} ostree refs --repo=repo | wc -l > refscount.delete3 +assert_file_has_content refscount.delete3 "^3$" + +${CMD_PREFIX} ostree refs --repo=repo --collections --delete org.example.Collection +${CMD_PREFIX} ostree refs --repo=repo | wc -l > refscount.delete4 +assert_file_has_content refscount.delete4 "^0$" + +# Add a few more commits, to test --create +${CMD_PREFIX} ostree --repo=repo commit --branch=ctest -m ctest -s ctest tree + +${CMD_PREFIX} ostree --repo=repo refs | wc -l > refscount +assert_file_has_content refscount "^1$" + +# and test mirrored branches +${CMD_PREFIX} ostree --repo=repo refs --collections --create=org.example.NewCollection:ctest-mirror ctest + +${CMD_PREFIX} ostree --repo=repo refs | wc -l > refscount +assert_file_has_content refscount "^1$" +${CMD_PREFIX} ostree --repo=repo refs --collections | wc -l > refscount +assert_file_has_content refscount "^2$" + +${CMD_PREFIX} ostree --repo=repo refs > refs +assert_file_has_content refs "^ctest$" +assert_not_file_has_content refs "^ctest-mirror$" + +${CMD_PREFIX} ostree --repo=repo refs --collections > refs +assert_file_has_content refs "^(org.example.Collection, ctest)$" +assert_file_has_content refs "^(org.example.NewCollection, ctest-mirror)$" + +echo "ok 1 refs collections" + +# Test that listing, creating and deleting refs works from an old repository +# where refs/mirrors doesn’t exist to begin with. +rm -rf repo/refs/mirrors +${CMD_PREFIX} ostree --repo=repo refs + +rm -rf repo/refs/mirrors +${CMD_PREFIX} ostree --repo=repo refs --collections + +rm -rf repo/refs/mirrors +${CMD_PREFIX} ostree --repo=repo refs --collections --create=org.example.NewCollection:ctest-mirror ctest +${CMD_PREFIX} ostree --repo=repo refs --collections > refs +assert_file_has_content refs "^(org.example.Collection, ctest)$" +assert_file_has_content refs "^(org.example.NewCollection, ctest-mirror)$" + +rm -rf repo/refs/mirrors +${CMD_PREFIX} ostree refs --repo=repo --collections --delete org.example.NonexistentCollection + +echo "ok 2 refs collections in old repository" diff --git a/tests/test-remote-add-collections.sh b/tests/test-remote-add-collections.sh new file mode 100755 index 00000000..23deaa8e --- /dev/null +++ b/tests/test-remote-add-collections.sh @@ -0,0 +1,35 @@ +#!/bin/bash +# +# Copyright © 2017 Endless Mobile, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +set -euo pipefail + +. $(dirname $0)/libtest.sh + +echo '1..1' + +cd ${test_tmpdir} + +# Check that adding a remote with a collection ID results in the ID being in the config. +mkdir repo +ostree_repo_init repo +${CMD_PREFIX} ostree --repo=repo remote add some-remote https://example.com/ --collection-id example-id --gpg-import=${test_tmpdir}/gpghome/key1.asc + +assert_file_has_content repo/config "^collection-id=example-id$" + +echo "ok remote-add-collections" diff --git a/tests/test-summary-collections.sh b/tests/test-summary-collections.sh new file mode 100755 index 00000000..989e63e8 --- /dev/null +++ b/tests/test-summary-collections.sh @@ -0,0 +1,58 @@ +#!/bin/bash +# +# Copyright © 2016 Red Hat, Inc. +# Copyright © 2017 Endless Mobile, Inc. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the +# Free Software Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +set -euo pipefail + +. $(dirname $0)/libtest.sh + +echo '1..1' + +cd ${test_tmpdir} +mkdir repo +ostree_repo_init repo --collection-id org.example.Collection + +mkdir -p tree/root +touch tree/root/a + +# Add a few commits +seq 5 | while read i; do + echo a >> tree/root/a + ${CMD_PREFIX} ostree --repo=repo commit --branch=test-$i -m test -s test tree +done + +# Check that they are all listed, with the repository’s collection ID, in the summary. +${CMD_PREFIX} ostree --repo=repo summary --update + +${CMD_PREFIX} ostree --repo=repo summary --view > summary +assert_file_has_content summary "(org.example.Collection, test-1)$" +assert_file_has_content summary "(org.example.Collection, test-2)$" +assert_file_has_content summary "(org.example.Collection, test-3)$" +assert_file_has_content summary "(org.example.Collection, test-4)$" +assert_file_has_content summary "(org.example.Collection, test-5)$" +assert_file_has_content summary "^Collection ID (ostree\.summary\.collection-id): org.example.Collection$" + +# Test that mirrored branches are listed too. +${CMD_PREFIX} ostree --repo=repo refs --collections --create=org.example.OtherCollection:test-1-mirror test-1 +${CMD_PREFIX} ostree --repo=repo summary --update + +${CMD_PREFIX} ostree --repo=repo summary --view > summary +assert_file_has_content summary "(org.example.OtherCollection, test-1-mirror)$" + +echo "ok summary collections"