From a1ea04acf825ac2c04b48db9b97b1e3d9f23b288 Mon Sep 17 00:00:00 2001 From: Vlad Stan Date: Fri, 8 Mar 2024 16:40:23 +0200 Subject: [PATCH] Jmeter take 3 (#2284) * chore: add tests * chore: add reference to jmter job * chore: add jmeter job * chore: touch tests * chorE: disable other workflows * chore: do not set `LNBITS_ADMIN_UI: true` * chore: extra log file * chore: rollback * chore: testing stuff * feat: top-up wallet * chore: clean-up usr * chore: clean-up user query param * chore: remove hardcoded usr * chore: clean-up * chore: clean-up * chore: different improvements * chore: clean-up * chore: remove hardcoded values * refactor: extract `init-server` fragment * chore: move fragment * feat: use test frgment * chore: clean-up hardcoded values * chore: clean-up * fix: get lnurl working * chore: re-arange elements * chore: re-arange elements * fix: add `lnurlp, withdraw` extensions * chore: rename file * fix: login with user id * refactor: extract init account * fix: tips wallet * fix: assertion * refactor: use fragments; group loops * chore: re-enable the other CI jobs * fix: separate wallet for receive * feat: check receive wallet balance * feat: increase wait time --- .github/workflows/ci.yml | 10 + .github/workflows/jmeter.yml | 98 + integration/fragments/init-account.jmx | 488 ++++ integration/fragments/init-server.jmx | 487 ++++ integration/lnurl.jmx | 2595 +++++++++++++++++ integration/tpos.jmx | 3214 +++++++++++++++++++++ integration/watchonly-satspay-tipjar.jmx | 3222 ++++++++++++++++++++++ 7 files changed, 10114 insertions(+) create mode 100644 .github/workflows/jmeter.yml create mode 100644 integration/fragments/init-account.jmx create mode 100644 integration/fragments/init-server.jmx create mode 100644 integration/lnurl.jmx create mode 100644 integration/tpos.jmx create mode 100644 integration/watchonly-satspay-tipjar.jmx diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fd1d0ed08..e81274d7c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -48,3 +48,13 @@ jobs: with: python-version: ${{ matrix.python-version }} backend-wallet-class: ${{ matrix.backend-wallet-class }} + + jmeter: + strategy: + matrix: + python-version: ["3.9"] + poetry-version: ["1.5.1"] + uses: ./.github/workflows/jmeter.yml + with: + python-version: ${{ matrix.python-version }} + poetry-version: ${{ matrix.poetry-version }} diff --git a/.github/workflows/jmeter.yml b/.github/workflows/jmeter.yml new file mode 100644 index 000000000..274b394fd --- /dev/null +++ b/.github/workflows/jmeter.yml @@ -0,0 +1,98 @@ +name: JMeter Tests + +on: + workflow_call: + inputs: + python-version: + description: "Python Version" + required: true + default: "3.9" + type: string + poetry-version: + description: "Poetry Version" + required: true + default: "1.5.1" + type: string + +jobs: + action_build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: Set up Python ${{ inputs.python-version }} + uses: actions/setup-python@v4 + with: + python-version: ${{ inputs.python-version }} + cache: "pip" + + - name: Set up Poetry ${{ inputs.poetry-version }} + uses: abatilo/actions-poetry@v2 + with: + poetry-version: ${{ inputs.poetry-version }} + + - name: create logs and reports dir + run: | + mkdir logs + mkdir reports + + - name: install packages + run: poetry install + + - name: run LNbits + env: + LNBITS_ADMIN_UI: true + LNBITS_EXTENSIONS_DEFAULT_INSTALL: "watchonly, satspay, tipjar, tpos, lnurlp, withdraw" + LNBITS_BACKEND_WALLET_CLASS: FakeWallet + run: | + poetry run lnbits > logs/lnbits.log & + sleep 5 + + + - name: install jmeter + run: | + java -version + wget https://downloads.apache.org//jmeter/binaries/apache-jmeter-5.6.2.zip + unzip apache-jmeter-5.6.2.zip + $GITHUB_WORKSPACE/apache-jmeter-5.6.2/bin/jmeter -v + + - name: start mirror server + run: | + libs_dir=$GITHUB_WORKSPACE/apache-jmeter-5.6.2/lib/ + echo "Fix bad Jmeter lib names. Lib dir: $libs_dir" + + mv $libs_dir/slf4j-api-1.7.36.jar $libs_dir/slf4j-api-1.7.25.jar + mv $libs_dir/log4j-slf4j-impl-2.20.0.jar $libs_dir/log4j-slf4j-impl-2.11.0.jar + mv $libs_dir/log4j-api-2.20.0.jar $libs_dir/log4j-api-2.11.1.jar + mv $libs_dir/log4j-core-2.20.0.jar $libs_dir/log4j-core-2.11.1.jar + mv $libs_dir/log4j-1.2-api-2.20.0.jar $libs_dir/og4j-1.2-api-2.11.1.jar + + echo "Starting the mirror server on dfault port 8081." + $GITHUB_WORKSPACE/apache-jmeter-5.6.2/bin/mirror-server & + + - name: run jmx scripts + run: | + for file in $( ls $GITHUB_WORKSPACE/integration/*.jmx); do + echo "Running test with $file" + filename=$(basename "$file" ".jmx") + $GITHUB_WORKSPACE/apache-jmeter-5.6.2/bin/jmeter -n -t $file -l logs/$filename.log -e -o reports ; + error_count=$(cat jmeter.log | grep "summary =" | awk '{print $19}') + echo "Error count: $error_count" + if [[ "$error_count" == "0" ]]; then + echo "Test $filename OK." + rm -r reports/* + else + echo "Test $filename failed. Error count: $error_count." + exit 1 + fi + done + + + - uses: actions/upload-artifact@v3 + if: ${{ always() }} + with: + name: jmeter-test-results + path: | + reports/ + logs/ + diff --git a/integration/fragments/init-account.jmx b/integration/fragments/init-account.jmx new file mode 100644 index 000000000..d7ea3af1a --- /dev/null +++ b/integration/fragments/init-account.jmx @@ -0,0 +1,488 @@ + + + + + + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + / + GET + true + false + true + false + + + + + + + + + Accept-Language + en-US,en;q=0.5 + + + Upgrade-Insecure-Requests + 1 + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + + true + + + + false + {"name":"a1"} + = + + + + ${host} + ${port} + ${scheme} + UTF-8 + /api/v1/account + POST + true + false + true + false + + + + + + + + + Referer + ${scheme}://${host}:${port}/ + + + Accept-Language + en-US,en;q=0.${paidChargeCount} + + + Origin + ${scheme}://${host}:${port} + + + Content-Type + application/json + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/${paidChargeCount}.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/117.0 + + + Accept + application/json, text/plain, */* + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + true + + + var resp = JSON.parse(prev.getResponseDataAsString()) + +vars.put("userId", resp.user || "no-user-id"); +vars.put("walletId", resp.id || "no-wallet-id"); +vars.put("inkey", resp.inkey || 'no-inkey'); +vars.put("adminkey", resp.adminkey || 'no-adminkey'); + + javascript + + + + + true + + + + false + {"usr":"${userId}"} + = + + + + ${host} + ${port} + ${scheme} + UTF-8 + /api/v1/auth/usr + POST + true + false + true + false + + + + + + + + + Referer + ${scheme}://${host}:${port}/ + + + Accept-Language + en-US,en;q=0.${paidChargeCount} + + + Origin + ${scheme}://${host}:${port} + + + Content-Type + application/json + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/${paidChargeCount}.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/117.0 + + + Accept + application/json, text/plain, */* + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + + + + + false + wal + ${walletId} + = + true + + + + ${host} + ${port} + ${scheme} + UTF-8 + /wallet + GET + true + false + true + false + + + + + + + + + Referer + ${scheme}://${host}:${port}/ + + + Accept-Language + en-US,en;q=0.5 + + + Upgrade-Insecure-Requests + 1 + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /api/v1/currencies + GET + true + false + true + false + + + + + + + + + Referer + ${scheme}://${host}:${port}/wallet?wal=${walletId} + + + Accept-Language + en-US,en;q=0.5 + + + X-Api-Key + undefined + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0 + + + Accept + application/json, text/plain, */* + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + + ["AED","AFN","ALL","AMD","ANG","AOA","ARS","AUD","AWG","AZN","BAM","BBD","BDT","BGN","BHD","BIF","BMD","BND","BOB","BRL","BSD","BTN","BWP","BYN","BYR","BZD","CAD","CDF","CHF","CLF","CLP","CNH","CNY","COP","CRC","CUC","CVE","CZK","DJF","DKK","DOP","DZD","EGP","ERN","ETB","EUR","FJD","FKP","GBP","GEL","GGP","GHS","GIP","GMD","GNF","GTQ","GYD","HKD","HNL","HRK","HTG","HUF","IDR","ILS","IMP","INR","IQD","IRT","ISK","JEP","JMD","JOD","JPY","KES","KGS","KHR","KMF","KRW","KWD","KYD","KZT","LAK","LBP","LKR","LRD","LSL","LYD","MAD","MDL","MGA","MKD","MMK","MNT","MOP","MRO","MUR","MVR","MWK","MXN","MYR","MZN","NAD","NGN","NIO","NOK","NPR","NZD","OMR","PAB","PEN","PGK","PHP","PKR","PLN","PYG","QAR","RON","RSD","RUB","RWF","SAR","SBD","SCR","SEK","SGD","SHP","SLL","SOS","SRD","SSP","STD","SVC","SZL","THB","TJS","TMT","TND","TOP","TRY","TTD","TWD","TZS","UAH","UGX","USD","UYU","UZS","VEF","VES","VND","VUV","WST","XAF","XAG","XAU","XCD","XDR","XOF","XPD","XPF","XPT","YER","ZAR","ZMW","ZWL"] + + + Assertion.response_data + false + 8 + + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /api/v1/wallet + GET + true + false + true + false + + + + + + + + + Referer + ${scheme}://${host}:${port}/wallet?wal=${walletId} + + + Accept-Language + en-US,en;q=0.5 + + + X-Api-Key + ${inkey} + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0 + + + Accept + application/json, text/plain, */* + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + true + + + var resp = JSON.parse(prev.getResponseDataAsString()) + +if (resp.balance !== 0) { + AssertionResult.setFailureMessage("Balance is not zero, but: "+ resp.balance); + AssertionResult.setFailure(true) +} + + javascript + + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /api/v1/payments + GET + true + false + true + false + + + + + + + + + Referer + ${scheme}://${host}:${port}/wallet?wal=${walletId} + + + Accept-Language + en-US,en;q=0.5 + + + X-Api-Key + ${inkey} + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0 + + + Accept + application/json, text/plain, */* + + + + + + + [] + + + Assertion.response_data + false + 8 + + + + + + + diff --git a/integration/fragments/init-server.jmx b/integration/fragments/init-server.jmx new file mode 100644 index 000000000..e7762c18f --- /dev/null +++ b/integration/fragments/init-server.jmx @@ -0,0 +1,487 @@ + + + + + + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + / + GET + false + false + true + false + + + + Detected the start of a redirect chain + + + + + + Accept-Language + en-US,en;q=0.5 + + + Upgrade-Insecure-Requests + 1 + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:121.0) Gecko/20100101 Firefox/121.0 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 + + + + + + + 200 + 307 + + + Assertion.response_code + false + 40 + + + + true + is_first_install + location: (.*) + $1$ + not-first-install + 0 + all + + + + + ${__groovy(vars.get('is_first_install').contains("first_install"),)} + false + true + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /first_install + GET + true + false + true + false + + + + + + + + + Accept-Language + en-US,en;q=0.5 + + + Upgrade-Insecure-Requests + 1 + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:121.0) Gecko/20100101 Firefox/121.0 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + + true + + + + false + {"username":"admin","password":"admin_password","password_repeat":"admin_password"} + = + + + + ${host} + ${port} + ${scheme} + UTF-8 + /api/v1/auth/first_install + PUT + true + false + true + false + + + + + + + + + Referer + ${scheme}://${host}:${port}/first_install + + + Accept-Language + en-US,en;q=0.5 + + + Origin + ${scheme}://${host}:${port} + + + Content-Type + application/json + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:121.0) Gecko/20100101 Firefox/121.0 + + + Accept + application/json, text/plain, */* + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + + + ${__groovy(!vars.get('is_first_install').contains("first_install"),)} + false + true + + + + true + + + + false + {"username":"admin","password":"admin_password"} + = + + + + ${host} + ${port} + ${scheme} + UTF-8 + /api/v1/auth + POST + true + false + true + false + + + + + + + + + Referer + ${scheme}://${host}:${port}/ + + + Accept-Language + en-US,en;q=0.5 + + + Origin + ${scheme}://${host}:${port} + + + Content-Type + application/json + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:123.0) Gecko/20100101 Firefox/123.0 + + + Accept + application/json, text/plain, */* + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /api/v1/wallets + GET + true + false + true + false + + + + + + + + + Accept-Language + en-US,en;q=0.5 + + + Upgrade-Insecure-Requests + 1 + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:121.0) Gecko/20100101 Firefox/121.0 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + true + + + var resp = JSON.parse(prev.getResponseDataAsString())[0] + +vars.put("adminWalletId", resp.id || "no-admin-wallet-id"); +vars.put("adminWalletKey", resp.adminkey || 'no-adminkey'); + + javascript + + + + + true + + + + false + {"amount":"1000000","id":"${adminWalletId}"} + = + + + + ${host} + ${port} + ${scheme} + UTF-8 + /admin/api/v1/topup/ + PUT + true + false + true + false + + + + + + + + + Referer + ${scheme}://${host}:${port}/wallet?&wal=c1daa33fc4014ef69cd1505f14f322c2 + + + Accept-Language + en-US,en;q=0.5 + + + Origin + ${scheme}://${host}:${port} + + + Content-Type + application/json + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:121.0) Gecko/20100101 Firefox/121.0 + + + Accept + application/json, text/plain, */* + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /api/v1/auth/logout + POST + true + false + true + false + + + + + + + + + Referer + ${scheme}://${host}:${port}/ + + + Accept-Language + en-US,en;q=0.5 + + + Origin + ${scheme}://${host}:${port} + + + Content-Type + application/json + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:123.0) Gecko/20100101 Firefox/123.0 + + + Accept + application/json, text/plain, */* + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + + + + diff --git a/integration/lnurl.jmx b/integration/lnurl.jmx new file mode 100644 index 000000000..d74b64119 --- /dev/null +++ b/integration/lnurl.jmx @@ -0,0 +1,2595 @@ + + + + + false + false + + + + + + + + + + + host + ${__property(host,,127.0.0.1)} + = + + + scheme + ${__property(scheme,,http)} + = + + + port + ${__property(port,,5000)} + = + + + paidChargeCount + 5 + = + + + userTipCount + 5 + = + + + thinkTime + 3000 + = + + + lnurlpCount + 5 + = + + + lnurlwCount + 5 + = + + + paymentCountPerLnurlp + 2 + = + + + withdrawCountPerLnurlw + 2 + = + + + + + + + + + ${host} + ${port} + ${scheme} + + + 6 + + + + + + stopthread + + false + 1 + + 1 + 1 + 1370726934000 + 1370726934000 + false + + + false + + + + + false + false + + + + false + true + + + + fragments/init-server.jmx + + + + + false + true + + + + fragments/init-account.jmx + + + + + false + true + + + + + + + false + enable + lnurlp + = + true + + + + ${host} + ${port} + ${scheme} + utf-8 + /extensions + GET + true + false + true + false + + + + + + + + + Sec-Fetch-Mode + same-origin + + + Sec-Fetch-Site + same-origin + + + Accept-Language + en-US,en;q=0.${paidChargeCount} + + + Upgrade-Insecure-Requests + 1 + + + Accept-Encoding + gzip, deflate, br + + + User-Agent + Mozilla/${paidChargeCount}.0 (Macintosh; Intel Mac OS X 10.15; rv:106.0) Gecko/20100101 Firefox/106.0 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 + + + Sec-Fetch-Dest + empty + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + + v-for="extension in filteredExtensions" + + + Assertion.response_data + false + 2 + + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /lnurlp/ + GET + true + false + true + false + + + + + + + + + Sec-Fetch-Mode + same-origin + + + Referer + ${scheme}://${host}:${port}/extensions?enable=lnurlp + + + Sec-Fetch-Site + same-origin + + + Accept-Language + en-US,en;q=0.${paidChargeCount} + + + Upgrade-Insecure-Requests + 1 + + + Accept-Encoding + gzip, deflate, br + + + User-Agent + Mozilla/${paidChargeCount}.0 (Macintosh; Intel Mac OS X 10.15; rv:106.0) Gecko/20100101 Firefox/106.0 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 + + + Sec-Fetch-Dest + empty + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + + New pay link + curl -X POST http://127.0.0.1:5000/lnurlp/api/v1/links -d + + + Assertion.response_data + false + 2 + + + + + + + + false + all_wallets + true + = + true + + + + ${host} + ${port} + ${scheme} + UTF-8 + /lnurlp/api/v1/links + GET + true + false + true + false + + + + + + + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Site + same-origin + + + Accept-Language + en-US,en;q=0.${paidChargeCount} + + + X-Api-Key + ${inkey} + + + Accept-Encoding + gzip, deflate, br + + + User-Agent + Mozilla/${paidChargeCount}.0 (Macintosh; Intel Mac OS X 10.15; rv:106.0) Gecko/20100101 Firefox/106.0 + + + Accept + application/json, text/plain, */* + + + Sec-Fetch-Dest + empty + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + + [] + + + Assertion.response_data + false + 8 + + + + + + false + true + + + + true + ${lnurlpCount} + + + + 1 + ${lnurlpCount} + 1 + lnurlpCounter + + true + + + + false + true + + + + true + + + + false + {"description":"receive payments ${lnurlpCounter}","min":11,"comment_chars":128,"webhook_url":"http://localhost:8081","webhook_headers":"{\"h1\": \"1\"}","webhook_body":"{\"b2\": 2}","success_text":"All goood!","success_url":"https://lnbits.com","max":${lnurlpCounter}1} + = + + + + ${host} + ${port} + ${scheme} + utf-8 + /lnurlp/api/v1/links + POST + true + false + true + false + + + + + + + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Site + same-origin + + + Accept-Language + en-US,en;q=0.${paidChargeCount} + + + Origin + ${scheme}://${host}:${port} + + + Accept + application/json, text/plain, */* + + + X-Api-Key + ${adminkey} + + + Content-Type + application/json;charset=utf-8 + + + Accept-Encoding + gzip, deflate, br + + + User-Agent + Mozilla/${paidChargeCount}.0 (Macintosh; Intel Mac OS X 10.15; rv:106.0) Gecko/20100101 Firefox/106.0 + + + Sec-Fetch-Dest + empty + + + + + + + 201 + + + Assertion.response_code + false + 8 + + + + javascript + + + true + var resp = JSON.parse(prev.getResponseDataAsString()) + +var walletId = vars.get("walletId") +var lnurlpCounter = +vars.get("lnurlpCounter") + +if (!resp.id) { + AssertionResult.setFailureMessage("Pay Link not created"); + AssertionResult.setFailure(true) +} else if (resp.wallet !== walletId){ + AssertionResult.setFailureMessage("Pay Link description expected to be '"+walletId+"', but was: " + resp.wallet); + AssertionResult.setFailure(true) +} else if (resp.description !== "receive payments "+lnurlpCounter){ + AssertionResult.setFailureMessage("Pay Link description expected to be 'receive payments "+lnurlpCounter+"', but was: " + resp.description); + AssertionResult.setFailure(true) +} + + + + javascript + + + true + var resp = JSON.parse(prev.getResponseDataAsString()) + +vars.put("payLinkId", resp.id || 'no-pay-link-id'); +vars.put("payLinkLnurl", resp.lnurl || 'no-pay-link-lnurl'); + + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /lnurlp/link/${payLinkId} + GET + true + false + true + false + + + + + + + + + Sec-Fetch-Mode + same-origin + + + Sec-Fetch-Site + same-origin + + + Accept-Language + en-US,en;q=0.${paidChargeCount} + + + Upgrade-Insecure-Requests + 1 + + + Accept-Encoding + gzip, deflate, br + + + User-Agent + Mozilla/${paidChargeCount}.0 (Macintosh; Intel Mac OS X 10.15; rv:106.0) Gecko/20100101 Firefox/106.0 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 + + + Sec-Fetch-Dest + empty + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + + Copy LNURL + ${payLinkLnurl} + + + Assertion.response_data + false + 2 + + + + + + + + false + all_wallets + true + = + true + + + + ${host} + ${port} + ${scheme} + UTF-8 + /lnurlp/api/v1/links/${payLinkId} + GET + true + false + true + false + + + + + + + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Site + same-origin + + + Accept-Language + en-US,en;q=0.${paidChargeCount} + + + X-Api-Key + ${inkey} + + + Accept-Encoding + gzip, deflate, br + + + User-Agent + Mozilla/${paidChargeCount}.0 (Macintosh; Intel Mac OS X 10.15; rv:106.0) Gecko/20100101 Firefox/106.0 + + + Accept + application/json, text/plain, */* + + + Sec-Fetch-Dest + empty + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + lnurl + ${payLinkLnurl} + true + false + false + true + + + + + + + + false + all_wallets + true + = + true + + + + ${host} + ${port} + ${scheme} + UTF-8 + /api/v1/lnurlscan/${payLinkLnurl} + GET + true + false + true + false + + + + + + + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Site + same-origin + + + Accept-Language + en-US,en;q=0.${paidChargeCount} + + + X-Api-Key + ${adminWalletKey} + + + Accept-Encoding + gzip, deflate, br + + + User-Agent + Mozilla/${paidChargeCount}.0 (Macintosh; Intel Mac OS X 10.15; rv:106.0) Gecko/20100101 Firefox/106.0 + + + Accept + application/json, text/plain, */* + + + Sec-Fetch-Dest + empty + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + domain + ${host}:${port} + true + false + false + true + + + + tag + payRequest + true + false + false + true + + + + commentAllowed + 128 + true + false + false + true + + + + kind + pay + true + false + false + true + + + + description + receive payments ${lnurlpCounter} + true + false + false + true + + + + payLinkCallback + callback + 0 + no-paylink-callback + + + + payLinkDescriptionHash + description_hash + 0 + no-paylink-description-hash + + + + + true + ${paymentCountPerLnurlp} + + + + 1 + ${paymentCountPerLnurlp} + 1 + lnurlpPaymentCounter + + true + + + + false + true + + + + true + + + + false + {"callback":"${scheme}://${host}:${port}/lnurlp/api/v1/lnurl/cb/${payLinkId}","description_hash":"${payLinkDescriptionHash}","amount":1${lnurlpCounter}000,"comment":"xxq ${lnurlpCounter}","description":"receive payments ${lnurlpCounter}"} + = + + + + ${host} + ${port} + ${scheme} + utf-8 + /api/v1/payments/lnurl + POST + true + false + true + false + + + + + + + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Site + same-origin + + + Accept-Language + en-US,en;q=0.${lnurlpCount} + + + Origin + ${scheme}://${host}:${port} + + + Accept + application/json, text/plain, */* + + + X-Api-Key + ${adminWalletKey} + + + Content-Type + application/json;charset=utf-8 + + + Accept-Encoding + gzip, deflate, br + + + User-Agent + Mozilla/${lnurlpCount}.0 (Macintosh; Intel Mac OS X 10.15; rv:106.0) Gecko/20100101 Firefox/106.0 + + + Sec-Fetch-Dest + empty + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + success_action + + false + false + false + false + + + + paymenHash + payment_hash + 0 + no-paymenthash + + + + + 3000 + for the webhook to be called + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /api/v1/payments/${paymenHash} + GET + true + false + true + false + + + + + + + + + X-Api-Key + ${inkey} + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + $.details.extra.wh_success + true + true + false + false + false + + + + $.details.extra.wh_message + OK + true + false + false + false + + + + javascript + + + true + var resp = JSON.parse(prev.getResponseDataAsString()) +var paymenHash = vars.get("paymenHash") + + +var whResp = resp.details.extra.wh_response +var separatorIndex = whResp.indexOf("\r\n\r\n") +if (separatorIndex == -1) { + AssertionResult.setFailureMessage("Webhook response has wrong format: " + whResp); + AssertionResult.setFailure(true) +} else { + var headers = whResp.substring(0, separatorIndex) + var bodyStr = whResp.substring(separatorIndex) + var body = JSON.parse(bodyStr) + if (body.payment_hash !== paymenHash) { + AssertionResult.setFailureMessage("Incorrect webhook payment hash: " + JSON.stringify(body)); + AssertionResult.setFailure(true) + } else if (headers.indexOf("h1: 1") === -1) { + AssertionResult.setFailureMessage("Expected header missing: 'h1': '1'"); + AssertionResult.setFailure(true) + } else if (!body.body || !body.body.b2 || body.body.b2 !== 2) { + AssertionResult.setFailureMessage("Expected body field missing: \"body\": {\"b2\": 2}, found: " + JSON.stringify(body.body)); + AssertionResult.setFailure(true) + } +} + + + + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /api/v1/wallet + GET + true + false + true + false + + + + + + + + + Referer + ${scheme}://${host}:${port}/wallet?wal=${walletId} + + + Accept-Language + en-US,en;q=0.5 + + + X-Api-Key + ${inkey} + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0 + + + Accept + application/json, text/plain, */* + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + true + + + var resp = JSON.parse(prev.getResponseDataAsString()) + +var lnurlpCounter = +vars.get('lnurlpCounter') + + +var userBalance = +vars.get("userBalance") +userBalance += 10 + lnurlpCounter + +// millisats +if (resp.balance !== userBalance * 1000) { + AssertionResult.setFailureMessage("Expected balance to be "+userBalance * 1000+", but got: "+ resp.balance); + AssertionResult.setFailure(true) +} + +vars.put("userBalance", userBalance) + javascript + + + + + + + + + + false + true + + + + + + + false + enable + withdraw + = + true + + + + ${host} + ${port} + ${scheme} + utf-8 + /extensions + GET + true + false + true + false + + + + + + + + + Sec-Fetch-Mode + same-origin + + + Referer + ${scheme}://${host}:${port}/extensions + + + Sec-Fetch-Site + same-origin + + + Accept-Language + en-US,en;q=0.5 + + + Upgrade-Insecure-Requests + ${lnurlpCount} + + + Accept-Encoding + gzip, deflate, br + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:106.0) Gecko/20100101 Firefox/106.0 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 + + + Sec-Fetch-Dest + empty + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + + v-for="extension in filteredExtensions" + + + Assertion.response_data + false + 2 + + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /withdraw/ + GET + true + false + true + false + + + + + + + + + Sec-Fetch-Mode + same-origin + + + Sec-Fetch-Site + same-origin + + + Accept-Language + en-US,en;q=0.5 + + + Upgrade-Insecure-Requests + ${lnurlpCount} + + + Accept-Encoding + gzip, deflate, br + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:106.0) Gecko/20100101 Firefox/106.0 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 + + + Sec-Fetch-Dest + empty + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + + Withdraw links + curl -X GET http://127.0.0.1:5000/withdraw/api/v1/links -H + + + Assertion.response_data + false + 2 + + + + + + + + false + all_wallets + true + = + true + + + + ${host} + ${port} + ${scheme} + UTF-8 + /withdraw/api/v1/links + GET + true + false + true + false + + + + + + + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Site + same-origin + + + Accept-Language + en-US,en;q=0.5 + + + X-Api-Key + ${inkey} + + + Accept-Encoding + gzip, deflate, br + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:106.0) Gecko/20100101 Firefox/106.0 + + + Accept + application/json, text/plain, */* + + + Sec-Fetch-Dest + empty + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + + [] + + + Assertion.response_data + false + 8 + + + + + + false + true + + + + true + + + + false + {"name":"receive wallet"} + = + + + + ${host} + ${port} + ${scheme} + utf-8 + /api/v1/wallet + POST + true + false + true + false + + + + + + + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Site + same-origin + + + Accept-Language + en-US,en;q=0.5 + + + Accept + application/json, text/plain, */* + + + X-Api-Key + ${adminkey} + + + Content-Type + application/json;charset=utf-8 + + + Accept-Encoding + gzip, deflate, br + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:106.0) Gecko/20100101 Firefox/106.0 + + + Sec-Fetch-Dest + empty + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + name + receive wallet + true + false + false + false + + + + receiveInkey + inkey + 0 + no-receive-inkey + + + + + true + ${lnurlwCount} + + + + 1 + + 1 + lnurlwCounter + + false + + + + false + true + + + + true + + + + false + { + "is_unique": false, + "use_custom": false, + "title": "withdraw ${lnurlwCounter}", + "min_withdrawable": 10, + "max_withdrawable":${lnurlwCounter}0, + "uses": 5, + "wait_time": 1, + "webhook_url": "http://localhost:8081", + "webhook_headers": "{\"h1\": \"1\"}", + "webhook_body": "{\"b2\": 2}", + "custom_url": null +} + = + + + + ${host} + ${port} + ${scheme} + utf-8 + /withdraw/api/v1/links + POST + true + false + true + false + + + + + + + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Site + same-origin + + + Accept-Language + en-US,en;q=0.5 + + + Accept + application/json, text/plain, */* + + + X-Api-Key + ${adminkey} + + + Content-Type + application/json;charset=utf-8 + + + Accept-Encoding + gzip, deflate, br + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:106.0) Gecko/20100101 Firefox/106.0 + + + Sec-Fetch-Dest + empty + + + + + + + 201 + + + Assertion.response_code + false + 8 + + + + javascript + + + true + var resp = JSON.parse(prev.getResponseDataAsString()) + +var walletId = vars.get("walletId") +var lnurlwCounter = +vars.get("lnurlwCounter") + +if (!resp.id) { + AssertionResult.setFailureMessage("Withdraw Link not created"); + AssertionResult.setFailure(true) +} else if (resp.wallet !== walletId) { + AssertionResult.setFailureMessage("Withdraw Link wallet expected to be '" + walletId + "', but was: " + resp.wallet); + AssertionResult.setFailure(true) +} else if (resp.title !== "withdraw " + lnurlwCounter) { + AssertionResult.setFailureMessage("Withdraw Link description expected to be 'withdraw " + lnurlwCounter + "', but was: " + resp.description); + AssertionResult.setFailure(true) +} + + + + withdrawLinkId + id + 0 + no-withdraw-link-id + + + + withdrawLinkLnurl + lnurl + 0 + no-withdraw-link-lnurl + + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /withdraw/${withdrawLinkId} + GET + true + false + true + false + + + + + + + + + Sec-Fetch-Mode + same-origin + + + Sec-Fetch-Site + same-origin + + + Accept-Language + en-US,en;q=0.5 + + + Accept-Encoding + gzip, deflate, br + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:106.0) Gecko/20100101 Firefox/106.0 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 + + + Sec-Fetch-Dest + empty + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + + Copy LNURL + ${withdrawLinkLnurl} + + + Assertion.response_data + false + 2 + + + + + + + + false + all_wallets + true + = + true + + + + ${host} + ${port} + ${scheme} + UTF-8 + /withdraw/api/v1/links/${withdrawLinkId} + GET + true + false + true + false + + + + + + + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Site + same-origin + + + Accept-Language + en-US,en;q=0.${paidChargeCount} + + + X-Api-Key + ${inkey} + + + Accept-Encoding + gzip, deflate, br + + + User-Agent + Mozilla/${paidChargeCount}.0 (Macintosh; Intel Mac OS X 10.15; rv:106.0) Gecko/20100101 Firefox/106.0 + + + Accept + application/json, text/plain, */* + + + Sec-Fetch-Dest + empty + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + lnurl + ${withdrawLinkLnurl} + true + false + false + true + + + + + + + + false + all_wallets + true + = + true + + + + ${host} + ${port} + ${scheme} + UTF-8 + /api/v1/lnurlscan/${withdrawLinkLnurl} + GET + true + false + true + false + + + + + + + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Site + same-origin + + + Accept-Language + en-US,en;q=0.${paidChargeCount} + + + X-Api-Key + ${adminWalletKey} + + + Accept-Encoding + gzip, deflate, br + + + User-Agent + Mozilla/${paidChargeCount}.0 (Macintosh; Intel Mac OS X 10.15; rv:106.0) Gecko/20100101 Firefox/106.0 + + + Accept + application/json, text/plain, */* + + + Sec-Fetch-Dest + empty + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + domain + ${host}:${port} + true + false + false + true + + + + tag + withdrawRequest + true + false + false + true + + + + kind + withdraw + true + false + false + true + + + + defaultDescription + withdraw ${lnurlwCounter} + true + false + false + true + + + + withdrawLinkCallback + callback + 0 + no-withdrawlink-callback + + + + + true + ${withdrawCountPerLnurlw} + + + + 1 + ${withdrawCountPerLnurlw} + 1 + lnurlwWithdrawCounter + + true + + + + false + true + + + + true + + + + false + {"out":false,"amount":10,"memo":"withdraw ${lnurlwCounter}","unit":"sat","lnurl_callback":"${withdrawLinkCallback}"} + = + + + + ${host} + ${port} + ${scheme} + utf-8 + /api/v1/payments + POST + true + false + true + false + + + + + + + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Site + same-origin + + + Accept-Language + en-US,en;q=0.${lnurlpCount} + + + Origin + ${scheme}://${host}:${port} + + + Accept + application/json, text/plain, */* + + + X-Api-Key + ${receiveInkey} + + + Content-Type + application/json;charset=utf-8 + + + Accept-Encoding + gzip, deflate, br + + + User-Agent + Mozilla/${lnurlpCount}.0 (Macintosh; Intel Mac OS X 10.15; rv:106.0) Gecko/20100101 Firefox/106.0 + + + Sec-Fetch-Dest + empty + + + + + + + 201 + + + Assertion.response_code + false + 8 + + + + lnurl_response + true + true + false + false + true + + + + paymenHash + payment_hash + 0 + no-payment-hash + + + + + 3000 + for the callback to be invoked + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /api/v1/payments/${paymenHash} + GET + true + false + true + false + + + + + + + + + X-Api-Key + ${inkey} + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + $.details.extra.wh_success + true + true + false + false + false + + + + $.details.extra.wh_message + OK + true + false + false + false + + + + javascript + + + true + var resp = JSON.parse(prev.getResponseDataAsString()) +var paymenHash = vars.get("paymenHash") + + +var whResp = resp.details.extra.wh_response +var separatorIndex = whResp.indexOf("\r\n\r\n") +if (separatorIndex == -1) { + AssertionResult.setFailureMessage("Webhook response has wrong format: " + whResp); + AssertionResult.setFailure(true) +} else { + var headers = whResp.substring(0, separatorIndex) + var bodyStr = whResp.substring(separatorIndex) + var body = JSON.parse(bodyStr) + if (body.payment_hash !== paymenHash) { + AssertionResult.setFailureMessage("Incorrect webhook payment hash: " + JSON.stringify(body)); + AssertionResult.setFailure(true) + } else if (headers.indexOf("h1: 1") === -1) { + AssertionResult.setFailureMessage("Expected header missing: 'h1': '1'"); + AssertionResult.setFailure(true) + } else if (!body.body || !body.body.b2 || body.body.b2 !== 2) { + AssertionResult.setFailureMessage("Expected body field missing: \"body\": {\"b2\": 2}, found: " + JSON.stringify(body.body)); + AssertionResult.setFailure(true) + } +} + + + + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /api/v1/wallet + GET + true + false + true + false + + + + + + + + + Referer + ${scheme}://${host}:${port}/wallet?wal=${walletId} + + + Accept-Language + en-US,en;q=0.5 + + + X-Api-Key + ${inkey} + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0 + + + Accept + application/json, text/plain, */* + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + true + + + var resp = JSON.parse(prev.getResponseDataAsString()) + +var userBalance = +vars.get("userBalance") +userBalance -= 10 + +// millisats +if (resp.balance !== userBalance * 1000) { + AssertionResult.setFailureMessage("Expected balance to be "+userBalance * 1000+", but got: "+ resp.balance); + AssertionResult.setFailure(true) +} + +vars.put("userBalance", userBalance) + javascript + + + + + + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /api/v1/wallet + GET + true + false + true + false + + + + + + + + + Referer + ${scheme}://${host}:${port}/wallet?wal=${walletId} + + + Accept-Language + en-US,en;q=0.5 + + + X-Api-Key + ${receiveInkey} + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0 + + + Accept + application/json, text/plain, */* + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + true + + + var resp = JSON.parse(prev.getResponseDataAsString()); + +var withdrawAmount = 10; +var lnurlwCount = +vars.get("lnurlwCount"); +var withdrawCountPerLnurlw = +vars.get("withdrawCountPerLnurlw"); + +var userBalance = withdrawAmount * lnurlwCount * withdrawCountPerLnurlw; + +// millisats +if (resp.balance !== userBalance * 1000) { + AssertionResult.setFailureMessage( + "Expected balance to be " + + userBalance * 1000 + + ", but got: " + + resp.balance + ); + AssertionResult.setFailure(true); +} + javascript + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + + 100 + true + (wallet){1} + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + + + + + + 8081 + 0 + 25 + + + + 8888 + + windowsupdate\.microsoft\.com.* + (?i).*\.(bmp|css|js|gif|ico|jpe?g|png|swf|eot|otf|ttf|mp4|woff|woff2) + .*msg\.yahoo\.com.* + www\.download\.windowsupdate\.com.* + toolbarqueries\.google\..* + http?://self-repair\.mozilla\.org.* + tiles.*\.mozilla\.com.* + .*detectportal\.firefox\.com.* + us\.update\.toolbar\.yahoo\.com.* + .*\.google\.com.*/safebrowsing/.* + api\.bing\.com.* + toolbar\.google\.com.* + .*yimg\.com.* + toolbar\.msn\.com.* + (?i).*\.(bmp|css|js|gif|ico|jpe?g|png|swf|eot|otf|ttf|mp4|woff|woff2)[\?;].* + toolbar\.avg\.com/.* + www\.google-analytics\.com.* + pgq\.yahoo\.com.* + safebrowsing.*\.google\.com.* + sqm\.microsoft\.com.* + g\.msn.* + clients.*\.google.* + .*toolbar\.yahoo\.com.* + geo\.yahoo\.com.* + + + true + 4 + false + + false + true + true + false + true + + + false + + 0 + + true + UTF-8 + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + true + true + true + true + true + true + false + true + true + true + true + 0 + true + true + true + true + true + true + true + true + + + recording.xml + + + + + + diff --git a/integration/tpos.jmx b/integration/tpos.jmx new file mode 100644 index 000000000..37da0bf10 --- /dev/null +++ b/integration/tpos.jmx @@ -0,0 +1,3214 @@ + + + + + false + false + + + + + + + + + + + host + ${__property(host,,127.0.0.1)} + = + + + scheme + ${__property(scheme,,http)} + = + + + port + ${__property(port,,5000)} + = + + + thinkTime + 3000 + = + + + + + + + + + ${host} + ${port} + ${scheme} + + + 6 + Java + 20000 + 30000 + + + + + + + + stopthread + + false + 1 + + 1 + 1 + 1370726934000 + 1370726934000 + false + + + false + + + + + false + false + + + + false + true + + + + fragments/init-server.jmx + + + + + false + true + + + + fragments/init-account.jmx + + + + + false + true + + + + + + + false + enable + tpos + = + true + + + + ${host} + ${port} + ${scheme} + utf-8 + /extensions + GET + true + false + true + false + + + + + + + + + Sec-Fetch-Mode + same-origin + + + Sec-Fetch-Site + same-origin + + + Accept-Language + en-US,en;q=0.${paidChargeCount} + + + Upgrade-Insecure-Requests + 1 + + + Accept-Encoding + gzip, deflate, br + + + User-Agent + Mozilla/${paidChargeCount}.0 (Macintosh; Intel Mac OS X 10.15; rv:106.0) Gecko/20100101 Firefox/106.0 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 + + + Sec-Fetch-Dest + empty + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /tpos/ + GET + true + false + true + false + + + + + + + + + Sec-Fetch-Mode + same-origin + + + Referer + ${scheme}://${host}:${port}/tpos/ + + + Sec-Fetch-Site + same-origin + + + Accept-Language + en-US,en;q=0.${lnurlpCount} + + + Upgrade-Insecure-Requests + 1 + + + Accept-Encoding + gzip, deflate, br + + + User-Agent + Mozilla/${lnurlpCount}.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/118.0 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 + + + Sec-Fetch-Dest + empty + + + + + + + + + + false + all_wallets + true + = + true + + + + ${host} + ${port} + ${scheme} + UTF-8 + /tpos/api/v1/tposs + GET + true + false + true + false + + + + + + + + + Sec-Fetch-Mode + cors + + + Referer + ${scheme}://${host}:${port}/tpos/ + + + Sec-Fetch-Site + same-origin + + + Accept-Language + en-US,en;q=0.${lnurlpCount} + + + X-Api-Key + ${adminkey} + + + Accept-Encoding + gzip, deflate, br + + + User-Agent + Mozilla/${lnurlpCount}.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/118.0 + + + Accept + application/json, text/plain, */* + + + Sec-Fetch-Dest + empty + + + + + + + + false + true + + + + + + pin + 2222 + = + + + timeBtw + = + 1 + + + withdrawLmt + = + 100000 + + + tipOptions + [2, 5] + = + + + memo + TPoS test + = + + + + + + true + + + + false + {"name":"tips wallet"} + = + + + + ${host} + ${port} + ${scheme} + UTF-8 + /api/v1/wallet + POST + true + false + true + false + + + + + + + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Site + same-origin + + + Accept-Language + en-US,en;q=0.${lnurlpCount} + + + Origin + ${scheme}://${host}:${port} + + + Accept + application/json, text/plain, */* + + + X-Api-Key + ${adminkey} + + + Content-Type + application/json + + + Accept-Encoding + gzip, deflate, br + + + User-Agent + Mozilla/${lnurlpCount}.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/118.0 + + + Sec-Fetch-Dest + empty + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + javascript + + + true + var resp = JSON.parse(prev.getResponseDataAsString()); + +var walletId = vars.get("walletId"); +var userId = vars.get("userId"); +if (!resp.id) { + AssertionResult.setFailureMessage("TPoS not created"); + AssertionResult.setFailure(true); +} else if (resp.user !== userId) { + AssertionResult.setFailureMessage( + "TPoS user id expected to be '" + userId + "', but was: " + resp.user + ); + AssertionResult.setFailure(true); +} else if (resp.name !== "tips wallet") { + AssertionResult.setFailureMessage( + "TPoS name expected to be 'tips wallet', but was: " + resp.name + ); + AssertionResult.setFailure(true); +} + + + + + javascript + + + true + var resp = JSON.parse(prev.getResponseDataAsString()) + +vars.put("tipWalletId", resp.id || "no-tip-wallet-id"); +vars.put("tipinkey", resp.inkey || 'no-tip-inkey'); +vars.put("tipadminkey", resp.adminkey || 'no-tip-adminkey'); + + + + + + true + + + + false + {"name":"Test","wallet":"${walletId}","currency":"USD"} + = + + + + ${host} + ${port} + ${scheme} + UTF-8 + /tpos/api/v1/tposs + POST + true + false + true + false + + + + + + + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Site + same-origin + + + Accept-Language + en-US,en;q=0.${lnurlpCount} + + + Origin + ${scheme}://${host}:${port} + + + Accept + application/json, text/plain, */* + + + X-Api-Key + ${adminkey} + + + Content-Type + application/json + + + Accept-Encoding + gzip, deflate, br + + + User-Agent + Mozilla/${lnurlpCount}.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/118.0 + + + Sec-Fetch-Dest + empty + + + + + + + 201 + + + Assertion.response_code + false + 8 + + + + javascript + + + true + var resp = JSON.parse(prev.getResponseDataAsString()) + +var walletId = vars.get("walletId") + +if (!resp.id) { + AssertionResult.setFailureMessage("TPoS not created"); + AssertionResult.setFailure(true) +} else if (resp.wallet !== walletId){ + AssertionResult.setFailureMessage("TPoS description expected to be '"+walletId+"', but was: " + resp.wallet); + AssertionResult.setFailure(true) +} + + + + javascript + + + true + var resp = JSON.parse(prev.getResponseDataAsString()) + +vars.put("tposId", resp.id || 'no-tpos-id'); + + + + + true + + + + false + {"tip_options":"${tipOptions}","tip_wallet":"${tipWalletId}"} + = + + + + ${host} + ${port} + ${scheme} + UTF-8 + /tpos/api/v1/tposs/${tposId} + PUT + true + false + true + false + + + + + + + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Site + same-origin + + + Accept-Language + en-US,en;q=0.${lnurlpCount} + + + Origin + ${scheme}://${host}:${port} + + + Accept + application/json, text/plain, */* + + + X-Api-Key + ${adminkey} + + + Content-Type + application/json + + + Accept-Encoding + gzip, deflate, br + + + User-Agent + Mozilla/${lnurlpCount}.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/118.0 + + + Sec-Fetch-Dest + empty + + + + + + + 200 + + + Assertion.response_code + false + 40 + + + + javascript + + + true + var resp = JSON.parse(prev.getResponseDataAsString()) + +var walletId = vars.get("walletId") +var tipWalletId = vars.get("tipWalletId") +var tipOptions = vars.get("tipOptions") + +if (!resp.id) { + AssertionResult.setFailureMessage("TPoS not updated"); + AssertionResult.setFailure(true) +} else if (resp.wallet !== walletId){ + AssertionResult.setFailureMessage("TPoS description expected to be '"+walletId+"', but was: " + resp.wallet); + AssertionResult.setFailure(true) +} else if (resp.tip_wallet != tipWalletId) { + AssertionResult.setFailureMessage("Tip wallet expected to be '"+tipWalletId+"', but was: " + resp.tip_wallet); + AssertionResult.setFailure(true) +} else if (resp.tip_options != tipOptions) { + AssertionResult.setFailureMessage("Tip options expected to be '"+tipOptions+"', but was: " + resp.tip_options); + AssertionResult.setFailure(true) +} + + + + + true + + + + false + {"withdrawpin":${pin},"withdrawbtwn":${timeBtw},"name":"Test ATM","wallet":"${walletId}","currency":"EUR","withdrawlimit":${withdrawLmt}} + = + + + + ${host} + ${port} + ${scheme} + UTF-8 + /tpos/api/v1/tposs + POST + true + false + true + false + + + + + + + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Site + same-origin + + + Accept-Language + en-US,en;q=0.${lnurlpCount} + + + Origin + ${scheme}://${host}:${port} + + + Accept + application/json, text/plain, */* + + + X-Api-Key + ${adminkey} + + + Content-Type + application/json + + + Accept-Encoding + gzip, deflate, br + + + User-Agent + Mozilla/${lnurlpCount}.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/118.0 + + + Sec-Fetch-Dest + empty + + + + + + + 201 + + + Assertion.response_code + false + 8 + + + + javascript + + + true + var resp = JSON.parse(prev.getResponseDataAsString()) + +var walletId = vars.get("walletId") + +if (!resp.id) { + AssertionResult.setFailureMessage("TPoS not created"); + AssertionResult.setFailure(true) +} else if (resp.wallet !== walletId){ + AssertionResult.setFailureMessage("TPoS description expected to be '"+walletId+"', but was: " + resp.wallet); + AssertionResult.setFailure(true) +} + + + + javascript + + + true + var resp = JSON.parse(prev.getResponseDataAsString()) + +vars.put("ATMtposId", resp.id || 'no-tpos-id'); + + + + + + false + true + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /tpos/${tposId} + GET + true + false + true + false + + + + + + + + + Sec-Fetch-Mode + same-origin + + + Referer + ${scheme}://${host}:${port}/tpos/ + + + Sec-Fetch-Site + same-origin + + + Accept-Language + en-US,en;q=0.${lnurlpCount} + + + Upgrade-Insecure-Requests + 1 + + + Accept-Encoding + gzip, deflate, br + + + User-Agent + Mozilla/${lnurlpCount}.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/118.0 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 + + + Sec-Fetch-Dest + empty + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + + ⬅ + ok + + + Assertion.response_data + false + 2 + + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /tpos/api/v1/rate/EUR + GET + true + false + true + false + + + + + + + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Site + same-origin + + + Accept-Language + en-US,en;q=0.${lnurlpCount} + + + Accept-Encoding + gzip, deflate, br + + + User-Agent + Mozilla/${lnurlpCount}.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/118.0 + + + Accept + application/json, text/plain, */* + + + Sec-Fetch-Dest + empty + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + rate + null + true + false + true + false + + + + + + false + true + + + + 1000 + 10 + + true + + amount + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /tpos/api/v1/tposs/${tposId}/invoices?amount=${amount}&memo=${memo} + POST + true + false + true + false + + + + + + + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Site + same-origin + + + Accept-Language + en-US,en;q=0.${lnurlpCount} + + + Origin + ${scheme}://${host}:${port} + + + Accept + application/json, text/plain, */* + + + Content-Type + application/x-www-form-urlencoded + + + Accept-Encoding + gzip, deflate, br + + + User-Agent + Mozilla/${lnurlpCount}.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/118.0 + + + Sec-Fetch-Dest + empty + + + + + + + 201 + + + Assertion.response_code + false + 8 + + + + payment_request + + false + false + false + true + + + + payment_hash + + false + false + false + true + + + + paymentRequest + payment_request + 0 + no-payment-request + + + + paymentHash + payment_hash + 0 + no-payment-hash + + + + + true + 1 + + + + 1100 + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /tpos/api/v1/tposs/${tposId}/invoices/${paymentHash} + GET + true + false + true + false + + + + + + + + + Sec-Fetch-Mode + cors + + + Referer + ${scheme}://${host}:${port}/tpos/4qJSDrSf9peoV9iMqvmpBT + + + Sec-Fetch-Site + same-origin + + + Accept-Language + en-US,en;q=0.${lnurlpCount} + + + Accept-Encoding + gzip, deflate, br + + + User-Agent + Mozilla/${lnurlpCount}.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/118.0 + + + Accept + application/json, text/plain, */* + + + Sec-Fetch-Dest + empty + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + paid + false + true + false + false + false + + + + + + true + + + + false + { + "out": true, + "amount": ${amount}, + "memo": "${memo}", + "unit": "sat", + "bolt11": "${paymentRequest}" +} + = + + + + ${host} + ${port} + ${scheme} + utf-8 + /api/v1/payments + POST + true + false + true + false + + + + + + + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Site + same-origin + + + Accept-Language + en-US,en;q=0.${lnurlpCount} + + + Origin + ${scheme}://${host}:${port} + + + Accept + application/json, text/plain, */* + + + X-Api-Key + ${adminWalletKey} + + + Content-Type + application/json;charset=utf-8 + + + Accept-Encoding + gzip, deflate, br + + + User-Agent + Mozilla/${lnurlpCount}.0 (Macintosh; Intel Mac OS X 10.15; rv:106.0) Gecko/20100101 Firefox/106.0 + + + Sec-Fetch-Dest + empty + + + + + + + 201 + + + Assertion.response_code + false + 8 + + + + javascript + + + true + var resp = JSON.parse(prev.getResponseDataAsString()) + +var paymentHash = vars.get("paymentHash") + +if (!resp.payment_hash) { + AssertionResult.setFailureMessage("Payment failed"); + AssertionResult.setFailure(true) +} else if (resp.payment_hash !== paymentHash) { + AssertionResult.setFailureMessage("Payment hash expected to be '"+paymentHash+"', but was: " + resp.payment_hash); + AssertionResult.setFailure(true) +} + + + + + 1100 + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /tpos/api/v1/tposs/${tposId}/invoices/${paymentHash} + GET + true + false + true + false + + + + + + + + + Sec-Fetch-Mode + cors + + + Referer + ${scheme}://${host}:${port}/tpos/4qJSDrSf9peoV9iMqvmpBT + + + Sec-Fetch-Site + same-origin + + + Accept-Language + en-US,en;q=0.${lnurlpCount} + + + Accept-Encoding + gzip, deflate, br + + + User-Agent + Mozilla/${lnurlpCount}.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/118.0 + + + Accept + application/json, text/plain, */* + + + Sec-Fetch-Dest + empty + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + paid + true + true + false + false + false + + + + + + false + true + + + + 1000 + 10 + + true + + amount + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /tpos/api/v1/tposs/${tposId}/invoices?amount=${amount}&memo=${memo}&tipAmount=${__javaScript(parseInt(Math.ceil(0.05*${amount})).toFixed(0))} + POST + true + false + true + false + + + + + + + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Site + same-origin + + + Accept-Language + en-US,en;q=0.${lnurlpCount} + + + Origin + ${scheme}://${host}:${port} + + + Accept + application/json, text/plain, */* + + + Content-Type + application/x-www-form-urlencoded + + + Accept-Encoding + gzip, deflate, br + + + User-Agent + Mozilla/${lnurlpCount}.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/118.0 + + + Sec-Fetch-Dest + empty + + + + + + + 201 + + + Assertion.response_code + false + 8 + + + + payment_request + + false + false + false + true + + + + payment_hash + + false + false + false + true + + + + paymentHash + payment_hash + 0 + no-payment-hash + + + + paymentRequest + payment_request + 0 + no-payment-request + + + + + true + 1 + + + + 1100 + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /tpos/api/v1/tposs/${tposId}/invoices/${paymentHash} + GET + true + false + true + false + + + + + + + + + Sec-Fetch-Mode + cors + + + Referer + ${scheme}://${host}:${port}/tpos/4qJSDrSf9peoV9iMqvmpBT + + + Sec-Fetch-Site + same-origin + + + Accept-Language + en-US,en;q=0.${lnurlpCount} + + + Accept-Encoding + gzip, deflate, br + + + User-Agent + Mozilla/${lnurlpCount}.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/118.0 + + + Accept + application/json, text/plain, */* + + + Sec-Fetch-Dest + empty + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + paid + false + true + false + false + false + + + + + + true + + + + false + { + "out": true, + "amount": ${amount}, + "memo": "${memo}", + "unit": "sat", + "bolt11": "${paymentRequest}" +} + = + + + + ${host} + ${port} + ${scheme} + utf-8 + /api/v1/payments + POST + true + false + true + false + + + + + + + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Site + same-origin + + + Accept-Language + en-US,en;q=0.${lnurlpCount} + + + Origin + ${scheme}://${host}:${port} + + + Accept + application/json, text/plain, */* + + + X-Api-Key + ${adminWalletKey} + + + Content-Type + application/json;charset=utf-8 + + + Accept-Encoding + gzip, deflate, br + + + User-Agent + Mozilla/${lnurlpCount}.0 (Macintosh; Intel Mac OS X 10.15; rv:106.0) Gecko/20100101 Firefox/106.0 + + + Sec-Fetch-Dest + empty + + + + + + + 201 + + + Assertion.response_code + false + 8 + + + + javascript + + + true + var resp = JSON.parse(prev.getResponseDataAsString()) + +var paymentHash = vars.get("paymentHash") + +if (!resp.payment_hash) { + AssertionResult.setFailureMessage("Payment failed"); + AssertionResult.setFailure(true) +} else if (resp.payment_hash !== paymentHash) { + AssertionResult.setFailureMessage("Payment hash expected to be '"+paymentHash+"', but was: " + resp.payment_hash); + AssertionResult.setFailure(true) +} + + + + + 1100 + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /tpos/api/v1/tposs/${tposId}/invoices/${paymentHash} + GET + true + false + true + false + + + + + + + + + Sec-Fetch-Mode + cors + + + Referer + ${scheme}://${host}:${port}/tpos/4qJSDrSf9peoV9iMqvmpBT + + + Sec-Fetch-Site + same-origin + + + Accept-Language + en-US,en;q=0.${lnurlpCount} + + + Accept-Encoding + gzip, deflate, br + + + User-Agent + Mozilla/${lnurlpCount}.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/118.0 + + + Accept + application/json, text/plain, */* + + + Sec-Fetch-Dest + empty + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + paid + true + true + false + false + false + + + + + + false + true + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /tpos/${ATMtposId} + GET + true + false + true + false + + + + + + + + + Sec-Fetch-Mode + same-origin + + + Referer + ${scheme}://${host}:${port}/tpos/ + + + Sec-Fetch-Site + same-origin + + + Accept-Language + en-US,en;q=0.${lnurlpCount} + + + Upgrade-Insecure-Requests + 1 + + + Accept-Encoding + gzip, deflate, br + + + User-Agent + Mozilla/${lnurlpCount}.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/118.0 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 + + + Sec-Fetch-Dest + empty + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + + ⬅ + Ok + + + Assertion.response_data + false + 2 + + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /tpos/api/v1/rate/EUR + GET + true + false + true + false + + + + + + + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Site + same-origin + + + Accept-Language + en-US,en;q=0.${lnurlpCount} + + + Accept-Encoding + gzip, deflate, br + + + User-Agent + Mozilla/${lnurlpCount}.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/118.0 + + + Accept + application/json, text/plain, */* + + + Sec-Fetch-Dest + empty + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + rate + null + true + false + true + false + + + + + + false + true + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /tpos/api/v1/tposs/${ATMtposId}/invoices?amount=11000&memo=${memo} + POST + true + false + true + false + + + + + + + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Site + same-origin + + + Accept-Language + en-US,en;q=0.${lnurlpCount} + + + Origin + ${scheme}://${host}:${port} + + + Accept + application/json, text/plain, */* + + + Content-Type + application/x-www-form-urlencoded + + + Accept-Encoding + gzip, deflate, br + + + User-Agent + Mozilla/${lnurlpCount}.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/118.0 + + + Sec-Fetch-Dest + empty + + + + + + + 201 + + + Assertion.response_code + false + 8 + + + + payment_request + + false + false + false + true + + + + payment_hash + + false + false + false + true + + + + paymentRequest + payment_request + 0 + no-payment-request + + + + paymentHash + payment_hash + 0 + no-payment-hash + + + + + 1100 + + + + true + + + + false + { + "out": true, + "amount": 11000, + "memo": "${memo}", + "unit": "sat", + "bolt11": "${paymentRequest}" +} + = + + + + ${host} + ${port} + ${scheme} + utf-8 + /api/v1/payments + POST + true + false + true + false + + + + + + + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Site + same-origin + + + Accept-Language + en-US,en;q=0.${lnurlpCount} + + + Origin + ${scheme}://${host}:${port} + + + Accept + application/json, text/plain, */* + + + X-Api-Key + ${adminWalletKey} + + + Content-Type + application/json;charset=utf-8 + + + Accept-Encoding + gzip, deflate, br + + + User-Agent + Mozilla/${lnurlpCount}.0 (Macintosh; Intel Mac OS X 10.15; rv:106.0) Gecko/20100101 Firefox/106.0 + + + Sec-Fetch-Dest + empty + + + + + + + 201 + + + Assertion.response_code + false + 8 + + + + javascript + + + true + var resp = JSON.parse(prev.getResponseDataAsString()) + +var paymentHash = vars.get("paymentHash") + +if (!resp.payment_hash) { + AssertionResult.setFailureMessage("Payment failed"); + AssertionResult.setFailure(true) +} else if (resp.payment_hash !== paymentHash) { + AssertionResult.setFailureMessage("Payment hash expected to be '"+paymentHash+"', but was: " + resp.payment_hash); + AssertionResult.setFailure(true) +} + + + + + 1100 + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /tpos/api/v1/tposs/${ATMtposId}/invoices/${paymentHash} + GET + true + false + true + false + + + + + + + + + Sec-Fetch-Mode + cors + + + Referer + ${scheme}://${host}:${port}/tpos/4qJSDrSf9peoV9iMqvmpBT + + + Sec-Fetch-Site + same-origin + + + Accept-Language + en-US,en;q=0.${lnurlpCount} + + + Accept-Encoding + gzip, deflate, br + + + User-Agent + Mozilla/${lnurlpCount}.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/118.0 + + + Accept + application/json, text/plain, */* + + + Sec-Fetch-Dest + empty + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + paid + true + true + false + false + false + + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /api/v1/wallet + GET + true + false + true + false + + + + + + + + + Referer + ${scheme}://${host}:${port}/wallet?wal=${walletId} + + + Accept-Language + en-US,en;q=0.5 + + + X-Api-Key + ${adminWalletKey} + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0 + + + Accept + application/json, text/plain, */* + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + adminBalance + balance + 0 + no-admin-balance + + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /api/v1/wallet + GET + true + false + true + false + + + + + + + + + Referer + ${scheme}://${host}:${port}/wallet?wal=${walletId} + + + Accept-Language + en-US,en;q=0.5 + + + X-Api-Key + ${inkey} + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0 + + + Accept + application/json, text/plain, */* + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + userBalance + balance + 0 + no-user-balance + + + + + + false + true + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /tpos/api/v1/atm/${ATMtposId}/${pin} + GET + true + false + true + false + + + + + + + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Site + same-origin + + + Accept-Language + en-US,en;q=0.${lnurlpCount} + + + Accept-Encoding + gzip, deflate, br + + + User-Agent + Mozilla/${lnurlpCount}.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/118.0 + + + Accept + application/json, text/plain, */* + + + Sec-Fetch-Dest + empty + + + + + + + 201 + + + Assertion.response_code + false + 8 + + + + token + id + 0 + no-token + + + + + + false + true + + + + 10000 + 3000 + + true + + amount + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /tpos/api/v1/atm/withdraw/${token}/${amount} + GET + true + false + true + false + + Java + + + + + + + + Sec-Fetch-Mode + cors + + + Referer + https://violet-frogs-fail.loca.lt/tpos/4qJSDrSf9peoV9iMqvmpBT + + + Sec-Fetch-Site + same-origin + + + Accept-Language + en-US,en;q=0.${lnurlpCount} + + + Accept-Encoding + gzip, deflate, br + + + User-Agent + Mozilla/${lnurlpCount}.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/118.0 + + + Accept + application/json, text/plain, */* + + + Sec-Fetch-Dest + empty + + + + + + + 201 + + + Assertion.response_code + false + 8 + + + + claimed + false + true + false + false + true + + + + amount + ${amount} + true + false + false + true + + + + lnurl + lnurl + 0 + no-lnurl + + + + certAlias + -1 + True + 0 + + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /api/v1/lnurlscan/${lnurl} + GET + true + false + true + false + + + + + + + + + Sec-Fetch-Mode + cors + + + Referer + ${scheme}://${host}:${port}/wallet + + + Sec-Fetch-Site + same-origin + + + Accept-Language + en-US,en;q=0.${lnurlpCount} + + + X-Api-Key + ${adminWalletKey} + + + Accept-Encoding + gzip, deflate, br + + + User-Agent + Mozilla/${lnurlpCount}.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/118.0 + + + Accept + application/json, text/plain, */* + + + Sec-Fetch-Dest + empty + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + domain + ${host}:${port} + true + false + false + true + + + + tag + withdrawRequest + true + false + false + true + + + + kind + withdraw + true + false + false + true + + + + withdrawLinkCallback + callback + 0 + no-withdrawlink-callback + + + + + true + + + + false + {"out":false,"amount":${amount},"memo":"TPoS withdraw","unit":"sat","lnurl_callback":"${withdrawLinkCallback}"} + = + + + + ${host} + ${port} + ${scheme} + utf-8 + /api/v1/payments + POST + true + false + true + false + + + + + + + + + Sec-Fetch-Mode + cors + + + Sec-Fetch-Site + same-origin + + + Accept-Language + en-US,en;q=0.${lnurlpCount} + + + Origin + ${scheme}://${host}:${port} + + + Accept + application/json, text/plain, */* + + + X-Api-Key + ${adminWalletKey} + + + Content-Type + application/json;charset=utf-8 + + + Accept-Encoding + gzip, deflate, br + + + User-Agent + Mozilla/${lnurlpCount}.0 (Macintosh; Intel Mac OS X 10.15; rv:106.0) Gecko/20100101 Firefox/106.0 + + + Sec-Fetch-Dest + empty + + + + + + + 201 + + + Assertion.response_code + false + 8 + + + + lnurl_response + true + true + false + false + true + + + + paymenHash + payment_hash + 0 + no-payment-hash + + + + + 1100 + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /api/v1/payments/${paymenHash} + GET + true + false + true + false + + + + + + + + + X-Api-Key + ${inkey} + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /api/v1/wallet + GET + true + false + true + false + + + + + + + + + Referer + ${scheme}://${host}:${port}/wallet?wal=${walletId} + + + Accept-Language + en-US,en;q=0.5 + + + X-Api-Key + ${inkey} + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0 + + + Accept + application/json, text/plain, */* + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + true + + + var resp = JSON.parse(prev.getResponseDataAsString()) + +var userBalance = +vars.get("userBalance") +var amount = +vars.get("amount") +userBalance -= amount * 1000 + +// millisats +if (resp.balance !== userBalance) { + AssertionResult.setFailureMessage("Expected balance to be "+userBalance+", but got: "+ resp.balance); + AssertionResult.setFailure(true) +} + javascript + + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /api/v1/wallet + GET + true + false + true + false + + + + + + + + + Referer + ${scheme}://${host}:${port}/wallet?wal=${walletId} + + + Accept-Language + en-US,en;q=0.5 + + + X-Api-Key + ${adminWalletKey} + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0 + + + Accept + application/json, text/plain, */* + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + true + + + var resp = JSON.parse(prev.getResponseDataAsString()) + +var adminBalance = +vars.get("adminBalance") +var amount = +vars.get("amount") +adminBalance += amount * 1000 + +// millisats +if (resp.balance !== adminBalance) { + AssertionResult.setFailureMessage("Expected balance to be "+adminBalance+", but got: "+ resp.balance); + AssertionResult.setFailure(true) +} + javascript + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + + 100 + true + (wallet){1} + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + + + + + + 8888 + + windowsupdate\.microsoft\.com.* + (?i).*\.(bmp|css|js|gif|ico|jpe?g|png|swf|eot|otf|ttf|mp4|woff|woff2) + .*msg\.yahoo\.com.* + www\.download\.windowsupdate\.com.* + toolbarqueries\.google\..* + http?://self-repair\.mozilla\.org.* + tiles.*\.mozilla\.com.* + .*detectportal\.firefox\.com.* + us\.update\.toolbar\.yahoo\.com.* + .*\.google\.com.*/safebrowsing/.* + api\.bing\.com.* + toolbar\.google\.com.* + .*yimg\.com.* + toolbar\.msn\.com.* + (?i).*\.(bmp|css|js|gif|ico|jpe?g|png|swf|eot|otf|ttf|mp4|woff|woff2)[\?;].* + toolbar\.avg\.com/.* + www\.google-analytics\.com.* + pgq\.yahoo\.com.* + safebrowsing.*\.google\.com.* + sqm\.microsoft\.com.* + g\.msn.* + clients.*\.google.* + .*toolbar\.yahoo\.com.* + geo\.yahoo\.com.* + + + true + 4 + false + + false + true + true + false + true + + + false + + 0 + + true + UTF-8 + + + + 8081 + 0 + 25 + + + + continue + + false + 1 + + 1 + 1 + false + + + true + + + + + diff --git a/integration/watchonly-satspay-tipjar.jmx b/integration/watchonly-satspay-tipjar.jmx new file mode 100644 index 000000000..7e4d1a6c2 --- /dev/null +++ b/integration/watchonly-satspay-tipjar.jmx @@ -0,0 +1,3222 @@ + + + + + + false + false + + + + + + + + + + host + ${__property(host,,127.0.0.1)} + = + + + scheme + ${__property(scheme,,http)} + = + + + port + ${__property(port,,5000)} + = + + + xpubNoFunds + zpub6roF3uF1YsrxvSK9cC7kpT7xt45i6aZffVg5SHWkqcEMTpA2fnB9eF45wgM7EXAmFDazxyWGsDbwCMUTiteYFhBJNLrgpkBjVet9S98UXor + = + + + xpubWithFunds + zpub6rsRjqj6BTbD9DjqrY4p14tUx5kdA8ZGCTJD99wZTxD5wfvCkyXKrK3s7M3B1eFN6NbRhmbDDRDC8LF3Bn5gmxxN9rF8mDpZsGC6isGrK1g + = + + + paidChargeCount + 5 + = + + + userTipCount + 5 + = + + + thinkTime + 3000 + = + + + + + + + + + ${host} + + ${scheme} + + + 6 + + + + + + + false + false + + + + stopthread + + false + 1 + + 1 + 1 + 1370726934000 + 1370726934000 + false + + + false + + + + false + true + + + + fragments/init-server.jmx + + + + + false + true + + + + fragments/init-account.jmx + + + + + false + true + + + + + + + false + usr + ${userId} + = + true + + + false + enable + watchonly + = + true + + + + ${host} + ${port} + ${scheme} + utf-8 + /extensions + GET + true + false + true + false + + + + + + + + + Referer + ${scheme}://${host}:${port}/extensions?usr=${userId} + + + Accept-Language + en-US,en;q=0.5 + + + Upgrade-Insecure-Requests + 1 + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + + + + + false + usr + ${userId} + = + true + + + + ${host} + ${port} + ${scheme} + UTF-8 + /watchonly/ + GET + true + false + true + false + + + + + + + + + Accept-Language + en-US,en;q=0.5 + + + Upgrade-Insecure-Requests + 1 + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + + Scan Blockchain + + + Assertion.response_data + false + 2 + + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /watchonly/api/v1/config + GET + true + false + true + false + + + + + + + + + Referer + ${scheme}://${host}:${port}/watchonly/?usr=${userId} + + + Accept-Language + en-US,en;q=0.5 + + + X-Api-Key + ${inkey} + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0 + + + Accept + application/json, text/plain, */* + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + + {"mempool_endpoint":"https://mempool.space","receive_gap_limit":20,"change_gap_limit":5,"sats_denominated":true,"network":"Mainnet"} + + + Assertion.response_data + false + 8 + + + + + + + + false + network + Mainnet + = + true + + + + ${host} + ${port} + ${scheme} + UTF-8 + /watchonly/api/v1/wallet + GET + true + false + true + false + + + + + + + + + Referer + ${scheme}://${host}:${port}/watchonly/?usr=${userId} + + + Accept-Language + en-US,en;q=0.5 + + + X-Api-Key + ${inkey} + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0 + + + Accept + application/json, text/plain, */* + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + + [] + + + Assertion.response_data + false + 8 + + + + + true + + + + false + {"title":"segwit","masterpub":"${xpubWithFunds}","network":"Mainnet","meta":"{\"accountPath\":\"m/84'/0'/0'\"}"} + = + + + + ${host} + ${port} + ${scheme} + utf-8 + /watchonly/api/v1/wallet + POST + true + false + true + false + + + + + + + + + Referer + ${scheme}://${host}:${port}/watchonly/?usr=${userId} + + + Accept-Language + en-US,en;q=0.5 + + + X-Api-Key + ${adminkey} + + + Origin + ${scheme}://${host}:${port} + + + Content-Type + application/json;charset=utf-8 + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0 + + + Accept + application/json, text/plain, */* + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + groovy + + + true + var resp = JSON.parse(prev.getResponseDataAsString()) + +if (!resp.id) { + AssertionResult.setFailureMessage("Onchain account not created"); + AssertionResult.setFailure(true) +} + +delete resp.id + +var expectedAccount = [{ + "masterpub": "zpub6roF3uF1YsrxvSK9cC7kpT7xt45i6aZffVg5SHWkqcEMTpA2fnB9eF45wgM7EXAmFDazxyWGsDbwCMUTiteYFhBJNLrgpkBjVet9S98UXor", + "fingerprint": "8eb84369", + "title": "segwit", + "address_no": 79, + "balance": 0, + "type": "p2wpkh", + "network": "Mainnet", + "meta": "{\"accountPath\":\"m/84'/0'/0'\"}" +}] + +if (JSON.stringify(resp) !== JSON.stringify(expectedAccount)) { + AssertionResult.setFailureMessage("Expected account incorrect: " + JSON.stringify(expectedAccount)); + AssertionResult.setFailure(true) +} + + + + javascript + + + true + var resp = JSON.parse(prev.getResponseDataAsString()) + +vars.put("onchainAccountId", resp.id || 'no-onchain-account-id'); + + + + + + + + false + network + Mainnet + = + true + + + + ${host} + ${port} + ${scheme} + UTF-8 + /watchonly/api/v1/wallet + GET + true + false + true + false + + + + + + + + + Referer + ${scheme}://${host}:${port}/watchonly/?usr=${userId} + + + Accept-Language + en-US,en;q=0.5 + + + X-Api-Key + ${inkey} + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0 + + + Accept + application/json, text/plain, */* + + + + + + javascript + + + true + var accounts = JSON.parse(prev.getResponseDataAsString()) + +if (accounts.length === 0) { + AssertionResult.setFailureMessage("No onchain account found"); + AssertionResult.setFailure(true) +} + +var accountId = vars.get("onchainAccountId") +if (accountId !== accounts[0].id) { + AssertionResult.setFailureMessage("Incorrect account id: "+accountId + " / "+accounts[0].id); + AssertionResult.setFailure(true) +} + + + + + 200 + + + Assertion.response_code + false + 8 + + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /watchonly/api/v1/addresses/${onchainAccountId} + GET + true + false + true + false + + + + + + + + + Referer + ${scheme}://${host}:${port}/watchonly/?usr=${userId} + + + Accept-Language + en-US,en;q=0.5 + + + X-Api-Key + ${inkey} + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0 + + + Accept + application/json, text/plain, */* + + + + + + javascript + + + true + var addresses = JSON.parse(prev.getResponseDataAsString()) + +if (addresses.length !== 25) { + AssertionResult.setFailureMessage("Expected 25 addresses, got " + addresses.length ); + AssertionResult.setFailure(true) +} + + + + + 200 + + + Assertion.response_code + false + 8 + + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /watchonly/api/v1/address/${onchainAccountId} + GET + true + false + true + false + + + + + + + + + Referer + ${scheme}://${host}:${port}/watchonly/?usr=${userId} + + + Accept-Language + en-US,en;q=0.5 + + + X-Api-Key + ${inkey} + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0 + + + Accept + application/json, text/plain, */* + + + + + + javascript + + + true + var resp = JSON.parse(prev.getResponseDataAsString()) + +var expectedAddress = 'bc1qtmfyj6s76xhrsgd4aw6qq9tc9d48vnd0690k5w' +if (resp.address !== expectedAddress) { + AssertionResult.setFailureMessage("Expected addresses '"+expectedAddress+"', got " + resp.address ); + AssertionResult.setFailure(true) +} + + + + + 200 + + + Assertion.response_code + false + 8 + + + + + + false + true + + + + + + + false + usr + ${userId} + = + true + + + false + enable + satspay + = + true + + + + ${host} + ${port} + ${scheme} + utf-8 + /extensions + GET + true + false + true + false + + + + + + + + + Referer + ${scheme}://${host}:${port}/extensions?usr=${userId} + + + Accept-Language + en-US,en;q=0.5 + + + Upgrade-Insecure-Requests + 1 + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + + + + + false + usr + ${userId} + = + true + + + + ${host} + ${port} + ${scheme} + UTF-8 + /satspay/ + GET + true + false + true + false + + + + + + + + + Referer + ${scheme}://${host}:${port}/extensions?usr=${userId}&enable=satspay + + + Accept-Language + en-US,en;q=0.5 + + + Upgrade-Insecure-Requests + 1 + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + + <h5 class="text-subtitle1 q-my-none">Charges</h5> + + + Assertion.response_data + false + 2 + + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /satspay/api/v1/charges + GET + true + false + true + false + + + + + + + + + Referer + ${scheme}://${host}:${port}/satspay/?usr=${userId} + + + Accept-Language + en-US,en;q=0.5 + + + X-Api-Key + ${inkey} + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0 + + + Accept + application/json, text/plain, */* + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + + [] + + + Assertion.response_data + false + 8 + + + + + true + + + + false + {"onchain":true,"onchainwallet":"${onchainAccountId}","lnbits":false,"description":"Onchain Charge","time":1111,"amount":1111,"lnbitswallet":null} + = + + + + ${host} + ${port} + ${scheme} + utf-8 + /satspay/api/v1/charge + POST + true + false + true + false + + + + + + + + + Referer + ${scheme}://${host}:${port}/satspay/?usr=${userId} + + + Accept-Language + en-US,en;q=0.5 + + + X-Api-Key + ${inkey} + + + Origin + ${scheme}://${host}:${port} + + + Content-Type + application/json;charset=utf-8 + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0 + + + Accept + application/json, text/plain, */* + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + javascript + + + true + var resp = JSON.parse(prev.getResponseDataAsString()) + +vars.put("chargeId", resp.id || 'no-charge-id'); + + + + + 200 + + + Assertion.response_code + false + 8 + + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /satspay/${chargeId} + GET + true + false + true + false + + + + + + + + + Referer + ${scheme}://${host}:${port}/satspay/ + + + Accept-Language + en-US,en;q=0.5 + + + Upgrade-Insecure-Requests + 1 + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /satspay/api/v1/charge/balance/${chargeId} + GET + true + false + true + false + + + + + + + + + Referer + ${scheme}://${host}:${port}/satspay/${chargeId} + + + Accept-Language + en-US,en;q=0.5 + + + X-Api-Key + undefined + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0 + + + Accept + application/json, text/plain, */* + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + + true + + + + false + {"onchain":false,"onchainwallet":null,"lnbits":true,"description":"lightning charge - to expire","time":1,"amount":10,"lnbitswallet":"${walletId}","webhook":"https://google.com","completelink":"https://twitter.com","completelinktext":"Have Fun"} + = + + + + ${host} + ${port} + ${scheme} + utf-8 + /satspay/api/v1/charge + POST + true + false + true + false + + + + + + + + + Accept-Language + en-US,en;q=0.5 + + + X-Api-Key + ${adminkey} + + + Origin + ${scheme}://${host}:${port} + + + Content-Type + application/json;charset=utf-8 + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0 + + + Accept + application/json, text/plain, */* + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + + + false + true + + + + true + ${paidChargeCount} + + + + 1 + + 1 + chargeCounter + + false + + + + 10 + + 1 + amountGenerator + + true + true + + + + false + true + + + + true + + + + false + {"onchain":false,"onchainwallet":null,"lnbits":true,"description":"lightning charge [${chargeCounter}]","time":1220,"amount":${amountGenerator},"lnbitswallet":"${walletId}","webhook":"http://localhost:8081","completelink":"https://twitter.com","completelinktext":"Have Fun"} + = + + + + ${host} + ${port} + ${scheme} + utf-8 + /satspay/api/v1/charge + POST + true + false + true + false + + + + + + + + + Accept-Language + en-US,en;q=0.5 + + + X-Api-Key + ${adminkey} + + + Origin + ${scheme}://${host}:${port} + + + Content-Type + application/json;charset=utf-8 + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0 + + + Accept + application/json, text/plain, */* + + + + + + javascript + + + true + var resp = JSON.parse(prev.getResponseDataAsString()) + +vars.put("lightningChargeId", resp.id || 'no-lightning-charge-id'); +vars.put("paymentRequest", resp.payment_request || 'no-lpayment-request'); + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /satspay/${lightningChargeId} + GET + true + false + true + false + + + + + + + + + Accept-Language + en-US,en;q=0.5 + + + Upgrade-Insecure-Requests + 1 + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /satspay/api/v1/charge/balance/${lightningChargeId} + GET + true + false + true + false + + + + + + + + + Accept-Language + en-US,en;q=0.5 + + + X-Api-Key + undefined + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0 + + + Accept + application/json, text/plain, */* + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + javascript + + + true + var resp = JSON.parse(prev.getResponseDataAsString()) + +if (resp.balance !== 0) { + AssertionResult.setFailureMessage("Expected balance to be zero, got " + resp.amount); + AssertionResult.setFailure(true) +} + +if (resp.paid) { + AssertionResult.setFailureMessage("Expected charge to not be paid"); + AssertionResult.setFailure(true) +} + + + + + 1 + 0 + ${thinkTime} + + + + 1000 + 100 + + + + + true + + + + false + {"out":true,"bolt11":"${paymentRequest}"} + = + + + + ${host} + ${port} + ${scheme} + utf-8 + /api/v1/payments + POST + true + false + true + false + + + + + + + + + Accept-Language + en-US,en;q=0.5 + + + X-Api-Key + ${adminWalletKey} + + + Origin + ${scheme}://${host}:${port} + + + Content-Type + application/json;charset=utf-8 + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0 + + + Accept + application/json, text/plain, */* + + + + + + + 201 + + + Assertion.response_code + false + 8 + + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /satspay/api/v1/charge/balance/${lightningChargeId} + GET + true + false + true + false + + + + + + + + + Accept-Language + en-US,en;q=0.5 + + + X-Api-Key + undefined + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0 + + + Accept + application/json, text/plain, */* + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + javascript + + + true + var resp = JSON.parse(prev.getResponseDataAsString()) + +var amount = +vars.get('amountGenerator') +if (resp.balance !== amount) { + AssertionResult.setFailureMessage("Expected balance to be "+amount+", got " + resp.amount); + AssertionResult.setFailure(true) +} + +if (!resp.paid) { + AssertionResult.setFailureMessage("Expected charge to be paid"); + AssertionResult.setFailure(true) +} + + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /satspay/api/v1/charge/${lightningChargeId} + GET + true + false + true + false + + + + + + + + + Accept-Language + en-US,en;q=0.5 + + + X-Api-Key + ${adminkey} + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0 + + + Accept + application/json, text/plain, */* + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + javascript + + + true + var payment = JSON.parse(prev.getResponseDataAsString()) + +if (!payment.paid || !payment.lnbitswallet || !payment.webhook){ + AssertionResult.setFailureMessage("Charge not correctly updated after paiment: "+ payment.id); + AssertionResult.setFailure(true) +} + +var extra = JSON.parse(payment.extra) +if (!extra.webhook_response) { + AssertionResult.setFailureMessage("Webhook response missing for payment: "+ payment.id); + AssertionResult.setFailure(true) +} + +var separatorIndex = extra.webhook_response.indexOf("\r\n\r\n") +if (separatorIndex == -1) { + AssertionResult.setFailureMessage("Webhook response has wrong format"+ extra.webhook_response); + AssertionResult.setFailure(true) +} +var headers = extra.webhook_response.substring(0, separatorIndex) +var bodyStr = extra.webhook_response.substring(separatorIndex) + +var body = JSON.parse(bodyStr) + + +if (vars.get("lightningChargeId") !== body.id) { + AssertionResult.setFailureMessage("Wrong webhook charge id. Expected: "+ vars.get("lightningChargeId") + ", but got "+ body.id); + AssertionResult.setFailure(true) +} + +if (vars.get("paymentRequest") !== body.payment_request) { + AssertionResult.setFailureMessage("Wrong webhook charge payment request. Expected: "+ vars.get("paymentRequest") + ", but got "+ body.payment_request); + AssertionResult.setFailure(true) +} + + + + + + + + + + + false + true + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /satspay/api/v1/charges + GET + true + false + true + false + + + + + + + + + Referer + ${scheme}://${host}:${port}/satspay/?usr=${userId} + + + Accept-Language + en-US,en;q=0.5 + + + X-Api-Key + ${inkey} + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0 + + + Accept + application/json, text/plain, */* + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + javascript + + + true + var resp = JSON.parse(prev.getResponseDataAsString()) + +var paidChargeCount = +vars.get('paidChargeCount') + +var totalChargeCount = paidChargeCount + 2; // one onchain and one to expire +if (resp.length !== totalChargeCount) { + AssertionResult.setFailureMessage("Expected charges count to be "+totalChargeCount+", got " + resp.length); + AssertionResult.setFailure(true) +} + + + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /api/v1/wallet + GET + true + false + true + false + + + + + + + + + Referer + ${scheme}://${host}:${port}/wallet?usr=${userId}&wal=${walletId} + + + Accept-Language + en-US,en;q=0.5 + + + X-Api-Key + ${inkey} + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0 + + + Accept + application/json, text/plain, */* + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + true + + + var resp = JSON.parse(prev.getResponseDataAsString()) + +var paidChargeCount = +vars.get('paidChargeCount') +var balance = 0 +var startAmount = 10 +for (var i=0; i< paidChargeCount; i++) { + balance += startAmount + i +} + +// millisats +if (resp.balance !== balance * 1000) { + AssertionResult.setFailureMessage("Expected balance to be "+balance+", but got: "+ resp.balance); + AssertionResult.setFailure(true) +} + +vars.put("userBalance", resp.balance) + javascript + + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /api/v1/payments + GET + true + false + true + false + + + + + + + + + Referer + ${scheme}://${host}:${port}/wallet?usr=${userId}&wal=${walletId} + + + Accept-Language + en-US,en;q=0.5 + + + X-Api-Key + ${inkey} + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0 + + + Accept + application/json, text/plain, */* + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + true + + + var resp = JSON.parse(prev.getResponseDataAsString()) + +var paidChargeCount = +vars.get('paidChargeCount') +// one payment is the expired one +var totalPaymentsCount = paidChargeCount + 1 + +if (resp.length != totalPaymentsCount) { + AssertionResult.setFailureMessage("Expected total "+totalPaymentsCount+" paymet, but got: "+ resp.length); + AssertionResult.setFailure(true) +} + +var pendingCount = 0 + +for (var i=0; i<resp.length; i++) { + var payment = resp[i] + if (payment.pending) pendingCount++ +} + +if (pendingCount !== 1) { + AssertionResult.setFailureMessage("Expected one pending paymet, but got: "+ pendingCount); + AssertionResult.setFailure(true) +} + + javascript + + + + + + false + true + + + + + + + false + usr + ${userId} + = + true + + + false + enable + tipjar + = + true + + + + ${host} + ${port} + ${scheme} + utf-8 + /extensions + GET + true + false + true + false + + + + + + + + + Accept-Language + en-US,en;q=0.${paidChargeCount} + + + Upgrade-Insecure-Requests + 1 + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/${paidChargeCount}.0 (Macintosh; Intel Mac OS X 10.15; rv:106.0) Gecko/20100101 Firefox/106.0 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + + + + + false + usr + ${userId} + = + true + + + + ${host} + ${port} + ${scheme} + UTF-8 + /tipjar/ + GET + true + false + true + false + + + + + + + + + Accept-Language + en-US,en;q=0.${paidChargeCount} + + + Upgrade-Insecure-Requests + 1 + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/${paidChargeCount}.0 (Macintosh; Intel Mac OS X 10.15; rv:106.0) Gecko/20100101 Firefox/106.0 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + + New TipJar + + + Assertion.response_data + false + 2 + + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /tipjar/api/v1/tipjars + GET + true + false + true + false + + + + + + + + + Accept-Language + en-US,en;q=0.${paidChargeCount} + + + X-Api-Key + ${inkey} + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/${paidChargeCount}.0 (Macintosh; Intel Mac OS X 10.15; rv:106.0) Gecko/20100101 Firefox/106.0 + + + Accept + application/json, text/plain, */* + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + + [] + + + Assertion.response_data + false + 8 + + + + + true + + + + false + {"wallet":"${walletId}","name":"Nakamoto","webhook":"${scheme}://${host}:8081"} + = + + + + ${host} + ${port} + ${scheme} + utf-8 + /tipjar/api/v1/tipjars + POST + true + false + true + false + + + + + + + + + Accept-Language + en-US,en;q=0.${paidChargeCount} + + + X-Api-Key + ${adminkey} + + + Origin + ${scheme}://${host}:${port} + + + Content-Type + application/json;charset=utf-8 + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/${paidChargeCount}.0 (Macintosh; Intel Mac OS X 10.15; rv:106.0) Gecko/20100101 Firefox/106.0 + + + Accept + application/json, text/plain, */* + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + javascript + + + true + var resp = JSON.parse(prev.getResponseDataAsString()) + +vars.put("tipjarId", resp.id || 'no-tipjar-id'); + + + + javascript + + + true + var resp = JSON.parse(prev.getResponseDataAsString()) + +if (resp.name !== "Nakamoto") { + AssertionResult.setFailureMessage("Expected tipjar name to be 'Nakamoto', got " + resp.name); + AssertionResult.setFailure(true) +} + + + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /tipjar/${tipjarId} + GET + true + false + true + false + + + + + + + + + Accept-Language + en-US,en;q=0.${paidChargeCount} + + + Upgrade-Insecure-Requests + 1 + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/${paidChargeCount}.0 (Macintosh; Intel Mac OS X 10.15; rv:106.0) Gecko/20100101 Firefox/106.0 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + + + false + true + + + + true + ${userTipCount} + + + + 1 + + 1 + tipCounter + + true + true + + + + false + true + + + + true + + + + false + {"tipjar":"${tipjarId}","name":"Hal","sats":21,"message":"Let's go ...${tipCounter}!"} + = + + + + ${host} + ${port} + ${scheme} + utf-8 + /tipjar/api/v1/tips + POST + true + false + true + false + + + + + + + + + Accept-Language + en-US,en;q=0.${paidChargeCount} + + + Origin + ${scheme}://${host}:${port} + + + Content-Type + application/json;charset=utf-8 + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/${paidChargeCount}.0 (Macintosh; Intel Mac OS X 10.15; rv:106.0) Gecko/20100101 Firefox/106.0 + + + Accept + application/json, text/plain, */* + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + javascript + + + true + var resp = JSON.parse(prev.getResponseDataAsString()) + +if (!resp.redirect_url || !resp.redirect_url.startsWith("/satspay/")) { + AssertionResult.setFailureMessage("Expected redirect url to start with '/satspay/', but was: " + resp.redirect_url); + AssertionResult.setFailure(true) +} + + + + + javascript + + + true + var resp = JSON.parse(prev.getResponseDataAsString()) + +vars.put("tipChargeUrl", resp.redirect_url || 'no-tip-charge-url'); + +if (resp.redirect_url) { + var tipChargeId = resp.redirect_url.split("/")[2] + vars.put("tipChargeId", tipChargeId || 'no-tip-charge-id'); +} + + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + ${tipChargeUrl} + GET + true + false + true + false + + + + + + + + + Referer + ${scheme}://${host}:${port}/tipjar/2 + + + Accept-Language + en-US,en;q=0.${paidChargeCount} + + + Upgrade-Insecure-Requests + 1 + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/${paidChargeCount}.0 (Macintosh; Intel Mac OS X 10.15; rv:106.0) Gecko/20100101 Firefox/106.0 + + + Accept + text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /satspay/api/v1/charge/${tipChargeId} + GET + true + false + true + false + + + + + + + + + Referer + ${scheme}://${host}:${port}/satspay/${chargeId} + + + Accept-Language + en-US,en;q=0.5 + + + X-Api-Key + ${inkey} + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0 + + + Accept + application/json, text/plain, */* + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + javascript + + + true + var resp = JSON.parse(prev.getResponseDataAsString()) + +var tipCounter = +vars.get("tipCounter") +var name = "Hal" +var description = "Let's go ..." + tipCounter + "!" + +if (resp.description !== description) { + AssertionResult.setFailureMessage("Expected name to be 'Hal', but was: " + resp.name); + AssertionResult.setFailure(true) +} + +if (resp.description !== description) { + AssertionResult.setFailureMessage("Expected description to be 'Let's go!', but was: " + resp.description); + AssertionResult.setFailure(true) +} + + + + + javascript + + + true + var resp = JSON.parse(prev.getResponseDataAsString()) + +vars.put("tipPaymentRequest", resp.payment_request || 'no-tip-payment-request'); + + + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /tipjar/api/v1/tips + GET + true + false + true + false + + + + + + + + + Accept-Language + en-US,en;q=0.${paidChargeCount} + + + X-Api-Key + ${inkey} + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/${paidChargeCount}.0 (Macintosh; Intel Mac OS X 10.15; rv:106.0) Gecko/20100101 Firefox/106.0 + + + Accept + application/json, text/plain, */* + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + javascript + + + true + var resp = JSON.parse(prev.getResponseDataAsString()) + +var tipCounter = +vars.get("tipCounter") + +if (resp.length !== tipCounter) { + AssertionResult.setFailureMessage("Expected "+tipCounter+" tips, but got: " + resp.length); + AssertionResult.setFailure(true) +} else { + var tip = resp[tipCounter - 1] + var message = "Let's go ..." + tipCounter + "!" + if (!tip || tip.name !== "Hal" || tip.message !== message || tip.sats !== 21) { + AssertionResult.setFailureMessage("Expected tip to '" + message + "', but was: " + JSON.stringify(resp)); + AssertionResult.setFailure(true) + } +} + + + + + 1 + 0 + ${thinkTime} + + + + 1000 + 100 + + + + + true + + + + false + {"out":true,"bolt11":"${tipPaymentRequest}"} + = + + + + ${host} + ${port} + ${scheme} + utf-8 + /api/v1/payments + POST + true + false + true + false + + + + + + + + + Accept-Language + en-US,en;q=0.5 + + + X-Api-Key + ${adminWalletKey} + + + Origin + ${scheme}://${host}:${port} + + + Content-Type + application/json;charset=utf-8 + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0 + + + Accept + application/json, text/plain, */* + + + + + + + 201 + + + Assertion.response_code + false + 8 + + + + + + + + ${host} + ${port} + ${scheme} + UTF-8 + /api/v1/wallet + GET + true + false + true + false + + + + + + + + + Referer + ${scheme}://${host}:${port}/wallet?usr=${userId}&wal=${walletId} + + + Accept-Language + en-US,en;q=0.5 + + + X-Api-Key + ${inkey} + + + Accept-Encoding + gzip, deflate + + + User-Agent + Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0 + + + Accept + application/json, text/plain, */* + + + + + + + 200 + + + Assertion.response_code + false + 8 + + + + true + + + var resp = JSON.parse(prev.getResponseDataAsString()) + +var tipCounter = +vars.get('tipCounter') +var userBalance = +vars.get("userBalance") + +userBalance += 21 * 1000 + +// millisats +if (resp.balance !== userBalance) { + AssertionResult.setFailureMessage("Expected balance to be "+userBalance+", but got: "+ resp.balance); + AssertionResult.setFailure(true) +} + +vars.put("userBalance", userBalance) + javascript + + + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + + 100 + true + (wallet){1} + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + + + + + + 8081 + 0 + 25 + + + + 8888 + + windowsupdate\.microsoft\.com.* + (?i).*\.(bmp|css|js|gif|ico|jpe?g|png|swf|eot|otf|ttf|mp4|woff|woff2) + .*msg\.yahoo\.com.* + www\.download\.windowsupdate\.com.* + toolbarqueries\.google\..* + http?://self-repair\.mozilla\.org.* + tiles.*\.mozilla\.com.* + .*detectportal\.firefox\.com.* + us\.update\.toolbar\.yahoo\.com.* + .*\.google\.com.*/safebrowsing/.* + api\.bing\.com.* + toolbar\.google\.com.* + .*yimg\.com.* + toolbar\.msn\.com.* + (?i).*\.(bmp|css|js|gif|ico|jpe?g|png|swf|eot|otf|ttf|mp4|woff|woff2)[\?;].* + toolbar\.avg\.com/.* + www\.google-analytics\.com.* + pgq\.yahoo\.com.* + safebrowsing.*\.google\.com.* + sqm\.microsoft\.com.* + g\.msn.* + clients.*\.google.* + .*toolbar\.yahoo\.com.* + geo\.yahoo\.com.* + + + true + 4 + false + + false + true + true + false + true + + + false + + 0 + + true + UTF-8 + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + true + true + true + true + true + true + false + true + true + true + true + 0 + true + true + true + true + true + true + true + true + + + recording.xml + + + + + +