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)