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