docker_cli_sni_test.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package main
  2. import (
  3. "context"
  4. "fmt"
  5. "io"
  6. "log"
  7. "net/http"
  8. "net/http/httptest"
  9. "net/url"
  10. "os/exec"
  11. "strings"
  12. "testing"
  13. "gotest.tools/v3/assert"
  14. )
  15. type DockerCLISNISuite struct {
  16. ds *DockerSuite
  17. }
  18. func (s *DockerCLISNISuite) TearDownTest(ctx context.Context, c *testing.T) {
  19. s.ds.TearDownTest(ctx, c)
  20. }
  21. func (s *DockerCLISNISuite) OnTimeout(c *testing.T) {
  22. s.ds.OnTimeout(c)
  23. }
  24. func (s *DockerCLISNISuite) TestClientSetsTLSServerName(c *testing.T) {
  25. c.Skip("Flakey test")
  26. // there may be more than one hit to the server for each registry request
  27. var serverNameReceived []string
  28. var serverName string
  29. virtualHostServer := httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  30. serverNameReceived = append(serverNameReceived, r.TLS.ServerName)
  31. }))
  32. defer virtualHostServer.Close()
  33. // discard TLS handshake errors written by default to os.Stderr
  34. virtualHostServer.Config.ErrorLog = log.New(io.Discard, "", 0)
  35. u, err := url.Parse(virtualHostServer.URL)
  36. assert.NilError(c, err)
  37. hostPort := u.Host
  38. serverName = strings.Split(hostPort, ":")[0]
  39. repoName := fmt.Sprintf("%v/dockercli/image:latest", hostPort)
  40. cmd := exec.Command(dockerBinary, "pull", repoName)
  41. cmd.Run()
  42. // check that the fake server was hit at least once
  43. assert.Assert(c, len(serverNameReceived) > 0)
  44. // check that for each hit the right server name was received
  45. for _, item := range serverNameReceived {
  46. assert.Check(c, item == serverName)
  47. }
  48. }