github.com/rita33cool1/iot-system-gateway@v0.0.0-20200911033302-e65bde238cc5/docker-engine/integration/build/build_session_test.go (about) 1 package build 2 3 import ( 4 "context" 5 "io/ioutil" 6 "net/http" 7 "strings" 8 "testing" 9 10 dclient "github.com/docker/docker/client" 11 "github.com/docker/docker/integration-cli/request" 12 "github.com/docker/docker/internal/test/daemon" 13 "github.com/docker/docker/internal/test/fakecontext" 14 "github.com/gotestyourself/gotestyourself/assert" 15 is "github.com/gotestyourself/gotestyourself/assert/cmp" 16 "github.com/moby/buildkit/session" 17 "github.com/moby/buildkit/session/filesync" 18 "golang.org/x/sync/errgroup" 19 ) 20 21 func TestBuildWithSession(t *testing.T) { 22 d := daemon.New(t, daemon.WithExperimental) 23 d.StartWithBusybox(t) 24 defer d.Stop(t) 25 26 client, err := d.NewClient() 27 assert.NilError(t, err) 28 29 dockerfile := ` 30 FROM busybox 31 COPY file / 32 RUN cat /file 33 ` 34 35 fctx := fakecontext.New(t, "", 36 fakecontext.WithFile("file", "some content"), 37 ) 38 defer fctx.Close() 39 40 out := testBuildWithSession(t, client, d.Sock(), fctx.Dir, dockerfile) 41 assert.Check(t, is.Contains(out, "some content")) 42 43 fctx.Add("second", "contentcontent") 44 45 dockerfile += ` 46 COPY second / 47 RUN cat /second 48 ` 49 50 out = testBuildWithSession(t, client, d.Sock(), fctx.Dir, dockerfile) 51 assert.Check(t, is.Equal(strings.Count(out, "Using cache"), 2)) 52 assert.Check(t, is.Contains(out, "contentcontent")) 53 54 du, err := client.DiskUsage(context.TODO()) 55 assert.Check(t, err) 56 assert.Check(t, du.BuilderSize > 10) 57 58 out = testBuildWithSession(t, client, d.Sock(), fctx.Dir, dockerfile) 59 assert.Check(t, is.Equal(strings.Count(out, "Using cache"), 4)) 60 61 du2, err := client.DiskUsage(context.TODO()) 62 assert.Check(t, err) 63 assert.Check(t, is.Equal(du.BuilderSize, du2.BuilderSize)) 64 65 // rebuild with regular tar, confirm cache still applies 66 fctx.Add("Dockerfile", dockerfile) 67 // FIXME(vdemeester) use sock here 68 res, body, err := request.DoOnHost(d.Sock(), 69 "/build", 70 request.Method(http.MethodPost), 71 request.RawContent(fctx.AsTarReader(t)), 72 request.ContentType("application/x-tar")) 73 assert.NilError(t, err) 74 assert.Check(t, is.DeepEqual(http.StatusOK, res.StatusCode)) 75 76 outBytes, err := request.ReadBody(body) 77 assert.NilError(t, err) 78 assert.Check(t, is.Contains(string(outBytes), "Successfully built")) 79 assert.Check(t, is.Equal(strings.Count(string(outBytes), "Using cache"), 4)) 80 81 _, err = client.BuildCachePrune(context.TODO()) 82 assert.Check(t, err) 83 84 du, err = client.DiskUsage(context.TODO()) 85 assert.Check(t, err) 86 assert.Check(t, is.Equal(du.BuilderSize, int64(0))) 87 } 88 89 func testBuildWithSession(t *testing.T, client dclient.APIClient, daemonSock string, dir, dockerfile string) (outStr string) { 90 sess, err := session.NewSession("foo1", "foo") 91 assert.Check(t, err) 92 93 fsProvider := filesync.NewFSSyncProvider([]filesync.SyncedDir{ 94 {Dir: dir}, 95 }) 96 sess.Allow(fsProvider) 97 98 g, ctx := errgroup.WithContext(context.Background()) 99 100 g.Go(func() error { 101 return sess.Run(ctx, client.DialSession) 102 }) 103 104 g.Go(func() error { 105 // FIXME use sock here 106 res, body, err := request.DoOnHost( 107 daemonSock, 108 "/build?remote=client-session&session="+sess.ID(), 109 request.Method(http.MethodPost), 110 func(req *http.Request) error { 111 req.Body = ioutil.NopCloser(strings.NewReader(dockerfile)) 112 return nil 113 }, 114 ) 115 if err != nil { 116 return err 117 } 118 assert.Check(t, is.DeepEqual(res.StatusCode, http.StatusOK)) 119 out, err := request.ReadBody(body) 120 assert.NilError(t, err) 121 assert.Check(t, is.Contains(string(out), "Successfully built")) 122 sess.Close() 123 outStr = string(out) 124 return nil 125 }) 126 127 err = g.Wait() 128 assert.Check(t, err) 129 return 130 }