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 }