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 }