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  }