serval-dna/tests/dna_rhizome

220 lines
7.2 KiB
Plaintext
Raw Normal View History

2012-04-10 08:31:53 +00:00
#!/bin/bash
# Tests for Serval DNA rhizome operations.
#
# Copyright 2012 Paul Gardner-Stephen
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
source "${0%/*}/../testframework.sh"
source "${0%/*}/../testdefs.sh"
setup_dna_rhizome() {
setup_dna "$@"
executeOk $dna config set debug rhizome
}
assert_rhizome_list() {
executeOk $dna rhizome list
assertStdoutLineCount '==' $#
assertStdoutGrep --matches=$# '^fileid=.*:name='
local filename
for filename; do
local filehash='[^:]\+'
# If there is a manifest file that looks like it matches this payload
# file, then use its file hash to check the rhizome list output.
if [ -r "$filename.manifest" ]; then
local name=$(sed -n -e '/^name=/s///p' "$filename.manifest")
if [ "$name" == "$filename" ]; then
filehash=$(sed -n -e '/^filehash=/s///p' "$filename.manifest")
fi
fi
assertStdoutGrep --matches=1 "^\(.*:\)\?fileid=$filehash:.*:name=$filename\$"
done
}
strip_signatures() {
for file; do
cat -v "$file" | sed -e '/^^@/,$d' >"tmp.$file" && mv -f "tmp.$file" "$file"
done
2012-04-10 08:31:53 +00:00
}
doc_InitialEmptyList="Initial list is empty"
2012-04-10 08:31:53 +00:00
setup_InitialEmptyList() {
setup_dna_rhizome
2012-04-10 08:31:53 +00:00
}
test_InitialEmptyList() {
assert_rhizome_list
}
doc_AddNoManifest="Add with no manifest file"
setup_AddNoManifest() {
setup_dna_rhizome
assert_rhizome_list
echo "A test file" >file1
echo "Another test file" >file2
}
test_AddNoManifest() {
executeOk $dna rhizome add file file1
}
doc_AddNonExistManifest="Add with non-existent manifest file"
setup_AddNonExistManifest() {
setup_dna_rhizome
assert_rhizome_list
echo "A test file" >file1
echo "Another test file" >file2
}
test_AddNonExistManifest() {
assert --error-on-fail [ ! -e file1.manifest ]
executeOk $dna rhizome add file file1 file1.manifest
assert [ -r file1.manifest ]
tfw_cat -v file1.manifest
assertGrep file1.manifest '^name=file1$'
assertGrep file1.manifest '^date=[0-9]\+$'
assertGrep file1.manifest '^version=[0-9]\+$'
assertGrep file1.manifest '^id=[0-9a-fA-F]\+$'
assertGrep file1.manifest "^filesize=$(cat file1 | wc --bytes)\$"
assertGrep file1.manifest "^first_byte=0$"
assertGrep file1.manifest "^last_byte=$(cat file1 | wc --bytes)\$"
2012-04-10 08:31:53 +00:00
}
doc_AddManifest="Add with minimal manifest file"
2012-04-10 08:31:53 +00:00
setup_AddManifest() {
setup_dna_rhizome
assert_rhizome_list
2012-04-10 08:31:53 +00:00
echo "A test file" >file1
echo -e 'name=wah\ndate=12345' >file1.manifest
2012-04-10 08:31:53 +00:00
echo "Another test file" >file2
}
test_AddManifest() {
executeOk $dna rhizome add file file1 file1.manifest
2012-04-10 08:31:53 +00:00
tfw_cat --stdout
tfw_cat --stderr
tfw_cat -v file1.manifest
assertGrep file1.manifest '^name=wah$'
assertGrep file1.manifest '^date=12345$'
2012-04-10 08:31:53 +00:00
assertGrep file1.manifest '^version=[0-9]\+$'
assertGrep file1.manifest '^id=[0-9a-fA-F]\+$'
assertGrep file1.manifest "^filesize=$(cat file1 | wc --bytes)\$"
2012-04-10 08:31:53 +00:00
assertGrep file1.manifest "^first_byte=0$"
assertGrep file1.manifest "^last_byte=$(cat file1 | wc --bytes)\$"
2012-04-10 08:31:53 +00:00
}
doc_AddThenList="List contains one file after one add"
2012-04-10 08:31:53 +00:00
setup_AddThenList() {
setup_dna_rhizome
assert_rhizome_list
2012-04-10 08:31:53 +00:00
echo "A test file" >file1
echo "Another test file" >file2
}
test_AddThenList() {
# Add first file
executeOk $dna rhizome add file file1 file1.manifest
assert_rhizome_list file1
2012-04-10 08:31:53 +00:00
# Add second file
executeOk $dna rhizome add file file2 file2.manifest
assert_rhizome_list file1 file2
2012-04-10 08:31:53 +00:00
}
doc_AddDuplicate="Add same file detects duplicate"
2012-04-10 08:31:53 +00:00
setup_AddDuplicate() {
setup_dna_rhizome
assert_rhizome_list
2012-04-10 08:31:53 +00:00
echo "A test file" >file1
echo "Another test file" >file2
echo "A test file, second version" >file1_2
2012-04-10 08:31:53 +00:00
# Add first file
executeOk $dna rhizome add file file1 file1.manifest
2012-04-10 08:31:53 +00:00
# Add second file
executeOk $dna rhizome add file file2 file2.manifest
2012-04-10 08:31:53 +00:00
# Make sure they are both in the list.
assert_rhizome_list file1 file2
2012-04-10 08:31:53 +00:00
}
test_AddDuplicate() {
# Add first file again - nothing should change in its manifests, and it
# should appear that the add command succeeded (with perhaps some grumbling
# on stderr).
executeOk $dna rhizome add file file1 file1.manifestA
assert [ -s file1.manifestA ]
assert_rhizome_list file1 file2
strip_signatures file1.manifest file1.manifestA
assert diff file1.manifest file1.manifestA
# Repeat for second file.
executeOk $dna rhizome add file file2 file2.manifestA
assert [ -s file2.manifestA ]
assert_rhizome_list file1 file2
strip_signatures file2.manifest file2.manifestA
assert diff file2.manifest file2.manifestA
}
doc_AddMismatched="Add mismatched manifest/payload fails"
setup_AddMismatched() {
setup_AddDuplicate
}
test_AddMismatched() {
# Try to add another file using an existing manifest, should fail and leave
# the manifest file unchanged.
cp file1.manifest file1_2.manifest
execute $dna rhizome add file file1_2 file1_2.manifest
assertExitStatus '!=' 0
assert cmp file1.manifest file1_2.manifest
# And rhizome store should be unchanged.
assert_rhizome_list file1 file2
}
doc_AddUpdateNoVersion="Add new payload to existing manifest without new version"
setup_AddUpdateNoVersion() {
setup_AddDuplicate
cp file1.manifest file1_2.manifest
strip_signatures file1_2.manifest
sed -i -e '/^date=/d' -e '/^filehash=/d' -e '/^filesize=/d' file1_2.manifest
assertGrep --matches=0 file1_2.manifest '^filehash='
assertGrep file1_2.manifest '^version='
cp file1_2.manifest file1_2.manifest.orig
}
test_AddUpdateNoVersion() {
tfw_cat file1_2.manifest
execute $dna rhizome add file file1_2 file1_2.manifest
assertExitStatus '!=' 0
assert cmp file1_2.manifest file1_2.manifest.orig
# And rhizome store should be unchanged.
assert_rhizome_list file1 file2
}
doc_AddUpdate="Add new version and payload to existing manifest"
setup_AddUpdate() {
setup_AddUpdateNoVersion
version=$(sed -n -e '/^version=/s///p' file1.manifest)
let version=version+1
sed -i -e "/^version=/s/=.*/=$version/" file1_2.manifest
assertGrep --matches=1 file1_2.manifest "^version=$version$"
}
test_AddUpdate() {
tfw_cat file1_2.manifest
executeOk $dna rhizome add file file1_2 file1_2.manifest
# The new manifest must now have a different filehash from the original.
filehash1=$(sed -n -e '/^filehash=/s///p' file1.manifest)
filehash1_2=$(sed -n -e '/^filehash=/s///p' file1_2.manifest)
assert [ -n "$filehash1" ]
assert [ -n "$filehash1_2" ]
assert [ "$filehash1" != "$filehash1_2" ]
# Rhizome store contents reflect new payload.
mv -f file1_2.manifest file1.manifest
assert_rhizome_list file1 file2
2012-04-10 08:31:53 +00:00
}
runTests "$@"