diff --git a/pkg/service/remote_progress_test.go b/pkg/service/remote_progress_test.go index 4750832..97ea816 100644 --- a/pkg/service/remote_progress_test.go +++ b/pkg/service/remote_progress_test.go @@ -59,3 +59,55 @@ func TestParseRemoteProgressLogsFindsLatestMarker(t *testing.T) { t.Fatalf("unexpected update: %#v", update) } } + +func TestParseRemoteProgressLogsSkipsMalformedMarkers(t *testing.T) { + logs := strings.Join([]string{ + "plain log line", + progressLogPrefix + "{bad-json", + ProgressLogLine(RemoteProgressUpdate{Stage: "flash", ProgressPct: 90, Message: "writing"}), + }, "\n") + update, ok := parseRemoteProgressLogs(logs) + if !ok { + t.Fatal("expected valid marker after malformed marker") + } + if update.Stage != "flash" || update.ProgressPct != 90 || update.Message != "writing" { + t.Fatalf("unexpected update: %#v", update) + } +} + +func TestApplyRemoteProgressUpdatesOnlyRunningJobs(t *testing.T) { + app := newTestApp(t) + running := app.newJob("replace", "titan-13", "titan-22", "/dev/sda") + app.setJob(running.ID, func(j *Job) { + j.Status = JobRunning + j.Stage = "queued" + j.ProgressPct = 10 + }) + queued := app.newJob("build", "titan-14", "titan-22", "") + + app.applyRemoteProgress("", RemoteProgressUpdate{Stage: "ignored"}) + app.applyRemoteProgress("missing", RemoteProgressUpdate{Stage: "ignored"}) + app.applyRemoteProgress(queued.ID, RemoteProgressUpdate{Stage: "ignored", ProgressPct: 99}) + app.applyRemoteProgress( + running.ID, + RemoteProgressUpdate{ + Stage: "flash", + ProgressPct: 80, + Message: "writing image", + WrittenBytes: 1024, + TotalBytes: 2048, + }, + ) + app.applyRemoteProgress(running.ID, RemoteProgressUpdate{ProgressPct: 70}) + + got := app.job(running.ID) + if got.Stage != "flash" || got.ProgressPct != 80 || got.Message != "writing image" { + t.Fatalf("running job was not updated correctly: %+v", got) + } + if got.Written != 1024 || got.Total != 2048 || got.StageStartedAt.IsZero() { + t.Fatalf("remote byte/stage fields not applied: %+v", got) + } + if app.job(queued.ID).Stage == "ignored" { + t.Fatalf("queued job should not receive remote progress") + } +}