#!/bin/bash # Tests for Serval rhizome protocol. # # 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" source "${0%/*}/../testdefs_rhizome.sh" shopt -s extglob teardown() { stop_all_servald_servers kill_all_servald_processes assert_no_servald_processes } setup_rhizome() { set_instance +A create_rhizome_identities 1 set_instance +B create_rhizome_identities 1 } # Called by start_servald_instances for each instance. configure_servald_server() { executeOk_servald config set log.show_pid on executeOk_servald config set log.show_time on executeOk_servald config set debug.rhizome on executeOk_servald config set debug.rhizometx on executeOk_servald config set debug.rhizomerx on executeOk_servald config set server.respawn_on_signal off executeOk_servald config set mdp.wifi.tick_ms 100 executeOk_servald config set mdp.selfannounce.ticks_per_full_address 1 executeOk_servald config set rhizome.fetch_interval_ms 100 } # Predicate function: # - return true if the file bundle identified by arg1=BID and arg2=VERSION has been # received by all the given instances # - does this by examining the server log files of the respective instances # for tell-tale INFO messages bundle_received_by() { local BID="$1" local VERSION="$2" shift 2 local I for I; do case "$I" in +*) logvar="LOG${I#+}" grep "RHIZOME ADD MANIFEST service=file bid=$BID version=$VERSION" "${!logvar}" || return 1 ;; *) error "invalid instance argument: $I" ;; esac done return 0 } setup_common() { setup_servald setup_rhizome assert_no_servald_processes } extract_manifest_vars() { local manifest="${1?}" extract_manifest_id BID "$manifest" extract_manifest_version VERSION "$manifest" extract_manifest_filesize FILESIZE "$manifest" FILEHASH= if [ "$FILESIZE" != '0' ]; then extract_manifest_filehash FILEHASH "$manifest" fi } add_file() { local name="$1" [ -e "$name" ] || echo 'File $name' >"$name" local sidvar="SID$instance_name" executeOk_servald rhizome add file "${!sidvar}" '' "$name" "$name.manifest" executeOk_servald rhizome list '' assert_rhizome_list "$name" extract_manifest_vars "$name.manifest" } update_file() { local orig_name="$1" local new_name="$2" [ -e "$new_name" ] || echo 'File $new_name' >"$new_name" local sidvar="SID$instance_name" [ "$new_name" != "$orig_name" ] && cp "$orig_name.manifest" "$new_name.manifest" sed -i -e '/^date=/d;/^filehash=/d;/^filesize=/d;/^version=/d;/^name=/d' "$new_name.manifest" executeOk_servald rhizome add file "${!sidvar}" '' "$new_name" "$new_name.manifest" executeOk_servald rhizome list '' assert_rhizome_list "$new_name" extract_manifest_vars "$new_name.manifest" } doc_FileTransfer="New bundle and update transfer to one node" setup_FileTransfer() { setup_common set_instance +A add_file file1 start_servald_instances +A +B } test_FileTransfer() { wait_until bundle_received_by $BID $VERSION +B set_instance +B assert_received file1 set_instance +A update_file file1 file2 set_instance +B wait_until bundle_received_by $BID $VERSION +B assert_received file2 } doc_FileTransferBig="Big new bundle transfers to one node" setup_FileTransferBig() { setup_common set_instance +A dd if=/dev/urandom of=file1 bs=1k count=1k 2>&1 echo x >>file1 ls -l file1 add_file file1 start_servald_instances +A +B } test_FileTransferBig() { wait_until bundle_received_by $BID $VERSION +B set_instance +B assert_received file1 } assert_received() { local name="${1?}" executeOk_servald rhizome list '' assert_rhizome_list "$name!" local _hash if [ -s "$name" ]; then extract_manifest_filehash _hash "$name.manifest" executeOk_servald rhizome extract file "$_hash" extracted assert cmp "$name" extracted fi } doc_FileTransferMulti="New bundle transfers to four nodes" setup_FileTransferMulti() { setup_common set_instance +A add_file file1 start_servald_instances +A +B +C +D +E } test_FileTransferMulti() { wait_until bundle_received_by $BID $VERSION +B +C +D +E local I for I in +B +C +D +E; do set_instance $I assert_received file1 done } doc_FileTransferDelete="Payload deletion transfers to one node" setup_FileTransferDelete() { setup_common set_instance +A add_file file1 start_servald_instances +A +B wait_until bundle_received_by $BID $VERSION +B set_instance +A >file1_2 update_file file1 file1_2 } test_FileTransferDelete() { wait_until bundle_received_by $BID $VERSION +B set_instance +B assert_received file1_2 } setup_sync() { set_instance +A add_file file1 BID1=$BID VERSION1=$VERSION start_servald_instances dummy1 +A wait_until rhizome_http_server_started +A get_rhizome_server_port PORTA +A set_instance +B add_file file2 BID2=$BID VERSION2=$VERSION executeOk_servald config set rhizome.direct.address "$addr_localhost" executeOk_servald config set rhizome.direct.port "$PORTA" start_servald_instances dummy2 +B } doc_Push="One way push bundle to unconnected node" setup_Push() { setup_common setup_sync } test_Push() { executeOk_servald rhizome push assert bundle_received_by $BID1 $VERSION1 +B assert ! bundle_received_by $BID2 $VERSION2 +A set_instance +B assert_received file1 } doc_Pull="One way pull bundle from unconnected node" setup_Pull() { setup_common setup_sync } test_Pull() { executeOk_servald rhizome pull assert bundle_received_by $BID2 $VERSION2 +A assert ! bundle_received_by $BID1 $VERSION1 +B set_instance +A assert_received file2 } doc_Sync="Two-way sync bundles between unconnected nodes" setup_Sync() { setup_common setup_sync } test_Sync() { executeOk_servald rhizome sync assert bundle_received_by $BID2 $VERSION2 +A assert bundle_received_by $BID1 $VERSION1 +B set_instance +A assert_received file2 set_instance +B assert_received file1 } doc_HttpImport="Import bundle using HTTP POST multi-part form." setup_HttpImport() { case "$(curl --version | tr '\n' ' ')" in curl\ @(7|8|9|[1-9][0-1]).*\ Protocols:*\ http\ *) ;; '') fail "curl(1) command is not present";; *) fail "curl(1) version is not adequate (expecting 7 or higher)";; esac setup_common start_servald_instances +A wait_until rhizome_http_server_started +A get_rhizome_server_port PORTA +A } test_HttpImport() { cat > manifest < data <file1 executeOk curl --silent --form 'data=@file1' "$addr_localhost:$PORTA" --output file1.manifest assert_manifest_complete file1.manifest executeOk_servald rhizome list '' assert_rhizome_list file1 extract_manifest_name name file1.manifest assert [ "$name" = file1 ] } runTests "$@"