mirror of
https://github.com/coder/coder.git
synced 2026-09-22 05:05:20 +08:00
test: fix TestSSHServer_ClosesStdin to handle non-atomic write (#19174)
fixes https://github.com/coder/internal/issues/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.
This commit is contained in:
@@ -413,8 +413,9 @@ func TestSSHServer_ClosesStdin(t *testing.T) {
|
||||
|
||||
ctx := testutil.Context(t, testutil.WaitMedium)
|
||||
logger := testutil.Logger(t)
|
||||
s, err := agentssh.NewServer(ctx, logger, prometheus.NewRegistry(), afero.NewMemMapFs(), agentexec.DefaultExecer, nil)
|
||||
s, err := agentssh.NewServer(ctx, logger.Named("ssh-server"), prometheus.NewRegistry(), afero.NewMemMapFs(), agentexec.DefaultExecer, nil)
|
||||
require.NoError(t, err)
|
||||
logger = logger.Named("test")
|
||||
defer s.Close()
|
||||
err = s.UpdateHostSigner(42)
|
||||
assert.NoError(t, err)
|
||||
@@ -469,15 +470,25 @@ func TestSSHServer_ClosesStdin(t *testing.T) {
|
||||
err = testutil.RequireReceive(ctx, t, readCh)
|
||||
require.NoError(t, err)
|
||||
|
||||
sess.Close()
|
||||
err = sess.Close()
|
||||
require.NoError(t, err)
|
||||
|
||||
var content []byte
|
||||
expected := []byte("read exit code: 1\n")
|
||||
testutil.Eventually(ctx, t, func(_ context.Context) bool {
|
||||
content, err = os.ReadFile(filePath)
|
||||
return err == nil
|
||||
if err != nil {
|
||||
logger.Debug(ctx, "failed to read file; will retry", slog.Error(err))
|
||||
return false
|
||||
}
|
||||
if len(content) != len(expected) {
|
||||
logger.Debug(ctx, "file is partially written", slog.F("content", content))
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}, testutil.IntervalFast)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, "read exit code: 1\n", string(content))
|
||||
require.Equal(t, string(expected), string(content))
|
||||
}
|
||||
|
||||
func sshClient(t *testing.T, addr string) *ssh.Client {
|
||||
|
||||
Reference in New Issue
Block a user