progress.c tests: make start/stop commands on stdin

Change the usage of the "test-tool progress" introduced in
2bb74b53a4 (Test the progress display, 2019-09-16) to take command
like "start" and "stop" on stdin, instead of running them implicitly.

This makes for tests that are easier to read, since the recipe will
mirror the API usage, and allows for easily testing invalid usage that
would yield (or should yield) a BUG(), e.g. providing two "start"
calls in a row. A subsequent commit will add such tests.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Ævar Arnfjörð Bjarmason 2022-02-03 22:40:13 +01:00 committed by Junio C Hamano
parent 587c3d0da6
commit 791afae292
2 changed files with 70 additions and 32 deletions

View file

@ -3,6 +3,9 @@
* *
* Reads instructions from standard input, one instruction per line: * Reads instructions from standard input, one instruction per line:
* *
* "start <total>[ <title>]" - Call start_progress(title, total),
* Uses the default title of "Working hard"
* if the " <title>" is omitted.
* "progress <items>" - Call display_progress() with the given item count * "progress <items>" - Call display_progress() with the given item count
* as parameter. * as parameter.
* "throughput <bytes> <millis> - Call display_throughput() with the given * "throughput <bytes> <millis> - Call display_throughput() with the given
@ -10,6 +13,7 @@
* specify the time elapsed since the * specify the time elapsed since the
* start_progress() call. * start_progress() call.
* "update" - Set the 'progress_update' flag. * "update" - Set the 'progress_update' flag.
* "stop" - Call stop_progress().
* *
* See 't0500-progress-display.sh' for examples. * See 't0500-progress-display.sh' for examples.
*/ */
@ -19,34 +23,50 @@
#include "parse-options.h" #include "parse-options.h"
#include "progress.h" #include "progress.h"
#include "strbuf.h" #include "strbuf.h"
#include "string-list.h"
int cmd__progress(int argc, const char **argv) int cmd__progress(int argc, const char **argv)
{ {
int total = 0; const char *const default_title = "Working hard";
const char *title; struct string_list titles = STRING_LIST_INIT_DUP;
struct strbuf line = STRBUF_INIT; struct strbuf line = STRBUF_INIT;
struct progress *progress; struct progress *progress = NULL;
const char *usage[] = { const char *usage[] = {
"test-tool progress [--total=<n>] <progress-title>", "test-tool progress <stdin",
NULL NULL
}; };
struct option options[] = { struct option options[] = {
OPT_INTEGER(0, "total", &total, "total number of items"),
OPT_END(), OPT_END(),
}; };
argc = parse_options(argc, argv, NULL, options, usage, 0); argc = parse_options(argc, argv, NULL, options, usage, 0);
if (argc != 1) if (argc)
die("need a title for the progress output"); usage_with_options(usage, options);
title = argv[0];
progress_testing = 1; progress_testing = 1;
progress = start_progress(title, total);
while (strbuf_getline(&line, stdin) != EOF) { while (strbuf_getline(&line, stdin) != EOF) {
char *end; char *end;
if (skip_prefix(line.buf, "progress ", (const char **) &end)) { if (skip_prefix(line.buf, "start ", (const char **) &end)) {
uint64_t total = strtoull(end, &end, 10);
const char *title;
/*
* We can't use "end + 1" as an argument to
* start_progress(), it doesn't xstrdup() its
* "title" argument. We need to hold onto a
* valid "char *" for it until the end.
*/
if (!*end)
title = default_title;
else if (*end == ' ')
title = string_list_insert(&titles, end + 1)->string;
else
die("invalid input: '%s'\n", line.buf);
progress = start_progress(title, total);
} else if (skip_prefix(line.buf, "progress ", (const char **) &end)) {
uint64_t item_count = strtoull(end, &end, 10); uint64_t item_count = strtoull(end, &end, 10);
if (*end != '\0') if (*end != '\0')
die("invalid input: '%s'\n", line.buf); die("invalid input: '%s'\n", line.buf);
@ -65,12 +85,14 @@ int cmd__progress(int argc, const char **argv)
display_throughput(progress, byte_count); display_throughput(progress, byte_count);
} else if (!strcmp(line.buf, "update")) { } else if (!strcmp(line.buf, "update")) {
progress_test_force_update(); progress_test_force_update();
} else if (!strcmp(line.buf, "stop")) {
stop_progress(&progress);
} else { } else {
die("invalid input: '%s'\n", line.buf); die("invalid input: '%s'\n", line.buf);
} }
} }
stop_progress(&progress);
strbuf_release(&line); strbuf_release(&line);
string_list_clear(&titles, 0);
return 0; return 0;
} }

View file

@ -18,6 +18,7 @@ test_expect_success 'simple progress display' '
EOF EOF
cat >in <<-\EOF && cat >in <<-\EOF &&
start 0
update update
progress 1 progress 1
update update
@ -26,8 +27,9 @@ test_expect_success 'simple progress display' '
progress 4 progress 4
update update
progress 5 progress 5
stop
EOF EOF
test-tool progress "Working hard" <in 2>stderr && test-tool progress <in 2>stderr &&
show_cr <stderr >out && show_cr <stderr >out &&
test_cmp expect out test_cmp expect out
@ -42,11 +44,13 @@ test_expect_success 'progress display with total' '
EOF EOF
cat >in <<-\EOF && cat >in <<-\EOF &&
start 3
progress 1 progress 1
progress 2 progress 2
progress 3 progress 3
stop
EOF EOF
test-tool progress --total=3 "Working hard" <in 2>stderr && test-tool progress <in 2>stderr &&
show_cr <stderr >out && show_cr <stderr >out &&
test_cmp expect out test_cmp expect out
@ -63,14 +67,14 @@ Working hard.......2.........3.........4.........5.........6:
EOF EOF
cat >in <<-\EOF && cat >in <<-\EOF &&
start 100000 Working hard.......2.........3.........4.........5.........6
progress 100 progress 100
progress 1000 progress 1000
progress 10000 progress 10000
progress 100000 progress 100000
stop
EOF EOF
test-tool progress --total=100000 \ test-tool progress <in 2>stderr &&
"Working hard.......2.........3.........4.........5.........6" \
<in 2>stderr &&
show_cr <stderr >out && show_cr <stderr >out &&
test_cmp expect out test_cmp expect out
@ -89,16 +93,16 @@ Working hard.......2.........3.........4.........5.........6:
EOF EOF
cat >in <<-\EOF && cat >in <<-\EOF &&
start 100000 Working hard.......2.........3.........4.........5.........6
update update
progress 1 progress 1
update update
progress 2 progress 2
progress 10000 progress 10000
progress 100000 progress 100000
stop
EOF EOF
test-tool progress --total=100000 \ test-tool progress <in 2>stderr &&
"Working hard.......2.........3.........4.........5.........6" \
<in 2>stderr &&
show_cr <stderr >out && show_cr <stderr >out &&
test_cmp expect out test_cmp expect out
@ -117,14 +121,14 @@ Working hard.......2.........3.........4.........5.........6:
EOF EOF
cat >in <<-\EOF && cat >in <<-\EOF &&
start 100000 Working hard.......2.........3.........4.........5.........6
progress 25000 progress 25000
progress 50000 progress 50000
progress 75000 progress 75000
progress 100000 progress 100000
stop
EOF EOF
test-tool progress --total=100000 \ test-tool progress <in 2>stderr &&
"Working hard.......2.........3.........4.........5.........6" \
<in 2>stderr &&
show_cr <stderr >out && show_cr <stderr >out &&
test_cmp expect out test_cmp expect out
@ -141,14 +145,14 @@ Working hard.......2.........3.........4.........5.........6.........7.........:
EOF EOF
cat >in <<-\EOF && cat >in <<-\EOF &&
start 100000 Working hard.......2.........3.........4.........5.........6.........7.........
progress 25000 progress 25000
progress 50000 progress 50000
progress 75000 progress 75000
progress 100000 progress 100000
stop
EOF EOF
test-tool progress --total=100000 \ test-tool progress <in 2>stderr &&
"Working hard.......2.........3.........4.........5.........6.........7........." \
<in 2>stderr &&
show_cr <stderr >out && show_cr <stderr >out &&
test_cmp expect out test_cmp expect out
@ -165,12 +169,14 @@ test_expect_success 'progress shortens - crazy caller' '
EOF EOF
cat >in <<-\EOF && cat >in <<-\EOF &&
start 1000
progress 100 progress 100
progress 200 progress 200
progress 1 progress 1
progress 1000 progress 1000
stop
EOF EOF
test-tool progress --total=1000 "Working hard" <in 2>stderr && test-tool progress <in 2>stderr &&
show_cr <stderr >out && show_cr <stderr >out &&
test_cmp expect out test_cmp expect out
@ -186,6 +192,7 @@ test_expect_success 'progress display with throughput' '
EOF EOF
cat >in <<-\EOF && cat >in <<-\EOF &&
start 0
throughput 102400 1000 throughput 102400 1000
update update
progress 10 progress 10
@ -198,8 +205,9 @@ test_expect_success 'progress display with throughput' '
throughput 409600 4000 throughput 409600 4000
update update
progress 40 progress 40
stop
EOF EOF
test-tool progress "Working hard" <in 2>stderr && test-tool progress <in 2>stderr &&
show_cr <stderr >out && show_cr <stderr >out &&
test_cmp expect out test_cmp expect out
@ -215,6 +223,7 @@ test_expect_success 'progress display with throughput and total' '
EOF EOF
cat >in <<-\EOF && cat >in <<-\EOF &&
start 40
throughput 102400 1000 throughput 102400 1000
progress 10 progress 10
throughput 204800 2000 throughput 204800 2000
@ -223,8 +232,9 @@ test_expect_success 'progress display with throughput and total' '
progress 30 progress 30
throughput 409600 4000 throughput 409600 4000
progress 40 progress 40
stop
EOF EOF
test-tool progress --total=40 "Working hard" <in 2>stderr && test-tool progress <in 2>stderr &&
show_cr <stderr >out && show_cr <stderr >out &&
test_cmp expect out test_cmp expect out
@ -240,6 +250,7 @@ test_expect_success 'cover up after throughput shortens' '
EOF EOF
cat >in <<-\EOF && cat >in <<-\EOF &&
start 0
throughput 409600 1000 throughput 409600 1000
update update
progress 1 progress 1
@ -252,8 +263,9 @@ test_expect_success 'cover up after throughput shortens' '
throughput 1638400 4000 throughput 1638400 4000
update update
progress 4 progress 4
stop
EOF EOF
test-tool progress "Working hard" <in 2>stderr && test-tool progress <in 2>stderr &&
show_cr <stderr >out && show_cr <stderr >out &&
test_cmp expect out test_cmp expect out
@ -268,6 +280,7 @@ test_expect_success 'cover up after throughput shortens a lot' '
EOF EOF
cat >in <<-\EOF && cat >in <<-\EOF &&
start 0
throughput 1 1000 throughput 1 1000
update update
progress 1 progress 1
@ -277,8 +290,9 @@ test_expect_success 'cover up after throughput shortens a lot' '
throughput 3145728 3000 throughput 3145728 3000
update update
progress 3 progress 3
stop
EOF EOF
test-tool progress "Working hard" <in 2>stderr && test-tool progress <in 2>stderr &&
show_cr <stderr >out && show_cr <stderr >out &&
test_cmp expect out test_cmp expect out
@ -286,6 +300,7 @@ test_expect_success 'cover up after throughput shortens a lot' '
test_expect_success 'progress generates traces' ' test_expect_success 'progress generates traces' '
cat >in <<-\EOF && cat >in <<-\EOF &&
start 40
throughput 102400 1000 throughput 102400 1000
update update
progress 10 progress 10
@ -298,10 +313,11 @@ test_expect_success 'progress generates traces' '
throughput 409600 4000 throughput 409600 4000
update update
progress 40 progress 40
stop
EOF EOF
GIT_TRACE2_EVENT="$(pwd)/trace.event" test-tool progress --total=40 \ GIT_TRACE2_EVENT="$(pwd)/trace.event" test-tool progress \
"Working hard" <in 2>stderr && <in 2>stderr &&
# t0212/parse_events.perl intentionally omits regions and data. # t0212/parse_events.perl intentionally omits regions and data.
test_region progress "Working hard" trace.event && test_region progress "Working hard" trace.event &&