diff --git a/internal/ui/progress/updater.go b/internal/ui/progress/updater.go index 7fb6c8836..0f34b2d81 100644 --- a/internal/ui/progress/updater.go +++ b/internal/ui/progress/updater.go @@ -57,17 +57,13 @@ func (c *Updater) Done() { func (c *Updater) run() { defer close(c.stopped) - defer func() { - // Must be a func so that time.Since isn't called at defer time. - c.report(time.Since(c.start), true) - }() var tick <-chan time.Time if c.tick != nil { tick = c.tick.C } signalsCh := signals.GetProgressChannel() - for { + for final := false; !final; { var now time.Time select { @@ -76,9 +72,9 @@ func (c *Updater) run() { debug.Log("Signal received: %v\n", sig) now = time.Now() case <-c.stop: - return + final, now = true, time.Now() } - c.report(now.Sub(c.start), false) + c.report(now.Sub(c.start), final) } } diff --git a/internal/ui/progress/updater_test.go b/internal/ui/progress/updater_test.go index 45db019ba..3f7543697 100644 --- a/internal/ui/progress/updater_test.go +++ b/internal/ui/progress/updater_test.go @@ -9,13 +9,17 @@ import ( ) func TestUpdater(t *testing.T) { - finalSeen := false - var ncalls int + var ( + finalSeen = false + ncalls = 0 + dur time.Duration + ) report := func(d time.Duration, final bool) { if final { finalSeen = true } + dur = d ncalls++ } c := progress.NewUpdater(10*time.Millisecond, report) @@ -24,6 +28,7 @@ func TestUpdater(t *testing.T) { test.Assert(t, finalSeen, "final call did not happen") test.Assert(t, ncalls > 0, "no progress was reported") + test.Assert(t, dur > 0, "duration must be positive") } func TestUpdaterStopTwice(_ *testing.T) {