MCPcopy Create free account
hub / github.com/coder/coder / TestSSHServer_ClosesStdin

Function TestSSHServer_ClosesStdin

agent/agentssh/agentssh_test.go:407–491  ·  view source on GitHub ↗
(t *testing.T)

Source from the content-addressed store, hash-verified

405}
406
407func TestSSHServer_ClosesStdin(t *testing.T) {
408 t.Parallel()
409 if runtime.GOOS == "windows" {
410 t.Skip("bash doesn't exist on Windows")
411 }
412
413 ctx := testutil.Context(t, testutil.WaitMedium)
414 logger := testutil.Logger(t)
415 s, err := agentssh.NewServer(ctx, logger.Named("ssh-server"), prometheus.NewRegistry(), afero.NewMemMapFs(), agentexec.DefaultExecer, nil)
416 require.NoError(t, err)
417 logger = logger.Named("test")
418 defer s.Close()
419 err = s.UpdateHostSigner(42)
420 assert.NoError(t, err)
421
422 ln, err := net.Listen("tcp", "127.0.0.1:0")
423 require.NoError(t, err)
424
425 done := make(chan struct{})
426 go func() {
427 defer close(done)
428 err := s.Serve(ln)
429 assert.Error(t, err) // Server is closed.
430 }()
431 defer func() {
432 err := s.Close()
433 require.NoError(t, err)
434 <-done
435 }()
436
437 c := sshClient(t, ln.Addr().String())
438
439 sess, err := c.NewSession()
440 require.NoError(t, err)
441 stdout, err := sess.StdoutPipe()
442 require.NoError(t, err)
443 stdin, err := sess.StdinPipe()
444 require.NoError(t, err)
445 defer stdin.Close()
446
447 dir := t.TempDir()
448 err = os.MkdirAll(dir, 0o755)
449 require.NoError(t, err)
450 filePath := filepath.Join(dir, "result.txt")
451
452 // the shell command `read` will block until data is written to stdin, or closed. It will return
453 // exit code 1 if it hits EOF, which is what we want to test.
454 cmdErrCh := make(chan error, 1)
455 go func() {
456 cmdErrCh <- sess.Start(fmt.Sprintf(`echo started; echo "read exit code: $(read && echo 0 || echo 1)" > %s`, filePath))
457 }()
458
459 cmdErr := testutil.RequireReceive(ctx, t, cmdErrCh)
460 require.NoError(t, cmdErr)
461
462 readCh := make(chan error, 1)
463 go func() {
464 buf := make([]byte, 8)

Callers

nothing calls this directly

Calls 15

CloseMethod · 0.95
UpdateHostSignerMethod · 0.95
ServeMethod · 0.95
ContextFunction · 0.92
LoggerFunction · 0.92
NewServerFunction · 0.92
RequireReceiveFunction · 0.92
EventuallyFunction · 0.92
sshClientFunction · 0.85
SkipMethod · 0.80
NamedMethod · 0.80
NewSessionMethod · 0.80

Tested by

no test coverage detected