Test the progress display
'progress.c' has seen a few fixes recently [1], and, unfortunately, some of those fixes required further fixes [2]. It seems it's time to have a few tests focusing on the subtleties of the progress display. Add the 'test-tool progress' subcommand to help testing the progress display, reading instructions from standard input and turning them into calls to the display_progress() and display_throughput() functions with the given parameters. The progress display is, however, critically dependent on timing, because it's only updated once every second or, if the toal is known in advance, every 1%, and there is the throughput rate as well. These make the progress display far too undeterministic for testing as-is. To address this, add a few testing-specific variables and functions to 'progress.c', allowing the the new test helper to: - Disable the triggered-every-second SIGALRM and set the 'progress_update' flag explicitly based in the input instructions. This way the progress line will be updated deterministically when the test wants it to be updated. - Specify the time elapsed since start_progress() to make the throughput rate calculations deterministic. Add the new test script 't0500-progress-display.sh' to check a few simple cases with and without throughput, and that a shorter progress line properly covers up the previously displayed line in different situations. [1] See commits545dc345eb
(progress: break too long progress bar lines, 2019-04-12) and9f1fd84e15
(progress: clear previous progress update dynamically, 2019-04-12). [2]1aed1a5f25
(progress: avoid empty line when breaking the progress line, 2019-05-19) Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:

committed by
Junio C Hamano

parent
bbf47568ad
commit
2bb74b53a4
32
progress.c
32
progress.c
@ -45,6 +45,19 @@ struct progress {
|
||||
|
||||
static volatile sig_atomic_t progress_update;
|
||||
|
||||
/*
|
||||
* These are only intended for testing the progress output, i.e. exclusively
|
||||
* for 'test-tool progress'.
|
||||
*/
|
||||
int progress_testing;
|
||||
uint64_t progress_test_ns = 0;
|
||||
void progress_test_force_update(void); /* To silence -Wmissing-prototypes */
|
||||
void progress_test_force_update(void)
|
||||
{
|
||||
progress_update = 1;
|
||||
}
|
||||
|
||||
|
||||
static void progress_interval(int signum)
|
||||
{
|
||||
progress_update = 1;
|
||||
@ -55,6 +68,9 @@ static void set_progress_signal(void)
|
||||
struct sigaction sa;
|
||||
struct itimerval v;
|
||||
|
||||
if (progress_testing)
|
||||
return;
|
||||
|
||||
progress_update = 0;
|
||||
|
||||
memset(&sa, 0, sizeof(sa));
|
||||
@ -72,6 +88,10 @@ static void set_progress_signal(void)
|
||||
static void clear_progress_signal(void)
|
||||
{
|
||||
struct itimerval v = {{0,},};
|
||||
|
||||
if (progress_testing)
|
||||
return;
|
||||
|
||||
setitimer(ITIMER_REAL, &v, NULL);
|
||||
signal(SIGALRM, SIG_IGN);
|
||||
progress_update = 0;
|
||||
@ -154,6 +174,14 @@ static void throughput_string(struct strbuf *buf, uint64_t total,
|
||||
strbuf_humanise_rate(buf, rate * 1024);
|
||||
}
|
||||
|
||||
static uint64_t progress_getnanotime(struct progress *progress)
|
||||
{
|
||||
if (progress_testing)
|
||||
return progress->start_ns + progress_test_ns;
|
||||
else
|
||||
return getnanotime();
|
||||
}
|
||||
|
||||
void display_throughput(struct progress *progress, uint64_t total)
|
||||
{
|
||||
struct throughput *tp;
|
||||
@ -164,7 +192,7 @@ void display_throughput(struct progress *progress, uint64_t total)
|
||||
return;
|
||||
tp = progress->throughput;
|
||||
|
||||
now_ns = getnanotime();
|
||||
now_ns = progress_getnanotime(progress);
|
||||
|
||||
if (!tp) {
|
||||
progress->throughput = tp = xcalloc(1, sizeof(*tp));
|
||||
@ -296,7 +324,7 @@ void stop_progress_msg(struct progress **p_progress, const char *msg)
|
||||
struct throughput *tp = progress->throughput;
|
||||
|
||||
if (tp) {
|
||||
uint64_t now_ns = getnanotime();
|
||||
uint64_t now_ns = progress_getnanotime(progress);
|
||||
unsigned int misecs, rate;
|
||||
misecs = ((now_ns - progress->start_ns) * 4398) >> 32;
|
||||
rate = tp->curr_total / (misecs ? misecs : 1);
|
||||
|
Reference in New Issue
Block a user