github.com/Prakhar-Agarwal-byte/moby@v0.0.0-20231027092010-a14e3e8ab87e/integration/system/ping_test.go (about)

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