serval-dna/tests/dna_rhizome

583 lines
20 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_servald_rhizome() {
setup_servald "$@"
executeOk $servald config set debug.rhizome on
executeOk $servald keyring add
executeOk $servald keyring add
executeOk $servald keyring add
executeOk $servald keyring add
executeOk $servald keyring list
sid=$(replayStdout | sed -ne '1s/^\([0-9a-fA-F]\{64\}\):.*$/\1/p')
sid1=$(replayStdout | sed -ne '2s/^\([0-9a-fA-F]\{64\}\):.*$/\1/p')
sid2=$(replayStdout | sed -ne '3s/^\([0-9a-fA-F]\{64\}\):.*$/\1/p')
sid3=$(replayStdout | sed -ne '4s/^\([0-9a-fA-F]\{64\}\):.*$/\1/p')
assert --message='main identity known' [ -n "$sid" ]
assert --message='identity 1 known' [ -n "$sid1" ]
assert --message='identity 2 known' [ -n "$sid2" ]
assert --message='identity 3 known' [ -n "$sid3" ]
}
assert_rhizome_list() {
assertStdoutLineCount '==' $(($# + 2))
assertStdoutIs --line=1 -e '8\n'
assertStdoutIs --line=2 -e 'service:fileid:manifestid:version:inserttime:length:date:name\n'
local filename
for filename; do
unpack_manifest_for_grep "$filename"
assertStdoutGrep --matches=1 "^$re_service:$re_filehash:$re_manifestid:.*:$re_name\$"
done
}
assert_stdout_add_file() {
local filename="$1"
unpack_manifest_for_grep "$filename"
assertStdoutLineCount '==' 5
assertStdoutGrep --matches=1 "^service:$re_service\$"
assertStdoutGrep --matches=1 "^name:${2:-$re_name}\$"
assertStdoutGrep --matches=1 "^manifestid:$re_manifestid\$"
assertStdoutGrep --matches=1 "^filehash:$re_filehash\$"
assertStdoutGrep --matches=1 "^filesize:$re_size\$"
}
unpack_manifest_for_grep() {
local filename="$1"
re_service='[A-Za-z0-9_]\+'
re_size=$(( $(cat "$filename" | wc -c) + 0 ))
re_filehash=$($servald rhizome hash file "$filename")
if [ -z "$re_filehash" ]; then
error "Could not compute rhizome hash of $filename"
fi
re_manifestid='[0-9a-fA-F]\{64\}'
re_name="${filename##*/}" # TODO should escape grep metacharacters
# 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.
local filehash=$(sed -n -e '/^filehash=/s///p' "$filename.manifest" 2>/dev/null)
if [ "$filehash" = "$re_filehash" ]; then
re_manifestid=$(sed -n -e '/^id=/s///p' "$filename.manifest")
# TODO should escape grep metacharacters, although service names should be tame
re_service=$(sed -n -e '/^service=/s///p' "$filename.manifest")
case "$re_service" in
file)
# TODO should escape grep metacharacters
re_name=$(sed -n -e '/^name=/s///p' "$filename.manifest")
;;
*)
re_name=
;;
esac
fi
}
assert_manifest_newer() {
local manifest1="$1"
local manifest2="$2"
# The new manifest must have a higher version than the original.
extract_manifest_version oldversion "$manifest1"
extract_manifest_version newversion "$manifest2"
assert [ $newversion -gt $oldversion ]
# The new manifest must have a different filehash from the original.
extract_manifest_filehash oldfilehash "$manifest1"
extract_manifest_filehash newfilehash "$manifest2"
assert [ $oldfilehash != $newfilehash ]
}
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
}
extract_manifest() {
2012-05-02 06:33:09 +00:00
local _var="$1"
local _manifestfile="$2"
local _label="$3"
local _rexp="$4"
local _value=$(sed -n -e "/^$_label=$_rexp\$/s/^$_label=//p" "$_manifestfile")
assert --message="$_manifestfile contains valid '$_label=' line" \
--dump-on-fail="$_manifestfile" \
[ -n "$_value" ]
[ -n "$_var" ] && eval $_var=$_value
2012-05-02 06:33:09 +00:00
}
extract_manifest_service() {
extract_manifest "$1" "$2" service '[0-9a-zA-Z]\+'
}
extract_manifest_id() {
extract_manifest "$1" "$2" id '[0-9a-fA-F]\{64\}'
}
extract_manifest_BK() {
extract_manifest "$1" "$2" BK '[0-9a-fA-F]\{128\}'
}
extract_manifest_filehash() {
extract_manifest "$1" "$2" filehash '[0-9a-fA-F]\{128\}'
}
extract_manifest_version() {
extract_manifest "$1" "$2" version '[0-9]\{1,\}'
}
doc_InitialEmptyList="Initial list is empty"
2012-04-10 08:31:53 +00:00
setup_InitialEmptyList() {
setup_servald_rhizome
2012-04-10 08:31:53 +00:00
}
test_InitialEmptyList() {
executeOk $servald rhizome list
assert_rhizome_list
}
doc_AddNoAuthorNoManifest="Add with no author and no manifest file"
setup_AddNoAuthorNoManifest() {
setup_servald_rhizome
executeOk $servald rhizome list
assert_rhizome_list
echo "A test file" >file1
echo "Another test file" >file2
}
test_AddNoAuthorNoManifest() {
executeOk $servald rhizome add file '' '' file1
assert_stdout_add_file file1
}
doc_AddNoManifest="Add with no manifest file"
setup_AddNoManifest() {
setup_servald_rhizome
executeOk $servald rhizome list
assert_rhizome_list
echo "A test file" >file1
echo "Another test file" >file2
}
test_AddNoManifest() {
executeOk $servald rhizome add file $sid '' file1
assert_stdout_add_file file1
}
doc_AddNonExistManifest="Add with non-existent manifest file"
setup_AddNonExistManifest() {
setup_servald_rhizome
executeOk $servald rhizome list
assert_rhizome_list
echo "A test file" >file1
echo "Another test file" >file2
}
test_AddNonExistManifest() {
assert --error-on-fail [ ! -e file1.manifest ]
executeOk $servald rhizome add file $sid '' file1 file1.manifest
assert_stdout_add_file file1
assert [ -r file1.manifest ]
tfw_cat -v file1.manifest
assertGrep file1.manifest '^service=file$'
assertGrep file1.manifest '^BK=[0-9a-fA-F]\+$'
assertGrep file1.manifest '^name=file1$'
assertGrep file1.manifest '^date=[0-9]\+$'
assertGrep file1.manifest '^version=[0-9]\+$'
assertGrep file1.manifest "^id=$re_manifestid\$"
assertGrep file1.manifest "^filehash=$re_filehash\$"
assertGrep file1.manifest "^filesize=$re_size\$"
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_servald_rhizome
executeOk $servald rhizome list
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 $servald rhizome add file $sid '' file1 file1.manifest
tfw_cat --stdout --stderr -v file1.manifest
assert_stdout_add_file file1 wah
assertGrep file1.manifest '^service=file$'
assertGrep file1.manifest '^BK=[0-9a-fA-F]\+$'
assertGrep file1.manifest '^name=wah$'
2012-04-10 08:31:53 +00:00
assertGrep file1.manifest '^version=[0-9]\+$'
2012-05-02 06:33:09 +00:00
assertGrep file1.manifest '^date=12345$'
assertGrep file1.manifest "^id=$re_manifestid\$"
assertGrep file1.manifest "^filehash=$re_filehash\$"
assertGrep file1.manifest "^filesize=$re_size\$"
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_servald_rhizome
executeOk $servald rhizome list
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 $servald rhizome add file $sid '' file1 file1.manifest
executeOk $servald rhizome list
assert_rhizome_list file1
2012-04-10 08:31:53 +00:00
# Add second file
executeOk $servald rhizome add file $sid '' file2 file2.manifest
executeOk $servald rhizome list
assert_rhizome_list file1 file2
2012-04-10 08:31:53 +00:00
}
doc_AddThenExtractManifest="Extract manifest after one add"
setup_AddThenExtractManifest() {
setup_servald_rhizome
2012-05-02 06:33:09 +00:00
echo "A test file" >file1
executeOk $servald rhizome add file $sid '' file1 file1.manifest
executeOk $servald rhizome list
2012-05-02 06:33:09 +00:00
assert_rhizome_list file1
extract_manifest_id manifestid file1.manifest
extract_manifest_version version file1.manifest
extract_manifest_filehash filehash file1.manifest
2012-05-02 06:33:09 +00:00
}
test_AddThenExtractManifest() {
executeOk $servald rhizome extract manifest $manifestid file1x.manifest
2012-05-02 06:33:09 +00:00
assert cmp file1.manifest file1x.manifest
assertStdoutLineCount '==' 6
local size=$(( $(cat file1 | wc -c) + 0 ))
assertStdoutGrep --matches=1 "^service:file$"
assertStdoutGrep --matches=1 "^manifestid:$manifestid$"
assertStdoutGrep --matches=1 "^version:$version$"
assertStdoutGrep --matches=1 "^inserttime:[0-9]\+$"
assertStdoutGrep --matches=1 "^filehash:$filehash$"
assertStdoutGrep --matches=1 "^filesize:$size$"
2012-05-02 06:33:09 +00:00
}
doc_ExtractMissingManifest="Extract non-existent manifest"
setup_ExtractMissingManifest() {
setup_servald_rhizome
manifestid=0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
}
test_ExtractMissingManifest() {
execute --exit-status=1 $servald rhizome extract manifest $manifestid foo.manifest
assertStdoutLineCount '==' 0
assert [ ! -e foo.manifest ]
}
doc_ExtractManifestInvalidID="Extract manifest using invalid ID"
setup_ExtractManifestInvalidID() {
setup_servald_rhizome
}
test_ExtractManifestInvalidID() {
execute --exit-status=255 $servald rhizome extract manifest 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEx foo.manifest
assertStdoutLineCount '==' 0
assert [ ! -e foo.manifest ]
execute --exit-status=255 $servald rhizome extract manifest 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDE foo.manifest
assertStdoutLineCount '==' 0
assert [ ! -e foo.manifest ]
execute --exit-status=255 $servald rhizome extract manifest '' foo.manifest
assertStdoutLineCount '==' 0
assert [ ! -e foo.manifest ]
}
doc_AddThenExtractFile="Extract file after one add"
setup_AddThenExtractFile() {
setup_servald_rhizome
echo "A test file" >file1
executeOk $servald rhizome add file $sid '' file1 file1.manifest
executeOk $servald rhizome list
assert_rhizome_list file1
extract_manifest_filehash filehash file1.manifest
}
test_AddThenExtractFile() {
executeOk $servald rhizome extract file $filehash file1x
assert cmp file1 file1x
local size=$(( $(cat file1 | wc -c) + 0 ))
assertStdoutLineCount '==' 2
assertStdoutGrep --matches=1 "^filehash:$filehash$"
assertStdoutGrep --matches=1 "^filesize:$size$"
}
doc_ExtractMissingFile="Extract non-existent file"
setup_ExtractMissingFile() {
setup_servald_rhizome
filehash=0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
}
test_ExtractMissingFile() {
execute --exit-status=1 $servald rhizome extract file $filehash foo
assertStdoutLineCount '==' 0
assert [ ! -e foo ]
}
doc_ExtractFileInvalidID="Extract file using invalid ID"
setup_ExtractFileInvalidID() {
setup_servald_rhizome
}
test_ExtractFileInvalidID() {
execute --exit-status=255 $servald rhizome extract file 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEx foo
assertStdoutLineCount '==' 0
assert [ ! -e foo ]
execute --exit-status=255 $servald rhizome extract file 0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDE foo
assertStdoutLineCount '==' 0
assert [ ! -e foo ]
execute --exit-status=255 $servald rhizome extract file '' foo
assertStdoutLineCount '==' 0
assert [ ! -e foo ]
}
doc_AddDuplicate="Add same manifest detects duplicate"
2012-04-10 08:31:53 +00:00
setup_AddDuplicate() {
setup_servald_rhizome
executeOk $servald rhizome list
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 $servald rhizome add file $sid '' file1 file1.manifest
2012-04-10 08:31:53 +00:00
# Add second file
executeOk $servald rhizome add file $sid '' file2 file2.manifest
2012-04-10 08:31:53 +00:00
# Make sure they are both in the list.
executeOk $servald rhizome 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).
execute --exit-status=2 $servald rhizome add file $sid '' file1 file1.manifestA
assert [ -s file1.manifestA ]
assert_stdout_add_file file1
executeOk $servald rhizome list
assert_rhizome_list file1 file2
strip_signatures file1.manifest file1.manifestA
assert diff file1.manifest file1.manifestA
# Repeat for second file.
execute --exit-status=2 $servald rhizome add file $sid '' file2 file2.manifestA
assert [ -s file2.manifestA ]
assert_stdout_add_file file2
executeOk $servald rhizome list
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 $servald rhizome add file $sid '' file1_2 file1_2.manifest
assertExitStatus '!=' 0
assert cmp file1.manifest file1_2.manifest
# And rhizome store should be unchanged.
executeOk $servald rhizome list
assert_rhizome_list file1 file2
}
doc_AddUpdateSameVersion="Add new payload to existing manifest with same version fails"
setup_AddUpdateSameVersion() {
setup_AddDuplicate
cp file1.manifest file1_2.manifest
strip_signatures file1_2.manifest
sed -i -e '/^date=/d;/^filehash=/d;/^filesize=/d' file1_2.manifest
tfw_cat -v file1_2.manifest
assertGrep --matches=0 file1_2.manifest '^filehash='
extract_manifest_version '' file1_2.manifest # asserts has version= line
assertGrep file1_2.manifest '^id='
cp file1_2.manifest file1_2.manifest.orig
}
test_AddUpdateSameVersion() {
tfw_cat -v file1_2.manifest
execute $servald rhizome add file $sid '' file1_2 file1_2.manifest
assertExitStatus --stderr '!=' 0
tfw_cat -v file1_2.manifest
assert cmp file1_2.manifest file1_2.manifest.orig
# And rhizome store should be unchanged.
executeOk $servald rhizome list
assert_rhizome_list file1 file2
}
doc_AddUpdateNewVersion="Add new payload to existing manifest with new version"
setup_AddUpdateNewVersion() {
setup_AddUpdateSameVersion
extract_manifest_version version file1_2.manifest
let version=version+1
sed -i -e "/^version=/s/=.*/=$version/" file1_2.manifest
assertGrep --matches=1 file1_2.manifest "^version=$version$"
}
test_AddUpdateNewVersion() {
tfw_cat -v file1_2.manifest
executeOk $servald rhizome add file $sid '' file1_2 file1_2.manifest
assert_stdout_add_file file1_2 file1
assert_manifest_newer file1.manifest file1_2.manifest
# Rhizome store contents reflect new payload.
executeOk $servald rhizome list
assert_rhizome_list file1_2 file2
}
doc_AddUpdateAutoVersion="Add new payload to existing manifest with automatic version"
setup_AddUpdateAutoVersion() {
setup_AddUpdateSameVersion
sed -i -e '/^version=/d' file1_2.manifest
assertGrep --matches=0 file1_2.manifest '^version='
}
test_AddUpdateAutoVersion() {
tfw_cat -v file1_2.manifest
sleep 0.001 # Ensure that at least one millisecond has elapsed
executeOk $servald rhizome add file $sid '' file1_2 file1_2.manifest
assert_manifest_newer file1.manifest file1_2.manifest
# Rhizome store contents reflect new payload.
executeOk $servald rhizome list
assert_rhizome_list file1_2 file2
}
doc_AddUnsupportedService="Add with unsupported service fails"
setup_AddUnsupportedService() {
setup_servald_rhizome
echo "Message1" >file1
echo -e 'service=Fubar' >file1.manifest
}
test_AddUnsupportedService() {
execute $servald rhizome add file $sid '' file1 file1.manifest
assertExitStatus '!=' 0
}
doc_AddMeshMSCreate="First add MeshMS creates manifest"
setup_AddMeshMSCreate() {
setup_servald_rhizome
echo "Message1" >file1
echo -e "service=MeshMS1\nsender=$sid\nrecipient=$sid1" >file1.manifest
}
test_AddMeshMSCreate() {
executeOk $servald rhizome add file $sid '' file1 file1.manifest
executeOk $servald rhizome list
assert_rhizome_list file1
extract_manifest_filehash filehash file1.manifest
executeOk $servald rhizome extract file $filehash file1x
assert diff file1 file1x
}
doc_AddMeshMSGrow="Second add MeshMS updates manifest"
setup_AddMeshMSGrow() {
setup_servald_rhizome
echo "Message1" >file1
echo "Message2" >file2
echo -e "service=MeshMS1\nsender=$sid\nrecipient=$sid1" >file1.manifest
executeOk $servald rhizome add file $sid '' file1 file1.manifest
extract_manifest_id id file1.manifest
extract_manifest_BK bk file1.manifest
echo -e "id=$id\nBK=$bk\nservice=MeshMS1\nsender=$sid\nrecipient=$sid1" >file2.manifest
}
test_AddMeshMSGrow() {
executeOk $servald rhizome add file $sid '' file2 file2.manifest
extract_manifest_filehash filehash file2.manifest
executeOk $servald rhizome list
assert_rhizome_list file2
executeOk $servald rhizome extract file $filehash file2x
assert diff file2 file2x
}
doc_AddMeshMSMissingSender="Add MeshMS without sender fails"
setup_AddMeshMSMissingSender() {
setup_servald_rhizome
echo "Message1" >file1
echo -e "service=MeshMS1\nrecipient=$sid1" >file1.manifest
}
test_AddMeshMSMissingSender() {
execute $servald rhizome add file $sid '' file1 file1.manifest
assertExitStatus '!=' 0
}
doc_AddMeshMSMissingRecipient="Add MeshMS without recipient fails"
setup_AddMeshMSMissingRecipient() {
setup_servald_rhizome
executeOk $servald rhizome list
assert_rhizome_list
echo "Message1" >file1
echo -e "service=MeshMS1\nsender=$sid" >file1.manifest
}
test_AddMeshMSMissingRecipient() {
execute $servald rhizome add file $sid '' file1 file1.manifest
assertExitStatus '!=' 0
}
doc_AddMeshMSMissingSender="Add MeshMS without author uses sender"
setup_AddMeshMSMissingSender() {
setup_servald_rhizome
echo "Message1" >file1
echo -e "service=MeshMS1\nsender=$sid\nrecipient=$sid1" >file1.manifest
}
test_AddMeshMSMissingSender() {
executeOk $servald rhizome add file '' '' file1 file1.manifest
executeOk $servald rhizome list
assert_rhizome_list file1
}
doc_ListMeshMSFilter="List MeshMS manifests by filter"
setup_ListMeshMSFilter() {
setup_servald_rhizome
echo "Message1" >file1
echo -e "service=MeshMS1\nsender=$sid\nrecipient=$sid1" >file1.manifest
echo "Message2" >file2
echo -e "service=MeshMS1\nsender=$sid\nrecipient=$sid2" >file2.manifest
echo "Message3" >file3
echo -e "service=MeshMS1\nsender=$sid\nrecipient=$sid3" >file3.manifest
echo "Message3" >file4
echo -e "service=MeshMS1\nsender=$sid1\nrecipient=$sid2" >file4.manifest
executeOk $servald rhizome add file '' '' file1 file1.manifest
executeOk $servald rhizome add file '' '' file2 file2.manifest
executeOk $servald rhizome add file '' '' file3 file3.manifest
executeOk $servald rhizome add file '' '' file4 file4.manifest
executeOk $servald rhizome list
assert_rhizome_list file1 file2 file3 file4
}
test_ListMeshMSFilter() {
executeOk $servald rhizome list file
assert_rhizome_list
executeOk $servald rhizome list MeshMS1
assert_rhizome_list file1 file2 file3 file4
executeOk $servald rhizome list '' $sid
assert_rhizome_list file1 file2 file3
executeOk $servald rhizome list '' $sid1
assert_rhizome_list file4
executeOk $servald rhizome list '' $sid2
assert_rhizome_list
executeOk $servald rhizome list '' $sid3
assert_rhizome_list
executeOk $servald rhizome list '' '' $sid
assert_rhizome_list
executeOk $servald rhizome list '' '' $sid1
assert_rhizome_list file1
executeOk $servald rhizome list '' '' $sid2
assert_rhizome_list file2 file4
executeOk $servald rhizome list file '' $sid2
assert_rhizome_list
executeOk $servald rhizome list '' '' $sid3
assert_rhizome_list file3
executeOk $servald rhizome list '' $sid $sid3
assert_rhizome_list file3
executeOk $servald rhizome list '' $sid1 $sid3
assert_rhizome_list
executeOk $servald rhizome list '' $sid1 $sid2
assert_rhizome_list file4
2012-04-10 08:31:53 +00:00
}
runTests "$@"