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