github.com/droot/goreleaser@v0.66.2-0.20180420030140-c2db5fb17157/pipeline/build/build_test.go (about)

     1  package build
     2  
     3  import (
     4  	"errors"
     5  	"os"
     6  	"path/filepath"
     7  	"testing"
     8  
     9  	api "github.com/goreleaser/goreleaser/build"
    10  	"github.com/goreleaser/goreleaser/config"
    11  	"github.com/goreleaser/goreleaser/context"
    12  	"github.com/goreleaser/goreleaser/internal/artifact"
    13  	"github.com/goreleaser/goreleaser/internal/testlib"
    14  	"github.com/stretchr/testify/assert"
    15  )
    16  
    17  var fakeArtifact = artifact.Artifact{
    18  	Name: "fake",
    19  }
    20  
    21  type fakeBuilder struct {
    22  	fail bool
    23  }
    24  
    25  func (*fakeBuilder) WithDefaults(build config.Build) config.Build {
    26  	return build
    27  }
    28  
    29  var errFailedBuild = errors.New("fake builder failed")
    30  
    31  func (f *fakeBuilder) Build(ctx *context.Context, build config.Build, options api.Options) error {
    32  	if f.fail {
    33  		return errFailedBuild
    34  	}
    35  	ctx.Artifacts.Add(fakeArtifact)
    36  	return nil
    37  }
    38  
    39  func init() {
    40  	api.Register("fake", &fakeBuilder{})
    41  	api.Register("fakeFail", &fakeBuilder{
    42  		fail: true,
    43  	})
    44  }
    45  
    46  func TestPipeDescription(t *testing.T) {
    47  	assert.NotEmpty(t, Pipe{}.String())
    48  }
    49  
    50  func TestBuild(t *testing.T) {
    51  	var config = config.Project{
    52  		Builds: []config.Build{
    53  			{
    54  				Lang:   "fake",
    55  				Binary: "testing.v{{.Version}}",
    56  				Flags:  "-n",
    57  				Env:    []string{"BLAH=1"},
    58  			},
    59  		},
    60  	}
    61  	var ctx = &context.Context{
    62  		Artifacts: artifact.New(),
    63  		Git: context.GitInfo{
    64  			CurrentTag: "v1.2.3",
    65  			Commit:     "123",
    66  		},
    67  		Version: "1.2.3",
    68  		Config:  config,
    69  	}
    70  	error := doBuild(ctx, ctx.Config.Builds[0], "darwin_amd64")
    71  	assert.NoError(t, error)
    72  }
    73  
    74  func TestRunPipe(t *testing.T) {
    75  	var config = config.Project{
    76  		Builds: []config.Build{
    77  			{
    78  				Lang:    "fake",
    79  				Binary:  "testing",
    80  				Flags:   "-v",
    81  				Ldflags: "-X main.test=testing",
    82  				Targets: []string{"whatever"},
    83  			},
    84  		},
    85  	}
    86  	var ctx = context.New(config)
    87  	assert.NoError(t, Pipe{}.Run(ctx))
    88  	assert.Equal(t, ctx.Artifacts.List(), []artifact.Artifact{fakeArtifact})
    89  }
    90  
    91  func TestRunFullPipe(t *testing.T) {
    92  	folder, back := testlib.Mktmp(t)
    93  	defer back()
    94  	var pre = filepath.Join(folder, "pre")
    95  	var post = filepath.Join(folder, "post")
    96  	var config = config.Project{
    97  		Builds: []config.Build{
    98  			{
    99  				Lang:    "fake",
   100  				Binary:  "testing",
   101  				Flags:   "-v",
   102  				Ldflags: "-X main.test=testing",
   103  				Hooks: config.Hooks{
   104  					Pre:  "touch " + pre,
   105  					Post: "touch " + post,
   106  				},
   107  				Targets: []string{"whatever"},
   108  			},
   109  		},
   110  	}
   111  	var ctx = context.New(config)
   112  	assert.NoError(t, Pipe{}.Run(ctx))
   113  	assert.Equal(t, ctx.Artifacts.List(), []artifact.Artifact{fakeArtifact})
   114  	assert.True(t, exists(pre), pre)
   115  	assert.True(t, exists(post), post)
   116  }
   117  
   118  func TestRunFullPipeFail(t *testing.T) {
   119  	folder, back := testlib.Mktmp(t)
   120  	defer back()
   121  	var pre = filepath.Join(folder, "pre")
   122  	var post = filepath.Join(folder, "post")
   123  	var config = config.Project{
   124  		Builds: []config.Build{
   125  			{
   126  				Lang:    "fakeFail",
   127  				Binary:  "testing",
   128  				Flags:   "-v",
   129  				Ldflags: "-X main.test=testing",
   130  				Hooks: config.Hooks{
   131  					Pre:  "touch " + pre,
   132  					Post: "touch " + post,
   133  				},
   134  				Targets: []string{"whatever"},
   135  			},
   136  		},
   137  	}
   138  	var ctx = context.New(config)
   139  	assert.EqualError(t, Pipe{}.Run(ctx), errFailedBuild.Error())
   140  	assert.Empty(t, ctx.Artifacts.List())
   141  	assert.True(t, exists(pre), pre)
   142  	assert.False(t, exists(post), post)
   143  }
   144  
   145  func TestRunPipeFailingHooks(t *testing.T) {
   146  	var config = config.Project{
   147  		Builds: []config.Build{
   148  			{
   149  				Lang:    "fake",
   150  				Binary:  "hooks",
   151  				Hooks:   config.Hooks{},
   152  				Targets: []string{"whatever"},
   153  			},
   154  		},
   155  	}
   156  	t.Run("pre-hook", func(t *testing.T) {
   157  		var ctx = context.New(config)
   158  		ctx.Config.Builds[0].Hooks.Pre = "exit 1"
   159  		ctx.Config.Builds[0].Hooks.Post = "echo post"
   160  		assert.EqualError(t, Pipe{}.Run(ctx), `pre hook failed: `)
   161  	})
   162  	t.Run("post-hook", func(t *testing.T) {
   163  		var ctx = context.New(config)
   164  		ctx.Config.Builds[0].Hooks.Pre = "echo pre"
   165  		ctx.Config.Builds[0].Hooks.Post = "exit 1"
   166  		assert.EqualError(t, Pipe{}.Run(ctx), `post hook failed: `)
   167  	})
   168  }
   169  
   170  func TestDefaultNoBuilds(t *testing.T) {
   171  	var ctx = &context.Context{
   172  		Config: config.Project{},
   173  	}
   174  	assert.NoError(t, Pipe{}.Default(ctx))
   175  }
   176  
   177  func TestDefaultExpandEnv(t *testing.T) {
   178  	assert.NoError(t, os.Setenv("BAR", "FOOBAR"))
   179  	var ctx = &context.Context{
   180  		Config: config.Project{
   181  			Builds: []config.Build{
   182  				{
   183  					Env: []string{
   184  						"FOO=bar_$BAR",
   185  					},
   186  				},
   187  			},
   188  		},
   189  	}
   190  	assert.NoError(t, Pipe{}.Default(ctx))
   191  	var env = ctx.Config.Builds[0].Env[0]
   192  	assert.Equal(t, "FOO=bar_FOOBAR", env)
   193  }
   194  
   195  func TestDefaultEmptyBuild(t *testing.T) {
   196  	var ctx = &context.Context{
   197  		Config: config.Project{
   198  			Release: config.Release{
   199  				GitHub: config.Repo{
   200  					Name: "foo",
   201  				},
   202  			},
   203  			Builds: []config.Build{
   204  				{},
   205  			},
   206  		},
   207  	}
   208  	assert.NoError(t, Pipe{}.Default(ctx))
   209  	var build = ctx.Config.Builds[0]
   210  	assert.Equal(t, ctx.Config.Release.GitHub.Name, build.Binary)
   211  	assert.Equal(t, ".", build.Main)
   212  	assert.Equal(t, []string{"linux", "darwin"}, build.Goos)
   213  	assert.Equal(t, []string{"amd64", "386"}, build.Goarch)
   214  	assert.Equal(t, []string{"6"}, build.Goarm)
   215  	assert.Equal(t, "-s -w -X main.version={{.Version}} -X main.commit={{.Commit}} -X main.date={{.Date}}", build.Ldflags)
   216  }
   217  
   218  func TestDefaultPartialBuilds(t *testing.T) {
   219  	var ctx = &context.Context{
   220  		Config: config.Project{
   221  			Builds: []config.Build{
   222  				{
   223  					Binary: "bar",
   224  					Goos:   []string{"linux"},
   225  					Main:   "./cmd/main.go",
   226  				},
   227  				{
   228  					Binary:  "foo",
   229  					Ldflags: "-s -w",
   230  					Goarch:  []string{"386"},
   231  				},
   232  			},
   233  		},
   234  	}
   235  	assert.NoError(t, Pipe{}.Default(ctx))
   236  	t.Run("build0", func(t *testing.T) {
   237  		var build = ctx.Config.Builds[0]
   238  		assert.Equal(t, "bar", build.Binary)
   239  		assert.Equal(t, "./cmd/main.go", build.Main)
   240  		assert.Equal(t, []string{"linux"}, build.Goos)
   241  		assert.Equal(t, []string{"amd64", "386"}, build.Goarch)
   242  		assert.Equal(t, []string{"6"}, build.Goarm)
   243  		assert.Equal(t, "-s -w -X main.version={{.Version}} -X main.commit={{.Commit}} -X main.date={{.Date}}", build.Ldflags)
   244  	})
   245  	t.Run("build1", func(t *testing.T) {
   246  		var build = ctx.Config.Builds[1]
   247  		assert.Equal(t, "foo", build.Binary)
   248  		assert.Equal(t, ".", build.Main)
   249  		assert.Equal(t, []string{"linux", "darwin"}, build.Goos)
   250  		assert.Equal(t, []string{"386"}, build.Goarch)
   251  		assert.Equal(t, []string{"6"}, build.Goarm)
   252  		assert.Equal(t, "-s -w", build.Ldflags)
   253  	})
   254  }
   255  
   256  func TestDefaultFillSingleBuild(t *testing.T) {
   257  	_, back := testlib.Mktmp(t)
   258  	defer back()
   259  
   260  	var ctx = &context.Context{
   261  		Config: config.Project{
   262  			Release: config.Release{
   263  				GitHub: config.Repo{
   264  					Name: "foo",
   265  				},
   266  			},
   267  			SingleBuild: config.Build{
   268  				Main: "testreleaser",
   269  			},
   270  		},
   271  	}
   272  	assert.NoError(t, Pipe{}.Default(ctx))
   273  	assert.Len(t, ctx.Config.Builds, 1)
   274  	assert.Equal(t, ctx.Config.Builds[0].Binary, "foo")
   275  }
   276  
   277  func TestExtWindows(t *testing.T) {
   278  	assert.Equal(t, ".exe", extFor("windows_amd64"))
   279  	assert.Equal(t, ".exe", extFor("windows_386"))
   280  }
   281  
   282  func TestExtOthers(t *testing.T) {
   283  	assert.Empty(t, "", extFor("linux_amd64"))
   284  	assert.Empty(t, "", extFor("linuxwin_386"))
   285  	assert.Empty(t, "", extFor("winasdasd_sad"))
   286  }
   287  
   288  func TestBinaryFullTemplate(t *testing.T) {
   289  	var config = config.Project{
   290  		Builds: []config.Build{
   291  			{
   292  				Binary: `-s -w -X main.version={{.Version}} -X main.tag={{.Tag}} -X main.date={{.Date}} -X main.commit={{.Commit}} -X "main.foo={{.Env.FOO}}"`,
   293  			},
   294  		},
   295  	}
   296  	var ctx = &context.Context{
   297  		Git: context.GitInfo{
   298  			CurrentTag: "v1.2.3",
   299  			Commit:     "123",
   300  		},
   301  		Version: "1.2.3",
   302  		Config:  config,
   303  		Env:     map[string]string{"FOO": "123"},
   304  	}
   305  	binary, err := binary(ctx, ctx.Config.Builds[0])
   306  	assert.NoError(t, err)
   307  	assert.Contains(t, binary, "-s -w")
   308  	assert.Contains(t, binary, "-X main.version=1.2.3")
   309  	assert.Contains(t, binary, "-X main.tag=v1.2.3")
   310  	assert.Contains(t, binary, "-X main.commit=123")
   311  	assert.Contains(t, binary, "-X main.date=")
   312  	assert.Contains(t, binary, `-X "main.foo=123"`)
   313  }
   314  
   315  //
   316  // Helpers
   317  //
   318  
   319  func exists(file string) bool {
   320  	_, err := os.Stat(file)
   321  	return !os.IsNotExist(err)
   322  }