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 }