github.com/openshift/source-to-image@v1.4.1-0.20240516041539-bf52fc02204e/pkg/build/strategies/onbuild/onbuild_test.go (about)

     1  package onbuild
     2  
     3  import (
     4  	"bytes"
     5  	"os"
     6  	"path/filepath"
     7  	"strings"
     8  	"testing"
     9  
    10  	"github.com/moby/buildkit/frontend/dockerfile/parser"
    11  
    12  	"github.com/openshift/source-to-image/pkg/api"
    13  	"github.com/openshift/source-to-image/pkg/docker"
    14  	"github.com/openshift/source-to-image/pkg/scm/git"
    15  	"github.com/openshift/source-to-image/pkg/test"
    16  	testfs "github.com/openshift/source-to-image/pkg/test/fs"
    17  	"github.com/openshift/source-to-image/pkg/util/fs"
    18  )
    19  
    20  type fakeSourceHandler struct{}
    21  
    22  func (*fakeSourceHandler) Prepare(r *api.Config) error {
    23  	return nil
    24  }
    25  
    26  func (*fakeSourceHandler) Ignore(r *api.Config) error {
    27  	return nil
    28  }
    29  
    30  func (*fakeSourceHandler) Download(r *api.Config) (*git.SourceInfo, error) {
    31  	return &git.SourceInfo{}, nil
    32  }
    33  
    34  type fakeCleaner struct{}
    35  
    36  func (*fakeCleaner) Cleanup(*api.Config) {}
    37  
    38  func newFakeOnBuild() *OnBuild {
    39  	return &OnBuild{
    40  		docker:  &docker.FakeDocker{},
    41  		git:     &test.FakeGit{},
    42  		fs:      &testfs.FakeFileSystem{},
    43  		tar:     &test.FakeTar{},
    44  		source:  &fakeSourceHandler{},
    45  		garbage: &fakeCleaner{},
    46  	}
    47  }
    48  
    49  func checkDockerfile(fs *testfs.FakeFileSystem, t *testing.T) {
    50  	if fs.WriteFileError != nil {
    51  		t.Errorf("%v", fs.WriteFileError)
    52  	}
    53  	if filepath.ToSlash(fs.WriteFileName) != "upload/src/Dockerfile" {
    54  		t.Errorf("Expected Dockerfile in 'upload/src/Dockerfile', got %q", fs.WriteFileName)
    55  	}
    56  	if !strings.Contains(fs.WriteFileContent, `ENTRYPOINT ["./run"]`) {
    57  		t.Errorf("The Dockerfile does not set correct entrypoint, file content:\n%s", fs.WriteFileContent)
    58  	}
    59  
    60  	buf := bytes.NewBuffer([]byte(fs.WriteFileContent))
    61  	if _, err := parser.Parse(buf); err != nil {
    62  		t.Errorf("cannot parse new Dockerfile: %v", err)
    63  	}
    64  
    65  }
    66  
    67  func TestCreateDockerfile(t *testing.T) {
    68  	fakeRequest := &api.Config{
    69  		BuilderImage: "fake:onbuild",
    70  		Environment: api.EnvironmentList{
    71  			{Name: "FOO", Value: "BAR"},
    72  			{Name: "TEST", Value: "A VALUE"},
    73  		},
    74  	}
    75  	b := newFakeOnBuild()
    76  	fakeFs := &testfs.FakeFileSystem{
    77  		Files: []os.FileInfo{
    78  			&fs.FileInfo{FileName: "config.ru", FileMode: 0600},
    79  			&fs.FileInfo{FileName: "app.rb", FileMode: 0600},
    80  			&fs.FileInfo{FileName: "run", FileMode: 0777},
    81  		},
    82  	}
    83  	b.fs = fakeFs
    84  	err := b.CreateDockerfile(fakeRequest)
    85  	if err != nil {
    86  		t.Errorf("%v", err)
    87  	}
    88  	checkDockerfile(fakeFs, t)
    89  }
    90  
    91  func TestCreateDockerfileWithAssemble(t *testing.T) {
    92  	fakeRequest := &api.Config{
    93  		BuilderImage: "fake:onbuild",
    94  	}
    95  	b := newFakeOnBuild()
    96  	fakeFs := &testfs.FakeFileSystem{
    97  		Files: []os.FileInfo{
    98  			&fs.FileInfo{FileName: "config.ru", FileMode: 0600},
    99  			&fs.FileInfo{FileName: "app.rb", FileMode: 0600},
   100  			&fs.FileInfo{FileName: "run", FileMode: 0777},
   101  			&fs.FileInfo{FileName: "assemble", FileMode: 0777},
   102  		},
   103  	}
   104  	b.fs = fakeFs
   105  	err := b.CreateDockerfile(fakeRequest)
   106  	if err != nil {
   107  		t.Errorf("%v", err)
   108  	}
   109  	checkDockerfile(fakeFs, t)
   110  	if !strings.Contains(fakeFs.WriteFileContent, `RUN sh assemble`) {
   111  		t.Errorf("The Dockerfile does not run assemble, file content:\n%s", fakeFs.WriteFileContent)
   112  	}
   113  }
   114  
   115  func TestBuild(t *testing.T) {
   116  	fakeRequest := &api.Config{
   117  		BuilderImage: "fake:onbuild",
   118  		Tag:          "fakeapp",
   119  	}
   120  	b := newFakeOnBuild()
   121  	fakeFs := &testfs.FakeFileSystem{
   122  		Files: []os.FileInfo{
   123  			&fs.FileInfo{FileName: "config.ru", FileMode: 0600},
   124  			&fs.FileInfo{FileName: "app.rb", FileMode: 0600},
   125  			&fs.FileInfo{FileName: "run", FileMode: 0777},
   126  		},
   127  	}
   128  	b.fs = fakeFs
   129  	result, err := b.Build(fakeRequest)
   130  	if err != nil {
   131  		t.Errorf("%v", err)
   132  	}
   133  	if !result.Success {
   134  		t.Errorf("Expected successful build, got: %v", result)
   135  	}
   136  	checkDockerfile(fakeFs, t)
   137  	t.Logf("result: %v", result)
   138  }
   139  
   140  func TestBuildOnBuildBlocked(t *testing.T) {
   141  	fakeRequest := &api.Config{
   142  		BuilderImage: "fake:onbuild",
   143  		Tag:          "fakeapp",
   144  		BlockOnBuild: true,
   145  	}
   146  	b := newFakeOnBuild()
   147  	fakeFs := &testfs.FakeFileSystem{
   148  		Files: []os.FileInfo{
   149  			&fs.FileInfo{FileName: "config.ru", FileMode: 0600},
   150  			&fs.FileInfo{FileName: "app.rb", FileMode: 0600},
   151  			&fs.FileInfo{FileName: "run", FileMode: 0777},
   152  		},
   153  	}
   154  	b.fs = fakeFs
   155  	_, err := b.Build(fakeRequest)
   156  	if err == nil || !strings.Contains(err.Error(), "builder image uses ONBUILD instructions but ONBUILD is not allowed") {
   157  		t.Errorf("expected error from onbuild due to blocked ONBUILD, got: %v", err)
   158  	}
   159  }