github.com/buildpacks/pack@v0.33.3-0.20240516162812-884dd1837311/internal/fakes/fake_extension.go (about)

     1  package fakes
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"io"
     7  	"path/filepath"
     8  
     9  	"github.com/BurntSushi/toml"
    10  
    11  	"github.com/buildpacks/pack/pkg/archive"
    12  	"github.com/buildpacks/pack/pkg/buildpack"
    13  	"github.com/buildpacks/pack/pkg/dist"
    14  )
    15  
    16  type fakeExtension struct {
    17  	descriptor dist.ExtensionDescriptor
    18  	chmod      int64
    19  	options    []FakeExtensionOption
    20  }
    21  
    22  type fakeExtensionConfig struct {
    23  	// maping of extrafilename to stringified contents
    24  	ExtraFiles map[string]string
    25  	OpenError  error
    26  }
    27  
    28  func newFakeExtensionConfig() *fakeExtensionConfig {
    29  	return &fakeExtensionConfig{ExtraFiles: map[string]string{}}
    30  }
    31  
    32  type FakeExtensionOption func(*fakeExtensionConfig)
    33  
    34  func WithExtraExtensionContents(filename, contents string) FakeExtensionOption {
    35  	return func(f *fakeExtensionConfig) {
    36  		f.ExtraFiles[filename] = contents
    37  	}
    38  }
    39  
    40  func WithExtOpenError(err error) FakeExtensionOption {
    41  	return func(f *fakeExtensionConfig) {
    42  		f.OpenError = err
    43  	}
    44  }
    45  
    46  // NewFakeExtension creates a fake extension with contents:
    47  //
    48  //		\_ /cnb/extensions/{ID}
    49  //		\_ /cnb/extensions/{ID}/{version}
    50  //		\_ /cnb/extensions/{ID}/{version}/extension.toml
    51  //		\_ /cnb/extensions/{ID}/{version}/bin
    52  //		\_ /cnb/extensions/{ID}/{version}/bin/generate
    53  //	 	generate-contents
    54  //		\_ /cnb/extensions/{ID}/{version}/bin/detect
    55  //	 	detect-contents
    56  func NewFakeExtension(descriptor dist.ExtensionDescriptor, chmod int64, options ...FakeExtensionOption) (buildpack.BuildModule, error) {
    57  	return &fakeExtension{
    58  		descriptor: descriptor,
    59  		chmod:      chmod,
    60  		options:    options,
    61  	}, nil
    62  }
    63  
    64  func (b *fakeExtension) Descriptor() buildpack.Descriptor {
    65  	return &b.descriptor
    66  }
    67  
    68  func (b *fakeExtension) Open() (io.ReadCloser, error) {
    69  	fConfig := newFakeExtensionConfig()
    70  	for _, option := range b.options {
    71  		option(fConfig)
    72  	}
    73  
    74  	if fConfig.OpenError != nil {
    75  		return nil, fConfig.OpenError
    76  	}
    77  
    78  	buf := &bytes.Buffer{}
    79  	if err := toml.NewEncoder(buf).Encode(b.descriptor); err != nil {
    80  		return nil, err
    81  	}
    82  
    83  	tarBuilder := archive.TarBuilder{}
    84  	ts := archive.NormalizedDateTime
    85  	tarBuilder.AddDir(fmt.Sprintf("/cnb/extensions/%s", b.descriptor.EscapedID()), b.chmod, ts)
    86  	extDir := fmt.Sprintf("/cnb/extensions/%s/%s", b.descriptor.EscapedID(), b.descriptor.Info().Version)
    87  	tarBuilder.AddDir(extDir, b.chmod, ts)
    88  	tarBuilder.AddFile(extDir+"/extension.toml", b.chmod, ts, buf.Bytes())
    89  
    90  	tarBuilder.AddDir(extDir+"/bin", b.chmod, ts)
    91  	tarBuilder.AddFile(extDir+"/bin/generate", b.chmod, ts, []byte("generate-contents"))
    92  	tarBuilder.AddFile(extDir+"/bin/detect", b.chmod, ts, []byte("detect-contents"))
    93  
    94  	for extraFilename, extraContents := range fConfig.ExtraFiles {
    95  		tarBuilder.AddFile(filepath.Join(extDir, extraFilename), b.chmod, ts, []byte(extraContents))
    96  	}
    97  
    98  	return tarBuilder.Reader(archive.DefaultTarWriterFactory()), nil
    99  }