#!/bin/bash # This file is part of TALER # Copyright (C) 2014-2023 Taler Systems SA # # TALER 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 3, or # (at your option) any later version. # # TALER 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 TALER; see the file COPYING. If not, see # # # Testcase for #6363 (WiP) set -eu # Exit, with status code "skip" (no 'real' failure) function exit_skip() { echo $1 exit 77 } echo -n "Testing for taler-harness" taler-harness --help >/dev/null /dev/null nexus-credit-create.log echo " OK" export LIBEUFIN_NEXUS_USERNAME="$CREDIT_USERNAME" export LIBEUFIN_NEXUS_PASSWORD="$CREDIT_PASSWORD" export GNUNET_CREDIT_FACADE=facade-gnunet-credit libeufin-cli sandbox \ demobank \ new-ebicssubscriber \ --host-id ${EBICS_HOST} \ --user-id ${NEXUS_ACCOUNT_NAME} \ --partner-id ${EBICS_PARTNER} \ --bank-account ${SANDBOX_ACCOUNT_NAME} \ &> sandbox-subscriber-create.log libeufin-cli \ connections \ new-ebics-connection \ --ebics-url="${LIBEUFIN_SANDBOX_URL}ebicsweb" \ --host-id=${EBICS_HOST} \ --partner-id=${EBICS_PARTNER} \ --ebics-user-id=${NEXUS_ACCOUNT_NAME} \ ${BANK_CONNECTION_NAME} \ &> nexus-connection-create.log libeufin-cli \ connections \ connect \ ${BANK_CONNECTION_NAME} \ &> nexus-connection-connect.log libeufin-cli \ connections \ download-bank-accounts \ ${BANK_CONNECTION_NAME} \ &> nexus-account-download.log libeufin-cli \ connections \ import-bank-account \ --offered-account-id=${SANDBOX_ACCOUNT_NAME} \ --nexus-bank-account-id=${NEXUS_ACCOUNT_NAME} \ ${BANK_CONNECTION_NAME} \ &> nexus-account-import.log libeufin-cli \ facades \ new-anastasis-facade \ --currency=TESTKUDOS \ --facade-name=${GNUNET_CREDIT_FACADE} \ ${BANK_CONNECTION_NAME} \ ${NEXUS_ACCOUNT_NAME} \ &> nexus-new-facade.log FACADE_URL="http://localhost:18082/accounts/admin/taler-revenue/" # WAS: $(libeufin-cli facades list | jq .facades[0].baseUrl | tr -d \") # FIXME: is this correct? Strange to use the super-user # credentials here! FACADE_USERNAME="${CREDIT_USERNAME}" FACADE_PASSWORD="${CREDIT_PASSWORD}" fi echo -n "First prepare wallet with coins..." rm -f "${WALLET_DB}" taler-wallet-cli \ --no-throttle \ --wallet-db="$WALLET_DB" \ api \ --expect-success 'withdrawTestBalance' \ "$(jq -n ' { amount: "TESTKUDOS:99", corebankApiBaseUrl: $BANK_URL, exchangeBaseUrl: $EXCHANGE_URL }' \ --arg BANK_URL "$BANK_URL" \ --arg EXCHANGE_URL "$EXCHANGE_URL" )" 2>wallet-withdraw-1.err >wallet-withdraw-1.out echo -n "." if [ 1 = "$USE_FAKEBANK" ] then # Fakebank is instant... sleep 0 else sleep 10 # NOTE: once libeufin can do long-polling, we should # be able to reduce the delay here and run wirewatch # always in the background via setup fi echo -n "." taler-exchange-wirewatch \ -L "INFO" \ -c "$CONF" \ -t \ &> taler-exchange-wirewatch.out echo -n "." taler-wallet-cli \ --wallet-db="$WALLET_DB" \ run-until-done \ 2>wallet-withdraw-finish-1.err \ >wallet-withdraw-finish-1.out echo " OK" # # CREATE INSTANCE FOR TESTING # echo -n "Configuring merchant default instance ..." if [ 1 = "$USE_FAKEBANK" ] then GNUNET_PAYTO="payto://x-taler-bank/localhost/gnunet?receiver-name=gnunet" else GNUNET_PAYTO=$(get_payto_uri gnunet x) fi STATUS=$(curl -H "Content-Type: application/json" -X POST \ -H 'Authorization: Bearer secret-token:super_secret' \ http://localhost:9966/management/instances \ -d '{"auth":{"method":"external"},"id":"default","name":"default","user_type":"business","address":{},"jurisdiction":{},"use_stefan":true,"default_wire_transfer_delay":{"d_us" : 50000000},"default_pay_delay":{"d_us": 60000000}}' \ -w "%{http_code}" -s -o /dev/null) if [ "$STATUS" != "204" ] then exit_fail "Expected 204 no content. Got: $STATUS" fi echo "OK" echo -n "Configuring bank account..." STATUS=$(curl -H "Content-Type: application/json" -X POST \ -H 'Authorization: Bearer secret-token:super_secret' \ http://localhost:9966/private/accounts \ -d '{"payto_uri":"'"$GNUNET_PAYTO"'","credit_facade_url":"'"${FACADE_URL}"'","credit_facade_credentials":{"type":"basic","username":"'"$FACADE_USERNAME"'","password":"'"$FACADE_PASSWORD"'"}}' \ -w "%{http_code}" -s -o /dev/null) if [ "$STATUS" != "200" ] then exit_fail "Expected 200 OK. Got: $STATUS" fi echo "OK" # CREATE ORDER AND SELL IT echo -n "Creating order to be paid..." STATUS=$(curl 'http://localhost:9966/private/orders' \ -d '{"order":{"amount":"TESTKUDOS:1","summary":"payme"}}' \ -w "%{http_code}" \ -s \ -o "$LAST_RESPONSE") if [ "$STATUS" != "200" ] then exit_fail "Expected 200 OK. Got: $STATUS " "$(cat "$LAST_RESPONSE")" fi ORDER_ID=$(jq -e -r .order_id < "$LAST_RESPONSE") STATUS=$(curl "http://localhost:9966/private/orders/${ORDER_ID}" \ -w "%{http_code}" \ -s \ -o "$LAST_RESPONSE") if [ "$STATUS" != "200" ] then exit_fail "Expected 200 ok. Got: $STATUS" "$(cat "$LAST_RESPONSE")" fi PAY_URL=$(jq -e -r .taler_pay_uri < "$LAST_RESPONSE") echo OK NOW=$(date +%s) echo -n "Pay first order ..." taler-wallet-cli \ --no-throttle \ --wallet-db="$WALLET_DB" \ handle-uri "${PAY_URL}" \ -y 2> wallet-pay1.err > wallet-pay1.log NOW2=$(date +%s) echo "OK. Took $(( NOW2 - NOW))s." STATUS=$(curl "http://localhost:9966/private/orders/${ORDER_ID}" \ -w "%{http_code}" \ -s \ -o "$LAST_RESPONSE") if [ "$STATUS" != "200" ] then exit_fail "Expected 200 Ok. Got: $STATUS" "$(cat "$LAST_RESPONSE")" fi ORDER_STATUS=$(jq -r .order_status < "$LAST_RESPONSE") if [ "$ORDER_STATUS" != "paid" ] then exit_fail "Expected order status 'paid'. Got: $ORDER_STATUS" "$(cat "$LAST_RESPONSE")" fi # # WIRE TRANSFER TO MERCHANT AND NOTIFY BACKEND # WIRE_DEADLINE=$(jq -r .contract_terms.wire_transfer_deadline.t_s < "$LAST_RESPONSE") NOW=$(date +%s) TO_SLEEP="$(( 1 + WIRE_DEADLINE - NOW ))" echo -n "Perform wire transfers (with ${TO_SLEEP}s timeshift) ..." taler-exchange-aggregator \ -y \ -c "$CONF" \ -T "${TO_SLEEP}000000" \ -t \ -L INFO &> aggregator.log taler-exchange-transfer\ -c "$CONF" \ -t \ -L INFO &> transfer.log echo " DONE" if [ 1 != "$USE_FAKEBANK" ] then echo -n "Waiting for Nexus and Sandbox to settle the payment ..." sleep 3 # FIXME-MS: replace with call to Nexus to right now poll the sandbox ... libeufin-cli \ accounts \ fetch-transactions \ ${NEXUS_ACCOUNT_NAME} \ &> libeufin-transfer-fetch.out echo " DONE" fi echo -n "Obtaining wire transfer details from bank..." taler-merchant-wirewatch \ -c "$CONF" \ -t \ -L INFO &> merchant-wirewatch.log echo " OK" echo -n "Fetching wire transfers of DEFAULT instance ..." STATUS=$(curl 'http://localhost:9966/private/transfers' \ -w "%{http_code}" \ -s \ -o "$LAST_RESPONSE") if [ "$STATUS" != "200" ] then exit_fail "Expected response 200 Ok. Got: $STATUS" "$(jq . < "$LAST_RESPONSE")" fi TRANSFERS_LIST_SIZE=$(jq -r '.transfers | length' < "$LAST_RESPONSE") if [ "$TRANSFERS_LIST_SIZE" != "1" ] then exit_fail "Expected one transfer. Got: $TRANSFERS_LIST_SIZE" "$(jq . < "$LAST_RESPONSE")" fi echo " OK" echo -n "Integrating wire transfer data with exchange..." taler-merchant-exchange \ -c "$CONF" \ -t \ -L INFO &> merchant-exchange.log echo " OK" echo -n "Checking order status ..." STATUS=$(curl "http://localhost:9966/private/orders/${ORDER_ID}?transfer=YES" \ -w "%{http_code}" \ -s \ -o "$LAST_RESPONSE") if [ "$STATUS" != "200" ] then jq . < "$LAST_RESPONSE" exit_fail "Expected 200 ok. got: $STATUS" "$(cat "$LAST_RESPONSE")" fi WAS_WIRED=$(jq -r .wired < "$LAST_RESPONSE") if [ "$WAS_WIRED" != "true" ] then jq . < "$LAST_RESPONSE" exit_fail "Got .wired 'false', expected 'true'" fi echo " OK" exit 0