github.com/openshift/source-to-image@v1.4.1-0.20240516041539-bf52fc02204e/pkg/build/strategies/layered/layered_test.go (about) 1 package layered 2 3 import ( 4 "errors" 5 "io/ioutil" 6 "os" 7 "path/filepath" 8 "regexp" 9 "regexp/syntax" 10 "strings" 11 "testing" 12 13 "github.com/openshift/source-to-image/pkg/api" 14 "github.com/openshift/source-to-image/pkg/api/constants" 15 "github.com/openshift/source-to-image/pkg/build" 16 "github.com/openshift/source-to-image/pkg/docker" 17 "github.com/openshift/source-to-image/pkg/test" 18 testfs "github.com/openshift/source-to-image/pkg/test/fs" 19 ) 20 21 type FakeExecutor struct{} 22 23 func (f *FakeExecutor) Execute(string, string, *api.Config) error { 24 return nil 25 } 26 27 func newFakeLayered() *Layered { 28 return &Layered{ 29 docker: &docker.FakeDocker{}, 30 config: &api.Config{}, 31 fs: &testfs.FakeFileSystem{}, 32 tar: &test.FakeTar{}, 33 scripts: &FakeExecutor{}, 34 } 35 } 36 37 func newFakeLayeredWithScripts(workDir string) *Layered { 38 return &Layered{ 39 docker: &docker.FakeDocker{}, 40 config: &api.Config{WorkingDir: workDir}, 41 fs: &testfs.FakeFileSystem{}, 42 tar: &test.FakeTar{}, 43 scripts: &FakeExecutor{}, 44 } 45 } 46 47 func TestBuildOK(t *testing.T) { 48 workDir, _ := ioutil.TempDir("", "sti") 49 scriptDir := filepath.Join(workDir, constants.UploadScripts) 50 err := os.MkdirAll(scriptDir, 0700) 51 assemble := filepath.Join(scriptDir, constants.Assemble) 52 file, err := os.Create(assemble) 53 if err != nil { 54 t.Errorf("Unexpected error returned: %v", err) 55 } 56 defer file.Close() 57 defer os.RemoveAll(workDir) 58 l := newFakeLayeredWithScripts(workDir) 59 l.config.BuilderImage = "test/image" 60 _, err = l.Build(l.config) 61 if err != nil { 62 t.Errorf("Unexpected error returned: %v", err) 63 } 64 if !l.config.LayeredBuild { 65 t.Errorf("Expected LayeredBuild to be true!") 66 } 67 if m, _ := regexp.MatchString(`s2i-layered-temp-image-\d+`, l.config.BuilderImage); !m { 68 t.Errorf("Expected BuilderImage s2i-layered-temp-image-withnumbers, but got %s", l.config.BuilderImage) 69 } 70 // without config.Destination explicitly set, we should get /tmp/scripts for the scripts url 71 // assuming the assemble script we created above is off the working dir 72 if l.config.ScriptsURL != "image:///tmp/scripts" { 73 t.Errorf("Expected ScriptsURL image:///tmp/scripts, but got %s", l.config.ScriptsURL) 74 } 75 if len(l.config.Destination) != 0 { 76 t.Errorf("Unexpected Destination %s", l.config.Destination) 77 } 78 } 79 80 func TestBuildOKWithImageRef(t *testing.T) { 81 workDir, _ := ioutil.TempDir("", "sti") 82 scriptDir := filepath.Join(workDir, constants.UploadScripts) 83 err := os.MkdirAll(scriptDir, 0700) 84 assemble := filepath.Join(scriptDir, constants.Assemble) 85 file, err := os.Create(assemble) 86 if err != nil { 87 t.Errorf("Unexpected error returned: %v", err) 88 } 89 defer file.Close() 90 defer os.RemoveAll(workDir) 91 l := newFakeLayeredWithScripts(workDir) 92 l.config.BuilderImage = "docker.io/uptoknow/ruby-20-centos7@sha256:d6f5718b85126954d98931e654483ee794ac357e0a98f4a680c1e848d78863a1" 93 _, err = l.Build(l.config) 94 if err != nil { 95 t.Errorf("Unexpected error returned: %v", err) 96 } 97 if !l.config.LayeredBuild { 98 t.Errorf("Expected LayeredBuild to be true!") 99 } 100 if !strings.HasPrefix(l.config.BuilderImage, "s2i-layered-temp-image-") { 101 t.Errorf("Expected BuilderImage to start with s2i-layered-temp-image-, but got %s", l.config.BuilderImage) 102 } 103 l.config.BuilderImage = "uptoknow/ruby-20-centos7@sha256:d6f5718b85126954d98931e654483ee794ac357e0a98f4a680c1e848d78863a1" 104 _, err = l.Build(l.config) 105 if err != nil { 106 t.Errorf("Unexpected error returned: %v", err) 107 } 108 if !l.config.LayeredBuild { 109 t.Errorf("Expected LayeredBuild to be true!") 110 } 111 if !strings.HasPrefix(l.config.BuilderImage, "s2i-layered-temp-image-") { 112 t.Errorf("Expected BuilderImage to start with s2i-layered-temp-image-, but got %s", l.config.BuilderImage) 113 } 114 l.config.BuilderImage = "ruby-20-centos7@sha256:d6f5718b85126954d98931e654483ee794ac357e0a98f4a680c1e848d78863a1" 115 _, err = l.Build(l.config) 116 if err != nil { 117 t.Errorf("Unexpected error returned: %v", err) 118 } 119 if !l.config.LayeredBuild { 120 t.Errorf("Expected LayeredBuild to be true!") 121 } 122 if !strings.HasPrefix(l.config.BuilderImage, "s2i-layered-temp-image-") { 123 t.Errorf("Expected BuilderImage to start with s2i-layered-temp-image-, but got %s", l.config.BuilderImage) 124 } 125 } 126 127 func TestBuildNoScriptsProvided(t *testing.T) { 128 l := newFakeLayered() 129 l.config.BuilderImage = "test/image" 130 _, err := l.Build(l.config) 131 if err != nil { 132 t.Errorf("Unexpected error returned: %v", err) 133 } 134 if !l.config.LayeredBuild { 135 t.Errorf("Expected LayeredBuild to be true!") 136 } 137 if m, _ := regexp.MatchString(`s2i-layered-temp-image-\d+`, l.config.BuilderImage); !m { 138 t.Errorf("Expected BuilderImage s2i-layered-temp-image-withnumbers, but got %s", l.config.BuilderImage) 139 } 140 if len(l.config.Destination) != 0 { 141 t.Errorf("Unexpected Destination %s", l.config.Destination) 142 } 143 } 144 145 func TestBuildErrorWriteDockerfile(t *testing.T) { 146 l := newFakeLayered() 147 l.config.BuilderImage = "test/image" 148 l.fs.(*testfs.FakeFileSystem).WriteFileError = errors.New("WriteDockerfileError") 149 _, err := l.Build(l.config) 150 if err == nil || err.Error() != "WriteDockerfileError" { 151 t.Errorf("An error was expected for WriteDockerfile, but got different: %v", err) 152 } 153 } 154 155 func TestBuildErrorCreateTarFile(t *testing.T) { 156 l := newFakeLayered() 157 l.config.BuilderImage = "test/image" 158 l.tar.(*test.FakeTar).CreateTarError = errors.New("CreateTarError") 159 _, err := l.Build(l.config) 160 if err == nil || err.Error() != "CreateTarError" { 161 t.Errorf("An error was expected for CreateTar, but got different: %v", err) 162 } 163 } 164 165 func TestBuildErrorBuildImage(t *testing.T) { 166 l := newFakeLayered() 167 l.config.BuilderImage = "test/image" 168 l.docker.(*docker.FakeDocker).BuildImageError = errors.New("BuildImageError") 169 _, err := l.Build(l.config) 170 if err == nil || err.Error() != "BuildImageError" { 171 t.Errorf("An error was expected for BuildImage, but got different: %v", err) 172 } 173 } 174 175 func TestBuildErrorBadImageName(t *testing.T) { 176 l := newFakeLayered() 177 _, err := l.Build(l.config) 178 if err == nil || !strings.Contains(err.Error(), "builder image name cannot be empty") { 179 t.Errorf("A builder image name cannot be empty error was expected, but got different: %v", err) 180 } 181 } 182 183 func TestBuildErrorOnBuildBlocked(t *testing.T) { 184 l := newFakeLayered() 185 l.config.BlockOnBuild = true 186 l.config.HasOnBuild = true 187 _, err := l.Build(l.config) 188 if err == nil || !strings.Contains(err.Error(), "builder image uses ONBUILD instructions but ONBUILD is not allowed") { 189 t.Errorf("expected error from onbuild due to blocked ONBUILD, got: %v", err) 190 } 191 } 192 193 func TestNewWithInvalidExcludeRegExp(t *testing.T) { 194 _, err := New(nil, &api.Config{ 195 DockerConfig: docker.GetDefaultDockerConfig(), 196 ExcludeRegExp: "[", 197 }, nil, nil, build.Overrides{}) 198 if syntaxErr, ok := err.(*syntax.Error); ok && syntaxErr.Code != syntax.ErrMissingBracket { 199 t.Errorf("expected regexp compilation error, got %v", err) 200 } 201 }