github.com/Prakhar-Agarwal-byte/moby@v0.0.0-20231027092010-a14e3e8ab87e/integration/build/build_session_test.go (about) 1 package build 2 3 import ( 4 "context" 5 "io" 6 "net" 7 "net/http" 8 "strings" 9 "testing" 10 11 "github.com/Prakhar-Agarwal-byte/moby/api/types" 12 "github.com/Prakhar-Agarwal-byte/moby/api/types/versions" 13 dclient "github.com/Prakhar-Agarwal-byte/moby/client" 14 "github.com/Prakhar-Agarwal-byte/moby/testutil" 15 "github.com/Prakhar-Agarwal-byte/moby/testutil/fakecontext" 16 "github.com/Prakhar-Agarwal-byte/moby/testutil/request" 17 "github.com/moby/buildkit/session" 18 "github.com/moby/buildkit/session/filesync" 19 "golang.org/x/sync/errgroup" 20 "gotest.tools/v3/assert" 21 is "gotest.tools/v3/assert/cmp" 22 "gotest.tools/v3/skip" 23 ) 24 25 func TestBuildWithSession(t *testing.T) { 26 t.Skip("TODO: BuildKit") 27 skip.If(t, testEnv.DaemonInfo.OSType == "windows") 28 skip.If(t, versions.LessThan(testEnv.DaemonAPIVersion(), "1.39"), "experimental in older versions") 29 30 ctx := testutil.StartSpan(baseContext, t) 31 32 client := testEnv.APIClient() 33 34 dockerfile := ` 35 FROM busybox 36 COPY file / 37 RUN cat /file 38 ` 39 40 fctx := fakecontext.New(t, "", 41 fakecontext.WithFile("file", "some content"), 42 ) 43 defer fctx.Close() 44 45 out := testBuildWithSession(ctx, t, client, client.DaemonHost(), fctx.Dir, dockerfile) 46 assert.Check(t, is.Contains(out, "some content")) 47 48 fctx.Add("second", "contentcontent") 49 50 dockerfile += ` 51 COPY second / 52 RUN cat /second 53 ` 54 55 out = testBuildWithSession(ctx, t, client, client.DaemonHost(), fctx.Dir, dockerfile) 56 assert.Check(t, is.Equal(strings.Count(out, "Using cache"), 2)) 57 assert.Check(t, is.Contains(out, "contentcontent")) 58 59 du, err := client.DiskUsage(ctx, types.DiskUsageOptions{}) 60 assert.Check(t, err) 61 assert.Check(t, du.BuilderSize > 10) 62 63 out = testBuildWithSession(ctx, t, client, client.DaemonHost(), fctx.Dir, dockerfile) 64 assert.Check(t, is.Equal(strings.Count(out, "Using cache"), 4)) 65 66 du2, err := client.DiskUsage(ctx, types.DiskUsageOptions{}) 67 assert.Check(t, err) 68 assert.Check(t, is.Equal(du.BuilderSize, du2.BuilderSize)) 69 70 // rebuild with regular tar, confirm cache still applies 71 fctx.Add("Dockerfile", dockerfile) 72 // FIXME(vdemeester) use sock here 73 res, body, err := request.Do(ctx, 74 "/build", 75 request.Host(client.DaemonHost()), 76 request.Method(http.MethodPost), 77 request.RawContent(fctx.AsTarReader(t)), 78 request.ContentType("application/x-tar")) 79 assert.NilError(t, err) 80 assert.Check(t, is.DeepEqual(http.StatusOK, res.StatusCode)) 81 82 outBytes, err := request.ReadBody(body) 83 assert.NilError(t, err) 84 assert.Check(t, is.Contains(string(outBytes), "Successfully built")) 85 assert.Check(t, is.Equal(strings.Count(string(outBytes), "Using cache"), 4)) 86 87 _, err = client.BuildCachePrune(ctx, types.BuildCachePruneOptions{All: true}) 88 assert.Check(t, err) 89 90 du, err = client.DiskUsage(ctx, types.DiskUsageOptions{}) 91 assert.Check(t, err) 92 assert.Check(t, is.Equal(du.BuilderSize, int64(0))) 93 } 94 95 //nolint:unused // false positive: linter detects this as "unused" 96 func testBuildWithSession(ctx context.Context, t *testing.T, client dclient.APIClient, daemonHost string, dir, dockerfile string) (outStr string) { 97 sess, err := session.NewSession(ctx, "foo1", "foo") 98 assert.Check(t, err) 99 100 fsProvider := filesync.NewFSSyncProvider(filesync.StaticDirSource{ 101 "": {Dir: dir}, 102 }) 103 sess.Allow(fsProvider) 104 105 g, ctx := errgroup.WithContext(ctx) 106 107 g.Go(func() error { 108 return sess.Run(ctx, func(ctx context.Context, proto string, meta map[string][]string) (net.Conn, error) { 109 return client.DialHijack(ctx, "/session", "h2c", meta) 110 }) 111 }) 112 113 g.Go(func() error { 114 // FIXME use sock here 115 res, body, err := request.Do(ctx, 116 "/build?remote=client-session&session="+sess.ID(), 117 request.Host(daemonHost), 118 request.Method(http.MethodPost), 119 request.With(func(req *http.Request) error { 120 req.Body = io.NopCloser(strings.NewReader(dockerfile)) 121 return nil 122 }), 123 ) 124 if err != nil { 125 return err 126 } 127 assert.Check(t, is.DeepEqual(res.StatusCode, http.StatusOK)) 128 out, err := request.ReadBody(body) 129 assert.NilError(t, err) 130 assert.Check(t, is.Contains(string(out), "Successfully built")) 131 sess.Close() 132 outStr = string(out) 133 return nil 134 }) 135 136 err = g.Wait() 137 assert.Check(t, err) 138 return 139 }