ping_test.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. package system // import "github.com/docker/docker/integration/system"
  2. import (
  3. "context"
  4. "net/http"
  5. "os"
  6. "path/filepath"
  7. "runtime"
  8. "strings"
  9. "testing"
  10. "github.com/docker/docker/api/types"
  11. "github.com/docker/docker/api/types/swarm"
  12. "github.com/docker/docker/api/types/versions"
  13. "github.com/docker/docker/testutil/daemon"
  14. "github.com/docker/docker/testutil/request"
  15. "gotest.tools/v3/assert"
  16. "gotest.tools/v3/skip"
  17. )
  18. func TestPingCacheHeaders(t *testing.T) {
  19. skip.If(t, versions.LessThan(testEnv.DaemonAPIVersion(), "1.40"), "skip test from new feature")
  20. defer setupTest(t)()
  21. res, _, err := request.Get("/_ping")
  22. assert.NilError(t, err)
  23. assert.Equal(t, res.StatusCode, http.StatusOK)
  24. assert.Equal(t, hdr(res, "Cache-Control"), "no-cache, no-store, must-revalidate")
  25. assert.Equal(t, hdr(res, "Pragma"), "no-cache")
  26. }
  27. func TestPingGet(t *testing.T) {
  28. defer setupTest(t)()
  29. res, body, err := request.Get("/_ping")
  30. assert.NilError(t, err)
  31. b, err := request.ReadBody(body)
  32. assert.NilError(t, err)
  33. assert.Equal(t, string(b), "OK")
  34. assert.Equal(t, res.StatusCode, http.StatusOK)
  35. assert.Check(t, hdr(res, "API-Version") != "")
  36. }
  37. func TestPingHead(t *testing.T) {
  38. skip.If(t, versions.LessThan(testEnv.DaemonAPIVersion(), "1.40"), "skip test from new feature")
  39. defer setupTest(t)()
  40. res, body, err := request.Head("/_ping")
  41. assert.NilError(t, err)
  42. b, err := request.ReadBody(body)
  43. assert.NilError(t, err)
  44. assert.Equal(t, 0, len(b))
  45. assert.Equal(t, res.StatusCode, http.StatusOK)
  46. assert.Check(t, hdr(res, "API-Version") != "")
  47. }
  48. func TestPingSwarmHeader(t *testing.T) {
  49. skip.If(t, testEnv.IsRemoteDaemon)
  50. skip.If(t, testEnv.DaemonInfo.OSType == "windows")
  51. defer setupTest(t)()
  52. d := daemon.New(t)
  53. d.Start(t)
  54. defer d.Stop(t)
  55. client := d.NewClientT(t)
  56. defer client.Close()
  57. ctx := context.TODO()
  58. t.Run("before swarm init", func(t *testing.T) {
  59. p, err := client.Ping(ctx)
  60. assert.NilError(t, err)
  61. assert.Equal(t, p.SwarmStatus.NodeState, swarm.LocalNodeStateInactive)
  62. assert.Equal(t, p.SwarmStatus.ControlAvailable, false)
  63. })
  64. _, err := client.SwarmInit(ctx, swarm.InitRequest{ListenAddr: "127.0.0.1", AdvertiseAddr: "127.0.0.1:2377"})
  65. assert.NilError(t, err)
  66. t.Run("after swarm init", func(t *testing.T) {
  67. p, err := client.Ping(ctx)
  68. assert.NilError(t, err)
  69. assert.Equal(t, p.SwarmStatus.NodeState, swarm.LocalNodeStateActive)
  70. assert.Equal(t, p.SwarmStatus.ControlAvailable, true)
  71. })
  72. err = client.SwarmLeave(ctx, true)
  73. assert.NilError(t, err)
  74. t.Run("after swarm leave", func(t *testing.T) {
  75. p, err := client.Ping(ctx)
  76. assert.NilError(t, err)
  77. assert.Equal(t, p.SwarmStatus.NodeState, swarm.LocalNodeStateInactive)
  78. assert.Equal(t, p.SwarmStatus.ControlAvailable, false)
  79. })
  80. }
  81. func TestPingBuilderHeader(t *testing.T) {
  82. skip.If(t, testEnv.IsRemoteDaemon)
  83. skip.If(t, testEnv.DaemonInfo.OSType == "windows", "cannot spin up additional daemons on windows")
  84. defer setupTest(t)()
  85. d := daemon.New(t)
  86. client := d.NewClientT(t)
  87. defer client.Close()
  88. ctx := context.TODO()
  89. t.Run("default config", func(t *testing.T) {
  90. d.Start(t)
  91. defer d.Stop(t)
  92. expected := types.BuilderBuildKit
  93. if runtime.GOOS == "windows" {
  94. expected = types.BuilderV1
  95. }
  96. p, err := client.Ping(ctx)
  97. assert.NilError(t, err)
  98. assert.Equal(t, p.BuilderVersion, expected)
  99. })
  100. t.Run("buildkit disabled", func(t *testing.T) {
  101. cfg := filepath.Join(d.RootDir(), "daemon.json")
  102. err := os.WriteFile(cfg, []byte(`{"features": { "buildkit": false }}`), 0o644)
  103. assert.NilError(t, err)
  104. d.Start(t, "--config-file", cfg)
  105. defer d.Stop(t)
  106. expected := types.BuilderV1
  107. p, err := client.Ping(ctx)
  108. assert.NilError(t, err)
  109. assert.Equal(t, p.BuilderVersion, expected)
  110. })
  111. }
  112. func hdr(res *http.Response, name string) string {
  113. val, ok := res.Header[http.CanonicalHeaderKey(name)]
  114. if !ok || len(val) == 0 {
  115. return ""
  116. }
  117. return strings.Join(val, ", ")
  118. }