#!/bin/bash source "${0%/*}/../testframework.sh" source "${0%/*}/../testdefs.sh" source "${0%/*}/../testdefs_json.sh" setup_instance() { set_instance $1 executeOk_servald config \ set api.restful.users.harry.password potter \ set api.restful.users.ron.password weasley \ set api.restful.users.hermione.password grainger \ set debug.http_server on \ set debug.httpd on \ set debug.meshmb on \ set debug.meshms on \ set debug.verbose on \ set log.console.level debug set_extra_config if [ -z "$IDENTITY_COUNT" ]; then create_single_identity else create_identities $IDENTITY_COUNT fi } set_extra_config() { : } setup() { setup_curl 7 setup_json setup_servald export SERVALD_RHIZOME_DB_RETRY_LIMIT_MS=60000 setup_instance +A start_servald_instances +A wait_until servald_restful_http_server_started +A get_servald_restful_http_server_port PORTA +A } finally() { stop_all_servald_servers } teardown() { kill_all_servald_processes assert_no_servald_processes report_all_servald_servers } doc_MeshMBRestSend="Restful send of a broadcast message" test_MeshMBRestSend() { executeOk curl \ --silent --fail --show-error \ --output sendmessage.json \ --basic --user harry:potter \ --form "message=Hello World;type=text/plain;charset=utf-8" \ "http://$addr_localhost:$PORTA/restful/meshmb/$IDA1/sendmessage" executeOk_servald rhizome export bundle $IDA1 broadcast.manifest broadcast tfw_cat -h broadcast.manifest tfw_cat -h broadcast } doc_MeshMBRestList="Restful list of meshmb messages" setup_MeshMBRestList() { setup executeOk_servald meshmb send $IDA1 "Message 1" executeOk_servald meshmb send $IDA1 "Message 2" } test_MeshMBRestList() { executeOk curl \ --silent --fail --show-error \ --output listmessages.json \ --dump-header http.headers \ --basic --user harry:potter \ "http://$addr_localhost:$PORTA/restful/meshmb/$IDA1/messagelist.json" tfw_cat http.headers listmessages.json tfw_preserve listmessages.json assert [ "$(jq '.rows | length' listmessages.json)" = 2 ] transform_list_json listmessages.json list.json tfw_preserve list.json assertJq list.json \ "contains([ { offset: 12, text: \"Message 1\" } ])" assertJq list.json \ "contains([ { offset: 30, text: \"Message 2\" } ])" } doc_MeshMBRestFollow="Restful follow another feed" setup_MeshMBRestFollow() { IDENTITY_COUNT=3 setup executeOk_servald meshmb send $IDA1 "Message 1" executeOk_servald meshmb send $IDA2 "Message 2" executeOk_servald meshmb send $IDA3 "Message 3" } test_MeshMBRestFollow() { executeOk curl \ --silent --fail --show-error \ --output follow.json \ --basic --user harry:potter \ --request POST \ "http://$addr_localhost:$PORTA/restful/meshmb/$IDA1/follow/$IDA2" executeOk_servald meshmb list following $IDA1 assertStdoutGrep --matches=1 ":$IDA2:$SIDA2:false::[0-9]\+:Message 2\$" assertStdoutGrep --matches=0 ":$IDA3:$SIDA3:false::[0-9]\+:Message 3\$" executeOk curl \ --silent --fail --show-error \ --output follow.json \ --basic --user harry:potter \ --request POST \ "http://$addr_localhost:$PORTA/restful/meshmb/$IDA1/follow/$IDA3" executeOk_servald meshmb list following $IDA1 assertStdoutGrep --matches=1 ":$IDA2:$SIDA2:false::[0-9]\+:Message 2\$" assertStdoutGrep --matches=1 ":$IDA3:$SIDA3:false::[0-9]\+:Message 3\$" executeOk curl \ --silent --fail --show-error \ --output follow.json \ --basic --user harry:potter \ --request POST \ "http://$addr_localhost:$PORTA/restful/meshmb/$IDA1/ignore/$IDA2" executeOk_servald meshmb list following $IDA1 assertStdoutGrep --matches=0 ":$IDA2:$SIDA2:false::[0-9]\+:Message 2\$" assertStdoutGrep --matches=1 ":$IDA3:$SIDA3:false::[0-9]\+:Message 3\$" } doc_MeshMBRestFeeds="Restful list subscribed feeds" setup_MeshMBRestFeeds() { IDENTITY_COUNT=3 setup executeOk_servald meshmb send $IDA1 "Message 1" executeOk_servald meshmb send $IDA2 "Message 2" executeOk_servald meshmb send $IDA3 "Message 3" executeOk_servald meshmb follow $IDA1 $IDA2 executeOk_servald meshmb follow $IDA1 $IDA3 } test_MeshMBRestFeeds() { executeOk curl \ --silent --fail --show-error \ --output feedlist.json \ --dump-header http.headers \ --basic --user harry:potter \ "http://$addr_localhost:$PORTA/restful/meshmb/$IDA1/feedlist.json" tfw_cat http.headers feedlist.json tfw_preserve feedlist.json assert [ "$(jq '.rows | length' feedlist.json)" = 2 ] transform_list_json feedlist.json list.json tfw_preserve list.json assertJq list.json \ "contains([ { id: \"$IDA2\", last_message: \"Message 2\" } ])" assertJq list.json \ "contains([ { id: \"$IDA3\", last_message: \"Message 3\" } ])" } doc_MeshMBRestEmptyActivity="Restful activity with no content" setup_MeshMBRestEmptyActivity() { IDENTITY_COUNT=1 setup } test_MeshMBRestEmptyActivity() { executeOk --timeout=10 curl \ --silent --fail --show-error \ --output activity.json \ --dump-header http.headers \ --basic --user harry:potter \ "http://$addr_localhost:$PORTA/restful/meshmb/$IDA1/activity.json" tfw_cat http.headers activity.json tfw_preserve activity.json assert [ "$(jq '.rows | length' activity.json)" = 0 ] transform_list_json activity.json list.json tfw_preserve list.json } doc_MeshMBRestActivity="Restful thread incoming activity" setup_MeshMBRestActivity() { IDENTITY_COUNT=5 setup executeOk_servald keyring set did $SIDA1 "" "Feed A" executeOk_servald keyring set did $SIDA2 "" "Feed B" executeOk_servald keyring set did $SIDA3 "" "Feed C" executeOk_servald keyring set did $SIDA4 "" "Feed D" executeOk_servald keyring set did $SIDA5 "" "Feed E" executeOk_servald meshmb send $IDA2 "Message 2" executeOk_servald meshmb send $IDA3 "Message 3" executeOk_servald meshmb follow $IDA1 $IDA2 executeOk_servald meshmb follow $IDA1 $IDA3 executeOk_servald meshmb send $IDA4 "Message 4" executeOk_servald meshmb follow $IDA1 $IDA4 executeOk_servald meshmb send $IDA4 "Message 5" executeOk_servald meshmb activity $IDA1 executeOk_servald meshmb send $IDA5 "Message 6" executeOk_servald meshmb follow $IDA1 $IDA5 executeOk_servald meshmb send $IDA2 "Message 7" executeOk_servald meshmb activity $IDA1 executeOk_servald meshmb send $IDA3 "Message 8" executeOk_servald meshmb activity $IDA1 executeOk_servald meshmb send $IDA4 "Message 9" executeOk_servald meshmb activity $IDA1 executeOk_servald meshmb send $IDA5 "Message 10" executeOk_servald meshmb activity $IDA1 executeOk_servald meshmb send $IDA1 "Message 11" executeOk_servald meshmb activity $IDA1 } test_MeshMBRestActivity() { executeOk curl \ --silent --fail --show-error \ --output activity.json \ --dump-header http.headers \ --basic --user harry:potter \ "http://$addr_localhost:$PORTA/restful/meshmb/$IDA1/activity.json" tfw_cat http.headers activity.json tfw_preserve activity.json assert [ "$(jq '.rows | length' activity.json)" = 10 ] transform_list_json activity.json list.json tfw_preserve list.json assertJq list.json "contains([{ __index: 0, id: \"$IDA1\", author: \"$SIDA1\", name: \"Feed A\", message: \"Message 11\"}])" assertJq list.json "contains([{ __index: 1, id: \"$IDA5\", author: \"$SIDA5\", name: \"Feed E\", message: \"Message 10\"}])" assertJq list.json "contains([{ __index: 2, id: \"$IDA4\", author: \"$SIDA4\", name: \"Feed D\", message: \"Message 9\"}])" assertJq list.json "contains([{ __index: 3, id: \"$IDA3\", author: \"$SIDA3\", name: \"Feed C\", message: \"Message 8\"}])" assertJq list.json "contains([{ __index: 4, id: \"$IDA2\", author: \"$SIDA2\", name: \"Feed B\", message: \"Message 7\"}])" assertJq list.json "contains([{ __index: 5, id: \"$IDA5\", author: \"$SIDA5\", name: \"Feed E\", message: \"Message 6\"}])" assertJq list.json "contains([{ __index: 6, id: \"$IDA4\", author: \"$SIDA4\", name: \"Feed D\", message: \"Message 5\"}])" assertJq list.json "contains([{ __index: 7, id: \"$IDA4\", author: \"$SIDA4\", name: \"Feed D\", message: \"Message 4\"}])" assertJq list.json "contains([{ __index: 8, id: \"$IDA3\", author: \"$SIDA3\", name: \"Feed C\", message: \"Message 3\"}])" assertJq list.json "contains([{ __index: 9, id: \"$IDA2\", author: \"$SIDA2\", name: \"Feed B\", message: \"Message 2\"}])" } doc_MeshMBRestNewActivity="Restful newsince incoming activity" setup_MeshMBRestNewActivity() { IDENTITY_COUNT=3 setup executeOk_servald keyring set did $SIDA1 "" "Feed A" executeOk_servald keyring set did $SIDA2 "" "Feed B" executeOk_servald keyring set did $SIDA3 "" "Feed C" executeOk_servald meshmb send $IDA2 "Message 1" executeOk_servald meshmb send $IDA3 "Message 2" executeOk_servald meshmb follow $IDA1 $IDA2 executeOk_servald meshmb follow $IDA1 $IDA3 executeOk curl \ --silent --fail --show-error \ --output activity.json \ --dump-header http.headers \ --basic --user harry:potter \ "http://$addr_localhost:$PORTA/restful/meshmb/$IDA1/activity.json" assert [ "$(jq '.rows | length' activity.json)" = 2 ] transform_list_json activity.json array_of_objects.json tfw_preserve array_of_objects.json token=$(jq --raw-output '.[0][".token"]' array_of_objects.json) assert [ -n "$token" ] } test_MeshMBRestNewActivity() { for i in 1 2 3; do fork %curl$i curl \ --silent --fail --show-error \ --no-buffer \ --output newsince$i.json \ --basic --user harry:potter \ "http://$addr_localhost:$PORTA/restful/meshmb/$IDA1/activity/$token/activity.json" done wait_until [ -e newsince1.json -a -e newsince2.json -a -e newsince3.json ] executeOk_servald meshmb send $IDA2 "Message 3" executeOk_servald meshmb send $IDA3 "Message 4" executeOk_servald meshmb send $IDA2 "Message 5" executeOk_servald meshmb send $IDA3 "Message 6" executeOk_servald meshmb send $IDA1 "Message 7" for i in 1 2 3; do wait_until grep "Message 3" newsince$i.json wait_until grep "Message 4" newsince$i.json wait_until grep "Message 5" newsince$i.json wait_until grep "Message 6" newsince$i.json wait_until grep "Message 7" newsince$i.json done fork_terminate_all fork_wait_all for i in 1 2 3; do if [ $(jq . newsince$i | wc -c) -eq 0 ]; then echo ']}' >>newsince$i.json assert [ $(jq . newsince$i.json | wc -c) -ne 0 ] fi transform_list_json newsince$i.json objects$i.json tfw_preserve newsince$i.json objects$i.json done for i in 1 2 3; do assert [ "$(jq '.rows | length' newsince$i.json)" = 5 ] assertJq objects$i.json "contains([{ id: \"$IDA2\", author: \"$SIDA2\", name: \"Feed B\", message: \"Message 3\"}])" assertJq objects$i.json "contains([{ id: \"$IDA3\", author: \"$SIDA3\", name: \"Feed C\", message: \"Message 4\"}])" assertJq objects$i.json "contains([{ id: \"$IDA2\", author: \"$SIDA2\", name: \"Feed B\", message: \"Message 5\"}])" assertJq objects$i.json "contains([{ id: \"$IDA3\", author: \"$SIDA3\", name: \"Feed C\", message: \"Message 6\"}])" assertJq objects$i.json "contains([{ id: \"$IDA1\", author: \"$SIDA1\", name: \"Feed A\", message: \"Message 7\"}])" done } runTests "$@"