Skip to content

Commit 7eb4119

Browse files
authored
test: fix TestSSHServer_ClosesStdin to handle non-atomic write (#19174)
fixes coder/internal#863 We read an output file in a loop, but this could lead to races where the other process has created the file but not written, or a partial write in progress. Fix is to retry if the content is shorter than we expect.
1 parent b0ba798 commit 7eb4119

File tree

1 file changed

+15
-4
lines changed

1 file changed

+15
-4
lines changed

agent/agentssh/agentssh_test.go

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -413,8 +413,9 @@ func TestSSHServer_ClosesStdin(t *testing.T) {
413413

414414
ctx := testutil.Context(t, testutil.WaitMedium)
415415
logger := testutil.Logger(t)
416-
s, err := agentssh.NewServer(ctx, logger, prometheus.NewRegistry(), afero.NewMemMapFs(), agentexec.DefaultExecer, nil)
416+
s, err := agentssh.NewServer(ctx, logger.Named("ssh-server"), prometheus.NewRegistry(), afero.NewMemMapFs(), agentexec.DefaultExecer, nil)
417417
require.NoError(t, err)
418+
logger = logger.Named("test")
418419
defer s.Close()
419420
err = s.UpdateHostSigner(42)
420421
assert.NoError(t, err)
@@ -469,15 +470,25 @@ func TestSSHServer_ClosesStdin(t *testing.T) {
469470
err = testutil.RequireReceive(ctx, t, readCh)
470471
require.NoError(t, err)
471472

472-
sess.Close()
473+
err = sess.Close()
474+
require.NoError(t, err)
473475

474476
var content []byte
477+
expected := []byte("read exit code: 1\n")
475478
testutil.Eventually(ctx, t, func(_ context.Context) bool {
476479
content, err = os.ReadFile(filePath)
477-
return err == nil
480+
if err != nil {
481+
logger.Debug(ctx, "failed to read file; will retry", slog.Error(err))
482+
return false
483+
}
484+
if len(content) != len(expected) {
485+
logger.Debug(ctx, "file is partially written", slog.F("content", content))
486+
return false
487+
}
488+
return true
478489
}, testutil.IntervalFast)
479490
require.NoError(t, err)
480-
require.Equal(t, "read exit code: 1\n", string(content))
491+
require.Equal(t, string(expected), string(content))
481492
}
482493

483494
func sshClient(t *testing.T, addr string) *ssh.Client {

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy