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  }