basic_test.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. // Copyright (c) Tailscale Inc & AUTHORS
  2. // SPDX-License-Identifier: BSD-3-Clause
  3. package safesocket
  4. import (
  5. "context"
  6. "fmt"
  7. "path/filepath"
  8. "runtime"
  9. "testing"
  10. )
  11. // downgradeSDDL is a no-op test helper on non-Windows systems.
  12. var downgradeSDDL = func() func() { return func() {} }
  13. func TestBasics(t *testing.T) {
  14. // Make the socket in a temp dir rather than the cwd
  15. // so that the test can be run from a mounted filesystem (#2367).
  16. dir := t.TempDir()
  17. var sock string
  18. if runtime.GOOS != "windows" {
  19. sock = filepath.Join(dir, "test")
  20. } else {
  21. sock = fmt.Sprintf(`\\.\pipe\tailscale-test`)
  22. t.Cleanup(downgradeSDDL())
  23. }
  24. ln, err := Listen(sock)
  25. if err != nil {
  26. t.Fatal(err)
  27. }
  28. errs := make(chan error, 2)
  29. go func() {
  30. s, err := ln.Accept()
  31. if err != nil {
  32. errs <- err
  33. return
  34. }
  35. ln.Close()
  36. s.Write([]byte("hello"))
  37. b := make([]byte, 1024)
  38. n, err := s.Read(b)
  39. if err != nil {
  40. errs <- err
  41. return
  42. }
  43. t.Logf("server read %d bytes.", n)
  44. if string(b[:n]) != "world" {
  45. errs <- fmt.Errorf("got %#v, expected %#v\n", string(b[:n]), "world")
  46. return
  47. }
  48. s.Close()
  49. errs <- nil
  50. }()
  51. go func() {
  52. c, err := ConnectContext(context.Background(), sock)
  53. if err != nil {
  54. errs <- err
  55. return
  56. }
  57. c.Write([]byte("world"))
  58. b := make([]byte, 1024)
  59. n, err := c.Read(b)
  60. if err != nil {
  61. errs <- err
  62. return
  63. }
  64. if string(b[:n]) != "hello" {
  65. errs <- fmt.Errorf("got %#v, expected %#v\n", string(b[:n]), "hello")
  66. }
  67. c.Close()
  68. errs <- nil
  69. }()
  70. for range 2 {
  71. if err := <-errs; err != nil {
  72. t.Fatal(err)
  73. }
  74. }
  75. }