| //go:build !windows | |
| package system | |
| import ( | |
| "encoding/json" | |
| "io" | |
| "net/http" | |
| "testing" | |
| "github.com/moby/moby/v2/internal/testutil/request" | |
| "gotest.tools/v3/assert" | |
| is "gotest.tools/v3/assert/cmp" | |
| ) | |
| func TestInfoBinaryCommits(t *testing.T) { | |
| ctx := setupTest(t) | |
| // API v1.48 and lower returned both the "current" commit (ID) and "expected" commit. | |
| // The "Expected" field has been removed in the API types, so define | |
| // an ad-hoc type for this test. | |
| type legacyCommit struct { | |
| ID string | |
| Expected string | |
| } | |
| type legacyInfo struct { | |
| ContainerdCommit legacyCommit | |
| RuncCommit legacyCommit | |
| InitCommit legacyCommit | |
| } | |
| t.Run("current", func(t *testing.T) { | |
| res, body, err := request.Get(ctx, "/info", request.JSON) | |
| assert.NilError(t, err) | |
| assert.Equal(t, res.StatusCode, http.StatusOK) | |
| buf, err := request.ReadBody(body) | |
| assert.NilError(t, err) | |
| var info legacyInfo | |
| err = json.Unmarshal(buf, &info) | |
| assert.NilError(t, err) | |
| assert.Check(t, info.ContainerdCommit.ID != "N/A") | |
| assert.Check(t, is.Equal(info.ContainerdCommit.Expected, "")) | |
| assert.Check(t, info.InitCommit.ID != "N/A") | |
| assert.Check(t, is.Equal(info.InitCommit.Expected, "")) | |
| assert.Check(t, info.RuncCommit.ID != "N/A") | |
| assert.Check(t, is.Equal(info.RuncCommit.Expected, "")) | |
| }) | |
| // Expected commits are omitted in API 1.49, but should still be included in older versions. | |
| t.Run("1.48", func(t *testing.T) { | |
| res, body, err := request.Get(ctx, "/v1.48/info", request.JSON) | |
| assert.NilError(t, err) | |
| assert.Equal(t, res.StatusCode, http.StatusOK) | |
| buf, err := request.ReadBody(body) | |
| assert.NilError(t, err) | |
| var info legacyInfo | |
| err = json.Unmarshal(buf, &info) | |
| assert.NilError(t, err) | |
| assert.Check(t, info.ContainerdCommit.ID != "N/A") | |
| assert.Check(t, is.Equal(info.ContainerdCommit.Expected, info.ContainerdCommit.ID)) | |
| assert.Check(t, info.InitCommit.ID != "N/A") | |
| assert.Check(t, is.Equal(info.InitCommit.Expected, info.InitCommit.ID)) | |
| assert.Check(t, info.RuncCommit.ID != "N/A") | |
| assert.Check(t, is.Equal(info.RuncCommit.Expected, info.RuncCommit.ID)) | |
| }) | |
| } | |
| func TestInfoLegacyFields(t *testing.T) { | |
| ctx := setupTest(t) | |
| const notPresent = "expected field to not be present" | |
| tests := []struct { | |
| name string | |
| url string | |
| expectedFields map[string]any | |
| }{ | |
| { | |
| name: "api v1.49 legacy bridge-nftables", | |
| url: "/v1.49/info", | |
| expectedFields: map[string]any{ | |
| "BridgeNfIp6tables": false, | |
| "BridgeNfIptables": false, | |
| }, | |
| }, | |
| { | |
| name: "api v1.50 legacy bridge-nftables", | |
| url: "/v1.50/info", | |
| expectedFields: map[string]any{ | |
| "BridgeNfIp6tables": notPresent, | |
| "BridgeNfIptables": notPresent, | |
| }, | |
| }, | |
| } | |
| for _, tc := range tests { | |
| t.Run(tc.name, func(t *testing.T) { | |
| res, _, err := request.Get(ctx, tc.url) | |
| assert.NilError(t, err) | |
| assert.Equal(t, res.StatusCode, http.StatusOK) | |
| body, err := io.ReadAll(res.Body) | |
| assert.NilError(t, err) | |
| actual := map[string]any{} | |
| err = json.Unmarshal(body, &actual) | |
| assert.NilError(t, err, string(body)) | |
| for field, expectedValue := range tc.expectedFields { | |
| if expectedValue == notPresent { | |
| _, found := actual[field] | |
| assert.Assert(t, !found, "field %s should not be present", field) | |
| } else { | |
| _, found := actual[field] | |
| assert.Assert(t, found, "field %s should be present", field) | |
| assert.Check(t, is.DeepEqual(actual[field], expectedValue)) | |
| } | |
| } | |
| }) | |
| } | |
| } |