diff options
| author | Paul Buetow <paul@buetow.org> | 2026-04-10 22:41:02 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-04-10 22:41:02 +0300 |
| commit | e657c7b5cb5bb9675c7817b34a7333bdf259415c (patch) | |
| tree | d630c106ddca1e2500ebe47b2cf6a11f44c5bc24 /integrationtests/interactive_runtime_query_test.go | |
| parent | 28f6319b77d35c6da6b99ad7e35d0d5602dc2ee6 (diff) | |
task 80: add runtime-query integration coverage
Diffstat (limited to 'integrationtests/interactive_runtime_query_test.go')
| -rw-r--r-- | integrationtests/interactive_runtime_query_test.go | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/integrationtests/interactive_runtime_query_test.go b/integrationtests/interactive_runtime_query_test.go index b338065..6ca2cef 100644 --- a/integrationtests/interactive_runtime_query_test.go +++ b/integrationtests/interactive_runtime_query_test.go @@ -109,6 +109,89 @@ func TestDTailInteractiveReloadReusesSessionAndDropsLateOldMatches(t *testing.T) } } +func TestDTailInteractiveReloadReusesSessionOnImmediateBoundaryAndDropsLateOldMatches(t *testing.T) { + skipIfNotIntegrationTest(t) + + testLogger := NewTestLogger("TestDTailInteractiveReloadReusesSessionOnImmediateBoundaryAndDropsLateOldMatches") + defer testLogger.WriteLogFile() + cleanupTmpFiles(t) + + ctx, cancel := createTestContextWithTimeout(t) + ctx = WithTestLogger(ctx, testLogger) + defer cancel() + + followFile := "interactive_dtail_reload_immediate.tmp" + if err := os.WriteFile(followFile, []byte("ERROR initial\n"), 0600); err != nil { + t.Fatalf("unable to create follow file: %v", err) + } + cleanupFiles(t, followFile, "interactive_dtail_reload_immediate.stdout.tmp") + + port := getUniquePortNumber() + serverStdout, serverStderr, _, err := startCommand(ctx, t, "", "../dserver", + "--cfg", "none", + "--logger", "stdout", + "--logLevel", "debug", + "--bindAddress", "localhost", + "--port", fmt.Sprintf("%d", port), + ) + if err != nil { + t.Fatalf("start dserver: %v", err) + } + serverLogs := startProcessOutputCollector(ctx, serverStdout, serverStderr) + if err := waitForServerReady(ctx, "localhost", port); err != nil { + t.Fatalf("wait for dserver: %v", err) + } + serverLogs.reset() + + writerDone := make(chan error, 1) + go func() { + if err := waitForCollectorSubstring(ctx, serverLogs, "Start reading|"+followFile+"|"+followFile); err != nil { + writerDone <- err + return + } + writerDone <- appendLinesOnSchedule(ctx, followFile, []interactiveStep{ + {Delay: 1500 * time.Millisecond, Input: "ERROR late"}, + {Delay: 1700 * time.Millisecond, Input: "WARN live"}, + }) + }() + + clientOutput, err := runInteractivePTYCommand(ctx, []string{ + "../dtail", + "--cfg", "none", + "--logger", "stdout", + "--logLevel", "info", + "--servers", fmt.Sprintf("localhost:%d", port), + "--files", followFile, + "--grep", "ERROR", + "--plain", + "--trustAllHosts", + "--interactive-query", + }, []interactiveStep{ + {Delay: 1200 * time.Millisecond, Input: ":reload --grep WARN"}, + {Delay: 4 * time.Second, Input: ":quit"}, + }) + if err != nil { + t.Fatalf("run interactive dtail: %v\noutput:\n%s", err, clientOutput) + } + + if err := <-writerDone; err != nil { + t.Fatalf("write follow file: %v", err) + } + + if !strings.Contains(clientOutput, "WARN live") { + t.Fatalf("expected WARN line after reload in output:\n%s", clientOutput) + } + if strings.Contains(clientOutput, "ERROR late") { + t.Fatalf("unexpected stale ERROR line after reload:\n%s", clientOutput) + } + if !strings.Contains(clientOutput, "reload applied successfully") { + t.Fatalf("expected reload success message in output:\n%s", clientOutput) + } + if countSubstring(serverLogs.snapshot(), "Creating new server handler") != 1 { + t.Fatalf("expected one SSH session on the server, logs:\n%s", strings.Join(serverLogs.snapshot(), "\n")) + } +} + func TestDGrepInteractiveReloadReusesSessionAfterCompletedRead(t *testing.T) { skipIfNotIntegrationTest(t) |
