mirror of
https://github.com/ElementsProject/lightning.git
synced 2025-01-18 05:12:45 +01:00
test_protocol: add --verbose flag.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
parent
3e34d50339
commit
25d9962e81
@ -3,6 +3,7 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <ccan/array_size/array_size.h>
|
#include <ccan/array_size/array_size.h>
|
||||||
#include <ccan/err/err.h>
|
#include <ccan/err/err.h>
|
||||||
|
#include <ccan/opt/opt.h>
|
||||||
#include <ccan/read_write_all/read_write_all.h>
|
#include <ccan/read_write_all/read_write_all.h>
|
||||||
#include <ccan/short_types/short_types.h>
|
#include <ccan/short_types/short_types.h>
|
||||||
#include <ccan/str/str.h>
|
#include <ccan/str/str.h>
|
||||||
@ -28,6 +29,8 @@
|
|||||||
|
|
||||||
#define TEXT_STYLE "style=\"font-size:4;\""
|
#define TEXT_STYLE "style=\"font-size:4;\""
|
||||||
|
|
||||||
|
static bool verbose = false;
|
||||||
|
|
||||||
struct commit_tx {
|
struct commit_tx {
|
||||||
/* inhtlcs = htlcs they offered, outhtlcs = htlcs we offered */
|
/* inhtlcs = htlcs they offered, outhtlcs = htlcs we offered */
|
||||||
u32 inhtlcs, outhtlcs;
|
u32 inhtlcs, outhtlcs;
|
||||||
@ -200,6 +203,8 @@ static struct commit_tx make_commit_tx(struct htlc **htlcs, int local_or_remote)
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct peer {
|
struct peer {
|
||||||
|
const char *name;
|
||||||
|
|
||||||
int infd, outfd, cmdfd, cmddonefd;
|
int infd, outfd, cmdfd, cmddonefd;
|
||||||
|
|
||||||
/* For drawing svg */
|
/* For drawing svg */
|
||||||
@ -230,7 +235,7 @@ static struct htlc *new_htlc(struct peer *peer, unsigned int htlc_id, int side)
|
|||||||
|
|
||||||
/* Fee changes don't have to be unique. */
|
/* Fee changes don't have to be unique. */
|
||||||
if (htlc_id && find_htlc(peer, htlc_id, side))
|
if (htlc_id && find_htlc(peer, htlc_id, side))
|
||||||
errx(1, "%s duplicate new htlc %u",
|
errx(1, "%s: %s duplicate new htlc %u", peer->name,
|
||||||
side == OURS ? "Our" : "Their", htlc_id);
|
side == OURS ? "Our" : "Their", htlc_id);
|
||||||
tal_resize(&peer->htlcs, n+1);
|
tal_resize(&peer->htlcs, n+1);
|
||||||
peer->htlcs[n] = tal(peer, struct htlc);
|
peer->htlcs[n] = tal(peer, struct htlc);
|
||||||
@ -246,14 +251,21 @@ static void htlc_changestate(struct peer *peer,
|
|||||||
enum htlc_state new)
|
enum htlc_state new)
|
||||||
{
|
{
|
||||||
if (htlc->state != old)
|
if (htlc->state != old)
|
||||||
errx(1, "htlc was in state %s not %s",
|
errx(1, "%s: htlc was in state %s not %s", peer->name,
|
||||||
htlc_statename(htlc->state), htlc_statename(old));
|
htlc_statename(htlc->state), htlc_statename(old));
|
||||||
if (htlc->id)
|
if (htlc->id) {
|
||||||
|
if (verbose)
|
||||||
|
printf("%s: HTLC %u -> %s\n",
|
||||||
|
peer->name, htlc->id, htlc_statename(new));
|
||||||
tal_append_fmt(&peer->info, "%u:%s\n",
|
tal_append_fmt(&peer->info, "%u:%s\n",
|
||||||
htlc->id, htlc_statename(new));
|
htlc->id, htlc_statename(new));
|
||||||
else
|
} else {
|
||||||
|
if (verbose)
|
||||||
|
printf("%s: FEE -> %s\n",
|
||||||
|
peer->name, htlc_statename(new));
|
||||||
tal_append_fmt(&peer->info, "FEE:%s\n",
|
tal_append_fmt(&peer->info, "FEE:%s\n",
|
||||||
htlc_statename(new));
|
htlc_statename(new));
|
||||||
|
}
|
||||||
htlc->state = new;
|
htlc->state = new;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -407,7 +419,8 @@ static void read_peer(struct peer *peer, const char *str, const char *cmd)
|
|||||||
read_in(peer->infd, p, strlen(str));
|
read_in(peer->infd, p, strlen(str));
|
||||||
p[strlen(str)] = '\0';
|
p[strlen(str)] = '\0';
|
||||||
if (!streq(p, str))
|
if (!streq(p, str))
|
||||||
errx(1, "%s: Expected %s from peer, got %s", cmd, str, p);
|
errx(1, "%s: %s: Expected %s from peer, got %s",
|
||||||
|
peer->name, cmd, str, p);
|
||||||
tal_free(p);
|
tal_free(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -675,8 +688,10 @@ static void do_cmd(struct peer *peer)
|
|||||||
struct commit_info *ci;
|
struct commit_info *ci;
|
||||||
|
|
||||||
i = read(peer->cmdfd, cmd, sizeof(cmd)-1);
|
i = read(peer->cmdfd, cmd, sizeof(cmd)-1);
|
||||||
|
if (i <= 0)
|
||||||
|
err(1, "%s: reading command", peer->name);
|
||||||
if (cmd[i-1] != '\0')
|
if (cmd[i-1] != '\0')
|
||||||
errx(1, "Unterminated command");
|
errx(1, "%s: Unterminated command", peer->name);
|
||||||
|
|
||||||
if (i == 1) {
|
if (i == 1) {
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
@ -727,7 +742,7 @@ static void do_cmd(struct peer *peer)
|
|||||||
} else if (streq(cmd, "dumpall")) {
|
} else if (streq(cmd, "dumpall")) {
|
||||||
dump_peer(peer, true);
|
dump_peer(peer, true);
|
||||||
} else
|
} else
|
||||||
errx(1, "Unknown command %s", cmd);
|
errx(1, "%s: Unknown command %s", peer->name, cmd);
|
||||||
|
|
||||||
write(peer->cmddonefd, peer->info, strlen(peer->info)+1);
|
write(peer->cmddonefd, peer->info, strlen(peer->info)+1);
|
||||||
|
|
||||||
@ -737,10 +752,11 @@ static void do_cmd(struct peer *peer)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
errx(1, "No signed, unrevoked commit!");
|
errx(1, "%s: No signed, unrevoked commit!", peer->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void new_peer(int infdpair[2], int outfdpair[2], int cmdfdpair[2],
|
static void new_peer(const char *name,
|
||||||
|
int infdpair[2], int outfdpair[2], int cmdfdpair[2],
|
||||||
int cmddonefdpair[2])
|
int cmddonefdpair[2])
|
||||||
{
|
{
|
||||||
struct peer *peer;
|
struct peer *peer;
|
||||||
@ -760,6 +776,7 @@ static void new_peer(int infdpair[2], int outfdpair[2], int cmdfdpair[2],
|
|||||||
close(cmddonefdpair[0]);
|
close(cmddonefdpair[0]);
|
||||||
|
|
||||||
peer = tal(NULL, struct peer);
|
peer = tal(NULL, struct peer);
|
||||||
|
peer->name = name;
|
||||||
peer->htlcs = tal_arr(peer, struct htlc *, 0);
|
peer->htlcs = tal_arr(peer, struct htlc *, 0);
|
||||||
|
|
||||||
/* Create first, signed commit info. */
|
/* Create first, signed commit info. */
|
||||||
@ -868,7 +885,7 @@ static bool process_output(char **svg, bool is_a, const char *output,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool get_output(int donefd, char **svg, bool is_a,
|
static void get_output(int donefd, char **svg, bool is_a,
|
||||||
struct sent **a_sent, struct sent **b_sent,
|
struct sent **a_sent, struct sent **b_sent,
|
||||||
int *y, size_t *max_chars)
|
int *y, size_t *max_chars)
|
||||||
{
|
{
|
||||||
@ -879,38 +896,50 @@ static bool get_output(int donefd, char **svg, bool is_a,
|
|||||||
/* FIXME: Assumes large pipebuf, atomic read */
|
/* FIXME: Assumes large pipebuf, atomic read */
|
||||||
r = read(donefd, output, sizeof(output)-1);
|
r = read(donefd, output, sizeof(output)-1);
|
||||||
if (r <= 0)
|
if (r <= 0)
|
||||||
return false;
|
err(1, "Reading from %s", is_a ? "A" : "B");
|
||||||
output[r] = '\0';
|
output[r] = '\0';
|
||||||
alarm(0);
|
alarm(0);
|
||||||
|
|
||||||
if (*svg)
|
if (*svg)
|
||||||
process_output(svg, is_a, output, a_sent, b_sent, y, max_chars);
|
process_output(svg, is_a, output, a_sent, b_sent, y, max_chars);
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
char cmd[80], *svg = NULL;
|
char cmd[80], *svg;
|
||||||
int a_to_b[2], b_to_a[2], acmd[2], bcmd[2], adonefd[2], bdonefd[2];
|
int a_to_b[2], b_to_a[2], acmd[2], bcmd[2], adonefd[2], bdonefd[2];
|
||||||
int y = STEP_HEIGHT + LINE_HEIGHT;
|
int y = STEP_HEIGHT + LINE_HEIGHT;
|
||||||
struct sent *a_sent = tal_arr(NULL, struct sent, 0),
|
struct sent *a_sent = tal_arr(NULL, struct sent, 0),
|
||||||
*b_sent = tal_arr(NULL, struct sent, 0);
|
*b_sent = tal_arr(NULL, struct sent, 0);
|
||||||
size_t max_chars = 0;
|
size_t max_chars = 0;
|
||||||
|
bool do_svg = false;
|
||||||
|
|
||||||
err_set_progname(argv[0]);
|
err_set_progname(argv[0]);
|
||||||
|
opt_register_noarg("--help|-h", opt_usage_and_exit,
|
||||||
if (argv[1] && streq(argv[1], "--svg"))
|
"\n"
|
||||||
|
"Lightning protocol tester.",
|
||||||
|
"Print this message.");
|
||||||
|
opt_register_noarg("--svg", opt_set_bool, &do_svg, "Output SVG diagram");
|
||||||
|
opt_register_noarg("--verbose", opt_set_bool, &verbose,
|
||||||
|
"Extra output");
|
||||||
|
opt_parse(&argc, argv, opt_log_stderr_exit);
|
||||||
|
if (argc != 1)
|
||||||
|
errx(1, "no arguments accepted");
|
||||||
|
|
||||||
|
if (do_svg)
|
||||||
svg = tal_strdup(NULL, "");
|
svg = tal_strdup(NULL, "");
|
||||||
|
else
|
||||||
|
svg = NULL;
|
||||||
|
|
||||||
if (pipe(a_to_b) || pipe(b_to_a) || pipe(adonefd) || pipe(acmd))
|
if (pipe(a_to_b) || pipe(b_to_a) || pipe(adonefd) || pipe(acmd))
|
||||||
err(1, "Creating pipes");
|
err(1, "Creating pipes");
|
||||||
|
|
||||||
new_peer(a_to_b, b_to_a, acmd, adonefd);
|
new_peer("A", a_to_b, b_to_a, acmd, adonefd);
|
||||||
|
|
||||||
if (pipe(bdonefd) || pipe(bcmd))
|
if (pipe(bdonefd) || pipe(bcmd))
|
||||||
err(1, "Creating pipes");
|
err(1, "Creating pipes");
|
||||||
|
|
||||||
new_peer(b_to_a, a_to_b, bcmd, bdonefd);
|
new_peer("B", b_to_a, a_to_b, bcmd, bdonefd);
|
||||||
|
|
||||||
close(acmd[0]);
|
close(acmd[0]);
|
||||||
close(bcmd[0]);
|
close(bcmd[0]);
|
||||||
@ -927,7 +956,10 @@ int main(int argc, char *argv[])
|
|||||||
if (!strends(cmd, "\n"))
|
if (!strends(cmd, "\n"))
|
||||||
errx(1, "Truncated command");
|
errx(1, "Truncated command");
|
||||||
cmd[strlen(cmd)-1] = '\0';
|
cmd[strlen(cmd)-1] = '\0';
|
||||||
|
|
||||||
|
if (verbose)
|
||||||
|
printf("%s\n", cmd);
|
||||||
|
|
||||||
if (strstarts(cmd, "A:")) {
|
if (strstarts(cmd, "A:")) {
|
||||||
cmdfd = acmd[1];
|
cmdfd = acmd[1];
|
||||||
donefd = adonefd[0];
|
donefd = adonefd[0];
|
||||||
|
Loading…
Reference in New Issue
Block a user