github.com/buildpack/pack@v0.5.0/inspect_builder_test.go (about) 1 package pack 2 3 import ( 4 "bytes" 5 "fmt" 6 "testing" 7 8 "github.com/buildpack/imgutil/fakes" 9 "github.com/golang/mock/gomock" 10 "github.com/heroku/color" 11 "github.com/pkg/errors" 12 "github.com/sclevine/spec" 13 "github.com/sclevine/spec/report" 14 15 "github.com/buildpack/pack/builder" 16 "github.com/buildpack/pack/dist" 17 "github.com/buildpack/pack/image" 18 ifakes "github.com/buildpack/pack/internal/fakes" 19 h "github.com/buildpack/pack/testhelpers" 20 "github.com/buildpack/pack/testmocks" 21 ) 22 23 func TestInspectBuilder(t *testing.T) { 24 color.Disable(true) 25 defer func() { color.Disable(false) }() 26 spec.Run(t, "InspectBuilder", testInspectBuilder, spec.Parallel(), spec.Report(report.Terminal{})) 27 } 28 29 func testInspectBuilder(t *testing.T, when spec.G, it spec.S) { 30 var ( 31 subject *Client 32 mockImageFetcher *testmocks.MockImageFetcher 33 mockController *gomock.Controller 34 builderImage *fakes.Image 35 out bytes.Buffer 36 ) 37 38 it.Before(func() { 39 mockController = gomock.NewController(t) 40 mockImageFetcher = testmocks.NewMockImageFetcher(mockController) 41 42 subject = &Client{ 43 logger: ifakes.NewFakeLogger(&out), 44 imageFetcher: mockImageFetcher, 45 } 46 47 builderImage = fakes.NewImage("some/builder", "", nil) 48 h.AssertNil(t, builderImage.SetLabel("io.buildpacks.stack.id", "test.stack.id")) 49 h.AssertNil(t, builderImage.SetEnv("CNB_USER_ID", "1234")) 50 h.AssertNil(t, builderImage.SetEnv("CNB_GROUP_ID", "4321")) 51 }) 52 53 it.After(func() { 54 mockController.Finish() 55 }) 56 57 when("the image exists", func() { 58 for _, useDaemon := range []bool{true, false} { 59 useDaemon := useDaemon 60 when(fmt.Sprintf("daemon is %t", useDaemon), func() { 61 it.Before(func() { 62 if useDaemon { 63 mockImageFetcher.EXPECT().Fetch(gomock.Any(), "some/builder", true, false).Return(builderImage, nil) 64 } else { 65 mockImageFetcher.EXPECT().Fetch(gomock.Any(), "some/builder", false, false).Return(builderImage, nil) 66 } 67 }) 68 69 when("the builder image has appropriate metadata labels", func() { 70 it.Before(func() { 71 h.AssertNil(t, builderImage.SetLabel("io.buildpacks.builder.metadata", `{ 72 "description": "Some description", 73 "stack": { 74 "runImage": { 75 "image": "some/run-image", 76 "mirrors": [ 77 "gcr.io/some/default" 78 ] 79 } 80 }, 81 "buildpacks": [ 82 { 83 "id": "test.bp.one", 84 "version": "1.0.0", 85 "latest": true 86 } 87 ], 88 "lifecycle": {"version": "1.2.3"}, 89 "createdBy": {"name": "pack", "version": "1.2.3"} 90 }`)) 91 92 h.AssertNil(t, builderImage.SetLabel( 93 "io.buildpacks.buildpack.order", 94 `[{"group": [{"id": "buildpack-1-id", "optional": false}, {"id": "buildpack-2-id", "version": "buildpack-2-version-1", "optional": true}]}]`, 95 )) 96 }) 97 98 it("returns the builder with the given name", func() { 99 builderInfo, err := subject.InspectBuilder("some/builder", useDaemon) 100 h.AssertNil(t, err) 101 h.AssertEq(t, builderInfo.RunImage, "some/run-image") 102 }) 103 104 it("set the creator info", func() { 105 builderInfo, err := subject.InspectBuilder("some/builder", useDaemon) 106 h.AssertNil(t, err) 107 h.AssertEq(t, builderInfo.CreatedBy.Name, "pack") 108 h.AssertEq(t, builderInfo.CreatedBy.Version, "1.2.3") 109 }) 110 111 it("set the description", func() { 112 builderInfo, err := subject.InspectBuilder("some/builder", useDaemon) 113 h.AssertNil(t, err) 114 h.AssertEq(t, builderInfo.Description, "Some description") 115 }) 116 117 it("set the stack ID", func() { 118 builderInfo, err := subject.InspectBuilder("some/builder", useDaemon) 119 h.AssertNil(t, err) 120 h.AssertEq(t, builderInfo.Stack, "test.stack.id") 121 }) 122 123 it("set the defaults run image mirrors", func() { 124 builderInfo, err := subject.InspectBuilder("some/builder", useDaemon) 125 h.AssertNil(t, err) 126 h.AssertEq(t, builderInfo.RunImageMirrors, []string{"gcr.io/some/default"}) 127 }) 128 129 it("sets the buildpacks", func() { 130 builderInfo, err := subject.InspectBuilder("some/builder", useDaemon) 131 h.AssertNil(t, err) 132 h.AssertEq(t, builderInfo.Buildpacks[0], builder.BuildpackMetadata{ 133 BuildpackInfo: dist.BuildpackInfo{ 134 ID: "test.bp.one", 135 Version: "1.0.0", 136 }, 137 Latest: true, 138 }) 139 }) 140 141 it("sets the groups", func() { 142 builderInfo, err := subject.InspectBuilder("some/builder", useDaemon) 143 h.AssertNil(t, err) 144 h.AssertEq(t, builderInfo.Order[0].Group[0], dist.BuildpackRef{ 145 BuildpackInfo: dist.BuildpackInfo{ 146 ID: "buildpack-1-id", 147 Version: "", 148 }, 149 Optional: false, 150 }) 151 h.AssertEq(t, builderInfo.Order[0].Group[1], dist.BuildpackRef{ 152 BuildpackInfo: dist.BuildpackInfo{ 153 ID: "buildpack-2-id", 154 Version: "buildpack-2-version-1", 155 }, 156 Optional: true, 157 }) 158 }) 159 160 it("sets the lifecycle version", func() { 161 builderInfo, err := subject.InspectBuilder("some/builder", useDaemon) 162 h.AssertNil(t, err) 163 h.AssertEq(t, builderInfo.Lifecycle.Info.Version.String(), "1.2.3") 164 }) 165 }) 166 }) 167 } 168 }) 169 170 when("fetcher fails to fetch the image", func() { 171 it.Before(func() { 172 mockImageFetcher.EXPECT().Fetch(gomock.Any(), "some/builder", false, false).Return(nil, errors.New("some-error")) 173 }) 174 175 it("returns an error", func() { 176 _, err := subject.InspectBuilder("some/builder", false) 177 h.AssertError(t, err, "some-error") 178 }) 179 }) 180 181 when("the image does not exist", func() { 182 it.Before(func() { 183 notFoundImage := fakes.NewImage("", "", nil) 184 notFoundImage.Delete() 185 mockImageFetcher.EXPECT().Fetch(gomock.Any(), "some/builder", true, false).Return(nil, errors.Wrap(image.ErrNotFound, "some-error")) 186 }) 187 188 it("return nil metadata", func() { 189 metadata, err := subject.InspectBuilder("some/builder", true) 190 h.AssertNil(t, err) 191 h.AssertNil(t, metadata) 192 }) 193 }) 194 }