Skip to content

Commit

Permalink
Added additional fix to code formatting and English spelling.
Browse files Browse the repository at this point in the history
Signed-off-by: Vincenzo Palazzo <[email protected]>
  • Loading branch information
vincenzopalazzo authored and rustyrussell committed Sep 10, 2020
1 parent 4831ff3 commit db53235
Show file tree
Hide file tree
Showing 9 changed files with 58 additions and 100 deletions.
23 changes: 11 additions & 12 deletions doc/lightning-delpay.7

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

21 changes: 10 additions & 11 deletions doc/lightning-delpay.7.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,16 @@ lightning-delpay -- Command for removing a completed or failed payment
SYNOPSIS
--------

**delpay** *payment\_hash* \[status\]
**delpay** *payment\_hash* *status*

DESCRIPTION
-----------

The **delpay** RPC command removes a payment as given in **listsendpays** or **listpays** with a complete or failed
status. However, the command doesn't permit to remove a pending payment.
The **delpay** RPC command deletes a payment with the given `payment_hash` if its status is either `complete` or `failed`. Deleting a `pending` payment is an error.

- *payment\_hash*: Rapresents the unique identifier of a payment. To find it, you can run **listpays** or **listsendpays**;
- *status* is the expected status of the payment. It can be *complete* or *failed*.
Only delete if the payment status matches. If not specified, defaults to *complete*.
- *payment\_hash*: The unique identifier of a payment.
- *status*: Expected status of the payment.
Only deletes if the payment status matches.

EXAMPLE JSON REQUEST
------------
Expand All @@ -32,16 +31,16 @@ EXAMPLE JSON REQUEST
RETURN VALUE
------------

On success, the command will return a payment object, such as the **listsendpays**. In addition, if the payment is a MPP (Multi part payment) the command return a list of
payments; a payment object for each partid.
If successful the command returns a payment object, in the same format as **listsendpays**. If the payment is a multi-part payment (MPP) the command return a list of
payments will be return -- one payment object for each partid.

On failure, an error is returned and any payment is deleted. If the lightning process fails before responding, the
On failure, an error is returned. If the lightning process fails before responding, the
caller should use lightning-listsentpays(7) or lightning-listpays(7) to query whether this payment was deleted or not.

The following error codes may occur:

- -32602: Some parameter missed or some parameter is malformed;
- 211: Payment with payment\_hash have a wrong status. To check the correct status run the command **paystatus**;
- -32602: Parameter missed or malformed;
- 211: Payment status mismatch. Check the correct status via **paystatus**;
- 208: Payment with payment\_hash not found.

EXAMPLE JSON RESPONSE
Expand Down
31 changes: 16 additions & 15 deletions lightningd/pay.c
Original file line number Diff line number Diff line change
Expand Up @@ -64,9 +64,11 @@ static const char *payment_status_to_string(const enum wallet_payment_status sta
return "complete";
case PAYMENT_FAILED:
return "failed";
default:
case PAYMENT_PENDING:
return "pending";
}
//This should never happen
abort();
}


Expand Down Expand Up @@ -1528,35 +1530,34 @@ static struct command_result *json_delpay(struct command *cmd,

if (!param(cmd, buffer, params,
p_req("payment_hash", param_sha256, &payment_hash),
p_opt("status", param_string, &status_str),
p_req("status", param_string, &status_str),
NULL))
return command_param_failed();

if (!status_str)
status_str = "complete";

if (!string_to_payment_status(status_str, &status))
return command_fail(cmd, JSONRPC2_INVALID_PARAMS,
"Unrecognized status: %s", status_str);
return command_fail(cmd, JSONRPC2_INVALID_PARAMS, "Unrecognized status: %s", status_str);

if (status == PAYMENT_PENDING)
return command_fail(cmd, JSONRPC2_INVALID_PARAMS, "Invalid status: %s",
payment_status_to_string(status));
switch(status){
case PAYMENT_COMPLETE:
case PAYMENT_FAILED:
break;
case PAYMENT_PENDING:
return command_fail(cmd, JSONRPC2_INVALID_PARAMS, "Invalid status: %s",
payment_status_to_string(status));
}

payments = wallet_payment_list(cmd, cmd->ld->wallet, payment_hash);

if (tal_count(payments) == 0)
return command_fail(cmd, PAY_NO_SUCH_PAYMENT,
"Unknown payment with payment_hash: %s",
return command_fail(cmd, PAY_NO_SUCH_PAYMENT, "Unknown payment with payment_hash: %s",
type_to_string(tmpctx, struct sha256, payment_hash));

for (int i = 0; i < tal_count(payments); i++) {
if (payments[i]->status != status) {
return command_fail(cmd, PAY_STATUS_UNEXPECTED,
"Payment with hash %s has %s status but it should be %s",
return command_fail(cmd, PAY_STATUS_UNEXPECTED, "Payment with hash %s has %s status but it should be %s",
type_to_string(tmpctx, struct sha256, payment_hash),
payment_status_to_string(payments[i]->status),
payment_status_to_string(status));
payment_status_to_string(status));
}
}

Expand Down
72 changes: 16 additions & 56 deletions tests/test_pay.py
Original file line number Diff line number Diff line change
Expand Up @@ -3265,46 +3265,38 @@ def test_mpp_presplit_routehint_conflict(node_factory, bitcoind):

def test_delpay_argument_invalid(node_factory, bitcoind):
"""
This test includes all possible combination of input error inside the
This test includes all possible combinations of input error inside the
delpay command.
"""

l1, l2 = node_factory.get_nodes(2)
# Create the line graph l2 -> l1 with a channel of 10 ** 5 sat!
l2, l1 = node_factory.line_graph(2, fundamount=10**5, wait_for_announce=True)

with pytest.raises(RpcError):
l2.rpc.delpay()

# invoice unpayed
# sanity check
inv = l1.rpc.invoice(10 ** 5, 'inv', 'inv')
payment_hash = inv["payment_hash"]
payment_hash = "AA" * 32
with pytest.raises(RpcError):
l2.rpc.delpay(payment_hash)
l2.rpc.delpay(payment_hash, 'complete')

l2.rpc.pay(inv['bolt11'])

# payment unpayed with wrong status (pending status is a illegal input)
wait_for(lambda: l2.rpc.listpays(inv['bolt11'])['pays'][0]['status'] == 'complete')

payment_hash = inv['payment_hash']

# payment paid with wrong status (pending status is a illegal input)
with pytest.raises(RpcError):
l2.rpc.delpay(payment_hash, 'pending')

with pytest.raises(RpcError):
l2.rpc.delpay(payment_hash, 'invalid_status')

l2.rpc.connect(l1.info['id'], 'localhost', l1.port)
l2.fund_channel(l1, 10 ** 6)

bitcoind.generate_block(6)
sync_blockheight(bitcoind, [l1, l2])

wait_for(lambda: len(l2.rpc.listchannels()['channels']) == 2)

l2.rpc.pay(inv['bolt11'])

with pytest.raises(RpcError):
l2.rpc.delpay(payment_hash, 'failed')

with pytest.raises(RpcError):
l2.rpc.delpay(payment_hash, 'pending')

assert len(l2.rpc.listpays()['pays']) == 1

# test if the node is still ready
payments = l2.rpc.delpay(payment_hash, 'complete')

Expand All @@ -3313,47 +3305,15 @@ def test_delpay_argument_invalid(node_factory, bitcoind):
assert len(l2.rpc.listpays()['pays']) == 0


def test_delpay(node_factory, bitcoind):
"""
This unit test try to catch some error inside the command
delpay when it receives the correct input from the user
"""

l1, l2 = node_factory.get_nodes(2)

amount_sat = 10 ** 6

# create l2->l1 channel.
l2.fundwallet(amount_sat * 5)
l1.rpc.connect(l2.info['id'], 'localhost', l2.port)
l2.rpc.fundchannel(l1.info['id'], amount_sat * 3)

# Let the channel confirm.
bitcoind.generate_block(6)
sync_blockheight(bitcoind, [l1, l2])

invl1 = l1.rpc.invoice(Millisatoshi(amount_sat * 2 * 1000), "j", "j")
l2.rpc.pay(invl1["bolt11"])

before_del_pay = l2.rpc.listpays()

l2.rpc.delpay(invl1["payment_hash"])

after_del_pay = l2.rpc.listpays()["pays"]
assert len(after_del_pay) == (len(before_del_pay) - 1)


def test_delpay_payment_split(node_factory, bitcoind):
"""
This test test the correct bheaivord of the commmand delpay with a mpp
Test behavior of delpay with an MPP
"""
MPP_TARGET_SIZE = 10**7 # Taken from libpluin-pay.c
amt = 5 * MPP_TARGET_SIZE

l1, l2, l3 = node_factory.line_graph(
3, fundamount=10**8, wait_for_announce=True,
opts={'wumbo': None}
)
l1, l2, l3 = node_factory.line_graph(3, fundamount=10**5,
wait_for_announce=True)

inv = l3.rpc.invoice(amt, 'lbl', 'desc')
l1.rpc.pay(inv['bolt11'])
Expand Down
2 changes: 1 addition & 1 deletion wallet/db_postgres_sqlgen.c

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion wallet/db_sqlite3_sqlgen.c

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion wallet/statements_gettextgen.po

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion wallet/wallet.c
Original file line number Diff line number Diff line change
Expand Up @@ -2448,7 +2448,7 @@ void wallet_payment_store(struct wallet *wallet,
if (payment->bolt11 != NULL)
db_bind_text(stmt, 10, payment->bolt11);
else
db_bind_null(stmt, 10);
db_bind_null(stmt, 10);

db_bind_amount_msat(stmt, 11, &payment->total_msat);
db_bind_u64(stmt, 12, payment->partid);
Expand Down
3 changes: 1 addition & 2 deletions wallet/wallet.h
Original file line number Diff line number Diff line change
Expand Up @@ -973,8 +973,7 @@ void wallet_payment_delete(struct wallet *wallet,
* Removes the payment from the database by hash; if it is a MPP payment
* it remove all parts with a single query.
*/
void wallet_payment_delete_by_hash(struct wallet *wallet,
const struct sha256 *payment_hash);
void wallet_payment_delete_by_hash(struct wallet *wallet, const struct sha256 *payment_hash);

/**
* wallet_local_htlc_out_delete - Remove a local outgoing failed HTLC
Expand Down

0 comments on commit db53235

Please sign in to comment.